[hamradio-commits] [baycomepp] 01/02: Imported Upstream version 0.10
Colin Tuckley
colint at moszumanska.debian.org
Sun May 10 17:35:48 UTC 2015
This is an automated email from the git hooks/post-receive script.
colint pushed a commit to branch master
in repository baycomepp.
commit 283b09f9ca1cfe446170a5b38e0e8ce07225f8c4
Author: Colin Tuckley <colin at tuckley.org>
Date: Sun May 10 17:17:26 2015 +0100
Imported Upstream version 0.10
---
ABOUT-NLS | 226 ++
AUTHORS | 1 +
COPYING | 339 +++
ChangeLog | 0
INSTALL | 182 ++
Makefile.am | 8 +
Makefile.in | 400 +++
NEWS | 8 +
README | 8 +
acconfig.h | 43 +
aclocal.m4 | 2006 ++++++++++++++
baycomepp.spec | 53 +
cfgdos | 18 +
cfgwindows | 20 +
cfgwindowsnodebug | 20 +
config.guess | 1121 ++++++++
config.h.in | 291 +++
config.sub | 1232 +++++++++
configure | 5905 ++++++++++++++++++++++++++++++++++++++++++
configure.in | 245 ++
directx/Makefile.am | 27 +
directx/Makefile.in | 334 +++
directx/deunion.pl | 47 +
directx/dinput.c | 338 +++
directx/fixdirectx.sh | 17 +
directx/include/directx.h | 79 +
directx/include/mmsystem.h | 236 ++
directx/libddraw.def | 3 +
directx/libdinput.def | 2 +
directx/libdplayx.def | 2 +
directx/libdsound.def | 9 +
eppdiag/Makefile.am | 36 +
eppdiag/Makefile.in | 365 +++
eppdiag/eppdiag.c | 341 +++
eppdiag/eppdiag.glade | 485 ++++
eppdiag/gladesig.h | 31 +
eppdiag/gladesrc.c | 379 +++
eppdiag/gladesrc.h | 53 +
eppfm/Makefile.am | 44 +
eppfm/Makefile.in | 398 +++
eppfm/audio.c | 946 +++++++
eppfm/callbacks.c | 98 +
eppfm/callbacks.h | 53 +
eppfm/costab.c | 74 +
eppfm/eppfm.h | 54 +
eppfm/gentbl.c | 72 +
eppfm/interface.c | 711 +++++
eppfm/interface.h | 5 +
eppfm/main.c | 179 ++
eppfm/support.c | 158 ++
eppfm/support.h | 34 +
eppfm2/AUTHORS | 1 +
eppfm2/ChangeLog | 0
eppfm2/Makefile.am | 15 +
eppfm2/Makefile.in | 332 +++
eppfm2/NEWS | 0
eppfm2/README | 0
eppfm2/configure | 4114 +++++++++++++++++++++++++++++
eppfm2/configure.in | 57 +
eppfm2/eppfm.glade | 1643 ++++++++++++
eppfm2/src/Makefile.am | 60 +
eppfm2/src/Makefile.in | 424 +++
eppfm2/src/audio.c | 340 +++
eppfm2/src/audiolinux.c | 475 ++++
eppfm2/src/audiowin32.c | 654 +++++
eppfm2/src/callbacks.h | 158 ++
eppfm2/src/coeff.m | 30 +
eppfm2/src/costab.c | 74 +
eppfm2/src/eppfm.h | 80 +
eppfm2/src/gentbl.c | 72 +
eppfm2/src/getopt.h | 129 +
eppfm2/src/interface.c | 1194 +++++++++
eppfm2/src/interface.h | 10 +
eppfm2/src/main.c | 571 ++++
eppfm2/src/support.c | 158 ++
eppfm2/src/support.h | 57 +
eppfm2/src/widgets.c | 615 +++++
eppfm2/src/widgets.h | 102 +
flexdrv/Makefile.am | 30 +
flexdrv/Makefile.in | 333 +++
flexdrv/bayeppflex.c | 1520 +++++++++++
flexdrv/bayeppflex.rc | 76 +
flexdrv/driver.c | 74 +
flexdrv/drv32.h | 15 +
flexdrv/flexdriv.def | 11 +
flexdrv/flexdrv.h | 491 ++++
flexdrv/resource.h | 12 +
install-sh | 250 ++
intl/ChangeLog | 1086 ++++++++
intl/Makefile.in | 214 ++
intl/VERSION | 1 +
intl/bindtextdom.c | 203 ++
intl/cat-compat.c | 262 ++
intl/dcgettext.c | 655 +++++
intl/dgettext.c | 59 +
intl/explodename.c | 197 ++
intl/finddomain.c | 216 ++
intl/gettext.c | 70 +
intl/gettext.h | 105 +
intl/gettextP.h | 89 +
intl/hash-string.h | 59 +
intl/intl-compat.c | 76 +
intl/l10nflist.c | 411 +++
intl/libgettext.h | 182 ++
intl/linux-msg.sed | 100 +
intl/loadinfo.h | 78 +
intl/loadmsgcat.c | 220 ++
intl/localealias.c | 438 ++++
intl/po2tbl.sed.in | 102 +
intl/textdomain.c | 108 +
intl/xopen-msg.sed | 104 +
main/Makefile.am | 78 +
main/Makefile.in | 553 ++++
main/configfpga.c | 1032 ++++++++
main/ecp_firmware.h | 1617 ++++++++++++
main/epp_firmware.h | 1623 ++++++++++++
main/epp_fpga.h | 238 ++
main/eppafsk_firmware.h | 1551 +++++++++++
main/eppchk_firmware.h | 1531 +++++++++++
main/eppfpga.8 | 129 +
main/eppfpga.c | 329 +++
main/eppsamp_firmware.h | 1545 +++++++++++
main/fpga.h | 169 ++
main/fpgatests.c | 3151 ++++++++++++++++++++++
main/getopt.c | 731 ++++++
main/getopt.h | 129 +
main/getopt1.c | 176 ++
main/openpty.c | 88 +
main/parport.h | 217 ++
main/ppdev.c | 235 ++
main/ppdev.h | 102 +
main/ppdevinit.c | 97 +
main/ppdirect.c | 738 ++++++
main/ppdirectinit.c | 677 +++++
main/ppkdrv.c | 290 +++
main/ppkdrvinit.c | 114 +
main/ppnt.c | 1023 ++++++++
main/ppntddkgenport.c | 813 ++++++
main/ppntddkgenportinit.c | 469 ++++
main/ppntinit.c | 587 +++++
main/ppuser.c | 450 ++++
main/ppuser.h | 48 +
main/ppuserinit.c | 80 +
main/ppw9xring0.c | 797 ++++++
main/ppw9xring0init.c | 681 +++++
main/ppwin.c | 1010 ++++++++
main/ppwininit.c | 624 +++++
main/snprintpkt.c | 255 ++
main/sppafsk_firmware.h | 1551 +++++++++++
main/sysdeps.h | 244 ++
main/syslog.c | 70 +
main/util.h | 70 +
main/vsnprintf.c | 194 ++
missing | 188 ++
mkinstalldirs | 40 +
ntdrv/Makefile.am | 9 +
ntdrv/Makefile.in | 313 +++
ntdrv/eppflex.c | 428 +++
ntdrv/eppflex.h | 49 +
ntdrv/eppflex.inf | 57 +
ntdrv/eppflex.rc | 38 +
ntdrv/eppflex.sys | Bin 0 -> 5581 bytes
ntdrv/makefile | 7 +
ntdrv/sources | 7 +
ntdrv/testload.c | 128 +
po/ChangeLog | 0
po/Makefile.in.in | 248 ++
po/POTFILES.in | 7 +
po/baycomepp.pot | 281 ++
po/cat-id-tbl.c | 79 +
po/stamp-cat-id | 1 +
stamp-h.in | 1 +
udriver/Makefile.am | 41 +
udriver/Makefile.in | 463 ++++
udriver/baycomepp.8 | 140 +
udriver/baycomepp.initscript | 63 +
udriver/drv.h | 172 ++
udriver/drvinit.c | 837 ++++++
udriver/drvresident.c | 1109 ++++++++
w9xdrv/MAKEFILE | 72 +
w9xdrv/Makefile.am | 1 +
w9xdrv/Makefile.in | 215 ++
w9xdrv/SOURCES | 8 +
w9xdrv/eppfctrl.asm | 54 +
w9xdrv/eppflex.c | 418 +++
w9xdrv/eppflex.def | 27 +
w9xdrv/eppflex.h | 49 +
w9xdrv/eppflex.rc | 38 +
w9xdrv/eppflex.vxd | Bin 0 -> 9887 bytes
189 files changed, 68642 insertions(+)
diff --git a/ABOUT-NLS b/ABOUT-NLS
new file mode 100644
index 0000000..28d38c7
--- /dev/null
+++ b/ABOUT-NLS
@@ -0,0 +1,226 @@
+Notes on the Free Translation Project
+*************************************
+
+ Free software is going international! The Free Translation Project
+is a way to get maintainers of free software, translators, and users all
+together, so that will gradually become able to speak many languages.
+A few packages already provide translations for their messages.
+
+ If you found this `ABOUT-NLS' file inside a distribution, you may
+assume that the distributed package does use GNU `gettext' internally,
+itself available at your nearest GNU archive site. But you do *not*
+need to install GNU `gettext' prior to configuring, installing or using
+this package with messages translated.
+
+ Installers will find here some useful hints. These notes also
+explain how users should proceed for getting the programs to use the
+available translations. They tell how people wanting to contribute and
+work at translations should contact the appropriate team.
+
+ When reporting bugs in the `intl/' directory or bugs which may be
+related to internationalization, you should tell about the version of
+`gettext' which is used. The information can be found in the
+`intl/VERSION' file, in internationalized packages.
+
+One advise in advance
+=====================
+
+ If you want to exploit the full power of internationalization, you
+should configure it using
+
+ ./configure --with-included-gettext
+
+to force usage of internationalizing routines provided within this
+package, despite the existence of internationalizing capabilities in the
+operating system where this package is being installed. So far, only
+the `gettext' implementation in the GNU C library version 2 provides as
+many features (such as locale alias or message inheritance) as the
+implementation here. It is also not possible to offer this additional
+functionality on top of a `catgets' implementation. Future versions of
+GNU `gettext' will very likely convey even more functionality. So it
+might be a good idea to change to GNU `gettext' as soon as possible.
+
+ So you need not provide this option if you are using GNU libc 2 or
+you have installed a recent copy of the GNU gettext package with the
+included `libintl'.
+
+INSTALL Matters
+===============
+
+ Some packages are "localizable" when properly installed; the
+programs they contain can be made to speak your own native language.
+Most such packages use GNU `gettext'. Other packages have their own
+ways to internationalization, predating GNU `gettext'.
+
+ By default, this package will be installed to allow translation of
+messages. It will automatically detect whether the system provides
+usable `catgets' (if using this is selected by the installer) or
+`gettext' functions. If neither is available, the GNU `gettext' own
+library will be used. This library is wholly contained within this
+package, usually in the `intl/' subdirectory, so prior installation of
+the GNU `gettext' package is *not* required. Installers may use
+special options at configuration time for changing the default
+behaviour. The commands:
+
+ ./configure --with-included-gettext
+ ./configure --with-catgets
+ ./configure --disable-nls
+
+will respectively bypass any pre-existing `catgets' or `gettext' to use
+the internationalizing routines provided within this package, enable
+the use of the `catgets' functions (if found on the locale system), or
+else, *totally* disable translation of messages.
+
+ When you already have GNU `gettext' installed on your system and run
+configure without an option for your new package, `configure' will
+probably detect the previously built and installed `libintl.a' file and
+will decide to use this. This might be not what is desirable. You
+should use the more recent version of the GNU `gettext' library. I.e.
+if the file `intl/VERSION' shows that the library which comes with this
+package is more recent, you should use
+
+ ./configure --with-included-gettext
+
+to prevent auto-detection.
+
+ By default the configuration process will not test for the `catgets'
+function and therefore they will not be used. The reasons are already
+given above: the emulation on top of `catgets' cannot provide all the
+extensions provided by the GNU `gettext' library. If you nevertheless
+want to use the `catgets' functions use
+
+ ./configure --with-catgets
+
+to enable the test for `catgets' (this causes no harm if `catgets' is
+not available on your system). If you really select this option we
+would like to hear about the reasons because we cannot think of any
+good one ourself.
+
+ Internationalized packages have usually many `po/LL.po' files, where
+LL gives an ISO 639 two-letter code identifying the language. Unless
+translations have been forbidden at `configure' time by using the
+`--disable-nls' switch, all available translations are installed
+together with the package. However, the environment variable `LINGUAS'
+may be set, prior to configuration, to limit the installed set.
+`LINGUAS' should then contain a space separated list of two-letter
+codes, stating which languages are allowed.
+
+Using This Package
+==================
+
+ As a user, if your language has been installed for this package, you
+only have to set the `LANG' environment variable to the appropriate
+ISO 639 `LL' two-letter code prior to using the programs in the
+package. For example, let's suppose that you speak German. At the
+shell prompt, merely execute `setenv LANG de' (in `csh'),
+`export LANG; LANG=de' (in `sh') or `export LANG=de' (in `bash'). This
+can be done from your `.login' or `.profile' file, once and for all.
+
+ An operating system might already offer message localization for
+many of its programs, while other programs have been installed locally
+with the full capabilities of GNU `gettext'. Just using `gettext'
+extended syntax for `LANG' would break proper localization of already
+available operating system programs. In this case, users should set
+both `LANGUAGE' and `LANG' variables in their environment, as programs
+using GNU `gettext' give preference to `LANGUAGE'. For example, some
+Swedish users would rather read translations in German than English for
+when Swedish is not available. This is easily accomplished by setting
+`LANGUAGE' to `sv:de' while leaving `LANG' to `sv'.
+
+Translating Teams
+=================
+
+ For the Free Translation Project to be a success, we need interested
+people who like their own language and write it well, and who are also
+able to synergize with other translators speaking the same language.
+Each translation team has its own mailing list, courtesy of Linux
+International. You may reach your translation team at the address
+`LL at li.org', replacing LL by the two-letter ISO 639 code for your
+language. Language codes are *not* the same as the country codes given
+in ISO 3166. The following translation teams exist, as of December
+1997:
+
+ Chinese `zh', Czech `cs', Danish `da', Dutch `nl', English `en',
+ Esperanto `eo', Finnish `fi', French `fr', German `de', Hungarian
+ `hu', Irish `ga', Italian `it', Indonesian `id', Japanese `ja',
+ Korean `ko', Latin `la', Norwegian `no', Persian `fa', Polish
+ `pl', Portuguese `pt', Russian `ru', Slovenian `sl', Spanish `es',
+ Swedish `sv', and Turkish `tr'.
+
+For example, you may reach the Chinese translation team by writing to
+`zh at li.org'.
+
+ If you'd like to volunteer to *work* at translating messages, you
+should become a member of the translating team for your own language.
+The subscribing address is *not* the same as the list itself, it has
+`-request' appended. For example, speakers of Swedish can send a
+message to `sv-request at li.org', having this message body:
+
+ subscribe
+
+ Keep in mind that team members are expected to participate
+*actively* in translations, or at solving translational difficulties,
+rather than merely lurking around. If your team does not exist yet and
+you want to start one, or if you are unsure about what to do or how to
+get started, please write to `translation at iro.umontreal.ca' to reach the
+coordinator for all translator teams.
+
+ The English team is special. It works at improving and uniformizing
+the terminology in use. Proven linguistic skill are praised more than
+programming skill, here.
+
+Available Packages
+==================
+
+ Languages are not equally supported in all packages. The following
+matrix shows the current state of internationalization, as of December
+1997. The matrix shows, in regard of each package, for which languages
+PO files have been submitted to translation coordination.
+
+ Ready PO files cs da de en es fi fr it ja ko nl no pl pt ru sl sv
+ .----------------------------------------------------.
+ bash | [] [] [] | 3
+ bison | [] [] [] | 3
+ clisp | [] [] [] [] | 4
+ cpio | [] [] [] [] [] [] | 6
+ diffutils | [] [] [] [] [] | 5
+ enscript | [] [] [] [] [] [] | 6
+ fileutils | [] [] [] [] [] [] [] [] [] [] | 10
+ findutils | [] [] [] [] [] [] [] [] [] | 9
+ flex | [] [] [] [] | 4
+ gcal | [] [] [] [] [] | 5
+ gettext | [] [] [] [] [] [] [] [] [] [] [] | 12
+ grep | [] [] [] [] [] [] [] [] [] [] | 10
+ hello | [] [] [] [] [] [] [] [] [] [] [] | 11
+ id-utils | [] [] [] | 3
+ indent | [] [] [] [] [] | 5
+ libc | [] [] [] [] [] [] [] | 7
+ m4 | [] [] [] [] [] [] | 6
+ make | [] [] [] [] [] [] | 6
+ music | [] [] | 2
+ ptx | [] [] [] [] [] [] [] [] | 8
+ recode | [] [] [] [] [] [] [] [] [] | 9
+ sh-utils | [] [] [] [] [] [] [] [] | 8
+ sharutils | [] [] [] [] [] [] | 6
+ tar | [] [] [] [] [] [] [] [] [] [] [] | 11
+ texinfo | [] [] [] | 3
+ textutils | [] [] [] [] [] [] [] [] [] | 9
+ wdiff | [] [] [] [] [] [] [] [] | 8
+ `----------------------------------------------------'
+ 17 languages cs da de en es fi fr it ja ko nl no pl pt ru sl sv
+ 27 packages 6 4 25 1 18 1 26 2 1 12 20 9 19 7 4 7 17 179
+
+ Some counters in the preceding matrix are higher than the number of
+visible blocks let us expect. This is because a few extra PO files are
+used for implementing regional variants of languages, or language
+dialects.
+
+ For a PO file in the matrix above to be effective, the package to
+which it applies should also have been internationalized and
+distributed as such by its maintainer. There might be an observable
+lag between the mere existence a PO file and its wide availability in a
+distribution.
+
+ If December 1997 seems to be old, you may fetch a more recent copy
+of this `ABOUT-NLS' file on most GNU archive sites.
+
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..c1e0a1f
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1 @@
+Thomas Sailer, <sailer at ife.ee.ethz.ch>
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..a43ea21
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ Appendix: How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 19yy name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..e69de29
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..b42a17a
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,182 @@
+Basic Installation
+==================
+
+ These are generic installation instructions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+ The file `configure.in' is used to create `configure' by a program
+called `autoconf'. You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes awhile. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 5. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. You can give `configure'
+initial values for variables by setting them in the environment. Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+ CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+ env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory. After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+ By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like `--bindir=PATH' to specify different values for particular
+kinds of files. Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on. Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+ CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+ If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+ Use and save the results of the tests in FILE instead of
+ `./config.cache'. Set FILE to `/dev/null' to disable caching, for
+ debugging `configure'.
+
+`--help'
+ Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made. To
+ suppress all normal output, redirect it to `/dev/null' (any error
+ messages will still be shown).
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--version'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..f28ffce
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,8 @@
+## Process this file with automake to produce Makefile.in
+
+SUBDIRS = intl po directx main udriver eppdiag eppfm eppfm2 flexdrv ntdrv w9xdrv
+
+INCLUDES = -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\"
+
+EXTRA_DIST = ABOUT-NLS baycomepp.spec cfgwindows cfgwindowsnodebug cfgdos
+
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..5493e20
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,400 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = .
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AS = @AS@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+DATADIRNAME = @DATADIRNAME@
+DLLTOOL = @DLLTOOL@
+DRVLIBOBJS = @DRVLIBOBJS@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+HAVE_BITTYPES = @HAVE_BITTYPES@
+HAVE_DIRECTX = @HAVE_DIRECTX@
+HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@
+HAVE_IOFUNCS = @HAVE_IOFUNCS@
+HAVE_LIB = @HAVE_LIB@
+HAVE_MKISS = @HAVE_MKISS@
+HAVE_PPKDRV = @HAVE_PPKDRV@
+HAVE_PPUSER = @HAVE_PPUSER@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LIB = @LIB@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LTLIB = @LTLIB@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+M_PI = @M_PI@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+
+SUBDIRS = intl po directx main udriver eppdiag eppfm eppfm2 flexdrv ntdrv w9xdrv
+
+INCLUDES = -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\"
+
+EXTRA_DIST = ABOUT-NLS baycomepp.spec cfgwindows cfgwindowsnodebug cfgdos
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES =
+DIST_COMMON = README ./stamp-h.in ABOUT-NLS AUTHORS COPYING ChangeLog \
+INSTALL Makefile.am Makefile.in NEWS acconfig.h aclocal.m4 config.guess \
+config.h.in config.sub configure configure.in install-sh missing \
+mkinstalldirs
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps Makefile
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+$(ACLOCAL_M4): configure.in
+ cd $(srcdir) && $(ACLOCAL)
+
+config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+ $(SHELL) ./config.status --recheck
+$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
+ cd $(srcdir) && $(AUTOCONF)
+
+config.h: stamp-h
+ @if test ! -f $@; then \
+ rm -f stamp-h; \
+ $(MAKE) stamp-h; \
+ else :; fi
+stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES= CONFIG_HEADERS=config.h \
+ $(SHELL) ./config.status
+ @echo timestamp > stamp-h 2> /dev/null
+$(srcdir)/config.h.in: $(srcdir)/stamp-h.in
+ @if test ! -f $@; then \
+ rm -f $(srcdir)/stamp-h.in; \
+ $(MAKE) $(srcdir)/stamp-h.in; \
+ else :; fi
+$(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h
+ cd $(top_srcdir) && $(AUTOHEADER)
+ @echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null
+
+mostlyclean-hdr:
+
+clean-hdr:
+
+distclean-hdr:
+ -rm -f config.h
+
+maintainer-clean-hdr:
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+
+ at SET_MAKE@
+
+all-recursive install-data-recursive install-exec-recursive \
+installdirs-recursive install-recursive uninstall-recursive \
+check-recursive installcheck-recursive info-recursive dvi-recursive:
+ @set fnord $(MAKEFLAGS); amf=$$2; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @set fnord $(MAKEFLAGS); amf=$$2; \
+ dot_seen=no; \
+ rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
+ rev="$$subdir $$rev"; \
+ test "$$subdir" != "." || dot_seen=yes; \
+ done; \
+ test "$$dot_seen" = "no" && rev=". $$rev"; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+
+# This target untars the dist file and tries a VPATH configuration. Then
+# it guarantees that the distribution is self-contained by making another
+# tarfile.
+distcheck: dist
+ -rm -rf $(distdir)
+ GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz
+ mkdir $(distdir)/=build
+ mkdir $(distdir)/=inst
+ dc_install_base=`cd $(distdir)/=inst && pwd`; \
+ cd $(distdir)/=build \
+ && ../configure --with-included-gettext --srcdir=.. --prefix=$$dc_install_base \
+ && $(MAKE) $(AM_MAKEFLAGS) \
+ && $(MAKE) $(AM_MAKEFLAGS) dvi \
+ && $(MAKE) $(AM_MAKEFLAGS) check \
+ && $(MAKE) $(AM_MAKEFLAGS) install \
+ && $(MAKE) $(AM_MAKEFLAGS) installcheck \
+ && $(MAKE) $(AM_MAKEFLAGS) dist
+ -rm -rf $(distdir)
+ @banner="$(distdir).tar.gz is ready for distribution"; \
+ dashes=`echo "$$banner" | sed s/./=/g`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ echo "$$dashes"
+dist: distdir
+ -chmod -R a+r $(distdir)
+ GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
+ -rm -rf $(distdir)
+dist-all: distdir
+ -chmod -R a+r $(distdir)
+ GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir)
+ -rm -rf $(distdir)
+distdir: $(DISTFILES)
+ -rm -rf $(distdir)
+ mkdir $(distdir)
+ -chmod 777 $(distdir)
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+ for subdir in $(SUBDIRS); do \
+ if test "$$subdir" = .; then :; else \
+ test -d $(distdir)/$$subdir \
+ || mkdir $(distdir)/$$subdir \
+ || exit 1; \
+ chmod 777 $(distdir)/$$subdir; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \
+ || exit 1; \
+ fi; \
+ done
+info-am:
+info: info-recursive
+dvi-am:
+dvi: dvi-recursive
+check-am: all-am
+check: check-recursive
+installcheck-am:
+installcheck: installcheck-recursive
+all-recursive-am: config.h
+ $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+install-exec-am:
+install-exec: install-exec-recursive
+
+install-data-am:
+install-data: install-data-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-recursive
+uninstall-am:
+uninstall: uninstall-recursive
+all-am: Makefile config.h
+all-redirect: all-recursive-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs: installdirs-recursive
+installdirs-am:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-hdr mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-recursive
+
+clean-am: clean-hdr clean-tags clean-generic mostlyclean-am
+
+clean: clean-recursive
+
+distclean-am: distclean-hdr distclean-tags distclean-generic clean-am
+
+distclean: distclean-recursive
+ -rm -f config.status
+
+maintainer-clean-am: maintainer-clean-hdr maintainer-clean-tags \
+ maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-recursive
+ -rm -f config.status
+
+.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \
+install-data-recursive uninstall-data-recursive install-exec-recursive \
+uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \
+all-recursive check-recursive installcheck-recursive info-recursive \
+dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \
+maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck all-recursive-am \
+install-exec-am install-exec install-data-am install-data install-am \
+install uninstall-am uninstall all-redirect all-am all installdirs-am \
+installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..2a4fa8b
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,8 @@
+Version 0.4
+
+eppfpga:
+- new test "ppsig": checks for errors in the
+ parport related wiring
+
+baycomepp:
+- can now configure the interface (i.e. callsign, ip addrs)
diff --git a/README b/README
new file mode 100644
index 0000000..990d635
--- /dev/null
+++ b/README
@@ -0,0 +1,8 @@
+Compiling sources with RPM:
+
+rpm --rebuild baycomepp-0.7.src.rpm
+
+or
+
+rpm -ta baycomepp-0.7.tar.gz
+
diff --git a/acconfig.h b/acconfig.h
new file mode 100644
index 0000000..8c2cf68
--- /dev/null
+++ b/acconfig.h
@@ -0,0 +1,43 @@
+/* define if we want ppuser support */
+#undef HAVE_PPUSER
+
+/* define if we want kernel driver parport access support */
+#undef HAVE_PPKDRV
+
+/* define if int8_t and friends are available */
+#undef HAVE_BITTYPES
+
+/* define if struct ifreq has the ifr_newname symbol */
+#undef HAVE_GETSYSTEMTIME
+
+/* define if inb and friends are available */
+#undef HAVE_IOFUNCS
+
+/* define if we have found the MKISS driver (line discipline) */
+#undef HAVE_MKISS
+
+/* define if M_PI is not defined by math.h */
+#undef M_PI
+
+/* define if M_LN10 is not defined by math.h */
+#undef M_LN10
+
+/* define if struct ifreq has the ifr_newname symbol */
+#undef HAVE_IFRNEWNAME
+
+/* define if we have DirectX includes */
+#undef HAVE_DIRECTX
+
+/* define if National Language Support is requested */
+#undef ENABLE_NLS
+
+/* NLS stuff */
+#undef HAVE_CATGETS
+#undef HAVE_GETTEXT
+#undef HAVE_LC_MESSAGES
+#undef HAVE_STPCPY
+
+/* various directories */
+#undef PACKAGE_LOCALE_DIR
+#undef PACKAGE_DATA_DIR
+#undef PACKAGE_SOURCE_DIR
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..592265c
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,2006 @@
+dnl aclocal.m4 generated automatically by aclocal 1.4-p5
+
+dnl Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+dnl PARTICULAR PURPOSE.
+
+# Do all the work for Automake. This macro actually does too much --
+# some checks are only needed if your package does certain things.
+# But this isn't really a big deal.
+
+# serial 1
+
+dnl Usage:
+dnl AM_INIT_AUTOMAKE(package,version, [no-define])
+
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_REQUIRE([AC_PROG_INSTALL])
+PACKAGE=[$1]
+AC_SUBST(PACKAGE)
+VERSION=[$2]
+AC_SUBST(VERSION)
+dnl test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+ifelse([$3],,
+AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package]))
+AC_REQUIRE([AM_SANITY_CHECK])
+AC_REQUIRE([AC_ARG_PROGRAM])
+dnl FIXME This is truly gross.
+missing_dir=`cd $ac_aux_dir && pwd`
+AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
+AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
+AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir)
+AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir)
+AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir)
+AC_REQUIRE([AC_PROG_MAKE_SET])])
+
+#
+# Check to make sure that the build environment is sane.
+#
+
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+ if test "[$]*" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftestfile`
+ fi
+ if test "[$]*" != "X $srcdir/configure conftestfile" \
+ && test "[$]*" != "X conftestfile $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+alias in your environment])
+ fi
+
+ test "[$]2" = conftestfile
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+rm -f conftest*
+AC_MSG_RESULT(yes)])
+
+dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
+dnl The program must properly implement --version.
+AC_DEFUN([AM_MISSING_PROG],
+[AC_MSG_CHECKING(for working $2)
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if ($2 --version) < /dev/null > /dev/null 2>&1; then
+ $1=$2
+ AC_MSG_RESULT(found)
+else
+ $1="$3/missing $2"
+ AC_MSG_RESULT(missing)
+fi
+AC_SUBST($1)])
+
+# Like AC_CONFIG_HEADER, but automatically create stamp file.
+
+AC_DEFUN([AM_CONFIG_HEADER],
+[AC_PREREQ([2.12])
+AC_CONFIG_HEADER([$1])
+dnl When config.status generates a header, we must update the stamp-h file.
+dnl This file resides in the same directory as the config header
+dnl that is generated. We must strip everything past the first ":",
+dnl and everything past the last "/".
+AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl
+ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>,
+<<test -z "<<$>>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>,
+<<am_indx=1
+for am_file in <<$1>>; do
+ case " <<$>>CONFIG_HEADERS " in
+ *" <<$>>am_file "*<<)>>
+ echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx
+ ;;
+ esac
+ am_indx=`expr "<<$>>am_indx" + 1`
+done<<>>dnl>>)
+changequote([,]))])
+
+# isc-posix.m4 serial 1 (gettext-0.10.40)
+dnl Copyright (C) 1995-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+# This test replaces the one in autoconf.
+# Currently this macro should have the same name as the autoconf macro
+# because gettext's gettext.m4 (distributed in the automake package)
+# still uses it. Otherwise, the use in gettext.m4 makes autoheader
+# give these diagnostics:
+# configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX
+# configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX
+
+undefine([AC_ISC_POSIX])
+
+AC_DEFUN([AC_ISC_POSIX],
+ [
+ dnl This test replaces the obsolescent AC_ISC_POSIX kludge.
+ AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"])
+ ]
+)
+
+
+# serial 1
+
+# @defmac AC_PROG_CC_STDC
+# @maindex PROG_CC_STDC
+# @ovindex CC
+# If the C compiler in not in ANSI C mode by default, try to add an option
+# to output variable @code{CC} to make it so. This macro tries various
+# options that select ANSI C on some system or another. It considers the
+# compiler to be in ANSI C mode if it handles function prototypes correctly.
+#
+# If you use this macro, you should check after calling it whether the C
+# compiler has been set to accept ANSI C; if not, the shell variable
+# @code{am_cv_prog_cc_stdc} is set to @samp{no}. If you wrote your source
+# code in ANSI C, you can make an un-ANSIfied copy of it by using the
+# program @code{ansi2knr}, which comes with Ghostscript.
+# @end defmac
+
+AC_DEFUN([AM_PROG_CC_STDC],
+[AC_REQUIRE([AC_PROG_CC])
+AC_BEFORE([$0], [AC_C_INLINE])
+AC_BEFORE([$0], [AC_C_CONST])
+dnl Force this before AC_PROG_CPP. Some cpp's, eg on HPUX, require
+dnl a magic option to avoid problems with ANSI preprocessor commands
+dnl like #elif.
+dnl FIXME: can't do this because then AC_AIX won't work due to a
+dnl circular dependency.
+dnl AC_BEFORE([$0], [AC_PROG_CPP])
+AC_MSG_CHECKING(for ${CC-cc} option to accept ANSI C)
+AC_CACHE_VAL(am_cv_prog_cc_stdc,
+[am_cv_prog_cc_stdc=no
+ac_save_CC="$CC"
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX -qlanglvl=ansi
+# Ultrix and OSF/1 -std1
+# HP-UX -Aa -D_HPUX_SOURCE
+# SVR4 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ AC_TRY_COMPILE(
+[#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+], [
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+],
+[am_cv_prog_cc_stdc="$ac_arg"; break])
+done
+CC="$ac_save_CC"
+])
+if test -z "$am_cv_prog_cc_stdc"; then
+ AC_MSG_RESULT([none needed])
+else
+ AC_MSG_RESULT($am_cv_prog_cc_stdc)
+fi
+case "x$am_cv_prog_cc_stdc" in
+ x|xno) ;;
+ *) CC="$CC $am_cv_prog_cc_stdc" ;;
+esac
+])
+
+# gettext.m4 serial 13 (gettext-0.11.1)
+dnl Copyright (C) 1995-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper at cygnus.com>, 1995-2000.
+dnl Bruno Haible <haible at clisp.cons.org>, 2000-2002.
+
+dnl Macro to add for using GNU gettext.
+
+dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]).
+dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The
+dnl default (if it is not specified or empty) is 'no-libtool'.
+dnl INTLSYMBOL should be 'external' for packages with no intl directory,
+dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory.
+dnl If INTLSYMBOL is 'use-libtool', then a libtool library
+dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static,
+dnl depending on --{enable,disable}-{shared,static} and on the presence of
+dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library
+dnl $(top_builddir)/intl/libintl.a will be created.
+dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext
+dnl implementations (in libc or libintl) without the ngettext() function
+dnl will be ignored.
+dnl INTLDIR is used to find the intl libraries. If empty,
+dnl the value `$(top_builddir)/intl/' is used.
+dnl
+dnl The result of the configuration is one of three cases:
+dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled
+dnl and used.
+dnl Catalog format: GNU --> install in $(datadir)
+dnl Catalog extension: .mo after installation, .gmo in source tree
+dnl 2) GNU gettext has been found in the system's C library.
+dnl Catalog format: GNU --> install in $(datadir)
+dnl Catalog extension: .mo after installation, .gmo in source tree
+dnl 3) No internationalization, always use English msgid.
+dnl Catalog format: none
+dnl Catalog extension: none
+dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur.
+dnl The use of .gmo is historical (it was needed to avoid overwriting the
+dnl GNU format catalogs when building on a platform with an X/Open gettext),
+dnl but we keep it in order not to force irrelevant filename changes on the
+dnl maintainers.
+dnl
+AC_DEFUN([AM_GNU_GETTEXT],
+[
+ dnl Argument checking.
+ ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], ,
+ [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT
+])])])])])
+ ifelse([$2], [], , [ifelse([$2], [need-ngettext], ,
+ [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT
+])])])
+ define(gt_included_intl, ifelse([$1], [external], [no], [yes]))
+ define(gt_libtool_suffix_prefix, ifelse([$1], [use-libtool], [l], []))
+
+ AC_REQUIRE([AM_PO_SUBDIRS])dnl
+ ifelse(gt_included_intl, yes, [
+ AC_REQUIRE([AM_INTL_SUBDIR])dnl
+ ])
+
+ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+
+ AC_MSG_CHECKING([whether NLS is requested])
+ dnl Default is enabled NLS
+ AC_ARG_ENABLE(nls,
+ [ --disable-nls do not use Native Language Support],
+ USE_NLS=$enableval, USE_NLS=yes)
+ AC_MSG_RESULT($USE_NLS)
+ AC_SUBST(USE_NLS)
+
+ ifelse(gt_included_intl, yes, [
+ BUILD_INCLUDED_LIBINTL=no
+ USE_INCLUDED_LIBINTL=no
+ ])
+ LIBINTL=
+ LTLIBINTL=
+ POSUB=
+
+ dnl If we use NLS figure out what method
+ if test "$USE_NLS" = "yes"; then
+ gt_use_preinstalled_gnugettext=no
+ ifelse(gt_included_intl, yes, [
+ AC_MSG_CHECKING([whether included gettext is requested])
+ AC_ARG_WITH(included-gettext,
+ [ --with-included-gettext use the GNU gettext library included here],
+ nls_cv_force_use_gnu_gettext=$withval,
+ nls_cv_force_use_gnu_gettext=no)
+ AC_MSG_RESULT($nls_cv_force_use_gnu_gettext)
+
+ nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+ if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+ ])
+ dnl User does not insist on using GNU NLS library. Figure out what
+ dnl to use. If GNU gettext is available we use this. Else we have
+ dnl to fall back to GNU NLS library.
+
+ dnl Add a version number to the cache macros.
+ define([gt_api_version], ifelse([$2], [need-ngettext], 2, 1))
+ define([gt_cv_func_gnugettext_libc], [gt_cv_func_gnugettext]gt_api_version[_libc])
+ define([gt_cv_func_gnugettext_libintl], [gt_cv_func_gnugettext]gt_api_version[_libintl])
+
+ AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc,
+ [AC_TRY_LINK([#include <libintl.h>
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;],
+ [bindtextdomain ("", "");
+return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings],
+ gt_cv_func_gnugettext_libc=yes,
+ gt_cv_func_gnugettext_libc=no)])
+
+ if test "$gt_cv_func_gnugettext_libc" != "yes"; then
+ dnl Sometimes libintl requires libiconv, so first search for libiconv.
+ ifelse(gt_included_intl, yes, , [
+ AM_ICONV_LINK
+ ])
+ dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL
+ dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv])
+ dnl because that would add "-liconv" to LIBINTL and LTLIBINTL
+ dnl even if libiconv doesn't exist.
+ AC_LIB_LINKFLAGS_BODY([intl])
+ AC_CACHE_CHECK([for GNU gettext in libintl],
+ gt_cv_func_gnugettext_libintl,
+ [gt_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $INCINTL"
+ gt_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBINTL"
+ dnl Now see whether libintl exists and does not depend on libiconv.
+ AC_TRY_LINK([#include <libintl.h>
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias ();],
+ [bindtextdomain ("", "");
+return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings + *_nl_expand_alias (0)],
+ gt_cv_func_gnugettext_libintl=yes,
+ gt_cv_func_gnugettext_libintl=no)
+ dnl Now see whether libintl exists and depends on libiconv.
+ if test "$gt_cv_func_gnugettext_libintl" != yes && test -n "$LIBICONV"; then
+ LIBS="$LIBS $LIBICONV"
+ AC_TRY_LINK([#include <libintl.h>
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias ();],
+ [bindtextdomain ("", "");
+return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings + *_nl_expand_alias (0)],
+ [LIBINTL="$LIBINTL $LIBICONV"
+ LTLIBINTL="$LTLIBINTL $LTLIBICONV"
+ gt_cv_func_gnugettext_libintl=yes
+ ])
+ fi
+ CPPFLAGS="$gt_save_CPPFLAGS"
+ LIBS="$gt_save_LIBS"])
+ fi
+
+ dnl If an already present or preinstalled GNU gettext() is found,
+ dnl use it. But if this macro is used in GNU gettext, and GNU
+ dnl gettext is already preinstalled in libintl, we update this
+ dnl libintl. (Cf. the install rule in intl/Makefile.in.)
+ if test "$gt_cv_func_gnugettext_libc" = "yes" \
+ || { test "$gt_cv_func_gnugettext_libintl" = "yes" \
+ && test "$PACKAGE" != gettext; }; then
+ gt_use_preinstalled_gnugettext=yes
+ else
+ dnl Reset the values set by searching for libintl.
+ LIBINTL=
+ LTLIBINTL=
+ INCINTL=
+ fi
+
+ ifelse(gt_included_intl, yes, [
+ if test "$gt_use_preinstalled_gnugettext" != "yes"; then
+ dnl GNU gettext is not found in the C library.
+ dnl Fall back on included GNU gettext library.
+ nls_cv_use_gnu_gettext=yes
+ fi
+ fi
+
+ if test "$nls_cv_use_gnu_gettext" = "yes"; then
+ dnl Mark actions used to generate GNU NLS library.
+ INTLOBJS="\$(GETTOBJS)"
+ BUILD_INCLUDED_LIBINTL=yes
+ USE_INCLUDED_LIBINTL=yes
+ LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV"
+ LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV"
+ LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
+ fi
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+ dnl Mark actions to use GNU gettext tools.
+ CATOBJEXT=.gmo
+ fi
+ ])
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+ AC_DEFINE(ENABLE_NLS, 1,
+ [Define to 1 if translation of program messages to the user's native language
+ is requested.])
+ else
+ USE_NLS=no
+ fi
+ fi
+
+ if test "$USE_NLS" = "yes"; then
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+ if test "$gt_cv_func_gnugettext_libintl" = "yes"; then
+ AC_MSG_CHECKING([how to link with libintl])
+ AC_MSG_RESULT([$LIBINTL])
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL])
+ fi
+
+ dnl For backward compatibility. Some packages may be using this.
+ AC_DEFINE(HAVE_GETTEXT, 1,
+ [Define if the GNU gettext() function is already present or preinstalled.])
+ AC_DEFINE(HAVE_DCGETTEXT, 1,
+ [Define if the GNU dcgettext() function is already present or preinstalled.])
+ fi
+
+ dnl We need to process the po/ directory.
+ POSUB=po
+ fi
+
+ ifelse(gt_included_intl, yes, [
+ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL
+ dnl to 'yes' because some of the testsuite requires it.
+ if test "$PACKAGE" = gettext; then
+ BUILD_INCLUDED_LIBINTL=yes
+ fi
+
+ dnl Make all variables we use known to autoconf.
+ AC_SUBST(BUILD_INCLUDED_LIBINTL)
+ AC_SUBST(USE_INCLUDED_LIBINTL)
+ AC_SUBST(CATOBJEXT)
+ AC_SUBST(INTLOBJS)
+
+ dnl For backward compatibility. Some configure.ins may be using this.
+ nls_cv_header_intl=
+ nls_cv_header_libgt=
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ DATADIRNAME=share
+ AC_SUBST(DATADIRNAME)
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ INSTOBJEXT=.mo
+ AC_SUBST(INSTOBJEXT)
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ GENCAT=gencat
+ AC_SUBST(GENCAT)
+
+ dnl Enable libtool support if the surrounding package wishes it.
+ INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix
+ AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX)
+ ])
+
+ dnl For backward compatibility. Some Makefiles may be using this.
+ INTLLIBS="$LIBINTL"
+ AC_SUBST(INTLLIBS)
+
+ dnl Make all documented variables known to autoconf.
+ AC_SUBST(LIBINTL)
+ AC_SUBST(LTLIBINTL)
+ AC_SUBST(POSUB)
+])
+
+
+dnl Checks for all prerequisites of the po subdirectory,
+dnl except for USE_NLS.
+AC_DEFUN([AM_PO_SUBDIRS],
+[
+ AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+ AC_REQUIRE([AC_PROG_INSTALL])dnl
+ AC_REQUIRE([AM_MKINSTALLDIRS])dnl
+
+ dnl Perform the following tests also if --disable-nls has been given,
+ dnl because they are needed for "make dist" to work.
+
+ dnl Search for GNU msgfmt in the PATH.
+ dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions.
+ dnl The second test excludes FreeBSD msgfmt.
+ AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
+ [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 &&
+ (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+ :)
+ AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
+
+ dnl Search for GNU xgettext 0.11 or newer in the PATH.
+ dnl The first test excludes Solaris xgettext and early GNU xgettext versions.
+ dnl The second test excludes FreeBSD xgettext.
+ AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
+ [$ac_dir/$ac_word --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 &&
+ (if $ac_dir/$ac_word --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)],
+ :)
+ dnl Remove leftover from FreeBSD xgettext call.
+ rm -f messages.po
+
+ dnl Search for GNU msgmerge 0.11 or newer in the PATH.
+ AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge,
+ [$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1], :)
+
+ dnl This could go away some day; the PATH_PROG_WITH_TEST already does it.
+ dnl Test whether we really found GNU msgfmt.
+ if test "$GMSGFMT" != ":"; then
+ dnl If it is no GNU msgfmt we define it as : so that the
+ dnl Makefiles still can work.
+ if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 &&
+ (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+ : ;
+ else
+ GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'`
+ AC_MSG_RESULT(
+ [found $GMSGFMT program is not GNU msgfmt; ignore it])
+ GMSGFMT=":"
+ fi
+ fi
+
+ dnl This could go away some day; the PATH_PROG_WITH_TEST already does it.
+ dnl Test whether we really found GNU xgettext.
+ if test "$XGETTEXT" != ":"; then
+ dnl If it is no GNU xgettext we define it as : so that the
+ dnl Makefiles still can work.
+ if $XGETTEXT --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 &&
+ (if $XGETTEXT --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+ : ;
+ else
+ AC_MSG_RESULT(
+ [found xgettext program is not GNU xgettext; ignore it])
+ XGETTEXT=":"
+ fi
+ dnl Remove leftover from FreeBSD xgettext call.
+ rm -f messages.po
+ fi
+
+ AC_OUTPUT_COMMANDS([
+ for ac_file in $CONFIG_FILES; do
+ # Support "outfile[:infile[:infile...]]"
+ case "$ac_file" in
+ *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ esac
+ # PO directories have a Makefile.in generated from Makefile.in.in.
+ case "$ac_file" in */Makefile.in)
+ # Adjust a relative srcdir.
+ ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+ ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+ ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+ # In autoconf-2.13 it is called $ac_given_srcdir.
+ # In autoconf-2.50 it is called $srcdir.
+ test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+ case "$ac_given_srcdir" in
+ .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+ /*) top_srcdir="$ac_given_srcdir" ;;
+ *) top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+ if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
+ rm -f "$ac_dir/POTFILES"
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
+ cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+ # ALL_LINGUAS, POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES depend
+ # on $ac_dir but don't depend on user-specified configuration
+ # parameters.
+ if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+ # The LINGUAS file contains the set of available languages.
+ if test -n "$ALL_LINGUAS"; then
+ test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+ fi
+ ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+ # Hide the ALL_LINGUAS assigment from automake.
+ eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+ fi
+ case "$ac_given_srcdir" in
+ .) srcdirpre= ;;
+ *) srcdirpre='$(srcdir)/' ;;
+ esac
+ POFILES=
+ GMOFILES=
+ UPDATEPOFILES=
+ DUMMYPOFILES=
+ for lang in $ALL_LINGUAS; do
+ POFILES="$POFILES $srcdirpre$lang.po"
+ GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+ UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+ DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+ done
+ # CATALOGS depends on both $ac_dir and the user's LINGUAS
+ # environment variable.
+ INST_LINGUAS=
+ if test -n "$ALL_LINGUAS"; then
+ for presentlang in $ALL_LINGUAS; do
+ useit=no
+ if test "%UNSET%" != "$LINGUAS"; then
+ desiredlanguages="$LINGUAS"
+ else
+ desiredlanguages="$ALL_LINGUAS"
+ fi
+ for desiredlang in $desiredlanguages; do
+ # Use the presentlang catalog if desiredlang is
+ # a. equal to presentlang, or
+ # b. a variant of presentlang (because in this case,
+ # presentlang can be used as a fallback for messages
+ # which are not translated in the desiredlang catalog).
+ case "$desiredlang" in
+ "$presentlang"*) useit=yes;;
+ esac
+ done
+ if test $useit = yes; then
+ INST_LINGUAS="$INST_LINGUAS $presentlang"
+ fi
+ done
+ fi
+ CATALOGS=
+ if test -n "$INST_LINGUAS"; then
+ for lang in $INST_LINGUAS; do
+ CATALOGS="$CATALOGS $lang.gmo"
+ done
+ fi
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
+ sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+ for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
+ if test -f "$f"; then
+ case "$f" in
+ *.orig | *.bak | *~) ;;
+ *) cat "$f" >> "$ac_dir/Makefile" ;;
+ esac
+ fi
+ done
+ fi
+ ;;
+ esac
+ done],
+ [# Capture the value of obsolete $ALL_LINGUAS because we need it to compute
+ # POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES, CATALOGS. But hide it
+ # from automake.
+ eval 'ALL_LINGUAS''="$ALL_LINGUAS"'
+ # Capture the value of LINGUAS because we need it to compute CATALOGS.
+ LINGUAS="${LINGUAS-%UNSET%}"
+ ])
+])
+
+
+dnl Checks for all prerequisites of the intl subdirectory,
+dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS,
+dnl USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL.
+AC_DEFUN([AM_INTL_SUBDIR],
+[
+ AC_REQUIRE([AC_PROG_INSTALL])dnl
+ AC_REQUIRE([AM_MKINSTALLDIRS])dnl
+ AC_REQUIRE([AC_PROG_CC])dnl
+ AC_REQUIRE([AC_CANONICAL_HOST])dnl
+ AC_REQUIRE([AC_PROG_RANLIB])dnl
+ AC_REQUIRE([AC_ISC_POSIX])dnl
+ AC_REQUIRE([AC_HEADER_STDC])dnl
+ AC_REQUIRE([AC_C_CONST])dnl
+ AC_REQUIRE([AC_C_INLINE])dnl
+ AC_REQUIRE([AC_TYPE_OFF_T])dnl
+ AC_REQUIRE([AC_TYPE_SIZE_T])dnl
+ AC_REQUIRE([AC_FUNC_ALLOCA])dnl
+ AC_REQUIRE([AC_FUNC_MMAP])dnl
+ AC_REQUIRE([jm_GLIBC21])dnl
+
+ AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \
+stdlib.h string.h unistd.h sys/param.h])
+ AC_CHECK_FUNCS([feof_unlocked fgets_unlocked getc_unlocked getcwd getegid \
+geteuid getgid getuid mempcpy munmap putenv setenv setlocale stpcpy \
+strcasecmp strdup strtoul tsearch __argz_count __argz_stringify __argz_next])
+
+ AM_ICONV
+ AM_LANGINFO_CODESET
+ AM_LC_MESSAGES
+
+ dnl intl/plural.c is generated from intl/plural.y. It requires bison,
+ dnl because plural.y uses bison specific features. It requires at least
+ dnl bison-1.26 because earlier versions generate a plural.c that doesn't
+ dnl compile.
+ dnl bison is only needed for the maintainer (who touches plural.y). But in
+ dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put
+ dnl the rule in general Makefile. Now, some people carelessly touch the
+ dnl files or have a broken "make" program, hence the plural.c rule will
+ dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not
+ dnl present or too old.
+ AC_CHECK_PROGS([INTLBISON], [bison])
+ if test -z "$INTLBISON"; then
+ ac_verc_fail=yes
+ else
+ dnl Found it, now check the version.
+ AC_MSG_CHECKING([version of bison])
+changequote(<<,>>)dnl
+ ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+ case $ac_prog_version in
+ '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+ 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*)
+changequote([,])dnl
+ ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+ *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+ esac
+ AC_MSG_RESULT([$ac_prog_version])
+ fi
+ if test $ac_verc_fail = yes; then
+ INTLBISON=:
+ fi
+])
+
+
+AC_DEFUN([AM_MKINSTALLDIRS],
+[
+ dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly
+ dnl find the mkinstalldirs script in another subdir but $(top_srcdir).
+ dnl Try to locate is.
+ MKINSTALLDIRS=
+ if test -n "$ac_aux_dir"; then
+ MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
+ fi
+ if test -z "$MKINSTALLDIRS"; then
+ MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
+ fi
+ AC_SUBST(MKINSTALLDIRS)
+])
+
+# lib-link.m4 serial 1 (gettext-0.11)
+dnl Copyright (C) 2001-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
+dnl augments the CPPFLAGS variable.
+AC_DEFUN([AC_LIB_LINKFLAGS],
+[
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+ define([Name],[translit([$1],[./-], [___])])
+ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+ AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
+ AC_LIB_LINKFLAGS_BODY([$1], [$2])
+ ac_cv_lib[]Name[]_libs="$LIB[]NAME"
+ ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
+ ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
+ ])
+ LIB[]NAME="$ac_cv_lib[]Name[]_libs"
+ LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
+ INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+ AC_SUBST([LIB]NAME)
+ AC_SUBST([LTLIB]NAME)
+ dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
+ dnl results of this search when this library appears as a dependency.
+ HAVE_LIB[]NAME=yes
+ undefine([Name])
+ undefine([NAME])
+])
+
+dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode)
+dnl searches for libname and the libraries corresponding to explicit and
+dnl implicit dependencies, together with the specified include files and
+dnl the ability to compile and link the specified testcode. If found, it
+dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and
+dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and
+dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
+dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
+AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
+[
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+ define([Name],[translit([$1],[./-], [___])])
+ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+
+ dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
+ dnl accordingly.
+ AC_LIB_LINKFLAGS_BODY([$1], [$2])
+
+ dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
+ dnl because if the user has installed lib[]Name and not disabled its use
+ dnl via --without-lib[]Name-prefix, he wants to use it.
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+
+ AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
+ ac_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIB[]NAME"
+ AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no])
+ LIBS="$ac_save_LIBS"
+ ])
+ if test "$ac_cv_lib[]Name" = yes; then
+ HAVE_LIB[]NAME=yes
+ AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.])
+ AC_MSG_CHECKING([how to link with lib[]$1])
+ AC_MSG_RESULT([$LIB[]NAME])
+ else
+ HAVE_LIB[]NAME=no
+ dnl If $LIB[]NAME didn't lead to a usable library, we don't need
+ dnl $INC[]NAME either.
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LIB[]NAME=
+ LTLIB[]NAME=
+ fi
+ AC_SUBST([HAVE_LIB]NAME)
+ AC_SUBST([LIB]NAME)
+ AC_SUBST([LTLIB]NAME)
+ undefine([Name])
+ undefine([NAME])
+])
+
+dnl Determine the platform dependent parameters needed to use rpath:
+dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator,
+dnl hardcode_direct, hardcode_minus_L,
+dnl sys_lib_search_path_spec, sys_lib_dlsearch_path_spec.
+AC_DEFUN([AC_LIB_RPATH],
+[
+ AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS
+ AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host
+ AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
+ AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [
+ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+ . ./conftest.sh
+ rm -f ./conftest.sh
+ acl_cv_rpath=done
+ ])
+ wl="$acl_cv_wl"
+ libext="$acl_cv_libext"
+ shlibext="$acl_cv_shlibext"
+ hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+ hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+ hardcode_direct="$acl_cv_hardcode_direct"
+ hardcode_minus_L="$acl_cv_hardcode_minus_L"
+ sys_lib_search_path_spec="$acl_cv_sys_lib_search_path_spec"
+ sys_lib_dlsearch_path_spec="$acl_cv_sys_lib_dlsearch_path_spec"
+])
+
+dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
+AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
+[
+ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+ dnl By default, look in $includedir and $libdir.
+ use_additional=yes
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ AC_ARG_WITH([lib$1-prefix],
+[ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib
+ --without-lib$1-prefix don't search for lib$1 in includedir and libdir],
+[
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/lib"
+ fi
+ fi
+])
+ dnl Search the library and its dependencies in $additional_libdir and
+ dnl $LDFLAGS. Using breadth-first-seach.
+ LIB[]NAME=
+ LTLIB[]NAME=
+ INC[]NAME=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='$1 $2'
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
+ dnl or AC_LIB_HAVE_LINKFLAGS call.
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
+ else
+ dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
+ dnl that this library doesn't exist. So just drop it.
+ :
+ fi
+ else
+ dnl Search the library lib$name in $additional_libdir and $LDFLAGS
+ dnl and the already constructed $LIBNAME/$LTLIBNAME.
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ if test $use_additional = yes; then
+ if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
+ found_dir="$additional_libdir"
+ found_so="$additional_libdir/lib$name.$shlibext"
+ if test -f "$additional_libdir/lib$name.la"; then
+ found_la="$additional_libdir/lib$name.la"
+ fi
+ else
+ if test -f "$additional_libdir/lib$name.$libext"; then
+ found_dir="$additional_libdir"
+ found_a="$additional_libdir/lib$name.$libext"
+ if test -f "$additional_libdir/lib$name.la"; then
+ found_la="$additional_libdir/lib$name.la"
+ fi
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
+ found_dir="$dir"
+ found_so="$dir/lib$name.$shlibext"
+ if test -f "$dir/lib$name.la"; then
+ found_la="$dir/lib$name.la"
+ fi
+ else
+ if test -f "$dir/lib$name.$libext"; then
+ found_dir="$dir"
+ found_a="$dir/lib$name.$libext"
+ if test -f "$dir/lib$name.la"; then
+ found_la="$dir/lib$name.la"
+ fi
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ fi
+ if test "X$found_dir" != "X"; then
+ dnl Found the library.
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
+ if test "X$found_so" != "X"; then
+ dnl Linking with a shared library. We attempt to hardcode its
+ dnl directory into the executable's runpath, unless it's the
+ dnl standard /usr/lib.
+ if test "X$found_dir" = "X/usr/lib"; then
+ dnl No hardcoding is needed.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ dnl Use an explicit option to hardcode DIR into the resulting
+ dnl binary.
+ dnl Potentially add DIR to ltrpathdirs.
+ dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ dnl The hardcoding into $LIBNAME is system dependent.
+ if test "$hardcode_direct" = yes; then
+ dnl Using DIR/libNAME.so during linking hardcodes DIR into the
+ dnl resulting binary.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+ dnl Use an explicit option to hardcode DIR into the resulting
+ dnl binary.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ dnl Potentially add DIR to rpathdirs.
+ dnl The rpathdirs will be appended to $LIBNAME at the end.
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ dnl Rely on "-L$found_dir".
+ dnl But don't add it if it's already contained in the LDFLAGS
+ dnl or the already constructed $LIBNAME
+ haveit=
+ for x in $LDFLAGS $LIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
+ fi
+ if test "$hardcode_minus_L" != no; then
+ dnl FIXME: Not sure whether we should use
+ dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+ dnl here.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH
+ dnl here, because this doesn't fit in flags passed to the
+ dnl compiler. So give up. No hardcoding. This affects only
+ dnl very old systems.
+ dnl FIXME: Not sure whether we should use
+ dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+ dnl here.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ dnl Linking with a static library.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
+ else
+ dnl We shouldn't come here, but anyway it's good to have a
+ dnl fallback.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
+ fi
+ fi
+ dnl Assume the include files are nearby.
+ additional_includedir=
+ case "$found_dir" in
+ */lib | */lib/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ dnl Potentially add $additional_includedir to $INCNAME.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/include,
+ dnl 2. if it's /usr/local/include and we are using GCC on Linux,
+ dnl 3. if it's already present in $CPPFLAGS or the already
+ dnl constructed $INCNAME,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INC[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ dnl Really add $additional_includedir to $INCNAME.
+ INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ dnl Look for dependencies.
+ if test -n "$found_la"; then
+ dnl Read the .la file. It defines the variables
+ dnl dlname, library_names, old_library, dependency_libs, current,
+ dnl age, revision, installed, dlopen, dlpreopen, libdir.
+ save_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$save_libdir"
+ dnl We use only dependency_libs.
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/lib,
+ dnl 2. if it's /usr/local/lib and we are using GCC on Linux,
+ dnl 3. if it's already present in $LDFLAGS or the already
+ dnl constructed $LIBNAME,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_libdir" != "X/usr/lib"; then
+ haveit=
+ if test "X$additional_libdir" = "X/usr/local/lib"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LIBNAME.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LTLIBNAME.
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -l*)
+ dnl Handle this in the next round.
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+ ;;
+ *.la)
+ dnl Handle this in the next round. Throw away the .la's
+ dnl directory; it is already contained in a preceding -L
+ dnl option.
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ dnl Most likely an immediate library name.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ dnl Didn't find the library; assume it is in the system directories
+ dnl known to the linker and runtime loader. (All the system
+ dnl directories known to the linker should also be known to the
+ dnl runtime loader, otherwise the system is severely misconfigured.)
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$hardcode_libdir_separator"; then
+ dnl Weird platform: only the last -rpath option counts, the user must
+ dnl pass all path elements in one option. We can arrange that for a
+ dnl single library, but not when more than one $LIBNAMEs are used.
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+ done
+ dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl.
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+ else
+ dnl The -rpath options are cumulative.
+ for found_dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ dnl When using libtool, the option that works for both libraries and
+ dnl executables is -R. The -R options are cumulative.
+ for found_dir in $ltrpathdirs; do
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
+ done
+ fi
+])
+
+dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
+dnl unless already present in VAR.
+dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
+dnl contains two or three consecutive elements that belong together.
+AC_DEFUN([AC_LIB_APPENDTOVAR],
+[
+ for element in [$2]; do
+ haveit=
+ for x in $[$1]; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ [$1]="${[$1]}${[$1]:+ }$element"
+ fi
+ done
+])
+
+# lib-prefix.m4 serial 1 (gettext-0.11)
+dnl Copyright (C) 2001-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
+dnl to access previously installed libraries. The basic assumption is that
+dnl a user will want packages to use other packages he previously installed
+dnl with the same --prefix option.
+dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
+dnl libraries, but is otherwise very convenient.
+AC_DEFUN([AC_LIB_PREFIX],
+[
+ AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ dnl By default, look in $includedir and $libdir.
+ use_additional=yes
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ AC_ARG_WITH([lib-prefix],
+[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
+ --without-lib-prefix don't search for libraries in includedir and libdir],
+[
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/lib"
+ fi
+ fi
+])
+ if test $use_additional = yes; then
+ dnl Potentially add $additional_includedir to $CPPFLAGS.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/include,
+ dnl 2. if it's already present in $CPPFLAGS,
+ dnl 3. if it's /usr/local/include and we are using GCC on Linux,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ for x in $CPPFLAGS; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ dnl Really add $additional_includedir to $CPPFLAGS.
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ dnl Potentially add $additional_libdir to $LDFLAGS.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/lib,
+ dnl 2. if it's already present in $LDFLAGS,
+ dnl 3. if it's /usr/local/lib and we are using GCC on Linux,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_libdir" != "X/usr/lib"; then
+ haveit=
+ for x in $LDFLAGS; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test "X$additional_libdir" = "X/usr/local/lib"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LDFLAGS.
+ LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ fi
+])
+
+dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
+dnl acl_final_exec_prefix, containing the values to which $prefix and
+dnl $exec_prefix will expand at the end of the configure script.
+AC_DEFUN([AC_LIB_PREPARE_PREFIX],
+[
+ dnl Unfortunately, prefix and exec_prefix get only finally determined
+ dnl at the end of configure.
+ if test "X$prefix" = "XNONE"; then
+ acl_final_prefix="$ac_default_prefix"
+ else
+ acl_final_prefix="$prefix"
+ fi
+ if test "X$exec_prefix" = "XNONE"; then
+ acl_final_exec_prefix='${prefix}'
+ else
+ acl_final_exec_prefix="$exec_prefix"
+ fi
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+ prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
+dnl variables prefix and exec_prefix bound to the values they will have
+dnl at the end of the configure script.
+AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
+[
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ $1
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+])
+
+# lib-ld.m4 serial 1 (gettext-0.11)
+dnl Copyright (C) 1996-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl Subroutines of libtool.m4,
+dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision
+dnl with libtool.m4.
+
+dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no.
+AC_DEFUN([AC_LIB_PROG_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
+ acl_cv_prog_gnu_ld=yes
+else
+ acl_cv_prog_gnu_ld=no
+fi])
+with_gnu_ld=$acl_cv_prog_gnu_ld
+])
+
+dnl From libtool-1.4. Sets the variable LD.
+AC_DEFUN([AC_LIB_PROG_LD],
+[AC_ARG_WITH(gnu-ld,
+[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]],
+test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ AC_MSG_CHECKING([for ld used by GCC])
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [[\\/]* | [A-Za-z]:[\\/]*)]
+ [re_direlt='/[^/][^/]*/\.\./']
+ # Canonicalize the path of ld
+ ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(acl_cv_path_LD,
+[if test -z "$LD"; then
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ acl_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ if "$acl_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+ test "$with_gnu_ld" != no && break
+ else
+ test "$with_gnu_ld" != yes && break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+else
+ acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+ AC_MSG_RESULT($LD)
+else
+ AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_LIB_PROG_LD_GNU
+])
+
+# iconv.m4 serial AM3 (gettext-0.11)
+dnl Copyright (C) 2000-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_ICONV_LINK],
+[
+ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
+ dnl those with the standalone portable GNU libiconv installed).
+
+ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+
+ dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
+ dnl accordingly.
+ AC_LIB_LINKFLAGS_BODY([iconv])
+
+ dnl Add $INCICONV to CPPFLAGS before performing the following checks,
+ dnl because if the user has installed libiconv and not disabled its use
+ dnl via --without-libiconv-prefix, he wants to use it. The first
+ dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed.
+ am_save_CPPFLAGS="$CPPFLAGS"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV])
+
+ AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [
+ am_cv_func_iconv="no, consider installing GNU libiconv"
+ am_cv_lib_iconv=no
+ AC_TRY_LINK([#include <stdlib.h>
+#include <iconv.h>],
+ [iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);],
+ am_cv_func_iconv=yes)
+ if test "$am_cv_func_iconv" != yes; then
+ am_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBICONV"
+ AC_TRY_LINK([#include <stdlib.h>
+#include <iconv.h>],
+ [iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);],
+ am_cv_lib_iconv=yes
+ am_cv_func_iconv=yes)
+ LIBS="$am_save_LIBS"
+ fi
+ ])
+ if test "$am_cv_func_iconv" = yes; then
+ AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.])
+ fi
+ if test "$am_cv_lib_iconv" = yes; then
+ AC_MSG_CHECKING([how to link with libiconv])
+ AC_MSG_RESULT([$LIBICONV])
+ else
+ dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV
+ dnl either.
+ CPPFLAGS="$am_save_CPPFLAGS"
+ LIBICONV=
+ LTLIBICONV=
+ fi
+ AC_SUBST(LIBICONV)
+ AC_SUBST(LTLIBICONV)
+])
+
+AC_DEFUN([AM_ICONV],
+[
+ AC_REQUIRE([AM_ICONV_LINK])
+ if test "$am_cv_func_iconv" = yes; then
+ AC_MSG_CHECKING([for iconv declaration])
+ AC_CACHE_VAL(am_cv_proto_iconv, [
+ AC_TRY_COMPILE([
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const")
+ am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
+ am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+ AC_MSG_RESULT([$]{ac_t:-
+ }[$]am_cv_proto_iconv)
+ AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1,
+ [Define as const if the declaration of iconv() needs const.])
+ fi
+])
+
+# progtest.m4 serial 2 (gettext-0.10.40)
+dnl Copyright (C) 1996-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper at cygnus.com>, 1996.
+
+# Search path for a program which passes the given test.
+
+dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
+dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
+AC_DEFUN([AM_PATH_PROG_WITH_TEST],
+[# Extract the first word of "$2", so it can be a program name with args.
+set dummy $2; ac_word=[$]2
+AC_MSG_CHECKING([for $ac_word])
+AC_CACHE_VAL(ac_cv_path_$1,
+[case "[$]$1" in
+ /*)
+ ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in ifelse([$5], , $PATH, [$5]); do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if [$3]; then
+ ac_cv_path_$1="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+dnl If no 4th arg is given, leave the cache variable unset,
+dnl so AC_PATH_PROGS will keep looking.
+ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
+])dnl
+ ;;
+esac])dnl
+$1="$ac_cv_path_$1"
+if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
+ AC_MSG_RESULT([$]$1)
+else
+ AC_MSG_RESULT(no)
+fi
+AC_SUBST($1)dnl
+])
+
+# glibc21.m4 serial 2 (fileutils-4.1.3, gettext-0.10.40)
+dnl Copyright (C) 2000-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+# Test for the GNU C Library, version 2.1 or newer.
+# From Bruno Haible.
+
+AC_DEFUN([jm_GLIBC21],
+ [
+ AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer,
+ ac_cv_gnu_library_2_1,
+ [AC_EGREP_CPP([Lucky GNU user],
+ [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
+ Lucky GNU user
+ #endif
+#endif
+ ],
+ ac_cv_gnu_library_2_1=yes,
+ ac_cv_gnu_library_2_1=no)
+ ]
+ )
+ AC_SUBST(GLIBC21)
+ GLIBC21="$ac_cv_gnu_library_2_1"
+ ]
+)
+
+# codeset.m4 serial AM1 (gettext-0.10.40)
+dnl Copyright (C) 2000-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+dnl From Bruno Haible.
+
+AC_DEFUN([AM_LANGINFO_CODESET],
+[
+ AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset,
+ [AC_TRY_LINK([#include <langinfo.h>],
+ [char* cs = nl_langinfo(CODESET);],
+ am_cv_langinfo_codeset=yes,
+ am_cv_langinfo_codeset=no)
+ ])
+ if test $am_cv_langinfo_codeset = yes; then
+ AC_DEFINE(HAVE_LANGINFO_CODESET, 1,
+ [Define if you have <langinfo.h> and nl_langinfo(CODESET).])
+ fi
+])
+
+# lcmessage.m4 serial 2 (gettext-0.10.40)
+dnl Copyright (C) 1995-2002 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License. As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+dnl
+dnl This file can can be used in projects which are not available under
+dnl the GNU General Public License or the GNU Library General Public
+dnl License but which still want to provide support for the GNU gettext
+dnl functionality.
+dnl Please note that the actual code of the GNU gettext library is covered
+dnl by the GNU Library General Public License, and the rest of the GNU
+dnl gettext package package is covered by the GNU General Public License.
+dnl They are *not* in the public domain.
+
+dnl Authors:
+dnl Ulrich Drepper <drepper at cygnus.com>, 1995.
+
+# Check whether LC_MESSAGES is available in <locale.h>.
+
+AC_DEFUN([AM_LC_MESSAGES],
+ [if test $ac_cv_header_locale_h = yes; then
+ AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
+ [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
+ am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
+ if test $am_cv_val_LC_MESSAGES = yes; then
+ AC_DEFINE(HAVE_LC_MESSAGES, 1,
+ [Define if your <locale.h> file defines LC_MESSAGES.])
+ fi
+ fi])
+
+# Configure paths for GTK+
+# Owen Taylor 97-11-3
+
+dnl AM_PATH_GTK([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND [, MODULES]]]])
+dnl Test for GTK, and define GTK_CFLAGS and GTK_LIBS
+dnl
+AC_DEFUN(AM_PATH_GTK,
+[dnl
+dnl Get the cflags and libraries from the gtk-config script
+dnl
+AC_ARG_WITH(gtk-prefix,[ --with-gtk-prefix=PFX Prefix where GTK is installed (optional)],
+ gtk_config_prefix="$withval", gtk_config_prefix="")
+AC_ARG_WITH(gtk-exec-prefix,[ --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)],
+ gtk_config_exec_prefix="$withval", gtk_config_exec_prefix="")
+AC_ARG_ENABLE(gtktest, [ --disable-gtktest Do not try to compile and run a test GTK program],
+ , enable_gtktest=yes)
+
+ for module in . $4
+ do
+ case "$module" in
+ gthread)
+ gtk_config_args="$gtk_config_args gthread"
+ ;;
+ esac
+ done
+
+ if test x$gtk_config_exec_prefix != x ; then
+ gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix"
+ if test x${GTK_CONFIG+set} != xset ; then
+ GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config
+ fi
+ fi
+ if test x$gtk_config_prefix != x ; then
+ gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix"
+ if test x${GTK_CONFIG+set} != xset ; then
+ GTK_CONFIG=$gtk_config_prefix/bin/gtk-config
+ fi
+ fi
+
+ AC_PATH_PROG(GTK_CONFIG, gtk-config, no)
+ min_gtk_version=ifelse([$1], ,0.99.7,$1)
+ AC_MSG_CHECKING(for GTK - version >= $min_gtk_version)
+ no_gtk=""
+ if test "$GTK_CONFIG" = "no" ; then
+ no_gtk=yes
+ else
+ GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags`
+ GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs`
+ gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'`
+ gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'`
+ gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \
+ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'`
+ if test "x$enable_gtktest" = "xyes" ; then
+ ac_save_CFLAGS="$CFLAGS"
+ ac_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $GTK_CFLAGS"
+ LIBS="$GTK_LIBS $LIBS"
+dnl
+dnl Now check if the installed GTK is sufficiently new. (Also sanity
+dnl checks the results of gtk-config to some extent
+dnl
+ rm -f conf.gtktest
+ AC_TRY_RUN([
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main ()
+{
+ int major, minor, micro;
+ char *tmp_version;
+
+ system ("touch conf.gtktest");
+
+ /* HP/UX 9 (%@#!) writes to sscanf strings */
+ tmp_version = g_strdup("$min_gtk_version");
+ if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) {
+ printf("%s, bad version string\n", "$min_gtk_version");
+ exit(1);
+ }
+
+ if ((gtk_major_version != $gtk_config_major_version) ||
+ (gtk_minor_version != $gtk_config_minor_version) ||
+ (gtk_micro_version != $gtk_config_micro_version))
+ {
+ printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n",
+ $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version,
+ gtk_major_version, gtk_minor_version, gtk_micro_version);
+ printf ("*** was found! If gtk-config was correct, then it is best\n");
+ printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n");
+ printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
+ printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
+ printf("*** required on your system.\n");
+ printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n");
+ printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n");
+ printf("*** before re-running configure\n");
+ }
+#if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION)
+ else if ((gtk_major_version != GTK_MAJOR_VERSION) ||
+ (gtk_minor_version != GTK_MINOR_VERSION) ||
+ (gtk_micro_version != GTK_MICRO_VERSION))
+ {
+ printf("*** GTK+ header files (version %d.%d.%d) do not match\n",
+ GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION);
+ printf("*** library (version %d.%d.%d)\n",
+ gtk_major_version, gtk_minor_version, gtk_micro_version);
+ }
+#endif /* defined (GTK_MAJOR_VERSION) ... */
+ else
+ {
+ if ((gtk_major_version > major) ||
+ ((gtk_major_version == major) && (gtk_minor_version > minor)) ||
+ ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro)))
+ {
+ return 0;
+ }
+ else
+ {
+ printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n",
+ gtk_major_version, gtk_minor_version, gtk_micro_version);
+ printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n",
+ major, minor, micro);
+ printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n");
+ printf("***\n");
+ printf("*** If you have already installed a sufficiently new version, this error\n");
+ printf("*** probably means that the wrong copy of the gtk-config shell script is\n");
+ printf("*** being found. The easiest way to fix this is to remove the old version\n");
+ printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n");
+ printf("*** correct copy of gtk-config. (In this case, you will have to\n");
+ printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
+ printf("*** so that the correct libraries are found at run-time))\n");
+ }
+ }
+ return 1;
+}
+],, no_gtk=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ if test "x$no_gtk" = x ; then
+ AC_MSG_RESULT(yes)
+ ifelse([$2], , :, [$2])
+ else
+ AC_MSG_RESULT(no)
+ if test "$GTK_CONFIG" = "no" ; then
+ echo "*** The gtk-config script installed by GTK could not be found"
+ echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in"
+ echo "*** your path, or set the GTK_CONFIG environment variable to the"
+ echo "*** full path to gtk-config."
+ else
+ if test -f conf.gtktest ; then
+ :
+ else
+ echo "*** Could not run GTK test program, checking why..."
+ CFLAGS="$CFLAGS $GTK_CFLAGS"
+ LIBS="$LIBS $GTK_LIBS"
+ AC_TRY_LINK([
+#include <gtk/gtk.h>
+#include <stdio.h>
+], [ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version)); ],
+ [ echo "*** The test program compiled, but did not run. This usually means"
+ echo "*** that the run-time linker is not finding GTK or finding the wrong"
+ echo "*** version of GTK. If it is not finding GTK, you'll need to set your"
+ echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+ echo "*** to the installed location Also, make sure you have run ldconfig if that"
+ echo "*** is required on your system"
+ echo "***"
+ echo "*** If you have an old version installed, it is best to remove it, although"
+ echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
+ echo "***"
+ echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that"
+ echo "*** came with the system with the command"
+ echo "***"
+ echo "*** rpm --erase --nodeps gtk gtk-devel" ],
+ [ echo "*** The test program failed to compile or link. See the file config.log for the"
+ echo "*** exact error that occured. This usually means GTK was incorrectly installed"
+ echo "*** or that you have moved GTK since it was installed. In the latter case, you"
+ echo "*** may want to edit the gtk-config script: $GTK_CONFIG" ])
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ GTK_CFLAGS=""
+ GTK_LIBS=""
+ ifelse([$3], , :, [$3])
+ fi
+ AC_SUBST(GTK_CFLAGS)
+ AC_SUBST(GTK_LIBS)
+ rm -f conf.gtktest
+])
+
+# Define a conditional.
+
+AC_DEFUN([AM_CONDITIONAL],
+[AC_SUBST($1_TRUE)
+AC_SUBST($1_FALSE)
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi])
+
diff --git a/baycomepp.spec b/baycomepp.spec
new file mode 100644
index 0000000..77278b7
--- /dev/null
+++ b/baycomepp.spec
@@ -0,0 +1,53 @@
+# Note that this is NOT a relocatable package
+%define ver 0.10
+%define rel 1
+%define prefix /usr
+
+Summary: Driver and diagnostic utilities for the Baycom EPP modem family
+Name: baycomepp
+Version: %ver
+Release: %rel
+Copyright: GPL
+Group: Networking/Hamradio
+Source: baycomepp-%{ver}.tar.gz
+BuildRoot: /tmp/baycomepp-root
+Packager: Thomas Sailer <sailer at ife.ee.ethz.ch>
+Obsoletes: baycomfpga, eppconv
+Requires: /sbin/ifconfig /sbin/route /sbin/arp
+
+%description
+This package contains the driver and diagnostic utilities
+for the Baycom EPP modem family, specifically the
+conventional EPP modem (using the IDT 7213x FIFO's) and
+the EPPFLEX FPGA modem (using the Xilinx XCS10).
+
+%prep
+%setup
+
+%build
+mkdir obj
+cd obj
+../configure --prefix=%prefix --localstatedir=/var --enable-driver --enable-ppuser --enable-ppkdrv
+make
+
+%install
+rm -rf $RPM_BUILD_ROOT
+cd obj
+make prefix=$RPM_BUILD_ROOT%{prefix} install
+install -g root -o root -m 0755 -d $RPM_BUILD_ROOT/var/run
+install -g root -o root -m 0755 -d $RPM_BUILD_ROOT/etc/rc.d/init.d
+install -g root -o root -m 0755 ../udriver/baycomepp.initscript $RPM_BUILD_ROOT/etc/rc.d/init.d/baycomepp
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(-, root, root)
+
+%doc AUTHORS COPYING ChangeLog INSTALL NEWS README
+%{prefix}/sbin/*
+%{prefix}/bin/*
+%{prefix}/man/*/*
+/var/run
+%{prefix}/libexec/*
+%config /etc/rc.d/init.d/baycomepp
diff --git a/cfgdos b/cfgdos
new file mode 100755
index 0000000..0743b6a
--- /dev/null
+++ b/cfgdos
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+if test -d /usr/local/cross/i386-go32; then
+ CROSSPATH=/usr/local/cross/i386-go32/
+else
+ CROSSPATH=/usr/local/go32/i386-go32/
+fi
+PATH=${CROSSPATH}/bin:${PATH}
+CC=i386-go32-gcc
+AR=i386-go32-ar
+AS=i386-go32-as
+LD=i386-go32-ld
+RANLIB=i386-go32-ranlib
+CFLAGS="-O2 -g"
+LDFLAGS=""
+export CC AS AR LD RANLIB DLLTOOL PATH CFLAGS LDFLAGS
+dir=`dirname $0`
+${dir}/configure --host=i386-go32 --disable-nls --enable-driver=no --prefix=/tmp $*
diff --git a/cfgwindows b/cfgwindows
new file mode 100755
index 0000000..a8faf30
--- /dev/null
+++ b/cfgwindows
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+if test -d /usr/local/cross/i686-pc-cygwin; then
+ CROSSPATH=/usr/local/cross/i686-pc-cygwin/
+else
+ CROSSPATH=/usr/local/cygwin/i686-pc-cygwin/
+fi
+PATH=${CROSSPATH}/bin:${PATH}
+CC=i686-pc-cygwin-gcc
+AR=i686-pc-cygwin-ar
+AS=i686-pc-cygwin-as
+LD=i686-pc-cygwin-ld
+RANLIB=i686-pc-cygwin-ranlib
+DLLTOOL=i686-pc-cygwin-dlltool
+WINDRES=i686-pc-cygwin-windres
+CFLAGS="-O2 -g -I${CROSSPATH}/gtk/include -mno-cygwin -mpentium -fnative-struct"
+LDFLAGS="-L${CROSSPATH}/gtk/lib -mno-cygwin"
+export CC AS AR LD RANLIB DLLTOOL PATH CFLAGS LDFLAGS
+dir=`dirname $0`
+${dir}/configure --host=i686-pc-cygwin --disable-nls --enable-driver=no --prefix=/tmp $*
diff --git a/cfgwindowsnodebug b/cfgwindowsnodebug
new file mode 100755
index 0000000..78789f9
--- /dev/null
+++ b/cfgwindowsnodebug
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+if test -d /usr/local/cross/i686-pc-cygwin; then
+ CROSSPATH=/usr/local/cross/i686-pc-cygwin/
+else
+ CROSSPATH=/usr/local/cygwin/i686-pc-cygwin/
+fi
+PATH=${CROSSPATH}/bin:${PATH}
+CC=i686-pc-cygwin-gcc
+AR=i686-pc-cygwin-ar
+AS=i686-pc-cygwin-as
+LD=i686-pc-cygwin-ld
+RANLIB=i686-pc-cygwin-ranlib
+DLLTOOL=i686-pc-cygwin-dlltool
+WINDRES=i686-pc-cygwin-windres
+CFLAGS="-O2 -I${CROSSPATH}/gtk/include -mno-cygwin -mpentium -fnative-struct"
+LDFLAGS="-L${CROSSPATH}/gtk/lib -mno-cygwin"
+export CC AS AR LD RANLIB DLLTOOL PATH CFLAGS LDFLAGS
+dir=`dirname $0`
+${dir}/configure --host=i686-pc-cygwin --disable-nls --enable-driver=no --prefix=/tmp $*
diff --git a/config.guess b/config.guess
new file mode 100755
index 0000000..e1b5871
--- /dev/null
+++ b/config.guess
@@ -0,0 +1,1121 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999
+# Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Written by Per Bothner <bothner at cygnus.com>.
+# The master version of this file is at the FSF in /home/gd/gnu/lib.
+# Please send patches to <autoconf-patches at gnu.org>.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit system type (host/target name).
+#
+# Only a few systems have been added to this list; please add others
+# (but try to keep the structure clean).
+#
+
+# Use $HOST_CC if defined. $CC may point to a cross-compiler
+if test x"$CC_FOR_BUILD" = x; then
+ if test x"$HOST_CC" != x; then
+ CC_FOR_BUILD="$HOST_CC"
+ else
+ if test x"$CC" != x; then
+ CC_FOR_BUILD="$CC"
+ else
+ CC_FOR_BUILD=cc
+ fi
+ fi
+fi
+
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi at noc.rutgers.edu 8/24/94.)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+dummy=dummy-$$
+trap 'rm -f $dummy.c $dummy.o $dummy; exit 1' 1 2 15
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ alpha:OSF1:*:*)
+ if test $UNAME_RELEASE = "V4.0"; then
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ fi
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ cat <<EOF >$dummy.s
+ .globl main
+ .ent main
+main:
+ .frame \$30,0,\$26,0
+ .prologue 0
+ .long 0x47e03d80 # implver $0
+ lda \$2,259
+ .long 0x47e20c21 # amask $2,$1
+ srl \$1,8,\$2
+ sll \$2,2,\$2
+ sll \$0,3,\$0
+ addl \$1,\$0,\$0
+ addl \$2,\$0,\$0
+ ret \$31,(\$26),1
+ .end main
+EOF
+ $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
+ if test "$?" = 0 ; then
+ ./$dummy
+ case "$?" in
+ 7)
+ UNAME_MACHINE="alpha"
+ ;;
+ 15)
+ UNAME_MACHINE="alphaev5"
+ ;;
+ 14)
+ UNAME_MACHINE="alphaev56"
+ ;;
+ 10)
+ UNAME_MACHINE="alphapca56"
+ ;;
+ 16)
+ UNAME_MACHINE="alphaev6"
+ ;;
+ esac
+ fi
+ rm -f $dummy.s $dummy
+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+ exit 0 ;;
+ Alpha\ *:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # Should we change UNAME_MACHINE based on the output of uname instead
+ # of the specific Alpha model?
+ echo alpha-pc-interix
+ exit 0 ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+ exit 0 ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-cbm-sysv4
+ exit 0;;
+ amiga:NetBSD:*:*)
+ echo m68k-cbm-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ amiga:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-amigaos
+ exit 0 ;;
+ arc64:OpenBSD:*:*)
+ echo mips64el-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ arc:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ hkmips:OpenBSD:*:*)
+ echo mips-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ pmax:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sgi:OpenBSD:*:*)
+ echo mips-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ wgrisc:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ *:OS/390:*:*)
+ echo i370-ibm-openedition
+ exit 0 ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit 0;;
+ arm32:NetBSD:*:*)
+ echo arm-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ exit 0 ;;
+ SR2?01:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+ exit 0;;
+ Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+ # akee at wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit 0 ;;
+ NILE*:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit 0 ;;
+ sun4H:SunOS:5.*:*)
+ echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ i86pc:SunOS:5.*:*)
+ echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ exit 0 ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ exit 0 ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+ case "`/bin/arch`" in
+ sun3)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ ;;
+ sun4)
+ echo sparc-sun-sunos${UNAME_RELEASE}
+ ;;
+ esac
+ exit 0 ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+ exit 0 ;;
+ atari*:NetBSD:*:*)
+ echo m68k-atari-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ atari*:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ # The situation for MiNT is a little confusing. The machine name
+ # can be virtually everything (everything which is not
+ # "atarist" or "atariste" at least should have a processor
+ # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
+ # to the lowercase version "mint" (or "freemint"). Finally
+ # the system name "TOS" denotes a system which is actually not
+ # MiNT. But MiNT is downward compatible to TOS, so this should
+ # be no problem.
+ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit 0 ;;
+ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit 0 ;;
+ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+ echo m68k-atari-mint${UNAME_RELEASE}
+ exit 0 ;;
+ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+ echo m68k-milan-mint${UNAME_RELEASE}
+ exit 0 ;;
+ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+ echo m68k-hades-mint${UNAME_RELEASE}
+ exit 0 ;;
+ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+ echo m68k-unknown-mint${UNAME_RELEASE}
+ exit 0 ;;
+ sun3*:NetBSD:*:*)
+ echo m68k-sun-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sun3*:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mac68k:NetBSD:*:*)
+ echo m68k-apple-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mac68k:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mvme68k:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mvme88k:OpenBSD:*:*)
+ echo m88k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit 0 ;;
+ macppc:NetBSD:*:*)
+ echo powerpc-apple-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit 0 ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+ exit 0 ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+ exit 0 ;;
+ 2020:CLIX:*:* | 2430:CLIX:*:*)
+ echo clipper-intergraph-clix${UNAME_RELEASE}
+ exit 0 ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ sed 's/^ //' << EOF >$dummy.c
+#ifdef __cplusplus
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_SVR4)
+ printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ $CC_FOR_BUILD $dummy.c -o $dummy \
+ && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+ && rm $dummy.c $dummy && exit 0
+ rm -f $dummy.c $dummy
+ echo mips-mips-riscos${UNAME_RELEASE}
+ exit 0 ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit 0 ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit 0 ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit 0 ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit 0 ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110]
+ then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+ [ ${TARGET_BINARY_INTERFACE}x = x ]
+ then
+ echo m88k-dg-dgux${UNAME_RELEASE}
+ else
+ echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else
+ echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit 0 ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit 0 ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit 0 ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit 0 ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit 0 ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i?86:AIX:*:*)
+ echo i386-ibm-aix
+ exit 0 ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ sed 's/^ //' << EOF >$dummy.c
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0
+ rm -f $dummy.c $dummy
+ echo rs6000-ibm-aix3.2.5
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit 0 ;;
+ *:AIX:*:4)
+ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
+ if /usr/sbin/lsattr -EHl ${IBM_CPU_ID} | grep POWER >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=4.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ exit 0 ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit 0 ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+ exit 0 ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC NetBSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+ exit 0 ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit 0 ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit 0 ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit 0 ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit 0 ;;
+ 9000/[34678]??:HP-UX:*:*)
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/[678][0-9][0-9])
+ sed 's/^ //' << EOF >$dummy.c
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
+ rm -f $dummy.c $dummy
+ esac
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit 0 ;;
+ 3050*:HI-UX:*:*)
+ sed 's/^ //' << EOF >$dummy.c
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm $dummy.c $dummy && exit 0
+ rm -f $dummy.c $dummy
+ echo unknown-hitachi-hiuxwe2
+ exit 0 ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+ exit 0 ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit 0 ;;
+ *9??*:MPE/iX:*:*)
+ echo hppa1.0-hp-mpeix
+ exit 0 ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+ exit 0 ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit 0 ;;
+ i?86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+ exit 0 ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit 0 ;;
+ hppa*:OpenBSD:*:*)
+ echo hppa-unknown-openbsd
+ exit 0 ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit 0 ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit 0 ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit 0 ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit 0 ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit 0 ;;
+ CRAY*X-MP:*:*:*)
+ echo xmp-cray-unicos
+ exit 0 ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE}
+ exit 0 ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
+ exit 0 ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE}
+ exit 0 ;;
+ CRAY*T3E:*:*:*)
+ echo alpha-cray-unicosmk${UNAME_RELEASE}
+ exit 0 ;;
+ CRAY-2:*:*:*)
+ echo cray2-cray-unicos
+ exit 0 ;;
+ F300:UNIX_System_V:*:*)
+ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit 0 ;;
+ F301:UNIX_System_V:*:*)
+ echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
+ exit 0 ;;
+ hp3[0-9][05]:NetBSD:*:*)
+ echo m68k-hp-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ hp300:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ i?86:BSD/386:*:* | i?86:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ exit 0 ;;
+ sparc*:BSD/OS:*:*)
+ echo sparc-unknown-bsdi${UNAME_RELEASE}
+ exit 0 ;;
+ *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+ exit 0 ;;
+ *:FreeBSD:*:*)
+ if test -x /usr/bin/objformat; then
+ if test "elf" = "`/usr/bin/objformat`"; then
+ echo ${UNAME_MACHINE}-unknown-freebsdelf`echo ${UNAME_RELEASE}|sed -e 's/[-_].*//'`
+ exit 0
+ fi
+ fi
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit 0 ;;
+ *:NetBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*//'`
+ exit 0 ;;
+ *:OpenBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ exit 0 ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin
+ exit 0 ;;
+ i*:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit 0 ;;
+ i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+ # How do we know it's Interix rather than the generic POSIX subsystem?
+ # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+ # UNAME_MACHINE based on the output of uname instead of i386?
+ echo i386-pc-interix
+ exit 0 ;;
+ i*:UWIN*:*)
+ echo ${UNAME_MACHINE}-pc-uwin
+ exit 0 ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin
+ exit 0 ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ *:GNU:*:*)
+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit 0 ;;
+ *:Linux:*:*)
+
+ # The BFD linker knows what the default object file format is, so
+ # first see if it will tell us. cd to the root directory to prevent
+ # problems with other programs or directories called `ld' in the path.
+ ld_help_string=`cd /; ld --help 2>&1`
+ ld_supported_emulations=`echo $ld_help_string \
+ | sed -ne '/supported emulations:/!d
+ s/[ ][ ]*/ /g
+ s/.*supported emulations: *//
+ s/ .*//
+ p'`
+ case "$ld_supported_emulations" in
+ *ia64)
+ echo "${UNAME_MACHINE}-unknown-linux"
+ exit 0
+ ;;
+ i?86linux)
+ echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+ exit 0
+ ;;
+ i?86coff)
+ echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+ exit 0
+ ;;
+ sparclinux)
+ echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
+ exit 0
+ ;;
+ armlinux)
+ echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
+ exit 0
+ ;;
+ elf32arm*)
+ echo "${UNAME_MACHINE}-unknown-linux-gnu"
+ exit 0
+ ;;
+ armelf_linux*)
+ echo "${UNAME_MACHINE}-unknown-linux-gnu"
+ exit 0
+ ;;
+ m68klinux)
+ echo "${UNAME_MACHINE}-unknown-linux-gnuaout"
+ exit 0
+ ;;
+ elf32ppc)
+ # Determine Lib Version
+ cat >$dummy.c <<EOF
+#include <features.h>
+#if defined(__GLIBC__)
+extern char __libc_version[];
+extern char __libc_release[];
+#endif
+main(argc, argv)
+ int argc;
+ char *argv[];
+{
+#if defined(__GLIBC__)
+ printf("%s %s\n", __libc_version, __libc_release);
+#else
+ printf("unkown\n");
+#endif
+ return 0;
+}
+EOF
+ LIBC=""
+ $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null
+ if test "$?" = 0 ; then
+ ./$dummy | grep 1\.99 > /dev/null
+ if test "$?" = 0 ; then
+ LIBC="libc1"
+ fi
+ fi
+ rm -f $dummy.c $dummy
+ echo powerpc-unknown-linux-gnu${LIBC}
+ exit 0
+ ;;
+ esac
+
+ if test "${UNAME_MACHINE}" = "alpha" ; then
+ sed 's/^ //' <<EOF >$dummy.s
+ .globl main
+ .ent main
+ main:
+ .frame \$30,0,\$26,0
+ .prologue 0
+ .long 0x47e03d80 # implver $0
+ lda \$2,259
+ .long 0x47e20c21 # amask $2,$1
+ srl \$1,8,\$2
+ sll \$2,2,\$2
+ sll \$0,3,\$0
+ addl \$1,\$0,\$0
+ addl \$2,\$0,\$0
+ ret \$31,(\$26),1
+ .end main
+EOF
+ LIBC=""
+ $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
+ if test "$?" = 0 ; then
+ ./$dummy
+ case "$?" in
+ 7)
+ UNAME_MACHINE="alpha"
+ ;;
+ 15)
+ UNAME_MACHINE="alphaev5"
+ ;;
+ 14)
+ UNAME_MACHINE="alphaev56"
+ ;;
+ 10)
+ UNAME_MACHINE="alphapca56"
+ ;;
+ 16)
+ UNAME_MACHINE="alphaev6"
+ ;;
+ esac
+
+ objdump --private-headers $dummy | \
+ grep ld.so.1 > /dev/null
+ if test "$?" = 0 ; then
+ LIBC="libc1"
+ fi
+ fi
+ rm -f $dummy.s $dummy
+ echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0
+ elif test "${UNAME_MACHINE}" = "mips" ; then
+ cat >$dummy.c <<EOF
+#ifdef __cplusplus
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+#ifdef __MIPSEB__
+ printf ("%s-unknown-linux-gnu\n", argv[1]);
+#endif
+#ifdef __MIPSEL__
+ printf ("%sel-unknown-linux-gnu\n", argv[1]);
+#endif
+ return 0;
+}
+EOF
+ $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
+ rm -f $dummy.c $dummy
+ else
+ # Either a pre-BFD a.out linker (linux-gnuoldld)
+ # or one that does not give us useful --help.
+ # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout.
+ # If ld does not provide *any* "supported emulations:"
+ # that means it is gnuoldld.
+ echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:"
+ test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
+
+ case "${UNAME_MACHINE}" in
+ i?86)
+ VENDOR=pc;
+ ;;
+ *)
+ VENDOR=unknown;
+ ;;
+ esac
+ # Determine whether the default compiler is a.out or elf
+ cat >$dummy.c <<EOF
+#include <features.h>
+#ifdef __cplusplus
+ int main (int argc, char *argv[]) {
+#else
+ int main (argc, argv) int argc; char *argv[]; {
+#endif
+#ifdef __ELF__
+# ifdef __GLIBC__
+# if __GLIBC__ >= 2
+ printf ("%s-${VENDOR}-linux-gnu\n", argv[1]);
+# else
+ printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+# endif
+# else
+ printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+# endif
+#else
+ printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]);
+#endif
+ return 0;
+}
+EOF
+ $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm $dummy.c $dummy && exit 0
+ rm -f $dummy.c $dummy
+ fi ;;
+# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions
+# are messed up and put the nodename in both sysname and nodename.
+ i?86:DYNIX/ptx:4*:*)
+ echo i386-sequent-sysv4
+ exit 0 ;;
+ i?86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+ exit 0 ;;
+ i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
+ UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+ fi
+ exit 0 ;;
+ i?86:*:5:7*)
+ # Fixed at (any) Pentium or better
+ UNAME_MACHINE=i586
+ if [ ${UNAME_SYSTEM} = "UnixWare" ] ; then
+ echo ${UNAME_MACHINE}-sco-sysv${UNAME_RELEASE}uw${UNAME_VERSION}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ i?86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \
+ && UNAME_MACHINE=i686
+ (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \
+ && UNAME_MACHINE=i686
+ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+ exit 0 ;;
+ pc:*:*:*)
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i386.
+ echo i386-pc-msdosdjgpp
+ exit 0 ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit 0 ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit 0 ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+ exit 0 ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit 0 ;;
+ M68*:*:R3V[567]*:*)
+ test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+ 3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && echo i486-ncr-sysv4 && exit 0 ;;
+ m68*:LynxOS:2.*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit 0 ;;
+ i?86:LynxOS:2.*:* | i?86:LynxOS:3.[01]*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+ exit 0 ;;
+ RM*:ReliantUNIX-*:*:*)
+ echo mips-sni-sysv4
+ exit 0 ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit 0 ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ echo ${UNAME_MACHINE}-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit 0 ;;
+ PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel at ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit 0 ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes at openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit 0 ;;
+ *:*:*:FTX*)
+ # From seanf at swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit 0 ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+ exit 0 ;;
+ news*:NEWS-OS:*:6*)
+ echo mips-sony-newsos6
+ exit 0 ;;
+ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+ if [ -d /usr/nec ]; then
+ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ echo powerpc-be-beos
+ exit 0 ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ echo powerpc-apple-beos
+ exit 0 ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ echo i586-pc-beos
+ exit 0 ;;
+ SX-4:SUPER-UX:*:*)
+ echo sx4-nec-superux${UNAME_RELEASE}
+ exit 0 ;;
+ SX-5:SUPER-UX:*:*)
+ echo sx5-nec-superux${UNAME_RELEASE}
+ exit 0 ;;
+ Power*:Rhapsody:*:*)
+ echo powerpc-apple-rhapsody${UNAME_RELEASE}
+ exit 0 ;;
+ *:Rhapsody:*:*)
+ echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+ exit 0 ;;
+ *:QNX:*:4*)
+ echo i386-qnx-qnx${UNAME_VERSION}
+ exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+ printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ if (version < 4)
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ else
+ printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+ printf ("vax-dec-bsd\n"); exit (0);
+#else
+ printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm $dummy.c $dummy && exit 0
+rm -f $dummy.c $dummy
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+ case `getsysinfo -f cpu_type` in
+ c1*)
+ echo c1-convex-bsd
+ exit 0 ;;
+ c2*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit 0 ;;
+ c34*)
+ echo c34-convex-bsd
+ exit 0 ;;
+ c38*)
+ echo c38-convex-bsd
+ exit 0 ;;
+ c4*)
+ echo c4-convex-bsd
+ exit 0 ;;
+ esac
+fi
+
+#echo '(Unable to guess system type)' 1>&2
+
+exit 1
diff --git a/config.h.in b/config.h.in
new file mode 100644
index 0000000..fbc6acd
--- /dev/null
+++ b/config.h.in
@@ -0,0 +1,291 @@
+/* config.h.in. Generated automatically from configure.in by autoheader. */
+
+/* Define if using alloca.c. */
+#undef C_ALLOCA
+
+/* Define to empty if the keyword does not work. */
+#undef const
+
+/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems.
+ This function is required for alloca.c support on those systems. */
+#undef CRAY_STACKSEG_END
+
+/* Define if you have alloca, as a function or macro. */
+#undef HAVE_ALLOCA
+
+/* Define if you have <alloca.h> and it should be used (not on Ultrix). */
+#undef HAVE_ALLOCA_H
+
+/* Define if you have a working `mmap' system call. */
+#undef HAVE_MMAP
+
+/* Define as __inline if that's what the C compiler calls it. */
+#undef inline
+
+/* Define to `long' if <sys/types.h> doesn't define. */
+#undef off_t
+
+/* Define to `unsigned' if <sys/types.h> doesn't define. */
+#undef size_t
+
+/* If using the C implementation of alloca, define if you know the
+ direction of stack growth for your system; otherwise it will be
+ automatically deduced at run-time.
+ STACK_DIRECTION > 0 => grows toward higher addresses
+ STACK_DIRECTION < 0 => grows toward lower addresses
+ STACK_DIRECTION = 0 => direction of growth unknown
+ */
+#undef STACK_DIRECTION
+
+/* Define if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* define if we want ppuser support */
+#undef HAVE_PPUSER
+
+/* define if we want kernel driver parport access support */
+#undef HAVE_PPKDRV
+
+/* define if int8_t and friends are available */
+#undef HAVE_BITTYPES
+
+/* define if struct ifreq has the ifr_newname symbol */
+#undef HAVE_GETSYSTEMTIME
+
+/* define if inb and friends are available */
+#undef HAVE_IOFUNCS
+
+/* define if we have found the MKISS driver (line discipline) */
+#undef HAVE_MKISS
+
+/* define if M_PI is not defined by math.h */
+#undef M_PI
+
+/* define if M_LN10 is not defined by math.h */
+#undef M_LN10
+
+/* define if struct ifreq has the ifr_newname symbol */
+#undef HAVE_IFRNEWNAME
+
+/* define if we have DirectX includes */
+#undef HAVE_DIRECTX
+
+/* various directories */
+#undef PACKAGE_LOCALE_DIR
+#undef PACKAGE_DATA_DIR
+#undef PACKAGE_SOURCE_DIR
+
+/* Define if you have the __argz_count function. */
+#undef HAVE___ARGZ_COUNT
+
+/* Define if you have the __argz_next function. */
+#undef HAVE___ARGZ_NEXT
+
+/* Define if you have the __argz_stringify function. */
+#undef HAVE___ARGZ_STRINGIFY
+
+/* Define if you have the feof_unlocked function. */
+#undef HAVE_FEOF_UNLOCKED
+
+/* Define if you have the fgets_unlocked function. */
+#undef HAVE_FGETS_UNLOCKED
+
+/* Define if you have the getc_unlocked function. */
+#undef HAVE_GETC_UNLOCKED
+
+/* Define if you have the getcwd function. */
+#undef HAVE_GETCWD
+
+/* Define if you have the getegid function. */
+#undef HAVE_GETEGID
+
+/* Define if you have the geteuid function. */
+#undef HAVE_GETEUID
+
+/* Define if you have the getgid function. */
+#undef HAVE_GETGID
+
+/* Define if you have the getopt_long function. */
+#undef HAVE_GETOPT_LONG
+
+/* Define if you have the getpagesize function. */
+#undef HAVE_GETPAGESIZE
+
+/* Define if you have the gettimeofday function. */
+#undef HAVE_GETTIMEOFDAY
+
+/* Define if you have the getuid function. */
+#undef HAVE_GETUID
+
+/* Define if you have the iopl function. */
+#undef HAVE_IOPL
+
+/* Define if you have the mempcpy function. */
+#undef HAVE_MEMPCPY
+
+/* Define if you have the munmap function. */
+#undef HAVE_MUNMAP
+
+/* Define if you have the openpty function. */
+#undef HAVE_OPENPTY
+
+/* Define if you have the putenv function. */
+#undef HAVE_PUTENV
+
+/* Define if you have the random function. */
+#undef HAVE_RANDOM
+
+/* Define if you have the revoke function. */
+#undef HAVE_REVOKE
+
+/* Define if you have the setenv function. */
+#undef HAVE_SETENV
+
+/* Define if you have the setlocale function. */
+#undef HAVE_SETLOCALE
+
+/* Define if you have the snprintf function. */
+#undef HAVE_SNPRINTF
+
+/* Define if you have the stpcpy function. */
+#undef HAVE_STPCPY
+
+/* Define if you have the strcasecmp function. */
+#undef HAVE_STRCASECMP
+
+/* Define if you have the strdup function. */
+#undef HAVE_STRDUP
+
+/* Define if you have the strtoul function. */
+#undef HAVE_STRTOUL
+
+/* Define if you have the syslog function. */
+#undef HAVE_SYSLOG
+
+/* Define if you have the tsearch function. */
+#undef HAVE_TSEARCH
+
+/* Define if you have the vsnprintf function. */
+#undef HAVE_VSNPRINTF
+
+/* Define if you have the vsyslog function. */
+#undef HAVE_VSYSLOG
+
+/* Define if you have the <argz.h> header file. */
+#undef HAVE_ARGZ_H
+
+/* Define if you have the <arpa/inet.h> header file. */
+#undef HAVE_ARPA_INET_H
+
+/* Define if you have the <asm/io.h> header file. */
+#undef HAVE_ASM_IO_H
+
+/* Define if you have the <getopt.h> header file. */
+#undef HAVE_GETOPT_H
+
+/* Define if you have the <limits.h> header file. */
+#undef HAVE_LIMITS_H
+
+/* Define if you have the <linux/ax25.h> header file. */
+#undef HAVE_LINUX_AX25_H
+
+/* Define if you have the <linux/if.h> header file. */
+#undef HAVE_LINUX_IF_H
+
+/* Define if you have the <linux/sockios.h> header file. */
+#undef HAVE_LINUX_SOCKIOS_H
+
+/* Define if you have the <linux/soundcard.h> header file. */
+#undef HAVE_LINUX_SOUNDCARD_H
+
+/* Define if you have the <locale.h> header file. */
+#undef HAVE_LOCALE_H
+
+/* Define if you have the <malloc.h> header file. */
+#undef HAVE_MALLOC_H
+
+/* Define if you have the <net/if.h> header file. */
+#undef HAVE_NET_IF_H
+
+/* Define if you have the <netinet/in.h> header file. */
+#undef HAVE_NETINET_IN_H
+
+/* Define if you have the <nl_types.h> header file. */
+#undef HAVE_NL_TYPES_H
+
+/* Define if you have the <pty.h> header file. */
+#undef HAVE_PTY_H
+
+/* Define if you have the <sched.h> header file. */
+#undef HAVE_SCHED_H
+
+/* Define if you have the <stddef.h> header file. */
+#undef HAVE_STDDEF_H
+
+/* Define if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define if you have the <sys/io.h> header file. */
+#undef HAVE_SYS_IO_H
+
+/* Define if you have the <sys/param.h> header file. */
+#undef HAVE_SYS_PARAM_H
+
+/* Define if you have the <sys/perm.h> header file. */
+#undef HAVE_SYS_PERM_H
+
+/* Define if you have the <sys/socket.h> header file. */
+#undef HAVE_SYS_SOCKET_H
+
+/* Define if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define if you have the <syslog.h> header file. */
+#undef HAVE_SYSLOG_H
+
+/* Define if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define if you have the <windows.h> header file. */
+#undef HAVE_WINDOWS_H
+
+/* Define if you have the m library (-lm). */
+#undef HAVE_LIBM
+
+/* Define if you have the util library (-lutil). */
+#undef HAVE_LIBUTIL
+
+/* Name of package */
+#undef PACKAGE
+
+/* Version number of package */
+#undef VERSION
+
+/* Define if you have the iconv() function. */
+#undef HAVE_ICONV
+
+/* Define as const if the declaration of iconv() needs const. */
+#undef ICONV_CONST
+
+/* Define if you have <langinfo.h> and nl_langinfo(CODESET). */
+#undef HAVE_LANGINFO_CODESET
+
+/* Define if your <locale.h> file defines LC_MESSAGES. */
+#undef HAVE_LC_MESSAGES
+
+/* Define to 1 if translation of program messages to the user's native language
+ is requested. */
+#undef ENABLE_NLS
+
+/* Define if the GNU gettext() function is already present or preinstalled. */
+#undef HAVE_GETTEXT
+
+/* Define if the GNU dcgettext() function is already present or preinstalled. */
+#undef HAVE_DCGETTEXT
+
diff --git a/config.sub b/config.sub
new file mode 100755
index 0000000..28426bb
--- /dev/null
+++ b/config.sub
@@ -0,0 +1,1232 @@
+#! /bin/sh
+# Configuration validation subroutine script, version 1.1.
+# Copyright (C) 1991, 92-97, 1998, 1999 Free Software Foundation, Inc.
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+if [ x$1 = x ]
+then
+ echo Configuration name missing. 1>&2
+ echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
+ echo "or $0 ALIAS" 1>&2
+ echo where ALIAS is a recognized configuration type. 1>&2
+ exit 1
+fi
+
+# First pass through any local machine types.
+case $1 in
+ *local*)
+ echo $1
+ exit 0
+ ;;
+ *)
+ ;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ linux-gnu*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+ then os=`echo $1 | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple)
+ os=
+ basic_machine=$1
+ ;;
+ -sim | -cisco | -oki | -wec | -winbond)
+ os=
+ basic_machine=$1
+ ;;
+ -scout)
+ ;;
+ -wrs)
+ os=-vxworks
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco5)
+ os=-sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -udk*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -windowsnt*)
+ os=`echo $os | sed -e 's/windowsnt/winnt/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+ -mint | -mint[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
+ | arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \
+ | 580 | i960 | h8300 \
+ | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \
+ | alpha | alphaev[4-7] | alphaev56 | alphapca5[67] \
+ | we32k | ns16k | clipper | i370 | sh | powerpc | powerpcle \
+ | 1750a | dsp16xx | pdp11 | mips16 | mips64 | mipsel | mips64el \
+ | mips64orion | mips64orionel | mipstx39 | mipstx39el \
+ | mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \
+ | mips64vr5000 | miprs64vr5000el | mcore \
+ | sparc | sparclet | sparclite | sparc64 | sparcv9 | v850 | c4x \
+ | thumb | d10v | fr30)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | h8500 | w65 | pj | pjl)
+ ;;
+
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i[34567]86)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ # FIXME: clean up the formatting here.
+ vax-* | tahoe-* | i[34567]86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \
+ | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
+ | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
+ | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \
+ | xmp-* | ymp-* \
+ | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* | hppa2.0n-* \
+ | alpha-* | alphaev[4-7]-* | alphaev56-* | alphapca5[67]-* \
+ | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \
+ | clipper-* | orion-* \
+ | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
+ | sparc64-* | sparcv9-* | sparc86x-* | mips16-* | mips64-* | mipsel-* \
+ | mips64el-* | mips64orion-* | mips64orionel-* \
+ | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \
+ | mipstx39-* | mipstx39el-* | mcore-* \
+ | f301-* | armv*-* | t3e-* \
+ | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \
+ | thumb-* | v850-* | d30v-* | tic30-* | c30-* | fr30-* )
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 386bsd)
+ basic_machine=i386-unknown
+ os=-bsd
+ ;;
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ a29khif)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ adobe68k)
+ basic_machine=m68010-adobe
+ os=-scout
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-cbm
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-cbm
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-cbm
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ apollo68bsd)
+ basic_machine=m68k-apollo
+ os=-bsd
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ cray2)
+ basic_machine=cray2-cray
+ os=-unicos
+ ;;
+ [ctj]90-cray)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2* | dpx2*-bull)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ es1800 | OSE68k | ose68k | ose | OSE)
+ basic_machine=m68k-ericsson
+ os=-ose
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ h8300xray)
+ basic_machine=h8300-hitachi
+ os=-xray
+ ;;
+ h8500hms)
+ basic_machine=h8500-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp3k9[0-9][0-9] | hp9[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k6[0-9][0-9] | hp6[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hp9k7[0-79][0-9] | hp7[0-79][0-9])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k78[0-9] | hp78[0-9])
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+ # FIXME: really hppa2.0-hp
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][13679] | hp8[0-9][13679])
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppa-next)
+ os=-nextstep3
+ ;;
+ hppaosf)
+ basic_machine=hppa1.1-hp
+ os=-osf
+ ;;
+ hppro)
+ basic_machine=hppa1.1-hp
+ os=-proelf
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ ;;
+# I'm not sure what "Sysv32" means. Should this be sysv3.2?
+ i[34567]86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i[34567]86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i[34567]86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i[34567]86sol2)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ i386mach)
+ basic_machine=i386-mach
+ os=-mach
+ ;;
+ i386-vsta | vsta)
+ basic_machine=i386-unknown
+ os=-vsta
+ ;;
+ i386-go32 | go32)
+ basic_machine=i386-unknown
+ os=-go32
+ ;;
+ i386-mingw32 | mingw32)
+ basic_machine=i386-unknown
+ os=-mingw32
+ ;;
+ i386-qnx | qnx)
+ basic_machine=i386-qnx
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+ basic_machine=m68k-atari
+ os=-mint
+ ;;
+ mipsel*-linux*)
+ basic_machine=mipsel-unknown
+ os=-linux-gnu
+ ;;
+ mips*-linux*)
+ basic_machine=mips-unknown
+ os=-linux-gnu
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ monitor)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ msdos)
+ basic_machine=i386-unknown
+ os=-msdos
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ netbsd386)
+ basic_machine=i386-unknown
+ os=-netbsd
+ ;;
+ netwinder)
+ basic_machine=armv4l-rebel
+ os=-linux
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ necv70)
+ basic_machine=v70-nec
+ os=-sysv
+ ;;
+ next | m*-next )
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ mon960)
+ basic_machine=i960-intel
+ os=-mon960
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ op50n-* | op60c-*)
+ basic_machine=hppa1.1-oki
+ os=-proelf
+ ;;
+ OSE68000 | ose68000)
+ basic_machine=m68000-ericsson
+ os=-ose
+ ;;
+ os68k)
+ basic_machine=m68k-none
+ os=-os68k
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pentium | p5 | k5 | k6 | nexen)
+ basic_machine=i586-pc
+ ;;
+ pentiumpro | p6 | 6x86)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | k6-* | nexen-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | 6x86-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumii-* | pentium2-*)
+ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=rs6000-ibm
+ ;;
+ ppc) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ rom68k)
+ basic_machine=m68k-rom68k
+ os=-coff
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ sa29200)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sparclite-wrs)
+ basic_machine=sparclite-wrs
+ os=-vxworks
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ st2000)
+ basic_machine=m68k-tandem
+ ;;
+ stratus)
+ basic_machine=i860-stratus
+ os=-sysv4
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ t3e)
+ basic_machine=t3e-cray
+ os=-unicos
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ v810 | necv810)
+ basic_machine=v810-nec
+ os=-none
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ w65*)
+ basic_machine=w65-wdc
+ os=-none
+ ;;
+ w89k-*)
+ basic_machine=hppa1.1-winbond
+ os=-proelf
+ ;;
+ xmp)
+ basic_machine=xmp-cray
+ os=-unicos
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ z8k-*-coff)
+ basic_machine=z8k-unknown
+ os=-sim
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ w89k)
+ basic_machine=hppa1.1-winbond
+ ;;
+ op50n)
+ basic_machine=hppa1.1-oki
+ ;;
+ op60c)
+ basic_machine=hppa1.1-oki
+ ;;
+ mips)
+ if [ x$os = x-linux-gnu ]; then
+ basic_machine=mips-unknown
+ else
+ basic_machine=mips-mips
+ fi
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sparc | sparcv9)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ mac | mpw | mac-mpw)
+ basic_machine=m68k-apple
+ ;;
+ pmac | pmac-mpw)
+ basic_machine=powerpc-apple
+ ;;
+ c4x*)
+ basic_machine=c4x-none
+ os=-coff
+ ;;
+ *)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases
+ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -svr4*)
+ os=-sysv4
+ ;;
+ -unixware*)
+ os=-sysv4.2uw
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # First accept the basic system types.
+ # The portable systems comes first.
+ # Each alternative MUST END IN A *, to match a version number.
+ # -sysv* is not here because it comes later, after sysvr4.
+ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
+ | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -interix* | -uwin* | -rhapsody* | -opened* | -openstep* | -oskit*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
+ | -macos* | -mpw* | -magic* | -mon960* | -lnews*)
+ ;;
+ -mac*)
+ os=`echo $os | sed -e 's|mac|macos|'`
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo $os | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -opened*)
+ os=-openedition
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -386bsd)
+ os=-bsd
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -qnx)
+ os=-qnx4
+ ;;
+ -svr4)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -ose*)
+ os=-ose
+ ;;
+ -es1800*)
+ os=-ose
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -*mint | -*MiNT)
+ os=-mint
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-rebel)
+ os=-linux
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ # This also exists in the configure program, but was not the
+ # default.
+ # os=-sunos4
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+ mips*-*)
+ os=-elf
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ *-be)
+ os=-beos
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-wec)
+ os=-proelf
+ ;;
+ *-winbond)
+ os=-proelf
+ ;;
+ *-oki)
+ os=-proelf
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigaos
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next )
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-next)
+ os=-nextstep3
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f301-fujitsu)
+ os=-uxpv
+ ;;
+ *-rom68k)
+ os=-coff
+ ;;
+ *-*bug)
+ os=-coff
+ ;;
+ *-apple)
+ os=-macos
+ ;;
+ *-atari*)
+ os=-mint
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -aix*)
+ vendor=ibm
+ ;;
+ -beos*)
+ vendor=be
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -mpeix*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs* | -opened*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -vxsim* | -vxworks*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ -hms*)
+ vendor=hitachi
+ ;;
+ -mpw* | -macos*)
+ vendor=apple
+ ;;
+ -*mint | -*MiNT)
+ vendor=atari
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
diff --git a/configure b/configure
new file mode 100755
index 0000000..6213354
--- /dev/null
+++ b/configure
@@ -0,0 +1,5905 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+ --with-gnu-ld assume the C compiler uses GNU ld [default=no]"
+ac_help="$ac_help
+ --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib
+ --without-libiconv-prefix don't search for libiconv in includedir and libdir"
+ac_help="$ac_help
+ --disable-nls do not use Native Language Support"
+ac_help="$ac_help
+ --with-included-gettext use the GNU gettext library included here"
+ac_help="$ac_help
+ --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib
+ --without-libintl-prefix don't search for libintl in includedir and libdir"
+ac_help="$ac_help
+ --with-gtk-prefix=PFX Prefix where GTK is installed (optional)"
+ac_help="$ac_help
+ --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)"
+ac_help="$ac_help
+ --disable-gtktest Do not try to compile and run a test GTK program"
+ac_help="$ac_help
+ --enable-driver Build user mode driver"
+ac_help="$ac_help
+ --disable-mkiss Don not use the MKISS driver even if available"
+ac_help="$ac_help
+ --enable-ppuser Enable PPUSER parport access method"
+ac_help="$ac_help
+ --enable-ppkdrv Enable Linux Kernel driver parport access method"
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ case "$ac_option" in
+ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir="$ac_optarg" ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$ac_optarg" ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file="$ac_optarg" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix="$ac_optarg" ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he)
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$ac_optarg" ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir="$ac_optarg" ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir="$ac_optarg" ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir="$ac_optarg" ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir="$ac_optarg" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir="$ac_optarg" ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir="$ac_optarg" ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir="$ac_optarg" ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix="$ac_optarg" ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix="$ac_optarg" ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix="$ac_optarg" ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name="$ac_optarg" ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir="$ac_optarg" ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir="$ac_optarg" ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site="$ac_optarg" ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir="$ac_optarg" ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir="$ac_optarg" ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.13"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval "with_${ac_package}=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes="$ac_optarg" ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries="$ac_optarg" ;;
+
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=acconfig.h
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi at caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+# Check whether --with-gnu-ld or --without-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+ withval="$with_gnu_ld"
+ test "$withval" = no || with_gnu_ld=yes
+else
+ with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6
+echo "configure:562: checking for ld used by GCC" >&5
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [\\/]* | [A-Za-z]:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the path of ld
+ ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ echo $ac_n "checking for GNU ld""... $ac_c" 1>&6
+echo "configure:592: checking for GNU ld" >&5
+else
+ echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6
+echo "configure:595: checking for non-GNU ld" >&5
+fi
+if eval "test \"`echo '$''{'acl_cv_path_LD'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -z "$LD"; then
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ acl_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ if "$acl_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+ test "$with_gnu_ld" != no && break
+ else
+ test "$with_gnu_ld" != yes && break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+else
+ acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+ echo "$ac_t""$LD" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; }
+echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6
+echo "configure:630: checking if the linker ($LD) is GNU ld" >&5
+if eval "test \"`echo '$''{'acl_cv_prog_gnu_ld'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
+ acl_cv_prog_gnu_ld=yes
+else
+ acl_cv_prog_gnu_ld=no
+fi
+fi
+
+echo "$ac_t""$acl_cv_prog_gnu_ld" 1>&6
+with_gnu_ld=$acl_cv_prog_gnu_ld
+
+
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+
+# Do some error checking and defaulting for the host and target type.
+# The inputs are:
+# configure --host=HOST --target=TARGET --build=BUILD NONOPT
+#
+# The rules are:
+# 1. You are not allowed to specify --host, --target, and nonopt at the
+# same time.
+# 2. Host defaults to nonopt.
+# 3. If nonopt is not specified, then host defaults to the current host,
+# as determined by config.guess.
+# 4. Target and build default to nonopt.
+# 5. If nonopt is not specified, then target and build default to host.
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+case $host---$target---$nonopt in
+NONE---*---* | *---NONE---* | *---*---NONE) ;;
+*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;;
+esac
+
+
+# Make sure we can run config.sub.
+if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:694: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+ case $nonopt in
+ NONE)
+ if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
+ else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+ fi ;;
+ *) host_alias=$nonopt ;;
+ esac ;;
+esac
+
+host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+echo $ac_n "checking target system type""... $ac_c" 1>&6
+echo "configure:715: checking target system type" >&5
+
+target_alias=$target
+case "$target_alias" in
+NONE)
+ case $nonopt in
+ NONE) target_alias=$host_alias ;;
+ *) target_alias=$nonopt ;;
+ esac ;;
+esac
+
+target=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $target_alias`
+target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$target" 1>&6
+
+echo $ac_n "checking build system type""... $ac_c" 1>&6
+echo "configure:733: checking build system type" >&5
+
+build_alias=$build
+case "$build_alias" in
+NONE)
+ case $nonopt in
+ NONE) build_alias=$host_alias ;;
+ *) build_alias=$nonopt ;;
+ esac ;;
+esac
+
+build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias`
+build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$build" 1>&6
+
+test "$host_alias" != "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:768: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":"
+ for ac_dir in $PATH; do
+ # Account for people who put trailing slashes in PATH elements.
+ case "$ac_dir/" in
+ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ if test -f $ac_dir/$ac_prog; then
+ if test $ac_prog = install &&
+ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ else
+ ac_cv_path_install="$ac_dir/$ac_prog -c"
+ break 2
+ fi
+ fi
+ done
+ ;;
+ esac
+ done
+ IFS="$ac_save_IFS"
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL="$ac_cv_path_install"
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL="$ac_install_sh"
+ fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
+echo "configure:821: checking whether build environment is sane" >&5
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftestfile`
+ fi
+ if test "$*" != "X $srcdir/configure conftestfile" \
+ && test "$*" != "X conftestfile $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ { echo "configure: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" 1>&2; exit 1; }
+ fi
+
+ test "$2" = conftestfile
+ )
+then
+ # Ok.
+ :
+else
+ { echo "configure: error: newly created file is older than distributed files!
+Check your system clock" 1>&2; exit 1; }
+fi
+rm -f conftest*
+echo "$ac_t""yes" 1>&6
+if test "$program_transform_name" = s,x,x,; then
+ program_transform_name=
+else
+ # Double any \ or $. echo might interpret backslashes.
+ cat <<\EOF_SED > conftestsed
+s,\\,\\\\,g; s,\$,$$,g
+EOF_SED
+ program_transform_name="`echo $program_transform_name|sed -f conftestsed`"
+ rm -f conftestsed
+fi
+test "$program_prefix" != NONE &&
+ program_transform_name="s,^,${program_prefix},; $program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s,\$\$,${program_suffix},; $program_transform_name"
+
+# sed with no file args requires a program.
+test "$program_transform_name" = "" && program_transform_name="s,x,x,"
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:878: checking whether ${MAKE-make} sets \${MAKE}" >&5
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftestmake <<\EOF
+all:
+ @echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftestmake
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ SET_MAKE=
+else
+ echo "$ac_t""no" 1>&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+PACKAGE=baycomepp
+
+VERSION=0.10
+
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+ { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
+fi
+cat >> confdefs.h <<EOF
+#define PACKAGE "$PACKAGE"
+EOF
+
+cat >> confdefs.h <<EOF
+#define VERSION "$VERSION"
+EOF
+
+
+
+missing_dir=`cd $ac_aux_dir && pwd`
+echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
+echo "configure:924: checking for working aclocal" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (aclocal --version) < /dev/null > /dev/null 2>&1; then
+ ACLOCAL=aclocal
+ echo "$ac_t""found" 1>&6
+else
+ ACLOCAL="$missing_dir/missing aclocal"
+ echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
+echo "configure:937: checking for working autoconf" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (autoconf --version) < /dev/null > /dev/null 2>&1; then
+ AUTOCONF=autoconf
+ echo "$ac_t""found" 1>&6
+else
+ AUTOCONF="$missing_dir/missing autoconf"
+ echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working automake""... $ac_c" 1>&6
+echo "configure:950: checking for working automake" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (automake --version) < /dev/null > /dev/null 2>&1; then
+ AUTOMAKE=automake
+ echo "$ac_t""found" 1>&6
+else
+ AUTOMAKE="$missing_dir/missing automake"
+ echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
+echo "configure:963: checking for working autoheader" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (autoheader --version) < /dev/null > /dev/null 2>&1; then
+ AUTOHEADER=autoheader
+ echo "$ac_t""found" 1>&6
+else
+ AUTOHEADER="$missing_dir/missing autoheader"
+ echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
+echo "configure:976: checking for working makeinfo" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (makeinfo --version) < /dev/null > /dev/null 2>&1; then
+ MAKEINFO=makeinfo
+ echo "$ac_t""found" 1>&6
+else
+ MAKEINFO="$missing_dir/missing makeinfo"
+ echo "$ac_t""missing" 1>&6
+fi
+
+
+
+
+
+
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:995: checking whether ${MAKE-make} sets \${MAKE}" >&5
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftestmake <<\EOF
+all:
+ @echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftestmake
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ SET_MAKE=
+else
+ echo "$ac_t""no" 1>&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+ echo $ac_n "checking for strerror in -lcposix""... $ac_c" 1>&6
+echo "configure:1023: checking for strerror in -lcposix" >&5
+ac_lib_var=`echo cposix'_'strerror | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lcposix $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1031 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char strerror();
+
+int main() {
+strerror()
+; return 0; }
+EOF
+if { (eval echo configure:1042: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ LIBS="$LIBS -lcposix"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1067: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1097: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_prog_rejected=no
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test -z "$CC"; then
+ case "`uname -s`" in
+ *win32* | *WIN32*)
+ # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1148: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="cl"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+ ;;
+ esac
+ fi
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:1180: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 1191 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:1196: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ ac_cv_prog_cc_works=yes
+ # If we can't run a trivial program, we are probably using a cross compiler.
+ if (./conftest; exit) 2>/dev/null; then
+ ac_cv_prog_cc_cross=no
+ else
+ ac_cv_prog_cc_cross=yes
+ fi
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+ { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:1222: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:1227: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1236: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+
+ac_test_CFLAGS="${CFLAGS+set}"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS=
+echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:1255: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+
+
+
+
+echo $ac_n "checking for ${CC-cc} option to accept ANSI C""... $ac_c" 1>&6
+echo "configure:1290: checking for ${CC-cc} option to accept ANSI C" >&5
+if eval "test \"`echo '$''{'am_cv_prog_cc_stdc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ am_cv_prog_cc_stdc=no
+ac_save_CC="$CC"
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX -qlanglvl=ansi
+# Ultrix and OSF/1 -std1
+# HP-UX -Aa -D_HPUX_SOURCE
+# SVR4 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ cat > conftest.$ac_ext <<EOF
+#line 1306 "configure"
+#include "confdefs.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+
+int main() {
+
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+
+; return 0; }
+EOF
+if { (eval echo configure:1343: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ am_cv_prog_cc_stdc="$ac_arg"; break
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+done
+CC="$ac_save_CC"
+
+fi
+
+if test -z "$am_cv_prog_cc_stdc"; then
+ echo "$ac_t""none needed" 1>&6
+else
+ echo "$ac_t""$am_cv_prog_cc_stdc" 1>&6
+fi
+case "x$am_cv_prog_cc_stdc" in
+ x|xno) ;;
+ *) CC="$CC $am_cv_prog_cc_stdc" ;;
+esac
+
+echo $ac_n "checking for working const""... $ac_c" 1>&6
+echo "configure:1367: checking for working const" >&5
+if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1372 "configure"
+#include "confdefs.h"
+
+int main() {
+
+/* Ultrix mips cc rejects this. */
+typedef int charset[2]; const charset x;
+/* SunOS 4.1.1 cc rejects this. */
+char const *const *ccp;
+char **p;
+/* NEC SVR4.0.2 mips cc rejects this. */
+struct point {int x, y;};
+static struct point const zero = {0,0};
+/* AIX XL C 1.02.0.0 rejects this.
+ It does not let you subtract one const X* pointer from another in an arm
+ of an if-expression whose if-part is not a constant expression */
+const char *g = "string";
+ccp = &g + (g ? g-g : 0);
+/* HPUX 7.0 cc rejects these. */
+++ccp;
+p = (char**) ccp;
+ccp = (char const *const *) p;
+{ /* SCO 3.2v4 cc rejects this. */
+ char *t;
+ char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+ *t++ = 0;
+}
+{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
+ int x[] = {25, 17};
+ const int *foo = &x[0];
+ ++foo;
+}
+{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+ typedef const int *iptr;
+ iptr p = 0;
+ ++p;
+}
+{ /* AIX XL C 1.02.0.0 rejects this saying
+ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+ struct s { int j; const int *ap[3]; };
+ struct s *b; b->j = 5;
+}
+{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+ const int foo = 10;
+}
+
+; return 0; }
+EOF
+if { (eval echo configure:1421: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_c_const=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_c_const=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_c_const" 1>&6
+if test $ac_cv_c_const = no; then
+ cat >> confdefs.h <<\EOF
+#define const
+EOF
+
+fi
+
+echo $ac_n "checking for inline""... $ac_c" 1>&6
+echo "configure:1442: checking for inline" >&5
+if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat > conftest.$ac_ext <<EOF
+#line 1449 "configure"
+#include "confdefs.h"
+
+int main() {
+} $ac_kw foo() {
+; return 0; }
+EOF
+if { (eval echo configure:1456: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_c_inline=$ac_kw; break
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+done
+
+fi
+
+echo "$ac_t""$ac_cv_c_inline" 1>&6
+case "$ac_cv_c_inline" in
+ inline | yes) ;;
+ no) cat >> confdefs.h <<\EOF
+#define inline
+EOF
+ ;;
+ *) cat >> confdefs.h <<EOF
+#define inline $ac_cv_c_inline
+EOF
+ ;;
+esac
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:1482: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # This must be in double quotes, not single quotes, because CPP may get
+ # substituted into the Makefile and "${CC-cc}" will confuse make.
+ CPP="${CC-cc} -E"
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp.
+ cat > conftest.$ac_ext <<EOF
+#line 1497 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1503: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -E -traditional-cpp"
+ cat > conftest.$ac_ext <<EOF
+#line 1514 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1520: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -nologo -E"
+ cat > conftest.$ac_ext <<EOF
+#line 1531 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1537: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+ ac_cv_prog_CPP="$CPP"
+fi
+ CPP="$ac_cv_prog_CPP"
+else
+ ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
+echo "configure:1562: checking for ANSI C header files" >&5
+if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1567 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1575: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ ac_cv_header_stdc=yes
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 1592 "configure"
+#include "confdefs.h"
+#include <string.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "memchr" >/dev/null 2>&1; then
+ :
+else
+ rm -rf conftest*
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 1610 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "free" >/dev/null 2>&1; then
+ :
+else
+ rm -rf conftest*
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+if test "$cross_compiling" = yes; then
+ :
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1631 "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int main () { int i; for (i = 0; i < 256; i++)
+if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
+exit (0); }
+
+EOF
+if { (eval echo configure:1642: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ :
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_header_stdc=no
+fi
+rm -fr conftest*
+fi
+
+fi
+fi
+
+echo "$ac_t""$ac_cv_header_stdc" 1>&6
+if test $ac_cv_header_stdc = yes; then
+ cat >> confdefs.h <<\EOF
+#define STDC_HEADERS 1
+EOF
+
+fi
+
+
+# Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1669: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_RANLIB="ranlib"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+ echo "$ac_t""$RANLIB" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+# Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1699: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$DLLTOOL"; then
+ ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_DLLTOOL="dlltool"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_DLLTOOL" && ac_cv_prog_DLLTOOL="dlltool"
+fi
+fi
+DLLTOOL="$ac_cv_prog_DLLTOOL"
+if test -n "$DLLTOOL"; then
+ echo "$ac_t""$DLLTOOL" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+# Extract the first word of "as", so it can be a program name with args.
+set dummy as; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1729: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$AS"; then
+ ac_cv_prog_AS="$AS" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="as"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_AS="as"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_AS" && ac_cv_prog_AS="as"
+fi
+fi
+AS="$ac_cv_prog_AS"
+if test -n "$AS"; then
+ echo "$ac_t""$AS" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+# Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1759: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$AR"; then
+ ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="ar"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_AR="ar"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar"
+fi
+fi
+AR="$ac_cv_prog_AR"
+if test -n "$AR"; then
+ echo "$ac_t""$AR" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+# Extract the first word of "windres", so it can be a program name with args.
+set dummy windres; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1789: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_WINDRES'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$WINDRES"; then
+ ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_WINDRES="windres"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_WINDRES" && ac_cv_prog_WINDRES="i686-pc-cygwin-windres"
+fi
+fi
+WINDRES="$ac_cv_prog_WINDRES"
+if test -n "$WINDRES"; then
+ echo "$ac_t""$WINDRES" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
+echo "configure:1818: checking for Cygwin environment" >&5
+if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1823 "configure"
+#include "confdefs.h"
+
+int main() {
+
+#ifndef __CYGWIN__
+#define __CYGWIN__ __CYGWIN32__
+#endif
+return __CYGWIN__;
+; return 0; }
+EOF
+if { (eval echo configure:1834: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_cygwin=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_cygwin=no
+fi
+rm -f conftest*
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_cygwin" 1>&6
+CYGWIN=
+test "$ac_cv_cygwin" = yes && CYGWIN=yes
+echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
+echo "configure:1851: checking for mingw32 environment" >&5
+if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1856 "configure"
+#include "confdefs.h"
+
+int main() {
+return __MINGW32__;
+; return 0; }
+EOF
+if { (eval echo configure:1863: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_mingw32=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_mingw32=no
+fi
+rm -f conftest*
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_mingw32" 1>&6
+MINGW32=
+test "$ac_cv_mingw32" = yes && MINGW32=yes
+
+
+echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
+echo "configure:1882: checking for executable suffix" >&5
+if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$CYGWIN" = yes || test "$MINGW32" = yes; then
+ ac_cv_exeext=.exe
+else
+ rm -f conftest*
+ echo 'int main () { return 0; }' > conftest.$ac_ext
+ ac_cv_exeext=
+ if { (eval echo configure:1892: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+ for file in conftest.*; do
+ case $file in
+ *.c | *.o | *.obj) ;;
+ *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
+ esac
+ done
+ else
+ { echo "configure: error: installation or configuration problem: compiler cannot create executables." 1>&2; exit 1; }
+ fi
+ rm -f conftest*
+ test x"${ac_cv_exeext}" = x && ac_cv_exeext=no
+fi
+fi
+
+EXEEXT=""
+test x"${ac_cv_exeext}" != xno && EXEEXT=${ac_cv_exeext}
+echo "$ac_t""${ac_cv_exeext}" 1>&6
+ac_exeext=$EXEEXT
+
+echo $ac_n "checking for object suffix""... $ac_c" 1>&6
+echo "configure:1913: checking for object suffix" >&5
+if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ rm -f conftest*
+echo 'int i = 1;' > conftest.$ac_ext
+if { (eval echo configure:1919: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ for ac_file in conftest.*; do
+ case $ac_file in
+ *.c) ;;
+ *) ac_cv_objext=`echo $ac_file | sed -e s/conftest.//` ;;
+ esac
+ done
+else
+ { echo "configure: error: installation or configuration problem; compiler does not work" 1>&2; exit 1; }
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_objext" 1>&6
+OBJEXT=$ac_cv_objext
+ac_objext=$ac_cv_objext
+
+
+if test x$ac_cv_mingw32 != xyes; then
+echo $ac_n "checking for cos in -lm""... $ac_c" 1>&6
+echo "configure:1939: checking for cos in -lm" >&5
+ac_lib_var=`echo m'_'cos | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lm $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1947 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char cos();
+
+int main() {
+cos()
+; return 0; }
+EOF
+if { (eval echo configure:1958: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+ LIBS="-lm $LIBS"
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+fi
+for ac_hdr in pty.h getopt.h sys/io.h asm/io.h windows.h sched.h sys/perm.h syslog.h sys/socket.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1990: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1995 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2000: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+for ac_hdr in net/if.h arpa/inet.h netinet/in.h linux/if.h linux/ax25.h linux/sockios.h linux/soundcard.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:2030: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2035 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2040: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+for ac_func in snprintf gettimeofday iopl random syslog vsyslog revoke
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2069: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2074 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2097: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+for ac_func in vsnprintf
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2124: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2129 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2152: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+LIBOBJS="$LIBOBJS ${ac_func}.${ac_objext}"
+fi
+done
+
+
+for ac_func in getopt_long
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2181: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2186 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2209: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+LIBOBJS="$LIBOBJS getopt.o getopt1.o"
+fi
+done
+
+xlibs=$LIBS
+LIBS=
+echo $ac_n "checking for openpty in -lutil""... $ac_c" 1>&6
+echo "configure:2237: checking for openpty in -lutil" >&5
+ac_lib_var=`echo util'_'openpty | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lutil $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2245 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char openpty();
+
+int main() {
+openpty()
+; return 0; }
+EOF
+if { (eval echo configure:2256: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_lib=HAVE_LIB`echo util | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+ LIBS="-lutil $LIBS"
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+for ac_func in openpty
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2286: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2291 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2314: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+ DRVLIBOBJS="$DRVLIBOBJS $LIBS"
+else
+ echo "$ac_t""no" 1>&6
+DRVLIBOBJS="$DRVLIBOBJS openpty.o"
+fi
+done
+
+LIBS=$xlibs
+
+ALL_LINGUAS=""
+
+ if test "X$prefix" = "XNONE"; then
+ acl_final_prefix="$ac_default_prefix"
+ else
+ acl_final_prefix="$prefix"
+ fi
+ if test "X$exec_prefix" = "XNONE"; then
+ acl_final_exec_prefix='${prefix}'
+ else
+ acl_final_exec_prefix="$exec_prefix"
+ fi
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+ prefix="$acl_save_prefix"
+
+
+ echo $ac_n "checking for shared library run path origin""... $ac_c" 1>&6
+echo "configure:2360: checking for shared library run path origin" >&5
+if eval "test \"`echo '$''{'acl_cv_rpath'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+ . ./conftest.sh
+ rm -f ./conftest.sh
+ acl_cv_rpath=done
+
+fi
+
+echo "$ac_t""$acl_cv_rpath" 1>&6
+ wl="$acl_cv_wl"
+ libext="$acl_cv_libext"
+ shlibext="$acl_cv_shlibext"
+ hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+ hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+ hardcode_direct="$acl_cv_hardcode_direct"
+ hardcode_minus_L="$acl_cv_hardcode_minus_L"
+ sys_lib_search_path_spec="$acl_cv_sys_lib_search_path_spec"
+ sys_lib_dlsearch_path_spec="$acl_cv_sys_lib_dlsearch_path_spec"
+
+
+ MKINSTALLDIRS=
+ if test -n "$ac_aux_dir"; then
+ MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
+ fi
+ if test -z "$MKINSTALLDIRS"; then
+ MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
+ fi
+
+
+# Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2397: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_RANLIB="ranlib"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+ echo "$ac_t""$RANLIB" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+echo $ac_n "checking for off_t""... $ac_c" 1>&6
+echo "configure:2425: checking for off_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2430 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "(^|[^a-zA-Z_0-9])off_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_type_off_t=yes
+else
+ rm -rf conftest*
+ ac_cv_type_off_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_off_t" 1>&6
+if test $ac_cv_type_off_t = no; then
+ cat >> confdefs.h <<\EOF
+#define off_t long
+EOF
+
+fi
+
+echo $ac_n "checking for size_t""... $ac_c" 1>&6
+echo "configure:2458: checking for size_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2463 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_type_size_t=yes
+else
+ rm -rf conftest*
+ ac_cv_type_size_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_size_t" 1>&6
+if test $ac_cv_type_size_t = no; then
+ cat >> confdefs.h <<\EOF
+#define size_t unsigned
+EOF
+
+fi
+
+# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+# for constant arguments. Useless!
+echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
+echo "configure:2493: checking for working alloca.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2498 "configure"
+#include "confdefs.h"
+#include <alloca.h>
+int main() {
+char *p = alloca(2 * sizeof(int));
+; return 0; }
+EOF
+if { (eval echo configure:2505: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ ac_cv_header_alloca_h=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_header_alloca_h=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_header_alloca_h" 1>&6
+if test $ac_cv_header_alloca_h = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_ALLOCA_H 1
+EOF
+
+fi
+
+echo $ac_n "checking for alloca""... $ac_c" 1>&6
+echo "configure:2526: checking for alloca" >&5
+if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2531 "configure"
+#include "confdefs.h"
+
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+#else
+# ifdef _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+# else
+# if HAVE_ALLOCA_H
+# include <alloca.h>
+# else
+# ifdef _AIX
+ #pragma alloca
+# else
+# ifndef alloca /* predefined by HP cc +Olibcalls */
+char *alloca ();
+# endif
+# endif
+# endif
+# endif
+#endif
+
+int main() {
+char *p = (char *) alloca(1);
+; return 0; }
+EOF
+if { (eval echo configure:2559: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ ac_cv_func_alloca_works=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_func_alloca_works=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_func_alloca_works" 1>&6
+if test $ac_cv_func_alloca_works = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_ALLOCA 1
+EOF
+
+fi
+
+if test $ac_cv_func_alloca_works = no; then
+ # The SVR3 libPW and SVR4 libucb both contain incompatible functions
+ # that cause trouble. Some versions do not even contain alloca or
+ # contain a buggy version. If you still want to use their alloca,
+ # use ar to extract alloca.o from them instead of compiling alloca.c.
+ ALLOCA=alloca.${ac_objext}
+ cat >> confdefs.h <<\EOF
+#define C_ALLOCA 1
+EOF
+
+
+echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
+echo "configure:2591: checking whether alloca needs Cray hooks" >&5
+if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2596 "configure"
+#include "confdefs.h"
+#if defined(CRAY) && ! defined(CRAY2)
+webecray
+#else
+wenotbecray
+#endif
+
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "webecray" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_os_cray=yes
+else
+ rm -rf conftest*
+ ac_cv_os_cray=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_os_cray" 1>&6
+if test $ac_cv_os_cray = yes; then
+for ac_func in _getb67 GETB67 getb67; do
+ echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2621: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2626 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2649: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ cat >> confdefs.h <<EOF
+#define CRAY_STACKSEG_END $ac_func
+EOF
+
+ break
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+done
+fi
+
+echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
+echo "configure:2676: checking stack direction for C alloca" >&5
+if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_c_stack_direction=0
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2684 "configure"
+#include "confdefs.h"
+find_stack_direction ()
+{
+ static char *addr = 0;
+ auto char dummy;
+ if (addr == 0)
+ {
+ addr = &dummy;
+ return find_stack_direction ();
+ }
+ else
+ return (&dummy > addr) ? 1 : -1;
+}
+main ()
+{
+ exit (find_stack_direction() < 0);
+}
+EOF
+if { (eval echo configure:2703: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_c_stack_direction=1
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_c_stack_direction=-1
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$ac_cv_c_stack_direction" 1>&6
+cat >> confdefs.h <<EOF
+#define STACK_DIRECTION $ac_cv_c_stack_direction
+EOF
+
+fi
+
+for ac_hdr in stdlib.h unistd.h sys/stat.h sys/types.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:2728: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2733 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2738: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+for ac_func in getpagesize
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2767: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2772 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2795: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+echo $ac_n "checking for working mmap""... $ac_c" 1>&6
+echo "configure:2820: checking for working mmap" >&5
+if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_mmap_fixed_mapped=no
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2828 "configure"
+#include "confdefs.h"
+
+/* Thanks to Mike Haertel and Jim Avera for this test.
+ Here is a matrix of mmap possibilities:
+ mmap private not fixed
+ mmap private fixed at somewhere currently unmapped
+ mmap private fixed at somewhere already mapped
+ mmap shared not fixed
+ mmap shared fixed at somewhere currently unmapped
+ mmap shared fixed at somewhere already mapped
+ For private mappings, we should verify that changes cannot be read()
+ back from the file, nor mmap's back from the file at a different
+ address. (There have been systems where private was not correctly
+ implemented like the infamous i386 svr4.0, and systems where the
+ VM page cache was not coherent with the filesystem buffer cache
+ like early versions of FreeBSD and possibly contemporary NetBSD.)
+ For shared mappings, we should conversely verify that changes get
+ propogated back to all the places they're supposed to be.
+
+ Grep wants private fixed already mapped.
+ The main things grep needs to know about mmap are:
+ * does it exist and is it safe to write into the mmap'd area
+ * how to use it (BSD variants) */
+#include <sys/types.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+
+#if HAVE_STDLIB_H
+# include <stdlib.h>
+#endif
+
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+/* This mess was copied from the GNU getpagesize.h. */
+#ifndef HAVE_GETPAGESIZE
+
+/* Assume that all systems that can run configure have sys/param.h. */
+# ifndef HAVE_SYS_PARAM_H
+# define HAVE_SYS_PARAM_H 1
+# endif
+
+# ifdef _SC_PAGESIZE
+# define getpagesize() sysconf(_SC_PAGESIZE)
+# else /* no _SC_PAGESIZE */
+# ifdef HAVE_SYS_PARAM_H
+# include <sys/param.h>
+# ifdef EXEC_PAGESIZE
+# define getpagesize() EXEC_PAGESIZE
+# else /* no EXEC_PAGESIZE */
+# ifdef NBPG
+# define getpagesize() NBPG * CLSIZE
+# ifndef CLSIZE
+# define CLSIZE 1
+# endif /* no CLSIZE */
+# else /* no NBPG */
+# ifdef NBPC
+# define getpagesize() NBPC
+# else /* no NBPC */
+# ifdef PAGESIZE
+# define getpagesize() PAGESIZE
+# endif /* PAGESIZE */
+# endif /* no NBPC */
+# endif /* no NBPG */
+# endif /* no EXEC_PAGESIZE */
+# else /* no HAVE_SYS_PARAM_H */
+# define getpagesize() 8192 /* punt totally */
+# endif /* no HAVE_SYS_PARAM_H */
+# endif /* no _SC_PAGESIZE */
+
+#endif /* no HAVE_GETPAGESIZE */
+
+#ifdef __cplusplus
+extern "C" { void *malloc(unsigned); }
+#else
+char *malloc();
+#endif
+
+int
+main()
+{
+ char *data, *data2, *data3;
+ int i, pagesize;
+ int fd;
+
+ pagesize = getpagesize();
+
+ /*
+ * First, make a file with some known garbage in it.
+ */
+ data = malloc(pagesize);
+ if (!data)
+ exit(1);
+ for (i = 0; i < pagesize; ++i)
+ *(data + i) = rand();
+ umask(0);
+ fd = creat("conftestmmap", 0600);
+ if (fd < 0)
+ exit(1);
+ if (write(fd, data, pagesize) != pagesize)
+ exit(1);
+ close(fd);
+
+ /*
+ * Next, try to mmap the file at a fixed address which
+ * already has something else allocated at it. If we can,
+ * also make sure that we see the same garbage.
+ */
+ fd = open("conftestmmap", O_RDWR);
+ if (fd < 0)
+ exit(1);
+ data2 = malloc(2 * pagesize);
+ if (!data2)
+ exit(1);
+ data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1);
+ if (data2 != mmap(data2, pagesize, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_FIXED, fd, 0L))
+ exit(1);
+ for (i = 0; i < pagesize; ++i)
+ if (*(data + i) != *(data2 + i))
+ exit(1);
+
+ /*
+ * Finally, make sure that changes to the mapped area
+ * do not percolate back to the file as seen by read().
+ * (This is a bug on some variants of i386 svr4.0.)
+ */
+ for (i = 0; i < pagesize; ++i)
+ *(data2 + i) = *(data2 + i) + 1;
+ data3 = malloc(pagesize);
+ if (!data3)
+ exit(1);
+ if (read(fd, data3, pagesize) != pagesize)
+ exit(1);
+ for (i = 0; i < pagesize; ++i)
+ if (*(data + i) != *(data3 + i))
+ exit(1);
+ close(fd);
+ unlink("conftestmmap");
+ exit(0);
+}
+
+EOF
+if { (eval echo configure:2981: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_func_mmap_fixed_mapped=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_func_mmap_fixed_mapped=no
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$ac_cv_func_mmap_fixed_mapped" 1>&6
+if test $ac_cv_func_mmap_fixed_mapped = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_MMAP 1
+EOF
+
+fi
+
+
+ echo $ac_n "checking whether we are using the GNU C Library 2.1 or newer""... $ac_c" 1>&6
+echo "configure:3005: checking whether we are using the GNU C Library 2.1 or newer" >&5
+if eval "test \"`echo '$''{'ac_cv_gnu_library_2_1'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3010 "configure"
+#include "confdefs.h"
+
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2)
+ Lucky GNU user
+ #endif
+#endif
+
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "Lucky GNU user" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_gnu_library_2_1=yes
+else
+ rm -rf conftest*
+ ac_cv_gnu_library_2_1=no
+fi
+rm -f conftest*
+
+
+
+fi
+
+echo "$ac_t""$ac_cv_gnu_library_2_1" 1>&6
+
+ GLIBC21="$ac_cv_gnu_library_2_1"
+
+
+
+
+
+
+
+
+
+ use_additional=yes
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ # Check whether --with-libiconv-prefix or --without-libiconv-prefix was given.
+if test "${with_libiconv_prefix+set}" = set; then
+ withval="$with_libiconv_prefix"
+
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/lib"
+ fi
+ fi
+
+fi
+
+ LIBICONV=
+ LTLIBICONV=
+ INCICONV=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='iconv '
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value"
+ else
+ :
+ fi
+ else
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ if test $use_additional = yes; then
+ if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
+ found_dir="$additional_libdir"
+ found_so="$additional_libdir/lib$name.$shlibext"
+ if test -f "$additional_libdir/lib$name.la"; then
+ found_la="$additional_libdir/lib$name.la"
+ fi
+ else
+ if test -f "$additional_libdir/lib$name.$libext"; then
+ found_dir="$additional_libdir"
+ found_a="$additional_libdir/lib$name.$libext"
+ if test -f "$additional_libdir/lib$name.la"; then
+ found_la="$additional_libdir/lib$name.la"
+ fi
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIBICONV; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
+ found_dir="$dir"
+ found_so="$dir/lib$name.$shlibext"
+ if test -f "$dir/lib$name.la"; then
+ found_la="$dir/lib$name.la"
+ fi
+ else
+ if test -f "$dir/lib$name.$libext"; then
+ found_dir="$dir"
+ found_a="$dir/lib$name.$libext"
+ if test -f "$dir/lib$name.la"; then
+ found_la="$dir/lib$name.la"
+ fi
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ fi
+ if test "X$found_dir" != "X"; then
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name"
+ if test "X$found_so" != "X"; then
+ if test "X$found_dir" = "X/usr/lib"; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+ else
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ if test "$hardcode_direct" = yes; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+ else
+ if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ haveit=
+ for x in $LDFLAGS $LIBICONV; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir"
+ fi
+ if test "$hardcode_minus_L" != no; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
+ else
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a"
+ else
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name"
+ fi
+ fi
+ additional_includedir=
+ case "$found_dir" in
+ */lib | */lib/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INCICONV; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test -n "$found_la"; then
+ save_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$save_libdir"
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ if test "X$additional_libdir" != "X/usr/lib"; then
+ haveit=
+ if test "X$additional_libdir" = "X/usr/local/lib"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIBICONV; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIBICONV; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -l*)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+ ;;
+ *.la)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$dep"
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$hardcode_libdir_separator"; then
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+ done
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+ else
+ for found_dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ for found_dir in $ltrpathdirs; do
+ LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir"
+ done
+ fi
+
+
+ am_save_CPPFLAGS="$CPPFLAGS"
+
+ for element in $INCICONV; do
+ haveit=
+ for x in $CPPFLAGS; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+ fi
+ done
+
+
+ echo $ac_n "checking for iconv""... $ac_c" 1>&6
+echo "configure:3425: checking for iconv" >&5
+if eval "test \"`echo '$''{'am_cv_func_iconv'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ am_cv_func_iconv="no, consider installing GNU libiconv"
+ am_cv_lib_iconv=no
+ cat > conftest.$ac_ext <<EOF
+#line 3433 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <iconv.h>
+int main() {
+iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
+; return 0; }
+EOF
+if { (eval echo configure:3443: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ am_cv_func_iconv=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+ if test "$am_cv_func_iconv" != yes; then
+ am_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBICONV"
+ cat > conftest.$ac_ext <<EOF
+#line 3455 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <iconv.h>
+int main() {
+iconv_t cd = iconv_open("","");
+ iconv(cd,NULL,NULL,NULL,NULL);
+ iconv_close(cd);
+; return 0; }
+EOF
+if { (eval echo configure:3465: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ am_cv_lib_iconv=yes
+ am_cv_func_iconv=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+ LIBS="$am_save_LIBS"
+ fi
+
+fi
+
+echo "$ac_t""$am_cv_func_iconv" 1>&6
+ if test "$am_cv_func_iconv" = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_ICONV 1
+EOF
+
+ fi
+ if test "$am_cv_lib_iconv" = yes; then
+ echo $ac_n "checking how to link with libiconv""... $ac_c" 1>&6
+echo "configure:3488: checking how to link with libiconv" >&5
+ echo "$ac_t""$LIBICONV" 1>&6
+ else
+ CPPFLAGS="$am_save_CPPFLAGS"
+ LIBICONV=
+ LTLIBICONV=
+ fi
+
+
+
+
+
+
+ # Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3504: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$MSGFMT" in
+ /*)
+ ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if $ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 &&
+ (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+ ac_cv_path_MSGFMT="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":"
+ ;;
+esac
+fi
+MSGFMT="$ac_cv_path_MSGFMT"
+if test "$MSGFMT" != ":"; then
+ echo "$ac_t""$MSGFMT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3539: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$GMSGFMT" in
+ /*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
+ ;;
+esac
+fi
+GMSGFMT="$ac_cv_path_GMSGFMT"
+if test -n "$GMSGFMT"; then
+ echo "$ac_t""$GMSGFMT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+ # Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3576: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$XGETTEXT" in
+ /*)
+ ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if $ac_dir/$ac_word --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 &&
+ (if $ac_dir/$ac_word --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+ ac_cv_path_XGETTEXT="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+ ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test "$XGETTEXT" != ":"; then
+ echo "$ac_t""$XGETTEXT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ rm -f messages.po
+
+ # Extract the first word of "msgmerge", so it can be a program name with args.
+set dummy msgmerge; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3613: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_MSGMERGE'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$MSGMERGE" in
+ /*)
+ ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if $ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1; then
+ ac_cv_path_MSGMERGE="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":"
+ ;;
+esac
+fi
+MSGMERGE="$ac_cv_path_MSGMERGE"
+if test "$MSGMERGE" != ":"; then
+ echo "$ac_t""$MSGMERGE" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+ if test "$GMSGFMT" != ":"; then
+ if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 &&
+ (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+ : ;
+ else
+ GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'`
+ echo "$ac_t""found $GMSGFMT program is not GNU msgfmt; ignore it" 1>&6
+ GMSGFMT=":"
+ fi
+ fi
+
+ if test "$XGETTEXT" != ":"; then
+ if $XGETTEXT --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 &&
+ (if $XGETTEXT --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
+ : ;
+ else
+ echo "$ac_t""found xgettext program is not GNU xgettext; ignore it" 1>&6
+ XGETTEXT=":"
+ fi
+ rm -f messages.po
+ fi
+
+
+
+
+
+ for ac_hdr in argz.h limits.h locale.h nl_types.h malloc.h stddef.h \
+stdlib.h string.h unistd.h sys/param.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:3676: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3681 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:3686: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+ for ac_func in feof_unlocked fgets_unlocked getc_unlocked getcwd getegid \
+geteuid getgid getuid mempcpy munmap putenv setenv setlocale stpcpy \
+strcasecmp strdup strtoul tsearch __argz_count __argz_stringify __argz_next
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:3717: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3722 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:3745: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+
+
+
+ if test "$am_cv_func_iconv" = yes; then
+ echo $ac_n "checking for iconv declaration""... $ac_c" 1>&6
+echo "configure:3774: checking for iconv declaration" >&5
+ if eval "test \"`echo '$''{'am_cv_proto_iconv'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+
+ cat > conftest.$ac_ext <<EOF
+#line 3780 "configure"
+#include "confdefs.h"
+
+#include <stdlib.h>
+#include <iconv.h>
+extern
+#ifdef __cplusplus
+"C"
+#endif
+#if defined(__STDC__) || defined(__cplusplus)
+size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
+#else
+size_t iconv();
+#endif
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:3799: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ am_cv_proto_iconv_arg1=""
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ am_cv_proto_iconv_arg1="const"
+fi
+rm -f conftest*
+ am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"
+fi
+
+ am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
+ echo "$ac_t""${ac_t:-
+ }$am_cv_proto_iconv" 1>&6
+ cat >> confdefs.h <<EOF
+#define ICONV_CONST $am_cv_proto_iconv_arg1
+EOF
+
+ fi
+
+
+ echo $ac_n "checking for nl_langinfo and CODESET""... $ac_c" 1>&6
+echo "configure:3823: checking for nl_langinfo and CODESET" >&5
+if eval "test \"`echo '$''{'am_cv_langinfo_codeset'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3828 "configure"
+#include "confdefs.h"
+#include <langinfo.h>
+int main() {
+char* cs = nl_langinfo(CODESET);
+; return 0; }
+EOF
+if { (eval echo configure:3835: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ am_cv_langinfo_codeset=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ am_cv_langinfo_codeset=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$am_cv_langinfo_codeset" 1>&6
+ if test $am_cv_langinfo_codeset = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_LANGINFO_CODESET 1
+EOF
+
+ fi
+
+ if test $ac_cv_header_locale_h = yes; then
+ echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6
+echo "configure:3858: checking for LC_MESSAGES" >&5
+if eval "test \"`echo '$''{'am_cv_val_LC_MESSAGES'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3863 "configure"
+#include "confdefs.h"
+#include <locale.h>
+int main() {
+return LC_MESSAGES
+; return 0; }
+EOF
+if { (eval echo configure:3870: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ am_cv_val_LC_MESSAGES=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ am_cv_val_LC_MESSAGES=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$am_cv_val_LC_MESSAGES" 1>&6
+ if test $am_cv_val_LC_MESSAGES = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_LC_MESSAGES 1
+EOF
+
+ fi
+ fi
+
+ for ac_prog in bison
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3896: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_INTLBISON'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$INTLBISON"; then
+ ac_cv_prog_INTLBISON="$INTLBISON" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_INTLBISON="$ac_prog"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+INTLBISON="$ac_cv_prog_INTLBISON"
+if test -n "$INTLBISON"; then
+ echo "$ac_t""$INTLBISON" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+test -n "$INTLBISON" && break
+done
+
+ if test -z "$INTLBISON"; then
+ ac_verc_fail=yes
+ else
+ echo $ac_n "checking version of bison""... $ac_c" 1>&6
+echo "configure:3929: checking version of bison" >&5
+ ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+ case $ac_prog_version in
+ '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+ 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*)
+ ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+ *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+ esac
+ echo "$ac_t""$ac_prog_version" 1>&6
+ fi
+ if test $ac_verc_fail = yes; then
+ INTLBISON=:
+ fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+ echo $ac_n "checking whether NLS is requested""... $ac_c" 1>&6
+echo "configure:3956: checking whether NLS is requested" >&5
+ # Check whether --enable-nls or --disable-nls was given.
+if test "${enable_nls+set}" = set; then
+ enableval="$enable_nls"
+ USE_NLS=$enableval
+else
+ USE_NLS=yes
+fi
+
+ echo "$ac_t""$USE_NLS" 1>&6
+
+
+
+ BUILD_INCLUDED_LIBINTL=no
+ USE_INCLUDED_LIBINTL=no
+
+ LIBINTL=
+ LTLIBINTL=
+ POSUB=
+
+ if test "$USE_NLS" = "yes"; then
+ gt_use_preinstalled_gnugettext=no
+
+ echo $ac_n "checking whether included gettext is requested""... $ac_c" 1>&6
+echo "configure:3980: checking whether included gettext is requested" >&5
+ # Check whether --with-included-gettext or --without-included-gettext was given.
+if test "${with_included_gettext+set}" = set; then
+ withval="$with_included_gettext"
+ nls_cv_force_use_gnu_gettext=$withval
+else
+ nls_cv_force_use_gnu_gettext=no
+fi
+
+ echo "$ac_t""$nls_cv_force_use_gnu_gettext" 1>&6
+
+ nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+ if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+
+
+
+
+
+
+ echo $ac_n "checking for GNU gettext in libc""... $ac_c" 1>&6
+echo "configure:4000: checking for GNU gettext in libc" >&5
+if eval "test \"`echo '$''{'gt_cv_func_gnugettext1_libc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 4005 "configure"
+#include "confdefs.h"
+#include <libintl.h>
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;
+int main() {
+bindtextdomain ("", "");
+return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_domain_bindings
+; return 0; }
+EOF
+if { (eval echo configure:4015: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ gt_cv_func_gnugettext1_libc=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ gt_cv_func_gnugettext1_libc=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$gt_cv_func_gnugettext1_libc" 1>&6
+
+ if test "$gt_cv_func_gnugettext1_libc" != "yes"; then
+
+
+
+ use_additional=yes
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ # Check whether --with-libintl-prefix or --without-libintl-prefix was given.
+if test "${with_libintl_prefix+set}" = set; then
+ withval="$with_libintl_prefix"
+
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/lib"
+ fi
+ fi
+
+fi
+
+ LIBINTL=
+ LTLIBINTL=
+ INCINTL=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='intl '
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value"
+ else
+ :
+ fi
+ else
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ if test $use_additional = yes; then
+ if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
+ found_dir="$additional_libdir"
+ found_so="$additional_libdir/lib$name.$shlibext"
+ if test -f "$additional_libdir/lib$name.la"; then
+ found_la="$additional_libdir/lib$name.la"
+ fi
+ else
+ if test -f "$additional_libdir/lib$name.$libext"; then
+ found_dir="$additional_libdir"
+ found_a="$additional_libdir/lib$name.$libext"
+ if test -f "$additional_libdir/lib$name.la"; then
+ found_la="$additional_libdir/lib$name.la"
+ fi
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIBINTL; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
+ found_dir="$dir"
+ found_so="$dir/lib$name.$shlibext"
+ if test -f "$dir/lib$name.la"; then
+ found_la="$dir/lib$name.la"
+ fi
+ else
+ if test -f "$dir/lib$name.$libext"; then
+ found_dir="$dir"
+ found_a="$dir/lib$name.$libext"
+ if test -f "$dir/lib$name.la"; then
+ found_la="$dir/lib$name.la"
+ fi
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ fi
+ if test "X$found_dir" != "X"; then
+ LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name"
+ if test "X$found_so" != "X"; then
+ if test "X$found_dir" = "X/usr/lib"; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+ else
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ if test "$hardcode_direct" = yes; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+ else
+ if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ haveit=
+ for x in $LDFLAGS $LIBINTL; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir"
+ fi
+ if test "$hardcode_minus_L" != no; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
+ else
+ LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a"
+ else
+ LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name"
+ fi
+ fi
+ additional_includedir=
+ case "$found_dir" in
+ */lib | */lib/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INCINTL; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test -n "$found_la"; then
+ save_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$save_libdir"
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ if test "X$additional_libdir" != "X/usr/lib"; then
+ haveit=
+ if test "X$additional_libdir" = "X/usr/local/lib"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIBINTL; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIBINTL; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -l*)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+ ;;
+ *.la)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$dep"
+ LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
+ LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$hardcode_libdir_separator"; then
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+ done
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
+ else
+ for found_dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ for found_dir in $ltrpathdirs; do
+ LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir"
+ done
+ fi
+
+ echo $ac_n "checking for GNU gettext in libintl""... $ac_c" 1>&6
+echo "configure:4385: checking for GNU gettext in libintl" >&5
+if eval "test \"`echo '$''{'gt_cv_func_gnugettext1_libintl'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ gt_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $INCINTL"
+ gt_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIBINTL"
+ cat > conftest.$ac_ext <<EOF
+#line 4394 "configure"
+#include "confdefs.h"
+#include <libintl.h>
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias ();
+int main() {
+bindtextdomain ("", "");
+return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_domain_bindings + *_nl_expand_alias (0)
+; return 0; }
+EOF
+if { (eval echo configure:4409: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ gt_cv_func_gnugettext1_libintl=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ gt_cv_func_gnugettext1_libintl=no
+fi
+rm -f conftest*
+ if test "$gt_cv_func_gnugettext1_libintl" != yes && test -n "$LIBICONV"; then
+ LIBS="$LIBS $LIBICONV"
+ cat > conftest.$ac_ext <<EOF
+#line 4422 "configure"
+#include "confdefs.h"
+#include <libintl.h>
+extern int _nl_msg_cat_cntr;
+extern int *_nl_domain_bindings;
+extern
+#ifdef __cplusplus
+"C"
+#endif
+const char *_nl_expand_alias ();
+int main() {
+bindtextdomain ("", "");
+return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_domain_bindings + *_nl_expand_alias (0)
+; return 0; }
+EOF
+if { (eval echo configure:4437: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ LIBINTL="$LIBINTL $LIBICONV"
+ LTLIBINTL="$LTLIBINTL $LTLIBICONV"
+ gt_cv_func_gnugettext1_libintl=yes
+
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+ fi
+ CPPFLAGS="$gt_save_CPPFLAGS"
+ LIBS="$gt_save_LIBS"
+fi
+
+echo "$ac_t""$gt_cv_func_gnugettext1_libintl" 1>&6
+ fi
+
+ if test "$gt_cv_func_gnugettext1_libc" = "yes" \
+ || { test "$gt_cv_func_gnugettext1_libintl" = "yes" \
+ && test "$PACKAGE" != gettext; }; then
+ gt_use_preinstalled_gnugettext=yes
+ else
+ LIBINTL=
+ LTLIBINTL=
+ INCINTL=
+ fi
+
+
+ if test "$gt_use_preinstalled_gnugettext" != "yes"; then
+ nls_cv_use_gnu_gettext=yes
+ fi
+ fi
+
+ if test "$nls_cv_use_gnu_gettext" = "yes"; then
+ INTLOBJS="\$(GETTOBJS)"
+ BUILD_INCLUDED_LIBINTL=yes
+ USE_INCLUDED_LIBINTL=yes
+ LIBINTL="\${top_builddir}/intl/libintl.a $LIBICONV"
+ LTLIBINTL="\${top_builddir}/intl/libintl.a $LTLIBICONV"
+ LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'`
+ fi
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+ CATOBJEXT=.gmo
+ fi
+
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes" \
+ || test "$nls_cv_use_gnu_gettext" = "yes"; then
+ cat >> confdefs.h <<\EOF
+#define ENABLE_NLS 1
+EOF
+
+ else
+ USE_NLS=no
+ fi
+ fi
+
+ if test "$USE_NLS" = "yes"; then
+
+ if test "$gt_use_preinstalled_gnugettext" = "yes"; then
+ if test "$gt_cv_func_gnugettext1_libintl" = "yes"; then
+ echo $ac_n "checking how to link with libintl""... $ac_c" 1>&6
+echo "configure:4503: checking how to link with libintl" >&5
+ echo "$ac_t""$LIBINTL" 1>&6
+
+ for element in $INCINTL; do
+ haveit=
+ for x in $CPPFLAGS; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+ fi
+ done
+
+ fi
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_GETTEXT 1
+EOF
+
+ cat >> confdefs.h <<\EOF
+#define HAVE_DCGETTEXT 1
+EOF
+
+ fi
+
+ POSUB=po
+ fi
+
+
+ if test "$PACKAGE" = gettext; then
+ BUILD_INCLUDED_LIBINTL=yes
+ fi
+
+
+
+
+
+
+ nls_cv_header_intl=
+ nls_cv_header_libgt=
+
+ DATADIRNAME=share
+
+
+ INSTOBJEXT=.mo
+
+
+ GENCAT=gencat
+
+
+ INTL_LIBTOOL_SUFFIX_PREFIX=
+
+
+
+ INTLLIBS="$LIBINTL"
+
+
+
+
+
+
+
+echo $ac_n "checking for GetSystemTime""... $ac_c" 1>&6
+echo "configure:4578: checking for GetSystemTime" >&5
+getsystemtime=no
+cat > conftest.$ac_ext <<EOF
+#line 4581 "configure"
+#include "confdefs.h"
+#include <windows.h>
+int main() {
+ SYSTEMTIME tm; GetSystemTime(&tm);
+; return 0; }
+EOF
+if { (eval echo configure:4588: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define HAVE_GETSYSTEMTIME 1
+EOF
+ getsystemtime=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+echo "$ac_t""$getsystemtime" 1>&6
+
+
+echo $ac_n "checking for size_t""... $ac_c" 1>&6
+echo "configure:4603: checking for size_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 4608 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_type_size_t=yes
+else
+ rm -rf conftest*
+ ac_cv_type_size_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_size_t" 1>&6
+if test $ac_cv_type_size_t = no; then
+ cat >> confdefs.h <<\EOF
+#define size_t unsigned int
+EOF
+
+fi
+
+
+echo $ac_n "checking for bittypes""... $ac_c" 1>&6
+echo "configure:4637: checking for bittypes" >&5
+bittypes=no
+cat > conftest.$ac_ext <<EOF
+#line 4640 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+int main() {
+ int8_t a; u_int8_t b; int16_t c; u_int16_t d; int32_t e; u_int32_t f;
+; return 0; }
+EOF
+if { (eval echo configure:4647: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define HAVE_BITTYPES 1
+EOF
+ bittypes=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+echo "$ac_t""$bittypes" 1>&6
+
+echo $ac_n "checking for IO functions such as inb""... $ac_c" 1>&6
+echo "configure:4661: checking for IO functions such as inb" >&5
+iofuncs=no
+cat > conftest.$ac_ext <<EOF
+#line 4664 "configure"
+#include "confdefs.h"
+#include <sys/io.h>
+int main() {
+ inb(0); inw(0); inl(0); outb(0,0); outw(0,0); outl(0,0);
+; return 0; }
+EOF
+if { (eval echo configure:4671: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define HAVE_IOFUNCS 1
+EOF
+ iofuncs=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat > conftest.$ac_ext <<EOF
+#line 4682 "configure"
+#include "confdefs.h"
+#include <asm/io.h>
+int main() {
+ inb(0); inw(0); inl(0); outb(0,0); outw(0,0); outl(0,0);
+; return 0; }
+EOF
+if { (eval echo configure:4689: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define HAVE_IOFUNCS 1
+EOF
+ iofuncs=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+echo "$ac_t""$iofuncs" 1>&6
+
+echo $ac_n "checking for M_PI""... $ac_c" 1>&6
+echo "configure:4705: checking for M_PI" >&5
+mpi=no
+cat > conftest.$ac_ext <<EOF
+#line 4708 "configure"
+#include "confdefs.h"
+#include <math.h>
+int main() {
+ double f = M_PI;
+; return 0; }
+EOF
+if { (eval echo configure:4715: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ mpi=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define M_PI 3.14159265358979323846
+EOF
+
+fi
+rm -f conftest*
+echo "$ac_t""$mpi" 1>&6
+
+echo $ac_n "checking for M_LN10""... $ac_c" 1>&6
+echo "configure:4731: checking for M_LN10" >&5
+mln10=no
+cat > conftest.$ac_ext <<EOF
+#line 4734 "configure"
+#include "confdefs.h"
+#include <math.h>
+int main() {
+ double f = M_LN10;
+; return 0; }
+EOF
+if { (eval echo configure:4741: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ mln10=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define M_LN10 2.30258509299404568402
+EOF
+
+fi
+rm -f conftest*
+echo "$ac_t""$mln10" 1>&6
+
+echo $ac_n "checking for MKISS (N_AX25 line discipline)""... $ac_c" 1>&6
+echo "configure:4757: checking for MKISS (N_AX25 line discipline)" >&5
+mkiss=no
+cat > conftest.$ac_ext <<EOF
+#line 4760 "configure"
+#include "confdefs.h"
+#include <sys/ioctl.h>
+ #ifdef N_AX25
+ yes
+ #endif
+
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "yes" >/dev/null 2>&1; then
+ rm -rf conftest*
+ mkiss=yes
+fi
+rm -f conftest*
+
+echo "$ac_t""$mkiss" 1>&6
+
+echo $ac_n "checking for ifr_newname in struct ifreq""... $ac_c" 1>&6
+echo "configure:4778: checking for ifr_newname in struct ifreq" >&5
+ifrnewname=no
+cat > conftest.$ac_ext <<EOF
+#line 4781 "configure"
+#include "confdefs.h"
+#include <linux/if.h>
+int main() {
+struct ifreq ifr; ifr.ifr_newname[0]=0;
+; return 0; }
+EOF
+if { (eval echo configure:4788: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define HAVE_IFRNEWNAME 1
+EOF
+ ifrnewname=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+echo "$ac_t""$ifrnewname" 1>&6
+
+if test x$ac_cv_prog_cc_cross = xyes; then
+ gtk=no
+ xlibs="$LIBS"
+ LIBS="$LIBS -L/usr/local/cygwin/i686-pc-cygwin/gtk/lib -L/usr/local/cross/i686-pc-cygwin/gtk/lib"
+ echo $ac_n "checking for gtk_main in -lgtk""... $ac_c" 1>&6
+echo "configure:4806: checking for gtk_main in -lgtk" >&5
+ac_lib_var=`echo gtk'_'gtk_main | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lgtk $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 4814 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gtk_main();
+
+int main() {
+gtk_main()
+; return 0; }
+EOF
+if { (eval echo configure:4825: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ gtk=yes
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ LIBS="$xlibs"
+ if test x$gtk = xyes; then
+ if test -f /usr/local/cygwin/i686-pc-cygwin/gtk/include/glib.h; then
+ GTK_CFLAGS="-I/usr/local/cygwin/i686-pc-cygwin/gtk/include"
+ GTK_LIBS="-L/usr/local/cygwin/i686-pc-cygwin/gtk/lib -lgtk -lgdk -lglib"
+ PTHREAD_CFLAGS="-L/usr/local/cygwin/i686-pc-cygwin/gtk/include"
+ PTHREAD_LIBS="-L/usr/local/cygwin/i686-pc-cygwin/gtk/lib"
+ fi
+ if test -f /usr/local/cross/i686-pc-cygwin/gtk/include/glib.h; then
+ GTK_CFLAGS="-I/usr/local/cross/i686-pc-cygwin/gtk/include"
+ GTK_LIBS="-L/usr/local/cross/i686-pc-cygwin/gtk/lib -lgtk -lgdk -lglib"
+ PTHREAD_CFLAGS="-L/usr/local/cross/i686-pc-cygwin/gtk/include"
+ PTHREAD_LIBS="-L/usr/local/cross/i686-pc-cygwin/gtk/lib"
+ fi
+ fi
+else
+ # Check whether --with-gtk-prefix or --without-gtk-prefix was given.
+if test "${with_gtk_prefix+set}" = set; then
+ withval="$with_gtk_prefix"
+ gtk_config_prefix="$withval"
+else
+ gtk_config_prefix=""
+fi
+
+# Check whether --with-gtk-exec-prefix or --without-gtk-exec-prefix was given.
+if test "${with_gtk_exec_prefix+set}" = set; then
+ withval="$with_gtk_exec_prefix"
+ gtk_config_exec_prefix="$withval"
+else
+ gtk_config_exec_prefix=""
+fi
+
+# Check whether --enable-gtktest or --disable-gtktest was given.
+if test "${enable_gtktest+set}" = set; then
+ enableval="$enable_gtktest"
+ :
+else
+ enable_gtktest=yes
+fi
+
+
+ for module in .
+ do
+ case "$module" in
+ gthread)
+ gtk_config_args="$gtk_config_args gthread"
+ ;;
+ esac
+ done
+
+ if test x$gtk_config_exec_prefix != x ; then
+ gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix"
+ if test x${GTK_CONFIG+set} != xset ; then
+ GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config
+ fi
+ fi
+ if test x$gtk_config_prefix != x ; then
+ gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix"
+ if test x${GTK_CONFIG+set} != xset ; then
+ GTK_CONFIG=$gtk_config_prefix/bin/gtk-config
+ fi
+ fi
+
+ # Extract the first word of "gtk-config", so it can be a program name with args.
+set dummy gtk-config; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:4911: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_GTK_CONFIG'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$GTK_CONFIG" in
+ /*)
+ ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_GTK_CONFIG="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_GTK_CONFIG" && ac_cv_path_GTK_CONFIG="no"
+ ;;
+esac
+fi
+GTK_CONFIG="$ac_cv_path_GTK_CONFIG"
+if test -n "$GTK_CONFIG"; then
+ echo "$ac_t""$GTK_CONFIG" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ min_gtk_version=1.2.0
+ echo $ac_n "checking for GTK - version >= $min_gtk_version""... $ac_c" 1>&6
+echo "configure:4946: checking for GTK - version >= $min_gtk_version" >&5
+ no_gtk=""
+ if test "$GTK_CONFIG" = "no" ; then
+ no_gtk=yes
+ else
+ GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags`
+ GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs`
+ gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \
+ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'`
+ gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \
+ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'`
+ gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \
+ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'`
+ if test "x$enable_gtktest" = "xyes" ; then
+ ac_save_CFLAGS="$CFLAGS"
+ ac_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $GTK_CFLAGS"
+ LIBS="$GTK_LIBS $LIBS"
+ rm -f conf.gtktest
+ if test "$cross_compiling" = yes; then
+ echo $ac_n "cross compiling; assumed OK... $ac_c"
+else
+ cat > conftest.$ac_ext <<EOF
+#line 4969 "configure"
+#include "confdefs.h"
+
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main ()
+{
+ int major, minor, micro;
+ char *tmp_version;
+
+ system ("touch conf.gtktest");
+
+ /* HP/UX 9 (%@#!) writes to sscanf strings */
+ tmp_version = g_strdup("$min_gtk_version");
+ if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) {
+ printf("%s, bad version string\n", "$min_gtk_version");
+ exit(1);
+ }
+
+ if ((gtk_major_version != $gtk_config_major_version) ||
+ (gtk_minor_version != $gtk_config_minor_version) ||
+ (gtk_micro_version != $gtk_config_micro_version))
+ {
+ printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n",
+ $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version,
+ gtk_major_version, gtk_minor_version, gtk_micro_version);
+ printf ("*** was found! If gtk-config was correct, then it is best\n");
+ printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n");
+ printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
+ printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
+ printf("*** required on your system.\n");
+ printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n");
+ printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n");
+ printf("*** before re-running configure\n");
+ }
+#if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION)
+ else if ((gtk_major_version != GTK_MAJOR_VERSION) ||
+ (gtk_minor_version != GTK_MINOR_VERSION) ||
+ (gtk_micro_version != GTK_MICRO_VERSION))
+ {
+ printf("*** GTK+ header files (version %d.%d.%d) do not match\n",
+ GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION);
+ printf("*** library (version %d.%d.%d)\n",
+ gtk_major_version, gtk_minor_version, gtk_micro_version);
+ }
+#endif /* defined (GTK_MAJOR_VERSION) ... */
+ else
+ {
+ if ((gtk_major_version > major) ||
+ ((gtk_major_version == major) && (gtk_minor_version > minor)) ||
+ ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro)))
+ {
+ return 0;
+ }
+ else
+ {
+ printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n",
+ gtk_major_version, gtk_minor_version, gtk_micro_version);
+ printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n",
+ major, minor, micro);
+ printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n");
+ printf("***\n");
+ printf("*** If you have already installed a sufficiently new version, this error\n");
+ printf("*** probably means that the wrong copy of the gtk-config shell script is\n");
+ printf("*** being found. The easiest way to fix this is to remove the old version\n");
+ printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n");
+ printf("*** correct copy of gtk-config. (In this case, you will have to\n");
+ printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
+ printf("*** so that the correct libraries are found at run-time))\n");
+ }
+ }
+ return 1;
+}
+
+EOF
+if { (eval echo configure:5047: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ :
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ no_gtk=yes
+fi
+rm -fr conftest*
+fi
+
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ if test "x$no_gtk" = x ; then
+ echo "$ac_t""yes" 1>&6
+ gtk=yes
+ else
+ echo "$ac_t""no" 1>&6
+ if test "$GTK_CONFIG" = "no" ; then
+ echo "*** The gtk-config script installed by GTK could not be found"
+ echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in"
+ echo "*** your path, or set the GTK_CONFIG environment variable to the"
+ echo "*** full path to gtk-config."
+ else
+ if test -f conf.gtktest ; then
+ :
+ else
+ echo "*** Could not run GTK test program, checking why..."
+ CFLAGS="$CFLAGS $GTK_CFLAGS"
+ LIBS="$LIBS $GTK_LIBS"
+ cat > conftest.$ac_ext <<EOF
+#line 5081 "configure"
+#include "confdefs.h"
+
+#include <gtk/gtk.h>
+#include <stdio.h>
+
+int main() {
+ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version));
+; return 0; }
+EOF
+if { (eval echo configure:5091: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ echo "*** The test program compiled, but did not run. This usually means"
+ echo "*** that the run-time linker is not finding GTK or finding the wrong"
+ echo "*** version of GTK. If it is not finding GTK, you'll need to set your"
+ echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+ echo "*** to the installed location Also, make sure you have run ldconfig if that"
+ echo "*** is required on your system"
+ echo "***"
+ echo "*** If you have an old version installed, it is best to remove it, although"
+ echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
+ echo "***"
+ echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that"
+ echo "*** came with the system with the command"
+ echo "***"
+ echo "*** rpm --erase --nodeps gtk gtk-devel"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ echo "*** The test program failed to compile or link. See the file config.log for the"
+ echo "*** exact error that occured. This usually means GTK was incorrectly installed"
+ echo "*** or that you have moved GTK since it was installed. In the latter case, you"
+ echo "*** may want to edit the gtk-config script: $GTK_CONFIG"
+fi
+rm -f conftest*
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ GTK_CFLAGS=""
+ GTK_LIBS=""
+ { echo "configure: error: Cannot find GTK: Is gtk-config in path?" 1>&2; exit 1; }
+ fi
+
+
+ rm -f conf.gtktest
+
+fi
+
+if test "x${prefix}" = "xNONE"; then
+ cat >> confdefs.h <<EOF
+#define PACKAGE_LOCALE_DIR "${ac_default_prefix}/${DATADIRNAME}/locale"
+EOF
+
+else
+ cat >> confdefs.h <<EOF
+#define PACKAGE_LOCALE_DIR "${prefix}/${DATADIRNAME}/locale"
+EOF
+
+fi
+
+if test "x${datadir}" = 'x${prefix}/share'; then
+ if test "x${prefix}" = "xNONE"; then
+ cat >> confdefs.h <<EOF
+#define PACKAGE_DATA_DIR "${ac_default_prefix}/share/${PACKAGE}"
+EOF
+
+ else
+ cat >> confdefs.h <<EOF
+#define PACKAGE_DATA_DIR "${prefix}/share/${PACKAGE}"
+EOF
+
+ fi
+else
+ cat >> confdefs.h <<EOF
+#define PACKAGE_DATA_DIR "${datadir}/${PACKAGE}"
+EOF
+
+fi
+
+packagesrcdir=`cd $srcdir && pwd`
+cat >> confdefs.h <<EOF
+#define PACKAGE_SOURCE_DIR "${packagesrcdir}"
+EOF
+
+
+if test "x$GCC" = "xyes"; then
+ case " $CFLAGS " in
+ *[\ \ ]-Wall[\ \ ]*) ;;
+ *) CFLAGS="$CFLAGS -Wall" ;;
+ esac
+fi
+
+if test x$ac_cv_cygwin = xyes -o x$ac_cv_mingw32 = xyes; then
+ xcflags="$CFLAGS"
+ CFLAGS="$CFLAGS -I$srcdir/directx/include -I$srcdir/directx/include/directx6"
+ echo $ac_n "checking for DirectX includes""... $ac_c" 1>&6
+echo "configure:5179: checking for DirectX includes" >&5
+ directx=no
+ cat > conftest.$ac_ext <<EOF
+#line 5182 "configure"
+#include "confdefs.h"
+#include <directx.h>
+int main() {
+ LPDIRECTSOUND dsplay; LPDIRECTSOUNDCAPTURE dsrec;
+; return 0; }
+EOF
+if { (eval echo configure:5189: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ cat >> confdefs.h <<\EOF
+#define HAVE_DIRECTX 1
+EOF
+ directx=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+ echo "$ac_t""$directx" 1>&6
+ CFLAGS="$xcflags"
+fi
+
+# Check whether --enable-driver or --disable-driver was given.
+if test "${enable_driver+set}" = set; then
+ enableval="$enable_driver"
+ case "${enableval}" in
+ yes) baydrv=true ;;
+ no) baydrv=false ;;
+ *) { echo "configure: error: bad value ${enableval} for --enable-driver" 1>&2; exit 1; } ;;
+esac
+else
+ baydrv=false
+fi
+
+
+# Check whether --enable-mkiss or --disable-mkiss was given.
+if test "${enable_mkiss+set}" = set; then
+ enableval="$enable_mkiss"
+ mkissena=false
+else
+ mkissena=true
+fi
+
+
+if test x$mkiss = xyes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_MKISS 1
+EOF
+
+fi
+
+# Check whether --enable-ppuser or --disable-ppuser was given.
+if test "${enable_ppuser+set}" = set; then
+ enableval="$enable_ppuser"
+ ppuser=true
+else
+ ppuser=false
+fi
+
+
+if test x$ppuser = xtrue; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_PPUSER 1
+EOF
+
+fi
+
+# Check whether --enable-ppkdrv or --disable-ppkdrv was given.
+if test "${enable_ppkdrv+set}" = set; then
+ enableval="$enable_ppkdrv"
+ ppkdrv=true
+else
+ ppkdrv=false
+fi
+
+
+if test x$ppkdrv = xtrue; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_PPKDRV 1
+EOF
+
+fi
+
+
+
+if test x$ac_cv_cygwin = xyes -o x$ac_cv_mingw32 = xyes; then
+ WIN32_TRUE=
+ WIN32_FALSE='#'
+else
+ WIN32_TRUE='#'
+ WIN32_FALSE=
+fi
+
+
+if test x$cross_compiling = xyes; then
+ CROSSCOMP_TRUE=
+ CROSSCOMP_FALSE='#'
+else
+ CROSSCOMP_TRUE='#'
+ CROSSCOMP_FALSE=
+fi
+
+
+if test x$cross_compiling = xno -a x$mkiss = xyes; then
+ BAYCOMDRV_TRUE=
+ BAYCOMDRV_FALSE='#'
+else
+ BAYCOMDRV_TRUE='#'
+ BAYCOMDRV_FALSE=
+fi
+
+
+if test x$gtk = xyes; then
+ HAVEGTK_TRUE=
+ HAVEGTK_FALSE='#'
+else
+ HAVEGTK_TRUE='#'
+ HAVEGTK_FALSE=
+fi
+
+
+if test x$ppuser = xtrue; then
+ PPUSER_TRUE=
+ PPUSER_FALSE='#'
+else
+ PPUSER_TRUE='#'
+ PPUSER_FALSE=
+fi
+
+
+if test x$ppkdrv = xtrue; then
+ PPKDRV_TRUE=
+ PPKDRV_FALSE='#'
+else
+ PPKDRV_TRUE='#'
+ PPKDRV_FALSE=
+fi
+
+
+if test x$directx = xyes; then
+ DIRECTX_TRUE=
+ DIRECTX_FALSE='#'
+else
+ DIRECTX_TRUE='#'
+ DIRECTX_FALSE=
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+DEFS=-DHAVE_CONFIG_H
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.13"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "Makefile
+intl/Makefile
+po/Makefile.in
+directx/Makefile
+main/Makefile
+udriver/Makefile
+eppdiag/Makefile
+eppfm/Makefile
+eppfm2/Makefile
+eppfm2/src/Makefile
+flexdrv/Makefile
+ntdrv/Makefile
+w9xdrv/Makefile config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@host@%$host%g
+s%@host_alias@%$host_alias%g
+s%@host_cpu@%$host_cpu%g
+s%@host_vendor@%$host_vendor%g
+s%@host_os@%$host_os%g
+s%@target@%$target%g
+s%@target_alias@%$target_alias%g
+s%@target_cpu@%$target_cpu%g
+s%@target_vendor@%$target_vendor%g
+s%@target_os@%$target_os%g
+s%@build@%$build%g
+s%@build_alias@%$build_alias%g
+s%@build_cpu@%$build_cpu%g
+s%@build_vendor@%$build_vendor%g
+s%@build_os@%$build_os%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@PACKAGE@%$PACKAGE%g
+s%@VERSION@%$VERSION%g
+s%@ACLOCAL@%$ACLOCAL%g
+s%@AUTOCONF@%$AUTOCONF%g
+s%@AUTOMAKE@%$AUTOMAKE%g
+s%@AUTOHEADER@%$AUTOHEADER%g
+s%@MAKEINFO@%$MAKEINFO%g
+s%@SET_MAKE@%$SET_MAKE%g
+s%@CC@%$CC%g
+s%@CPP@%$CPP%g
+s%@RANLIB@%$RANLIB%g
+s%@DLLTOOL@%$DLLTOOL%g
+s%@AS@%$AS%g
+s%@AR@%$AR%g
+s%@WINDRES@%$WINDRES%g
+s%@EXEEXT@%$EXEEXT%g
+s%@OBJEXT@%$OBJEXT%g
+s%@LIBOBJS@%$LIBOBJS%g
+s%@MKINSTALLDIRS@%$MKINSTALLDIRS%g
+s%@MSGFMT@%$MSGFMT%g
+s%@GMSGFMT@%$GMSGFMT%g
+s%@XGETTEXT@%$XGETTEXT%g
+s%@MSGMERGE@%$MSGMERGE%g
+s%@ALLOCA@%$ALLOCA%g
+s%@GLIBC21@%$GLIBC21%g
+s%@LIBICONV@%$LIBICONV%g
+s%@LTLIBICONV@%$LTLIBICONV%g
+s%@INTLBISON@%$INTLBISON%g
+s%@USE_NLS@%$USE_NLS%g
+s%@BUILD_INCLUDED_LIBINTL@%$BUILD_INCLUDED_LIBINTL%g
+s%@USE_INCLUDED_LIBINTL@%$USE_INCLUDED_LIBINTL%g
+s%@CATOBJEXT@%$CATOBJEXT%g
+s%@INTLOBJS@%$INTLOBJS%g
+s%@DATADIRNAME@%$DATADIRNAME%g
+s%@INSTOBJEXT@%$INSTOBJEXT%g
+s%@GENCAT@%$GENCAT%g
+s%@INTL_LIBTOOL_SUFFIX_PREFIX@%$INTL_LIBTOOL_SUFFIX_PREFIX%g
+s%@INTLLIBS@%$INTLLIBS%g
+s%@LIBINTL@%$LIBINTL%g
+s%@LTLIBINTL@%$LTLIBINTL%g
+s%@POSUB@%$POSUB%g
+s%@GTK_CONFIG@%$GTK_CONFIG%g
+s%@GTK_CFLAGS@%$GTK_CFLAGS%g
+s%@GTK_LIBS@%$GTK_LIBS%g
+s%@WIN32_TRUE@%$WIN32_TRUE%g
+s%@WIN32_FALSE@%$WIN32_FALSE%g
+s%@CROSSCOMP_TRUE@%$CROSSCOMP_TRUE%g
+s%@CROSSCOMP_FALSE@%$CROSSCOMP_FALSE%g
+s%@BAYCOMDRV_TRUE@%$BAYCOMDRV_TRUE%g
+s%@BAYCOMDRV_FALSE@%$BAYCOMDRV_FALSE%g
+s%@HAVEGTK_TRUE@%$HAVEGTK_TRUE%g
+s%@HAVEGTK_FALSE@%$HAVEGTK_FALSE%g
+s%@PPUSER_TRUE@%$PPUSER_TRUE%g
+s%@PPUSER_FALSE@%$PPUSER_FALSE%g
+s%@PPKDRV_TRUE@%$PPKDRV_TRUE%g
+s%@PPKDRV_FALSE@%$PPKDRV_FALSE%g
+s%@DIRECTX_TRUE@%$DIRECTX_TRUE%g
+s%@DIRECTX_FALSE@%$DIRECTX_FALSE%g
+s%@HAVE_MKISS@%$HAVE_MKISS%g
+s%@HAVE_IOFUNCS@%$HAVE_IOFUNCS%g
+s%@HAVE_BITTYPES@%$HAVE_BITTYPES%g
+s%@M_PI@%$M_PI%g
+s%@DRVLIBOBJS@%$DRVLIBOBJS%g
+s%@HAVE_IFRNEWNAME@%$HAVE_IFRNEWNAME%g
+s%@HAVE_PPUSER@%$HAVE_PPUSER%g
+s%@HAVE_PPKDRV@%$HAVE_PPKDRV%g
+s%@HAVE_DIRECTX@%$HAVE_DIRECTX%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile
+intl/Makefile
+po/Makefile.in
+directx/Makefile
+main/Makefile
+udriver/Makefile
+eppdiag/Makefile
+eppfm/Makefile
+eppfm2/Makefile
+eppfm2/src/Makefile
+flexdrv/Makefile
+ntdrv/Makefile
+w9xdrv/Makefile"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ case "$ac_given_INSTALL" in
+ [/$]*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='\([ ][ ]*\)[^ ]*%\1#\2'
+ac_dC='\3'
+ac_dD='%g'
+# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='\([ ]\)%\1#\2define\3'
+ac_uC=' '
+ac_uD='\4%g'
+# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_eB='$%\1#\2define\3'
+ac_eC=' '
+ac_eD='%g'
+
+if test "${CONFIG_HEADERS+set}" != set; then
+EOF
+cat >> $CONFIG_STATUS <<EOF
+ CONFIG_HEADERS="config.h"
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+fi
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ echo creating $ac_file
+
+ rm -f conftest.frag conftest.in conftest.out
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ cat $ac_file_inputs > conftest.in
+
+EOF
+
+# Transform confdefs.h into a sed script conftest.vals that substitutes
+# the proper values into config.h.in to produce config.h. And first:
+# Protect against being on the right side of a sed subst in config.status.
+# Protect against being in an unquoted here document in config.status.
+rm -f conftest.vals
+cat > conftest.hdr <<\EOF
+s/[\\&%]/\\&/g
+s%[\\$`]%\\&%g
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
+s%ac_d%ac_u%gp
+s%ac_u%ac_e%gp
+EOF
+sed -n -f conftest.hdr confdefs.h > conftest.vals
+rm -f conftest.hdr
+
+# This sed command replaces #undef with comments. This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >> conftest.vals <<\EOF
+s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+EOF
+
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+
+rm -f conftest.tail
+while :
+do
+ ac_lines=`grep -c . conftest.vals`
+ # grep -c gives empty output for an empty file on some AIX systems.
+ if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
+ # Write a limited-size here document to conftest.frag.
+ echo ' cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+ echo 'CEOF
+ sed -f conftest.frag conftest.in > conftest.out
+ rm -f conftest.in
+ mv conftest.out conftest.in
+' >> $CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
+ rm -f conftest.vals
+ mv conftest.tail conftest.vals
+done
+rm -f conftest.vals
+
+cat >> $CONFIG_STATUS <<\EOF
+ rm -f conftest.frag conftest.h
+ echo "/* $ac_file. Generated automatically by configure. */" > conftest.h
+ cat conftest.in >> conftest.h
+ rm -f conftest.in
+ if cmp -s $ac_file conftest.h 2>/dev/null; then
+ echo "$ac_file is unchanged"
+ rm -f conftest.h
+ else
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ fi
+ rm -f $ac_file
+ mv conftest.h $ac_file
+ fi
+fi; done
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Capture the value of obsolete $ALL_LINGUAS because we need it to compute
+ # POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES, CATALOGS. But hide it
+ # from automake.
+ eval 'ALL_LINGUAS''="$ALL_LINGUAS"'
+ # Capture the value of LINGUAS because we need it to compute CATALOGS.
+ LINGUAS="${LINGUAS-%UNSET%}"
+
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h
+
+ for ac_file in $CONFIG_FILES; do
+ # Support "outfile[:infile[:infile...]]"
+ case "$ac_file" in
+ *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ esac
+ # PO directories have a Makefile.in generated from Makefile.in.in.
+ case "$ac_file" in */Makefile.in)
+ # Adjust a relative srcdir.
+ ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
+ ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
+ ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
+ # In autoconf-2.13 it is called $ac_given_srcdir.
+ # In autoconf-2.50 it is called $srcdir.
+ test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
+ case "$ac_given_srcdir" in
+ .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
+ /*) top_srcdir="$ac_given_srcdir" ;;
+ *) top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+ if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
+ rm -f "$ac_dir/POTFILES"
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
+ cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
+ # ALL_LINGUAS, POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES depend
+ # on $ac_dir but don't depend on user-specified configuration
+ # parameters.
+ if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
+ # The LINGUAS file contains the set of available languages.
+ if test -n "$ALL_LINGUAS"; then
+ test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
+ fi
+ ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"`
+ # Hide the ALL_LINGUAS assigment from automake.
+ eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
+ fi
+ case "$ac_given_srcdir" in
+ .) srcdirpre= ;;
+ *) srcdirpre='$(srcdir)/' ;;
+ esac
+ POFILES=
+ GMOFILES=
+ UPDATEPOFILES=
+ DUMMYPOFILES=
+ for lang in $ALL_LINGUAS; do
+ POFILES="$POFILES $srcdirpre$lang.po"
+ GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
+ UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
+ DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
+ done
+ # CATALOGS depends on both $ac_dir and the user's LINGUAS
+ # environment variable.
+ INST_LINGUAS=
+ if test -n "$ALL_LINGUAS"; then
+ for presentlang in $ALL_LINGUAS; do
+ useit=no
+ if test "%UNSET%" != "$LINGUAS"; then
+ desiredlanguages="$LINGUAS"
+ else
+ desiredlanguages="$ALL_LINGUAS"
+ fi
+ for desiredlang in $desiredlanguages; do
+ # Use the presentlang catalog if desiredlang is
+ # a. equal to presentlang, or
+ # b. a variant of presentlang (because in this case,
+ # presentlang can be used as a fallback for messages
+ # which are not translated in the desiredlang catalog).
+ case "$desiredlang" in
+ "$presentlang"*) useit=yes;;
+ esac
+ done
+ if test $useit = yes; then
+ INST_LINGUAS="$INST_LINGUAS $presentlang"
+ fi
+ done
+ fi
+ CATALOGS=
+ if test -n "$INST_LINGUAS"; then
+ for lang in $INST_LINGUAS; do
+ CATALOGS="$CATALOGS $lang.gmo"
+ done
+ fi
+ test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
+ sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
+ for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
+ if test -f "$f"; then
+ case "$f" in
+ *.orig | *.bak | *~) ;;
+ *) cat "$f" >> "$ac_dir/Makefile" ;;
+ esac
+ fi
+ done
+ fi
+ ;;
+ esac
+ done
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
diff --git a/configure.in b/configure.in
new file mode 100644
index 0000000..bb2075f
--- /dev/null
+++ b/configure.in
@@ -0,0 +1,245 @@
+dnl Process this file with autoconf to produce a configure script.
+
+AC_INIT(acconfig.h)
+AC_CANONICAL_SYSTEM
+
+AM_INIT_AUTOMAKE(baycomepp, 0.10)
+AM_CONFIG_HEADER(config.h)
+
+dnl AC_CHECK_TOOL()
+
+AC_PROG_MAKE_SET
+AC_ISC_POSIX
+AC_PROG_CC
+AM_PROG_CC_STDC
+dnl AC_PROG_RANLIB
+AC_C_CONST
+AC_C_INLINE
+AC_HEADER_STDC
+
+AC_CHECK_PROG(RANLIB, ranlib, ranlib, :)
+AC_CHECK_PROG(DLLTOOL, dlltool, dlltool, dlltool)
+AC_CHECK_PROG(AS, as, as, as, as)
+AC_CHECK_PROG(AR, ar, ar, ar, ar)
+AC_CHECK_PROG(WINDRES, windres, windres, i686-pc-cygwin-windres)
+
+AC_CYGWIN
+AC_MINGW32
+AC_EXEEXT
+AC_OBJEXT
+
+if test x$ac_cv_mingw32 != xyes; then
+AC_CHECK_LIB(m,cos)
+fi
+AC_CHECK_HEADERS(pty.h getopt.h sys/io.h asm/io.h windows.h sched.h sys/perm.h syslog.h sys/socket.h)
+AC_CHECK_HEADERS(net/if.h arpa/inet.h netinet/in.h linux/if.h linux/ax25.h linux/sockios.h linux/soundcard.h)
+AC_CHECK_FUNCS(snprintf gettimeofday iopl random syslog vsyslog revoke)
+AC_REPLACE_FUNCS(vsnprintf)
+AC_CHECK_FUNCS(getopt_long,,LIBOBJS="$LIBOBJS getopt.o getopt1.o")
+xlibs=$LIBS
+LIBS=
+AC_CHECK_LIB(util,openpty)
+AC_CHECK_FUNCS(openpty,DRVLIBOBJS="$DRVLIBOBJS $LIBS",DRVLIBOBJS="$DRVLIBOBJS openpty.o")
+LIBS=$xlibs
+
+dnl Add the languages which your application supports here.
+ALL_LINGUAS=""
+AM_GNU_GETTEXT
+
+AC_MSG_CHECKING(for GetSystemTime)
+getsystemtime=no
+AC_TRY_COMPILE([#include <windows.h>],
+ [ SYSTEMTIME tm; GetSystemTime(&tm); ],
+ AC_DEFINE(HAVE_GETSYSTEMTIME) getsystemtime=yes)
+AC_MSG_RESULT($getsystemtime)
+
+dnl AC_CHECK_TYPE(int8_t,char)
+dnl AC_CHECK_TYPE(u_int8_t,unsigned char)
+dnl AC_CHECK_TYPE(int16_t,short)
+dnl AC_CHECK_TYPE(u_int16_t,unsigned short)
+dnl AC_CHECK_TYPE(int32_t,long)
+dnl AC_CHECK_TYPE(u_int32_t,unsigned long)
+
+AC_CHECK_TYPE(size_t,unsigned int)
+
+AC_MSG_CHECKING(for bittypes)
+bittypes=no
+AC_TRY_COMPILE([#include <sys/types.h>],
+ [ int8_t a; u_int8_t b; int16_t c; u_int16_t d; int32_t e; u_int32_t f; ],
+ AC_DEFINE(HAVE_BITTYPES) bittypes=yes)
+AC_MSG_RESULT($bittypes)
+
+AC_MSG_CHECKING(for IO functions such as inb, outb)
+iofuncs=no
+AC_TRY_COMPILE([#include <sys/io.h>],
+ [ inb(0); inw(0); inl(0); outb(0,0); outw(0,0); outl(0,0); ],
+ AC_DEFINE(HAVE_IOFUNCS) iofuncs=yes,
+ AC_TRY_COMPILE([#include <asm/io.h>],
+ [ inb(0); inw(0); inl(0); outb(0,0); outw(0,0); outl(0,0); ],
+ AC_DEFINE(HAVE_IOFUNCS) iofuncs=yes))
+AC_MSG_RESULT($iofuncs)
+
+AC_MSG_CHECKING(for M_PI)
+mpi=no
+AC_TRY_COMPILE([#include <math.h>],
+ [ double f = M_PI; ],
+ mpi=yes,AC_DEFINE(M_PI,3.14159265358979323846))
+AC_MSG_RESULT($mpi)
+
+AC_MSG_CHECKING(for M_LN10)
+mln10=no
+AC_TRY_COMPILE([#include <math.h>],
+ [ double f = M_LN10; ],
+ mln10=yes,AC_DEFINE(M_LN10,2.30258509299404568402))
+AC_MSG_RESULT($mln10)
+
+AC_MSG_CHECKING(for MKISS (N_AX25 line discipline))
+mkiss=no
+AC_EGREP_CPP(yes,
+ [#include <sys/ioctl.h>
+ #ifdef N_AX25
+ yes
+ #endif
+ ], mkiss=yes)
+AC_MSG_RESULT($mkiss)
+
+AC_MSG_CHECKING(for ifr_newname in struct ifreq)
+ifrnewname=no
+AC_TRY_COMPILE([#include <linux/if.h>],
+ [struct ifreq ifr; ifr.ifr_newname[0]=0; ], AC_DEFINE(HAVE_IFRNEWNAME) ifrnewname=yes)
+AC_MSG_RESULT($ifrnewname)
+
+if test x$ac_cv_prog_cc_cross = xyes; then
+ gtk=no
+ xlibs="$LIBS"
+ LIBS="$LIBS -L/usr/local/cygwin/i686-pc-cygwin/gtk/lib -L/usr/local/cross/i686-pc-cygwin/gtk/lib"
+ AC_CHECK_LIB(gtk,gtk_main,gtk=yes)
+ LIBS="$xlibs"
+ if test x$gtk = xyes; then
+ if test -f /usr/local/cygwin/i686-pc-cygwin/gtk/include/glib.h; then
+ GTK_CFLAGS="-I/usr/local/cygwin/i686-pc-cygwin/gtk/include"
+ GTK_LIBS="-L/usr/local/cygwin/i686-pc-cygwin/gtk/lib -lgtk -lgdk -lglib"
+ PTHREAD_CFLAGS="-L/usr/local/cygwin/i686-pc-cygwin/gtk/include"
+ PTHREAD_LIBS="-L/usr/local/cygwin/i686-pc-cygwin/gtk/lib"
+ fi
+ if test -f /usr/local/cross/i686-pc-cygwin/gtk/include/glib.h; then
+ GTK_CFLAGS="-I/usr/local/cross/i686-pc-cygwin/gtk/include"
+ GTK_LIBS="-L/usr/local/cross/i686-pc-cygwin/gtk/lib -lgtk -lgdk -lglib"
+ PTHREAD_CFLAGS="-L/usr/local/cross/i686-pc-cygwin/gtk/include"
+ PTHREAD_LIBS="-L/usr/local/cross/i686-pc-cygwin/gtk/lib"
+ fi
+ fi
+else
+ AM_PATH_GTK(1.2.0,gtk=yes,AC_MSG_ERROR(Cannot find GTK: Is gtk-config in path?))
+fi
+
+dnl Set PACKAGE_LOCALE_DIR in config.h.
+if test "x${prefix}" = "xNONE"; then
+ AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${ac_default_prefix}/${DATADIRNAME}/locale")
+else
+ AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${prefix}/${DATADIRNAME}/locale")
+fi
+
+dnl Set PACKAGE_DATA_DIR in config.h.
+if test "x${datadir}" = 'x${prefix}/share'; then
+ if test "x${prefix}" = "xNONE"; then
+ AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${ac_default_prefix}/share/${PACKAGE}")
+ else
+ AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${prefix}/share/${PACKAGE}")
+ fi
+else
+ AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${datadir}/${PACKAGE}")
+fi
+
+dnl Set PACKAGE_SOURCE_DIR in config.h.
+packagesrcdir=`cd $srcdir && pwd`
+AC_DEFINE_UNQUOTED(PACKAGE_SOURCE_DIR, "${packagesrcdir}")
+
+dnl Use -Wall if we have gcc.
+changequote(,)dnl
+if test "x$GCC" = "xyes"; then
+ case " $CFLAGS " in
+ *[\ \ ]-Wall[\ \ ]*) ;;
+ *) CFLAGS="$CFLAGS -Wall" ;;
+ esac
+fi
+changequote([,])dnl
+
+if test x$ac_cv_cygwin = xyes -o x$ac_cv_mingw32 = xyes; then
+ xcflags="$CFLAGS"
+ CFLAGS="$CFLAGS -I$srcdir/directx/include -I$srcdir/directx/include/directx6"
+ AC_MSG_CHECKING(for DirectX includes)
+ directx=no
+ AC_TRY_COMPILE([#include <directx.h>],
+ [ LPDIRECTSOUND dsplay; LPDIRECTSOUNDCAPTURE dsrec; ],
+ AC_DEFINE(HAVE_DIRECTX) directx=yes)
+ AC_MSG_RESULT($directx)
+ CFLAGS="$xcflags"
+fi
+
+AC_ARG_ENABLE(driver,
+[ --enable-driver Build user mode driver],
+[case "${enableval}" in
+ yes) baydrv=true ;;
+ no) baydrv=false ;;
+ *) AC_MSG_ERROR(bad value ${enableval} for --enable-driver) ;;
+esac],[baydrv=false])
+
+AC_ARG_ENABLE(mkiss,
+[ --disable-mkiss Don not use the MKISS driver even if available],
+[mkissena=false],[mkissena=true])
+
+if test x$mkiss = xyes; then
+ AC_DEFINE(HAVE_MKISS)
+fi
+
+AC_ARG_ENABLE(ppuser,
+[ --enable-ppuser Enable PPUSER parport access method],
+[ppuser=true],[ppuser=false])
+
+if test x$ppuser = xtrue; then
+ AC_DEFINE(HAVE_PPUSER)
+fi
+
+AC_ARG_ENABLE(ppkdrv,
+[ --enable-ppkdrv Enable Linux Kernel driver parport access method],
+[ppkdrv=true],[ppkdrv=false])
+
+if test x$ppkdrv = xtrue; then
+ AC_DEFINE(HAVE_PPKDRV)
+fi
+
+dnl AM_CONDITIONAL(BAYCOMDRV, test x$baydrv = xtrue)
+AM_CONDITIONAL(WIN32, test x$ac_cv_cygwin = xyes -o x$ac_cv_mingw32 = xyes)
+AM_CONDITIONAL(CROSSCOMP, test x$cross_compiling = xyes)
+AM_CONDITIONAL(BAYCOMDRV, test x$cross_compiling = xno -a x$mkiss = xyes)
+AM_CONDITIONAL(HAVEGTK, test x$gtk = xyes)
+AM_CONDITIONAL(PPUSER, test x$ppuser = xtrue)
+AM_CONDITIONAL(PPKDRV, test x$ppkdrv = xtrue)
+AM_CONDITIONAL(DIRECTX, test x$directx = xyes)
+
+AC_SUBST(HAVE_MKISS)
+AC_SUBST(GTK_LIBS)
+AC_SUBST(GTK_CFLAGS)
+AC_SUBST(HAVE_IOFUNCS)
+AC_SUBST(HAVE_BITTYPES)
+AC_SUBST(M_PI)
+AC_SUBST(LIBOBJS)
+AC_SUBST(DRVLIBOBJS)
+AC_SUBST(HAVE_IFRNEWNAME)
+AC_SUBST(HAVE_PPUSER)
+AC_SUBST(HAVE_PPKDRV)
+AC_SUBST(HAVE_DIRECTX)
+AC_OUTPUT([Makefile
+intl/Makefile
+po/Makefile.in
+directx/Makefile
+main/Makefile
+udriver/Makefile
+eppdiag/Makefile
+eppfm/Makefile
+eppfm2/Makefile
+eppfm2/src/Makefile
+flexdrv/Makefile
+ntdrv/Makefile
+w9xdrv/Makefile])
diff --git a/directx/Makefile.am b/directx/Makefile.am
new file mode 100644
index 0000000..ac3435f
--- /dev/null
+++ b/directx/Makefile.am
@@ -0,0 +1,27 @@
+
+INCLUDES = -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" \
+ -I$(top_srcdir)/directx/include -I$(top_srcdir)/directx/include/directx6
+
+if DIRECTX
+BUILT_SOURCES = libddraw.a libdsound.a libdinput.a libdplayx.a
+
+noinst_LIBRARIES = libdinput1.a
+libdinput1_a_SOURCES = dinput.c
+
+endif
+
+libddraw.a libdsound.a libdplayx.a: libddraw.def libdsound.def libdplayx.def
+ for i in ddraw dsound dplayx; do \
+ $(DLLTOOL) --as $(AS) -k --dllname $$i.dll --output-lib lib$$i.a --def $(srcdir)/lib$$i.def; \
+ done
+
+libdinput.a: libdinput1.a libdinput.def
+ $(DLLTOOL) --as $(AS) -k --dllname dinput.dll --output-lib $@ --def $(srcdir)/libdinput.def
+ $(AR) xv libdinput1.a dinput.$(OBJEXT)
+ $(AR) rv $@ dinput.$(OBJEXT)
+ $(RM) -f $<
+
+EXTRA_DIST = libddraw.def libdinput.def libdplayx.def libdsound.def dinput.c \
+ fixdirectx.sh deunion.pl include/directx.h include/mmsystem.h
+
+CLEANFILES = libddraw.a libdinput.a libdplayx.a libdsound.a
diff --git a/directx/Makefile.in b/directx/Makefile.in
new file mode 100644
index 0000000..a0e6d60
--- /dev/null
+++ b/directx/Makefile.in
@@ -0,0 +1,334 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AS = @AS@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+DATADIRNAME = @DATADIRNAME@
+DLLTOOL = @DLLTOOL@
+DRVLIBOBJS = @DRVLIBOBJS@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+HAVE_BITTYPES = @HAVE_BITTYPES@
+HAVE_DIRECTX = @HAVE_DIRECTX@
+HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@
+HAVE_IOFUNCS = @HAVE_IOFUNCS@
+HAVE_LIB = @HAVE_LIB@
+HAVE_MKISS = @HAVE_MKISS@
+HAVE_PPKDRV = @HAVE_PPKDRV@
+HAVE_PPUSER = @HAVE_PPUSER@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LIB = @LIB@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LTLIB = @LTLIB@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+M_PI = @M_PI@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+
+INCLUDES = -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" \
+ -I$(top_srcdir)/directx/include -I$(top_srcdir)/directx/include/directx6
+
+
+ at DIRECTX_TRUE@BUILT_SOURCES = @DIRECTX_TRUE at libddraw.a libdsound.a libdinput.a libdplayx.a
+
+ at DIRECTX_TRUE@noinst_LIBRARIES = @DIRECTX_TRUE at libdinput1.a
+ at DIRECTX_TRUE@libdinput1_a_SOURCES = @DIRECTX_TRUE at dinput.c
+
+EXTRA_DIST = libddraw.def libdinput.def libdplayx.def libdsound.def dinput.c \
+ fixdirectx.sh deunion.pl include/directx.h include/mmsystem.h
+
+
+CLEANFILES = libddraw.a libdinput.a libdplayx.a libdsound.a
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libdinput1_a_LIBADD =
+ at DIRECTX_TRUE@libdinput1_a_OBJECTS = dinput.$(OBJEXT)
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+SOURCES = $(libdinput1_a_SOURCES)
+OBJECTS = $(libdinput1_a_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .obj .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps directx/Makefile
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-noinstLIBRARIES:
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+distclean-noinstLIBRARIES:
+
+maintainer-clean-noinstLIBRARIES:
+
+.c.o:
+ $(COMPILE) -c $<
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+ $(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+ -rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+libdinput1.a: $(libdinput1_a_OBJECTS) $(libdinput1_a_DEPENDENCIES)
+ -rm -f libdinput1.a
+ $(AR) cru libdinput1.a $(libdinput1_a_OBJECTS) $(libdinput1_a_LIBADD)
+ $(RANLIB) libdinput1.a
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = directx
+
+distdir: $(DISTFILES)
+ $(mkinstalldirs) $(distdir)/include
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile $(LIBRARIES)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+ -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \
+ mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-noinstLIBRARIES clean-compile clean-tags clean-generic \
+ mostlyclean-am
+
+clean: clean-am
+
+distclean-am: distclean-noinstLIBRARIES distclean-compile \
+ distclean-tags distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-noinstLIBRARIES \
+ maintainer-clean-compile maintainer-clean-tags \
+ maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
+clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile tags mostlyclean-tags distclean-tags \
+clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
+check-am installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+libddraw.a libdsound.a libdplayx.a: libddraw.def libdsound.def libdplayx.def
+ for i in ddraw dsound dplayx; do \
+ $(DLLTOOL) --as $(AS) -k --dllname $$i.dll --output-lib lib$$i.a --def $(srcdir)/lib$$i.def; \
+ done
+
+libdinput.a: libdinput1.a libdinput.def
+ $(DLLTOOL) --as $(AS) -k --dllname dinput.dll --output-lib $@ --def $(srcdir)/libdinput.def
+ $(AR) xv libdinput1.a dinput.$(OBJEXT)
+ $(AR) rv $@ dinput.$(OBJEXT)
+ $(RM) -f $<
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/directx/deunion.pl b/directx/deunion.pl
new file mode 100755
index 0000000..963ea89
--- /dev/null
+++ b/directx/deunion.pl
@@ -0,0 +1,47 @@
+#!/usr/bin/perl
+#
+# Ack! gcc doesn't support unnamed unions -- we have to fake them.
+#
+# Expected format:
+#
+#struct blah
+#{
+# union
+# {
+# type1 blah1;
+# type2 blah2;
+# };
+#}
+
+$lineno = 0;
+$union = 0;
+$ucount = 1;
+while ( ($line = <STDIN>) ) {
+ ++$lineno;
+
+ $line =~ s/\r//;
+ if ( $line =~ /\sunion\s/ ) {
+ if ( $union ) {
+ die("Nested union at line $lineno -- Exiting.\n");
+ }
+ $union = 1;
+ }
+ if ( $union ) {
+ if ( $line =~ /}/ ) {
+ if ( $line =~ /};/ ) {
+ chomp($line);
+ $gnuline = $line;
+ $gnuline =~ s/};/} u$ucount;/;
+ $line =
+"#if defined(NONAMELESSUNION)\n$gnuline\n#else\n$line\n#endif\n";
+ $ucount++;
+ }
+ $union = 0;
+ }
+ } else {
+ if ( $line =~ /^}/ ) {
+ $ucount = 1;
+ }
+ }
+ print $line;
+}
diff --git a/directx/dinput.c b/directx/dinput.c
new file mode 100644
index 0000000..fb1c0b0
--- /dev/null
+++ b/directx/dinput.c
@@ -0,0 +1,338 @@
+
+#include <directx.h>
+
+/*
+ * This file contains experimentally determined values for the c_cfDI*
+ * constants used in DirectX 5.0
+ */
+
+/* Keyboard */
+
+static DIOBJECTDATAFORMAT KBD_fmt[] = {
+ { &GUID_Key, 0, 0x8000000C, 0x00000000 },
+ { &GUID_Key, 1, 0x8000010C, 0x00000000 },
+ { &GUID_Key, 2, 0x8000020C, 0x00000000 },
+ { &GUID_Key, 3, 0x8000030C, 0x00000000 },
+ { &GUID_Key, 4, 0x8000040C, 0x00000000 },
+ { &GUID_Key, 5, 0x8000050C, 0x00000000 },
+ { &GUID_Key, 6, 0x8000060C, 0x00000000 },
+ { &GUID_Key, 7, 0x8000070C, 0x00000000 },
+ { &GUID_Key, 8, 0x8000080C, 0x00000000 },
+ { &GUID_Key, 9, 0x8000090C, 0x00000000 },
+ { &GUID_Key, 10, 0x80000A0C, 0x00000000 },
+ { &GUID_Key, 11, 0x80000B0C, 0x00000000 },
+ { &GUID_Key, 12, 0x80000C0C, 0x00000000 },
+ { &GUID_Key, 13, 0x80000D0C, 0x00000000 },
+ { &GUID_Key, 14, 0x80000E0C, 0x00000000 },
+ { &GUID_Key, 15, 0x80000F0C, 0x00000000 },
+ { &GUID_Key, 16, 0x8000100C, 0x00000000 },
+ { &GUID_Key, 17, 0x8000110C, 0x00000000 },
+ { &GUID_Key, 18, 0x8000120C, 0x00000000 },
+ { &GUID_Key, 19, 0x8000130C, 0x00000000 },
+ { &GUID_Key, 20, 0x8000140C, 0x00000000 },
+ { &GUID_Key, 21, 0x8000150C, 0x00000000 },
+ { &GUID_Key, 22, 0x8000160C, 0x00000000 },
+ { &GUID_Key, 23, 0x8000170C, 0x00000000 },
+ { &GUID_Key, 24, 0x8000180C, 0x00000000 },
+ { &GUID_Key, 25, 0x8000190C, 0x00000000 },
+ { &GUID_Key, 26, 0x80001A0C, 0x00000000 },
+ { &GUID_Key, 27, 0x80001B0C, 0x00000000 },
+ { &GUID_Key, 28, 0x80001C0C, 0x00000000 },
+ { &GUID_Key, 29, 0x80001D0C, 0x00000000 },
+ { &GUID_Key, 30, 0x80001E0C, 0x00000000 },
+ { &GUID_Key, 31, 0x80001F0C, 0x00000000 },
+ { &GUID_Key, 32, 0x8000200C, 0x00000000 },
+ { &GUID_Key, 33, 0x8000210C, 0x00000000 },
+ { &GUID_Key, 34, 0x8000220C, 0x00000000 },
+ { &GUID_Key, 35, 0x8000230C, 0x00000000 },
+ { &GUID_Key, 36, 0x8000240C, 0x00000000 },
+ { &GUID_Key, 37, 0x8000250C, 0x00000000 },
+ { &GUID_Key, 38, 0x8000260C, 0x00000000 },
+ { &GUID_Key, 39, 0x8000270C, 0x00000000 },
+ { &GUID_Key, 40, 0x8000280C, 0x00000000 },
+ { &GUID_Key, 41, 0x8000290C, 0x00000000 },
+ { &GUID_Key, 42, 0x80002A0C, 0x00000000 },
+ { &GUID_Key, 43, 0x80002B0C, 0x00000000 },
+ { &GUID_Key, 44, 0x80002C0C, 0x00000000 },
+ { &GUID_Key, 45, 0x80002D0C, 0x00000000 },
+ { &GUID_Key, 46, 0x80002E0C, 0x00000000 },
+ { &GUID_Key, 47, 0x80002F0C, 0x00000000 },
+ { &GUID_Key, 48, 0x8000300C, 0x00000000 },
+ { &GUID_Key, 49, 0x8000310C, 0x00000000 },
+ { &GUID_Key, 50, 0x8000320C, 0x00000000 },
+ { &GUID_Key, 51, 0x8000330C, 0x00000000 },
+ { &GUID_Key, 52, 0x8000340C, 0x00000000 },
+ { &GUID_Key, 53, 0x8000350C, 0x00000000 },
+ { &GUID_Key, 54, 0x8000360C, 0x00000000 },
+ { &GUID_Key, 55, 0x8000370C, 0x00000000 },
+ { &GUID_Key, 56, 0x8000380C, 0x00000000 },
+ { &GUID_Key, 57, 0x8000390C, 0x00000000 },
+ { &GUID_Key, 58, 0x80003A0C, 0x00000000 },
+ { &GUID_Key, 59, 0x80003B0C, 0x00000000 },
+ { &GUID_Key, 60, 0x80003C0C, 0x00000000 },
+ { &GUID_Key, 61, 0x80003D0C, 0x00000000 },
+ { &GUID_Key, 62, 0x80003E0C, 0x00000000 },
+ { &GUID_Key, 63, 0x80003F0C, 0x00000000 },
+ { &GUID_Key, 64, 0x8000400C, 0x00000000 },
+ { &GUID_Key, 65, 0x8000410C, 0x00000000 },
+ { &GUID_Key, 66, 0x8000420C, 0x00000000 },
+ { &GUID_Key, 67, 0x8000430C, 0x00000000 },
+ { &GUID_Key, 68, 0x8000440C, 0x00000000 },
+ { &GUID_Key, 69, 0x8000450C, 0x00000000 },
+ { &GUID_Key, 70, 0x8000460C, 0x00000000 },
+ { &GUID_Key, 71, 0x8000470C, 0x00000000 },
+ { &GUID_Key, 72, 0x8000480C, 0x00000000 },
+ { &GUID_Key, 73, 0x8000490C, 0x00000000 },
+ { &GUID_Key, 74, 0x80004A0C, 0x00000000 },
+ { &GUID_Key, 75, 0x80004B0C, 0x00000000 },
+ { &GUID_Key, 76, 0x80004C0C, 0x00000000 },
+ { &GUID_Key, 77, 0x80004D0C, 0x00000000 },
+ { &GUID_Key, 78, 0x80004E0C, 0x00000000 },
+ { &GUID_Key, 79, 0x80004F0C, 0x00000000 },
+ { &GUID_Key, 80, 0x8000500C, 0x00000000 },
+ { &GUID_Key, 81, 0x8000510C, 0x00000000 },
+ { &GUID_Key, 82, 0x8000520C, 0x00000000 },
+ { &GUID_Key, 83, 0x8000530C, 0x00000000 },
+ { &GUID_Key, 84, 0x8000540C, 0x00000000 },
+ { &GUID_Key, 85, 0x8000550C, 0x00000000 },
+ { &GUID_Key, 86, 0x8000560C, 0x00000000 },
+ { &GUID_Key, 87, 0x8000570C, 0x00000000 },
+ { &GUID_Key, 88, 0x8000580C, 0x00000000 },
+ { &GUID_Key, 89, 0x8000590C, 0x00000000 },
+ { &GUID_Key, 90, 0x80005A0C, 0x00000000 },
+ { &GUID_Key, 91, 0x80005B0C, 0x00000000 },
+ { &GUID_Key, 92, 0x80005C0C, 0x00000000 },
+ { &GUID_Key, 93, 0x80005D0C, 0x00000000 },
+ { &GUID_Key, 94, 0x80005E0C, 0x00000000 },
+ { &GUID_Key, 95, 0x80005F0C, 0x00000000 },
+ { &GUID_Key, 96, 0x8000600C, 0x00000000 },
+ { &GUID_Key, 97, 0x8000610C, 0x00000000 },
+ { &GUID_Key, 98, 0x8000620C, 0x00000000 },
+ { &GUID_Key, 99, 0x8000630C, 0x00000000 },
+ { &GUID_Key, 100, 0x8000640C, 0x00000000 },
+ { &GUID_Key, 101, 0x8000650C, 0x00000000 },
+ { &GUID_Key, 102, 0x8000660C, 0x00000000 },
+ { &GUID_Key, 103, 0x8000670C, 0x00000000 },
+ { &GUID_Key, 104, 0x8000680C, 0x00000000 },
+ { &GUID_Key, 105, 0x8000690C, 0x00000000 },
+ { &GUID_Key, 106, 0x80006A0C, 0x00000000 },
+ { &GUID_Key, 107, 0x80006B0C, 0x00000000 },
+ { &GUID_Key, 108, 0x80006C0C, 0x00000000 },
+ { &GUID_Key, 109, 0x80006D0C, 0x00000000 },
+ { &GUID_Key, 110, 0x80006E0C, 0x00000000 },
+ { &GUID_Key, 111, 0x80006F0C, 0x00000000 },
+ { &GUID_Key, 112, 0x8000700C, 0x00000000 },
+ { &GUID_Key, 113, 0x8000710C, 0x00000000 },
+ { &GUID_Key, 114, 0x8000720C, 0x00000000 },
+ { &GUID_Key, 115, 0x8000730C, 0x00000000 },
+ { &GUID_Key, 116, 0x8000740C, 0x00000000 },
+ { &GUID_Key, 117, 0x8000750C, 0x00000000 },
+ { &GUID_Key, 118, 0x8000760C, 0x00000000 },
+ { &GUID_Key, 119, 0x8000770C, 0x00000000 },
+ { &GUID_Key, 120, 0x8000780C, 0x00000000 },
+ { &GUID_Key, 121, 0x8000790C, 0x00000000 },
+ { &GUID_Key, 122, 0x80007A0C, 0x00000000 },
+ { &GUID_Key, 123, 0x80007B0C, 0x00000000 },
+ { &GUID_Key, 124, 0x80007C0C, 0x00000000 },
+ { &GUID_Key, 125, 0x80007D0C, 0x00000000 },
+ { &GUID_Key, 126, 0x80007E0C, 0x00000000 },
+ { &GUID_Key, 127, 0x80007F0C, 0x00000000 },
+ { &GUID_Key, 128, 0x8000800C, 0x00000000 },
+ { &GUID_Key, 129, 0x8000810C, 0x00000000 },
+ { &GUID_Key, 130, 0x8000820C, 0x00000000 },
+ { &GUID_Key, 131, 0x8000830C, 0x00000000 },
+ { &GUID_Key, 132, 0x8000840C, 0x00000000 },
+ { &GUID_Key, 133, 0x8000850C, 0x00000000 },
+ { &GUID_Key, 134, 0x8000860C, 0x00000000 },
+ { &GUID_Key, 135, 0x8000870C, 0x00000000 },
+ { &GUID_Key, 136, 0x8000880C, 0x00000000 },
+ { &GUID_Key, 137, 0x8000890C, 0x00000000 },
+ { &GUID_Key, 138, 0x80008A0C, 0x00000000 },
+ { &GUID_Key, 139, 0x80008B0C, 0x00000000 },
+ { &GUID_Key, 140, 0x80008C0C, 0x00000000 },
+ { &GUID_Key, 141, 0x80008D0C, 0x00000000 },
+ { &GUID_Key, 142, 0x80008E0C, 0x00000000 },
+ { &GUID_Key, 143, 0x80008F0C, 0x00000000 },
+ { &GUID_Key, 144, 0x8000900C, 0x00000000 },
+ { &GUID_Key, 145, 0x8000910C, 0x00000000 },
+ { &GUID_Key, 146, 0x8000920C, 0x00000000 },
+ { &GUID_Key, 147, 0x8000930C, 0x00000000 },
+ { &GUID_Key, 148, 0x8000940C, 0x00000000 },
+ { &GUID_Key, 149, 0x8000950C, 0x00000000 },
+ { &GUID_Key, 150, 0x8000960C, 0x00000000 },
+ { &GUID_Key, 151, 0x8000970C, 0x00000000 },
+ { &GUID_Key, 152, 0x8000980C, 0x00000000 },
+ { &GUID_Key, 153, 0x8000990C, 0x00000000 },
+ { &GUID_Key, 154, 0x80009A0C, 0x00000000 },
+ { &GUID_Key, 155, 0x80009B0C, 0x00000000 },
+ { &GUID_Key, 156, 0x80009C0C, 0x00000000 },
+ { &GUID_Key, 157, 0x80009D0C, 0x00000000 },
+ { &GUID_Key, 158, 0x80009E0C, 0x00000000 },
+ { &GUID_Key, 159, 0x80009F0C, 0x00000000 },
+ { &GUID_Key, 160, 0x8000A00C, 0x00000000 },
+ { &GUID_Key, 161, 0x8000A10C, 0x00000000 },
+ { &GUID_Key, 162, 0x8000A20C, 0x00000000 },
+ { &GUID_Key, 163, 0x8000A30C, 0x00000000 },
+ { &GUID_Key, 164, 0x8000A40C, 0x00000000 },
+ { &GUID_Key, 165, 0x8000A50C, 0x00000000 },
+ { &GUID_Key, 166, 0x8000A60C, 0x00000000 },
+ { &GUID_Key, 167, 0x8000A70C, 0x00000000 },
+ { &GUID_Key, 168, 0x8000A80C, 0x00000000 },
+ { &GUID_Key, 169, 0x8000A90C, 0x00000000 },
+ { &GUID_Key, 170, 0x8000AA0C, 0x00000000 },
+ { &GUID_Key, 171, 0x8000AB0C, 0x00000000 },
+ { &GUID_Key, 172, 0x8000AC0C, 0x00000000 },
+ { &GUID_Key, 173, 0x8000AD0C, 0x00000000 },
+ { &GUID_Key, 174, 0x8000AE0C, 0x00000000 },
+ { &GUID_Key, 175, 0x8000AF0C, 0x00000000 },
+ { &GUID_Key, 176, 0x8000B00C, 0x00000000 },
+ { &GUID_Key, 177, 0x8000B10C, 0x00000000 },
+ { &GUID_Key, 178, 0x8000B20C, 0x00000000 },
+ { &GUID_Key, 179, 0x8000B30C, 0x00000000 },
+ { &GUID_Key, 180, 0x8000B40C, 0x00000000 },
+ { &GUID_Key, 181, 0x8000B50C, 0x00000000 },
+ { &GUID_Key, 182, 0x8000B60C, 0x00000000 },
+ { &GUID_Key, 183, 0x8000B70C, 0x00000000 },
+ { &GUID_Key, 184, 0x8000B80C, 0x00000000 },
+ { &GUID_Key, 185, 0x8000B90C, 0x00000000 },
+ { &GUID_Key, 186, 0x8000BA0C, 0x00000000 },
+ { &GUID_Key, 187, 0x8000BB0C, 0x00000000 },
+ { &GUID_Key, 188, 0x8000BC0C, 0x00000000 },
+ { &GUID_Key, 189, 0x8000BD0C, 0x00000000 },
+ { &GUID_Key, 190, 0x8000BE0C, 0x00000000 },
+ { &GUID_Key, 191, 0x8000BF0C, 0x00000000 },
+ { &GUID_Key, 192, 0x8000C00C, 0x00000000 },
+ { &GUID_Key, 193, 0x8000C10C, 0x00000000 },
+ { &GUID_Key, 194, 0x8000C20C, 0x00000000 },
+ { &GUID_Key, 195, 0x8000C30C, 0x00000000 },
+ { &GUID_Key, 196, 0x8000C40C, 0x00000000 },
+ { &GUID_Key, 197, 0x8000C50C, 0x00000000 },
+ { &GUID_Key, 198, 0x8000C60C, 0x00000000 },
+ { &GUID_Key, 199, 0x8000C70C, 0x00000000 },
+ { &GUID_Key, 200, 0x8000C80C, 0x00000000 },
+ { &GUID_Key, 201, 0x8000C90C, 0x00000000 },
+ { &GUID_Key, 202, 0x8000CA0C, 0x00000000 },
+ { &GUID_Key, 203, 0x8000CB0C, 0x00000000 },
+ { &GUID_Key, 204, 0x8000CC0C, 0x00000000 },
+ { &GUID_Key, 205, 0x8000CD0C, 0x00000000 },
+ { &GUID_Key, 206, 0x8000CE0C, 0x00000000 },
+ { &GUID_Key, 207, 0x8000CF0C, 0x00000000 },
+ { &GUID_Key, 208, 0x8000D00C, 0x00000000 },
+ { &GUID_Key, 209, 0x8000D10C, 0x00000000 },
+ { &GUID_Key, 210, 0x8000D20C, 0x00000000 },
+ { &GUID_Key, 211, 0x8000D30C, 0x00000000 },
+ { &GUID_Key, 212, 0x8000D40C, 0x00000000 },
+ { &GUID_Key, 213, 0x8000D50C, 0x00000000 },
+ { &GUID_Key, 214, 0x8000D60C, 0x00000000 },
+ { &GUID_Key, 215, 0x8000D70C, 0x00000000 },
+ { &GUID_Key, 216, 0x8000D80C, 0x00000000 },
+ { &GUID_Key, 217, 0x8000D90C, 0x00000000 },
+ { &GUID_Key, 218, 0x8000DA0C, 0x00000000 },
+ { &GUID_Key, 219, 0x8000DB0C, 0x00000000 },
+ { &GUID_Key, 220, 0x8000DC0C, 0x00000000 },
+ { &GUID_Key, 221, 0x8000DD0C, 0x00000000 },
+ { &GUID_Key, 222, 0x8000DE0C, 0x00000000 },
+ { &GUID_Key, 223, 0x8000DF0C, 0x00000000 },
+ { &GUID_Key, 224, 0x8000E00C, 0x00000000 },
+ { &GUID_Key, 225, 0x8000E10C, 0x00000000 },
+ { &GUID_Key, 226, 0x8000E20C, 0x00000000 },
+ { &GUID_Key, 227, 0x8000E30C, 0x00000000 },
+ { &GUID_Key, 228, 0x8000E40C, 0x00000000 },
+ { &GUID_Key, 229, 0x8000E50C, 0x00000000 },
+ { &GUID_Key, 230, 0x8000E60C, 0x00000000 },
+ { &GUID_Key, 231, 0x8000E70C, 0x00000000 },
+ { &GUID_Key, 232, 0x8000E80C, 0x00000000 },
+ { &GUID_Key, 233, 0x8000E90C, 0x00000000 },
+ { &GUID_Key, 234, 0x8000EA0C, 0x00000000 },
+ { &GUID_Key, 235, 0x8000EB0C, 0x00000000 },
+ { &GUID_Key, 236, 0x8000EC0C, 0x00000000 },
+ { &GUID_Key, 237, 0x8000ED0C, 0x00000000 },
+ { &GUID_Key, 238, 0x8000EE0C, 0x00000000 },
+ { &GUID_Key, 239, 0x8000EF0C, 0x00000000 },
+ { &GUID_Key, 240, 0x8000F00C, 0x00000000 },
+ { &GUID_Key, 241, 0x8000F10C, 0x00000000 },
+ { &GUID_Key, 242, 0x8000F20C, 0x00000000 },
+ { &GUID_Key, 243, 0x8000F30C, 0x00000000 },
+ { &GUID_Key, 244, 0x8000F40C, 0x00000000 },
+ { &GUID_Key, 245, 0x8000F50C, 0x00000000 },
+ { &GUID_Key, 246, 0x8000F60C, 0x00000000 },
+ { &GUID_Key, 247, 0x8000F70C, 0x00000000 },
+ { &GUID_Key, 248, 0x8000F80C, 0x00000000 },
+ { &GUID_Key, 249, 0x8000F90C, 0x00000000 },
+ { &GUID_Key, 250, 0x8000FA0C, 0x00000000 },
+ { &GUID_Key, 251, 0x8000FB0C, 0x00000000 },
+ { &GUID_Key, 252, 0x8000FC0C, 0x00000000 },
+ { &GUID_Key, 253, 0x8000FD0C, 0x00000000 },
+ { &GUID_Key, 254, 0x8000FE0C, 0x00000000 },
+ { &GUID_Key, 255, 0x8000FF0C, 0x00000000 },
+};
+
+const DIDATAFORMAT c_dfDIKeyboard = { 24, 16, 0x00000002, 256, 256, KBD_fmt };
+
+
+/* Mouse */
+
+static DIOBJECTDATAFORMAT PTR_fmt[] = {
+ { &GUID_XAxis, 0, 0x00FFFF03, 0x00000000 },
+ { &GUID_YAxis, 4, 0x00FFFF03, 0x00000000 },
+ { &GUID_ZAxis, 8, 0x80FFFF03, 0x00000000 },
+ { NULL, 12, 0x00FFFF0C, 0x00000000 },
+ { NULL, 13, 0x00FFFF0C, 0x00000000 },
+ { NULL, 14, 0x80FFFF0C, 0x00000000 },
+ { NULL, 15, 0x80FFFF0C, 0x00000000 },
+};
+
+const DIDATAFORMAT c_dfDIMouse = { 24, 16, 0x00000002, 16, 7, PTR_fmt };
+
+
+/* Joystick */
+
+static DIOBJECTDATAFORMAT JOY_fmt[] = {
+ { &GUID_XAxis, 0, 0x80FFFF03, 0x00000100 },
+ { &GUID_YAxis, 4, 0x80FFFF03, 0x00000100 },
+ { &GUID_ZAxis, 8, 0x80FFFF03, 0x00000100 },
+ { &GUID_RxAxis, 12, 0x80FFFF03, 0x00000100 },
+ { &GUID_RyAxis, 16, 0x80FFFF03, 0x00000100 },
+ { &GUID_RzAxis, 20, 0x80FFFF03, 0x00000100 },
+ { &GUID_Slider, 24, 0x80FFFF03, 0x00000100 },
+ { &GUID_Slider, 28, 0x80FFFF03, 0x00000100 },
+ { &GUID_POV, 32, 0x80FFFF10, 0x00000000 },
+ { &GUID_POV, 36, 0x80FFFF10, 0x00000000 },
+ { &GUID_POV, 40, 0x80FFFF10, 0x00000000 },
+ { &GUID_POV, 44, 0x80FFFF10, 0x00000000 },
+ { NULL, 48, 0x80FFFF0C, 0x00000000 },
+ { NULL, 49, 0x80FFFF0C, 0x00000000 },
+ { NULL, 50, 0x80FFFF0C, 0x00000000 },
+ { NULL, 51, 0x80FFFF0C, 0x00000000 },
+ { NULL, 52, 0x80FFFF0C, 0x00000000 },
+ { NULL, 53, 0x80FFFF0C, 0x00000000 },
+ { NULL, 54, 0x80FFFF0C, 0x00000000 },
+ { NULL, 55, 0x80FFFF0C, 0x00000000 },
+ { NULL, 56, 0x80FFFF0C, 0x00000000 },
+ { NULL, 57, 0x80FFFF0C, 0x00000000 },
+ { NULL, 58, 0x80FFFF0C, 0x00000000 },
+ { NULL, 59, 0x80FFFF0C, 0x00000000 },
+ { NULL, 60, 0x80FFFF0C, 0x00000000 },
+ { NULL, 61, 0x80FFFF0C, 0x00000000 },
+ { NULL, 62, 0x80FFFF0C, 0x00000000 },
+ { NULL, 63, 0x80FFFF0C, 0x00000000 },
+ { NULL, 64, 0x80FFFF0C, 0x00000000 },
+ { NULL, 65, 0x80FFFF0C, 0x00000000 },
+ { NULL, 66, 0x80FFFF0C, 0x00000000 },
+ { NULL, 67, 0x80FFFF0C, 0x00000000 },
+ { NULL, 68, 0x80FFFF0C, 0x00000000 },
+ { NULL, 69, 0x80FFFF0C, 0x00000000 },
+ { NULL, 70, 0x80FFFF0C, 0x00000000 },
+ { NULL, 71, 0x80FFFF0C, 0x00000000 },
+ { NULL, 72, 0x80FFFF0C, 0x00000000 },
+ { NULL, 73, 0x80FFFF0C, 0x00000000 },
+ { NULL, 74, 0x80FFFF0C, 0x00000000 },
+ { NULL, 75, 0x80FFFF0C, 0x00000000 },
+ { NULL, 76, 0x80FFFF0C, 0x00000000 },
+ { NULL, 77, 0x80FFFF0C, 0x00000000 },
+ { NULL, 78, 0x80FFFF0C, 0x00000000 },
+ { NULL, 79, 0x80FFFF0C, 0x00000000 },
+};
+
+const DIDATAFORMAT c_dfDIJoystick = { 24, 16, 0x00000001, 80, 44, JOY_fmt };
+
diff --git a/directx/fixdirectx.sh b/directx/fixdirectx.sh
new file mode 100755
index 0000000..beed18b
--- /dev/null
+++ b/directx/fixdirectx.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+#
+# A script to fix the DirectX includes so that gcc can compile them...
+
+#cd `dirname $0`
+for file in include/directx6/*.h
+do echo "Stripping $file..."
+ tr -d '\r' <$file >$file.new && mv $file.new $file
+done
+
+# Fix the few remaining headers that have anonymous unions
+for file in include/directx6/d3dtypes.h
+do if [ -f $file ]; then
+ echo "Fixing $file..."
+ perl ./deunion.pl <$file >$file.new && mv $file.new $file
+ fi
+done
diff --git a/directx/include/directx.h b/directx/include/directx.h
new file mode 100644
index 0000000..cf31b01
--- /dev/null
+++ b/directx/include/directx.h
@@ -0,0 +1,79 @@
+
+#ifndef _directx_h_
+#define _directx_h
+
+/* Include all of the DirectX 5.0 headers and adds any necessary tweaks */
+
+#include <windows.h>
+#include <mmsystem.h>
+#ifndef WIN32
+#define WIN32
+#endif
+#undef WINNT
+
+/* Far pointers don't exist in 32-bit code */
+#ifndef FAR
+#define FAR
+#endif
+
+/* Error codes not yet included in Win32 API header files */
+#ifndef MAKE_HRESULT
+#define MAKE_HRESULT(sev,fac,code) \
+ ((HRESULT)(((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) | ((unsigned long)(code))))
+#endif
+
+#ifndef S_OK
+#define S_OK (HRESULT)0x00000000L
+#endif
+
+#ifndef SUCCEEDED
+#define SUCCEEDED(x) ((HRESULT)(x) >= 0)
+#endif
+#ifndef FAILED
+#define FAILED(x) ((HRESULT)(x)<0)
+#endif
+
+#ifndef E_FAIL
+#define E_FAIL (HRESULT)0x80000008L
+#endif
+#ifndef E_NOINTERFACE
+#define E_NOINTERFACE (HRESULT)0x80004002L
+#endif
+#ifndef E_OUTOFMEMORY
+#define E_OUTOFMEMORY (HRESULT)0x8007000EL
+#endif
+#ifndef E_INVALIDARG
+#define E_INVALIDARG (HRESULT)0x80070057L
+#endif
+#ifndef E_NOTIMPL
+#define E_NOTIMPL (HRESULT)0x80004001L
+#endif
+#ifndef REGDB_E_CLASSNOTREG
+#define REGDB_E_CLASSNOTREG (HRESULT)0x80040154L
+#endif
+
+/* Severity codes */
+#ifndef SEVERITY_ERROR
+#define SEVERITY_ERROR 1
+#endif
+
+/* Error facility codes */
+#ifndef FACILITY_WIN32
+#define FACILITY_WIN32 7
+#endif
+
+#ifndef FIELD_OFFSET
+#define FIELD_OFFSET(type, field) ((LONG)&(((type *)0)->field))
+#endif
+
+/* DirectX 6.0 header includes
+ (if it isn't included, I haven't tested it yet)
+ */
+#ifdef __GNUC__
+#define NONAMELESSUNION
+#endif
+#include <ddraw.h>
+#include <dsound.h>
+#include <dinput.h>
+
+#endif /* _directx_h */
diff --git a/directx/include/mmsystem.h b/directx/include/mmsystem.h
new file mode 100644
index 0000000..6ad2933
--- /dev/null
+++ b/directx/include/mmsystem.h
@@ -0,0 +1,236 @@
+
+#ifndef _mmsystem_h
+#define _mmsystem_h
+
+/* Multimedia header file
+ -- not really part of DirectX, but not included in the Win32 API headers.
+*/
+
+/* Result code definition */
+typedef UINT MMRESULT;
+typedef DWORD MCIERROR;
+
+/* Various error values */
+#define MAXERRORLENGTH 256 /* Maximum length of error message */
+#define MMSYSERR_NOERROR 0
+#define TIMERR_NOERROR MMSYSERR_NOERROR
+#define TIMERR_NOCANDO 97
+
+/* Wave out device handle */
+typedef HANDLE HWAVEOUT;
+
+/* MCI device handle */
+typedef UINT MCIDEVICEID;
+
+/* Have the system choose a wave device */
+#define WAVE_MAPPER ((UINT)-1)
+
+/* Specify the type of wave event callback */
+#define CALLBACK_FUNCTION 0x00030000
+#define CALLBACK_EVENT 0x00050000
+
+/* Messages sent to the waveOut callback function */
+#define WOM_DONE 0x3BD
+
+/* The wave buffer header used by waveOut functions */
+typedef struct WAVEHDR {
+ LPSTR lpData;
+ DWORD dwBufferLength;
+ DWORD dwBytesRecorded;
+ DWORD dwUser;
+ DWORD dwFlags;
+ DWORD dwLoops;
+ struct WAVEHDR *lpNext;
+ DWORD reserved;
+} WAVEHDR;
+
+/* WAVEHDR.dwFlags */
+#define WHDR_DONE 0x00000001
+#define WHDR_BEGINLOOP 0x00000004
+#define WHDR_ENDLOOP 0x00000008
+#define WHDR_INQUEUE 0x00000010
+
+/* Structure used in querying the capabilities of a wave device */
+typedef struct {
+ WORD wMid;
+ WORD wPid;
+ UINT vDriverVersion;
+ CHAR szPname[32];
+ DWORD dwFormats;
+ WORD wReserved1;
+ DWORD dwSupport;
+} WAVEOUTCAPS;
+
+/* The only kind of sound data we handle here */
+#define WAVE_FORMAT_PCM 1
+
+/* Old wave format structure */
+typedef struct {
+ WORD wFormatTag;
+ WORD nChannels;
+ DWORD nSamplesPerSec;
+ DWORD nAvgBytesPerSec;
+ WORD nBlockAlign;
+} WAVEFORMAT, *LPWAVEFORMAT;
+
+/* PCM wave format structure */
+typedef struct {
+ WAVEFORMAT wf;
+ WORD wBitsPerSample;
+} PCMWAVEFORMAT;
+
+/* Wave format structure (used by dsound.h) */
+typedef struct {
+ WORD wFormatTag;
+ WORD nChannels;
+ DWORD nSamplesPerSec;
+ DWORD nAvgBytesPerSec;
+ WORD nBlockAlign;
+ WORD wBitsPerSample;
+ WORD cbSize;
+} WAVEFORMATEX, *LPWAVEFORMATEX;
+
+/* Constants used as arguments and flags to mciSendCommand() */
+
+/* CD device type */
+#define MCI_STRING_OFFSET 512
+#define MCI_DEVTYPE_CD_AUDIO (MCI_STRING_OFFSET + 4)
+
+/* MCI commands */
+#define MCI_OPEN 0x0803
+#define MCI_CLOSE 0x0804
+#define MCI_PLAY 0x0806
+#define MCI_STOP 0x0808
+#define MCI_PAUSE 0x0809
+#define MCI_SET 0x080D
+#define MCI_STATUS 0x0814
+#define MCI_RESUME 0x0855
+
+/* Flags for MCI commands */
+#define MCI_NOTIFY 0x00000001
+#define MCI_WAIT 0x00000002
+#define MCI_FROM 0x00000004
+#define MCI_TO 0x00000008
+#define MCI_TRACK 0x00000010
+
+/* Flags for MCI Play command */
+#define MCI_OPEN_SHAREABLE 0x00000100
+#define MCI_OPEN_ELEMENT 0x00000200
+#define MCI_OPEN_TYPE_ID 0x00001000
+#define MCI_OPEN_TYPE 0x00002000
+
+/* Flags for MCI Status command */
+#define MCI_STATUS_ITEM 0x00000100
+#define MCI_STATUS_LENGTH 0x00000001
+#define MCI_STATUS_POSITION 0x00000002
+#define MCI_STATUS_NUMBER_OF_TRACKS 0x00000003
+#define MCI_STATUS_MODE 0x00000004
+#define MCI_STATUS_MEDIA_PRESENT 0x00000005
+#define MCI_STATUS_TIME_FORMAT 0x00000006
+#define MCI_STATUS_READY 0x00000007
+#define MCI_STATUS_CURRENT_TRACK 0x00000008
+
+/* Flags for MCI Set command */
+#define MCI_SET_DOOR_OPEN 0x00000100
+#define MCI_SET_DOOR_CLOSED 0x00000200
+#define MCI_SET_TIME_FORMAT 0x00000400
+
+/* MCI device status flags */
+#define MCI_MODE_NOT_READY (MCI_STRING_OFFSET + 12)
+#define MCI_MODE_STOP (MCI_STRING_OFFSET + 13)
+#define MCI_MODE_PLAY (MCI_STRING_OFFSET + 14)
+#define MCI_MODE_RECORD (MCI_STRING_OFFSET + 15)
+#define MCI_MODE_SEEK (MCI_STRING_OFFSET + 16)
+#define MCI_MODE_PAUSE (MCI_STRING_OFFSET + 17)
+#define MCI_MODE_OPEN (MCI_STRING_OFFSET + 18)
+
+
+/* Constants used to specify MCI time formats */
+#define MCI_FORMAT_MILLISECONDS 0
+#define MCI_FORMAT_HMS 1
+#define MCI_FORMAT_MSF 2
+#define MCI_FORMAT_FRAMES 3
+#define MCI_FORMAT_BYTES 8
+#define MCI_FORMAT_SAMPLES 9
+#define MCI_FORMAT_TMSF 10
+
+#define MCI_MSF_MINUTE(msf) ((BYTE)(msf))
+#define MCI_MSF_SECOND(msf) ((BYTE)(((WORD)(msf)) >> 8))
+#define MCI_MSF_FRAME(msf) ((BYTE)((msf)>>16))
+
+#define MCI_MAKE_MSF(m, s, f) \
+ ((DWORD)(((BYTE)(m)|((WORD)(s)<<8))|(((DWORD)(BYTE)(f))<<16)))
+
+
+/* Structures passed as arguments to mciSendCommand() */
+typedef struct {
+ DWORD dwCallback;
+ MCIDEVICEID wDeviceID;
+ LPCSTR lpstrDeviceType;
+ LPCSTR lpstrElementName;
+ LPCSTR lpstrAlias;
+} MCI_OPEN_PARMS;
+
+typedef struct {
+ DWORD dwCallback;
+ DWORD dwTimeFormat;
+ DWORD dwAudio;
+} MCI_SET_PARMS;
+
+typedef struct {
+ DWORD dwCallback;
+ DWORD dwFrom;
+ DWORD dwTo;
+} MCI_PLAY_PARMS;
+
+typedef struct {
+ DWORD dwCallback;
+ DWORD dwReturn;
+ DWORD dwItem;
+ DWORD dwTrack;
+} MCI_STATUS_PARMS;
+
+/* Convert a string to a 4 byte multimedia code */
+#ifndef mmioFOURCC
+#define mmioFOURCC(c0, c1, c2, c3) \
+ ((DWORD)(c0)|((DWORD)(c1)<<8)|((DWORD)(c2)<<16)|((DWORD)(c3)<<24))
+#endif
+
+/* timer callback function prototype */
+typedef void (CALLBACK TIMECALLBACK)(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2);
+
+/* What type of timer to set */
+#define TIME_ONESHOT 0x0000 /* program timer for single event */
+#define TIME_PERIODIC 0x0001 /* program for continuous periodic event */
+
+
+/* Multimedia timer function declarations */
+extern MMRESULT WINAPI timeSetEvent(UINT uDelay, UINT uResolution,
+ TIMECALLBACK *fptc, DWORD dwUser, UINT fuEvent);
+extern MMRESULT WINAPI timeKillEvent(UINT uTimerID);
+extern MMRESULT WINAPI timeBeginPeriod(UINT uPeriod);
+extern MMRESULT WINAPI timeEndPeriod(UINT uPeriod);
+
+/* The waveOut* function declarations */
+extern MMRESULT WINAPI waveOutOpen(HWAVEOUT *phwo, UINT uDeviceID,
+ WAVEFORMATEX *pwfx, DWORD dwCallback, DWORD dwInstance, DWORD fdwOpen);
+extern MMRESULT WINAPI waveOutClose(HWAVEOUT hwo);
+extern MMRESULT WINAPI waveOutPrepareHeader(HWAVEOUT hwo, WAVEHDR *pwh, UINT cbwh);
+extern MMRESULT WINAPI waveOutUnprepareHeader(HWAVEOUT hwo, WAVEHDR *pwh, UINT cbwh);
+extern MMRESULT WINAPI waveOutWrite(HWAVEOUT hwo, WAVEHDR *pwh, UINT cbwh);
+extern MMRESULT WINAPI waveOutPause(HWAVEOUT hwo);
+extern MMRESULT WINAPI waveOutRestart(HWAVEOUT hwo);
+extern MMRESULT WINAPI waveOutReset(HWAVEOUT hwo);
+extern MMRESULT WINAPI waveOutBreakLoop(HWAVEOUT hwo);
+#define waveOutGetDevCaps waveOutGetDevCapsA
+extern MMRESULT WINAPI waveOutGetDevCapsA(UINT uDeviceID, WAVEOUTCAPS *pwoc, UINT cbwoc);
+#define waveOutGetErrorText waveOutGetErrorTextA
+extern MMRESULT WINAPI waveOutGetErrorTextA(MMRESULT mmrError, LPSTR pszText, UINT cchText);
+
+/* The MCI command interface */
+#define mciSendCommand mciSendCommandA
+extern MCIERROR WINAPI mciSendCommandA(MCIDEVICEID mciId, UINT uMsg, DWORD dwParam1, DWORD dwParam2);
+#define mciGetErrorString mciGetErrorStringA
+extern int WINAPI mciGetErrorStringA(DWORD hErr, LPCSTR lpBuf, DWORD dwLen);
+
+#endif /* _mmsystem_h */
diff --git a/directx/libddraw.def b/directx/libddraw.def
new file mode 100644
index 0000000..5df0c3a
--- /dev/null
+++ b/directx/libddraw.def
@@ -0,0 +1,3 @@
+EXPORTS
+ DirectDrawCreate at 12
+ DirectDrawEnumerateA at 8
diff --git a/directx/libdinput.def b/directx/libdinput.def
new file mode 100644
index 0000000..f2f3f67
--- /dev/null
+++ b/directx/libdinput.def
@@ -0,0 +1,2 @@
+EXPORTS
+ DirectInputCreateA at 16
diff --git a/directx/libdplayx.def b/directx/libdplayx.def
new file mode 100644
index 0000000..1171d8f
--- /dev/null
+++ b/directx/libdplayx.def
@@ -0,0 +1,2 @@
+EXPORTS
+ DirectPlayLobbyCreateA at 20
diff --git a/directx/libdsound.def b/directx/libdsound.def
new file mode 100644
index 0000000..f698fa9
--- /dev/null
+++ b/directx/libdsound.def
@@ -0,0 +1,9 @@
+EXPORTS
+ DirectSoundCaptureEnumerateW at 8
+ DirectSoundCaptureEnumerateA at 8
+ DirectSoundCaptureCreate at 12
+ DllGetClassObject
+ DllCanUnloadNow
+ DirectSoundEnumerateW at 8
+ DirectSoundEnumerateA at 8
+ DirectSoundCreate at 12
diff --git a/eppdiag/Makefile.am b/eppdiag/Makefile.am
new file mode 100644
index 0000000..b0c7f84
--- /dev/null
+++ b/eppdiag/Makefile.am
@@ -0,0 +1,36 @@
+## Process this file with automake to produce Makefile.in
+
+INCLUDES = $(GTK_CFLAGS) -I$(top_srcdir)/main \
+ -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\"
+
+##dnl man_MANS = eppdiag.8
+
+if HAVEGTK
+GTKPROGS = eppdiag
+else
+GTKPROGS =
+endif
+
+if DIRECTX
+DIRECTXLIBS = -L$(top_builddir)/directx -ldsound -luser32 -lgdi32
+else
+DIRECTXLIBS =
+endif
+
+sbin_PROGRAMS = $(GTKPROGS)
+
+eppdiag_SOURCES = \
+ gladesrc.c \
+ eppdiag.c
+
+eppdiag_LDADD = \
+ ../main/libinit.a ../main/libresident.a ../main/libresident2.a \
+ $(GTK_LIBS) ../main/libmisc.a $(DIRECTXLIBS)
+
+CLEANFILES =
+
+noinst_HEADERS = \
+ gladesrc.h \
+ gladesig.h
+
+EXTRA_DIST = eppdiag.glade
diff --git a/eppdiag/Makefile.in b/eppdiag/Makefile.in
new file mode 100644
index 0000000..5c9f702
--- /dev/null
+++ b/eppdiag/Makefile.in
@@ -0,0 +1,365 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AS = @AS@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+DATADIRNAME = @DATADIRNAME@
+DLLTOOL = @DLLTOOL@
+DRVLIBOBJS = @DRVLIBOBJS@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+HAVE_BITTYPES = @HAVE_BITTYPES@
+HAVE_DIRECTX = @HAVE_DIRECTX@
+HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@
+HAVE_IOFUNCS = @HAVE_IOFUNCS@
+HAVE_LIB = @HAVE_LIB@
+HAVE_MKISS = @HAVE_MKISS@
+HAVE_PPKDRV = @HAVE_PPKDRV@
+HAVE_PPUSER = @HAVE_PPUSER@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LIB = @LIB@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LTLIB = @LTLIB@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+M_PI = @M_PI@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+
+INCLUDES = $(GTK_CFLAGS) -I$(top_srcdir)/main \
+ -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\"
+
+ at HAVEGTK_TRUE@GTKPROGS = @HAVEGTK_TRUE at eppdiag
+ at HAVEGTK_FALSE@GTKPROGS =
+ at DIRECTX_TRUE@DIRECTXLIBS = @DIRECTX_TRUE at -L$(top_builddir)/directx -ldsound -luser32 -lgdi32
+ at DIRECTX_FALSE@DIRECTXLIBS =
+
+sbin_PROGRAMS = $(GTKPROGS)
+
+eppdiag_SOURCES = \
+ gladesrc.c \
+ eppdiag.c
+
+
+eppdiag_LDADD = \
+ ../main/libinit.a ../main/libresident.a ../main/libresident2.a \
+ $(GTK_LIBS) ../main/libmisc.a $(DIRECTXLIBS)
+
+
+CLEANFILES =
+
+noinst_HEADERS = \
+ gladesrc.h \
+ gladesig.h
+
+
+EXTRA_DIST = eppdiag.glade
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES =
+ at HAVEGTK_TRUE@sbin_PROGRAMS = eppdiag$(EXEEXT)
+ at HAVEGTK_FALSE@sbin_PROGRAMS =
+PROGRAMS = $(sbin_PROGRAMS)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+eppdiag_OBJECTS = gladesrc.$(OBJEXT) eppdiag.$(OBJEXT)
+ at DIRECTX_TRUE@eppdiag_DEPENDENCIES = ../main/libinit.a \
+ at DIRECTX_TRUE@../main/libresident.a ../main/libresident2.a \
+ at DIRECTX_TRUE@../main/libmisc.a
+ at DIRECTX_FALSE@eppdiag_DEPENDENCIES = ../main/libinit.a \
+ at DIRECTX_FALSE@../main/libresident.a ../main/libresident2.a \
+ at DIRECTX_FALSE@../main/libmisc.a
+eppdiag_LDFLAGS =
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+HEADERS = $(noinst_HEADERS)
+
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+SOURCES = $(eppdiag_SOURCES)
+OBJECTS = $(eppdiag_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .obj .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps eppdiag/Makefile
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-sbinPROGRAMS:
+
+clean-sbinPROGRAMS:
+ -test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS)
+
+distclean-sbinPROGRAMS:
+
+maintainer-clean-sbinPROGRAMS:
+
+install-sbinPROGRAMS: $(sbin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(sbindir)
+ @list='$(sbin_PROGRAMS)'; for p in $$list; do \
+ if test -f $$p; then \
+ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ else :; fi; \
+ done
+
+uninstall-sbinPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ list='$(sbin_PROGRAMS)'; for p in $$list; do \
+ rm -f $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ done
+
+.c.o:
+ $(COMPILE) -c $<
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+ $(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+ -rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+eppdiag$(EXEEXT): $(eppdiag_OBJECTS) $(eppdiag_DEPENDENCIES)
+ @rm -f eppdiag$(EXEEXT)
+ $(LINK) $(eppdiag_LDFLAGS) $(eppdiag_OBJECTS) $(eppdiag_LDADD) $(LIBS)
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = eppdiag
+
+distdir: $(DISTFILES)
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+eppdiag.o: eppdiag.c ../config.h ../main/getopt.h ../main/fpga.h \
+ ../main/sysdeps.h ../main/parport.h gladesrc.h gladesig.h
+gladesrc.o: gladesrc.c ../main/getopt.h ../config.h gladesig.h \
+ gladesrc.h
+
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am: install-sbinPROGRAMS
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-sbinPROGRAMS
+uninstall: uninstall-am
+all-am: Makefile $(PROGRAMS) $(HEADERS)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+ $(mkinstalldirs) $(DESTDIR)$(sbindir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-sbinPROGRAMS mostlyclean-compile \
+ mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-sbinPROGRAMS clean-compile clean-tags clean-generic \
+ mostlyclean-am
+
+clean: clean-am
+
+distclean-am: distclean-sbinPROGRAMS distclean-compile distclean-tags \
+ distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-sbinPROGRAMS \
+ maintainer-clean-compile maintainer-clean-tags \
+ maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-sbinPROGRAMS distclean-sbinPROGRAMS \
+clean-sbinPROGRAMS maintainer-clean-sbinPROGRAMS uninstall-sbinPROGRAMS \
+install-sbinPROGRAMS mostlyclean-compile distclean-compile \
+clean-compile maintainer-clean-compile tags mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
+install-exec install-data-am install-data install-am install \
+uninstall-am uninstall all-redirect all-am all installdirs \
+mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/eppdiag/eppdiag.c b/eppdiag/eppdiag.c
new file mode 100644
index 0000000..b7b5ae9
--- /dev/null
+++ b/eppdiag/eppdiag.c
@@ -0,0 +1,341 @@
+/*****************************************************************************/
+
+/*
+ * eppdiag.c -- HDLC packet radio modem for EPP using FPGA GUI tool.
+ *
+ * Copyright (C) 1998, 2000 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <signal.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+
+#include "fpga.h"
+
+#include <gtk/gtk.h>
+#include <glib.h>
+#include "gladesrc.h"
+#include "gladesig.h"
+
+/* ---------------------------------------------------------------------- */
+
+static unsigned verboselevel = 0;
+static int quit = 0;
+static GtkWidget *diag;
+
+/* ---------------------------------------------------------------------- */
+
+int lprintf(unsigned vl, const char *format, ...)
+{
+ char buf[256];
+ va_list ap;
+ int r;
+ char *cp;
+
+#if 0
+ if (vl > verboselevel)
+ return 0;
+#endif
+ va_start(ap, format);
+ r = vsnprintf(buf, sizeof(buf), format, ap);
+ va_end(ap);
+ while (cp = strchr(buf, '\r'))
+ *cp = '\n';
+ gtk_text_insert(GTK_TEXT(gtk_object_get_data(GTK_OBJECT(diag), "textl")), NULL, NULL, NULL, buf, r);
+ return r;
+}
+
+int tprintf(const char *format, ...)
+{
+ char buf[256];
+ va_list ap;
+ int r;
+ char *cp;
+
+ va_start(ap, format);
+ r = vsnprintf(buf, sizeof(buf), format, ap);
+ va_end(ap);
+ while (cp = strchr(buf, '\r'))
+ *cp = '\n';
+ gtk_text_insert(GTK_TEXT(gtk_object_get_data(GTK_OBJECT(diag), "textt")), NULL, NULL, NULL, buf, r);
+ return r;
+}
+
+int idle_callback(unsigned us_delay)
+{
+ while (gtk_events_pending())
+ gtk_main_iteration();
+ if (us_delay)
+ usleep(us_delay);
+ return quit;
+}
+
+void epp_error(const char *msg)
+{
+ lprintf(0, msg);
+ reset_modem();
+ exit(1);
+}
+
+/* ---------------------------------------------------------------------- */
+
+void on_bquit_clicked(GtkButton *button, gpointer user_data)
+{
+ quit = 1;
+ gtk_main_quit();
+}
+
+void on_btest_clicked(GtkButton *button, gpointer user_data)
+{
+ static int test_run = 0;
+ const struct eppfpgatests *tst;
+ struct adapter_config cfg;
+ gchar *cp;
+
+ if (test_run) {
+ quit = 1;
+ return;
+ }
+ cp = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(gtk_object_get_data(GTK_OBJECT(diag), "partest"))->entry));
+ for (tst = eppfpgatests; tst->name && strcmp(cp, tst->name); tst++);
+ if (!tst->name) {
+ g_error("Internal Error: test %s not found\n", cp);
+ return;
+ }
+ /*iobase = strtoul(gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(gtk_object_get_data(GTK_OBJECT(diag), "paraddress"))->entry)), NULL, 0);*/
+ cfg.intclk = GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(diag), "parclk"))->active;
+ cfg.bitrate = strtoul(gtk_entry_get_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(diag), "parbitrate"))), NULL, 0);
+ cfg.fclk = strtoul(gtk_entry_get_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(diag), "parfclk"))), NULL, 0);
+ cfg.extmodem = !GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(diag), "parmodem"))->active;
+ cfg.loopback = GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(diag), "parloopback"))->active;
+ cfg.extstat = GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(diag), "parstat"))->active;
+ cp = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(gtk_object_get_data(GTK_OBJECT(diag), "parfilter"))->entry));
+ switch(cp[0]) {
+ default:
+ cfg.filtmode = 0;
+ break;
+ case 'A':
+ cfg.filtmode = 1;
+ break;
+ case 'L':
+ cfg.filtmode = 2;
+ break;
+ }
+ cfg.gain = 1;
+ test_run = 1;
+ quit = 0;
+ tst->func(&cfg);
+ test_run = 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static void initdiag(void)
+{
+ GList *items = NULL;
+ const struct eppfpgatests *tst;
+
+ diag = create_diag();
+ for (tst = eppfpgatests; tst->name; tst++)
+ items = g_list_append(items, tst->name);
+ gtk_combo_set_popdown_strings(GTK_COMBO(gtk_object_get_data(GTK_OBJECT(diag), "partest")), items);
+ g_list_free(items);
+
+ gtk_widget_show(diag);
+}
+
+/* ---------------------------------------------------------------------- */
+
+int main(int argc, char *argv[])
+{
+ static const struct option long_options[] = {
+#ifdef HAVE_PPUSER
+ { "ppuser", 1, 0, 0x400 },
+ { "ppdev", 1, 0, 0x402 },
+#endif
+#ifdef HAVE_PPKDRV
+ { "ppkdrv", 1, 0, 0x401 },
+#endif
+#ifdef WIN32
+ { "ppgenport", 0, 0, 0x403 },
+ { "ppwin", 1, 0, 0x404 },
+ { "pplpt", 1, 0, 0x404 },
+ { "ppring0", 0, 0, 0x405 },
+#endif
+ { "ppforcehwepp", 0, 0, 0x410 },
+ { "ppswemulepp", 0, 0, 0x411 },
+ { "ppswemulecp", 0, 0, 0x412 },
+ { 0, 0, 0, 0 }
+ };
+ int c, err = 0;
+ unsigned int iobase = 0x378, ntddkgenport = 0, ntdrv = 0, w9xring0 = 0, ppflags = 0;
+ const char *ppuser = NULL, *ppkdrv = NULL, *ppdev = NULL;
+
+ gtk_set_locale();
+ gtk_init(&argc, &argv);
+ while ((c = getopt_long(argc, argv, "vp:", long_options, NULL)) != EOF) {
+ switch (c) {
+ case 0x400:
+ ppuser = optarg;
+ ppkdrv = NULL;
+ ppdev = NULL;
+ ntddkgenport = 0;
+ ntdrv = 0;
+ w9xring0 = 0;
+ break;
+
+ case 0x401:
+ ppkdrv = optarg;
+ ppuser = NULL;
+ ppdev = NULL;
+ ntddkgenport = 0;
+ ntdrv = 0;
+ w9xring0 = 0;
+ break;
+
+ case 0x402:
+ ppkdrv = NULL;
+ ppuser = NULL;
+ ppdev = optarg;
+ ntddkgenport = 0;
+ ntdrv = 0;
+ w9xring0 = 0;
+ break;
+
+ case 0x403:
+ ppkdrv = NULL;
+ ppuser = NULL;
+ ppdev = NULL;
+ ntddkgenport = 1;
+ ntdrv = 0;
+ w9xring0 = 0;
+ break;
+
+ case 0x404:
+ ppkdrv = NULL;
+ ppuser = NULL;
+ ppdev = NULL;
+ ntddkgenport = 0;
+ ntdrv = strtoul(optarg, NULL, 0);
+ w9xring0 = 0;
+ break;
+
+ case 0x405:
+ ppkdrv = NULL;
+ ppuser = NULL;
+ ppdev = NULL;
+ ntddkgenport = 0;
+ ntdrv = 0;
+ w9xring0 = 1;
+ break;
+
+ case 0x410:
+ ppflags |= PPFLAG_FORCEHWEPP;
+ break;
+
+ case 0x411:
+ ppflags |= PPFLAG_SWEMULEPP;
+ break;
+
+ case 0x412:
+ ppflags |= PPFLAG_SWEMULECP;
+ break;
+
+ case 'v':
+ verboselevel++;
+ break;
+
+ case 'p':
+ iobase = strtoul(optarg, NULL, 0);
+ if (iobase <= 0 || iobase >= 0x3f8)
+ err++;
+ break;
+
+ default:
+ err++;
+ break;
+ }
+ }
+ if (err) {
+ lprintf(0, "usage: %s [-v] [-p <portaddr>]\n", argv[0]);
+ exit(1);
+ }
+#ifdef HAVE_PPUSER
+ if (ppkdrv) {
+ if (parport_init_ppkdrv(ppkdrv)) {
+ fprintf(stderr, "no kernel interface %s driver found\n", ppkdrv);
+ exit(1);
+ }
+ } else
+#endif
+#ifdef HAVE_PPUSER
+ if (ppdev) {
+ if (parport_init_ppdev(ppdev)) {
+ fprintf(stderr, "no ppdev driver found at %s\n", ppdev);
+ exit(1);
+ }
+ } else if (ppuser) {
+ if (parport_init_ppuser(ppuser)) {
+ fprintf(stderr, "no ppuser driver found at %s\n", ppuser);
+ exit(1);
+ }
+ } else
+#endif
+#ifdef WIN32
+ if (ntdrv) {
+ if (parport_init_win_flags(ntdrv-1, ppflags)) {
+ fprintf(stderr, "no eppflex.sys/vxd driver found\n");
+ exit(1);
+ }
+ } else if (ntddkgenport) {
+ if (parport_init_ntddkgenport()) {
+ fprintf(stderr, "no NTDDK genport.sys driver found\n");
+ exit(1);
+ }
+ } else if (w9xring0) {
+ if (parport_init_w9xring0_flags(iobase, ppflags)) {
+ fprintf(stderr, "no parport found at 0x%x\n", iobase);
+ exit(1);
+ }
+ } else
+#endif
+ if (parport_init_direct_flags(iobase, ppflags)) {
+ fprintf(stderr, "no parport found at 0x%x\n", iobase);
+ exit(1);
+ }
+ initdiag();
+ gtk_main();
+ exit(0);
+}
diff --git a/eppdiag/eppdiag.glade b/eppdiag/eppdiag.glade
new file mode 100644
index 0000000..316a141
--- /dev/null
+++ b/eppdiag/eppdiag.glade
@@ -0,0 +1,485 @@
+<?xml version="1.0"?>
+<GTK-Interface>
+
+<project>
+ <name>eppdiag</name>
+ <directory></directory>
+ <source_directory></source_directory>
+ <pixmaps_directory>pixmaps</pixmaps_directory>
+ <language>C</language>
+ <gettext_support>False</gettext_support>
+ <use_widget_names>False</use_widget_names>
+ <main_source_file>gladesrc.c</main_source_file>
+ <main_header_file>gladesrc.h</main_header_file>
+ <handler_source_file>gladesig.c</handler_source_file>
+ <handler_header_file>gladesig.h</handler_header_file>
+</project>
+
+<widget>
+ <class>GtkWindow</class>
+ <name>diag</name>
+ <title>EPP FPGA Modem Diagnostics</title>
+ <type>GTK_WINDOW_TOPLEVEL</type>
+ <position>GTK_WIN_POS_NONE</position>
+ <allow_shrink>True</allow_shrink>
+ <allow_grow>True</allow_grow>
+ <auto_shrink>False</auto_shrink>
+
+ <widget>
+ <class>GtkHBox</class>
+ <name>hbox1</name>
+ <homogeneous>False</homogeneous>
+ <spacing>0</spacing>
+
+ <widget>
+ <class>GtkVBox</class>
+ <name>vbox1</name>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ <homogeneous>False</homogeneous>
+ <spacing>0</spacing>
+
+ <widget>
+ <class>GtkTable</class>
+ <name>table1</name>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ <rows>5</rows>
+ <columns>2</columns>
+ <homogeneous>False</homogeneous>
+ <row_spacing>4</row_spacing>
+ <column_spacing>0</column_spacing>
+
+ <widget>
+ <class>GtkLabel</class>
+ <name>label7</name>
+ <child>
+ <left_attach>0</left_attach>
+ <right_attach>1</right_attach>
+ <top_attach>3</top_attach>
+ <bottom_attach>4</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>False</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>False</yfill>
+ </child>
+ <label>Filter</label>
+ <justify>GTK_JUSTIFY_LEFT</justify>
+ <xalign>0.05</xalign>
+ <yalign>0.5</yalign>
+ <xpad>4</xpad>
+ <ypad>0</ypad>
+ </widget>
+
+ <widget>
+ <class>GtkLabel</class>
+ <name>label6</name>
+ <child>
+ <left_attach>0</left_attach>
+ <right_attach>1</right_attach>
+ <top_attach>2</top_attach>
+ <bottom_attach>3</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>False</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>False</yfill>
+ </child>
+ <label>Bitrate</label>
+ <justify>GTK_JUSTIFY_LEFT</justify>
+ <xalign>0.05</xalign>
+ <yalign>0.5</yalign>
+ <xpad>4</xpad>
+ <ypad>0</ypad>
+ </widget>
+
+ <widget>
+ <class>GtkLabel</class>
+ <name>label5</name>
+ <child>
+ <left_attach>0</left_attach>
+ <right_attach>1</right_attach>
+ <top_attach>1</top_attach>
+ <bottom_attach>2</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>False</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>False</yfill>
+ </child>
+ <label>Port Address</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <xalign>0.05</xalign>
+ <yalign>0.5</yalign>
+ <xpad>4</xpad>
+ <ypad>0</ypad>
+ </widget>
+
+ <widget>
+ <class>GtkLabel</class>
+ <name>label4</name>
+ <child>
+ <left_attach>0</left_attach>
+ <right_attach>1</right_attach>
+ <top_attach>0</top_attach>
+ <bottom_attach>1</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>False</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>False</yfill>
+ </child>
+ <label>Test</label>
+ <justify>GTK_JUSTIFY_LEFT</justify>
+ <xalign>0.05</xalign>
+ <yalign>0.5</yalign>
+ <xpad>4</xpad>
+ <ypad>0</ypad>
+ </widget>
+
+ <widget>
+ <class>GtkCombo</class>
+ <name>parfilter</name>
+ <child>
+ <left_attach>1</left_attach>
+ <right_attach>2</right_attach>
+ <top_attach>3</top_attach>
+ <bottom_attach>4</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>False</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>False</yfill>
+ </child>
+ <case_sensitive>False</case_sensitive>
+ <use_arrows>True</use_arrows>
+ <use_arrows_always>True</use_arrows_always>
+ <items>Default
+Analog Filter Eq
+Linear Phase
+</items>
+ </widget>
+
+ <widget>
+ <class>GtkSpinButton</class>
+ <name>parbitrate</name>
+ <child>
+ <left_attach>1</left_attach>
+ <right_attach>2</right_attach>
+ <top_attach>2</top_attach>
+ <bottom_attach>3</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>False</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>False</yfill>
+ </child>
+ <can_focus>True</can_focus>
+ <climb_rate>1</climb_rate>
+ <digits>0</digits>
+ <numeric>False</numeric>
+ <update_policy>GTK_UPDATE_ALWAYS</update_policy>
+ <snap>False</snap>
+ <wrap>False</wrap>
+ <hvalue>9600</hvalue>
+ <hlower>4800</hlower>
+ <hupper>1.5e+06</hupper>
+ <hstep>4800</hstep>
+ <hpage>115200</hpage>
+ <hpage_size>115200</hpage_size>
+ </widget>
+
+ <widget>
+ <class>GtkCombo</class>
+ <name>paraddress</name>
+ <child>
+ <left_attach>1</left_attach>
+ <right_attach>2</right_attach>
+ <top_attach>1</top_attach>
+ <bottom_attach>2</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>False</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>False</yfill>
+ </child>
+ <case_sensitive>False</case_sensitive>
+ <use_arrows>True</use_arrows>
+ <use_arrows_always>False</use_arrows_always>
+ <items>0x378
+0x278
+0x3bc
+</items>
+ </widget>
+
+ <widget>
+ <class>GtkCombo</class>
+ <name>partest</name>
+ <child>
+ <left_attach>1</left_attach>
+ <right_attach>2</right_attach>
+ <top_attach>0</top_attach>
+ <bottom_attach>1</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>False</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>False</yfill>
+ </child>
+ <case_sensitive>False</case_sensitive>
+ <use_arrows>True</use_arrows>
+ <use_arrows_always>True</use_arrows_always>
+ <items></items>
+ </widget>
+
+ <widget>
+ <class>GtkLabel</class>
+ <name>label8</name>
+ <child>
+ <left_attach>0</left_attach>
+ <right_attach>1</right_attach>
+ <top_attach>4</top_attach>
+ <bottom_attach>5</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ <label>FPGA clock</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <xalign>0.05</xalign>
+ <yalign>0.5</yalign>
+ <xpad>4</xpad>
+ <ypad>0</ypad>
+ </widget>
+
+ <widget>
+ <class>GtkSpinButton</class>
+ <name>parfclk</name>
+ <child>
+ <left_attach>1</left_attach>
+ <right_attach>2</right_attach>
+ <top_attach>4</top_attach>
+ <bottom_attach>5</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>False</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>False</yfill>
+ </child>
+ <can_focus>True</can_focus>
+ <climb_rate>1</climb_rate>
+ <digits>0</digits>
+ <numeric>False</numeric>
+ <update_policy>GTK_UPDATE_ALWAYS</update_policy>
+ <snap>False</snap>
+ <wrap>False</wrap>
+ <hvalue>1.96666e+07</hvalue>
+ <hlower>1e+06</hlower>
+ <hupper>2.5e+07</hupper>
+ <hstep>100000</hstep>
+ <hpage>1e+06</hpage>
+ <hpage_size>1e+06</hpage_size>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkCheckButton</class>
+ <name>parclk</name>
+ <child>
+ <padding>2</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ <width>60</width>
+ <can_focus>True</can_focus>
+ <label>Internal Clock</label>
+ <active>False</active>
+ <draw_indicator>True</draw_indicator>
+ </widget>
+
+ <widget>
+ <class>GtkHBox</class>
+ <name>hbox4</name>
+ <child>
+ <padding>2</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ <homogeneous>False</homogeneous>
+ <spacing>0</spacing>
+
+ <widget>
+ <class>GtkCheckButton</class>
+ <name>parmodem</name>
+ <child>
+ <padding>2</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ <can_focus>True</can_focus>
+ <label>Internal Modem</label>
+ <active>True</active>
+ <draw_indicator>True</draw_indicator>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkCheckButton</class>
+ <name>parstat</name>
+ <child>
+ <padding>2</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ <can_focus>True</can_focus>
+ <label>Extended Status</label>
+ <active>True</active>
+ <draw_indicator>True</draw_indicator>
+ </widget>
+
+ <widget>
+ <class>GtkCheckButton</class>
+ <name>parloopback</name>
+ <child>
+ <padding>2</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ <can_focus>True</can_focus>
+ <label>Loopback</label>
+ <active>False</active>
+ <draw_indicator>True</draw_indicator>
+ </widget>
+
+ <widget>
+ <class>GtkHButtonBox</class>
+ <name>hbuttonbox1</name>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ <pack>GTK_PACK_END</pack>
+ </child>
+ <layout_style>GTK_BUTTONBOX_SPREAD</layout_style>
+ <spacing>30</spacing>
+ <child_min_width>85</child_min_width>
+ <child_min_height>27</child_min_height>
+ <child_ipad_x>7</child_ipad_x>
+ <child_ipad_y>0</child_ipad_y>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>bquit</name>
+ <border_width>5</border_width>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>clicked</name>
+ <handler>on_bquit_clicked</handler>
+ <last_modification_time>Tue, 08 Dec 1998 16:48:38 GMT</last_modification_time>
+ </signal>
+ <label>Quit</label>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>btest</name>
+ <can_default>True</can_default>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>clicked</name>
+ <handler>on_btest_clicked</handler>
+ <last_modification_time>Tue, 08 Dec 1998 16:48:28 GMT</last_modification_time>
+ </signal>
+ <label>Test</label>
+ </widget>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkVPaned</class>
+ <name>vpaned1</name>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+ <handle_size>10</handle_size>
+ <gutter_size>15</gutter_size>
+
+ <widget>
+ <class>GtkScrolledWindow</class>
+ <name>scrolledwindow1</name>
+ <hscrollbar_policy>GTK_POLICY_ALWAYS</hscrollbar_policy>
+ <vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
+ <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
+ <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
+
+ <widget>
+ <class>GtkText</class>
+ <name>textl</name>
+ <can_focus>True</can_focus>
+ <editable>False</editable>
+ <text></text>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkScrolledWindow</class>
+ <name>scrolledwindow2</name>
+ <hscrollbar_policy>GTK_POLICY_ALWAYS</hscrollbar_policy>
+ <vscrollbar_policy>GTK_POLICY_ALWAYS</vscrollbar_policy>
+ <hupdate_policy>GTK_UPDATE_CONTINUOUS</hupdate_policy>
+ <vupdate_policy>GTK_UPDATE_CONTINUOUS</vupdate_policy>
+
+ <widget>
+ <class>GtkText</class>
+ <name>textt</name>
+ <can_focus>True</can_focus>
+ <editable>False</editable>
+ <text></text>
+ </widget>
+ </widget>
+ </widget>
+ </widget>
+</widget>
+
+</GTK-Interface>
diff --git a/eppdiag/gladesig.h b/eppdiag/gladesig.h
new file mode 100644
index 0000000..3e58a35
--- /dev/null
+++ b/eppdiag/gladesig.h
@@ -0,0 +1,31 @@
+/* Note: You are free to use whatever license you want.
+ Eventually you will be able to edit it within Glade. */
+
+/* project1
+ * Copyright (C) <YEAR> <AUTHORS>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include <gtk/gtk.h>
+
+
+void
+on_bquit_clicked (GtkButton *button,
+ gpointer user_data);
+
+void
+on_btest_clicked (GtkButton *button,
+ gpointer user_data);
diff --git a/eppdiag/gladesrc.c b/eppdiag/gladesrc.c
new file mode 100644
index 0000000..1f2c0c8
--- /dev/null
+++ b/eppdiag/gladesrc.c
@@ -0,0 +1,379 @@
+/* Note: You are free to use whatever license you want.
+ Eventually you will be able to edit it within Glade. */
+
+/* eppdiag
+ * Copyright (C) <YEAR> <AUTHORS>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
+#include "gladesig.h"
+#include "gladesrc.h"
+
+GtkWidget*
+get_widget (GtkWidget *widget,
+ gchar *widget_name)
+{
+ GtkWidget *parent, *found_widget;
+
+ for (;;)
+ {
+ if (GTK_IS_MENU (widget))
+ parent = gtk_menu_get_attach_widget (GTK_MENU (widget));
+ else
+ parent = widget->parent;
+ if (parent == NULL)
+ break;
+ widget = parent;
+ }
+
+ found_widget = (GtkWidget*) gtk_object_get_data (GTK_OBJECT (widget),
+ widget_name);
+ if (!found_widget)
+ g_warning ("Widget not found: %s", widget_name);
+ return found_widget;
+}
+
+/* This is an internally used function to set notebook tab widgets. */
+void
+set_notebook_tab (GtkWidget *notebook,
+ gint page_num,
+ GtkWidget *widget)
+{
+ GtkNotebookPage *page;
+ GtkWidget *notebook_page;
+
+ page = (GtkNotebookPage*) g_list_nth (GTK_NOTEBOOK (notebook)->children, page_num)->data;
+ notebook_page = page->child;
+ gtk_widget_ref (notebook_page);
+ gtk_notebook_remove_page (GTK_NOTEBOOK (notebook), page_num);
+ gtk_notebook_insert_page (GTK_NOTEBOOK (notebook), notebook_page,
+ widget, page_num);
+ gtk_widget_unref (notebook_page);
+}
+
+static GList *pixmaps_directories = NULL;
+
+/* Use this function to set the directory containing installed pixmaps. */
+void
+add_pixmap_directory (gchar *directory)
+{
+ pixmaps_directories = g_list_prepend (pixmaps_directories, g_strdup (directory));
+}
+
+/* This is an internally used function to check if a pixmap file exists. */
+#ifndef G_DIR_SEPARATOR_S
+#define G_DIR_SEPARATOR_S "/"
+#endif
+gchar*
+check_file_exists (gchar *directory,
+ gchar *filename)
+{
+ gchar *full_filename;
+ struct stat s;
+ gint status;
+
+ full_filename = g_malloc (strlen (directory) + 1 + strlen (filename) + 1);
+ strcpy (full_filename, directory);
+ strcat (full_filename, G_DIR_SEPARATOR_S);
+ strcat (full_filename, filename);
+
+ status = stat (full_filename, &s);
+ if (status == 0 && S_ISREG (s.st_mode))
+ return full_filename;
+ g_free (full_filename);
+ return NULL;
+}
+
+/* This is an internally used function to create pixmaps. */
+GtkWidget*
+create_pixmap (GtkWidget *widget,
+ gchar *filename)
+{
+ gchar *found_filename = NULL;
+ GdkColormap *colormap;
+ GdkPixmap *gdkpixmap;
+ GdkBitmap *mask;
+ GtkWidget *pixmap;
+ GList *elem;
+
+ /* We first try any pixmaps directories set by the application. */
+ elem = pixmaps_directories;
+ while (elem)
+ {
+ found_filename = check_file_exists ((gchar*)elem->data, filename);
+ if (found_filename)
+ break;
+ elem = elem->next;
+ }
+
+ /* If we haven't found the pixmap, try the source directory. */
+ if (!found_filename)
+ {
+ found_filename = check_file_exists ("pixmaps", filename);
+ }
+
+ if (!found_filename)
+ {
+ g_print ("Couldn't find pixmap file: %s", filename);
+ return NULL;
+ }
+
+ colormap = gtk_widget_get_colormap (widget);
+ gdkpixmap = gdk_pixmap_colormap_create_from_xpm (NULL, colormap, &mask,
+ NULL, found_filename);
+ g_free (found_filename);
+ if (gdkpixmap == NULL)
+ return NULL;
+ pixmap = gtk_pixmap_new (gdkpixmap, mask);
+ gdk_pixmap_unref (gdkpixmap);
+ gdk_bitmap_unref (mask);
+ return pixmap;
+}
+
+GtkWidget*
+create_diag ()
+{
+ GtkWidget *diag;
+ GtkWidget *hbox1;
+ GtkWidget *vbox1;
+ GtkWidget *table1;
+ GtkWidget *label7;
+ GtkWidget *label6;
+ GtkWidget *label5;
+ GtkWidget *label4;
+ GtkWidget *parfilter;
+ GList *parfilter_items = NULL;
+ GtkObject *parbitrate_adj;
+ GtkWidget *parbitrate;
+ GtkWidget *paraddress;
+ GList *paraddress_items = NULL;
+ GtkWidget *partest;
+ GtkWidget *label8;
+ GtkObject *parfclk_adj;
+ GtkWidget *parfclk;
+ GtkWidget *parclk;
+ GtkWidget *hbox4;
+ GtkWidget *parmodem;
+ GtkWidget *parstat;
+ GtkWidget *parloopback;
+ GtkWidget *hbuttonbox1;
+ GtkWidget *bquit;
+ GtkWidget *btest;
+ GtkWidget *vpaned1;
+ GtkWidget *scrolledwindow1;
+ GtkWidget *textl;
+ GtkWidget *scrolledwindow2;
+ GtkWidget *textt;
+
+ diag = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_object_set_data (GTK_OBJECT (diag), "diag", diag);
+ gtk_window_set_title (GTK_WINDOW (diag), "EPP FPGA Modem Diagnostics");
+ gtk_window_set_policy (GTK_WINDOW (diag), TRUE, TRUE, FALSE);
+
+ hbox1 = gtk_hbox_new (FALSE, 0);
+ gtk_object_set_data (GTK_OBJECT (diag), "hbox1", hbox1);
+ gtk_widget_show (hbox1);
+ gtk_container_add (GTK_CONTAINER (diag), hbox1);
+
+ vbox1 = gtk_vbox_new (FALSE, 0);
+ gtk_object_set_data (GTK_OBJECT (diag), "vbox1", vbox1);
+ gtk_widget_show (vbox1);
+ gtk_box_pack_start (GTK_BOX (hbox1), vbox1, FALSE, FALSE, 0);
+
+ table1 = gtk_table_new (5, 2, FALSE);
+ gtk_object_set_data (GTK_OBJECT (diag), "table1", table1);
+ gtk_widget_show (table1);
+ gtk_box_pack_start (GTK_BOX (vbox1), table1, FALSE, FALSE, 0);
+ gtk_table_set_row_spacings (GTK_TABLE (table1), 4);
+
+ label7 = gtk_label_new ("Filter");
+ gtk_object_set_data (GTK_OBJECT (diag), "label7", label7);
+ gtk_widget_show (label7);
+ gtk_table_attach (GTK_TABLE (table1), label7, 0, 1, 3, 4,
+ (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0, 0, 0);
+ gtk_label_set_justify (GTK_LABEL (label7), GTK_JUSTIFY_LEFT);
+ gtk_misc_set_alignment (GTK_MISC (label7), 0.05, 0.5);
+ gtk_misc_set_padding (GTK_MISC (label7), 4, 0);
+
+ label6 = gtk_label_new ("Bitrate");
+ gtk_object_set_data (GTK_OBJECT (diag), "label6", label6);
+ gtk_widget_show (label6);
+ gtk_table_attach (GTK_TABLE (table1), label6, 0, 1, 2, 3,
+ (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0, 0, 0);
+ gtk_label_set_justify (GTK_LABEL (label6), GTK_JUSTIFY_LEFT);
+ gtk_misc_set_alignment (GTK_MISC (label6), 0.05, 0.5);
+ gtk_misc_set_padding (GTK_MISC (label6), 4, 0);
+
+ label5 = gtk_label_new ("Port Address");
+ gtk_object_set_data (GTK_OBJECT (diag), "label5", label5);
+ gtk_widget_show (label5);
+ gtk_table_attach (GTK_TABLE (table1), label5, 0, 1, 1, 2,
+ (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0, 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label5), 0.05, 0.5);
+ gtk_misc_set_padding (GTK_MISC (label5), 4, 0);
+
+ label4 = gtk_label_new ("Test");
+ gtk_object_set_data (GTK_OBJECT (diag), "label4", label4);
+ gtk_widget_show (label4);
+ gtk_table_attach (GTK_TABLE (table1), label4, 0, 1, 0, 1,
+ (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0, 0, 0);
+ gtk_label_set_justify (GTK_LABEL (label4), GTK_JUSTIFY_LEFT);
+ gtk_misc_set_alignment (GTK_MISC (label4), 0.05, 0.5);
+ gtk_misc_set_padding (GTK_MISC (label4), 4, 0);
+
+ parfilter = gtk_combo_new ();
+ gtk_object_set_data (GTK_OBJECT (diag), "parfilter", parfilter);
+ gtk_widget_show (parfilter);
+ gtk_table_attach (GTK_TABLE (table1), parfilter, 1, 2, 3, 4,
+ (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0, 0, 0);
+ gtk_combo_set_use_arrows_always (GTK_COMBO (parfilter), TRUE);
+ parfilter_items = g_list_append (parfilter_items, "Default");
+ parfilter_items = g_list_append (parfilter_items, "Analog Filter Eq");
+ parfilter_items = g_list_append (parfilter_items, "Linear Phase");
+ gtk_combo_set_popdown_strings (GTK_COMBO (parfilter), parfilter_items);
+ g_list_free (parfilter_items);
+
+ parbitrate_adj = gtk_adjustment_new (9600, 4800, 1.5e+06, 4800, 115200, 115200);
+ parbitrate = gtk_spin_button_new (GTK_ADJUSTMENT (parbitrate_adj), 1, 0);
+ gtk_object_set_data (GTK_OBJECT (diag), "parbitrate", parbitrate);
+ gtk_widget_show (parbitrate);
+ gtk_table_attach (GTK_TABLE (table1), parbitrate, 1, 2, 2, 3,
+ (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0, 0, 0);
+
+ paraddress = gtk_combo_new ();
+ gtk_object_set_data (GTK_OBJECT (diag), "paraddress", paraddress);
+ gtk_widget_show (paraddress);
+ gtk_table_attach (GTK_TABLE (table1), paraddress, 1, 2, 1, 2,
+ (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0, 0, 0);
+ paraddress_items = g_list_append (paraddress_items, "0x378");
+ paraddress_items = g_list_append (paraddress_items, "0x278");
+ paraddress_items = g_list_append (paraddress_items, "0x3bc");
+ gtk_combo_set_popdown_strings (GTK_COMBO (paraddress), paraddress_items);
+ g_list_free (paraddress_items);
+
+ partest = gtk_combo_new ();
+ gtk_object_set_data (GTK_OBJECT (diag), "partest", partest);
+ gtk_widget_show (partest);
+ gtk_table_attach (GTK_TABLE (table1), partest, 1, 2, 0, 1,
+ (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0, 0, 0);
+ gtk_combo_set_use_arrows_always (GTK_COMBO (partest), TRUE);
+
+ label8 = gtk_label_new ("FPGA clock");
+ gtk_object_set_data (GTK_OBJECT (diag), "label8", label8);
+ gtk_widget_show (label8);
+ gtk_table_attach (GTK_TABLE (table1), label8, 0, 1, 4, 5,
+ (GtkAttachOptions) GTK_EXPAND | GTK_FILL, (GtkAttachOptions) GTK_EXPAND | GTK_FILL, 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label8), 0.05, 0.5);
+ gtk_misc_set_padding (GTK_MISC (label8), 4, 0);
+
+ parfclk_adj = gtk_adjustment_new (1.96666e+07, 1e+06, 2.5e+07, 100000, 1e+06, 1e+06);
+ parfclk = gtk_spin_button_new (GTK_ADJUSTMENT (parfclk_adj), 1, 0);
+ gtk_object_set_data (GTK_OBJECT (diag), "parfclk", parfclk);
+ gtk_widget_show (parfclk);
+ gtk_table_attach (GTK_TABLE (table1), parfclk, 1, 2, 4, 5,
+ (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0, 0, 0);
+
+ parclk = gtk_check_button_new_with_label ("Internal Clock");
+ gtk_object_set_data (GTK_OBJECT (diag), "parclk", parclk);
+ gtk_widget_show (parclk);
+ gtk_box_pack_start (GTK_BOX (vbox1), parclk, FALSE, FALSE, 2);
+ gtk_widget_set_usize (parclk, 60, -2);
+
+ hbox4 = gtk_hbox_new (FALSE, 0);
+ gtk_object_set_data (GTK_OBJECT (diag), "hbox4", hbox4);
+ gtk_widget_show (hbox4);
+ gtk_box_pack_start (GTK_BOX (vbox1), hbox4, FALSE, FALSE, 2);
+
+ parmodem = gtk_check_button_new_with_label ("Internal Modem");
+ gtk_object_set_data (GTK_OBJECT (diag), "parmodem", parmodem);
+ gtk_widget_show (parmodem);
+ gtk_box_pack_start (GTK_BOX (hbox4), parmodem, FALSE, FALSE, 2);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (parmodem), TRUE);
+
+ parstat = gtk_check_button_new_with_label ("Extended Status");
+ gtk_object_set_data (GTK_OBJECT (diag), "parstat", parstat);
+ gtk_widget_show (parstat);
+ gtk_box_pack_start (GTK_BOX (vbox1), parstat, FALSE, FALSE, 2);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (parstat), TRUE);
+
+ parloopback = gtk_check_button_new_with_label ("Loopback");
+ gtk_object_set_data (GTK_OBJECT (diag), "parloopback", parloopback);
+ gtk_widget_show (parloopback);
+ gtk_box_pack_start (GTK_BOX (vbox1), parloopback, FALSE, FALSE, 2);
+
+ hbuttonbox1 = gtk_hbutton_box_new ();
+ gtk_object_set_data (GTK_OBJECT (diag), "hbuttonbox1", hbuttonbox1);
+ gtk_widget_show (hbuttonbox1);
+ gtk_box_pack_end (GTK_BOX (vbox1), hbuttonbox1, FALSE, FALSE, 0);
+ gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox1), GTK_BUTTONBOX_SPREAD);
+
+ bquit = gtk_button_new_with_label ("Quit");
+ gtk_object_set_data (GTK_OBJECT (diag), "bquit", bquit);
+ gtk_widget_show (bquit);
+ gtk_container_add (GTK_CONTAINER (hbuttonbox1), bquit);
+ gtk_container_border_width (GTK_CONTAINER (bquit), 5);
+ gtk_signal_connect (GTK_OBJECT (bquit), "clicked",
+ GTK_SIGNAL_FUNC (on_bquit_clicked),
+ NULL);
+
+ btest = gtk_button_new_with_label ("Test");
+ gtk_object_set_data (GTK_OBJECT (diag), "btest", btest);
+ gtk_widget_show (btest);
+ gtk_container_add (GTK_CONTAINER (hbuttonbox1), btest);
+ GTK_WIDGET_SET_FLAGS (btest, GTK_CAN_DEFAULT);
+ gtk_signal_connect (GTK_OBJECT (btest), "clicked",
+ GTK_SIGNAL_FUNC (on_btest_clicked),
+ NULL);
+
+ vpaned1 = gtk_vpaned_new ();
+ gtk_object_set_data (GTK_OBJECT (diag), "vpaned1", vpaned1);
+ gtk_widget_show (vpaned1);
+ gtk_box_pack_start (GTK_BOX (hbox1), vpaned1, TRUE, TRUE, 0);
+ gtk_paned_gutter_size (GTK_PANED (vpaned1), 15);
+
+ scrolledwindow1 = gtk_scrolled_window_new (NULL, NULL);
+ gtk_object_set_data (GTK_OBJECT (diag), "scrolledwindow1", scrolledwindow1);
+ gtk_widget_show (scrolledwindow1);
+ gtk_container_add (GTK_CONTAINER (vpaned1), scrolledwindow1);
+
+ textl = gtk_text_new (NULL, NULL);
+ gtk_object_set_data (GTK_OBJECT (diag), "textl", textl);
+ gtk_widget_show (textl);
+ gtk_container_add (GTK_CONTAINER (scrolledwindow1), textl);
+
+ scrolledwindow2 = gtk_scrolled_window_new (NULL, NULL);
+ gtk_object_set_data (GTK_OBJECT (diag), "scrolledwindow2", scrolledwindow2);
+ gtk_widget_show (scrolledwindow2);
+ gtk_container_add (GTK_CONTAINER (vpaned1), scrolledwindow2);
+
+ textt = gtk_text_new (NULL, NULL);
+ gtk_object_set_data (GTK_OBJECT (diag), "textt", textt);
+ gtk_widget_show (textt);
+ gtk_container_add (GTK_CONTAINER (scrolledwindow2), textt);
+
+ return diag;
+}
+
diff --git a/eppdiag/gladesrc.h b/eppdiag/gladesrc.h
new file mode 100644
index 0000000..20c713a
--- /dev/null
+++ b/eppdiag/gladesrc.h
@@ -0,0 +1,53 @@
+/* Note: You are free to use whatever license you want.
+ Eventually you will be able to edit it within Glade. */
+
+/* eppdiag
+ * Copyright (C) <YEAR> <AUTHORS>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#include <gtk/gtk.h>
+
+/*
+ * This function returns a widget in a component created by Glade.
+ * Call it with the toplevel widget in the component (i.e. a window/dialog),
+ * or alternatively any widget in the component, and the name of the widget
+ * you want returned.
+ */
+GtkWidget*
+get_widget (GtkWidget *widget,
+ gchar *widget_name);
+
+
+ /*
+ * This is an internally used function for setting notebook tabs. It is only
+ * included in this header file so you don't get compilation warnings
+ */
+void
+set_notebook_tab (GtkWidget *notebook,
+ gint page_num,
+ GtkWidget *widget);
+
+/* Use this function to set the directory containing installed pixmaps. */
+void
+add_pixmap_directory (gchar *directory);
+
+/* This is an internally used function to create pixmaps. */
+GtkWidget*
+create_pixmap (GtkWidget *widget,
+ gchar *filename);
+
+GtkWidget* create_diag (void);
diff --git a/eppfm/Makefile.am b/eppfm/Makefile.am
new file mode 100644
index 0000000..5168e8e
--- /dev/null
+++ b/eppfm/Makefile.am
@@ -0,0 +1,44 @@
+## Process this file with automake to produce Makefile.in
+
+INCLUDES = $(GTK_CFLAGS) -I$(top_srcdir)/main \
+ -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" \
+ -I$(top_srcdir)/directx/include -I$(top_srcdir)/directx/include/directx6
+
+if DIRECTX
+DIRECTXLIBS = -L$(top_builddir)/directx -ldsound -luser32 -lgdi32
+else
+DIRECTXLIBS =
+endif
+
+if HAVEGTK
+
+bin_PROGRAMS = eppfm
+
+endif
+
+EXTRA_DIST = costab.c gentbl.c
+
+if CROSSCOMP
+else
+
+gentbl_SOURCES = gentbl.c
+
+BUILT_SOURCES = costab.c
+
+noinst_PROGRAMS = gentbl
+
+$(srcdir)/costab.c: gentbl
+ ./gentbl $(srcdir)/costab.c
+
+endif
+
+eppfm_SOURCES = \
+ main.c audio.c eppfm.h costab.c \
+ support.c support.h \
+ interface.c interface.h \
+ callbacks.c callbacks.h
+
+eppfm_LDADD = \
+ $(top_builddir)/main/libinit.a $(top_builddir)/main/libresident.a \
+ $(GTK_LIBS) $(top_builddir)/main/libmisc.a $(DIRECTXLIBS)
+
diff --git a/eppfm/Makefile.in b/eppfm/Makefile.in
new file mode 100644
index 0000000..5f7cbe5
--- /dev/null
+++ b/eppfm/Makefile.in
@@ -0,0 +1,398 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AS = @AS@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+DATADIRNAME = @DATADIRNAME@
+DLLTOOL = @DLLTOOL@
+DRVLIBOBJS = @DRVLIBOBJS@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+HAVE_BITTYPES = @HAVE_BITTYPES@
+HAVE_DIRECTX = @HAVE_DIRECTX@
+HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@
+HAVE_IOFUNCS = @HAVE_IOFUNCS@
+HAVE_LIB = @HAVE_LIB@
+HAVE_MKISS = @HAVE_MKISS@
+HAVE_PPKDRV = @HAVE_PPKDRV@
+HAVE_PPUSER = @HAVE_PPUSER@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LIB = @LIB@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LTLIB = @LTLIB@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+M_PI = @M_PI@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+
+INCLUDES = $(GTK_CFLAGS) -I$(top_srcdir)/main \
+ -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" \
+ -I$(top_srcdir)/directx/include -I$(top_srcdir)/directx/include/directx6
+
+ at DIRECTX_TRUE@DIRECTXLIBS = @DIRECTX_TRUE at -L$(top_builddir)/directx -ldsound -luser32 -lgdi32
+ at DIRECTX_FALSE@DIRECTXLIBS =
+
+ at HAVEGTK_TRUE@bin_PROGRAMS = @HAVEGTK_TRUE at eppfm
+
+EXTRA_DIST = costab.c gentbl.c
+
+ at CROSSCOMP_FALSE@gentbl_SOURCES = @CROSSCOMP_FALSE at gentbl.c
+
+ at CROSSCOMP_FALSE@BUILT_SOURCES = @CROSSCOMP_FALSE at costab.c
+
+ at CROSSCOMP_FALSE@noinst_PROGRAMS = @CROSSCOMP_FALSE at gentbl
+
+eppfm_SOURCES = \
+ main.c audio.c eppfm.h costab.c \
+ support.c support.h \
+ interface.c interface.h \
+ callbacks.c callbacks.h
+
+
+eppfm_LDADD = \
+ $(top_builddir)/main/libinit.a $(top_builddir)/main/libresident.a \
+ $(GTK_LIBS) $(top_builddir)/main/libmisc.a $(DIRECTXLIBS)
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES =
+ at HAVEGTK_TRUE@bin_PROGRAMS = eppfm$(EXEEXT)
+ at CROSSCOMP_FALSE@noinst_PROGRAMS = gentbl$(EXEEXT)
+PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+eppfm_OBJECTS = main.$(OBJEXT) audio.$(OBJEXT) costab.$(OBJEXT) \
+support.$(OBJEXT) interface.$(OBJEXT) callbacks.$(OBJEXT)
+ at DIRECTX_TRUE@eppfm_DEPENDENCIES = $(top_builddir)/main/libinit.a \
+ at DIRECTX_TRUE@$(top_builddir)/main/libresident.a \
+ at DIRECTX_TRUE@$(top_builddir)/main/libmisc.a
+ at DIRECTX_FALSE@eppfm_DEPENDENCIES = $(top_builddir)/main/libinit.a \
+ at DIRECTX_FALSE@$(top_builddir)/main/libresident.a \
+ at DIRECTX_FALSE@$(top_builddir)/main/libmisc.a
+eppfm_LDFLAGS =
+ at CROSSCOMP_FALSE@gentbl_OBJECTS = gentbl.$(OBJEXT)
+gentbl_LDADD = $(LDADD)
+gentbl_DEPENDENCIES =
+gentbl_LDFLAGS =
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+SOURCES = $(eppfm_SOURCES) $(gentbl_SOURCES)
+OBJECTS = $(eppfm_OBJECTS) $(gentbl_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .obj .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps eppfm/Makefile
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-binPROGRAMS:
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+
+distclean-binPROGRAMS:
+
+maintainer-clean-binPROGRAMS:
+
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(bindir)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ if test -f $$p; then \
+ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ list='$(bin_PROGRAMS)'; for p in $$list; do \
+ rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ done
+
+mostlyclean-noinstPROGRAMS:
+
+clean-noinstPROGRAMS:
+ -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
+
+distclean-noinstPROGRAMS:
+
+maintainer-clean-noinstPROGRAMS:
+
+.c.o:
+ $(COMPILE) -c $<
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+ $(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+ -rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+eppfm$(EXEEXT): $(eppfm_OBJECTS) $(eppfm_DEPENDENCIES)
+ @rm -f eppfm$(EXEEXT)
+ $(LINK) $(eppfm_LDFLAGS) $(eppfm_OBJECTS) $(eppfm_LDADD) $(LIBS)
+
+gentbl$(EXEEXT): $(gentbl_OBJECTS) $(gentbl_DEPENDENCIES)
+ @rm -f gentbl$(EXEEXT)
+ $(LINK) $(gentbl_LDFLAGS) $(gentbl_OBJECTS) $(gentbl_LDADD) $(LIBS)
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = eppfm
+
+distdir: $(DISTFILES)
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+audio.o: audio.c ../config.h ../main/getopt.h eppfm.h ../main/fpga.h \
+ ../main/sysdeps.h ../main/parport.h
+callbacks.o: callbacks.c ../config.h eppfm.h ../main/fpga.h \
+ ../main/sysdeps.h ../main/getopt.h ../main/parport.h \
+ callbacks.h interface.h support.h
+costab.o: costab.c eppfm.h ../main/fpga.h ../main/sysdeps.h ../config.h \
+ ../main/getopt.h ../main/parport.h
+gentbl.o: gentbl.c
+interface.o: interface.c ../config.h ../main/getopt.h callbacks.h \
+ interface.h support.h
+main.o: main.c ../config.h ../main/getopt.h eppfm.h ../main/fpga.h \
+ ../main/sysdeps.h ../main/parport.h interface.h support.h
+support.o: support.c ../config.h ../main/getopt.h support.h
+
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am: install-binPROGRAMS
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-binPROGRAMS
+uninstall: uninstall-am
+all-am: Makefile $(PROGRAMS)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+ $(mkinstalldirs) $(DESTDIR)$(bindir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+ -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+mostlyclean-am: mostlyclean-binPROGRAMS mostlyclean-noinstPROGRAMS \
+ mostlyclean-compile mostlyclean-tags \
+ mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-binPROGRAMS clean-noinstPROGRAMS clean-compile \
+ clean-tags clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am: distclean-binPROGRAMS distclean-noinstPROGRAMS \
+ distclean-compile distclean-tags distclean-generic \
+ clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-binPROGRAMS \
+ maintainer-clean-noinstPROGRAMS \
+ maintainer-clean-compile maintainer-clean-tags \
+ maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \
+maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
+mostlyclean-noinstPROGRAMS distclean-noinstPROGRAMS \
+clean-noinstPROGRAMS maintainer-clean-noinstPROGRAMS \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile tags mostlyclean-tags distclean-tags \
+clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
+check-am installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+ at CROSSCOMP_FALSE@$(srcdir)/costab.c: gentbl
+ at CROSSCOMP_FALSE@ ./gentbl $(srcdir)/costab.c
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/eppfm/audio.c b/eppfm/audio.c
new file mode 100644
index 0000000..fabd86a
--- /dev/null
+++ b/eppfm/audio.c
@@ -0,0 +1,946 @@
+/*****************************************************************************/
+
+/*
+ * audio.c -- Audio processing for "virtual transceiver".
+ *
+ * Copyright (C) 1999-2000 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/types.h>
+
+#define G_LOG_DOMAIN "eppfm"
+
+#ifdef HAVE_LINUX_SOUNDCARD_H
+#include <linux/soundcard.h>
+#include <sys/stat.h>
+#include <sys/uio.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+#endif
+
+#ifdef HAVE_DIRECTX
+#include <directx.h>
+#endif
+
+#include "eppfm.h"
+
+#include <gtk/gtk.h>
+#include <glib.h>
+
+struct {
+ /* gtk timeout handle */
+ gint tmotag;
+ /* sampling rate conversion state */
+ unsigned phinceppdsp, phincdspepp, pheppdsp, phdspepp;
+ /* ptt state */
+ unsigned ptt_state;
+ /* control register */
+ unsigned char ctrlreg;
+ /* led blink counter */
+ unsigned ledcnt;
+ /* level counter */
+ unsigned lvlicnt, lvliaccum, lvli, lvlocnt, lvloaccum, lvlo;
+ /* frequency generators */
+ unsigned phase0, phase1, phase2, phase3;
+ unsigned freq0, freq1, freq2, freq3;
+
+ /* low level driver specific data */
+
+#ifdef HAVE_LINUX_SOUNDCARD_H
+ int fddsp;
+#endif
+#ifdef HAVE_DIRECTX
+ LPDIRECTSOUND dsplay;
+ LPDIRECTSOUNDCAPTURE dsrec;
+ LPDIRECTSOUNDBUFFER playbuf;
+ LPDIRECTSOUNDCAPTUREBUFFER recbuf;
+ HANDLE hinst;
+ HWND hwnd;
+ DWORD playbufsz, recbufsz, playptr, recptr;
+#endif
+
+} state;
+
+#define SNDLATENCY 4000 /* approx 1/2 seconds */
+#define BUFSIZE 8192 /* must be significantly bigger than SNDLATENCY! */
+#define PHASEFRAC 12
+
+/* ---------------------------------------------------------------------- */
+
+void audio_ptt(int ptt)
+{
+ if (ptt)
+ state.ptt_state |= 1;
+ else
+ state.ptt_state &= ~1;
+}
+
+void audio_1750(int on)
+{
+ if (on) {
+ state.freq2 = (1750*65536+8000/2)/8000;
+ } else {
+ state.freq2 = 0;
+ state.phase2 = 0x4000;
+ }
+}
+
+/*
+ *
+ * DTMF frequencies
+ *
+ * 1209 1336 1477 1633
+ * 697 1 2 3 A
+ * 770 4 5 6 B
+ * 852 7 8 9 C
+ * 941 * 0 # D
+ *
+ */
+
+void audio_dtmf(int ch)
+{
+ switch (ch) {
+ case 0:
+ state.freq0 = (1336*65536+8000/2)/8000;
+ state.freq1 = (941*65536+8000/2)/8000;
+ break;
+
+ case 1:
+ state.freq0 = (1209*65536+8000/2)/8000;
+ state.freq1 = (697*65536+8000/2)/8000;
+ break;
+
+ case 2:
+ state.freq0 = (1336*65536+8000/2)/8000;
+ state.freq1 = (697*65536+8000/2)/8000;
+ break;
+
+ case 3:
+ state.freq0 = (1477*65536+8000/2)/8000;
+ state.freq1 = (697*65536+8000/2)/8000;
+ break;
+
+ case 4:
+ state.freq0 = (1209*65536+8000/2)/8000;
+ state.freq1 = (770*65536+8000/2)/8000;
+ break;
+
+ case 5:
+ state.freq0 = (1336*65536+8000/2)/8000;
+ state.freq1 = (770*65536+8000/2)/8000;
+ break;
+
+ case 6:
+ state.freq0 = (1477*65536+8000/2)/8000;
+ state.freq1 = (770*65536+8000/2)/8000;
+ break;
+
+ case 7:
+ state.freq0 = (1209*65536+8000/2)/8000;
+ state.freq1 = (852*65536+8000/2)/8000;
+ break;
+
+ case 8:
+ state.freq0 = (1336*65536+8000/2)/8000;
+ state.freq1 = (852*65536+8000/2)/8000;
+ break;
+
+ case 9:
+ state.freq0 = (1477*65536+8000/2)/8000;
+ state.freq1 = (852*65536+8000/2)/8000;
+ break;
+
+ case 10:
+ state.freq0 = (1633*65536+8000/2)/8000;
+ state.freq1 = (697*65536+8000/2)/8000;
+ break;
+
+ case 11:
+ state.freq0 = (1633*65536+8000/2)/8000;
+ state.freq1 = (770*65536+8000/2)/8000;
+ break;
+
+ case 12:
+ state.freq0 = (1633*65536+8000/2)/8000;
+ state.freq1 = (852*65536+8000/2)/8000;
+ break;
+
+ case 13:
+ state.freq0 = (1633*65536+8000/2)/8000;
+ state.freq1 = (941*65536+8000/2)/8000;
+ break;
+
+ case 14:
+ state.freq0 = (1209*65536+8000/2)/8000;
+ state.freq1 = (941*65536+8000/2)/8000;
+ break;
+
+ case 15:
+ state.freq0 = (1477*65536+8000/2)/8000;
+ state.freq1 = (941*65536+8000/2)/8000;
+ break;
+
+ default:
+ state.freq0 = state.freq1 = 0;
+ state.phase0 = state.phase1 = 0x4000;
+ break;
+ }
+}
+
+unsigned audio_getilevel(void)
+{
+ return state.lvli;
+}
+
+unsigned audio_getolevel(void)
+{
+ return state.lvlo;
+}
+
+/* ---------------------------------------------------------------------- */
+
+#define LEVELACCUM 2048
+
+static void process_input(int16_t *buf, unsigned cnt)
+{
+ unsigned i;
+
+ for (i = 0; i < cnt; i++) {
+ state.lvliaccum += ((int)buf[i] * (int)buf[i]) >> 16;
+ if ((++state.lvlicnt) >= LEVELACCUM) {
+ state.lvli = state.lvliaccum / LEVELACCUM;
+ state.lvlicnt = state.lvliaccum = 0;
+ }
+ }
+}
+
+static void process_output(int16_t *buf, unsigned cnt)
+{
+ unsigned i;
+ int acc;
+
+ for (i = 0; i < cnt; i++) {
+ acc = buf[i];
+ state.lvloaccum += (acc * acc) >> 16;
+ if ((++state.lvlocnt) >= LEVELACCUM) {
+ state.lvlo = state.lvloaccum / LEVELACCUM;
+ state.lvlocnt = state.lvloaccum = 0;
+ }
+ acc += (SIN(state.phase0) + SIN(state.phase1) + SIN(state.phase2) + SIN(state.phase3)) >> 1;
+ if (acc > 32767)
+ acc = 32767;
+ else if (acc < -32768)
+ acc = -32768;
+ buf[i] = acc;
+ state.phase0 += state.freq0;
+ state.phase1 += state.freq1;
+ state.phase2 += state.freq2;
+ state.phase3 += state.freq3;
+ }
+}
+
+static void initstate(void)
+{
+ state.pheppdsp = 0;
+ state.phdspepp = 0;
+ state.ptt_state = 0;
+ state.ctrlreg = 0;
+ state.ledcnt = 0;
+ state.lvlicnt = state.lvliaccum = state.lvli = 0;
+ state.lvlocnt = state.lvloaccum = state.lvlo = 0;
+ state.phase0 = state.phase1 = state.phase2 = state.phase3 = 0x4000;
+ state.freq0 = state.freq1 = state.freq2 = state.freq3 = 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+#ifdef HAVE_LINUX_SOUNDCARD_H
+
+void audio_stop(void)
+{
+ if (state.fddsp != -1) {
+ gtk_timeout_remove(state.tmotag);
+ close(state.fddsp);
+ state.fddsp = -1;
+ reset_modem();
+ }
+}
+
+static gint periodic(gpointer data)
+{
+ union {
+ unsigned char u[BUFSIZE];
+ signed char s[BUFSIZE];
+ } buf;
+ int16_t sbuf[BUFSIZE];
+ int apar, i, icnt, ocnt, cnt, ocnts, omax;
+
+ /* first do the epp->dsp direction */
+ /* get FIFO count */
+ buf.u[0] = state.ctrlreg | 1;
+ if (parport_epp_write_addr(buf.u, 1) != 1)
+ goto err;
+ if (parport_epp_read_addr(buf.u, 2) != 2)
+ goto err;
+ icnt = buf.u[0] | (((unsigned int)buf.u[1]) << 8);
+ buf.u[0] = state.ctrlreg;
+ if (parport_epp_write_addr(buf.u, 1) != 1)
+ goto err;
+ icnt &= 0x7fff;
+ if (icnt > 0) {
+ if (icnt > BUFSIZE/2)
+ icnt = BUFSIZE/2;
+ if (parport_epp_read_data(buf.s, icnt) != icnt)
+ goto err;
+ state.pheppdsp &= 0xff;
+ cnt = 0;
+ while (state.pheppdsp < (icnt << PHASEFRAC)) {
+ sbuf[cnt] = buf.s[state.pheppdsp >> PHASEFRAC] << 8;
+ state.pheppdsp += state.phinceppdsp;
+ cnt++;
+ }
+ process_input(sbuf, cnt);
+ if ((i = write(state.fddsp, sbuf, 2*cnt)) != 2*cnt) {
+ lprintf(0, "write(%d) failed %i (%s)\n", 2*cnt, i, strerror(errno));
+ goto err;
+ }
+ if (ioctl(state.fddsp, SNDCTL_DSP_GETODELAY, &apar) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_GETODELAY failed (%s)\n", strerror(errno));
+ goto err;
+ }
+ apar >>= 1;
+ /* adjust speed */
+ lprintf(4, "icnt %d cnt %d odel %d\n", icnt, cnt, apar);
+ if (apar > SNDLATENCY)
+ state.phinceppdsp++;
+ else if (apar < SNDLATENCY)
+ state.phinceppdsp--;
+ if (state.phinceppdsp < (0x9 << (PHASEFRAC-4)) || state.phinceppdsp > (0x1f << (PHASEFRAC-4))) {
+ lprintf(0, "phinceppdsp (0x%05x) out of range\n", state.phinceppdsp);
+ goto err;
+ }
+ /* play games with the LEDS */
+ state.ledcnt += icnt;
+ if (state.ledcnt >= 4000) {
+ state.ledcnt %= 4000;
+ state.ctrlreg += 0x40;
+ }
+ }
+ /* next do the dsp->epp direction */
+ /* read sound */
+ ocnts = read(state.fddsp, sbuf, 2*BUFSIZE/2);
+ if (ocnts == -1 && errno == EAGAIN)
+ ocnts = 0;
+ if (ocnts < 0) {
+ lprintf(0, "read(%d) failed %i (%s)\n", 2*BUFSIZE/2, ocnts, strerror(errno));
+ goto err;
+ }
+ ocnts >>= 1;
+ process_output(sbuf, ocnts);
+ if (state.ptt_state == 2) {
+ state.ptt_state = 0;
+ state.ctrlreg &= ~0x20;
+ buf.u[0] = state.ctrlreg;
+ if (parport_epp_write_addr(buf.u, 1) != 1)
+ goto err;
+ }
+ if (!state.ptt_state)
+ goto endper;
+ /* get FIFO count */
+ state.ctrlreg |= 0x20;
+ buf.u[0] = state.ctrlreg | 2;
+ if (parport_epp_write_addr(buf.u, 1) != 1)
+ goto err;
+ if (parport_epp_read_addr(buf.u, 2) != 2)
+ goto err;
+ ocnt = buf.u[0] | (((unsigned int)buf.u[1]) << 8);
+ buf.u[0] = state.ctrlreg;
+ if (parport_epp_write_addr(buf.u, 1) != 1)
+ goto err;
+ ocnt &= 0x7fff;
+ omax = 16384 - ocnt;
+ if (state.ptt_state == 1) {
+ if (ocnt < SNDLATENCY) {
+ memset(buf.s, 0, SNDLATENCY-ocnt);
+ if (parport_epp_write_data(buf.s, SNDLATENCY-ocnt) != SNDLATENCY-ocnt)
+ goto err;
+ }
+ state.ptt_state = 3;
+ goto endper;
+ }
+ if (ocnts > 0) {
+ state.phdspepp &= 0xff;
+ cnt = 0;
+ while (state.phdspepp < (ocnts << PHASEFRAC)) {
+ buf.s[cnt] = sbuf[state.phdspepp >> PHASEFRAC] >> 8;
+ state.phdspepp += state.phincdspepp;
+ cnt++;
+ }
+ if (cnt > omax) {
+ lprintf(0, "epp adapter output overrun (%d, %d)\n", cnt, omax);
+ goto err;
+ }
+ if (parport_epp_write_data(buf.s, cnt) != cnt)
+ goto err;
+ /* reget the FIFO count */
+ buf.u[0] = state.ctrlreg | 2;
+ if (parport_epp_write_addr(buf.u, 1) != 1)
+ goto err;
+ if (parport_epp_read_addr(buf.u, 2) != 2)
+ goto err;
+ ocnt = buf.u[0] | (((unsigned int)buf.u[1]) << 8);
+ buf.u[0] = state.ctrlreg;
+ if (parport_epp_write_addr(buf.u, 1) != 1)
+ goto err;
+ ocnt &= 0x7fff;
+ }
+ /* adjust speed */
+ lprintf(4, "ocnts %d cnt %d ocnt %d\n", ocnts, cnt, ocnt);
+ if (ocnt > SNDLATENCY)
+ state.phincdspepp++;
+ else if (ocnt < SNDLATENCY)
+ state.phincdspepp--;
+ if (state.phincdspepp < (0x9 << (PHASEFRAC-4)) || state.phincdspepp > (0x1f << (PHASEFRAC-4))) {
+ lprintf(0, "phincdspepp (0x%05x) out of range\n", state.phincdspepp);
+ goto err;
+ }
+endper:
+ lprintf(3, "phase increments: 0x%05x 0x%05x\n", state.phinceppdsp, state.phincdspepp);
+ return TRUE;
+
+err:
+ lprintf(0, "EPP timeout\n");
+ close(state.fddsp);
+ state.fddsp = -1;
+ reset_modem();
+ return FALSE;
+}
+
+int audio_start(struct adapter_config *cfg)
+{
+ unsigned char buf[2];
+ int16_t sbuf[SNDLATENCY];
+ audio_buf_info aboinfo, abiinfo;
+ int apar;
+ unsigned srate;
+ int i;
+
+ initstate();
+ cfg->bitrate = 8000;
+ if ((i = adapter_start_eppsamp(cfg))) {
+ lprintf(0, "Cannot initialize the modem\n");
+ return i;
+ }
+ if ((state.fddsp = open("/dev/dsp", O_RDWR | O_NONBLOCK)) == -1) {
+ lprintf(0, "cannot open /dev/dsp (%s)\n", strerror(errno));
+ return -1;
+ }
+ fcntl(state.fddsp, F_SETFL, fcntl(state.fddsp, F_GETFL, 0) | O_NONBLOCK);
+ if (ioctl(state.fddsp, SNDCTL_DSP_NONBLOCK, 0) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_NONBLOCK failed (%s)\n", strerror(errno));
+ goto errsnd;
+ }
+ if (ioctl(state.fddsp, SNDCTL_DSP_GETCAPS, &apar) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_GETCAPS failed (%s)\n", strerror(errno));
+ goto errsnd;
+ }
+ if (!(apar & DSP_CAP_DUPLEX)) {
+ lprintf(0, "full duplex soundcard required\n");
+ goto errsnd;
+ }
+ if (!(apar & DSP_CAP_TRIGGER)) {
+ lprintf(0, "soundcard does not support trigger\n");
+ goto errsnd;
+ }
+ if (ioctl(state.fddsp, SNDCTL_DSP_SETDUPLEX, 0) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_SETDUPLEX failed (%s)\n", strerror(errno));
+ goto errsnd;
+ }
+ apar = AFMT_S16_LE;
+ if (ioctl(state.fddsp, SNDCTL_DSP_SETFMT, &apar) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_SETFMT failed (%s), S16_LE not supported??\n", strerror(errno));
+ goto errsnd;
+ }
+ apar = 0;
+ if (ioctl(state.fddsp, SNDCTL_DSP_STEREO, &apar) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_STEREO failed (%s), mono not supported??\n", strerror(errno));
+ goto errsnd;
+ }
+ srate = cfg->bitrate;
+ if (ioctl(state.fddsp, SNDCTL_DSP_SPEED, &srate) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_SPEED failed (%s), samplingrate %u not supported??\n",
+ strerror(errno), cfg->bitrate);
+ goto errsnd;
+ }
+ lprintf(2, "epp adapter sampling rate %u, soundcard sampling rate %u\n", cfg->bitrate, srate);
+ if (abs(cfg->bitrate - srate) > cfg->bitrate / 2) {
+ lprintf(0, "sampling rates (%u,%u) too different\n", cfg->bitrate, srate);
+ goto errsnd;
+ }
+ state.phinceppdsp = ((1 << PHASEFRAC) * cfg->bitrate + srate / 2) / srate;
+ state.phincdspepp = ((1 << PHASEFRAC) * srate + cfg->bitrate / 2) / cfg->bitrate;
+ lprintf(2, "epp->dsp phase inc: 0x%05x dsp->epp phase inc: 0x%05x\n", state.phinceppdsp, state.phincdspepp);
+ if (ioctl(state.fddsp, SNDCTL_DSP_GETOSPACE, &aboinfo) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_GETOSPACE failed (%s)\n", strerror(errno));
+ goto errsnd;
+ }
+ if (ioctl(state.fddsp, SNDCTL_DSP_GETISPACE, &abiinfo) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_GETISPACE failed (%s)\n", strerror(errno));
+ goto errsnd;
+ }
+ if (aboinfo.fragstotal * aboinfo.fragsize < 2*SNDLATENCY*2 ||
+ abiinfo.fragstotal * abiinfo.fragsize < 2*SNDLATENCY*2) {
+ lprintf(0, "soundcard buffers too small (%u,%u)\n",
+ aboinfo.fragstotal * aboinfo.fragsize,
+ abiinfo.fragstotal * abiinfo.fragsize);
+ goto errsnd;
+ }
+ lprintf(0, "Audio IO to Linux Soundcard\n");
+ /* reset the EPP adapter */
+ buf[0] = 7;
+ buf[1] = 0;
+ if (parport_epp_write_addr(buf, 2) != 2)
+ goto errret;
+ /* prefill to nominal queue size and stard soundcard */
+ memset(sbuf, 0, sizeof(sbuf));
+ if ((i = write(state.fddsp, sbuf, 2*SNDLATENCY)) != 2*SNDLATENCY) {
+ lprintf(0, "write(%d) failed %i (%s)\n", 2*SNDLATENCY, i, strerror(errno));
+ goto errsnd;
+ }
+ apar = PCM_ENABLE_INPUT | PCM_ENABLE_OUTPUT;
+ if (ioctl(state.fddsp, SNDCTL_DSP_SETTRIGGER, &apar) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_SETTRIGGER failed (%s)\n", strerror(errno));
+ goto errsnd;
+ }
+ state.tmotag = gtk_timeout_add(100, periodic, NULL);
+ return 0;
+
+errret:
+ lprintf(0, "EPP timeout\n");
+errsnd:
+ close(state.fddsp);
+ return -1;
+}
+
+#endif /* HAVE_LINUX_SOUNDCARD_H */
+
+/* ---------------------------------------------------------------------- */
+
+#ifdef HAVE_DIRECTX
+
+static BOOL CALLBACK DSEnumProc(LPGUID guid, LPCSTR lpszDesc, LPCSTR lpszDrvName, LPVOID lpcontext)
+{
+ lprintf(1, "has %sGUID, desc %s drvname %s\n", guid ? "" : "no ", lpszDesc, lpszDrvName);
+ return TRUE;
+}
+
+#if 0
+static LRESULT CALLBACK MyWndProc(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
+{
+ switch(umsg) {
+ /* Add cases such as WM_CREATE, WM_COMMAND, WM_PAINT if you don't
+ want to pass these messages along for default processing. */
+ case WM_CLOSE:
+ DestroyWindow(hwnd);
+ return 0;
+
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ return 0;
+ }
+ return DefWindowProc(hwnd, umsg, wParam, lParam);
+}
+#endif
+
+void audio_stop(void)
+{
+ if (state.hwnd != NULL) {
+ gtk_timeout_remove(state.tmotag);
+ IDirectSoundBuffer_Stop(state.playbuf);
+ IDirectSoundCaptureBuffer_Stop(state.recbuf);
+ IDirectSoundBuffer_Release(state.playbuf);
+ IDirectSoundCaptureBuffer_Release(state.recbuf);
+ IDirectSoundCapture_Release(state.dsrec);
+ IDirectSound_Release(state.dsplay);
+#if 0
+ DestroyWindow(state.hwnd);
+ UnregisterClass("MyClass", state.hinst);
+#endif
+ state.hwnd = NULL;
+ reset_modem();
+ }
+}
+
+static gint periodic(gpointer data)
+{
+ union {
+ unsigned char u[BUFSIZE];
+ signed char s[BUFSIZE];
+ } buf;
+ int16_t sbuf[BUFSIZE];
+ int16_t *sptr1, *sptr2;
+ HRESULT res;
+ DWORD lockbytes1, lockbytes2, delay;
+ int icnt, ocnt, cnt, ocnts, omax;
+
+ /* first do the epp->dsp direction */
+ /* get FIFO count */
+ buf.u[0] = state.ctrlreg | 1;
+ if (parport_epp_write_addr(buf.u, 1) != 1)
+ goto err;
+ if (parport_epp_read_addr(buf.u, 2) != 2)
+ goto err;
+ icnt = buf.u[0] | (((unsigned int)buf.u[1]) << 8);
+ buf.u[0] = state.ctrlreg;
+ if (parport_epp_write_addr(buf.u, 1) != 1)
+ goto err;
+ icnt &= 0x7fff;
+ if (icnt > 0) {
+ if (icnt > BUFSIZE/2)
+ icnt = BUFSIZE/2;
+ if (parport_epp_read_data(buf.s, icnt) != icnt)
+ goto err;
+ state.pheppdsp &= 0xff;
+ cnt = 0;
+ while (state.pheppdsp < (icnt << PHASEFRAC)) {
+ sbuf[cnt] = buf.s[state.pheppdsp >> PHASEFRAC] << 8;
+ state.pheppdsp += state.phinceppdsp;
+ cnt++;
+ }
+ process_input(sbuf, cnt);
+ if (FAILED(res = IDirectSoundBuffer_Lock(state.playbuf, state.playptr, cnt*2,
+ (LPVOID)&sptr1, &lockbytes1,
+ (LPVOID)&sptr2, &lockbytes2, 0))) {
+ lprintf(0, "IDirectSoundBuffer_Lock error %lu\n", res);
+ goto err;
+ }
+ memcpy(sptr1, sbuf, lockbytes1);
+ if (lockbytes1 < 2*cnt)
+ memcpy(sptr2, sbuf + lockbytes1/2, 2*cnt - lockbytes1);
+ if (FAILED(res = IDirectSoundBuffer_Unlock(state.playbuf, sptr1, lockbytes1, sptr2, lockbytes2))) {
+ lprintf(0, "IDirectSoundBuffer_Unlock error %lu\n", res);
+ goto err;
+ }
+ state.playptr = (state.playptr + 2*cnt) % state.playbufsz;
+ /* get output delay */
+ if (FAILED(res = IDirectSoundBuffer_GetCurrentPosition(state.playbuf, &delay, NULL))) {
+ lprintf(0, "IDirectSoundBuffer_GetCurrentPosition error %lu\n", res);
+ goto err;
+ }
+ delay = (state.playbufsz + state.playptr - delay) % state.playbufsz;
+ delay >>= 1;
+ /* adjust speed */
+ lprintf(4, "icnt %d cnt %d odel %u\n", icnt, cnt, delay);
+ if (delay > SNDLATENCY)
+ state.phinceppdsp++;
+ else if (delay < SNDLATENCY)
+ state.phinceppdsp--;
+ if (state.phinceppdsp < (0x9 << (PHASEFRAC-4)) || state.phinceppdsp > (0x1f << (PHASEFRAC-4))) {
+ lprintf(0, "phinceppdsp (0x%05x) out of range\n", state.phinceppdsp);
+ goto err;
+ }
+ /* play games with the LEDS */
+ state.ledcnt += icnt;
+ if (state.ledcnt >= 4000) {
+ state.ledcnt %= 4000;
+ state.ctrlreg += 0x40;
+ }
+ }
+ /* next do the dsp->epp direction */
+ /* read sound */
+ if (FAILED(res = IDirectSoundCaptureBuffer_GetCurrentPosition(state.recbuf, &delay, NULL))) {
+ lprintf(0, "IDirectSoundCaptureBuffer_GetCurrentPosition error %lu\n", res);
+ goto err;
+ }
+ ocnts = (state.recbufsz + delay - state.recptr) % state.recbufsz;
+ if (ocnts > 0) {
+ if (FAILED(res = IDirectSoundCaptureBuffer_Lock(state.recbuf, state.recptr, ocnts,
+ (LPVOID)&sptr1, &lockbytes1,
+ (LPVOID)&sptr2, &lockbytes2, 0))) {
+ lprintf(0, "IDirectSoundCaptureBuffer_Lock error %lu\n", res);
+ goto err;
+ }
+ memcpy(sbuf, sptr1, lockbytes1);
+ if (lockbytes1 < ocnts)
+ memcpy(sbuf + lockbytes1/2, sptr2, ocnts - lockbytes1);
+ state.recptr = (state.recptr + ocnts) % state.recbufsz;
+ if (FAILED(res = IDirectSoundCaptureBuffer_Unlock(state.recbuf, sptr1, lockbytes1, sptr2, lockbytes2))) {
+ lprintf(0, "IDirectSoundCaptureBuffer_Unlock error %lu\n", res);
+ goto err;
+ }
+ }
+ ocnts >>= 1;
+ process_output(sbuf, ocnts);
+ if (state.ptt_state == 2) {
+ state.ptt_state = 0;
+ state.ctrlreg &= ~0x20;
+ buf.u[0] = state.ctrlreg;
+ if (parport_epp_write_addr(buf.u, 1) != 1)
+ goto err;
+ }
+ if (!state.ptt_state)
+ goto endper;
+ /* get FIFO count */
+ state.ctrlreg |= 0x20;
+ buf.u[0] = state.ctrlreg | 2;
+ if (parport_epp_write_addr(buf.u, 1) != 1)
+ goto err;
+ if (parport_epp_read_addr(buf.u, 2) != 2)
+ goto err;
+ ocnt = buf.u[0] | (((unsigned int)buf.u[1]) << 8);
+ buf.u[0] = state.ctrlreg;
+ if (parport_epp_write_addr(buf.u, 1) != 1)
+ goto err;
+ ocnt &= 0x7fff;
+ omax = 16384 - ocnt;
+ if (state.ptt_state == 1) {
+ if (ocnt < SNDLATENCY) {
+ memset(buf.s, 0, SNDLATENCY-ocnt);
+ if (parport_epp_write_data(buf.s, SNDLATENCY-ocnt) != SNDLATENCY-ocnt)
+ goto err;
+ }
+ state.ptt_state = 3;
+ goto endper;
+ }
+ if (ocnts > 0) {
+ state.phdspepp &= 0xff;
+ cnt = 0;
+ while (state.phdspepp < (ocnts << PHASEFRAC)) {
+ buf.s[cnt] = sbuf[state.phdspepp >> PHASEFRAC] >> 8;
+ state.phdspepp += state.phincdspepp;
+ cnt++;
+ }
+ if (cnt > omax) {
+ lprintf(0, "epp adapter output overrun (%d, %d)\n", cnt, omax);
+ goto err;
+ }
+ if (parport_epp_write_data(buf.s, cnt) != cnt)
+ goto err;
+ /* reget the FIFO count */
+ buf.u[0] = state.ctrlreg | 2;
+ if (parport_epp_write_addr(buf.u, 1) != 1)
+ goto err;
+ if (parport_epp_read_addr(buf.u, 2) != 2)
+ goto err;
+ ocnt = buf.u[0] | (((unsigned int)buf.u[1]) << 8);
+ buf.u[0] = state.ctrlreg;
+ if (parport_epp_write_addr(buf.u, 1) != 1)
+ goto err;
+ ocnt &= 0x7fff;
+ }
+ /* adjust speed */
+ lprintf(4, "ocnts %d cnt %d ocnt %d\n", ocnts, cnt, ocnt);
+ if (ocnt > SNDLATENCY)
+ state.phincdspepp++;
+ else if (ocnt < SNDLATENCY)
+ state.phincdspepp--;
+ if (state.phincdspepp < (0x9 << (PHASEFRAC-4)) || state.phincdspepp > (0x1f << (PHASEFRAC-4))) {
+ lprintf(0, "phincdspepp (0x%05x) out of range\n", state.phincdspepp);
+ goto err;
+ }
+endper:
+ lprintf(3, "phase increments: 0x%05x 0x%05x\n", state.phinceppdsp, state.phincdspepp);
+ return TRUE;
+
+err:
+ lprintf(0, "EPP timeout\n");
+ IDirectSoundBuffer_Stop(state.playbuf);
+ IDirectSoundCaptureBuffer_Stop(state.recbuf);
+ IDirectSoundBuffer_Release(state.playbuf);
+ IDirectSoundCaptureBuffer_Release(state.recbuf);
+ IDirectSoundCapture_Release(state.dsrec);
+ IDirectSound_Release(state.dsplay);
+#if 0
+ DestroyWindow(state.hwnd);
+ UnregisterClass("MyClass", state.hinst);
+#endif
+ state.hwnd = NULL;
+ reset_modem();
+ return FALSE;
+}
+
+int audio_start(struct adapter_config *cfg)
+{
+ WNDCLASS wndclass;
+ HRESULT res;
+ WAVEFORMATEX waveformat;
+ DSBUFFERDESC bdesc;
+ DSCBUFFERDESC cbdesc;
+ DWORD lockbytes;
+ int16_t *sptr;
+ int retval = -1;
+ unsigned char buf[2];
+ int i;
+
+ state.dsplay = NULL;
+ state.dsrec = NULL;
+ state.playbuf = NULL;
+ state.recbuf = NULL;
+ state.hwnd = NULL;
+ state.hinst = GetModuleHandleA(0);
+ state.playptr = 0;
+ state.recptr = 0;
+ initstate();
+ lprintf(1, "DirectSound drivers\n");
+ DirectSoundEnumerateA(DSEnumProc, NULL);
+ lprintf(1, "DirectSoundCapture drivers\n");
+ DirectSoundCaptureEnumerateA(DSEnumProc, NULL);
+#if 0
+ wndclass.style = CS_HREDRAW | CS_VREDRAW;
+ wndclass.lpfnWndProc = (WNDPROC)MyWndProc;
+ wndclass.cbClsExtra = 0;
+ wndclass.cbWndExtra = 0;
+ wndclass.hIcon = NULL;
+ wndclass.hInstance = state.hinst;
+ wndclass.hCursor = NULL;
+ wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
+ wndclass.lpszMenuName = NULL;
+ wndclass.lpszClassName = "MyClass";
+ if (!RegisterClass(&wndclass)) {
+ lprintf(0, "RegisterClass error, %d\n", GetLastError());
+ return -1;
+ }
+ state.hwnd = CreateWindowEx(WS_EX_APPWINDOW, "MyClass", "eppfpga", WS_DISABLED | WS_POPUP,
+ 0, 0, 0, 0, NULL, NULL, state.hinst, NULL);
+ if (!state.hwnd) {
+ lprintf(0, "CreateWindowEx error, %d\n", GetLastError());
+ goto errcreatewin;
+ }
+#else
+ state.hwnd = GetDesktopWindow();
+#endif
+ if (FAILED(res = DirectSoundCreate(NULL, &state.dsplay, NULL))) {
+ lprintf(0, "DirectSoundCreate error %lu\n", res);
+ goto errdscreate;
+ }
+ if (FAILED(res = IDirectSound_SetCooperativeLevel(state.dsplay, state.hwnd, DSSCL_NORMAL))) {
+ lprintf(0, "SetCooperativeLevel error %lu\n", res);
+ goto errdscreate1;
+ }
+ if (FAILED(res = DirectSoundCaptureCreate(NULL, &state.dsrec, NULL))) {
+ lprintf(0, "DirectSoundCaptureCreate error %lu\n", res);
+ goto errdscreate1;
+ }
+ memset(&waveformat, 0, sizeof(waveformat));
+ waveformat.wFormatTag = WAVE_FORMAT_PCM;
+ waveformat.wBitsPerSample = 8;
+ waveformat.nChannels = 1;
+ waveformat.nSamplesPerSec = 8000;
+ waveformat.nBlockAlign = waveformat.nChannels * waveformat.wBitsPerSample / 8;
+ waveformat.nAvgBytesPerSec = waveformat.nSamplesPerSec * waveformat.nBlockAlign;
+ memset(&cbdesc, 0, sizeof(cbdesc));
+ cbdesc.dwSize = sizeof(cbdesc);
+ cbdesc.dwFlags = /* DSCBCAPS_WAVEMAPPED */ 0;
+ state.recbufsz = cbdesc.dwBufferBytes = waveformat.nAvgBytesPerSec;
+ cbdesc.lpwfxFormat = &waveformat;
+ if (FAILED(res = IDirectSoundCapture_CreateCaptureBuffer(state.dsrec, &cbdesc, &state.recbuf, NULL))) {
+ lprintf(0, "CreateSoundCaptureBuffer error %lu\n", res);
+ goto errdscreate2;
+ }
+ memset(&waveformat, 0, sizeof(waveformat));
+ waveformat.wFormatTag = WAVE_FORMAT_PCM;
+ waveformat.wBitsPerSample = 8;
+ waveformat.nChannels = 1;
+ waveformat.nSamplesPerSec = 8000;
+ waveformat.nBlockAlign = waveformat.nChannels * waveformat.wBitsPerSample / 8;
+ waveformat.nAvgBytesPerSec = waveformat.nSamplesPerSec * waveformat.nBlockAlign;
+ memset(&bdesc, 0, sizeof(bdesc));
+ bdesc.dwSize = sizeof(bdesc);
+ bdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS | DSBCAPS_CTRLPAN;
+ state.playbufsz = bdesc.dwBufferBytes = waveformat.nAvgBytesPerSec;
+ bdesc.lpwfxFormat = &waveformat;
+ if (FAILED(res = IDirectSound_CreateSoundBuffer(state.dsplay, &bdesc, &state.playbuf, NULL))) {
+ lprintf(0, "CreateSoundBuffer error %lu\n", res);
+ goto errdscreate3;
+ }
+ cfg->bitrate = 8000;
+ if ((i = adapter_start_eppsamp(cfg))) {
+ retval = i;
+ lprintf(0, "Cannot initialize the modem\n");
+ goto errdscreate4;
+ }
+ state.phinceppdsp = ((1 << PHASEFRAC) * cfg->bitrate + 8000 / 2) / 8000;
+ state.phincdspepp = ((1 << PHASEFRAC) * 8000 + cfg->bitrate / 2) / cfg->bitrate;
+ lprintf(2, "epp->dsp phase inc: 0x%05x dsp->epp phase inc: 0x%05x\n", state.phinceppdsp, state.phincdspepp);
+ lprintf(0, "Audio IO to DirectX\n");
+ /* reset the EPP adapter */
+ buf[0] = 7;
+ buf[1] = 0;
+ if (parport_epp_write_addr(buf, 2) != 2)
+ goto errret;
+ /* prefill to nominal queue size and stard soundcard */
+ if (FAILED(res = IDirectSoundBuffer_Lock(state.playbuf, 0, 2*SNDLATENCY, (LPVOID)&sptr, &lockbytes, NULL, NULL, 0))) {
+ lprintf(0, "IDirectSoundBuffer_Lock error %lu\n", res);
+ goto errresmodem;
+ }
+ memset(sptr, 0, 2*SNDLATENCY);
+ if (FAILED(res = IDirectSoundBuffer_Unlock(state.playbuf, sptr, lockbytes, NULL, 0))) {
+ lprintf(0, "IDirectSoundBuffer_Unlock error %lu\n", res);
+ goto errresmodem;
+ }
+ state.playptr = SNDLATENCY;
+ if (FAILED(res = IDirectSoundBuffer_Play(state.playbuf, 0, 0, DSBPLAY_LOOPING))) {
+ lprintf(0, "IDirectSoundBuffer_Play error %lu\n", res);
+ goto errresmodem;
+ }
+ if (FAILED(res = IDirectSoundCaptureBuffer_Start(state.recbuf, DSCBSTART_LOOPING))) {
+ lprintf(0, "IDirectSoundCaptureBuffer_Start error %lu\n", res);
+ goto errresmodem;
+ }
+ state.tmotag = gtk_timeout_add(100, periodic, NULL);
+ return 0;
+
+errret:
+ lprintf(0, "EPP timeout\n");
+errresmodem:
+ IDirectSoundBuffer_Stop(state.playbuf);
+ IDirectSoundCaptureBuffer_Stop(state.recbuf);
+ reset_modem();
+errdscreate4:
+ IDirectSoundBuffer_Release(state.playbuf);
+errdscreate3:
+ IDirectSoundCaptureBuffer_Release(state.recbuf);
+errdscreate2:
+ IDirectSoundCapture_Release(state.dsrec);
+errdscreate1:
+ IDirectSound_Release(state.dsplay);
+errdscreate:
+#if 0
+ DestroyWindow(state.hwnd);
+errcreatewin:
+ UnregisterClass("MyClass", state.hinst);
+#endif
+ return -1;
+}
+
+#endif /* HAVE_DIRECTX */
+
+/* ---------------------------------------------------------------------- */
diff --git a/eppfm/callbacks.c b/eppfm/callbacks.c
new file mode 100644
index 0000000..c8ac8e3
--- /dev/null
+++ b/eppfm/callbacks.c
@@ -0,0 +1,98 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include "eppfm.h"
+#include <gtk/gtk.h>
+
+#include "callbacks.h"
+#include "interface.h"
+#include "support.h"
+
+void on_button1750_pressed(GtkButton *button, gpointer user_data)
+{
+ audio_1750(1);
+ audio_ptt(1);
+}
+
+void on_button1750_released(GtkButton *button, gpointer user_data)
+{
+ audio_1750(0);
+ audio_ptt(0);
+}
+
+void on_buttonptt_pressed(GtkButton *button, gpointer user_data)
+{
+ audio_ptt(1);
+}
+
+void on_buttonptt_released(GtkButton *button, gpointer user_data)
+{
+ audio_ptt(0);
+}
+
+void on_buttondtmf(GtkButton *button, gpointer user_data)
+{
+ unsigned int data = (unsigned int)user_data;
+
+ if (data >= 0x10)
+ audio_dtmf(data & 15);
+ else
+ audio_dtmf(-1);
+}
+
+void on_exit_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+ gtk_main_quit();
+}
+
+void on_about_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+ printf("blah\n");
+}
+
+gboolean on_mainwindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+ return FALSE;
+}
+
+void on_mainwindow_destroy(GtkObject *object, gpointer user_data)
+{
+ gtk_main_quit();
+}
+
+gboolean on_mainwindow_key_press_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
+{
+ const char dtmfch[] = "0123456789ABCD*#";
+ char *cp;
+ unsigned v;
+
+ cp = strchr(dtmfch, event->keyval);
+ if (!cp)
+ return FALSE;
+ v = cp - dtmfch;
+ if (v >= 16)
+ return FALSE;
+ audio_dtmf(v);
+ return TRUE;
+ /*printf("key_press: keyval %u length %d\n", event->keyval, event->length);*/
+}
+
+gboolean on_mainwindow_key_release_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
+{
+ const char dtmfch[] = "0123456789ABCD*#";
+ char *cp;
+ unsigned v;
+
+ cp = strchr(dtmfch, event->keyval);
+ if (!cp)
+ return FALSE;
+ v = cp - dtmfch;
+ if (v >= 16)
+ return FALSE;
+ audio_dtmf(-1);
+ return TRUE;
+ /*printf("key_release: keyval %u length %d\n", event->keyval, event->length);*/
+}
diff --git a/eppfm/callbacks.h b/eppfm/callbacks.h
new file mode 100644
index 0000000..3e37178
--- /dev/null
+++ b/eppfm/callbacks.h
@@ -0,0 +1,53 @@
+#include <gtk/gtk.h>
+
+
+gboolean
+on_mainwindow_key_press_event (GtkWidget *widget,
+ GdkEventKey *event,
+ gpointer user_data);
+
+gboolean
+on_mainwindow_key_release_event (GtkWidget *widget,
+ GdkEventKey *event,
+ gpointer user_data);
+
+gboolean
+on_mainwindow_delete_event (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data);
+
+void
+on_mainwindow_destroy (GtkObject *object,
+ gpointer user_data);
+
+void
+on_exit_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+void
+on_about_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+void
+on_button1750_pressed (GtkButton *button,
+ gpointer user_data);
+
+void
+on_button1750_released (GtkButton *button,
+ gpointer user_data);
+
+void
+on_buttonptt_pressed (GtkButton *button,
+ gpointer user_data);
+
+void
+on_buttonptt_released (GtkButton *button,
+ gpointer user_data);
+
+void
+on_buttondtmf (GtkButton *button,
+ gpointer user_data);
+
+void
+on_buttondtmf (GtkButton *button,
+ gpointer user_data);
diff --git a/eppfm/costab.c b/eppfm/costab.c
new file mode 100644
index 0000000..8ad2ae1
--- /dev/null
+++ b/eppfm/costab.c
@@ -0,0 +1,74 @@
+#include <sys/types.h>
+#include "eppfm.h"
+
+/*
+ * cosine table
+ */
+
+const int16_t costab[512] = {
+ 32767, 32764, 32757, 32744, 32727, 32705, 32678, 32646,
+ 32609, 32567, 32520, 32468, 32412, 32350, 32284, 32213,
+ 32137, 32056, 31970, 31880, 31785, 31684, 31580, 31470,
+ 31356, 31236, 31113, 30984, 30851, 30713, 30571, 30424,
+ 30272, 30116, 29955, 29790, 29621, 29446, 29268, 29085,
+ 28897, 28706, 28510, 28309, 28105, 27896, 27683, 27466,
+ 27244, 27019, 26789, 26556, 26318, 26077, 25831, 25582,
+ 25329, 25072, 24811, 24546, 24278, 24006, 23731, 23452,
+ 23169, 22883, 22594, 22301, 22004, 21705, 21402, 21096,
+ 20787, 20474, 20159, 19840, 19519, 19194, 18867, 18537,
+ 18204, 17868, 17530, 17189, 16845, 16499, 16150, 15799,
+ 15446, 15090, 14732, 14372, 14009, 13645, 13278, 12909,
+ 12539, 12166, 11792, 11416, 11038, 10659, 10278, 9895,
+ 9511, 9126, 8739, 8351, 7961, 7571, 7179, 6786,
+ 6392, 5997, 5601, 5205, 4807, 4409, 4011, 3611,
+ 3211, 2811, 2410, 2009, 1607, 1206, 804, 402,
+ 0, -402, -804, -1206, -1607, -2009, -2410, -2811,
+ -3211, -3611, -4011, -4409, -4807, -5205, -5601, -5997,
+ -6392, -6786, -7179, -7571, -7961, -8351, -8739, -9126,
+ -9511, -9895, -10278, -10659, -11038, -11416, -11792, -12166,
+ -12539, -12909, -13278, -13645, -14009, -14372, -14732, -15090,
+ -15446, -15799, -16150, -16499, -16845, -17189, -17530, -17868,
+ -18204, -18537, -18867, -19194, -19519, -19840, -20159, -20474,
+ -20787, -21096, -21402, -21705, -22004, -22301, -22594, -22883,
+ -23169, -23452, -23731, -24006, -24278, -24546, -24811, -25072,
+ -25329, -25582, -25831, -26077, -26318, -26556, -26789, -27019,
+ -27244, -27466, -27683, -27896, -28105, -28309, -28510, -28706,
+ -28897, -29085, -29268, -29446, -29621, -29790, -29955, -30116,
+ -30272, -30424, -30571, -30713, -30851, -30984, -31113, -31236,
+ -31356, -31470, -31580, -31684, -31785, -31880, -31970, -32056,
+ -32137, -32213, -32284, -32350, -32412, -32468, -32520, -32567,
+ -32609, -32646, -32678, -32705, -32727, -32744, -32757, -32764,
+ -32767, -32764, -32757, -32744, -32727, -32705, -32678, -32646,
+ -32609, -32567, -32520, -32468, -32412, -32350, -32284, -32213,
+ -32137, -32056, -31970, -31880, -31785, -31684, -31580, -31470,
+ -31356, -31236, -31113, -30984, -30851, -30713, -30571, -30424,
+ -30272, -30116, -29955, -29790, -29621, -29446, -29268, -29085,
+ -28897, -28706, -28510, -28309, -28105, -27896, -27683, -27466,
+ -27244, -27019, -26789, -26556, -26318, -26077, -25831, -25582,
+ -25329, -25072, -24811, -24546, -24278, -24006, -23731, -23452,
+ -23169, -22883, -22594, -22301, -22004, -21705, -21402, -21096,
+ -20787, -20474, -20159, -19840, -19519, -19194, -18867, -18537,
+ -18204, -17868, -17530, -17189, -16845, -16499, -16150, -15799,
+ -15446, -15090, -14732, -14372, -14009, -13645, -13278, -12909,
+ -12539, -12166, -11792, -11416, -11038, -10659, -10278, -9895,
+ -9511, -9126, -8739, -8351, -7961, -7571, -7179, -6786,
+ -6392, -5997, -5601, -5205, -4807, -4409, -4011, -3611,
+ -3211, -2811, -2410, -2009, -1607, -1206, -804, -402,
+ 0, 402, 804, 1206, 1607, 2009, 2410, 2811,
+ 3211, 3611, 4011, 4409, 4807, 5205, 5601, 5997,
+ 6392, 6786, 7179, 7571, 7961, 8351, 8739, 9126,
+ 9511, 9895, 10278, 10659, 11038, 11416, 11792, 12166,
+ 12539, 12909, 13278, 13645, 14009, 14372, 14732, 15090,
+ 15446, 15799, 16150, 16499, 16845, 17189, 17530, 17868,
+ 18204, 18537, 18867, 19194, 19519, 19840, 20159, 20474,
+ 20787, 21096, 21402, 21705, 22004, 22301, 22594, 22883,
+ 23169, 23452, 23731, 24006, 24278, 24546, 24811, 25072,
+ 25329, 25582, 25831, 26077, 26318, 26556, 26789, 27019,
+ 27244, 27466, 27683, 27896, 28105, 28309, 28510, 28706,
+ 28897, 29085, 29268, 29446, 29621, 29790, 29955, 30116,
+ 30272, 30424, 30571, 30713, 30851, 30984, 31113, 31236,
+ 31356, 31470, 31580, 31684, 31785, 31880, 31970, 32056,
+ 32137, 32213, 32284, 32350, 32412, 32468, 32520, 32567,
+ 32609, 32646, 32678, 32705, 32727, 32744, 32757, 32764
+};
+
diff --git a/eppfm/eppfm.h b/eppfm/eppfm.h
new file mode 100644
index 0000000..e8c5f30
--- /dev/null
+++ b/eppfm/eppfm.h
@@ -0,0 +1,54 @@
+/*****************************************************************************/
+
+/*
+ * eppfm.h -- Function prototypes for "virtual transceiver".
+ *
+ * Copyright (C) 1999 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifndef _EPPFM_H
+#define _EPPFM_H
+
+/* ---------------------------------------------------------------------- */
+
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+extern const int16_t costab[512];
+#define COS(x) costab[((x)>>7)&0x1ff]
+#define SIN(x) COS((x)+0xc000)
+
+/* ---------------------------------------------------------------------- */
+
+extern void audio_ptt(int ptt);
+extern void audio_stop(void);
+extern int audio_start(struct adapter_config *cfg);
+extern void audio_1750(int on);
+extern void audio_dtmf(int ch);
+extern unsigned audio_getilevel(void);
+extern unsigned audio_getolevel(void);
+
+/* ---------------------------------------------------------------------- */
+#endif /* _EPPFM_H */
diff --git a/eppfm/gentbl.c b/eppfm/gentbl.c
new file mode 100644
index 0000000..af75b98
--- /dev/null
+++ b/eppfm/gentbl.c
@@ -0,0 +1,72 @@
+/*****************************************************************************/
+
+/*
+ * gentbl.c -- Soundmodem table generator.
+ *
+ * Copyright (C) 1996-1999 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+
+/* -------------------------------------------------------------------- */
+
+static const char *progname;
+
+/* -------------------------------------------------------------------- */
+
+static void gen_costab(unsigned size, const char *fn)
+{
+ FILE *f;
+ int i;
+
+ if (!(f = fopen(fn, "w"))) {
+ fprintf(stderr, "cannot open file costab.c\n");
+ exit(1);
+ }
+ fprintf(f, "#include <sys/types.h>\n#include \"eppfm.h\"\n\n/*\n * cosine table\n */\n\n"
+ "const int16_t costab[%d] = {", size);
+ for (i = 0; i < size; i++) {
+ if (!(i & 7))
+ fprintf(f, "\n\t");
+ fprintf(f, "%6d", (int)(32767.0*cos(i*(2.0*M_PI)/size)));
+ if (i != (size-1))
+ fprintf(f, ", ");
+ }
+ fprintf(f, "\n};\n\n");
+}
+
+/* -------------------------------------------------------------------- */
+
+int main(int argc, char *argv[])
+{
+ progname = argv[0];
+ if (argc < 2) {
+ fprintf(stderr, "usage: gentbl <filename>\n");
+ exit(1);
+ }
+ gen_costab(512, argv[1]);
+ exit(0);
+}
+
+/* -------------------------------------------------------------------- */
diff --git a/eppfm/interface.c b/eppfm/interface.c
new file mode 100644
index 0000000..3f27f1e
--- /dev/null
+++ b/eppfm/interface.c
@@ -0,0 +1,711 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+
+#include "callbacks.h"
+#include "interface.h"
+#include "support.h"
+
+GtkWidget*
+create_mainwindow ()
+{
+ GtkWidget *mainwindow;
+ GtkWidget *vbox1;
+ GtkWidget *handlebox1;
+ GtkWidget *menubar;
+ guint tmp_key;
+ GtkWidget *file;
+ GtkWidget *file_menu;
+ GtkAccelGroup *file_menu_accels;
+ GtkWidget *exit;
+ GtkWidget *help;
+ GtkWidget *help_menu;
+ GtkAccelGroup *help_menu_accels;
+ GtkWidget *about;
+ GtkWidget *hbox2;
+ GtkWidget *vbox2;
+ GtkWidget *button1750;
+ GtkWidget *buttonptt;
+ GtkWidget *frame1;
+ GtkWidget *table1;
+ GtkWidget *buttondtmf7;
+ GtkWidget *buttondtmf8;
+ GtkWidget *buttondtmf9;
+ GtkWidget *buttondtmf10;
+ GtkWidget *buttondtmf4;
+ GtkWidget *buttondtmf5;
+ GtkWidget *buttondtmf6;
+ GtkWidget *buttondtmf11;
+ GtkWidget *buttondtmf12;
+ GtkWidget *buttondtmf3;
+ GtkWidget *buttondtmf2;
+ GtkWidget *buttondtmf1;
+ GtkWidget *buttondtmf14;
+ GtkWidget *buttondtmf0;
+ GtkWidget *buttondtmf15;
+ GtkWidget *buttondtmf13;
+ GtkWidget *table2;
+ GtkWidget *label1;
+ GtkWidget *label2;
+ GtkWidget *hbox3;
+ GtkWidget *partxctcss;
+ GtkWidget *partxctcssfreq;
+ GList *partxctcssfreq_items = NULL;
+ GtkWidget *hbox4;
+ GtkWidget *parrxctcss;
+ GtkWidget *parrxctcssfreq;
+ GList *parrxctcssfreq_items = NULL;
+ GtkWidget *parsql;
+ GtkWidget *meterrx;
+ GtkWidget *metertx;
+ GtkWidget *metersql;
+ GtkAccelGroup *accel_group;
+
+ accel_group = gtk_accel_group_new ();
+
+ mainwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_widget_ref (mainwindow);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "mainwindow", mainwindow,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_set_usize (mainwindow, 512, 256);
+ gtk_widget_set_events (mainwindow, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
+ gtk_window_set_title (GTK_WINDOW (mainwindow), "EPP FM - Computer Aided Transceiver");
+
+ vbox1 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_ref (vbox1);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "vbox1", vbox1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (vbox1);
+ gtk_container_add (GTK_CONTAINER (mainwindow), vbox1);
+
+ handlebox1 = gtk_handle_box_new ();
+ gtk_widget_ref (handlebox1);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "handlebox1", handlebox1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (handlebox1);
+ gtk_box_pack_start (GTK_BOX (vbox1), handlebox1, FALSE, TRUE, 0);
+
+ menubar = gtk_menu_bar_new ();
+ gtk_widget_ref (menubar);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "menubar", menubar,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (menubar);
+ gtk_container_add (GTK_CONTAINER (handlebox1), menubar);
+
+ file = gtk_menu_item_new_with_label ("");
+ tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (file)->child),
+ "_File");
+ gtk_widget_add_accelerator (file, "activate_item", accel_group,
+ tmp_key, GDK_MOD1_MASK, 0);
+ gtk_widget_ref (file);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "file", file,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (file);
+ gtk_container_add (GTK_CONTAINER (menubar), file);
+
+ file_menu = gtk_menu_new ();
+ gtk_widget_ref (file_menu);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "file_menu", file_menu,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (file), file_menu);
+ file_menu_accels = gtk_menu_ensure_uline_accel_group (GTK_MENU (file_menu));
+
+ exit = gtk_menu_item_new_with_label ("");
+ tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (exit)->child),
+ "_Exit");
+ gtk_widget_add_accelerator (exit, "activate_item", file_menu_accels,
+ tmp_key, 0, 0);
+ gtk_widget_ref (exit);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "exit", exit,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (exit);
+ gtk_container_add (GTK_CONTAINER (file_menu), exit);
+ gtk_widget_add_accelerator (exit, "activate", accel_group,
+ GDK_Q, GDK_MOD1_MASK,
+ GTK_ACCEL_VISIBLE);
+
+ help = gtk_menu_item_new_with_label ("");
+ tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (help)->child),
+ "_Help");
+ gtk_widget_add_accelerator (help, "activate_item", accel_group,
+ tmp_key, GDK_MOD1_MASK, 0);
+ gtk_widget_ref (help);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "help", help,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (help);
+ gtk_container_add (GTK_CONTAINER (menubar), help);
+ gtk_menu_item_right_justify (GTK_MENU_ITEM (help));
+
+ help_menu = gtk_menu_new ();
+ gtk_widget_ref (help_menu);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "help_menu", help_menu,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (help), help_menu);
+ help_menu_accels = gtk_menu_ensure_uline_accel_group (GTK_MENU (help_menu));
+
+ about = gtk_menu_item_new_with_label ("");
+ tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (about)->child),
+ "_About");
+ gtk_widget_add_accelerator (about, "activate_item", help_menu_accels,
+ tmp_key, 0, 0);
+ gtk_widget_ref (about);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "about", about,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (about);
+ gtk_container_add (GTK_CONTAINER (help_menu), about);
+ gtk_widget_add_accelerator (about, "activate", accel_group,
+ GDK_A, GDK_MOD1_MASK,
+ GTK_ACCEL_VISIBLE);
+
+ hbox2 = gtk_hbox_new (FALSE, 0);
+ gtk_widget_ref (hbox2);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "hbox2", hbox2,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (hbox2);
+ gtk_box_pack_start (GTK_BOX (vbox1), hbox2, TRUE, TRUE, 0);
+
+ vbox2 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_ref (vbox2);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "vbox2", vbox2,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (vbox2);
+ gtk_box_pack_start (GTK_BOX (hbox2), vbox2, TRUE, TRUE, 0);
+
+ button1750 = gtk_button_new_with_label ("1750");
+ gtk_widget_ref (button1750);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "button1750", button1750,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (button1750);
+ gtk_box_pack_start (GTK_BOX (vbox2), button1750, TRUE, TRUE, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (button1750), 4);
+
+ buttonptt = gtk_button_new_with_label ("PTT");
+ gtk_widget_ref (buttonptt);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttonptt", buttonptt,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (buttonptt);
+ gtk_box_pack_start (GTK_BOX (vbox2), buttonptt, TRUE, TRUE, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (buttonptt), 4);
+
+ frame1 = gtk_frame_new ("DTMF Keypad");
+ gtk_widget_ref (frame1);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "frame1", frame1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (frame1);
+ gtk_box_pack_start (GTK_BOX (hbox2), frame1, TRUE, TRUE, 0);
+
+ table1 = gtk_table_new (4, 4, FALSE);
+ gtk_widget_ref (table1);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "table1", table1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (table1);
+ gtk_container_add (GTK_CONTAINER (frame1), table1);
+
+ buttondtmf7 = gtk_button_new_with_label ("7");
+ gtk_widget_ref (buttondtmf7);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf7", buttondtmf7,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (buttondtmf7);
+ gtk_table_attach (GTK_TABLE (table1), buttondtmf7, 0, 1, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (buttondtmf7), 4);
+
+ buttondtmf8 = gtk_button_new_with_label ("8");
+ gtk_widget_ref (buttondtmf8);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf8", buttondtmf8,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (buttondtmf8);
+ gtk_table_attach (GTK_TABLE (table1), buttondtmf8, 1, 2, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (buttondtmf8), 4);
+
+ buttondtmf9 = gtk_button_new_with_label ("9");
+ gtk_widget_ref (buttondtmf9);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf9", buttondtmf9,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (buttondtmf9);
+ gtk_table_attach (GTK_TABLE (table1), buttondtmf9, 2, 3, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (buttondtmf9), 4);
+
+ buttondtmf10 = gtk_button_new_with_label ("A");
+ gtk_widget_ref (buttondtmf10);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf10", buttondtmf10,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (buttondtmf10);
+ gtk_table_attach (GTK_TABLE (table1), buttondtmf10, 3, 4, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (buttondtmf10), 4);
+
+ buttondtmf4 = gtk_button_new_with_label ("4");
+ gtk_widget_ref (buttondtmf4);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf4", buttondtmf4,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (buttondtmf4);
+ gtk_table_attach (GTK_TABLE (table1), buttondtmf4, 0, 1, 1, 2,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (buttondtmf4), 4);
+
+ buttondtmf5 = gtk_button_new_with_label ("5");
+ gtk_widget_ref (buttondtmf5);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf5", buttondtmf5,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (buttondtmf5);
+ gtk_table_attach (GTK_TABLE (table1), buttondtmf5, 1, 2, 1, 2,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (buttondtmf5), 4);
+
+ buttondtmf6 = gtk_button_new_with_label ("6");
+ gtk_widget_ref (buttondtmf6);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf6", buttondtmf6,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (buttondtmf6);
+ gtk_table_attach (GTK_TABLE (table1), buttondtmf6, 2, 3, 1, 2,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (buttondtmf6), 4);
+
+ buttondtmf11 = gtk_button_new_with_label ("B");
+ gtk_widget_ref (buttondtmf11);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf11", buttondtmf11,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (buttondtmf11);
+ gtk_table_attach (GTK_TABLE (table1), buttondtmf11, 3, 4, 1, 2,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (buttondtmf11), 4);
+
+ buttondtmf12 = gtk_button_new_with_label ("C");
+ gtk_widget_ref (buttondtmf12);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf12", buttondtmf12,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (buttondtmf12);
+ gtk_table_attach (GTK_TABLE (table1), buttondtmf12, 3, 4, 2, 3,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (buttondtmf12), 4);
+
+ buttondtmf3 = gtk_button_new_with_label ("3");
+ gtk_widget_ref (buttondtmf3);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf3", buttondtmf3,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (buttondtmf3);
+ gtk_table_attach (GTK_TABLE (table1), buttondtmf3, 2, 3, 2, 3,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (buttondtmf3), 4);
+
+ buttondtmf2 = gtk_button_new_with_label ("2");
+ gtk_widget_ref (buttondtmf2);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf2", buttondtmf2,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (buttondtmf2);
+ gtk_table_attach (GTK_TABLE (table1), buttondtmf2, 1, 2, 2, 3,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (buttondtmf2), 4);
+
+ buttondtmf1 = gtk_button_new_with_label ("1");
+ gtk_widget_ref (buttondtmf1);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf1", buttondtmf1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (buttondtmf1);
+ gtk_table_attach (GTK_TABLE (table1), buttondtmf1, 0, 1, 2, 3,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (buttondtmf1), 4);
+
+ buttondtmf14 = gtk_button_new_with_label ("*");
+ gtk_widget_ref (buttondtmf14);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf14", buttondtmf14,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (buttondtmf14);
+ gtk_table_attach (GTK_TABLE (table1), buttondtmf14, 0, 1, 3, 4,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (buttondtmf14), 4);
+
+ buttondtmf0 = gtk_button_new_with_label ("0");
+ gtk_widget_ref (buttondtmf0);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf0", buttondtmf0,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (buttondtmf0);
+ gtk_table_attach (GTK_TABLE (table1), buttondtmf0, 1, 2, 3, 4,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (buttondtmf0), 4);
+
+ buttondtmf15 = gtk_button_new_with_label ("#");
+ gtk_widget_ref (buttondtmf15);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf15", buttondtmf15,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (buttondtmf15);
+ gtk_table_attach (GTK_TABLE (table1), buttondtmf15, 2, 3, 3, 4,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (buttondtmf15), 4);
+
+ buttondtmf13 = gtk_button_new_with_label ("D");
+ gtk_widget_ref (buttondtmf13);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf13", buttondtmf13,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (buttondtmf13);
+ gtk_table_attach (GTK_TABLE (table1), buttondtmf13, 3, 4, 3, 4,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (buttondtmf13), 4);
+
+ table2 = gtk_table_new (7, 2, FALSE);
+ gtk_widget_ref (table2);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "table2", table2,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (table2);
+ gtk_box_pack_start (GTK_BOX (hbox2), table2, TRUE, TRUE, 0);
+
+ label1 = gtk_label_new ("TX CTCSS");
+ gtk_widget_ref (label1);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "label1", label1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (label1);
+ gtk_table_attach (GTK_TABLE (table2), label1, 0, 1, 0, 1,
+ (GtkAttachOptions) (0),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_padding (GTK_MISC (label1), 3, 3);
+
+ label2 = gtk_label_new ("RX CTCSS");
+ gtk_widget_ref (label2);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "label2", label2,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (label2);
+ gtk_table_attach (GTK_TABLE (table2), label2, 0, 1, 1, 2,
+ (GtkAttachOptions) (0),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_misc_set_padding (GTK_MISC (label2), 3, 3);
+
+ hbox3 = gtk_hbox_new (FALSE, 0);
+ gtk_widget_ref (hbox3);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "hbox3", hbox3,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (hbox3);
+ gtk_table_attach (GTK_TABLE (table2), hbox3, 1, 2, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+ partxctcss = gtk_check_button_new_with_label ("");
+ gtk_widget_ref (partxctcss);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "partxctcss", partxctcss,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (partxctcss);
+ gtk_box_pack_start (GTK_BOX (hbox3), partxctcss, FALSE, TRUE, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (partxctcss), 3);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (partxctcss), TRUE);
+
+ partxctcssfreq = gtk_combo_new ();
+ gtk_widget_ref (partxctcssfreq);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "partxctcssfreq", partxctcssfreq,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (partxctcssfreq);
+ gtk_box_pack_start (GTK_BOX (hbox3), partxctcssfreq, TRUE, TRUE, 0);
+ gtk_widget_set_usize (GTK_COMBO (partxctcssfreq)->entry, 34, -2);
+ gtk_widget_set_usize (partxctcssfreq, 50, -2);
+ gtk_container_set_border_width (GTK_CONTAINER (partxctcssfreq), 3);
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "67.0");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "69.3");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "71.9");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "74.4");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "77.0");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "79.7");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "82.5");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "85.4");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "88.5");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "91.5");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "94.8");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "97.4");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "100.0");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "103.5");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "107.2");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "110.9");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "114.8");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "118.8");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "123.0");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "127.3");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "131.8");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "136.5");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "141.3");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "146.2");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "151.4");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "156.7");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "162.2");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "167.9");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "173.8");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "179.9");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "186.2");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "192.8");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "203.5");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "210.7");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "218.1");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "225.7");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "233.6");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "241.8");
+ partxctcssfreq_items = g_list_append (partxctcssfreq_items, "250.3");
+ gtk_combo_set_popdown_strings (GTK_COMBO (partxctcssfreq), partxctcssfreq_items);
+ g_list_free (partxctcssfreq_items);
+
+ hbox4 = gtk_hbox_new (FALSE, 0);
+ gtk_widget_ref (hbox4);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "hbox4", hbox4,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (hbox4);
+ gtk_table_attach (GTK_TABLE (table2), hbox4, 1, 2, 1, 2,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+ parrxctcss = gtk_check_button_new_with_label ("");
+ gtk_widget_ref (parrxctcss);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "parrxctcss", parrxctcss,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (parrxctcss);
+ gtk_box_pack_start (GTK_BOX (hbox4), parrxctcss, FALSE, TRUE, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (parrxctcss), 3);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (parrxctcss), TRUE);
+
+ parrxctcssfreq = gtk_combo_new ();
+ gtk_widget_ref (parrxctcssfreq);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "parrxctcssfreq", parrxctcssfreq,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (parrxctcssfreq);
+ gtk_box_pack_start (GTK_BOX (hbox4), parrxctcssfreq, TRUE, TRUE, 0);
+ gtk_widget_set_usize (GTK_COMBO (parrxctcssfreq)->entry, 34, -2);
+ gtk_widget_set_usize (parrxctcssfreq, 50, -2);
+ gtk_container_set_border_width (GTK_CONTAINER (parrxctcssfreq), 3);
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "67.0");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "69.3");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "71.9");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "74.4");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "77.0");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "79.7");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "82.5");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "85.4");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "88.5");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "91.5");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "94.8");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "97.4");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "100.0");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "103.5");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "107.2");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "110.9");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "114.8");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "118.8");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "123.0");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "127.3");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "131.8");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "136.5");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "141.3");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "146.2");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "151.4");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "156.7");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "162.2");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "167.9");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "173.8");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "179.9");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "186.2");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "192.8");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "203.5");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "210.7");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "218.1");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "225.7");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "233.6");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "241.8");
+ parrxctcssfreq_items = g_list_append (parrxctcssfreq_items, "250.3");
+ gtk_combo_set_popdown_strings (GTK_COMBO (parrxctcssfreq), parrxctcssfreq_items);
+ g_list_free (parrxctcssfreq_items);
+
+ parsql = gtk_check_button_new_with_label ("Squelch");
+ gtk_widget_ref (parsql);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "parsql", parsql,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (parsql);
+ gtk_table_attach (GTK_TABLE (table2), parsql, 1, 2, 2, 3,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (parsql), 3);
+
+ meterrx = gtk_progress_bar_new ();
+ gtk_widget_ref (meterrx);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "meterrx", meterrx,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (meterrx);
+ gtk_box_pack_start (GTK_BOX (hbox2), meterrx, FALSE, FALSE, 0);
+ gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (meterrx), GTK_PROGRESS_BOTTOM_TO_TOP);
+ gtk_progress_set_show_text (GTK_PROGRESS (meterrx), TRUE);
+ gtk_progress_set_format_string (GTK_PROGRESS (meterrx), "%3V");
+
+ metertx = gtk_progress_bar_new ();
+ gtk_widget_ref (metertx);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "metertx", metertx,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (metertx);
+ gtk_box_pack_start (GTK_BOX (hbox2), metertx, FALSE, FALSE, 0);
+ gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (metertx), GTK_PROGRESS_BOTTOM_TO_TOP);
+ gtk_progress_set_show_text (GTK_PROGRESS (metertx), TRUE);
+ gtk_progress_set_format_string (GTK_PROGRESS (metertx), "%3V");
+
+ metersql = gtk_progress_bar_new ();
+ gtk_widget_ref (metersql);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "metersql", metersql,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (metersql);
+ gtk_box_pack_start (GTK_BOX (hbox2), metersql, FALSE, FALSE, 0);
+ gtk_progress_bar_set_orientation (GTK_PROGRESS_BAR (metersql), GTK_PROGRESS_BOTTOM_TO_TOP);
+ gtk_progress_set_show_text (GTK_PROGRESS (metersql), TRUE);
+ gtk_progress_set_format_string (GTK_PROGRESS (metersql), "%3V");
+
+ gtk_signal_connect (GTK_OBJECT (mainwindow), "delete_event",
+ GTK_SIGNAL_FUNC (on_mainwindow_delete_event),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (mainwindow), "destroy",
+ GTK_SIGNAL_FUNC (on_mainwindow_destroy),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (mainwindow), "key_press_event",
+ GTK_SIGNAL_FUNC (on_mainwindow_key_press_event),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (mainwindow), "key_release_event",
+ GTK_SIGNAL_FUNC (on_mainwindow_key_release_event),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (exit), "activate",
+ GTK_SIGNAL_FUNC (on_exit_activate),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (about), "activate",
+ GTK_SIGNAL_FUNC (on_about_activate),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (button1750), "pressed",
+ GTK_SIGNAL_FUNC (on_button1750_pressed),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (button1750), "released",
+ GTK_SIGNAL_FUNC (on_button1750_released),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (buttonptt), "pressed",
+ GTK_SIGNAL_FUNC (on_buttonptt_pressed),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (buttonptt), "released",
+ GTK_SIGNAL_FUNC (on_buttonptt_released),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf7), "pressed",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x17);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf7), "released",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x07);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf8), "pressed",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x18);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf8), "released",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x08);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf9), "pressed",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x19);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf9), "released",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x09);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf10), "pressed",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x1a);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf10), "released",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x0a);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf4), "pressed",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x14);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf4), "released",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x04);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf5), "pressed",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x15);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf5), "released",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x05);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf6), "pressed",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x16);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf6), "released",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x06);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf11), "pressed",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x1b);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf11), "released",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x0b);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf12), "pressed",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x1c);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf12), "released",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x0c);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf3), "pressed",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x13);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf3), "released",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x03);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf2), "pressed",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x12);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf2), "released",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x02);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf1), "pressed",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x11);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf1), "released",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x01);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf14), "pressed",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x1e);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf14), "released",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x0e);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf0), "pressed",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x10);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf0), "released",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x00);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf15), "pressed",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x1f);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf15), "released",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x0f);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf13), "pressed",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x1d);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf13), "released",
+ GTK_SIGNAL_FUNC (on_buttondtmf),
+ 0x0d);
+
+ gtk_window_add_accel_group (GTK_WINDOW (mainwindow), accel_group);
+
+ return mainwindow;
+}
+
diff --git a/eppfm/interface.h b/eppfm/interface.h
new file mode 100644
index 0000000..6cb95d4
--- /dev/null
+++ b/eppfm/interface.h
@@ -0,0 +1,5 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+GtkWidget* create_mainwindow (void);
diff --git a/eppfm/main.c b/eppfm/main.c
new file mode 100644
index 0000000..ff246cf
--- /dev/null
+++ b/eppfm/main.c
@@ -0,0 +1,179 @@
+/*****************************************************************************/
+
+/*
+ * main.c -- Main routines for "virtual transceiver".
+ *
+ * Copyright (C) 1999-2000 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define G_LOG_DOMAIN "eppfm"
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#ifdef HAVE_SYSLOG_H
+#include <syslog.h>
+#endif
+
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+
+#include <glib.h>
+#include <gtk/gtk.h>
+
+#include "eppfm.h"
+
+#include "interface.h"
+#include "support.h"
+
+/* ---------------------------------------------------------------------- */
+
+static struct adapter_config cfg = { 19666600, 9600, 0, 0, 0, 1, 1, 0, 1 };
+
+static unsigned verboselevel = 0;
+static unsigned syslogmsg = 0;
+
+/* ---------------------------------------------------------------------- */
+
+/*OutputDebugStringA*/
+int lprintf(unsigned vl, const char *format, ...)
+{
+ va_list ap;
+ int r;
+
+ if (vl > verboselevel)
+ return 0;
+ va_start(ap, format);
+#ifdef HAVE_VSYSLOG
+ if (syslogmsg) {
+ static const int logprio[] = { LOG_ERR, LOG_INFO };
+ vsyslog((vl > 1) ? LOG_DEBUG : logprio[vl], format, ap);
+ r = 0;
+ } else
+#endif
+ r = vfprintf(stderr, format, ap);
+ va_end(ap);
+ return r;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static gint periodic(gpointer data)
+{
+ GtkWidget *mainwindow = (GtkWidget *)data;
+ GtkWidget *meterrx;
+ GtkWidget *metertx;
+ unsigned ilvl, olvl;
+
+ ilvl = audio_getilevel();
+ olvl = audio_getolevel();
+ printf("ilvl %5u log %6.2f\n", ilvl, log(ilvl ? ilvl : 1) * (1.0 / 11.09));
+ meterrx = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(mainwindow), "meterrx"));
+ metertx = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(mainwindow), "metertx"));
+ gtk_progress_set_percentage(GTK_PROGRESS(meterrx), log(ilvl ? ilvl : 1) * (1.0 / 11.09));
+ gtk_progress_set_percentage(GTK_PROGRESS(metertx), log(olvl ? olvl : 1) * (1.0 / 11.09));
+ return TRUE;
+}
+
+/* ---------------------------------------------------------------------- */
+
+int main(int argc, char *argv[])
+{
+ GtkWidget *mainwindow;
+ gint tmtag;
+ int c, err = 0;
+ unsigned iobase = 0x378;
+
+ printf("EPP virtual transceiver (c) 1998-2000 by Thomas Sailer, HB9JNX/AE4WA\n");
+#if 0
+ bindtextdomain (PACKAGE, PACKAGE_LOCALE_DIR);
+ textdomain (PACKAGE);
+#endif
+
+ gtk_set_locale();
+ gtk_init(&argc, &argv);
+
+#if 0
+ add_pixmap_directory(PACKAGE_DATA_DIR "/pixmaps");
+ add_pixmap_directory(PACKAGE_SOURCE_DIR "/pixmaps");
+#endif
+
+ while ((c = getopt(argc, argv, "svp:m:")) != EOF) {
+ switch (c) {
+ case 'p':
+ iobase = strtoul(optarg, NULL, 0);
+ if (iobase <= 0 || iobase >= 0x3f8)
+ err++;
+ break;
+
+ case 'm':
+ parseconfig(&cfg, optarg);
+ break;
+
+ case 'v':
+ verboselevel++;
+ break;
+
+#if defined(HAVE_SYSLOG) && defined(HAVE_VSYSLOG)
+ case 's':
+ if (syslogmsg)
+ break;
+ openlog("eppfpga", LOG_PID, LOG_USER);
+ syslogmsg = 1;
+ break;
+#endif
+
+ default:
+ err++;
+ break;
+ }
+ }
+ if (err) {
+ g_message("usage: %s [-v] [-p <portaddr>] [-m <modestr>]\n", argv[0]);
+ exit(1);
+ }
+ if (parport_init_direct(iobase)) {
+ g_error("no parport found at 0x%x\n", iobase);
+ exit(1);
+ }
+ if (audio_start(&cfg)) {
+ g_error("Cannot start audio services\n");
+ exit(1);
+ }
+ mainwindow = create_mainwindow();
+ gtk_widget_show(mainwindow);
+ tmtag = gtk_timeout_add(250, periodic, mainwindow);
+ gtk_main();
+ gtk_timeout_remove(tmtag);
+ audio_stop();
+ return 0;
+}
+
diff --git a/eppfm/support.c b/eppfm/support.c
new file mode 100644
index 0000000..00c43db
--- /dev/null
+++ b/eppfm/support.c
@@ -0,0 +1,158 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <gtk/gtk.h>
+
+#include "support.h"
+
+/* This is an internally used function to check if a pixmap file exists. */
+static gchar* check_file_exists (const gchar *directory,
+ const gchar *filename);
+
+/* This is an internally used function to create pixmaps. */
+static GtkWidget* create_dummy_pixmap (GtkWidget *widget);
+
+GtkWidget*
+lookup_widget (GtkWidget *widget,
+ const gchar *widget_name)
+{
+ GtkWidget *parent, *found_widget;
+
+ for (;;)
+ {
+ if (GTK_IS_MENU (widget))
+ parent = gtk_menu_get_attach_widget (GTK_MENU (widget));
+ else
+ parent = widget->parent;
+ if (parent == NULL)
+ break;
+ widget = parent;
+ }
+
+ found_widget = (GtkWidget*) gtk_object_get_data (GTK_OBJECT (widget),
+ widget_name);
+ if (!found_widget)
+ g_warning ("Widget not found: %s", widget_name);
+ return found_widget;
+}
+
+/* This is a dummy pixmap we use when a pixmap can't be found. */
+static char *dummy_pixmap_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"1 1 1 1",
+" c None",
+/* pixels */
+" "
+};
+
+/* This is an internally used function to create pixmaps. */
+static GtkWidget*
+create_dummy_pixmap (GtkWidget *widget)
+{
+ GdkColormap *colormap;
+ GdkPixmap *gdkpixmap;
+ GdkBitmap *mask;
+ GtkWidget *pixmap;
+
+ colormap = gtk_widget_get_colormap (widget);
+ gdkpixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &mask,
+ NULL, dummy_pixmap_xpm);
+ if (gdkpixmap == NULL)
+ g_error ("Couldn't create replacement pixmap.");
+ pixmap = gtk_pixmap_new (gdkpixmap, mask);
+ gdk_pixmap_unref (gdkpixmap);
+ gdk_bitmap_unref (mask);
+ return pixmap;
+}
+
+static GList *pixmaps_directories = NULL;
+
+/* Use this function to set the directory containing installed pixmaps. */
+void
+add_pixmap_directory (const gchar *directory)
+{
+ pixmaps_directories = g_list_prepend (pixmaps_directories,
+ g_strdup (directory));
+}
+
+/* This is an internally used function to create pixmaps. */
+GtkWidget*
+create_pixmap (GtkWidget *widget,
+ const gchar *filename)
+{
+ gchar *found_filename = NULL;
+ GdkColormap *colormap;
+ GdkPixmap *gdkpixmap;
+ GdkBitmap *mask;
+ GtkWidget *pixmap;
+ GList *elem;
+
+ /* We first try any pixmaps directories set by the application. */
+ elem = pixmaps_directories;
+ while (elem)
+ {
+ found_filename = check_file_exists ((gchar*)elem->data, filename);
+ if (found_filename)
+ break;
+ elem = elem->next;
+ }
+
+ /* If we haven't found the pixmap, try the source directory. */
+ if (!found_filename)
+ {
+ found_filename = check_file_exists ("../pixmaps", filename);
+ }
+
+ if (!found_filename)
+ {
+ g_warning ("Couldn't find pixmap file: %s", filename);
+ return create_dummy_pixmap (widget);
+ }
+
+ colormap = gtk_widget_get_colormap (widget);
+ gdkpixmap = gdk_pixmap_colormap_create_from_xpm (NULL, colormap, &mask,
+ NULL, found_filename);
+ if (gdkpixmap == NULL)
+ {
+ g_warning ("Error loading pixmap file: %s", found_filename);
+ g_free (found_filename);
+ return create_dummy_pixmap (widget);
+ }
+ g_free (found_filename);
+ pixmap = gtk_pixmap_new (gdkpixmap, mask);
+ gdk_pixmap_unref (gdkpixmap);
+ gdk_bitmap_unref (mask);
+ return pixmap;
+}
+
+/* This is an internally used function to check if a pixmap file exists. */
+gchar*
+check_file_exists (const gchar *directory,
+ const gchar *filename)
+{
+ gchar *full_filename;
+ struct stat s;
+ gint status;
+
+ full_filename = (gchar*) g_malloc (strlen (directory) + 1
+ + strlen (filename) + 1);
+ strcpy (full_filename, directory);
+ strcat (full_filename, G_DIR_SEPARATOR_S);
+ strcat (full_filename, filename);
+
+ status = stat (full_filename, &s);
+ if (status == 0 && S_ISREG (s.st_mode))
+ return full_filename;
+ g_free (full_filename);
+ return NULL;
+}
+
diff --git a/eppfm/support.h b/eppfm/support.h
new file mode 100644
index 0000000..61a78e2
--- /dev/null
+++ b/eppfm/support.h
@@ -0,0 +1,34 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#include <gtk/gtk.h>
+
+/*
+ * Public Functions.
+ */
+
+/*
+ * This function returns a widget in a component created by Glade.
+ * Call it with the toplevel widget in the component (i.e. a window/dialog),
+ * or alternatively any widget in the component, and the name of the widget
+ * you want returned.
+ */
+GtkWidget* lookup_widget (GtkWidget *widget,
+ const gchar *widget_name);
+
+/* get_widget() is deprecated. Use lookup_widget instead. */
+#define get_widget lookup_widget
+
+/* Use this function to set the directory containing installed pixmaps. */
+void add_pixmap_directory (const gchar *directory);
+
+
+/*
+ * Private Functions.
+ */
+
+/* This is used to create the pixmaps in the interface. */
+GtkWidget* create_pixmap (GtkWidget *widget,
+ const gchar *filename);
+
diff --git a/eppfm2/AUTHORS b/eppfm2/AUTHORS
new file mode 100644
index 0000000..c1e0a1f
--- /dev/null
+++ b/eppfm2/AUTHORS
@@ -0,0 +1 @@
+Thomas Sailer, <sailer at ife.ee.ethz.ch>
diff --git a/eppfm2/ChangeLog b/eppfm2/ChangeLog
new file mode 100644
index 0000000..e69de29
diff --git a/eppfm2/Makefile.am b/eppfm2/Makefile.am
new file mode 100644
index 0000000..a87fefc
--- /dev/null
+++ b/eppfm2/Makefile.am
@@ -0,0 +1,15 @@
+## Process this file with automake to produce Makefile.in
+
+SUBDIRS = src
+
+#install-data-local:
+# test -d $(srcdir)/pixmaps \
+# && install -d -m 0755 $(pkgdatadir)/pixmaps \
+# && install -m 0644 $(srcdir)/pixmaps/* $(pkgdatadir)/pixmaps
+
+#dist-hook:
+# test -d pixmaps \
+# && mkdir $(distdir)/pixmaps \
+# && cp -p pixmaps/* $(distdir)/pixmaps
+
+EXTRA_DIST = eppfm.glade
diff --git a/eppfm2/Makefile.in b/eppfm2/Makefile.in
new file mode 100644
index 0000000..f9e273a
--- /dev/null
+++ b/eppfm2/Makefile.in
@@ -0,0 +1,332 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AS = @AS@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+DATADIRNAME = @DATADIRNAME@
+DLLTOOL = @DLLTOOL@
+DRVLIBOBJS = @DRVLIBOBJS@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+HAVE_BITTYPES = @HAVE_BITTYPES@
+HAVE_DIRECTX = @HAVE_DIRECTX@
+HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@
+HAVE_IOFUNCS = @HAVE_IOFUNCS@
+HAVE_LIB = @HAVE_LIB@
+HAVE_MKISS = @HAVE_MKISS@
+HAVE_PPKDRV = @HAVE_PPKDRV@
+HAVE_PPUSER = @HAVE_PPUSER@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LIB = @LIB@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LTLIB = @LTLIB@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+M_PI = @M_PI@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+
+SUBDIRS = src
+
+#install-data-local:
+# test -d $(srcdir)/pixmaps \
+# && install -d -m 0755 $(pkgdatadir)/pixmaps \
+# && install -m 0644 $(srcdir)/pixmaps/* $(pkgdatadir)/pixmaps
+
+#dist-hook:
+# test -d pixmaps \
+# && mkdir $(distdir)/pixmaps \
+# && cp -p pixmaps/* $(distdir)/pixmaps
+
+EXTRA_DIST = eppfm.glade
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES =
+DIST_COMMON = README AUTHORS ChangeLog Makefile.am Makefile.in NEWS \
+configure configure.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps eppfm2/Makefile
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+# This directory's subdirectories are mostly independent; you can cd
+# into them and run `make' without going through this Makefile.
+# To change the values of `make' variables: instead of editing Makefiles,
+# (1) if the variable is set in `config.status', edit `config.status'
+# (which will cause the Makefiles to be regenerated when you run `make');
+# (2) otherwise, pass the desired values on the `make' command line.
+
+ at SET_MAKE@
+
+all-recursive install-data-recursive install-exec-recursive \
+installdirs-recursive install-recursive uninstall-recursive \
+check-recursive installcheck-recursive info-recursive dvi-recursive:
+ @set fnord $(MAKEFLAGS); amf=$$2; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ dot_seen=yes; \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done; \
+ if test "$$dot_seen" = "no"; then \
+ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
+ fi; test -z "$$fail"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @set fnord $(MAKEFLAGS); amf=$$2; \
+ dot_seen=no; \
+ rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
+ rev="$$subdir $$rev"; \
+ test "$$subdir" != "." || dot_seen=yes; \
+ done; \
+ test "$$dot_seen" = "no" && rev=". $$rev"; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ if test "$$subdir" = .; then :; else \
+ test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = eppfm2
+
+distdir: $(DISTFILES)
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+ for subdir in $(SUBDIRS); do \
+ if test "$$subdir" = .; then :; else \
+ test -d $(distdir)/$$subdir \
+ || mkdir $(distdir)/$$subdir \
+ || exit 1; \
+ chmod 777 $(distdir)/$$subdir; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(top_distdir) distdir=../$(distdir)/$$subdir distdir) \
+ || exit 1; \
+ fi; \
+ done
+info-am:
+info: info-recursive
+dvi-am:
+dvi: dvi-recursive
+check-am: all-am
+check: check-recursive
+installcheck-am:
+installcheck: installcheck-recursive
+install-exec-am:
+install-exec: install-exec-recursive
+
+install-data-am:
+install-data: install-data-recursive
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-recursive
+uninstall-am:
+uninstall: uninstall-recursive
+all-am: Makefile
+all-redirect: all-recursive
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs: installdirs-recursive
+installdirs-am:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-recursive
+
+clean-am: clean-tags clean-generic mostlyclean-am
+
+clean: clean-recursive
+
+distclean-am: distclean-tags distclean-generic clean-am
+
+distclean: distclean-recursive
+
+maintainer-clean-am: maintainer-clean-tags maintainer-clean-generic \
+ distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-recursive
+
+.PHONY: install-data-recursive uninstall-data-recursive \
+install-exec-recursive uninstall-exec-recursive installdirs-recursive \
+uninstalldirs-recursive all-recursive check-recursive \
+installcheck-recursive info-recursive dvi-recursive \
+mostlyclean-recursive distclean-recursive clean-recursive \
+maintainer-clean-recursive tags tags-recursive mostlyclean-tags \
+distclean-tags clean-tags maintainer-clean-tags distdir info-am info \
+dvi-am dvi check check-am installcheck-am installcheck install-exec-am \
+install-exec install-data-am install-data install-am install \
+uninstall-am uninstall all-redirect all-am all installdirs-am \
+installdirs mostlyclean-generic distclean-generic clean-generic \
+maintainer-clean-generic clean mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/eppfm2/NEWS b/eppfm2/NEWS
new file mode 100644
index 0000000..e69de29
diff --git a/eppfm2/README b/eppfm2/README
new file mode 100644
index 0000000..e69de29
diff --git a/eppfm2/configure b/eppfm2/configure
new file mode 100755
index 0000000..adc156d
--- /dev/null
+++ b/eppfm2/configure
@@ -0,0 +1,4114 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+ --with-gtk-prefix=PFX Prefix where GTK is installed (optional)"
+ac_help="$ac_help
+ --with-gtk-exec-prefix=PFX Exec prefix where GTK is installed (optional)"
+ac_help="$ac_help
+ --disable-gtktest Do not try to compile and run a test GTK program"
+ac_help="$ac_help
+ --disable-nls do not use Native Language Support"
+ac_help="$ac_help
+ --with-included-gettext use the GNU gettext library included here"
+ac_help="$ac_help
+ --with-catgets use catgets functions if available"
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ case "$ac_option" in
+ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir="$ac_optarg" ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$ac_optarg" ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file="$ac_optarg" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix="$ac_optarg" ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he)
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$ac_optarg" ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir="$ac_optarg" ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir="$ac_optarg" ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir="$ac_optarg" ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir="$ac_optarg" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir="$ac_optarg" ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir="$ac_optarg" ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir="$ac_optarg" ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix="$ac_optarg" ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix="$ac_optarg" ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix="$ac_optarg" ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name="$ac_optarg" ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir="$ac_optarg" ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir="$ac_optarg" ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site="$ac_optarg" ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir="$ac_optarg" ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir="$ac_optarg" ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.13"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval "with_${ac_package}=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes="$ac_optarg" ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries="$ac_optarg" ;;
+
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=configure.in
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi at caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:568: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":"
+ for ac_dir in $PATH; do
+ # Account for people who put trailing slashes in PATH elements.
+ case "$ac_dir/" in
+ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ if test -f $ac_dir/$ac_prog; then
+ if test $ac_prog = install &&
+ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ else
+ ac_cv_path_install="$ac_dir/$ac_prog -c"
+ break 2
+ fi
+ fi
+ done
+ ;;
+ esac
+ done
+ IFS="$ac_save_IFS"
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL="$ac_cv_path_install"
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL="$ac_install_sh"
+ fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
+echo "configure:621: checking whether build environment is sane" >&5
+# Just in case
+sleep 1
+echo timestamp > conftestfile
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null`
+ if test "$*" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftestfile`
+ fi
+ if test "$*" != "X $srcdir/configure conftestfile" \
+ && test "$*" != "X conftestfile $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ { echo "configure: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" 1>&2; exit 1; }
+ fi
+
+ test "$2" = conftestfile
+ )
+then
+ # Ok.
+ :
+else
+ { echo "configure: error: newly created file is older than distributed files!
+Check your system clock" 1>&2; exit 1; }
+fi
+rm -f conftest*
+echo "$ac_t""yes" 1>&6
+if test "$program_transform_name" = s,x,x,; then
+ program_transform_name=
+else
+ # Double any \ or $. echo might interpret backslashes.
+ cat <<\EOF_SED > conftestsed
+s,\\,\\\\,g; s,\$,$$,g
+EOF_SED
+ program_transform_name="`echo $program_transform_name|sed -f conftestsed`"
+ rm -f conftestsed
+fi
+test "$program_prefix" != NONE &&
+ program_transform_name="s,^,${program_prefix},; $program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+ program_transform_name="s,\$\$,${program_suffix},; $program_transform_name"
+
+# sed with no file args requires a program.
+test "$program_transform_name" = "" && program_transform_name="s,x,x,"
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:678: checking whether ${MAKE-make} sets \${MAKE}" >&5
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftestmake <<\EOF
+all:
+ @echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftestmake
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ SET_MAKE=
+else
+ echo "$ac_t""no" 1>&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+PACKAGE=eppfm
+
+VERSION=0.1
+
+if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then
+ { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; }
+fi
+cat >> confdefs.h <<EOF
+#define PACKAGE "$PACKAGE"
+EOF
+
+cat >> confdefs.h <<EOF
+#define VERSION "$VERSION"
+EOF
+
+
+
+missing_dir=`cd $ac_aux_dir && pwd`
+echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
+echo "configure:724: checking for working aclocal" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (aclocal --version) < /dev/null > /dev/null 2>&1; then
+ ACLOCAL=aclocal
+ echo "$ac_t""found" 1>&6
+else
+ ACLOCAL="$missing_dir/missing aclocal"
+ echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
+echo "configure:737: checking for working autoconf" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (autoconf --version) < /dev/null > /dev/null 2>&1; then
+ AUTOCONF=autoconf
+ echo "$ac_t""found" 1>&6
+else
+ AUTOCONF="$missing_dir/missing autoconf"
+ echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working automake""... $ac_c" 1>&6
+echo "configure:750: checking for working automake" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (automake --version) < /dev/null > /dev/null 2>&1; then
+ AUTOMAKE=automake
+ echo "$ac_t""found" 1>&6
+else
+ AUTOMAKE="$missing_dir/missing automake"
+ echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
+echo "configure:763: checking for working autoheader" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (autoheader --version) < /dev/null > /dev/null 2>&1; then
+ AUTOHEADER=autoheader
+ echo "$ac_t""found" 1>&6
+else
+ AUTOHEADER="$missing_dir/missing autoheader"
+ echo "$ac_t""missing" 1>&6
+fi
+
+echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
+echo "configure:776: checking for working makeinfo" >&5
+# Run test in a subshell; some versions of sh will print an error if
+# an executable is not found, even if stderr is redirected.
+# Redirect stdin to placate older versions of autoconf. Sigh.
+if (makeinfo --version) < /dev/null > /dev/null 2>&1; then
+ MAKEINFO=makeinfo
+ echo "$ac_t""found" 1>&6
+else
+ MAKEINFO="$missing_dir/missing makeinfo"
+ echo "$ac_t""missing" 1>&6
+fi
+
+
+
+
+
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:796: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:826: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_prog_rejected=no
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test -z "$CC"; then
+ case "`uname -s`" in
+ *win32* | *WIN32*)
+ # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:877: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="cl"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+ ;;
+ esac
+ fi
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:909: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 920 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:925: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ ac_cv_prog_cc_works=yes
+ # If we can't run a trivial program, we are probably using a cross compiler.
+ if (./conftest; exit) 2>/dev/null; then
+ ac_cv_prog_cc_cross=no
+ else
+ ac_cv_prog_cc_cross=yes
+ fi
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+ { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:951: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:956: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:965: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+
+ac_test_CFLAGS="${CFLAGS+set}"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS=
+echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:984: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+
+echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6
+echo "configure:1016: checking for POSIXized ISC" >&5
+if test -d /etc/conf/kconfig.d &&
+ grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1
+then
+ echo "$ac_t""yes" 1>&6
+ ISC=yes # If later tests want to check for ISC.
+ cat >> confdefs.h <<\EOF
+#define _POSIX_SOURCE 1
+EOF
+
+ if test "$GCC" = yes; then
+ CC="$CC -posix"
+ else
+ CC="$CC -Xp"
+ fi
+else
+ echo "$ac_t""no" 1>&6
+ ISC=
+fi
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1039: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1069: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_prog_rejected=no
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test -z "$CC"; then
+ case "`uname -s`" in
+ *win32* | *WIN32*)
+ # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1120: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="cl"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+ ;;
+ esac
+ fi
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:1152: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 1163 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:1168: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ ac_cv_prog_cc_works=yes
+ # If we can't run a trivial program, we are probably using a cross compiler.
+ if (./conftest; exit) 2>/dev/null; then
+ ac_cv_prog_cc_cross=no
+ else
+ ac_cv_prog_cc_cross=yes
+ fi
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+ { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:1194: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:1199: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1208: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+else
+ GCC=
+fi
+
+ac_test_CFLAGS="${CFLAGS+set}"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS=
+echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:1227: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+
+
+
+
+echo $ac_n "checking for ${CC-cc} option to accept ANSI C""... $ac_c" 1>&6
+echo "configure:1262: checking for ${CC-cc} option to accept ANSI C" >&5
+if eval "test \"`echo '$''{'am_cv_prog_cc_stdc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ am_cv_prog_cc_stdc=no
+ac_save_CC="$CC"
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX -qlanglvl=ansi
+# Ultrix and OSF/1 -std1
+# HP-UX -Aa -D_HPUX_SOURCE
+# SVR4 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ cat > conftest.$ac_ext <<EOF
+#line 1278 "configure"
+#include "confdefs.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+
+int main() {
+
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+
+; return 0; }
+EOF
+if { (eval echo configure:1315: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ am_cv_prog_cc_stdc="$ac_arg"; break
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+done
+CC="$ac_save_CC"
+
+fi
+
+if test -z "$am_cv_prog_cc_stdc"; then
+ echo "$ac_t""none needed" 1>&6
+else
+ echo "$ac_t""$am_cv_prog_cc_stdc" 1>&6
+fi
+case "x$am_cv_prog_cc_stdc" in
+ x|xno) ;;
+ *) CC="$CC $am_cv_prog_cc_stdc" ;;
+esac
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:1339: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # This must be in double quotes, not single quotes, because CPP may get
+ # substituted into the Makefile and "${CC-cc}" will confuse make.
+ CPP="${CC-cc} -E"
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp.
+ cat > conftest.$ac_ext <<EOF
+#line 1354 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1360: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -E -traditional-cpp"
+ cat > conftest.$ac_ext <<EOF
+#line 1371 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1377: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -nologo -E"
+ cat > conftest.$ac_ext <<EOF
+#line 1388 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1394: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+ ac_cv_prog_CPP="$CPP"
+fi
+ CPP="$ac_cv_prog_CPP"
+else
+ ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
+echo "configure:1419: checking for ANSI C header files" >&5
+if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1424 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1432: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ ac_cv_header_stdc=yes
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 1449 "configure"
+#include "confdefs.h"
+#include <string.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "memchr" >/dev/null 2>&1; then
+ :
+else
+ rm -rf conftest*
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 1467 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "free" >/dev/null 2>&1; then
+ :
+else
+ rm -rf conftest*
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+if test "$cross_compiling" = yes; then
+ :
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1488 "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int main () { int i; for (i = 0; i < 256; i++)
+if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
+exit (0); }
+
+EOF
+if { (eval echo configure:1499: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ :
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_header_stdc=no
+fi
+rm -fr conftest*
+fi
+
+fi
+fi
+
+echo "$ac_t""$ac_cv_header_stdc" 1>&6
+if test $ac_cv_header_stdc = yes; then
+ cat >> confdefs.h <<\EOF
+#define STDC_HEADERS 1
+EOF
+
+fi
+
+
+# Check whether --with-gtk-prefix or --without-gtk-prefix was given.
+if test "${with_gtk_prefix+set}" = set; then
+ withval="$with_gtk_prefix"
+ gtk_config_prefix="$withval"
+else
+ gtk_config_prefix=""
+fi
+
+# Check whether --with-gtk-exec-prefix or --without-gtk-exec-prefix was given.
+if test "${with_gtk_exec_prefix+set}" = set; then
+ withval="$with_gtk_exec_prefix"
+ gtk_config_exec_prefix="$withval"
+else
+ gtk_config_exec_prefix=""
+fi
+
+# Check whether --enable-gtktest or --disable-gtktest was given.
+if test "${enable_gtktest+set}" = set; then
+ enableval="$enable_gtktest"
+ :
+else
+ enable_gtktest=yes
+fi
+
+
+ for module in .
+ do
+ case "$module" in
+ gthread)
+ gtk_config_args="$gtk_config_args gthread"
+ ;;
+ esac
+ done
+
+ if test x$gtk_config_exec_prefix != x ; then
+ gtk_config_args="$gtk_config_args --exec-prefix=$gtk_config_exec_prefix"
+ if test x${GTK_CONFIG+set} != xset ; then
+ GTK_CONFIG=$gtk_config_exec_prefix/bin/gtk-config
+ fi
+ fi
+ if test x$gtk_config_prefix != x ; then
+ gtk_config_args="$gtk_config_args --prefix=$gtk_config_prefix"
+ if test x${GTK_CONFIG+set} != xset ; then
+ GTK_CONFIG=$gtk_config_prefix/bin/gtk-config
+ fi
+ fi
+
+ # Extract the first word of "gtk-config", so it can be a program name with args.
+set dummy gtk-config; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1573: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_GTK_CONFIG'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$GTK_CONFIG" in
+ /*)
+ ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_GTK_CONFIG="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_GTK_CONFIG" && ac_cv_path_GTK_CONFIG="no"
+ ;;
+esac
+fi
+GTK_CONFIG="$ac_cv_path_GTK_CONFIG"
+if test -n "$GTK_CONFIG"; then
+ echo "$ac_t""$GTK_CONFIG" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ min_gtk_version=1.2.0
+ echo $ac_n "checking for GTK - version >= $min_gtk_version""... $ac_c" 1>&6
+echo "configure:1608: checking for GTK - version >= $min_gtk_version" >&5
+ no_gtk=""
+ if test "$GTK_CONFIG" = "no" ; then
+ no_gtk=yes
+ else
+ GTK_CFLAGS=`$GTK_CONFIG $gtk_config_args --cflags`
+ GTK_LIBS=`$GTK_CONFIG $gtk_config_args --libs`
+ gtk_config_major_version=`$GTK_CONFIG $gtk_config_args --version | \
+ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'`
+ gtk_config_minor_version=`$GTK_CONFIG $gtk_config_args --version | \
+ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'`
+ gtk_config_micro_version=`$GTK_CONFIG $gtk_config_args --version | \
+ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'`
+ if test "x$enable_gtktest" = "xyes" ; then
+ ac_save_CFLAGS="$CFLAGS"
+ ac_save_LIBS="$LIBS"
+ CFLAGS="$CFLAGS $GTK_CFLAGS"
+ LIBS="$GTK_LIBS $LIBS"
+ rm -f conf.gtktest
+ if test "$cross_compiling" = yes; then
+ echo $ac_n "cross compiling; assumed OK... $ac_c"
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1631 "configure"
+#include "confdefs.h"
+
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+int
+main ()
+{
+ int major, minor, micro;
+ char *tmp_version;
+
+ system ("touch conf.gtktest");
+
+ /* HP/UX 9 (%@#!) writes to sscanf strings */
+ tmp_version = g_strdup("$min_gtk_version");
+ if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) {
+ printf("%s, bad version string\n", "$min_gtk_version");
+ exit(1);
+ }
+
+ if ((gtk_major_version != $gtk_config_major_version) ||
+ (gtk_minor_version != $gtk_config_minor_version) ||
+ (gtk_micro_version != $gtk_config_micro_version))
+ {
+ printf("\n*** 'gtk-config --version' returned %d.%d.%d, but GTK+ (%d.%d.%d)\n",
+ $gtk_config_major_version, $gtk_config_minor_version, $gtk_config_micro_version,
+ gtk_major_version, gtk_minor_version, gtk_micro_version);
+ printf ("*** was found! If gtk-config was correct, then it is best\n");
+ printf ("*** to remove the old version of GTK+. You may also be able to fix the error\n");
+ printf("*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing\n");
+ printf("*** /etc/ld.so.conf. Make sure you have run ldconfig if that is\n");
+ printf("*** required on your system.\n");
+ printf("*** If gtk-config was wrong, set the environment variable GTK_CONFIG\n");
+ printf("*** to point to the correct copy of gtk-config, and remove the file config.cache\n");
+ printf("*** before re-running configure\n");
+ }
+#if defined (GTK_MAJOR_VERSION) && defined (GTK_MINOR_VERSION) && defined (GTK_MICRO_VERSION)
+ else if ((gtk_major_version != GTK_MAJOR_VERSION) ||
+ (gtk_minor_version != GTK_MINOR_VERSION) ||
+ (gtk_micro_version != GTK_MICRO_VERSION))
+ {
+ printf("*** GTK+ header files (version %d.%d.%d) do not match\n",
+ GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION);
+ printf("*** library (version %d.%d.%d)\n",
+ gtk_major_version, gtk_minor_version, gtk_micro_version);
+ }
+#endif /* defined (GTK_MAJOR_VERSION) ... */
+ else
+ {
+ if ((gtk_major_version > major) ||
+ ((gtk_major_version == major) && (gtk_minor_version > minor)) ||
+ ((gtk_major_version == major) && (gtk_minor_version == minor) && (gtk_micro_version >= micro)))
+ {
+ return 0;
+ }
+ else
+ {
+ printf("\n*** An old version of GTK+ (%d.%d.%d) was found.\n",
+ gtk_major_version, gtk_minor_version, gtk_micro_version);
+ printf("*** You need a version of GTK+ newer than %d.%d.%d. The latest version of\n",
+ major, minor, micro);
+ printf("*** GTK+ is always available from ftp://ftp.gtk.org.\n");
+ printf("***\n");
+ printf("*** If you have already installed a sufficiently new version, this error\n");
+ printf("*** probably means that the wrong copy of the gtk-config shell script is\n");
+ printf("*** being found. The easiest way to fix this is to remove the old version\n");
+ printf("*** of GTK+, but you can also set the GTK_CONFIG environment to point to the\n");
+ printf("*** correct copy of gtk-config. (In this case, you will have to\n");
+ printf("*** modify your LD_LIBRARY_PATH enviroment variable, or edit /etc/ld.so.conf\n");
+ printf("*** so that the correct libraries are found at run-time))\n");
+ }
+ }
+ return 1;
+}
+
+EOF
+if { (eval echo configure:1709: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ :
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ no_gtk=yes
+fi
+rm -fr conftest*
+fi
+
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ if test "x$no_gtk" = x ; then
+ echo "$ac_t""yes" 1>&6
+ :
+ else
+ echo "$ac_t""no" 1>&6
+ if test "$GTK_CONFIG" = "no" ; then
+ echo "*** The gtk-config script installed by GTK could not be found"
+ echo "*** If GTK was installed in PREFIX, make sure PREFIX/bin is in"
+ echo "*** your path, or set the GTK_CONFIG environment variable to the"
+ echo "*** full path to gtk-config."
+ else
+ if test -f conf.gtktest ; then
+ :
+ else
+ echo "*** Could not run GTK test program, checking why..."
+ CFLAGS="$CFLAGS $GTK_CFLAGS"
+ LIBS="$LIBS $GTK_LIBS"
+ cat > conftest.$ac_ext <<EOF
+#line 1743 "configure"
+#include "confdefs.h"
+
+#include <gtk/gtk.h>
+#include <stdio.h>
+
+int main() {
+ return ((gtk_major_version) || (gtk_minor_version) || (gtk_micro_version));
+; return 0; }
+EOF
+if { (eval echo configure:1753: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ echo "*** The test program compiled, but did not run. This usually means"
+ echo "*** that the run-time linker is not finding GTK or finding the wrong"
+ echo "*** version of GTK. If it is not finding GTK, you'll need to set your"
+ echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
+ echo "*** to the installed location Also, make sure you have run ldconfig if that"
+ echo "*** is required on your system"
+ echo "***"
+ echo "*** If you have an old version installed, it is best to remove it, although"
+ echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
+ echo "***"
+ echo "*** If you have a RedHat 5.0 system, you should remove the GTK package that"
+ echo "*** came with the system with the command"
+ echo "***"
+ echo "*** rpm --erase --nodeps gtk gtk-devel"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ echo "*** The test program failed to compile or link. See the file config.log for the"
+ echo "*** exact error that occured. This usually means GTK was incorrectly installed"
+ echo "*** or that you have moved GTK since it was installed. In the latter case, you"
+ echo "*** may want to edit the gtk-config script: $GTK_CONFIG"
+fi
+rm -f conftest*
+ CFLAGS="$ac_save_CFLAGS"
+ LIBS="$ac_save_LIBS"
+ fi
+ fi
+ GTK_CFLAGS=""
+ GTK_LIBS=""
+ { echo "configure: error: Cannot find GTK: Is gtk-config in path?" 1>&2; exit 1; }
+ fi
+
+
+ rm -f conf.gtktest
+
+
+ALL_LINGUAS=""
+# Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1796: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_RANLIB="ranlib"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+ echo "$ac_t""$RANLIB" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+echo $ac_n "checking for working const""... $ac_c" 1>&6
+echo "configure:1824: checking for working const" >&5
+if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1829 "configure"
+#include "confdefs.h"
+
+int main() {
+
+/* Ultrix mips cc rejects this. */
+typedef int charset[2]; const charset x;
+/* SunOS 4.1.1 cc rejects this. */
+char const *const *ccp;
+char **p;
+/* NEC SVR4.0.2 mips cc rejects this. */
+struct point {int x, y;};
+static struct point const zero = {0,0};
+/* AIX XL C 1.02.0.0 rejects this.
+ It does not let you subtract one const X* pointer from another in an arm
+ of an if-expression whose if-part is not a constant expression */
+const char *g = "string";
+ccp = &g + (g ? g-g : 0);
+/* HPUX 7.0 cc rejects these. */
+++ccp;
+p = (char**) ccp;
+ccp = (char const *const *) p;
+{ /* SCO 3.2v4 cc rejects this. */
+ char *t;
+ char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+ *t++ = 0;
+}
+{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
+ int x[] = {25, 17};
+ const int *foo = &x[0];
+ ++foo;
+}
+{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+ typedef const int *iptr;
+ iptr p = 0;
+ ++p;
+}
+{ /* AIX XL C 1.02.0.0 rejects this saying
+ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+ struct s { int j; const int *ap[3]; };
+ struct s *b; b->j = 5;
+}
+{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+ const int foo = 10;
+}
+
+; return 0; }
+EOF
+if { (eval echo configure:1878: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_c_const=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_c_const=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_c_const" 1>&6
+if test $ac_cv_c_const = no; then
+ cat >> confdefs.h <<\EOF
+#define const
+EOF
+
+fi
+
+echo $ac_n "checking for inline""... $ac_c" 1>&6
+echo "configure:1899: checking for inline" >&5
+if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat > conftest.$ac_ext <<EOF
+#line 1906 "configure"
+#include "confdefs.h"
+
+int main() {
+} $ac_kw foo() {
+; return 0; }
+EOF
+if { (eval echo configure:1913: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_c_inline=$ac_kw; break
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+done
+
+fi
+
+echo "$ac_t""$ac_cv_c_inline" 1>&6
+case "$ac_cv_c_inline" in
+ inline | yes) ;;
+ no) cat >> confdefs.h <<\EOF
+#define inline
+EOF
+ ;;
+ *) cat >> confdefs.h <<EOF
+#define inline $ac_cv_c_inline
+EOF
+ ;;
+esac
+
+echo $ac_n "checking for off_t""... $ac_c" 1>&6
+echo "configure:1939: checking for off_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1944 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "(^|[^a-zA-Z_0-9])off_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_type_off_t=yes
+else
+ rm -rf conftest*
+ ac_cv_type_off_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_off_t" 1>&6
+if test $ac_cv_type_off_t = no; then
+ cat >> confdefs.h <<\EOF
+#define off_t long
+EOF
+
+fi
+
+echo $ac_n "checking for size_t""... $ac_c" 1>&6
+echo "configure:1972: checking for size_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1977 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_type_size_t=yes
+else
+ rm -rf conftest*
+ ac_cv_type_size_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_size_t" 1>&6
+if test $ac_cv_type_size_t = no; then
+ cat >> confdefs.h <<\EOF
+#define size_t unsigned
+EOF
+
+fi
+
+# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
+# for constant arguments. Useless!
+echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
+echo "configure:2007: checking for working alloca.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2012 "configure"
+#include "confdefs.h"
+#include <alloca.h>
+int main() {
+char *p = alloca(2 * sizeof(int));
+; return 0; }
+EOF
+if { (eval echo configure:2019: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ ac_cv_header_alloca_h=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_header_alloca_h=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_header_alloca_h" 1>&6
+if test $ac_cv_header_alloca_h = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_ALLOCA_H 1
+EOF
+
+fi
+
+echo $ac_n "checking for alloca""... $ac_c" 1>&6
+echo "configure:2040: checking for alloca" >&5
+if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2045 "configure"
+#include "confdefs.h"
+
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+#else
+# ifdef _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+# else
+# if HAVE_ALLOCA_H
+# include <alloca.h>
+# else
+# ifdef _AIX
+ #pragma alloca
+# else
+# ifndef alloca /* predefined by HP cc +Olibcalls */
+char *alloca ();
+# endif
+# endif
+# endif
+# endif
+#endif
+
+int main() {
+char *p = (char *) alloca(1);
+; return 0; }
+EOF
+if { (eval echo configure:2073: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ ac_cv_func_alloca_works=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_func_alloca_works=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_func_alloca_works" 1>&6
+if test $ac_cv_func_alloca_works = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_ALLOCA 1
+EOF
+
+fi
+
+if test $ac_cv_func_alloca_works = no; then
+ # The SVR3 libPW and SVR4 libucb both contain incompatible functions
+ # that cause trouble. Some versions do not even contain alloca or
+ # contain a buggy version. If you still want to use their alloca,
+ # use ar to extract alloca.o from them instead of compiling alloca.c.
+ ALLOCA=alloca.${ac_objext}
+ cat >> confdefs.h <<\EOF
+#define C_ALLOCA 1
+EOF
+
+
+echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
+echo "configure:2105: checking whether alloca needs Cray hooks" >&5
+if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2110 "configure"
+#include "confdefs.h"
+#if defined(CRAY) && ! defined(CRAY2)
+webecray
+#else
+wenotbecray
+#endif
+
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "webecray" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_os_cray=yes
+else
+ rm -rf conftest*
+ ac_cv_os_cray=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_os_cray" 1>&6
+if test $ac_cv_os_cray = yes; then
+for ac_func in _getb67 GETB67 getb67; do
+ echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2135: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2140 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2163: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ cat >> confdefs.h <<EOF
+#define CRAY_STACKSEG_END $ac_func
+EOF
+
+ break
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+done
+fi
+
+echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
+echo "configure:2190: checking stack direction for C alloca" >&5
+if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_c_stack_direction=0
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2198 "configure"
+#include "confdefs.h"
+find_stack_direction ()
+{
+ static char *addr = 0;
+ auto char dummy;
+ if (addr == 0)
+ {
+ addr = &dummy;
+ return find_stack_direction ();
+ }
+ else
+ return (&dummy > addr) ? 1 : -1;
+}
+main ()
+{
+ exit (find_stack_direction() < 0);
+}
+EOF
+if { (eval echo configure:2217: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_c_stack_direction=1
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_c_stack_direction=-1
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$ac_cv_c_stack_direction" 1>&6
+cat >> confdefs.h <<EOF
+#define STACK_DIRECTION $ac_cv_c_stack_direction
+EOF
+
+fi
+
+for ac_hdr in unistd.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:2242: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2247 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2252: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+for ac_func in getpagesize
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2281: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2286 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2309: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+echo $ac_n "checking for working mmap""... $ac_c" 1>&6
+echo "configure:2334: checking for working mmap" >&5
+if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_mmap_fixed_mapped=no
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2342 "configure"
+#include "confdefs.h"
+
+/* Thanks to Mike Haertel and Jim Avera for this test.
+ Here is a matrix of mmap possibilities:
+ mmap private not fixed
+ mmap private fixed at somewhere currently unmapped
+ mmap private fixed at somewhere already mapped
+ mmap shared not fixed
+ mmap shared fixed at somewhere currently unmapped
+ mmap shared fixed at somewhere already mapped
+ For private mappings, we should verify that changes cannot be read()
+ back from the file, nor mmap's back from the file at a different
+ address. (There have been systems where private was not correctly
+ implemented like the infamous i386 svr4.0, and systems where the
+ VM page cache was not coherent with the filesystem buffer cache
+ like early versions of FreeBSD and possibly contemporary NetBSD.)
+ For shared mappings, we should conversely verify that changes get
+ propogated back to all the places they're supposed to be.
+
+ Grep wants private fixed already mapped.
+ The main things grep needs to know about mmap are:
+ * does it exist and is it safe to write into the mmap'd area
+ * how to use it (BSD variants) */
+#include <sys/types.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+
+/* This mess was copied from the GNU getpagesize.h. */
+#ifndef HAVE_GETPAGESIZE
+# ifdef HAVE_UNISTD_H
+# include <unistd.h>
+# endif
+
+/* Assume that all systems that can run configure have sys/param.h. */
+# ifndef HAVE_SYS_PARAM_H
+# define HAVE_SYS_PARAM_H 1
+# endif
+
+# ifdef _SC_PAGESIZE
+# define getpagesize() sysconf(_SC_PAGESIZE)
+# else /* no _SC_PAGESIZE */
+# ifdef HAVE_SYS_PARAM_H
+# include <sys/param.h>
+# ifdef EXEC_PAGESIZE
+# define getpagesize() EXEC_PAGESIZE
+# else /* no EXEC_PAGESIZE */
+# ifdef NBPG
+# define getpagesize() NBPG * CLSIZE
+# ifndef CLSIZE
+# define CLSIZE 1
+# endif /* no CLSIZE */
+# else /* no NBPG */
+# ifdef NBPC
+# define getpagesize() NBPC
+# else /* no NBPC */
+# ifdef PAGESIZE
+# define getpagesize() PAGESIZE
+# endif /* PAGESIZE */
+# endif /* no NBPC */
+# endif /* no NBPG */
+# endif /* no EXEC_PAGESIZE */
+# else /* no HAVE_SYS_PARAM_H */
+# define getpagesize() 8192 /* punt totally */
+# endif /* no HAVE_SYS_PARAM_H */
+# endif /* no _SC_PAGESIZE */
+
+#endif /* no HAVE_GETPAGESIZE */
+
+#ifdef __cplusplus
+extern "C" { void *malloc(unsigned); }
+#else
+char *malloc();
+#endif
+
+int
+main()
+{
+ char *data, *data2, *data3;
+ int i, pagesize;
+ int fd;
+
+ pagesize = getpagesize();
+
+ /*
+ * First, make a file with some known garbage in it.
+ */
+ data = malloc(pagesize);
+ if (!data)
+ exit(1);
+ for (i = 0; i < pagesize; ++i)
+ *(data + i) = rand();
+ umask(0);
+ fd = creat("conftestmmap", 0600);
+ if (fd < 0)
+ exit(1);
+ if (write(fd, data, pagesize) != pagesize)
+ exit(1);
+ close(fd);
+
+ /*
+ * Next, try to mmap the file at a fixed address which
+ * already has something else allocated at it. If we can,
+ * also make sure that we see the same garbage.
+ */
+ fd = open("conftestmmap", O_RDWR);
+ if (fd < 0)
+ exit(1);
+ data2 = malloc(2 * pagesize);
+ if (!data2)
+ exit(1);
+ data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1);
+ if (data2 != mmap(data2, pagesize, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_FIXED, fd, 0L))
+ exit(1);
+ for (i = 0; i < pagesize; ++i)
+ if (*(data + i) != *(data2 + i))
+ exit(1);
+
+ /*
+ * Finally, make sure that changes to the mapped area
+ * do not percolate back to the file as seen by read().
+ * (This is a bug on some variants of i386 svr4.0.)
+ */
+ for (i = 0; i < pagesize; ++i)
+ *(data2 + i) = *(data2 + i) + 1;
+ data3 = malloc(pagesize);
+ if (!data3)
+ exit(1);
+ if (read(fd, data3, pagesize) != pagesize)
+ exit(1);
+ for (i = 0; i < pagesize; ++i)
+ if (*(data + i) != *(data3 + i))
+ exit(1);
+ close(fd);
+ unlink("conftestmmap");
+ exit(0);
+}
+
+EOF
+if { (eval echo configure:2482: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_func_mmap_fixed_mapped=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_func_mmap_fixed_mapped=no
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$ac_cv_func_mmap_fixed_mapped" 1>&6
+if test $ac_cv_func_mmap_fixed_mapped = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_MMAP 1
+EOF
+
+fi
+
+
+ for ac_hdr in argz.h limits.h locale.h nl_types.h malloc.h string.h \
+unistd.h sys/param.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:2510: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2515 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2520: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+ for ac_func in getcwd munmap putenv setenv setlocale strchr strcasecmp \
+strdup __argz_count __argz_stringify __argz_next
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2550: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2555 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2578: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+
+ if test "${ac_cv_func_stpcpy+set}" != "set"; then
+ for ac_func in stpcpy
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2607: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2612 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2635: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+ fi
+ if test "${ac_cv_func_stpcpy}" = "yes"; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_STPCPY 1
+EOF
+
+ fi
+
+ if test $ac_cv_header_locale_h = yes; then
+ echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6
+echo "configure:2669: checking for LC_MESSAGES" >&5
+if eval "test \"`echo '$''{'am_cv_val_LC_MESSAGES'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2674 "configure"
+#include "confdefs.h"
+#include <locale.h>
+int main() {
+return LC_MESSAGES
+; return 0; }
+EOF
+if { (eval echo configure:2681: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ am_cv_val_LC_MESSAGES=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ am_cv_val_LC_MESSAGES=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$am_cv_val_LC_MESSAGES" 1>&6
+ if test $am_cv_val_LC_MESSAGES = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_LC_MESSAGES 1
+EOF
+
+ fi
+ fi
+ echo $ac_n "checking whether NLS is requested""... $ac_c" 1>&6
+echo "configure:2702: checking whether NLS is requested" >&5
+ # Check whether --enable-nls or --disable-nls was given.
+if test "${enable_nls+set}" = set; then
+ enableval="$enable_nls"
+ USE_NLS=$enableval
+else
+ USE_NLS=yes
+fi
+
+ echo "$ac_t""$USE_NLS" 1>&6
+
+
+ USE_INCLUDED_LIBINTL=no
+
+ if test "$USE_NLS" = "yes"; then
+ cat >> confdefs.h <<\EOF
+#define ENABLE_NLS 1
+EOF
+
+ echo $ac_n "checking whether included gettext is requested""... $ac_c" 1>&6
+echo "configure:2722: checking whether included gettext is requested" >&5
+ # Check whether --with-included-gettext or --without-included-gettext was given.
+if test "${with_included_gettext+set}" = set; then
+ withval="$with_included_gettext"
+ nls_cv_force_use_gnu_gettext=$withval
+else
+ nls_cv_force_use_gnu_gettext=no
+fi
+
+ echo "$ac_t""$nls_cv_force_use_gnu_gettext" 1>&6
+
+ nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
+ if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
+ nls_cv_header_intl=
+ nls_cv_header_libgt=
+ CATOBJEXT=NONE
+
+ ac_safe=`echo "libintl.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for libintl.h""... $ac_c" 1>&6
+echo "configure:2741: checking for libintl.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2746 "configure"
+#include "confdefs.h"
+#include <libintl.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2751: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ echo $ac_n "checking for gettext in libc""... $ac_c" 1>&6
+echo "configure:2768: checking for gettext in libc" >&5
+if eval "test \"`echo '$''{'gt_cv_func_gettext_libc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2773 "configure"
+#include "confdefs.h"
+#include <libintl.h>
+int main() {
+return (int) gettext ("")
+; return 0; }
+EOF
+if { (eval echo configure:2780: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ gt_cv_func_gettext_libc=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ gt_cv_func_gettext_libc=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$gt_cv_func_gettext_libc" 1>&6
+
+ if test "$gt_cv_func_gettext_libc" != "yes"; then
+ echo $ac_n "checking for bindtextdomain in -lintl""... $ac_c" 1>&6
+echo "configure:2796: checking for bindtextdomain in -lintl" >&5
+ac_lib_var=`echo intl'_'bindtextdomain | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lintl $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2804 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char bindtextdomain();
+
+int main() {
+bindtextdomain()
+; return 0; }
+EOF
+if { (eval echo configure:2815: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ echo $ac_n "checking for gettext in libintl""... $ac_c" 1>&6
+echo "configure:2831: checking for gettext in libintl" >&5
+if eval "test \"`echo '$''{'gt_cv_func_gettext_libintl'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo $ac_n "checking for gettext in -lintl""... $ac_c" 1>&6
+echo "configure:2836: checking for gettext in -lintl" >&5
+ac_lib_var=`echo intl'_'gettext | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lintl $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2844 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gettext();
+
+int main() {
+gettext()
+; return 0; }
+EOF
+if { (eval echo configure:2855: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ gt_cv_func_gettext_libintl=yes
+else
+ echo "$ac_t""no" 1>&6
+gt_cv_func_gettext_libintl=no
+fi
+
+fi
+
+echo "$ac_t""$gt_cv_func_gettext_libintl" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ fi
+
+ if test "$gt_cv_func_gettext_libc" = "yes" \
+ || test "$gt_cv_func_gettext_libintl" = "yes"; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_GETTEXT 1
+EOF
+
+ # Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2894: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$MSGFMT" in
+ /*)
+ ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then
+ ac_cv_path_MSGFMT="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no"
+ ;;
+esac
+fi
+MSGFMT="$ac_cv_path_MSGFMT"
+if test -n "$MSGFMT"; then
+ echo "$ac_t""$MSGFMT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+ if test "$MSGFMT" != "no"; then
+ for ac_func in dcgettext
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2928: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2933 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2956: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+ # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2983: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$GMSGFMT" in
+ /*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
+ ;;
+esac
+fi
+GMSGFMT="$ac_cv_path_GMSGFMT"
+if test -n "$GMSGFMT"; then
+ echo "$ac_t""$GMSGFMT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ # Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3019: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$XGETTEXT" in
+ /*)
+ ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then
+ ac_cv_path_XGETTEXT="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+ ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test -n "$XGETTEXT"; then
+ echo "$ac_t""$XGETTEXT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ cat > conftest.$ac_ext <<EOF
+#line 3051 "configure"
+#include "confdefs.h"
+
+int main() {
+extern int _nl_msg_cat_cntr;
+ return _nl_msg_cat_cntr
+; return 0; }
+EOF
+if { (eval echo configure:3059: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ CATOBJEXT=.gmo
+ DATADIRNAME=share
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CATOBJEXT=.mo
+ DATADIRNAME=lib
+fi
+rm -f conftest*
+ INSTOBJEXT=.mo
+ fi
+ fi
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+ if test "$CATOBJEXT" = "NONE"; then
+ echo $ac_n "checking whether catgets can be used""... $ac_c" 1>&6
+echo "configure:3082: checking whether catgets can be used" >&5
+ # Check whether --with-catgets or --without-catgets was given.
+if test "${with_catgets+set}" = set; then
+ withval="$with_catgets"
+ nls_cv_use_catgets=$withval
+else
+ nls_cv_use_catgets=no
+fi
+
+ echo "$ac_t""$nls_cv_use_catgets" 1>&6
+
+ if test "$nls_cv_use_catgets" = "yes"; then
+ echo $ac_n "checking for main in -li""... $ac_c" 1>&6
+echo "configure:3095: checking for main in -li" >&5
+ac_lib_var=`echo i'_'main | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-li $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 3103 "configure"
+#include "confdefs.h"
+
+int main() {
+main()
+; return 0; }
+EOF
+if { (eval echo configure:3110: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_lib=HAVE_LIB`echo i | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+ LIBS="-li $LIBS"
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ echo $ac_n "checking for catgets""... $ac_c" 1>&6
+echo "configure:3138: checking for catgets" >&5
+if eval "test \"`echo '$''{'ac_cv_func_catgets'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3143 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char catgets(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char catgets();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_catgets) || defined (__stub___catgets)
+choke me
+#else
+catgets();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:3166: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+ rm -rf conftest*
+ eval "ac_cv_func_catgets=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_catgets=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'catgets`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ cat >> confdefs.h <<\EOF
+#define HAVE_CATGETS 1
+EOF
+
+ INTLOBJS="\$(CATOBJS)"
+ # Extract the first word of "gencat", so it can be a program name with args.
+set dummy gencat; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3188: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_GENCAT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$GENCAT" in
+ /*)
+ ac_cv_path_GENCAT="$GENCAT" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_GENCAT="$GENCAT" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_GENCAT="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_GENCAT" && ac_cv_path_GENCAT="no"
+ ;;
+esac
+fi
+GENCAT="$ac_cv_path_GENCAT"
+if test -n "$GENCAT"; then
+ echo "$ac_t""$GENCAT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+ if test "$GENCAT" != "no"; then
+ # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3224: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$GMSGFMT" in
+ /*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="no"
+ ;;
+esac
+fi
+GMSGFMT="$ac_cv_path_GMSGFMT"
+if test -n "$GMSGFMT"; then
+ echo "$ac_t""$GMSGFMT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test "$GMSGFMT" = "no"; then
+ # Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3261: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$GMSGFMT" in
+ /*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then
+ ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="no"
+ ;;
+esac
+fi
+GMSGFMT="$ac_cv_path_GMSGFMT"
+if test -n "$GMSGFMT"; then
+ echo "$ac_t""$GMSGFMT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ fi
+ # Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3296: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$XGETTEXT" in
+ /*)
+ ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then
+ ac_cv_path_XGETTEXT="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+ ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test -n "$XGETTEXT"; then
+ echo "$ac_t""$XGETTEXT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ USE_INCLUDED_LIBINTL=yes
+ CATOBJEXT=.cat
+ INSTOBJEXT=.cat
+ DATADIRNAME=lib
+ INTLDEPS='$(top_builddir)/intl/libintl.a'
+ INTLLIBS=$INTLDEPS
+ LIBS=`echo $LIBS | sed -e 's/-lintl//'`
+ nls_cv_header_intl=intl/libintl.h
+ nls_cv_header_libgt=intl/libgettext.h
+ fi
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ fi
+ fi
+
+ if test "$CATOBJEXT" = "NONE"; then
+ nls_cv_use_gnu_gettext=yes
+ fi
+ fi
+
+ if test "$nls_cv_use_gnu_gettext" = "yes"; then
+ INTLOBJS="\$(GETTOBJS)"
+ # Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3354: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$MSGFMT" in
+ /*)
+ ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then
+ ac_cv_path_MSGFMT="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="msgfmt"
+ ;;
+esac
+fi
+MSGFMT="$ac_cv_path_MSGFMT"
+if test -n "$MSGFMT"; then
+ echo "$ac_t""$MSGFMT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3388: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$GMSGFMT" in
+ /*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+ ;;
+ ?:/*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
+ ac_dummy="$PATH"
+ for ac_dir in $ac_dummy; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
+ ;;
+esac
+fi
+GMSGFMT="$ac_cv_path_GMSGFMT"
+if test -n "$GMSGFMT"; then
+ echo "$ac_t""$GMSGFMT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ # Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:3424: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$XGETTEXT" in
+ /*)
+ ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then
+ ac_cv_path_XGETTEXT="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
+ ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test -n "$XGETTEXT"; then
+ echo "$ac_t""$XGETTEXT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+ USE_INCLUDED_LIBINTL=yes
+ CATOBJEXT=.gmo
+ INSTOBJEXT=.mo
+ DATADIRNAME=share
+ INTLDEPS='$(top_builddir)/intl/libintl.a'
+ INTLLIBS=$INTLDEPS
+ LIBS=`echo $LIBS | sed -e 's/-lintl//'`
+ nls_cv_header_intl=intl/libintl.h
+ nls_cv_header_libgt=intl/libgettext.h
+ fi
+
+ if test "$XGETTEXT" != ":"; then
+ if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
+ : ;
+ else
+ echo "$ac_t""found xgettext program is not GNU xgettext; ignore it" 1>&6
+ XGETTEXT=":"
+ fi
+ fi
+
+ # We need to process the po/ directory.
+ POSUB=po
+ else
+ DATADIRNAME=share
+ nls_cv_header_intl=intl/libintl.h
+ nls_cv_header_libgt=intl/libgettext.h
+ fi
+
+
+
+
+ # If this is used in GNU gettext we have to set USE_NLS to `yes'
+ # because some of the sources are only built for this goal.
+ if test "$PACKAGE" = gettext; then
+ USE_NLS=yes
+ USE_INCLUDED_LIBINTL=yes
+ fi
+
+ for lang in $ALL_LINGUAS; do
+ GMOFILES="$GMOFILES $lang.gmo"
+ POFILES="$POFILES $lang.po"
+ done
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ if test "x$CATOBJEXT" != "x"; then
+ if test "x$ALL_LINGUAS" = "x"; then
+ LINGUAS=
+ else
+ echo $ac_n "checking for catalogs to be installed""... $ac_c" 1>&6
+echo "configure:3517: checking for catalogs to be installed" >&5
+ NEW_LINGUAS=
+ for lang in ${LINGUAS=$ALL_LINGUAS}; do
+ case "$ALL_LINGUAS" in
+ *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;;
+ esac
+ done
+ LINGUAS=$NEW_LINGUAS
+ echo "$ac_t""$LINGUAS" 1>&6
+ fi
+
+ if test -n "$LINGUAS"; then
+ for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
+ fi
+ fi
+
+ if test $ac_cv_header_locale_h = yes; then
+ INCLUDE_LOCALE_H="#include <locale.h>"
+ else
+ INCLUDE_LOCALE_H="\
+/* The system does not provide the header <locale.h>. Take care yourself. */"
+ fi
+
+
+ test -d intl || mkdir intl
+ if test "$CATOBJEXT" = ".cat"; then
+ ac_safe=`echo "linux/version.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for linux/version.h""... $ac_c" 1>&6
+echo "configure:3545: checking for linux/version.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3550 "configure"
+#include "confdefs.h"
+#include <linux/version.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:3555: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ msgformat=linux
+else
+ echo "$ac_t""no" 1>&6
+msgformat=xopen
+fi
+
+
+ sed -e '/^#/d' $srcdir/intl/$msgformat-msg.sed > intl/po2msg.sed
+ fi
+ sed -e '/^#.*[^\\]$/d' -e '/^#$/d' \
+ $srcdir/intl/po2tbl.sed.in > intl/po2tbl.sed
+
+ if test "$PACKAGE" = "gettext"; then
+ GT_NO="#NO#"
+ GT_YES=
+ else
+ GT_NO=
+ GT_YES="#YES#"
+ fi
+
+
+
+ MKINSTALLDIRS=
+ if test -n "$ac_aux_dir"; then
+ MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
+ fi
+ if test -z "$MKINSTALLDIRS"; then
+ MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
+ fi
+
+
+ l=
+
+
+ test -d po || mkdir po
+ if test "x$srcdir" != "x."; then
+ if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then
+ posrcprefix="$srcdir/"
+ else
+ posrcprefix="../$srcdir/"
+ fi
+ else
+ posrcprefix="../"
+ fi
+ rm -f po/POTFILES
+ sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \
+ < $srcdir/po/POTFILES.in > po/POTFILES
+
+
+if test "x${prefix}" = "xNONE"; then
+ cat >> confdefs.h <<EOF
+#define PACKAGE_LOCALE_DIR "${ac_default_prefix}/${DATADIRNAME}/locale"
+EOF
+
+else
+ cat >> confdefs.h <<EOF
+#define PACKAGE_LOCALE_DIR "${prefix}/${DATADIRNAME}/locale"
+EOF
+
+fi
+
+if test "x${datadir}" = 'x${prefix}/share'; then
+ if test "x${prefix}" = "xNONE"; then
+ cat >> confdefs.h <<EOF
+#define PACKAGE_DATA_DIR "${ac_default_prefix}/share/${PACKAGE}"
+EOF
+
+ else
+ cat >> confdefs.h <<EOF
+#define PACKAGE_DATA_DIR "${prefix}/share/${PACKAGE}"
+EOF
+
+ fi
+else
+ cat >> confdefs.h <<EOF
+#define PACKAGE_DATA_DIR "${datadir}/${PACKAGE}"
+EOF
+
+fi
+
+packagesrcdir=`cd $srcdir && pwd`
+cat >> confdefs.h <<EOF
+#define PACKAGE_SOURCE_DIR "${packagesrcdir}"
+EOF
+
+
+if test "x$GCC" = "xyes"; then
+ case " $CFLAGS " in
+ *[\ \ ]-Wall[\ \ ]*) ;;
+ *) CFLAGS="$CFLAGS -Wall" ;;
+ esac
+fi
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+DEFS=-DHAVE_CONFIG_H
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.13"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "
+Makefile
+src/Makefile
+intl/Makefile
+po/Makefile.in
+ config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@PACKAGE@%$PACKAGE%g
+s%@VERSION@%$VERSION%g
+s%@ACLOCAL@%$ACLOCAL%g
+s%@AUTOCONF@%$AUTOCONF%g
+s%@AUTOMAKE@%$AUTOMAKE%g
+s%@AUTOHEADER@%$AUTOHEADER%g
+s%@MAKEINFO@%$MAKEINFO%g
+s%@SET_MAKE@%$SET_MAKE%g
+s%@CC@%$CC%g
+s%@CPP@%$CPP%g
+s%@GTK_CONFIG@%$GTK_CONFIG%g
+s%@GTK_CFLAGS@%$GTK_CFLAGS%g
+s%@GTK_LIBS@%$GTK_LIBS%g
+s%@RANLIB@%$RANLIB%g
+s%@ALLOCA@%$ALLOCA%g
+s%@USE_NLS@%$USE_NLS%g
+s%@MSGFMT@%$MSGFMT%g
+s%@GMSGFMT@%$GMSGFMT%g
+s%@XGETTEXT@%$XGETTEXT%g
+s%@GENCAT@%$GENCAT%g
+s%@USE_INCLUDED_LIBINTL@%$USE_INCLUDED_LIBINTL%g
+s%@CATALOGS@%$CATALOGS%g
+s%@CATOBJEXT@%$CATOBJEXT%g
+s%@DATADIRNAME@%$DATADIRNAME%g
+s%@GMOFILES@%$GMOFILES%g
+s%@INSTOBJEXT@%$INSTOBJEXT%g
+s%@INTLDEPS@%$INTLDEPS%g
+s%@INTLLIBS@%$INTLLIBS%g
+s%@INTLOBJS@%$INTLOBJS%g
+s%@POFILES@%$POFILES%g
+s%@POSUB@%$POSUB%g
+s%@INCLUDE_LOCALE_H@%$INCLUDE_LOCALE_H%g
+s%@GT_NO@%$GT_NO%g
+s%@GT_YES@%$GT_YES%g
+s%@MKINSTALLDIRS@%$MKINSTALLDIRS%g
+s%@l@%$l%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile
+src/Makefile
+intl/Makefile
+po/Makefile.in
+"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ case "$ac_given_INSTALL" in
+ [/$]*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='\([ ][ ]*\)[^ ]*%\1#\2'
+ac_dC='\3'
+ac_dD='%g'
+# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='\([ ]\)%\1#\2define\3'
+ac_uC=' '
+ac_uD='\4%g'
+# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_eB='$%\1#\2define\3'
+ac_eC=' '
+ac_eD='%g'
+
+if test "${CONFIG_HEADERS+set}" != set; then
+EOF
+cat >> $CONFIG_STATUS <<EOF
+ CONFIG_HEADERS="config.h"
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+fi
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ echo creating $ac_file
+
+ rm -f conftest.frag conftest.in conftest.out
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ cat $ac_file_inputs > conftest.in
+
+EOF
+
+# Transform confdefs.h into a sed script conftest.vals that substitutes
+# the proper values into config.h.in to produce config.h. And first:
+# Protect against being on the right side of a sed subst in config.status.
+# Protect against being in an unquoted here document in config.status.
+rm -f conftest.vals
+cat > conftest.hdr <<\EOF
+s/[\\&%]/\\&/g
+s%[\\$`]%\\&%g
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
+s%ac_d%ac_u%gp
+s%ac_u%ac_e%gp
+EOF
+sed -n -f conftest.hdr confdefs.h > conftest.vals
+rm -f conftest.hdr
+
+# This sed command replaces #undef with comments. This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >> conftest.vals <<\EOF
+s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+EOF
+
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+
+rm -f conftest.tail
+while :
+do
+ ac_lines=`grep -c . conftest.vals`
+ # grep -c gives empty output for an empty file on some AIX systems.
+ if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
+ # Write a limited-size here document to conftest.frag.
+ echo ' cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+ echo 'CEOF
+ sed -f conftest.frag conftest.in > conftest.out
+ rm -f conftest.in
+ mv conftest.out conftest.in
+' >> $CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
+ rm -f conftest.vals
+ mv conftest.tail conftest.vals
+done
+rm -f conftest.vals
+
+cat >> $CONFIG_STATUS <<\EOF
+ rm -f conftest.frag conftest.h
+ echo "/* $ac_file. Generated automatically by configure. */" > conftest.h
+ cat conftest.in >> conftest.h
+ rm -f conftest.in
+ if cmp -s $ac_file conftest.h 2>/dev/null; then
+ echo "$ac_file is unchanged"
+ rm -f conftest.h
+ else
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ fi
+ rm -f $ac_file
+ mv conftest.h $ac_file
+ fi
+fi; done
+
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+ac_sources="$nls_cv_header_libgt"
+ac_dests="$nls_cv_header_intl"
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+srcdir=$ac_given_srcdir
+while test -n "$ac_sources"; do
+ set $ac_dests; ac_dest=$1; shift; ac_dests=$*
+ set $ac_sources; ac_source=$1; shift; ac_sources=$*
+
+ echo "linking $srcdir/$ac_source to $ac_dest"
+
+ if test ! -r $srcdir/$ac_source; then
+ { echo "configure: error: $srcdir/$ac_source: File not found" 1>&2; exit 1; }
+ fi
+ rm -f $ac_dest
+
+ # Make relative symlinks.
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dest_dir=`echo $ac_dest|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dest_dir" != "$ac_dest" && test "$ac_dest_dir" != .; then
+ # The dest file is in a subdirectory.
+ test ! -d "$ac_dest_dir" && mkdir "$ac_dest_dir"
+ ac_dest_dir_suffix="/`echo $ac_dest_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dest_dir_suffix.
+ ac_dots=`echo $ac_dest_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dest_dir_suffix= ac_dots=
+ fi
+
+ case "$srcdir" in
+ [/$]*) ac_rel_source="$srcdir/$ac_source" ;;
+ *) ac_rel_source="$ac_dots$srcdir/$ac_source" ;;
+ esac
+
+ # Make a symlink if possible; otherwise try a hard link.
+ if ln -s $ac_rel_source $ac_dest 2>/dev/null ||
+ ln $srcdir/$ac_source $ac_dest; then :
+ else
+ { echo "configure: error: can not link $ac_dest to $srcdir/$ac_source" 1>&2; exit 1; }
+ fi
+done
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h
+case "$CONFIG_FILES" in *po/Makefile.in*)
+ sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile
+ esac
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
+
diff --git a/eppfm2/configure.in b/eppfm2/configure.in
new file mode 100644
index 0000000..53ce3c5
--- /dev/null
+++ b/eppfm2/configure.in
@@ -0,0 +1,57 @@
+dnl Process this file with autoconf to produce a configure script.
+
+AC_INIT(configure.in)
+AM_INIT_AUTOMAKE(eppfm, 0.1)
+AM_CONFIG_HEADER(config.h)
+
+AC_ISC_POSIX
+AC_PROG_CC
+AM_PROG_CC_STDC
+AC_HEADER_STDC
+
+AM_PATH_GTK(1.2.0, ,
+ AC_MSG_ERROR(Cannot find GTK: Is gtk-config in path?))
+
+dnl Add the languages which your application supports here.
+ALL_LINGUAS=""
+AM_GNU_GETTEXT
+
+dnl Set PACKAGE_LOCALE_DIR in config.h.
+if test "x${prefix}" = "xNONE"; then
+ AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${ac_default_prefix}/${DATADIRNAME}/locale")
+else
+ AC_DEFINE_UNQUOTED(PACKAGE_LOCALE_DIR, "${prefix}/${DATADIRNAME}/locale")
+fi
+
+dnl Set PACKAGE_DATA_DIR in config.h.
+if test "x${datadir}" = 'x${prefix}/share'; then
+ if test "x${prefix}" = "xNONE"; then
+ AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${ac_default_prefix}/share/${PACKAGE}")
+ else
+ AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${prefix}/share/${PACKAGE}")
+ fi
+else
+ AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${datadir}/${PACKAGE}")
+fi
+
+dnl Set PACKAGE_SOURCE_DIR in config.h.
+packagesrcdir=`cd $srcdir && pwd`
+AC_DEFINE_UNQUOTED(PACKAGE_SOURCE_DIR, "${packagesrcdir}")
+
+dnl Use -Wall if we have gcc.
+changequote(,)dnl
+if test "x$GCC" = "xyes"; then
+ case " $CFLAGS " in
+ *[\ \ ]-Wall[\ \ ]*) ;;
+ *) CFLAGS="$CFLAGS -Wall" ;;
+ esac
+fi
+changequote([,])dnl
+
+AC_OUTPUT([
+Makefile
+src/Makefile
+intl/Makefile
+po/Makefile.in
+])
+
diff --git a/eppfm2/eppfm.glade b/eppfm2/eppfm.glade
new file mode 100644
index 0000000..eadf84d
--- /dev/null
+++ b/eppfm2/eppfm.glade
@@ -0,0 +1,1643 @@
+<?xml version="1.0"?>
+<GTK-Interface>
+
+<project>
+ <name>eppfm</name>
+ <program_name>eppfm</program_name>
+ <directory></directory>
+ <source_directory>src</source_directory>
+ <pixmaps_directory>pixmaps</pixmaps_directory>
+ <language>C</language>
+ <gnome_support>False</gnome_support>
+ <gettext_support>True</gettext_support>
+ <use_widget_names>True</use_widget_names>
+ <output_main_file>True</output_main_file>
+ <output_support_files>True</output_support_files>
+ <output_build_files>True</output_build_files>
+ <backup_source_files>True</backup_source_files>
+ <main_source_file>interface.c</main_source_file>
+ <main_header_file>interface.h</main_header_file>
+ <handler_source_file>callbacks.c</handler_source_file>
+ <handler_header_file>callbacks.h</handler_header_file>
+ <support_source_file>support.c</support_source_file>
+ <support_header_file>support.h</support_header_file>
+ <translatable_strings_file></translatable_strings_file>
+</project>
+<style>
+ <style_name>aboutname</style_name>
+ <style_font>-adobe-helvetica-medium-r-normal-*-*-240-*-*-p-*-iso8859-1</style_font>
+</style>
+<style>
+ <style_name>aboutcall</style_name>
+ <style_font>-adobe-helvetica-medium-r-normal-*-*-180-*-*-p-*-iso8859-1</style_font>
+</style>
+
+<widget>
+ <class>GtkWindow</class>
+ <name>ioconfiglinux</name>
+ <title>EPPFM Input/Output Configuration</title>
+ <type>GTK_WINDOW_DIALOG</type>
+ <position>GTK_WIN_POS_NONE</position>
+ <allow_shrink>False</allow_shrink>
+ <allow_grow>True</allow_grow>
+ <auto_shrink>False</auto_shrink>
+
+ <widget>
+ <class>GtkVBox</class>
+ <name>vbox1</name>
+ <homogeneous>False</homogeneous>
+ <spacing>0</spacing>
+
+ <widget>
+ <class>GtkFrame</class>
+ <name>frame3</name>
+ <border_width>5</border_width>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+ <label>Soundcard Settings</label>
+ <label_xalign>0</label_xalign>
+ <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
+
+ <widget>
+ <class>GtkTable</class>
+ <name>table3</name>
+ <rows>2</rows>
+ <columns>2</columns>
+ <homogeneous>False</homogeneous>
+ <row_spacing>0</row_spacing>
+ <column_spacing>0</column_spacing>
+
+ <widget>
+ <class>GtkCombo</class>
+ <name>sndrecord</name>
+ <border_width>3</border_width>
+ <child>
+ <left_attach>1</left_attach>
+ <right_attach>2</right_attach>
+ <top_attach>0</top_attach>
+ <bottom_attach>1</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>False</yfill>
+ </child>
+ <case_sensitive>True</case_sensitive>
+ <use_arrows>True</use_arrows>
+ <use_arrows_always>False</use_arrows_always>
+ <items>/dev/dsp
+/dev/dsp1
+</items>
+ </widget>
+
+ <widget>
+ <class>GtkCombo</class>
+ <name>sndplayback</name>
+ <border_width>3</border_width>
+ <child>
+ <left_attach>1</left_attach>
+ <right_attach>2</right_attach>
+ <top_attach>1</top_attach>
+ <bottom_attach>2</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>False</yfill>
+ </child>
+ <case_sensitive>True</case_sensitive>
+ <use_arrows>True</use_arrows>
+ <use_arrows_always>False</use_arrows_always>
+ <items>/dev/dsp
+/dev/dsp1
+</items>
+ </widget>
+
+ <widget>
+ <class>GtkLabel</class>
+ <name>label5</name>
+ <child>
+ <left_attach>0</left_attach>
+ <right_attach>1</right_attach>
+ <top_attach>0</top_attach>
+ <bottom_attach>1</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>False</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>False</yfill>
+ </child>
+ <label>Soundcard for Recording</label>
+ <justify>GTK_JUSTIFY_LEFT</justify>
+ <wrap>False</wrap>
+ <xalign>0</xalign>
+ <yalign>0.5</yalign>
+ <xpad>10</xpad>
+ <ypad>0</ypad>
+ </widget>
+
+ <widget>
+ <class>GtkLabel</class>
+ <name>label6</name>
+ <child>
+ <left_attach>0</left_attach>
+ <right_attach>1</right_attach>
+ <top_attach>1</top_attach>
+ <bottom_attach>2</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>False</xexpand>
+ <yexpand>False</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>False</yfill>
+ </child>
+ <label>Soundcard for Playback</label>
+ <justify>GTK_JUSTIFY_LEFT</justify>
+ <wrap>False</wrap>
+ <xalign>0</xalign>
+ <yalign>0.5</yalign>
+ <xpad>10</xpad>
+ <ypad>0</ypad>
+ </widget>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkFrame</class>
+ <name>frame1</name>
+ <border_width>5</border_width>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+ <label>Parallel Port Driver Settings</label>
+ <label_xalign>0</label_xalign>
+ <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
+
+ <widget>
+ <class>GtkTable</class>
+ <name>table2</name>
+ <rows>2</rows>
+ <columns>4</columns>
+ <homogeneous>False</homogeneous>
+ <row_spacing>0</row_spacing>
+ <column_spacing>0</column_spacing>
+
+ <widget>
+ <class>GtkCombo</class>
+ <name>ioaddr</name>
+ <border_width>3</border_width>
+ <child>
+ <left_attach>3</left_attach>
+ <right_attach>4</right_attach>
+ <top_attach>0</top_attach>
+ <bottom_attach>1</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>False</yfill>
+ </child>
+ <width>120</width>
+ <case_sensitive>False</case_sensitive>
+ <use_arrows>True</use_arrows>
+ <use_arrows_always>False</use_arrows_always>
+ <items>0x378
+0x278
+</items>
+ </widget>
+
+ <widget>
+ <class>GtkCombo</class>
+ <name>devfile</name>
+ <border_width>3</border_width>
+ <child>
+ <left_attach>3</left_attach>
+ <right_attach>4</right_attach>
+ <top_attach>1</top_attach>
+ <bottom_attach>2</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>False</yfill>
+ </child>
+ <width>120</width>
+ <case_sensitive>True</case_sensitive>
+ <use_arrows>True</use_arrows>
+ <use_arrows_always>False</use_arrows_always>
+ <items>/dev/ppuser0
+/dev/ppuser1
+</items>
+ </widget>
+
+ <widget>
+ <class>GtkLabel</class>
+ <name>label2</name>
+ <child>
+ <left_attach>2</left_attach>
+ <right_attach>3</right_attach>
+ <top_attach>0</top_attach>
+ <bottom_attach>1</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>False</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>False</yfill>
+ </child>
+ <label>IO Address</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <wrap>False</wrap>
+ <xalign>0</xalign>
+ <yalign>0.5</yalign>
+ <xpad>4</xpad>
+ <ypad>0</ypad>
+ </widget>
+
+ <widget>
+ <class>GtkLabel</class>
+ <name>label3</name>
+ <child>
+ <left_attach>2</left_attach>
+ <right_attach>3</right_attach>
+ <top_attach>1</top_attach>
+ <bottom_attach>2</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>False</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>False</yfill>
+ </child>
+ <label>File</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <wrap>False</wrap>
+ <xalign>0</xalign>
+ <yalign>0.5</yalign>
+ <xpad>4</xpad>
+ <ypad>0</ypad>
+ </widget>
+
+ <widget>
+ <class>GtkLabel</class>
+ <name>label1</name>
+ <child>
+ <left_attach>0</left_attach>
+ <right_attach>1</right_attach>
+ <top_attach>0</top_attach>
+ <bottom_attach>1</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>False</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>False</xfill>
+ <yfill>False</yfill>
+ </child>
+ <label>Driver Selection</label>
+ <justify>GTK_JUSTIFY_LEFT</justify>
+ <wrap>False</wrap>
+ <xalign>0.5</xalign>
+ <yalign>0.5</yalign>
+ <xpad>9</xpad>
+ <ypad>0</ypad>
+ </widget>
+
+ <widget>
+ <class>GtkRadioButton</class>
+ <name>drvdirect</name>
+ <child>
+ <left_attach>1</left_attach>
+ <right_attach>2</right_attach>
+ <top_attach>0</top_attach>
+ <bottom_attach>1</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>False</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>False</yfill>
+ </child>
+ <can_focus>True</can_focus>
+ <label>Direct Parport Access</label>
+ <active>False</active>
+ <draw_indicator>True</draw_indicator>
+ <group>drivergroup</group>
+ </widget>
+
+ <widget>
+ <class>GtkRadioButton</class>
+ <name>drvppdev</name>
+ <child>
+ <left_attach>1</left_attach>
+ <right_attach>2</right_attach>
+ <top_attach>1</top_attach>
+ <bottom_attach>2</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>False</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>False</yfill>
+ </child>
+ <can_focus>True</can_focus>
+ <label>ppdev Kernel Driver</label>
+ <active>False</active>
+ <draw_indicator>True</draw_indicator>
+ <group>drivergroup</group>
+ </widget>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkFrame</class>
+ <name>frame2</name>
+ <border_width>5</border_width>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+ <label>Modem Settings</label>
+ <label_xalign>0</label_xalign>
+ <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
+
+ <widget>
+ <class>GtkTable</class>
+ <name>table1</name>
+ <rows>1</rows>
+ <columns>2</columns>
+ <homogeneous>False</homogeneous>
+ <row_spacing>0</row_spacing>
+ <column_spacing>0</column_spacing>
+
+ <widget>
+ <class>GtkCombo</class>
+ <name>fpgaclk</name>
+ <border_width>3</border_width>
+ <child>
+ <left_attach>1</left_attach>
+ <right_attach>2</right_attach>
+ <top_attach>0</top_attach>
+ <bottom_attach>1</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>False</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>False</yfill>
+ </child>
+ <case_sensitive>False</case_sensitive>
+ <use_arrows>True</use_arrows>
+ <use_arrows_always>False</use_arrows_always>
+ <items>19666600
+9830400
+</items>
+ </widget>
+
+ <widget>
+ <class>GtkLabel</class>
+ <name>label4</name>
+ <child>
+ <left_attach>0</left_attach>
+ <right_attach>1</right_attach>
+ <top_attach>0</top_attach>
+ <bottom_attach>1</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>False</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>False</yfill>
+ </child>
+ <label>FPGA clock frequency</label>
+ <justify>GTK_JUSTIFY_LEFT</justify>
+ <wrap>False</wrap>
+ <xalign>0</xalign>
+ <yalign>0.5</yalign>
+ <xpad>10</xpad>
+ <ypad>0</ypad>
+ </widget>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkHButtonBox</class>
+ <name>hbuttonbox1</name>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+ <layout_style>GTK_BUTTONBOX_SPREAD</layout_style>
+ <spacing>30</spacing>
+ <child_min_width>85</child_min_width>
+ <child_min_height>27</child_min_height>
+ <child_ipad_x>7</child_ipad_x>
+ <child_ipad_y>0</child_ipad_y>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>buttonok</name>
+ <tooltip>Continue</tooltip>
+ <can_default>True</can_default>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>clicked</name>
+ <handler>on_configok_clicked</handler>
+ <last_modification_time>Wed, 14 Jul 1999 14:41:49 GMT</last_modification_time>
+ </signal>
+ <label>Ok</label>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>buttonquit</name>
+ <tooltip>Quit the application</tooltip>
+ <can_default>True</can_default>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>clicked</name>
+ <handler>on_configquit_clicked</handler>
+ <last_modification_time>Wed, 14 Jul 1999 14:42:03 GMT</last_modification_time>
+ </signal>
+ <label>Quit</label>
+ </widget>
+ </widget>
+ </widget>
+</widget>
+
+<widget>
+ <class>GtkWindow</class>
+ <name>mainwindow</name>
+ <events>GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK</events>
+ <signal>
+ <name>delete_event</name>
+ <handler>on_mainwindow_delete_event</handler>
+ <last_modification_time>Wed, 14 Jul 1999 14:44:29 GMT</last_modification_time>
+ </signal>
+ <signal>
+ <name>destroy</name>
+ <handler>on_mainwindow_destroy</handler>
+ <last_modification_time>Wed, 14 Jul 1999 14:44:45 GMT</last_modification_time>
+ </signal>
+ <signal>
+ <name>key_press_event</name>
+ <handler>on_mainwindow_key_event</handler>
+ <last_modification_time>Thu, 15 Jul 1999 12:22:03 GMT</last_modification_time>
+ </signal>
+ <signal>
+ <name>key_release_event</name>
+ <handler>on_mainwindow_key_event</handler>
+ <last_modification_time>Thu, 15 Jul 1999 12:22:07 GMT</last_modification_time>
+ </signal>
+ <title>EPPFM</title>
+ <type>GTK_WINDOW_TOPLEVEL</type>
+ <position>GTK_WIN_POS_NONE</position>
+ <allow_shrink>False</allow_shrink>
+ <allow_grow>True</allow_grow>
+ <auto_shrink>False</auto_shrink>
+
+ <widget>
+ <class>GtkVBox</class>
+ <name>vbox2</name>
+ <homogeneous>False</homogeneous>
+ <spacing>0</spacing>
+
+ <widget>
+ <class>GtkHandleBox</class>
+ <name>handlebox1</name>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>True</fill>
+ </child>
+
+ <widget>
+ <class>GtkMenuBar</class>
+ <name>menubar1</name>
+
+ <widget>
+ <class>GtkMenuItem</class>
+ <name>file</name>
+ <tooltip>File Menu</tooltip>
+ <label>_File</label>
+ <right_justify>False</right_justify>
+
+ <widget>
+ <class>GtkMenu</class>
+ <name>file_menu</name>
+
+ <widget>
+ <class>GtkMenuItem</class>
+ <name>dtmf</name>
+ <signal>
+ <name>activate</name>
+ <handler>on_dtmf_activate</handler>
+ <last_modification_time>Wed, 14 Jul 1999 13:06:53 GMT</last_modification_time>
+ </signal>
+ <label>_DTMF keypad...</label>
+ <right_justify>False</right_justify>
+ </widget>
+
+ <widget>
+ <class>GtkMenuItem</class>
+ <name>oscilloscope</name>
+ <signal>
+ <name>activate</name>
+ <handler>on_oscilloscope_activate</handler>
+ <last_modification_time>Wed, 14 Jul 1999 13:07:14 GMT</last_modification_time>
+ </signal>
+ <label>_Oscilloscope display...</label>
+ <right_justify>False</right_justify>
+ </widget>
+
+ <widget>
+ <class>GtkMenuItem</class>
+ <name>spectrum</name>
+ <signal>
+ <name>activate</name>
+ <handler>on_spectrum_activate</handler>
+ <last_modification_time>Wed, 14 Jul 1999 13:07:55 GMT</last_modification_time>
+ </signal>
+ <label>_Spectrum Display...</label>
+ <right_justify>False</right_justify>
+ </widget>
+
+ <widget>
+ <class>GtkMenuItem</class>
+ <name>separator1</name>
+ <right_justify>False</right_justify>
+ </widget>
+
+ <widget>
+ <class>GtkMenuItem</class>
+ <name>quit</name>
+ <signal>
+ <name>activate</name>
+ <handler>on_quit_activate</handler>
+ <last_modification_time>Wed, 14 Jul 1999 13:08:05 GMT</last_modification_time>
+ </signal>
+ <label>_Quit</label>
+ <right_justify>False</right_justify>
+ </widget>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkMenuItem</class>
+ <name>help</name>
+ <label>_Help</label>
+ <right_justify>True</right_justify>
+
+ <widget>
+ <class>GtkMenu</class>
+ <name>help_menu</name>
+
+ <widget>
+ <class>GtkMenuItem</class>
+ <name>about</name>
+ <signal>
+ <name>activate</name>
+ <handler>on_about_activate</handler>
+ <last_modification_time>Wed, 14 Jul 1999 13:08:36 GMT</last_modification_time>
+ </signal>
+ <label>_About</label>
+ <right_justify>False</right_justify>
+ </widget>
+ </widget>
+ </widget>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkVBox</class>
+ <name>vbox3</name>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+ <homogeneous>False</homogeneous>
+ <spacing>0</spacing>
+
+ <widget>
+ <class>GtkProgressBar</class>
+ <name>progressbar1</name>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+ <value>-40</value>
+ <lower>-40</lower>
+ <upper>0</upper>
+ <bar_style>GTK_PROGRESS_CONTINUOUS</bar_style>
+ <orientation>GTK_PROGRESS_LEFT_TO_RIGHT</orientation>
+ <activity_mode>False</activity_mode>
+ <show_text>True</show_text>
+ <format>%P %%</format>
+ <text_xalign>0.5</text_xalign>
+ <text_yalign>0.5</text_yalign>
+ </widget>
+
+ <widget>
+ <class>GtkProgressBar</class>
+ <name>progressbar2</name>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+ <value>-40</value>
+ <lower>-40</lower>
+ <upper>0</upper>
+ <bar_style>GTK_PROGRESS_CONTINUOUS</bar_style>
+ <orientation>GTK_PROGRESS_LEFT_TO_RIGHT</orientation>
+ <activity_mode>False</activity_mode>
+ <show_text>True</show_text>
+ <format>%P %%</format>
+ <text_xalign>0.5</text_xalign>
+ <text_yalign>0.5</text_yalign>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkHandleBox</class>
+ <name>handlebox2</name>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>True</fill>
+ </child>
+
+ <widget>
+ <class>GtkHBox</class>
+ <name>hbox1</name>
+ <homogeneous>True</homogeneous>
+ <spacing>0</spacing>
+
+ <widget>
+ <class>GtkToggleButton</class>
+ <name>buttonptt</name>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+ <width>70</width>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>toggled</name>
+ <handler>on_mainptt_toggled</handler>
+ <last_modification_time>Wed, 14 Jul 1999 14:42:29 GMT</last_modification_time>
+ </signal>
+ <label>PTT</label>
+ <active>False</active>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>button1750</name>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>pressed</name>
+ <handler>on_button1750_pressed</handler>
+ <last_modification_time>Fri, 16 Jul 1999 08:23:22 GMT</last_modification_time>
+ </signal>
+ <signal>
+ <name>released</name>
+ <handler>on_button1750_released</handler>
+ <last_modification_time>Fri, 16 Jul 1999 08:23:28 GMT</last_modification_time>
+ </signal>
+ <label>1750</label>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>buttonsquelch</name>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>clicked</name>
+ <handler>on_buttonsquelch_clicked</handler>
+ <last_modification_time>Fri, 16 Jul 1999 08:14:18 GMT</last_modification_time>
+ </signal>
+ <label>Squelch off</label>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>buttondtmf</name>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>clicked</name>
+ <handler>on_maindtmf_clicked</handler>
+ <last_modification_time>Wed, 14 Jul 1999 14:42:42 GMT</last_modification_time>
+ </signal>
+ <label>DTMF</label>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>buttonscope</name>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>clicked</name>
+ <handler>on_mainscope_clicked</handler>
+ <last_modification_time>Wed, 14 Jul 1999 14:42:52 GMT</last_modification_time>
+ </signal>
+ <label>Scope</label>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>buttonspectrum</name>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>clicked</name>
+ <handler>on_mainspectrum_clicked</handler>
+ <last_modification_time>Wed, 14 Jul 1999 14:43:12 GMT</last_modification_time>
+ </signal>
+ <label>Spectrum</label>
+ </widget>
+ </widget>
+ </widget>
+ </widget>
+</widget>
+
+<widget>
+ <class>GtkDialog</class>
+ <name>aboutdialog</name>
+ <signal>
+ <name>delete_event</name>
+ <handler>on_aboutdialog_delete_event</handler>
+ <last_modification_time>Wed, 14 Jul 1999 17:48:48 GMT</last_modification_time>
+ </signal>
+ <title>About</title>
+ <type>GTK_WINDOW_TOPLEVEL</type>
+ <position>GTK_WIN_POS_NONE</position>
+ <allow_shrink>True</allow_shrink>
+ <allow_grow>True</allow_grow>
+ <auto_shrink>False</auto_shrink>
+
+ <widget>
+ <class>GtkVBox</class>
+ <child_name>Dialog:vbox</child_name>
+ <name>dialog-vbox1</name>
+ <homogeneous>False</homogeneous>
+ <spacing>0</spacing>
+
+ <widget>
+ <class>GtkVBox</class>
+ <name>vbox5</name>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+ <homogeneous>False</homogeneous>
+ <spacing>0</spacing>
+
+ <widget>
+ <class>GtkLabel</class>
+ <name>label7</name>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ <label>written by:</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <wrap>False</wrap>
+ <xalign>0</xalign>
+ <yalign>0.5</yalign>
+ <xpad>4</xpad>
+ <ypad>3</ypad>
+ </widget>
+
+ <widget>
+ <class>GtkLabel</class>
+ <name>label8</name>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ <label>Thomas Sailer</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <wrap>False</wrap>
+ <xalign>0.5</xalign>
+ <yalign>0.5</yalign>
+ <xpad>4</xpad>
+ <ypad>4</ypad>
+ </widget>
+
+ <widget>
+ <class>GtkLabel</class>
+ <name>label9</name>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ <label>HB9JNX/AE4WA</label>
+ <justify>GTK_JUSTIFY_CENTER</justify>
+ <wrap>False</wrap>
+ <xalign>0.5</xalign>
+ <yalign>0.5</yalign>
+ <xpad>4</xpad>
+ <ypad>4</ypad>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkHBox</class>
+ <child_name>Dialog:action_area</child_name>
+ <name>dialog-action_area1</name>
+ <border_width>10</border_width>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>True</fill>
+ <pack>GTK_PACK_END</pack>
+ </child>
+ <homogeneous>True</homogeneous>
+ <spacing>5</spacing>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>buttonok</name>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ <width>80</width>
+ <height>27</height>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>clicked</name>
+ <handler>on_aboutok_clicked</handler>
+ <last_modification_time>Wed, 14 Jul 1999 17:54:16 GMT</last_modification_time>
+ </signal>
+ <label>Ok</label>
+ </widget>
+ </widget>
+ </widget>
+</widget>
+
+<widget>
+ <class>GtkWindow</class>
+ <name>dtmfwindow</name>
+ <events>GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK</events>
+ <signal>
+ <name>key_press_event</name>
+ <handler>on_dtmfwindow_key_event</handler>
+ <last_modification_time>Thu, 15 Jul 1999 12:21:28 GMT</last_modification_time>
+ </signal>
+ <signal>
+ <name>key_release_event</name>
+ <handler>on_dtmfwindow_key_event</handler>
+ <last_modification_time>Thu, 15 Jul 1999 12:21:38 GMT</last_modification_time>
+ </signal>
+ <signal>
+ <name>delete_event</name>
+ <handler>on_dtmfwindow_delete_event</handler>
+ <last_modification_time>Wed, 14 Jul 1999 17:49:02 GMT</last_modification_time>
+ </signal>
+ <title>DTMF Keypad</title>
+ <type>GTK_WINDOW_TOPLEVEL</type>
+ <position>GTK_WIN_POS_NONE</position>
+ <allow_shrink>False</allow_shrink>
+ <allow_grow>True</allow_grow>
+ <auto_shrink>False</auto_shrink>
+
+ <widget>
+ <class>GtkVBox</class>
+ <name>vbox4</name>
+ <homogeneous>False</homogeneous>
+ <spacing>0</spacing>
+
+ <widget>
+ <class>GtkFrame</class>
+ <name>frame4</name>
+ <border_width>5</border_width>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>True</fill>
+ </child>
+ <label>Keys transmitted</label>
+ <label_xalign>0.01</label_xalign>
+ <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
+
+ <widget>
+ <class>GtkHBox</class>
+ <name>hbox2</name>
+ <homogeneous>False</homogeneous>
+ <spacing>0</spacing>
+
+ <widget>
+ <class>GtkEntry</class>
+ <name>dtmfentry</name>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+ <can_focus>True</can_focus>
+ <editable>False</editable>
+ <text_visible>True</text_visible>
+ <text_max_length>0</text_max_length>
+ <text></text>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>buttoncleardtmf</name>
+ <child>
+ <padding>0</padding>
+ <expand>False</expand>
+ <fill>False</fill>
+ </child>
+ <width>50</width>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>clicked</name>
+ <handler>on_dtmfclear_clicked</handler>
+ <last_modification_time>Wed, 14 Jul 1999 18:16:39 GMT</last_modification_time>
+ </signal>
+ <label>Clear</label>
+ </widget>
+ </widget>
+ </widget>
+
+ <widget>
+ <class>GtkFrame</class>
+ <name>frame5</name>
+ <border_width>5</border_width>
+ <child>
+ <padding>0</padding>
+ <expand>True</expand>
+ <fill>True</fill>
+ </child>
+ <label>Keypad</label>
+ <label_xalign>0.01</label_xalign>
+ <shadow_type>GTK_SHADOW_ETCHED_IN</shadow_type>
+
+ <widget>
+ <class>GtkTable</class>
+ <name>table4</name>
+ <rows>4</rows>
+ <columns>4</columns>
+ <homogeneous>False</homogeneous>
+ <row_spacing>0</row_spacing>
+ <column_spacing>0</column_spacing>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>dtmf8</name>
+ <child>
+ <left_attach>1</left_attach>
+ <right_attach>2</right_attach>
+ <top_attach>0</top_attach>
+ <bottom_attach>1</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>pressed</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x18</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+ </signal>
+ <signal>
+ <name>released</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x08</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+ </signal>
+ <label>8</label>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>dtmf9</name>
+ <child>
+ <left_attach>2</left_attach>
+ <right_attach>3</right_attach>
+ <top_attach>0</top_attach>
+ <bottom_attach>1</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>pressed</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x19</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+ </signal>
+ <signal>
+ <name>released</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x09</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+ </signal>
+ <label>9</label>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>dtmfa</name>
+ <child>
+ <left_attach>3</left_attach>
+ <right_attach>4</right_attach>
+ <top_attach>0</top_attach>
+ <bottom_attach>1</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>pressed</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x1a</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+ </signal>
+ <signal>
+ <name>released</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x0a</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+ </signal>
+ <label>A</label>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>dtmf4</name>
+ <child>
+ <left_attach>0</left_attach>
+ <right_attach>1</right_attach>
+ <top_attach>1</top_attach>
+ <bottom_attach>2</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>pressed</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x14</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+ </signal>
+ <signal>
+ <name>released</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x04</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+ </signal>
+ <label>4</label>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>dtmf5</name>
+ <child>
+ <left_attach>1</left_attach>
+ <right_attach>2</right_attach>
+ <top_attach>1</top_attach>
+ <bottom_attach>2</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>pressed</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x15</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+ </signal>
+ <signal>
+ <name>released</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x05</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+ </signal>
+ <label>5</label>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>dtmf6</name>
+ <child>
+ <left_attach>2</left_attach>
+ <right_attach>3</right_attach>
+ <top_attach>1</top_attach>
+ <bottom_attach>2</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>pressed</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x16</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+ </signal>
+ <signal>
+ <name>released</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x06</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+ </signal>
+ <label>6</label>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>dtmfb</name>
+ <child>
+ <left_attach>3</left_attach>
+ <right_attach>4</right_attach>
+ <top_attach>1</top_attach>
+ <bottom_attach>2</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>pressed</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x1b</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+ </signal>
+ <signal>
+ <name>released</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x0b</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+ </signal>
+ <label>B</label>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>dtmf1</name>
+ <child>
+ <left_attach>0</left_attach>
+ <right_attach>1</right_attach>
+ <top_attach>2</top_attach>
+ <bottom_attach>3</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>pressed</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x11</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+ </signal>
+ <signal>
+ <name>released</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x01</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+ </signal>
+ <label>1</label>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>dtmf2</name>
+ <child>
+ <left_attach>1</left_attach>
+ <right_attach>2</right_attach>
+ <top_attach>2</top_attach>
+ <bottom_attach>3</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>pressed</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x12</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+ </signal>
+ <signal>
+ <name>released</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x02</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+ </signal>
+ <label>2</label>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>dtmf3</name>
+ <child>
+ <left_attach>2</left_attach>
+ <right_attach>3</right_attach>
+ <top_attach>2</top_attach>
+ <bottom_attach>3</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>pressed</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x13</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+ </signal>
+ <signal>
+ <name>released</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x03</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+ </signal>
+ <label>3</label>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>dtmfc</name>
+ <child>
+ <left_attach>3</left_attach>
+ <right_attach>4</right_attach>
+ <top_attach>2</top_attach>
+ <bottom_attach>3</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>pressed</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x1c</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+ </signal>
+ <signal>
+ <name>released</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x0c</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+ </signal>
+ <label>C</label>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>dtmfe</name>
+ <child>
+ <left_attach>0</left_attach>
+ <right_attach>1</right_attach>
+ <top_attach>3</top_attach>
+ <bottom_attach>4</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>pressed</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x1e</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+ </signal>
+ <signal>
+ <name>released</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x0e</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+ </signal>
+ <label>*</label>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>dtmf0</name>
+ <child>
+ <left_attach>1</left_attach>
+ <right_attach>2</right_attach>
+ <top_attach>3</top_attach>
+ <bottom_attach>4</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>pressed</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x10</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+ </signal>
+ <signal>
+ <name>released</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x00</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+ </signal>
+ <label>0</label>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>dtmff</name>
+ <child>
+ <left_attach>2</left_attach>
+ <right_attach>3</right_attach>
+ <top_attach>3</top_attach>
+ <bottom_attach>4</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>pressed</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x1f</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+ </signal>
+ <signal>
+ <name>released</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x0f</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+ </signal>
+ <label>#</label>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>dtmfd</name>
+ <child>
+ <left_attach>3</left_attach>
+ <right_attach>4</right_attach>
+ <top_attach>3</top_attach>
+ <bottom_attach>4</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>pressed</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x1d</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+ </signal>
+ <signal>
+ <name>released</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x0d</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+ </signal>
+ <label>D</label>
+ </widget>
+
+ <widget>
+ <class>GtkButton</class>
+ <name>dtmf7</name>
+ <child>
+ <left_attach>0</left_attach>
+ <right_attach>1</right_attach>
+ <top_attach>0</top_attach>
+ <bottom_attach>1</bottom_attach>
+ <xpad>0</xpad>
+ <ypad>0</ypad>
+ <xexpand>True</xexpand>
+ <yexpand>True</yexpand>
+ <xshrink>False</xshrink>
+ <yshrink>False</yshrink>
+ <xfill>True</xfill>
+ <yfill>True</yfill>
+ </child>
+ <can_focus>True</can_focus>
+ <signal>
+ <name>pressed</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x17</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:19 GMT</last_modification_time>
+ </signal>
+ <signal>
+ <name>released</name>
+ <handler>on_dtmf_key</handler>
+ <data>(gpointer)0x07</data>
+ <last_modification_time>Wed, 14 Jul 1999 13:32:14 GMT</last_modification_time>
+ </signal>
+ <label>7</label>
+ </widget>
+ </widget>
+ </widget>
+ </widget>
+</widget>
+
+<widget>
+ <class>GtkWindow</class>
+ <name>scopewindow</name>
+ <signal>
+ <name>delete_event</name>
+ <handler>on_scopewindow_delete_event</handler>
+ <last_modification_time>Wed, 14 Jul 1999 17:49:17 GMT</last_modification_time>
+ </signal>
+ <title>Scope</title>
+ <type>GTK_WINDOW_TOPLEVEL</type>
+ <position>GTK_WIN_POS_NONE</position>
+ <allow_shrink>False</allow_shrink>
+ <allow_grow>True</allow_grow>
+ <auto_shrink>False</auto_shrink>
+
+ <widget>
+ <class>Custom</class>
+ <name>scope</name>
+ <width>512</width>
+ <height>256</height>
+ <creation_function>scope_new</creation_function>
+ <int1>128</int1>
+ <int2>0</int2>
+ <last_modification_time>Wed, 14 Jul 1999 18:01:10 GMT</last_modification_time>
+ </widget>
+</widget>
+
+<widget>
+ <class>GtkWindow</class>
+ <name>spectrumwindow</name>
+ <signal>
+ <name>delete_event</name>
+ <handler>on_spectrumwindow_delete_event</handler>
+ <last_modification_time>Wed, 14 Jul 1999 17:49:32 GMT</last_modification_time>
+ </signal>
+ <title>Spectrum</title>
+ <type>GTK_WINDOW_TOPLEVEL</type>
+ <position>GTK_WIN_POS_NONE</position>
+ <allow_shrink>False</allow_shrink>
+ <allow_grow>True</allow_grow>
+ <auto_shrink>False</auto_shrink>
+
+ <widget>
+ <class>Custom</class>
+ <name>spec</name>
+ <width>512</width>
+ <height>256</height>
+ <creation_function>spectrum_new</creation_function>
+ <int1>256</int1>
+ <int2>0</int2>
+ <last_modification_time>Wed, 14 Jul 1999 18:01:21 GMT</last_modification_time>
+ </widget>
+</widget>
+
+</GTK-Interface>
diff --git a/eppfm2/src/Makefile.am b/eppfm2/src/Makefile.am
new file mode 100644
index 0000000..ebd95eb
--- /dev/null
+++ b/eppfm2/src/Makefile.am
@@ -0,0 +1,60 @@
+## Process this file with automake to produce Makefile.in
+
+INCLUDES = \
+ -I$(top_srcdir)/intl \
+ -I$(top_srcdir)/main \
+ -I$(top_srcdir)/directx/include \
+ -I$(top_srcdir)/directx/include/directx6 \
+ @GTK_CFLAGS@
+
+if DIRECTX
+AUDIOSRC = audiowin32.c
+DIRECTXLIBS = -L$(top_builddir)/directx -ldsound -luser32 -lgdi32
+else
+AUDIOSRC = audiolinux.c
+DIRECTXLIBS =
+endif
+
+if HAVEGTK
+
+bin_PROGRAMS = eppfm
+
+
+endif
+
+EXTRA_DIST = costab.c gentbl.c audiolinux.c audiowin32.c coeff.m
+
+if CROSSCOMP
+else
+
+gentbl_SOURCES = gentbl.c
+
+BUILT_SOURCES = costab.c
+
+noinst_PROGRAMS = gentbl
+
+$(srcdir)/costab.c: gentbl
+ ./gentbl $(srcdir)/costab.c
+
+endif
+
+eppfm_SOURCES = \
+ main.c costab.c audio.c $(AUDIOSRC) \
+ support.c support.h \
+ interface.c interface.h \
+ callbacks.h \
+ widgets.c widgets.h
+
+eppfm_LDADD = @GTK_LIBS@ $(INTLLIBS) \
+ $(top_builddir)/main/libinit.a \
+ $(top_builddir)/main/libresident.a \
+ $(top_builddir)/main/libresident2.a \
+ $(top_builddir)/main/libmisc.a $(DIRECTXLIBS)
+
+noinst_HEADERS = \
+ eppfm.h \
+ getopt.h \
+ callbacks.h \
+ interface.h \
+ support.h \
+ widgets.h
diff --git a/eppfm2/src/Makefile.in b/eppfm2/src/Makefile.in
new file mode 100644
index 0000000..84de84d
--- /dev/null
+++ b/eppfm2/src/Makefile.in
@@ -0,0 +1,424 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ../..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AS = @AS@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+DATADIRNAME = @DATADIRNAME@
+DLLTOOL = @DLLTOOL@
+DRVLIBOBJS = @DRVLIBOBJS@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+HAVE_BITTYPES = @HAVE_BITTYPES@
+HAVE_DIRECTX = @HAVE_DIRECTX@
+HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@
+HAVE_IOFUNCS = @HAVE_IOFUNCS@
+HAVE_LIB = @HAVE_LIB@
+HAVE_MKISS = @HAVE_MKISS@
+HAVE_PPKDRV = @HAVE_PPKDRV@
+HAVE_PPUSER = @HAVE_PPUSER@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LIB = @LIB@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LTLIB = @LTLIB@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+M_PI = @M_PI@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+
+INCLUDES = \
+ -I$(top_srcdir)/intl \
+ -I$(top_srcdir)/main \
+ -I$(top_srcdir)/directx/include \
+ -I$(top_srcdir)/directx/include/directx6 \
+ @GTK_CFLAGS@
+
+ at DIRECTX_TRUE@AUDIOSRC = @DIRECTX_TRUE at audiowin32.c
+ at DIRECTX_FALSE@AUDIOSRC = @DIRECTX_FALSE at audiolinux.c
+ at DIRECTX_TRUE@DIRECTXLIBS = @DIRECTX_TRUE at -L$(top_builddir)/directx -ldsound -luser32 -lgdi32
+ at DIRECTX_FALSE@DIRECTXLIBS =
+
+ at HAVEGTK_TRUE@bin_PROGRAMS = @HAVEGTK_TRUE at eppfm
+
+EXTRA_DIST = costab.c gentbl.c audiolinux.c audiowin32.c coeff.m
+
+ at CROSSCOMP_FALSE@gentbl_SOURCES = @CROSSCOMP_FALSE at gentbl.c
+
+ at CROSSCOMP_FALSE@BUILT_SOURCES = @CROSSCOMP_FALSE at costab.c
+
+ at CROSSCOMP_FALSE@noinst_PROGRAMS = @CROSSCOMP_FALSE at gentbl
+
+eppfm_SOURCES = \
+ main.c costab.c audio.c $(AUDIOSRC) \
+ support.c support.h \
+ interface.c interface.h \
+ callbacks.h \
+ widgets.c widgets.h
+
+
+eppfm_LDADD = @GTK_LIBS@ $(INTLLIBS) \
+ $(top_builddir)/main/libinit.a \
+ $(top_builddir)/main/libresident.a \
+ $(top_builddir)/main/libresident2.a \
+ $(top_builddir)/main/libmisc.a $(DIRECTXLIBS)
+
+
+noinst_HEADERS = \
+ eppfm.h \
+ getopt.h \
+ callbacks.h \
+ interface.h \
+ support.h \
+ widgets.h
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../../config.h
+CONFIG_CLEAN_FILES =
+ at HAVEGTK_TRUE@bin_PROGRAMS = eppfm$(EXEEXT)
+ at CROSSCOMP_FALSE@noinst_PROGRAMS = gentbl$(EXEEXT)
+PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I../..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+ at DIRECTX_TRUE@eppfm_OBJECTS = main.$(OBJEXT) costab.$(OBJEXT) \
+ at DIRECTX_TRUE@audio.$(OBJEXT) audiowin32.$(OBJEXT) support.$(OBJEXT) \
+ at DIRECTX_TRUE@interface.$(OBJEXT) widgets.$(OBJEXT)
+ at DIRECTX_FALSE@eppfm_OBJECTS = main.$(OBJEXT) costab.$(OBJEXT) \
+ at DIRECTX_FALSE@audio.$(OBJEXT) audiolinux.$(OBJEXT) support.$(OBJEXT) \
+ at DIRECTX_FALSE@interface.$(OBJEXT) widgets.$(OBJEXT)
+ at DIRECTX_TRUE@eppfm_DEPENDENCIES = $(top_builddir)/main/libinit.a \
+ at DIRECTX_TRUE@$(top_builddir)/main/libresident.a \
+ at DIRECTX_TRUE@$(top_builddir)/main/libresident2.a \
+ at DIRECTX_TRUE@$(top_builddir)/main/libmisc.a
+ at DIRECTX_FALSE@eppfm_DEPENDENCIES = $(top_builddir)/main/libinit.a \
+ at DIRECTX_FALSE@$(top_builddir)/main/libresident.a \
+ at DIRECTX_FALSE@$(top_builddir)/main/libresident2.a \
+ at DIRECTX_FALSE@$(top_builddir)/main/libmisc.a
+eppfm_LDFLAGS =
+ at CROSSCOMP_FALSE@gentbl_OBJECTS = gentbl.$(OBJEXT)
+gentbl_LDADD = $(LDADD)
+gentbl_DEPENDENCIES =
+gentbl_LDFLAGS =
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+HEADERS = $(noinst_HEADERS)
+
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+SOURCES = $(eppfm_SOURCES) $(gentbl_SOURCES)
+OBJECTS = $(eppfm_OBJECTS) $(gentbl_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .obj .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps eppfm2/src/Makefile
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-binPROGRAMS:
+
+clean-binPROGRAMS:
+ -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
+
+distclean-binPROGRAMS:
+
+maintainer-clean-binPROGRAMS:
+
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(bindir)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ if test -f $$p; then \
+ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ list='$(bin_PROGRAMS)'; for p in $$list; do \
+ rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ done
+
+mostlyclean-noinstPROGRAMS:
+
+clean-noinstPROGRAMS:
+ -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
+
+distclean-noinstPROGRAMS:
+
+maintainer-clean-noinstPROGRAMS:
+
+.c.o:
+ $(COMPILE) -c $<
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+ $(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+ -rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+eppfm$(EXEEXT): $(eppfm_OBJECTS) $(eppfm_DEPENDENCIES)
+ @rm -f eppfm$(EXEEXT)
+ $(LINK) $(eppfm_LDFLAGS) $(eppfm_OBJECTS) $(eppfm_LDADD) $(LIBS)
+
+gentbl$(EXEEXT): $(gentbl_OBJECTS) $(gentbl_DEPENDENCIES)
+ @rm -f gentbl$(EXEEXT)
+ $(LINK) $(gentbl_LDFLAGS) $(gentbl_OBJECTS) $(gentbl_LDADD) $(LIBS)
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = eppfm2/src
+
+distdir: $(DISTFILES)
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+audio.o: audio.c ../../config.h eppfm.h ../../main/fpga.h \
+ ../../main/sysdeps.h getopt.h ../../main/parport.h
+audiolinux.o: audiolinux.c ../../config.h getopt.h eppfm.h \
+ ../../main/fpga.h ../../main/sysdeps.h ../../main/parport.h
+costab.o: costab.c eppfm.h ../../main/fpga.h ../../main/sysdeps.h \
+ ../../config.h getopt.h ../../main/parport.h
+gentbl.o: gentbl.c
+interface.o: interface.c ../../config.h getopt.h callbacks.h interface.h \
+ support.h
+main.o: main.c ../../config.h getopt.h eppfm.h ../../main/fpga.h \
+ ../../main/sysdeps.h ../../main/parport.h widgets.h callbacks.h \
+ interface.h support.h
+support.o: support.c ../../config.h getopt.h support.h
+widgets.o: widgets.c ../../config.h widgets.h
+
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am: install-binPROGRAMS
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-binPROGRAMS
+uninstall: uninstall-am
+all-am: Makefile $(PROGRAMS) $(HEADERS)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+ $(mkinstalldirs) $(DESTDIR)$(bindir)
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+ -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
+mostlyclean-am: mostlyclean-binPROGRAMS mostlyclean-noinstPROGRAMS \
+ mostlyclean-compile mostlyclean-tags \
+ mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-binPROGRAMS clean-noinstPROGRAMS clean-compile \
+ clean-tags clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am: distclean-binPROGRAMS distclean-noinstPROGRAMS \
+ distclean-compile distclean-tags distclean-generic \
+ clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-binPROGRAMS \
+ maintainer-clean-noinstPROGRAMS \
+ maintainer-clean-compile maintainer-clean-tags \
+ maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \
+maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \
+mostlyclean-noinstPROGRAMS distclean-noinstPROGRAMS \
+clean-noinstPROGRAMS maintainer-clean-noinstPROGRAMS \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile tags mostlyclean-tags distclean-tags \
+clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
+check-am installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+ at CROSSCOMP_FALSE@$(srcdir)/costab.c: gentbl
+ at CROSSCOMP_FALSE@ ./gentbl $(srcdir)/costab.c
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/eppfm2/src/audio.c b/eppfm2/src/audio.c
new file mode 100644
index 0000000..fa78b6e
--- /dev/null
+++ b/eppfm2/src/audio.c
@@ -0,0 +1,340 @@
+/*****************************************************************************/
+
+/*
+ * audio.c -- Audio processing for "virtual transceiver".
+ *
+ * Copyright (C) 1999 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <math.h>
+
+#include "eppfm.h"
+
+/* ---------------------------------------------------------------------- */
+
+#define PWRINTERVAL 4096 /* must be even */
+#define PWRINTERVAL2 64 /* must be even */
+#define PWRNOISECALIB 4096
+
+/* ---------------------------------------------------------------------- */
+
+struct {
+ /* samling rates */
+ unsigned int srateepp, sratedsp;
+ /* sampling rate converter */
+ unsigned int ph, phinc;
+ /* power meter */
+ unsigned int pwrcnt;
+ unsigned int pwracc;
+ /* freqency generators */
+ unsigned int ph0, ph1, freq0, freq1;
+} istate;
+
+struct {
+ /* samling rates */
+ unsigned int srateepp, sratedsp;
+ /* sampling rate converter */
+ unsigned int ph, phinc;
+ /* power meter */
+ unsigned int pwrcnt, pwrcnt2;
+ unsigned int pwracc1;
+ int pwracc2, pwracc3;
+ float pwracc4;
+ /* carrier detect state */
+ unsigned int dcdparam, dcd;
+} ostate;
+
+/* ---------------------------------------------------------------------- */
+
+static const int16_t rxfilter[16][16] = {
+ { 139, -57, -451, 612, 1263, -2887, -2021, 13678, 24449, 12513, -2539, -2588, 1360, 498, -450, -31 },
+ { 138, -85, -445, 728, 1141, -3169, -1432, 14824, 24343, 11337, -2984, -2276, 1432, 385, -443, -6 },
+ { 137, -115, -432, 842, 993, -3427, -772, 15942, 24131, 10160, -3358, -1956, 1480, 277, -430, 16 },
+ { 134, -146, -410, 954, 820, -3657, -42, 17022, 23817, 8989, -3661, -1632, 1504, 173, -412, 36 },
+ { 130, -177, -380, 1061, 623, -3854, 753, 18058, 23401, 7832, -3895, -1309, 1507, 76, -390, 54 },
+ { 124, -210, -341, 1161, 402, -4012, 1613, 19040, 22888, 6698, -4062, -991, 1490, -15, -365, 71 },
+ { 117, -243, -294, 1253, 159, -4127, 2531, 19961, 22282, 5594, -4165, -682, 1454, -97, -337, 85 },
+ { 108, -275, -237, 1333, -105, -4194, 3505, 20813, 21589, 4528, -4208, -386, 1401, -172, -307, 97 },
+ { 97, -307, -172, 1401, -386, -4208, 4528, 21589, 20813, 3505, -4194, -105, 1333, -237, -275, 108 },
+ { 85, -337, -97, 1454, -682, -4165, 5594, 22282, 19961, 2531, -4127, 159, 1253, -294, -243, 117 },
+ { 71, -365, -15, 1490, -991, -4062, 6698, 22888, 19040, 1613, -4012, 402, 1161, -341, -210, 124 },
+ { 54, -390, 76, 1507, -1309, -3895, 7832, 23401, 18058, 753, -3854, 623, 1061, -380, -177, 130 },
+ { 36, -412, 173, 1504, -1632, -3661, 8989, 23817, 17022, -42, -3657, 820, 954, -410, -146, 134 },
+ { 16, -430, 277, 1480, -1956, -3358, 10160, 24131, 15942, -772, -3427, 993, 842, -432, -115, 137 },
+ { -6, -443, 385, 1432, -2276, -2984, 11337, 24343, 14824, -1432, -3169, 1141, 728, -445, -85, 138 },
+ { -31, -450, 498, 1360, -2588, -2539, 12513, 24449, 13678, -2021, -2887, 1263, 612, -451, -57, 139 }
+};
+
+#define RXFPH(x) (((x)>>(PHASEFRAC-4))&15)
+#define RXFLEN 16
+
+/* ---------------------------------------------------------------------- */
+
+void audio_1750(int on)
+{
+ if (on && istate.srateepp > 0)
+ istate.freq0 = (1750*65536 + istate.srateepp/2) / istate.srateepp;
+ else
+ istate.freq0 = 0;
+ istate.freq1 = 0;
+ istate.ph0 = 0;
+ istate.ph1 = 0;
+}
+
+/*
+ *
+ * DTMF frequencies
+ *
+ * 1209 1336 1477 1633
+ * 697 1 2 3 A
+ * 770 4 5 6 B
+ * 852 7 8 9 C
+ * 941 * 0 # D
+ *
+ */
+
+void audio_dtmf(int ch)
+{
+ static const unsigned char dtmftransl[0x10] = {
+ 0x13, 0x00, 0x10, 0x20, 0x01, 0x11, 0x21, 0x02,
+ 0x12, 0x22, 0x30, 0x31, 0x32, 0x33, 0x03, 0x23
+ };
+ static const unsigned int freqlogrp[4] = { 697, 770, 852, 941 };
+ static const unsigned int freqhigrp[4] = { 1209, 1336, 1477, 1633 };
+ unsigned int tr;
+
+ if (ch & 16 && istate.sratedsp > 0) {
+ tr = dtmftransl[ch & 15];
+ istate.freq0 = (freqlogrp[tr & 15]*65536+istate.srateepp/2)/istate.srateepp;
+ istate.freq1 = (freqhigrp[tr >> 4]*65536+istate.srateepp/2)/istate.srateepp;
+ } else {
+ istate.freq0 = 0;
+ istate.freq1 = 0;
+ }
+ istate.ph0 = 0;
+ istate.ph1 = 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+void audio_setsquelch(int sq)
+{
+ ostate.dcdparam = !!sq;
+}
+
+int audio_getsquelch(void)
+{
+ return ostate.dcd;
+}
+
+/* ---------------------------------------------------------------------- */
+
+extern inline int calcfilter(const int16_t *coeff, const int8_t *data)
+{
+ unsigned cnt;
+ int sum = 0;
+
+ for (cnt = 0; cnt < RXFLEN; cnt++)
+ sum += (*coeff++) * (*data--);
+ return sum >> 8;
+}
+
+/* ---------------------------------------------------------------------- */
+
+void audio_initinput(unsigned int srateepp, unsigned int sratedsp)
+{
+ memset(&istate, 0, sizeof(istate));
+ istate.srateepp = srateepp;
+ istate.sratedsp = sratedsp;
+ istate.phinc = ((1 << PHASEFRAC) * sratedsp + srateepp / 2) / srateepp;
+ lprintf(2, "rec phase inc: 0x%05x\n", istate.phinc);
+}
+
+unsigned int audio_convertinput(unsigned int num, const int16_t *ibuf, signed char *obuf)
+{
+ unsigned int cnt = 0;
+ unsigned int i;
+ float pw;
+ int s;
+
+ for (i = 0; i < num; i++) {
+ istate.pwracc += ibuf[i] * ibuf[i];
+ if ((++istate.pwrcnt) >= PWRINTERVAL) {
+ pw = istate.pwracc;
+ istate.pwracc = 0;
+ istate.pwrcnt = 0;
+ pw *= (1.0 / PWRINTERVAL);
+ if (pw < 1.6384)
+ pw = -40;
+ else
+ pw = (10.0 / M_LN10) * log(pw) - 42.144;
+ gui_updatevu(pw, -40);
+ }
+ }
+ istate.ph &= PHASEMASK;
+ while (istate.ph < (num << PHASEFRAC)) {
+ s = ibuf[istate.ph >> PHASEFRAC] >> 8;
+ s += SIN(istate.ph0) >> 9;
+ s += SIN(istate.ph1) >> 9;
+ if (s > 127)
+ s = 127;
+ if (s < -128)
+ s = -128;
+ obuf[cnt] = s;
+ istate.ph += istate.phinc;
+ cnt++;
+ istate.ph0 += istate.freq0;
+ istate.ph1 += istate.freq1;
+ }
+ gui_addsamples(num, ibuf);
+ return cnt;
+}
+
+int audio_adjustinput(int eppcnt, int dspcnt, int eppdelay)
+{
+ lprintf(4, "eppcnt %d dspcnt %d eppdelay %d\n", eppcnt, dspcnt, eppdelay);
+ if (eppdelay > SNDLATENCY) {
+ istate.phinc++;
+ istate.ph += PHASEMASK >> 2;
+ if (istate.ph > PHASEMASK)
+ istate.ph = PHASEMASK;
+ } else if (eppdelay < SNDLATENCY) {
+ istate.phinc--;
+ istate.ph -= PHASEMASK >> 2;
+ if (istate.ph > PHASEMASK)
+ istate.ph = 0;
+ }
+ if (istate.phinc < (0x9 << (PHASEFRAC-4)) || istate.phinc > (0x1f << (PHASEFRAC-4))) {
+ lprintf(0, "phinc (0x%05x) out of range\n", istate.phinc);
+ return -1;
+ }
+ lprintf(3, "phase increment: 0x%05x\n", istate.phinc);
+ return 0;
+}
+
+void audio_initoutput(unsigned int srateepp, unsigned int sratedsp)
+{
+ memset(&ostate, 0, sizeof(ostate));
+ ostate.srateepp = srateepp;
+ ostate.sratedsp = sratedsp;
+ ostate.phinc = ((1 << PHASEFRAC) * srateepp + sratedsp / 2) / sratedsp;
+ lprintf(2, "play phase inc: 0x%05x\n", ostate.phinc);
+}
+
+unsigned int audio_convertoutput(unsigned int num, const signed char *ibuf, int16_t *obuf)
+{
+ unsigned int cnt = 0;
+ unsigned int i;
+ float pw1, pw2;
+
+ for (i = 0; i < num; i++) {
+ ostate.pwracc1 += ibuf[i] * ibuf[i];
+ switch (ostate.pwrcnt2 & 3) {
+ case 0:
+ ostate.pwracc2 -= ibuf[i];
+ break;
+
+ case 1:
+ ostate.pwracc3 -= ibuf[i];
+ break;
+
+ case 2:
+ ostate.pwracc2 += ibuf[i];
+ break;
+
+ default:
+ ostate.pwracc3 += ibuf[i];
+ break;
+ }
+ if ((++ostate.pwrcnt2) >= PWRINTERVAL2) {
+ ostate.pwracc4 += ostate.pwracc2 * ostate.pwracc2 + ostate.pwracc3 * ostate.pwracc3;
+ ostate.pwracc2 = 0;
+ ostate.pwracc3 = 0;
+ ostate.pwrcnt2 = 0;
+ }
+ if ((++ostate.pwrcnt) >= PWRINTERVAL) {
+ pw1 = ostate.pwracc1;
+ pw2 = ostate.pwracc4;
+ ostate.pwracc1 = 0;
+ ostate.pwracc4 = 0;
+ ostate.pwrcnt = 0;
+ pw1 *= (1.0 / PWRINTERVAL);
+ pw2 *= (1.0 / PWRINTERVAL / PWRINTERVAL) * PWRNOISECALIB;
+ if (pw1 < 1.6384)
+ pw1 = -40;
+ else
+ pw1 = (10.0 / M_LN10) * log(pw1) - 42.144;
+ if (pw2 < 1.6384)
+ pw2 = -40;
+ else
+ pw2 = (10.0 / M_LN10) * log(pw2) - 42.144;
+ if (pw2 > 0)
+ pw2 = 0;
+ gui_updatevu(pw1, pw2);
+ ostate.dcd = (pw1 > -30) && (pw2 < (pw1 / 2 - 20));
+ }
+ }
+ ostate.ph &= PHASEMASK;
+ while (ostate.ph < (num << PHASEFRAC)) {
+#if 0
+ obuf[cnt] = ibuf[ostate.ph >> PHASEFRAC] << 8;
+#else
+ obuf[cnt] = calcfilter(rxfilter[RXFPH(ostate.ph)], ibuf+(ostate.ph >> PHASEFRAC));
+#endif
+ ostate.ph += ostate.phinc;
+ cnt++;
+ }
+ gui_addsamples(cnt, obuf);
+ if (!ostate.dcd && ostate.dcdparam)
+ memset(obuf, 0, 2*cnt);
+ return cnt;
+}
+
+int audio_adjustoutput(int dspcnt, int eppcnt, int dspdelay)
+{
+ lprintf(4, "dspcnt %d eppcnt %d dspdelay %d\n", dspcnt, eppcnt, dspdelay);
+ ostate.ph &= PHASEMASK;
+ if (dspdelay > SNDLATENCY) {
+ ostate.phinc++;
+ ostate.ph += PHASEMASK >> 2;
+ if (ostate.ph > PHASEMASK)
+ ostate.ph = PHASEMASK;
+ } else if (dspdelay < SNDLATENCY) {
+ ostate.phinc--;
+ ostate.ph -= PHASEMASK >> 2;
+ if (ostate.ph > PHASEMASK)
+ ostate.ph = 0;
+ } if (ostate.phinc < (0x9 << (PHASEFRAC-4)) || ostate.phinc > (0x1f << (PHASEFRAC-4))) {
+ lprintf(0, "phinc (0x%05x) out of range\n", ostate.phinc);
+ return -1;
+ }
+ lprintf(3, "phase increment: 0x%05x\n", ostate.phinc);
+ return 0;
+}
+
+/* ---------------------------------------------------------------------- */
diff --git a/eppfm2/src/audiolinux.c b/eppfm2/src/audiolinux.c
new file mode 100644
index 0000000..a15d9c5
--- /dev/null
+++ b/eppfm2/src/audiolinux.c
@@ -0,0 +1,475 @@
+/*****************************************************************************/
+
+/*
+ * audio.c -- Audio processing for "virtual transceiver", Linux IO.
+ *
+ * Copyright (C) 1999 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef HAVE_LINUX_SOUNDCARD_H
+
+#include <sys/types.h>
+
+#include <linux/soundcard.h>
+#include <sys/stat.h>
+#include <sys/uio.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+
+#include "eppfm.h"
+
+#include <gtk/gtk.h>
+#include <glib.h>
+
+/* ---------------------------------------------------------------------- */
+
+#define BUFSIZE 8192 /* must be significantly bigger than SNDLATENCY! */
+#define OVERLAP 32
+
+/* ---------------------------------------------------------------------- */
+
+struct {
+ enum { st_mdmerr, st_off, st_play, st_rec } state;
+
+ /* gtk timeout handle */
+ gint tmotag;
+ /* sampling rate conversion state */
+ int16_t sample[OVERLAP];
+ /* control register */
+ unsigned char ctrlreg;
+ /* led blink counter */
+ unsigned ledcnt;
+
+ /* low level driver specific data */
+ int fddsp;
+} state = { st_mdmerr, };
+
+/* ---------------------------------------------------------------------- */
+
+static gint periodic_play(gpointer data)
+{
+ union {
+ unsigned char u[BUFSIZE];
+ signed char s[BUFSIZE];
+ } buf;
+ int16_t sbuf[BUFSIZE];
+ int apar, i, icnt, cnt;
+
+ /* epp->dsp direction */
+ /* get FIFO count */
+ buf.u[0] = state.ctrlreg | 1;
+ if (parport_epp_write_addr(buf.u, 1) != 1)
+ goto err;
+ if (parport_epp_read_addr(buf.u, 2) != 2)
+ goto err;
+ icnt = buf.u[0] | (((unsigned int)buf.u[1]) << 8);
+ buf.u[0] = state.ctrlreg;
+ if (parport_epp_write_addr(buf.u, 1) != 1)
+ goto err;
+ icnt &= 0x7fff;
+ if (icnt > 0) {
+ if (icnt > BUFSIZE/2)
+ icnt = BUFSIZE/2;
+ memcpy(buf.s, state.sample, OVERLAP);
+ if (parport_epp_read_data(buf.s+OVERLAP, icnt) != icnt)
+ goto err;
+ memcpy(state.sample, buf.s+icnt, OVERLAP);
+ cnt = audio_convertoutput(icnt, buf.s+OVERLAP, sbuf);
+ if ((i = write(state.fddsp, sbuf, 2*cnt)) != 2*cnt) {
+ lprintf(0, "write(%d) failed %i (%s)\n", 2*cnt, i, strerror(errno));
+ goto err;
+ }
+ if (ioctl(state.fddsp, SNDCTL_DSP_GETODELAY, &apar) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_GETODELAY failed (%s)\n", strerror(errno));
+ goto err;
+ }
+ apar >>= 1;
+ /* adjust speed */
+ if (audio_adjustoutput(cnt, icnt, apar))
+ goto err;
+ /* play games with the LEDS */
+ state.ledcnt += icnt;
+ if (state.ledcnt >= 4000) {
+ state.ledcnt %= 4000;
+ state.ctrlreg += 0x40;
+ }
+ /* DCD led */
+ if (audio_getsquelch())
+ state.ctrlreg |= 0x10;
+ else
+ state.ctrlreg &= ~0x10;
+ }
+ return TRUE;
+
+ err:
+ reset_modem();
+ lprintf(0, "EPP timeout\n");
+ state.state = st_mdmerr;
+ close(state.fddsp);
+ return FALSE;
+}
+
+static gint periodic_rec(gpointer data)
+{
+ union {
+ unsigned char u[BUFSIZE];
+ signed char s[BUFSIZE];
+ } buf;
+ int16_t sbuf[BUFSIZE];
+ int ocnt, cnt, ocnts, omax;
+
+ /* dsp->epp direction */
+ /* read sound */
+ memcpy(sbuf, state.sample, OVERLAP*2);
+ ocnts = read(state.fddsp, sbuf+OVERLAP, 2*BUFSIZE/2);
+ if (ocnts == -1 && errno == EAGAIN)
+ ocnts = 0;
+ if (ocnts < 0) {
+ lprintf(0, "read(%d) failed %i (%s)\n", 2*BUFSIZE/2, ocnts, strerror(errno));
+ goto err;
+ }
+ ocnts >>= 1;
+ memcpy(state.sample, sbuf+ocnts, OVERLAP*2);
+ /* get FIFO count */
+ buf.u[0] = state.ctrlreg | 2;
+ if (parport_epp_write_addr(buf.u, 1) != 1)
+ goto err;
+ if (parport_epp_read_addr(buf.u, 2) != 2)
+ goto err;
+ ocnt = buf.u[0] | (((unsigned int)buf.u[1]) << 8);
+ buf.u[0] = state.ctrlreg;
+ if (parport_epp_write_addr(buf.u, 1) != 1)
+ goto err;
+ ocnt &= 0x7fff;
+ omax = 16384 - ocnt;
+ cnt = 0;
+ if (ocnts > 0) {
+ cnt = audio_convertinput(ocnts, sbuf+OVERLAP, buf.s);
+ if (cnt > omax) {
+ lprintf(0, "epp adapter output overrun (%d, %d)\n", cnt, omax);
+ goto err;
+ }
+ if (parport_epp_write_data(buf.s, cnt) != cnt)
+ goto err;
+ /* reget the FIFO count */
+ buf.u[0] = state.ctrlreg | 2;
+ if (parport_epp_write_addr(buf.u, 1) != 1)
+ goto err;
+ if (parport_epp_read_addr(buf.u, 2) != 2)
+ goto err;
+ ocnt = buf.u[0] | (((unsigned int)buf.u[1]) << 8);
+ buf.u[0] = state.ctrlreg;
+ if (parport_epp_write_addr(buf.u, 1) != 1)
+ goto err;
+ ocnt &= 0x7fff;
+ }
+ /* adjust speed */
+ if (audio_adjustinput(cnt, ocnts, ocnt))
+ goto err;
+ return TRUE;
+
+ err:
+ reset_modem();
+ lprintf(0, "EPP timeout\n");
+ state.state = st_mdmerr;
+ close(state.fddsp);
+ return FALSE;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static void playstop(void)
+{
+ unsigned char buf;
+
+ if (state.state != st_play)
+ return;
+ gtk_timeout_remove(state.tmotag);
+ close(state.fddsp);
+ /* reset the EPP adapter */
+ buf = 7;
+ if (parport_epp_write_addr(&buf, 1) != 1) {
+ state.state = st_mdmerr;
+ reset_modem();
+ } else
+ state.state = st_off;
+}
+
+static void recstop(void)
+{
+ unsigned char buf;
+
+ if (state.state != st_rec)
+ return;
+ gtk_timeout_remove(state.tmotag);
+ close(state.fddsp);
+ /* reset the EPP adapter */
+ buf = 7;
+ if (parport_epp_write_addr(&buf, 1) != 1) {
+ state.state = st_mdmerr;
+ reset_modem();
+ } else
+ state.state = st_off;
+}
+
+static void playstart(void)
+{
+ unsigned char buf[2];
+ int16_t sbuf[SNDLATENCY];
+ audio_buf_info abinfo;
+ int apar;
+ unsigned srate;
+ int i;
+
+ if (state.state == st_play)
+ playstop();
+ if (state.state == st_rec)
+ recstop();
+ state.ctrlreg = 0;
+ state.ledcnt = 0;
+ memset(state.sample, 0, sizeof(state.sample));
+ /* start modem if mdmerr */
+ if (state.state == st_mdmerr) {
+ cfg.bitrate = SAMPLINGRATE;
+ if ((i = adapter_start_eppsamp(&cfg))) {
+ lprintf(0, "Cannot initialize the modem\n");
+ return;
+ }
+ }
+ state.state = st_off;
+ if ((state.fddsp = open("/dev/dsp", O_WRONLY | O_NONBLOCK)) == -1) {
+ lprintf(0, "cannot open /dev/dsp (%s)\n", strerror(errno));
+ return;
+ }
+ fcntl(state.fddsp, F_SETFL, fcntl(state.fddsp, F_GETFL, 0) | O_NONBLOCK);
+ if (ioctl(state.fddsp, SNDCTL_DSP_NONBLOCK, 0) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_NONBLOCK failed (%s)\n", strerror(errno));
+ goto errsnd;
+ }
+ if (ioctl(state.fddsp, SNDCTL_DSP_GETCAPS, &apar) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_GETCAPS failed (%s)\n", strerror(errno));
+ goto errsnd;
+ }
+ if (!(apar & DSP_CAP_TRIGGER)) {
+ lprintf(0, "soundcard does not support trigger\n");
+ goto errsnd;
+ }
+ apar = AFMT_S16_LE;
+ if (ioctl(state.fddsp, SNDCTL_DSP_SETFMT, &apar) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_SETFMT failed (%s), S16_LE not supported??\n", strerror(errno));
+ goto errsnd;
+ }
+ apar = 0;
+ if (ioctl(state.fddsp, SNDCTL_DSP_STEREO, &apar) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_STEREO failed (%s), mono not supported??\n", strerror(errno));
+ goto errsnd;
+ }
+ srate = cfg.bitrate;
+ if (ioctl(state.fddsp, SNDCTL_DSP_SPEED, &srate) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_SPEED failed (%s), samplingrate %u not supported??\n",
+ strerror(errno), cfg.bitrate);
+ goto errsnd;
+ }
+ lprintf(2, "epp adapter sampling rate %u, soundcard sampling rate %u\n", cfg.bitrate, srate);
+ if (abs(cfg.bitrate - srate) > cfg.bitrate / 2) {
+ lprintf(0, "sampling rates (%u,%u) too different\n", cfg.bitrate, srate);
+ goto errsnd;
+ }
+ if (ioctl(state.fddsp, SNDCTL_DSP_GETOSPACE, &abinfo) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_GETOSPACE failed (%s)\n", strerror(errno));
+ goto errsnd;
+ }
+ if (abinfo.fragstotal * abinfo.fragsize < 2*SNDLATENCY*2) {
+ lprintf(0, "soundcard buffers too small (%u)\n",
+ abinfo.fragstotal * abinfo.fragsize);
+ goto errsnd;
+ }
+ audio_initoutput(cfg.bitrate, srate);
+ lprintf(0, "Audio Output to Linux Soundcard\n");
+ /* reset the EPP adapter */
+ buf[0] = 7;
+ buf[1] = state.ctrlreg;
+ if (parport_epp_write_addr(buf, 2) != 2)
+ goto errret;
+ /* prefill to nominal queue size and start soundcard */
+ memset(sbuf, 0, sizeof(sbuf));
+ if ((i = write(state.fddsp, sbuf, 2*SNDLATENCY)) != 2*SNDLATENCY) {
+ lprintf(0, "write(%d) failed %i (%s)\n", 2*SNDLATENCY, i, strerror(errno));
+ goto errsnd;
+ }
+ apar = PCM_ENABLE_OUTPUT;
+ if (ioctl(state.fddsp, SNDCTL_DSP_SETTRIGGER, &apar) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_SETTRIGGER failed (%s)\n", strerror(errno));
+ goto errsnd;
+ }
+ state.tmotag = gtk_timeout_add(100, periodic_play, NULL);
+ state.state = st_play;
+ return;
+
+ errsnd:
+ buf[0] = 7;
+ if (parport_epp_write_addr(buf, 1) != 1)
+ goto errret;
+ state.state = st_off;
+ goto errclose;
+
+ errret:
+ lprintf(0, "EPP timeout\n");
+ state.state = st_mdmerr;
+ reset_modem();
+ errclose:
+ close(state.fddsp);
+}
+
+static void recstart(void)
+{
+ unsigned char buf[SNDLATENCY];
+ audio_buf_info abinfo;
+ int apar;
+ unsigned srate;
+ int i;
+
+ if (state.state == st_play)
+ playstop();
+ if (state.state == st_rec)
+ recstop();
+ state.ctrlreg = 0x20;
+ state.ledcnt = 0;
+ memset(state.sample, 0, sizeof(state.sample));
+ /* start modem if mdmerr */
+ if (state.state == st_mdmerr) {
+ cfg.bitrate = SAMPLINGRATE;
+ if ((i = adapter_start_eppsamp(&cfg))) {
+ lprintf(0, "Cannot initialize the modem\n");
+ return;
+ }
+ }
+ state.state = st_off;
+ if ((state.fddsp = open("/dev/dsp", O_RDONLY | O_NONBLOCK)) == -1) {
+ lprintf(0, "cannot open /dev/dsp (%s)\n", strerror(errno));
+ return;
+ }
+ fcntl(state.fddsp, F_SETFL, fcntl(state.fddsp, F_GETFL, 0) | O_NONBLOCK);
+ if (ioctl(state.fddsp, SNDCTL_DSP_NONBLOCK, 0) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_NONBLOCK failed (%s)\n", strerror(errno));
+ goto errsnd;
+ }
+ if (ioctl(state.fddsp, SNDCTL_DSP_GETCAPS, &apar) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_GETCAPS failed (%s)\n", strerror(errno));
+ goto errsnd;
+ }
+ if (!(apar & DSP_CAP_TRIGGER)) {
+ lprintf(0, "soundcard does not support trigger\n");
+ goto errsnd;
+ }
+ apar = AFMT_S16_LE;
+ if (ioctl(state.fddsp, SNDCTL_DSP_SETFMT, &apar) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_SETFMT failed (%s), S16_LE not supported??\n", strerror(errno));
+ goto errsnd;
+ }
+ apar = 0;
+ if (ioctl(state.fddsp, SNDCTL_DSP_STEREO, &apar) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_STEREO failed (%s), mono not supported??\n", strerror(errno));
+ goto errsnd;
+ }
+ srate = cfg.bitrate;
+ if (ioctl(state.fddsp, SNDCTL_DSP_SPEED, &srate) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_SPEED failed (%s), samplingrate %u not supported??\n",
+ strerror(errno), cfg.bitrate);
+ goto errsnd;
+ }
+ lprintf(2, "epp adapter sampling rate %u, soundcard sampling rate %u\n", cfg.bitrate, srate);
+ if (abs(cfg.bitrate - srate) > cfg.bitrate / 2) {
+ lprintf(0, "sampling rates (%u,%u) too different\n", cfg.bitrate, srate);
+ goto errsnd;
+ }
+ if (ioctl(state.fddsp, SNDCTL_DSP_GETISPACE, &abinfo) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_GETISPACE failed (%s)\n", strerror(errno));
+ goto errsnd;
+ }
+ if (abinfo.fragstotal * abinfo.fragsize < 2*SNDLATENCY*2) {
+ lprintf(0, "soundcard buffers too small (%u)\n",
+ abinfo.fragstotal * abinfo.fragsize);
+ goto errsnd;
+ }
+ audio_initinput(cfg.bitrate, srate);
+ lprintf(0, "Audio Input from Linux Soundcard\n");
+ /* reset the EPP adapter */
+ buf[0] = 7;
+ buf[1] = state.ctrlreg;
+ if (parport_epp_write_addr(buf, 2) != 2)
+ goto errret;
+ /* prefill EPP adapter start soundcard */
+ memset(buf, 0, sizeof(buf));
+ if (parport_epp_write_data(buf, SNDLATENCY) != SNDLATENCY)
+ goto errret;
+ apar = PCM_ENABLE_INPUT;
+ if (ioctl(state.fddsp, SNDCTL_DSP_SETTRIGGER, &apar) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_SETTRIGGER failed (%s)\n", strerror(errno));
+ goto errsnd;
+ }
+ state.tmotag = gtk_timeout_add(100, periodic_rec, NULL);
+ state.state = st_rec;
+ return;
+
+ errsnd:
+ buf[0] = 7;
+ if (parport_epp_write_addr(buf, 1) != 1)
+ goto errret;
+ state.state = st_off;
+ goto errclose;
+
+ errret:
+ lprintf(0, "EPP timeout\n");
+ state.state = st_mdmerr;
+ reset_modem();
+ errclose:
+ close(state.fddsp);
+}
+
+/* ---------------------------------------------------------------------- */
+
+void audio_ptt(int ptt)
+{
+ if (ptt && state.state != st_rec)
+ recstart();
+ else if (!ptt && state.state != st_play)
+ playstart();
+}
+
+int audio_drvinit(const char *config)
+{
+ return 0;
+}
+
+/* ---------------------------------------------------------------------- */
+#endif /* HAVE_LINUX_SOUNDCARD_H */
+
diff --git a/eppfm2/src/audiowin32.c b/eppfm2/src/audiowin32.c
new file mode 100644
index 0000000..c3621f9
--- /dev/null
+++ b/eppfm2/src/audiowin32.c
@@ -0,0 +1,654 @@
+/*****************************************************************************/
+
+/*
+ * audiowin32.c -- Audio processing for "virtual transceiver", win32 IO.
+ *
+ * Copyright (C) 1999 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef HAVE_DIRECTX
+
+#include "eppfm.h"
+
+#include <directx.h>
+
+#include <gtk/gtk.h>
+#include <glib.h>
+
+/* ---------------------------------------------------------------------- */
+
+#define BUFSIZE 8192 /* must be significantly bigger than SNDLATENCY! */
+#define OVERLAP 32
+
+/* ---------------------------------------------------------------------- */
+
+struct {
+ enum { st_mdmerr, st_off, st_play, st_rec } state;
+
+ /* gtk timeout handle */
+ gint tmotag;
+ /* sampling rate conversion state */
+ int16_t sample[OVERLAP];
+ /* control register */
+ unsigned char ctrlreg;
+ /* led blink counter */
+ unsigned ledcnt;
+
+ /* low level driver specific data */
+ LPDIRECTSOUND dsplay;
+ LPDIRECTSOUNDCAPTURE dsrec;
+ LPDIRECTSOUNDBUFFER playbuf;
+ LPDIRECTSOUNDCAPTUREBUFFER recbuf;
+ HANDLE hinst;
+ HWND hwnd;
+ DWORD playbufsz, recbufsz, playptr, recptr;
+} state = { st_mdmerr, };
+
+/* ---------------------------------------------------------------------- */
+
+static BOOL CALLBACK DSEnumProc(LPGUID guid, LPCSTR lpszDesc, LPCSTR lpszDrvName, LPVOID lpcontext)
+{
+ lprintf(1, "has %sGUID, desc %s drvname %s\n", guid ? "" : "no ", lpszDesc, lpszDrvName);
+ return TRUE;
+}
+
+#if 0
+static LRESULT CALLBACK MyWndProc(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
+{
+ switch(umsg) {
+ /* Add cases such as WM_CREATE, WM_COMMAND, WM_PAINT if you don't
+ want to pass these messages along for default processing. */
+ case WM_CLOSE:
+ DestroyWindow(hwnd);
+ return 0;
+
+ case WM_DESTROY:
+ PostQuitMessage(0);
+ return 0;
+ }
+ return DefWindowProc(hwnd, umsg, wParam, lParam);
+}
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+static gint periodic_play(gpointer data)
+{
+ union {
+ unsigned char u[BUFSIZE];
+ signed char s[BUFSIZE];
+ } buf;
+ int16_t sbuf[BUFSIZE];
+ HRESULT res;
+ DWORD lockbytes1, lockbytes2, delay;
+ int16_t *sptr1;
+ int16_t *sptr2;
+ int icnt, cnt;
+
+ /* epp->dsp direction */
+ /* get FIFO count */
+ buf.u[0] = state.ctrlreg | 1;
+ if (parport_epp_write_addr(buf.u, 1) != 1)
+ goto err;
+ if (parport_epp_read_addr(buf.u, 2) != 2)
+ goto err;
+ icnt = buf.u[0] | (((unsigned int)buf.u[1]) << 8);
+ buf.u[0] = state.ctrlreg;
+ if (parport_epp_write_addr(buf.u, 1) != 1)
+ goto err;
+ icnt &= 0x7fff;
+ if (icnt > 0) {
+ if (icnt > BUFSIZE/2)
+ icnt = BUFSIZE/2;
+ memcpy(buf.s, state.sample, OVERLAP);
+ if (parport_epp_read_data(buf.s+OVERLAP, icnt) != icnt)
+ goto err;
+ memcpy(state.sample, buf.s+icnt, OVERLAP);
+ cnt = audio_convertoutput(icnt, buf.s+OVERLAP, sbuf);
+ if (FAILED(res = IDirectSoundBuffer_Lock(state.playbuf, state.playptr, cnt*2,
+ (LPVOID)&sptr1, &lockbytes1,
+ (LPVOID)&sptr2, &lockbytes2, 0))) {
+ lprintf(0, "IDirectSoundBuffer_Lock error %lu\n", res);
+ goto err;
+ }
+ memcpy(sptr1, sbuf, lockbytes1);
+ if (lockbytes1 < 2*cnt)
+ memcpy(sptr2, sbuf + lockbytes1/2, 2*cnt - lockbytes1);
+ if (FAILED(res = IDirectSoundBuffer_Unlock(state.playbuf, sptr1, lockbytes1, sptr2, lockbytes2))) {
+ lprintf(0, "IDirectSoundBuffer_Unlock error %lu\n", res);
+ goto err;
+ }
+ state.playptr = (state.playptr + 2*cnt) % state.playbufsz;
+ /* get output delay */
+ if (FAILED(res = IDirectSoundBuffer_GetCurrentPosition(state.playbuf, &delay, NULL))) {
+ lprintf(0, "IDirectSoundBuffer_GetCurrentPosition error %lu\n", res);
+ goto err;
+ }
+ delay = (state.playbufsz + state.playptr - delay) % state.playbufsz;
+ delay >>= 1;
+ /* adjust speed */
+ if (audio_adjustoutput(cnt, icnt, delay))
+ goto err;
+ /* play games with the LEDS */
+ state.ledcnt += icnt;
+ if (state.ledcnt >= 4000) {
+ state.ledcnt %= 4000;
+ state.ctrlreg += 0x40;
+ }
+ /* DCD led */
+ if (audio_getsquelch())
+ state.ctrlreg |= 0x10;
+ else
+ state.ctrlreg &= ~0x10;
+ }
+ return TRUE;
+
+err:
+ lprintf(0, "EPP timeout\n");
+ IDirectSoundBuffer_Stop(state.playbuf);
+ IDirectSoundBuffer_Release(state.playbuf);
+ IDirectSound_Release(state.dsplay);
+#if 0
+ DestroyWindow(state.hwnd);
+ UnregisterClass("MyClass", state.hinst);
+#endif
+ state.hwnd = NULL;
+ reset_modem();
+ state.state = st_mdmerr;
+ return FALSE;
+}
+
+static gint periodic_rec(gpointer data)
+{
+ union {
+ unsigned char u[BUFSIZE];
+ signed char s[BUFSIZE];
+ } buf;
+ int16_t sbuf[BUFSIZE];
+ HRESULT res;
+ DWORD lockbytes1, lockbytes2, delay;
+ int16_t *sptr1;
+ int16_t *sptr2;
+ int ocnt, cnt, ocnts, omax;
+
+ /* dsp->epp direction */
+ /* read sound */
+ memcpy(sbuf, state.sample, OVERLAP*2);
+ /* read sound */
+ if (FAILED(res = IDirectSoundCaptureBuffer_GetCurrentPosition(state.recbuf, &delay, NULL))) {
+ lprintf(0, "IDirectSoundCaptureBuffer_GetCurrentPosition error %lu\n", res);
+ goto err;
+ }
+ ocnts = (state.recbufsz + delay - state.recptr) % state.recbufsz;
+ ocnts &= ~1;
+ if (ocnts > 0) {
+ if (FAILED(res = IDirectSoundCaptureBuffer_Lock(state.recbuf, state.recptr, ocnts,
+ (LPVOID)&sptr1, &lockbytes1,
+ (LPVOID)&sptr2, &lockbytes2, 0))) {
+ lprintf(0, "IDirectSoundCaptureBuffer_Lock error %lu\n", res);
+ goto err;
+ }
+ memcpy(sbuf+OVERLAP, sptr1, lockbytes1);
+ if (lockbytes1 < ocnts)
+ memcpy(sbuf+OVERLAP+lockbytes1/2, sptr2, ocnts - lockbytes1);
+ if (FAILED(res = IDirectSoundCaptureBuffer_Unlock(state.recbuf, sptr1, lockbytes1, sptr2, lockbytes2))) {
+ lprintf(0, "IDirectSoundCaptureBuffer_Unlock error %lu\n", res);
+ goto err;
+ }
+ state.recptr = (state.recptr + ocnts) % state.recbufsz;
+ }
+ ocnts >>= 1;
+ memcpy(state.sample, sbuf+ocnts, OVERLAP*2);
+ /* get FIFO count */
+ buf.u[0] = state.ctrlreg | 2;
+ if (parport_epp_write_addr(buf.u, 1) != 1)
+ goto err;
+ if (parport_epp_read_addr(buf.u, 2) != 2)
+ goto err;
+ ocnt = buf.u[0] | (((unsigned int)buf.u[1]) << 8);
+ buf.u[0] = state.ctrlreg;
+ if (parport_epp_write_addr(buf.u, 1) != 1)
+ goto err;
+ ocnt &= 0x7fff;
+ omax = 16384 - ocnt;
+ cnt = 0;
+ if (ocnts > 0) {
+ cnt = audio_convertinput(ocnts, sbuf+OVERLAP, buf.s);
+ if (cnt > omax) {
+ lprintf(0, "epp adapter output overrun (%d, %d)\n", cnt, omax);
+ goto err;
+ }
+ if (parport_epp_write_data(buf.s, cnt) != cnt)
+ goto err;
+ /* reget the FIFO count */
+ buf.u[0] = state.ctrlreg | 2;
+ if (parport_epp_write_addr(buf.u, 1) != 1)
+ goto err;
+ if (parport_epp_read_addr(buf.u, 2) != 2)
+ goto err;
+ ocnt = buf.u[0] | (((unsigned int)buf.u[1]) << 8);
+ buf.u[0] = state.ctrlreg;
+ if (parport_epp_write_addr(buf.u, 1) != 1)
+ goto err;
+ ocnt &= 0x7fff;
+ }
+ /* adjust speed */
+ if (audio_adjustinput(cnt, ocnts, ocnt))
+ goto err;
+ return TRUE;
+
+err:
+ lprintf(0, "EPP timeout\n");
+ IDirectSoundCaptureBuffer_Stop(state.recbuf);
+ IDirectSoundCaptureBuffer_Release(state.recbuf);
+ IDirectSoundCapture_Release(state.dsrec);
+#if 0
+ DestroyWindow(state.hwnd);
+ UnregisterClass("MyClass", state.hinst);
+#endif
+ state.hwnd = NULL;
+ reset_modem();
+ state.state = st_mdmerr;
+ return FALSE;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static void playstop(void)
+{
+ unsigned char buf;
+
+ if (state.state != st_play)
+ return;
+ gtk_timeout_remove(state.tmotag);
+ IDirectSoundBuffer_Stop(state.playbuf);
+ IDirectSoundBuffer_Release(state.playbuf);
+ IDirectSound_Release(state.dsplay);
+#if 0
+ DestroyWindow(state.hwnd);
+ UnregisterClass("MyClass", state.hinst);
+#endif
+ state.hwnd = NULL;
+ /* reset the EPP adapter */
+ buf = 7;
+ if (parport_epp_write_addr(&buf, 1) != 1) {
+ state.state = st_mdmerr;
+ reset_modem();
+ } else
+ state.state = st_off;
+}
+
+static void recstop(void)
+{
+ unsigned char buf;
+
+ if (state.state != st_rec)
+ return;
+ gtk_timeout_remove(state.tmotag);
+ IDirectSoundCaptureBuffer_Stop(state.recbuf);
+ IDirectSoundCaptureBuffer_Release(state.recbuf);
+ IDirectSoundCapture_Release(state.dsrec);
+#if 0
+ DestroyWindow(state.hwnd);
+ UnregisterClass("MyClass", state.hinst);
+#endif
+ state.hwnd = NULL;
+ /* reset the EPP adapter */
+ buf = 7;
+ if (parport_epp_write_addr(&buf, 1) != 1) {
+ state.state = st_mdmerr;
+ reset_modem();
+ } else
+ state.state = st_off;
+}
+
+static void playstart(void)
+{
+ WNDCLASS wndclass;
+ HRESULT res;
+ WAVEFORMATEX waveformat;
+ DSBUFFERDESC bdesc;
+ unsigned char buf[2];
+ DWORD lockbytes;
+ int16_t *sptr;
+ unsigned srate;
+ int i;
+
+ if (state.state == st_play)
+ playstop();
+ if (state.state == st_rec)
+ recstop();
+ state.ctrlreg = 0;
+ state.ledcnt = 0;
+ memset(state.sample, 0, sizeof(state.sample));
+ /* start modem if mdmerr */
+ if (state.state == st_mdmerr) {
+ cfg.bitrate = SAMPLINGRATE;
+ if ((i = adapter_start_eppsamp(&cfg))) {
+ lprintf(0, "Cannot initialize the modem\n");
+ return;
+ }
+ }
+ state.state = st_off;
+ state.dsplay = NULL;
+ state.playbuf = NULL;
+ state.playptr = 0;
+#if 0
+ wndclass.style = CS_HREDRAW | CS_VREDRAW;
+ wndclass.lpfnWndProc = (WNDPROC)MyWndProc;
+ wndclass.cbClsExtra = 0;
+ wndclass.cbWndExtra = 0;
+ wndclass.hIcon = NULL;
+ wndclass.hInstance = state.hinst;
+ wndclass.hCursor = NULL;
+ wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
+ wndclass.lpszMenuName = NULL;
+ wndclass.lpszClassName = "MyClass";
+ if (!RegisterClass(&wndclass)) {
+ lprintf(0, "RegisterClass error, %d\n", GetLastError());
+ goto errregcls;
+ }
+ state.hwnd = CreateWindowEx(WS_EX_APPWINDOW, "MyClass", "eppfpga", WS_DISABLED | WS_POPUP,
+ 0, 0, 0, 0, NULL, NULL, state.hinst, NULL);
+ if (!state.hwnd) {
+ lprintf(0, "CreateWindowEx error, %d\n", GetLastError());
+ goto errwnd;
+ }
+#else
+ state.hwnd = GetDesktopWindow();
+#endif
+ if (FAILED(res = DirectSoundCreate(NULL, &state.dsplay, NULL))) {
+ lprintf(0, "DirectSoundCreate error %lu\n", res);
+ goto errdscreate;
+ }
+ if (FAILED(res = IDirectSound_SetCooperativeLevel(state.dsplay, state.hwnd, DSSCL_NORMAL))) {
+ lprintf(0, "SetCooperativeLevel error %lu\n", res);
+ goto errdsb;
+ }
+ memset(&waveformat, 0, sizeof(waveformat));
+ waveformat.wFormatTag = WAVE_FORMAT_PCM;
+ waveformat.wBitsPerSample = 16;
+ waveformat.nChannels = 1;
+ waveformat.nSamplesPerSec = cfg.bitrate;
+ waveformat.nBlockAlign = waveformat.nChannels * waveformat.wBitsPerSample / 8;
+ waveformat.nAvgBytesPerSec = waveformat.nSamplesPerSec * waveformat.nBlockAlign;
+ memset(&bdesc, 0, sizeof(bdesc));
+ bdesc.dwSize = sizeof(bdesc);
+ bdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS | DSBCAPS_CTRLPAN;
+ state.playbufsz = bdesc.dwBufferBytes = waveformat.nAvgBytesPerSec;
+ bdesc.lpwfxFormat = &waveformat;
+ if (FAILED(res = IDirectSound_CreateSoundBuffer(state.dsplay, &bdesc, &state.playbuf, NULL))) {
+ lprintf(0, "CreateSoundBuffer error %lu\n", res);
+ goto errdsb;
+ }
+ if (FAILED(res = IDirectSoundBuffer_GetFormat(state.playbuf, &waveformat, sizeof(waveformat), NULL))) {
+ lprintf(0, "GetFormat error %lu\n", res);
+ goto errsnd;
+ }
+ srate = waveformat.nSamplesPerSec;
+ lprintf(2, "epp adapter sampling rate %u, soundcard sampling rate %u\n", cfg.bitrate, srate);
+ if (abs(cfg.bitrate - srate) > cfg.bitrate / 2) {
+ lprintf(0, "sampling rates (%u,%u) too different\n", cfg.bitrate, srate);
+ goto errsnd;
+ }
+ audio_initoutput(cfg.bitrate, srate);
+ lprintf(0, "Audio Output to Linux Soundcard\n");
+ /* reset the EPP adapter */
+ buf[0] = 7;
+ buf[1] = state.ctrlreg;
+ if (parport_epp_write_addr(buf, 2) != 2)
+ goto errret;
+ /* prefill to nominal queue size and start soundcard */
+ if (FAILED(res = IDirectSoundBuffer_Lock(state.playbuf, 0, 2*SNDLATENCY, (LPVOID)&sptr, &lockbytes, NULL, NULL, 0))) {
+ lprintf(0, "IDirectSoundBuffer_Lock error %lu\n", res);
+ goto errsnd;
+ }
+ memset(sptr, 0, 2*SNDLATENCY);
+ if (FAILED(res = IDirectSoundBuffer_Unlock(state.playbuf, sptr, lockbytes, NULL, 0))) {
+ lprintf(0, "IDirectSoundBuffer_Unlock error %lu\n", res);
+ goto errsnd;
+ }
+ state.playptr = 2*SNDLATENCY;
+ if (FAILED(res = IDirectSoundBuffer_Play(state.playbuf, 0, 0, DSBPLAY_LOOPING))) {
+ lprintf(0, "IDirectSoundBuffer_Play error %lu\n", res);
+ goto errsnd;
+ }
+ state.tmotag = gtk_timeout_add(100, periodic_play, NULL);
+ state.state = st_play;
+ return;
+
+ errdsb:
+ IDirectSound_Release(state.dsplay);
+ errdscreate:
+#if 0
+ DestroyWindow(state.hwnd);
+ errwnd:
+ UnregisterClass("MyClass", state.hinst);
+#endif
+ errregcls:
+ buf[0] = 7;
+ if (parport_epp_write_addr(buf, 1) != 1) {
+ state.state = st_mdmerr;
+ reset_modem();
+ } else
+ state.state = st_off;
+ return;
+
+ errsnd:
+ buf[0] = 7;
+ if (parport_epp_write_addr(buf, 1) != 1)
+ goto errret;
+ state.state = st_off;
+ goto errclose;
+
+ errret:
+ lprintf(0, "EPP timeout\n");
+ state.state = st_mdmerr;
+ reset_modem();
+ errclose:
+ IDirectSoundBuffer_Stop(state.playbuf);
+ IDirectSoundBuffer_Release(state.playbuf);
+ IDirectSound_Release(state.dsplay);
+#if 0
+ DestroyWindow(state.hwnd);
+ UnregisterClass("MyClass", state.hinst);
+#endif
+ state.hwnd = NULL;
+}
+
+static void recstart(void)
+{
+ WNDCLASS wndclass;
+ HRESULT res;
+ WAVEFORMATEX waveformat;
+ DSCBUFFERDESC cbdesc;
+ unsigned char buf[SNDLATENCY];
+ unsigned srate;
+ int i;
+
+ if (state.state == st_play)
+ playstop();
+ if (state.state == st_rec)
+ recstop();
+ state.ctrlreg = 0x20;
+ state.ledcnt = 0;
+ memset(state.sample, 0, sizeof(state.sample));
+ /* start modem if mdmerr */
+ if (state.state == st_mdmerr) {
+ cfg.bitrate = SAMPLINGRATE;
+ if ((i = adapter_start_eppsamp(&cfg))) {
+ lprintf(0, "Cannot initialize the modem\n");
+ return;
+ }
+ }
+ state.state = st_off;
+ state.dsrec = NULL;
+ state.recbuf = NULL;
+ state.recptr = 0;
+#if 0
+ wndclass.style = CS_HREDRAW | CS_VREDRAW;
+ wndclass.lpfnWndProc = (WNDPROC)MyWndProc;
+ wndclass.cbClsExtra = 0;
+ wndclass.cbWndExtra = 0;
+ wndclass.hIcon = NULL;
+ wndclass.hInstance = state.hinst;
+ wndclass.hCursor = NULL;
+ wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
+ wndclass.lpszMenuName = NULL;
+ wndclass.lpszClassName = "MyClass";
+ if (!RegisterClass(&wndclass)) {
+ lprintf(0, "RegisterClass error, %d\n", GetLastError());
+ goto errregcls;
+ }
+ state.hwnd = CreateWindowEx(WS_EX_APPWINDOW, "MyClass", "eppfpga", WS_DISABLED | WS_POPUP,
+ 0, 0, 0, 0, NULL, NULL, state.hinst, NULL);
+ if (!state.hwnd) {
+ lprintf(0, "CreateWindowEx error, %d\n", GetLastError());
+ goto errwnd;
+ }
+#else
+ state.hwnd = GetDesktopWindow();
+#endif
+ if (FAILED(res = DirectSoundCaptureCreate(NULL, &state.dsrec, NULL))) {
+ lprintf(0, "DirectSoundCaptureCreate error %lu\n", res);
+ goto errdscreate;
+ }
+ memset(&waveformat, 0, sizeof(waveformat));
+ waveformat.wFormatTag = WAVE_FORMAT_PCM;
+ waveformat.wBitsPerSample = 16;
+ waveformat.nChannels = 1;
+ waveformat.nSamplesPerSec = cfg.bitrate;
+ waveformat.nBlockAlign = waveformat.nChannels * waveformat.wBitsPerSample / 8;
+ waveformat.nAvgBytesPerSec = waveformat.nSamplesPerSec * waveformat.nBlockAlign;
+ memset(&cbdesc, 0, sizeof(cbdesc));
+ cbdesc.dwSize = sizeof(cbdesc);
+ cbdesc.dwFlags = /* DSCBCAPS_WAVEMAPPED */ 0;
+ state.recbufsz = cbdesc.dwBufferBytes = waveformat.nAvgBytesPerSec;
+ cbdesc.lpwfxFormat = &waveformat;
+ if (FAILED(res = IDirectSoundCapture_CreateCaptureBuffer(state.dsrec, &cbdesc, &state.recbuf, NULL))) {
+ lprintf(0, "CreateSoundCaptureBuffer error %lu\n", res);
+ goto errdsb;
+ }
+ /* kludge */ srate = cfg.bitrate;
+ if (FAILED(res = IDirectSoundCaptureBuffer_GetFormat(state.recbuf, &waveformat, sizeof(waveformat), NULL))) {
+ lprintf(0, "GetFormat error %lu\n", res);
+ goto errsnd;
+ }
+ srate = waveformat.nSamplesPerSec;
+ lprintf(2, "epp adapter sampling rate %u, soundcard sampling rate %u\n", cfg.bitrate, srate);
+ if (abs(cfg.bitrate - srate) > cfg.bitrate / 2) {
+ lprintf(0, "sampling rates (%u,%u) too different\n", cfg.bitrate, srate);
+ goto errsnd;
+ }
+ audio_initinput(cfg.bitrate, srate);
+ lprintf(0, "Audio Input from Linux Soundcard\n");
+ /* reset the EPP adapter */
+ buf[0] = 7;
+ buf[1] = state.ctrlreg;
+ if (parport_epp_write_addr(buf, 2) != 2)
+ goto errret;
+ /* prefill EPP adapter and start soundcard */
+ memset(buf, 0, sizeof(buf));
+ if (parport_epp_write_data(buf, SNDLATENCY) != SNDLATENCY)
+ goto errret;
+ if (FAILED(res = IDirectSoundCaptureBuffer_Start(state.recbuf, DSCBSTART_LOOPING))) {
+ lprintf(0, "IDirectSoundCaptureBuffer_Start error %lu\n", res);
+ goto errsnd;
+ }
+ state.tmotag = gtk_timeout_add(100, periodic_rec, NULL);
+ state.state = st_rec;
+ return;
+
+ errdsb:
+ IDirectSoundCapture_Release(state.dsrec);
+ errdscreate:
+#if 0
+ DestroyWindow(state.hwnd);
+ errwnd:
+ UnregisterClass("MyClass", state.hinst);
+ errregcls:
+#endif
+ buf[0] = 7;
+ if (parport_epp_write_addr(buf, 1) != 1) {
+ state.state = st_mdmerr;
+ reset_modem();
+ } else
+ state.state = st_off;
+ return;
+
+ errsnd:
+ buf[0] = 7;
+ if (parport_epp_write_addr(buf, 1) != 1)
+ goto errret;
+ state.state = st_off;
+ goto errclose;
+
+ errret:
+ lprintf(0, "EPP timeout\n");
+ state.state = st_mdmerr;
+ reset_modem();
+ errclose:
+ IDirectSoundCaptureBuffer_Stop(state.recbuf);
+ IDirectSoundCaptureBuffer_Release(state.recbuf);
+ IDirectSoundCapture_Release(state.dsrec);
+#if 0
+ DestroyWindow(state.hwnd);
+ UnregisterClass("MyClass", state.hinst);
+#endif
+ state.hwnd = NULL;
+}
+
+/* ---------------------------------------------------------------------- */
+
+void audio_ptt(int ptt)
+{
+ if (ptt && state.state != st_rec)
+ recstart();
+ else if (!ptt && state.state != st_play)
+ playstart();
+}
+
+int audio_drvinit(const char *config)
+{
+ state.dsplay = NULL;
+ state.dsrec = NULL;
+ state.playbuf = NULL;
+ state.recbuf = NULL;
+ state.hwnd = NULL;
+ state.hinst = GetModuleHandleA(0);
+ state.playptr = 0;
+ state.recptr = 0;
+ lprintf(1, "DirectSound drivers\n");
+ DirectSoundEnumerateA(DSEnumProc, NULL);
+ lprintf(1, "DirectSoundCapture drivers\n");
+ DirectSoundCaptureEnumerateA(DSEnumProc, NULL);
+ return 0;
+}
+
+/* ---------------------------------------------------------------------- */
+#endif /* HAVE_DIRECTX */
diff --git a/eppfm2/src/callbacks.h b/eppfm2/src/callbacks.h
new file mode 100644
index 0000000..26f25bc
--- /dev/null
+++ b/eppfm2/src/callbacks.h
@@ -0,0 +1,158 @@
+#include <gtk/gtk.h>
+
+
+void
+on_file_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+void
+on_dtmf_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+void
+on_oscilloscope_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+void
+on_spectrum_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+void
+on_quit_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+void
+on_about_activate (GtkMenuItem *menuitem,
+ gpointer user_data);
+
+gboolean
+on_dtmfwindow_key_press_event (GtkWidget *widget,
+ GdkEventKey *event,
+ gpointer user_data);
+
+gboolean
+on_dtmfwindow_key_release_event (GtkWidget *widget,
+ GdkEventKey *event,
+ gpointer user_data);
+
+void
+on_dtmf_key (GtkButton *button,
+ gpointer user_data);
+
+GtkWidget*
+eppfm_scope_new (gchar *widget_name, gchar *string1, gchar *string2,
+ gint int1, gint int2);
+
+GtkWidget*
+eppfm_spectrum_new (gchar *widget_name, gchar *string1, gchar *string2,
+ gint int1, gint int2);
+
+void
+on_configok_clicked (GtkButton *button,
+ gpointer user_data);
+
+void
+on_configquit_clicked (GtkButton *button,
+ gpointer user_data);
+
+gboolean
+on_mainwindow_delete_event (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data);
+
+void
+on_mainwindow_destroy (GtkObject *object,
+ gpointer user_data);
+
+void
+on_mainptt_toggled (GtkToggleButton *togglebutton,
+ gpointer user_data);
+
+void
+on_maindtmf_clicked (GtkButton *button,
+ gpointer user_data);
+
+void
+on_mainscope_clicked (GtkButton *button,
+ gpointer user_data);
+
+void
+on_mainspectrum_clicked (GtkButton *button,
+ gpointer user_data);
+
+gboolean
+on_mainwindow_key_press_event (GtkWidget *widget,
+ GdkEventKey *event,
+ gpointer user_data);
+
+gboolean
+on_mainwindow_key_release_event (GtkWidget *widget,
+ GdkEventKey *event,
+ gpointer user_data);
+
+gboolean
+on_aboutdialog_delete_event (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data);
+
+gboolean
+on_dtmfwindow_delete_event (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data);
+
+gboolean
+on_scopewindow_delete_event (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data);
+
+gboolean
+on_spectrumwindow_delete_event (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data);
+
+void
+on_aboutok_clicked (GtkButton *button,
+ gpointer user_data);
+
+GtkWidget*
+scope_new (gchar *widget_name, gchar *string1, gchar *string2,
+ gint int1, gint int2);
+
+GtkWidget*
+spectrum_new (gchar *widget_name, gchar *string1, gchar *string2,
+ gint int1, gint int2);
+
+void
+on_dtmfclear_clicked (GtkButton *button,
+ gpointer user_data);
+
+gboolean
+on_mainwindow_key_event (GtkWidget *widget,
+ GdkEventKey *event,
+ gpointer user_data);
+
+gboolean
+on_dtmfwindow_key_event (GtkWidget *widget,
+ GdkEventKey *event,
+ gpointer user_data);
+
+gboolean
+on_mainwindow_key_event (GtkWidget *widget,
+ GdkEventKey *event,
+ gpointer user_data);
+
+void
+on_button1750_clicked (GtkButton *button,
+ gpointer user_data);
+
+void
+on_buttonsquelch_clicked (GtkButton *button,
+ gpointer user_data);
+
+void
+on_button1750_pressed (GtkButton *button,
+ gpointer user_data);
+
+void
+on_button1750_released (GtkButton *button,
+ gpointer user_data);
diff --git a/eppfm2/src/coeff.m b/eppfm2/src/coeff.m
new file mode 100644
index 0000000..5e93661
--- /dev/null
+++ b/eppfm2/src/coeff.m
@@ -0,0 +1,30 @@
+%
+fs=16000;
+overs=16;
+fg1=3500;
+fg2=4500;
+flen=16;
+
+%c=remez(overs*flen-1,[ 0 2*fg1/fs/overs 2*fg2/fs/overs 1 ], [ 1 1 0 0 ]);
+c=sinc((0.5-overs*flen/2:overs*flen/2-0.5)*(2*fg2/fs/overs)).*hamming(overs*flen)';
+
+for t=1:overs,
+ tt(t) = sum(abs(c(t:16:overs*flen)));
+end;
+
+c=c./max(tt);
+
+t1=fft(c);
+plot((0:overs*flen-1)*fs/flen,20*log10(abs(t1)));
+
+fid=fopen('filter.txt','w');
+fprintf(fid,'static const int16_t rxfilter[%d][%d] = {\n',overs,flen);
+for t=1:overs,
+ fprintf(fid,'\t{ ');
+ for tt=0:flen-1,
+ fprintf(fid, '%6d, ', round(c(tt*overs+t) * 65536));
+ end;
+ fprintf(fid,'},\n');
+end;
+fprintf(fid,'};');
+fclose(fid);
diff --git a/eppfm2/src/costab.c b/eppfm2/src/costab.c
new file mode 100644
index 0000000..8ad2ae1
--- /dev/null
+++ b/eppfm2/src/costab.c
@@ -0,0 +1,74 @@
+#include <sys/types.h>
+#include "eppfm.h"
+
+/*
+ * cosine table
+ */
+
+const int16_t costab[512] = {
+ 32767, 32764, 32757, 32744, 32727, 32705, 32678, 32646,
+ 32609, 32567, 32520, 32468, 32412, 32350, 32284, 32213,
+ 32137, 32056, 31970, 31880, 31785, 31684, 31580, 31470,
+ 31356, 31236, 31113, 30984, 30851, 30713, 30571, 30424,
+ 30272, 30116, 29955, 29790, 29621, 29446, 29268, 29085,
+ 28897, 28706, 28510, 28309, 28105, 27896, 27683, 27466,
+ 27244, 27019, 26789, 26556, 26318, 26077, 25831, 25582,
+ 25329, 25072, 24811, 24546, 24278, 24006, 23731, 23452,
+ 23169, 22883, 22594, 22301, 22004, 21705, 21402, 21096,
+ 20787, 20474, 20159, 19840, 19519, 19194, 18867, 18537,
+ 18204, 17868, 17530, 17189, 16845, 16499, 16150, 15799,
+ 15446, 15090, 14732, 14372, 14009, 13645, 13278, 12909,
+ 12539, 12166, 11792, 11416, 11038, 10659, 10278, 9895,
+ 9511, 9126, 8739, 8351, 7961, 7571, 7179, 6786,
+ 6392, 5997, 5601, 5205, 4807, 4409, 4011, 3611,
+ 3211, 2811, 2410, 2009, 1607, 1206, 804, 402,
+ 0, -402, -804, -1206, -1607, -2009, -2410, -2811,
+ -3211, -3611, -4011, -4409, -4807, -5205, -5601, -5997,
+ -6392, -6786, -7179, -7571, -7961, -8351, -8739, -9126,
+ -9511, -9895, -10278, -10659, -11038, -11416, -11792, -12166,
+ -12539, -12909, -13278, -13645, -14009, -14372, -14732, -15090,
+ -15446, -15799, -16150, -16499, -16845, -17189, -17530, -17868,
+ -18204, -18537, -18867, -19194, -19519, -19840, -20159, -20474,
+ -20787, -21096, -21402, -21705, -22004, -22301, -22594, -22883,
+ -23169, -23452, -23731, -24006, -24278, -24546, -24811, -25072,
+ -25329, -25582, -25831, -26077, -26318, -26556, -26789, -27019,
+ -27244, -27466, -27683, -27896, -28105, -28309, -28510, -28706,
+ -28897, -29085, -29268, -29446, -29621, -29790, -29955, -30116,
+ -30272, -30424, -30571, -30713, -30851, -30984, -31113, -31236,
+ -31356, -31470, -31580, -31684, -31785, -31880, -31970, -32056,
+ -32137, -32213, -32284, -32350, -32412, -32468, -32520, -32567,
+ -32609, -32646, -32678, -32705, -32727, -32744, -32757, -32764,
+ -32767, -32764, -32757, -32744, -32727, -32705, -32678, -32646,
+ -32609, -32567, -32520, -32468, -32412, -32350, -32284, -32213,
+ -32137, -32056, -31970, -31880, -31785, -31684, -31580, -31470,
+ -31356, -31236, -31113, -30984, -30851, -30713, -30571, -30424,
+ -30272, -30116, -29955, -29790, -29621, -29446, -29268, -29085,
+ -28897, -28706, -28510, -28309, -28105, -27896, -27683, -27466,
+ -27244, -27019, -26789, -26556, -26318, -26077, -25831, -25582,
+ -25329, -25072, -24811, -24546, -24278, -24006, -23731, -23452,
+ -23169, -22883, -22594, -22301, -22004, -21705, -21402, -21096,
+ -20787, -20474, -20159, -19840, -19519, -19194, -18867, -18537,
+ -18204, -17868, -17530, -17189, -16845, -16499, -16150, -15799,
+ -15446, -15090, -14732, -14372, -14009, -13645, -13278, -12909,
+ -12539, -12166, -11792, -11416, -11038, -10659, -10278, -9895,
+ -9511, -9126, -8739, -8351, -7961, -7571, -7179, -6786,
+ -6392, -5997, -5601, -5205, -4807, -4409, -4011, -3611,
+ -3211, -2811, -2410, -2009, -1607, -1206, -804, -402,
+ 0, 402, 804, 1206, 1607, 2009, 2410, 2811,
+ 3211, 3611, 4011, 4409, 4807, 5205, 5601, 5997,
+ 6392, 6786, 7179, 7571, 7961, 8351, 8739, 9126,
+ 9511, 9895, 10278, 10659, 11038, 11416, 11792, 12166,
+ 12539, 12909, 13278, 13645, 14009, 14372, 14732, 15090,
+ 15446, 15799, 16150, 16499, 16845, 17189, 17530, 17868,
+ 18204, 18537, 18867, 19194, 19519, 19840, 20159, 20474,
+ 20787, 21096, 21402, 21705, 22004, 22301, 22594, 22883,
+ 23169, 23452, 23731, 24006, 24278, 24546, 24811, 25072,
+ 25329, 25582, 25831, 26077, 26318, 26556, 26789, 27019,
+ 27244, 27466, 27683, 27896, 28105, 28309, 28510, 28706,
+ 28897, 29085, 29268, 29446, 29621, 29790, 29955, 30116,
+ 30272, 30424, 30571, 30713, 30851, 30984, 31113, 31236,
+ 31356, 31470, 31580, 31684, 31785, 31880, 31970, 32056,
+ 32137, 32213, 32284, 32350, 32412, 32468, 32520, 32567,
+ 32609, 32646, 32678, 32705, 32727, 32744, 32757, 32764
+};
+
diff --git a/eppfm2/src/eppfm.h b/eppfm2/src/eppfm.h
new file mode 100644
index 0000000..182cc01
--- /dev/null
+++ b/eppfm2/src/eppfm.h
@@ -0,0 +1,80 @@
+/*****************************************************************************/
+
+/*
+ * eppfm.h -- Function prototypes for "virtual transceiver".
+ *
+ * Copyright (C) 1999 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifndef _EPPFM_H
+#define _EPPFM_H
+
+/* ---------------------------------------------------------------------- */
+
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+extern const int16_t costab[512];
+#define COS(x) costab[((x)>>7)&0x1ff]
+#define SIN(x) COS((x)+0xc000)
+
+/* ---------------------------------------------------------------------- */
+
+extern struct adapter_config cfg;
+
+#define SAMPLINGRATE 16000
+#define SNDLATENCY 4000 /* approx 1/4 seconds */
+#define PHASEFRAC 12
+#define PHASEMASK ((1<<PHASEFRAC)-1)
+
+/* ---------------------------------------------------------------------- */
+
+extern void gui_addsamples(unsigned int num, const int16_t *y);
+extern void gui_updatevu(float meter1, float meter2);
+
+extern void *audio_createdialog(void);
+extern int audio_dialogok(void *dlg);
+
+extern void audio_initinput(unsigned int srateepp, unsigned int sratedsp);
+extern void audio_initoutput(unsigned int srateepp, unsigned int sratedsp);
+extern unsigned int audio_convertinput(unsigned int num, const int16_t *ibuf, signed char *obuf);
+extern int audio_adjustinput(int eppcnt, int dspcnt, int eppdelay);
+extern unsigned int audio_convertoutput(unsigned int num, const signed char *ibuf, int16_t *obuf);
+extern int audio_adjustoutput(int dspcnt, int eppcnt, int dspdelay);
+
+extern int audio_drvinit(const char *config);
+extern void audio_ptt(int ptt);
+
+/* ---------------------------------------------------------------------- */
+
+extern void audio_1750(int on);
+extern void audio_dtmf(int ch);
+extern void audio_setsquelch(int sq);
+extern int audio_getsquelch(void);
+
+/* ---------------------------------------------------------------------- */
+#endif /* _EPPFM_H */
+
+
diff --git a/eppfm2/src/gentbl.c b/eppfm2/src/gentbl.c
new file mode 100644
index 0000000..af75b98
--- /dev/null
+++ b/eppfm2/src/gentbl.c
@@ -0,0 +1,72 @@
+/*****************************************************************************/
+
+/*
+ * gentbl.c -- Soundmodem table generator.
+ *
+ * Copyright (C) 1996-1999 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+
+/* -------------------------------------------------------------------- */
+
+static const char *progname;
+
+/* -------------------------------------------------------------------- */
+
+static void gen_costab(unsigned size, const char *fn)
+{
+ FILE *f;
+ int i;
+
+ if (!(f = fopen(fn, "w"))) {
+ fprintf(stderr, "cannot open file costab.c\n");
+ exit(1);
+ }
+ fprintf(f, "#include <sys/types.h>\n#include \"eppfm.h\"\n\n/*\n * cosine table\n */\n\n"
+ "const int16_t costab[%d] = {", size);
+ for (i = 0; i < size; i++) {
+ if (!(i & 7))
+ fprintf(f, "\n\t");
+ fprintf(f, "%6d", (int)(32767.0*cos(i*(2.0*M_PI)/size)));
+ if (i != (size-1))
+ fprintf(f, ", ");
+ }
+ fprintf(f, "\n};\n\n");
+}
+
+/* -------------------------------------------------------------------- */
+
+int main(int argc, char *argv[])
+{
+ progname = argv[0];
+ if (argc < 2) {
+ fprintf(stderr, "usage: gentbl <filename>\n");
+ exit(1);
+ }
+ gen_costab(512, argv[1]);
+ exit(0);
+}
+
+/* -------------------------------------------------------------------- */
diff --git a/eppfm2/src/getopt.h b/eppfm2/src/getopt.h
new file mode 100644
index 0000000..45541f5
--- /dev/null
+++ b/eppfm2/src/getopt.h
@@ -0,0 +1,129 @@
+/* Declarations for getopt.
+ Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#ifndef _GETOPT_H
+#define _GETOPT_H 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* For communication from `getopt' to the caller.
+ When `getopt' finds an option that takes an argument,
+ the argument value is returned here.
+ Also, when `ordering' is RETURN_IN_ORDER,
+ each non-option ARGV-element is returned here. */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+ This is used for communication to and from the caller
+ and for communication between successive calls to `getopt'.
+
+ On entry to `getopt', zero means this is the first call; initialize.
+
+ When `getopt' returns EOF, this is the index of the first of the
+ non-option elements that the caller should itself scan.
+
+ Otherwise, `optind' communicates from one call to the next
+ how much of ARGV has been scanned so far. */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+ for unrecognized options. */
+
+extern int opterr;
+
+/* Set to an option character which was unrecognized. */
+
+extern int optopt;
+
+/* Describe the long-named options requested by the application.
+ The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+ of `struct option' terminated by an element containing a name which is
+ zero.
+
+ The field `has_arg' is:
+ no_argument (or 0) if the option does not take an argument,
+ required_argument (or 1) if the option requires an argument,
+ optional_argument (or 2) if the option takes an optional argument.
+
+ If the field `flag' is not NULL, it points to a variable that is set
+ to the value given in the field `val' when the option is found, but
+ left unchanged if the option is not found.
+
+ To have a long-named option do something other than set an `int' to
+ a compiled-in constant, such as set a value from `optarg', set the
+ option's `flag' field to zero and its `val' field to a nonzero
+ value (the equivalent single-letter option character, if there is
+ one). For long options that have a zero `flag' field, `getopt'
+ returns the contents of the `val' field. */
+
+struct option
+{
+#if __STDC__
+ const char *name;
+#else
+ char *name;
+#endif
+ /* has_arg can't be an enum because some compilers complain about
+ type mismatches in all the code that assumes it is an int. */
+ int has_arg;
+ int *flag;
+ int val;
+};
+
+/* Names for the values of the `has_arg' field of `struct option'. */
+
+#define no_argument 0
+#define required_argument 1
+#define optional_argument 2
+
+#if __STDC__
+#if defined(__GNU_LIBRARY__)
+/* Many other libraries have conflicting prototypes for getopt, with
+ differences in the consts, in stdlib.h. To avoid compilation
+ errors, only prototype getopt for the GNU C library. */
+extern int getopt (int argc, char *const *argv, const char *shortopts);
+#else /* not __GNU_LIBRARY__ */
+extern int getopt ();
+#endif /* not __GNU_LIBRARY__ */
+extern int getopt_long (int argc, char *const *argv, const char *shortopts,
+ const struct option *longopts, int *longind);
+extern int getopt_long_only (int argc, char *const *argv,
+ const char *shortopts,
+ const struct option *longopts, int *longind);
+
+/* Internal only. Users should not call this directly. */
+extern int _getopt_internal (int argc, char *const *argv,
+ const char *shortopts,
+ const struct option *longopts, int *longind,
+ int long_only);
+#else /* not __STDC__ */
+extern int getopt ();
+extern int getopt_long ();
+extern int getopt_long_only ();
+
+extern int _getopt_internal ();
+#endif /* not __STDC__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GETOPT_H */
diff --git a/eppfm2/src/interface.c b/eppfm2/src/interface.c
new file mode 100644
index 0000000..c79e019
--- /dev/null
+++ b/eppfm2/src/interface.c
@@ -0,0 +1,1194 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+
+#include "callbacks.h"
+#include "interface.h"
+#include "support.h"
+
+GtkWidget*
+create_ioconfiglinux ()
+{
+ GtkWidget *ioconfiglinux;
+ GtkWidget *vbox1;
+ GtkWidget *frame3;
+ GtkWidget *table3;
+ GtkWidget *sndrecord;
+ GList *sndrecord_items = NULL;
+ GtkWidget *sndplayback;
+ GList *sndplayback_items = NULL;
+ GtkWidget *label5;
+ GtkWidget *label6;
+ GtkWidget *frame1;
+ GtkWidget *table2;
+ GtkWidget *ioaddr;
+ GList *ioaddr_items = NULL;
+ GtkWidget *devfile;
+ GList *devfile_items = NULL;
+ GtkWidget *label2;
+ GtkWidget *label3;
+ GtkWidget *label1;
+ GSList *drivergroup_group = NULL;
+ GtkWidget *drvdirect;
+ GtkWidget *drvppdev;
+ GtkWidget *frame2;
+ GtkWidget *table1;
+ GtkWidget *fpgaclk;
+ GList *fpgaclk_items = NULL;
+ GtkWidget *label4;
+ GtkWidget *hbuttonbox1;
+ GtkWidget *buttonok;
+ GtkWidget *buttonquit;
+ GtkTooltips *tooltips;
+
+ tooltips = gtk_tooltips_new ();
+
+ ioconfiglinux = gtk_window_new (GTK_WINDOW_DIALOG);
+ gtk_widget_set_name (ioconfiglinux, "ioconfiglinux");
+ gtk_widget_ref (ioconfiglinux);
+ gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "ioconfiglinux", ioconfiglinux,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_window_set_title (GTK_WINDOW (ioconfiglinux), _("EPPFM Input/Output Configuration"));
+
+ vbox1 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_set_name (vbox1, "vbox1");
+ gtk_widget_ref (vbox1);
+ gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "vbox1", vbox1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (vbox1);
+ gtk_container_add (GTK_CONTAINER (ioconfiglinux), vbox1);
+
+ frame3 = gtk_frame_new (_("Soundcard Settings"));
+ gtk_widget_set_name (frame3, "frame3");
+ gtk_widget_ref (frame3);
+ gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "frame3", frame3,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (frame3);
+ gtk_box_pack_start (GTK_BOX (vbox1), frame3, TRUE, TRUE, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (frame3), 5);
+
+ table3 = gtk_table_new (2, 2, FALSE);
+ gtk_widget_set_name (table3, "table3");
+ gtk_widget_ref (table3);
+ gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "table3", table3,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (table3);
+ gtk_container_add (GTK_CONTAINER (frame3), table3);
+
+ sndrecord = gtk_combo_new ();
+ gtk_widget_set_name (sndrecord, "sndrecord");
+ gtk_widget_ref (sndrecord);
+ gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "sndrecord", sndrecord,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (sndrecord);
+ gtk_table_attach (GTK_TABLE (table3), sndrecord, 1, 2, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (sndrecord), 3);
+ gtk_combo_set_case_sensitive (GTK_COMBO (sndrecord), TRUE);
+ sndrecord_items = g_list_append (sndrecord_items, _("/dev/dsp"));
+ sndrecord_items = g_list_append (sndrecord_items, _("/dev/dsp1"));
+ gtk_combo_set_popdown_strings (GTK_COMBO (sndrecord), sndrecord_items);
+ g_list_free (sndrecord_items);
+
+ sndplayback = gtk_combo_new ();
+ gtk_widget_set_name (sndplayback, "sndplayback");
+ gtk_widget_ref (sndplayback);
+ gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "sndplayback", sndplayback,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (sndplayback);
+ gtk_table_attach (GTK_TABLE (table3), sndplayback, 1, 2, 1, 2,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (sndplayback), 3);
+ gtk_combo_set_case_sensitive (GTK_COMBO (sndplayback), TRUE);
+ sndplayback_items = g_list_append (sndplayback_items, _("/dev/dsp"));
+ sndplayback_items = g_list_append (sndplayback_items, _("/dev/dsp1"));
+ gtk_combo_set_popdown_strings (GTK_COMBO (sndplayback), sndplayback_items);
+ g_list_free (sndplayback_items);
+
+ label5 = gtk_label_new (_("Soundcard for Recording"));
+ gtk_widget_set_name (label5, "label5");
+ gtk_widget_ref (label5);
+ gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "label5", label5,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (label5);
+ gtk_table_attach (GTK_TABLE (table3), label5, 0, 1, 0, 1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_label_set_justify (GTK_LABEL (label5), GTK_JUSTIFY_LEFT);
+ gtk_misc_set_alignment (GTK_MISC (label5), 0, 0.5);
+ gtk_misc_set_padding (GTK_MISC (label5), 10, 0);
+
+ label6 = gtk_label_new (_("Soundcard for Playback"));
+ gtk_widget_set_name (label6, "label6");
+ gtk_widget_ref (label6);
+ gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "label6", label6,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (label6);
+ gtk_table_attach (GTK_TABLE (table3), label6, 0, 1, 1, 2,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (0), 0, 0);
+ gtk_label_set_justify (GTK_LABEL (label6), GTK_JUSTIFY_LEFT);
+ gtk_misc_set_alignment (GTK_MISC (label6), 0, 0.5);
+ gtk_misc_set_padding (GTK_MISC (label6), 10, 0);
+
+ frame1 = gtk_frame_new (_("Parallel Port Driver Settings"));
+ gtk_widget_set_name (frame1, "frame1");
+ gtk_widget_ref (frame1);
+ gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "frame1", frame1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (frame1);
+ gtk_box_pack_start (GTK_BOX (vbox1), frame1, TRUE, TRUE, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (frame1), 5);
+
+ table2 = gtk_table_new (2, 4, FALSE);
+ gtk_widget_set_name (table2, "table2");
+ gtk_widget_ref (table2);
+ gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "table2", table2,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (table2);
+ gtk_container_add (GTK_CONTAINER (frame1), table2);
+
+ ioaddr = gtk_combo_new ();
+ gtk_widget_set_name (ioaddr, "ioaddr");
+ gtk_widget_ref (ioaddr);
+ gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "ioaddr", ioaddr,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (ioaddr);
+ gtk_table_attach (GTK_TABLE (table2), ioaddr, 3, 4, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND), 0, 0);
+ gtk_widget_set_usize (GTK_COMBO (ioaddr)->entry, 104, -2);
+ gtk_widget_set_usize (ioaddr, 120, -2);
+ gtk_container_set_border_width (GTK_CONTAINER (ioaddr), 3);
+ ioaddr_items = g_list_append (ioaddr_items, _("0x378"));
+ ioaddr_items = g_list_append (ioaddr_items, _("0x278"));
+ gtk_combo_set_popdown_strings (GTK_COMBO (ioaddr), ioaddr_items);
+ g_list_free (ioaddr_items);
+
+ devfile = gtk_combo_new ();
+ gtk_widget_set_name (devfile, "devfile");
+ gtk_widget_ref (devfile);
+ gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "devfile", devfile,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (devfile);
+ gtk_table_attach (GTK_TABLE (table2), devfile, 3, 4, 1, 2,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND), 0, 0);
+ gtk_widget_set_usize (GTK_COMBO (devfile)->entry, 104, -2);
+ gtk_widget_set_usize (devfile, 120, -2);
+ gtk_container_set_border_width (GTK_CONTAINER (devfile), 3);
+ gtk_combo_set_case_sensitive (GTK_COMBO (devfile), TRUE);
+ devfile_items = g_list_append (devfile_items, _("/dev/ppuser0"));
+ devfile_items = g_list_append (devfile_items, _("/dev/ppuser1"));
+ gtk_combo_set_popdown_strings (GTK_COMBO (devfile), devfile_items);
+ g_list_free (devfile_items);
+
+ label2 = gtk_label_new (_("IO Address"));
+ gtk_widget_set_name (label2, "label2");
+ gtk_widget_ref (label2);
+ gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "label2", label2,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (label2);
+ gtk_table_attach (GTK_TABLE (table2), label2, 2, 3, 0, 1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label2), 0, 0.5);
+ gtk_misc_set_padding (GTK_MISC (label2), 4, 0);
+
+ label3 = gtk_label_new (_("File"));
+ gtk_widget_set_name (label3, "label3");
+ gtk_widget_ref (label3);
+ gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "label3", label3,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (label3);
+ gtk_table_attach (GTK_TABLE (table2), label3, 2, 3, 1, 2,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND), 0, 0);
+ gtk_misc_set_alignment (GTK_MISC (label3), 0, 0.5);
+ gtk_misc_set_padding (GTK_MISC (label3), 4, 0);
+
+ label1 = gtk_label_new (_("Driver Selection"));
+ gtk_widget_set_name (label1, "label1");
+ gtk_widget_ref (label1);
+ gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "label1", label1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (label1);
+ gtk_table_attach (GTK_TABLE (table2), label1, 0, 1, 0, 1,
+ (GtkAttachOptions) (0),
+ (GtkAttachOptions) (GTK_EXPAND), 0, 0);
+ gtk_label_set_justify (GTK_LABEL (label1), GTK_JUSTIFY_LEFT);
+ gtk_misc_set_padding (GTK_MISC (label1), 9, 0);
+
+ drvdirect = gtk_radio_button_new_with_label (drivergroup_group, _("Direct Parport Access"));
+ drivergroup_group = gtk_radio_button_group (GTK_RADIO_BUTTON (drvdirect));
+ gtk_widget_set_name (drvdirect, "drvdirect");
+ gtk_widget_ref (drvdirect);
+ gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "drvdirect", drvdirect,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (drvdirect);
+ gtk_table_attach (GTK_TABLE (table2), drvdirect, 1, 2, 0, 1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND), 0, 0);
+
+ drvppdev = gtk_radio_button_new_with_label (drivergroup_group, _("ppdev Kernel Driver"));
+ drivergroup_group = gtk_radio_button_group (GTK_RADIO_BUTTON (drvppdev));
+ gtk_widget_set_name (drvppdev, "drvppdev");
+ gtk_widget_ref (drvppdev);
+ gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "drvppdev", drvppdev,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (drvppdev);
+ gtk_table_attach (GTK_TABLE (table2), drvppdev, 1, 2, 1, 2,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND), 0, 0);
+
+ frame2 = gtk_frame_new (_("Modem Settings"));
+ gtk_widget_set_name (frame2, "frame2");
+ gtk_widget_ref (frame2);
+ gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "frame2", frame2,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (frame2);
+ gtk_box_pack_start (GTK_BOX (vbox1), frame2, TRUE, TRUE, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (frame2), 5);
+
+ table1 = gtk_table_new (1, 2, FALSE);
+ gtk_widget_set_name (table1, "table1");
+ gtk_widget_ref (table1);
+ gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "table1", table1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (table1);
+ gtk_container_add (GTK_CONTAINER (frame2), table1);
+
+ fpgaclk = gtk_combo_new ();
+ gtk_widget_set_name (fpgaclk, "fpgaclk");
+ gtk_widget_ref (fpgaclk);
+ gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "fpgaclk", fpgaclk,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (fpgaclk);
+ gtk_table_attach (GTK_TABLE (table1), fpgaclk, 1, 2, 0, 1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND), 0, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (fpgaclk), 3);
+ fpgaclk_items = g_list_append (fpgaclk_items, _("19666600"));
+ fpgaclk_items = g_list_append (fpgaclk_items, _("9830400"));
+ gtk_combo_set_popdown_strings (GTK_COMBO (fpgaclk), fpgaclk_items);
+ g_list_free (fpgaclk_items);
+
+ label4 = gtk_label_new (_("FPGA clock frequency"));
+ gtk_widget_set_name (label4, "label4");
+ gtk_widget_ref (label4);
+ gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "label4", label4,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (label4);
+ gtk_table_attach (GTK_TABLE (table1), label4, 0, 1, 0, 1,
+ (GtkAttachOptions) (GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND), 0, 0);
+ gtk_label_set_justify (GTK_LABEL (label4), GTK_JUSTIFY_LEFT);
+ gtk_misc_set_alignment (GTK_MISC (label4), 0, 0.5);
+ gtk_misc_set_padding (GTK_MISC (label4), 10, 0);
+
+ hbuttonbox1 = gtk_hbutton_box_new ();
+ gtk_widget_set_name (hbuttonbox1, "hbuttonbox1");
+ gtk_widget_ref (hbuttonbox1);
+ gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "hbuttonbox1", hbuttonbox1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (hbuttonbox1);
+ gtk_box_pack_start (GTK_BOX (vbox1), hbuttonbox1, TRUE, TRUE, 0);
+ gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox1), GTK_BUTTONBOX_SPREAD);
+
+ buttonok = gtk_button_new_with_label (_("Ok"));
+ gtk_widget_set_name (buttonok, "buttonok");
+ gtk_widget_ref (buttonok);
+ gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "buttonok", buttonok,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (buttonok);
+ gtk_container_add (GTK_CONTAINER (hbuttonbox1), buttonok);
+ GTK_WIDGET_SET_FLAGS (buttonok, GTK_CAN_DEFAULT);
+ gtk_tooltips_set_tip (tooltips, buttonok, _("Continue"), NULL);
+
+ buttonquit = gtk_button_new_with_label (_("Quit"));
+ gtk_widget_set_name (buttonquit, "buttonquit");
+ gtk_widget_ref (buttonquit);
+ gtk_object_set_data_full (GTK_OBJECT (ioconfiglinux), "buttonquit", buttonquit,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (buttonquit);
+ gtk_container_add (GTK_CONTAINER (hbuttonbox1), buttonquit);
+ GTK_WIDGET_SET_FLAGS (buttonquit, GTK_CAN_DEFAULT);
+ gtk_tooltips_set_tip (tooltips, buttonquit, _("Quit the application"), NULL);
+
+ gtk_signal_connect (GTK_OBJECT (buttonok), "clicked",
+ GTK_SIGNAL_FUNC (on_configok_clicked),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (buttonquit), "clicked",
+ GTK_SIGNAL_FUNC (on_configquit_clicked),
+ NULL);
+
+ gtk_object_set_data (GTK_OBJECT (ioconfiglinux), "tooltips", tooltips);
+
+ return ioconfiglinux;
+}
+
+GtkWidget*
+create_mainwindow ()
+{
+ GtkWidget *mainwindow;
+ GtkWidget *vbox2;
+ GtkWidget *handlebox1;
+ GtkWidget *menubar1;
+ guint tmp_key;
+ GtkWidget *file;
+ GtkWidget *file_menu;
+ GtkAccelGroup *file_menu_accels;
+ GtkWidget *dtmf;
+ GtkWidget *oscilloscope;
+ GtkWidget *spectrum;
+ GtkWidget *separator1;
+ GtkWidget *quit;
+ GtkWidget *help;
+ GtkWidget *help_menu;
+ GtkAccelGroup *help_menu_accels;
+ GtkWidget *about;
+ GtkWidget *vbox3;
+ GtkWidget *progressbar1;
+ GtkWidget *progressbar2;
+ GtkWidget *handlebox2;
+ GtkWidget *hbox1;
+ GtkWidget *buttonptt;
+ GtkWidget *button1750;
+ GtkWidget *buttonsquelch;
+ GtkWidget *buttondtmf;
+ GtkWidget *buttonscope;
+ GtkWidget *buttonspectrum;
+ GtkAccelGroup *accel_group;
+ GtkTooltips *tooltips;
+
+ tooltips = gtk_tooltips_new ();
+
+ accel_group = gtk_accel_group_new ();
+
+ mainwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_widget_set_name (mainwindow, "mainwindow");
+ gtk_widget_ref (mainwindow);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "mainwindow", mainwindow,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_set_events (mainwindow, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
+ gtk_window_set_title (GTK_WINDOW (mainwindow), _("EPPFM"));
+
+ vbox2 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_set_name (vbox2, "vbox2");
+ gtk_widget_ref (vbox2);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "vbox2", vbox2,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (vbox2);
+ gtk_container_add (GTK_CONTAINER (mainwindow), vbox2);
+
+ handlebox1 = gtk_handle_box_new ();
+ gtk_widget_set_name (handlebox1, "handlebox1");
+ gtk_widget_ref (handlebox1);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "handlebox1", handlebox1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (handlebox1);
+ gtk_box_pack_start (GTK_BOX (vbox2), handlebox1, FALSE, TRUE, 0);
+
+ menubar1 = gtk_menu_bar_new ();
+ gtk_widget_set_name (menubar1, "menubar1");
+ gtk_widget_ref (menubar1);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "menubar1", menubar1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (menubar1);
+ gtk_container_add (GTK_CONTAINER (handlebox1), menubar1);
+
+ file = gtk_menu_item_new_with_label ("");
+ tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (file)->child),
+ _("_File"));
+ gtk_widget_add_accelerator (file, "activate_item", accel_group,
+ tmp_key, GDK_MOD1_MASK, 0);
+ gtk_widget_set_name (file, "file");
+ gtk_widget_ref (file);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "file", file,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (file);
+ gtk_container_add (GTK_CONTAINER (menubar1), file);
+ gtk_tooltips_set_tip (tooltips, file, _("File Menu"), NULL);
+
+ file_menu = gtk_menu_new ();
+ gtk_widget_set_name (file_menu, "file_menu");
+ gtk_widget_ref (file_menu);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "file_menu", file_menu,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (file), file_menu);
+ file_menu_accels = gtk_menu_ensure_uline_accel_group (GTK_MENU (file_menu));
+
+ dtmf = gtk_menu_item_new_with_label ("");
+ tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (dtmf)->child),
+ _("_DTMF keypad..."));
+ gtk_widget_add_accelerator (dtmf, "activate_item", file_menu_accels,
+ tmp_key, 0, 0);
+ gtk_widget_set_name (dtmf, "dtmf");
+ gtk_widget_ref (dtmf);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "dtmf", dtmf,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (dtmf);
+ gtk_container_add (GTK_CONTAINER (file_menu), dtmf);
+
+ oscilloscope = gtk_menu_item_new_with_label ("");
+ tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (oscilloscope)->child),
+ _("_Oscilloscope display..."));
+ gtk_widget_add_accelerator (oscilloscope, "activate_item", file_menu_accels,
+ tmp_key, 0, 0);
+ gtk_widget_set_name (oscilloscope, "oscilloscope");
+ gtk_widget_ref (oscilloscope);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "oscilloscope", oscilloscope,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (oscilloscope);
+ gtk_container_add (GTK_CONTAINER (file_menu), oscilloscope);
+
+ spectrum = gtk_menu_item_new_with_label ("");
+ tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (spectrum)->child),
+ _("_Spectrum Display..."));
+ gtk_widget_add_accelerator (spectrum, "activate_item", file_menu_accels,
+ tmp_key, 0, 0);
+ gtk_widget_set_name (spectrum, "spectrum");
+ gtk_widget_ref (spectrum);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "spectrum", spectrum,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (spectrum);
+ gtk_container_add (GTK_CONTAINER (file_menu), spectrum);
+
+ separator1 = gtk_menu_item_new ();
+ gtk_widget_set_name (separator1, "separator1");
+ gtk_widget_ref (separator1);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "separator1", separator1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (separator1);
+ gtk_container_add (GTK_CONTAINER (file_menu), separator1);
+ gtk_widget_set_sensitive (separator1, FALSE);
+
+ quit = gtk_menu_item_new_with_label ("");
+ tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (quit)->child),
+ _("_Quit"));
+ gtk_widget_add_accelerator (quit, "activate_item", file_menu_accels,
+ tmp_key, 0, 0);
+ gtk_widget_set_name (quit, "quit");
+ gtk_widget_ref (quit);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "quit", quit,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (quit);
+ gtk_container_add (GTK_CONTAINER (file_menu), quit);
+
+ help = gtk_menu_item_new_with_label ("");
+ tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (help)->child),
+ _("_Help"));
+ gtk_widget_add_accelerator (help, "activate_item", accel_group,
+ tmp_key, GDK_MOD1_MASK, 0);
+ gtk_widget_set_name (help, "help");
+ gtk_widget_ref (help);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "help", help,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (help);
+ gtk_container_add (GTK_CONTAINER (menubar1), help);
+ gtk_menu_item_right_justify (GTK_MENU_ITEM (help));
+
+ help_menu = gtk_menu_new ();
+ gtk_widget_set_name (help_menu, "help_menu");
+ gtk_widget_ref (help_menu);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "help_menu", help_menu,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (help), help_menu);
+ help_menu_accels = gtk_menu_ensure_uline_accel_group (GTK_MENU (help_menu));
+
+ about = gtk_menu_item_new_with_label ("");
+ tmp_key = gtk_label_parse_uline (GTK_LABEL (GTK_BIN (about)->child),
+ _("_About"));
+ gtk_widget_add_accelerator (about, "activate_item", help_menu_accels,
+ tmp_key, 0, 0);
+ gtk_widget_set_name (about, "about");
+ gtk_widget_ref (about);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "about", about,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (about);
+ gtk_container_add (GTK_CONTAINER (help_menu), about);
+
+ vbox3 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_set_name (vbox3, "vbox3");
+ gtk_widget_ref (vbox3);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "vbox3", vbox3,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (vbox3);
+ gtk_box_pack_start (GTK_BOX (vbox2), vbox3, TRUE, TRUE, 0);
+
+ progressbar1 = gtk_progress_bar_new ();
+ gtk_widget_set_name (progressbar1, "progressbar1");
+ gtk_widget_ref (progressbar1);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "progressbar1", progressbar1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (progressbar1);
+ gtk_box_pack_start (GTK_BOX (vbox3), progressbar1, TRUE, TRUE, 0);
+ gtk_progress_configure (GTK_PROGRESS (progressbar1), -40, -40, 0);
+ gtk_progress_set_show_text (GTK_PROGRESS (progressbar1), TRUE);
+
+ progressbar2 = gtk_progress_bar_new ();
+ gtk_widget_set_name (progressbar2, "progressbar2");
+ gtk_widget_ref (progressbar2);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "progressbar2", progressbar2,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (progressbar2);
+ gtk_box_pack_start (GTK_BOX (vbox3), progressbar2, TRUE, TRUE, 0);
+ gtk_progress_configure (GTK_PROGRESS (progressbar2), -40, -40, 0);
+ gtk_progress_set_show_text (GTK_PROGRESS (progressbar2), TRUE);
+
+ handlebox2 = gtk_handle_box_new ();
+ gtk_widget_set_name (handlebox2, "handlebox2");
+ gtk_widget_ref (handlebox2);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "handlebox2", handlebox2,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (handlebox2);
+ gtk_box_pack_start (GTK_BOX (vbox2), handlebox2, FALSE, TRUE, 0);
+
+ hbox1 = gtk_hbox_new (TRUE, 0);
+ gtk_widget_set_name (hbox1, "hbox1");
+ gtk_widget_ref (hbox1);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "hbox1", hbox1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (hbox1);
+ gtk_container_add (GTK_CONTAINER (handlebox2), hbox1);
+
+ buttonptt = gtk_toggle_button_new_with_label (_("PTT"));
+ gtk_widget_set_name (buttonptt, "buttonptt");
+ gtk_widget_ref (buttonptt);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttonptt", buttonptt,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (buttonptt);
+ gtk_box_pack_start (GTK_BOX (hbox1), buttonptt, TRUE, TRUE, 0);
+ gtk_widget_set_usize (buttonptt, 70, -2);
+
+ button1750 = gtk_button_new_with_label (_("1750"));
+ gtk_widget_set_name (button1750, "button1750");
+ gtk_widget_ref (button1750);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "button1750", button1750,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (button1750);
+ gtk_box_pack_start (GTK_BOX (hbox1), button1750, TRUE, TRUE, 0);
+
+ buttonsquelch = gtk_button_new_with_label (_("Squelch off"));
+ gtk_widget_set_name (buttonsquelch, "buttonsquelch");
+ gtk_widget_ref (buttonsquelch);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttonsquelch", buttonsquelch,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (buttonsquelch);
+ gtk_box_pack_start (GTK_BOX (hbox1), buttonsquelch, TRUE, TRUE, 0);
+
+ buttondtmf = gtk_button_new_with_label (_("DTMF"));
+ gtk_widget_set_name (buttondtmf, "buttondtmf");
+ gtk_widget_ref (buttondtmf);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttondtmf", buttondtmf,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (buttondtmf);
+ gtk_box_pack_start (GTK_BOX (hbox1), buttondtmf, TRUE, TRUE, 0);
+
+ buttonscope = gtk_button_new_with_label (_("Scope"));
+ gtk_widget_set_name (buttonscope, "buttonscope");
+ gtk_widget_ref (buttonscope);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttonscope", buttonscope,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (buttonscope);
+ gtk_box_pack_start (GTK_BOX (hbox1), buttonscope, TRUE, TRUE, 0);
+
+ buttonspectrum = gtk_button_new_with_label (_("Spectrum"));
+ gtk_widget_set_name (buttonspectrum, "buttonspectrum");
+ gtk_widget_ref (buttonspectrum);
+ gtk_object_set_data_full (GTK_OBJECT (mainwindow), "buttonspectrum", buttonspectrum,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (buttonspectrum);
+ gtk_box_pack_start (GTK_BOX (hbox1), buttonspectrum, TRUE, TRUE, 0);
+
+ gtk_signal_connect (GTK_OBJECT (mainwindow), "delete_event",
+ GTK_SIGNAL_FUNC (on_mainwindow_delete_event),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (mainwindow), "destroy",
+ GTK_SIGNAL_FUNC (on_mainwindow_destroy),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (mainwindow), "key_press_event",
+ GTK_SIGNAL_FUNC (on_mainwindow_key_event),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (mainwindow), "key_release_event",
+ GTK_SIGNAL_FUNC (on_mainwindow_key_event),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (dtmf), "activate",
+ GTK_SIGNAL_FUNC (on_dtmf_activate),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (oscilloscope), "activate",
+ GTK_SIGNAL_FUNC (on_oscilloscope_activate),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (spectrum), "activate",
+ GTK_SIGNAL_FUNC (on_spectrum_activate),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (quit), "activate",
+ GTK_SIGNAL_FUNC (on_quit_activate),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (about), "activate",
+ GTK_SIGNAL_FUNC (on_about_activate),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (buttonptt), "toggled",
+ GTK_SIGNAL_FUNC (on_mainptt_toggled),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (button1750), "pressed",
+ GTK_SIGNAL_FUNC (on_button1750_pressed),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (button1750), "released",
+ GTK_SIGNAL_FUNC (on_button1750_released),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (buttonsquelch), "clicked",
+ GTK_SIGNAL_FUNC (on_buttonsquelch_clicked),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (buttondtmf), "clicked",
+ GTK_SIGNAL_FUNC (on_maindtmf_clicked),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (buttonscope), "clicked",
+ GTK_SIGNAL_FUNC (on_mainscope_clicked),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (buttonspectrum), "clicked",
+ GTK_SIGNAL_FUNC (on_mainspectrum_clicked),
+ NULL);
+
+ gtk_object_set_data (GTK_OBJECT (mainwindow), "tooltips", tooltips);
+
+ gtk_window_add_accel_group (GTK_WINDOW (mainwindow), accel_group);
+
+ return mainwindow;
+}
+
+GtkWidget*
+create_aboutdialog ()
+{
+ GtkWidget *aboutdialog;
+ GtkWidget *dialog_vbox1;
+ GtkWidget *vbox5;
+ GtkWidget *label7;
+ GtkWidget *label8;
+ GtkWidget *label9;
+ GtkWidget *dialog_action_area1;
+ GtkWidget *buttonok;
+
+ aboutdialog = gtk_dialog_new ();
+ gtk_widget_set_name (aboutdialog, "aboutdialog");
+ gtk_widget_ref (aboutdialog);
+ gtk_object_set_data_full (GTK_OBJECT (aboutdialog), "aboutdialog", aboutdialog,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_window_set_title (GTK_WINDOW (aboutdialog), _("About"));
+ gtk_window_set_policy (GTK_WINDOW (aboutdialog), TRUE, TRUE, FALSE);
+
+ dialog_vbox1 = GTK_DIALOG (aboutdialog)->vbox;
+ gtk_widget_set_name (dialog_vbox1, "dialog_vbox1");
+ gtk_widget_ref (dialog_vbox1);
+ gtk_object_set_data_full (GTK_OBJECT (aboutdialog), "dialog_vbox1", dialog_vbox1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (dialog_vbox1);
+
+ vbox5 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_set_name (vbox5, "vbox5");
+ gtk_widget_ref (vbox5);
+ gtk_object_set_data_full (GTK_OBJECT (aboutdialog), "vbox5", vbox5,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (vbox5);
+ gtk_box_pack_start (GTK_BOX (dialog_vbox1), vbox5, TRUE, TRUE, 0);
+
+ label7 = gtk_label_new (_("written by:"));
+ gtk_widget_set_name (label7, "label7");
+ gtk_widget_ref (label7);
+ gtk_object_set_data_full (GTK_OBJECT (aboutdialog), "label7", label7,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (label7);
+ gtk_box_pack_start (GTK_BOX (vbox5), label7, FALSE, FALSE, 0);
+ gtk_misc_set_alignment (GTK_MISC (label7), 0, 0.5);
+ gtk_misc_set_padding (GTK_MISC (label7), 4, 3);
+
+ label8 = gtk_label_new (_("Thomas Sailer"));
+ gtk_widget_set_name (label8, "label8");
+ gtk_widget_ref (label8);
+ gtk_object_set_data_full (GTK_OBJECT (aboutdialog), "label8", label8,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (label8);
+ gtk_box_pack_start (GTK_BOX (vbox5), label8, FALSE, FALSE, 0);
+ gtk_misc_set_padding (GTK_MISC (label8), 4, 4);
+
+ label9 = gtk_label_new (_("HB9JNX/AE4WA"));
+ gtk_widget_set_name (label9, "label9");
+ gtk_widget_ref (label9);
+ gtk_object_set_data_full (GTK_OBJECT (aboutdialog), "label9", label9,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (label9);
+ gtk_box_pack_start (GTK_BOX (vbox5), label9, FALSE, FALSE, 0);
+ gtk_misc_set_padding (GTK_MISC (label9), 4, 4);
+
+ dialog_action_area1 = GTK_DIALOG (aboutdialog)->action_area;
+ gtk_widget_set_name (dialog_action_area1, "dialog_action_area1");
+ gtk_widget_ref (dialog_action_area1);
+ gtk_object_set_data_full (GTK_OBJECT (aboutdialog), "dialog_action_area1", dialog_action_area1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (dialog_action_area1);
+ gtk_container_set_border_width (GTK_CONTAINER (dialog_action_area1), 10);
+
+ buttonok = gtk_button_new_with_label (_("Ok"));
+ gtk_widget_set_name (buttonok, "buttonok");
+ gtk_widget_ref (buttonok);
+ gtk_object_set_data_full (GTK_OBJECT (aboutdialog), "buttonok", buttonok,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (buttonok);
+ gtk_box_pack_start (GTK_BOX (dialog_action_area1), buttonok, FALSE, FALSE, 0);
+ gtk_widget_set_usize (buttonok, 80, 27);
+
+ gtk_signal_connect (GTK_OBJECT (aboutdialog), "delete_event",
+ GTK_SIGNAL_FUNC (on_aboutdialog_delete_event),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (buttonok), "clicked",
+ GTK_SIGNAL_FUNC (on_aboutok_clicked),
+ NULL);
+
+ return aboutdialog;
+}
+
+GtkWidget*
+create_dtmfwindow ()
+{
+ GtkWidget *dtmfwindow;
+ GtkWidget *vbox4;
+ GtkWidget *frame4;
+ GtkWidget *hbox2;
+ GtkWidget *dtmfentry;
+ GtkWidget *buttoncleardtmf;
+ GtkWidget *frame5;
+ GtkWidget *table4;
+ GtkWidget *dtmf8;
+ GtkWidget *dtmf9;
+ GtkWidget *dtmfa;
+ GtkWidget *dtmf4;
+ GtkWidget *dtmf5;
+ GtkWidget *dtmf6;
+ GtkWidget *dtmfb;
+ GtkWidget *dtmf1;
+ GtkWidget *dtmf2;
+ GtkWidget *dtmf3;
+ GtkWidget *dtmfc;
+ GtkWidget *dtmfe;
+ GtkWidget *dtmf0;
+ GtkWidget *dtmff;
+ GtkWidget *dtmfd;
+ GtkWidget *dtmf7;
+
+ dtmfwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_widget_set_name (dtmfwindow, "dtmfwindow");
+ gtk_widget_ref (dtmfwindow);
+ gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmfwindow", dtmfwindow,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_set_events (dtmfwindow, GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
+ gtk_window_set_title (GTK_WINDOW (dtmfwindow), _("DTMF Keypad"));
+
+ vbox4 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_set_name (vbox4, "vbox4");
+ gtk_widget_ref (vbox4);
+ gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "vbox4", vbox4,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (vbox4);
+ gtk_container_add (GTK_CONTAINER (dtmfwindow), vbox4);
+
+ frame4 = gtk_frame_new (_("Keys transmitted"));
+ gtk_widget_set_name (frame4, "frame4");
+ gtk_widget_ref (frame4);
+ gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "frame4", frame4,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (frame4);
+ gtk_box_pack_start (GTK_BOX (vbox4), frame4, FALSE, TRUE, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (frame4), 5);
+ gtk_frame_set_label_align (GTK_FRAME (frame4), 0.01, 0.5);
+
+ hbox2 = gtk_hbox_new (FALSE, 0);
+ gtk_widget_set_name (hbox2, "hbox2");
+ gtk_widget_ref (hbox2);
+ gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "hbox2", hbox2,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (hbox2);
+ gtk_container_add (GTK_CONTAINER (frame4), hbox2);
+
+ dtmfentry = gtk_entry_new ();
+ gtk_widget_set_name (dtmfentry, "dtmfentry");
+ gtk_widget_ref (dtmfentry);
+ gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmfentry", dtmfentry,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (dtmfentry);
+ gtk_box_pack_start (GTK_BOX (hbox2), dtmfentry, TRUE, TRUE, 0);
+ gtk_entry_set_editable (GTK_ENTRY (dtmfentry), FALSE);
+
+ buttoncleardtmf = gtk_button_new_with_label (_("Clear"));
+ gtk_widget_set_name (buttoncleardtmf, "buttoncleardtmf");
+ gtk_widget_ref (buttoncleardtmf);
+ gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "buttoncleardtmf", buttoncleardtmf,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (buttoncleardtmf);
+ gtk_box_pack_start (GTK_BOX (hbox2), buttoncleardtmf, FALSE, FALSE, 0);
+ gtk_widget_set_usize (buttoncleardtmf, 50, -2);
+
+ frame5 = gtk_frame_new (_("Keypad"));
+ gtk_widget_set_name (frame5, "frame5");
+ gtk_widget_ref (frame5);
+ gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "frame5", frame5,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (frame5);
+ gtk_box_pack_start (GTK_BOX (vbox4), frame5, TRUE, TRUE, 0);
+ gtk_container_set_border_width (GTK_CONTAINER (frame5), 5);
+ gtk_frame_set_label_align (GTK_FRAME (frame5), 0.01, 0.5);
+
+ table4 = gtk_table_new (4, 4, FALSE);
+ gtk_widget_set_name (table4, "table4");
+ gtk_widget_ref (table4);
+ gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "table4", table4,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (table4);
+ gtk_container_add (GTK_CONTAINER (frame5), table4);
+
+ dtmf8 = gtk_button_new_with_label (_("8"));
+ gtk_widget_set_name (dtmf8, "dtmf8");
+ gtk_widget_ref (dtmf8);
+ gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf8", dtmf8,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (dtmf8);
+ gtk_table_attach (GTK_TABLE (table4), dtmf8, 1, 2, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+ dtmf9 = gtk_button_new_with_label (_("9"));
+ gtk_widget_set_name (dtmf9, "dtmf9");
+ gtk_widget_ref (dtmf9);
+ gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf9", dtmf9,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (dtmf9);
+ gtk_table_attach (GTK_TABLE (table4), dtmf9, 2, 3, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+ dtmfa = gtk_button_new_with_label (_("A"));
+ gtk_widget_set_name (dtmfa, "dtmfa");
+ gtk_widget_ref (dtmfa);
+ gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmfa", dtmfa,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (dtmfa);
+ gtk_table_attach (GTK_TABLE (table4), dtmfa, 3, 4, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+ dtmf4 = gtk_button_new_with_label (_("4"));
+ gtk_widget_set_name (dtmf4, "dtmf4");
+ gtk_widget_ref (dtmf4);
+ gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf4", dtmf4,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (dtmf4);
+ gtk_table_attach (GTK_TABLE (table4), dtmf4, 0, 1, 1, 2,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+ dtmf5 = gtk_button_new_with_label (_("5"));
+ gtk_widget_set_name (dtmf5, "dtmf5");
+ gtk_widget_ref (dtmf5);
+ gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf5", dtmf5,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (dtmf5);
+ gtk_table_attach (GTK_TABLE (table4), dtmf5, 1, 2, 1, 2,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+ dtmf6 = gtk_button_new_with_label (_("6"));
+ gtk_widget_set_name (dtmf6, "dtmf6");
+ gtk_widget_ref (dtmf6);
+ gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf6", dtmf6,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (dtmf6);
+ gtk_table_attach (GTK_TABLE (table4), dtmf6, 2, 3, 1, 2,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+ dtmfb = gtk_button_new_with_label (_("B"));
+ gtk_widget_set_name (dtmfb, "dtmfb");
+ gtk_widget_ref (dtmfb);
+ gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmfb", dtmfb,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (dtmfb);
+ gtk_table_attach (GTK_TABLE (table4), dtmfb, 3, 4, 1, 2,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+ dtmf1 = gtk_button_new_with_label (_("1"));
+ gtk_widget_set_name (dtmf1, "dtmf1");
+ gtk_widget_ref (dtmf1);
+ gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf1", dtmf1,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (dtmf1);
+ gtk_table_attach (GTK_TABLE (table4), dtmf1, 0, 1, 2, 3,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+ dtmf2 = gtk_button_new_with_label (_("2"));
+ gtk_widget_set_name (dtmf2, "dtmf2");
+ gtk_widget_ref (dtmf2);
+ gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf2", dtmf2,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (dtmf2);
+ gtk_table_attach (GTK_TABLE (table4), dtmf2, 1, 2, 2, 3,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+ dtmf3 = gtk_button_new_with_label (_("3"));
+ gtk_widget_set_name (dtmf3, "dtmf3");
+ gtk_widget_ref (dtmf3);
+ gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf3", dtmf3,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (dtmf3);
+ gtk_table_attach (GTK_TABLE (table4), dtmf3, 2, 3, 2, 3,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+ dtmfc = gtk_button_new_with_label (_("C"));
+ gtk_widget_set_name (dtmfc, "dtmfc");
+ gtk_widget_ref (dtmfc);
+ gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmfc", dtmfc,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (dtmfc);
+ gtk_table_attach (GTK_TABLE (table4), dtmfc, 3, 4, 2, 3,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+ dtmfe = gtk_button_new_with_label (_("*"));
+ gtk_widget_set_name (dtmfe, "dtmfe");
+ gtk_widget_ref (dtmfe);
+ gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmfe", dtmfe,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (dtmfe);
+ gtk_table_attach (GTK_TABLE (table4), dtmfe, 0, 1, 3, 4,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+ dtmf0 = gtk_button_new_with_label (_("0"));
+ gtk_widget_set_name (dtmf0, "dtmf0");
+ gtk_widget_ref (dtmf0);
+ gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf0", dtmf0,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (dtmf0);
+ gtk_table_attach (GTK_TABLE (table4), dtmf0, 1, 2, 3, 4,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+ dtmff = gtk_button_new_with_label (_("#"));
+ gtk_widget_set_name (dtmff, "dtmff");
+ gtk_widget_ref (dtmff);
+ gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmff", dtmff,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (dtmff);
+ gtk_table_attach (GTK_TABLE (table4), dtmff, 2, 3, 3, 4,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+ dtmfd = gtk_button_new_with_label (_("D"));
+ gtk_widget_set_name (dtmfd, "dtmfd");
+ gtk_widget_ref (dtmfd);
+ gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmfd", dtmfd,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (dtmfd);
+ gtk_table_attach (GTK_TABLE (table4), dtmfd, 3, 4, 3, 4,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+ dtmf7 = gtk_button_new_with_label (_("7"));
+ gtk_widget_set_name (dtmf7, "dtmf7");
+ gtk_widget_ref (dtmf7);
+ gtk_object_set_data_full (GTK_OBJECT (dtmfwindow), "dtmf7", dtmf7,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (dtmf7);
+ gtk_table_attach (GTK_TABLE (table4), dtmf7, 0, 1, 0, 1,
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+ gtk_signal_connect (GTK_OBJECT (dtmfwindow), "key_press_event",
+ GTK_SIGNAL_FUNC (on_dtmfwindow_key_event),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (dtmfwindow), "key_release_event",
+ GTK_SIGNAL_FUNC (on_dtmfwindow_key_event),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (dtmfwindow), "delete_event",
+ GTK_SIGNAL_FUNC (on_dtmfwindow_delete_event),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (buttoncleardtmf), "clicked",
+ GTK_SIGNAL_FUNC (on_dtmfclear_clicked),
+ NULL);
+ gtk_signal_connect (GTK_OBJECT (dtmf8), "pressed",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x18);
+ gtk_signal_connect (GTK_OBJECT (dtmf8), "released",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x08);
+ gtk_signal_connect (GTK_OBJECT (dtmf9), "pressed",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x19);
+ gtk_signal_connect (GTK_OBJECT (dtmf9), "released",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x09);
+ gtk_signal_connect (GTK_OBJECT (dtmfa), "pressed",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x1a);
+ gtk_signal_connect (GTK_OBJECT (dtmfa), "released",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x0a);
+ gtk_signal_connect (GTK_OBJECT (dtmf4), "pressed",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x14);
+ gtk_signal_connect (GTK_OBJECT (dtmf4), "released",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x04);
+ gtk_signal_connect (GTK_OBJECT (dtmf5), "pressed",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x15);
+ gtk_signal_connect (GTK_OBJECT (dtmf5), "released",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x05);
+ gtk_signal_connect (GTK_OBJECT (dtmf6), "pressed",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x16);
+ gtk_signal_connect (GTK_OBJECT (dtmf6), "released",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x06);
+ gtk_signal_connect (GTK_OBJECT (dtmfb), "pressed",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x1b);
+ gtk_signal_connect (GTK_OBJECT (dtmfb), "released",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x0b);
+ gtk_signal_connect (GTK_OBJECT (dtmf1), "pressed",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x11);
+ gtk_signal_connect (GTK_OBJECT (dtmf1), "released",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x01);
+ gtk_signal_connect (GTK_OBJECT (dtmf2), "pressed",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x12);
+ gtk_signal_connect (GTK_OBJECT (dtmf2), "released",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x02);
+ gtk_signal_connect (GTK_OBJECT (dtmf3), "pressed",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x13);
+ gtk_signal_connect (GTK_OBJECT (dtmf3), "released",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x03);
+ gtk_signal_connect (GTK_OBJECT (dtmfc), "pressed",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x1c);
+ gtk_signal_connect (GTK_OBJECT (dtmfc), "released",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x0c);
+ gtk_signal_connect (GTK_OBJECT (dtmfe), "pressed",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x1e);
+ gtk_signal_connect (GTK_OBJECT (dtmfe), "released",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x0e);
+ gtk_signal_connect (GTK_OBJECT (dtmf0), "pressed",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x10);
+ gtk_signal_connect (GTK_OBJECT (dtmf0), "released",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x00);
+ gtk_signal_connect (GTK_OBJECT (dtmff), "pressed",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x1f);
+ gtk_signal_connect (GTK_OBJECT (dtmff), "released",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x0f);
+ gtk_signal_connect (GTK_OBJECT (dtmfd), "pressed",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x1d);
+ gtk_signal_connect (GTK_OBJECT (dtmfd), "released",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x0d);
+ gtk_signal_connect (GTK_OBJECT (dtmf7), "pressed",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x17);
+ gtk_signal_connect (GTK_OBJECT (dtmf7), "released",
+ GTK_SIGNAL_FUNC (on_dtmf_key),
+ (gpointer)0x07);
+
+ return dtmfwindow;
+}
+
+GtkWidget*
+create_scopewindow ()
+{
+ GtkWidget *scopewindow;
+ GtkWidget *scope;
+
+ scopewindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_widget_set_name (scopewindow, "scopewindow");
+ gtk_widget_ref (scopewindow);
+ gtk_object_set_data_full (GTK_OBJECT (scopewindow), "scopewindow", scopewindow,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_window_set_title (GTK_WINDOW (scopewindow), _("Scope"));
+
+ scope = scope_new ("scope", NULL, NULL, 128, 0);
+ gtk_widget_set_name (scope, "scope");
+ gtk_widget_ref (scope);
+ gtk_object_set_data_full (GTK_OBJECT (scopewindow), "scope", scope,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (scope);
+ gtk_container_add (GTK_CONTAINER (scopewindow), scope);
+ gtk_widget_set_usize (scope, 512, 256);
+ GTK_WIDGET_UNSET_FLAGS (scope, GTK_CAN_FOCUS);
+ GTK_WIDGET_UNSET_FLAGS (scope, GTK_CAN_DEFAULT);
+
+ gtk_signal_connect (GTK_OBJECT (scopewindow), "delete_event",
+ GTK_SIGNAL_FUNC (on_scopewindow_delete_event),
+ NULL);
+
+ return scopewindow;
+}
+
+GtkWidget*
+create_spectrumwindow ()
+{
+ GtkWidget *spectrumwindow;
+ GtkWidget *spec;
+
+ spectrumwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_widget_set_name (spectrumwindow, "spectrumwindow");
+ gtk_widget_ref (spectrumwindow);
+ gtk_object_set_data_full (GTK_OBJECT (spectrumwindow), "spectrumwindow", spectrumwindow,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_window_set_title (GTK_WINDOW (spectrumwindow), _("Spectrum"));
+
+ spec = spectrum_new ("spec", NULL, NULL, 256, 0);
+ gtk_widget_set_name (spec, "spec");
+ gtk_widget_ref (spec);
+ gtk_object_set_data_full (GTK_OBJECT (spectrumwindow), "spec", spec,
+ (GtkDestroyNotify) gtk_widget_unref);
+ gtk_widget_show (spec);
+ gtk_container_add (GTK_CONTAINER (spectrumwindow), spec);
+ gtk_widget_set_usize (spec, 512, 256);
+ GTK_WIDGET_UNSET_FLAGS (spec, GTK_CAN_FOCUS);
+ GTK_WIDGET_UNSET_FLAGS (spec, GTK_CAN_DEFAULT);
+
+ gtk_signal_connect (GTK_OBJECT (spectrumwindow), "delete_event",
+ GTK_SIGNAL_FUNC (on_spectrumwindow_delete_event),
+ NULL);
+
+ return spectrumwindow;
+}
+
diff --git a/eppfm2/src/interface.h b/eppfm2/src/interface.h
new file mode 100644
index 0000000..a893e32
--- /dev/null
+++ b/eppfm2/src/interface.h
@@ -0,0 +1,10 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+GtkWidget* create_ioconfiglinux (void);
+GtkWidget* create_mainwindow (void);
+GtkWidget* create_aboutdialog (void);
+GtkWidget* create_dtmfwindow (void);
+GtkWidget* create_scopewindow (void);
+GtkWidget* create_spectrumwindow (void);
diff --git a/eppfm2/src/main.c b/eppfm2/src/main.c
new file mode 100644
index 0000000..0cd2844
--- /dev/null
+++ b/eppfm2/src/main.c
@@ -0,0 +1,571 @@
+/*****************************************************************************/
+
+/*
+ * eppfm.c -- EPP modem virtual transceiver.
+ *
+ * Copyright (C) 1998-2000 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#else
+#include "getopt.h"
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "eppfm.h"
+
+#include <gtk/gtk.h>
+
+#include "widgets.h"
+#include "callbacks.h"
+#include "interface.h"
+#include "support.h"
+
+/* ---------------------------------------------------------------------- */
+
+struct adapter_config cfg = { 19666600, 9600, 0, 0, 0, 1, 1, 0, 1 };
+
+static unsigned verboselevel = 0;
+static unsigned syslogmsg = 0;
+
+static unsigned int ptt = 0;
+static unsigned int squelch = 0;
+
+/* ---------------------------------------------------------------------- */
+
+/*OutputDebugStringA*/
+int lprintf(unsigned vl, const char *format, ...)
+{
+ va_list ap;
+ int r;
+
+ if (vl > verboselevel)
+ return 0;
+ va_start(ap, format);
+#ifdef HAVE_VSYSLOG
+ if (syslogmsg) {
+ static const int logprio[] = { LOG_ERR, LOG_INFO };
+ vsyslog((vl > 1) ? LOG_DEBUG : logprio[vl], format, ap);
+ r = 0;
+ } else
+#endif
+ r = vfprintf(stderr, format, ap);
+ va_end(ap);
+ return r;
+}
+
+/* ---------------------------------------------------------------------- */
+
+GtkWidget *ioconfig;
+GtkWidget *mainwindow;
+GtkWidget *aboutdialog;
+GtkWidget *dtmfwindow;
+GtkWidget *scopewindow;
+GtkWidget *spectrumwindow;
+
+
+void gui_addsamples(unsigned int num, const int16_t *y)
+{
+ Scope *scope;
+ Spectrum *spec;
+
+ scope = SCOPE(gtk_object_get_data(GTK_OBJECT(scopewindow), "scope"));
+ spec = SPECTRUM(gtk_object_get_data(GTK_OBJECT(spectrumwindow), "spec"));
+ scope_addvalues(scope, num, NULL, y);
+ spectrum_addvalues(spec, num, y);
+}
+
+void gui_updatevu(float meter1, float meter2)
+{
+ GtkProgress *pb1, *pb2;
+
+ pb1 = GTK_PROGRESS(gtk_object_get_data(GTK_OBJECT(mainwindow), "progressbar1"));
+ pb2 = GTK_PROGRESS(gtk_object_get_data(GTK_OBJECT(mainwindow), "progressbar2"));
+ gtk_progress_set_value(pb1, meter1);
+ gtk_progress_set_value(pb2, meter2);
+}
+
+void on_dtmf_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+ gtk_widget_show(dtmfwindow);
+}
+
+void on_oscilloscope_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+ gtk_widget_show(scopewindow);
+}
+
+void on_spectrum_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+ gtk_widget_show(spectrumwindow);
+}
+
+void on_quit_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+ gtk_main_quit();
+}
+
+void on_about_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+ gtk_widget_show(aboutdialog);
+}
+
+void on_dtmfclear_clicked(GtkButton *button, gpointer user_data)
+{
+ GtkEntry *entry;
+
+ entry = GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(dtmfwindow), "dtmfentry"));
+ gtk_entry_set_text(entry, "");
+}
+
+static gint dtmfkeyfunc(gpointer data)
+{
+ return on_dtmfwindow_key_event(NULL, NULL, data);
+}
+
+gboolean on_dtmfwindow_key_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
+{
+ static const char dtmfkeys[] = "0123456789ABCD*#";
+ static guint tmo = 0;
+ static guint lastkey = -1;
+ static guint currentkey = 0;
+ GtkButton *but;
+ gchar bname[6] = "dtmf0";
+ char *cp, c;
+
+ if (!event) {
+ tmo = 0;
+ lastkey = currentkey;
+ bname[4] += lastkey & 15;
+ if ((lastkey & 15) >= 10)
+ bname[4] += 'a'-'0'-10;
+ but = GTK_BUTTON(gtk_object_get_data(GTK_OBJECT(dtmfwindow), bname));
+ if (lastkey & 16)
+ gtk_button_pressed(but);
+ else
+ gtk_button_released(but);
+ return FALSE; /* don't get called again */
+ }
+ c = event->keyval;
+ if (c >= 'a' && c <= 'z')
+ c += 'A'-'a';
+ if (!(cp = strchr(dtmfkeys, c)))
+ return FALSE;
+ currentkey = cp - dtmfkeys + (event->type == GDK_KEY_PRESS ? 16 : 0);
+ if (tmo)
+ gtk_timeout_remove(tmo);
+ if (currentkey != lastkey)
+ tmo = gtk_timeout_add(10, dtmfkeyfunc, NULL);
+ return TRUE;
+}
+
+void on_dtmf_key(GtkButton *button, gpointer user_data)
+{
+ static const char dtmfkeys[] = "0123456789ABCD*#";
+ GtkEntry *entry;
+ gchar txt[2];
+ guint key = (guint)user_data;
+
+ printf("DTMF key: %u\n", key);
+ if (key & 16)
+ ptt |= 2;
+ else
+ ptt &= ~2;
+ audio_ptt(ptt);
+ audio_setsquelch(squelch);
+ audio_dtmf(key);
+ if (key < 0x10 || key > 0x1f)
+ return;
+ txt[0] = dtmfkeys[key & 0xf];
+ txt[1] = 0;
+ entry = GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(dtmfwindow), "dtmfentry"));
+ gtk_entry_append_text(entry, txt);
+}
+
+void on_configok_clicked(GtkButton *button, gpointer user_data)
+{
+ gtk_widget_show(mainwindow);
+ gtk_widget_hide(ioconfig);
+}
+
+void on_configquit_clicked(GtkButton *button, gpointer user_data)
+{
+ gtk_main_quit();
+}
+
+gboolean on_mainwindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+ return FALSE;
+}
+
+void on_mainwindow_destroy(GtkObject *object, gpointer user_data)
+{
+ gtk_main_quit();
+}
+
+static gint pttkeyfunc(gpointer data)
+{
+ return on_mainwindow_key_event(NULL, NULL, data);
+}
+
+gboolean on_mainwindow_key_event(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
+{
+ static guint tmo = 0;
+ static guint laststate = -1;
+ static guint currentstate = 0;
+ GtkToggleButton *ptt;
+
+ if (!event) {
+ tmo = 0;
+ laststate = currentstate;
+ ptt = GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(mainwindow), "buttonptt"));
+ gtk_toggle_button_set_active(ptt, laststate);
+ printf("gtk_toggle_button_set_active: %d\n", laststate);
+ return FALSE; /* don't get called again */
+ }
+ if (event->keyval == 32) {
+ currentstate = event->type == GDK_KEY_PRESS;
+ if (tmo)
+ gtk_timeout_remove(tmo);
+ if (currentstate != laststate)
+ tmo = gtk_timeout_add(100, pttkeyfunc, NULL);
+ return TRUE;
+ }
+ printf("Mainwindow key%s: time %u state %u keyval %u len %d\n",
+ event->type == GDK_KEY_PRESS ? "press" : "release",
+ event->time, event->state, event->keyval, event->length);
+ return FALSE;
+}
+
+void on_mainptt_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+ GtkToggleButton *pttb;
+ unsigned int ptts;
+
+ pttb = GTK_TOGGLE_BUTTON(gtk_object_get_data(GTK_OBJECT(mainwindow), "buttonptt"));
+ ptts = gtk_toggle_button_get_active(pttb);
+ printf("Toggle button active: %d\n", ptts);
+ ptt = (ptt & ~1) | (ptts & 1);
+ audio_ptt(ptt);
+ audio_setsquelch(squelch);
+}
+
+void on_maindtmf_clicked(GtkButton *button, gpointer user_data)
+{
+ if (GTK_WIDGET_VISIBLE(dtmfwindow))
+ gtk_widget_hide(dtmfwindow);
+ else
+ gtk_widget_show(dtmfwindow);
+}
+
+void on_mainscope_clicked(GtkButton *button, gpointer user_data)
+{
+ if (GTK_WIDGET_VISIBLE(scopewindow))
+ gtk_widget_hide(scopewindow);
+ else
+ gtk_widget_show(scopewindow);
+}
+
+void on_mainspectrum_clicked(GtkButton *button, gpointer user_data)
+{
+ if (GTK_WIDGET_VISIBLE(spectrumwindow))
+ gtk_widget_hide(spectrumwindow);
+ else
+ gtk_widget_show(spectrumwindow);
+}
+
+void on_aboutok_clicked(GtkButton *button, gpointer user_data)
+{
+ gtk_widget_hide(aboutdialog);
+}
+
+gboolean on_aboutdialog_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+ gtk_widget_hide(aboutdialog);
+ return TRUE;
+}
+
+gboolean on_dtmfwindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+ gtk_widget_hide(dtmfwindow);
+ return TRUE;
+}
+
+gboolean on_scopewindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+ gtk_widget_hide(scopewindow);
+ return TRUE;
+}
+
+
+gboolean on_spectrumwindow_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+ gtk_widget_hide(spectrumwindow);
+ return TRUE;
+}
+
+void on_buttonsquelch_clicked(GtkButton *button, gpointer user_data)
+{
+ GtkWidget *sqbl;
+
+ squelch++;
+ if (squelch > 1)
+ squelch = 0;
+ audio_setsquelch(squelch);
+ /* set label text */
+ sqbl = GTK_BIN(gtk_object_get_data(GTK_OBJECT(mainwindow), "buttonsquelch"))->child;
+ gtk_label_set_text(GTK_LABEL(sqbl), squelch ? _("Squelch on") : _("Squelch off") );
+}
+
+void on_button1750_pressed(GtkButton *button, gpointer user_data)
+{
+ ptt |= 4;
+ audio_ptt(ptt);
+ audio_1750(1);
+ audio_setsquelch(squelch);
+}
+
+
+void on_button1750_released(GtkButton *button, gpointer user_data)
+{
+ ptt &= ~4;
+ audio_ptt(ptt);
+ audio_1750(0);
+ audio_setsquelch(squelch);
+}
+
+int main(int argc, char *argv[])
+{
+ static const struct option long_options[] = {
+#ifdef HAVE_PPUSER
+ { "ppuser", 1, 0, 0x400 },
+ { "ppdev", 1, 0, 0x402 },
+#endif
+#ifdef HAVE_PPKDRV
+ { "ppkdrv", 1, 0, 0x401 },
+#endif
+#ifdef WIN32
+ { "ppgenport", 0, 0, 0x403 },
+ { "ppwin", 1, 0, 0x404 },
+ { "pplpt", 1, 0, 0x404 },
+ { "ppring0", 0, 0, 0x405 },
+#endif
+ { "ppforcehwepp", 0, 0, 0x410 },
+ { "ppswemulepp", 0, 0, 0x411 },
+ { "ppswemulecp", 0, 0, 0x412 },
+ { 0, 0, 0, 0 }
+ };
+ int c, err = 0;
+ unsigned int iobase = 0x378, ntddkgenport = 0, ntdrv = 0, w9xring0 = 0, ppflags = 0;
+ const char *snd = NULL;
+ const char *ppuser = NULL, *ppkdrv = NULL, *ppdev = NULL;
+
+ printf("EPP virtual transceiver (c) 1998-2000 by Thomas Sailer, HB9JNX/AE4WA\n");
+ bindtextdomain(PACKAGE, PACKAGE_LOCALE_DIR);
+ textdomain(PACKAGE);
+
+ gtk_set_locale();
+ gtk_init(&argc, &argv);
+
+ add_pixmap_directory(PACKAGE_DATA_DIR "/pixmaps");
+ add_pixmap_directory(PACKAGE_SOURCE_DIR "/pixmaps");
+
+ while ((c = getopt_long(argc, argv, "svp:m:a:", long_options, NULL)) != EOF) {
+ switch (c) {
+ case 0x400:
+ ppuser = optarg;
+ ppkdrv = NULL;
+ ppdev = NULL;
+ ntddkgenport = 0;
+ ntdrv = 0;
+ w9xring0 = 0;
+ break;
+
+ case 0x401:
+ ppkdrv = optarg;
+ ppuser = NULL;
+ ppdev = NULL;
+ ntddkgenport = 0;
+ ntdrv = 0;
+ w9xring0 = 0;
+ break;
+
+ case 0x402:
+ ppkdrv = NULL;
+ ppuser = NULL;
+ ppdev = optarg;
+ ntddkgenport = 0;
+ ntdrv = 0;
+ w9xring0 = 0;
+ break;
+
+ case 0x403:
+ ppkdrv = NULL;
+ ppuser = NULL;
+ ppdev = NULL;
+ ntddkgenport = 1;
+ ntdrv = 0;
+ w9xring0 = 0;
+ break;
+
+ case 0x404:
+ ppkdrv = NULL;
+ ppuser = NULL;
+ ppdev = NULL;
+ ntddkgenport = 0;
+ ntdrv = strtoul(optarg, NULL, 0);
+ w9xring0 = 0;
+ break;
+
+ case 0x405:
+ ppkdrv = NULL;
+ ppuser = NULL;
+ ppdev = NULL;
+ ntddkgenport = 0;
+ ntdrv = 0;
+ w9xring0 = 1;
+ break;
+
+ case 0x410:
+ ppflags |= PPFLAG_FORCEHWEPP;
+ break;
+
+ case 0x411:
+ ppflags |= PPFLAG_SWEMULEPP;
+ break;
+
+ case 0x412:
+ ppflags |= PPFLAG_SWEMULECP;
+ break;
+
+ case 'a':
+ snd = optarg;
+ break;
+
+ case 'p':
+ iobase = strtoul(optarg, NULL, 0);
+ if (iobase <= 0 || iobase >= 0x3f8)
+ err++;
+ break;
+
+ case 'm':
+ parseconfig(&cfg, optarg);
+ break;
+
+ case 'v':
+ verboselevel++;
+ break;
+
+#if defined(HAVE_SYSLOG) && defined(HAVE_VSYSLOG)
+ case 's':
+ if (syslogmsg)
+ break;
+ openlog("eppfpga", LOG_PID, LOG_USER);
+ syslogmsg = 1;
+ break;
+#endif
+
+ default:
+ err++;
+ break;
+ }
+ }
+ if (err) {
+ g_message("usage: %s [-v] [-p <portaddr>] [-m <modestr>]\n", argv[0]);
+ exit(1);
+ }
+ if (audio_drvinit(snd)) {
+ g_error("Sound Initialisation error\n");
+ exit(1);
+ }
+#ifdef HAVE_PPUSER
+ if (ppkdrv) {
+ if (parport_init_ppkdrv(ppkdrv)) {
+ fprintf(stderr, "no kernel interface %s driver found\n", ppkdrv);
+ exit(1);
+ }
+ } else
+#endif
+#ifdef HAVE_PPUSER
+ if (ppdev) {
+ if (parport_init_ppdev(ppdev)) {
+ fprintf(stderr, "no ppdev driver found at %s\n", ppdev);
+ exit(1);
+ }
+ } else if (ppuser) {
+ if (parport_init_ppuser(ppuser)) {
+ fprintf(stderr, "no ppuser driver found at %s\n", ppuser);
+ exit(1);
+ }
+ } else
+#endif
+#ifdef WIN32
+ if (ntdrv) {
+ if (parport_init_win_flags(ntdrv-1, ppflags)) {
+ fprintf(stderr, "no eppflex.sys/vxd driver found\n");
+ exit(1);
+ }
+ } else if (ntddkgenport) {
+ if (parport_init_ntddkgenport()) {
+ fprintf(stderr, "no NTDDK genport.sys driver found\n");
+ exit(1);
+ }
+ } else if (w9xring0) {
+ if (parport_init_w9xring0_flags(iobase, ppflags)) {
+ fprintf(stderr, "no parport found at 0x%x\n", iobase);
+ exit(1);
+ }
+ } else
+#endif
+ if (parport_init_direct_flags(iobase, ppflags)) {
+ g_error("no parport found at 0x%x\n", iobase);
+ exit(1);
+ }
+ /*
+ * The following code was added by Glade to create one of each component
+ * (except popup menus), just so that you see something after building
+ * the project. Delete any components that you don't want shown initially.
+ */
+ aboutdialog = create_aboutdialog();
+ //ioconfig = create_ioconfiglinux();
+ mainwindow = create_mainwindow();
+ aboutdialog = create_aboutdialog();
+ dtmfwindow = create_dtmfwindow();
+ scopewindow = create_scopewindow();
+ spectrumwindow = create_spectrumwindow();
+ gtk_widget_show(mainwindow);
+ audio_ptt(ptt);
+ audio_setsquelch(squelch);
+ gtk_main();
+ reset_modem();
+ return 0;
+}
diff --git a/eppfm2/src/support.c b/eppfm2/src/support.c
new file mode 100644
index 0000000..ec73acc
--- /dev/null
+++ b/eppfm2/src/support.c
@@ -0,0 +1,158 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+
+#include <gtk/gtk.h>
+
+#include "support.h"
+
+/* This is an internally used function to check if a pixmap file exists. */
+static gchar* check_file_exists (const gchar *directory,
+ const gchar *filename);
+
+/* This is an internally used function to create pixmaps. */
+static GtkWidget* create_dummy_pixmap (GtkWidget *widget);
+
+GtkWidget*
+lookup_widget (GtkWidget *widget,
+ const gchar *widget_name)
+{
+ GtkWidget *parent, *found_widget;
+
+ for (;;)
+ {
+ if (GTK_IS_MENU (widget))
+ parent = gtk_menu_get_attach_widget (GTK_MENU (widget));
+ else
+ parent = widget->parent;
+ if (parent == NULL)
+ break;
+ widget = parent;
+ }
+
+ found_widget = (GtkWidget*) gtk_object_get_data (GTK_OBJECT (widget),
+ widget_name);
+ if (!found_widget)
+ g_warning ("Widget not found: %s", widget_name);
+ return found_widget;
+}
+
+/* This is a dummy pixmap we use when a pixmap can't be found. */
+static char *dummy_pixmap_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"1 1 1 1",
+" c None",
+/* pixels */
+" "
+};
+
+/* This is an internally used function to create pixmaps. */
+static GtkWidget*
+create_dummy_pixmap (GtkWidget *widget)
+{
+ GdkColormap *colormap;
+ GdkPixmap *gdkpixmap;
+ GdkBitmap *mask;
+ GtkWidget *pixmap;
+
+ colormap = gtk_widget_get_colormap (widget);
+ gdkpixmap = gdk_pixmap_colormap_create_from_xpm_d (NULL, colormap, &mask,
+ NULL, dummy_pixmap_xpm);
+ if (gdkpixmap == NULL)
+ g_error ("Couldn't create replacement pixmap.");
+ pixmap = gtk_pixmap_new (gdkpixmap, mask);
+ gdk_pixmap_unref (gdkpixmap);
+ gdk_bitmap_unref (mask);
+ return pixmap;
+}
+
+static GList *pixmaps_directories = NULL;
+
+/* Use this function to set the directory containing installed pixmaps. */
+void
+add_pixmap_directory (const gchar *directory)
+{
+ pixmaps_directories = g_list_prepend (pixmaps_directories,
+ g_strdup (directory));
+}
+
+/* This is an internally used function to create pixmaps. */
+GtkWidget*
+create_pixmap (GtkWidget *widget,
+ const gchar *filename)
+{
+ gchar *found_filename = NULL;
+ GdkColormap *colormap;
+ GdkPixmap *gdkpixmap;
+ GdkBitmap *mask;
+ GtkWidget *pixmap;
+ GList *elem;
+
+ /* We first try any pixmaps directories set by the application. */
+ elem = pixmaps_directories;
+ while (elem)
+ {
+ found_filename = check_file_exists ((gchar*)elem->data, filename);
+ if (found_filename)
+ break;
+ elem = elem->next;
+ }
+
+ /* If we haven't found the pixmap, try the source directory. */
+ if (!found_filename)
+ {
+ found_filename = check_file_exists ("../pixmaps", filename);
+ }
+
+ if (!found_filename)
+ {
+ g_warning (_("Couldn't find pixmap file: %s"), filename);
+ return create_dummy_pixmap (widget);
+ }
+
+ colormap = gtk_widget_get_colormap (widget);
+ gdkpixmap = gdk_pixmap_colormap_create_from_xpm (NULL, colormap, &mask,
+ NULL, found_filename);
+ if (gdkpixmap == NULL)
+ {
+ g_warning (_("Error loading pixmap file: %s"), found_filename);
+ g_free (found_filename);
+ return create_dummy_pixmap (widget);
+ }
+ g_free (found_filename);
+ pixmap = gtk_pixmap_new (gdkpixmap, mask);
+ gdk_pixmap_unref (gdkpixmap);
+ gdk_bitmap_unref (mask);
+ return pixmap;
+}
+
+/* This is an internally used function to check if a pixmap file exists. */
+gchar*
+check_file_exists (const gchar *directory,
+ const gchar *filename)
+{
+ gchar *full_filename;
+ struct stat s;
+ gint status;
+
+ full_filename = (gchar*) g_malloc (strlen (directory) + 1
+ + strlen (filename) + 1);
+ strcpy (full_filename, directory);
+ strcat (full_filename, G_DIR_SEPARATOR_S);
+ strcat (full_filename, filename);
+
+ status = stat (full_filename, &s);
+ if (status == 0 && S_ISREG (s.st_mode))
+ return full_filename;
+ g_free (full_filename);
+ return NULL;
+}
+
diff --git a/eppfm2/src/support.h b/eppfm2/src/support.h
new file mode 100644
index 0000000..e8bfb5a
--- /dev/null
+++ b/eppfm2/src/support.h
@@ -0,0 +1,57 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#include <gtk/gtk.h>
+
+/*
+ * Standard gettext macros.
+ */
+#ifdef ENABLE_NLS
+# include <libintl.h>
+# undef _
+# define _(String) dgettext (PACKAGE, String)
+# ifdef gettext_noop
+# define N_(String) gettext_noop (String)
+# else
+# define N_(String) (String)
+# endif
+#else
+# define textdomain(String) (String)
+# define gettext(String) (String)
+# define dgettext(Domain,Message) (Message)
+# define dcgettext(Domain,Message,Type) (Message)
+# define bindtextdomain(Domain,Directory) (Domain)
+# define _(String) (String)
+# define N_(String) (String)
+#endif
+
+
+/*
+ * Public Functions.
+ */
+
+/*
+ * This function returns a widget in a component created by Glade.
+ * Call it with the toplevel widget in the component (i.e. a window/dialog),
+ * or alternatively any widget in the component, and the name of the widget
+ * you want returned.
+ */
+GtkWidget* lookup_widget (GtkWidget *widget,
+ const gchar *widget_name);
+
+/* get_widget() is deprecated. Use lookup_widget instead. */
+#define get_widget lookup_widget
+
+/* Use this function to set the directory containing installed pixmaps. */
+void add_pixmap_directory (const gchar *directory);
+
+
+/*
+ * Private Functions.
+ */
+
+/* This is used to create the pixmaps in the interface. */
+GtkWidget* create_pixmap (GtkWidget *widget,
+ const gchar *filename);
+
diff --git a/eppfm2/src/widgets.c b/eppfm2/src/widgets.c
new file mode 100644
index 0000000..39fa0fc
--- /dev/null
+++ b/eppfm2/src/widgets.c
@@ -0,0 +1,615 @@
+/*
+ * Custom Widgets
+ * Copyright (C) 1999 Thomas Sailer <sailer at ife.ee.ethz.ch>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <math.h>
+#include "widgets.h"
+#include <gtk/gtkgc.h>
+#include <gtk/gtkmain.h>
+
+#define SCOPEMAXPOINTS 512
+#define PRIO G_PRIORITY_LOW
+
+struct _ScopePoint {
+ guint16 dx;
+ guint16 y;
+};
+
+static void scope_class_init(ScopeClass *klass);
+static void scope_init(Scope *trace);
+static void scope_finalize(GtkObject *object);
+static gint scope_expose(GtkWidget *widget, GdkEventExpose *event);
+static void scope_size_request(GtkWidget *widget, GtkRequisition *requisition);
+static gint scope_idle_callback(gpointer data);
+
+static GtkWidgetClass *scope_parent_class = NULL;
+static ScopeClass *scope_class = NULL;
+
+
+guint scope_get_type(void)
+{
+ static guint trace_type = 0;
+
+ if (!trace_type)
+ {
+ static const GtkTypeInfo trace_info =
+ {
+ "Scope",
+ sizeof(Scope),
+ sizeof(ScopeClass),
+ (GtkClassInitFunc) scope_class_init,
+ (GtkObjectInitFunc) scope_init,
+ /* reserved_1 */ NULL,
+ /* reserved_2 */ NULL,
+ (GtkClassInitFunc) NULL,
+ };
+ trace_type = gtk_type_unique(gtk_widget_get_type(), &trace_info);
+ }
+ return trace_type;
+}
+
+static void scope_class_init(ScopeClass *klass)
+{
+ GtkObjectClass *object_class;
+ GtkWidgetClass *widget_class;
+
+ object_class = (GtkObjectClass*)klass;
+ widget_class = (GtkWidgetClass*)klass;
+
+ scope_parent_class = gtk_type_class(gtk_widget_get_type());
+ scope_class = klass;
+
+ object_class->finalize = scope_finalize;
+ widget_class->size_request = scope_size_request;
+ widget_class->expose_event = scope_expose;
+}
+
+static void scope_init(Scope *trace)
+{
+ GTK_WIDGET_SET_FLAGS(trace, GTK_NO_WINDOW);
+
+ trace->idlefunc = 0;
+
+ /* initialize the colors */
+ trace->zerolinecol.red = 65535;
+ trace->zerolinecol.green = 13107;
+ trace->zerolinecol.blue = 0;
+ trace->samplingcol.red = 13763;
+ trace->samplingcol.green = 42598;
+ trace->samplingcol.blue = 5243;
+ trace->zeroline_gc = trace->sampling_gc = NULL;
+ /* initialize the trace history */
+ trace->ptnum = trace->ptptr = 0;
+ trace->pt = NULL;
+}
+
+
+static void scope_size_request(GtkWidget *widget, GtkRequisition *requisition)
+{
+ Scope *trace;
+
+ g_return_if_fail(widget != NULL);
+ g_return_if_fail(IS_SCOPE(widget));
+ g_return_if_fail(requisition != NULL);
+ trace = SCOPE(widget);
+ requisition->width = MIN(trace->ptnum * 4, 512);
+ requisition->height = 256;
+}
+
+
+GtkWidget* scope_new(char *name, char *str1, char *str2, gint int1, gint int2)
+{
+ Scope *trace;
+
+ trace = gtk_type_new(scope_get_type());
+ trace->ptnum = CLAMP(int1, 2, SCOPEMAXPOINTS);;
+ trace->pt = g_malloc0(trace->ptnum * sizeof(struct _ScopePoint));
+ return GTK_WIDGET(trace);
+}
+
+static void scope_finalize(GtkObject *object)
+{
+ Scope *trace;
+
+ g_return_if_fail(object != NULL);
+ g_return_if_fail(IS_SCOPE(object));
+ trace = SCOPE(object);
+ if (trace->idlefunc)
+ gtk_idle_remove(trace->idlefunc);
+ if (trace->zeroline_gc)
+ gtk_gc_release(trace->zeroline_gc);
+ if (trace->sampling_gc)
+ gtk_gc_release(trace->sampling_gc);
+ if (trace->pt)
+ g_free(trace->pt);
+ (*GTK_OBJECT_CLASS(scope_parent_class)->finalize)(object);
+}
+
+static gint scope_expose(GtkWidget *widget, GdkEventExpose *event)
+{
+ Scope *trace;
+
+ g_return_val_if_fail(widget != NULL, FALSE);
+ g_return_val_if_fail(IS_SCOPE(widget), FALSE);
+ g_return_val_if_fail (event != NULL, FALSE);
+ if (GTK_WIDGET_DRAWABLE(widget)) {
+ trace = SCOPE(widget);
+ if (!trace->idlefunc)
+ trace->idlefunc = gtk_idle_add_priority(PRIO, scope_idle_callback, trace);
+ }
+ return FALSE;
+}
+
+static void scope_draw(Scope *trace)
+{
+ GdkGCValues gc_values;
+ guint totx, idx, i, si;
+ guint32 mulx, muly, zeroy, x;
+ GdkPoint p[SCOPEMAXPOINTS+1];
+ GdkSegment s[SCOPEMAXPOINTS];
+
+ /* init gc's if necessary */
+ if (!trace->zeroline_gc) {
+ if (!gdk_color_alloc(trace->widget.style->colormap, &trace->zerolinecol))
+ g_warning("unable to allocate color: ( %d %d %d )",
+ trace->zerolinecol.red, trace->zerolinecol.green, trace->zerolinecol.blue);
+ gc_values.foreground = trace->zerolinecol;
+ trace->zeroline_gc = gtk_gc_get(trace->widget.style->depth,
+ trace->widget.style->colormap,
+ &gc_values, GDK_GC_FOREGROUND);
+ }
+ if (!trace->sampling_gc) {
+ if (!gdk_color_alloc(trace->widget.style->colormap, &trace->samplingcol))
+ g_warning("unable to allocate color: ( %d %d %d )",
+ trace->samplingcol.red, trace->samplingcol.green, trace->samplingcol.blue);
+ gc_values.foreground = trace->samplingcol;
+ trace->sampling_gc = gtk_gc_get(trace->widget.style->depth,
+ trace->widget.style->colormap,
+ &gc_values, GDK_GC_FOREGROUND);
+ }
+ /* first determine the total x size and calculate multiplication factors */
+ for (totx = 0, idx = trace->ptptr, i = 1; i < trace->ptnum; i++) {
+ idx++;
+ if (idx >= trace->ptnum)
+ idx = 0;
+ totx += trace->pt[idx].dx & 0x7fff;
+ }
+ mulx = (((guint32)trace->widget.allocation.width) << 16) / MAX(totx, 1);
+ muly = trace->widget.allocation.height;
+ zeroy = (0x8000 * muly) >> 16;
+ /* prepare sampling ticks and lines */
+ for (si = x = i = 0, idx = trace->ptptr; i < trace->ptnum; i++) {
+ p[i].x = trace->widget.allocation.x + ((x * mulx) >> 16);
+ p[i].y = trace->widget.allocation.y + ((trace->pt[idx].y * muly) >> 16);
+ if (trace->pt[idx].dx & 0x8000) {
+ s[si].x1 = s[si].x2 = p[i].x;
+ s[si].y1 = trace->widget.allocation.y + zeroy - 4;
+ s[si].y2 = trace->widget.allocation.y + zeroy + 4;
+ si++;
+ }
+ idx++;
+ if (idx >= trace->ptnum)
+ idx = 0;
+ x += trace->pt[idx].dx & 0x7fff;
+ }
+ /* now draw everything */
+ gdk_draw_rectangle(trace->widget.window, trace->widget.style->base_gc[trace->widget.state],
+ TRUE, trace->widget.allocation.x, trace->widget.allocation.y,
+ trace->widget.allocation.x+trace->widget.allocation.width,
+ trace->widget.allocation.y+trace->widget.allocation.height);
+ gdk_draw_line(trace->widget.window, trace->zeroline_gc,
+ trace->widget.allocation.x,
+ trace->widget.allocation.y+zeroy,
+ trace->widget.allocation.x+trace->widget.allocation.width-1,
+ trace->widget.allocation.y+zeroy);
+ gdk_draw_segments(trace->widget.window, trace->sampling_gc, s, si);
+ gdk_draw_lines(trace->widget.window, trace->widget.style->fg_gc[trace->widget.state],
+ p, trace->ptnum);
+}
+
+
+static gint scope_idle_callback(gpointer data)
+{
+ g_return_val_if_fail(data != NULL, FALSE);
+ g_return_val_if_fail(IS_SCOPE(data), FALSE);
+ SCOPE(data)->idlefunc = 0;
+ if (!GTK_WIDGET_DRAWABLE(GTK_WIDGET(data)))
+ return FALSE;
+ if (!SCOPE(data)->pt || !SCOPE(data)->ptnum)
+ return FALSE;
+ scope_draw(SCOPE(data));
+ return FALSE; /* don't call this callback again */
+}
+
+
+void scope_addvalue(Scope *trace, guint16 deltax, gint16 y, guint flags)
+{
+ g_return_if_fail(trace != NULL);
+ g_return_if_fail(IS_SCOPE(trace));
+ trace->pt[trace->ptptr].y = 32767-y;
+ trace->pt[trace->ptptr].dx = deltax & 0x7fff;
+ if (flags)
+ trace->pt[trace->ptptr].dx |= 0x8000;
+ trace->ptptr++;
+ if (trace->ptptr >= trace->ptnum)
+ trace->ptptr = 0;
+ if (GTK_WIDGET_DRAWABLE(GTK_WIDGET(trace))) {
+ if (!trace->idlefunc)
+ trace->idlefunc = gtk_idle_add_priority(PRIO, scope_idle_callback, trace);
+ }
+}
+
+void scope_addvalues(Scope *trace, guint num, guint16 *deltax, gint16 *y)
+{
+ guint i;
+
+ g_return_if_fail(trace != NULL);
+ g_return_if_fail(IS_SCOPE(trace));
+ g_return_if_fail(y != NULL);
+ for (i = 0; i < num; i++) {
+ trace->pt[trace->ptptr].y = 32767-y[i];
+ trace->pt[trace->ptptr].dx = deltax ? (deltax[i] & 0x7fff) : 1;
+ trace->ptptr++;
+ if (trace->ptptr >= trace->ptnum)
+ trace->ptptr = 0;
+ }
+ if (GTK_WIDGET_DRAWABLE(GTK_WIDGET(trace))) {
+ if (!trace->idlefunc)
+ trace->idlefunc = gtk_idle_add_priority(PRIO, scope_idle_callback, trace);
+ }
+}
+
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ * This fft routine is from ~gabriel/src/filters/fft/fft.c;
+ * I am unsure of the original source. The file contains no
+ * copyright notice or description.
+ * The declaration is changed to the prototype form but the
+ * function body is unchanged. (J. T. Buck)
+ */
+
+#define SWAP(a, b) tempr=(a); (a)=(b); (b)=tempr
+
+/*
+ * Replace data by its discrete Fourier transform, if isign is
+ * input as 1, or by its inverse discrete Fourier transform, if
+ * "isign" is input as -1. "data'"is a complex array of length "nn",
+ * input as a real array data[0..2*nn-1]. "nn" MUST be an integer
+ * power of 2 (this is not checked for!?)
+ */
+
+static void fft_rif(float *data, int nn, int isign) {
+ int n;
+ int mmax;
+ int m, j, istep, i;
+ float wtemp, wr, wpr, wpi, wi, theta;
+ float tempr, tempi;
+
+ data--;
+ n = nn << 1;
+ j = 1;
+
+ for (i = 1; i < n; i += 2) {
+ if(j > i) {
+ SWAP(data[j], data[i]);
+ SWAP(data[j+1], data[i+1]);
+ }
+ m= n >> 1;
+ while (m >= 2 && j >m) {
+ j -= m;
+ m >>= 1;
+ }
+ j += m;
+ }
+ mmax = 2;
+ while (n > mmax) {
+ istep = 2*mmax;
+ theta = -6.28318530717959/(isign*mmax);
+ wtemp = sin(0.5*theta);
+ wpr = -2.0*wtemp*wtemp;
+ wpi = sin(theta);
+ wr = 1.0;
+ wi = 0.0;
+ for (m = 1; m < mmax; m += 2) {
+ for (i = m; i < n; i += istep) {
+ j = i + mmax;
+ tempr = wr*data[j] - wi*data[j+1];
+ tempi = wr*data[j+1] + wi*data[j];
+ data[j] = data[i] - tempr;
+ data[j+1] = data[i+1] - tempi;
+ data[i] += tempr;
+ data[i+1] += tempi;
+ }
+ wr = (wtemp=wr)*wpr - wi*wpi+wr;
+ wi = wi*wpr + wtemp*wpi + wi;
+ }
+ mmax = istep;
+ }
+}
+
+#undef SWAP
+
+static inline float hamming(float x)
+{
+ return 0.54-0.46*cos(2*M_PI*x);
+}
+
+/* ---------------------------------------------------------------------- */
+
+#define SPECTRUMMAXPOINTS 1024
+
+static void spectrum_class_init(SpectrumClass *klass);
+static void spectrum_init(Spectrum *trace);
+static void spectrum_finalize(GtkObject *object);
+static gint spectrum_expose(GtkWidget *widget, GdkEventExpose *event);
+static void spectrum_size_request(GtkWidget *widget, GtkRequisition *requisition);
+static gint spectrum_idle_callback(gpointer data);
+
+static GtkWidgetClass *spectrum_parent_class = NULL;
+static SpectrumClass *spectrum_class = NULL;
+
+
+guint spectrum_get_type(void)
+{
+ static guint trace_type = 0;
+
+ if (!trace_type)
+ {
+ static const GtkTypeInfo trace_info =
+ {
+ "Spectrum",
+ sizeof(Spectrum),
+ sizeof(SpectrumClass),
+ (GtkClassInitFunc) spectrum_class_init,
+ (GtkObjectInitFunc) spectrum_init,
+ /* reserved_1 */ NULL,
+ /* reserved_2 */ NULL,
+ (GtkClassInitFunc) NULL,
+ };
+ trace_type = gtk_type_unique(gtk_widget_get_type(), &trace_info);
+ }
+ return trace_type;
+}
+
+static void spectrum_class_init(SpectrumClass *klass)
+{
+ GtkObjectClass *object_class;
+ GtkWidgetClass *widget_class;
+
+ object_class = (GtkObjectClass*)klass;
+ widget_class = (GtkWidgetClass*)klass;
+
+ spectrum_parent_class = gtk_type_class(gtk_widget_get_type());
+ spectrum_class = klass;
+
+ object_class->finalize = spectrum_finalize;
+ widget_class->size_request = spectrum_size_request;
+ widget_class->expose_event = spectrum_expose;
+}
+
+static void spectrum_init(Spectrum *trace)
+{
+ GTK_WIDGET_SET_FLAGS(trace, GTK_NO_WINDOW);
+
+ trace->idlefunc = 0;
+
+ /* initialize the colors */
+ trace->gridcol.red = 65535;
+ trace->gridcol.green = 13107;
+ trace->gridcol.blue = 0;
+ trace->samplingcol.red = 13763;
+ trace->samplingcol.green = 42598;
+ trace->samplingcol.blue = 5243;
+ trace->grid_gc = trace->sampling_gc = NULL;
+ /* initialize the trace history */
+ trace->ptnum = trace->ptptr = 0;
+ trace->pt = NULL;
+}
+
+
+static void spectrum_size_request(GtkWidget *widget, GtkRequisition *requisition)
+{
+ Spectrum *trace;
+
+ g_return_if_fail(widget != NULL);
+ g_return_if_fail(IS_SPECTRUM(widget));
+ g_return_if_fail(requisition != NULL);
+ trace = SPECTRUM(widget);
+ requisition->width = MIN(trace->ptnum * 4, 512);
+ requisition->height = 256;
+}
+
+
+GtkWidget* spectrum_new(char *name, char *str1, char *str2, gint int1, gint int2)
+{
+ guint i, j;
+ Spectrum *trace;
+
+ trace = gtk_type_new(spectrum_get_type());
+ i = CLAMP(int1, 4, SPECTRUMMAXPOINTS);
+ j = 0;
+ while (i > 1) {
+ i >>= 1;
+ j++;
+ }
+ trace->ptnum = 1 << j;
+ trace->pt = g_malloc0(trace->ptnum * sizeof(gint16));
+ return GTK_WIDGET(trace);
+}
+
+static void spectrum_finalize(GtkObject *object)
+{
+ Spectrum *trace;
+
+ g_return_if_fail(object != NULL);
+ g_return_if_fail(IS_SPECTRUM(object));
+ trace = SPECTRUM(object);
+ if (trace->idlefunc)
+ gtk_idle_remove(trace->idlefunc);
+ if (trace->grid_gc)
+ gtk_gc_release(trace->grid_gc);
+ if (trace->sampling_gc)
+ gtk_gc_release(trace->sampling_gc);
+ if (trace->pt)
+ g_free(trace->pt);
+ (*GTK_OBJECT_CLASS(spectrum_parent_class)->finalize)(object);
+}
+
+static gint spectrum_expose(GtkWidget *widget, GdkEventExpose *event)
+{
+ Spectrum *trace;
+
+ g_return_val_if_fail(widget != NULL, FALSE);
+ g_return_val_if_fail(IS_SPECTRUM(widget), FALSE);
+ g_return_val_if_fail (event != NULL, FALSE);
+ if (GTK_WIDGET_DRAWABLE(widget)) {
+ trace = SPECTRUM(widget);
+ if (!trace->idlefunc)
+ trace->idlefunc = gtk_idle_add_priority(PRIO, spectrum_idle_callback, trace);
+ }
+ return FALSE;
+}
+
+static void spectrum_draw(Spectrum *trace)
+{
+ GdkGCValues gc_values;
+ guint idx, i;
+ guint32 mulx;
+ gint y;
+ GdkPoint p[SPECTRUMMAXPOINTS/2+1];
+ float f[2*SPECTRUMMAXPOINTS];
+ float ftmp1, ftmp2, ftmp3;
+
+ /* init gc's if necessary */
+ if (!trace->grid_gc) {
+ if (!gdk_color_alloc(trace->widget.style->colormap, &trace->gridcol))
+ g_warning("unable to allocate color: ( %d %d %d )",
+ trace->gridcol.red, trace->gridcol.green, trace->gridcol.blue);
+ gc_values.foreground = trace->gridcol;
+ trace->grid_gc = gtk_gc_get(trace->widget.style->depth,
+ trace->widget.style->colormap,
+ &gc_values, GDK_GC_FOREGROUND);
+ }
+ if (!trace->sampling_gc) {
+ if (!gdk_color_alloc(trace->widget.style->colormap, &trace->samplingcol))
+ g_warning("unable to allocate color: ( %d %d %d )",
+ trace->samplingcol.red, trace->samplingcol.green, trace->samplingcol.blue);
+ gc_values.foreground = trace->samplingcol;
+ trace->sampling_gc = gtk_gc_get(trace->widget.style->depth,
+ trace->widget.style->colormap,
+ &gc_values, GDK_GC_FOREGROUND);
+ }
+ /* first determine the total x size and calculate multiplication factors */
+ ftmp1 = 1.0 / (float)trace->ptnum;
+ for (idx = trace->ptptr, i = 0; i < trace->ptnum; i++) {
+ f[2*i] = trace->pt[idx] * hamming((float)i * ftmp1);
+ f[2*i+1] = 0;
+ idx++;
+ if (idx >= trace->ptnum)
+ idx = 0;
+ }
+ fft_rif(f, trace->ptnum, 1);
+ mulx = (((guint32)trace->widget.allocation.width) << 17) / trace->ptnum;
+ /* prepare sampling ticks and lines */
+ ftmp2 = trace->widget.allocation.height * 0.0723824136504; /* 1/ln(10^6) */
+ ftmp3 = 21.4875015613 + 4.6;
+ for (i = 0; i < trace->ptnum / 2; i++) {
+ ftmp1 = f[2*i] * f[2*i] + f[2*i+1] * f[2*i+1];
+ if (ftmp1 < 2168)
+ p[i].y = trace->widget.allocation.y + trace->widget.allocation.height - 1;
+ else {
+ y = ftmp2 * (ftmp3 - log(ftmp1));
+ y = CLAMP(y, 0, trace->widget.allocation.height-1);
+ p[i].y = trace->widget.allocation.y + y;
+ }
+ p[i].x = trace->widget.allocation.x + ((i * mulx) >> 16);
+ }
+ /* now draw everything */
+ gdk_draw_rectangle(trace->widget.window, trace->widget.style->base_gc[trace->widget.state],
+ TRUE, trace->widget.allocation.x, trace->widget.allocation.y,
+ trace->widget.allocation.x+trace->widget.allocation.width,
+ trace->widget.allocation.y+trace->widget.allocation.height);
+ for (i = 0; i < 3; i++)
+ gdk_draw_line(trace->widget.window, trace->grid_gc,
+ trace->widget.allocation.x,
+ trace->widget.allocation.y+i*(trace->widget.allocation.height/3),
+ trace->widget.allocation.x+trace->widget.allocation.width-1,
+ trace->widget.allocation.y+i*(trace->widget.allocation.height/3));
+ gdk_draw_line(trace->widget.window, trace->grid_gc,
+ trace->widget.allocation.x,
+ trace->widget.allocation.y+trace->widget.allocation.height-1,
+ trace->widget.allocation.x+trace->widget.allocation.width-1,
+ trace->widget.allocation.y+trace->widget.allocation.height-1);
+ gdk_draw_lines(trace->widget.window, trace->widget.style->fg_gc[trace->widget.state],
+ p, trace->ptnum / 2);
+}
+
+
+static gint spectrum_idle_callback(gpointer data)
+{
+ g_return_val_if_fail(data != NULL, FALSE);
+ g_return_val_if_fail(IS_SPECTRUM(data), FALSE);
+ SPECTRUM(data)->idlefunc = 0;
+ if (!GTK_WIDGET_DRAWABLE(GTK_WIDGET(data)))
+ return FALSE;
+ if (!SPECTRUM(data)->pt || !SPECTRUM(data)->ptnum)
+ return FALSE;
+ spectrum_draw(SPECTRUM(data));
+ return FALSE; /* don't call this callback again */
+}
+
+
+void spectrum_addvalue(Spectrum *trace, gint16 y)
+{
+ g_return_if_fail(trace != NULL);
+ g_return_if_fail(IS_SPECTRUM(trace));
+ trace->pt[trace->ptptr] = y;
+ trace->ptptr++;
+ if (trace->ptptr >= trace->ptnum)
+ trace->ptptr = 0;
+ if (GTK_WIDGET_DRAWABLE(GTK_WIDGET(trace))) {
+ if (!trace->idlefunc)
+ trace->idlefunc = gtk_idle_add_priority(PRIO, spectrum_idle_callback, trace);
+ }
+}
+
+void spectrum_addvalues(Spectrum *trace, guint num, gint16 *y)
+{
+ guint i;
+
+ g_return_if_fail(trace != NULL);
+ g_return_if_fail(IS_SPECTRUM(trace));
+ g_return_if_fail(y != NULL);
+ for (i = 0; i < num; i++) {
+ trace->pt[trace->ptptr] = y[i];
+ trace->ptptr++;
+ if (trace->ptptr >= trace->ptnum)
+ trace->ptptr = 0;
+ }
+ if (GTK_WIDGET_DRAWABLE(GTK_WIDGET(trace))) {
+ if (!trace->idlefunc)
+ trace->idlefunc = gtk_idle_add_priority(PRIO, spectrum_idle_callback, trace);
+ }
+}
diff --git a/eppfm2/src/widgets.h b/eppfm2/src/widgets.h
new file mode 100644
index 0000000..5172553
--- /dev/null
+++ b/eppfm2/src/widgets.h
@@ -0,0 +1,102 @@
+/*
+ * Custom Widgets
+ * Copyright (C) 1999 Thomas Sailer <sailer at ife.ee.ethz.ch>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __WIDGETS_H__
+#define __WIDGETS_H__
+
+#include <gdk/gdk.h>
+#include <gtk/gtkwidget.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#define SCOPE(obj) GTK_CHECK_CAST(obj, scope_get_type(), Scope)
+#define SCOPE_CLASS(klass) GTK_CHECK_CLASS_CAST(klass, scope_get_type(), ScopeClass)
+#define IS_SCOPE(obj) GTK_CHECK_TYPE(obj, scope_get_type())
+
+typedef struct _Scope Scope;
+typedef struct _ScopeClass ScopeClass;
+
+struct _Scope
+{
+ GtkWidget widget;
+
+ guint idlefunc;
+ GdkGC *zeroline_gc;
+ GdkGC *sampling_gc;
+ GdkColor zerolinecol;
+ GdkColor samplingcol;
+
+ struct _ScopePoint *pt;
+ guint ptnum, ptptr;
+};
+
+struct _ScopeClass
+{
+ GtkWidgetClass parent_class;
+};
+
+
+guint scope_get_type(void);
+GtkWidget* scope_new(gchar *widget_name, gchar *str1, gchar *str2, gint int1, gint int2);
+void scope_addvalue(Scope *trace, guint16 deltax, gint16 y, guint flags);
+void scope_addvalues(Scope *trace, guint num, guint16 *deltax, gint16 *y);
+
+
+#define SPECTRUM(obj) GTK_CHECK_CAST(obj, spectrum_get_type(), Spectrum)
+#define SPECTRUM_CLASS(klass) GTK_CHECK_CLASS_CAST(klass, spectrum_get_type(), SpectrumClass)
+#define IS_SPECTRUM(obj) GTK_CHECK_TYPE(obj, spectrum_get_type())
+
+typedef struct _Spectrum Spectrum;
+typedef struct _SpectrumClass SpectrumClass;
+
+struct _Spectrum
+{
+ GtkWidget widget;
+
+ guint idlefunc;
+ GdkGC *grid_gc;
+ GdkGC *sampling_gc;
+ GdkColor gridcol;
+ GdkColor samplingcol;
+
+ gint16 *pt;
+ guint ptnum, ptptr;
+};
+
+struct _SpectrumClass
+{
+ GtkWidgetClass parent_class;
+};
+
+
+guint spectrum_get_type(void);
+GtkWidget* spectrum_new(gchar *widget_name, gchar *str1, gchar *str2, gint int1, gint int2);
+void spectrum_addvalue(Spectrum *trace, gint16 y);
+void spectrum_addvalues(Spectrum *trace, guint num, gint16 *y);
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+#endif /* __WIDGETS_H__ */
diff --git a/flexdrv/Makefile.am b/flexdrv/Makefile.am
new file mode 100644
index 0000000..3676247
--- /dev/null
+++ b/flexdrv/Makefile.am
@@ -0,0 +1,30 @@
+EXTRA_DIST = bayeppflex.c bayeppflex.rc driver.c drv32.h flexdriv.def flexdrv.h resource.h
+
+INCLUDES = -I$(top_srcdir)/intl -I$(top_srcdir) -I$(top_srcdir)/misc -I$(top_srcdir)/main
+
+
+if WIN32
+
+noinst_LIBRARIES = libflxdrv.a
+
+libflxdrv_a_SOURCES = driver.c bayeppflex.c
+
+bayeppflex.res: bayeppflex.rc resource.h
+ $(WINDRES) $< -O coff -o $@
+
+DLLNAME = bayeppflex
+DLLOBJ = driver.o bayeppflex.o bayeppflex.res ../main/libinit.a ../main/libresident.a ../main/libresident2.a ../main/libmisc.a
+DLLLDARGS =
+DLLDEF = --def $(srcdir)/flexdriv.def
+
+noinst_SCRIPTS = $(DLLNAME).dll
+
+$(DLLNAME).dll: $(DLLOBJ)
+ $(CC) -mdll -mno-cygwin -Wl,--base-file,$(DLLNAME).base -o $(DLLNAME).dll $(DLLOBJ) $(DLLLDARGS)
+ $(DLLTOOL) --as=$(AS) --dllname $(DLLNAME).dll $(DLLDEF) --base-file $(DLLNAME).base --output-exp $(DLLNAME).exp $(DLLOBJ)
+ $(CC) -mdll -mno-cygwin -Wl,--base-file,$(DLLNAME).base,$(DLLNAME).exp -o $(DLLNAME).dll $(DLLOBJ) $(DLLLDARGS)
+ $(DLLTOOL) --as=$(AS) --dllname $(DLLNAME).dll $(DLLDEF) --base-file $(DLLNAME).base --output-exp $(DLLNAME).exp $(DLLOBJ)
+ $(CC) -mdll -mno-cygwin -Wl,$(DLLNAME).exp -o $(DLLNAME).dll $(DLLOBJ) $(DLLLDARGS)
+ $(DLLTOOL) --as=$(AS) --dllname $(DLLNAME).dll $(DLLDEF) --output-lib lib$(DLLNAME).a $(DLLOBJ)
+
+endif
diff --git a/flexdrv/Makefile.in b/flexdrv/Makefile.in
new file mode 100644
index 0000000..10d7539
--- /dev/null
+++ b/flexdrv/Makefile.in
@@ -0,0 +1,333 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AS = @AS@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+DATADIRNAME = @DATADIRNAME@
+DLLTOOL = @DLLTOOL@
+DRVLIBOBJS = @DRVLIBOBJS@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+HAVE_BITTYPES = @HAVE_BITTYPES@
+HAVE_DIRECTX = @HAVE_DIRECTX@
+HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@
+HAVE_IOFUNCS = @HAVE_IOFUNCS@
+HAVE_LIB = @HAVE_LIB@
+HAVE_MKISS = @HAVE_MKISS@
+HAVE_PPKDRV = @HAVE_PPKDRV@
+HAVE_PPUSER = @HAVE_PPUSER@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LIB = @LIB@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LTLIB = @LTLIB@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+M_PI = @M_PI@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+
+EXTRA_DIST = bayeppflex.c bayeppflex.rc driver.c drv32.h flexdriv.def flexdrv.h resource.h
+
+INCLUDES = -I$(top_srcdir)/intl -I$(top_srcdir) -I$(top_srcdir)/misc -I$(top_srcdir)/main
+
+ at WIN32_TRUE@noinst_LIBRARIES = @WIN32_TRUE at libflxdrv.a
+
+ at WIN32_TRUE@libflxdrv_a_SOURCES = @WIN32_TRUE at driver.c bayeppflex.c
+
+ at WIN32_TRUE@DLLNAME = @WIN32_TRUE at bayeppflex
+ at WIN32_TRUE@DLLOBJ = @WIN32_TRUE at driver.o bayeppflex.o bayeppflex.res ../main/libinit.a ../main/libresident.a ../main/libresident2.a ../main/libmisc.a
+ at WIN32_TRUE@DLLLDARGS =
+ at WIN32_TRUE@DLLDEF = @WIN32_TRUE at --def $(srcdir)/flexdriv.def
+
+ at WIN32_TRUE@noinst_SCRIPTS = @WIN32_TRUE@$(DLLNAME).dll
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libflxdrv_a_LIBADD =
+ at WIN32_TRUE@libflxdrv_a_OBJECTS = driver.$(OBJEXT) bayeppflex.$(OBJEXT)
+SCRIPTS = $(noinst_SCRIPTS)
+
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+SOURCES = $(libflxdrv_a_SOURCES)
+OBJECTS = $(libflxdrv_a_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .obj .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps flexdrv/Makefile
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-noinstLIBRARIES:
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+distclean-noinstLIBRARIES:
+
+maintainer-clean-noinstLIBRARIES:
+
+.c.o:
+ $(COMPILE) -c $<
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+ $(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+ -rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+libflxdrv.a: $(libflxdrv_a_OBJECTS) $(libflxdrv_a_DEPENDENCIES)
+ -rm -f libflxdrv.a
+ $(AR) cru libflxdrv.a $(libflxdrv_a_OBJECTS) $(libflxdrv_a_LIBADD)
+ $(RANLIB) libflxdrv.a
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = flexdrv
+
+distdir: $(DISTFILES)
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile $(LIBRARIES) $(SCRIPTS)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \
+ mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-noinstLIBRARIES clean-compile clean-tags clean-generic \
+ mostlyclean-am
+
+clean: clean-am
+
+distclean-am: distclean-noinstLIBRARIES distclean-compile \
+ distclean-tags distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-noinstLIBRARIES \
+ maintainer-clean-compile maintainer-clean-tags \
+ maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
+clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile tags mostlyclean-tags distclean-tags \
+clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
+check-am installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+ at WIN32_TRUE@bayeppflex.res: bayeppflex.rc resource.h
+ at WIN32_TRUE@ $(WINDRES) $< -O coff -o $@
+
+ at WIN32_TRUE@$(DLLNAME).dll: $(DLLOBJ)
+ at WIN32_TRUE@ $(CC) -mdll -mno-cygwin -Wl,--base-file,$(DLLNAME).base -o $(DLLNAME).dll $(DLLOBJ) $(DLLLDARGS)
+ at WIN32_TRUE@ $(DLLTOOL) --as=$(AS) --dllname $(DLLNAME).dll $(DLLDEF) --base-file $(DLLNAME).base --output-exp $(DLLNAME).exp $(DLLOBJ)
+ at WIN32_TRUE@ $(CC) -mdll -mno-cygwin -Wl,--base-file,$(DLLNAME).base,$(DLLNAME).exp -o $(DLLNAME).dll $(DLLOBJ) $(DLLLDARGS)
+ at WIN32_TRUE@ $(DLLTOOL) --as=$(AS) --dllname $(DLLNAME).dll $(DLLDEF) --base-file $(DLLNAME).base --output-exp $(DLLNAME).exp $(DLLOBJ)
+ at WIN32_TRUE@ $(CC) -mdll -mno-cygwin -Wl,$(DLLNAME).exp -o $(DLLNAME).dll $(DLLOBJ) $(DLLLDARGS)
+ at WIN32_TRUE@ $(DLLTOOL) --as=$(AS) --dllname $(DLLNAME).dll $(DLLDEF) --output-lib lib$(DLLNAME).a $(DLLOBJ)
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/flexdrv/bayeppflex.c b/flexdrv/bayeppflex.c
new file mode 100644
index 0000000..2e57f85
--- /dev/null
+++ b/flexdrv/bayeppflex.c
@@ -0,0 +1,1520 @@
+/*****************************************************************************/
+
+/*
+ * bayeppflex.c -- FlexNet driver for Baycom EPPFLEX modem.
+ *
+ * Copyright (C) 1999-2001
+ * Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *
+ * History:
+ * 0.1 23.06.1999 Created
+ * 0.2 07.01.2000 Expanded to usbdevfs capabilities
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <windows.h>
+#include <windowsx.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "flexdrv.h"
+#include "resource.h"
+
+#include "fpga.h"
+
+/* --------------------------------------------------------------------- */
+
+#define DRIVER_NAME "Baycom EPPFLEX"
+#define DRIVER_VERSION "0.2"
+
+#define RXBUFFER_SIZE ((MAXFLEN*6U/5U)+8U)
+#define TXBUFFER_SIZE 8192U /* must be a power of 2 and >= MAXFLEN*6/5+8 */
+
+#define MODE_EPP 0
+#define MODE_ECP 1
+#define MODE_EPPAFSK 2
+#define MODE_EPPCONV 3 /* conventional modem */
+
+#define NRBIOSPORTS 4
+#define BIOSLPTADDR 0x408
+
+static struct state {
+ volatile unsigned int active;
+ volatile unsigned int terminate;
+ volatile unsigned int rxactive;
+
+ unsigned int verblevel;
+ unsigned int mode;
+ unsigned int ioaddr;
+ unsigned int isnt;
+ unsigned int w9xportmode;
+ unsigned int portflags;
+ struct adapter_config config;
+ unsigned int txdelay;
+ unsigned int fullduplex;
+ unsigned int calib;
+ unsigned int leds;
+
+ byte baud;
+ byte flexmode;
+ byte status;
+
+ unsigned int scale;
+
+ HANDLE hdevlife;
+ HANDLE htxmutex;
+
+ L1FRAME txframe;
+ L1FRAME rxframe;
+ L1_STATISTICS stat;
+
+ unsigned char rxbuf[512];
+ unsigned int rxptr, rxlen;
+
+ struct {
+ unsigned rd, wr;
+ unsigned char buf[TXBUFFER_SIZE];
+ } htx;
+
+ struct {
+ unsigned int bitbuf, bitstream, numbits, state;
+ unsigned char *bufptr;
+ int bufcnt;
+ unsigned char buf[RXBUFFER_SIZE];
+ } hrx;
+
+ unsigned short biosports[NRBIOSPORTS];
+ HANDLE hlpt;
+} state = { 0, };
+
+#define REGISTRYPATH "SOFTWARE\\FlexNet\\BaycomUSB"
+#define REGHKEY HKEY_LOCAL_MACHINE
+
+/* ------------------------------------------------------------------------- */
+
+int lprintf(unsigned vl, const char *format, ...)
+{
+ va_list ap;
+ char buf[512];
+ int r;
+
+ if (vl > state.verblevel)
+ return 0;
+ va_start(ap, format);
+ r = vsnprintf(buf, sizeof(buf), format, ap);
+ va_end(ap);
+ OutputDebugString(buf);
+ return r;
+}
+
+extern inline int iopl(unsigned int level)
+{
+ OSVERSIONINFO info;
+
+ info.dwOSVersionInfoSize = sizeof(info);
+ if (GetVersionEx(&info) &&
+ (info.dwPlatformId == VER_PLATFORM_WIN32s ||
+ info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS))
+ return 0;
+ return 1;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * the CRC routines are stolen from WAMPES
+ * by Dieter Deyke
+ */
+
+const u_int16_t crc_ccitt_table[0x100] = {
+ 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
+ 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
+ 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
+ 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
+ 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
+ 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
+ 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
+ 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
+ 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
+ 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
+ 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
+ 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
+ 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
+ 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
+ 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
+ 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
+ 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
+ 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
+ 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
+ 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
+ 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
+ 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
+ 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
+ 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
+ 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
+ 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
+ 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
+ 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
+ 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
+ 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
+ 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
+ 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
+};
+
+/* ---------------------------------------------------------------------- */
+
+static inline u_int16_t calc_crc_ccitt(const u_int8_t *buffer, int len)
+{
+ u_int16_t crc = 0xffff;
+
+ for (;len>0;len--)
+ crc = (crc >> 8) ^ crc_ccitt_table[(crc ^ *buffer++) & 0xff];
+ crc ^= 0xffff;
+ return crc;
+}
+
+static inline void append_crc_ccitt(u_int8_t *buffer, int len)
+{
+ u_int16_t crc = calc_crc_ccitt(buffer, len);
+ buffer[len] = crc;
+ buffer[len+1] = crc >> 8;
+}
+
+static inline int check_crc_ccitt(const u_int8_t *buffer, int len)
+{
+ u_int16_t crc = calc_crc_ccitt(buffer, len);
+ return (crc & 0xffff) == 0x0f47;
+}
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ * high performance HDLC encoder
+ * yes, it's ugly, but generates pretty good code
+ */
+
+#define ENCODEITERA(j) \
+({ \
+ if (!(notbitstream & (0x1f0 << j))) \
+ goto stuff##j; \
+ encodeend##j: \
+})
+
+#define ENCODEITERB(j) \
+({ \
+ stuff##j: \
+ bitstream &= ~(0x100 << j); \
+ bitbuf = (bitbuf & (((2 << j) << numbit) - 1)) | \
+ ((bitbuf & ~(((2 << j) << numbit) - 1)) << 1); \
+ numbit++; \
+ notbitstream = ~bitstream; \
+ goto encodeend##j; \
+})
+
+static void hdlc_encode(unsigned char *pkt, unsigned int len)
+{
+ unsigned bitstream, notbitstream, bitbuf, numbit;
+ unsigned wr = state.htx.wr;
+
+ append_crc_ccitt(pkt, len);
+ len += 2;
+ bitstream = 0;
+ bitbuf = 0x7e;
+ numbit = 8; /* opening flag */
+ while (numbit >= 8) {
+ state.htx.buf[wr] = bitbuf;
+ wr = (wr + 1) % TXBUFFER_SIZE;
+ if (wr == state.htx.rd)
+ *(int *)0 = 0; /* must not happen! */
+ bitbuf >>= 8;
+ numbit -= 8;
+ }
+ for (; len > 0; len--, pkt++) {
+ bitstream >>= 8;
+ bitstream |= ((unsigned int)*pkt) << 8;
+ bitbuf |= ((unsigned int)*pkt) << numbit;
+ notbitstream = ~bitstream;
+ ENCODEITERA(0);
+ ENCODEITERA(1);
+ ENCODEITERA(2);
+ ENCODEITERA(3);
+ ENCODEITERA(4);
+ ENCODEITERA(5);
+ ENCODEITERA(6);
+ ENCODEITERA(7);
+ goto enditer;
+ ENCODEITERB(0);
+ ENCODEITERB(1);
+ ENCODEITERB(2);
+ ENCODEITERB(3);
+ ENCODEITERB(4);
+ ENCODEITERB(5);
+ ENCODEITERB(6);
+ ENCODEITERB(7);
+ enditer:
+ numbit += 8;
+ while (numbit >= 8) {
+ state.htx.buf[wr] = bitbuf;
+ wr = (wr + 1) % TXBUFFER_SIZE;
+ if (wr == state.htx.rd)
+ *(int *)0 = 0; /* must not happen! */
+ bitbuf >>= 8;
+ numbit -= 8;
+ }
+ }
+ bitbuf |= 0x7e7e << numbit;
+ numbit += 16;
+ while (numbit >= 8) {
+ state.htx.buf[wr] = bitbuf;
+ wr = (wr + 1) % TXBUFFER_SIZE;
+ if (wr == state.htx.rd)
+ *(int *)0 = 0; /* must not happen! */
+ bitbuf >>= 8;
+ numbit -= 8;
+ }
+ state.htx.wr = wr;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static inline void do_rxpacket(void)
+{
+ if (state.hrx.bufcnt < 3 || state.hrx.bufcnt > MAXFLEN)
+ return;
+ if (!check_crc_ccitt(state.hrx.buf, state.hrx.bufcnt))
+ return;
+ memcpy(state.rxframe.frame, state.hrx.buf, state.hrx.bufcnt-2);
+ state.rxframe.len = state.hrx.bufcnt-2;
+ state.rxframe.txdelay = 0;
+ state.rxframe.kanal = 0;
+ state.stat.rx_frames++;
+}
+
+#define DECODEITERA(j) \
+({ \
+ if (!(notbitstream & (0x0fc << j))) /* flag or abort */ \
+ goto flgabrt##j; \
+ if ((bitstream & (0x1f8 << j)) == (0xf8 << j)) /* stuffed bit */ \
+ goto stuff##j; \
+ enditer##j: \
+})
+
+#define DECODEITERB(j) \
+({ \
+ flgabrt##j: \
+ if (!(notbitstream & (0x1fc << j))) { /* abort received */ \
+ st = 0; \
+ goto enditer##j; \
+ } \
+ if ((bitstream & (0x1fe << j)) != (0x0fc << j)) /* flag received */ \
+ goto enditer##j; \
+ if (st) \
+ do_rxpacket(); \
+ state.hrx.bufcnt = 0; \
+ state.hrx.bufptr = state.hrx.buf; \
+ st = 1; \
+ numbits = 7-j; \
+ goto enditer##j; \
+ stuff##j: \
+ numbits--; \
+ bitbuf = (bitbuf & ((~0xff) << j)) | ((bitbuf & ~((~0xff) << j)) << 1); \
+ goto enditer##j; \
+})
+
+static inline void hdlc_receive(void)
+{
+ unsigned bits, bitbuf, notbitstream, bitstream, numbits, st;
+
+ /* start of HDLC decoder */
+ numbits = state.hrx.numbits;
+ st = state.hrx.state;
+ bitstream = state.hrx.bitstream;
+ bitbuf = state.hrx.bitbuf;
+ while (state.rxptr < state.rxlen && !state.rxframe.len) {
+ bits = state.rxbuf[state.rxptr++];
+ bitstream >>= 8;
+ bitstream |= ((unsigned int)bits) << 8;
+ bitbuf >>= 8;
+ bitbuf |= ((unsigned int)bits) << 8;
+ numbits += 8;
+ notbitstream = ~bitstream;
+ DECODEITERA(0);
+ DECODEITERA(1);
+ DECODEITERA(2);
+ DECODEITERA(3);
+ DECODEITERA(4);
+ DECODEITERA(5);
+ DECODEITERA(6);
+ DECODEITERA(7);
+ goto enddec;
+ DECODEITERB(0);
+ DECODEITERB(1);
+ DECODEITERB(2);
+ DECODEITERB(3);
+ DECODEITERB(4);
+ DECODEITERB(5);
+ DECODEITERB(6);
+ DECODEITERB(7);
+ enddec:
+ while (st && numbits >= 8) {
+ if (state.hrx.bufcnt >= RXBUFFER_SIZE) {
+ st = 0;
+ } else {
+ *(state.hrx.bufptr)++ = bitbuf >> (16-numbits);
+ state.hrx.bufcnt++;
+ numbits -= 8;
+ }
+ }
+ }
+ state.hrx.numbits = numbits;
+ state.hrx.state = st;
+ state.hrx.bitstream = bitstream;
+ state.hrx.bitbuf = bitbuf;
+}
+
+/* ----------------------------------------------------------------------- */
+
+/*
+ * Treiber-Init. Sofern mehrfach aufgerufen, kommt vorher jeweils l1_exit()
+ * Hier also alle Ressourcen allokieren, aber noch nicht starten sofern
+ * dazu die Parameter gebraucht werden. Die kommen spaeter per l1_init_kanal()
+ */
+
+static void saveparams(HKEY hKey)
+{
+ DWORD val;
+
+ val = state.verblevel;
+ RegSetValueEx(hKey, "verblevel", 0, REG_DWORD, (void *)&val, sizeof(val));
+ val = state.mode;
+ RegSetValueEx(hKey, "mode", 0, REG_DWORD, (void *)&val, sizeof(val));
+ val = state.ioaddr;
+ RegSetValueEx(hKey, "ioaddr", 0, REG_DWORD, (void *)&val, sizeof(val));
+ val = state.portflags;
+ RegSetValueEx(hKey, "portflags", 0, REG_DWORD, (void *)&val, sizeof(val));
+ val = state.w9xportmode;
+ RegSetValueEx(hKey, "w9xportmode", 0, REG_DWORD, (void *)&val, sizeof(val));
+ val = state.config.fclk;
+ RegSetValueEx(hKey, "fclk", 0, REG_DWORD, (void *)&val, sizeof(val));
+ val = state.config.bitrate;
+ RegSetValueEx(hKey, "bitrate", 0, REG_DWORD, (void *)&val, sizeof(val));
+ val = state.config.intclk;
+ RegSetValueEx(hKey, "intclk", 0, REG_DWORD, (void *)&val, sizeof(val));
+ val = state.config.extmodem;
+ RegSetValueEx(hKey, "extmodem", 0, REG_DWORD, (void *)&val, sizeof(val));
+ val = state.config.loopback;
+ RegSetValueEx(hKey, "loopback", 0, REG_DWORD, (void *)&val, sizeof(val));
+ val = state.config.extstat;
+ RegSetValueEx(hKey, "extstat", 0, REG_DWORD, (void *)&val, sizeof(val));
+ val = state.config.pttmute;
+ RegSetValueEx(hKey, "pttmute", 0, REG_DWORD, (void *)&val, sizeof(val));
+ val = state.config.filtmode;
+ RegSetValueEx(hKey, "filtmode", 0, REG_DWORD, (void *)&val, sizeof(val));
+ val = state.config.gain;
+ RegSetValueEx(hKey, "gain", 0, REG_DWORD, (void *)&val, sizeof(val));
+ val = state.txdelay;
+ RegSetValueEx(hKey, "txdelay", 0, REG_DWORD, (void *)&val, sizeof(val));
+ val = state.fullduplex;
+ RegSetValueEx(hKey, "fullduplex", 0, REG_DWORD, (void *)&val, sizeof(val));
+}
+
+int init_device(HKEY hKey)
+{
+ DWORD regtype, reglen, regval;
+ unsigned int i;
+ unsigned short baddr;
+
+ /* read params from registry */
+ reglen = sizeof(regval);
+ if (RegQueryValueEx(hKey, "verblevel", NULL, ®type, (void *)®val, ®len) != ERROR_SUCCESS || regtype != REG_DWORD)
+ regval = 10;
+ state.verblevel = regval;
+ reglen = sizeof(regval);
+ if (RegQueryValueEx(hKey, "mode", NULL, ®type, (void *)®val, ®len) != ERROR_SUCCESS || regtype != REG_DWORD)
+ regval = MODE_EPP;
+ state.mode = regval;
+ reglen = sizeof(regval);
+ if (RegQueryValueEx(hKey, "ioaddr", NULL, ®type, (void *)®val, ®len) != ERROR_SUCCESS || regtype != REG_DWORD)
+ regval = 0;
+ state.ioaddr = regval;
+ reglen = sizeof(regval);
+ if (RegQueryValueEx(hKey, "portflags", NULL, ®type, (void *)®val, ®len) != ERROR_SUCCESS || regtype != REG_DWORD)
+ regval = 0;
+ state.portflags = regval;
+ reglen = sizeof(regval);
+ if (RegQueryValueEx(hKey, "w9xportmode", NULL, ®type, (void *)®val, ®len) != ERROR_SUCCESS || regtype != REG_DWORD)
+ regval = 0;
+ state.w9xportmode = regval;
+ reglen = sizeof(regval);
+ if (RegQueryValueEx(hKey, "fclk", NULL, ®type, (void *)®val, ®len) != ERROR_SUCCESS || regtype != REG_DWORD)
+ regval = 19666600;
+ state.config.fclk = regval;
+ reglen = sizeof(regval);
+ if (RegQueryValueEx(hKey, "bitrate", NULL, ®type, (void *)®val, ®len) != ERROR_SUCCESS || regtype != REG_DWORD)
+ regval = 9600;
+ state.config.bitrate = regval;
+ reglen = sizeof(regval);
+ if (RegQueryValueEx(hKey, "intclk", NULL, ®type, (void *)®val, ®len) != ERROR_SUCCESS || regtype != REG_DWORD)
+ regval = 0;
+ state.config.intclk = regval;
+ reglen = sizeof(regval);
+ if (RegQueryValueEx(hKey, "extmodem", NULL, ®type, (void *)®val, ®len) != ERROR_SUCCESS || regtype != REG_DWORD)
+ regval = 0;
+ state.config.extmodem = regval;
+ reglen = sizeof(regval);
+ if (RegQueryValueEx(hKey, "loopback", NULL, ®type, (void *)®val, ®len) != ERROR_SUCCESS || regtype != REG_DWORD)
+ regval = 0;
+ state.config.loopback = regval;
+ reglen = sizeof(regval);
+ if (RegQueryValueEx(hKey, "extstat", NULL, ®type, (void *)®val, ®len) != ERROR_SUCCESS || regtype != REG_DWORD)
+ regval = 1;
+ state.config.extstat = regval;
+ reglen = sizeof(regval);
+ if (RegQueryValueEx(hKey, "pttmute", NULL, ®type, (void *)®val, ®len) != ERROR_SUCCESS || regtype != REG_DWORD)
+ regval = 1;
+ state.config.pttmute = regval;
+ reglen = sizeof(regval);
+ if (RegQueryValueEx(hKey, "filtmode", NULL, ®type, (void *)®val, ®len) != ERROR_SUCCESS || regtype != REG_DWORD)
+ regval = 0;
+ state.config.filtmode = regval;
+ reglen = sizeof(regval);
+ if (RegQueryValueEx(hKey, "gain", NULL, ®type, (void *)®val, ®len) != ERROR_SUCCESS || regtype != REG_DWORD)
+ regval = 1;
+ state.config.gain = regval;
+ reglen = sizeof(regval);
+ if (RegQueryValueEx(hKey, "txdelay", NULL, ®type, (void *)®val, ®len) != ERROR_SUCCESS || regtype != REG_DWORD)
+ regval = 0;
+ state.txdelay = regval;
+ reglen = sizeof(regval);
+ if (RegQueryValueEx(hKey, "fullduplex", NULL, ®type, (void *)®val, ®len) != ERROR_SUCCESS || regtype != REG_DWORD)
+ regval = 0;
+ state.fullduplex = regval;
+ /* save params to registry */
+ saveparams(hKey);
+ /* init hdlc */
+ memset(&state.htx, 0, sizeof(state.htx));
+ memset(&state.hrx, 0, sizeof(state.hrx));
+ state.terminate = state.rxactive = state.active = 0;
+ state.status = CH_DEAD;
+ state.hdevlife = CreateEvent(NULL, FALSE, FALSE, "FlexNet Device State");
+ state.htxmutex = CreateMutex(NULL, FALSE, NULL);
+ state.isnt = iopl(3);
+ memset(state.biosports, 0, sizeof(state.biosports));
+ state.hlpt = INVALID_HANDLE_VALUE;
+ if (!state.isnt) {
+ for (i = 0; i < NRBIOSPORTS; i++) {
+ if (!ReadProcessMemory(GetCurrentProcess(), (void *)(BIOSLPTADDR+i*sizeof(baddr)), &baddr, sizeof(baddr), ®len) ||
+ reglen != sizeof(baddr))
+ break;
+ if (!baddr)
+ break;
+ state.biosports[i] = baddr;
+ lprintf(10, "BIOS Port %u: 0x%04x\n", i, baddr);
+ }
+#if 0
+ state.hlpt = CreateFile("\\\\.\\LPT1", GENERIC_READ | GENERIC_WRITE,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL, OPEN_EXISTING, 0, NULL);
+#endif
+ }
+ state.leds = 0;
+ return 1;
+}
+
+/* ------------------------------------------------------------------------- */
+
+void l1_exit(HKEY hKey)
+{
+ state.terminate = 1;
+ saveparams(hKey);
+ while (state.rxactive)
+ Sleep(10);
+ CloseHandle(state.hdevlife);
+ CloseHandle(state.htxmutex);
+ /* unload sys driver if NT */
+ if (state.isnt || !state.w9xportmode)
+ parport_stop_win();
+ if (state.hlpt != INVALID_HANDLE_VALUE)
+ CloseHandle(state.hlpt);
+}
+
+/* ------------------------------------------------------------------------- */
+
+byte *config_info(byte kanal)
+{
+ if (state.active) {
+ switch (state.mode) {
+ case MODE_EPP:
+ return "EPPFLEX (EPP)";
+
+ case MODE_ECP:
+ return "EPPFLEX (ECP)";
+
+ case MODE_EPPAFSK:
+ return "EPPFLEX (AFSK)";
+
+ case MODE_EPPCONV:
+ return "EPP Conventional";
+ }
+ }
+ return "EPPFLEX (inactive/error)";
+}
+
+/* ------------------------------------------------------------------------- */
+
+static BOOL CALLBACK EdParmDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ HWND hcombo;
+ char buf[32];
+ unsigned int i, j;
+
+ switch (uMsg) {
+ case WM_INITDIALOG:
+ hcombo = GetDlgItem(hDlg, IDC_PORT);
+ if (state.isnt) {
+ SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)"LPT1");
+ SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)"LPT2");
+ SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)"LPT3");
+ if (state.ioaddr > 3) {
+ snprintf(buf, sizeof(buf), "LPT%u", state.ioaddr);
+ SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)buf);
+ ComboBox_SetCurSel(hcombo, 3);
+ } else
+ ComboBox_SetCurSel(hcombo, state.ioaddr-1);
+ } else {
+ for (j = !!state.ioaddr, i = 0; i < NRBIOSPORTS; i++) {
+ if (!state.biosports[i])
+ break;
+ snprintf(buf, sizeof(buf), "LPT%u", i+1);
+ SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)buf);
+ if ((state.ioaddr == state.biosports[i] && state.w9xportmode) ||
+ (state.ioaddr-1 == i && !state.w9xportmode)) {
+ j = 0;
+ ComboBox_SetCurSel(hcombo, i);
+ }
+ }
+ if (j) {
+ if (state.w9xportmode)
+ snprintf(buf, sizeof(buf), "0x%x", state.ioaddr);
+ else
+ snprintf(buf, sizeof(buf), "LPT%u", state.ioaddr);
+ SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)buf);
+ ComboBox_SetCurSel(hcombo, i);
+ }
+ }
+ hcombo = GetDlgItem(hDlg, IDC_MODE);
+ SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)"EPP");
+ SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)"ECP");
+ SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)"EPPAFSK");
+ SendMessage(hcombo, CB_ADDSTRING, 0, (LPARAM)"EPP Conventional");
+ ComboBox_SetCurSel(hcombo, state.mode);
+ snprintf(buf, sizeof(buf), "%d", state.txdelay);
+ SetDlgItemText(hDlg, IDC_TXDELAY, buf);
+ CheckDlgButton(hDlg, IDC_FULLDUPLEX, state.fullduplex ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hDlg, IDC_EXTMODEM, state.config.extmodem ? BST_CHECKED : BST_UNCHECKED);
+ snprintf(buf, sizeof(buf), "%d", state.config.bitrate);
+ SetDlgItemText(hDlg, IDC_BITRATE, buf);
+ CheckDlgButton(hDlg, IDC_PTTMUTE, state.config.pttmute ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hDlg, IDC_FORCEHWEPP, (state.portflags & PPFLAG_FORCEHWEPP) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hDlg, IDC_SWEMULEPP, (state.portflags & PPFLAG_SWEMULEPP) ? BST_CHECKED : BST_UNCHECKED);
+ CheckDlgButton(hDlg, IDC_SWEMULECP, (state.portflags & PPFLAG_SWEMULECP) ? BST_CHECKED : BST_UNCHECKED);
+ SetWindowText(hDlg, DRIVER_NAME" Configuration");
+ break;
+
+ case WM_COMMAND:
+ switch (GET_WM_COMMAND_ID(wParam, lParam)) {
+ case IDCANCEL:
+ EndDialog(hDlg, 0);
+ break;
+
+ case IDOK:
+ GetDlgItemText(hDlg, IDC_PORT, buf, sizeof(buf));
+ if (state.isnt) {
+ if (strncmp(buf, "LPT", 3))
+ state.ioaddr = 0;
+ else
+ state.ioaddr = strtoul(buf+3, NULL, 0);
+ } else {
+ if (buf[0] == 'L' && buf[1] == 'P' && buf[2] == 'T' && buf[4] == 0 &&
+ buf[3] >= '1' && buf[3] < '1' + NRBIOSPORTS) {
+ if(state.w9xportmode)
+ state.ioaddr = state.biosports[buf[3] - '1'];
+ else
+ state.ioaddr = buf[3] - '0';
+ } else if (state.w9xportmode)
+ state.ioaddr = strtoul(buf, NULL, 0);
+ else
+ state.ioaddr = 0;
+ }
+ GetDlgItemText(hDlg, IDC_MODE, buf, sizeof(buf));
+ if (!strcmp(buf, "EPP Conventional"))
+ state.mode = 3;
+ else if (!strcmp(buf, "EPPAFSK"))
+ state.mode = 2;
+ else if (!strcmp(buf, "ECP"))
+ state.mode = 1;
+ else
+ state.mode = 0;
+ GetDlgItemText(hDlg, IDC_TXDELAY, buf, sizeof(buf));
+ state.txdelay = strtoul(buf, NULL, 0);
+ state.fullduplex = IsDlgButtonChecked(hDlg, IDC_FULLDUPLEX) == BST_CHECKED;
+ state.config.extmodem = IsDlgButtonChecked(hDlg, IDC_EXTMODEM) == BST_CHECKED;
+ GetDlgItemText(hDlg, IDC_BITRATE, buf, sizeof(buf));
+ state.config.bitrate = strtoul(buf, NULL, 0);
+ state.config.pttmute = IsDlgButtonChecked(hDlg, IDC_PTTMUTE) == BST_CHECKED;
+ if (IsDlgButtonChecked(hDlg, IDC_FORCEHWEPP) == BST_CHECKED)
+ state.portflags |= PPFLAG_FORCEHWEPP;
+ else
+ state.portflags &= ~PPFLAG_FORCEHWEPP;
+ if (IsDlgButtonChecked(hDlg, IDC_SWEMULEPP) == BST_CHECKED)
+ state.portflags |= PPFLAG_SWEMULEPP;
+ else
+ state.portflags &= ~PPFLAG_SWEMULEPP;
+ if (IsDlgButtonChecked(hDlg, IDC_SWEMULECP) == BST_CHECKED)
+ state.portflags |= PPFLAG_SWEMULECP;
+ else
+ state.portflags &= ~PPFLAG_SWEMULECP;
+ EndDialog(hDlg, 1);
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
+/* ------------------------------------------------------------------------- */
+
+int config_device(byte max_channels, HWND hDlg, byte channel)
+{
+ int restart = DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hDlg, EdParmDlgProc, 0);
+
+ if (restart)
+ state.active = 0;
+ return restart;
+}
+
+/* ------------------------------------------------------------------------- */
+
+u16 l1_get_ch_cnt(void)
+{
+ return 1;
+
+}
+
+/* ------------------------------------------------------------------------- */
+
+byte get_txdelay(byte kanal)
+{
+ return state.txdelay / 10;
+}
+
+void set_txdelay(byte kanal, byte delay)
+{
+ state.txdelay = 10 * delay;
+}
+
+u16 get_mode(byte kanal)
+{
+ return (state.flexmode & ~MODE_d) | (state.fullduplex ? MODE_d : 0);
+}
+
+u16 get_baud(byte kanal)
+{
+ return state.baud;
+}
+
+/* ------------------------------------------------------------------------- */
+
+byte l1_init_kanal(byte kanal, u16 chbaud, u16 chmode)
+{
+ state.flexmode = chmode;
+ return (state.ioaddr != 0);
+}
+
+/* ------------------------------------------------------------------------- */
+
+byte l1_ch_active(byte kanal)
+{
+ return (state.ioaddr != 0);
+}
+
+/* ------------------------------------------------------------------------- */
+
+char far *l1_ident(byte kanal)
+{
+ return DRIVER_NAME;
+}
+
+/* ------------------------------------------------------------------------- */
+
+char far *l1_version(byte kanal)
+{
+ return DRIVER_VERSION;
+}
+
+/* ------------------------------------------------------------------------- */
+
+L1_STATISTICS far *l1_stat(byte kanal, byte delete)
+{
+ L1_STATISTICS *p = &state.stat;
+
+ if (delete)
+ p->tx_error = p->rx_overrun = p->rx_bufferoverflow =
+ p->tx_frames = p->rx_frames = p->io_error = 0;
+ return p;
+}
+
+/* ------------------------------------------------------------------------- */
+
+void set_led(byte kanal, byte ledcode)
+{
+ state.leds = ledcode;
+}
+
+/* ------------------------------------------------------------------------- */
+
+byte l1_ch_state(byte kanal)
+{
+ return state.status;
+}
+
+/* ------------------------------------------------------------------------- */
+
+u16 l1_scale(byte kanal)
+{
+ return state.scale;
+}
+
+/* ------------------------------------------------------------------------- */
+
+void l1_tx_calib(byte kanal, byte minutes)
+{
+ state.calib = minutes * state.config.bitrate * 60 / 8;
+}
+
+
+/* ------------------------------------------------------------------------- */
+
+L1FRAME far *l1_get_framebuf(byte kanal)
+{
+ return &state.txframe;
+}
+
+byte l1_tx_frame(void)
+{
+ unsigned int i;
+
+ if (state.txframe.kanal || !state.active)
+ return 1;
+ WaitForSingleObject(state.htxmutex, INFINITE);
+ if (state.htx.rd == state.htx.wr) {
+ /* need tx delay */
+ i = state.txframe.txdelay * state.config.bitrate / 800;
+ if (!i)
+ i = 1;
+ if (i > TXBUFFER_SIZE-1)
+ i = TXBUFFER_SIZE-1;
+ memset(state.htx.buf, 0x7e, i);
+ state.htx.rd = 0;
+ state.htx.wr = i;
+ }
+ i = (TXBUFFER_SIZE - 1 + state.htx.rd - state.htx.wr) % TXBUFFER_SIZE;
+ if (i < state.txframe.len*6/5+32) {
+ ReleaseMutex(state.htxmutex);
+ return 0;
+ }
+ /* remove tail if possible */
+ if (i < TXBUFFER_SIZE-8)
+ state.htx.wr = (state.htx.wr + TXBUFFER_SIZE-8) % TXBUFFER_SIZE;
+ hdlc_encode(state.txframe.frame, state.txframe.len);
+ /* add tail */
+ for (i = 0; i < 8; i++) {
+ state.htx.buf[state.htx.wr] = 0x7e;
+ state.htx.wr = (state.htx.wr + 1) % TXBUFFER_SIZE;
+ }
+ ReleaseMutex(state.htxmutex);
+ state.stat.tx_frames++;
+ return 1;
+}
+
+/* ------------------------------------------------------------------------- */
+
+static int hdlc_transmit(byte *pkt, int cnt)
+{
+ int totcnt = 0;
+ unsigned int xcnt;
+
+ WaitForSingleObject(state.htxmutex, INFINITE);
+ while (cnt > 0) {
+ if (state.htx.rd == state.htx.wr) {
+ if (!state.calib)
+ break;
+ xcnt = cnt;
+ if (xcnt > state.calib)
+ xcnt = state.calib;
+ memset(pkt, 0x7e, xcnt);
+ pkt += xcnt;
+ totcnt += xcnt;
+ cnt -= xcnt;
+ state.calib -= xcnt;
+ break;
+ }
+ if (state.htx.wr >= state.htx.rd)
+ xcnt = state.htx.wr - state.htx.rd;
+ else
+ xcnt = TXBUFFER_SIZE - state.htx.rd;
+ if (xcnt > cnt)
+ xcnt = cnt;
+ if (!xcnt)
+ break;
+ memcpy(pkt, &state.htx.buf[state.htx.rd], xcnt);
+ pkt += xcnt;
+ totcnt += xcnt;
+ cnt -= xcnt;
+ state.htx.rd = (state.htx.rd + xcnt) % TXBUFFER_SIZE;
+ }
+ ReleaseMutex(state.htxmutex);
+ return totcnt;
+}
+
+/*
+ * RX-Thread. Wartet auf RX-Bytes, verarbeitet sie und returned wenn
+ * Handle zu oder Paket komplett
+ */
+
+L1FRAME far *l1_rx_frame(void)
+{
+ unsigned int i;
+ unsigned char eio[2048];
+ unsigned char ctreg;
+ byte stat;
+ byte statecp[6];
+ SYSTEMTIME tm1, tm2;
+ unsigned int msec, bitrate, bytecnt;
+ int cnt, icnt, ocnt, icntx, ocntx;
+
+ state.rxactive = 1;
+ state.rxframe.len = 0;
+ if (state.terminate) {
+ state.rxactive = 0;
+ return NULL;
+ }
+ /* check if startup is needed */
+ if (!state.active) {
+ if (!state.ioaddr)
+ goto errwait;
+ /* init parport; distinguish between NT and 9x case */
+ if (state.isnt || !state.w9xportmode)
+ cnt = parport_init_win_flags(state.ioaddr-1, state.portflags);
+ else if (state.w9xportmode == 1)
+ cnt = parport_init_w9xring0_flags(state.ioaddr, state.portflags);
+ else
+ cnt = parport_init_direct_flags(state.ioaddr, state.portflags);
+ if (cnt) {
+ lprintf(10, "Cannot open Parport at address/number 0x%04x\n", state.ioaddr);
+ state.ioaddr = 0;
+ goto errwait;
+ }
+ bytecnt = 0;
+ /* autoprobe bitrate */
+ switch (state.mode) {
+ case MODE_EPP:
+ if (adapter_start_epp(&state.config)) {
+ lprintf(0, "Error configuring EPP mode\n");
+ goto errwait;
+ }
+ /* reset modem */
+ eio[0] = 0;
+ eio[1] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+ if (parport_epp_write_addr(eio, 2) != 2)
+ goto errparport;
+ GetSystemTime(&tm1);
+ for (;;) {
+ if (parport_epp_read_addr(&stat, 1) != 1)
+ goto errparport;
+ /* try to determine the FIFO count if in extended mode */
+ if (state.config.extstat) {
+ eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE|1;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errparport;
+ if (parport_epp_read_addr(eio, 2) != 2)
+ goto errparport;
+ icnt = eio[0] | (((unsigned int)eio[1]) << 8);
+ eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errparport;
+ icnt &= 0x7fff;
+ } else {
+ /* determine RX fifo size from status bits */
+ switch (stat & (EPP_NRAEF|EPP_NRHF)) {
+ case EPP_NRHF:
+ icnt = 0;
+ break;
+
+ case EPP_NRAEF:
+ icnt = 1025;
+ break;
+
+ case 0:
+ icnt = 1793;
+ break;
+
+ default:
+ icnt = 256;
+ break;
+ }
+ }
+ /* rx */
+ while (icnt > 0) {
+ cnt = icnt;
+ if (cnt > sizeof(eio))
+ cnt = sizeof(eio);
+ icnt -= cnt;
+ bytecnt += cnt;
+ if (parport_epp_read_data(eio, cnt) != cnt)
+ goto errparport;
+ }
+ GetSystemTime(&tm2);
+ msec = (60000 + tm2.wSecond * 1000U + tm2.wMilliseconds - tm1.wSecond * 1000U - tm1.wMilliseconds) % 60000;
+ if (msec >= 500)
+ break;
+ Sleep(10);
+ if (state.terminate) {
+ state.rxactive = 0;
+ return NULL;
+ }
+ }
+ /* reset modem */
+ eio[0] = 0;
+ eio[1] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+ if (parport_epp_write_addr(eio, 2) != 2)
+ goto errparport;
+ break;
+
+ case MODE_ECP:
+ if (adapter_start_ecp(&state.config)) {
+ lprintf(0, "Error configuring EPP mode\n");
+ goto errwait;
+ }
+ eio[0] = 0xaf; /* reset register: all reset */
+ eio[1] = 0xa0; /* reset register: terminate reset */
+ eio[2] = 0xb0;
+ if (parport_ecp_write_addr(eio, 3) != 3)
+ goto errparport;
+ GetSystemTime(&tm1);
+ for (;;) {
+ eio[0] = 0x81;
+ if (parport_ecp_write_addr(eio, 1) != 1)
+ goto errparport;
+ if (parport_ecp_read_data(statecp, 6) != 6)
+ goto errparport;
+ eio[0] = 0x80;
+ if (parport_ecp_write_addr(eio, 1) != 1)
+ goto errparport;
+ icnt = ((unsigned)statecp[2] << 8) | statecp[1];
+ /* read */
+ while (icnt > 0) {
+ cnt = icnt;
+ if (cnt > sizeof(eio))
+ cnt = sizeof(eio);
+ icnt -= cnt;
+ bytecnt += cnt;
+ eio[0] = 0xc0 | (cnt & 0xf);
+ eio[1] = 0xd0 | ((cnt >> 4) & 0xf);
+ eio[2] = 0xe0 | ((cnt >> 8) & 0xf);
+ if (parport_ecp_write_addr(eio, 3) != 3)
+ goto errparport;
+ if (parport_ecp_read_data(eio, cnt) != cnt)
+ goto errparport;
+ }
+ GetSystemTime(&tm2);
+ msec = (60000 + tm2.wSecond * 1000U + tm2.wMilliseconds - tm1.wSecond * 1000U - tm1.wMilliseconds) % 60000;
+ if (msec >= 500)
+ break;
+ Sleep(10);
+ if (state.terminate) {
+ state.rxactive = 0;
+ return NULL;
+ }
+ }
+ eio[0] = 0xaf; /* reset register: all reset */
+ eio[1] = 0xa0; /* reset register: terminate reset */
+ eio[2] = 0xb0;
+ if (parport_ecp_write_addr(eio, 3) != 3)
+ goto errparport;
+ break;
+
+ case MODE_EPPAFSK:
+ state.config.bitrate = 1200;
+ if (adapter_start_eppafsk(&state.config)) {
+ lprintf(0, "Error configuring EPP mode\n");
+ goto errwait;
+ }
+ /* reset modem */
+ eio[0] = 0x00;
+ eio[1] = 0x18;
+ if (parport_epp_write_addr(eio, 2) != 2)
+ goto errparport;
+ GetSystemTime(&tm1);
+ for (;;) {
+ if (parport_epp_read_addr(&stat, 1) != 1)
+ goto errparport;
+ /* determine the FIFO count */
+ eio[0] = 0x1a;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errparport;
+ if (parport_epp_read_addr(eio, 1) != 1)
+ goto errparport;
+ icnt = eio[0] & 0x1f;
+ eio[0] = 0x18;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errparport;
+ /* rx */
+ if (icnt > 0) {
+ if (parport_epp_read_data(eio, icnt) != icnt)
+ goto errparport;
+ bytecnt += icnt;
+ }
+ GetSystemTime(&tm2);
+ msec = (60000 + tm2.wSecond * 1000U + tm2.wMilliseconds - tm1.wSecond * 1000U - tm1.wMilliseconds) % 60000;
+ if (msec >= 500)
+ break;
+ Sleep(10);
+ if (state.terminate) {
+ state.rxactive = 0;
+ return NULL;
+ }
+ }
+ /* reset modem */
+ eio[0] = 0x00;
+ eio[1] = 0x18;
+ if (parport_epp_write_addr(eio, 2) != 2)
+ goto errparport;
+ break;
+
+ case MODE_EPPCONV:
+ /* reset modem */
+ eio[0] = 0;
+ eio[1] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+ if (parport_epp_write_addr(eio, 2) != 2)
+ goto errparport;
+ GetSystemTime(&tm1);
+ for (;;) {
+ if (parport_epp_read_addr(&stat, 1) != 1)
+ goto errparport;
+ /* try to determine the FIFO count if in extended mode */
+ /* determine RX fifo size from status bits */
+ switch (stat & (EPP_NRAEF|EPP_NRHF)) {
+ case EPP_NRHF:
+ icnt = 0;
+ break;
+
+ case EPP_NRAEF:
+ icnt = 1025;
+ break;
+
+ case 0:
+ icnt = 1793;
+ break;
+
+ default:
+ icnt = 256;
+ break;
+ }
+ /* rx */
+ while (icnt > 0) {
+ cnt = icnt;
+ if (cnt > sizeof(eio))
+ cnt = sizeof(eio);
+ icnt -= cnt;
+ bytecnt += cnt;
+ if (parport_epp_read_data(eio, cnt) != cnt)
+ goto errparport;
+ }
+ GetSystemTime(&tm2);
+ msec = (60000 + tm2.wSecond * 1000U + tm2.wMilliseconds - tm1.wSecond * 1000U - tm1.wMilliseconds) % 60000;
+ if (msec >= 500)
+ break;
+ Sleep(10);
+ if (state.terminate) {
+ state.rxactive = 0;
+ return NULL;
+ }
+ }
+ for (icnt = 0; icnt < 256; icnt++) {
+ if (parport_epp_read_addr(&stat, 1) != 1)
+ goto errparport;
+ if (!(stat & EPP_NREF))
+ break;
+ if (parport_epp_read_data(eio, 1) != 1)
+ goto errparport;
+ bytecnt++;
+ }
+ /* reset modem */
+ eio[0] = 0;
+ eio[1] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+ if (parport_epp_write_addr(eio, 2) != 2)
+ goto errparport;
+ break;
+
+ default:
+ lprintf(0, "Invalid mode requested\n");
+ goto errwait;
+ }
+ bitrate = (bytecnt * 8000U + msec / 2U) / msec;
+ lprintf(0, "Autoprobed bitrate: %u\n", bitrate);
+ /* set variables */
+ i = state.config.bitrate;
+ if (!i)
+ i = 1;
+ state.scale = 614400 / i;
+ state.baud = i / 100;
+ state.status = 0;
+ state.active = 1;
+ SetEvent(state.hdevlife);
+ }
+ /* actual driver */
+ for (;;) {
+ /* do IO */
+ if (state.rxptr >= state.rxlen) {
+ state.rxptr = state.rxlen = 0;
+ switch (state.mode) {
+ case MODE_EPP:
+ if (parport_epp_read_addr(&stat, 1) != 1)
+ goto errparport;
+ /* determine TX fifo size from status bits */
+ switch (stat & (EPP_NTAEF|EPP_NTHF)) {
+ case EPP_NTHF:
+ ocntx = 2048 - 256;
+ break;
+
+ case EPP_NTAEF:
+ ocntx = 2048 - 1793;
+ break;
+
+ case 0:
+ ocntx = 0;
+ break;
+
+ default:
+ ocntx = 2048 - 1025;
+ break;
+ }
+ /* determine RX fifo size from status bits */
+ switch (stat & (EPP_NRAEF|EPP_NRHF)) {
+ case EPP_NRHF:
+ icntx = 0;
+ break;
+
+ case EPP_NRAEF:
+ icntx = 1025;
+ break;
+
+ case 0:
+ icntx = 1793;
+ break;
+
+ default:
+ icntx = 256;
+ break;
+ }
+ /* try to determine the FIFO count if in extended mode */
+ ctreg = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+ if (state.leds & LED_CON)
+ ctreg |= 1 << 6;
+ if (state.leds & LED_STA)
+ ctreg |= 1 << 7;
+ if (state.config.extstat) {
+ eio[0] = ctreg|1;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errparport;
+ if (parport_epp_read_addr(eio, 2) != 2)
+ goto errparport;
+ icnt = eio[0] | (((unsigned int)eio[1]) << 8);
+ eio[0] = ctreg|2;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errparport;
+ if (parport_epp_read_addr(eio, 2) != 2)
+ goto errparport;
+ ocnt = eio[0] | (((unsigned int)eio[1]) << 8);
+ ocnt = 16384 - (ocnt & 0x7fff);
+ icnt &= 0x7fff;
+ } else {
+ ocnt = ocntx;
+ icnt = icntx;
+ }
+ eio[0] = ctreg;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errparport;
+ if (stat & EPP_DCDBIT)
+ state.status &= ~CH_DCD;
+ else
+ state.status |= CH_DCD;
+ if (stat & EPP_PTTBIT)
+ state.status |= CH_PTT;
+ else
+ state.status &= ~CH_PTT;
+ /* rx */
+ if (icnt > 0) {
+ if (icnt > sizeof(state.rxbuf))
+ icnt = sizeof(state.rxbuf);
+ if (parport_epp_read_data(state.rxbuf, icnt) != icnt)
+ goto errparport;
+ state.rxlen = icnt;
+ }
+ /* tx */
+ if (ocnt > 0) {
+ if (ocnt > sizeof(eio))
+ ocnt = sizeof(eio);
+ cnt = hdlc_transmit(eio, ocnt);
+ if (parport_epp_write_data(eio, cnt) != cnt)
+ goto errparport;
+ }
+ break;
+
+ case MODE_ECP:
+ eio[0] = 0x81;
+ if (parport_ecp_write_addr(eio, 1) != 1)
+ goto errparport;
+ if (parport_ecp_read_data(statecp, 6) != 6)
+ goto errparport;
+ eio[0] = 0x80;
+ if (parport_ecp_write_addr(eio, 1) != 1)
+ goto errparport;
+ eio[0] = 0xb0;
+ if (state.leds & LED_CON)
+ eio[0] |= 1 << 0;
+ if (state.leds & LED_STA)
+ eio[0] |= 1 << 1;
+ if (parport_ecp_write_addr(eio, 1) != 1)
+ goto errparport;
+ icnt = ((unsigned)statecp[2] << 8) | statecp[1];
+ ocnt = ((unsigned)statecp[4] << 8) | statecp[3];
+ /* update status */
+ if (statecp[0] & 0x80)
+ state.status &= ~CH_DCD;
+ else
+ state.status |= CH_DCD;
+ if (statecp[0] & 0x40)
+ state.status &= ~CH_PTT;
+ else
+ state.status |= CH_PTT;
+ /* read */
+ if (icnt > 0) {
+ cnt = icnt;
+ if (cnt > sizeof(state.rxbuf))
+ cnt = sizeof(state.rxbuf);
+ icnt -= cnt;
+ eio[0] = 0xc0 | (cnt & 0xf);
+ eio[1] = 0xd0 | ((cnt >> 4) & 0xf);
+ eio[2] = 0xe0 | ((cnt >> 8) & 0xf);
+ if (parport_ecp_write_addr(eio, 3) != 3)
+ goto errparport;
+ if (parport_ecp_read_data(state.rxbuf, cnt) != cnt)
+ goto errparport;
+ state.rxlen = cnt;
+ }
+ /* write */
+ if (ocnt < 8192) { /* fixme */
+ cnt = 8192 - ocnt;
+ if (cnt > sizeof(eio))
+ cnt = sizeof(eio);
+ cnt = hdlc_transmit(eio, cnt);
+ if (parport_ecp_write_data(eio, cnt) != cnt)
+ goto errparport;
+ }
+ break;
+
+ case MODE_EPPAFSK:
+ if (parport_epp_read_addr(&stat, 1) != 1)
+ goto errparport;
+ /* determine the FIFO count */
+ ctreg = 0x18;
+ if (state.leds & LED_CON)
+ ctreg |= 1 << 6;
+ if (state.leds & LED_STA)
+ ctreg |= 1 << 7;
+ eio[0] = ctreg | 1;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errparport;
+ if (parport_epp_read_addr(eio, 1) != 1)
+ goto errparport;
+ ocnt = 0x10 - (eio[0] & 0x1f);
+ eio[0] = ctreg | 2;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errparport;
+ if (parport_epp_read_addr(eio, 1) != 1)
+ goto errparport;
+ icnt = eio[0] & 0x1f;
+ eio[0] = ctreg;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errparport;
+ /* update status */
+ if (stat & 0x80)
+ state.status &= ~CH_DCD;
+ else
+ state.status |= CH_DCD;
+ if (stat & 0x40)
+ state.status &= ~CH_PTT;
+ else
+ state.status |= CH_PTT;
+ /* rx */
+ if (icnt > 0) {
+ if (parport_epp_read_data(state.rxbuf, icnt) != icnt)
+ goto errparport;
+ state.rxlen = icnt;
+ }
+ /* tx */
+ if (ocnt > 0) {
+ cnt = hdlc_transmit(eio, ocnt);
+ if (parport_epp_write_data(eio, cnt) != cnt)
+ goto errparport;
+ }
+ break;
+
+ case MODE_EPPCONV:
+ if (parport_epp_read_addr(&stat, 1) != 1)
+ goto errparport;
+ /* determine TX fifo size from status bits */
+ switch (stat & (EPP_NTAEF|EPP_NTHF)) {
+ case EPP_NTHF:
+ ocnt = 2048 - 256;
+ break;
+
+ case EPP_NTAEF:
+ ocnt = 2048 - 1793;
+ break;
+
+ case 0:
+ ocnt = 0;
+ break;
+
+ default:
+ ocnt = 2048 - 1025;
+ break;
+ }
+ /* determine RX fifo size from status bits */
+ switch (stat & (EPP_NRAEF|EPP_NRHF)) {
+ case EPP_NRHF:
+ icnt = 0;
+ break;
+
+ case EPP_NRAEF:
+ icnt = 1025;
+ break;
+
+ case 0:
+ icnt = 1793;
+ break;
+
+ default:
+ icnt = 256;
+ break;
+ }
+ if (stat & EPP_DCDBIT)
+ state.status &= ~CH_DCD;
+ else
+ state.status |= CH_DCD;
+ if (stat & EPP_PTTBIT)
+ state.status |= CH_PTT;
+ else
+ state.status &= ~CH_PTT;
+ /* set LEDs */
+ ctreg = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+ if (state.leds & LED_CON)
+ ctreg |= 1 << 6;
+ if (state.leds & LED_STA)
+ ctreg |= 1 << 7;
+ eio[0] = ctreg;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errparport;
+ /* rx */
+ if (icnt == 0 && state.config.bitrate < 100000) {
+ i = (state.config.bitrate < 50000) ? 256 : 128;
+ while (i > 0 && state.rxlen < sizeof(state.rxbuf) && stat & EPP_NREF) {
+ if (parport_epp_read_data(state.rxbuf+state.rxlen, 1) != 1)
+ goto errparport;
+ state.rxlen++;
+ i--;
+ if (parport_epp_read_addr(&stat, 1) != 1)
+ goto errparport;
+ }
+ } else if (icnt > 0) {
+ cnt = icnt;
+ if (cnt > sizeof(state.rxbuf))
+ cnt = sizeof(state.rxbuf);
+ icnt -= cnt;
+ if (parport_epp_read_data(state.rxbuf, cnt) != cnt)
+ goto errparport;
+ state.rxlen = cnt;
+ }
+ /* tx */
+ if (ocnt > 0) {
+ if (ocnt > sizeof(eio))
+ ocnt = sizeof(eio);
+ cnt = hdlc_transmit(eio, ocnt);
+ if (parport_epp_write_data(eio, cnt) != cnt)
+ goto errparport;
+ }
+ break;
+ }
+ }
+ while (state.rxptr < state.rxlen) {
+ hdlc_receive();
+ if (state.rxframe.len) {
+ state.rxactive = 0;
+ return &state.rxframe;
+ }
+ }
+ if (state.terminate) {
+ state.rxactive = 0;
+ return NULL;
+ }
+ Sleep(10);
+ }
+
+ errparport:
+ lprintf(0, "Parport timeout\n");
+ errwait:
+ if (state.isnt || !state.w9xportmode)
+ parport_stop_win();
+ state.stat.io_error++;
+ state.active = 0;
+ state.status = CH_DEAD;
+ SetEvent(state.hdevlife);
+ for (i = 0; i < 30; i++) {
+ if (state.terminate)
+ break;
+ Sleep(100);
+ }
+ state.rxactive = 0;
+ return NULL;
+}
+
+/* ------------------------------------------------------------------------- */
diff --git a/flexdrv/bayeppflex.rc b/flexdrv/bayeppflex.rc
new file mode 100644
index 0000000..7d7210e
--- /dev/null
+++ b/flexdrv/bayeppflex.rc
@@ -0,0 +1,76 @@
+#include "resource.h"
+#include "windows.h"
+
+IDD_DIALOG1 DIALOGEX 0, 0, 232, 235
+STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Dialog"
+FONT 8, "MS Sans Serif"
+BEGIN
+ DEFPUSHBUTTON "OK",IDOK,175,12,50,14
+ PUSHBUTTON "Cancel",IDCANCEL,175,37,50,14
+ RTEXT "Port",IDC_STATIC,50,15,25,8,0,WS_EX_RIGHT
+ COMBOBOX IDC_PORT,77,12,50,145,CBS_DROPDOWN | WS_VSCROLL |
+ WS_TABSTOP
+ COMBOBOX IDC_MODE,77,34,50,145,CBS_DROPDOWNLIST |
+ CBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP
+ RTEXT "Mode",IDC_STATIC,56,36,19,8
+ EDITTEXT IDC_TXDELAY,77,56,40,14,ES_AUTOHSCROLL | ES_NUMBER
+ RTEXT "TxDelay",IDC_STATIC,47,58,27,8
+ LTEXT "ms",IDC_STATIC,120,58,10,8
+ CONTROL "Full Duplex",IDC_FULLDUPLEX,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,77,80,51,10
+ EDITTEXT IDC_BITRATE,77,100,40,14,ES_AUTOHSCROLL | ES_NUMBER
+ RTEXT "Bitrate",IDC_STATIC,53,103,21,8
+ CONTROL "External Modem",IDC_EXTMODEM,"Button",BS_AUTOCHECKBOX |
+ WS_TABSTOP,77,124,67,10
+ CONTROL "Mute Audio when not transmitting",IDC_PTTMUTE,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,77,144,121,10
+ CONTROL "Force use of Hardware EPP",IDC_FORCEHWEPP,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,77,164,121,10
+ CONTROL "Software EPP Emulation",IDC_SWEMULEPP,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,77,184,121,10
+ CONTROL "Software ECP Emulation",IDC_SWEMULECP,"Button",
+ BS_AUTOCHECKBOX | WS_TABSTOP,77,204,121,10
+ CONTROL "Author: Thomas Sailer, HB9JNX/AE4WA",IDC_STATIC,"Static",
+ SS_LEFTNOWORDWRAP | WS_GROUP,3,225,130,8
+END
+
+
+LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 1,0,0,1
+ PRODUCTVERSION 1,0,0,1
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x40004L
+ FILETYPE 0x0L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904b0"
+ BEGIN
+ VALUE "Comments", "\0"
+ VALUE "CompanyName", "Baycom Hard- und Software GmbH\0"
+ VALUE "FileDescription", "baycomeppflex\0"
+ VALUE "FileVersion", "1, 0, 0, 1\0"
+ VALUE "InternalName", "Baycom EPPFLEX FlexNet driver\0"
+ VALUE "LegalCopyright", "Copyright � 1999-2000\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "bayeppflex.dll\0"
+ VALUE "PrivateBuild", "\0"
+ VALUE "ProductName", "EPPFLEX\0"
+ VALUE "ProductVersion", "1.00a\0"
+ VALUE "SpecialBuild", "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/flexdrv/driver.c b/flexdrv/driver.c
new file mode 100644
index 0000000..bfef886
--- /dev/null
+++ b/flexdrv/driver.c
@@ -0,0 +1,74 @@
+#define STRICT
+#include <windows.h>
+#pragma hdrstop
+
+#include <process.h>
+#include "flexdrv.h" // der offizielle Header
+#include "drv32.h"
+
+HANDLE hInst;
+//--------------------------------------------------------------------
+// Einziger Treiberaufruf
+u32 flexnet_driver(int func, int kanal, int a, int b)
+ {
+ static byte base_kanal;
+ static byte tx_kanal;
+ static L1FRAME *l1f;
+ L1FRAME *rxf;
+ switch (func)
+ {
+ case drv_interfaceversion:
+ return DRIVER_INTERFACE_VERSION;
+ case drv_ident: return (u32)l1_ident((byte)(kanal-base_kanal));
+ case drv_version: return (u32)l1_version((byte)(kanal - base_kanal));
+ case drv_config: return config_device((byte)(kanal), (HWND)a, (byte)(b - base_kanal));
+ case drv_confinfo: return (u32)config_info((byte)(kanal - base_kanal));
+ case drv_init_device:
+ base_kanal = kanal;
+ return init_device((HKEY)b);
+ case drv_get_ch_cnt: return l1_get_ch_cnt();
+ case drv_exit: l1_exit((HKEY)a); break;
+ case drv_ch_active: return l1_ch_active((byte)(kanal - base_kanal));
+ case drv_init_kanal: return l1_init_kanal((byte)(kanal - base_kanal), (u16)a, (u16)b);
+ case drv_stat: return (u32)l1_stat((byte)(kanal - base_kanal), (byte)a);
+ case drv_ch_state: return l1_ch_state((byte)(kanal - base_kanal));
+ case drv_scale: return l1_scale((byte)(kanal - base_kanal));
+ case drv_tx_calib: l1_tx_calib((byte)(kanal - base_kanal), (byte)a); break;
+ case drv_set_led: set_led((byte)(kanal - base_kanal), (byte)a); break;
+ case drv_rx_frame:
+ if (rxf = l1_rx_frame())
+ rxf->kanal += base_kanal;
+ return (u32)rxf;
+ case drv_get_framebuf: return (u32)(l1f = l1_get_framebuf(tx_kanal = (byte)(kanal - base_kanal)));
+ case drv_tx_frame:
+ if (l1f) l1f->kanal = tx_kanal;
+ return l1_tx_frame();
+ case drv_get_txdelay: return get_txdelay((byte)(kanal - base_kanal));
+ case drv_get_mode: return get_mode((byte)(kanal - base_kanal));
+ case drv_get_baud: return get_baud((byte)(kanal - base_kanal));
+ case drv_set_txdelay: set_txdelay((byte)(kanal - base_kanal), (byte)a); break;
+ default:
+ return 0;
+ }
+ return 0;
+ }
+//--------------------------------------------------------------------
+BOOL WINAPI DllMain (HANDLE hModule, DWORD dwFunction, LPVOID lpNot)
+ {
+ switch(dwFunction)
+ {
+ case DLL_PROCESS_ATTACH:
+ // hier evtl. noch Test ob mehrfach geladen, dazu brauchts aber Handle (mutex oder sowas)
+ hInst = hModule;
+ // kein break, auch neuer Prozess istn Thread
+ case DLL_THREAD_ATTACH:
+ break;
+ case DLL_PROCESS_DETACH:
+ // vor allem wenn harter Abbruch: Alles deinitialisieren!
+ break; // kein Durchfall, Prozessende gibt eh alles frei und schliesst pipes
+ case DLL_THREAD_DETACH:
+ break;
+ }
+ return 1; // Indicate that the DLL was initialized successfully.
+ }
+//--------------------------------------------------------------------
diff --git a/flexdrv/drv32.h b/flexdrv/drv32.h
new file mode 100644
index 0000000..b0f750e
--- /dev/null
+++ b/flexdrv/drv32.h
@@ -0,0 +1,15 @@
+
+#define DRIVER_INTERFACE_VERSION 1
+
+enum drvc
+ {
+ drv_interfaceversion=1, drv_ident, drv_version,
+ drv_config, drv_confinfo, drv_init_device, drv_get_ch_cnt,
+ drv_exit, drv_ch_active, drv_init_kanal,
+ drv_stat, drv_ch_state, drv_scale,
+ drv_tx_calib, drv_set_led, drv_rx_frame,
+ drv_get_framebuf, drv_tx_frame,
+ drv_get_txdelay, drv_get_mode, drv_get_baud,
+ drv_set_txdelay
+ };
+
diff --git a/flexdrv/flexdriv.def b/flexdrv/flexdriv.def
new file mode 100644
index 0000000..b0f2138
--- /dev/null
+++ b/flexdrv/flexdriv.def
@@ -0,0 +1,11 @@
+;LIBRARY FLEXNET_DRIVER
+DESCRIPTION "FlexNet Channel Driver"
+
+VERSION 1.0
+
+CODE READ SHARED EXECUTE
+DATA READ WRITE
+
+EXPORTS
+
+flexnet_driver
diff --git a/flexdrv/flexdrv.h b/flexdrv/flexdrv.h
new file mode 100644
index 0000000..e2ee967
--- /dev/null
+++ b/flexdrv/flexdrv.h
@@ -0,0 +1,491 @@
+/***************************************************************
+
+ FlexNet / BayCom Layer 1 Service Interface
+
+ (C) 7/1994 DK7WJ, DL8MBT
+ Translation by HB9JNX
+
+ Definitionen und Prototypes f�r Aufruf von Layer1-Funktionen
+ Definitions and prototypes for calling Layer1 functions
+
+
+ 28.08.94 DK7WJ Erste verteilte Version
+ First distributed version
+ 10.09.94 DK7WJ Modebefehl geaendert
+ Changed the mode command
+ Prototypen neu f. Speichermodell MEDIUM
+ New prototypes for the MEDIUM memory model
+ 25.09.94 DK7WJ FDX an Treiber uebergeben
+ FDX now forwarded to the driver
+ 20.02.95 DK7WJ CH_TBY neu
+ CH_TBY added
+ 31.03.95 DK7WJ Device-Versionkennungen
+ Device version identifier
+ 01.03.96 DK7WJ Windows extensions, comments pending :-)
+ 22.04.96 DK7WJ .
+ 25.03.97 HB9JNX IO trapping changes
+
+ 10.01.00 DK7WJ WIN32 definitions
+
+ 19.06.00 DK7WJ CH_DEAD included
+ ***************************************************************/
+
+//#ifndef _FLEXTYPES_DEFINED
+//#define _FLEXTYPES_DEFINED
+typedef unsigned char byte;
+typedef signed char i8;
+typedef signed short i16;
+typedef unsigned short u16;
+typedef unsigned long u32;
+#ifdef _WIN32
+#define far
+#define near
+#endif
+//#endif
+
+#ifdef _WIN32
+#pragma pack(push, flexdrv)
+#pragma pack(1)
+#endif
+
+
+#define MAXFLEN 400 /* Maximale Laenge eines Frames */
+ /* maximum length of a frame */
+
+/* Struct f. Treiberkommunikation bei TX und RX */
+/* struct for communicating RX and TX packets to the driver */
+typedef struct
+ {
+ i16 len; /* Laenge des Frames - length of the frame */
+ byte kanal; /* Kanalnummer - channel number */
+ byte txdelay; /* RX: Gemessenes TxDelay [*10ms],
+ 0 wenn nicht unterstuetzt
+ TX: Zu sendendes TxDelay */
+ /* RX: measured transmitter keyup delay (TxDelay) in 10ms units,
+ 0 if not supported
+ TX: transmitter keyup delay (TxDelay) that should be sent */
+ byte frame[MAXFLEN]; /* L1-Frame (ohne CRC) - L1 frame without CRC */
+ } L1FRAME;
+
+/* Struct f. Kanalstatistik (wird noch erweitert) */
+/* struct for channel statistics (still being extended) */
+#ifndef _FLEXAPPL
+typedef struct
+ {
+ u32 tx_error; /* Underrun oder anderes Problem - underrun or some other problem */
+ u32 rx_overrun; /* Wenn Hardware das unterstuetzt - if supported by the hardware */
+ u32 rx_bufferoverflow;
+ u32 tx_frames; /* Gesamt gesendete Frames - total number of sent frames */
+ u32 rx_frames; /* Gesamt empfangene Frames - total number of received frames */
+ u32 io_error; /* Reset von IO-Device - number of resets of the IO device */
+ u32 reserve[4]; /* f. Erweiterungen, erstmal 0 lassen! - reserved for extensions, leave 0! */
+ } L1_STATISTICS;
+#endif
+
+#ifdef _WIN32
+extern HANDLE hInst;
+#pragma pack(pop, flexdrv)
+#endif
+
+/* Masken f�r den Mode-Parameter - bitmasks for the mode parameter */
+#define MODE_d 0x0080
+#define MODE_r 0x0040
+#define MODE_t 0x0020
+#define MODE_z 0x0010
+#define MODE_p 0x0004 /* needs also MODE_d */
+#define MODE_c 0x0002
+#define MODE_off 0x0001 /* Special: Wenn 1, Kanal abgeschaltet */
+ /* special: if one, the channel is switched off */
+
+/* Masken f�r den L1-Kanalstatus */
+/* masks for the L1 channel status */
+#define CH_DEAD 0x01
+#define CH_RXB 0x40
+#define CH_PTT 0x20
+#define CH_DCD 0x10
+#define CH_FDX 0x08
+#define CH_TBY 0x04
+
+#ifdef _WIN32
+// Konfiguration. Wenn geaendert, TRUE returnen, dann erfolgt exit() und Re-Init
+// max_channels: Maximal moegliche Kanalanzahl f. diesen Treiber
+int config_device(byte max_channels, HWND hParentWindow, byte channel);
+// Return: Anzahl belegte Kanaele!
+
+byte *config_info(byte channel);
+/* Liefert String der die treiberspezifische Konfiguration beschreibt, z.B. Resourcen-Name
+ Wenn keine treiberspezifische Konfiguration vorhanden (config_device() ist Dummy),
+ Nullpointer liefern */
+/* Returns a string describing the channel configuration, i.e. the name of hardware resource
+ If config_device() is a dummy, this call must return a null pointer
+*/
+int init_device(HKEY kHey);
+
+void far l1_exit(HKEY hKey);
+
+void set_txdelay(byte channel, byte txdel);
+byte get_txdelay(byte channel);
+u16 get_baud(byte channel);
+u16 get_mode(byte channel);
+#else
+u16 far init_device(int argc, char near *argv[]);
+/* Treiberinterner Aufruf aus Treiberkopf bei Installation: kann benutzt
+ werden um Command Line Parameter zu parsen
+ Return: 0=OK; sonst Exit mit Returnwert als Exit-Argument
+ ACHTUNG: Wenn Returnwert >0, erfolgt Abbruch, es duerfen dann also keine
+ aktiven oder umgelegten Interrupts verbleiben!
+*/
+/* This procedure is called from the driver stub at installation time. It
+ may be used to parse the command line
+ Return value: 0=OK; otherwise installation is cancelled and the value
+ returned as exit argument
+ WARNING: If return value >0 the installation is cancelled, active or
+ patched interrupt vectors must not be left!
+*/
+void far l1_exit(void);
+/* Wird bei Verlassen des Programms aufgerufen und kann zum Aufr�umen
+ verwendet werden (Interrupts und Schnittstellen abschalten)
+*/
+/* Is called when the driver terminates and may be used to clean up everything
+ (switch off interrupts and interfaces)
+*/
+
+#endif
+
+u16 far l1_get_ch_cnt(void);
+/* Aufruf aus Treiberkopf bei Programmstart; muss Anzahl der im Treiber
+ definierten Kanaele liefern
+*/
+/* called from the driver stub at installation time; should return the number
+ of channels defined by the driver
+*/
+
+
+byte far l1_ch_active(byte kanal);
+/* Zurueckliefern, ob Kanal im Prinzip funktionstuechtig ist.
+ Also immer, ausser wenn Dummykanal, >0 liefern!
+*/
+/* report if the channel could work in principle. Thus always return >0 if
+ not a dummy channel.
+*/
+
+byte far l1_init_kanal(byte kanal, u16 baud, u16 mode);
+/*
+ Kanalnummer: 0-15
+ Baud: Baudrate / 100, z.B. 115200 Baud wird als 1152 uebergeben
+ Mode: Kanalmodus, Bitflaggen, derzeit definiert:
+ 0x0080 d Vollduplex
+ 0x0040 r Externer RX-Takt
+ 0x0020 t Externer TX-Takt
+ 0x0010 z NRZ-Kodierung (Anstatt NRZI), nur f. HDLC
+ 0x0002 c Kanal macht immer CRC, nur f. KISS
+ Baycom: Soft-DCD aktivieren
+ 0x0001 - Kanal per Modebefehl deaktiviert
+ Es sind noch weitere Bits definiert, die sind aber im L1-Treiber nicht
+ relevant!
+ Um eventuelle Verklemmungen zu beseitigen, sollte in diesem Modul der
+ Treiber soweit als moeglich (re)initialisiert werden!
+
+ Return: 1 wenn alles ok;
+ 0 wenn Parameterfehler, dann Anzeige von '---' in der Modeliste
+
+ Aufruf erfolgt beim Programmstart sowie bei jeder Baud- oder Mode�nderung,
+ ausserdem wenn der Kanal seit 3 Minuten nichts mehr empfangen hat.
+*/
+/*
+ kanal: channel number (0-15)
+ baud: the baud rate / 100, for example 115200 baud is specified as
+ baud = 1152
+ mode: the channel mode, a bit field, currently the following bits are
+ defined:
+ 0x0080 d Full duplex
+ 0x0040 r External RX clock
+ 0x0020 t External TX clock
+ 0x0010 z NRZ coding (instead of NRZI) (only for HDLC)
+ 0x0002 c KISS: driver forces checksum
+ Baycom: activate software DCD
+ 0x0001 - channel inactivated
+ There are some additional bits defined which are not relevant to the
+ L1 driver.
+
+ To recover from lockups, this function should (re)initialize as much of the
+ driver and the hardware as possible.
+
+ Return value: 1 if everything is ok;
+ 0 if a parameter error; '---' is then displayed in the ports
+ list
+
+ This procedure is called at program start, at every baud rate or mode
+ change, or if the driver has not received anything for 3 minutes.
+*/
+
+L1FRAME far * far l1_rx_frame(void);
+/*
+ Wird zyklisch aufgerufen
+
+ Return: *Frame oder 0 wenn nichts empfangen
+ Der Frame mu� jeweils bis zum n�chsten Aufruf verf�gbar bleiben,
+ d.h. jeder Aufruf l�scht den zuletzt gemeldeten Frame
+*/
+/*
+ Is called periodically
+
+ Return value: *Frame or null pointer if nothing was received
+ The frame has to be readable until the next call to this
+ function, i.e. every call removes the frame returned by the
+ last call.
+*/
+
+
+L1FRAME far * far l1_get_framebuf(byte kanal);
+/* L2 fordert hiermit einen Sendepuffer an. Er mu� die Maximall�nge aufnehmen
+ k�nnen. Wenn erfolgreich, folgt vielleicht l1_tx_frame(), es kann aber
+ auch vorkommen dass ein weiterer Aufruf erfolgt! Also nicht dynamisch
+ allokieren, sondern nur einen Pointer liefern!
+ Return: *Frame, der Frame wird hier hineingebaut
+ 0 wenn kein Platz verfuegbar
+*/
+/* L2 requests a transmitter buffer. The buffer must be able to store the
+ maximum length. If successful, a l1_tx_frame() probably follows, but
+ it may also happen that another call to l1_get_framebuf() follows!
+ Therefore, do not allocate dynamically, just return a pointer!
+ Return value: *Frame : the frame is stored here
+ 0 : no storage available
+*/
+
+
+byte far l1_tx_frame(void);
+/* Aussenden des Frames in vorher mit l1_get_framebuf angefordeten Buffers;
+ Return: 1 wenn ok, sonst 0
+ Wenn der Sender aus ist, muss jetzt die Entscheidung fallen ob gesendet
+ werden kann!!!
+ ACHTUNG: Wenn die Sendung nicht moeglich ist, darf der Frame auf keinen
+ Fall gespeichert werden! Stattdessen den Frame verwerfen und 0 returnen.
+ DCD darf den Sender auch bei Halbduplex NICHT sperren! Dies ist Bedingung
+ fuer das Funktionieren des FlexNet-OPTIMA-Zugriffsverfahrens. Die DCD-
+ Verriegelung ist bereits in FlexNet enthalten!
+ Wenn der TX bereits an ist (PTT an) und es werden bereits Frames gesendet,
+ sollte der Frame zur Sendung zwischengespeichert werden, sofern der Puffer-
+ platz dafuer ausreicht. Wenn nicht, 0 returnen, dann erfolgt spaeter ein
+ neuer Versuch. In diesem Fall muss jedoch sichergestellt sein, dass der
+ Frame auf jeden Fall noch in DIESEM Durchgang gesendet wird!
+ Das Kanalzugriffstiming findet bereits im FlexNet-Kern statt!
+*/
+/* Transmit the frame in the buffer that was returned by the last
+ l1_get_framebuf()
+ Return value: 1 if ok, 0 if not.
+ If the transmitter is off, then the decision must now be made if
+ transmission is possible!!!
+ WARNING: If transmission is not possible now, the frame MUST NOT be stored!
+ The frame should be thrown away and zero should be returned. DCD must not
+ inhibit the transmitter, not even in half duplex mode! This is a necessity
+ for the FlexNet-OPTIMA-Channel access algorithm. The Kernel already
+ contains the DCD transmitter inhibit.
+ If the transmitter is already on (PTT keyed) and frames are being sent,
+ then the frame should be stored if the buffer memory suffices. If not,
+ zero should be returned, the kernel will try again later. If the frame
+ is stored, it is important that it gets transmitted during the same
+ transmission!
+ The channel access timing is already handled by the FlexNet kernel!
+*/
+
+void far l1_tx_calib(byte kanal, byte minutes);
+/* Sofern die Hardware es erlaubt, Sender in Calibrate-Modus schalten.
+ Minutes=0 stoppt den Calibrate-Mode sofort.
+*/
+/* If the hardware allows it, switch the transmitter into the calibrate mode
+ (i.e. start transmitting a calibration pattern)
+ minutes=0 should immediately stop the calibration mode.
+*/
+
+byte far l1_ch_state(byte kanal);
+/* Gibt verschiedene Kanalzust�nde zur�ck, Bits sind 1 wenn wahr:
+ 0x40 RxB RxBuffer ist nicht leer
+ 0x20 PTT Sender ist an
+ 0x10 DCD Empf�nger ist aktiv
+ 0x08 FDX Kanal ist Vollduplex, kann also immer empfangen
+ 0x04 TBY Sender ist nicht bereit, z.B. wegen Calibrate
+
+Anmerkung: Die korrekte Bedienung dieser Flags ist essentiell fuer das
+Funktionieren des FlexNet-Kanalzugriffstimings incl. DAMA-Master und -Slave.
+
+Erlaeuterungen zu den Flags:
+
+RxB ist 1 wenn gueltige RX-Frames im Puffer liegen. Verriegelt u.a. den Sender
+ bei Halbduplex, da immer erst alle Frames verarbeitet werden sollen.
+ Waehrend des Empfangs muss dieses Flag mit DCD ueberlappend bedient werden,
+ d.h. sobald ein RX-Frame als gueltig erkannt wird, muss RxB spaetestens
+ 1 werden, wenn DCD 0 wird!
+PTT 1 wenn der TX bereits an ist. Dann setzt FlexNet voraus dass uebergebene
+ Frames in diesem Durchgang noch gesendet werden koennen. Braucht nicht
+ bedient zu werden bei reinen Vollduplextreibern, also wenn FDX 1 ist.
+DCD 1 wenn der Kanal belegt ist. Darf im Treiber den Sender nicht blockieren,
+ die Entscheidung ob gesendet werden kann faellt stets im FlexNet-Kern!
+FDX Ist eine typabhaengige Konstante. Stets 0 bei Treibern die einen Halb-
+ duplexkanal bedienen koennen, also die PTT- und DCD-Flags korrekt
+ ansteuern. Treiber die kein Kanalzugriffstiming benoetigen (z.B. Ethernet,
+ SLIP, KISS f. reine Rechnerkopplung usw.), liefern hier 1.
+TBY Dient nur zur Beschleunigung des Kernels. Wenn 1, wird nichts gesendet.
+ Kann also z.B. waehrend Calibrate oder bei abgeschaltetem Kanal gesetzt
+ werden
+*/
+/* return different channel states. The following bits are one if true:
+ 0x40 RxB RxBuffer is not empty
+ 0x20 PTT Transmitter is keyed on
+ 0x10 DCD Receiver is active
+ 0x08 FDX Channel is full duplex, receiver can always receive
+ 0x04 TBY Transmitter not ready, for example because of ongoing
+ calibration
+
+Note: It is essential that these flags are services correctly. Otherwise,
+the channel access timing including DAMA master and slave will not work
+correctly.
+
+Explanation of the flags:
+
+RxB is 1 if valid RX frames are available in the buffer. Inhibits for example
+ the transmitter in half duplex mode, because all frames should be processed
+ before transmitting. During receipt this flag should overlap the DCD flag,
+ i.e. RxB should go to one before DCD transitions to zero!
+PTT 1 if the transmitter is already keyed up. In this case, FlexNet assumes
+ that frames passed are sent during the same transmission. Needs not be
+ serviced by full duplex drivers (i.e. if FDX is one)
+DCD 1 if the channel is busy. Must not inhibit the transmitter in the driver,
+ since the decision if one should transmit is made by the FlexNet kernel!
+FDX is a driver dependent constant. Always 0 for drivers that may service a
+ half duplex channel, i.e. that serve the PTT and DCD flags correctly.
+ Drivers that do not need a channel access timing (for example Ethernet,
+ SLIP, KISS for connecting PCs and so on), should return 1.
+TBY Speeds up the kernel. If 1, it will not try to send. May be set to one
+ for example during calibration or if the channel is switched off.
+*/
+
+u16 far l1_scale(byte kanal);
+/* Baudratenabh�ngigen Faktor liefern, wird f�r diverse adaptive Parms
+ gebraucht, u.a. T2-Steuerung.
+
+ Return: 300 Baud: 2048
+ 9600 Baud: 64
+
+ oder anders ausgedr�ckt: Return = 614400/[Baudrate]
+
+ Sollte die real moegliche Geschwindigkeit des Kanals liefern. Bei Treibern,
+ die die in init_kanal() uebergebene Baudrate verwenden, berechnen. Treiber,
+ die diese nicht verwenden, sollten einen Schaetzwert liefern. Bei sehr
+ schnellen Kanaelen (z.B. Ethernet) immer 0 liefern!
+*/
+/* Return a baud rate dependent factor. Is needed to calculate several adaptive
+ parameters, for example T2 control
+
+ Return value: 300 baud: 2048
+ 9600 baud: 64
+
+ or as a formula: Return value = 614400/[baud rate]
+
+ Should return the real speed of the channel. Drivers that use the baud rate
+ specified in init_kanal() should calculate the return value. Drivers that do
+ not use this parameter should estimate the speed of the channel. Drivers for
+ very fast channels (for example Ethernet) should always return 0!
+*/
+
+char far * far l1_ident(byte kanal);
+/* Kennung f�r Kanalhardware bzw. Treibertyp zur�ckgeben.
+ Geliefert wird ein far-pointer auf einen null-terminierten String.
+ Der String f�r die Kanalhardware ist maximal 8 Zeichen lang,
+ z.B. "SCC0" .. "SCC3", "RS232", "PAR96", "KISS", "IPX", usw.
+*/
+/* Return an identifier for the channel hardware or the driver type.
+ The return value must be a far pointer to a zero terminated string.
+ The string should be at most 8 characters long.
+ Examples are "SCC0" .. "SCC3", "RS232", "PAR96", "KISS", "IPX", etc.
+*/
+
+char far * far l1_version(byte kanal);
+/* Versionsnummernstring liefern. Maximal 5 Zeichen
+*/
+/* Return a version number string. At most 5 characters.
+*/
+
+L1_STATISTICS far * far l1_stat(byte kanal, byte delete);
+/* Statistikwerte liefern
+ Delete = 1: Werte auf 0 zuruecksetzen!
+ Wenn nicht implementiert, Nullpointer liefern!
+*/
+/* Return the statistics.
+ Delete = 1: clear the statistics values!
+ If not implemented, return a null pointer!
+*/
+
+void set_led(byte kanal, byte ledcode);
+/* Falls der Kanal Status-LEDs hat (z.B. TNC), kommen hier die Zustaende
+ bei jeder Aenderung an; kann sicherlich meistens Dummy sein:
+ Bitmasken dazu: */
+/* If the channel hardware has status LEDs (for example a TNC), this procedure
+ may be used to drive them; in most cases, this procedure may be a dummy.
+ Bitmasks used: */
+#define LED_CON 2 /* Mindestens 1 Connect - at least one connect */
+#define LED_STA 4 /* Sendeseitig ausstehende Frames - frames in the transmitter buffer */
+
+/*---------------------------------------------------------------------------*/
+#ifndef _WIN32
+/* Pointer auf unsigned-Timertic, f. schnellen Zugriff wenn Zeitintervalle
+ geprueft werden muessen. Inkrementiert alle 100ms mit Phasenjitter */
+/* Pointer to an unsigned timer_tic, for fast access if timing intervals
+ need to be measured. Increments every 100ms with phase jitter */
+extern const volatile far u16 *timer_tic;
+
+/* Variable fuer externe Kommunikation zwischen Modulen
+ Koennen bei Bedarf besetzt werden */
+/* Variables for intermodule communications
+ May be used if needed */
+extern u16 device_type; /* Bitte vor Vergabe DK7WJ konsultieren! */
+ /* Please consult DK7WJ prior to usage! */
+extern u16 device_version; /* Versionskennung - version identifier */
+extern void far *device_vector; /* Beliebiger Vektor, wird zurueckgeliefert */
+ /* arbitrary vector returned by device_vec() */
+extern void far (*drv_cb)(void);
+typedef struct
+ {
+ u16 ds;
+ u16 es;
+ u16 cs;
+ u16 dsize;
+ u16 esize;
+ u16 csize;
+ u16 offset;
+ u16 irq;
+ u16 revision;
+ u16 ioport1;
+ u16 ioextent1;
+ u16 ioport2;
+ u16 ioextent2;
+ } defint;
+extern defint intsegs;
+
+#define DEFINT_REVISION 1
+
+/*---------------------------------------------------------------------------*/
+/* Die folgenden Aufrufe werden durch den Treiberkern bereitgestellt */
+/* The following procedures are supplied by the driver library */
+/*---------------------------------------------------------------------------*/
+/* Einige einfache Ausgaberoutinen, die die Verwendung von printf() ersparen */
+/* Nur waehrend der Initialisierung in init_device() verwenden!! */
+/* Some simple console output routines, that make printf() unnecessary */
+/* May only be used during initialisation, inside init_device()!! */
+void far pch(byte character);
+/* Gibt ein Zeichen auf die Konsole aus
+ Print a character onto the console
+*/
+void far pstr(byte near *string);
+/* Gibt einen C-String auf die Konsole aus
+ Print a C string onto the console
+*/
+void far pnum(u16 num);
+/* Gibt einen numerischen Wert dezimal aus
+ Print a decimal numerical value onto the console
+*/
+void far phex(u16 hex);
+/* Gibt einen numerischen Wert hexadezimal aus
+ Print a hexadecimal numerical value onto the console
+*/
+#endif // _WIN32
diff --git a/flexdrv/resource.h b/flexdrv/resource.h
new file mode 100644
index 0000000..0e1095c
--- /dev/null
+++ b/flexdrv/resource.h
@@ -0,0 +1,12 @@
+#define IDD_DIALOG1 101
+#define IDC_PORT 1000
+#define IDC_MODE 1001
+#define IDC_TXDELAY 1002
+#define IDC_FULLDUPLEX 1003
+#define IDC_EXTMODEM 1004
+#define IDC_BITRATE 1005
+#define IDC_PTTMUTE 1006
+#define IDC_FORCEHWEPP 1007
+#define IDC_SWEMULEPP 1008
+#define IDC_SWEMULECP 1009
+#define IDC_STATIC -1
diff --git a/install-sh b/install-sh
new file mode 100755
index 0000000..e843669
--- /dev/null
+++ b/install-sh
@@ -0,0 +1,250 @@
+#!/bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission. M.I.T. makes no representations about the
+# suitability of this software for any purpose. It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+ case $1 in
+ -c) instcmd="$cpprog"
+ shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd="$stripprog"
+ shift
+ continue;;
+
+ -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+ shift
+ continue;;
+
+ -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+ shift
+ continue;;
+
+ *) if [ x"$src" = x ]
+ then
+ src=$1
+ else
+ # this colon is to work around a 386BSD /bin/sh bug
+ :
+ dst=$1
+ fi
+ shift
+ continue;;
+ esac
+done
+
+if [ x"$src" = x ]
+then
+ echo "install: no input file specified"
+ exit 1
+else
+ true
+fi
+
+if [ x"$dir_arg" != x ]; then
+ dst=$src
+ src=""
+
+ if [ -d $dst ]; then
+ instcmd=:
+ else
+ instcmd=mkdir
+ fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+ if [ -f $src -o -d $src ]
+ then
+ true
+ else
+ echo "install: $src does not exist"
+ exit 1
+ fi
+
+ if [ x"$dst" = x ]
+ then
+ echo "install: no destination specified"
+ exit 1
+ else
+ true
+ fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+ if [ -d $dst ]
+ then
+ dst="$dst"/`basename $src`
+ else
+ true
+ fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+# this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+ pathcomp="${pathcomp}${1}"
+ shift
+
+ if [ ! -d "${pathcomp}" ] ;
+ then
+ $mkdirprog "${pathcomp}"
+ else
+ true
+ fi
+
+ pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+ $doit $instcmd $dst &&
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+ if [ x"$transformarg" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ dstfile=`basename $dst $transformbasename |
+ sed $transformarg`$transformbasename
+ fi
+
+# don't allow the sed command to completely eliminate the filename
+
+ if [ x"$dstfile" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ true
+ fi
+
+# Make a temp file name in the proper directory.
+
+ dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+ $doit $instcmd $src $dsttmp &&
+
+ trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing. If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+ $doit $rmcmd -f $dstdir/$dstfile &&
+ $doit $mvcmd $dsttmp $dstdir/$dstfile
+
+fi &&
+
+
+exit 0
diff --git a/intl/ChangeLog b/intl/ChangeLog
new file mode 100644
index 0000000..1989501
--- /dev/null
+++ b/intl/ChangeLog
@@ -0,0 +1,1086 @@
+1998-04-29 Ulrich Drepper <drepper at cygnus.com>
+
+ * intl/localealias.c (read_alias_file): Use unsigned char for
+ local variables. Remove unused variable tp.
+ * intl/l10nflist.c (_nl_normalize_codeset): Use unsigned char *
+ for type of codeset. For loosing Solaris systems.
+ * intl/loadinfo.h: Adapt prototype of _nl_normalize_codeset.
+ * intl/bindtextdom.c (BINDTEXTDOMAIN): Don't define local variable
+ len if not needed.
+ Patches by Jim Meyering.
+
+1998-04-28 Ulrich Drepper <drepper at cygnus.com>
+
+ * loadmsgcat.c (_nl_load_domain): Don't assign the element use_mmap if
+ mmap is not supported.
+
+ * hash-string.h: Don't include <values.h>.
+
+1998-04-27 Ulrich Drepper <drepper at cygnus.com>
+
+ * textdomain.c: Use strdup is available.
+
+ * localealias.c: Define HAVE_MEMPCPY so that we can use this
+ function. Define and use semapahores to protect modfication of
+ global objects when compiling for glibc. Add code to allow
+ freeing alias table.
+
+ * l10nflist.c: Don't assume stpcpy not being a macro.
+
+ * gettextP.h: Define internal_function macri if not already done.
+ Use glibc byte-swap macros instead of defining SWAP when compiled
+ for glibc.
+ (struct loaded_domain): Add elements to allow unloading.
+
+ * Makefile.in (distclean): Don't remove libintl.h here.
+
+ * bindtextdomain.c: Carry over changes from glibc. Use strdup if
+ available.
+
+ * dcgettext.c: Don't assume stpcpy not being a macro. Mark internal
+ functions. Add memory freeing code for glibc.
+
+ * dgettext.c: Update copyright.
+
+ * explodename.c: Include stdlib.h and string.h only if they exist.
+ Use strings.h eventually.
+
+ * finddomain.c: Mark internal functions. Use strdup if available.
+ Add memory freeing code for glibc.
+
+1997-10-10 20:00 Ulrich Drepper <drepper at cygnus.com>
+
+ * libgettext.h: Fix dummy textdomain and bindtextdomain macros.
+ They should return reasonable values.
+ Reported by Tom Tromey <tromey at cygnus.com>.
+
+1997-09-16 03:33 Ulrich Drepper <drepper at cygnus.com>
+
+ * libgettext.h: Define PARAMS also to `args' if __cplusplus is defined.
+ * intlh.inst.in: Likewise.
+ Reported by Jean-Marc Lasgouttes <Jean-Marc.Lasgouttes at inria.fr>.
+
+ * libintl.glibc: Update from current glibc version.
+
+1997-09-06 02:10 Ulrich Drepper <drepper at cygnus.com>
+
+ * intlh.inst.in: Reformat copyright.
+
+1997-08-19 15:22 Ulrich Drepper <drepper at cygnus.com>
+
+ * dcgettext.c (DCGETTEXT): Remove wrong comment.
+
+1997-08-16 00:13 Ulrich Drepper <drepper at cygnus.com>
+
+ * Makefile.in (install-data): Don't change directory to install.
+
+1997-08-01 14:30 Ulrich Drepper <drepper at cygnus.com>
+
+ * cat-compat.c: Fix copyright.
+
+ * localealias.c: Don't define strchr unless !HAVE_STRCHR.
+
+ * loadmsgcat.c: Update copyright. Fix typos.
+
+ * l10nflist.c: Don't define strchr unless !HAVE_STRCHR.
+ (_nl_make_l10nflist): Handle sponsor and revision correctly.
+
+ * gettext.c: Update copyright.
+ * gettext.h: Likewise.
+ * hash-string.h: Likewise.
+
+ * finddomain.c: Remoave dead code. Define strchr only if
+ !HAVE_STRCHR.
+
+ * explodename.c: Include <sys/types.h>.
+
+ * explodename.c: Reformat copyright text.
+ (_nl_explode_name): Fix typo.
+
+ * dcgettext.c: Define and use __set_errno.
+ (guess_category_value): Don't use setlocale if HAVE_LC_MESSAGES is
+ not defined.
+
+ * bindtextdom.c: Pretty printing.
+
+1997-05-01 02:25 Ulrich Drepper <drepper at cygnus.com>
+
+ * dcgettext.c (guess_category_value): Don't depend on
+ HAVE_LC_MESSAGES. We don't need the macro here.
+ Patch by Bruno Haible <haible at ilog.fr>.
+
+ * cat-compat.c (textdomain): DoN't refer to HAVE_SETLOCALE_NULL
+ macro. Instead use HAVE_LOCALE_NULL and define it when using
+ glibc, as in dcgettext.c.
+ Patch by Bruno Haible <haible at ilog.fr>.
+
+ * Makefile.in (CPPFLAGS): New variable. Reported by Franc,ois
+ Pinard.
+
+Mon Mar 10 06:51:17 1997 Ulrich Drepper <drepper at cygnus.com>
+
+ * Makefile.in: Implement handling of libtool.
+
+ * gettextP.h: Change data structures for use of generic lowlevel
+ i18n file handling.
+
+Wed Dec 4 20:21:18 1996 Ulrich Drepper <drepper at cygnus.com>
+
+ * textdomain.c: Put parentheses around arguments of memcpy macro
+ definition.
+ * localealias.c: Likewise.
+ * l10nflist.c: Likewise.
+ * finddomain.c: Likewise.
+ * bindtextdom.c: Likewise.
+ Reported by Thomas Esken.
+
+Mon Nov 25 22:57:51 1996 Ulrich Drepper <drepper at cygnus.com>
+
+ * textdomain.c: Move definition of `memcpy` macro to right
+ position.
+
+Fri Nov 22 04:01:58 1996 Ulrich Drepper <drepper at cygnus.com>
+
+ * finddomain.c [!HAVE_STRING_H && !_LIBC]: Define memcpy using
+ bcopy if not already defined. Reported by Thomas Esken.
+ * bindtextdom.c: Likewise.
+ * l10nflist.c: Likewise.
+ * localealias.c: Likewise.
+ * textdomain.c: Likewise.
+
+Tue Oct 29 11:10:27 1996 Ulrich Drepper <drepper at cygnus.com>
+
+ * Makefile.in (libdir): Change to use exec_prefix instead of
+ prefix. Reported by Knut-H�vardAksnes <etokna at eto.ericsson.se>.
+
+Sat Aug 31 03:07:09 1996 Ulrich Drepper <drepper at cygnus.com>
+
+ * l10nflist.c (_nl_normalize_codeset): We convert to lower case,
+ so don't prepend uppercase `ISO' for only numeric arg.
+
+Fri Jul 19 00:15:46 1996 Ulrich Drepper <drepper at cygnus.com>
+
+ * l10nflist.c: Move inclusion of argz.h, ctype.h, stdlib.h after
+ definition of _GNU_SOURCE. Patch by Roland McGrath.
+
+ * Makefile.in (uninstall): Fix another bug with `for' loop and
+ empty arguments. Patch by Jim Meyering. Correct name os
+ uninstalled files: no intl- prefix anymore.
+
+ * Makefile.in (install-data): Again work around shells which
+ cannot handle mpty for list. Reported by Jim Meyering.
+
+Sat Jul 13 18:11:35 1996 Ulrich Drepper <drepper at cygnus.com>
+
+ * Makefile.in (install): Split goal. Now depend on install-exec
+ and install-data.
+ (install-exec, install-data): New goals. Created from former
+ install goal.
+ Reported by Karl Berry.
+
+Sat Jun 22 04:58:14 1996 Ulrich Drepper <drepper at cygnus.com>
+
+ * Makefile.in (MKINSTALLDIRS): New variable. Path to
+ mkinstalldirs script.
+ (install): use MKINSTALLDIRS variable or if the script is not present
+ try to find it in the $top_scrdir).
+
+Wed Jun 19 02:56:56 1996 Ulrich Drepper <drepper at cygnus.com>
+
+ * l10nflist.c: Linux libc *partly* includes the argz_* functions.
+ Grr. Work around by renaming the static version and use macros
+ for renaming.
+
+Tue Jun 18 20:11:17 1996 Ulrich Drepper <drepper at cygnus.com>
+
+ * l10nflist.c: Correct presence test macros of __argz_* functions.
+
+ * l10nflist.c: Include <argz.h> based on test of it instead when
+ __argz_* functions are available.
+ Reported by Andreas Schwab.
+
+Thu Jun 13 15:17:44 1996 Ulrich Drepper <drepper at cygnus.com>
+
+ * explodename.c, l10nflist.c: Define NULL for dumb systems.
+
+Tue Jun 11 17:05:13 1996 Ulrich Drepper <drepper at cygnus.com>
+
+ * intlh.inst.in, libgettext.h (dcgettext): Rename local variable
+ result to __result to prevent name clash.
+
+ * l10nflist.c, localealias.c, dcgettext.c: Define _GNU_SOURCE to
+ get prototype for stpcpy and strcasecmp.
+
+ * intlh.inst.in, libgettext.h: Move declaration of
+ `_nl_msg_cat_cntr' outside __extension__ block to prevent warning
+ from gcc's -Wnested-extern option.
+
+Fri Jun 7 01:58:00 1996 Ulrich Drepper <drepper at cygnus.com>
+
+ * Makefile.in (install): Remove comment.
+
+Thu Jun 6 17:28:17 1996 Ulrich Drepper <drepper at cygnus.com>
+
+ * Makefile.in (install): Work around for another Buglix stupidity.
+ Always use an `else' close for `if's. Reported by Nelson Beebe.
+
+ * Makefile.in (intlh.inst): Correct typo in phony rule.
+ Reported by Nelson Beebe.
+
+Thu Jun 6 01:49:52 1996 Ulrich Drepper <drepper at cygnus.com>
+
+ * dcgettext.c (read_alias_file): Rename variable alloca_list to
+ block_list as the macro calls assume.
+ Patch by Eric Backus.
+
+ * localealias.c [!HAVE_ALLOCA]: Define alloca as macro using
+ malloc.
+ (read_alias_file): Rename varriabe alloca_list to block_list as the
+ macro calls assume.
+ Patch by Eric Backus.
+
+ * l10nflist.c: Correct conditional for <argz.h> inclusion.
+ Reported by Roland McGrath.
+
+ * Makefile.in (all): Depend on all- at USE_INCLUDED_LIBINTL@, not
+ all- at USE_NLS@.
+
+ * Makefile.in (install): intlh.inst comes from local dir, not
+ $(srcdir).
+
+ * Makefile.in (intlh.inst): Special handling of this goal. If
+ used in gettext, this is really a rul to construct this file. If
+ used in any other package it is defined as a .PHONY rule with
+ empty body.
+
+ * finddomain.c: Extract locale file information handling into
+ l10nfile.c. Rename local stpcpy__ function to stpcpy.
+
+ * dcgettext.c (stpcpy): Add local definition.
+
+ * l10nflist.c: Solve some portability problems. Patches partly by
+ Thomas Esken. Add local definition of stpcpy.
+
+Tue Jun 4 02:47:49 1996 Ulrich Drepper <drepper at cygnus.com>
+
+ * intlh.inst.in: Don't depend including <locale.h> on
+ HAVE_LOCALE_H. Instead configure must rewrite this fiile
+ depending on the result of the configure run.
+
+ * Makefile.in (install): libintl.inst is now called intlh.inst.
+ Add rules for updating intlh.inst from intlh.inst.in.
+
+ * libintl.inst: Renamed to intlh.inst.in.
+
+ * localealias.c, dcgettext.c [__GNUC__]: Define HAVE_ALLOCA to 1
+ because gcc has __buitlin_alloca.
+ Reported by Roland McGrath.
+
+Mon Jun 3 00:32:16 1996 Ulrich Drepper <drepper at cygnus.com>
+
+ * Makefile.in (installcheck): New goal to fulfill needs of
+ automake's distcheck.
+
+ * Makefile.in (install): Reorder commands so that VERSION is
+ found.
+
+ * Makefile.in (gettextsrcdir): Now use subdirectory intl/ in
+ @datadir@/gettext.
+ (COMSRCS): Add l10nfile.c.
+ (OBJECTS): Add l10nfile.o.
+ (DISTFILES): Rename to DISTFILE.normal. Remove $(DISTFILES.common).
+ (DISTFILE.gettext): Remove $(DISTFILES.common).
+ (all-gettext): Remove goal.
+ (install): If $(PACKAGE) = gettext install, otherwose do nothing. No
+ package but gettext itself should install libintl.h + headers.
+ (dist): Extend goal to work for gettext, too.
+ (dist-gettext): Remove goal.
+
+ * dcgettext.c [!HAVE_ALLOCA]: Define macro alloca by using malloc.
+
+Sun Jun 2 17:33:06 1996 Ulrich Drepper <drepper at cygnus.com>
+
+ * loadmsgcat.c (_nl_load_domain): Parameter is now comes from
+ find_l10nfile.
+
+Sat Jun 1 02:23:03 1996 Ulrich Drepper <drepper at cygnus.com>
+
+ * l10nflist.c (__argz_next): Add definition.
+
+ * dcgettext.c [!HAVE_ALLOCA]: Add code for handling missing alloca
+ code. Use new l10nfile handling.
+
+ * localealias.c [!HAVE_ALLOCA]: Add code for handling missing
+ alloca code.
+
+ * l10nflist.c: Initial revision.
+
+Tue Apr 2 18:51:18 1996 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in (all-gettext): New goal. Same as all-yes.
+
+Thu Mar 28 23:01:22 1996 Karl Eichwalder <ke at ke.central.de>
+
+ * Makefile.in (gettextsrcdir): Define using @datadir at .
+
+Tue Mar 26 12:39:14 1996 Ulrich Drepper <drepper at myware>
+
+ * finddomain.c: Include <ctype.h>. Reported by Roland McGrath.
+
+Sat Mar 23 02:00:35 1996 Ulrich Drepper <drepper at myware>
+
+ * finddomain.c (stpcpy): Rename to stpcpy__ to prevent clashing
+ with external declaration.
+
+Sat Mar 2 00:47:09 1996 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in (all-no): Rename from all_no.
+
+Sat Feb 17 00:25:59 1996 Ulrich Drepper <drepper at myware>
+
+ * gettextP.h [loaded_domain]: Array `successor' must now contain up
+ to 63 elements (because of codeset name normalization).
+
+ * finddomain.c: Implement codeset name normalization.
+
+Thu Feb 15 04:39:09 1996 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in (all): Define to `all- at USE_NLS@'.
+ (all-yes, all_no): New goals. `all-no' is noop, `all-yes'
+ is former all.
+
+Mon Jan 15 21:46:01 1996 Howard Gayle <howard at hal.com>
+
+ * localealias.c (alias_compare): Increment string pointers in loop
+ of strcasecmp replacement.
+
+Fri Dec 29 21:16:34 1995 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in (install-src): Who commented this goal out ? :-)
+
+Fri Dec 29 15:08:16 1995 Ulrich Drepper <drepper at myware>
+
+ * dcgettext.c (DCGETTEXT): Save `errno'. Failing system calls
+ should not effect it because a missing catalog is no error.
+ Reported by Harald K<o:>nig <koenig at tat.physik.uni-tuebingen.de>.
+
+Tue Dec 19 22:09:13 1995 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in (Makefile): Explicitly use $(SHELL) for running
+ shell scripts.
+
+Fri Dec 15 17:34:59 1995 Andreas Schwab <schwab at issan.informatik.uni-dortmund.de>
+
+ * Makefile.in (install-src): Only install library and header when
+ we use the own implementation. Don't do it when using the
+ system's gettext or catgets functions.
+
+ * dcgettext.c (find_msg): Must not swap domain->hash_size here.
+
+Sat Dec 9 16:24:37 1995 Ulrich Drepper <drepper at myware>
+
+ * localealias.c, libintl.inst, libgettext.h, hash-string.h,
+ gettextP.h, finddomain.c, dcgettext.c, cat-compat.c:
+ Use PARAMS instead of __P. Suggested by Roland McGrath.
+
+Tue Dec 5 11:39:14 1995 Larry Schwimmer <rosebud at cyclone.stanford.edu>
+
+ * libgettext.h: Use `#if !defined (_LIBINTL_H)' instead of `#if
+ !_LIBINTL_H' because Solaris defines _LIBINTL_H as empty.
+
+Mon Dec 4 15:42:07 1995 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in (install-src):
+ Install libintl.inst instead of libintl.h.install.
+
+Sat Dec 2 22:51:38 1995 Marcus Daniels <marcus at sysc.pdx.edu>
+
+ * cat-compat.c (textdomain):
+ Reverse order in which files are tried you load. First
+ try local file, when this failed absolute path.
+
+Wed Nov 29 02:03:53 1995 Nelson H. F. Beebe <beebe at math.utah.edu>
+
+ * cat-compat.c (bindtextdomain): Add missing { }.
+
+Sun Nov 26 18:21:41 1995 Ulrich Drepper <drepper at myware>
+
+ * libintl.inst: Add missing __P definition. Reported by Nelson Beebe.
+
+ * Makefile.in:
+ Add dummy `all' and `dvi' goals. Reported by Tom Tromey.
+
+Sat Nov 25 16:12:01 1995 Franc,ois Pinard <pinard at iro.umontreal.ca>
+
+ * hash-string.h: Capitalize arguments of macros.
+
+Sat Nov 25 12:01:36 1995 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in (DISTFILES): Prevent files names longer than 13
+ characters. libintl.h.glibc->libintl.glibc,
+ libintl.h.install->libintl.inst. Reported by Joshua R. Poulson.
+
+Sat Nov 25 11:31:12 1995 Eric Backus <ericb at lsid.hp.com>
+
+ * dcgettext.c: Fix bug in preprocessor conditionals.
+
+Sat Nov 25 02:35:27 1995 Nelson H. F. Beebe <beebe at math.utah.edu>
+
+ * libgettext.h: Solaris cc does not understand
+ #if !SYMBOL1 && !SYMBOL2. Sad but true.
+
+Thu Nov 23 16:22:14 1995 Ulrich Drepper <drepper at myware>
+
+ * hash-string.h (hash_string):
+ Fix for machine with >32 bit `unsigned long's.
+
+ * dcgettext.c (DCGETTEXT):
+ Fix horrible bug in loop for alternative translation.
+
+Thu Nov 23 01:45:29 1995 Ulrich Drepper <drepper at myware>
+
+ * po2tbl.sed.in, linux-msg.sed, xopen-msg.sed:
+ Some further simplifications in message number generation.
+
+Mon Nov 20 21:08:43 1995 Ulrich Drepper <drepper at myware>
+
+ * libintl.h.glibc: Use __const instead of const in prototypes.
+
+ * Makefile.in (install-src):
+ Install libintl.h.install instead of libintl.h. This
+ is a stripped-down version. Suggested by Peter Miller.
+
+ * libintl.h.install, libintl.h.glibc: Initial revision.
+
+ * localealias.c (_nl_expand_alias, read_alias_file):
+ Protect prototypes in type casts by __P.
+
+Tue Nov 14 16:43:58 1995 Ulrich Drepper <drepper at myware>
+
+ * hash-string.h: Correct prototype for hash_string.
+
+Sun Nov 12 12:42:30 1995 Ulrich Drepper <drepper at myware>
+
+ * hash-string.h (hash_string): Add prototype.
+
+ * gettextP.h: Fix copyright.
+ (SWAP): Add prototype.
+
+Wed Nov 8 22:56:33 1995 Ulrich Drepper <drepper at myware>
+
+ * localealias.c (read_alias_file): Forgot sizeof.
+ Avoid calling *printf function. This introduces a big overhead.
+ Patch by Roland McGrath.
+
+Tue Nov 7 14:21:08 1995 Ulrich Drepper <drepper at myware>
+
+ * finddomain.c, cat-compat.c: Wrong indentation in #if for stpcpy.
+
+ * finddomain.c (stpcpy):
+ Define substitution function local. The macro was to flaky.
+
+ * cat-compat.c: Fix typo.
+
+ * xopen-msg.sed, linux-msg.sed:
+ While bringing message number to right place only accept digits.
+
+ * linux-msg.sed, xopen-msg.sed: Now that the counter does not have
+ leading 0s we don't need to remove them. Reported by Marcus
+ Daniels.
+
+ * Makefile.in (../po/cat-id-tbl.o): Use $(top_srdir) in
+ dependency. Reported by Marcus Daniels.
+
+ * cat-compat.c: (stpcpy) [!_LIBC && !HAVE_STPCPY]: Define replacement.
+ Generally cleanup using #if instead of #ifndef.
+
+ * Makefile.in: Correct typos in comment. By Franc,ois Pinard.
+
+Mon Nov 6 00:27:02 1995 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in (install-src): Don't install libintl.h and libintl.a
+ if we use an available gettext implementation.
+
+Sun Nov 5 22:02:08 1995 Ulrich Drepper <drepper at myware>
+
+ * libgettext.h: Fix typo: HAVE_CATGETTS -> HAVE_CATGETS. Reported
+ by Franc,ois Pinard.
+
+ * libgettext.h: Use #if instead of #ifdef/#ifndef.
+
+ * finddomain.c:
+ Comments describing what has to be done should start with FIXME.
+
+Sun Nov 5 19:38:01 1995 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in (DISTFILES): Split. Use DISTFILES with normal meaning.
+ DISTFILES.common names the files common to both dist goals.
+ DISTFILES.gettext are the files only distributed in GNU gettext.
+
+Sun Nov 5 17:32:54 1995 Ulrich Drepper <drepper at myware>
+
+ * dcgettext.c (DCGETTEXT): Correct searching in derived locales.
+ This was necessary since a change in _nl_find_msg several weeks
+ ago. I really don't know this is still not fixed.
+
+Sun Nov 5 12:43:12 1995 Ulrich Drepper <drepper at myware>
+
+ * loadmsgcat.c (_nl_load_domain): Test for FILENAME == NULL. This
+ might mark a special condition.
+
+ * finddomain.c (make_entry_rec): Don't make illegal entry as decided.
+
+ * Makefile.in (dist): Suppress error message when ln failed.
+ Get files from $(srcdir) explicitly.
+
+ * libgettext.h (gettext_const): Rename to gettext_noop.
+
+Fri Nov 3 07:36:50 1995 Ulrich Drepper <drepper at myware>
+
+ * finddomain.c (make_entry_rec):
+ Protect against wrong locale names by testing mask.
+
+ * libgettext.h (gettext_const): Add macro definition.
+ Capitalize macro arguments.
+
+Thu Nov 2 23:15:51 1995 Ulrich Drepper <drepper at myware>
+
+ * finddomain.c (_nl_find_domain):
+ Test for pointer != NULL before accessing value.
+ Reported by Tom Tromey.
+
+ * gettext.c (NULL):
+ Define as (void*)0 instad of 0. Reported by Franc,ois Pinard.
+
+Mon Oct 30 21:28:52 1995 Ulrich Drepper <drepper at myware>
+
+ * po2tbl.sed.in: Serious typo bug fixed by Jim Meyering.
+
+Sat Oct 28 23:20:47 1995 Ulrich Drepper <drepper at myware>
+
+ * libgettext.h: Disable dcgettext optimization for Solaris 2.3.
+
+ * localealias.c (alias_compare):
+ Peter Miller reported that tolower in some systems is
+ even dumber than I thought. Protect call by `isupper'.
+
+Fri Oct 27 22:22:51 1995 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in (libdir, includedir): New variables.
+ (install-src): Install libintl.a and libintl.h in correct dirs.
+
+Fri Oct 27 22:07:29 1995 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in (SOURCES): Fix typo: intrl.compat.c -> intl-compat.c.
+
+ * po2tbl.sed.in: Patch for buggy SEDs by Christian von Roques.
+
+ * localealias.c:
+ Fix typo and superflous test. Reported by Christian von Roques.
+
+Fri Oct 6 11:52:05 1995 Ulrich Drepper <drepper at myware>
+
+ * finddomain.c (_nl_find_domain):
+ Correct some remainder from the pre-CEN syntax. Now
+ we don't have a constant number of successors anymore.
+
+Wed Sep 27 21:41:13 1995 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in (DISTFILES): Add libintl.h.glibc.
+
+ * Makefile.in (dist-libc): Add goal for packing sources for glibc.
+ (COMSRCS, COMHDRS): Splitted to separate sources shared with glibc.
+
+ * loadmsgcat.c: Forget to continue #if line.
+
+ * localealias.c:
+ [_LIBC]: Rename strcasecmp to __strcasecmp to keep ANSI C name
+ space clean.
+
+ * dcgettext.c, finddomain.c: Better comment to last change.
+
+ * loadmsgcat.c:
+ [_LIBC]: Rename fstat, open, close, read, mmap, and munmap to
+ __fstat, __open, __close, __read, __mmap, and __munmap resp
+ to keep ANSI C name space clean.
+
+ * finddomain.c:
+ [_LIBC]: Rename stpcpy to __stpcpy to keep ANSI C name space clean.
+
+ * dcgettext.c:
+ [_LIBC]: Rename getced and stpcpy to __getcwd and __stpcpy resp to
+ keep ANSI C name space clean.
+
+ * libgettext.h:
+ Include sys/types.h for those old SysV systems out there.
+ Reported by Francesco Potorti`.
+
+ * loadmsgcat.c (use_mmap): Define if compiled for glibc.
+
+ * bindtextdom.c: Include all those standard headers
+ unconditionally if _LIBC is defined.
+
+ * finddomain.c: Fix 2 times defiend -> defined.
+
+ * textdomain.c: Include libintl.h instead of libgettext.h when
+ compiling for glibc. Include all those standard headers
+ unconditionally if _LIBC is defined.
+
+ * localealias.c, loadmsgcat.c: Prepare to be compiled in glibc.
+
+ * gettext.c:
+ Include libintl.h instead of libgettext.h when compiling for glibc.
+ Get NULL from stddef.h if we compile for glibc.
+
+ * finddomain.c: Include libintl.h instead of libgettext.h when
+ compiling for glibc. Include all those standard headers
+ unconditionally if _LIBC is defined.
+
+ * dcgettext.c: Include all those standard headers unconditionally
+ if _LIBC is defined.
+
+ * dgettext.c: If compiled in glibc include libintl.h instead of
+ libgettext.h.
+ (locale.h): Don't rely on HAVE_LOCALE_H when compiling for glibc.
+
+ * dcgettext.c: If compiled in glibc include libintl.h instead of
+ libgettext.h.
+ (getcwd): Don't rely on HAVE_GETCWD when compiling for glibc.
+
+ * bindtextdom.c:
+ If compiled in glibc include libintl.h instead of libgettext.h.
+
+Mon Sep 25 22:23:06 1995 Ulrich Drepper <drepper at myware>
+
+ * localealias.c (_nl_expand_alias): Don't call bsearch if NMAP <= 0.
+ Reported by Marcus Daniels.
+
+ * cat-compat.c (bindtextdomain):
+ String used in putenv must not be recycled.
+ Reported by Marcus Daniels.
+
+ * libgettext.h (__USE_GNU_GETTEXT):
+ Additional symbol to signal that we use GNU gettext
+ library.
+
+ * cat-compat.c (bindtextdomain):
+ Fix bug with the strange stpcpy replacement.
+ Reported by Nelson Beebe.
+
+Sat Sep 23 08:23:51 1995 Ulrich Drepper <drepper at myware>
+
+ * cat-compat.c: Include <string.h> for stpcpy prototype.
+
+ * localealias.c (read_alias_file):
+ While expand strdup code temporary variable `cp' hided
+ higher level variable with same name. Rename to `tp'.
+
+ * textdomain.c (textdomain):
+ Avoid warning by using temporary variable in strdup code.
+
+ * finddomain.c (_nl_find_domain): Remove unused variable `application'.
+
+Thu Sep 21 15:51:44 1995 Ulrich Drepper <drepper at myware>
+
+ * localealias.c (alias_compare):
+ Use strcasecmp() only if available. Else use
+ implementation in place.
+
+ * intl-compat.c:
+ Wrapper functions now call *__ functions instead of __*.
+
+ * libgettext.h: Declare prototypes for *__ functions instead for __*.
+
+ * cat-compat.c, loadmsgcat.c:
+ Don't use xmalloc, xstrdup, and stpcpy. These functions are not part
+ of the standard libc and so prevent libintl.a from being used
+ standalone.
+
+ * bindtextdom.c:
+ Don't use xmalloc, xstrdup, and stpcpy. These functions are not part
+ of the standard libc and so prevent libintl.a from being used
+ standalone.
+ Rename to bindtextdomain__ if not used in GNU C Library.
+
+ * dgettext.c:
+ Rename function to dgettext__ if not used in GNU C Library.
+
+ * gettext.c:
+ Don't use xmalloc, xstrdup, and stpcpy. These functions are not part
+ of the standard libc and so prevent libintl.a from being used
+ standalone.
+ Functions now called gettext__ if not used in GNU C Library.
+
+ * dcgettext.c, localealias.c, textdomain.c, finddomain.c:
+ Don't use xmalloc, xstrdup, and stpcpy. These functions are not part
+ of the standard libc and so prevent libintl.a from being used
+ standalone.
+
+Sun Sep 17 23:14:49 1995 Ulrich Drepper <drepper at myware>
+
+ * finddomain.c: Correct some bugs in handling of CEN standard
+ locale definitions.
+
+Thu Sep 7 01:49:28 1995 Ulrich Drepper <drepper at myware>
+
+ * finddomain.c: Implement CEN syntax.
+
+ * gettextP.h (loaded_domain): Extend number of successors to 31.
+
+Sat Aug 19 19:25:29 1995 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in (aliaspath): Remove path to X11 locale dir.
+
+ * Makefile.in: Make install-src depend on install. This helps
+ gettext to install the sources and other packages can use the
+ install goal.
+
+Sat Aug 19 15:19:33 1995 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in (uninstall): Remove stuff installed by install-src.
+
+Tue Aug 15 13:13:53 1995 Ulrich Drepper <drepper at myware>
+
+ * VERSION.in: Initial revision.
+
+ * Makefile.in (DISTFILES):
+ Add VERSION file. This is not necessary for gettext, but
+ for other packages using this library.
+
+Tue Aug 15 06:16:44 1995 Ulrich Drepper <drepper at myware>
+
+ * gettextP.h (_nl_find_domain):
+ New prototype after changing search strategy.
+
+ * finddomain.c (_nl_find_domain):
+ We now try only to find a specified catalog. Fall back to other
+ catalogs listed in the locale list is now done in __dcgettext.
+
+ * dcgettext.c (__dcgettext):
+ Now we provide message fall back even to different languages.
+ I.e. if a message is not available in one language all the other
+ in the locale list a tried. Formerly fall back was only possible
+ within one language. Implemented by moving one loop from
+ _nl_find_domain to here.
+
+Mon Aug 14 23:45:50 1995 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in (gettextsrcdir):
+ Directory where source of GNU gettext library are made
+ available.
+ (INSTALL, INSTALL_DATA): Programs used for installing sources.
+ (gettext-src): New. Rule to install GNU gettext sources for use in
+ gettextize shell script.
+
+Sun Aug 13 14:40:48 1995 Ulrich Drepper <drepper at myware>
+
+ * loadmsgcat.c (_nl_load_domain):
+ Use mmap for loading only when munmap function is
+ also available.
+
+ * Makefile.in (install): Depend on `all' goal.
+
+Wed Aug 9 11:04:33 1995 Ulrich Drepper <drepper at myware>
+
+ * localealias.c (read_alias_file):
+ Do not overwrite '\n' when terminating alias value string.
+
+ * localealias.c (read_alias_file):
+ Handle long lines. Ignore the rest not fitting in
+ the buffer after the initial `fgets' call.
+
+Wed Aug 9 00:54:29 1995 Ulrich Drepper <drepper at myware>
+
+ * gettextP.h (_nl_load_domain):
+ Add prototype, replacing prototype for _nl_load_msg_cat.
+
+ * finddomain.c (_nl_find_domain):
+ Remove unneeded variable filename and filename_len.
+ (expand_alias): Remove prototype because functions does not
+ exist anymore.
+
+ * localealias.c (read_alias_file):
+ Change type of fname_len parameter to int.
+ (xmalloc): Add prototype.
+
+ * loadmsgcat.c: Better prototypes for xmalloc.
+
+Tue Aug 8 22:30:39 1995 Ulrich Drepper <drepper at myware>
+
+ * finddomain.c (_nl_find_domain):
+ Allow alias name to be constructed from the four components.
+
+ * Makefile.in (aliaspath): New variable. Set to preliminary value.
+ (SOURCES): Add localealias.c.
+ (OBJECTS): Add localealias.o.
+
+ * gettextP.h: Add prototype for _nl_expand_alias.
+
+ * finddomain.c: Aliasing handled in intl/localealias.c.
+
+ * localealias.c: Aliasing for locale names.
+
+ * bindtextdom.c: Better prototypes for xmalloc and xstrdup.
+
+Mon Aug 7 23:47:42 1995 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in (DISTFILES): gettext.perl is now found in misc/.
+
+ * cat-compat.c (bindtextdomain):
+ Correct implementation. dirname parameter was not used.
+ Reported by Marcus Daniels.
+
+ * gettextP.h (loaded_domain):
+ New fields `successor' and `decided' for oo, lazy
+ message handling implementation.
+
+ * dcgettext.c:
+ Adopt for oo, lazy message handliing.
+ Now we can inherit translations from less specific locales.
+ (find_msg): New function.
+
+ * loadmsgcat.c, finddomain.c:
+ Complete rewrite. Implement oo, lazy message handling :-).
+ We now have an additional environment variable `LANGUAGE' with
+ a higher priority than LC_ALL for the LC_MESSAGE locale.
+ Here we can set a colon separated list of specifications each
+ of the form `language[_territory[.codeset]][@modifier]'.
+
+Sat Aug 5 09:55:42 1995 Ulrich Drepper <drepper at myware>
+
+ * finddomain.c (unistd.h):
+ Include to get _PC_PATH_MAX defined on system having it.
+
+Fri Aug 4 22:42:00 1995 Ulrich Drepper <drepper at myware>
+
+ * finddomain.c (stpcpy): Include prototype.
+
+ * Makefile.in (dist): Remove `copying instead' message.
+
+Wed Aug 2 18:52:03 1995 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in (ID, TAGS): Do not use $^.
+
+Tue Aug 1 20:07:11 1995 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in (TAGS, ID): Use $^ as command argument.
+ (TAGS): Give etags -o option t write to current directory,
+ not $(srcdir).
+ (ID): Use $(srcdir) instead os $(top_srcdir)/src.
+ (distclean): Remove ID.
+
+Sun Jul 30 11:51:46 1995 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in (gnulocaledir):
+ New variable, always using share/ for data directory.
+ (DEFS): Add GNULOCALEDIR, used in finddomain.c.
+
+ * finddomain.c (_nl_default_dirname):
+ Set to GNULOCALEDIR, because it always has to point
+ to the directory where GNU gettext Library writes it to.
+
+ * intl-compat.c (textdomain, bindtextdomain):
+ Undefine macros before function definition.
+
+Sat Jul 22 01:10:02 1995 Ulrich Drepper <drepper at myware>
+
+ * libgettext.h (_LIBINTL_H):
+ Protect definition in case where this file is included as
+ libgettext.h on Solaris machines. Add comment about this.
+
+Wed Jul 19 02:36:42 1995 Ulrich Drepper <drepper at myware>
+
+ * intl-compat.c (textdomain): Correct typo.
+
+Wed Jul 19 01:51:35 1995 Ulrich Drepper <drepper at myware>
+
+ * dcgettext.c (dcgettext): Function now called __dcgettext.
+
+ * dgettext.c (dgettext): Now called __dgettext and calls
+ __dcgettext.
+
+ * gettext.c (gettext):
+ Function now called __gettext and calls __dgettext.
+
+ * textdomain.c (textdomain): Function now called __textdomain.
+
+ * bindtextdom.c (bindtextdomain): Function now called
+ __bindtextdomain.
+
+ * intl-compat.c: Initial revision.
+
+ * Makefile.in (SOURCES): Add intl-compat.c.
+ (OBJECTS): We always compile the GNU gettext library functions.
+ OBJECTS contains all objects but cat-compat.o, ../po/cat-if-tbl.o,
+ and intl-compat.o.
+ (GETTOBJS): Contains now only intl-compat.o.
+
+ * libgettext.h:
+ Re-include protection matches dualistic character of libgettext.h.
+ For all functions in GNU gettext library define __ counter part.
+
+ * finddomain.c (strchr): Define as index if not found in C library.
+ (_nl_find_domain): For relative paths paste / in between.
+
+Tue Jul 18 16:37:45 1995 Ulrich Drepper <drepper at myware>
+
+ * loadmsgcat.c, finddomain.c: Add inclusion of sys/types.h.
+
+ * xopen-msg.sed: Fix bug with `msgstr ""' lines.
+ A little bit better comments.
+
+Tue Jul 18 01:18:27 1995 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in:
+ po-mode.el, makelinks, combine-sh are now found in ../misc.
+
+ * po-mode.el, makelinks, combine-sh, elisp-comp:
+ Moved to ../misc/.
+
+ * libgettext.h, gettextP.h, gettext.h: Uniform test for __STDC__.
+
+Sun Jul 16 22:33:02 1995 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in (INSTALL, INSTALL_DATA): New variables.
+ (install-data, uninstall): Install/uninstall .elc file.
+
+ * po-mode.el (Installation comment):
+ Add .pox as possible extension of .po files.
+
+Sun Jul 16 13:23:27 1995 Ulrich Drepper <drepper at myware>
+
+ * elisp-comp: Complete new version by Franc,ois: This does not
+ fail when not compiling in the source directory.
+
+Sun Jul 16 00:12:17 1995 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in (../po/cat-id-tbl.o):
+ Use $(MAKE) instead of make for recursive make.
+
+ * Makefile.in (.el.elc): Use $(SHELL) instead of /bin/sh.
+ (install-exec): Add missing dummy goal.
+ (install-data, uninstall): @ in multi-line shell command at
+ beginning, not in front of echo. Reported by Eric Backus.
+
+Sat Jul 15 00:21:28 1995 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in (DISTFILES):
+ Rename libgettext.perl to gettext.perl to fit in 14 chars
+ file systems.
+
+ * gettext.perl:
+ Rename to gettext.perl to fit in 14 chars file systems.
+
+Thu Jul 13 23:17:20 1995 Ulrich Drepper <drepper at myware>
+
+ * cat-compat.c: If !STDC_HEADERS try to include malloc.h.
+
+Thu Jul 13 20:55:02 1995 Ulrich Drepper <drepper at myware>
+
+ * po2tbl.sed.in: Pretty printing.
+
+ * linux-msg.sed, xopen-msg.sed:
+ Correct bugs with handling substitute flags in branches.
+
+ * hash-string.h (hash_string):
+ Old K&R compilers don't under stand `unsigned char'.
+
+ * gettext.h (nls_uint32):
+ Some old K&R compilers (eg HP) don't understand `unsigned int'.
+
+ * cat-compat.c (msg_to_cat_id): De-ANSI-fy prototypes.
+
+Thu Jul 13 01:34:33 1995 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in (ELCFILES): New variable.
+ (DISTFILES): Add elisp-comp.
+ Add implicit rule for .el -> .elc compilation.
+ (install-data): install $ELCFILES
+ (clean): renamed po-to-tbl and po-to-msg to po2tbl and po2msg resp.
+
+ * elisp-comp: Initial revision
+
+Wed Jul 12 16:14:52 1995 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in:
+ cat-id-tbl.c is now found in po/. This enables us to use an identical
+ intl/ directory in all packages.
+
+ * dcgettext.c (dcgettext): hashing does not work for table size <= 2.
+
+ * textdomain.c: fix typo (#if def -> #if defined)
+
+Tue Jul 11 18:44:43 1995 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in (stamp-cat-id): use top_srcdir to address source files
+ (DISTFILES,distclean): move tupdate.perl to src/
+
+ * po-to-tbl.sed.in:
+ add additional jump to clear change flag to recognize multiline strings
+
+Tue Jul 11 01:32:50 1995 Ulrich Drepper <drepper at myware>
+
+ * textdomain.c: Protect inclusion of stdlib.h and string.h.
+
+ * loadmsgcat.c: Protect inclusion of stdlib.h.
+
+ * libgettext.h: Protect inclusion of locale.h.
+ Allow use in C++ programs.
+ Define NULL is not happened already.
+
+ * Makefile.in (DISTFILES): ship po-to-tbl.sed.in instead of
+ po-to-tbl.sed.
+ (distclean): remove po-to-tbl.sed and tupdate.perl.
+
+ * tupdate.perl.in: Substitute Perl path even in exec line.
+ Don't include entries without translation from old .po file.
+
+Tue Jul 4 00:41:51 1995 Ulrich Drepper <drepper at myware>
+
+ * tupdate.perl.in: use "Updated: " in msgid "".
+
+ * cat-compat.c: Fix typo (LOCALDIR -> LOCALEDIR).
+ Define getenv if !__STDC__.
+
+ * bindtextdom.c: Protect stdlib.h and string.h inclusion.
+ Define free if !__STDC__.
+
+ * finddomain.c: Change DEF_MSG_DOM_DIR to LOCALEDIR.
+ Define free if !__STDC__.
+
+ * cat-compat.c: Change DEF_MSG_DOM_DIR to LOCALEDIR.
+
+Mon Jul 3 23:56:30 1995 Ulrich Drepper <drepper at myware>
+
+ * Makefile.in: Use LOCALEDIR instead of DEF_MSG_DOM_DIR.
+ Remove unneeded $(srcdir) from Makefile.in dependency.
+
+ * makelinks: Add copyright and short description.
+
+ * po-mode.el: Last version for 0.7.
+
+ * tupdate.perl.in: Fix die message.
+
+ * dcgettext.c: Protect include of string.h.
+
+ * gettext.c: Protect include of stdlib.h and further tries to get NULL.
+
+ * finddomain.c: Some corrections in includes.
+
+ * Makefile.in (INCLUDES): Prune list correct path to Makefile.in.
+
+ * po-to-tbl.sed: Adopt for new .po file format.
+
+ * linux-msg.sed, xopen-msg.sed: Adopt for new .po file format.
+
+Sun Jul 2 23:55:03 1995 Ulrich Drepper <drepper at myware>
+
+ * tupdate.perl.in: Complete rewrite for new .po file format.
+
+Sun Jul 2 02:06:50 1995 Ulrich Drepper <drepper at myware>
+
+ * First official release. This directory contains all the code
+ needed to internationalize own packages. It provides functions
+ which allow to use the X/Open catgets function with an interface
+ like the Uniforum gettext function. For system which does not
+ have neither of those a complete implementation is provided.
diff --git a/intl/Makefile.in b/intl/Makefile.in
new file mode 100644
index 0000000..4bdb186
--- /dev/null
+++ b/intl/Makefile.in
@@ -0,0 +1,214 @@
+# Makefile for directory with message catalog handling in GNU NLS Utilities.
+# Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+
+SHELL = /bin/sh
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+top_builddir = ..
+VPATH = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+transform = @program_transform_name@
+libdir = $(exec_prefix)/lib
+includedir = $(prefix)/include
+datadir = $(prefix)/@DATADIRNAME@
+localedir = $(datadir)/locale
+gnulocaledir = $(prefix)/share/locale
+gettextsrcdir = @datadir@/gettext/intl
+aliaspath = $(localedir):.
+subdir = intl
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+
+l = @l@
+
+AR = ar
+CC = @CC@
+LIBTOOL = @LIBTOOL@
+RANLIB = @RANLIB@
+
+DEFS = -DLOCALEDIR=\"$(localedir)\" -DGNULOCALEDIR=\"$(gnulocaledir)\" \
+-DLOCALE_ALIAS_PATH=\"$(aliaspath)\" @DEFS@
+CPPFLAGS = @CPPFLAGS@
+CFLAGS = @CFLAGS@
+LDFLAGS = @LDFLAGS@
+
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
+
+HEADERS = $(COMHDRS) libgettext.h loadinfo.h
+COMHDRS = gettext.h gettextP.h hash-string.h
+SOURCES = $(COMSRCS) intl-compat.c cat-compat.c
+COMSRCS = bindtextdom.c dcgettext.c dgettext.c gettext.c \
+finddomain.c loadmsgcat.c localealias.c textdomain.c l10nflist.c \
+explodename.c
+OBJECTS = @INTLOBJS@ bindtextdom.$lo dcgettext.$lo dgettext.$lo gettext.$lo \
+finddomain.$lo loadmsgcat.$lo localealias.$lo textdomain.$lo l10nflist.$lo \
+explodename.$lo
+CATOBJS = cat-compat.$lo ../po/cat-id-tbl.$lo
+GETTOBJS = intl-compat.$lo
+DISTFILES.common = ChangeLog Makefile.in linux-msg.sed po2tbl.sed.in \
+xopen-msg.sed $(HEADERS) $(SOURCES)
+DISTFILES.normal = VERSION
+DISTFILES.gettext = libintl.glibc intlh.inst.in
+
+.SUFFIXES:
+.SUFFIXES: .c .o .lo
+.c.o:
+ $(COMPILE) $<
+.c.lo:
+ $(LIBTOOL) --mode=compile $(COMPILE) $<
+
+INCLUDES = -I.. -I. -I$(top_srcdir)/intl -I$(top_srcdir)/lib
+
+all: all- at USE_INCLUDED_LIBINTL@
+
+all-yes: libintl.$la intlh.inst
+all-no:
+
+libintl.a: $(OBJECTS)
+ rm -f $@
+ $(AR) cru $@ $(OBJECTS)
+ $(RANLIB) $@
+
+libintl.la: $(OBJECTS)
+ $(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ $(OBJECTS) \
+ -version-info 1:0 -rpath $(libdir)
+
+../po/cat-id-tbl.$lo: ../po/cat-id-tbl.c $(top_srcdir)/po/$(PACKAGE).pot
+ cd ../po && $(MAKE) cat-id-tbl.$lo
+
+check: all
+
+# This installation goal is only used in GNU gettext. Packages which
+# only use the library should use install instead.
+
+# We must not install the libintl.h/libintl.a files if we are on a
+# system which has the gettext() function in its C library or in a
+# separate library or use the catgets interface. A special case is
+# where configure found a previously installed GNU gettext library.
+# If you want to use the one which comes with this version of the
+# package, you have to use `configure --with-included-gettext'.
+install: install-exec install-data
+install-exec: all
+ if test "$(PACKAGE)" = "gettext" \
+ && test '@INTLOBJS@' = '$(GETTOBJS)'; then \
+ if test -r $(MKINSTALLDIRS); then \
+ $(MKINSTALLDIRS) $(libdir) $(includedir); \
+ else \
+ $(top_srcdir)/mkinstalldirs $(libdir) $(includedir); \
+ fi; \
+ $(INSTALL_DATA) intlh.inst $(includedir)/libintl.h; \
+ $(INSTALL_DATA) libintl.a $(libdir)/libintl.a; \
+ else \
+ : ; \
+ fi
+install-data: all
+ if test "$(PACKAGE)" = "gettext"; then \
+ if test -r $(MKINSTALLDIRS); then \
+ $(MKINSTALLDIRS) $(gettextsrcdir); \
+ else \
+ $(top_srcdir)/mkinstalldirs $(gettextsrcdir); \
+ fi; \
+ $(INSTALL_DATA) VERSION $(gettextsrcdir)/VERSION; \
+ dists="$(DISTFILES.common)"; \
+ for file in $$dists; do \
+ $(INSTALL_DATA) $(srcdir)/$$file $(gettextsrcdir)/$$file; \
+ done; \
+ else \
+ : ; \
+ fi
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall:
+ dists="$(DISTFILES.common)"; \
+ for file in $$dists; do \
+ rm -f $(gettextsrcdir)/$$file; \
+ done
+
+info dvi:
+
+$(OBJECTS): ../config.h libgettext.h
+bindtextdom.$lo finddomain.$lo loadmsgcat.$lo: gettextP.h gettext.h loadinfo.h
+dcgettext.$lo: gettextP.h gettext.h hash-string.h loadinfo.h
+
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES)
+ here=`pwd`; cd $(srcdir) && etags -o $$here/TAGS $(HEADERS) $(SOURCES)
+
+id: ID
+
+ID: $(HEADERS) $(SOURCES)
+ here=`pwd`; cd $(srcdir) && mkid -f$$here/ID $(HEADERS) $(SOURCES)
+
+
+mostlyclean:
+ rm -f *.a *.o *.lo core core.*
+
+clean: mostlyclean
+
+distclean: clean
+ rm -f Makefile ID TAGS po2msg.sed po2tbl.sed
+
+maintainer-clean: distclean
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+
+# GNU gettext needs not contain the file `VERSION' but contains some
+# other files which should not be distributed in other packages.
+distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir: Makefile $(DISTFILES)
+ if test "$(PACKAGE)" = gettext; then \
+ additional="$(DISTFILES.gettext)"; \
+ else \
+ additional="$(DISTFILES.normal)"; \
+ fi; \
+ for file in $(DISTFILES.common) $$additional; do \
+ ln $(srcdir)/$$file $(distdir) 2> /dev/null \
+ || cp -p $(srcdir)/$$file $(distdir); \
+ done
+
+dist-libc:
+ tar zcvf intl-glibc.tar.gz $(COMSRCS) $(COMHDRS) libintl.h.glibc
+
+Makefile: Makefile.in ../config.status
+ cd .. \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+# The dependency for intlh.inst is different in gettext and all other
+# packages. Because we cannot you GNU make features we have to solve
+# the problem while rewriting Makefile.in.
+ at GT_YES@intlh.inst: intlh.inst.in ../config.status
+ at GT_YES@ cd .. \
+ at GT_YES@ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= \
+ at GT_YES@ $(SHELL) ./config.status
+ at GT_NO@.PHONY: intlh.inst
+ at GT_NO@intlh.inst:
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/intl/VERSION b/intl/VERSION
new file mode 100644
index 0000000..ee66b06
--- /dev/null
+++ b/intl/VERSION
@@ -0,0 +1 @@
+GNU gettext library from gettext-0.10.35
diff --git a/intl/bindtextdom.c b/intl/bindtextdom.c
new file mode 100644
index 0000000..d9c3f34
--- /dev/null
+++ b/intl/bindtextdom.c
@@ -0,0 +1,203 @@
+/* Implementation of the bindtextdomain(3) function
+ Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#else
+# ifdef HAVE_MALLOC_H
+# include <malloc.h>
+# else
+void free ();
+# endif
+#endif
+
+#if defined HAVE_STRING_H || defined _LIBC
+# include <string.h>
+#else
+# include <strings.h>
+# ifndef memcpy
+# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
+# endif
+#endif
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgettext.h"
+#endif
+#include "gettext.h"
+#include "gettextP.h"
+
+/* @@ end of prolog @@ */
+
+/* Contains the default location of the message catalogs. */
+extern const char _nl_default_dirname[];
+
+/* List with bindings of specific domains. */
+extern struct binding *_nl_domain_bindings;
+
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define BINDTEXTDOMAIN __bindtextdomain
+# ifndef strdup
+# define strdup(str) __strdup (str)
+# endif
+#else
+# define BINDTEXTDOMAIN bindtextdomain__
+#endif
+
+/* Specify that the DOMAINNAME message catalog will be found
+ in DIRNAME rather than in the system locale data base. */
+char *
+BINDTEXTDOMAIN (domainname, dirname)
+ const char *domainname;
+ const char *dirname;
+{
+ struct binding *binding;
+
+ /* Some sanity checks. */
+ if (domainname == NULL || domainname[0] == '\0')
+ return NULL;
+
+ for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)
+ {
+ int compare = strcmp (domainname, binding->domainname);
+ if (compare == 0)
+ /* We found it! */
+ break;
+ if (compare < 0)
+ {
+ /* It is not in the list. */
+ binding = NULL;
+ break;
+ }
+ }
+
+ if (dirname == NULL)
+ /* The current binding has be to returned. */
+ return binding == NULL ? (char *) _nl_default_dirname : binding->dirname;
+
+ if (binding != NULL)
+ {
+ /* The domain is already bound. If the new value and the old
+ one are equal we simply do nothing. Otherwise replace the
+ old binding. */
+ if (strcmp (dirname, binding->dirname) != 0)
+ {
+ char *new_dirname;
+
+ if (strcmp (dirname, _nl_default_dirname) == 0)
+ new_dirname = (char *) _nl_default_dirname;
+ else
+ {
+#if defined _LIBC || defined HAVE_STRDUP
+ new_dirname = strdup (dirname);
+ if (new_dirname == NULL)
+ return NULL;
+#else
+ size_t len = strlen (dirname) + 1;
+ new_dirname = (char *) malloc (len);
+ if (new_dirname == NULL)
+ return NULL;
+
+ memcpy (new_dirname, dirname, len);
+#endif
+ }
+
+ if (binding->dirname != _nl_default_dirname)
+ free (binding->dirname);
+
+ binding->dirname = new_dirname;
+ }
+ }
+ else
+ {
+ /* We have to create a new binding. */
+#if !defined _LIBC && !defined HAVE_STRDUP
+ size_t len;
+#endif
+ struct binding *new_binding =
+ (struct binding *) malloc (sizeof (*new_binding));
+
+ if (new_binding == NULL)
+ return NULL;
+
+#if defined _LIBC || defined HAVE_STRDUP
+ new_binding->domainname = strdup (domainname);
+ if (new_binding->domainname == NULL)
+ return NULL;
+#else
+ len = strlen (domainname) + 1;
+ new_binding->domainname = (char *) malloc (len);
+ if (new_binding->domainname == NULL)
+ return NULL;
+ memcpy (new_binding->domainname, domainname, len);
+#endif
+
+ if (strcmp (dirname, _nl_default_dirname) == 0)
+ new_binding->dirname = (char *) _nl_default_dirname;
+ else
+ {
+#if defined _LIBC || defined HAVE_STRDUP
+ new_binding->dirname = strdup (dirname);
+ if (new_binding->dirname == NULL)
+ return NULL;
+#else
+ len = strlen (dirname) + 1;
+ new_binding->dirname = (char *) malloc (len);
+ if (new_binding->dirname == NULL)
+ return NULL;
+ memcpy (new_binding->dirname, dirname, len);
+#endif
+ }
+
+ /* Now enqueue it. */
+ if (_nl_domain_bindings == NULL
+ || strcmp (domainname, _nl_domain_bindings->domainname) < 0)
+ {
+ new_binding->next = _nl_domain_bindings;
+ _nl_domain_bindings = new_binding;
+ }
+ else
+ {
+ binding = _nl_domain_bindings;
+ while (binding->next != NULL
+ && strcmp (domainname, binding->next->domainname) > 0)
+ binding = binding->next;
+
+ new_binding->next = binding->next;
+ binding->next = new_binding;
+ }
+
+ binding = new_binding;
+ }
+
+ return binding->dirname;
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library. */
+weak_alias (__bindtextdomain, bindtextdomain);
+#endif
diff --git a/intl/cat-compat.c b/intl/cat-compat.c
new file mode 100644
index 0000000..867d901
--- /dev/null
+++ b/intl/cat-compat.c
@@ -0,0 +1,262 @@
+/* Compatibility code for gettext-using-catgets interface.
+ Copyright (C) 1995, 1997 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <string.h>
+#else
+char *getenv ();
+# ifdef HAVE_MALLOC_H
+# include <malloc.h>
+# endif
+#endif
+
+#ifdef HAVE_NL_TYPES_H
+# include <nl_types.h>
+#endif
+
+#include "libgettext.h"
+
+/* @@ end of prolog @@ */
+
+/* XPG3 defines the result of `setlocale (category, NULL)' as:
+ ``Directs `setlocale()' to query `category' and return the current
+ setting of `local'.''
+ However it does not specify the exact format. And even worse: POSIX
+ defines this not at all. So we can use this feature only on selected
+ system (e.g. those using GNU C Library). */
+#ifdef _LIBC
+# define HAVE_LOCALE_NULL
+#endif
+
+/* The catalog descriptor. */
+static nl_catd catalog = (nl_catd) -1;
+
+/* Name of the default catalog. */
+static const char default_catalog_name[] = "messages";
+
+/* Name of currently used catalog. */
+static const char *catalog_name = default_catalog_name;
+
+/* Get ID for given string. If not found return -1. */
+static int msg_to_cat_id PARAMS ((const char *msg));
+
+/* Substitution for systems lacking this function in their C library. */
+#if !_LIBC && !HAVE_STPCPY
+static char *stpcpy PARAMS ((char *dest, const char *src));
+#endif
+
+
+/* Set currently used domain/catalog. */
+char *
+textdomain (domainname)
+ const char *domainname;
+{
+ nl_catd new_catalog;
+ char *new_name;
+ size_t new_name_len;
+ char *lang;
+
+#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES \
+ && defined HAVE_LOCALE_NULL
+ lang = setlocale (LC_MESSAGES, NULL);
+#else
+ lang = getenv ("LC_ALL");
+ if (lang == NULL || lang[0] == '\0')
+ {
+ lang = getenv ("LC_MESSAGES");
+ if (lang == NULL || lang[0] == '\0')
+ lang = getenv ("LANG");
+ }
+#endif
+ if (lang == NULL || lang[0] == '\0')
+ lang = "C";
+
+ /* See whether name of currently used domain is asked. */
+ if (domainname == NULL)
+ return (char *) catalog_name;
+
+ if (domainname[0] == '\0')
+ domainname = default_catalog_name;
+
+ /* Compute length of added path element. */
+ new_name_len = sizeof (LOCALEDIR) - 1 + 1 + strlen (lang)
+ + sizeof ("/LC_MESSAGES/") - 1 + sizeof (PACKAGE) - 1
+ + sizeof (".cat");
+
+ new_name = (char *) malloc (new_name_len);
+ if (new_name == NULL)
+ return NULL;
+
+ strcpy (new_name, PACKAGE);
+ new_catalog = catopen (new_name, 0);
+
+ if (new_catalog == (nl_catd) -1)
+ {
+ /* NLSPATH search didn't work, try absolute path */
+ sprintf (new_name, "%s/%s/LC_MESSAGES/%s.cat", LOCALEDIR, lang,
+ PACKAGE);
+ new_catalog = catopen (new_name, 0);
+
+ if (new_catalog == (nl_catd) -1)
+ {
+ free (new_name);
+ return (char *) catalog_name;
+ }
+ }
+
+ /* Close old catalog. */
+ if (catalog != (nl_catd) -1)
+ catclose (catalog);
+ if (catalog_name != default_catalog_name)
+ free ((char *) catalog_name);
+
+ catalog = new_catalog;
+ catalog_name = new_name;
+
+ return (char *) catalog_name;
+}
+
+char *
+bindtextdomain (domainname, dirname)
+ const char *domainname;
+ const char *dirname;
+{
+#if HAVE_SETENV || HAVE_PUTENV
+ char *old_val, *new_val, *cp;
+ size_t new_val_len;
+
+ /* This does not make much sense here but to be compatible do it. */
+ if (domainname == NULL)
+ return NULL;
+
+ /* Compute length of added path element. If we use setenv we don't need
+ the first byts for NLSPATH=, but why complicate the code for this
+ peanuts. */
+ new_val_len = sizeof ("NLSPATH=") - 1 + strlen (dirname)
+ + sizeof ("/%L/LC_MESSAGES/%N.cat");
+
+ old_val = getenv ("NLSPATH");
+ if (old_val == NULL || old_val[0] == '\0')
+ {
+ old_val = NULL;
+ new_val_len += 1 + sizeof (LOCALEDIR) - 1
+ + sizeof ("/%L/LC_MESSAGES/%N.cat");
+ }
+ else
+ new_val_len += strlen (old_val);
+
+ new_val = (char *) malloc (new_val_len);
+ if (new_val == NULL)
+ return NULL;
+
+# if HAVE_SETENV
+ cp = new_val;
+# else
+ cp = stpcpy (new_val, "NLSPATH=");
+# endif
+
+ cp = stpcpy (cp, dirname);
+ cp = stpcpy (cp, "/%L/LC_MESSAGES/%N.cat:");
+
+ if (old_val == NULL)
+ {
+# if __STDC__
+ stpcpy (cp, LOCALEDIR "/%L/LC_MESSAGES/%N.cat");
+# else
+
+ cp = stpcpy (cp, LOCALEDIR);
+ stpcpy (cp, "/%L/LC_MESSAGES/%N.cat");
+# endif
+ }
+ else
+ stpcpy (cp, old_val);
+
+# if HAVE_SETENV
+ setenv ("NLSPATH", new_val, 1);
+ free (new_val);
+# else
+ putenv (new_val);
+ /* Do *not* free the environment entry we just entered. It is used
+ from now on. */
+# endif
+
+#endif
+
+ return (char *) domainname;
+}
+
+#undef gettext
+char *
+gettext (msg)
+ const char *msg;
+{
+ int msgid;
+
+ if (msg == NULL || catalog == (nl_catd) -1)
+ return (char *) msg;
+
+ /* Get the message from the catalog. We always use set number 1.
+ The message ID is computed by the function `msg_to_cat_id'
+ which works on the table generated by `po-to-tbl'. */
+ msgid = msg_to_cat_id (msg);
+ if (msgid == -1)
+ return (char *) msg;
+
+ return catgets (catalog, 1, msgid, (char *) msg);
+}
+
+/* Look through the table `_msg_tbl' which has `_msg_tbl_length' entries
+ for the one equal to msg. If it is found return the ID. In case when
+ the string is not found return -1. */
+static int
+msg_to_cat_id (msg)
+ const char *msg;
+{
+ int cnt;
+
+ for (cnt = 0; cnt < _msg_tbl_length; ++cnt)
+ if (strcmp (msg, _msg_tbl[cnt]._msg) == 0)
+ return _msg_tbl[cnt]._msg_number;
+
+ return -1;
+}
+
+
+/* @@ begin of epilog @@ */
+
+/* We don't want libintl.a to depend on any other library. So we
+ avoid the non-standard function stpcpy. In GNU C Library this
+ function is available, though. Also allow the symbol HAVE_STPCPY
+ to be defined. */
+#if !_LIBC && !HAVE_STPCPY
+static char *
+stpcpy (dest, src)
+ char *dest;
+ const char *src;
+{
+ while ((*dest++ = *src++) != '\0')
+ /* Do nothing. */ ;
+ return dest - 1;
+}
+#endif
diff --git a/intl/dcgettext.c b/intl/dcgettext.c
new file mode 100644
index 0000000..0f7bb48
--- /dev/null
+++ b/intl/dcgettext.c
@@ -0,0 +1,655 @@
+/* Implementation of the dcgettext(3) function.
+ Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <sys/types.h>
+
+#if defined __GNUC__ && !defined C_ALLOCA
+# define alloca __builtin_alloca
+# define HAVE_ALLOCA 1
+#else
+# if (defined HAVE_ALLOCA_H || defined _LIBC) && !defined C_ALLOCA
+# include <alloca.h>
+# else
+# ifdef _AIX
+ #pragma alloca
+# else
+# ifndef alloca
+char *alloca ();
+# endif
+# endif
+# endif
+#endif
+
+#include <errno.h>
+#ifndef errno
+extern int errno;
+#endif
+#ifndef __set_errno
+# define __set_errno(val) errno = (val)
+#endif
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#else
+char *getenv ();
+# ifdef HAVE_MALLOC_H
+# include <malloc.h>
+# else
+void free ();
+# endif
+#endif
+
+#if defined HAVE_STRING_H || defined _LIBC
+# ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+# endif
+# include <string.h>
+#else
+# include <strings.h>
+#endif
+#if !HAVE_STRCHR && !defined _LIBC
+# ifndef strchr
+# define strchr index
+# endif
+#endif
+
+#if defined HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+#endif
+
+#include "gettext.h"
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgettext.h"
+#endif
+#include "hash-string.h"
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ANSI C functions. This is required by the standard
+ because some ANSI C functions will require linking with this object
+ file and the name space must not be polluted. */
+# define getcwd __getcwd
+# ifndef stpcpy
+# define stpcpy __stpcpy
+# endif
+#else
+# if !defined HAVE_GETCWD
+char *getwd ();
+# define getcwd(buf, max) getwd (buf)
+# else
+char *getcwd ();
+# endif
+# ifndef HAVE_STPCPY
+static char *stpcpy PARAMS ((char *dest, const char *src));
+# endif
+#endif
+
+/* Amount to increase buffer size by in each try. */
+#define PATH_INCR 32
+
+/* The following is from pathmax.h. */
+/* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define
+ PATH_MAX but might cause redefinition warnings when sys/param.h is
+ later included (as on MORE/BSD 4.3). */
+#if defined(_POSIX_VERSION) || (defined(HAVE_LIMITS_H) && !defined(__GNUC__))
+# include <limits.h>
+#endif
+
+#ifndef _POSIX_PATH_MAX
+# define _POSIX_PATH_MAX 255
+#endif
+
+#if !defined(PATH_MAX) && defined(_PC_PATH_MAX)
+# define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX))
+#endif
+
+/* Don't include sys/param.h if it already has been. */
+#if defined(HAVE_SYS_PARAM_H) && !defined(PATH_MAX) && !defined(MAXPATHLEN)
+# include <sys/param.h>
+#endif
+
+#if !defined(PATH_MAX) && defined(MAXPATHLEN)
+# define PATH_MAX MAXPATHLEN
+#endif
+
+#ifndef PATH_MAX
+# define PATH_MAX _POSIX_PATH_MAX
+#endif
+
+/* XPG3 defines the result of `setlocale (category, NULL)' as:
+ ``Directs `setlocale()' to query `category' and return the current
+ setting of `local'.''
+ However it does not specify the exact format. And even worse: POSIX
+ defines this not at all. So we can use this feature only on selected
+ system (e.g. those using GNU C Library). */
+#ifdef _LIBC
+# define HAVE_LOCALE_NULL
+#endif
+
+/* Name of the default domain used for gettext(3) prior any call to
+ textdomain(3). The default value for this is "messages". */
+const char _nl_default_default_domain[] = "messages";
+
+/* Value used as the default domain for gettext(3). */
+const char *_nl_current_default_domain = _nl_default_default_domain;
+
+/* Contains the default location of the message catalogs. */
+const char _nl_default_dirname[] = GNULOCALEDIR;
+
+/* List with bindings of specific domains created by bindtextdomain()
+ calls. */
+struct binding *_nl_domain_bindings;
+
+/* Prototypes for local functions. */
+static char *find_msg PARAMS ((struct loaded_l10nfile *domain_file,
+ const char *msgid)) internal_function;
+static const char *category_to_name PARAMS ((int category)) internal_function;
+static const char *guess_category_value PARAMS ((int category,
+ const char *categoryname))
+ internal_function;
+
+
+/* For those loosing systems which don't have `alloca' we have to add
+ some additional code emulating it. */
+#ifdef HAVE_ALLOCA
+/* Nothing has to be done. */
+# define ADD_BLOCK(list, address) /* nothing */
+# define FREE_BLOCKS(list) /* nothing */
+#else
+struct block_list
+{
+ void *address;
+ struct block_list *next;
+};
+# define ADD_BLOCK(list, addr) \
+ do { \
+ struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \
+ /* If we cannot get a free block we cannot add the new element to \
+ the list. */ \
+ if (newp != NULL) { \
+ newp->address = (addr); \
+ newp->next = (list); \
+ (list) = newp; \
+ } \
+ } while (0)
+# define FREE_BLOCKS(list) \
+ do { \
+ while (list != NULL) { \
+ struct block_list *old = list; \
+ list = list->next; \
+ free (old); \
+ } \
+ } while (0)
+# undef alloca
+# define alloca(size) (malloc (size))
+#endif /* have alloca */
+
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define DCGETTEXT __dcgettext
+#else
+# define DCGETTEXT dcgettext__
+#endif
+
+/* Checking whether the binaries runs SUID must be done and glibc provides
+ easier methods therefore we make a difference here. */
+#ifdef _LIBC
+# define ENABLE_SECURE __libc_enable_secure
+# define DETERMINE_SECURE
+#else
+static int enable_secure;
+# define ENABLE_SECURE (enable_secure == 1)
+# define DETERMINE_SECURE \
+ if (enable_secure == 0) \
+ { \
+ if (getuid () != geteuid () || getgid () != getegid ()) \
+ enable_secure = 1; \
+ else \
+ enable_secure = -1; \
+ }
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
+ locale. */
+char *
+DCGETTEXT (domainname, msgid, category)
+ const char *domainname;
+ const char *msgid;
+ int category;
+{
+#ifndef HAVE_ALLOCA
+ struct block_list *block_list = NULL;
+#endif
+ struct loaded_l10nfile *domain;
+ struct binding *binding;
+ const char *categoryname;
+ const char *categoryvalue;
+ char *dirname, *xdomainname;
+ char *single_locale;
+ char *retval;
+ int saved_errno = errno;
+
+ /* If no real MSGID is given return NULL. */
+ if (msgid == NULL)
+ return NULL;
+
+ /* See whether this is a SUID binary or not. */
+ DETERMINE_SECURE;
+
+ /* If DOMAINNAME is NULL, we are interested in the default domain. If
+ CATEGORY is not LC_MESSAGES this might not make much sense but the
+ definition left this undefined. */
+ if (domainname == NULL)
+ domainname = _nl_current_default_domain;
+
+ /* First find matching binding. */
+ for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)
+ {
+ int compare = strcmp (domainname, binding->domainname);
+ if (compare == 0)
+ /* We found it! */
+ break;
+ if (compare < 0)
+ {
+ /* It is not in the list. */
+ binding = NULL;
+ break;
+ }
+ }
+
+ if (binding == NULL)
+ dirname = (char *) _nl_default_dirname;
+ else if (binding->dirname[0] == '/')
+ dirname = binding->dirname;
+ else
+ {
+ /* We have a relative path. Make it absolute now. */
+ size_t dirname_len = strlen (binding->dirname) + 1;
+ size_t path_max;
+ char *ret;
+
+ path_max = (unsigned int) PATH_MAX;
+ path_max += 2; /* The getcwd docs say to do this. */
+
+ dirname = (char *) alloca (path_max + dirname_len);
+ ADD_BLOCK (block_list, dirname);
+
+ __set_errno (0);
+ while ((ret = getcwd (dirname, path_max)) == NULL && errno == ERANGE)
+ {
+ path_max += PATH_INCR;
+ dirname = (char *) alloca (path_max + dirname_len);
+ ADD_BLOCK (block_list, dirname);
+ __set_errno (0);
+ }
+
+ if (ret == NULL)
+ {
+ /* We cannot get the current working directory. Don't signal an
+ error but simply return the default string. */
+ FREE_BLOCKS (block_list);
+ __set_errno (saved_errno);
+ return (char *) msgid;
+ }
+
+ stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname);
+ }
+
+ /* Now determine the symbolic name of CATEGORY and its value. */
+ categoryname = category_to_name (category);
+ categoryvalue = guess_category_value (category, categoryname);
+
+ xdomainname = (char *) alloca (strlen (categoryname)
+ + strlen (domainname) + 5);
+ ADD_BLOCK (block_list, xdomainname);
+
+ stpcpy (stpcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"),
+ domainname),
+ ".mo");
+
+ /* Creating working area. */
+ single_locale = (char *) alloca (strlen (categoryvalue) + 1);
+ ADD_BLOCK (block_list, single_locale);
+
+
+ /* Search for the given string. This is a loop because we perhaps
+ got an ordered list of languages to consider for the translation. */
+ while (1)
+ {
+ /* Make CATEGORYVALUE point to the next element of the list. */
+ while (categoryvalue[0] != '\0' && categoryvalue[0] == ':')
+ ++categoryvalue;
+ if (categoryvalue[0] == '\0')
+ {
+ /* The whole contents of CATEGORYVALUE has been searched but
+ no valid entry has been found. We solve this situation
+ by implicitly appending a "C" entry, i.e. no translation
+ will take place. */
+ single_locale[0] = 'C';
+ single_locale[1] = '\0';
+ }
+ else
+ {
+ char *cp = single_locale;
+ while (categoryvalue[0] != '\0' && categoryvalue[0] != ':')
+ *cp++ = *categoryvalue++;
+ *cp = '\0';
+
+ /* When this is a SUID binary we must not allow accessing files
+ outside the dedicated directories. */
+ if (ENABLE_SECURE
+ && (memchr (single_locale, '/',
+ _nl_find_language (single_locale) - single_locale)
+ != NULL))
+ /* Ingore this entry. */
+ continue;
+ }
+
+ /* If the current locale value is C (or POSIX) we don't load a
+ domain. Return the MSGID. */
+ if (strcmp (single_locale, "C") == 0
+ || strcmp (single_locale, "POSIX") == 0)
+ {
+ FREE_BLOCKS (block_list);
+ __set_errno (saved_errno);
+ return (char *) msgid;
+ }
+
+
+ /* Find structure describing the message catalog matching the
+ DOMAINNAME and CATEGORY. */
+ domain = _nl_find_domain (dirname, single_locale, xdomainname);
+
+ if (domain != NULL)
+ {
+ retval = find_msg (domain, msgid);
+
+ if (retval == NULL)
+ {
+ int cnt;
+
+ for (cnt = 0; domain->successor[cnt] != NULL; ++cnt)
+ {
+ retval = find_msg (domain->successor[cnt], msgid);
+
+ if (retval != NULL)
+ break;
+ }
+ }
+
+ if (retval != NULL)
+ {
+ FREE_BLOCKS (block_list);
+ __set_errno (saved_errno);
+ return retval;
+ }
+ }
+ }
+ /* NOTREACHED */
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library. */
+weak_alias (__dcgettext, dcgettext);
+#endif
+
+
+static char *
+internal_function
+find_msg (domain_file, msgid)
+ struct loaded_l10nfile *domain_file;
+ const char *msgid;
+{
+ size_t act = 0;
+ size_t top, bottom;
+ struct loaded_domain *domain;
+
+ if (domain_file->decided == 0)
+ _nl_load_domain (domain_file);
+
+ if (domain_file->data == NULL)
+ return NULL;
+
+ domain = (struct loaded_domain *) domain_file->data;
+
+ /* Locate the MSGID and its translation. */
+ if (domain->hash_size > 2 && domain->hash_tab != NULL)
+ {
+ /* Use the hashing table. */
+ nls_uint32 len = strlen (msgid);
+ nls_uint32 hash_val = hash_string (msgid);
+ nls_uint32 idx = hash_val % domain->hash_size;
+ nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2));
+ nls_uint32 nstr = W (domain->must_swap, domain->hash_tab[idx]);
+
+ if (nstr == 0)
+ /* Hash table entry is empty. */
+ return NULL;
+
+ if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len
+ && strcmp (msgid,
+ domain->data + W (domain->must_swap,
+ domain->orig_tab[nstr - 1].offset)) == 0)
+ return (char *) domain->data + W (domain->must_swap,
+ domain->trans_tab[nstr - 1].offset);
+
+ while (1)
+ {
+ if (idx >= domain->hash_size - incr)
+ idx -= domain->hash_size - incr;
+ else
+ idx += incr;
+
+ nstr = W (domain->must_swap, domain->hash_tab[idx]);
+ if (nstr == 0)
+ /* Hash table entry is empty. */
+ return NULL;
+
+ if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len
+ && strcmp (msgid,
+ domain->data + W (domain->must_swap,
+ domain->orig_tab[nstr - 1].offset))
+ == 0)
+ return (char *) domain->data
+ + W (domain->must_swap, domain->trans_tab[nstr - 1].offset);
+ }
+ /* NOTREACHED */
+ }
+
+ /* Now we try the default method: binary search in the sorted
+ array of messages. */
+ bottom = 0;
+ top = domain->nstrings;
+ while (bottom < top)
+ {
+ int cmp_val;
+
+ act = (bottom + top) / 2;
+ cmp_val = strcmp (msgid, domain->data
+ + W (domain->must_swap,
+ domain->orig_tab[act].offset));
+ if (cmp_val < 0)
+ top = act;
+ else if (cmp_val > 0)
+ bottom = act + 1;
+ else
+ break;
+ }
+
+ /* If an translation is found return this. */
+ return bottom >= top ? NULL : (char *) domain->data
+ + W (domain->must_swap,
+ domain->trans_tab[act].offset);
+}
+
+
+/* Return string representation of locale CATEGORY. */
+static const char *
+internal_function
+category_to_name (category)
+ int category;
+{
+ const char *retval;
+
+ switch (category)
+ {
+#ifdef LC_COLLATE
+ case LC_COLLATE:
+ retval = "LC_COLLATE";
+ break;
+#endif
+#ifdef LC_CTYPE
+ case LC_CTYPE:
+ retval = "LC_CTYPE";
+ break;
+#endif
+#ifdef LC_MONETARY
+ case LC_MONETARY:
+ retval = "LC_MONETARY";
+ break;
+#endif
+#ifdef LC_NUMERIC
+ case LC_NUMERIC:
+ retval = "LC_NUMERIC";
+ break;
+#endif
+#ifdef LC_TIME
+ case LC_TIME:
+ retval = "LC_TIME";
+ break;
+#endif
+#ifdef LC_MESSAGES
+ case LC_MESSAGES:
+ retval = "LC_MESSAGES";
+ break;
+#endif
+#ifdef LC_RESPONSE
+ case LC_RESPONSE:
+ retval = "LC_RESPONSE";
+ break;
+#endif
+#ifdef LC_ALL
+ case LC_ALL:
+ /* This might not make sense but is perhaps better than any other
+ value. */
+ retval = "LC_ALL";
+ break;
+#endif
+ default:
+ /* If you have a better idea for a default value let me know. */
+ retval = "LC_XXX";
+ }
+
+ return retval;
+}
+
+/* Guess value of current locale from value of the environment variables. */
+static const char *
+internal_function
+guess_category_value (category, categoryname)
+ int category;
+ const char *categoryname;
+{
+ const char *retval;
+
+ /* The highest priority value is the `LANGUAGE' environment
+ variable. This is a GNU extension. */
+ retval = getenv ("LANGUAGE");
+ if (retval != NULL && retval[0] != '\0')
+ return retval;
+
+ /* `LANGUAGE' is not set. So we have to proceed with the POSIX
+ methods of looking to `LC_ALL', `LC_xxx', and `LANG'. On some
+ systems this can be done by the `setlocale' function itself. */
+#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL
+ return setlocale (category, NULL);
+#else
+ /* Setting of LC_ALL overwrites all other. */
+ retval = getenv ("LC_ALL");
+ if (retval != NULL && retval[0] != '\0')
+ return retval;
+
+ /* Next comes the name of the desired category. */
+ retval = getenv (categoryname);
+ if (retval != NULL && retval[0] != '\0')
+ return retval;
+
+ /* Last possibility is the LANG environment variable. */
+ retval = getenv ("LANG");
+ if (retval != NULL && retval[0] != '\0')
+ return retval;
+
+ /* We use C as the default domain. POSIX says this is implementation
+ defined. */
+ return "C";
+#endif
+}
+
+/* @@ begin of epilog @@ */
+
+/* We don't want libintl.a to depend on any other library. So we
+ avoid the non-standard function stpcpy. In GNU C Library this
+ function is available, though. Also allow the symbol HAVE_STPCPY
+ to be defined. */
+#if !_LIBC && !HAVE_STPCPY
+static char *
+stpcpy (dest, src)
+ char *dest;
+ const char *src;
+{
+ while ((*dest++ = *src++) != '\0')
+ /* Do nothing. */ ;
+ return dest - 1;
+}
+#endif
+
+
+#ifdef _LIBC
+/* If we want to free all resources we have to do some work at
+ program's end. */
+static void __attribute__ ((unused))
+free_mem (void)
+{
+ struct binding *runp;
+
+ for (runp = _nl_domain_bindings; runp != NULL; runp = runp->next)
+ {
+ free (runp->domainname);
+ if (runp->dirname != _nl_default_dirname)
+ /* Yes, this is a pointer comparison. */
+ free (runp->dirname);
+ }
+
+ if (_nl_current_default_domain != _nl_default_default_domain)
+ /* Yes, again a pointer comparison. */
+ free ((char *) _nl_current_default_domain);
+}
+
+text_set_element (__libc_subfreeres, free_mem);
+#endif
diff --git a/intl/dgettext.c b/intl/dgettext.c
new file mode 100644
index 0000000..0510c2b
--- /dev/null
+++ b/intl/dgettext.c
@@ -0,0 +1,59 @@
+/* Implementation of the dgettext(3) function
+ Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if defined HAVE_LOCALE_H || defined _LIBC
+# include <locale.h>
+#endif
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgettext.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define DGETTEXT __dgettext
+# define DCGETTEXT __dcgettext
+#else
+# define DGETTEXT dgettext__
+# define DCGETTEXT dcgettext__
+#endif
+
+/* Look up MSGID in the DOMAINNAME message catalog of the current
+ LC_MESSAGES locale. */
+char *
+DGETTEXT (domainname, msgid)
+ const char *domainname;
+ const char *msgid;
+{
+ return DCGETTEXT (domainname, msgid, LC_MESSAGES);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library. */
+weak_alias (__dgettext, dgettext);
+#endif
diff --git a/intl/explodename.c b/intl/explodename.c
new file mode 100644
index 0000000..80a3111
--- /dev/null
+++ b/intl/explodename.c
@@ -0,0 +1,197 @@
+/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+ Contributed by Ulrich Drepper <drepper at gnu.ai.mit.edu>, 1995.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#endif
+
+#if defined HAVE_STRING_H || defined _LIBC
+# include <string.h>
+#else
+# include <strings.h>
+#endif
+#include <sys/types.h>
+
+#include "loadinfo.h"
+
+/* On some strange systems still no definition of NULL is found. Sigh! */
+#ifndef NULL
+# if defined __STDC__ && __STDC__
+# define NULL ((void *) 0)
+# else
+# define NULL 0
+# endif
+#endif
+
+/* @@ end of prolog @@ */
+
+char *
+_nl_find_language (const char *name)
+{
+ while (name[0] != '\0' && name[0] != '_' && name[0] != '@'
+ && name[0] != '+' && name[0] != ',')
+ ++name;
+
+ return (char *) name;
+}
+
+
+int
+_nl_explode_name (name, language, modifier, territory, codeset,
+ normalized_codeset, special, sponsor, revision)
+ char *name;
+ const char **language;
+ const char **modifier;
+ const char **territory;
+ const char **codeset;
+ const char **normalized_codeset;
+ const char **special;
+ const char **sponsor;
+ const char **revision;
+{
+ enum { undecided, xpg, cen } syntax;
+ char *cp;
+ int mask;
+
+ *modifier = NULL;
+ *territory = NULL;
+ *codeset = NULL;
+ *normalized_codeset = NULL;
+ *special = NULL;
+ *sponsor = NULL;
+ *revision = NULL;
+
+ /* Now we determine the single parts of the locale name. First
+ look for the language. Termination symbols are `_' and `@' if
+ we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */
+ mask = 0;
+ syntax = undecided;
+ *language = cp = name;
+ cp = _nl_find_language (*language);
+
+ if (*language == cp)
+ /* This does not make sense: language has to be specified. Use
+ this entry as it is without exploding. Perhaps it is an alias. */
+ cp = strchr (*language, '\0');
+ else if (cp[0] == '_')
+ {
+ /* Next is the territory. */
+ cp[0] = '\0';
+ *territory = ++cp;
+
+ while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@'
+ && cp[0] != '+' && cp[0] != ',' && cp[0] != '_')
+ ++cp;
+
+ mask |= TERRITORY;
+
+ if (cp[0] == '.')
+ {
+ /* Next is the codeset. */
+ syntax = xpg;
+ cp[0] = '\0';
+ *codeset = ++cp;
+
+ while (cp[0] != '\0' && cp[0] != '@')
+ ++cp;
+
+ mask |= XPG_CODESET;
+
+ if (*codeset != cp && (*codeset)[0] != '\0')
+ {
+ *normalized_codeset = _nl_normalize_codeset (*codeset,
+ cp - *codeset);
+ if (strcmp (*codeset, *normalized_codeset) == 0)
+ free ((char *) *normalized_codeset);
+ else
+ mask |= XPG_NORM_CODESET;
+ }
+ }
+ }
+
+ if (cp[0] == '@' || (syntax != xpg && cp[0] == '+'))
+ {
+ /* Next is the modifier. */
+ syntax = cp[0] == '@' ? xpg : cen;
+ cp[0] = '\0';
+ *modifier = ++cp;
+
+ while (syntax == cen && cp[0] != '\0' && cp[0] != '+'
+ && cp[0] != ',' && cp[0] != '_')
+ ++cp;
+
+ mask |= XPG_MODIFIER | CEN_AUDIENCE;
+ }
+
+ if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_'))
+ {
+ syntax = cen;
+
+ if (cp[0] == '+')
+ {
+ /* Next is special application (CEN syntax). */
+ cp[0] = '\0';
+ *special = ++cp;
+
+ while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_')
+ ++cp;
+
+ mask |= CEN_SPECIAL;
+ }
+
+ if (cp[0] == ',')
+ {
+ /* Next is sponsor (CEN syntax). */
+ cp[0] = '\0';
+ *sponsor = ++cp;
+
+ while (cp[0] != '\0' && cp[0] != '_')
+ ++cp;
+
+ mask |= CEN_SPONSOR;
+ }
+
+ if (cp[0] == '_')
+ {
+ /* Next is revision (CEN syntax). */
+ cp[0] = '\0';
+ *revision = ++cp;
+
+ mask |= CEN_REVISION;
+ }
+ }
+
+ /* For CEN syntax values it might be important to have the
+ separator character in the file name, not for XPG syntax. */
+ if (syntax == xpg)
+ {
+ if (*territory != NULL && (*territory)[0] == '\0')
+ mask &= ~TERRITORY;
+
+ if (*codeset != NULL && (*codeset)[0] == '\0')
+ mask &= ~XPG_CODESET;
+
+ if (*modifier != NULL && (*modifier)[0] == '\0')
+ mask &= ~XPG_MODIFIER;
+ }
+
+ return mask;
+}
diff --git a/intl/finddomain.c b/intl/finddomain.c
new file mode 100644
index 0000000..81ea29b
--- /dev/null
+++ b/intl/finddomain.c
@@ -0,0 +1,216 @@
+/* Handle list of needed message catalogs
+ Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+ Written by Ulrich Drepper <drepper at gnu.ai.mit.edu>, 1995.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <ctype.h>
+#include <errno.h>
+#include <stdio.h>
+#include <sys/types.h>
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#else
+# ifdef HAVE_MALLOC_H
+# include <malloc.h>
+# else
+void free ();
+# endif
+#endif
+
+#if defined HAVE_STRING_H || defined _LIBC
+# include <string.h>
+#else
+# include <strings.h>
+# ifndef memcpy
+# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
+# endif
+#endif
+#if !HAVE_STRCHR && !defined _LIBC
+# ifndef strchr
+# define strchr index
+# endif
+#endif
+
+#if defined HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+#endif
+
+#include "gettext.h"
+#include "gettextP.h"
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgettext.h"
+#endif
+
+/* @@ end of prolog @@ */
+/* List of already loaded domains. */
+static struct loaded_l10nfile *_nl_loaded_domains;
+
+
+/* Return a data structure describing the message catalog described by
+ the DOMAINNAME and CATEGORY parameters with respect to the currently
+ established bindings. */
+struct loaded_l10nfile *
+internal_function
+_nl_find_domain (dirname, locale, domainname)
+ const char *dirname;
+ char *locale;
+ const char *domainname;
+{
+ struct loaded_l10nfile *retval;
+ const char *language;
+ const char *modifier;
+ const char *territory;
+ const char *codeset;
+ const char *normalized_codeset;
+ const char *special;
+ const char *sponsor;
+ const char *revision;
+ const char *alias_value;
+ int mask;
+
+ /* LOCALE can consist of up to four recognized parts for the XPG syntax:
+
+ language[_territory[.codeset]][@modifier]
+
+ and six parts for the CEN syntax:
+
+ language[_territory][+audience][+special][,[sponsor][_revision]]
+
+ Beside the first part all of them are allowed to be missing. If
+ the full specified locale is not found, the less specific one are
+ looked for. The various parts will be stripped off according to
+ the following order:
+ (1) revision
+ (2) sponsor
+ (3) special
+ (4) codeset
+ (5) normalized codeset
+ (6) territory
+ (7) audience/modifier
+ */
+
+ /* If we have already tested for this locale entry there has to
+ be one data set in the list of loaded domains. */
+ retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
+ strlen (dirname) + 1, 0, locale, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, domainname, 0);
+ if (retval != NULL)
+ {
+ /* We know something about this locale. */
+ int cnt;
+
+ if (retval->decided == 0)
+ _nl_load_domain (retval);
+
+ if (retval->data != NULL)
+ return retval;
+
+ for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
+ {
+ if (retval->successor[cnt]->decided == 0)
+ _nl_load_domain (retval->successor[cnt]);
+
+ if (retval->successor[cnt]->data != NULL)
+ break;
+ }
+ return cnt >= 0 ? retval : NULL;
+ /* NOTREACHED */
+ }
+
+ /* See whether the locale value is an alias. If yes its value
+ *overwrites* the alias name. No test for the original value is
+ done. */
+ alias_value = _nl_expand_alias (locale);
+ if (alias_value != NULL)
+ {
+#if defined _LIBC || defined HAVE_STRDUP
+ locale = strdup (alias_value);
+ if (locale == NULL)
+ return NULL;
+#else
+ size_t len = strlen (alias_value) + 1;
+ locale = (char *) malloc (len);
+ if (locale == NULL)
+ return NULL;
+
+ memcpy (locale, alias_value, len);
+#endif
+ }
+
+ /* Now we determine the single parts of the locale name. First
+ look for the language. Termination symbols are `_' and `@' if
+ we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */
+ mask = _nl_explode_name (locale, &language, &modifier, &territory,
+ &codeset, &normalized_codeset, &special,
+ &sponsor, &revision);
+
+ /* Create all possible locale entries which might be interested in
+ generalization. */
+ retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
+ strlen (dirname) + 1, mask, language, territory,
+ codeset, normalized_codeset, modifier, special,
+ sponsor, revision, domainname, 1);
+ if (retval == NULL)
+ /* This means we are out of core. */
+ return NULL;
+
+ if (retval->decided == 0)
+ _nl_load_domain (retval);
+ if (retval->data == NULL)
+ {
+ int cnt;
+ for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
+ {
+ if (retval->successor[cnt]->decided == 0)
+ _nl_load_domain (retval->successor[cnt]);
+ if (retval->successor[cnt]->data != NULL)
+ break;
+ }
+ }
+
+ /* The room for an alias was dynamically allocated. Free it now. */
+ if (alias_value != NULL)
+ free (locale);
+
+ return retval;
+}
+
+
+#ifdef _LIBC
+static void __attribute__ ((unused))
+free_mem (void)
+{
+ struct loaded_l10nfile *runp = _nl_loaded_domains;
+
+ while (runp != NULL)
+ {
+ struct loaded_l10nfile *here = runp;
+ if (runp->data != NULL)
+ _nl_unload_domain ((struct loaded_domain *) runp->data);
+ runp = runp->next;
+ free (here);
+ }
+}
+
+text_set_element (__libc_subfreeres, free_mem);
+#endif
diff --git a/intl/gettext.c b/intl/gettext.c
new file mode 100644
index 0000000..d929f98
--- /dev/null
+++ b/intl/gettext.c
@@ -0,0 +1,70 @@
+/* Implementation of gettext(3) function.
+ Copyright (C) 1995, 1997 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef _LIBC
+# define __need_NULL
+# include <stddef.h>
+#else
+# ifdef STDC_HEADERS
+# include <stdlib.h> /* Just for NULL. */
+# else
+# ifdef HAVE_STRING_H
+# include <string.h>
+# else
+# define NULL ((void *) 0)
+# endif
+# endif
+#endif
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgettext.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define GETTEXT __gettext
+# define DGETTEXT __dgettext
+#else
+# define GETTEXT gettext__
+# define DGETTEXT dgettext__
+#endif
+
+/* Look up MSGID in the current default message catalog for the current
+ LC_MESSAGES locale. If not found, returns MSGID itself (the default
+ text). */
+char *
+GETTEXT (msgid)
+ const char *msgid;
+{
+ return DGETTEXT (NULL, msgid);
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library. */
+weak_alias (__gettext, gettext);
+#endif
diff --git a/intl/gettext.h b/intl/gettext.h
new file mode 100644
index 0000000..3cd23d7
--- /dev/null
+++ b/intl/gettext.h
@@ -0,0 +1,105 @@
+/* Internal header for GNU gettext internationalization functions.
+ Copyright (C) 1995, 1997 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#ifndef _GETTEXT_H
+#define _GETTEXT_H 1
+
+#include <stdio.h>
+
+#if HAVE_LIMITS_H || _LIBC
+# include <limits.h>
+#endif
+
+/* @@ end of prolog @@ */
+
+/* The magic number of the GNU message catalog format. */
+#define _MAGIC 0x950412de
+#define _MAGIC_SWAPPED 0xde120495
+
+/* Revision number of the currently used .mo (binary) file format. */
+#define MO_REVISION_NUMBER 0
+
+/* The following contortions are an attempt to use the C preprocessor
+ to determine an unsigned integral type that is 32 bits wide. An
+ alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
+ doing that would require that the configure script compile and *run*
+ the resulting executable. Locally running cross-compiled executables
+ is usually not possible. */
+
+#if __STDC__
+# define UINT_MAX_32_BITS 4294967295U
+#else
+# define UINT_MAX_32_BITS 0xFFFFFFFF
+#endif
+
+/* If UINT_MAX isn't defined, assume it's a 32-bit type.
+ This should be valid for all systems GNU cares about because
+ that doesn't include 16-bit systems, and only modern systems
+ (that certainly have <limits.h>) have 64+-bit integral types. */
+
+#ifndef UINT_MAX
+# define UINT_MAX UINT_MAX_32_BITS
+#endif
+
+#if UINT_MAX == UINT_MAX_32_BITS
+typedef unsigned nls_uint32;
+#else
+# if USHRT_MAX == UINT_MAX_32_BITS
+typedef unsigned short nls_uint32;
+# else
+# if ULONG_MAX == UINT_MAX_32_BITS
+typedef unsigned long nls_uint32;
+# else
+ /* The following line is intended to throw an error. Using #error is
+ not portable enough. */
+ "Cannot determine unsigned 32-bit data type."
+# endif
+# endif
+#endif
+
+
+/* Header for binary .mo file format. */
+struct mo_file_header
+{
+ /* The magic number. */
+ nls_uint32 magic;
+ /* The revision number of the file format. */
+ nls_uint32 revision;
+ /* The number of strings pairs. */
+ nls_uint32 nstrings;
+ /* Offset of table with start offsets of original strings. */
+ nls_uint32 orig_tab_offset;
+ /* Offset of table with start offsets of translation strings. */
+ nls_uint32 trans_tab_offset;
+ /* Size of hashing table. */
+ nls_uint32 hash_tab_size;
+ /* Offset of first hashing entry. */
+ nls_uint32 hash_tab_offset;
+};
+
+struct string_desc
+{
+ /* Length of addressed string. */
+ nls_uint32 length;
+ /* Offset of string in file. */
+ nls_uint32 offset;
+};
+
+/* @@ begin of epilog @@ */
+
+#endif /* gettext.h */
diff --git a/intl/gettextP.h b/intl/gettextP.h
new file mode 100644
index 0000000..00c5203
--- /dev/null
+++ b/intl/gettextP.h
@@ -0,0 +1,89 @@
+/* Header describing internals of gettext library
+ Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+ Written by Ulrich Drepper <drepper at gnu.ai.mit.edu>, 1995.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifndef _GETTEXTP_H
+#define _GETTEXTP_H
+
+#include "loadinfo.h"
+
+/* @@ end of prolog @@ */
+
+#ifndef PARAMS
+# if __STDC__
+# define PARAMS(args) args
+# else
+# define PARAMS(args) ()
+# endif
+#endif
+
+#ifndef internal_function
+# define internal_function
+#endif
+
+#ifndef W
+# define W(flag, data) ((flag) ? SWAP (data) : (data))
+#endif
+
+
+#ifdef _LIBC
+# include <byteswap.h>
+# define SWAP(i) bswap_32 (i)
+#else
+static nls_uint32 SWAP PARAMS ((nls_uint32 i));
+
+static inline nls_uint32
+SWAP (i)
+ nls_uint32 i;
+{
+ return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24);
+}
+#endif
+
+
+struct loaded_domain
+{
+ const char *data;
+ int use_mmap;
+ size_t mmap_size;
+ int must_swap;
+ nls_uint32 nstrings;
+ struct string_desc *orig_tab;
+ struct string_desc *trans_tab;
+ nls_uint32 hash_size;
+ nls_uint32 *hash_tab;
+};
+
+struct binding
+{
+ struct binding *next;
+ char *domainname;
+ char *dirname;
+};
+
+struct loaded_l10nfile *_nl_find_domain PARAMS ((const char *__dirname,
+ char *__locale,
+ const char *__domainname))
+ internal_function;
+void _nl_load_domain PARAMS ((struct loaded_l10nfile *__domain))
+ internal_function;
+void _nl_unload_domain PARAMS ((struct loaded_domain *__domain))
+ internal_function;
+
+/* @@ begin of epilog @@ */
+
+#endif /* gettextP.h */
diff --git a/intl/hash-string.h b/intl/hash-string.h
new file mode 100644
index 0000000..939e958
--- /dev/null
+++ b/intl/hash-string.h
@@ -0,0 +1,59 @@
+/* Implements a string hashing function.
+ Copyright (C) 1995, 1997 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+/* @@ end of prolog @@ */
+
+#ifndef PARAMS
+# if __STDC__
+# define PARAMS(Args) Args
+# else
+# define PARAMS(Args) ()
+# endif
+#endif
+
+/* We assume to have `unsigned long int' value with at least 32 bits. */
+#define HASHWORDBITS 32
+
+
+/* Defines the so called `hashpjw' function by P.J. Weinberger
+ [see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
+ 1986, 1987 Bell Telephone Laboratories, Inc.] */
+static unsigned long int hash_string PARAMS ((const char *__str_param));
+
+static inline unsigned long int
+hash_string (str_param)
+ const char *str_param;
+{
+ unsigned long int hval, g;
+ const char *str = str_param;
+
+ /* Compute the hash value for the given string. */
+ hval = 0;
+ while (*str != '\0')
+ {
+ hval <<= 4;
+ hval += (unsigned long int) *str++;
+ g = hval & ((unsigned long int) 0xf << (HASHWORDBITS - 4));
+ if (g != 0)
+ {
+ hval ^= g >> (HASHWORDBITS - 8);
+ hval ^= g;
+ }
+ }
+ return hval;
+}
diff --git a/intl/intl-compat.c b/intl/intl-compat.c
new file mode 100644
index 0000000..503efa0
--- /dev/null
+++ b/intl/intl-compat.c
@@ -0,0 +1,76 @@
+/* intl-compat.c - Stub functions to call gettext functions from GNU gettext
+ Library.
+ Copyright (C) 1995 Software Foundation, Inc.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "libgettext.h"
+
+/* @@ end of prolog @@ */
+
+
+#undef gettext
+#undef dgettext
+#undef dcgettext
+#undef textdomain
+#undef bindtextdomain
+
+
+char *
+bindtextdomain (domainname, dirname)
+ const char *domainname;
+ const char *dirname;
+{
+ return bindtextdomain__ (domainname, dirname);
+}
+
+
+char *
+dcgettext (domainname, msgid, category)
+ const char *domainname;
+ const char *msgid;
+ int category;
+{
+ return dcgettext__ (domainname, msgid, category);
+}
+
+
+char *
+dgettext (domainname, msgid)
+ const char *domainname;
+ const char *msgid;
+{
+ return dgettext__ (domainname, msgid);
+}
+
+
+char *
+gettext (msgid)
+ const char *msgid;
+{
+ return gettext__ (msgid);
+}
+
+
+char *
+textdomain (domainname)
+ const char *domainname;
+{
+ return textdomain__ (domainname);
+}
diff --git a/intl/l10nflist.c b/intl/l10nflist.c
new file mode 100644
index 0000000..30f5f64
--- /dev/null
+++ b/intl/l10nflist.c
@@ -0,0 +1,411 @@
+/* Handle list of needed message catalogs
+ Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+ Contributed by Ulrich Drepper <drepper at gnu.ai.mit.edu>, 1995.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+
+#if defined HAVE_STRING_H || defined _LIBC
+# ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+# endif
+# include <string.h>
+#else
+# include <strings.h>
+# ifndef memcpy
+# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
+# endif
+#endif
+#if !HAVE_STRCHR && !defined _LIBC
+# ifndef strchr
+# define strchr index
+# endif
+#endif
+
+#if defined _LIBC || defined HAVE_ARGZ_H
+# include <argz.h>
+#endif
+#include <ctype.h>
+#include <sys/types.h>
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#endif
+
+#include "loadinfo.h"
+
+/* On some strange systems still no definition of NULL is found. Sigh! */
+#ifndef NULL
+# if defined __STDC__ && __STDC__
+# define NULL ((void *) 0)
+# else
+# define NULL 0
+# endif
+#endif
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ANSI C functions. This is required by the standard
+ because some ANSI C functions will require linking with this object
+ file and the name space must not be polluted. */
+# ifndef stpcpy
+# define stpcpy(dest, src) __stpcpy(dest, src)
+# endif
+#else
+# ifndef HAVE_STPCPY
+static char *stpcpy PARAMS ((char *dest, const char *src));
+# endif
+#endif
+
+/* Define function which are usually not available. */
+
+#if !defined _LIBC && !defined HAVE___ARGZ_COUNT
+/* Returns the number of strings in ARGZ. */
+static size_t argz_count__ PARAMS ((const char *argz, size_t len));
+
+static size_t
+argz_count__ (argz, len)
+ const char *argz;
+ size_t len;
+{
+ size_t count = 0;
+ while (len > 0)
+ {
+ size_t part_len = strlen (argz);
+ argz += part_len + 1;
+ len -= part_len + 1;
+ count++;
+ }
+ return count;
+}
+# undef __argz_count
+# define __argz_count(argz, len) argz_count__ (argz, len)
+#endif /* !_LIBC && !HAVE___ARGZ_COUNT */
+
+#if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY
+/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's
+ except the last into the character SEP. */
+static void argz_stringify__ PARAMS ((char *argz, size_t len, int sep));
+
+static void
+argz_stringify__ (argz, len, sep)
+ char *argz;
+ size_t len;
+ int sep;
+{
+ while (len > 0)
+ {
+ size_t part_len = strlen (argz);
+ argz += part_len;
+ len -= part_len + 1;
+ if (len > 0)
+ *argz++ = sep;
+ }
+}
+# undef __argz_stringify
+# define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep)
+#endif /* !_LIBC && !HAVE___ARGZ_STRINGIFY */
+
+#if !defined _LIBC && !defined HAVE___ARGZ_NEXT
+static char *argz_next__ PARAMS ((char *argz, size_t argz_len,
+ const char *entry));
+
+static char *
+argz_next__ (argz, argz_len, entry)
+ char *argz;
+ size_t argz_len;
+ const char *entry;
+{
+ if (entry)
+ {
+ if (entry < argz + argz_len)
+ entry = strchr (entry, '\0') + 1;
+
+ return entry >= argz + argz_len ? NULL : (char *) entry;
+ }
+ else
+ if (argz_len > 0)
+ return argz;
+ else
+ return 0;
+}
+# undef __argz_next
+# define __argz_next(argz, len, entry) argz_next__ (argz, len, entry)
+#endif /* !_LIBC && !HAVE___ARGZ_NEXT */
+
+
+/* Return number of bits set in X. */
+static int pop PARAMS ((int x));
+
+static inline int
+pop (x)
+ int x;
+{
+ /* We assume that no more than 16 bits are used. */
+ x = ((x & ~0x5555) >> 1) + (x & 0x5555);
+ x = ((x & ~0x3333) >> 2) + (x & 0x3333);
+ x = ((x >> 4) + x) & 0x0f0f;
+ x = ((x >> 8) + x) & 0xff;
+
+ return x;
+}
+
+
+struct loaded_l10nfile *
+_nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language,
+ territory, codeset, normalized_codeset, modifier, special,
+ sponsor, revision, filename, do_allocate)
+ struct loaded_l10nfile **l10nfile_list;
+ const char *dirlist;
+ size_t dirlist_len;
+ int mask;
+ const char *language;
+ const char *territory;
+ const char *codeset;
+ const char *normalized_codeset;
+ const char *modifier;
+ const char *special;
+ const char *sponsor;
+ const char *revision;
+ const char *filename;
+ int do_allocate;
+{
+ char *abs_filename;
+ struct loaded_l10nfile *last = NULL;
+ struct loaded_l10nfile *retval;
+ char *cp;
+ size_t entries;
+ int cnt;
+
+ /* Allocate room for the full file name. */
+ abs_filename = (char *) malloc (dirlist_len
+ + strlen (language)
+ + ((mask & TERRITORY) != 0
+ ? strlen (territory) + 1 : 0)
+ + ((mask & XPG_CODESET) != 0
+ ? strlen (codeset) + 1 : 0)
+ + ((mask & XPG_NORM_CODESET) != 0
+ ? strlen (normalized_codeset) + 1 : 0)
+ + (((mask & XPG_MODIFIER) != 0
+ || (mask & CEN_AUDIENCE) != 0)
+ ? strlen (modifier) + 1 : 0)
+ + ((mask & CEN_SPECIAL) != 0
+ ? strlen (special) + 1 : 0)
+ + (((mask & CEN_SPONSOR) != 0
+ || (mask & CEN_REVISION) != 0)
+ ? (1 + ((mask & CEN_SPONSOR) != 0
+ ? strlen (sponsor) + 1 : 0)
+ + ((mask & CEN_REVISION) != 0
+ ? strlen (revision) + 1 : 0)) : 0)
+ + 1 + strlen (filename) + 1);
+
+ if (abs_filename == NULL)
+ return NULL;
+
+ retval = NULL;
+ last = NULL;
+
+ /* Construct file name. */
+ memcpy (abs_filename, dirlist, dirlist_len);
+ __argz_stringify (abs_filename, dirlist_len, ':');
+ cp = abs_filename + (dirlist_len - 1);
+ *cp++ = '/';
+ cp = stpcpy (cp, language);
+
+ if ((mask & TERRITORY) != 0)
+ {
+ *cp++ = '_';
+ cp = stpcpy (cp, territory);
+ }
+ if ((mask & XPG_CODESET) != 0)
+ {
+ *cp++ = '.';
+ cp = stpcpy (cp, codeset);
+ }
+ if ((mask & XPG_NORM_CODESET) != 0)
+ {
+ *cp++ = '.';
+ cp = stpcpy (cp, normalized_codeset);
+ }
+ if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0)
+ {
+ /* This component can be part of both syntaces but has different
+ leading characters. For CEN we use `+', else `@'. */
+ *cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@';
+ cp = stpcpy (cp, modifier);
+ }
+ if ((mask & CEN_SPECIAL) != 0)
+ {
+ *cp++ = '+';
+ cp = stpcpy (cp, special);
+ }
+ if ((mask & (CEN_SPONSOR | CEN_REVISION)) != 0)
+ {
+ *cp++ = ',';
+ if ((mask & CEN_SPONSOR) != 0)
+ cp = stpcpy (cp, sponsor);
+ if ((mask & CEN_REVISION) != 0)
+ {
+ *cp++ = '_';
+ cp = stpcpy (cp, revision);
+ }
+ }
+
+ *cp++ = '/';
+ stpcpy (cp, filename);
+
+ /* Look in list of already loaded domains whether it is already
+ available. */
+ last = NULL;
+ for (retval = *l10nfile_list; retval != NULL; retval = retval->next)
+ if (retval->filename != NULL)
+ {
+ int compare = strcmp (retval->filename, abs_filename);
+ if (compare == 0)
+ /* We found it! */
+ break;
+ if (compare < 0)
+ {
+ /* It's not in the list. */
+ retval = NULL;
+ break;
+ }
+
+ last = retval;
+ }
+
+ if (retval != NULL || do_allocate == 0)
+ {
+ free (abs_filename);
+ return retval;
+ }
+
+ retval = (struct loaded_l10nfile *)
+ malloc (sizeof (*retval) + (__argz_count (dirlist, dirlist_len)
+ * (1 << pop (mask))
+ * sizeof (struct loaded_l10nfile *)));
+ if (retval == NULL)
+ return NULL;
+
+ retval->filename = abs_filename;
+ retval->decided = (__argz_count (dirlist, dirlist_len) != 1
+ || ((mask & XPG_CODESET) != 0
+ && (mask & XPG_NORM_CODESET) != 0));
+ retval->data = NULL;
+
+ if (last == NULL)
+ {
+ retval->next = *l10nfile_list;
+ *l10nfile_list = retval;
+ }
+ else
+ {
+ retval->next = last->next;
+ last->next = retval;
+ }
+
+ entries = 0;
+ /* If the DIRLIST is a real list the RETVAL entry corresponds not to
+ a real file. So we have to use the DIRLIST separation mechanism
+ of the inner loop. */
+ cnt = __argz_count (dirlist, dirlist_len) == 1 ? mask - 1 : mask;
+ for (; cnt >= 0; --cnt)
+ if ((cnt & ~mask) == 0
+ && ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0)
+ && ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0))
+ {
+ /* Iterate over all elements of the DIRLIST. */
+ char *dir = NULL;
+
+ while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir))
+ != NULL)
+ retval->successor[entries++]
+ = _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1, cnt,
+ language, territory, codeset,
+ normalized_codeset, modifier, special,
+ sponsor, revision, filename, 1);
+ }
+ retval->successor[entries] = NULL;
+
+ return retval;
+}
+
+/* Normalize codeset name. There is no standard for the codeset
+ names. Normalization allows the user to use any of the common
+ names. */
+const char *
+_nl_normalize_codeset (codeset, name_len)
+ const char *codeset;
+ size_t name_len;
+{
+ int len = 0;
+ int only_digit = 1;
+ char *retval;
+ char *wp;
+ size_t cnt;
+
+ for (cnt = 0; cnt < name_len; ++cnt)
+ if (isalnum (codeset[cnt]))
+ {
+ ++len;
+
+ if (isalpha (codeset[cnt]))
+ only_digit = 0;
+ }
+
+ retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1);
+
+ if (retval != NULL)
+ {
+ if (only_digit)
+ wp = stpcpy (retval, "iso");
+ else
+ wp = retval;
+
+ for (cnt = 0; cnt < name_len; ++cnt)
+ if (isalpha (codeset[cnt]))
+ *wp++ = tolower (codeset[cnt]);
+ else if (isdigit (codeset[cnt]))
+ *wp++ = codeset[cnt];
+
+ *wp = '\0';
+ }
+
+ return (const char *) retval;
+}
+
+
+/* @@ begin of epilog @@ */
+
+/* We don't want libintl.a to depend on any other library. So we
+ avoid the non-standard function stpcpy. In GNU C Library this
+ function is available, though. Also allow the symbol HAVE_STPCPY
+ to be defined. */
+#if !_LIBC && !HAVE_STPCPY
+static char *
+stpcpy (dest, src)
+ char *dest;
+ const char *src;
+{
+ while ((*dest++ = *src++) != '\0')
+ /* Do nothing. */ ;
+ return dest - 1;
+}
+#endif
diff --git a/intl/libgettext.h b/intl/libgettext.h
new file mode 100644
index 0000000..3a92960
--- /dev/null
+++ b/intl/libgettext.h
@@ -0,0 +1,182 @@
+/* Message catalogs for internationalization.
+ Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+/* Because on some systems (e.g. Solaris) we sometimes have to include
+ the systems libintl.h as well as this file we have more complex
+ include protection above. But the systems header might perhaps also
+ define _LIBINTL_H and therefore we have to protect the definition here. */
+
+#if !defined _LIBINTL_H || !defined _LIBGETTEXT_H
+#ifndef _LIBINTL_H
+# define _LIBINTL_H 1
+#endif
+#define _LIBGETTEXT_H 1
+
+/* We define an additional symbol to signal that we use the GNU
+ implementation of gettext. */
+#define __USE_GNU_GETTEXT 1
+
+#include <sys/types.h>
+
+#if HAVE_LOCALE_H
+# include <locale.h>
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* @@ end of prolog @@ */
+
+#ifndef PARAMS
+# if __STDC__ || defined __cplusplus
+# define PARAMS(args) args
+# else
+# define PARAMS(args) ()
+# endif
+#endif
+
+#ifndef NULL
+# if !defined __cplusplus || defined __GNUC__
+# define NULL ((void *) 0)
+# else
+# define NULL (0)
+# endif
+#endif
+
+#if !HAVE_LC_MESSAGES
+/* This value determines the behaviour of the gettext() and dgettext()
+ function. But some system does not have this defined. Define it
+ to a default value. */
+# define LC_MESSAGES (-1)
+#endif
+
+
+/* Declarations for gettext-using-catgets interface. Derived from
+ Jim Meyering's libintl.h. */
+struct _msg_ent
+{
+ const char *_msg;
+ int _msg_number;
+};
+
+
+#if HAVE_CATGETS
+/* These two variables are defined in the automatically by po-to-tbl.sed
+ generated file `cat-id-tbl.c'. */
+extern const struct _msg_ent _msg_tbl[];
+extern int _msg_tbl_length;
+#endif
+
+
+/* For automatical extraction of messages sometimes no real
+ translation is needed. Instead the string itself is the result. */
+#define gettext_noop(Str) (Str)
+
+/* Look up MSGID in the current default message catalog for the current
+ LC_MESSAGES locale. If not found, returns MSGID itself (the default
+ text). */
+extern char *gettext PARAMS ((const char *__msgid));
+extern char *gettext__ PARAMS ((const char *__msgid));
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current
+ LC_MESSAGES locale. */
+extern char *dgettext PARAMS ((const char *__domainname, const char *__msgid));
+extern char *dgettext__ PARAMS ((const char *__domainname,
+ const char *__msgid));
+
+/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
+ locale. */
+extern char *dcgettext PARAMS ((const char *__domainname, const char *__msgid,
+ int __category));
+extern char *dcgettext__ PARAMS ((const char *__domainname,
+ const char *__msgid, int __category));
+
+
+/* Set the current default message catalog to DOMAINNAME.
+ If DOMAINNAME is null, return the current default.
+ If DOMAINNAME is "", reset to the default of "messages". */
+extern char *textdomain PARAMS ((const char *__domainname));
+extern char *textdomain__ PARAMS ((const char *__domainname));
+
+/* Specify that the DOMAINNAME message catalog will be found
+ in DIRNAME rather than in the system locale data base. */
+extern char *bindtextdomain PARAMS ((const char *__domainname,
+ const char *__dirname));
+extern char *bindtextdomain__ PARAMS ((const char *__domainname,
+ const char *__dirname));
+
+#if ENABLE_NLS
+
+/* Solaris 2.3 has the gettext function but dcgettext is missing.
+ So we omit this optimization for Solaris 2.3. BTW, Solaris 2.4
+ has dcgettext. */
+# if !HAVE_CATGETS && (!HAVE_GETTEXT || HAVE_DCGETTEXT)
+
+# define gettext(Msgid) \
+ dgettext (NULL, Msgid)
+
+# define dgettext(Domainname, Msgid) \
+ dcgettext (Domainname, Msgid, LC_MESSAGES)
+
+# if defined __GNUC__ && __GNUC__ == 2 && __GNUC_MINOR__ >= 7
+/* This global variable is defined in loadmsgcat.c. We need a sign,
+ whether a new catalog was loaded, which can be associated with all
+ translations. */
+extern int _nl_msg_cat_cntr;
+
+# define dcgettext(Domainname, Msgid, Category) \
+ (__extension__ \
+ ({ \
+ char *__result; \
+ if (__builtin_constant_p (Msgid)) \
+ { \
+ static char *__translation__; \
+ static int __catalog_counter__; \
+ if (! __translation__ || __catalog_counter__ != _nl_msg_cat_cntr) \
+ { \
+ __translation__ = \
+ dcgettext__ (Domainname, Msgid, Category); \
+ __catalog_counter__ = _nl_msg_cat_cntr; \
+ } \
+ __result = __translation__; \
+ } \
+ else \
+ __result = dcgettext__ (Domainname, Msgid, Category); \
+ __result; \
+ }))
+# endif
+# endif
+
+#else
+
+# define gettext(Msgid) (Msgid)
+# define dgettext(Domainname, Msgid) (Msgid)
+# define dcgettext(Domainname, Msgid, Category) (Msgid)
+# define textdomain(Domainname) ((char *) Domainname)
+# define bindtextdomain(Domainname, Dirname) ((char *) Dirname)
+
+#endif
+
+/* @@ begin of epilog @@ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/intl/linux-msg.sed b/intl/linux-msg.sed
new file mode 100644
index 0000000..5918e72
--- /dev/null
+++ b/intl/linux-msg.sed
@@ -0,0 +1,100 @@
+# po2msg.sed - Convert Uniforum style .po file to Linux style .msg file
+# Copyright (C) 1995 Free Software Foundation, Inc.
+# Ulrich Drepper <drepper at gnu.ai.mit.edu>, 1995.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+#
+# The first directive in the .msg should be the definition of the
+# message set number. We use always set number 1.
+#
+1 {
+ i\
+$set 1 # Automatically created by po2msg.sed
+ h
+ s/.*/0/
+ x
+}
+#
+# Mitch's old catalog format does not allow comments.
+#
+# We copy the original message as a comment into the .msg file.
+#
+/^msgid/ {
+ s/msgid[ ]*"//
+#
+# This does not work now with the new format.
+# /"$/! {
+# s/\\$//
+# s/$/ ... (more lines following)"/
+# }
+ x
+# The following nice solution is by
+# Bruno <Haible at ma2s2.mathematik.uni-karlsruhe.de>
+ td
+# Increment a decimal number in pattern space.
+# First hide trailing `9' digits.
+ :d
+ s/9\(_*\)$/_\1/
+ td
+# Assure at least one digit is available.
+ s/^\(_*\)$/0\1/
+# Increment the last digit.
+ s/8\(_*\)$/9\1/
+ s/7\(_*\)$/8\1/
+ s/6\(_*\)$/7\1/
+ s/5\(_*\)$/6\1/
+ s/4\(_*\)$/5\1/
+ s/3\(_*\)$/4\1/
+ s/2\(_*\)$/3\1/
+ s/1\(_*\)$/2\1/
+ s/0\(_*\)$/1\1/
+# Convert the hidden `9' digits to `0's.
+ s/_/0/g
+ x
+ G
+ s/\(.*\)"\n\([0-9]*\)/$ #\2 Original Message:(\1)/p
+}
+#
+# The .msg file contains, other then the .po file, only the translations
+# but each given a unique ID. Starting from 1 and incrementing by 1 for
+# each message we assign them to the messages.
+# It is important that the .po file used to generate the cat-id-tbl.c file
+# (with po-to-tbl) is the same as the one used here. (At least the order
+# of declarations must not be changed.)
+#
+/^msgstr/ {
+ s/msgstr[ ]*"\(.*\)"/# \1/
+# Clear substitution flag.
+ tb
+# Append the next line.
+ :b
+ N
+# Look whether second part is continuation line.
+ s/\(.*\n\)"\(.*\)"/\1\2/
+# Yes, then branch.
+ ta
+ P
+ D
+# Note that D includes a jump to the start!!
+# We found a continuation line. But before printing insert '\'.
+ :a
+ s/\(.*\)\(\n.*\)/\1\\\2/
+ P
+# We cannot use D here.
+ s/.*\n\(.*\)/\1/
+ tb
+}
+d
diff --git a/intl/loadinfo.h b/intl/loadinfo.h
new file mode 100644
index 0000000..1c4524a
--- /dev/null
+++ b/intl/loadinfo.h
@@ -0,0 +1,78 @@
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Ulrich Drepper <drepper at cygnus.com>, 1996.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifndef PARAMS
+# if __STDC__
+# define PARAMS(args) args
+# else
+# define PARAMS(args) ()
+# endif
+#endif
+
+/* Encoding of locale name parts. */
+#define CEN_REVISION 1
+#define CEN_SPONSOR 2
+#define CEN_SPECIAL 4
+#define XPG_NORM_CODESET 8
+#define XPG_CODESET 16
+#define TERRITORY 32
+#define CEN_AUDIENCE 64
+#define XPG_MODIFIER 128
+
+#define CEN_SPECIFIC (CEN_REVISION|CEN_SPONSOR|CEN_SPECIAL|CEN_AUDIENCE)
+#define XPG_SPECIFIC (XPG_CODESET|XPG_NORM_CODESET|XPG_MODIFIER)
+
+
+struct loaded_l10nfile
+{
+ const char *filename;
+ int decided;
+
+ const void *data;
+
+ struct loaded_l10nfile *next;
+ struct loaded_l10nfile *successor[1];
+};
+
+
+extern const char *_nl_normalize_codeset PARAMS ((const char *codeset,
+ size_t name_len));
+
+extern struct loaded_l10nfile *
+_nl_make_l10nflist PARAMS ((struct loaded_l10nfile **l10nfile_list,
+ const char *dirlist, size_t dirlist_len, int mask,
+ const char *language, const char *territory,
+ const char *codeset,
+ const char *normalized_codeset,
+ const char *modifier, const char *special,
+ const char *sponsor, const char *revision,
+ const char *filename, int do_allocate));
+
+
+extern const char *_nl_expand_alias PARAMS ((const char *name));
+
+extern int _nl_explode_name PARAMS ((char *name, const char **language,
+ const char **modifier,
+ const char **territory,
+ const char **codeset,
+ const char **normalized_codeset,
+ const char **special,
+ const char **sponsor,
+ const char **revision));
+
+extern char *_nl_find_language PARAMS ((const char *name));
diff --git a/intl/loadmsgcat.c b/intl/loadmsgcat.c
new file mode 100644
index 0000000..2c6a565
--- /dev/null
+++ b/intl/loadmsgcat.c
@@ -0,0 +1,220 @@
+/* Load needed message catalogs.
+ Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#endif
+
+#if defined HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+#endif
+
+#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
+ || (defined _LIBC && defined _POSIX_MAPPED_FILES)
+# include <sys/mman.h>
+# undef HAVE_MMAP
+# define HAVE_MMAP 1
+#else
+# undef HAVE_MMAP
+#endif
+
+#include "gettext.h"
+#include "gettextP.h"
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ISO C functions. This is required by the standard
+ because some ISO C functions will require linking with this object
+ file and the name space must not be polluted. */
+# define open __open
+# define close __close
+# define read __read
+# define mmap __mmap
+# define munmap __munmap
+#endif
+
+/* We need a sign, whether a new catalog was loaded, which can be associated
+ with all translations. This is important if the translations are
+ cached by one of GCC's features. */
+int _nl_msg_cat_cntr = 0;
+
+
+/* Load the message catalogs specified by FILENAME. If it is no valid
+ message catalog do nothing. */
+void
+internal_function
+_nl_load_domain (domain_file)
+ struct loaded_l10nfile *domain_file;
+{
+ int fd;
+ size_t size;
+ struct stat st;
+ struct mo_file_header *data = (struct mo_file_header *) -1;
+ int use_mmap = 0;
+ struct loaded_domain *domain;
+
+ domain_file->decided = 1;
+ domain_file->data = NULL;
+
+ /* If the record does not represent a valid locale the FILENAME
+ might be NULL. This can happen when according to the given
+ specification the locale file name is different for XPG and CEN
+ syntax. */
+ if (domain_file->filename == NULL)
+ return;
+
+ /* Try to open the addressed file. */
+ fd = open (domain_file->filename, O_RDONLY);
+ if (fd == -1)
+ return;
+
+ /* We must know about the size of the file. */
+ if (fstat (fd, &st) != 0
+ || (size = (size_t) st.st_size) != st.st_size
+ || size < sizeof (struct mo_file_header))
+ {
+ /* Something went wrong. */
+ close (fd);
+ return;
+ }
+
+#ifdef HAVE_MMAP
+ /* Now we are ready to load the file. If mmap() is available we try
+ this first. If not available or it failed we try to load it. */
+ data = (struct mo_file_header *) mmap (NULL, size, PROT_READ,
+ MAP_PRIVATE, fd, 0);
+
+ if (data != (struct mo_file_header *) -1)
+ {
+ /* mmap() call was successful. */
+ close (fd);
+ use_mmap = 1;
+ }
+#endif
+
+ /* If the data is not yet available (i.e. mmap'ed) we try to load
+ it manually. */
+ if (data == (struct mo_file_header *) -1)
+ {
+ size_t to_read;
+ char *read_ptr;
+
+ data = (struct mo_file_header *) malloc (size);
+ if (data == NULL)
+ return;
+
+ to_read = size;
+ read_ptr = (char *) data;
+ do
+ {
+ long int nb = (long int) read (fd, read_ptr, to_read);
+ if (nb == -1)
+ {
+ close (fd);
+ return;
+ }
+
+ read_ptr += nb;
+ to_read -= nb;
+ }
+ while (to_read > 0);
+
+ close (fd);
+ }
+
+ /* Using the magic number we can test whether it really is a message
+ catalog file. */
+ if (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED)
+ {
+ /* The magic number is wrong: not a message catalog file. */
+#ifdef HAVE_MMAP
+ if (use_mmap)
+ munmap ((caddr_t) data, size);
+ else
+#endif
+ free (data);
+ return;
+ }
+
+ domain_file->data
+ = (struct loaded_domain *) malloc (sizeof (struct loaded_domain));
+ if (domain_file->data == NULL)
+ return;
+
+ domain = (struct loaded_domain *) domain_file->data;
+ domain->data = (char *) data;
+ domain->use_mmap = use_mmap;
+ domain->mmap_size = size;
+ domain->must_swap = data->magic != _MAGIC;
+
+ /* Fill in the information about the available tables. */
+ switch (W (domain->must_swap, data->revision))
+ {
+ case 0:
+ domain->nstrings = W (domain->must_swap, data->nstrings);
+ domain->orig_tab = (struct string_desc *)
+ ((char *) data + W (domain->must_swap, data->orig_tab_offset));
+ domain->trans_tab = (struct string_desc *)
+ ((char *) data + W (domain->must_swap, data->trans_tab_offset));
+ domain->hash_size = W (domain->must_swap, data->hash_tab_size);
+ domain->hash_tab = (nls_uint32 *)
+ ((char *) data + W (domain->must_swap, data->hash_tab_offset));
+ break;
+ default:
+ /* This is an invalid revision. */
+#ifdef HAVE_MMAP
+ if (use_mmap)
+ munmap ((caddr_t) data, size);
+ else
+#endif
+ free (data);
+ free (domain);
+ domain_file->data = NULL;
+ return;
+ }
+
+ /* Show that one domain is changed. This might make some cached
+ translations invalid. */
+ ++_nl_msg_cat_cntr;
+}
+
+
+#ifdef _LIBC
+void
+internal_function
+_nl_unload_domain (domain)
+ struct loaded_domain *domain;
+{
+#ifdef _POSIX_MAPPED_FILES
+ if (domain->use_mmap)
+ munmap ((caddr_t) domain->data, domain->mmap_size);
+ else
+#endif /* _POSIX_MAPPED_FILES */
+ free ((void *) domain->data);
+
+ free (domain);
+}
+#endif
diff --git a/intl/localealias.c b/intl/localealias.c
new file mode 100644
index 0000000..861020d
--- /dev/null
+++ b/intl/localealias.c
@@ -0,0 +1,438 @@
+/* Handle aliases for locale names.
+ Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+ Written by Ulrich Drepper <drepper at gnu.ai.mit.edu>, 1995.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <ctype.h>
+#include <stdio.h>
+#include <sys/types.h>
+
+#ifdef __GNUC__
+# define alloca __builtin_alloca
+# define HAVE_ALLOCA 1
+#else
+# if defined HAVE_ALLOCA_H || defined _LIBC
+# include <alloca.h>
+# else
+# ifdef _AIX
+ #pragma alloca
+# else
+# ifndef alloca
+char *alloca ();
+# endif
+# endif
+# endif
+#endif
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#else
+char *getenv ();
+# ifdef HAVE_MALLOC_H
+# include <malloc.h>
+# else
+void free ();
+# endif
+#endif
+
+#if defined HAVE_STRING_H || defined _LIBC
+# ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+# endif
+# include <string.h>
+#else
+# include <strings.h>
+# ifndef memcpy
+# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
+# endif
+#endif
+#if !HAVE_STRCHR && !defined _LIBC
+# ifndef strchr
+# define strchr index
+# endif
+#endif
+
+#include "gettext.h"
+#include "gettextP.h"
+
+/* @@ end of prolog @@ */
+
+#ifdef _LIBC
+/* Rename the non ANSI C functions. This is required by the standard
+ because some ANSI C functions will require linking with this object
+ file and the name space must not be polluted. */
+# define strcasecmp __strcasecmp
+
+# ifndef mempcpy
+# define mempcpy __mempcpy
+# endif
+# define HAVE_MEMPCPY 1
+
+/* We need locking here since we can be called from different places. */
+# include <bits/libc-lock.h>
+
+__libc_lock_define_initialized (static, lock);
+#endif
+
+#ifndef internal_function
+# define internal_function
+#endif
+
+/* For those loosing systems which don't have `alloca' we have to add
+ some additional code emulating it. */
+#ifdef HAVE_ALLOCA
+/* Nothing has to be done. */
+# define ADD_BLOCK(list, address) /* nothing */
+# define FREE_BLOCKS(list) /* nothing */
+#else
+struct block_list
+{
+ void *address;
+ struct block_list *next;
+};
+# define ADD_BLOCK(list, addr) \
+ do { \
+ struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \
+ /* If we cannot get a free block we cannot add the new element to \
+ the list. */ \
+ if (newp != NULL) { \
+ newp->address = (addr); \
+ newp->next = (list); \
+ (list) = newp; \
+ } \
+ } while (0)
+# define FREE_BLOCKS(list) \
+ do { \
+ while (list != NULL) { \
+ struct block_list *old = list; \
+ list = list->next; \
+ free (old); \
+ } \
+ } while (0)
+# undef alloca
+# define alloca(size) (malloc (size))
+#endif /* have alloca */
+
+#if defined _LIBC_REENTRANT || defined HAVE_FGETS_UNLOCKED
+# undef fgets
+# define fgets(buf, len, s) fgets_unlocked (buf, len, s)
+#endif
+#if defined _LIBC_REENTRANT || defined HAVE_FEOF_UNLOCKED
+# undef feof
+# define feof(s) feof_unlocked (s)
+#endif
+
+
+struct alias_map
+{
+ const char *alias;
+ const char *value;
+};
+
+
+static char *string_space = NULL;
+static size_t string_space_act = 0;
+static size_t string_space_max = 0;
+static struct alias_map *map;
+static size_t nmap = 0;
+static size_t maxmap = 0;
+
+
+/* Prototypes for local functions. */
+static size_t read_alias_file PARAMS ((const char *fname, int fname_len))
+ internal_function;
+static void extend_alias_table PARAMS ((void));
+static int alias_compare PARAMS ((const struct alias_map *map1,
+ const struct alias_map *map2));
+
+
+const char *
+_nl_expand_alias (name)
+ const char *name;
+{
+ static const char *locale_alias_path = LOCALE_ALIAS_PATH;
+ struct alias_map *retval;
+ const char *result = NULL;
+ size_t added;
+
+#ifdef _LIBC
+ __libc_lock_lock (lock);
+#endif
+
+ do
+ {
+ struct alias_map item;
+
+ item.alias = name;
+
+ if (nmap > 0)
+ retval = (struct alias_map *) bsearch (&item, map, nmap,
+ sizeof (struct alias_map),
+ (int (*) PARAMS ((const void *,
+ const void *))
+ ) alias_compare);
+ else
+ retval = NULL;
+
+ /* We really found an alias. Return the value. */
+ if (retval != NULL)
+ {
+ result = retval->value;
+ break;
+ }
+
+ /* Perhaps we can find another alias file. */
+ added = 0;
+ while (added == 0 && locale_alias_path[0] != '\0')
+ {
+ const char *start;
+
+ while (locale_alias_path[0] == ':')
+ ++locale_alias_path;
+ start = locale_alias_path;
+
+ while (locale_alias_path[0] != '\0' && locale_alias_path[0] != ':')
+ ++locale_alias_path;
+
+ if (start < locale_alias_path)
+ added = read_alias_file (start, locale_alias_path - start);
+ }
+ }
+ while (added != 0);
+
+#ifdef _LIBC
+ __libc_lock_unlock (lock);
+#endif
+
+ return result;
+}
+
+
+static size_t
+internal_function
+read_alias_file (fname, fname_len)
+ const char *fname;
+ int fname_len;
+{
+#ifndef HAVE_ALLOCA
+ struct block_list *block_list = NULL;
+#endif
+ FILE *fp;
+ char *full_fname;
+ size_t added;
+ static const char aliasfile[] = "/locale.alias";
+
+ full_fname = (char *) alloca (fname_len + sizeof aliasfile);
+ ADD_BLOCK (block_list, full_fname);
+#ifdef HAVE_MEMPCPY
+ mempcpy (mempcpy (full_fname, fname, fname_len),
+ aliasfile, sizeof aliasfile);
+#else
+ memcpy (full_fname, fname, fname_len);
+ memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile);
+#endif
+
+ fp = fopen (full_fname, "r");
+ if (fp == NULL)
+ {
+ FREE_BLOCKS (block_list);
+ return 0;
+ }
+
+ added = 0;
+ while (!feof (fp))
+ {
+ /* It is a reasonable approach to use a fix buffer here because
+ a) we are only interested in the first two fields
+ b) these fields must be usable as file names and so must not
+ be that long
+ */
+ char buf[BUFSIZ];
+ char *alias;
+ char *value;
+ char *cp;
+
+ if (fgets (buf, sizeof buf, fp) == NULL)
+ /* EOF reached. */
+ break;
+
+ /* Possibly not the whole line fits into the buffer. Ignore
+ the rest of the line. */
+ if (strchr (buf, '\n') == NULL)
+ {
+ char altbuf[BUFSIZ];
+ do
+ if (fgets (altbuf, sizeof altbuf, fp) == NULL)
+ /* Make sure the inner loop will be left. The outer loop
+ will exit at the `feof' test. */
+ break;
+ while (strchr (altbuf, '\n') == NULL);
+ }
+
+ cp = buf;
+ /* Ignore leading white space. */
+ while (isspace (cp[0]))
+ ++cp;
+
+ /* A leading '#' signals a comment line. */
+ if (cp[0] != '\0' && cp[0] != '#')
+ {
+ alias = cp++;
+ while (cp[0] != '\0' && !isspace (cp[0]))
+ ++cp;
+ /* Terminate alias name. */
+ if (cp[0] != '\0')
+ *cp++ = '\0';
+
+ /* Now look for the beginning of the value. */
+ while (isspace (cp[0]))
+ ++cp;
+
+ if (cp[0] != '\0')
+ {
+ size_t alias_len;
+ size_t value_len;
+
+ value = cp++;
+ while (cp[0] != '\0' && !isspace (cp[0]))
+ ++cp;
+ /* Terminate value. */
+ if (cp[0] == '\n')
+ {
+ /* This has to be done to make the following test
+ for the end of line possible. We are looking for
+ the terminating '\n' which do not overwrite here. */
+ *cp++ = '\0';
+ *cp = '\n';
+ }
+ else if (cp[0] != '\0')
+ *cp++ = '\0';
+
+ if (nmap >= maxmap)
+ extend_alias_table ();
+
+ alias_len = strlen (alias) + 1;
+ value_len = strlen (value) + 1;
+
+ if (string_space_act + alias_len + value_len > string_space_max)
+ {
+ /* Increase size of memory pool. */
+ size_t new_size = (string_space_max
+ + (alias_len + value_len > 1024
+ ? alias_len + value_len : 1024));
+ char *new_pool = (char *) realloc (string_space, new_size);
+ if (new_pool == NULL)
+ {
+ FREE_BLOCKS (block_list);
+ return added;
+ }
+ string_space = new_pool;
+ string_space_max = new_size;
+ }
+
+ map[nmap].alias = memcpy (&string_space[string_space_act],
+ alias, alias_len);
+ string_space_act += alias_len;
+
+ map[nmap].value = memcpy (&string_space[string_space_act],
+ value, value_len);
+ string_space_act += value_len;
+
+ ++nmap;
+ ++added;
+ }
+ }
+ }
+
+ /* Should we test for ferror()? I think we have to silently ignore
+ errors. --drepper */
+ fclose (fp);
+
+ if (added > 0)
+ qsort (map, nmap, sizeof (struct alias_map),
+ (int (*) PARAMS ((const void *, const void *))) alias_compare);
+
+ FREE_BLOCKS (block_list);
+ return added;
+}
+
+
+static void
+extend_alias_table ()
+{
+ size_t new_size;
+ struct alias_map *new_map;
+
+ new_size = maxmap == 0 ? 100 : 2 * maxmap;
+ new_map = (struct alias_map *) realloc (map, (new_size
+ * sizeof (struct alias_map)));
+ if (new_map == NULL)
+ /* Simply don't extend: we don't have any more core. */
+ return;
+
+ map = new_map;
+ maxmap = new_size;
+}
+
+
+#ifdef _LIBC
+static void __attribute__ ((unused))
+free_mem (void)
+{
+ if (string_space != NULL)
+ free (string_space);
+ if (map != NULL)
+ free (map);
+}
+text_set_element (__libc_subfreeres, free_mem);
+#endif
+
+
+static int
+alias_compare (map1, map2)
+ const struct alias_map *map1;
+ const struct alias_map *map2;
+{
+#if defined _LIBC || defined HAVE_STRCASECMP
+ return strcasecmp (map1->alias, map2->alias);
+#else
+ const unsigned char *p1 = (const unsigned char *) map1->alias;
+ const unsigned char *p2 = (const unsigned char *) map2->alias;
+ unsigned char c1, c2;
+
+ if (p1 == p2)
+ return 0;
+
+ do
+ {
+ /* I know this seems to be odd but the tolower() function in
+ some systems libc cannot handle nonalpha characters. */
+ c1 = isupper (*p1) ? tolower (*p1) : *p1;
+ c2 = isupper (*p2) ? tolower (*p2) : *p2;
+ if (c1 == '\0')
+ break;
+ ++p1;
+ ++p2;
+ }
+ while (c1 == c2);
+
+ return c1 - c2;
+#endif
+}
diff --git a/intl/po2tbl.sed.in b/intl/po2tbl.sed.in
new file mode 100644
index 0000000..b3bcca4
--- /dev/null
+++ b/intl/po2tbl.sed.in
@@ -0,0 +1,102 @@
+# po2tbl.sed - Convert Uniforum style .po file to lookup table for catgets
+# Copyright (C) 1995 Free Software Foundation, Inc.
+# Ulrich Drepper <drepper at gnu.ai.mit.edu>, 1995.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+1 {
+ i\
+/* Automatically generated by po2tbl.sed from @PACKAGE NAME at .pot. */\
+\
+#if HAVE_CONFIG_H\
+# include <config.h>\
+#endif\
+\
+#include "libgettext.h"\
+\
+const struct _msg_ent _msg_tbl[] = {
+ h
+ s/.*/0/
+ x
+}
+#
+# Write msgid entries in C array form.
+#
+/^msgid/ {
+ s/msgid[ ]*\(".*"\)/ {\1/
+ tb
+# Append the next line
+ :b
+ N
+# Look whether second part is continuation line.
+ s/\(.*\)"\(\n\)"\(.*"\)/\1\2\3/
+# Yes, then branch.
+ ta
+# Because we assume that the input file correctly formed the line
+# just read cannot be again be a msgid line. So it's safe to ignore
+# it.
+ s/\(.*\)\n.*/\1/
+ bc
+# We found a continuation line. But before printing insert '\'.
+ :a
+ s/\(.*\)\(\n.*\)/\1\\\2/
+ P
+# We cannot use D here.
+ s/.*\n\(.*\)/\1/
+# Some buggy seds do not clear the `successful substitution since last ``t'''
+# flag on `N', so we do a `t' here to clear it.
+ tb
+# Not reached
+ :c
+ x
+# The following nice solution is by
+# Bruno <Haible at ma2s2.mathematik.uni-karlsruhe.de>
+ td
+# Increment a decimal number in pattern space.
+# First hide trailing `9' digits.
+ :d
+ s/9\(_*\)$/_\1/
+ td
+# Assure at least one digit is available.
+ s/^\(_*\)$/0\1/
+# Increment the last digit.
+ s/8\(_*\)$/9\1/
+ s/7\(_*\)$/8\1/
+ s/6\(_*\)$/7\1/
+ s/5\(_*\)$/6\1/
+ s/4\(_*\)$/5\1/
+ s/3\(_*\)$/4\1/
+ s/2\(_*\)$/3\1/
+ s/1\(_*\)$/2\1/
+ s/0\(_*\)$/1\1/
+# Convert the hidden `9' digits to `0's.
+ s/_/0/g
+ x
+ G
+ s/\(.*\)\n\([0-9]*\)/\1, \2},/
+ s/\(.*\)"$/\1/
+ p
+}
+#
+# Last line.
+#
+$ {
+ i\
+};\
+
+ g
+ s/0*\(.*\)/int _msg_tbl_length = \1;/p
+}
+d
diff --git a/intl/textdomain.c b/intl/textdomain.c
new file mode 100644
index 0000000..8855746
--- /dev/null
+++ b/intl/textdomain.c
@@ -0,0 +1,108 @@
+/* Implementation of the textdomain(3) function.
+ Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+ Written by Ulrich Drepper <drepper at gnu.ai.mit.edu>, 1995.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if defined STDC_HEADERS || defined _LIBC
+# include <stdlib.h>
+#endif
+
+#if defined STDC_HEADERS || defined HAVE_STRING_H || defined _LIBC
+# include <string.h>
+#else
+# include <strings.h>
+# ifndef memcpy
+# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
+# endif
+#endif
+
+#ifdef _LIBC
+# include <libintl.h>
+#else
+# include "libgettext.h"
+#endif
+
+/* @@ end of prolog @@ */
+
+/* Name of the default text domain. */
+extern const char _nl_default_default_domain[];
+
+/* Default text domain in which entries for gettext(3) are to be found. */
+extern const char *_nl_current_default_domain;
+
+
+/* Names for the libintl functions are a problem. They must not clash
+ with existing names and they should follow ANSI C. But this source
+ code is also used in GNU C Library where the names have a __
+ prefix. So we have to make a difference here. */
+#ifdef _LIBC
+# define TEXTDOMAIN __textdomain
+# ifndef strdup
+# define strdup(str) __strdup (str)
+# endif
+#else
+# define TEXTDOMAIN textdomain__
+#endif
+
+/* Set the current default message catalog to DOMAINNAME.
+ If DOMAINNAME is null, return the current default.
+ If DOMAINNAME is "", reset to the default of "messages". */
+char *
+TEXTDOMAIN (domainname)
+ const char *domainname;
+{
+ char *old;
+
+ /* A NULL pointer requests the current setting. */
+ if (domainname == NULL)
+ return (char *) _nl_current_default_domain;
+
+ old = (char *) _nl_current_default_domain;
+
+ /* If domain name is the null string set to default domain "messages". */
+ if (domainname[0] == '\0'
+ || strcmp (domainname, _nl_default_default_domain) == 0)
+ _nl_current_default_domain = _nl_default_default_domain;
+ else
+ {
+ /* If the following malloc fails `_nl_current_default_domain'
+ will be NULL. This value will be returned and so signals we
+ are out of core. */
+#if defined _LIBC || defined HAVE_STRDUP
+ _nl_current_default_domain = strdup (domainname);
+#else
+ size_t len = strlen (domainname) + 1;
+ char *cp = (char *) malloc (len);
+ if (cp != NULL)
+ memcpy (cp, domainname, len);
+ _nl_current_default_domain = cp;
+#endif
+ }
+
+ if (old != _nl_default_default_domain)
+ free (old);
+
+ return (char *) _nl_current_default_domain;
+}
+
+#ifdef _LIBC
+/* Alias for function name in GNU C Library. */
+weak_alias (__textdomain, textdomain);
+#endif
diff --git a/intl/xopen-msg.sed b/intl/xopen-msg.sed
new file mode 100644
index 0000000..b19c0bb
--- /dev/null
+++ b/intl/xopen-msg.sed
@@ -0,0 +1,104 @@
+# po2msg.sed - Convert Uniforum style .po file to X/Open style .msg file
+# Copyright (C) 1995 Free Software Foundation, Inc.
+# Ulrich Drepper <drepper at gnu.ai.mit.edu>, 1995.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+#
+# The first directive in the .msg should be the definition of the
+# message set number. We use always set number 1.
+#
+1 {
+ i\
+$set 1 # Automatically created by po2msg.sed
+ h
+ s/.*/0/
+ x
+}
+#
+# We copy all comments into the .msg file. Perhaps they can help.
+#
+/^#/ s/^#[ ]*/$ /p
+#
+# We copy the original message as a comment into the .msg file.
+#
+/^msgid/ {
+# Does not work now
+# /"$/! {
+# s/\\$//
+# s/$/ ... (more lines following)"/
+# }
+ s/^msgid[ ]*"\(.*\)"$/$ Original Message: \1/
+ p
+}
+#
+# The .msg file contains, other then the .po file, only the translations
+# but each given a unique ID. Starting from 1 and incrementing by 1 for
+# each message we assign them to the messages.
+# It is important that the .po file used to generate the cat-id-tbl.c file
+# (with po-to-tbl) is the same as the one used here. (At least the order
+# of declarations must not be changed.)
+#
+/^msgstr/ {
+ s/msgstr[ ]*"\(.*\)"/\1/
+ x
+# The following nice solution is by
+# Bruno <Haible at ma2s2.mathematik.uni-karlsruhe.de>
+ td
+# Increment a decimal number in pattern space.
+# First hide trailing `9' digits.
+ :d
+ s/9\(_*\)$/_\1/
+ td
+# Assure at least one digit is available.
+ s/^\(_*\)$/0\1/
+# Increment the last digit.
+ s/8\(_*\)$/9\1/
+ s/7\(_*\)$/8\1/
+ s/6\(_*\)$/7\1/
+ s/5\(_*\)$/6\1/
+ s/4\(_*\)$/5\1/
+ s/3\(_*\)$/4\1/
+ s/2\(_*\)$/3\1/
+ s/1\(_*\)$/2\1/
+ s/0\(_*\)$/1\1/
+# Convert the hidden `9' digits to `0's.
+ s/_/0/g
+ x
+# Bring the line in the format `<number> <message>'
+ G
+ s/^[^\n]*$/& /
+ s/\(.*\)\n\([0-9]*\)/\2 \1/
+# Clear flag from last substitution.
+ tb
+# Append the next line.
+ :b
+ N
+# Look whether second part is a continuation line.
+ s/\(.*\n\)"\(.*\)"/\1\2/
+# Yes, then branch.
+ ta
+ P
+ D
+# Note that `D' includes a jump to the start!!
+# We found a continuation line. But before printing insert '\'.
+ :a
+ s/\(.*\)\(\n.*\)/\1\\\2/
+ P
+# We cannot use the sed command `D' here
+ s/.*\n\(.*\)/\1/
+ tb
+}
+d
diff --git a/main/Makefile.am b/main/Makefile.am
new file mode 100644
index 0000000..ff26c2f
--- /dev/null
+++ b/main/Makefile.am
@@ -0,0 +1,78 @@
+## Process this file with automake to produce Makefile.in
+
+INCLUDES = -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" \
+ -I$(top_srcdir)/directx/include -I$(top_srcdir)/directx/include/directx6 \
+ -I$(top_srcdir)/
+
+if PPUSER
+PPSRC1 = ppuser.c ppuserinit.c ppdev.c ppdevinit.c
+else
+PPSRC1 =
+endif
+
+if PPKDRV
+PPSRC2 = ppkdrv.c ppkdrvinit.c
+else
+PPSRC2 =
+endif
+
+if WIN32
+PPSRC3 = ppwin.c ppwininit.c ppntddkgenport.c ppntddkgenportinit.c ppw9xring0.c ppw9xring0init.c
+else
+PPSRC3 =
+endif
+
+if DIRECTX
+DIRECTXLIBS = -L$(top_builddir)/directx -ldsound -luser32 -lgdi32
+else
+DIRECTXLIBS =
+endif
+
+noinst_LIBRARIES = libinit.a libresident.a libresident2.a libmisc.a
+
+man_MANS = eppfpga.8
+
+libresident_a_SOURCES = \
+ ppdirect.c \
+ snprintpkt.c
+
+libresident2_a_SOURCES = \
+ $(PPSRC1) $(PPSRC2) $(PPSRC3)
+
+libinit_a_SOURCES = \
+ fpgatests.c \
+ configfpga.c \
+ ppdirectinit.c \
+ ecp_firmware.h \
+ epp_firmware.h \
+ eppafsk_firmware.h \
+ eppchk_firmware.h \
+ eppsamp_firmware.h \
+ sppafsk_firmware.h \
+ epp_fpga.h
+
+libmisc_a_SOURCES =
+libmisc_a_LIBADD = $(LIBOBJS)
+
+sbin_PROGRAMS = eppfpga
+
+eppfpga_SOURCES = \
+ eppfpga.c
+
+eppfpga_LDADD = \
+ libinit.a libresident.a libresident2.a libmisc.a $(DIRECTXLIBS)
+
+noinst_HEADERS = \
+ fpga.h \
+ sysdeps.h \
+ util.h \
+ parport.h \
+ getopt.h \
+ ppdev.h \
+ ppuser.h
+
+EXTRA_DIST = getopt.c getopt1.c syslog.c vsnprintf.c \
+ eppfpga.8 openpty.c \
+ ppuser.c ppuserinit.c ppdev.c ppdevinit.c ppkdrv.c ppkdrvinit.c \
+ ppntddkgenport.c ppntddkgenportinit.c ppnt.c ppntinit.c \
+ ppw9xring0.c ppw9xring0init.c ppwin.c ppwininit.c
diff --git a/main/Makefile.in b/main/Makefile.in
new file mode 100644
index 0000000..3b3d7ce
--- /dev/null
+++ b/main/Makefile.in
@@ -0,0 +1,553 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AS = @AS@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+DATADIRNAME = @DATADIRNAME@
+DLLTOOL = @DLLTOOL@
+DRVLIBOBJS = @DRVLIBOBJS@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+HAVE_BITTYPES = @HAVE_BITTYPES@
+HAVE_DIRECTX = @HAVE_DIRECTX@
+HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@
+HAVE_IOFUNCS = @HAVE_IOFUNCS@
+HAVE_LIB = @HAVE_LIB@
+HAVE_MKISS = @HAVE_MKISS@
+HAVE_PPKDRV = @HAVE_PPKDRV@
+HAVE_PPUSER = @HAVE_PPUSER@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LIB = @LIB@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LTLIB = @LTLIB@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+M_PI = @M_PI@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+
+INCLUDES = -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" \
+ -I$(top_srcdir)/directx/include -I$(top_srcdir)/directx/include/directx6 \
+ -I$(top_srcdir)/
+
+ at PPUSER_TRUE@PPSRC1 = @PPUSER_TRUE at ppuser.c ppuserinit.c ppdev.c ppdevinit.c
+ at PPUSER_FALSE@PPSRC1 =
+ at PPKDRV_TRUE@PPSRC2 = @PPKDRV_TRUE at ppkdrv.c ppkdrvinit.c
+ at PPKDRV_FALSE@PPSRC2 =
+ at WIN32_TRUE@PPSRC3 = @WIN32_TRUE at ppwin.c ppwininit.c ppntddkgenport.c ppntddkgenportinit.c ppw9xring0.c ppw9xring0init.c
+ at WIN32_FALSE@PPSRC3 =
+ at DIRECTX_TRUE@DIRECTXLIBS = @DIRECTX_TRUE at -L$(top_builddir)/directx -ldsound -luser32 -lgdi32
+ at DIRECTX_FALSE@DIRECTXLIBS =
+
+noinst_LIBRARIES = libinit.a libresident.a libresident2.a libmisc.a
+
+man_MANS = eppfpga.8
+
+libresident_a_SOURCES = \
+ ppdirect.c \
+ snprintpkt.c
+
+
+libresident2_a_SOURCES = \
+ $(PPSRC1) $(PPSRC2) $(PPSRC3)
+
+
+libinit_a_SOURCES = \
+ fpgatests.c \
+ configfpga.c \
+ ppdirectinit.c \
+ ecp_firmware.h \
+ epp_firmware.h \
+ eppafsk_firmware.h \
+ eppchk_firmware.h \
+ eppsamp_firmware.h \
+ sppafsk_firmware.h \
+ epp_fpga.h
+
+
+libmisc_a_SOURCES =
+libmisc_a_LIBADD = $(LIBOBJS)
+
+sbin_PROGRAMS = eppfpga
+
+eppfpga_SOURCES = \
+ eppfpga.c
+
+
+eppfpga_LDADD = \
+ libinit.a libresident.a libresident2.a libmisc.a $(DIRECTXLIBS)
+
+
+noinst_HEADERS = \
+ fpga.h \
+ sysdeps.h \
+ util.h \
+ parport.h \
+ getopt.h \
+ ppdev.h \
+ ppuser.h
+
+
+EXTRA_DIST = getopt.c getopt1.c syslog.c vsnprintf.c \
+ eppfpga.8 openpty.c \
+ ppuser.c ppuserinit.c ppdev.c ppdevinit.c ppkdrv.c ppkdrvinit.c \
+ ppntddkgenport.c ppntddkgenportinit.c ppnt.c ppntinit.c \
+ ppw9xring0.c ppw9xring0init.c ppwin.c ppwininit.c
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libinit_a_LIBADD =
+libinit_a_OBJECTS = fpgatests.$(OBJEXT) configfpga.$(OBJEXT) \
+ppdirectinit.$(OBJEXT)
+libresident_a_LIBADD =
+libresident_a_OBJECTS = ppdirect.$(OBJEXT) snprintpkt.$(OBJEXT)
+libresident2_a_LIBADD =
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_FALSE at libresident2_a_OBJECTS = \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_FALSE at ppkdrv.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_FALSE at ppkdrvinit.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_FALSE at ppwin.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_FALSE at ppwininit.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_FALSE at ppntddkgenport.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_FALSE at ppntddkgenportinit.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_FALSE at ppw9xring0.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_FALSE at ppw9xring0init.$(OBJEXT)
+ at PPKDRV_TRUE@@WIN32_FALSE@@PPUSER_TRUE at libresident2_a_OBJECTS = \
+ at PPKDRV_TRUE@@WIN32_FALSE@@PPUSER_TRUE at ppuser.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_FALSE@@PPUSER_TRUE at ppuserinit.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_FALSE@@PPUSER_TRUE at ppdev.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_FALSE@@PPUSER_TRUE at ppdevinit.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_FALSE@@PPUSER_TRUE at ppkdrv.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_FALSE@@PPUSER_TRUE at ppkdrvinit.$(OBJEXT)
+ at PPKDRV_FALSE@@WIN32_FALSE@@PPUSER_FALSE at libresident2_a_OBJECTS =
+ at PPKDRV_TRUE@@WIN32_FALSE@@PPUSER_FALSE at libresident2_a_OBJECTS = \
+ at PPKDRV_TRUE@@WIN32_FALSE@@PPUSER_FALSE at ppkdrv.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_FALSE@@PPUSER_FALSE at ppkdrvinit.$(OBJEXT)
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_TRUE at libresident2_a_OBJECTS = \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_TRUE at ppuser.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_TRUE at ppuserinit.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_TRUE at ppdev.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_TRUE at ppdevinit.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_TRUE at ppkdrv.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_TRUE at ppkdrvinit.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_TRUE at ppwin.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_TRUE at ppwininit.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_TRUE at ppntddkgenport.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_TRUE at ppntddkgenportinit.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_TRUE at ppw9xring0.$(OBJEXT) \
+ at PPKDRV_TRUE@@WIN32_TRUE@@PPUSER_TRUE at ppw9xring0init.$(OBJEXT)
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_TRUE at libresident2_a_OBJECTS = \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_TRUE at ppuser.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_TRUE at ppuserinit.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_TRUE at ppdev.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_TRUE at ppdevinit.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_TRUE at ppwin.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_TRUE at ppwininit.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_TRUE at ppntddkgenport.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_TRUE at ppntddkgenportinit.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_TRUE at ppw9xring0.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_TRUE at ppw9xring0init.$(OBJEXT)
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_FALSE at libresident2_a_OBJECTS = \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_FALSE at ppwin.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_FALSE at ppwininit.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_FALSE at ppntddkgenport.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_FALSE at ppntddkgenportinit.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_FALSE at ppw9xring0.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_TRUE@@PPUSER_FALSE at ppw9xring0init.$(OBJEXT)
+ at PPKDRV_FALSE@@WIN32_FALSE@@PPUSER_TRUE at libresident2_a_OBJECTS = \
+ at PPKDRV_FALSE@@WIN32_FALSE@@PPUSER_TRUE at ppuser.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_FALSE@@PPUSER_TRUE at ppuserinit.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_FALSE@@PPUSER_TRUE at ppdev.$(OBJEXT) \
+ at PPKDRV_FALSE@@WIN32_FALSE@@PPUSER_TRUE at ppdevinit.$(OBJEXT)
+libmisc_a_DEPENDENCIES = @LIBOBJS@
+libmisc_a_OBJECTS =
+sbin_PROGRAMS = eppfpga$(EXEEXT)
+PROGRAMS = $(sbin_PROGRAMS)
+
+eppfpga_OBJECTS = eppfpga.$(OBJEXT)
+ at DIRECTX_TRUE@eppfpga_DEPENDENCIES = libinit.a libresident.a \
+ at DIRECTX_TRUE@libresident2.a libmisc.a
+ at DIRECTX_FALSE@eppfpga_DEPENDENCIES = libinit.a libresident.a \
+ at DIRECTX_FALSE@libresident2.a libmisc.a
+eppfpga_LDFLAGS =
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+man8dir = $(mandir)/man8
+MANS = $(man_MANS)
+
+NROFF = nroff
+HEADERS = $(noinst_HEADERS)
+
+DIST_COMMON = Makefile.am Makefile.in getopt.c getopt1.c vsnprintf.c
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+SOURCES = $(libinit_a_SOURCES) $(libresident_a_SOURCES) $(libresident2_a_SOURCES) $(libmisc_a_SOURCES) $(eppfpga_SOURCES)
+OBJECTS = $(libinit_a_OBJECTS) $(libresident_a_OBJECTS) $(libresident2_a_OBJECTS) $(libmisc_a_OBJECTS) $(eppfpga_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .obj .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps main/Makefile
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-noinstLIBRARIES:
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+distclean-noinstLIBRARIES:
+
+maintainer-clean-noinstLIBRARIES:
+
+.c.o:
+ $(COMPILE) -c $<
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+ $(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+ -rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+libinit.a: $(libinit_a_OBJECTS) $(libinit_a_DEPENDENCIES)
+ -rm -f libinit.a
+ $(AR) cru libinit.a $(libinit_a_OBJECTS) $(libinit_a_LIBADD)
+ $(RANLIB) libinit.a
+
+libresident.a: $(libresident_a_OBJECTS) $(libresident_a_DEPENDENCIES)
+ -rm -f libresident.a
+ $(AR) cru libresident.a $(libresident_a_OBJECTS) $(libresident_a_LIBADD)
+ $(RANLIB) libresident.a
+
+libresident2.a: $(libresident2_a_OBJECTS) $(libresident2_a_DEPENDENCIES)
+ -rm -f libresident2.a
+ $(AR) cru libresident2.a $(libresident2_a_OBJECTS) $(libresident2_a_LIBADD)
+ $(RANLIB) libresident2.a
+
+libmisc.a: $(libmisc_a_OBJECTS) $(libmisc_a_DEPENDENCIES)
+ -rm -f libmisc.a
+ $(AR) cru libmisc.a $(libmisc_a_OBJECTS) $(libmisc_a_LIBADD)
+ $(RANLIB) libmisc.a
+
+mostlyclean-sbinPROGRAMS:
+
+clean-sbinPROGRAMS:
+ -test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS)
+
+distclean-sbinPROGRAMS:
+
+maintainer-clean-sbinPROGRAMS:
+
+install-sbinPROGRAMS: $(sbin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(sbindir)
+ @list='$(sbin_PROGRAMS)'; for p in $$list; do \
+ if test -f $$p; then \
+ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ else :; fi; \
+ done
+
+uninstall-sbinPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ list='$(sbin_PROGRAMS)'; for p in $$list; do \
+ rm -f $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ done
+
+eppfpga$(EXEEXT): $(eppfpga_OBJECTS) $(eppfpga_DEPENDENCIES)
+ @rm -f eppfpga$(EXEEXT)
+ $(LINK) $(eppfpga_LDFLAGS) $(eppfpga_OBJECTS) $(eppfpga_LDADD) $(LIBS)
+
+install-man8:
+ $(mkinstalldirs) $(DESTDIR)$(man8dir)
+ @list='$(man8_MANS)'; \
+ l2='$(man_MANS)'; for i in $$l2; do \
+ case "$$i" in \
+ *.8*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+ else file=$$i; fi; \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man8dir)/$$inst"; \
+ $(INSTALL_DATA) $$file $(DESTDIR)$(man8dir)/$$inst; \
+ done
+
+uninstall-man8:
+ @list='$(man8_MANS)'; \
+ l2='$(man_MANS)'; for i in $$l2; do \
+ case "$$i" in \
+ *.8*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " rm -f $(DESTDIR)$(man8dir)/$$inst"; \
+ rm -f $(DESTDIR)$(man8dir)/$$inst; \
+ done
+install-man: $(MANS)
+ @$(NORMAL_INSTALL)
+ $(MAKE) $(AM_MAKEFLAGS) install-man8
+uninstall-man:
+ @$(NORMAL_UNINSTALL)
+ $(MAKE) $(AM_MAKEFLAGS) uninstall-man8
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = main
+
+distdir: $(DISTFILES)
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+configfpga.o: configfpga.c ../config.h getopt.h parport.h sysdeps.h \
+ fpga.h util.h epp_fpga.h epp_firmware.h eppchk_firmware.h \
+ ecp_firmware.h eppafsk_firmware.h eppsamp_firmware.h \
+ sppafsk_firmware.h
+eppfpga.o: eppfpga.c ../config.h getopt.h parport.h sysdeps.h fpga.h
+fpgatests.o: fpgatests.c ../config.h getopt.h parport.h sysdeps.h fpga.h \
+ util.h epp_fpga.h
+ppdirect.o: ppdirect.c parport.h ../config.h sysdeps.h getopt.h fpga.h
+ppdirectinit.o: ppdirectinit.c parport.h ../config.h sysdeps.h getopt.h \
+ fpga.h
+snprintpkt.o: snprintpkt.c ../config.h fpga.h sysdeps.h getopt.h \
+ parport.h
+
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am: install-sbinPROGRAMS
+install-exec: install-exec-am
+
+install-data-am: install-man
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-sbinPROGRAMS uninstall-man
+uninstall: uninstall-am
+all-am: Makefile $(LIBRARIES) $(PROGRAMS) $(MANS) $(HEADERS)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+ $(mkinstalldirs) $(DESTDIR)$(sbindir) $(DESTDIR)$(mandir)/man8
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \
+ mostlyclean-sbinPROGRAMS mostlyclean-tags \
+ mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-noinstLIBRARIES clean-compile clean-sbinPROGRAMS \
+ clean-tags clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am: distclean-noinstLIBRARIES distclean-compile \
+ distclean-sbinPROGRAMS distclean-tags distclean-generic \
+ clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-noinstLIBRARIES \
+ maintainer-clean-compile maintainer-clean-sbinPROGRAMS \
+ maintainer-clean-tags maintainer-clean-generic \
+ distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
+clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile mostlyclean-sbinPROGRAMS \
+distclean-sbinPROGRAMS clean-sbinPROGRAMS maintainer-clean-sbinPROGRAMS \
+uninstall-sbinPROGRAMS install-sbinPROGRAMS install-man8 uninstall-man8 \
+install-man uninstall-man tags mostlyclean-tags distclean-tags \
+clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
+check-am installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/main/configfpga.c b/main/configfpga.c
new file mode 100644
index 0000000..1ce7311
--- /dev/null
+++ b/main/configfpga.c
@@ -0,0 +1,1032 @@
+/*****************************************************************************/
+
+/*
+ * configfpga.c -- FPGA configuration routines.
+ *
+ * Copyright (C) 1998-2000 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+#include <math.h>
+#include <unistd.h>
+#include <stdarg.h>
+
+#ifdef HAVE_SYS_PERM_H
+#include <sys/perm.h>
+#endif
+
+#include "parport.h"
+#include "fpga.h"
+#include "util.h"
+
+/* ---------------------------------------------------------------------- */
+
+#include "epp_fpga.h"
+#include "epp_firmware.h"
+#include "eppchk_firmware.h"
+#include "ecp_firmware.h"
+#include "eppafsk_firmware.h"
+#include "eppsamp_firmware.h"
+#include "sppafsk_firmware.h"
+
+/* ---------------------------------------------------------------------- */
+
+/* LPT data register */
+#define LPTDATA_SHIFT_TDI 0
+#define LPTDATA_SHIFT_TMS 2
+#define LPTDATA_TDI (1<<LPTDATA_SHIFT_TDI)
+#define LPTDATA_TCK 0x02
+#define LPTDATA_TMS (1<<LPTDATA_SHIFT_TMS)
+#define LPTDATA_INITBIAS 0x80
+
+/* Xilinx 4k JTAG instructions */
+#define XC4K_IRLENGTH 3
+#define XC4K_EXTEST 0
+#define XC4K_PRELOAD 1
+#define XC4K_CONFIGURE 5
+#define XC4K_BYPASS 7
+
+/* ---------------------------------------------------------------------- */
+
+static void jtag_shiftout(unsigned num, unsigned tdi, unsigned tms, unsigned char eppdata)
+{
+ unsigned char v;
+
+ eppdata &= ~(LPTDATA_TDI | LPTDATA_TMS | LPTDATA_TCK);
+ v = eppdata | ((tdi << LPTDATA_SHIFT_TDI) & LPTDATA_TDI) | ((tms << LPTDATA_SHIFT_TMS) & LPTDATA_TMS);
+ parport_write_data(v);
+ while (num > 0) {
+ parport_write_data(v | LPTDATA_TCK);
+ tdi >>= 1;
+ tms >>= 1;
+ v = eppdata | ((tdi << LPTDATA_SHIFT_TDI) & LPTDATA_TDI) |
+ ((tms << LPTDATA_SHIFT_TMS) & LPTDATA_TMS);
+ parport_write_data(v);
+ num--;
+ }
+}
+
+static unsigned jtag_shift(unsigned num, unsigned tdi, unsigned tms, unsigned char eppdata)
+{
+ unsigned char v;
+ unsigned in = 0, mask = 2;
+
+ eppdata &= ~(LPTDATA_TDI | LPTDATA_TMS | LPTDATA_TCK);
+ v = eppdata | ((tdi << LPTDATA_SHIFT_TDI) & LPTDATA_TDI) |
+ ((tms << LPTDATA_SHIFT_TMS) & LPTDATA_TMS);
+ parport_write_data(v);
+ if (parport_read_status() & LPTSTAT_NINTR)
+ in |= 1;
+ while (num > 0) {
+ parport_write_data(v | LPTDATA_TCK);
+ tdi >>= 1;
+ tms >>= 1;
+ v = eppdata | ((tdi << LPTDATA_SHIFT_TDI) & LPTDATA_TDI) |
+ ((tms << LPTDATA_SHIFT_TMS) & LPTDATA_TMS);
+ parport_write_data(v);
+ num--;
+ if (parport_read_status() & LPTSTAT_NINTR)
+ in |= mask;
+ mask <<= 1;
+ }
+ return in;
+}
+
+extern inline void jtag_reset_tap(void)
+{
+ jtag_shiftout(5, 0, ~0, 0);
+}
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ * this routine expects the target TAP to be in RUNTEST/IDLE
+ * state and leaves it there at exit
+ */
+
+void boundary(unsigned int blen, const unsigned char *in, unsigned char *out, unsigned char eppdata)
+{
+
+ jtag_shiftout(3, 0, 1, eppdata);
+ while (blen > 8) {
+ *out++ = jtag_shift(8, *in++, 0, eppdata);
+ blen -= 8;
+ }
+ *out = jtag_shift(blen, *in, 1 << (blen-1), eppdata);
+ jtag_shiftout(2, 0, 1, eppdata);
+}
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ * Modem detection routines (assume the LPT port is there)
+ */
+
+static int detect_modem(void)
+{
+ unsigned int i;
+ unsigned char val;
+ unsigned char bd[FPGA_BOUNDSIZE];
+
+ /* pulse PROGRAM low */
+ parport_write_control(LPTCTRL_ADDRSTB);
+ parport_write_data(LPTDATA_TMS);
+ usleep(10);
+ parport_write_control(LPTCTRL_PROGRAM);
+ /* check if EPP NINIT is low */
+ val = parport_read_status();
+ if (val & LPTSTAT_WAIT) {
+ lprintf(0, "cannot hold down INIT\n");
+ return -1;
+ }
+ if (val & LPTSTAT_DONE) {
+ lprintf(0, "DONE high\n");
+ return -1;
+ }
+ /* FPGA held in configuration state due to INITBIAS low */
+ jtag_reset_tap(); /* force TAP controller into reset state */
+ /* check instruction register length */
+ jtag_shiftout(5, 0, 6, 0); /* enter Shift-IR state */
+ jtag_shiftout(32, 0, 0, 0); /* assume max. 32bit IR */
+ i = jtag_shift(32, 1, 0, 0); /* shift in a single bit */
+ if (hweight32(i) != 1) {
+ lprintf(0, "unable to detect JTAG IR (val %#06x)\n", i);
+ return -1;
+ }
+ if (ffs(i) != XC4K_IRLENGTH+1) {
+ lprintf(0, "size of JTAG IR not %d bits (val %#06x)\n", XC4K_IRLENGTH, i);
+ return -1;
+ }
+ /* shift in PRELOAD insn, goto SHIFTDR state */
+ jtag_shiftout(XC4K_IRLENGTH+4, XC4K_PRELOAD, 7 << (XC4K_IRLENGTH-1), 0);
+ for (i = 0; i < 1000; i++) {
+ parport_write_data(0);
+ parport_write_data(LPTDATA_TCK);
+ }
+ parport_write_data(LPTDATA_TDI);
+ parport_write_data(LPTDATA_TDI | LPTDATA_TCK);
+ i = 1;
+ parport_write_data(0);
+ while (!(parport_read_status() & LPTSTAT_NINTR)) {
+ if (i >= 1000) {
+ lprintf(0, "JTAG DR too long\n");
+ return -1;
+ }
+ parport_write_data(LPTDATA_TCK);
+ parport_write_data(0);
+ i++;
+ }
+ if (i != FPGA_BOUND) {
+ lprintf(0, "size of JTAG DR not %d bits (val %d)\n", FPGA_BOUND, i);
+ return -1;
+ }
+ for (i = 0; i < FPGA_BOUND-1; i++) {
+ val = ((fpga_safebound[i >> 3] >> (i & 3)) & 1) << LPTDATA_SHIFT_TDI;
+ parport_write_data(val);
+ parport_write_data(val | LPTDATA_TCK);
+ }
+ /* i = data->h.h.boundarylength-1; */
+ val = (((fpga_safebound[(FPGA_BOUND-1) >> 3] >> ((FPGA_BOUND-1) & 3)) & 1)
+ << LPTDATA_SHIFT_TDI) | LPTDATA_TMS;
+ parport_write_data(val);
+ parport_write_data(val | LPTDATA_TCK);
+ /* shift in EXTEST insn, goto TESTRESET state */
+ jtag_shiftout(7 + XC4K_IRLENGTH, XC4K_EXTEST << 5, 7 | (0x30 << XC4K_IRLENGTH), 0);
+ boundary(FPGA_BOUND, fpga_safebound, bd, 0);
+ lprintf(1, "Modem jumpers: %c %c%c%c%c %c%c%c%c %c%c%c%c\n",
+ '0' + readboundary(bd, FPGA_PIN_RAMA0_I),
+ '0' + readboundary(bd, FPGA_PIN_RAMA1_I),
+ '0' + readboundary(bd, FPGA_PIN_RAMA2_I),
+ '0' + readboundary(bd, FPGA_PIN_RAMA3_I),
+ '0' + readboundary(bd, FPGA_PIN_RAMA4_I),
+ '0' + readboundary(bd, FPGA_PIN_RAMA5_I),
+ '0' + readboundary(bd, FPGA_PIN_RAMA6_I),
+ '0' + readboundary(bd, FPGA_PIN_RAMA7_I),
+ '0' + readboundary(bd, FPGA_PIN_RAMA8_I),
+ '0' + readboundary(bd, FPGA_PIN_RAMA9_I),
+ '0' + readboundary(bd, FPGA_PIN_RAMA10_I),
+ '0' + readboundary(bd, FPGA_PIN_RAMA11_I),
+ '0' + readboundary(bd, FPGA_PIN_RAMA12_I));
+ return 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+void printconfig(const struct adapter_config *cfg)
+{
+ lprintf(1, "configuration: %sclk,%smodem,fclk=%d,bitrate=%d%s,%sextstat,%spttmute,filter=%d,gain=%d\n",
+ cfg->intclk ? "int" : "ext",
+ cfg->extmodem ? "ext" : "int", cfg->fclk, cfg->bitrate,
+ cfg->loopback ? ",loopback" : "", cfg->extstat ? "" : "no", cfg->pttmute ? "" : "no",
+ cfg->filtmode, cfg->gain);
+}
+
+void parseconfig(struct adapter_config *cfg, const char *modestr)
+{
+ const char *cp;
+ /* temporary hack to ease the transition to the new format */
+ unsigned hasbitrate = 0, divider = 0;
+
+ /* meaningful frequencies/bit rates */
+ if (!cfg->fclk)
+ cfg->fclk = 19666600;
+ if (!cfg->bitrate)
+ cfg->bitrate = 9600;
+ if (cfg->fclk < 1000000)
+ cfg->fclk = 1000000;
+ if (cfg->fclk > 25000000)
+ cfg->fclk = 25000000;
+ if (cfg->bitrate < 4096)
+ cfg->bitrate = 4096;
+ if (cfg->bitrate > 1500000)
+ cfg->bitrate = 1500000;
+ /* command line parsing */
+ if (strstr(modestr, "intclk"))
+ cfg->intclk = 1;
+ if (strstr(modestr, "extclk"))
+ cfg->intclk = 0;
+ if (strstr(modestr, "intmodem"))
+ cfg->extmodem = 0;
+ if (strstr(modestr, "extmodem"))
+ cfg->extmodem = 1;
+ if (strstr(modestr, "noloopback"))
+ cfg->loopback = 0;
+ else if (strstr(modestr, "loopback"))
+ cfg->loopback = 1;
+ if (strstr(modestr, "noextstat"))
+ cfg->extstat = 0;
+ else if (strstr(modestr, "extstat"))
+ cfg->extstat = 1;
+ if (strstr(modestr, "nopttmute"))
+ cfg->pttmute = 0;
+ else if (strstr(modestr, "pttmute"))
+ cfg->pttmute = 1;
+ if ((cp = strstr(modestr, "fclk="))) {
+ cfg->fclk = strtoul(cp+5, NULL, 0);
+ if (cfg->fclk < 1000000)
+ cfg->fclk = 1000000;
+ if (cfg->fclk > 25000000)
+ cfg->fclk = 25000000;
+ }
+ if ((cp = strstr(modestr, "bitrate="))) {
+ cfg->bitrate = strtoul(cp+8, NULL, 0);
+ if (cfg->bitrate < 4096)
+ cfg->bitrate = 4096;
+ if (cfg->bitrate > 1500000)
+ cfg->bitrate = 1500000;
+ hasbitrate = 1;
+ }
+ if ((cp = strstr(modestr, "filter="))) {
+ cfg->filtmode = strtoul(cp+7, NULL, 0);
+ if (cfg->filtmode > 2)
+ cfg->filtmode = 2;
+ }
+ if ((cp = strstr(modestr, "gain="))) {
+ cfg->gain = strtoul(cp+5, NULL, 0);
+ if (cfg->gain < 1)
+ cfg->gain = 1;
+ if (cfg->gain > 32)
+ cfg->gain = 32;
+ }
+ if ((cp = strstr(modestr, "divider="))) {
+ divider = strtoul(cp+8, NULL, 0);
+ if (divider < 1)
+ divider = 1;
+ if (divider > 1024)
+ divider = 1024;
+ }
+ /* set bitrate if there was a divider= but no bitrate= */
+ if (!hasbitrate && divider) {
+ cfg->bitrate = (cfg->fclk + 8 * divider) / (16 * divider);
+ if (cfg->bitrate < 4096)
+ cfg->bitrate = 4096;
+ if (cfg->bitrate > 1500000)
+ cfg->bitrate = 1500000;
+ }
+}
+
+/* ---------------------------------------------------------------------- */
+
+#if 0
+static void calc_crc(const unsigned char *data, unsigned int frame)
+{
+ unsigned int ptr = frame * FPGA_FRAMELEN + 41, i, creg = ~0, creg2 = creg;
+ unsigned char b1[8], b2[8], b3[8], *s1 = b1, *s2 = b2, *s3 = b3;
+
+ for (i = 0; i < FPGA_FRAMELEN-5; i++, ptr++) {
+ creg <<= 1;
+ creg |= ((data[ptr >> 3] >> ((~ptr) & 7)) ^ (creg >> 16) ^ (creg >> 1) ^ (creg >> 14)) & 1;
+ creg2 <<= 1;
+ if (((data[ptr >> 3] >> ((~ptr) & 7)) ^ (creg2 >> 16)) & 1)
+ creg2 ^= (1 << 0) | (1 << 2) | (1 << 15);
+ }
+ for (i = 0; i < 4; i++, ptr++) {
+ *s1++ = '0' + ((data[ptr >> 3]>> ((~ptr) & 7)) & 1);
+ creg <<= 1;
+ creg |= ((creg >> 16) ^ (creg >> 1) ^ (creg >> 14)) & 1;
+ *s2++ = '0' + ((creg >> 16) & 1);
+ creg2 <<= 1;
+ if (creg2 & (1 << 16))
+ creg2 ^= (1 << 0) | (1 << 2) | (1 << 15);
+ *s3++ = '0' + ((creg2 >> 16) & 1);
+ }
+ *s1 = *s2 = *s3 = 0;
+ printf("Frame %3d CRC file %s calc %s %s ptr %5d\n", frame, b1, b2, b3, ptr);
+}
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+static int configure(const unsigned char *data, unsigned cfgsz)
+{
+ struct timeval time1, time2;
+ unsigned i, j, dt;
+ unsigned char val;
+ unsigned char lpstat;
+ unsigned char cfgbuf[16];
+ unsigned char *bp;
+
+#if 0
+ for (i = 0; i < EPP_FPGANUMFRAMES; i++)
+ calc_crc(cfgdata, i);
+#endif
+ parport_write_data(0);
+ /* pulse PROGRAM low */
+ parport_write_control(LPTCTRL_ADDRSTB);
+ usleep(100);
+ parport_write_control(LPTCTRL_PROGRAM);
+ if (parport_read_status() & LPTSTAT_WAIT) {
+ lprintf(0, "FPGA configuration error (INIT prematurely high)\n");
+ return -1;
+ }
+ jtag_shiftout(12 + XC4K_IRLENGTH, XC4K_CONFIGURE << 10,
+ 0xdf | (0x600 << XC4K_IRLENGTH), 0);
+ /* we are now in RUNTEST/IDLE state */
+ /* set initbias high; poll for init going high */
+ parport_write_data(LPTDATA_INITBIAS);
+ gettime(&time1);
+ while (!(parport_read_status() & LPTSTAT_WAIT)) {
+ gettime(&time2);
+ if (((time2.tv_sec - time1.tv_sec) * 1000000UL +
+ (time2.tv_usec - time1.tv_usec)) >= 500000) {
+ lprintf(0, "during configure: INIT stuck low\n");
+ return -1;
+ }
+ }
+ gettime(&time2);
+ lprintf(2, "Init was down for %ld us\n", (time2.tv_sec - time1.tv_sec) * 1000000UL +
+ time2.tv_usec - time1.tv_usec);
+ jtag_shiftout(3, ~0, 1, LPTDATA_INITBIAS); /* advance to SHIFT-DR state */
+ for (i = 0; i < cfgsz; i++) {
+ dt = data[i];
+ bp = cfgbuf;
+ for (j = 0; j < 8; j++, dt >>= 1) {
+ val = LPTDATA_INITBIAS | ((dt << LPTDATA_SHIFT_TDI) & LPTDATA_TDI);
+ *bp++ = val;
+ *bp++ = val | LPTDATA_TCK;
+ }
+ if (parport_fpgaconfig_write(cfgbuf, 16) != 16) {
+ lprintf(0, "FPGA configuration write error\n");
+ return -1;
+ }
+ lpstat = parport_read_status();
+ if (lpstat & LPTSTAT_DONE) {
+ if (i >= cfgsz-1)
+ break;
+ lprintf(0, "FPGA configuration error (DONE prematurely high)\n");
+ return -1;
+ }
+ if (!(lpstat & LPTSTAT_WAIT)) {
+ lprintf(0, "FPGA configuration error (INIT down)\n");
+ return -1;
+ }
+ }
+ for (i = 0; ; ) {
+ lpstat = parport_read_status();
+ if (lpstat & LPTSTAT_DONE)
+ break;
+ if (!(lpstat & LPTSTAT_WAIT)) {
+ lprintf(0, "FPGA configuration error (INIT down) (2)!!\n");
+ return -1;
+ }
+ parport_write_data(LPTDATA_INITBIAS | LPTDATA_TDI);
+ parport_write_data(LPTDATA_INITBIAS | LPTDATA_TDI | LPTDATA_TCK);
+ if ((++i) > 1000) {
+ lprintf(0, "DONE stuck low\n");
+ return -1;
+ }
+ }
+ /* generate a few additional clock cycles to ensure proper startup */
+ for (i = 0; i < 16; i++) {
+ parport_write_data(LPTDATA_INITBIAS | LPTDATA_TDI);
+ parport_write_data(LPTDATA_INITBIAS | LPTDATA_TDI | LPTDATA_TCK);
+ }
+ lprintf(1, "FPGA configuration completed successfully\n");
+ return 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static unsigned int readconfigrom(const unsigned char *firmware, const unsigned long rom[16])
+{
+ unsigned ret = 0, mask = 1, i, j;
+
+ for (i = 0; i < 16; i++, mask <<= 1) {
+ j = rom[i];
+ if (!(firmware[j >> 3] & (1 << (j & 7))))
+ ret |= mask;
+ }
+ return ret & 0xffff;
+}
+
+/* warning: if used, don't use CRC bitstream, there's currently no code to recalc the CRC */
+static void writeconfigrom(unsigned char *firmware, const unsigned long rom[16], unsigned val)
+{
+ unsigned mask = 1, i, j;
+
+ for (i = 0; i < 16; i++, mask <<= 1) {
+ j = rom[i];
+ if (val & mask)
+ firmware[j >> 3] &= ~(1 << (j & 7));
+ else
+ firmware[j >> 3] |= 1 << (j & 7);
+ }
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * Filter calc routines
+ */
+
+static const float filt_comp[32] = {
+ -0.0000, -0.0071, -0.0144, -0.0160,
+ -0.0028, 0.0279, 0.0617, 0.0683,
+ 0.0208, -0.0765, -0.1732, -0.1877,
+ -0.0525, 0.2365, 0.5993, 0.9000,
+ 1.0122, 0.8857, 0.5741, 0.2060,
+ -0.0825, -0.2130, -0.1919, -0.0888,
+ 0.0138, 0.0649, 0.0606, 0.0281,
+ -0.0021, -0.0152, -0.0139, -0.0070
+};
+
+/* -------------------------------------------------------------------- */
+
+#define HAMMING(x) (0.54-0.46*cos(2*M_PI*(x)));
+
+extern inline float hamming(float x)
+{
+ return 0.54-0.46*cos(2*M_PI*x);
+}
+
+extern inline float sinc(float x)
+{
+ if (x == 0)
+ return 1;
+ x *= M_PI;
+ return sin(x)/x;
+}
+
+/* -------------------------------------------------------------------- */
+
+#if 0
+static void filt_printfcoeff(const float coeff[32])
+{
+ int i;
+
+ lprintf(3, "filter coefficients:");
+ for (i = 0; i < 32; i++) {
+ if (!(i & 7))
+ lprintf(3, "\n ");
+ lprintf(3, "%6.2f", coeff[i]);
+ }
+ lprintf(3, '\n');
+}
+
+static void filt_printicoeff(const int coeff[32])
+{
+ int i;
+
+ lprintf(3, "filter coefficients:");
+ for (i = 0; i < 32; i++) {
+ if (!(i & 7))
+ lprintf(3, "\n ");
+ lprintf(3, "%5i", coeff[i]);
+ }
+ lprintf(3, '\n');
+}
+#endif
+
+/* -------------------------------------------------------------------- */
+
+static void filt_genideal(float coeff[32])
+{
+ int i;
+
+ for (i = 0; i < 32; i++)
+ coeff[i] = hamming(i / 31.0) * sinc((i - 15.5) / 4.0);
+}
+
+/* -------------------------------------------------------------------- */
+
+static void filt_rom(const float coeff[32], unsigned rom[16])
+{
+ float max = 0.000001, s;
+ int ocoeff[32];
+ int i, j;
+
+ /* scale filter values */
+ for(i = 0; i < 4; i++) {
+ for(s = 0, j = i; j < 32; j += 4)
+ s += fabs(coeff[j]);
+ if (s > max)
+ max = s;
+ }
+ s = 126.0 / max;
+ for(i = 0; i < 32; i++)
+ ocoeff[i] = s * coeff[i];
+ /* convert to internal ROM representation */
+ memset(rom, 0, sizeof(rom[0])*16);
+ for (i = 0; i < 8; i++)
+ for (j = 0; j < 16; j++) {
+ if ((1 << i) & ocoeff[j])
+ rom[i] |= 1 << (((j + 1) & 3) | (j & 12));
+ if ((1 << i) & ocoeff[j+16])
+ rom[i+8] |= 1 << j;
+ }
+}
+
+/* ---------------------------------------------------------------------- */
+
+int adapter_start_no_firmware(void)
+{
+ if (FPGA_CONFIGSIZE != sizeof(epp_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(eppchk_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(ecp_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(eppafsk_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(eppsamp_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(sppafsk_firmware))
+ abort();
+ if (detect_modem())
+ return -3;
+ return 0;
+}
+
+int adapter_start_eppchk(void)
+{
+ if (FPGA_CONFIGSIZE != sizeof(epp_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(eppchk_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(ecp_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(eppafsk_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(eppsamp_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(sppafsk_firmware))
+ abort();
+ if (detect_modem())
+ return -3;
+ if (configure(eppchk_firmware, FPGA_CONFIGSIZE)) {
+ reset_modem();
+ return -4;
+ }
+ parport_write_control(LPTCTRL_PROGRAM);
+ return 0;
+}
+
+int adapter_start_epp(struct adapter_config *cfg)
+{
+ unsigned char cfgdata[FPGA_CONFIGSIZE];
+ float fcoeff[32];
+ unsigned filtrom[16];
+ int i;
+ unsigned char null = 0;
+ unsigned divider;
+
+ if (FPGA_CONFIGSIZE != sizeof(epp_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(eppchk_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(ecp_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(eppafsk_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(eppsamp_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(sppafsk_firmware))
+ abort();
+ if (detect_modem())
+ return -3;
+ /* calculate the divider */
+ divider = (cfg->fclk + 8 * cfg->bitrate) / (16 * cfg->bitrate);
+ if (divider < 1)
+ divider = 1;
+ if (divider > 1024)
+ divider = 1024;
+ cfg->bitrate = (cfg->fclk + 8 * divider) / (16 * divider);
+ /* print configuration */
+ printconfig(cfg);
+ memcpy(cfgdata, epp_firmware, FPGA_CONFIGSIZE);
+ /* patch configuration ROM's */
+ if (cfg->intclk)
+ writeconfigrom(cfgdata, epp_roms+EPP_ROM_CLKSELROM, 0);
+ writeconfigrom(cfgdata, epp_roms+EPP_ROM_DIVROM0, 1 << ((divider-1) & 0xf));
+ writeconfigrom(cfgdata, epp_roms+EPP_ROM_DIVROM1, 1 << (((divider-1) >> 4) & 0xf));
+ writeconfigrom(cfgdata, epp_roms+EPP_ROM_DIVROM2, 0x1000 << (((divider-1) >> 8) & 0x3));
+ if (!cfg->extstat) {
+ writeconfigrom(cfgdata, epp_roms+EPP_ROM_STIROM, 0);
+ writeconfigrom(cfgdata, epp_roms+EPP_ROM_STOROM, 0);
+ }
+ if (cfg->loopback) {
+ writeconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMID, 0xf0f0);
+ writeconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMIC, 0xff00); /* modem output clock */
+ } else if (cfg->extmodem) {
+ writeconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMID, 0xcccc);
+ writeconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMIC, 0x0c0c); /* RxC: rising edge */
+ writeconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMOC, 0x3030); /* TxC: falling edge */
+ writeconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMDCD, 0x3333); /* DCD: inverted */
+ /* switch off scrambler and differential */
+ writeconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMOE, 0xaaaa);
+ writeconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMOS, 0xaaaa);
+ writeconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMIE, 0xaaaa);
+ writeconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMIS, 0xaaaa);
+ }
+ if (!cfg->pttmute)
+ writeconfigrom(cfgdata, epp_roms+EPP_ROM_PTTMUTEROM, 0xffff);
+ if (cfg->filtmode == 1) {
+ filt_rom(filt_comp, filtrom);
+ for (i = 0; i < 16; i++)
+ writeconfigrom(cfgdata, epp_roms+EPP_ROM_CROM0_R_0+16*i, filtrom[i]);
+ } else if (cfg->filtmode == 2) {
+ filt_genideal(fcoeff);
+ filt_rom(fcoeff, filtrom);
+ for (i = 0; i < 16; i++)
+ writeconfigrom(cfgdata, epp_roms+EPP_ROM_CROM0_R_0+16*i, filtrom[i]);
+ }
+ /* print configuration ROM's (mainly a debugging action) */
+ lprintf(2, "config: coeff: %04x %04x %04x %04x %04x %04x %04x %04x\n"
+ "config: coeff: %04x %04x %04x %04x %04x %04x %04x %04x\n",
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM0_R_0),
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM0_R_1),
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM0_R_2),
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM0_R_3),
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM0_R_4),
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM0_R_5),
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM0_R_6),
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM0_R_7),
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM1_R_0),
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM1_R_1),
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM1_R_2),
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM1_R_3),
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM1_R_4),
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM1_R_5),
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM1_R_6),
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_CROM1_R_7));
+ lprintf(2, "config: ClkSel: %04x PTT mute: %04x\n",
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_CLKSELROM),
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_PTTMUTEROM));
+ lprintf(2, "config: Div: %04x %04x %04x\n",
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_DIVROM0),
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_DIVROM1),
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_DIVROM2));
+ lprintf(2, "config: DCD: %04x\n",
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMDCD));
+ lprintf(2, "config: IClk: %04x ID: %04x IE: %04x IS: %04x\n",
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMIC),
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMID),
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMIE),
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMIS));
+ lprintf(2, "config: OClk: %04x OE: %04x OS: %04x\n",
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMOC),
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMOE),
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_SWROMOS));
+ lprintf(2, "config: StI: %04x StO: %04x\n",
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_STIROM),
+ readconfigrom(cfgdata, epp_roms+EPP_ROM_STOROM));
+ /* finally download code to FPGA */
+ if (configure(cfgdata, FPGA_CONFIGSIZE)) {
+ reset_modem();
+ return -4;
+ }
+ parport_write_control(LPTCTRL_PROGRAM);
+ if (parport_epp_write_addr(&null, 1) != 1) { /* reset modem */
+ lprintf(0, "EPP timeout\n");
+ return -1;
+ }
+ return 0;
+}
+
+int adapter_start_ecp(struct adapter_config *cfg)
+{
+ unsigned char cfgdata[FPGA_CONFIGSIZE];
+ float fcoeff[32];
+ unsigned filtrom[16];
+ int i;
+ unsigned divider;
+
+ if (FPGA_CONFIGSIZE != sizeof(epp_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(eppchk_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(ecp_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(eppafsk_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(eppsamp_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(sppafsk_firmware))
+ abort();
+ if (detect_modem())
+ return -3;
+ /* calculate the divider */
+ divider = (cfg->fclk + 8 * cfg->bitrate) / (16 * cfg->bitrate);
+ if (divider < 1)
+ divider = 1;
+ if (divider > 1024)
+ divider = 1024;
+ cfg->bitrate = (cfg->fclk + 8 * divider) / (16 * divider);
+ /* print configuration */
+ printconfig(cfg);
+ memcpy(cfgdata, ecp_firmware, FPGA_CONFIGSIZE);
+ /* patch configuration ROM's */
+ if (cfg->intclk)
+ writeconfigrom(cfgdata, ecp_roms+ECP_ROM_CLKSELROM, 0);
+ writeconfigrom(cfgdata, ecp_roms+ECP_ROM_DIVROM0, 1 << ((divider-1) & 0xf));
+ writeconfigrom(cfgdata, ecp_roms+ECP_ROM_DIVROM1, 1 << (((divider-1) >> 4) & 0xf));
+ writeconfigrom(cfgdata, ecp_roms+ECP_ROM_DIVROM2, 0x1000 << (((divider-1) >> 8) & 0x3));
+ if (cfg->loopback) {
+ writeconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMID, 0xf0f0);
+ writeconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMIC, 0xff00); /* modem output clock */
+ } else if (cfg->extmodem) {
+ writeconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMID, 0xcccc);
+ writeconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMIC, 0x0c0c); /* RxC: rising edge */
+ writeconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMOC, 0x3030); /* TxC: falling edge */
+ writeconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMDCD, 0x3333); /* DCD: inverted */
+ /* switch off scrambler and differential */
+ writeconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMOE, 0xaaaa);
+ writeconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMOS, 0xaaaa);
+ writeconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMIE, 0xaaaa);
+ writeconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMIS, 0xaaaa);
+ }
+ if (!cfg->pttmute)
+ writeconfigrom(cfgdata, ecp_roms+ECP_ROM_PTTMUTEROM, 0xffff);
+ if (cfg->filtmode == 1) {
+ filt_rom(filt_comp, filtrom);
+ for (i = 0; i < 16; i++)
+ writeconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM0_R_0+16*i, filtrom[i]);
+ } else if (cfg->filtmode == 2) {
+ filt_genideal(fcoeff);
+ filt_rom(fcoeff, filtrom);
+ for (i = 0; i < 16; i++)
+ writeconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM0_R_0+16*i, filtrom[i]);
+ }
+ /* print configuration ROM's (mainly a debugging action) */
+ lprintf(2, "config: coeff: %04x %04x %04x %04x %04x %04x %04x %04x\n"
+ "config: coeff: %04x %04x %04x %04x %04x %04x %04x %04x\n",
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM0_R_0),
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM0_R_1),
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM0_R_2),
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM0_R_3),
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM0_R_4),
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM0_R_5),
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM0_R_6),
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM0_R_7),
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM1_R_0),
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM1_R_1),
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM1_R_2),
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM1_R_3),
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM1_R_4),
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM1_R_5),
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM1_R_6),
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_CROM1_R_7));
+ lprintf(2, "config: ClkSel: %04x PTT mute: %04x\n",
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_CLKSELROM),
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_PTTMUTEROM));
+ lprintf(2, "config: Div: %04x %04x %04x\n",
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_DIVROM0),
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_DIVROM1),
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_DIVROM2));
+ lprintf(2, "config: DCD: %04x\n",
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMDCD));
+ lprintf(2, "config: IClk: %04x ID: %04x IE: %04x IS: %04x\n",
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMIC),
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMID),
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMIE),
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMIS));
+ lprintf(2, "config: OClk: %04x OE: %04x OS: %04x\n",
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMOC),
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMOE),
+ readconfigrom(cfgdata, ecp_roms+ECP_ROM_SWROMOS));
+ /* finally download code to FPGA */
+ if (configure(cfgdata, FPGA_CONFIGSIZE)) {
+ reset_modem();
+ return -4;
+ }
+ return 0;
+}
+
+int adapter_start_eppafsk(struct adapter_config *cfg)
+{
+ unsigned char cfgdata[FPGA_CONFIGSIZE];
+ unsigned char null = 0;
+ unsigned divider;
+
+ if (FPGA_CONFIGSIZE != sizeof(epp_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(eppchk_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(ecp_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(eppafsk_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(eppsamp_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(sppafsk_firmware))
+ abort();
+ if (detect_modem())
+ return -3;
+ /* calculate the divider */
+ divider = (cfg->fclk + 32 * cfg->bitrate) / (64 * cfg->bitrate);
+ if (divider < 1)
+ divider = 1;
+ if (divider > 1024)
+ divider = 1024;
+ cfg->bitrate = (cfg->fclk + 32 * divider) / (64 * divider);
+ /* print configuration */
+ printconfig(cfg);
+ memcpy(cfgdata, eppafsk_firmware, FPGA_CONFIGSIZE);
+ /* patch configuration ROM's */
+ if (cfg->intclk)
+ writeconfigrom(cfgdata, eppafsk_roms+EPPAFSK_ROM_CLKSELROM, 0);
+ if (!cfg->pttmute)
+ writeconfigrom(cfgdata, eppafsk_roms+EPPAFSK_ROM_PTTMUTEROM, 0xffff);
+ writeconfigrom(cfgdata, eppafsk_roms+EPPAFSK_ROM_DIVROM0, 1 << ((divider-1) & 0xf));
+ writeconfigrom(cfgdata, eppafsk_roms+EPPAFSK_ROM_DIVROM1, 1 << (((divider-1) >> 4) & 0xf));
+ writeconfigrom(cfgdata, eppafsk_roms+EPPAFSK_ROM_DIVROM2, 0x1000 << (((divider-1) >> 8) & 0x3));
+ /* print configuration ROM's (mainly a debugging action) */
+ lprintf(2, "config: ClkSel: %04x PTT mute: %04x\n",
+ readconfigrom(cfgdata, eppafsk_roms+EPPAFSK_ROM_CLKSELROM),
+ readconfigrom(cfgdata, eppafsk_roms+EPPAFSK_ROM_PTTMUTEROM));
+ lprintf(2, "config: Div: %04x %04x %04x\n",
+ readconfigrom(cfgdata, eppafsk_roms+EPPAFSK_ROM_DIVROM0),
+ readconfigrom(cfgdata, eppafsk_roms+EPPAFSK_ROM_DIVROM1),
+ readconfigrom(cfgdata, eppafsk_roms+EPPAFSK_ROM_DIVROM2));
+ lprintf(2, "config: IE: %04x OE: %04x\n",
+ readconfigrom(cfgdata, eppafsk_roms+EPPAFSK_ROM_SWROMIE),
+ readconfigrom(cfgdata, eppafsk_roms+EPPAFSK_ROM_SWROMOE));
+ /* finally download code to FPGA */
+ if (configure(cfgdata, FPGA_CONFIGSIZE)) {
+ reset_modem();
+ return -4;
+ }
+ parport_write_control(LPTCTRL_PROGRAM);
+ if (parport_epp_write_addr(&null, 1) != 1) { /* reset modem */
+ lprintf(0, "EPP timeout\n");
+ return -1;
+ }
+ return 0;
+}
+
+int adapter_start_sppafsk(struct adapter_config *cfg)
+{
+ unsigned char cfgdata[FPGA_CONFIGSIZE];
+ unsigned divider;
+
+ if (FPGA_CONFIGSIZE != sizeof(epp_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(eppchk_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(ecp_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(eppafsk_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(eppsamp_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(sppafsk_firmware))
+ abort();
+ if (detect_modem())
+ return -3;
+ /* calculate the divider */
+ divider = (cfg->fclk + 32 * cfg->bitrate) / (64 * cfg->bitrate);
+ if (divider < 1)
+ divider = 1;
+ if (divider > 1024)
+ divider = 1024;
+ cfg->bitrate = (cfg->fclk + 32 * divider) / (64 * divider);
+ /* print configuration */
+ printconfig(cfg);
+ memcpy(cfgdata, sppafsk_firmware, FPGA_CONFIGSIZE);
+ /* patch configuration ROM's */
+ if (cfg->intclk)
+ writeconfigrom(cfgdata, sppafsk_roms+SPPAFSK_ROM_CLKSELROM, 0);
+ if (!cfg->pttmute)
+ writeconfigrom(cfgdata, sppafsk_roms+SPPAFSK_ROM_PTTMUTEROM, 0xffff);
+ writeconfigrom(cfgdata, sppafsk_roms+SPPAFSK_ROM_DIVROM0, 1 << ((divider-1) & 0xf));
+ writeconfigrom(cfgdata, sppafsk_roms+SPPAFSK_ROM_DIVROM1, 1 << (((divider-1) >> 4) & 0xf));
+ writeconfigrom(cfgdata, sppafsk_roms+SPPAFSK_ROM_DIVROM2, 0x1000 << (((divider-1) >> 8) & 0x3));
+ /* print configuration ROM's (mainly a debugging action) */
+ lprintf(2, "config: ClkSel: %04x PTT mute: %04x\n",
+ readconfigrom(cfgdata, sppafsk_roms+SPPAFSK_ROM_CLKSELROM),
+ readconfigrom(cfgdata, sppafsk_roms+SPPAFSK_ROM_PTTMUTEROM));
+ lprintf(2, "config: Div: %04x %04x %04x\n",
+ readconfigrom(cfgdata, sppafsk_roms+SPPAFSK_ROM_DIVROM0),
+ readconfigrom(cfgdata, sppafsk_roms+SPPAFSK_ROM_DIVROM1),
+ readconfigrom(cfgdata, sppafsk_roms+SPPAFSK_ROM_DIVROM2));
+ lprintf(2, "config: IE: %04x OE: %04x\n",
+ readconfigrom(cfgdata, sppafsk_roms+SPPAFSK_ROM_SWROMIE),
+ readconfigrom(cfgdata, sppafsk_roms+SPPAFSK_ROM_SWROMOE));
+ /* finally download code to FPGA */
+ if (configure(cfgdata, FPGA_CONFIGSIZE)) {
+ reset_modem();
+ return -4;
+ }
+ parport_write_control(LPTCTRL_PROGRAM);
+ sppafsk_wrcmd(0x00);
+ return 0;
+}
+
+int adapter_start_eppsamp(struct adapter_config *cfg)
+{
+ unsigned char cfgdata[FPGA_CONFIGSIZE];
+ int i;
+ unsigned char buf;
+ unsigned divider;
+
+ if (FPGA_CONFIGSIZE != sizeof(epp_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(eppchk_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(ecp_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(eppafsk_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(eppsamp_firmware) ||
+ FPGA_CONFIGSIZE != sizeof(sppafsk_firmware))
+ abort();
+ if (detect_modem())
+ return -3;
+ /* calculate the divider */
+ divider = (cfg->fclk + cfg->bitrate / 2) / cfg->bitrate;
+ if (divider < 1)
+ divider = 1;
+ if (divider > 4096)
+ divider = 4096;
+ cfg->bitrate = (cfg->fclk + divider / 2) / divider;
+ /* print configuration */
+ printconfig(cfg);
+ memcpy(cfgdata, eppsamp_firmware, FPGA_CONFIGSIZE);
+ /* patch configuration ROM's */
+ if (cfg->intclk)
+ writeconfigrom(cfgdata, eppsamp_roms+EPPSAMP_ROM_CLKSELROM, 0);
+ writeconfigrom(cfgdata, eppsamp_roms+EPPSAMP_ROM_DIVROM0, 1 << ((divider-1) & 0xf));
+ writeconfigrom(cfgdata, eppsamp_roms+EPPSAMP_ROM_DIVROM1, 1 << (((divider-1) >> 4) & 0xf));
+ writeconfigrom(cfgdata, eppsamp_roms+EPPSAMP_ROM_DIVROM2, 1 << (((divider-1) >> 8) & 0xf));
+ /* calculate the gain */
+ i = (cfg->gain << 24) / divider;
+ if (i > 65535)
+ i = 65535;
+ if (i < 1)
+ i = 1;
+ writeconfigrom(cfgdata, eppsamp_roms+EPPSAMP_ROM_MULROM, i);
+ /* print configuration ROM's (mainly a debugging action) */
+ lprintf(2, "config: ClkSel: %04x InputGain: %04x\n",
+ readconfigrom(cfgdata, eppsamp_roms+EPPSAMP_ROM_CLKSELROM),
+ readconfigrom(cfgdata, eppsamp_roms+EPPSAMP_ROM_MULROM));
+ lprintf(2, "config: Div: %04x %04x %04x\n",
+ readconfigrom(cfgdata, eppsamp_roms+EPPSAMP_ROM_DIVROM0),
+ readconfigrom(cfgdata, eppsamp_roms+EPPSAMP_ROM_DIVROM1),
+ readconfigrom(cfgdata, eppsamp_roms+EPPSAMP_ROM_DIVROM2));
+ /* finally download code to FPGA */
+ if (configure(cfgdata, FPGA_CONFIGSIZE)) {
+ reset_modem();
+ return -4;
+ }
+ parport_write_control(LPTCTRL_PROGRAM);
+ /* set Modem Disconnect Data Output register to 0x1f */
+ buf = 6;
+ if (parport_epp_write_addr(&buf, 1) != 1)
+ goto epperr;
+ buf = 0x1f;
+ if (parport_epp_write_data(&buf, 1) != 1)
+ goto epperr;
+ /* set Modem Disconnect Tristate register to 0x17 */
+ buf = 6;
+ if (parport_epp_write_addr(&buf, 1) != 1)
+ goto epperr;
+ buf = 0x17;
+ if (parport_epp_write_data(&buf, 1) != 1)
+ goto epperr;
+ /* reset modem */
+ buf = 0x1f;
+ if (parport_epp_write_addr(&buf, 1) != 1)
+ goto epperr;
+ return 0;
+
+epperr:
+ lprintf(0, "EPP timeout\n");
+ return -1;
+}
+
+/* ---------------------------------------------------------------------- */
diff --git a/main/ecp_firmware.h b/main/ecp_firmware.h
new file mode 100644
index 0000000..d6d8d7a
--- /dev/null
+++ b/main/ecp_firmware.h
@@ -0,0 +1,1617 @@
+/*****************************************************************************/
+
+/*
+ * ecp_firmware.h -- HDLC packet radio modem for EPP using FPGA utility.
+ *
+ * Copyright (C) 1998 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+/* automatically generated, do not edit */
+
+#define ECP_FIRMWAREDATE "20000402"
+
+/* firmware */
+static const unsigned char ecp_firmware[] = {
+ 0xff, 0x04, 0xe8, 0x8c, 0xf9, 0xde, 0xff, 0xde,
+ 0xfd, 0xed, 0x57, 0xdf, 0xde, 0xbd, 0xed, 0x7d,
+ 0xef, 0xfe, 0xfe, 0xee, 0xef, 0xef, 0xfe, 0xfe,
+ 0xfe, 0x9b, 0xff, 0xff, 0xaf, 0xff, 0xfd, 0xdb,
+ 0xff, 0xaf, 0xef, 0x7f, 0xfe, 0xd7, 0xff, 0x7f,
+ 0xfd, 0xff, 0xd7, 0xff, 0x7f, 0xff, 0xe6, 0xff,
+ 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xbf, 0xb9, 0xff, 0xfc, 0xed, 0xcf,
+ 0xff, 0xfe, 0xfc, 0xed, 0xcf, 0x5f, 0xfe, 0xf6,
+ 0xe7, 0x6f, 0x7f, 0xfe, 0xf6, 0xe7, 0xef, 0x6f,
+ 0xde, 0xbf, 0x77, 0x5f, 0x7b, 0xfd, 0xb5, 0x77,
+ 0x5f, 0x7b, 0xd7, 0xbb, 0xaf, 0xbd, 0xfb, 0xda,
+ 0xbb, 0xaf, 0xbd, 0xfb, 0x9b, 0xff, 0x3f, 0xfd,
+ 0xf5, 0xd3, 0x5f, 0x3f, 0xfd, 0xf5, 0xd3, 0x9f,
+ 0xfe, 0x7a, 0xe9, 0xaf, 0x9f, 0xfe, 0xfa, 0xe9,
+ 0xff, 0xc6, 0xff, 0x3f, 0xff, 0xfc, 0xf3, 0xcf,
+ 0x3f, 0xff, 0xfc, 0xf3, 0x9e, 0x7f, 0xfe, 0xf9,
+ 0xe7, 0x9d, 0x7f, 0xde, 0xf9, 0xbf, 0xf9, 0xff,
+ 0xaf, 0xbf, 0xff, 0xfe, 0xfb, 0xaf, 0xbf, 0xff,
+ 0xfa, 0xd7, 0xdf, 0x7f, 0xfd, 0xfd, 0xd7, 0xdf,
+ 0x7f, 0xfd, 0x6f, 0xfe, 0xff, 0xba, 0xaf, 0xae,
+ 0xfa, 0xfa, 0xfa, 0xaf, 0xad, 0x7b, 0xdd, 0x57,
+ 0xd7, 0x7f, 0x7d, 0xfd, 0xd7, 0xd7, 0x7f, 0x9b,
+ 0xff, 0xff, 0xee, 0xfb, 0xef, 0xbf, 0xff, 0xfe,
+ 0xfb, 0xef, 0x7e, 0xff, 0xfd, 0xf7, 0xdf, 0x6f,
+ 0xff, 0xfd, 0xf6, 0xff, 0xc6, 0xff, 0xdd, 0x7f,
+ 0xff, 0x3d, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xef,
+ 0xbd, 0xff, 0xbe, 0xfb, 0xef, 0xbb, 0xff, 0xfe,
+ 0xbd, 0xf9, 0xff, 0x9f, 0x7f, 0xfb, 0xfd, 0xf7,
+ 0x9f, 0x7f, 0xff, 0x99, 0xcf, 0xbf, 0xfd, 0xfc,
+ 0xfb, 0xcf, 0xbe, 0xff, 0xfc, 0x6f, 0xf4, 0xff,
+ 0xed, 0xb7, 0xdf, 0x7e, 0xfb, 0xed, 0xb7, 0xde,
+ 0xfe, 0xf6, 0xdb, 0x6f, 0xbf, 0xfd, 0xf6, 0xdb,
+ 0x6f, 0xff, 0x9b, 0xfb, 0x7f, 0xff, 0xfd, 0xc7,
+ 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xbf, 0xef, 0xfe,
+ 0xf3, 0xef, 0xbf, 0xff, 0xfe, 0xbb, 0xff, 0xe6,
+ 0xff, 0xdf, 0x7f, 0xdf, 0xfd, 0xc7, 0xdd, 0x7f,
+ 0xcf, 0xfd, 0xef, 0xbf, 0xfe, 0xfc, 0xf3, 0xcf,
+ 0xbf, 0xff, 0xfe, 0xbf, 0xf9, 0xff, 0xfc, 0x73,
+ 0xcf, 0x1f, 0xff, 0xbc, 0xf3, 0xcf, 0x7d, 0x96,
+ 0xb8, 0xe7, 0x9f, 0x3f, 0xfe, 0xf9, 0x67, 0xff,
+ 0x6e, 0xde, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff,
+ 0xdd, 0xf7, 0xdf, 0xff, 0xfe, 0xbb, 0xef, 0xbf,
+ 0xff, 0xfc, 0xeb, 0xef, 0xbf, 0x9b, 0xdd, 0xcf,
+ 0x3f, 0xff, 0xfc, 0xf3, 0xcd, 0x3f, 0xdb, 0xec,
+ 0xe7, 0x9f, 0x7f, 0xde, 0x79, 0xe7, 0x9e, 0x7d,
+ 0xfe, 0xcd, 0x66, 0xff, 0xef, 0xbf, 0xff, 0xfe,
+ 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xf7, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xb7, 0xf9,
+ 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xe7, 0x5e, 0xaf, 0xfd, 0xf7, 0xdf, 0x7f, 0xff,
+ 0x7d, 0xf7, 0xff, 0x6f, 0xfe, 0x9f, 0xfd, 0xd6,
+ 0xdb, 0x6f, 0xbf, 0xfd, 0xf6, 0xdb, 0xdf, 0x7e,
+ 0x7b, 0xad, 0xb7, 0xdf, 0x3e, 0xeb, 0xed, 0xff,
+ 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff,
+ 0xff, 0xf9, 0xff, 0xff, 0xfd, 0xfe, 0xfb, 0xef,
+ 0xff, 0xff, 0xfe, 0xff, 0xee, 0xe6, 0xff, 0x7f,
+ 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xbb, 0xff, 0xff, 0xe5, 0xff, 0xdb, 0xff,
+ 0xeb, 0xaf, 0xb9, 0xff, 0xff, 0x7f, 0xff, 0xff,
+ 0xff, 0xff, 0xfd, 0xff, 0xff, 0xef, 0xff, 0xff,
+ 0xef, 0xff, 0xff, 0xff, 0xfb, 0xff, 0x6f, 0xf6,
+ 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xfb,
+ 0xfd, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff,
+ 0xff, 0x7f, 0xfe, 0x9a, 0xff, 0x7f, 0xff, 0xfd,
+ 0xf7, 0x5f, 0x7f, 0xff, 0xfd, 0xf7, 0xbf, 0xff,
+ 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0x7b, 0xbd,
+ 0xe6, 0xff, 0xd3, 0xfd, 0xff, 0xff, 0xff, 0xcb,
+ 0xff, 0xaf, 0xfc, 0xab, 0xff, 0x5f, 0xfe, 0x7f,
+ 0xe5, 0xfd, 0xdf, 0xdd, 0xbf, 0xf9, 0xff, 0x7f,
+ 0xff, 0xff, 0xef, 0xd7, 0xff, 0xfe, 0xdb, 0xbf,
+ 0xfb, 0xff, 0xf5, 0xff, 0xff, 0xfe, 0xff, 0xf7,
+ 0x7f, 0x6f, 0xf6, 0x7f, 0xf7, 0xff, 0xff, 0xff,
+ 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x9b, 0xfd,
+ 0xfd, 0xff, 0xef, 0xbf, 0xfd, 0xfd, 0xff, 0xfd,
+ 0xbf, 0xfd, 0xef, 0xbf, 0xff, 0xef, 0xfb, 0xef,
+ 0xfb, 0x7f, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xff,
+ 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x7b,
+ 0xff, 0xdf, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xbd,
+ 0xf9, 0xff, 0xfa, 0xff, 0xef, 0xfb, 0xff, 0xe8,
+ 0xbf, 0xaf, 0x7d, 0xfb, 0xef, 0x7f, 0xff, 0xff,
+ 0xf7, 0x7f, 0xff, 0xf7, 0x6f, 0xfe, 0xbf, 0xfe,
+ 0xff, 0xef, 0xff, 0xbe, 0xff, 0xff, 0xdb, 0xf5,
+ 0xfe, 0xff, 0xff, 0xff, 0xff, 0xd5, 0xff, 0xff,
+ 0xff, 0x9b, 0xff, 0xfd, 0xdd, 0xfe, 0xff, 0xff,
+ 0xf6, 0xff, 0xd6, 0xff, 0xdf, 0x7f, 0xf7, 0x7d,
+ 0xb7, 0xdf, 0x7f, 0xff, 0xff, 0xb7, 0xe6, 0xff,
+ 0xff, 0xf7, 0xff, 0xff, 0x3a, 0xdf, 0xff, 0xff,
+ 0xfd, 0xff, 0xbf, 0xef, 0xfb, 0xff, 0xff, 0x7f,
+ 0x5f, 0xff, 0xbf, 0xf9, 0xff, 0xff, 0xdf, 0xff,
+ 0xff, 0xff, 0xff, 0xdf, 0xff, 0xef, 0xfb, 0xef,
+ 0xbf, 0xff, 0xf6, 0xfb, 0xef, 0xff, 0xff, 0x6e,
+ 0xfe, 0xff, 0xbf, 0xff, 0xff, 0x6f, 0xff, 0xff,
+ 0x7d, 0x73, 0xfd, 0xfe, 0x7b, 0xef, 0xff, 0xff,
+ 0xff, 0xdf, 0xff, 0xff, 0x9b, 0xff, 0xfe, 0xff,
+ 0x7f, 0xff, 0xbb, 0xff, 0x7b, 0xff, 0xfc, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xdf,
+ 0xff, 0xe6, 0xf7, 0xff, 0xff, 0xbf, 0xfe, 0xfb,
+ 0xff, 0xff, 0xff, 0x3f, 0x8f, 0xbf, 0x5f, 0xfe,
+ 0xb9, 0xe7, 0x3c, 0xfb, 0xeb, 0xbf, 0xf9, 0xff,
+ 0xff, 0xff, 0xbf, 0xff, 0xfe, 0xff, 0xfd, 0xfe,
+ 0xff, 0xf7, 0xff, 0xff, 0x3f, 0xe7, 0xfc, 0xff,
+ 0xfb, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xff, 0xf7,
+ 0xaf, 0xf5, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xdf,
+ 0xbf, 0xdf, 0x7d, 0xff, 0xff, 0xff, 0xff, 0x9b,
+ 0xf2, 0xff, 0xbf, 0xff, 0xfb, 0xff, 0x6f, 0xff,
+ 0xf0, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff,
+ 0xff, 0xff, 0xfd, 0xbf, 0xe6, 0xff, 0xff, 0xef,
+ 0xbf, 0xff, 0xfb, 0xeb, 0xbf, 0xfe, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff,
+ 0xb7, 0x69, 0xff, 0x7f, 0xf9, 0xed, 0xfd, 0x5f,
+ 0xfa, 0xfb, 0xff, 0xd7, 0xbd, 0xf6, 0xdf, 0x6b,
+ 0xaf, 0xbd, 0xf6, 0xdf, 0xfe, 0x6f, 0xdc, 0xff,
+ 0xdf, 0x7e, 0xed, 0xbf, 0xbf, 0xff, 0xfe, 0xff,
+ 0x7c, 0xe7, 0xfd, 0x7f, 0xde, 0x79, 0xe7, 0xfd,
+ 0xff, 0x5f, 0x99, 0xfb, 0xf5, 0xaf, 0xff, 0xfb,
+ 0xff, 0xef, 0xff, 0xff, 0xff, 0xf7, 0xde, 0x7b,
+ 0xcd, 0xbc, 0xf7, 0xde, 0x7b, 0xcd, 0xee, 0xc6,
+ 0xfe, 0xff, 0xef, 0x9f, 0xfb, 0xef, 0xab, 0xf7,
+ 0xfe, 0xff, 0x9d, 0x77, 0xde, 0x31, 0xe7, 0x9d,
+ 0x77, 0xde, 0xb1, 0x93, 0xb9, 0xff, 0x3f, 0xfb,
+ 0xeb, 0xff, 0xf7, 0x7a, 0xea, 0xff, 0x7f, 0xfd,
+ 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 0xff,
+ 0x66, 0xec, 0xff, 0x5f, 0x7f, 0xed, 0xff, 0xbf,
+ 0x8f, 0xfa, 0xff, 0x5f, 0x7f, 0xfd, 0xfd, 0xd7,
+ 0x5f, 0x7f, 0xfd, 0xfd, 0xbf, 0x19, 0xf7, 0xfe,
+ 0xff, 0xef, 0xfe, 0xff, 0xf6, 0xdb, 0xff, 0xff,
+ 0xfb, 0xf9, 0xe7, 0xff, 0x7f, 0xfe, 0xf9, 0xe7,
+ 0xdf, 0x76, 0xa6, 0x7d, 0xfd, 0xbf, 0xf2, 0xff,
+ 0x5f, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xfe, 0xfb,
+ 0xff, 0xbf, 0xff, 0xfe, 0xfb, 0xff, 0xad, 0xb9,
+ 0xee, 0xfb, 0xef, 0xaf, 0xff, 0xb6, 0x7b, 0xed,
+ 0xbf, 0xd7, 0x7d, 0xf7, 0xd9, 0x7f, 0xdb, 0x7d,
+ 0xf6, 0xd9, 0xab, 0x6e, 0xee, 0xff, 0xff, 0xff,
+ 0xfb, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xf7, 0xbf,
+ 0x7f, 0xfe, 0xff, 0xff, 0x9f, 0x7f, 0xfe, 0x3b,
+ 0x9b, 0xf9, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfe,
+ 0xff, 0xff, 0xbf, 0xff, 0xf7, 0xef, 0xff, 0xff,
+ 0xff, 0xf7, 0xef, 0xdf, 0xef, 0xe6, 0xf6, 0xff,
+ 0xff, 0xfd, 0xff, 0x7b, 0xfd, 0xaf, 0xdf, 0xff,
+ 0xf5, 0xd7, 0x7f, 0x7f, 0xfd, 0xf5, 0xdf, 0x5f,
+ 0x7f, 0xbb, 0x61, 0xff, 0xff, 0x9f, 0x7e, 0xff,
+ 0xfa, 0xf7, 0xcb, 0x7d, 0x5f, 0xf1, 0xc5, 0x17,
+ 0x5f, 0x7c, 0xf1, 0xcd, 0x13, 0x7f, 0x6f, 0xfa,
+ 0xff, 0xdf, 0xfa, 0xff, 0xaf, 0xbb, 0xef, 0xfa,
+ 0xff, 0x7f, 0xff, 0xfd, 0xf6, 0xdf, 0x7f, 0xaf,
+ 0xfd, 0xf7, 0xff, 0x9b, 0xfe, 0xff, 0x8f, 0x3e,
+ 0xff, 0xe8, 0xb3, 0x8f, 0x3e, 0xff, 0xf4, 0xc7,
+ 0x1f, 0x7d, 0xf6, 0xd9, 0xc7, 0x1f, 0x7f, 0xfe,
+ 0xe6, 0xff, 0x9f, 0xaf, 0xbf, 0xfe, 0xf7, 0xdf,
+ 0x2f, 0xbf, 0xfc, 0xfd, 0xf7, 0xff, 0x7f, 0xff,
+ 0xfd, 0xd7, 0xff, 0xff, 0xbf, 0xe1, 0xff, 0xff,
+ 0xeb, 0xaf, 0xff, 0xfd, 0xff, 0xcf, 0x2f, 0xff,
+ 0xfd, 0xf7, 0xf7, 0xdf, 0x7f, 0xff, 0xf5, 0xff,
+ 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xef, 0xeb, 0xaf,
+ 0xfe, 0xfd, 0xfa, 0xeb, 0xff, 0xfd, 0xf7, 0xdf,
+ 0x7f, 0xff, 0xfd, 0xf7, 0xd7, 0xff, 0x1b, 0xf6,
+ 0x7f, 0xff, 0xff, 0xfa, 0xcb, 0x7f, 0xff, 0xfc,
+ 0xf2, 0xfb, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff,
+ 0x7f, 0xff, 0xff, 0xe6, 0xff, 0xff, 0x3f, 0xfd,
+ 0xff, 0xfe, 0xfb, 0xef, 0xfe, 0xf7, 0xfc, 0x97,
+ 0xde, 0x7f, 0xf9, 0xfd, 0x97, 0xdf, 0xff, 0xbf,
+ 0x39, 0xff, 0x8f, 0xbf, 0xfe, 0x78, 0xab, 0x2e,
+ 0xbe, 0xfe, 0xba, 0x56, 0x5a, 0x6f, 0xb5, 0xd5,
+ 0x56, 0x5b, 0x6d, 0xed, 0x6d, 0x3e, 0xff, 0xfb,
+ 0xef, 0x7f, 0xff, 0xfe, 0xee, 0xe1, 0xff, 0xff,
+ 0xfd, 0xff, 0xff, 0x7f, 0xff, 0xfd, 0xff, 0xbf,
+ 0xe7, 0x9b, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff,
+ 0xb7, 0xff, 0xae, 0x6f, 0xbf, 0xff, 0xdf, 0xff,
+ 0xfe, 0x7f, 0xee, 0xbf, 0xff, 0xbf, 0xe6, 0xfd,
+ 0xfd, 0xf7, 0xcf, 0xff, 0xff, 0xfe, 0xe7, 0xff,
+ 0xd7, 0xef, 0xfb, 0xef, 0xfd, 0xff, 0xff, 0x7f,
+ 0xef, 0xbf, 0xbf, 0xf1, 0xff, 0xff, 0xaf, 0xaf,
+ 0xbf, 0xfb, 0xfa, 0xeb, 0x29, 0xff, 0xfd, 0xf9,
+ 0xe7, 0x7f, 0xef, 0xfd, 0xfd, 0xe7, 0xfd, 0x67,
+ 0xfc, 0xff, 0xff, 0xff, 0xeb, 0xbf, 0xff, 0xfa,
+ 0xf7, 0xe7, 0xf7, 0xe7, 0xff, 0xbf, 0xfb, 0xff,
+ 0xff, 0xdb, 0xff, 0x7f, 0x98, 0xf7, 0xfc, 0xbf,
+ 0xff, 0xf9, 0xff, 0xac, 0xbf, 0xee, 0xff, 0xd3,
+ 0xff, 0xff, 0xff, 0xfd, 0xf7, 0xff, 0xff, 0xff,
+ 0xff, 0xc6, 0xef, 0xdf, 0x7f, 0xbf, 0xf4, 0xff,
+ 0x7f, 0x4f, 0xf3, 0x7f, 0xf9, 0xff, 0xff, 0xef,
+ 0xfb, 0xdf, 0xff, 0xff, 0xbb, 0x9f, 0xb1, 0xfd,
+ 0xff, 0xff, 0xff, 0xdf, 0xbf, 0xf7, 0xad, 0xff,
+ 0xf7, 0x6d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xfb, 0x6f, 0xfc, 0xff, 0xff, 0xef, 0xbf,
+ 0xdf, 0xff, 0xef, 0xcf, 0xff, 0x5f, 0x1f, 0xf5,
+ 0xb8, 0xe7, 0x9f, 0x77, 0xfe, 0x79, 0xff, 0x98,
+ 0xff, 0xfe, 0xff, 0x9f, 0xff, 0xf7, 0xfb, 0xfe,
+ 0xf3, 0xdf, 0xff, 0xff, 0xef, 0xfb, 0xce, 0xbf,
+ 0xff, 0xfe, 0xfb, 0xff, 0x26, 0xfe, 0xff, 0xbe,
+ 0xff, 0xfd, 0xff, 0xdf, 0xf9, 0xbf, 0xda, 0xff,
+ 0xff, 0xbf, 0xff, 0xbc, 0xfb, 0xef, 0xbf, 0xff,
+ 0xab, 0xf9, 0xff, 0xff, 0xe7, 0xaf, 0xff, 0xff,
+ 0xff, 0xff, 0xbf, 0xde, 0xef, 0xef, 0xbf, 0xbf,
+ 0xfd, 0xff, 0xff, 0xbf, 0xff, 0x6f, 0xf6, 0xff,
+ 0x7f, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef,
+ 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xf7, 0xff,
+ 0xff, 0x7f, 0x1b, 0xfe, 0x6c, 0xfe, 0xfe, 0x5f,
+ 0x3a, 0xaf, 0xbd, 0x5e, 0x27, 0x7f, 0xf3, 0xcd,
+ 0x35, 0xd7, 0x7a, 0x6b, 0xe5, 0xf7, 0x3f, 0x66,
+ 0x7f, 0xfa, 0xef, 0xff, 0xff, 0xee, 0xeb, 0xaf,
+ 0xe7, 0xcb, 0xef, 0x7c, 0xd8, 0x4e, 0x9b, 0x6f,
+ 0xb6, 0xff, 0xfa, 0xb7, 0xf9, 0x9f, 0x6e, 0xfb,
+ 0xff, 0xbf, 0x5f, 0xfb, 0xeb, 0x7f, 0xff, 0xbb,
+ 0xf4, 0x9f, 0x7f, 0xfe, 0xfb, 0xe7, 0x94, 0xff,
+ 0x6f, 0xd6, 0xa7, 0x5f, 0xfb, 0xff, 0xef, 0xf7,
+ 0xfe, 0xfa, 0xd7, 0xff, 0x7d, 0xfd, 0xfd, 0x77,
+ 0xff, 0x7d, 0xf7, 0xd5, 0x5f, 0x9b, 0xfb, 0xef,
+ 0xdb, 0x6e, 0x9a, 0x79, 0xab, 0xfd, 0x55, 0xf7,
+ 0xd7, 0xfe, 0xfb, 0xe5, 0xb6, 0xfb, 0x7e, 0xb3,
+ 0xef, 0xed, 0x66, 0xfe, 0xfb, 0xe7, 0xbe, 0xf6,
+ 0xee, 0x6b, 0x36, 0xd7, 0xff, 0xd5, 0x7f, 0xdf,
+ 0x1d, 0x37, 0xfe, 0x77, 0xff, 0xfd, 0xb3, 0xb1,
+ 0xfe, 0xfe, 0xfa, 0xaf, 0xb5, 0xff, 0xfb, 0x5f,
+ 0xfc, 0x73, 0x9d, 0xf5, 0xdf, 0x71, 0xef, 0xf7,
+ 0xd7, 0x56, 0xff, 0x66, 0xee, 0xff, 0xff, 0xfb,
+ 0x6f, 0xeb, 0xbc, 0xfe, 0x6f, 0xff, 0x5c, 0x79,
+ 0xa5, 0x9d, 0x72, 0xf6, 0x7b, 0x6f, 0xb5, 0x3a,
+ 0x9b, 0xf7, 0xff, 0xbb, 0xff, 0x3f, 0xdf, 0xff,
+ 0xdb, 0xbf, 0xff, 0xbb, 0xfe, 0xd2, 0x8b, 0xaf,
+ 0xbf, 0xfe, 0xfa, 0xeb, 0xb7, 0xe6, 0xfd, 0xaf,
+ 0xfc, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xfe, 0xf9,
+ 0xcf, 0x3f, 0xeb, 0xcc, 0xf3, 0xcf, 0x3f, 0xff,
+ 0xfc, 0xbd, 0x91, 0xff, 0xfb, 0xeb, 0xb5, 0xff,
+ 0xfc, 0x7b, 0x8d, 0x37, 0xfe, 0xe9, 0xe7, 0x9d,
+ 0x7f, 0xfe, 0xf1, 0xc7, 0x1f, 0xef, 0x66, 0xe6,
+ 0xff, 0xff, 0xfe, 0xff, 0xff, 0xdf, 0x7f, 0xbf,
+ 0xff, 0xff, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xef, 0x3f, 0x3f, 0x9b, 0xfb, 0xff, 0xbf, 0xff,
+ 0xff, 0xbf, 0xfb, 0xef, 0xff, 0xff, 0x7f, 0xff,
+ 0xfd, 0xf7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xef,
+ 0xa6, 0xfe, 0x7f, 0xff, 0xf7, 0xf7, 0x47, 0xeb,
+ 0x2d, 0xbe, 0xf8, 0x85, 0x17, 0x5e, 0xfa, 0xe1,
+ 0x8f, 0x3f, 0xfe, 0xf8, 0xab, 0x79, 0xdf, 0xa7,
+ 0xdf, 0xbd, 0xf6, 0xfb, 0x6b, 0x8b, 0x2f, 0x7e,
+ 0xf1, 0xc5, 0x13, 0x6f, 0xfc, 0xf7, 0xdf, 0x7f,
+ 0x7f, 0x6f, 0xfe, 0xb7, 0xce, 0x7f, 0xef, 0xff,
+ 0xff, 0xef, 0x6a, 0xa9, 0x5f, 0xff, 0xff, 0xff,
+ 0x5f, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 0x9b, 0xff,
+ 0xaf, 0xcf, 0x3f, 0xfb, 0xdc, 0xe3, 0x87, 0x3e,
+ 0x7a, 0x94, 0xe1, 0x86, 0x1f, 0x76, 0xf8, 0xe1,
+ 0x87, 0x1f, 0xfe, 0xe6, 0xff, 0xeb, 0x2f, 0xff,
+ 0xfe, 0xf7, 0xeb, 0xe7, 0xbf, 0xfe, 0xcf, 0x17,
+ 0x5f, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xbf,
+ 0xf9, 0xef, 0xfa, 0xeb, 0xbf, 0xff, 0xfd, 0x7b,
+ 0xef, 0xff, 0xdf, 0xbf, 0xf4, 0xd2, 0x6d, 0xaf,
+ 0xdf, 0x7e, 0xfb, 0xeb, 0x6f, 0xfe, 0xff, 0xfb,
+ 0xf2, 0xaf, 0xff, 0xfe, 0xfb, 0xee, 0xab, 0xfd,
+ 0xd5, 0x57, 0xdf, 0x5c, 0xf5, 0xcd, 0x37, 0x5f,
+ 0x7d, 0x1b, 0xfe, 0xff, 0xbf, 0xfc, 0xfb, 0xff,
+ 0xef, 0xf7, 0xfe, 0xff, 0xfd, 0xe3, 0x8f, 0x5f,
+ 0xf6, 0xf8, 0xe5, 0x97, 0x3f, 0x3e, 0xe6, 0xfe,
+ 0xd3, 0xff, 0xbf, 0xfd, 0x5f, 0xdf, 0x6f, 0xfc,
+ 0xff, 0x9e, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xb7, 0xe9, 0xff, 0xae, 0xbf, 0xee,
+ 0xe2, 0x8b, 0x0f, 0xbb, 0xfc, 0xf2, 0xd7, 0x5f,
+ 0x7d, 0xfd, 0xd5, 0xd7, 0x5f, 0x7e, 0xed, 0x6f,
+ 0xfe, 0xff, 0xef, 0xf3, 0xfb, 0x3e, 0xbf, 0xfb,
+ 0xfe, 0xcf, 0x77, 0xfe, 0xd9, 0x77, 0xdf, 0x7f,
+ 0xfa, 0xd9, 0x67, 0xff, 0x1b, 0xff, 0xf7, 0xaf,
+ 0xbe, 0xb7, 0xf9, 0xfb, 0xf3, 0xaf, 0xcb, 0x6d,
+ 0xaf, 0xff, 0x6f, 0xfe, 0xeb, 0xb7, 0xe7, 0x4e,
+ 0x7f, 0xe6, 0x7f, 0xff, 0x7f, 0xff, 0xbf, 0xfb,
+ 0x7d, 0xfb, 0xbd, 0x7d, 0xf7, 0xde, 0x7f, 0xff,
+ 0xfd, 0xd7, 0xdf, 0x7f, 0xff, 0xbf, 0xd9, 0xff,
+ 0xfc, 0xe3, 0xcf, 0xef, 0xdd, 0xff, 0xed, 0xb7,
+ 0x7d, 0xfd, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xbf,
+ 0x7f, 0xfc, 0x67, 0xfe, 0xff, 0xbf, 0xfe, 0xfe,
+ 0xff, 0xff, 0xfb, 0xff, 0xff, 0xda, 0xfe, 0xff,
+ 0xff, 0xfc, 0xef, 0xef, 0xff, 0x7f, 0xff, 0x9a,
+ 0xff, 0x1f, 0xff, 0xcf, 0xf9, 0xff, 0xbf, 0x3b,
+ 0xee, 0xf8, 0xdf, 0xfd, 0xfe, 0xdf, 0x7f, 0xff,
+ 0x7b, 0xff, 0xff, 0xff, 0x66, 0xff, 0xfb, 0xff,
+ 0xbf, 0xee, 0xff, 0xf3, 0x67, 0xaf, 0xf7, 0xed,
+ 0xff, 0xff, 0xf6, 0xfb, 0xef, 0xaf, 0xff, 0xff,
+ 0xb7, 0xf9, 0xdf, 0xeb, 0xff, 0xff, 0xfd, 0xd7,
+ 0x7e, 0x6f, 0xef, 0x95, 0xc9, 0x7f, 0x7f, 0xff,
+ 0xff, 0x2f, 0xbf, 0xff, 0xfb, 0x6e, 0xfe, 0xdf,
+ 0xdf, 0xf6, 0xe3, 0xff, 0xff, 0xef, 0xff, 0xff,
+ 0xff, 0xff, 0x7f, 0xfa, 0xc2, 0x8f, 0x37, 0xfe,
+ 0xf8, 0xff, 0x9b, 0xf7, 0xff, 0x9e, 0xfb, 0xfd,
+ 0xff, 0xff, 0xff, 0xeb, 0xef, 0xff, 0xff, 0xed,
+ 0xed, 0xee, 0xb7, 0xdf, 0x7e, 0xed, 0xfc, 0xa6,
+ 0xfe, 0x6a, 0xff, 0xff, 0x7e, 0x77, 0xff, 0xbe,
+ 0xff, 0xcf, 0xf7, 0xfc, 0xee, 0xf7, 0xff, 0xfe,
+ 0xff, 0xef, 0xff, 0x9f, 0xf1, 0xff, 0xf3, 0xff,
+ 0x3f, 0xef, 0xb7, 0x5f, 0x47, 0xb7, 0x7d, 0x7c,
+ 0xfe, 0x7d, 0xff, 0xdd, 0xff, 0xd7, 0xfe, 0xff,
+ 0x6b, 0xf6, 0x7f, 0xff, 0xbf, 0xf3, 0xff, 0xfd,
+ 0xdf, 0xfb, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xfe, 0xff, 0xff, 0x9b, 0xfe, 0xbc,
+ 0xe4, 0xf7, 0x6f, 0xae, 0xff, 0xfe, 0xff, 0x6f,
+ 0x76, 0x7f, 0x66, 0x27, 0xdf, 0x7a, 0x4b, 0xe5,
+ 0xf7, 0xbf, 0x66, 0x7f, 0xfa, 0xfc, 0xff, 0xcb,
+ 0x7f, 0xfd, 0xef, 0xbf, 0xcb, 0xff, 0xf7, 0xcb,
+ 0xe7, 0x9f, 0x6f, 0xb6, 0xff, 0xfd, 0xb7, 0x49,
+ 0x9f, 0xeb, 0xff, 0x79, 0x97, 0xfa, 0xef, 0xff,
+ 0xf5, 0x7f, 0xf7, 0xf7, 0x37, 0x5f, 0x4c, 0x99,
+ 0xe5, 0xff, 0xeb, 0x6f, 0xd4, 0xa7, 0xff, 0x7f,
+ 0xf6, 0xed, 0x7f, 0xdf, 0x7f, 0xfb, 0xff, 0x7f,
+ 0xff, 0x5d, 0xd6, 0x59, 0x7d, 0xf5, 0xff, 0x5e,
+ 0x99, 0xfb, 0xb7, 0xfd, 0xf7, 0x8f, 0x6c, 0x7f,
+ 0xcd, 0x27, 0xf7, 0xd5, 0x6b, 0x37, 0xef, 0x9f,
+ 0xff, 0x5e, 0xbb, 0x6f, 0xef, 0x06, 0x7e, 0x78,
+ 0xf6, 0xff, 0xf5, 0xdf, 0xdf, 0xf1, 0x9d, 0x3d,
+ 0xfd, 0x77, 0xcb, 0xfd, 0xf7, 0xdf, 0x57, 0xe3,
+ 0xfd, 0x93, 0x99, 0xff, 0xfb, 0xff, 0xfd, 0xb7,
+ 0xfe, 0xd7, 0xff, 0xab, 0x6f, 0xfd, 0xb7, 0x72,
+ 0x5f, 0x7d, 0xf5, 0xd5, 0xfe, 0xfe, 0x66, 0xe4,
+ 0xff, 0xf7, 0x0f, 0x7a, 0xe1, 0xbd, 0xf9, 0xff,
+ 0xcb, 0xdf, 0x7b, 0x9f, 0xbd, 0xd6, 0x5e, 0x7b,
+ 0x6d, 0x1f, 0x3e, 0x18, 0xf6, 0xff, 0xf3, 0xfd,
+ 0x37, 0xff, 0xfc, 0xdb, 0xcf, 0xb7, 0xf9, 0xff,
+ 0xff, 0x6b, 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0x77,
+ 0xe6, 0xfd, 0xff, 0x7f, 0xfe, 0xfb, 0xff, 0x1f,
+ 0xfd, 0xe7, 0xfb, 0xdf, 0xfe, 0xff, 0xfc, 0xf3,
+ 0xcf, 0x3f, 0xfb, 0xfc, 0xbd, 0xb9, 0x7e, 0xfb,
+ 0xcf, 0x3f, 0xfe, 0xfe, 0xbb, 0xed, 0x37, 0xfe,
+ 0x7d, 0xf7, 0x1f, 0x7f, 0xbc, 0xf1, 0x46, 0x9f,
+ 0xbf, 0x6e, 0xee, 0xcf, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x6b, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xbf,
+ 0xff, 0xec, 0x9b, 0xef, 0xbf, 0x3b, 0x9b, 0xf9,
+ 0xfb, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xf7, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xf7,
+ 0xff, 0x77, 0xef, 0xe6, 0xf6, 0x7f, 0x2f, 0xf4,
+ 0xf0, 0xda, 0x7f, 0xfd, 0xff, 0xf4, 0xb7, 0xff,
+ 0x4f, 0xf8, 0xeb, 0x87, 0x17, 0xfa, 0x78, 0xbb,
+ 0x79, 0xdf, 0xeb, 0x8b, 0x7f, 0xb6, 0xda, 0xa7,
+ 0xbf, 0xbd, 0xfe, 0xd5, 0xee, 0x17, 0xfb, 0x7d,
+ 0xf3, 0xc4, 0x7f, 0x7f, 0x6f, 0xfa, 0xff, 0xfe,
+ 0xf2, 0xdf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x7f,
+ 0xef, 0xff, 0xe5, 0xff, 0x79, 0x75, 0xd5, 0xdf,
+ 0xff, 0x9b, 0xfe, 0xbf, 0x8f, 0x3e, 0xff, 0xfc,
+ 0xf3, 0xcf, 0x3f, 0xff, 0xdc, 0xe5, 0x0f, 0x1d,
+ 0x7e, 0xf0, 0x41, 0x87, 0x5f, 0xfe, 0xe6, 0xff,
+ 0xef, 0xff, 0xff, 0xfe, 0xfb, 0xff, 0xef, 0xff,
+ 0xfe, 0xf5, 0x97, 0xfb, 0xfc, 0xfb, 0xf7, 0xd7,
+ 0xff, 0xff, 0xbf, 0xe1, 0xff, 0xfb, 0xff, 0xff,
+ 0xff, 0xfe, 0xff, 0xff, 0xef, 0x5f, 0xfd, 0xf4,
+ 0xfb, 0xeb, 0x36, 0xdf, 0x74, 0xfb, 0xef, 0x6f,
+ 0xfe, 0xdf, 0xfa, 0xef, 0xbf, 0xbf, 0xfe, 0xfa,
+ 0xef, 0xbf, 0xff, 0x55, 0x79, 0x5f, 0x7d, 0x73,
+ 0xcd, 0x35, 0x5f, 0xfd, 0x1b, 0xfa, 0xbf, 0xff,
+ 0xff, 0xff, 0xef, 0xef, 0xff, 0xff, 0x7f, 0xf9,
+ 0x41, 0x96, 0x3f, 0x7e, 0xf1, 0x45, 0x97, 0x1f,
+ 0xfe, 0xe6, 0xff, 0xcf, 0xfb, 0xf5, 0xbc, 0xf4,
+ 0xdb, 0xef, 0xbf, 0xfd, 0xc4, 0xff, 0xdf, 0xfe,
+ 0xef, 0xdf, 0xb7, 0xff, 0xfb, 0xbf, 0xf9, 0xff,
+ 0x8f, 0xbe, 0xfa, 0x5a, 0xeb, 0xae, 0xb6, 0xfe,
+ 0xf2, 0xd6, 0x5e, 0x6d, 0xfd, 0xd5, 0xc7, 0x5e,
+ 0x7f, 0xe9, 0x6f, 0x36, 0xff, 0xfb, 0xef, 0xcf,
+ 0xfe, 0x9f, 0xfd, 0xbf, 0xc3, 0xff, 0xfd, 0xd9,
+ 0x75, 0x3d, 0x7f, 0x7a, 0xf0, 0xef, 0xff, 0x9b,
+ 0xff, 0xfb, 0xff, 0x7b, 0xe9, 0xfe, 0xdd, 0xde,
+ 0xf7, 0xbe, 0xfe, 0x57, 0xbf, 0xff, 0xfa, 0x2f,
+ 0xb7, 0x6e, 0xff, 0x5f, 0xe6, 0x7f, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xbf, 0xff, 0xd7, 0x36, 0xef,
+ 0xfb, 0x7a, 0xff, 0xff, 0xf7, 0x9f, 0xff, 0xd6,
+ 0x9f, 0xf1, 0xff, 0xfb, 0xe2, 0x7d, 0xf7, 0xd6,
+ 0xfa, 0x7b, 0xaf, 0x7f, 0xfa, 0xe5, 0x83, 0xef,
+ 0xdb, 0xbf, 0xe1, 0xff, 0xfd, 0x67, 0xfc, 0xef,
+ 0xff, 0xff, 0xff, 0xde, 0xff, 0xee, 0xfb, 0xd7,
+ 0xfb, 0xe5, 0xfc, 0xfb, 0xfe, 0xff, 0xef, 0xfe,
+ 0xff, 0x7f, 0x99, 0xf7, 0xe6, 0xbb, 0xfe, 0xfb,
+ 0xcf, 0x8f, 0xef, 0xf0, 0xfb, 0xdf, 0x3f, 0xff,
+ 0xed, 0xf3, 0xcf, 0x3a, 0xef, 0xdf, 0x7f, 0xc6,
+ 0xef, 0xdb, 0xcd, 0x3f, 0xff, 0xec, 0x7b, 0xcf,
+ 0xbf, 0xf7, 0xfa, 0x97, 0xdf, 0x7f, 0xfb, 0xf5,
+ 0x7f, 0xf8, 0xfe, 0xbd, 0xf1, 0xcd, 0xfe, 0xef,
+ 0xef, 0xb3, 0x7f, 0xfe, 0x7a, 0x3d, 0xdd, 0xcf,
+ 0x9f, 0x9e, 0x7f, 0xd7, 0xef, 0xbe, 0xfb, 0xfe,
+ 0x6f, 0xfc, 0x3f, 0x7c, 0xff, 0xff, 0xff, 0x37,
+ 0xeb, 0xff, 0xe3, 0xf5, 0x6f, 0xd6, 0xf9, 0xbb,
+ 0xe7, 0x67, 0xde, 0xfb, 0xff, 0x9a, 0xff, 0xdf,
+ 0xff, 0xf7, 0xff, 0xfd, 0x7f, 0xff, 0xff, 0xfb,
+ 0xff, 0x6f, 0x7f, 0xbb, 0xff, 0xff, 0xdf, 0xee,
+ 0xfd, 0xef, 0xe6, 0xff, 0xcf, 0xfe, 0xbf, 0x7e,
+ 0xb2, 0xa3, 0xbd, 0xdf, 0xfc, 0xf7, 0x47, 0x69,
+ 0x77, 0xfd, 0xfe, 0xdf, 0xf7, 0xbf, 0xbf, 0xe9,
+ 0xff, 0xf9, 0xff, 0xff, 0xff, 0x7f, 0x7b, 0xab,
+ 0x9f, 0xef, 0xdc, 0xf7, 0xd7, 0x7e, 0xdf, 0xef,
+ 0xb6, 0xff, 0xff, 0x6d, 0xfe, 0x7f, 0xdf, 0xff,
+ 0xff, 0xff, 0xdf, 0xfe, 0xee, 0xed, 0x7f, 0xff,
+ 0xfe, 0x1d, 0xef, 0xff, 0x7b, 0xfd, 0xff, 0xff,
+ 0x1b, 0xfe, 0xf9, 0xe7, 0xf1, 0x5b, 0xbe, 0x2f,
+ 0xfe, 0xfc, 0x67, 0x3d, 0x5f, 0x4c, 0x31, 0x9f,
+ 0x7f, 0x59, 0xa9, 0xf7, 0xbf, 0x66, 0xff, 0xff,
+ 0xf9, 0xbd, 0xcf, 0xff, 0xab, 0xaf, 0xff, 0x9d,
+ 0xff, 0xf2, 0xd3, 0xe7, 0xff, 0xef, 0xf2, 0xf8,
+ 0xfe, 0x97, 0xf9, 0x9f, 0xdf, 0xbf, 0xbf, 0xbf,
+ 0x5a, 0x7a, 0xed, 0xb9, 0xf3, 0xb5, 0xc4, 0x17,
+ 0x5f, 0x65, 0x3f, 0xc5, 0x92, 0xff, 0x6f, 0xd6,
+ 0x67, 0xff, 0xff, 0xfb, 0xac, 0x27, 0x9e, 0x7e,
+ 0xfb, 0xd9, 0x4f, 0xb5, 0x75, 0xd6, 0xd9, 0x4f,
+ 0xfd, 0xe5, 0x5e, 0x9b, 0xfb, 0xff, 0x99, 0xfe,
+ 0x7f, 0xed, 0xe6, 0x9f, 0x2e, 0xf6, 0xb5, 0x4f,
+ 0x5f, 0xf5, 0xbc, 0xd7, 0x5e, 0xf9, 0x7f, 0xef,
+ 0x66, 0xfe, 0xbf, 0xa5, 0xfe, 0x6f, 0x7e, 0xe9,
+ 0xa3, 0x9e, 0x3d, 0xed, 0xd1, 0x4d, 0x1f, 0xef,
+ 0xb5, 0x57, 0xeb, 0xfd, 0xb3, 0xb1, 0xff, 0x57,
+ 0xe9, 0xaf, 0xf7, 0xfe, 0xd7, 0x6a, 0xa1, 0x6f,
+ 0x7d, 0xe5, 0x97, 0xd0, 0x7f, 0xff, 0xd5, 0xd2,
+ 0xff, 0x66, 0xee, 0xbf, 0x5b, 0xfa, 0x6b, 0xeb,
+ 0xfd, 0xcf, 0x3a, 0xdb, 0xdf, 0x7e, 0xfd, 0xf5,
+ 0xf2, 0xde, 0x7b, 0x8d, 0xf5, 0xbf, 0x9b, 0xf7,
+ 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff,
+ 0xf7, 0xbb, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf9,
+ 0xb2, 0xdf, 0x77, 0xe6, 0xfd, 0x1f, 0xff, 0xff,
+ 0xfb, 0xef, 0x9f, 0xfd, 0xf7, 0xdb, 0xdf, 0x7e,
+ 0xeb, 0xed, 0xff, 0xff, 0x3c, 0x7f, 0xe7, 0xbd,
+ 0xb1, 0x5f, 0x53, 0xed, 0xb7, 0xff, 0x7e, 0xf3,
+ 0xee, 0x36, 0xda, 0xd1, 0xd7, 0x58, 0x67, 0xbf,
+ 0xbd, 0xc6, 0xdb, 0xff, 0x60, 0xe6, 0xdf, 0xff,
+ 0xff, 0xfc, 0xff, 0xef, 0xfb, 0xef, 0xfe, 0xf6,
+ 0xbf, 0xe7, 0x9e, 0xf9, 0xed, 0xbf, 0xcf, 0xbe,
+ 0x3f, 0x9b, 0xfb, 0xfd, 0xff, 0xbf, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd, 0xf7, 0x7f,
+ 0xff, 0xfd, 0xfd, 0xf7, 0xff, 0xef, 0xa6, 0xfe,
+ 0x19, 0xa7, 0xff, 0xf6, 0xdb, 0xbb, 0xaf, 0xff,
+ 0xf4, 0xa7, 0x57, 0x5f, 0xfd, 0xed, 0xb5, 0x17,
+ 0xde, 0xfb, 0xbb, 0x79, 0xff, 0xa7, 0xdb, 0xaf,
+ 0xb2, 0xea, 0xa2, 0xab, 0xbf, 0x7e, 0xb7, 0xd5,
+ 0x56, 0xdf, 0x7d, 0xb5, 0xc5, 0x1e, 0x7f, 0x6f,
+ 0xfe, 0xbf, 0xff, 0x7a, 0xef, 0xbf, 0xd7, 0xda,
+ 0xfa, 0xff, 0xff, 0x7f, 0xd9, 0xe5, 0xdf, 0xdf,
+ 0x7f, 0xf9, 0xf7, 0xff, 0x9a, 0xff, 0x7f, 0x8f,
+ 0x3f, 0xfa, 0xe8, 0xa3, 0x8f, 0x3e, 0xfb, 0xf4,
+ 0x47, 0x17, 0x7d, 0xf6, 0xd9, 0x47, 0x07, 0x5f,
+ 0xbe, 0xe6, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff,
+ 0xfb, 0xaf, 0xff, 0xfe, 0xf7, 0xd7, 0x5f, 0xff,
+ 0xfd, 0xf7, 0x97, 0x7f, 0xf7, 0xbf, 0xf9, 0xff,
+ 0xff, 0xfb, 0xef, 0xbf, 0xff, 0xfa, 0xef, 0xff,
+ 0xdf, 0xff, 0xf4, 0xd3, 0xcf, 0x3f, 0xff, 0x74,
+ 0xf3, 0xef, 0x6f, 0xfe, 0xff, 0xfb, 0xfa, 0xbf,
+ 0xff, 0xfe, 0xfa, 0xef, 0xbf, 0xff, 0xdd, 0x55,
+ 0xd7, 0x5d, 0xf7, 0xdd, 0x31, 0xdd, 0xfd, 0x9b,
+ 0xff, 0xff, 0xbf, 0xff, 0xfe, 0xfb, 0xaf, 0xff,
+ 0xff, 0x7f, 0xf9, 0x41, 0x07, 0x1d, 0x76, 0xf8,
+ 0x41, 0x97, 0x3d, 0xfe, 0x66, 0xfe, 0xff, 0xff,
+ 0xff, 0xdf, 0xff, 0xd3, 0x5f, 0xff, 0xd7, 0xfe,
+ 0xb7, 0xff, 0xfe, 0xfb, 0xef, 0xa7, 0xff, 0xff,
+ 0xbf, 0xe9, 0xbf, 0xaf, 0xbe, 0xfc, 0xe0, 0x6b,
+ 0x2d, 0xbf, 0xfe, 0xe2, 0xd7, 0x5b, 0x7e, 0xfd,
+ 0xf1, 0xd7, 0x5b, 0x7f, 0xf9, 0x69, 0xfe, 0xff,
+ 0xeb, 0xff, 0xff, 0xff, 0xff, 0x75, 0x7f, 0xff,
+ 0xff, 0x7b, 0xd9, 0x7d, 0xf3, 0xdf, 0xff, 0xf1,
+ 0x7f, 0xff, 0x1b, 0xff, 0xf7, 0xff, 0xcf, 0xff,
+ 0xdd, 0x57, 0xf7, 0xcf, 0xf7, 0xfd, 0xcf, 0xbe,
+ 0xdb, 0xef, 0xfb, 0x4d, 0xdd, 0xff, 0x7a, 0xe6,
+ 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xbf, 0xeb, 0xed, 0xef, 0x7f, 0xdf,
+ 0x7d, 0xff, 0xfb, 0xbf, 0xf9, 0xff, 0xfb, 0xff,
+ 0xad, 0xb7, 0xfe, 0xff, 0xcb, 0x8a, 0xef, 0xb7,
+ 0xf5, 0xdf, 0xf7, 0xfd, 0xbd, 0xd5, 0x97, 0xff,
+ 0x6d, 0xf6, 0xff, 0xff, 0xff, 0xef, 0xbf, 0xff,
+ 0xbf, 0xf6, 0xf7, 0xf6, 0x5f, 0xfb, 0xff, 0xff,
+ 0xfd, 0x75, 0xdb, 0x6a, 0xff, 0x9b, 0xff, 0xef,
+ 0xfa, 0xef, 0xfe, 0xf9, 0xba, 0xfd, 0x6f, 0xfb,
+ 0x9b, 0x3a, 0x77, 0xdd, 0xf7, 0x96, 0x7f, 0xef,
+ 0xfd, 0xff, 0x66, 0xfd, 0xdf, 0xff, 0xff, 0xfd,
+ 0xff, 0xbf, 0xff, 0xbf, 0x47, 0xd1, 0xff, 0x9f,
+ 0x7f, 0xfc, 0xf1, 0xc3, 0x16, 0xff, 0xbf, 0xe9,
+ 0xff, 0xff, 0xfe, 0xff, 0xf7, 0xdf, 0x67, 0xff,
+ 0x6f, 0xfd, 0x2f, 0xbf, 0xdf, 0xef, 0xbb, 0xef,
+ 0xff, 0xfe, 0xff, 0x6b, 0xfe, 0xf7, 0xef, 0xbc,
+ 0xe3, 0x8f, 0x3f, 0xfa, 0x7f, 0xff, 0xfe, 0x7f,
+ 0x7e, 0xfe, 0xff, 0xff, 0xef, 0xfb, 0xc9, 0xff,
+ 0x9b, 0xfb, 0xfe, 0x3e, 0xf7, 0xf7, 0xef, 0x7f,
+ 0xff, 0xf7, 0x7f, 0xff, 0xe5, 0xf6, 0xaf, 0xff,
+ 0xff, 0xff, 0xff, 0xfb, 0xff, 0xe6, 0xff, 0xff,
+ 0xbe, 0xfb, 0x79, 0xf7, 0xcd, 0xba, 0xdf, 0xee,
+ 0xff, 0xc7, 0x4f, 0xf7, 0xbd, 0xf7, 0xdb, 0x37,
+ 0xbf, 0xbb, 0xf1, 0xff, 0xff, 0xff, 0xfd, 0xff,
+ 0xff, 0xd9, 0xd7, 0xdf, 0x5d, 0xdd, 0x37, 0xdf,
+ 0x0e, 0x7e, 0x98, 0xf1, 0xc7, 0xff, 0x66, 0xf6,
+ 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfe, 0xff,
+ 0xbf, 0xff, 0xfd, 0xfe, 0xf7, 0xfb, 0xfe, 0xef,
+ 0xdf, 0xff, 0xff, 0x9b, 0xfe, 0xff, 0xff, 0x9d,
+ 0xef, 0xbf, 0x7c, 0xbc, 0xfa, 0x6f, 0x75, 0xdf,
+ 0x7d, 0x97, 0xdd, 0x77, 0xdf, 0x7d, 0xff, 0xbf,
+ 0x66, 0xff, 0xff, 0xff, 0xff, 0x9d, 0x77, 0xfe,
+ 0xaf, 0xfe, 0x5b, 0x97, 0x5f, 0x7f, 0xad, 0xf5,
+ 0xd7, 0x5f, 0x7f, 0xfb, 0xb7, 0x49, 0xff, 0xff,
+ 0xff, 0xff, 0xa7, 0xfe, 0x0f, 0x6b, 0xbf, 0xf7,
+ 0xb9, 0xb7, 0x9e, 0x7a, 0xee, 0xb9, 0xa7, 0xde,
+ 0xf2, 0x6f, 0xd4, 0xff, 0xff, 0xff, 0xff, 0xa9,
+ 0xff, 0xdf, 0x3a, 0xfb, 0xd5, 0x2e, 0xbf, 0xfc,
+ 0xb2, 0xcb, 0x2f, 0xbf, 0xfc, 0x5c, 0x99, 0xfb,
+ 0xf5, 0xff, 0xff, 0xdf, 0x7f, 0xaf, 0xaf, 0xfe,
+ 0xf6, 0xdd, 0x6d, 0xb7, 0xf5, 0x76, 0x5b, 0x6d,
+ 0xb1, 0xfd, 0x6e, 0x06, 0xbe, 0xfd, 0xff, 0xff,
+ 0xff, 0xef, 0xab, 0xaf, 0xbe, 0x3d, 0x5d, 0x73,
+ 0xcd, 0x0d, 0xd7, 0x5c, 0x73, 0xcc, 0x8d, 0xb3,
+ 0x99, 0xff, 0xff, 0xff, 0xfc, 0xbf, 0xde, 0xda,
+ 0xfb, 0xaf, 0x6f, 0xff, 0xfd, 0xf7, 0xd9, 0x7f,
+ 0xbf, 0xbd, 0xf2, 0xfa, 0x66, 0xe4, 0xff, 0xff,
+ 0x7f, 0x3d, 0xaf, 0x84, 0xfe, 0xfb, 0xdb, 0x7f,
+ 0xfb, 0xed, 0xb7, 0xda, 0x7e, 0x8b, 0x8d, 0xb7,
+ 0x3d, 0x1b, 0xf5, 0xff, 0xff, 0xff, 0xf7, 0xdf,
+ 0xff, 0xff, 0xef, 0xb7, 0xf1, 0xde, 0x73, 0xcf,
+ 0x3d, 0xf7, 0xdc, 0x73, 0xcf, 0x57, 0xe6, 0xfd,
+ 0xff, 0xff, 0xff, 0xd9, 0xe7, 0xff, 0xff, 0xd7,
+ 0x9b, 0xdd, 0x77, 0xd9, 0x65, 0x97, 0x5d, 0xf6,
+ 0xd9, 0xe5, 0x9d, 0xa9, 0xfe, 0xfb, 0xef, 0x3f,
+ 0xd3, 0xfc, 0x7b, 0xed, 0x33, 0x7e, 0xfd, 0xf5,
+ 0xd7, 0x5f, 0x7b, 0xfd, 0xf5, 0xd7, 0xff, 0x66,
+ 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
+ 0xbf, 0xff, 0xdf, 0x7b, 0xef, 0xbd, 0xf7, 0xde,
+ 0x7b, 0xef, 0xbd, 0x3b, 0x9b, 0xf9, 0xff, 0xff,
+ 0xff, 0xef, 0xbf, 0xff, 0xef, 0xff, 0xff, 0xf7,
+ 0xdf, 0x7e, 0xfb, 0xed, 0xb7, 0xdf, 0x7e, 0x7b,
+ 0xef, 0xe6, 0xf6, 0xff, 0xbf, 0xbf, 0xf0, 0xc3,
+ 0xfb, 0xbf, 0xbd, 0xf4, 0xbf, 0xf7, 0xde, 0x7b,
+ 0xef, 0xbd, 0xf7, 0xce, 0xfb, 0xbb, 0x79, 0xff,
+ 0x7f, 0xcf, 0x2f, 0xbe, 0xf9, 0xf6, 0xab, 0xbf,
+ 0xde, 0xd3, 0x4d, 0x37, 0xcd, 0x74, 0xd3, 0xcc,
+ 0x33, 0x7d, 0x6f, 0xfa, 0xff, 0xff, 0xfb, 0xff,
+ 0xbd, 0xbf, 0xff, 0x7f, 0xef, 0xff, 0xbf, 0xfd,
+ 0xf7, 0xdb, 0x6f, 0xe7, 0xbd, 0xf7, 0xdf, 0x9b,
+ 0xfe, 0xff, 0xcb, 0x0e, 0x77, 0xd8, 0xe2, 0xcf,
+ 0x3e, 0xff, 0xfc, 0x61, 0x87, 0x1d, 0x76, 0xd8,
+ 0x65, 0x87, 0x5d, 0xfe, 0xe6, 0xff, 0xff, 0x37,
+ 0x9f, 0x5c, 0xa3, 0xdb, 0xbf, 0xff, 0x7f, 0xf5,
+ 0xdb, 0x6f, 0xbf, 0xfd, 0xf6, 0xdb, 0x6f, 0xbf,
+ 0xbd, 0xe1, 0xff, 0xff, 0xcc, 0xa3, 0x9f, 0xbf,
+ 0xf6, 0xea, 0xff, 0x5f, 0x3d, 0xf6, 0xd8, 0x65,
+ 0x8f, 0x7d, 0xf6, 0xd9, 0xe7, 0x6f, 0xfe, 0xff,
+ 0xaf, 0x3b, 0x9e, 0xbf, 0xae, 0xbf, 0xef, 0xbf,
+ 0x5f, 0x55, 0x57, 0xdd, 0x74, 0xd5, 0x55, 0x17,
+ 0x5d, 0xfd, 0x9b, 0xff, 0xff, 0xf3, 0xdc, 0x7f,
+ 0xfb, 0x6f, 0xfb, 0xfe, 0x7f, 0xd3, 0xdb, 0x6f,
+ 0xdf, 0xfd, 0xf6, 0xd9, 0x67, 0x9f, 0xff, 0xe6,
+ 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0x7f, 0xff,
+ 0xbd, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xdf,
+ 0xff, 0xff, 0xef, 0xbf, 0xf9, 0xff, 0xaf, 0xbf,
+ 0xfe, 0xda, 0xeb, 0x2f, 0x9d, 0xde, 0xda, 0xd7,
+ 0x5e, 0x7b, 0xfd, 0xd5, 0xd7, 0x5f, 0x7d, 0xfd,
+ 0x6f, 0x3e, 0xef, 0xef, 0xff, 0xcf, 0xfe, 0xff,
+ 0xff, 0xeb, 0xee, 0xfc, 0xf6, 0xdd, 0xef, 0xda,
+ 0x7e, 0xde, 0xd9, 0xff, 0xfe, 0x9b, 0xf9, 0xfe,
+ 0xeb, 0x6f, 0xbd, 0xfe, 0x7c, 0xef, 0xb7, 0xff,
+ 0xf7, 0xff, 0x5b, 0xff, 0xff, 0xcf, 0x2d, 0xf7,
+ 0xff, 0x7e, 0xe6, 0xfd, 0x7f, 0xff, 0x5f, 0xff,
+ 0xbf, 0xff, 0x3e, 0xde, 0x7e, 0xbf, 0xe9, 0xff,
+ 0xfd, 0xd6, 0xbe, 0xff, 0xfe, 0xfd, 0x9f, 0x31,
+ 0x7f, 0xff, 0x7f, 0x7f, 0xe6, 0xff, 0xff, 0xff,
+ 0xcf, 0x7d, 0xb1, 0xf5, 0xe7, 0x5e, 0x67, 0xb9,
+ 0xf4, 0xa5, 0xff, 0x65, 0xfc, 0xff, 0xbf, 0xff,
+ 0xbf, 0xfe, 0xeb, 0xbf, 0xff, 0x7f, 0xfb, 0xde,
+ 0xeb, 0xfe, 0xbd, 0xff, 0xfe, 0xdb, 0x5e, 0xff,
+ 0x99, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf,
+ 0xdb, 0xdf, 0xf9, 0xd5, 0x4d, 0xbf, 0xcd, 0x74,
+ 0xf3, 0xc5, 0xbf, 0x7d, 0x5f, 0x86, 0xdf, 0xdf,
+ 0xfb, 0xf6, 0xff, 0xdf, 0xd3, 0x7e, 0xbf, 0xfc,
+ 0xe5, 0x96, 0x5f, 0x7f, 0xf9, 0xff, 0xff, 0x5d,
+ 0xef, 0xaf, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xdf, 0xfe, 0xfe, 0xfd, 0xb7, 0xeb, 0xef, 0xbf,
+ 0xff, 0xfe, 0xbf, 0xff, 0xbf, 0xfd, 0x6f, 0xf4,
+ 0x3f, 0xef, 0xf8, 0xf3, 0xff, 0xfe, 0xff, 0xfc,
+ 0xf7, 0x9f, 0x25, 0xde, 0x98, 0x61, 0xce, 0xbc,
+ 0xf6, 0x79, 0xff, 0x9b, 0xff, 0x6f, 0xff, 0xfa,
+ 0x76, 0xff, 0xfa, 0xde, 0xee, 0xdb, 0xb5, 0xdf,
+ 0x6a, 0xbb, 0xed, 0xf6, 0xbf, 0x1f, 0xf6, 0xee,
+ 0xe6, 0xbe, 0xde, 0xfc, 0xbf, 0x7c, 0x77, 0xeb,
+ 0xdf, 0xff, 0xd7, 0xf7, 0xdb, 0x6f, 0xbf, 0xfd,
+ 0xbf, 0xff, 0x7f, 0xff, 0xbf, 0xb9, 0xff, 0x7f,
+ 0xff, 0xaf, 0xff, 0xf7, 0xc7, 0x7f, 0xff, 0x7b,
+ 0xfd, 0xd5, 0xd7, 0x5b, 0xff, 0x7b, 0x9f, 0xd5,
+ 0xfe, 0x6d, 0xfa, 0xff, 0xff, 0xff, 0xbf, 0xff,
+ 0xdf, 0xff, 0xff, 0xfd, 0xdd, 0x7f, 0xff, 0xfd,
+ 0xf7, 0xfb, 0xff, 0xff, 0xfd, 0xff, 0x1b, 0xfe,
+ 0xfc, 0xfe, 0xfb, 0x7b, 0xfe, 0xef, 0xbd, 0xf3,
+ 0x2a, 0x7f, 0xf3, 0xcd, 0x37, 0xdd, 0x5c, 0x6b,
+ 0xc9, 0xf7, 0x3f, 0x66, 0x7f, 0xfe, 0xff, 0xb2,
+ 0x5f, 0xff, 0xfb, 0xe5, 0xbf, 0xcc, 0xe7, 0xbc,
+ 0xf9, 0xce, 0x39, 0xed, 0xb2, 0xd9, 0xff, 0xb7,
+ 0xf9, 0xff, 0xef, 0xff, 0xbf, 0xff, 0xfd, 0x3e,
+ 0xaf, 0xaf, 0x57, 0x9b, 0xef, 0xba, 0xf9, 0xfe,
+ 0xf9, 0xe7, 0x57, 0xff, 0x6f, 0xd6, 0xff, 0xff,
+ 0xff, 0xfb, 0xdf, 0xbe, 0xff, 0xfe, 0xeb, 0x7f,
+ 0xef, 0xb7, 0xf7, 0x7f, 0xdf, 0x7f, 0x3b, 0xff,
+ 0x5f, 0x9b, 0xfb, 0xff, 0xfd, 0xf7, 0xdb, 0x5f,
+ 0xbf, 0x9d, 0x77, 0xfe, 0x7d, 0x42, 0x1b, 0xe7,
+ 0xbc, 0x5a, 0x6a, 0xb3, 0xcf, 0xee, 0x66, 0xfa,
+ 0xff, 0xff, 0xbf, 0x6b, 0xff, 0xbb, 0xeb, 0x8a,
+ 0x3f, 0xd5, 0x52, 0x45, 0x15, 0xf5, 0x5d, 0x73,
+ 0xff, 0xfd, 0xb3, 0xb1, 0xff, 0xef, 0xff, 0xbd,
+ 0xf3, 0xdb, 0xeb, 0xaf, 0xaf, 0x6f, 0xf5, 0xd5,
+ 0x57, 0x5f, 0xfd, 0xb5, 0xf6, 0xd7, 0xf9, 0x66,
+ 0xe2, 0xff, 0x57, 0x4f, 0x38, 0xff, 0xa7, 0x57,
+ 0xde, 0x7b, 0xff, 0xeb, 0xaf, 0xb7, 0xde, 0xca,
+ 0x2b, 0x87, 0x9f, 0xbf, 0x9b, 0xf7, 0x7f, 0xff,
+ 0xfd, 0xf7, 0xdf, 0x78, 0xf3, 0xcd, 0xbf, 0xbb,
+ 0xf0, 0xd2, 0x4b, 0x2f, 0xbb, 0xfe, 0xfa, 0x8b,
+ 0xf7, 0xe6, 0xfd, 0x9f, 0x7f, 0xfe, 0xf9, 0xf7,
+ 0x9f, 0x7f, 0xfe, 0x1b, 0xcf, 0x3e, 0xef, 0xbc,
+ 0xb3, 0xcf, 0x3e, 0xff, 0xfc, 0xbd, 0xb1, 0xff,
+ 0xe3, 0xcf, 0x3f, 0xff, 0xf4, 0xe3, 0x8d, 0xb5,
+ 0xff, 0x91, 0xc6, 0x1b, 0x6f, 0xf4, 0xd1, 0xe7,
+ 0x9a, 0xeb, 0x66, 0xe6, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xef, 0xff, 0xfd, 0xf7, 0xbb, 0x6f,
+ 0x3e, 0xff, 0xfe, 0xfb, 0xef, 0xbe, 0x3f, 0x9b,
+ 0xfb, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, 0xff,
+ 0xef, 0xbf, 0xff, 0xfb, 0xdf, 0xff, 0xff, 0xff,
+ 0xff, 0xf5, 0xf7, 0xef, 0xa6, 0xfe, 0x1f, 0x7f,
+ 0xfc, 0x70, 0xe2, 0x4b, 0x27, 0xbc, 0xf6, 0x87,
+ 0x37, 0x7e, 0xfa, 0xe3, 0x84, 0x17, 0x5e, 0xfa,
+ 0xab, 0x79, 0xff, 0xef, 0xbf, 0x35, 0x9e, 0xf8,
+ 0xe2, 0x8b, 0xaf, 0xfa, 0xf1, 0xcd, 0x17, 0x5f,
+ 0x7c, 0xf1, 0xc4, 0x17, 0x7f, 0x6f, 0xfe, 0xff,
+ 0xfd, 0xaf, 0xef, 0xae, 0xfe, 0xfe, 0xf3, 0xeb,
+ 0xfe, 0xff, 0xfd, 0xff, 0xf7, 0xfb, 0x7f, 0xf5,
+ 0xf6, 0xff, 0x9b, 0xff, 0xff, 0xcf, 0x3f, 0xb3,
+ 0xe9, 0xb3, 0x8f, 0x3f, 0xfb, 0xb4, 0xe1, 0x06,
+ 0x1f, 0x64, 0xb8, 0x41, 0x97, 0x1f, 0xfe, 0xe6,
+ 0xff, 0x9f, 0x7f, 0xff, 0xfc, 0xff, 0xfb, 0x6f,
+ 0xbf, 0x7e, 0xef, 0x1b, 0xcf, 0xbf, 0xf3, 0x64,
+ 0xbb, 0xef, 0xbc, 0xbf, 0xf9, 0xff, 0xff, 0xdf,
+ 0x3f, 0xff, 0xff, 0xfe, 0xef, 0xbf, 0x5f, 0x5f,
+ 0x7c, 0xf1, 0xc3, 0x17, 0x7d, 0xfe, 0xf9, 0xe5,
+ 0x6f, 0xfe, 0xff, 0xfb, 0xef, 0xaf, 0xfa, 0xfe,
+ 0xfb, 0xe7, 0xab, 0xdf, 0x4c, 0x37, 0x5d, 0x75,
+ 0xf3, 0xcc, 0x53, 0xdd, 0xfc, 0x1b, 0xfe, 0xff,
+ 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xfb,
+ 0xff, 0xdd, 0xf7, 0xbf, 0x7f, 0xff, 0xfb, 0xe7,
+ 0xdd, 0x3f, 0x66, 0x7f, 0xff, 0xff, 0xfd, 0xff,
+ 0xff, 0xda, 0x6f, 0xbf, 0xfd, 0xaa, 0x2f, 0xbf,
+ 0xfa, 0xfa, 0xff, 0xff, 0xbf, 0xfe, 0xbf, 0xf9,
+ 0xff, 0xaf, 0xbe, 0xfa, 0xea, 0xe9, 0xaf, 0xbf,
+ 0xd8, 0xe2, 0x97, 0x5f, 0x7f, 0xfd, 0xd1, 0x57,
+ 0x1f, 0x7e, 0xcd, 0x6f, 0xfa, 0xdf, 0xfb, 0xff,
+ 0xbf, 0x3a, 0x3f, 0xe8, 0xe4, 0xfb, 0x7e, 0xfe,
+ 0xdb, 0x37, 0x9f, 0xf7, 0xfe, 0xf9, 0x66, 0xff,
+ 0x1b, 0xff, 0xff, 0xff, 0xf7, 0xbf, 0xf7, 0xed,
+ 0x5f, 0x7f, 0xff, 0xdf, 0xbb, 0xb7, 0x77, 0xcd,
+ 0xef, 0xcf, 0xeb, 0xf8, 0x7f, 0xa6, 0xff, 0x5f,
+ 0xff, 0xff, 0x77, 0xfd, 0x6d, 0xf7, 0xff, 0xe9,
+ 0xad, 0xff, 0x6e, 0xe7, 0xd6, 0xbf, 0xef, 0xff,
+ 0xff, 0xbb, 0xf9, 0xf7, 0x77, 0xff, 0xff, 0xbf,
+ 0xfe, 0xf3, 0xdb, 0xad, 0x7f, 0x3c, 0xf1, 0xc7,
+ 0x91, 0xff, 0xf7, 0xf1, 0xc6, 0xff, 0x67, 0xfe,
+ 0xff, 0xaf, 0xff, 0xff, 0x7b, 0xb7, 0xbf, 0xe7,
+ 0xd6, 0xdb, 0x77, 0x3f, 0x7d, 0xfb, 0xf7, 0xdf,
+ 0x7f, 0xbd, 0x7b, 0x9b, 0xfe, 0xff, 0xff, 0xfd,
+ 0xbf, 0x7b, 0x7f, 0xf7, 0xef, 0xbb, 0xcb, 0x3f,
+ 0xf7, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xaf, 0xff,
+ 0xa6, 0xff, 0x3f, 0xff, 0xe9, 0xff, 0x7f, 0xfb,
+ 0x7f, 0x3f, 0xfe, 0xdd, 0xfe, 0xff, 0xfb, 0x7f,
+ 0xef, 0xee, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xff,
+ 0xff, 0xfd, 0xf7, 0xb7, 0xfb, 0xff, 0xff, 0xbf,
+ 0xfd, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0x7f,
+ 0xef, 0x6f, 0xfe, 0x7f, 0xff, 0xbc, 0xb7, 0xcf,
+ 0xfa, 0xfb, 0xbe, 0xf7, 0x15, 0xe9, 0xf7, 0xe0,
+ 0xe7, 0xfd, 0x6b, 0xee, 0xf1, 0xfd, 0x9b, 0xfb,
+ 0xdf, 0x3f, 0xbf, 0xfd, 0xb3, 0xff, 0xbf, 0xff,
+ 0xf7, 0xef, 0xf6, 0xff, 0x7b, 0xec, 0xff, 0x5e,
+ 0xff, 0xeb, 0xff, 0xe6, 0x9d, 0xaf, 0xfe, 0xf9,
+ 0xf7, 0xff, 0xef, 0xf6, 0xfa, 0x5f, 0xe7, 0xfb,
+ 0xef, 0xef, 0x35, 0xf5, 0xdf, 0x4f, 0xff, 0x9d,
+ 0xd1, 0xff, 0xfb, 0xff, 0xff, 0xfb, 0xfb, 0xd9,
+ 0xbf, 0x77, 0xff, 0x74, 0x77, 0x7f, 0xff, 0x1b,
+ 0xdd, 0x63, 0x57, 0xfb, 0x6f, 0xfe, 0x3f, 0xff,
+ 0xef, 0xff, 0xfd, 0xff, 0xfe, 0xbf, 0xff, 0x7f,
+ 0xbf, 0xfe, 0xff, 0xf7, 0xff, 0xff, 0xfe, 0xff,
+ 0xff, 0x9b, 0xfe, 0xff, 0xe6, 0xfb, 0xef, 0xaf,
+ 0xb9, 0xd4, 0x9e, 0xee, 0x37, 0xf9, 0xcf, 0x97,
+ 0xff, 0xdf, 0x79, 0xad, 0xf1, 0xbf, 0x66, 0xff,
+ 0xdf, 0x7f, 0xe7, 0x93, 0xee, 0xbf, 0xe5, 0xe7,
+ 0xfa, 0xe7, 0xfa, 0xd9, 0xfe, 0xff, 0xb7, 0xff,
+ 0xd9, 0xff, 0xb7, 0x49, 0xff, 0xff, 0xff, 0xaf,
+ 0xff, 0xfe, 0xdb, 0xcf, 0xef, 0xf3, 0x9f, 0x77,
+ 0xb6, 0xdf, 0xfe, 0xad, 0x96, 0x5f, 0xf9, 0x6f,
+ 0xd4, 0xff, 0xff, 0x3f, 0xeb, 0xef, 0xff, 0xff,
+ 0x2c, 0xe7, 0xfd, 0xe7, 0x9f, 0x7d, 0xb6, 0x7f,
+ 0x4f, 0xff, 0xfd, 0x5e, 0x9b, 0xeb, 0xf5, 0xff,
+ 0xf7, 0xdf, 0x6f, 0xa5, 0xd9, 0x56, 0xde, 0xfc,
+ 0xed, 0xba, 0xe7, 0xbe, 0xdf, 0x7f, 0xbb, 0x7d,
+ 0xeb, 0x06, 0xbe, 0xfd, 0xff, 0xff, 0xfb, 0xee,
+ 0xb9, 0xef, 0xdf, 0xb4, 0xcf, 0xbb, 0xc5, 0x8d,
+ 0xf7, 0xd7, 0x77, 0xc3, 0xad, 0xb3, 0x99, 0xff,
+ 0xff, 0xbf, 0xaf, 0xfe, 0xb2, 0x7a, 0x0f, 0x6b,
+ 0xd5, 0x3b, 0xf5, 0xf6, 0x5f, 0xff, 0xed, 0xd7,
+ 0xdf, 0xff, 0x66, 0xe4, 0xff, 0xf7, 0xdf, 0x6b,
+ 0xef, 0xbd, 0x83, 0x5e, 0x6f, 0xfc, 0x0f, 0x27,
+ 0x9d, 0x56, 0x7a, 0xff, 0xef, 0xfd, 0x3f, 0x1a,
+ 0xf5, 0xfe, 0xf3, 0xfd, 0xf7, 0xdf, 0x7f, 0xff,
+ 0x2d, 0x3f, 0xfb, 0xff, 0xde, 0x4b, 0xaf, 0xfd,
+ 0xff, 0xf2, 0xff, 0x77, 0xa6, 0x7d, 0xbd, 0x79,
+ 0xfe, 0xf9, 0xe7, 0x9f, 0x79, 0xf4, 0x9d, 0xef,
+ 0xfe, 0xff, 0xac, 0xf3, 0xbf, 0x3f, 0xeb, 0xff,
+ 0xbd, 0xb9, 0xee, 0xfb, 0x8f, 0x3f, 0xfe, 0xf8,
+ 0xf3, 0xcd, 0x33, 0xd7, 0xd9, 0xe6, 0x9b, 0x69,
+ 0xfe, 0xfd, 0x46, 0xdf, 0xff, 0x62, 0xee, 0xdf,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xbf, 0xfd,
+ 0xff, 0xb7, 0xdf, 0xbf, 0xfb, 0xfe, 0xdd, 0xef,
+ 0xff, 0x3b, 0x9b, 0xf9, 0xfe, 0xfe, 0xff, 0xff,
+ 0xff, 0xff, 0xee, 0xbf, 0xff, 0xff, 0xf7, 0xff,
+ 0xd7, 0xdf, 0xff, 0xff, 0xff, 0xbf, 0xef, 0xe6,
+ 0xf6, 0x6b, 0x7f, 0xfc, 0xf1, 0xc7, 0x0f, 0x7f,
+ 0xbe, 0xf8, 0xc5, 0x37, 0x7f, 0xfa, 0xa1, 0xf7,
+ 0x3f, 0xde, 0xff, 0xbb, 0x61, 0xff, 0xe7, 0xbf,
+ 0xff, 0xfe, 0xfb, 0xe3, 0x9f, 0xae, 0x5e, 0xff,
+ 0xcf, 0x37, 0xdf, 0xfc, 0xf5, 0xc7, 0xb3, 0x7f,
+ 0x6f, 0xfe, 0xfb, 0xff, 0xff, 0xdf, 0x7f, 0xbf,
+ 0xde, 0xf6, 0xbb, 0x5f, 0x7e, 0xfb, 0xf7, 0x9f,
+ 0x7f, 0x7f, 0xb5, 0xfd, 0xff, 0x9b, 0xff, 0xaf,
+ 0xc3, 0x0d, 0x3f, 0xfc, 0x22, 0xcb, 0x1e, 0xbb,
+ 0xd4, 0xe1, 0x0f, 0x1f, 0x7c, 0xd8, 0xc1, 0x07,
+ 0x3f, 0xfe, 0xe6, 0xff, 0xcb, 0x7f, 0xff, 0xff,
+ 0xff, 0x8f, 0xff, 0x9f, 0xfe, 0xc5, 0xff, 0x7f,
+ 0xff, 0xf9, 0xff, 0xbf, 0xdf, 0xfe, 0xbf, 0xe1,
+ 0x6f, 0xbf, 0xfd, 0xf6, 0xd7, 0xef, 0xfb, 0xff,
+ 0xad, 0x4b, 0xff, 0xf6, 0xf2, 0xed, 0xaf, 0xff,
+ 0x7e, 0xb3, 0xef, 0x6f, 0xfe, 0xdf, 0x99, 0x67,
+ 0xbe, 0xfa, 0xee, 0xab, 0xef, 0xab, 0x5f, 0xc7,
+ 0x77, 0xdf, 0x1c, 0xf5, 0x45, 0x31, 0xfd, 0x7c,
+ 0x1b, 0xfe, 0xaf, 0xcb, 0x2f, 0x7f, 0xfc, 0xfa,
+ 0xeb, 0xdf, 0xb2, 0x95, 0x61, 0x86, 0x5f, 0xfe,
+ 0xf8, 0xe1, 0x17, 0x1b, 0xfe, 0xe6, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xd3, 0xfb, 0x3f, 0xbd,
+ 0xbe, 0xb5, 0x9f, 0x7e, 0xfb, 0xe5, 0x97, 0xff,
+ 0xff, 0xbf, 0xf9, 0xff, 0x2f, 0xbf, 0xf8, 0xfa,
+ 0xeb, 0xad, 0x9e, 0xfa, 0xfa, 0xd7, 0x5f, 0x7c,
+ 0xd1, 0x55, 0xc7, 0x5e, 0x7f, 0xfd, 0x6f, 0x1e,
+ 0xff, 0xec, 0xf3, 0xcf, 0x36, 0xdf, 0xf0, 0x2b,
+ 0xc7, 0xf7, 0x7f, 0x7e, 0x63, 0xd7, 0xfe, 0xff,
+ 0xda, 0x7e, 0xff, 0x9b, 0xeb, 0xaf, 0x5f, 0x7e,
+ 0xbe, 0xfb, 0xef, 0xdf, 0x7b, 0xbe, 0xff, 0xfb,
+ 0xbd, 0xdc, 0xdf, 0xfb, 0xbf, 0xff, 0xfb, 0x6e,
+ 0xe6, 0x7d, 0x7e, 0x77, 0x5f, 0x77, 0xfd, 0x6f,
+ 0xbe, 0x7e, 0xff, 0x8f, 0xbf, 0xe7, 0xfb, 0xea,
+ 0xfe, 0xff, 0xfd, 0xff, 0xbf, 0x31, 0xf7, 0x7b,
+ 0xff, 0xfd, 0xfe, 0xcf, 0xfb, 0xeb, 0xbf, 0xff,
+ 0xbb, 0x97, 0xe6, 0x9f, 0x7e, 0xb1, 0xf5, 0xfe,
+ 0xfd, 0x67, 0xf4, 0x7f, 0xbb, 0xff, 0xff, 0xfb,
+ 0xff, 0xff, 0xfa, 0xfa, 0xfa, 0xbf, 0x7f, 0xff,
+ 0xfd, 0x35, 0xdf, 0x7a, 0xff, 0xfe, 0x9b, 0xff,
+ 0xff, 0xfb, 0x7f, 0x7f, 0x5f, 0xef, 0xeb, 0xef,
+ 0x6b, 0xff, 0x5d, 0xfb, 0xdd, 0xd7, 0xff, 0x7d,
+ 0xfe, 0xed, 0xdf, 0x46, 0xef, 0xfd, 0x7f, 0xff,
+ 0xb7, 0x6f, 0xff, 0x7f, 0x37, 0xdf, 0xff, 0x76,
+ 0x5f, 0x5e, 0xed, 0xef, 0xf5, 0xd9, 0xff, 0xbf,
+ 0xf1, 0xe7, 0xff, 0xff, 0xfc, 0xf1, 0xff, 0xff,
+ 0xbe, 0xbf, 0xfb, 0xef, 0xe6, 0xbb, 0xfe, 0xb8,
+ 0xaf, 0xed, 0xb5, 0xef, 0x6b, 0xfc, 0xef, 0xf3,
+ 0xdc, 0xf3, 0xff, 0x15, 0xff, 0xbc, 0xe3, 0x17,
+ 0xe7, 0x9e, 0xfd, 0xe3, 0x1f, 0xf7, 0xff, 0xff,
+ 0xff, 0x9b, 0xfb, 0xff, 0xb7, 0xfd, 0xf6, 0xff,
+ 0x6f, 0xae, 0xfd, 0xfb, 0xef, 0xff, 0x7e, 0xd7,
+ 0x79, 0xee, 0xef, 0xe5, 0xaf, 0xff, 0xe6, 0xfe,
+ 0xdf, 0x7b, 0xfe, 0xfd, 0xab, 0xdf, 0x2e, 0xf9,
+ 0xff, 0xf7, 0xdf, 0x7f, 0x9d, 0xfd, 0xff, 0xff,
+ 0xff, 0xff, 0xbf, 0xa9, 0x3f, 0xff, 0xfe, 0xff,
+ 0xcf, 0xfb, 0xdf, 0xff, 0xf7, 0xe4, 0xef, 0xb6,
+ 0xd3, 0x56, 0x3b, 0xfd, 0xf7, 0xdb, 0xff, 0x6d,
+ 0xfe, 0xff, 0xff, 0x7f, 0xff, 0xef, 0xff, 0x77,
+ 0xff, 0xff, 0xdf, 0x7d, 0xfe, 0xfd, 0xf6, 0xff,
+ 0xff, 0xfe, 0xfb, 0xfb, 0x9a, 0xfb, 0x72, 0xe7,
+ 0xff, 0xd7, 0x9f, 0x79, 0xf9, 0xd7, 0xff, 0xff,
+ 0xfb, 0xfa, 0x7f, 0xff, 0xfe, 0xfe, 0xce, 0x0b,
+ 0x3f, 0xa6, 0xff, 0xbf, 0xff, 0xff, 0xcb, 0xee,
+ 0xbf, 0xe5, 0xe4, 0xf2, 0xdf, 0xdf, 0xd9, 0xe5,
+ 0x3f, 0x8f, 0x7a, 0xff, 0xf9, 0x8f, 0xd9, 0xcf,
+ 0x7f, 0xfe, 0xf9, 0xf1, 0x9f, 0x3f, 0xfb, 0x65,
+ 0xf3, 0xfb, 0x7d, 0x5e, 0xff, 0xcf, 0x9f, 0xf5,
+ 0x57, 0xff, 0x6f, 0xfe, 0xff, 0xfb, 0x7f, 0xa9,
+ 0xe9, 0xfe, 0xfb, 0x66, 0xfe, 0xdc, 0xaf, 0xfd,
+ 0x67, 0xb6, 0x4b, 0x6d, 0xb5, 0xf5, 0xff, 0x1a,
+ 0xf5, 0xff, 0xff, 0xcf, 0x3a, 0xff, 0xff, 0x3f,
+ 0xff, 0x3f, 0xf7, 0xd9, 0xcf, 0x9f, 0x6d, 0xd6,
+ 0xeb, 0xaf, 0xff, 0x57, 0xe6, 0xb6, 0x7d, 0xff,
+ 0xfd, 0xf7, 0xf3, 0x7f, 0xef, 0xfc, 0x66, 0xaf,
+ 0x9f, 0xef, 0x39, 0xef, 0xff, 0xd7, 0x5e, 0xfb,
+ 0xbb, 0x91, 0x6f, 0xff, 0xff, 0xff, 0xfe, 0x5c,
+ 0xff, 0x7b, 0xef, 0xfe, 0xeb, 0xdd, 0x75, 0xc3,
+ 0xfd, 0xf7, 0xbf, 0xfb, 0xea, 0x6c, 0xec, 0xff,
+ 0xdf, 0x3f, 0xab, 0xff, 0xf7, 0xfb, 0x76, 0xe9,
+ 0xdf, 0xfa, 0xbd, 0xfd, 0xf7, 0x5f, 0xff, 0x7f,
+ 0xff, 0xbf, 0x19, 0xfb, 0xff, 0xec, 0xc3, 0xda,
+ 0xdf, 0xf1, 0xbd, 0xcf, 0xca, 0xb7, 0xdf, 0xc6,
+ 0xa5, 0x9d, 0xd6, 0x5f, 0x7b, 0xed, 0x6f, 0xc6,
+ 0xfd, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0xff,
+ 0xff, 0xfd, 0x6e, 0xbf, 0xed, 0xd2, 0x4b, 0xfe,
+ 0xff, 0xdd, 0xf7, 0xbd, 0x79, 0xdf, 0xe7, 0x9f,
+ 0x7f, 0xfe, 0xfb, 0xe7, 0xbf, 0x7f, 0xf6, 0x27,
+ 0xce, 0x3f, 0xeb, 0xec, 0xff, 0x7f, 0xfe, 0x79,
+ 0x6f, 0xaa, 0xef, 0xfc, 0xf3, 0x8f, 0x3f, 0xff,
+ 0x78, 0xfb, 0xcd, 0x73, 0xbf, 0xb5, 0x66, 0x9b,
+ 0x76, 0x7f, 0xbd, 0xf4, 0xbf, 0x99, 0xf8, 0xff,
+ 0xff, 0xff, 0xff, 0xfd, 0xff, 0xdb, 0x3b, 0xbf,
+ 0xfd, 0xed, 0xbf, 0xcf, 0xbe, 0xff, 0xdf, 0x3e,
+ 0xfb, 0xee, 0xe6, 0xfe, 0xbf, 0xff, 0xfe, 0xef,
+ 0xef, 0xff, 0xfe, 0xfa, 0xeb, 0xdf, 0xfd, 0xfd,
+ 0xdd, 0xf7, 0xff, 0xb7, 0xdb, 0xde, 0xbb, 0xb9,
+ 0xfd, 0x57, 0x1f, 0x27, 0xfc, 0xf5, 0xc2, 0x2f,
+ 0x2f, 0xfd, 0xa3, 0x87, 0x36, 0x7a, 0xba, 0xfd,
+ 0xb5, 0xd7, 0xfe, 0x6e, 0xde, 0xff, 0xfb, 0xef,
+ 0x8b, 0xff, 0xb6, 0xf8, 0xea, 0x8b, 0xf7, 0x7c,
+ 0xf7, 0xc7, 0x17, 0x7f, 0xfe, 0xf7, 0xdf, 0xdf,
+ 0x9b, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xfb, 0x2f,
+ 0xff, 0xfc, 0xfe, 0xff, 0x7f, 0xfe, 0xdd, 0xff,
+ 0xdf, 0xff, 0xf7, 0xff, 0xff, 0xe6, 0xfd, 0xff,
+ 0x73, 0x8f, 0x3e, 0xff, 0xe8, 0xa3, 0xcf, 0x3e,
+ 0xef, 0xf9, 0x47, 0x96, 0x7f, 0xf6, 0xd1, 0x47,
+ 0x9f, 0xbf, 0xf9, 0xff, 0xe7, 0xdf, 0x7f, 0xff,
+ 0xf8, 0xf7, 0xcb, 0xbf, 0xff, 0xfd, 0xff, 0xbf,
+ 0x7d, 0xfe, 0xf9, 0xff, 0xff, 0xff, 0x6f, 0xfe,
+ 0xff, 0xff, 0xf7, 0xff, 0xbf, 0xff, 0xff, 0xfa,
+ 0xfb, 0xff, 0x7f, 0xff, 0xed, 0x95, 0x77, 0x7e,
+ 0xfd, 0xf5, 0xff, 0x9b, 0xff, 0xf7, 0xfe, 0xfb,
+ 0xe7, 0xbb, 0x7f, 0xbe, 0xf8, 0xef, 0x7f, 0xff,
+ 0x7d, 0xf7, 0xdf, 0xdf, 0x5f, 0x7d, 0xf5, 0xff,
+ 0x66, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xaf, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xdf,
+ 0xe7, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xff,
+ 0xff, 0xfd, 0xbf, 0xfd, 0xff, 0xdb, 0xfd, 0x7f,
+ 0xfa, 0xa5, 0x37, 0xff, 0xee, 0x7f, 0xed, 0xaf,
+ 0xfb, 0x6f, 0xfe, 0xff, 0xa3, 0xaf, 0xbf, 0xea,
+ 0xea, 0xab, 0x2f, 0xbf, 0xba, 0x55, 0xd3, 0x5d,
+ 0x7f, 0xf5, 0xd5, 0xc7, 0x5f, 0xfb, 0x9b, 0x8f,
+ 0x3d, 0xf6, 0xff, 0xb3, 0x3b, 0x3f, 0x3b, 0x28,
+ 0xe3, 0xff, 0xff, 0x7f, 0xd9, 0xe5, 0x7e, 0x9b,
+ 0xef, 0x9b, 0xff, 0xa6, 0xff, 0xf9, 0xff, 0x6f,
+ 0xec, 0xff, 0x9b, 0xdf, 0xf7, 0xfe, 0xff, 0xff,
+ 0x36, 0x5d, 0xd3, 0xfe, 0xfb, 0xaf, 0xff, 0x9f,
+ 0xf9, 0xf7, 0xfd, 0xbf, 0xf3, 0xff, 0xdb, 0xfd,
+ 0xef, 0xe7, 0xdf, 0xbb, 0xfe, 0xff, 0xae, 0xb7,
+ 0xff, 0xbf, 0xff, 0xff, 0x6b, 0xf8, 0xff, 0xff,
+ 0xff, 0xe3, 0x3d, 0xff, 0xee, 0xf3, 0xef, 0x7f,
+ 0xfe, 0xaf, 0xf9, 0xfe, 0xfd, 0x3e, 0xfc, 0xf5,
+ 0xeb, 0x19, 0xff, 0xfe, 0xff, 0xff, 0xbf, 0xff,
+ 0xef, 0xbf, 0xff, 0x6f, 0xf6, 0xf7, 0xdf, 0xff,
+ 0xff, 0xfd, 0xbf, 0x5f, 0xfd, 0xff, 0xe6, 0xff,
+ 0xff, 0xff, 0xbf, 0xbf, 0xfe, 0xfd, 0x7b, 0xbf,
+ 0xff, 0x3f, 0xff, 0x3d, 0xf7, 0xeb, 0xfe, 0xdb,
+ 0x6f, 0xf7, 0xaf, 0xf1, 0xff, 0xcf, 0x7f, 0xff,
+ 0xff, 0xff, 0xdf, 0xdf, 0x7f, 0xf7, 0xff, 0xff,
+ 0xfe, 0xfb, 0x7f, 0xb3, 0x3d, 0xf3, 0xff, 0x6f,
+ 0xfa, 0xfb, 0x57, 0xdf, 0x7f, 0xff, 0xec, 0xff,
+ 0x7f, 0xff, 0xef, 0xfb, 0xf7, 0xbf, 0xff, 0x7f,
+ 0xff, 0xd9, 0xa7, 0xfe, 0x1b, 0xff, 0xff, 0x3f,
+ 0xbf, 0xf4, 0xf2, 0xf7, 0x3f, 0x77, 0x6c, 0xe5,
+ 0x8b, 0x37, 0xfe, 0xf9, 0xfd, 0xfb, 0xfb, 0xff,
+ 0xff, 0xe6, 0xff, 0xff, 0x6f, 0x37, 0xc7, 0xfa,
+ 0x7f, 0x6f, 0xbf, 0xfd, 0xed, 0xb7, 0x7d, 0x1f,
+ 0xdb, 0x7f, 0xfd, 0xff, 0xff, 0xbf, 0xf9, 0x7f,
+ 0xb3, 0x9f, 0x3f, 0xff, 0xdb, 0x73, 0xef, 0xb6,
+ 0xdb, 0xff, 0xf6, 0x49, 0xff, 0x7b, 0xfd, 0xe5,
+ 0xd2, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xdf, 0xe7,
+ 0xf7, 0xbb, 0xfe, 0xaa, 0x6b, 0x7f, 0xf3, 0xad,
+ 0x5b, 0xff, 0x5d, 0x7a, 0xf9, 0xf5, 0xff, 0x9b,
+ 0xef, 0xef, 0xff, 0xdf, 0xed, 0xfd, 0xef, 0xbf,
+ 0xff, 0xbe, 0x5f, 0x5d, 0xff, 0xff, 0xff, 0xfe,
+ 0xfd, 0xfd, 0xf7, 0xff, 0x86, 0xff, 0xbf, 0xbf,
+ 0xff, 0xce, 0xef, 0xef, 0xbc, 0xe4, 0x92, 0xd7,
+ 0x74, 0xf9, 0x7d, 0xfb, 0xfd, 0x7f, 0xfe, 0xff,
+ 0x8f, 0xd9, 0xff, 0xf7, 0xfb, 0xef, 0xf3, 0xff,
+ 0xde, 0xdb, 0x6c, 0x65, 0x8b, 0x6d, 0xb6, 0xdf,
+ 0x7f, 0xff, 0xd5, 0xd7, 0xff, 0x6d, 0xfe, 0xff,
+ 0xff, 0xfb, 0x6f, 0xa5, 0xb6, 0xdf, 0x76, 0xdb,
+ 0xdd, 0xee, 0x99, 0xe7, 0xf7, 0xd2, 0x6b, 0xbd,
+ 0xf5, 0xff, 0x9b, 0xf5, 0xff, 0xbf, 0xff, 0x3e,
+ 0xeb, 0xb5, 0xd7, 0x5c, 0x6b, 0x9d, 0x6b, 0x65,
+ 0xf7, 0xfd, 0xf7, 0xeb, 0xaf, 0xff, 0xd7, 0xe6,
+ 0xfe, 0x7f, 0xbf, 0xdd, 0x76, 0xdf, 0x6f, 0xbf,
+ 0xd5, 0x66, 0x37, 0xf3, 0x7e, 0x2b, 0xff, 0x7d,
+ 0xd3, 0x4d, 0xaf, 0xbb, 0x99, 0xff, 0xff, 0xbb,
+ 0xe2, 0xce, 0xfb, 0xee, 0xb9, 0xef, 0x5e, 0xf7,
+ 0xdc, 0x57, 0xdf, 0x7d, 0xf5, 0xff, 0xfb, 0xed,
+ 0x6c, 0xec, 0xff, 0xdf, 0x2b, 0xaf, 0xab, 0xbc,
+ 0x8b, 0x7e, 0xb9, 0xd1, 0xcd, 0xb5, 0xd7, 0xf6,
+ 0xdf, 0xff, 0x7f, 0xff, 0xbe, 0x99, 0xfb, 0xff,
+ 0x84, 0xc7, 0xde, 0x6b, 0xbf, 0xf5, 0xf2, 0x5b,
+ 0xdf, 0x72, 0x5b, 0x2f, 0xfc, 0xf7, 0x5b, 0x7b,
+ 0x2d, 0xee, 0xe6, 0xfd, 0xdf, 0x7f, 0xff, 0x6f,
+ 0xf7, 0xdb, 0x6b, 0xb9, 0xa5, 0x2c, 0xbd, 0xfc,
+ 0xfa, 0xdf, 0xfe, 0xf5, 0xdd, 0xf7, 0xbd, 0x79,
+ 0xff, 0xe7, 0x9f, 0xff, 0xf7, 0xf9, 0xe6, 0x9b,
+ 0x6c, 0x72, 0x93, 0x4d, 0x3e, 0xff, 0x7f, 0xff,
+ 0x5d, 0x76, 0x79, 0x6f, 0xec, 0xff, 0xfc, 0xe3,
+ 0xef, 0x3e, 0xbe, 0xf8, 0xf2, 0x8b, 0x5f, 0x7c,
+ 0xf1, 0xc6, 0xdf, 0x5f, 0x3f, 0xfd, 0xf5, 0xbf,
+ 0x99, 0xf9, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xef,
+ 0xbf, 0xf7, 0xde, 0xf7, 0xde, 0xb3, 0xef, 0xff,
+ 0x7f, 0xd7, 0x7e, 0xfb, 0xcf, 0xa6, 0xfe, 0xbf,
+ 0xff, 0xef, 0xff, 0xff, 0xfb, 0x6f, 0xbe, 0xfd,
+ 0xed, 0xb7, 0xf7, 0xff, 0xff, 0xff, 0xb7, 0xdf,
+ 0xfe, 0xab, 0xb9, 0xff, 0xd3, 0x1f, 0xbf, 0xf5,
+ 0xf1, 0x47, 0x5f, 0x7d, 0xfc, 0xe3, 0x8f, 0x1f,
+ 0xfa, 0xff, 0xef, 0xb5, 0xd7, 0xfe, 0x6e, 0xd8,
+ 0xff, 0xd8, 0xef, 0xbb, 0xff, 0xf6, 0xf9, 0xe7,
+ 0x9f, 0xfd, 0xec, 0xf3, 0xc7, 0xba, 0xff, 0xed,
+ 0xd7, 0x5f, 0xdf, 0x98, 0xff, 0xbe, 0xff, 0xfd,
+ 0xfb, 0xdf, 0xff, 0xbf, 0x7e, 0xfa, 0x57, 0x4d,
+ 0xed, 0xf5, 0x75, 0xfe, 0xfb, 0xff, 0xdf, 0xff,
+ 0xe6, 0xff, 0xef, 0xf3, 0x8f, 0x3f, 0xff, 0xdc,
+ 0xa2, 0x8f, 0x3c, 0xf5, 0xd1, 0x63, 0x1f, 0x7d,
+ 0xfe, 0xd1, 0x47, 0x9f, 0xbf, 0xf9, 0xff, 0xe3,
+ 0xdf, 0x6f, 0xff, 0xfd, 0xf2, 0x8b, 0x2f, 0x7e,
+ 0xf9, 0xf5, 0xda, 0xff, 0x7e, 0xfd, 0xff, 0xff,
+ 0xff, 0x6f, 0xf8, 0xdf, 0xfe, 0xff, 0xcf, 0xff,
+ 0xbf, 0xbe, 0xfa, 0xeb, 0x5f, 0x7f, 0xfd, 0xff,
+ 0xbf, 0x5f, 0x7f, 0xfd, 0xf5, 0xff, 0x9b, 0xff,
+ 0xbf, 0xfe, 0xf9, 0xee, 0x9f, 0x2f, 0xfa, 0xfb,
+ 0xef, 0x3f, 0xff, 0xfd, 0xf5, 0xf5, 0x57, 0x5f,
+ 0x7d, 0xf5, 0xff, 0xe6, 0xfe, 0xef, 0xff, 0xff,
+ 0xfe, 0xff, 0xeb, 0xfe, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x7f, 0xf9, 0xf5, 0xff, 0xff, 0xff, 0xb7,
+ 0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f,
+ 0xff, 0xff, 0xfe, 0xff, 0xfd, 0x97, 0x9f, 0xfa,
+ 0xfb, 0xfd, 0xb7, 0xff, 0x6f, 0xfa, 0xff, 0xeb,
+ 0xaf, 0xbe, 0x7e, 0xf8, 0xcb, 0x2f, 0xbe, 0xfc,
+ 0x55, 0x97, 0x0b, 0x6d, 0xf9, 0xd5, 0xc6, 0x1b,
+ 0xff, 0x9a, 0xff, 0xff, 0xff, 0xf4, 0xef, 0x0f,
+ 0xbf, 0xff, 0xee, 0xb3, 0xbf, 0x7d, 0xf6, 0xb9,
+ 0xff, 0xf7, 0xfb, 0x3e, 0xf7, 0xde, 0xc6, 0xff,
+ 0xfe, 0x97, 0xff, 0xff, 0x7d, 0xff, 0xfb, 0xbb,
+ 0x6f, 0x7b, 0xf7, 0xd5, 0xb5, 0xbb, 0x7f, 0xaf,
+ 0xff, 0xef, 0x9f, 0xf9, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xfe, 0xd3, 0xf5, 0xd7, 0xdd, 0xff, 0xbb,
+ 0xef, 0xfe, 0xfe, 0x7f, 0xff, 0xff, 0xef, 0x6b,
+ 0xfe, 0xd7, 0xff, 0xff, 0xf3, 0xfd, 0xaf, 0xfb,
+ 0xfa, 0xeb, 0x5c, 0xfb, 0xfd, 0xed, 0xff, 0x7f,
+ 0xfc, 0xbd, 0x57, 0xff, 0x9b, 0xfd, 0xff, 0xff,
+ 0xff, 0xaf, 0xfd, 0xbd, 0xff, 0xfe, 0xf9, 0xdf,
+ 0xbf, 0xff, 0xfb, 0xdf, 0xf1, 0xaf, 0xff, 0x7e,
+ 0xff, 0xe6, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xf3,
+ 0xcf, 0xef, 0x7a, 0xfe, 0xec, 0xff, 0xff, 0xeb,
+ 0xdf, 0x73, 0x9f, 0x3f, 0xff, 0xbf, 0xf9, 0xff,
+ 0xf7, 0xbf, 0xff, 0xbf, 0xbe, 0xfa, 0xfb, 0x7f,
+ 0x9f, 0xff, 0xef, 0xfe, 0x5f, 0x7c, 0xdf, 0xf1,
+ 0xff, 0xf7, 0x6f, 0xee, 0xff, 0xb7, 0xdf, 0xff,
+ 0x7f, 0xff, 0xed, 0x7e, 0xff, 0xff, 0xf9, 0xf7,
+ 0x7f, 0xfe, 0xdb, 0xf7, 0xff, 0xfe, 0x7e, 0x9b,
+ 0xff, 0xff, 0xfe, 0xef, 0xbf, 0xfe, 0xdf, 0xdf,
+ 0xfb, 0xff, 0xfd, 0xff, 0x76, 0xfe, 0xd1, 0xef,
+ 0x1f, 0x7f, 0xec, 0xff, 0xa6, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xbf, 0xb7, 0xff, 0xff, 0xff, 0xdf,
+ 0xff, 0x7f, 0xff, 0xfb, 0xb7, 0xbf, 0x7d, 0xf7,
+ 0xbb, 0xd9, 0x7f, 0xef, 0xdf, 0xff, 0xdf, 0xb6,
+ 0x7b, 0x4f, 0x3d, 0xd7, 0xbd, 0xf7, 0xef, 0x7b,
+ 0xff, 0xf5, 0xe7, 0xd7, 0xff, 0x6f, 0xfc, 0xff,
+ 0xfd, 0xff, 0xcf, 0xad, 0xdf, 0xff, 0xf9, 0x67,
+ 0x3e, 0xb3, 0xf4, 0xff, 0x57, 0xb6, 0xff, 0xec,
+ 0xe7, 0xff, 0x99, 0xff, 0xff, 0xff, 0xff, 0xfd,
+ 0xfb, 0xef, 0xff, 0xfe, 0xfb, 0xdf, 0xbf, 0xff,
+ 0xdf, 0xfc, 0xff, 0x6f, 0xff, 0xfe, 0xfe, 0xa6,
+ 0x7f, 0xee, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff,
+ 0xff, 0xff, 0x77, 0xbe, 0xf9, 0xe5, 0x95, 0xd7,
+ 0x7c, 0xd9, 0xfd, 0xad, 0xd9, 0xcf, 0xfe, 0xff,
+ 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f,
+ 0xff, 0xfa, 0xf3, 0xfe, 0xf9, 0x6d, 0x9e, 0xff,
+ 0x6c, 0xfe, 0xff, 0xfe, 0x7f, 0xfa, 0xf9, 0xe7,
+ 0xfe, 0xff, 0xff, 0x7f, 0xff, 0xeb, 0x4f, 0x96,
+ 0x6b, 0x2e, 0x8b, 0xef, 0xff, 0x9b, 0xf5, 0xef,
+ 0xff, 0xdf, 0x3b, 0xff, 0xb9, 0xff, 0xff, 0xff,
+ 0xff, 0xbf, 0xfe, 0x9f, 0x5d, 0x96, 0xd3, 0xfd,
+ 0xf7, 0x57, 0xe6, 0xfe, 0x6d, 0xf6, 0xed, 0x57,
+ 0xf7, 0x7f, 0xbf, 0xfd, 0xf6, 0xb7, 0xff, 0xff,
+ 0xf9, 0xef, 0xbf, 0xf3, 0x5e, 0xaf, 0xbb, 0x99,
+ 0x2f, 0xae, 0xfd, 0xff, 0xd9, 0x6c, 0xef, 0x6f,
+ 0xbf, 0xfd, 0xcf, 0xfe, 0xff, 0xff, 0x7d, 0x35,
+ 0xd4, 0x52, 0xff, 0x6c, 0xec, 0xff, 0x5e, 0x3f,
+ 0x7b, 0xff, 0xff, 0xff, 0xfb, 0xef, 0x7f, 0xfb,
+ 0xff, 0xff, 0xd2, 0x5e, 0x6f, 0xbf, 0xf5, 0xbf,
+ 0x99, 0xfb, 0xef, 0xfc, 0xc3, 0xfb, 0xcf, 0xfc,
+ 0xfe, 0xfe, 0xfb, 0xff, 0xff, 0xff, 0xe7, 0x95,
+ 0x5f, 0xd2, 0x59, 0xfd, 0x6f, 0xc6, 0xbd, 0xdd,
+ 0x7f, 0xdb, 0xff, 0xf7, 0xff, 0xfe, 0xff, 0xff,
+ 0xfe, 0xff, 0xed, 0xf2, 0x8b, 0x2f, 0xbd, 0xec,
+ 0xff, 0xbd, 0x59, 0x9f, 0xe7, 0x9f, 0xfd, 0xf7,
+ 0xff, 0xf7, 0xfd, 0xff, 0xff, 0xff, 0xff, 0x3c,
+ 0xeb, 0xfc, 0xb3, 0xce, 0x7e, 0x7f, 0x6f, 0xec,
+ 0xff, 0xf4, 0xf3, 0xee, 0x3b, 0xd7, 0xfc, 0xfb,
+ 0xef, 0x7f, 0xff, 0xfd, 0xe6, 0x99, 0x6f, 0xb6,
+ 0x99, 0xf6, 0xbf, 0x99, 0xf9, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x9f, 0xcf, 0xbe, 0xf9, 0xe6, 0xbb, 0xe7, 0xce,
+ 0xe6, 0xfe, 0xbf, 0xff, 0xfe, 0xff, 0xbf, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xed, 0xb7,
+ 0xdf, 0x7e, 0xf7, 0xed, 0xbb, 0xb9, 0xff, 0xd7,
+ 0x4b, 0xff, 0xff, 0xfd, 0x6a, 0xff, 0xff, 0xf7,
+ 0xff, 0xc7, 0x3b, 0x5a, 0x28, 0xe3, 0x85, 0xdf,
+ 0xfe, 0x6e, 0xde, 0xff, 0xfb, 0xe2, 0xbf, 0xbf,
+ 0xb7, 0xd8, 0xef, 0xbf, 0xff, 0xfd, 0xf9, 0xcf,
+ 0x13, 0xff, 0x7c, 0xf1, 0xcd, 0xdf, 0x9b, 0xff,
+ 0xff, 0xdb, 0xff, 0xbb, 0xff, 0x2f, 0xfb, 0xff,
+ 0xff, 0xff, 0xfb, 0xfd, 0xd9, 0xdf, 0x77, 0x7d,
+ 0xaf, 0xfd, 0xf7, 0xe6, 0xff, 0xff, 0xf3, 0xcf,
+ 0x3e, 0xfb, 0xe8, 0xf3, 0xcf, 0x3f, 0xff, 0xf9,
+ 0xc7, 0x9f, 0x7f, 0xfc, 0x91, 0xc7, 0x9f, 0xbf,
+ 0xf9, 0xff, 0xff, 0xeb, 0xff, 0xff, 0xf9, 0xfa,
+ 0xef, 0xbf, 0xff, 0xfd, 0xef, 0x97, 0x7f, 0xff,
+ 0xfb, 0xcf, 0xdf, 0xff, 0x6f, 0xfe, 0xff, 0xff,
+ 0xfa, 0xff, 0xff, 0xbf, 0xfe, 0xfb, 0xef, 0x7f,
+ 0xff, 0xff, 0xf5, 0xd7, 0xdf, 0xff, 0xff, 0xfd,
+ 0xff, 0x9b, 0xff, 0xff, 0xfe, 0xfb, 0xeb, 0xfb,
+ 0xaf, 0xfe, 0xfa, 0xeb, 0x5f, 0xff, 0xfe, 0xf1,
+ 0xdf, 0x17, 0xff, 0xfd, 0xf5, 0xff, 0xe6, 0xff,
+ 0xff, 0xff, 0xff, 0xfe, 0xf6, 0xeb, 0xbf, 0xff,
+ 0xfe, 0xf7, 0xbf, 0xdf, 0x7f, 0xff, 0xff, 0xdf,
+ 0x7f, 0xff, 0xbd, 0xd9, 0xff, 0xff, 0xbf, 0xff,
+ 0xbf, 0xfc, 0xf2, 0xd3, 0x4f, 0x3f, 0xfa, 0xff,
+ 0xff, 0xbb, 0xfe, 0xba, 0xfd, 0xff, 0xff, 0x6f,
+ 0xfe, 0xff, 0xab, 0xaf, 0xbf, 0xfe, 0xea, 0xab,
+ 0xad, 0x17, 0xa4, 0xf1, 0xd3, 0x5e, 0x7f, 0xfd,
+ 0x75, 0x47, 0x5f, 0x1f, 0x9b, 0xcf, 0xff, 0xff,
+ 0xef, 0xef, 0xf7, 0xde, 0xff, 0xef, 0xef, 0x7f,
+ 0xff, 0xfa, 0xb9, 0x67, 0xbf, 0x7e, 0xfe, 0xf9,
+ 0xff, 0xa6, 0xfe, 0xfd, 0xff, 0xef, 0xcf, 0xbf,
+ 0xbd, 0xff, 0xeb, 0xbf, 0xff, 0x76, 0xdb, 0x6e,
+ 0x7d, 0xfb, 0x54, 0xcf, 0xff, 0x9f, 0xb9, 0x7f,
+ 0xdf, 0xfd, 0xf7, 0xdf, 0xff, 0xd7, 0xff, 0xf7,
+ 0xdd, 0xff, 0xbf, 0xef, 0xff, 0xf7, 0xff, 0xbf,
+ 0xdf, 0xff, 0x6f, 0xcc, 0xf7, 0xef, 0xff, 0xff,
+ 0xaf, 0xb7, 0xfc, 0xf3, 0xcf, 0x7d, 0x7b, 0xbc,
+ 0xff, 0xc7, 0x1b, 0x63, 0xad, 0xd7, 0xff, 0x19,
+ 0xff, 0xfb, 0xff, 0xff, 0xff, 0x57, 0xaf, 0x6d,
+ 0xff, 0xfd, 0x6f, 0xdf, 0xbf, 0x7f, 0xfd, 0xf5,
+ 0x5f, 0xdf, 0xfe, 0xdf, 0xe6, 0xff, 0xff, 0xff,
+ 0xfb, 0xf1, 0xbf, 0xe7, 0x9e, 0xf7, 0x7f, 0xf7,
+ 0x3f, 0x6f, 0xff, 0xfc, 0xf7, 0xdd, 0x7d, 0xe9,
+ 0xbf, 0xf1, 0x7f, 0xff, 0xff, 0xff, 0xaf, 0xfd,
+ 0xba, 0xdf, 0x7f, 0x67, 0xba, 0xed, 0xa7, 0xff,
+ 0x5f, 0xf6, 0xfd, 0xe7, 0xfd, 0x6b, 0xec, 0xff,
+ 0xff, 0x9f, 0xff, 0xbf, 0xfd, 0xdf, 0x7f, 0xff,
+ 0xd3, 0x9b, 0xbd, 0xf7, 0xfe, 0x7a, 0xfb, 0xe9,
+ 0xfc, 0xfa, 0x1b, 0xff, 0x8f, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0x3f, 0xfc, 0x7c, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x0d, 0x67, 0xfc, 0xff, 0xe6,
+ 0xff, 0xdf, 0xff, 0xef, 0x7f, 0xef, 0xbf, 0xde,
+ 0xff, 0xf5, 0xff, 0xfb, 0xff, 0xf7, 0xdf, 0xff,
+ 0xee, 0x7f, 0xfb, 0xbf, 0xa9, 0xff, 0xff, 0xff,
+ 0xaf, 0xff, 0x6d, 0xf7, 0xcf, 0xda, 0xfb, 0xd3,
+ 0xf5, 0xd7, 0x4f, 0x3f, 0x79, 0xf5, 0x97, 0xff,
+ 0x6f, 0xfe, 0xff, 0xf9, 0xf7, 0x4f, 0x7f, 0xfd,
+ 0x73, 0xfb, 0xed, 0xfd, 0xff, 0x7d, 0x77, 0xde,
+ 0x7d, 0x7f, 0xfd, 0xff, 0xff, 0x9b, 0xff, 0xf7,
+ 0xfb, 0xff, 0xdb, 0xff, 0xff, 0xbf, 0xfe, 0xfd,
+ 0xff, 0xbf, 0xff, 0xf5, 0xfb, 0xdf, 0xff, 0xfd,
+ 0xdf, 0xff, 0x86, 0xff, 0xef, 0xfc, 0xff, 0xcb,
+ 0x6a, 0xaa, 0xaf, 0xe7, 0xf2, 0xfd, 0xd2, 0xfe,
+ 0xcf, 0xe7, 0xff, 0x7f, 0xf8, 0xff, 0x8f, 0xd9,
+ 0xff, 0x3e, 0xff, 0xff, 0xbe, 0x9e, 0xea, 0xeb,
+ 0xac, 0x7f, 0x3f, 0xb7, 0xd7, 0x4b, 0x7f, 0xfd,
+ 0xe5, 0xf7, 0xff, 0x6d, 0xfe, 0xff, 0xfe, 0xff,
+ 0xff, 0xaf, 0xa6, 0x9e, 0xfa, 0xab, 0xdf, 0x7a,
+ 0xbd, 0xf5, 0x56, 0x5b, 0x6f, 0x9d, 0xf7, 0xff,
+ 0x9b, 0xf5, 0xef, 0xff, 0xff, 0x7f, 0xeb, 0xac,
+ 0xbf, 0x9e, 0xfa, 0x67, 0x53, 0xaf, 0xbf, 0xfe,
+ 0xfa, 0xeb, 0x67, 0xfd, 0xd7, 0xe6, 0xfe, 0x6f,
+ 0xf6, 0xfd, 0xbf, 0x9a, 0x69, 0xa5, 0x99, 0x76,
+ 0xbf, 0xf7, 0x4a, 0x2b, 0xfd, 0x35, 0xd3, 0x7e,
+ 0xab, 0xbb, 0x99, 0xff, 0x6e, 0xfd, 0xff, 0xbf,
+ 0x7a, 0xaa, 0xa9, 0xa6, 0xca, 0xef, 0x57, 0xfb,
+ 0xea, 0xbf, 0xef, 0x3e, 0x73, 0xed, 0x6c, 0xec,
+ 0xff, 0x56, 0x3f, 0xff, 0xaf, 0xa7, 0xfa, 0x2e,
+ 0xeb, 0xf5, 0x2e, 0xf5, 0xff, 0xfe, 0xf7, 0x8f,
+ 0xff, 0xd7, 0xbe, 0x99, 0xf9, 0xef, 0xfc, 0xc3,
+ 0xff, 0x2b, 0xa9, 0xfd, 0xf6, 0x0a, 0xff, 0x4b,
+ 0x7f, 0x2d, 0xb4, 0xd7, 0x58, 0x7b, 0x2f, 0xef,
+ 0xa6, 0xfd, 0xdf, 0x7f, 0xff, 0xcf, 0xf7, 0xde,
+ 0x76, 0xf3, 0xed, 0x7e, 0xff, 0xdf, 0x77, 0xdf,
+ 0x7d, 0xff, 0xfd, 0xc2, 0xbd, 0x79, 0xff, 0xe7,
+ 0x9f, 0xff, 0xf7, 0xf9, 0x67, 0x9e, 0x7d, 0xc6,
+ 0xbb, 0xfc, 0xf7, 0xd9, 0x65, 0x9f, 0x7d, 0x3e,
+ 0x73, 0x6b, 0xec, 0xff, 0xfc, 0x73, 0xed, 0x33,
+ 0xdd, 0xf8, 0xc3, 0x4c, 0x77, 0x76, 0xfd, 0xf4,
+ 0xd3, 0x4f, 0x3f, 0xbd, 0xc6, 0xbf, 0x99, 0xf9,
+ 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf3, 0xdf, 0xbf,
+ 0xff, 0xfc, 0xff, 0x77, 0x7b, 0x6d, 0xb3, 0xc7,
+ 0xbe, 0xef, 0xcf, 0xe6, 0xfe, 0xbf, 0xff, 0xfe,
+ 0xff, 0xef, 0xfe, 0xfd, 0xff, 0xdb, 0xff, 0xff,
+ 0xdf, 0x7e, 0xdb, 0x6d, 0xb7, 0xfd, 0xff, 0xbb,
+ 0xa9, 0x7f, 0xd2, 0x5f, 0xbf, 0xbd, 0xf1, 0xc6,
+ 0x5f, 0x2f, 0xfc, 0xf7, 0xff, 0xd7, 0x5e, 0x7b,
+ 0xad, 0xb5, 0x17, 0xfe, 0x6a, 0xd8, 0xbf, 0xf8,
+ 0xef, 0xbb, 0x2f, 0xbe, 0xf8, 0x62, 0x8b, 0xf7,
+ 0xfc, 0xf7, 0xdf, 0x7f, 0xfd, 0xfd, 0xf7, 0xc4,
+ 0xdf, 0x9b, 0xff, 0xaf, 0xff, 0xff, 0xfe, 0xab,
+ 0xad, 0xbf, 0xfe, 0x6a, 0x7d, 0xfb, 0xff, 0xff,
+ 0xff, 0xff, 0xfb, 0xff, 0xff, 0xef, 0xe6, 0xbf,
+ 0xeb, 0xf3, 0xcf, 0x3e, 0xfe, 0xcc, 0xa3, 0x8f,
+ 0x3e, 0xff, 0xf9, 0x47, 0x0f, 0x7d, 0xf4, 0xd1,
+ 0xe7, 0x9e, 0xbf, 0xf9, 0xff, 0xf2, 0xff, 0xef,
+ 0xbf, 0xfc, 0xf2, 0xcb, 0x3f, 0x7f, 0xf3, 0xb5,
+ 0xff, 0xef, 0xff, 0xff, 0xff, 0x9f, 0xff, 0x6f,
+ 0xfe, 0xbf, 0xfc, 0xff, 0xef, 0xbf, 0xbf, 0xfd,
+ 0xf2, 0xcf, 0x7f, 0x7f, 0xfd, 0xf5, 0xd7, 0x5f,
+ 0x7f, 0xfd, 0xf5, 0xdf, 0x9b, 0xff, 0xaf, 0xfe,
+ 0xfb, 0xeb, 0x8f, 0xbf, 0xfe, 0xfb, 0xeb, 0x7f,
+ 0x5f, 0x7f, 0xb5, 0xd5, 0x57, 0x5f, 0xfd, 0xf3,
+ 0xff, 0xe6, 0xff, 0xeb, 0xff, 0xbf, 0xff, 0xfa,
+ 0xeb, 0xaf, 0xbf, 0xfe, 0xef, 0xd7, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xdf, 0xff, 0xbf, 0xf9, 0xff,
+ 0xff, 0xff, 0xff, 0xbf, 0xfc, 0xf6, 0xff, 0xef,
+ 0x7d, 0xf3, 0xe9, 0xf6, 0x97, 0x7e, 0xfa, 0xc9,
+ 0xfe, 0xff, 0x6d, 0xfa, 0xff, 0xeb, 0xa7, 0xbe,
+ 0xde, 0x7a, 0x6b, 0xaf, 0xbe, 0xd4, 0xe1, 0xd6,
+ 0x5f, 0x7a, 0xbd, 0x55, 0xc7, 0x1f, 0xfc, 0x9a,
+ 0xff, 0xff, 0xff, 0xff, 0x3b, 0x6f, 0xed, 0xff,
+ 0xfc, 0xfd, 0x97, 0xff, 0xf7, 0xfe, 0x7b, 0x7a,
+ 0xff, 0xff, 0xfd, 0xef, 0xc6, 0xff, 0xfe, 0xff,
+ 0xff, 0xff, 0xeb, 0xfd, 0xda, 0xff, 0xfb, 0xfb,
+ 0xff, 0xff, 0xff, 0xbb, 0x6f, 0xff, 0xfd, 0xff,
+ 0x9f, 0xf9, 0xff, 0xff, 0xff, 0xbf, 0xef, 0xf7,
+ 0x3f, 0xce, 0xf7, 0xfc, 0xfd, 0xff, 0xff, 0xff,
+ 0xff, 0xbf, 0xbf, 0xef, 0xff, 0x6f, 0xfe, 0xff,
+ 0x7f, 0xff, 0xeb, 0x6f, 0x9f, 0xbe, 0xfe, 0xcb,
+ 0x5e, 0x66, 0xbd, 0xb5, 0x53, 0x5f, 0xff, 0xbd,
+ 0xf5, 0x7f, 0x9b, 0xff, 0xff, 0xff, 0xfb, 0xfb,
+ 0xef, 0x9f, 0xdf, 0xde, 0xf7, 0xbf, 0xdf, 0x76,
+ 0xfd, 0xf7, 0xdd, 0xb7, 0x5f, 0xdd, 0xff, 0xe6,
+ 0xff, 0xff, 0xff, 0xb7, 0xff, 0xff, 0xef, 0xbf,
+ 0x3f, 0xfc, 0xb1, 0xff, 0xf7, 0x7f, 0xbb, 0xfd,
+ 0xff, 0xff, 0xbf, 0xbf, 0xf9, 0xf7, 0xff, 0x9f,
+ 0xfd, 0xff, 0xf7, 0xdc, 0xfb, 0xf5, 0x3b, 0xbd,
+ 0xff, 0xf7, 0xff, 0xfd, 0xdb, 0xff, 0xfe, 0xff,
+ 0x6f, 0xee, 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xfc,
+ 0xfe, 0xf3, 0xff, 0xe7, 0xff, 0xb7, 0xfd, 0xff,
+ 0xf7, 0xf9, 0xf7, 0xfe, 0x7f, 0x9b, 0xff, 0xff,
+ 0xff, 0xff, 0xfc, 0xf7, 0xcf, 0x53, 0x6f, 0xff,
+ 0xe7, 0x9e, 0x7e, 0x7c, 0xbf, 0xff, 0xed, 0x7f,
+ 0x7c, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xbf, 0xbd,
+ 0xfd, 0xad, 0xbf, 0xfe, 0xff, 0xef, 0xdf, 0x7f,
+ 0xdf, 0xff, 0xff, 0xfe, 0xfd, 0xfe, 0xbb, 0xf9,
+ 0xff, 0xfb, 0xeb, 0x7f, 0xff, 0xff, 0xbd, 0xef,
+ 0xb3, 0xf6, 0xdc, 0xf2, 0xff, 0xff, 0xbf, 0xdd,
+ 0xf7, 0xfe, 0xfd, 0x6e, 0xf4, 0x7f, 0xfd, 0xe3,
+ 0x5f, 0x7f, 0xfa, 0xff, 0xdb, 0x6a, 0xfb, 0xff,
+ 0xff, 0x27, 0xff, 0x3f, 0xff, 0xbc, 0xff, 0xbf,
+ 0x99, 0xff, 0xff, 0xff, 0xfe, 0xef, 0x7f, 0xff,
+ 0x3f, 0xfb, 0x7e, 0xf7, 0xdf, 0xef, 0xfd, 0xdf,
+ 0xdf, 0x7f, 0xff, 0xf7, 0xff, 0xa6, 0x7f, 0x7e,
+ 0x7f, 0xff, 0xff, 0xde, 0xab, 0x7c, 0xfc, 0xfb,
+ 0x75, 0x5e, 0xf8, 0x7d, 0xe3, 0xbd, 0x5a, 0xf3,
+ 0xfd, 0xaf, 0xd9, 0x9f, 0xff, 0xff, 0xf9, 0xbf,
+ 0xff, 0xfe, 0xff, 0x7f, 0x7f, 0xbf, 0xee, 0xfa,
+ 0xcb, 0x7d, 0x9f, 0xfd, 0xfc, 0xfe, 0x6d, 0xfe,
+ 0xff, 0x9f, 0xfa, 0xff, 0xef, 0xbf, 0x92, 0x6f,
+ 0x79, 0x5f, 0xe7, 0x9f, 0xc5, 0xf7, 0x7b, 0x6f,
+ 0xf7, 0xcf, 0xdf, 0x1b, 0xf5, 0xff, 0xbf, 0xfe,
+ 0xff, 0xfb, 0xa9, 0xbf, 0xff, 0x7f, 0xd7, 0xff,
+ 0x67, 0xfd, 0xfd, 0xda, 0x6b, 0xff, 0xf7, 0x57,
+ 0xc6, 0xfe, 0x7d, 0xff, 0xff, 0xf7, 0xde, 0x6b,
+ 0xb7, 0xdb, 0x37, 0xbd, 0xb7, 0xde, 0x79, 0xff,
+ 0xbd, 0xdf, 0x4f, 0xfb, 0xbb, 0x99, 0xbf, 0xff,
+ 0xbf, 0xff, 0xbe, 0xfb, 0x6a, 0xec, 0xf7, 0x46,
+ 0xf7, 0xe6, 0x5f, 0xcb, 0x7d, 0xef, 0x7d, 0xd1,
+ 0xfe, 0x6c, 0xec, 0xff, 0x5b, 0x3a, 0xbf, 0xef,
+ 0xb3, 0xfa, 0x73, 0x3e, 0xd5, 0xdd, 0xff, 0x9d,
+ 0xf2, 0x7e, 0x2f, 0xef, 0xf5, 0xbe, 0x99, 0xf9,
+ 0xff, 0xbd, 0xce, 0xdf, 0x3b, 0xa5, 0xbd, 0x9e,
+ 0x1f, 0xd7, 0x7a, 0xfc, 0xed, 0xfd, 0xdf, 0x78,
+ 0x7b, 0x0d, 0x6f, 0x46, 0xfd, 0xff, 0xf6, 0xff,
+ 0xfd, 0xb7, 0xdf, 0xfe, 0xe3, 0x6d, 0x6e, 0xfd,
+ 0xed, 0xb2, 0xdf, 0x7f, 0xf7, 0xff, 0xf3, 0xbd,
+ 0x71, 0xff, 0x7f, 0xff, 0x7d, 0xfe, 0x59, 0x67,
+ 0xfd, 0x7f, 0xf6, 0xb3, 0xde, 0x3e, 0xfb, 0xaf,
+ 0x9f, 0xdf, 0x3f, 0x6b, 0x6b, 0xec, 0xd7, 0x3e,
+ 0xbb, 0x0f, 0x3f, 0xcd, 0x68, 0xdb, 0x8d, 0x7b,
+ 0xb0, 0x7d, 0x07, 0xdf, 0x57, 0x7f, 0xfd, 0x67,
+ 0xbb, 0x99, 0xf9, 0xff, 0xef, 0xff, 0xff, 0xff,
+ 0xf6, 0xfb, 0xbf, 0xff, 0xff, 0xfd, 0xff, 0xef,
+ 0xff, 0xf7, 0xdf, 0xff, 0xcf, 0xce, 0xe6, 0xfe,
+ 0xff, 0xff, 0xff, 0xff, 0xef, 0xfe, 0xff, 0xff,
+ 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xed, 0xf7,
+ 0xff, 0xed, 0xbb, 0xb9, 0xdf, 0xdb, 0x6b, 0x7f,
+ 0x9c, 0xd4, 0xd3, 0xbf, 0x2f, 0xfd, 0xa9, 0xb7,
+ 0x3f, 0x5a, 0xff, 0xef, 0xbf, 0x7f, 0xfe, 0x6e,
+ 0xde, 0xff, 0x5a, 0xe2, 0xbf, 0x2f, 0x9e, 0xf9,
+ 0x7f, 0x8b, 0xdf, 0x7c, 0xf1, 0xcf, 0x97, 0xfb,
+ 0xed, 0xd7, 0xcf, 0xdf, 0x9b, 0xff, 0xef, 0xbf,
+ 0xfe, 0xf7, 0xff, 0xbf, 0xf7, 0xfd, 0x7a, 0xd7,
+ 0xdf, 0x77, 0xf9, 0xfe, 0xd7, 0xfb, 0x7f, 0xf5,
+ 0xff, 0xe6, 0xff, 0xfb, 0xa3, 0xcb, 0x3f, 0xff,
+ 0xf8, 0xf1, 0x8f, 0x3e, 0xfd, 0xf8, 0x47, 0x9f,
+ 0x7f, 0x74, 0xf9, 0x45, 0x87, 0xbf, 0xf9, 0xff,
+ 0xfb, 0xff, 0xff, 0xbf, 0xfc, 0xf3, 0x9d, 0x2f,
+ 0xfe, 0xf9, 0xf6, 0x9f, 0x5f, 0x7f, 0xfd, 0xf5,
+ 0x97, 0xef, 0x6f, 0xfe, 0xff, 0xfe, 0xff, 0xfe,
+ 0x2f, 0xbf, 0xfc, 0xff, 0xeb, 0xdf, 0x7e, 0xfd,
+ 0xf7, 0xd7, 0x5f, 0x5f, 0x7d, 0x65, 0xfd, 0x9b,
+ 0xff, 0xee, 0xfe, 0xeb, 0xef, 0xbf, 0xbf, 0xb6,
+ 0xff, 0xeb, 0x5f, 0xdb, 0xfd, 0xf1, 0xff, 0x7f,
+ 0x5d, 0xf5, 0xb7, 0xff, 0x86, 0xff, 0xfb, 0xff,
+ 0xff, 0xff, 0xff, 0xfb, 0x7f, 0xbf, 0xfe, 0xfc,
+ 0xfe, 0x7f, 0xff, 0xfb, 0xff, 0xd7, 0xff, 0xf7,
+ 0xbf, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff,
+ 0xfe, 0xfb, 0x6f, 0x7f, 0xf9, 0xe9, 0xff, 0x9e,
+ 0x7e, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xf6, 0xff,
+ 0xcb, 0xaf, 0xbf, 0xda, 0xba, 0x6b, 0x8f, 0xbe,
+ 0xae, 0xd0, 0x07, 0x5f, 0x75, 0xfc, 0xb5, 0xd7,
+ 0x5e, 0xff, 0x9b, 0xfe, 0xff, 0xff, 0xdf, 0xaf,
+ 0x8f, 0x3e, 0x7d, 0xf7, 0xd0, 0x9e, 0xbe, 0xfa,
+ 0xfd, 0xef, 0x6f, 0xff, 0xff, 0xbb, 0xff, 0xc6,
+ 0xfb, 0xff, 0xfb, 0xdb, 0x7f, 0x3e, 0xbb, 0xfb,
+ 0xff, 0xdf, 0xff, 0xef, 0x6f, 0xff, 0x6e, 0xff,
+ 0xfd, 0xb7, 0xfd, 0x9f, 0xf9, 0xef, 0xff, 0x7f,
+ 0xff, 0x77, 0xff, 0x7d, 0xff, 0xab, 0x7f, 0xad,
+ 0xff, 0xfb, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff,
+ 0x6f, 0xfe, 0x3f, 0xde, 0xf8, 0xff, 0x7f, 0x3f,
+ 0xba, 0x72, 0xd3, 0x55, 0xbb, 0xbf, 0xc6, 0xff,
+ 0x6f, 0x6e, 0x71, 0x59, 0xff, 0x99, 0x7f, 0xdf,
+ 0xbf, 0xff, 0xff, 0xfd, 0xfd, 0xbf, 0xf9, 0xff,
+ 0xbf, 0xef, 0xfd, 0x7e, 0xff, 0xff, 0xff, 0xfe,
+ 0xef, 0xff, 0xe6, 0xef, 0xdf, 0xff, 0xff, 0xff,
+ 0xb9, 0xfa, 0xbe, 0xff, 0xbc, 0xb0, 0xfe, 0x7f,
+ 0xfa, 0xff, 0xb5, 0xc1, 0xff, 0xfb, 0xb7, 0xf9,
+ 0xff, 0xff, 0x7f, 0x7f, 0xbf, 0x7d, 0xff, 0x73,
+ 0xff, 0xbf, 0xbf, 0xff, 0xff, 0xff, 0x77, 0xfe,
+ 0xdf, 0xfd, 0xff, 0x6d, 0xf6, 0xff, 0xfb, 0x7f,
+ 0xff, 0xef, 0xf7, 0xdb, 0xee, 0xdd, 0xfb, 0xfd,
+ 0x6f, 0xcf, 0xff, 0xdf, 0xf7, 0xff, 0x1f, 0xff,
+ 0x9a, 0x5f, 0xff, 0x3f, 0xff, 0xff, 0xf3, 0xfe,
+ 0x3f, 0xcf, 0xaf, 0x55, 0x9b, 0xf7, 0xff, 0xf9,
+ 0xef, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xfe, 0xff,
+ 0xcf, 0xff, 0xf7, 0xfb, 0xbf, 0xbe, 0xfe, 0xff,
+ 0xff, 0x51, 0xe7, 0x6d, 0x5e, 0xef, 0xfe, 0xff,
+ 0xfd, 0xbf, 0xf9, 0xef, 0xba, 0xeb, 0xfe, 0x79,
+ 0xed, 0xdb, 0xe3, 0xfe, 0xd5, 0xfd, 0xf5, 0x9e,
+ 0xff, 0x7f, 0xf9, 0xf5, 0xd7, 0xf7, 0x6a, 0xf4,
+ 0xff, 0xfe, 0xfb, 0xff, 0xfd, 0xdf, 0x6f, 0x7f,
+ 0xeb, 0xff, 0xdf, 0xff, 0xeb, 0xfd, 0x5f, 0xfe,
+ 0xf1, 0xf7, 0xfd, 0x9b, 0xff, 0xdf, 0x7f, 0xff,
+ 0xff, 0x7f, 0xef, 0xff, 0xff, 0xff, 0xf7, 0xff,
+ 0xff, 0xf7, 0x7f, 0xff, 0xbb, 0xff, 0xfd, 0xff,
+ 0x86, 0xff, 0xbb, 0xff, 0xb1, 0x5f, 0x6a, 0xea,
+ 0xaf, 0xe7, 0x5b, 0xd5, 0xff, 0xf3, 0x4f, 0xfd,
+ 0xcf, 0x3a, 0xdf, 0xfd, 0x8f, 0xd9, 0xff, 0xee,
+ 0xff, 0xec, 0xd7, 0xfb, 0xfa, 0xeb, 0xff, 0x64,
+ 0xf5, 0x7f, 0xfe, 0xd3, 0xff, 0x9b, 0xff, 0xf7,
+ 0xff, 0x6d, 0xfe, 0xf7, 0xfc, 0xff, 0x7b, 0xa9,
+ 0xe5, 0xff, 0xfb, 0xff, 0xfc, 0xe6, 0x2b, 0xff,
+ 0xf2, 0x53, 0x4b, 0xf5, 0xdf, 0xff, 0x9b, 0xf5,
+ 0xb5, 0xff, 0xff, 0x7e, 0xeb, 0xff, 0xa7, 0xce,
+ 0xff, 0xff, 0x9f, 0xcf, 0xff, 0x7f, 0xd6, 0x59,
+ 0x7f, 0xff, 0xd7, 0xe6, 0xfe, 0xbb, 0xff, 0xbd,
+ 0xb7, 0xda, 0x69, 0xff, 0xd5, 0x77, 0x85, 0x3f,
+ 0x6a, 0x2f, 0xed, 0xf5, 0xff, 0x7f, 0xfb, 0xbb,
+ 0x99, 0xff, 0xfe, 0xbf, 0xef, 0xbe, 0x2a, 0xea,
+ 0xbf, 0xf7, 0x46, 0xd9, 0x5e, 0x5b, 0xcd, 0xad,
+ 0xb7, 0xd4, 0x1f, 0xff, 0x6c, 0xec, 0xff, 0xd6,
+ 0x3f, 0xfb, 0xaf, 0xfe, 0xdf, 0x4f, 0xfa, 0xfd,
+ 0xeb, 0xeb, 0xfd, 0x77, 0x5b, 0xff, 0xef, 0xd7,
+ 0xbf, 0x99, 0xf8, 0xbf, 0xed, 0x53, 0xce, 0x7f,
+ 0xff, 0xc4, 0xb7, 0x4f, 0x36, 0xf1, 0xe4, 0xfd,
+ 0x3f, 0xfc, 0x5f, 0xff, 0xeb, 0xef, 0xe6, 0xfd,
+ 0x7f, 0x7e, 0xff, 0xfd, 0xb7, 0xdd, 0xff, 0xff,
+ 0x2d, 0x7e, 0xbf, 0xff, 0xe7, 0xcb, 0x7e, 0xfb,
+ 0xed, 0xe7, 0xbd, 0x79, 0xff, 0x2e, 0x9f, 0x7f,
+ 0xfe, 0xd9, 0x67, 0xff, 0x7d, 0xfe, 0xb7, 0x8e,
+ 0xfe, 0xf3, 0xec, 0xb7, 0xff, 0x3e, 0x73, 0x6f,
+ 0xec, 0xbf, 0xfe, 0xd3, 0xcf, 0x3f, 0xda, 0xbc,
+ 0x1b, 0xcd, 0x7f, 0xf6, 0xd9, 0xf7, 0x1f, 0x6c,
+ 0xdf, 0x2d, 0xd6, 0xbf, 0x99, 0xf9, 0xef, 0xfd,
+ 0xff, 0xff, 0xfd, 0xfe, 0xdf, 0x7f, 0xff, 0xff,
+ 0xee, 0xbf, 0xff, 0xbe, 0xf9, 0xef, 0xff, 0xff,
+ 0xcf, 0xa6, 0xfe, 0xdb, 0xff, 0xfe, 0xeb, 0xff,
+ 0xbf, 0xfe, 0xef, 0xfb, 0xdf, 0x7d, 0xfd, 0xf7,
+ 0x7f, 0xdf, 0xfd, 0xff, 0xff, 0xbb, 0xb9, 0xdf,
+ 0xdf, 0x4f, 0x2f, 0xbd, 0xf1, 0xd7, 0xff, 0x7f,
+ 0xfc, 0xa3, 0xc5, 0xf7, 0xdf, 0x7a, 0xfd, 0xb5,
+ 0x97, 0xfe, 0x6a, 0xd8, 0xfd, 0xeb, 0xe3, 0x8b,
+ 0x2d, 0x96, 0xf8, 0xe7, 0x9d, 0xfd, 0x6c, 0xf5,
+ 0xdd, 0x1b, 0x5f, 0xec, 0xf5, 0xcd, 0xdf, 0x9b,
+ 0xff, 0xaf, 0xff, 0xfe, 0xfa, 0xeb, 0xaf, 0xff,
+ 0xdf, 0xff, 0xbd, 0x5f, 0xee, 0xbf, 0xf5, 0xfe,
+ 0x5f, 0xef, 0xff, 0xff, 0xe6, 0xff, 0xeb, 0xb3,
+ 0x87, 0x0e, 0xf6, 0xe8, 0xf3, 0xcf, 0x1d, 0x7f,
+ 0xd1, 0xc7, 0x1f, 0x3d, 0xfe, 0xd0, 0xe7, 0x9f,
+ 0xbf, 0xf9, 0xff, 0xfa, 0xcf, 0xa7, 0x9f, 0xfc,
+ 0xfa, 0xcf, 0x7f, 0xde, 0xff, 0xe7, 0xf7, 0xdf,
+ 0x3f, 0xb9, 0xf6, 0xb7, 0xff, 0x6f, 0xfe, 0xbf,
+ 0xfe, 0xf3, 0xeb, 0x3b, 0xbf, 0xfe, 0xf7, 0xfe,
+ 0xff, 0x5f, 0xff, 0xfd, 0xdf, 0x5f, 0x7f, 0xff,
+ 0xe5, 0xff, 0x98, 0xff, 0xff, 0xfe, 0xda, 0x2a,
+ 0xaf, 0xff, 0xfe, 0xfb, 0x6f, 0x5f, 0x5d, 0xfc,
+ 0xf7, 0xdf, 0x3e, 0xff, 0xfd, 0xf7, 0xff, 0xe6,
+ 0xff, 0xff, 0xbf, 0xb7, 0xee, 0xfa, 0xeb, 0xff,
+ 0xbb, 0xff, 0xf7, 0xf7, 0xff, 0xfe, 0xff, 0xff,
+ 0xfe, 0xff, 0xff, 0x8f, 0xf9, 0xff, 0xe6, 0xff,
+ 0xef, 0xbf, 0xff, 0xff, 0xca, 0xeb, 0x3f, 0xfa,
+ 0xe5, 0x97, 0xdf, 0x7d, 0xf7, 0xad, 0xb5, 0xff,
+ 0x6f, 0xfa, 0xff, 0xab, 0xaf, 0xbf, 0xe6, 0xfa,
+ 0x63, 0x2e, 0xb6, 0xce, 0x75, 0xc7, 0x5d, 0x75,
+ 0xfd, 0xe1, 0x87, 0x5f, 0xef, 0x9a, 0xbf, 0x0f,
+ 0xfe, 0xf8, 0xe1, 0x4f, 0x37, 0xfd, 0xef, 0xbb,
+ 0xdd, 0x7d, 0xfa, 0xff, 0xef, 0x8f, 0x8f, 0x7d,
+ 0xde, 0xff, 0xc6, 0xff, 0x6b, 0xef, 0xb7, 0xbb,
+ 0xff, 0xeb, 0x7f, 0xdb, 0xcc, 0x7f, 0x7e, 0xfb,
+ 0x77, 0xdf, 0xf6, 0xff, 0xff, 0xb3, 0x9f, 0xe9,
+ 0xff, 0xff, 0x77, 0xdf, 0xbf, 0xf6, 0xff, 0xff,
+ 0xf7, 0xfe, 0xfd, 0xf5, 0xfd, 0xef, 0x3f, 0xf7,
+ 0xff, 0xfb, 0xbf, 0x6b, 0xfe, 0xff, 0xde, 0xff,
+ 0xdf, 0x0f, 0x37, 0xf6, 0xfa, 0xeb, 0x1c, 0x7e,
+ 0x9d, 0xf5, 0xf7, 0x5b, 0xef, 0xf5, 0xf5, 0xff,
+ 0x9b, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0xdf,
+ 0x7f, 0xfe, 0xfb, 0xff, 0x3f, 0xff, 0x5c, 0xf7,
+ 0xad, 0xff, 0xff, 0x73, 0xff, 0x66, 0xbf, 0xff,
+ 0xff, 0xf7, 0xff, 0xff, 0xff, 0x3b, 0xbd, 0xff,
+ 0x71, 0xff, 0xff, 0xff, 0xdf, 0xbf, 0xc7, 0xdd,
+ 0xff, 0xbf, 0xd9, 0xfb, 0xf7, 0xff, 0xff, 0xfc,
+ 0xff, 0xdf, 0xf3, 0xee, 0xdd, 0xfb, 0xfe, 0xfe,
+ 0xff, 0xfe, 0x7f, 0xef, 0xff, 0xfd, 0x6f, 0xfe,
+ 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xbb,
+ 0xbb, 0xff, 0xf7, 0x7f, 0xff, 0xff, 0xff, 0xef,
+ 0xbf, 0x1f, 0xf3, 0x9b, 0xff, 0x8f, 0xff, 0xff,
+ 0xbf, 0xbf, 0x77, 0xeb, 0xb9, 0xff, 0xef, 0x0f,
+ 0x77, 0xdc, 0xf0, 0xff, 0xff, 0x7f, 0xfc, 0xff,
+ 0xe6, 0xff, 0xdf, 0xff, 0xfe, 0xfb, 0xff, 0xff,
+ 0xfd, 0xf6, 0xff, 0xef, 0xbf, 0x6f, 0xff, 0x3b,
+ 0xff, 0xfb, 0xb7, 0xed, 0xbb, 0xf9, 0xb7, 0xfa,
+ 0xe9, 0xaf, 0xb3, 0xce, 0xb2, 0xed, 0xff, 0xd3,
+ 0xff, 0x7e, 0x97, 0x4d, 0xff, 0x7f, 0xf6, 0x9f,
+ 0xff, 0x6f, 0xfc, 0xff, 0xfe, 0x7b, 0xee, 0xff,
+ 0xfd, 0xff, 0xd3, 0xe9, 0xff, 0xdb, 0xfd, 0xf7,
+ 0xdf, 0xfd, 0xfd, 0xfd, 0xee, 0xff, 0x99, 0xfd,
+ 0xbf, 0x7d, 0xff, 0xfb, 0xff, 0xff, 0x3f, 0xfb,
+ 0xff, 0xff, 0xbf, 0xfb, 0xfe, 0xf7, 0xff, 0x9f,
+ 0x7f, 0xff, 0xfd, 0xa6, 0xff, 0xaf, 0xb9, 0xe6,
+ 0xfa, 0xfb, 0x6f, 0x79, 0xf0, 0x9b, 0xdf, 0x57,
+ 0x5f, 0x7d, 0xf5, 0xed, 0xba, 0xdf, 0xfd, 0x8d,
+ 0xd9, 0xff, 0xf6, 0xfb, 0xef, 0xbf, 0xff, 0x3e,
+ 0xff, 0xfc, 0xd7, 0xeb, 0xef, 0xbf, 0xff, 0x7e,
+ 0x9f, 0xbd, 0xb7, 0xff, 0x6d, 0xfe, 0xb7, 0xdd,
+ 0x66, 0xbb, 0xed, 0xb7, 0xff, 0x4f, 0x3e, 0xf5,
+ 0xef, 0xbf, 0xff, 0xfe, 0x79, 0xff, 0xfb, 0xfd,
+ 0xbf, 0x9b, 0xf7, 0xb5, 0xd7, 0x5e, 0x7b, 0xed,
+ 0xb5, 0xff, 0xcf, 0xff, 0xff, 0x4b, 0x2f, 0xbd,
+ 0x74, 0xde, 0x9f, 0x7d, 0xff, 0xd7, 0xe6, 0xbe,
+ 0x2d, 0xb6, 0xd4, 0x66, 0x5b, 0x6d, 0xa6, 0xbf,
+ 0xf7, 0xbf, 0xd7, 0x4e, 0x2f, 0xfd, 0xfc, 0xd7,
+ 0x6f, 0x2b, 0xbb, 0xb9, 0x5f, 0x5e, 0x79, 0xe7,
+ 0x95, 0x77, 0xde, 0xab, 0xff, 0x5e, 0xb7, 0xbe,
+ 0xf8, 0xed, 0x17, 0xf7, 0x5d, 0xd9, 0xec, 0x6c,
+ 0xee, 0xbf, 0xdf, 0x5e, 0xfa, 0xef, 0xa5, 0xf7,
+ 0xfa, 0xbf, 0xf9, 0xf9, 0xef, 0xff, 0xff, 0x7f,
+ 0x2f, 0xad, 0xff, 0xbf, 0x99, 0xfb, 0xbf, 0xed,
+ 0xb6, 0xdb, 0x6f, 0xb8, 0xb5, 0xfe, 0x1f, 0xfe,
+ 0x58, 0x7b, 0xed, 0xb5, 0xdf, 0xd9, 0x47, 0xed,
+ 0xcf, 0xc6, 0x3d, 0x7b, 0xee, 0xb9, 0xe7, 0x9e,
+ 0x7b, 0xfb, 0xff, 0x6d, 0x6e, 0xf7, 0xdd, 0x77,
+ 0xdf, 0x7f, 0xff, 0xed, 0xff, 0xb5, 0x79, 0xdf,
+ 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 0xff, 0xff, 0x7f,
+ 0x66, 0xf3, 0x7c, 0x76, 0xd9, 0x65, 0x9d, 0xff,
+ 0xfe, 0x7b, 0x6f, 0xe4, 0xbb, 0xfe, 0xfa, 0xeb,
+ 0xaf, 0xbf, 0xfe, 0xfb, 0x8f, 0x57, 0x2c, 0xbd,
+ 0xf4, 0xd3, 0x7f, 0xff, 0x3d, 0xf6, 0xbd, 0x99,
+ 0xf9, 0xef, 0xbd, 0xf7, 0xde, 0x7b, 0xef, 0xfd,
+ 0x7f, 0xbf, 0xf5, 0xcf, 0x7e, 0x7b, 0xec, 0xff,
+ 0xff, 0xff, 0xff, 0x4f, 0xe6, 0xde, 0xdb, 0x6f,
+ 0xbf, 0xfd, 0xf6, 0xfb, 0xff, 0xf7, 0xbf, 0xff,
+ 0xb5, 0xdf, 0x5e, 0xfb, 0xff, 0xff, 0xff, 0xff,
+ 0xbb, 0xb9, 0xff, 0x5f, 0x7f, 0xfd, 0xf5, 0xf7,
+ 0xdf, 0xef, 0x77, 0x7d, 0xe1, 0xb7, 0xdf, 0x7a,
+ 0xfb, 0xef, 0xc7, 0xff, 0xee, 0x68, 0xde, 0xf7,
+ 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0x73, 0x8f,
+ 0x5f, 0x7c, 0xf7, 0x5d, 0x76, 0xf9, 0xbd, 0xfd,
+ 0xd5, 0xce, 0x9b, 0xff, 0xaf, 0xbb, 0xfe, 0xba,
+ 0xeb, 0xfd, 0xdf, 0xfe, 0x7f, 0xd7, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xd7, 0xef, 0xff, 0xff, 0xff, 0xe6,
+ 0xff, 0xeb, 0xa3, 0x8f, 0x3e, 0xfa, 0xfc, 0xb3,
+ 0xc7, 0x3f, 0xe5, 0xd9, 0x67, 0x9f, 0x7d, 0xf4,
+ 0xb9, 0xe7, 0x9f, 0xbd, 0xf9, 0xff, 0xfa, 0xeb,
+ 0xaf, 0xbf, 0x7e, 0xfa, 0xcf, 0x77, 0x7e, 0xf1,
+ 0xfd, 0xf7, 0xdf, 0x7f, 0xfd, 0xff, 0xd7, 0xdf,
+ 0x6f, 0xfe, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xaf,
+ 0xfe, 0xfb, 0xff, 0x5f, 0xff, 0x7d, 0xf7, 0xdf,
+ 0x5f, 0xff, 0xff, 0xff, 0xff, 0x98, 0xff, 0xf7,
+ 0xfe, 0xfb, 0xef, 0xbf, 0xaf, 0xfe, 0xdc, 0xef,
+ 0x57, 0x7f, 0xfd, 0xf5, 0xd7, 0x7f, 0xff, 0x7f,
+ 0xf5, 0xff, 0x66, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x3f, 0xeb, 0x3f, 0xf7, 0xff, 0xf4, 0xf7, 0xdd,
+ 0x7f, 0xff, 0xff, 0xff, 0x5f, 0xff, 0x8b, 0xf9,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xef, 0x3f, 0x7f, 0xad, 0x3d, 0x5e, 0x5c, 0xbb,
+ 0xfd, 0xb7, 0xff, 0x6f, 0xfe, 0xef, 0xab, 0xaf,
+ 0xbf, 0xf8, 0xf8, 0x8b, 0xaf, 0xbe, 0xce, 0xc1,
+ 0xd7, 0x5f, 0x6f, 0xfd, 0xb5, 0xd6, 0x1c, 0x7f,
+ 0x9a, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xbf, 0xf7,
+ 0xff, 0x78, 0x71, 0xff, 0x9f, 0x7f, 0xf7, 0xff,
+ 0x67, 0x7b, 0x7f, 0x77, 0xff, 0xc6, 0xfe, 0xff,
+ 0xff, 0xf7, 0xff, 0xff, 0x7f, 0xd7, 0x7b, 0xee,
+ 0xbf, 0xbb, 0xf7, 0xff, 0xff, 0xff, 0xfb, 0xff,
+ 0xff, 0x9f, 0xe9, 0xff, 0xff, 0xfe, 0xff, 0xdf,
+ 0x5f, 0xff, 0xed, 0xf7, 0xdf, 0xff, 0x7f, 0xff,
+ 0xf7, 0xff, 0xff, 0xbb, 0xff, 0xfc, 0x6d, 0xbc,
+ 0x3f, 0xff, 0xfb, 0xed, 0x4f, 0x3f, 0xff, 0xdf,
+ 0x6b, 0x9f, 0xff, 0xfd, 0xf4, 0xd7, 0xd3, 0x7e,
+ 0xf9, 0xf7, 0xfe, 0x9b, 0xef, 0xff, 0xbf, 0xff,
+ 0xfe, 0xff, 0xff, 0xff, 0xbf, 0xf7, 0xfe, 0xd7,
+ 0xf7, 0xfd, 0xf7, 0xdf, 0x5d, 0x7f, 0xff, 0xff,
+ 0xe6, 0xff, 0xff, 0xff, 0xfa, 0xff, 0xbf, 0xff,
+ 0xbf, 0xbb, 0xde, 0xbf, 0xff, 0xdf, 0x3f, 0xef,
+ 0xf7, 0xfd, 0xff, 0xff, 0xbf, 0xf9, 0xfe, 0xff,
+ 0xfd, 0xfb, 0xfd, 0xdf, 0xf7, 0xff, 0x4f, 0x7f,
+ 0x7f, 0xff, 0xbb, 0xff, 0x7f, 0x74, 0xef, 0xff,
+ 0xfc, 0x6f, 0xfe, 0xff, 0xfb, 0xff, 0xbf, 0xff,
+ 0xff, 0xdf, 0x77, 0xbb, 0xda, 0xab, 0xff, 0xfe,
+ 0xff, 0xff, 0xfd, 0xdf, 0xbf, 0xbd, 0x9b, 0xfb,
+ 0xff, 0xf7, 0x7f, 0xbf, 0xff, 0xfd, 0xfb, 0xff,
+ 0xff, 0xfd, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xf7,
+ 0xdf, 0xff, 0xdf, 0xe6, 0xfe, 0xff, 0xfb, 0xe7,
+ 0x7f, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xdf, 0xff,
+ 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf,
+ 0xb9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf,
+ 0xff, 0xbb, 0xdf, 0xb9, 0xff, 0xfc, 0xff, 0xed,
+ 0xfd, 0xff, 0xff, 0xff, 0x6f, 0xde, 0xff, 0xfd,
+ 0xff, 0xff, 0x7f, 0xff, 0xfd, 0xdf, 0x6f, 0xbd,
+ 0x9f, 0x9b, 0xf6, 0xbf, 0x3c, 0xf3, 0xef, 0xff,
+ 0xff, 0x99, 0xfb, 0xff, 0xff, 0x6b, 0xaf, 0xff,
+ 0xfe, 0xfb, 0xf7, 0xfa, 0xff, 0xfb, 0xff, 0xfe,
+ 0xff, 0xef, 0xff, 0xff, 0xe7, 0xbf, 0x66, 0xff,
+ 0xc3, 0x3f, 0xff, 0x7c, 0xe3, 0xcd, 0x3f, 0xff,
+ 0xbc, 0xc9, 0x9d, 0xef, 0xfa, 0xf9, 0xef, 0x9f,
+ 0x7f, 0xfe, 0x9f, 0xf9, 0xff, 0xf5, 0xdf, 0x3f,
+ 0xff, 0xfd, 0xf3, 0xcf, 0x7b, 0xff, 0xfe, 0xef,
+ 0xff, 0xff, 0xfe, 0xfd, 0xef, 0xbd, 0xff, 0x6f,
+ 0xfe, 0xff, 0x76, 0xfb, 0xef, 0xbf, 0xfd, 0xfe,
+ 0xcb, 0xc7, 0x7d, 0xb7, 0xbd, 0xff, 0xdb, 0xff,
+ 0xfb, 0xbd, 0xf6, 0xff, 0x9b, 0xff, 0xff, 0xff,
+ 0xf7, 0x9b, 0xff, 0xff, 0xff, 0x6e, 0xff, 0xff,
+ 0xff, 0xf5, 0xff, 0xbf, 0xbf, 0xef, 0xbb, 0xff,
+ 0xff, 0xa6, 0xff, 0xef, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xcf, 0xbf, 0xff, 0xd7, 0xf7, 0xdf, 0x7f, 0xff,
+ 0xfd, 0xf7, 0xde, 0x7e, 0xfd, 0xbf, 0xf9, 0xff,
+ 0xfc, 0x73, 0xcf, 0x3d, 0xff, 0xdc, 0xf1, 0xdf,
+ 0x45, 0xee, 0xf9, 0xe7, 0x9f, 0x3b, 0xfe, 0xf9,
+ 0x65, 0xff, 0x6f, 0xfe, 0xbb, 0xfb, 0xfe, 0xfb,
+ 0xef, 0xbf, 0xaf, 0xde, 0xfb, 0xdf, 0x7c, 0xef,
+ 0xf5, 0xf7, 0x5f, 0x7f, 0x7f, 0xfd, 0xff, 0x9b,
+ 0xff, 0x9f, 0x7e, 0xfa, 0xe9, 0xa7, 0x9f, 0x7e,
+ 0xfa, 0xfd, 0xef, 0x3f, 0xfd, 0xfe, 0xd3, 0xef,
+ 0x3f, 0xfd, 0xf4, 0xff, 0xe6, 0xff, 0xf7, 0xdf,
+ 0x6f, 0xef, 0xfd, 0x77, 0xdf, 0x77, 0xfb, 0xfb,
+ 0xed, 0xbe, 0xff, 0xfe, 0x7b, 0x6f, 0xbf, 0xfb,
+ 0xbf, 0xf9, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfb,
+ 0xff, 0xff, 0x7f, 0xff, 0xfb, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xef, 0x6f, 0xfe, 0xcf,
+ 0xff, 0xf5, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7,
+ 0xbf, 0xbe, 0xfe, 0xbb, 0xaf, 0xb7, 0xff, 0xff,
+ 0x7b, 0xff, 0x9b, 0xdf, 0xdf, 0xff, 0x7f, 0xcf,
+ 0xff, 0xf7, 0xfe, 0xff, 0xf7, 0xfc, 0xff, 0xff,
+ 0xff, 0xff, 0xfb, 0xbf, 0xff, 0xef, 0xff, 0xe6,
+ 0xff, 0x59, 0x7f, 0xdf, 0xfd, 0xd7, 0xdf, 0x7f,
+ 0xff, 0x79, 0xcf, 0xbf, 0xef, 0xfa, 0xfb, 0xcf,
+ 0xaf, 0xef, 0xee, 0xbf, 0xf9, 0xff, 0x36, 0xdf,
+ 0x7e, 0xf3, 0xed, 0xb7, 0xdf, 0x7e, 0xeb, 0xdb,
+ 0x6f, 0xbf, 0xfd, 0xf6, 0x5b, 0x6f, 0xbf, 0xf9,
+ 0x6f, 0xfe, 0xff, 0xf7, 0xdf, 0x7f, 0xfb, 0xfd,
+ 0x75, 0xdf, 0x7f, 0xbb, 0xfb, 0x6f, 0xbf, 0xfd,
+ 0xfe, 0x9b, 0xef, 0xae, 0xfd, 0x9b, 0xff, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7,
+ 0xa6, 0xef, 0xbe, 0xfb, 0xef, 0xbf, 0xf7, 0xfe,
+ 0x7b, 0xef, 0xe6, 0xff, 0xbf, 0xff, 0xfe, 0xbb,
+ 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xdf, 0x7f, 0xf7,
+ 0xdd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xbf, 0xf9,
+ 0xff, 0x2f, 0xbf, 0xfe, 0xf2, 0xeb, 0xaf, 0xbf,
+ 0xff, 0xda, 0xd7, 0x5f, 0x7f, 0xfd, 0xfd, 0xd7,
+ 0xdf, 0x7f, 0xf9, 0x6f, 0xfe, 0xff, 0xfb, 0xef,
+ 0xbf, 0xff, 0xfe, 0xf9, 0xef, 0xbf, 0xff, 0xfd,
+ 0xf7, 0xdf, 0x7d, 0xff, 0xfd, 0xf7, 0xcf, 0xff,
+ 0x9b, 0xff, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xff,
+ 0xfc, 0xf3, 0xcf, 0x7b, 0xfe, 0xf9, 0xe7, 0x9e,
+ 0x7f, 0xfe, 0xf9, 0xe7, 0xf7, 0xe6, 0xff, 0x5f,
+ 0x7f, 0xfd, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5,
+ 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe,
+ 0xfa, 0xbf, 0xf9, 0xff, 0x1f, 0x7f, 0xfd, 0xf1,
+ 0xd7, 0x5b, 0x7f, 0xfd, 0xf5, 0xaf, 0xbf, 0xfe,
+ 0xf2, 0xeb, 0xaf, 0xbf, 0xde, 0xf8, 0x6f, 0xee,
+ 0xff, 0xfa, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xdb,
+ 0x6f, 0x7f, 0xfd, 0xf5, 0xd7, 0xdb, 0x7f, 0xf9,
+ 0xed, 0xf7, 0xff, 0x9b, 0xff, 0xff, 0xfe, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0x7f, 0xbf,
+ 0xfd, 0xf7, 0xff, 0x7b, 0xff, 0xef, 0xff, 0xff,
+ 0xe6, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xef, 0xfd, 0xe5, 0x7f, 0xb7, 0xff, 0x77, 0xdf,
+ 0x3f, 0xb7, 0xde, 0xff, 0xbf, 0xf9, 0xbf, 0xfd,
+ 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0x1d, 0xf3,
+ 0x9c, 0xef, 0xcb, 0xbd, 0xe7, 0x9c, 0xeb, 0xeb,
+ 0xef, 0x6f, 0xfe, 0xff
+};
+
+
+/* rom names */
+
+#define ECP_ROM_CROM0_R_0 0
+#define ECP_ROM_CROM0_R_1 16
+#define ECP_ROM_CROM0_R_2 32
+#define ECP_ROM_CROM0_R_3 48
+#define ECP_ROM_CROM0_R_4 64
+#define ECP_ROM_CROM0_R_5 80
+#define ECP_ROM_CROM0_R_6 96
+#define ECP_ROM_CROM0_R_7 112
+#define ECP_ROM_CROM1_R_0 128
+#define ECP_ROM_CROM1_R_1 144
+#define ECP_ROM_CROM1_R_2 160
+#define ECP_ROM_CROM1_R_3 176
+#define ECP_ROM_CROM1_R_4 192
+#define ECP_ROM_CROM1_R_5 208
+#define ECP_ROM_CROM1_R_6 224
+#define ECP_ROM_CROM1_R_7 240
+#define ECP_ROM_DIVROM0 256
+#define ECP_ROM_DIVROM1 272
+#define ECP_ROM_DIVROM2 288
+#define ECP_ROM_SWROMID 304
+#define ECP_ROM_SWROMIE 320
+#define ECP_ROM_SWROMIS 336
+#define ECP_ROM_SWROMOE 352
+#define ECP_ROM_SWROMOS 368
+#define ECP_ROM_SWROMIC 384
+#define ECP_ROM_SWROMOC 400
+#define ECP_ROM_SWROMDCD 416
+#define ECP_ROM_CLKSELROM 432
+#define ECP_ROM_PTTMUTEROM 448
+
+
+/* rom locations */
+static const unsigned long ecp_roms[464] = {
+ 52103, 52269, 51771, 51937, 52271, 52105, 51939, 51773,
+ 51439, 51605, 51107, 51273, 51607, 51441, 51275, 51109,
+ 64075, 64243, 64241, 64077, 63743, 63911, 63909, 63745,
+ 63411, 63579, 63577, 63413, 63079, 63247, 63245, 63081,
+ 40025, 39361, 39693, 39029, 40193, 39529, 39861, 39197,
+ 40191, 39527, 39859, 39195, 40027, 39363, 39695, 39031,
+ 39965, 39301, 40131, 39467, 40133, 39469, 39967, 39303,
+ 39633, 38969, 39799, 39135, 39801, 39137, 39635, 38971,
+ 39975, 39311, 39643, 38979, 40143, 39479, 39811, 39147,
+ 40141, 39477, 39809, 39145, 39977, 39313, 39645, 38981,
+ 39985, 39321, 40151, 39487, 40153, 39489, 39987, 39323,
+ 39653, 38989, 39819, 39155, 39821, 39157, 39655, 38991,
+ 39995, 39663, 40161, 39829, 40163, 39831, 39997, 39665,
+ 39331, 38999, 39497, 39165, 39499, 39167, 39333, 39001,
+ 45991, 46159, 46157, 45993, 45659, 45827, 45825, 45661,
+ 45327, 45495, 45493, 45329, 44995, 45163, 45161, 44997,
+ 49117, 49449, 48951, 49283, 49781, 50113, 49615, 49947,
+ 48949, 49281, 49115, 49447, 49613, 49945, 49779, 50111,
+ 61089, 61753, 61421, 62085, 60923, 61587, 61255, 61919,
+ 60921, 61585, 61253, 61917, 61087, 61751, 61419, 62083,
+ 37039, 36871, 36873, 37037, 37703, 37535, 37537, 37701,
+ 37371, 37203, 37205, 37369, 38035, 37867, 37869, 38033,
+ 36979, 36811, 37311, 37143, 37643, 37475, 37975, 37807,
+ 36813, 36977, 37145, 37309, 37477, 37641, 37809, 37973,
+ 36989, 36821, 36823, 36987, 37653, 37485, 37487, 37651,
+ 37321, 37153, 37155, 37319, 37985, 37817, 37819, 37983,
+ 36999, 36831, 37331, 37163, 37663, 37495, 37995, 37827,
+ 36833, 36997, 37165, 37329, 37497, 37661, 37829, 37993,
+ 37009, 36841, 37341, 37173, 37673, 37505, 38005, 37837,
+ 36843, 37007, 37175, 37339, 37507, 37671, 37839, 38003,
+ 43005, 43669, 43337, 44001, 42839, 43503, 43171, 43835,
+ 42837, 43501, 43169, 43833, 43003, 43667, 43335, 43999,
+ 66994, 66828, 66826, 66992, 67326, 67160, 67158, 67324,
+ 67658, 67492, 67490, 67656, 67990, 67824, 67822, 67988,
+ 66984, 67316, 66818, 67150, 66816, 67148, 66982, 67314,
+ 67648, 67980, 67482, 67814, 67480, 67812, 67646, 67978,
+ 64004, 64172, 63672, 63840, 63340, 63508, 63008, 63176,
+ 64170, 64006, 63838, 63674, 63506, 63342, 63174, 63010,
+ 75926, 75262, 76092, 75428, 76094, 75430, 75928, 75264,
+ 75594, 74930, 75760, 75096, 75762, 75098, 75596, 74932,
+ 75916, 76084, 75584, 75752, 75252, 75420, 74920, 75088,
+ 76082, 75918, 75750, 75586, 75418, 75254, 75086, 74922,
+ 45870, 46036, 45538, 45704, 46038, 45872, 45706, 45540,
+ 45206, 45372, 44874, 45040, 45374, 45208, 45042, 44876,
+ 58008, 58174, 57344, 57510, 58176, 58010, 57512, 57346,
+ 57676, 57842, 57012, 57178, 57844, 57678, 57180, 57014,
+ 69960, 70126, 69296, 69462, 69628, 69794, 68964, 69130,
+ 70128, 69962, 69464, 69298, 69796, 69630, 69132, 68966,
+ 82003, 81671, 81339, 81007, 82169, 81837, 81505, 81173,
+ 82171, 81839, 81507, 81175, 82005, 81673, 81341, 81009,
+ 39924, 39260, 40090, 39426, 40092, 39428, 39926, 39262,
+ 39592, 38928, 39758, 39094, 39760, 39096, 39594, 38930,
+ 49107, 48941, 49439, 49273, 48939, 49105, 49271, 49437,
+ 49771, 49605, 50103, 49937, 49603, 49769, 49935, 50101,
+ 87939, 87275, 88105, 87441, 88107, 87443, 87941, 87277,
+ 87607, 86943, 87773, 87109, 87775, 87111, 87609, 86945,
+ 42944, 42778, 42776, 42942, 43276, 43110, 43108, 43274,
+ 43608, 43442, 43440, 43606, 43940, 43774, 43772, 43938
+};
+
diff --git a/main/epp_firmware.h b/main/epp_firmware.h
new file mode 100644
index 0000000..a5ee029
--- /dev/null
+++ b/main/epp_firmware.h
@@ -0,0 +1,1623 @@
+/*****************************************************************************/
+
+/*
+ * epp_firmware.h -- HDLC packet radio modem for EPP using FPGA utility.
+ *
+ * Copyright (C) 1998 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+/* automatically generated, do not edit */
+
+#define EPP_FIRMWAREDATE "19990628"
+
+/* firmware */
+static const unsigned char epp_firmware[] = {
+ 0xff, 0x04, 0xe8, 0x8c, 0xf9, 0xde, 0xff, 0xde,
+ 0xfd, 0xfd, 0xd7, 0xdb, 0xdf, 0xfd, 0xed, 0x7d,
+ 0xef, 0xfe, 0xfe, 0xae, 0x6f, 0xef, 0xfe, 0xfe,
+ 0xfe, 0x9b, 0xff, 0xff, 0xaf, 0xff, 0xfd, 0xfb,
+ 0xfe, 0xaf, 0xff, 0x7f, 0xfe, 0xd7, 0xff, 0x7f,
+ 0xed, 0xff, 0xd7, 0xff, 0x7f, 0xff, 0xe6, 0xff,
+ 0xfd, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xbf, 0xb9, 0xff, 0xfc, 0xed, 0xcf,
+ 0xff, 0xfe, 0xfc, 0xed, 0xcf, 0x5f, 0xfe, 0xf6,
+ 0xe7, 0x6f, 0x7f, 0xfe, 0xf6, 0xe7, 0xef, 0x6f,
+ 0xfe, 0xbf, 0x77, 0x5f, 0x7b, 0xfd, 0xb5, 0x77,
+ 0x5f, 0x7b, 0xd7, 0xbb, 0xaf, 0xbd, 0xfb, 0xda,
+ 0xbb, 0xaf, 0xbd, 0xfb, 0x9b, 0xff, 0x3f, 0xfd,
+ 0xf5, 0xd2, 0x5f, 0x2f, 0xfd, 0xf5, 0xd3, 0x9f,
+ 0xfe, 0x7a, 0xe9, 0xaf, 0x9f, 0xfe, 0x7a, 0xe9,
+ 0xff, 0xc6, 0xff, 0x3f, 0xff, 0xfc, 0xf3, 0xcf,
+ 0x3f, 0xff, 0xfc, 0xf3, 0x9e, 0x7f, 0xfe, 0xf9,
+ 0xe7, 0x9f, 0x7f, 0xfe, 0xf9, 0xbf, 0xf9, 0xff,
+ 0xaf, 0xbf, 0xff, 0xfe, 0xfb, 0xaf, 0xbf, 0xff,
+ 0xfa, 0xd7, 0xdf, 0x7f, 0xfd, 0xfd, 0xd7, 0xdf,
+ 0x7f, 0xfd, 0x6f, 0xfe, 0xff, 0xba, 0xaf, 0xae,
+ 0xfa, 0xfe, 0xfa, 0xaf, 0xae, 0x7f, 0xfd, 0xd7,
+ 0xd7, 0x7d, 0x7d, 0xfd, 0xd7, 0xd7, 0x7f, 0x9b,
+ 0xff, 0xff, 0xfe, 0xbb, 0xef, 0xbf, 0xff, 0xfe,
+ 0xfb, 0xef, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xff, 0xc6, 0xff, 0xdf, 0x7b,
+ 0xff, 0xbd, 0xf7, 0xdd, 0x7f, 0xef, 0xfd, 0xef,
+ 0xbf, 0xff, 0xde, 0xfb, 0xef, 0xbf, 0xff, 0xfe,
+ 0xbf, 0xf9, 0xff, 0x9f, 0x7f, 0xff, 0xfd, 0xf7,
+ 0x9f, 0x7f, 0xff, 0xf9, 0xcf, 0xbf, 0xfb, 0xfc,
+ 0xfb, 0xcf, 0xbf, 0xfb, 0xfc, 0x6f, 0xf4, 0xff,
+ 0xed, 0xb7, 0xdd, 0x7e, 0xfb, 0xed, 0xb7, 0xdf,
+ 0xfe, 0xb6, 0xdb, 0x6f, 0xbf, 0xfd, 0xf6, 0xdb,
+ 0x6f, 0xff, 0x9b, 0xff, 0x7f, 0xfe, 0xfd, 0xf7,
+ 0xdf, 0x7f, 0xfd, 0x7d, 0xf7, 0xbf, 0xff, 0xfe,
+ 0xf3, 0xef, 0xbf, 0xfe, 0xfe, 0xfb, 0xff, 0xe6,
+ 0xff, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xef, 0xbb, 0xff, 0xbe, 0xfb, 0xee,
+ 0xbb, 0xff, 0xfe, 0xbf, 0xf9, 0xff, 0xfc, 0xf3,
+ 0xce, 0x3b, 0x7f, 0xfc, 0xf3, 0xce, 0x7f, 0xfe,
+ 0xf9, 0xe7, 0x9f, 0x7e, 0xfe, 0xf9, 0xe7, 0xf7,
+ 0x6f, 0xfe, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff,
+ 0xfd, 0x77, 0xdf, 0xff, 0xfc, 0xfb, 0xee, 0xbf,
+ 0xff, 0xfe, 0xfb, 0xef, 0xff, 0x9b, 0xdd, 0xcf,
+ 0x3d, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xbf, 0x7c,
+ 0xe7, 0x9f, 0x7f, 0xee, 0xf9, 0xe7, 0x9f, 0x7f,
+ 0xbe, 0xdd, 0x66, 0xff, 0xef, 0xbf, 0xff, 0xfe,
+ 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xf7, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xb7, 0xf9,
+ 0xf7, 0xfe, 0xfa, 0xef, 0xbc, 0xef, 0xbe, 0xfb,
+ 0xef, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff,
+ 0xfd, 0xf7, 0xff, 0x6f, 0xfe, 0xbf, 0x7d, 0xf6,
+ 0x5b, 0x67, 0xbf, 0x7d, 0xf6, 0xdb, 0xdf, 0x3e,
+ 0xfb, 0xec, 0xb7, 0xdf, 0x3e, 0xfb, 0xed, 0xfd,
+ 0x9b, 0xff, 0xff, 0xdf, 0xff, 0xff, 0x9f, 0xff,
+ 0xff, 0xfd, 0xf7, 0xfb, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x7b, 0xff, 0xe6, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xf7, 0xff, 0x7f, 0xff, 0xfe,
+ 0xbf, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0x7f,
+ 0xdf, 0xbf, 0xf9, 0x7f, 0xff, 0xff, 0xff, 0xff,
+ 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfe,
+ 0xff, 0xff, 0xff, 0xfd, 0xff, 0xdf, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff,
+ 0xff, 0xff, 0xf7, 0x9b, 0xfe, 0x7f, 0xff, 0xfd,
+ 0xf7, 0xdf, 0x7f, 0xfd, 0xf5, 0xf7, 0xbf, 0xef,
+ 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xff,
+ 0xe6, 0xff, 0xd3, 0xff, 0xff, 0xff, 0xff, 0xde,
+ 0xfb, 0xbf, 0xfc, 0xe5, 0xff, 0xdf, 0xff, 0xf7,
+ 0xed, 0xff, 0xdb, 0xff, 0xbf, 0xf9, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xbf, 0xff, 0x7f, 0xef, 0x6f,
+ 0xff, 0xff, 0xed, 0xf7, 0xff, 0xfe, 0xff, 0xf7,
+ 0xff, 0x6f, 0xfc, 0x7f, 0xff, 0xff, 0xfd, 0xff,
+ 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x1b, 0xff,
+ 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xe9, 0x7f,
+ 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb,
+ 0xff, 0xff, 0xf7, 0xe6, 0xff, 0xff, 0xff, 0xff,
+ 0x7d, 0xcf, 0xff, 0xff, 0xfb, 0xff, 0xff, 0x7b,
+ 0xff, 0xff, 0xff, 0xff, 0x7b, 0xff, 0xef, 0xbd,
+ 0xf9, 0xff, 0xfa, 0xff, 0xf5, 0xff, 0xff, 0xef,
+ 0xff, 0xaf, 0xfb, 0xbf, 0xff, 0xfe, 0xff, 0x7f,
+ 0xdd, 0xff, 0xff, 0x7f, 0x6f, 0xfe, 0x7f, 0x7d,
+ 0xff, 0xff, 0xff, 0xef, 0xfb, 0xff, 0xdf, 0xfd,
+ 0xf7, 0xff, 0xff, 0xff, 0xbf, 0xfc, 0xff, 0xff,
+ 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff, 0x5b, 0xff,
+ 0x9f, 0xff, 0xff, 0xfe, 0xfb, 0x7f, 0xff, 0xfd,
+ 0x77, 0xdf, 0x7f, 0xff, 0xff, 0xff, 0xa6, 0x7f,
+ 0x7d, 0xff, 0xff, 0xff, 0xff, 0xeb, 0x6f, 0xff,
+ 0xfb, 0xfe, 0xff, 0xff, 0xf5, 0xfe, 0xff, 0xff,
+ 0xff, 0xff, 0xbf, 0xf1, 0xff, 0xff, 0xff, 0x7f,
+ 0xfd, 0xff, 0xdf, 0xef, 0xff, 0xbd, 0xff, 0xef,
+ 0xbf, 0xff, 0xff, 0xcb, 0xef, 0x7f, 0xff, 0x6e,
+ 0xea, 0xf7, 0xff, 0xfc, 0xff, 0xf7, 0xff, 0xff,
+ 0x7f, 0xff, 0xfe, 0xdf, 0xff, 0x7f, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0x1b, 0xff, 0xff, 0xbf,
+ 0xfd, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff,
+ 0xff, 0xe6, 0xff, 0xff, 0x7f, 0xff, 0xfe, 0xfb,
+ 0xef, 0x7b, 0xff, 0xff, 0xef, 0xbf, 0xff, 0xfe,
+ 0xff, 0xef, 0xbf, 0x7f, 0xff, 0xbf, 0xf9, 0xff,
+ 0xff, 0xff, 0xdf, 0xff, 0xfe, 0x7b, 0xed, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xc3, 0xfb, 0x6f, 0xfe, 0xff, 0xef, 0xff, 0xff,
+ 0xcf, 0x3f, 0xff, 0xfb, 0xff, 0xfe, 0xf7, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0x9b,
+ 0xfe, 0xf9, 0xf3, 0xfb, 0xfa, 0xff, 0xff, 0xbf,
+ 0xf6, 0xff, 0xdf, 0xff, 0xff, 0x3f, 0xf5, 0xff,
+ 0xff, 0xff, 0xfd, 0xbf, 0x66, 0xff, 0xff, 0xf5,
+ 0xbf, 0xfe, 0xff, 0xeb, 0xaf, 0xbf, 0xf7, 0xfd,
+ 0xff, 0xff, 0x4b, 0xfd, 0xff, 0xff, 0xff, 0xff,
+ 0xb7, 0x49, 0xff, 0xff, 0xbf, 0xa5, 0xff, 0xfc,
+ 0x7f, 0xed, 0xb5, 0x67, 0xbf, 0xfc, 0xf2, 0xf9,
+ 0xaf, 0xbd, 0xf6, 0xdf, 0xfe, 0x6f, 0xd4, 0xff,
+ 0xff, 0xff, 0xeb, 0xdc, 0xbe, 0x9e, 0x3b, 0xeb,
+ 0xdc, 0xe7, 0x9d, 0xf7, 0xdf, 0x79, 0xe7, 0xfd,
+ 0xff, 0x5f, 0x99, 0xdb, 0xf7, 0xfd, 0xf7, 0xf6,
+ 0xff, 0xef, 0xbf, 0x56, 0x5f, 0xdd, 0x6d, 0xfb,
+ 0xed, 0xa5, 0xf7, 0xde, 0x7b, 0xcd, 0xee, 0x06,
+ 0x7e, 0xfc, 0xff, 0xff, 0x6e, 0xe6, 0xb9, 0xaf,
+ 0x9d, 0x73, 0x5d, 0x73, 0xde, 0x79, 0xb9, 0x9c,
+ 0x77, 0xde, 0xb1, 0x93, 0x99, 0xff, 0x0f, 0xff,
+ 0x7f, 0xff, 0x9e, 0xfe, 0x6f, 0xbb, 0x6d, 0xff,
+ 0xf5, 0xd7, 0xff, 0x7e, 0xfd, 0xf5, 0xd7, 0xff,
+ 0x66, 0xec, 0xff, 0x57, 0xcf, 0xcf, 0xef, 0xaf,
+ 0xff, 0xfa, 0xeb, 0xdf, 0x7f, 0xfd, 0xf5, 0x7f,
+ 0x5f, 0x7f, 0xfd, 0xfd, 0xbf, 0x19, 0xf7, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xff, 0xf6, 0xdb, 0xcf, 0x3f,
+ 0xfb, 0xed, 0xe7, 0x9f, 0xff, 0xff, 0xf9, 0xe7,
+ 0xff, 0x77, 0xe6, 0xfd, 0x9f, 0x7f, 0xfe, 0xdd,
+ 0xf7, 0xff, 0xfd, 0xff, 0xdf, 0xdf, 0xfe, 0xfb,
+ 0xef, 0xf7, 0xff, 0xfe, 0xfb, 0xff, 0xbd, 0xb9,
+ 0xfe, 0xe3, 0xcf, 0xb5, 0xd1, 0xfc, 0xfb, 0xee,
+ 0xb7, 0xcf, 0x6d, 0xf7, 0xd9, 0x63, 0xbc, 0x2d,
+ 0xf6, 0xd9, 0xaf, 0x6e, 0xee, 0xff, 0xff, 0xff,
+ 0xfd, 0xf7, 0xff, 0xff, 0xff, 0xfe, 0xf3, 0xbf,
+ 0x7f, 0xfe, 0xfb, 0xed, 0xbf, 0x7f, 0xfe, 0x3d,
+ 0x9b, 0xf9, 0xff, 0xff, 0xeb, 0xff, 0xfe, 0xff,
+ 0xff, 0xff, 0x7f, 0xff, 0xfb, 0xdf, 0xdf, 0x7f,
+ 0xff, 0xf7, 0xef, 0xff, 0xef, 0xe6, 0xf6, 0x1f,
+ 0x7d, 0xfd, 0xfc, 0xeb, 0xeb, 0xbf, 0xbf, 0x7e,
+ 0xf7, 0xd3, 0x6f, 0x2f, 0xf1, 0xf5, 0xd7, 0x7f,
+ 0x7f, 0xbb, 0x79, 0xff, 0xef, 0xbf, 0xef, 0xff,
+ 0xfe, 0x72, 0xaf, 0x2f, 0xfe, 0xd1, 0xc5, 0x37,
+ 0x5f, 0x7c, 0xf1, 0xc5, 0x13, 0x7f, 0x6f, 0xea,
+ 0xff, 0xff, 0xff, 0xef, 0xf7, 0xfe, 0xfe, 0xbe,
+ 0xef, 0x7f, 0xff, 0xbd, 0xf7, 0xd7, 0x7f, 0xbf,
+ 0xfd, 0xf7, 0xff, 0x9b, 0xf6, 0x7f, 0xcf, 0x3f,
+ 0xfe, 0xfc, 0xb3, 0x8f, 0x3f, 0xfe, 0xf4, 0xc7,
+ 0x1f, 0x7f, 0xe4, 0xf1, 0xc7, 0x1f, 0x7d, 0xfe,
+ 0xe6, 0xff, 0xdf, 0x7f, 0xbf, 0xfe, 0xfb, 0xeb,
+ 0xbf, 0xbf, 0xff, 0xf7, 0xf7, 0x5f, 0x7f, 0xff,
+ 0xfd, 0xf7, 0xff, 0xff, 0xbf, 0x61, 0xff, 0xff,
+ 0xdf, 0xaf, 0xbf, 0xfe, 0xfa, 0xef, 0xbf, 0xff,
+ 0xfd, 0xf7, 0xd7, 0x7f, 0xff, 0xfd, 0xf7, 0xf7,
+ 0xff, 0x6f, 0xfe, 0xdf, 0xf9, 0xef, 0xef, 0xbf,
+ 0xbf, 0xfe, 0xeb, 0xbf, 0x7f, 0xfd, 0xf7, 0xdf,
+ 0x77, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 0x9b, 0xff,
+ 0xff, 0xff, 0xff, 0xfa, 0xeb, 0xaf, 0xff, 0xfe,
+ 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff,
+ 0x7f, 0xff, 0xdf, 0xe6, 0xff, 0xff, 0xff, 0xbf,
+ 0xfd, 0xf2, 0xd3, 0x2d, 0xbf, 0xff, 0xec, 0xff,
+ 0xff, 0x7f, 0xbb, 0xe7, 0xf7, 0xd7, 0xff, 0xbf,
+ 0xf9, 0xff, 0x2f, 0xbf, 0xdc, 0x7a, 0xeb, 0xae,
+ 0xb7, 0xfe, 0xf2, 0x97, 0x5f, 0x7e, 0xfd, 0xf5,
+ 0x97, 0x4d, 0x77, 0xf5, 0x6f, 0x2e, 0xff, 0xff,
+ 0xf3, 0xfb, 0x3f, 0xff, 0xf7, 0xef, 0xb7, 0x9f,
+ 0xfd, 0xff, 0xff, 0x67, 0xff, 0xff, 0xff, 0xff,
+ 0xe7, 0x9b, 0xff, 0x7f, 0x7f, 0xff, 0x7f, 0xe8,
+ 0xfb, 0xf6, 0xff, 0xff, 0xfe, 0xf7, 0xff, 0x6f,
+ 0xff, 0x7f, 0xf6, 0xdf, 0xff, 0xbf, 0xa6, 0x7d,
+ 0xfd, 0xd3, 0xff, 0x9f, 0xdf, 0x7d, 0xff, 0xf5,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff,
+ 0xf7, 0xff, 0xbf, 0xf1, 0xff, 0xff, 0xff, 0xad,
+ 0xdf, 0xef, 0xe0, 0x91, 0x3f, 0xff, 0xf3, 0xc9,
+ 0xd7, 0x1f, 0x5d, 0xfe, 0xb8, 0x67, 0xff, 0x67,
+ 0xfc, 0xff, 0xbf, 0xff, 0xeb, 0xf7, 0x6f, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x6e, 0xff,
+ 0xff, 0xff, 0xfe, 0xff, 0x99, 0xf7, 0x7e, 0xff,
+ 0x2e, 0xdf, 0xef, 0xfe, 0x7b, 0xfe, 0xfa, 0xdb,
+ 0x7f, 0x7f, 0xfd, 0xb7, 0xde, 0x6f, 0xaf, 0xff,
+ 0xff, 0x46, 0xef, 0xff, 0x7f, 0xff, 0xdf, 0xf7,
+ 0x8b, 0xef, 0x3f, 0xfd, 0xd9, 0xa7, 0x9f, 0x5b,
+ 0xfc, 0xe1, 0xc7, 0xdf, 0xfe, 0x9f, 0xb1, 0xdb,
+ 0xff, 0xdf, 0xff, 0xff, 0xf9, 0xdf, 0xef, 0xef,
+ 0x7f, 0xff, 0xfd, 0xf7, 0xff, 0xff, 0xbf, 0xbf,
+ 0xf7, 0xff, 0x6f, 0xfc, 0x7f, 0xff, 0xff, 0xf5,
+ 0xff, 0xbf, 0xfb, 0xff, 0x9f, 0xff, 0xbf, 0xff,
+ 0xff, 0xe7, 0x9f, 0x3e, 0xfe, 0xfe, 0xff, 0x98,
+ 0xff, 0x7f, 0xff, 0xff, 0xfd, 0x7d, 0xef, 0xff,
+ 0xcf, 0xff, 0xfe, 0xf7, 0x9f, 0xff, 0xee, 0xbf,
+ 0x7f, 0xff, 0xff, 0xef, 0x66, 0x7d, 0xff, 0xff,
+ 0xef, 0xfa, 0xf7, 0xed, 0xaf, 0xbf, 0xe6, 0xf5,
+ 0xd7, 0x7f, 0xbf, 0xac, 0xf3, 0xce, 0xfb, 0xff,
+ 0xbf, 0xf9, 0xf7, 0xd7, 0x6f, 0xbf, 0xff, 0xff,
+ 0xbd, 0xcf, 0xfd, 0xfe, 0xdf, 0xef, 0xc7, 0x1f,
+ 0x1f, 0xf8, 0xa1, 0x3f, 0xfb, 0x6f, 0xfe, 0xf7,
+ 0xff, 0xfb, 0xeb, 0xff, 0xff, 0xff, 0xed, 0xff,
+ 0xff, 0xfb, 0xff, 0xff, 0x7f, 0xfd, 0xff, 0xef,
+ 0xff, 0xff, 0x1b, 0xfe, 0xaf, 0xfe, 0xc1, 0x0e,
+ 0xeb, 0xb5, 0xfe, 0xff, 0xee, 0x77, 0xdf, 0x7d,
+ 0x37, 0xdd, 0x74, 0xdf, 0xfd, 0xff, 0x3f, 0x66,
+ 0xff, 0x2b, 0xbf, 0xb2, 0xf7, 0x3a, 0xcb, 0xbf,
+ 0xff, 0x52, 0xd7, 0x5f, 0x6b, 0xa9, 0xb9, 0xe6,
+ 0x9f, 0x7f, 0xff, 0xb7, 0xf9, 0x9f, 0x7f, 0xee,
+ 0x6f, 0xa6, 0x9f, 0x7a, 0xea, 0x3d, 0xf5, 0xa9,
+ 0xa7, 0x9e, 0x7b, 0xee, 0xa9, 0xa7, 0xba, 0xff,
+ 0x6f, 0xd6, 0xff, 0xcf, 0xfa, 0xb3, 0xef, 0xb7,
+ 0xde, 0x7a, 0xf9, 0xd5, 0x2e, 0xbf, 0xec, 0xb2,
+ 0xcb, 0x2e, 0xbf, 0xdf, 0x5f, 0x9b, 0xfb, 0xaf,
+ 0xfd, 0xff, 0xde, 0x4b, 0xa3, 0xad, 0x7e, 0xab,
+ 0xdd, 0x6f, 0xb5, 0xdd, 0xf6, 0xda, 0x6c, 0x9d,
+ 0xff, 0xef, 0x66, 0xfe, 0xab, 0x3f, 0x9a, 0xfd,
+ 0x72, 0xa8, 0xa5, 0xae, 0x6b, 0xdd, 0x70, 0xcd,
+ 0x35, 0xd7, 0x1c, 0x73, 0xe3, 0xbd, 0xb3, 0xb1,
+ 0xff, 0xef, 0xdf, 0x6f, 0xb6, 0x58, 0x6a, 0xe9,
+ 0xef, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xef,
+ 0xbd, 0xff, 0xf7, 0x66, 0xee, 0xff, 0xf7, 0xfb,
+ 0x5b, 0xeb, 0xb5, 0xd6, 0xfa, 0x6f, 0x75, 0xfb,
+ 0xad, 0xb6, 0xdf, 0x7e, 0xfb, 0xad, 0xfe, 0x3a,
+ 0x9b, 0xf7, 0x7f, 0xff, 0x6d, 0xb7, 0xdd, 0x72,
+ 0xef, 0xff, 0xde, 0xf3, 0xdc, 0x73, 0xcf, 0x3d,
+ 0xf7, 0xdc, 0xf3, 0xdf, 0xb7, 0xe6, 0xdd, 0x9f,
+ 0x79, 0xff, 0xd9, 0x67, 0x9f, 0xff, 0xb7, 0xfb,
+ 0x5d, 0x76, 0xd9, 0x65, 0x97, 0x7d, 0x76, 0x59,
+ 0xe7, 0xbd, 0xa1, 0xff, 0xe3, 0x4f, 0x3f, 0xfb,
+ 0xb8, 0xe3, 0xef, 0xab, 0x7f, 0xed, 0xf5, 0xd7,
+ 0x5f, 0x7f, 0xfd, 0xf5, 0xda, 0xff, 0x66, 0xe6,
+ 0xff, 0xff, 0xff, 0xff, 0xf7, 0xdf, 0x7f, 0xff,
+ 0x7b, 0xdf, 0x7b, 0xef, 0xbd, 0xf7, 0xde, 0x7b,
+ 0xef, 0xbe, 0x3f, 0x9b, 0xfb, 0xff, 0xff, 0xff,
+ 0xbf, 0xff, 0xfb, 0xef, 0xff, 0xfe, 0xb7, 0xdf,
+ 0x7e, 0xfb, 0xed, 0xb7, 0xdf, 0xde, 0xff, 0xef,
+ 0xa6, 0xfe, 0x1d, 0x2f, 0xff, 0x71, 0xe2, 0x1f,
+ 0xaf, 0xff, 0x77, 0xbd, 0xf7, 0xde, 0x7b, 0xef,
+ 0xbd, 0xf7, 0xde, 0xfb, 0xab, 0x79, 0xff, 0xe7,
+ 0xeb, 0x7d, 0xb2, 0xf8, 0xe6, 0xcb, 0x77, 0x5a,
+ 0xd3, 0x4c, 0x37, 0xdd, 0x74, 0xb3, 0x4c, 0x1e,
+ 0x7f, 0x6f, 0xfe, 0xbf, 0xfc, 0xfa, 0xbb, 0xef,
+ 0xfb, 0xfb, 0xfa, 0xfd, 0x7f, 0xff, 0xfd, 0xf6,
+ 0xdf, 0x6b, 0xef, 0xbd, 0xf7, 0xff, 0x9b, 0xff,
+ 0xaf, 0x83, 0x1e, 0x7e, 0xcc, 0xe3, 0xc3, 0x3f,
+ 0x3f, 0xdc, 0x61, 0x87, 0x1d, 0x76, 0xd9, 0x61,
+ 0x17, 0x7f, 0xfe, 0xe6, 0xff, 0x9f, 0xaf, 0xff,
+ 0xfd, 0xf2, 0xff, 0x2f, 0xbf, 0xfe, 0xf7, 0xdf,
+ 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xbf,
+ 0xf9, 0xff, 0x7f, 0xe9, 0x77, 0x9f, 0xfe, 0xba,
+ 0xe9, 0xaf, 0xd7, 0xdd, 0xf6, 0xda, 0x6b, 0x9f,
+ 0xfd, 0xf6, 0xf3, 0xef, 0x6f, 0xf6, 0xbf, 0xaa,
+ 0x7a, 0xbe, 0x29, 0xfe, 0x9b, 0xf2, 0xab, 0xda,
+ 0x4d, 0x57, 0x5d, 0x75, 0xdd, 0x45, 0x57, 0xdd,
+ 0xfd, 0x9b, 0xff, 0xaf, 0x87, 0x0f, 0x3f, 0xe8,
+ 0xaf, 0xcb, 0xfd, 0x7a, 0xf4, 0xc5, 0x0f, 0x3f,
+ 0xfc, 0xf2, 0xc1, 0x87, 0x1d, 0xfe, 0xe6, 0xff,
+ 0xff, 0x2f, 0xbf, 0xfc, 0x76, 0xbb, 0x3f, 0xfe,
+ 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xdf, 0xef, 0xbf, 0xe9, 0xff, 0xa7, 0xb7, 0xfa,
+ 0xda, 0xeb, 0xae, 0xbf, 0xf6, 0xd8, 0x47, 0x1f,
+ 0x7f, 0xf5, 0xf5, 0x57, 0x5f, 0x76, 0xfd, 0x69,
+ 0xfe, 0xff, 0xfc, 0xfb, 0xc5, 0x0e, 0xff, 0xef,
+ 0xcb, 0x4f, 0x7f, 0xea, 0xf9, 0xe7, 0xfd, 0xf3,
+ 0xf7, 0xdf, 0xef, 0xff, 0x1b, 0xff, 0x96, 0xdb,
+ 0xef, 0xb9, 0xea, 0x75, 0xdb, 0xbb, 0xea, 0xf7,
+ 0x5f, 0x7d, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe,
+ 0x7f, 0x66, 0xff, 0x7e, 0xd7, 0xf7, 0x7b, 0xdf,
+ 0xff, 0xbf, 0xfd, 0xef, 0xf7, 0xff, 0x7d, 0xbf,
+ 0xef, 0xbf, 0xff, 0xef, 0xff, 0xbf, 0xf9, 0xff,
+ 0xff, 0x6b, 0x67, 0xf7, 0x9c, 0xfb, 0xfe, 0xad,
+ 0x73, 0xfe, 0xf5, 0xd7, 0x53, 0x5f, 0xf9, 0xf9,
+ 0x97, 0xfb, 0x6f, 0xfe, 0xff, 0xaf, 0x7b, 0xdf,
+ 0xef, 0x7f, 0xdb, 0xff, 0xdf, 0xff, 0xff, 0xfb,
+ 0x6f, 0xbf, 0xff, 0xfe, 0xff, 0xeb, 0xff, 0x9b,
+ 0xff, 0xff, 0xbf, 0xff, 0xfb, 0xef, 0x97, 0xff,
+ 0x75, 0xfe, 0xfd, 0xcd, 0x3b, 0xff, 0xb1, 0xf3,
+ 0xff, 0xfb, 0xff, 0xff, 0xe6, 0xbf, 0xfb, 0x2f,
+ 0x7f, 0xff, 0xf7, 0xeb, 0xfe, 0xff, 0xf7, 0xef,
+ 0xff, 0xf7, 0xfe, 0xf3, 0xbf, 0xfc, 0xfb, 0xf7,
+ 0xbf, 0xb9, 0xdf, 0xfb, 0xff, 0xff, 0xf7, 0xfd,
+ 0x5f, 0xbf, 0xfd, 0xbf, 0xff, 0xff, 0xff, 0xff,
+ 0xab, 0xff, 0xdf, 0xff, 0xf7, 0x6b, 0xfe, 0x3f,
+ 0xee, 0xef, 0xf3, 0xfe, 0x37, 0xfe, 0xbf, 0xff,
+ 0x9e, 0x7f, 0xfe, 0x59, 0xff, 0x1f, 0x7d, 0xe4,
+ 0xf1, 0xfe, 0x9b, 0xff, 0x7f, 0xe7, 0x5f, 0xcb,
+ 0xfe, 0xbf, 0xfe, 0xff, 0xff, 0xbf, 0xff, 0xdc,
+ 0xfb, 0xde, 0xdf, 0xff, 0xfe, 0xf6, 0xfe, 0x66,
+ 0xfe, 0x7f, 0xaf, 0x7f, 0xce, 0xf2, 0xad, 0xfb,
+ 0xdf, 0x7f, 0xfb, 0xeb, 0xbf, 0x3d, 0xfd, 0xdf,
+ 0xfb, 0xfd, 0xff, 0xbf, 0xb1, 0x6f, 0xff, 0xaf,
+ 0x93, 0x9f, 0x72, 0xed, 0x6f, 0xff, 0xf9, 0xef,
+ 0xff, 0xff, 0x6f, 0xde, 0x7f, 0xff, 0xff, 0x7f,
+ 0x65, 0x7e, 0xff, 0xff, 0xfd, 0xf7, 0xf7, 0xff,
+ 0xff, 0xfb, 0xff, 0xff, 0xff, 0xef, 0xff, 0xef,
+ 0xff, 0xff, 0xff, 0xdf, 0xff, 0x9b, 0xf2, 0x7f,
+ 0xfe, 0xf1, 0x6f, 0xf9, 0xa9, 0xbf, 0x5e, 0x6f,
+ 0x7e, 0xf3, 0xad, 0xf7, 0xf5, 0x5c, 0xf2, 0xe5,
+ 0xff, 0xbf, 0x66, 0xff, 0xcf, 0xff, 0xbe, 0x5b,
+ 0xff, 0xfb, 0xaf, 0xd7, 0x9f, 0xef, 0xbc, 0xf9,
+ 0x7e, 0x3d, 0x2d, 0xbe, 0xff, 0xff, 0xb7, 0xc9,
+ 0x9f, 0x5b, 0x7e, 0xa5, 0xb3, 0x9e, 0xfa, 0xeb,
+ 0x7f, 0xfe, 0xfb, 0xef, 0xbf, 0x5f, 0xfa, 0xf9,
+ 0xef, 0xff, 0xff, 0x6f, 0xd4, 0x37, 0x9f, 0x7f,
+ 0xeb, 0xef, 0xa7, 0xff, 0xfa, 0xff, 0xff, 0xff,
+ 0xff, 0xef, 0x46, 0xdf, 0xfd, 0xf7, 0xff, 0x5f,
+ 0x99, 0xfb, 0xf1, 0xd7, 0xbd, 0xdf, 0x5f, 0x65,
+ 0xfd, 0xff, 0xcf, 0x7f, 0xfe, 0xf9, 0x6f, 0xaf,
+ 0xda, 0xec, 0xfb, 0xef, 0xef, 0x06, 0xfe, 0xbf,
+ 0x76, 0xfe, 0xfb, 0xa7, 0x59, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xcf, 0xdc, 0xff, 0xff,
+ 0xff, 0x93, 0x99, 0xff, 0x7a, 0xdf, 0xac, 0xff,
+ 0xc8, 0xd2, 0xff, 0xff, 0xd7, 0xbf, 0xfe, 0xfa,
+ 0x79, 0xe3, 0xfd, 0xff, 0x7f, 0xeb, 0x66, 0xec,
+ 0xbf, 0x1f, 0x7b, 0x29, 0x6c, 0x97, 0xfd, 0xff,
+ 0x3f, 0xfc, 0xe1, 0x87, 0x9f, 0xf7, 0xd9, 0xe9,
+ 0xa7, 0xbf, 0xba, 0x19, 0xf7, 0xfe, 0xff, 0x6f,
+ 0xb7, 0xdd, 0x7e, 0xdb, 0xff, 0xd7, 0xbb, 0xfe,
+ 0xf2, 0xeb, 0xff, 0xbf, 0xf6, 0xda, 0xeb, 0x77,
+ 0xe6, 0x7d, 0xfd, 0x7d, 0xf7, 0xd9, 0xef, 0x7d,
+ 0xff, 0xe6, 0xf9, 0xcf, 0x3f, 0xe3, 0xfc, 0xa3,
+ 0xcf, 0x3f, 0xff, 0xfc, 0xbd, 0xb9, 0xee, 0xfb,
+ 0xce, 0x31, 0xcf, 0xf8, 0x7b, 0xed, 0x3f, 0xff,
+ 0xf9, 0xe7, 0x9f, 0x6f, 0xdc, 0xf9, 0xe7, 0x1f,
+ 0xab, 0x6e, 0xee, 0xdf, 0xff, 0xff, 0xfd, 0xf6,
+ 0xdf, 0xff, 0xef, 0x7f, 0xff, 0xfb, 0xef, 0x3f,
+ 0xfb, 0xff, 0xfb, 0xef, 0xbf, 0x3b, 0x9b, 0xf9,
+ 0xfb, 0xff, 0xbf, 0xef, 0xfe, 0xfd, 0xff, 0xff,
+ 0xef, 0x7f, 0xff, 0xfd, 0xb7, 0xff, 0x7f, 0xff,
+ 0xfd, 0xbf, 0xef, 0xe6, 0xf6, 0x9f, 0xef, 0xfe,
+ 0xd0, 0xe2, 0x9d, 0xff, 0xfd, 0xf1, 0x8f, 0x17,
+ 0xfe, 0x38, 0xf1, 0x8f, 0x3e, 0xfe, 0x78, 0xbb,
+ 0x61, 0x7f, 0xff, 0xfb, 0x7d, 0xfe, 0xfa, 0x63,
+ 0xbf, 0xfe, 0xfe, 0xf7, 0xc5, 0x7f, 0x4f, 0xfc,
+ 0xf7, 0xdf, 0x7f, 0x7f, 0x6f, 0xfe, 0xff, 0xeb,
+ 0xea, 0xcd, 0xee, 0xfb, 0xfd, 0xbf, 0xdf, 0xff,
+ 0xff, 0xff, 0xdf, 0x57, 0xff, 0xfd, 0xf7, 0xff,
+ 0xff, 0x9b, 0xff, 0xff, 0x8f, 0x3e, 0xfe, 0xcc,
+ 0xf3, 0xcf, 0x3f, 0x3f, 0xbc, 0xe1, 0x86, 0x1f,
+ 0xfe, 0xf9, 0xe5, 0x8f, 0x1b, 0xfe, 0xe6, 0xff,
+ 0xfb, 0xef, 0xff, 0xf8, 0xe2, 0xff, 0xff, 0xff,
+ 0xfd, 0xef, 0x97, 0xff, 0x7e, 0xfd, 0xff, 0xff,
+ 0xff, 0xfe, 0xbf, 0xf9, 0xff, 0xfb, 0xfb, 0xff,
+ 0xff, 0xfe, 0xff, 0xff, 0xff, 0xdb, 0xbf, 0x74,
+ 0xfb, 0x4d, 0xbf, 0xff, 0xfe, 0xfb, 0xed, 0x6f,
+ 0xfe, 0xff, 0xff, 0xfe, 0xbf, 0xef, 0xfe, 0xfb,
+ 0xef, 0x9f, 0xf9, 0xd4, 0x33, 0xcf, 0x54, 0xff,
+ 0xd5, 0x37, 0xcf, 0xfc, 0x1b, 0xfe, 0xfe, 0xbf,
+ 0xff, 0xff, 0xef, 0x7f, 0xbf, 0xff, 0xbf, 0xfc,
+ 0xe3, 0x97, 0x5f, 0xfe, 0xfb, 0xe1, 0x87, 0x5f,
+ 0xfe, 0x66, 0xff, 0xdb, 0x7b, 0xbf, 0xfd, 0xc2,
+ 0xcf, 0xff, 0xff, 0xbf, 0xfe, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xbf,
+ 0xad, 0xbe, 0xfa, 0x72, 0xcb, 0xaf, 0x9f, 0xfe,
+ 0xfa, 0xd7, 0x5f, 0x7f, 0xfd, 0xe5, 0x97, 0x5f,
+ 0x7f, 0xfc, 0x6f, 0x3e, 0x9f, 0xef, 0xb2, 0xe3,
+ 0xff, 0xff, 0xef, 0xbf, 0xcd, 0x7f, 0xb6, 0xf9,
+ 0xe6, 0xbb, 0x7f, 0xf6, 0xd9, 0xf7, 0xfb, 0x9b,
+ 0xff, 0xff, 0xbf, 0xab, 0xb3, 0xfd, 0xf7, 0xfe,
+ 0x77, 0xfa, 0xcd, 0x2f, 0x3f, 0xbd, 0xfd, 0xdf,
+ 0x78, 0xb7, 0xff, 0x7f, 0xe6, 0xff, 0x7f, 0xdf,
+ 0xf5, 0xfd, 0xdf, 0xfd, 0xf7, 0xff, 0xf5, 0xff,
+ 0xff, 0xfe, 0xff, 0xfb, 0xfd, 0xf7, 0x7f, 0xff,
+ 0x97, 0xf1, 0xff, 0xbb, 0x2a, 0xb7, 0xff, 0xf9,
+ 0xfc, 0x63, 0x7f, 0xf7, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x67, 0xf8, 0xbf,
+ 0x77, 0xf7, 0xfb, 0xfb, 0xeb, 0xff, 0xed, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xfb, 0x99, 0x75, 0x7f, 0xbd, 0xef, 0xfb,
+ 0xef, 0xff, 0xfb, 0xfa, 0xbf, 0xfb, 0xff, 0xf7,
+ 0xff, 0xfe, 0xff, 0x7f, 0xf7, 0xdf, 0x7f, 0xc6,
+ 0xff, 0xbf, 0x6f, 0x2f, 0xfd, 0xbf, 0xfd, 0x49,
+ 0xfd, 0xfd, 0xce, 0xfe, 0xff, 0xfe, 0xff, 0xff,
+ 0xe7, 0xef, 0xdf, 0xbf, 0xb1, 0xcd, 0xff, 0xba,
+ 0xee, 0xf7, 0x7d, 0xcf, 0xfb, 0xfd, 0xff, 0xff,
+ 0xff, 0xff, 0xf3, 0xf7, 0xff, 0xf7, 0xff, 0xff,
+ 0x6f, 0xfc, 0x3f, 0xeb, 0xff, 0xff, 0x8f, 0xff,
+ 0xdf, 0xff, 0xf3, 0x9e, 0x77, 0xfe, 0x79, 0x07,
+ 0x9b, 0x6f, 0xfe, 0xb9, 0xff, 0x9b, 0xfb, 0x6f,
+ 0xff, 0xff, 0xff, 0xf7, 0xff, 0xef, 0x3f, 0xf7,
+ 0xe4, 0xe7, 0xfc, 0xfb, 0xef, 0xbf, 0xff, 0xfa,
+ 0xfb, 0xef, 0xe6, 0xdf, 0xdf, 0xbe, 0xd7, 0xce,
+ 0x77, 0xff, 0xaf, 0x73, 0xcf, 0x7f, 0xef, 0xbf,
+ 0xff, 0xf7, 0x7b, 0xeb, 0xbf, 0x9f, 0xbf, 0xf9,
+ 0xf7, 0xff, 0x7f, 0xdb, 0x9d, 0xbe, 0xd7, 0xcf,
+ 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff,
+ 0xdf, 0xff, 0xff, 0x6f, 0xf6, 0xff, 0xff, 0x9e,
+ 0xff, 0xff, 0xfe, 0x7f, 0xdd, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0x7f, 0xff, 0xfd, 0xff, 0xff, 0xff,
+ 0x1b, 0xfe, 0xff, 0xb1, 0x9b, 0xea, 0xbf, 0xbc,
+ 0xfe, 0xcf, 0x2f, 0x7f, 0xf3, 0xad, 0x37, 0xdf,
+ 0x7c, 0xf3, 0xe5, 0xf7, 0x3f, 0x66, 0xff, 0xff,
+ 0xe5, 0x97, 0xf7, 0x2f, 0x6f, 0xef, 0xff, 0xcd,
+ 0xff, 0xbf, 0xf9, 0xce, 0xbf, 0xee, 0xbf, 0xff,
+ 0xfe, 0xb7, 0xf9, 0xff, 0xff, 0xab, 0xac, 0xd6,
+ 0xf7, 0x6b, 0xfe, 0x7f, 0xff, 0xf3, 0xef, 0xbf,
+ 0xff, 0xfc, 0xfb, 0xef, 0xbf, 0xff, 0x6f, 0xd6,
+ 0xff, 0xff, 0x7e, 0xfa, 0xff, 0xff, 0xde, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xef, 0x7f, 0xff, 0xfe,
+ 0xf7, 0xdf, 0x5f, 0x9b, 0xfb, 0xff, 0xfd, 0x57,
+ 0x92, 0xf9, 0xbf, 0xed, 0x6f, 0xcf, 0x7f, 0xfe,
+ 0xf9, 0xef, 0xbf, 0xff, 0x5e, 0xfb, 0xef, 0xef,
+ 0x66, 0xfe, 0xff, 0xff, 0x9e, 0x7b, 0xaf, 0xad,
+ 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x57, 0xff, 0xff, 0xb3, 0xb1, 0xff, 0x3f,
+ 0x7f, 0xe1, 0xef, 0xff, 0x6b, 0x7d, 0xff, 0xd6,
+ 0xb7, 0xde, 0x7a, 0xf9, 0xfb, 0xff, 0xf5, 0xff,
+ 0xff, 0x66, 0xee, 0xff, 0x53, 0x6f, 0x19, 0xff,
+ 0xff, 0xc6, 0xff, 0x7f, 0xfc, 0xe3, 0x8f, 0xbf,
+ 0x7f, 0xf8, 0x69, 0x85, 0x9f, 0xbf, 0x9b, 0xf7,
+ 0x7f, 0xff, 0x6d, 0xf7, 0xff, 0x76, 0xff, 0x6f,
+ 0xd7, 0xbb, 0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xf6,
+ 0xfa, 0xeb, 0xf7, 0xe6, 0xfd, 0x9f, 0x7f, 0xe6,
+ 0x9b, 0x6f, 0x9e, 0xff, 0xf4, 0xf9, 0xcf, 0x3f,
+ 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xff, 0xfc, 0xbd,
+ 0xa1, 0xff, 0xf3, 0xcd, 0xb5, 0xdf, 0xfe, 0xe3,
+ 0xef, 0x3e, 0xfe, 0xf1, 0xc7, 0x1f, 0x7f, 0xfe,
+ 0xf9, 0xe7, 0x9f, 0xff, 0x66, 0xe6, 0xff, 0x6f,
+ 0xff, 0xfd, 0xf6, 0xff, 0x7f, 0xff, 0x7f, 0xff,
+ 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf,
+ 0x3f, 0x9b, 0x7b, 0xff, 0xf6, 0xbb, 0xef, 0xbe,
+ 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xef, 0xa6, 0x7e,
+ 0x5f, 0x2f, 0x9d, 0xf4, 0xda, 0x1d, 0xff, 0xff,
+ 0xf1, 0x85, 0x3f, 0xfe, 0xf8, 0xe3, 0x8f, 0x3f,
+ 0xfe, 0xf8, 0xab, 0x79, 0xff, 0xef, 0x8b, 0x7f,
+ 0xbe, 0xfa, 0xe7, 0xaf, 0xfe, 0x7e, 0xf1, 0xdf,
+ 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0x7f, 0x6f,
+ 0xfe, 0xff, 0xdf, 0xba, 0xeb, 0xaf, 0xff, 0xdb,
+ 0xfa, 0xff, 0x5f, 0xfe, 0xff, 0xdf, 0xbe, 0xff,
+ 0xfd, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, 0x8b,
+ 0x1e, 0x3f, 0xe8, 0xf3, 0x8b, 0x1e, 0x37, 0xd4,
+ 0xe1, 0x86, 0x1f, 0xfe, 0xf9, 0xe1, 0x86, 0x1b,
+ 0xfe, 0xe6, 0xff, 0xdf, 0x2f, 0xfe, 0xfd, 0xf3,
+ 0xcb, 0xef, 0xdf, 0xfd, 0xef, 0xbf, 0xff, 0xfe,
+ 0xf3, 0xef, 0x3f, 0xff, 0xfc, 0xbf, 0xf9, 0xff,
+ 0xf7, 0xe9, 0xa7, 0x97, 0xfd, 0xfa, 0xed, 0xfd,
+ 0xd7, 0xdf, 0xfe, 0xfa, 0xeb, 0xbf, 0xdf, 0x7e,
+ 0xfb, 0xeb, 0x6f, 0xfe, 0xff, 0xab, 0x6e, 0x9e,
+ 0xaa, 0xbe, 0xa8, 0xea, 0x9f, 0xfa, 0xcc, 0x53,
+ 0x4f, 0x7d, 0xff, 0xcc, 0x37, 0x5f, 0xfd, 0x9b,
+ 0xfd, 0xff, 0x83, 0x0e, 0x7a, 0xf8, 0xaf, 0x83,
+ 0xde, 0x7f, 0xfc, 0xe5, 0x8f, 0x3f, 0xfe, 0xfb,
+ 0xe5, 0x97, 0x3f, 0xfe, 0xe6, 0xff, 0xff, 0x6f,
+ 0xbe, 0xdc, 0xd6, 0xfb, 0x6f, 0xfd, 0xff, 0xfe,
+ 0xfd, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xfb,
+ 0xbf, 0xe9, 0xbf, 0xaf, 0x3f, 0xde, 0x72, 0xc9,
+ 0x2e, 0xbf, 0xf6, 0xba, 0xd7, 0x5f, 0x7f, 0xfd,
+ 0xf5, 0xd7, 0x5f, 0x7d, 0xfd, 0x6b, 0xf6, 0xff,
+ 0x6c, 0xd0, 0xed, 0xa6, 0xef, 0xfd, 0xfc, 0xcf,
+ 0x7f, 0xf6, 0xfd, 0xb7, 0x9f, 0x7f, 0xf7, 0xdb,
+ 0xef, 0xff, 0x1b, 0xef, 0x9f, 0xf7, 0xfb, 0xb7,
+ 0x6f, 0xe7, 0xdf, 0xff, 0xdd, 0x6f, 0xff, 0xff,
+ 0xff, 0xed, 0xfd, 0xbf, 0xff, 0xfe, 0x7f, 0xe6,
+ 0xff, 0xff, 0xae, 0x5f, 0x6f, 0xff, 0xdf, 0xff,
+ 0x7f, 0xdb, 0xd7, 0xef, 0x7e, 0xff, 0xfe, 0xf7,
+ 0xbb, 0xef, 0xff, 0xbf, 0xc9, 0xff, 0xff, 0xde,
+ 0xef, 0x3f, 0xfe, 0xea, 0xef, 0xff, 0x77, 0xf8,
+ 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x6d, 0xfe, 0xdf, 0xff, 0x7f, 0xef, 0xfb, 0x6b,
+ 0xbe, 0xfe, 0xff, 0xf7, 0xff, 0xff, 0xdf, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff,
+ 0xff, 0xff, 0xbb, 0xeb, 0xff, 0xfd, 0xbf, 0xd7,
+ 0xf7, 0xfd, 0xfe, 0xff, 0xff, 0xfd, 0xfd, 0xf7,
+ 0xef, 0xff, 0x66, 0xfd, 0xff, 0xff, 0xf5, 0xbf,
+ 0xfe, 0xab, 0x7e, 0xff, 0xff, 0xee, 0xfb, 0xfb,
+ 0xfe, 0xfb, 0xef, 0xbd, 0xff, 0xff, 0xb7, 0xf9,
+ 0xbf, 0x7f, 0xff, 0x7e, 0xde, 0xec, 0xdf, 0xff,
+ 0xfd, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0x7f,
+ 0xff, 0xff, 0xff, 0x6e, 0xfe, 0xff, 0xef, 0xf7,
+ 0xff, 0x5b, 0xff, 0x7b, 0xff, 0xd3, 0x9e, 0x77,
+ 0xde, 0x79, 0xff, 0x9f, 0x5f, 0xfe, 0xf9, 0xff,
+ 0x9b, 0xff, 0xff, 0xfd, 0xbf, 0xff, 0xef, 0xfd,
+ 0xfb, 0xff, 0xfb, 0xdf, 0x7f, 0xff, 0xfd, 0xff,
+ 0xdf, 0x77, 0xbf, 0xfd, 0xff, 0xe6, 0xfe, 0xdf,
+ 0xfd, 0xef, 0xff, 0xff, 0xef, 0x7f, 0x5f, 0x7f,
+ 0xfb, 0xeb, 0xbf, 0xff, 0xff, 0xfb, 0xef, 0xbf,
+ 0xbf, 0xbf, 0xf1, 0xff, 0xff, 0xff, 0xfb, 0xfe,
+ 0x7f, 0xd3, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x67, 0x6e,
+ 0xff, 0xff, 0xef, 0xff, 0xff, 0xb6, 0xfe, 0xff,
+ 0xff, 0xff, 0xff, 0xdf, 0xbf, 0xff, 0xff, 0xeb,
+ 0xff, 0xff, 0xfb, 0x9b, 0xfe, 0xf5, 0xff, 0xf6,
+ 0x2e, 0xab, 0xaf, 0xa6, 0x5e, 0x6f, 0x7e, 0xf3,
+ 0xcd, 0xf7, 0xc5, 0x5f, 0xf3, 0xcd, 0xf7, 0xbf,
+ 0x66, 0x7f, 0xfe, 0xef, 0xff, 0x5a, 0xf2, 0xab,
+ 0xaf, 0xe7, 0x9d, 0xef, 0xbc, 0xf3, 0x7e, 0x35,
+ 0xad, 0xbc, 0xf9, 0xfe, 0xb7, 0x49, 0xff, 0x7f,
+ 0xfd, 0xef, 0x97, 0xfe, 0xfa, 0xcb, 0x25, 0x67,
+ 0xf9, 0xef, 0xbf, 0x5f, 0xff, 0xf9, 0xef, 0xbf,
+ 0xeb, 0x6f, 0xd4, 0xff, 0x9f, 0x7f, 0xff, 0xaf,
+ 0xbf, 0xfe, 0xf0, 0xab, 0x5c, 0xfd, 0xf7, 0xdf,
+ 0xd7, 0xdf, 0xfe, 0xf7, 0xdf, 0x5e, 0x99, 0xfb,
+ 0xf5, 0xfd, 0xbe, 0xde, 0x69, 0xf5, 0xff, 0xf5,
+ 0xdf, 0xff, 0xfe, 0xfb, 0xef, 0xf5, 0xdf, 0xec,
+ 0xfb, 0x6f, 0x6f, 0x06, 0xfe, 0xff, 0xef, 0xff,
+ 0xba, 0xea, 0xbd, 0x7f, 0xff, 0xfb, 0xdf, 0xff,
+ 0xff, 0x7f, 0xf5, 0xdd, 0xfb, 0xff, 0xff, 0xb3,
+ 0x99, 0xff, 0x2f, 0xff, 0xef, 0xbf, 0xba, 0x5f,
+ 0x5f, 0xad, 0x76, 0xb5, 0x5f, 0x7e, 0x59, 0xff,
+ 0x7d, 0xff, 0xff, 0xff, 0x66, 0xec, 0xff, 0x57,
+ 0xff, 0x2f, 0xaf, 0xfd, 0x1f, 0x27, 0x6a, 0x5b,
+ 0xdb, 0xaf, 0xbf, 0xd7, 0xdf, 0xe9, 0xa7, 0x9e,
+ 0x3e, 0x1a, 0xf7, 0x7e, 0xff, 0xcf, 0xb7, 0xdf,
+ 0xff, 0xff, 0xef, 0xd7, 0xbb, 0xfe, 0xda, 0xeb,
+ 0xff, 0xbf, 0xf6, 0xfa, 0x6b, 0x77, 0xe6, 0x7d,
+ 0x9d, 0xff, 0xe6, 0x59, 0xe7, 0x3f, 0x7f, 0xc4,
+ 0xf9, 0xcf, 0x3f, 0xff, 0xfc, 0xff, 0xcf, 0x3f,
+ 0xff, 0xfc, 0x9d, 0xa9, 0xee, 0xe3, 0xed, 0x35,
+ 0xef, 0xf8, 0xfb, 0xef, 0x3f, 0xfe, 0xf1, 0xc7,
+ 0x1f, 0x7f, 0xff, 0xf9, 0xe7, 0x9f, 0xff, 0x64,
+ 0xee, 0xff, 0xbf, 0xff, 0xfd, 0xff, 0xdf, 0x7f,
+ 0xff, 0x7d, 0xff, 0xfb, 0xef, 0xbf, 0xff, 0xff,
+ 0xfb, 0xef, 0xbf, 0x3f, 0x9b, 0xf9, 0xff, 0xff,
+ 0xef, 0xef, 0xff, 0xfd, 0xf6, 0xbf, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xfd, 0xf7,
+ 0xef, 0xe6, 0xf6, 0x5f, 0xef, 0xff, 0xf0, 0xc7,
+ 0x6f, 0xff, 0xde, 0xf0, 0x8f, 0x3f, 0xfe, 0xf8,
+ 0xff, 0x8f, 0x3f, 0xfe, 0xf8, 0xbb, 0x61, 0xff,
+ 0xef, 0xaf, 0x3c, 0xfe, 0xf9, 0xef, 0x9f, 0x6e,
+ 0xfe, 0xf7, 0xdf, 0x7f, 0xff, 0xff, 0xf7, 0xdf,
+ 0x7f, 0x7f, 0x6f, 0xfa, 0xf7, 0xff, 0xff, 0xab,
+ 0xff, 0xff, 0xfe, 0xef, 0xef, 0xff, 0xff, 0xff,
+ 0xdf, 0xff, 0xfd, 0xfd, 0xff, 0xdf, 0xff, 0x9b,
+ 0xfe, 0xff, 0xcf, 0x3f, 0xfa, 0xdc, 0xf0, 0xcf,
+ 0x2f, 0x36, 0xbc, 0xe1, 0x86, 0x1f, 0xfe, 0xf8,
+ 0xe1, 0x86, 0x1f, 0xfe, 0xe6, 0xff, 0xff, 0xef,
+ 0xff, 0xff, 0xb2, 0x8d, 0xff, 0xff, 0xf8, 0xcf,
+ 0x3f, 0xff, 0xff, 0xbf, 0xef, 0x3f, 0xff, 0xff,
+ 0xbf, 0xe1, 0xff, 0xff, 0xef, 0xbf, 0xbf, 0xbe,
+ 0xff, 0xff, 0xea, 0xd7, 0xdf, 0xfe, 0xfa, 0xeb,
+ 0xbf, 0xdf, 0x7e, 0xfb, 0xeb, 0x6f, 0xfe, 0xff,
+ 0xfb, 0xef, 0xab, 0x2f, 0xf6, 0xfa, 0xeb, 0xaf,
+ 0xfa, 0xcd, 0x57, 0x5f, 0xfd, 0xff, 0xcc, 0x37,
+ 0x5f, 0xfd, 0x9b, 0xfb, 0xff, 0xff, 0xff, 0xfa,
+ 0xeb, 0xff, 0xbf, 0xef, 0x7e, 0xfc, 0xe5, 0x8f,
+ 0x3f, 0xfe, 0xfb, 0xe5, 0x97, 0x3f, 0xfe, 0xe6,
+ 0xff, 0xff, 0xfd, 0xbc, 0xbf, 0xf6, 0xff, 0xff,
+ 0xfe, 0xf7, 0xfe, 0xff, 0xf6, 0xfd, 0xff, 0x9f,
+ 0x7d, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0x2f, 0xbf,
+ 0xde, 0x90, 0xa9, 0xaf, 0xbe, 0xfe, 0xba, 0x17,
+ 0x5f, 0x7f, 0xfc, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd,
+ 0x6f, 0x3e, 0xff, 0xfc, 0xff, 0x6f, 0xaf, 0xfb,
+ 0xfa, 0xaf, 0xef, 0xf7, 0xf6, 0xfd, 0xef, 0xdf,
+ 0x7f, 0xbf, 0xdd, 0xef, 0xff, 0x9b, 0xff, 0x1f,
+ 0xf7, 0xcf, 0xf3, 0xfd, 0xbe, 0xff, 0xab, 0x3f,
+ 0xf7, 0xfd, 0x67, 0xdf, 0x7e, 0xfd, 0xfb, 0x3f,
+ 0xff, 0x7f, 0x66, 0x7f, 0xdf, 0xf7, 0xf4, 0xef,
+ 0xdb, 0x7f, 0xf7, 0x4d, 0x7f, 0xff, 0x6f, 0xee,
+ 0x9b, 0xfe, 0xf7, 0xef, 0xff, 0xff, 0x9f, 0xe1,
+ 0xbf, 0x7f, 0xdf, 0xfe, 0xaf, 0xff, 0x7f, 0xd3,
+ 0x7d, 0xf7, 0xfb, 0xee, 0xff, 0xff, 0xff, 0xef,
+ 0xff, 0xff, 0xff, 0x67, 0xfc, 0xff, 0xff, 0xff,
+ 0xff, 0x7f, 0xff, 0xef, 0xef, 0xff, 0xfa, 0xff,
+ 0x9f, 0xff, 0xff, 0xfd, 0xff, 0xdf, 0x7f, 0xff,
+ 0x99, 0xb5, 0xbf, 0xd9, 0xef, 0xff, 0xff, 0xfb,
+ 0xff, 0xf7, 0xff, 0xdf, 0xfe, 0xff, 0xef, 0xff,
+ 0xfe, 0xff, 0xff, 0xff, 0x7f, 0xc6, 0xff, 0xab,
+ 0xff, 0xff, 0xef, 0xf7, 0xff, 0x77, 0xff, 0xfd,
+ 0xe5, 0xbf, 0xef, 0x76, 0xfb, 0xef, 0xbf, 0xff,
+ 0xff, 0xbf, 0xb1, 0xef, 0xf7, 0xfe, 0xfd, 0xfd,
+ 0xd3, 0x5f, 0xff, 0xff, 0xff, 0xf3, 0xbf, 0xff,
+ 0x7f, 0xff, 0x37, 0xff, 0xff, 0xfb, 0x6f, 0xfc,
+ 0xff, 0xff, 0xbd, 0xa3, 0xf7, 0xff, 0xef, 0xfc,
+ 0xf3, 0x9e, 0x7f, 0xdd, 0x79, 0xe7, 0x9f, 0x77,
+ 0xfe, 0xf1, 0xff, 0x9b, 0xff, 0xff, 0x7f, 0xbf,
+ 0xf7, 0xbf, 0xf7, 0xbf, 0xfd, 0xfb, 0xdf, 0xff,
+ 0xbf, 0xbd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xef,
+ 0xe6, 0xfe, 0xef, 0xbf, 0xfb, 0xce, 0xfb, 0xef,
+ 0x77, 0x53, 0xe5, 0x6b, 0xff, 0xbd, 0xf7, 0xfe,
+ 0xfb, 0xef, 0xef, 0xbf, 0xbb, 0xf9, 0x77, 0xdd,
+ 0x47, 0x9f, 0x7f, 0xb6, 0xd9, 0x4f, 0xff, 0xde,
+ 0xdf, 0xff, 0xff, 0x7f, 0xdd, 0xff, 0xff, 0xff,
+ 0xff, 0x6d, 0xaa, 0xff, 0xff, 0xfd, 0xf7, 0xdf,
+ 0x76, 0xdf, 0xed, 0x7f, 0xff, 0xfb, 0xff, 0xff,
+ 0xdf, 0xff, 0xfb, 0xff, 0xff, 0xbf, 0x1b, 0xfe,
+ 0xbf, 0xd5, 0xfa, 0xfb, 0xef, 0xb9, 0x94, 0x5f,
+ 0x2a, 0x7f, 0xff, 0xe4, 0xf7, 0xc5, 0x7f, 0xf9,
+ 0xf9, 0xff, 0x3f, 0x66, 0xff, 0xfb, 0xec, 0xbe,
+ 0x57, 0xfe, 0xbb, 0xe9, 0x97, 0xfc, 0xaf, 0x7f,
+ 0xff, 0x7e, 0x9b, 0xef, 0xbf, 0xff, 0xff, 0xb7,
+ 0xf9, 0xff, 0x7b, 0xfb, 0xed, 0xb7, 0xd7, 0x5e,
+ 0xef, 0x2f, 0xff, 0xfb, 0xff, 0xbf, 0x4b, 0xfe,
+ 0xfb, 0x6f, 0xd6, 0xff, 0x6f, 0xd6, 0xbf, 0x5f,
+ 0x7b, 0xed, 0xb5, 0xd7, 0x5e, 0xfb, 0xeb, 0xff,
+ 0xfe, 0xfe, 0xef, 0xd4, 0xff, 0xfe, 0xbb, 0xf5,
+ 0x5f, 0x9b, 0xfb, 0xff, 0xd7, 0x66, 0xdb, 0x6d,
+ 0xb6, 0xbd, 0xf7, 0xca, 0xd7, 0xfe, 0xff, 0xef,
+ 0xd5, 0xfa, 0xfe, 0xdb, 0xff, 0xef, 0x66, 0xfe,
+ 0xff, 0xe6, 0xbe, 0x2b, 0xee, 0xbb, 0xe7, 0xbe,
+ 0xfa, 0xd5, 0xff, 0xff, 0x7f, 0xf5, 0xfe, 0xff,
+ 0xff, 0xfd, 0xb3, 0xb1, 0xff, 0xff, 0xbb, 0xef,
+ 0xb5, 0xdb, 0x6e, 0xae, 0xaf, 0x7d, 0xfd, 0xef,
+ 0xff, 0x59, 0xc7, 0x97, 0xdf, 0xd2, 0xff, 0x66,
+ 0xee, 0xff, 0xff, 0xdb, 0x2f, 0xb1, 0xc5, 0x16,
+ 0xdb, 0x2b, 0x5d, 0xe1, 0xff, 0x9f, 0xd7, 0xff,
+ 0xfb, 0xaf, 0xf5, 0xbf, 0x9b, 0xf7, 0xff, 0xbb,
+ 0xfd, 0xb6, 0xdb, 0x6e, 0xfb, 0xed, 0x97, 0xb8,
+ 0xfe, 0xfe, 0xeb, 0x7f, 0xbb, 0xfe, 0xda, 0xff,
+ 0xf7, 0xe6, 0xfd, 0xbf, 0x65, 0xbe, 0xc9, 0x26,
+ 0x9b, 0x6c, 0xf2, 0xd9, 0xcf, 0xbc, 0xff, 0xfc,
+ 0x37, 0xcf, 0x3f, 0xff, 0xff, 0xbd, 0xb1, 0xff,
+ 0xbb, 0x8b, 0x2f, 0xbf, 0xf8, 0xe2, 0x0b, 0x3f,
+ 0xef, 0xf9, 0xe7, 0x9f, 0x6b, 0xff, 0xf1, 0xc7,
+ 0xdf, 0xff, 0x66, 0xe6, 0xff, 0xff, 0xfe, 0xfb,
+ 0xef, 0xbf, 0xff, 0xfe, 0x7d, 0xff, 0xfb, 0xff,
+ 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xff, 0x3f, 0x9b,
+ 0xfb, 0xff, 0xbf, 0xff, 0xe6, 0xdb, 0x6f, 0xbf,
+ 0xed, 0xef, 0x7f, 0xff, 0xff, 0xf7, 0xdf, 0xff,
+ 0xff, 0xff, 0xff, 0xef, 0xa6, 0xfe, 0xff, 0x7f,
+ 0xfc, 0xf1, 0xc7, 0x1f, 0x7f, 0xbc, 0xf4, 0x85,
+ 0xbf, 0xff, 0x78, 0xed, 0x8f, 0x3e, 0xfe, 0xff,
+ 0xab, 0x61, 0xff, 0x2f, 0x9f, 0x7f, 0xde, 0x79,
+ 0xe7, 0x9f, 0x2f, 0x7e, 0xb1, 0xee, 0x7f, 0x4f,
+ 0xec, 0xf7, 0xdf, 0xff, 0x7f, 0x6f, 0xfe, 0xff,
+ 0xfe, 0x7f, 0xcb, 0xaf, 0xb7, 0xfe, 0x72, 0xeb,
+ 0xf7, 0xfd, 0xdf, 0xdf, 0xd7, 0xfd, 0xfd, 0xb7,
+ 0xff, 0xff, 0x9b, 0xff, 0xbf, 0xcf, 0x3d, 0xfa,
+ 0xc8, 0x23, 0x8f, 0x3e, 0x3a, 0xfc, 0xe1, 0x87,
+ 0x1f, 0xf4, 0xf8, 0xe1, 0x87, 0x5f, 0xfe, 0xe6,
+ 0xff, 0xff, 0x2f, 0xbf, 0xfc, 0xf2, 0x8b, 0xaf,
+ 0xbf, 0xfe, 0xe5, 0xb7, 0xff, 0xfe, 0xf9, 0xef,
+ 0xbf, 0xff, 0xf6, 0xbf, 0xf9, 0xff, 0xff, 0xcb,
+ 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0x5b, 0xbd,
+ 0xfc, 0xfb, 0xed, 0xaf, 0xbf, 0xfe, 0xba, 0xef,
+ 0x6f, 0xfe, 0xff, 0xfa, 0xea, 0x9f, 0x7f, 0xfe,
+ 0xfb, 0xef, 0xaf, 0xf9, 0xd4, 0x1b, 0xcf, 0x3c,
+ 0xff, 0xd4, 0x53, 0xff, 0xfd, 0x9b, 0xff, 0xbf,
+ 0xbf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xba,
+ 0xfc, 0xe3, 0x86, 0x5f, 0xfe, 0xfa, 0xe3, 0x8f,
+ 0x3b, 0xfe, 0x66, 0xff, 0x7f, 0xff, 0xf7, 0xff,
+ 0xdf, 0xbf, 0xef, 0xfe, 0xff, 0xfe, 0xff, 0xff,
+ 0x7f, 0xfb, 0xdf, 0x7f, 0xff, 0xff, 0xbf, 0xe9,
+ 0xff, 0xaf, 0xbf, 0x7c, 0xfa, 0xab, 0xaf, 0xbb,
+ 0xfe, 0xfa, 0xd3, 0x5f, 0x7f, 0xdd, 0xe5, 0x57,
+ 0x5f, 0x7e, 0xfd, 0x6b, 0xfe, 0xff, 0x7b, 0xbb,
+ 0xce, 0x36, 0xff, 0xee, 0xbf, 0xff, 0x7f, 0xfe,
+ 0xf9, 0x77, 0xb7, 0x7e, 0xff, 0x75, 0xff, 0xff,
+ 0x1b, 0xff, 0xfd, 0xf3, 0xcc, 0x7b, 0x7b, 0xf7,
+ 0xdf, 0x7f, 0x6f, 0xef, 0xdb, 0xef, 0x7f, 0xed,
+ 0xfb, 0xed, 0xff, 0xff, 0x7f, 0xe6, 0xff, 0xff,
+ 0xfd, 0x9f, 0xff, 0xfd, 0x75, 0xf7, 0xff, 0x17,
+ 0xa7, 0xdf, 0x7a, 0xfb, 0xff, 0xb7, 0xab, 0xef,
+ 0xff, 0xbf, 0xd9, 0xff, 0xff, 0xff, 0xbf, 0xd5,
+ 0xfe, 0x7c, 0xe3, 0x27, 0xf2, 0xfb, 0xe0, 0xbf,
+ 0x9b, 0xcf, 0xfb, 0x6f, 0xff, 0xff, 0x6f, 0xfe,
+ 0xfd, 0xbf, 0xff, 0xff, 0xdd, 0xff, 0xbb, 0xfe,
+ 0xdb, 0xfb, 0x7f, 0xbf, 0xff, 0xfb, 0xef, 0xe7,
+ 0xdf, 0xfe, 0xfe, 0x9b, 0xff, 0x75, 0xfe, 0xff,
+ 0xba, 0xfe, 0x1b, 0xfd, 0xef, 0xd7, 0xff, 0xff,
+ 0xff, 0xef, 0x73, 0xff, 0xff, 0xf7, 0xdc, 0xbf,
+ 0x66, 0xff, 0xff, 0x77, 0xff, 0xff, 0xff, 0xff,
+ 0xef, 0xfe, 0xff, 0xef, 0xff, 0xff, 0x7d, 0xff,
+ 0xfd, 0xff, 0xf7, 0xff, 0xbf, 0xf9, 0xff, 0x7f,
+ 0xff, 0x7e, 0xdf, 0xeb, 0xff, 0x6d, 0xfd, 0xbf,
+ 0xdf, 0xdf, 0xff, 0xdb, 0xcd, 0xfd, 0xdf, 0xff,
+ 0xeb, 0x6f, 0x3e, 0x3f, 0xee, 0xf7, 0xff, 0xda,
+ 0xff, 0xef, 0xff, 0xe3, 0x1f, 0x7e, 0xfa, 0xf9,
+ 0xd7, 0xff, 0xef, 0xff, 0xf9, 0xff, 0x9b, 0xff,
+ 0x7a, 0xfd, 0xdb, 0xef, 0xf7, 0xff, 0xff, 0xeb,
+ 0xfd, 0xef, 0x9b, 0xf5, 0xfd, 0xff, 0xff, 0xff,
+ 0x7f, 0xfe, 0xff, 0x66, 0xff, 0xdf, 0xfe, 0xff,
+ 0xee, 0xdb, 0xfe, 0x7f, 0xdf, 0xff, 0xbf, 0xfb,
+ 0x26, 0x2f, 0xad, 0xff, 0xbf, 0x6d, 0xfe, 0xbf,
+ 0xf1, 0xff, 0xff, 0xeb, 0xff, 0xff, 0x5c, 0xdf,
+ 0x8b, 0xfe, 0xf9, 0x7b, 0xff, 0xbf, 0x7f, 0xde,
+ 0xd7, 0xdf, 0x9f, 0xff, 0x67, 0xfe, 0xff, 0xff,
+ 0x7f, 0xfb, 0xaf, 0xff, 0xff, 0xbf, 0xbf, 0xff,
+ 0xbf, 0xff, 0x1d, 0xdf, 0xff, 0xfb, 0xff, 0xf5,
+ 0xfb, 0x9b, 0xfe, 0xe5, 0xd7, 0xf1, 0xff, 0xff,
+ 0xff, 0xb1, 0xff, 0x4f, 0xfd, 0xff, 0xe5, 0x2f,
+ 0x45, 0x7e, 0x4a, 0x4d, 0xe5, 0xbf, 0x66, 0x7f,
+ 0xfa, 0xf9, 0xfd, 0xff, 0xff, 0xff, 0xec, 0xe7,
+ 0x5f, 0xff, 0xfc, 0xf9, 0x4f, 0x9f, 0x5f, 0x56,
+ 0xd9, 0xf9, 0xb7, 0x49, 0xff, 0xfe, 0xbf, 0xff,
+ 0xff, 0xff, 0x7f, 0xfd, 0xaf, 0xfe, 0xff, 0xcf,
+ 0xbf, 0x4b, 0x65, 0x39, 0xef, 0x92, 0xf3, 0x6f,
+ 0xd4, 0xbf, 0xff, 0xff, 0xff, 0xfc, 0xf3, 0x9f,
+ 0x3f, 0xeb, 0xff, 0xff, 0xff, 0xdf, 0xd6, 0x7b,
+ 0xe7, 0x3b, 0xf5, 0x5e, 0x9b, 0xfb, 0xe7, 0xfd,
+ 0xff, 0xde, 0xed, 0xaf, 0xbf, 0xff, 0xdf, 0xff,
+ 0xfe, 0xf9, 0x6f, 0xf5, 0x79, 0x4e, 0x7b, 0x45,
+ 0xee, 0x06, 0x7e, 0xb8, 0xff, 0xfe, 0x16, 0xeb,
+ 0xeb, 0xef, 0xfe, 0xfb, 0xff, 0xff, 0xff, 0x7f,
+ 0x7d, 0x5f, 0x51, 0x5f, 0xfd, 0xb3, 0x99, 0xff,
+ 0xee, 0xff, 0xef, 0xfd, 0xff, 0xff, 0xeb, 0xaf,
+ 0xf7, 0xff, 0xff, 0xfe, 0x5f, 0xee, 0xbd, 0xde,
+ 0x57, 0xfb, 0x66, 0xec, 0xbf, 0xf7, 0xff, 0xef,
+ 0xff, 0xff, 0xff, 0xfa, 0x2b, 0xf1, 0xe1, 0x27,
+ 0x1e, 0xd6, 0x63, 0xe1, 0xaf, 0xb4, 0xb8, 0x1b,
+ 0xf7, 0x7f, 0xff, 0x6f, 0xff, 0xff, 0xf6, 0xf3,
+ 0xff, 0xd7, 0xbb, 0xfe, 0xfa, 0xeb, 0x7f, 0xbe,
+ 0xfe, 0xb2, 0xcb, 0x77, 0x66, 0xfd, 0x9f, 0xff,
+ 0xf7, 0xff, 0x67, 0xbf, 0xf9, 0xf7, 0xf9, 0xcf,
+ 0x3f, 0xff, 0xfc, 0x3f, 0xcf, 0x3f, 0xff, 0xac,
+ 0xbd, 0xb9, 0xfe, 0x43, 0xed, 0xbe, 0xdf, 0x40,
+ 0xfb, 0xef, 0x3e, 0xff, 0xf9, 0xe7, 0x9f, 0x6b,
+ 0xff, 0xf9, 0xc6, 0x1b, 0xfd, 0x66, 0xee, 0xff,
+ 0xff, 0xff, 0xff, 0xf3, 0xdf, 0xff, 0xff, 0x7f,
+ 0xff, 0xfb, 0xef, 0xbf, 0xfb, 0xef, 0x9b, 0x6f,
+ 0xbe, 0x3b, 0x9b, 0xf9, 0xff, 0xff, 0xff, 0x7f,
+ 0xff, 0xfb, 0xff, 0xff, 0xef, 0x7f, 0xff, 0xfd,
+ 0xd7, 0xff, 0x7e, 0xf7, 0xdf, 0xbf, 0xef, 0xe6,
+ 0xf6, 0x0b, 0xaf, 0xbf, 0x7f, 0xea, 0xfb, 0xed,
+ 0xff, 0xf5, 0xa5, 0x12, 0x7e, 0x78, 0xf5, 0x8d,
+ 0x17, 0x4e, 0xf8, 0xbb, 0x61, 0xff, 0xe2, 0xcb,
+ 0xef, 0xb6, 0xd8, 0xab, 0xbb, 0xff, 0x5e, 0xf1,
+ 0xc5, 0x1f, 0x5f, 0xff, 0xb1, 0xc5, 0x17, 0x7f,
+ 0x6f, 0xfe, 0xb7, 0xfc, 0x7a, 0xff, 0x2f, 0xfb,
+ 0xff, 0xff, 0xff, 0x5d, 0x77, 0x99, 0xe7, 0x97,
+ 0xdf, 0xee, 0xbb, 0xe5, 0xff, 0x9b, 0xff, 0xaf,
+ 0x8f, 0x3e, 0xff, 0xe8, 0xf3, 0xcf, 0x3f, 0x3f,
+ 0xd5, 0x41, 0x87, 0x1d, 0xf4, 0xd8, 0xe1, 0x07,
+ 0x1d, 0xfe, 0xe6, 0xff, 0xeb, 0x2f, 0xbf, 0xff,
+ 0xfa, 0xfb, 0xef, 0xff, 0xf9, 0xff, 0xbf, 0x7f,
+ 0x7f, 0xf1, 0xfd, 0x1f, 0x5f, 0xff, 0xbf, 0xe1,
+ 0xff, 0xfa, 0xeb, 0xef, 0xbf, 0xfe, 0xfb, 0xfb,
+ 0xff, 0xdb, 0xbf, 0x7e, 0xdb, 0x4d, 0xaf, 0xdd,
+ 0xf4, 0xd2, 0xed, 0x6f, 0xfe, 0xbf, 0xfa, 0xf2,
+ 0xbf, 0xaf, 0xfe, 0xfb, 0xef, 0xbf, 0xf1, 0xd5,
+ 0x33, 0xd7, 0xdc, 0xdf, 0xcd, 0x57, 0xd7, 0xfc,
+ 0x9b, 0xfb, 0xaf, 0xbf, 0xfc, 0xff, 0xeb, 0xff,
+ 0xff, 0xfd, 0xbf, 0xfb, 0xe3, 0x97, 0x5d, 0xe4,
+ 0xda, 0xe5, 0x0f, 0x5d, 0xfe, 0xe6, 0xff, 0xca,
+ 0xff, 0xff, 0xff, 0xd4, 0x7f, 0x3f, 0xf7, 0xfb,
+ 0xdf, 0xff, 0xff, 0xfb, 0xff, 0xed, 0xff, 0xdf,
+ 0xfe, 0xbf, 0xf9, 0xff, 0xaf, 0xbe, 0xfe, 0x7a,
+ 0xeb, 0xaf, 0xbf, 0xfa, 0xfa, 0xd7, 0x5f, 0x7b,
+ 0xfd, 0x31, 0x57, 0x5f, 0x77, 0xfd, 0x6f, 0x36,
+ 0x7f, 0xbf, 0xfb, 0xfd, 0xf6, 0xdf, 0xbf, 0xbf,
+ 0xff, 0x7f, 0xbc, 0xf9, 0xef, 0xff, 0x5e, 0xfd,
+ 0xfb, 0xf5, 0xff, 0x9b, 0xbf, 0xff, 0xdf, 0xff,
+ 0x3f, 0xff, 0xfd, 0xef, 0x7f, 0xff, 0xd7, 0xbd,
+ 0xd3, 0xb6, 0xff, 0x7f, 0xcf, 0xfd, 0xff, 0x7e,
+ 0xe6, 0xff, 0xbf, 0x3f, 0xff, 0xff, 0xb7, 0xfd,
+ 0xff, 0xdb, 0xf7, 0x3f, 0xed, 0xf7, 0xea, 0xf7,
+ 0xbb, 0xfd, 0xaf, 0xf7, 0xaf, 0x71, 0xff, 0xdf,
+ 0xeb, 0xff, 0x2f, 0xdf, 0x7f, 0xdd, 0xff, 0xdb,
+ 0xbd, 0xb7, 0xfe, 0x5f, 0xa9, 0xbf, 0xe9, 0xc7,
+ 0xf3, 0x67, 0xec, 0xdf, 0xbb, 0xfa, 0xff, 0xf6,
+ 0xff, 0xf7, 0xff, 0xfe, 0xbf, 0x7d, 0x5f, 0xfe,
+ 0xad, 0xfd, 0xdf, 0x3f, 0xff, 0xff, 0x9b, 0xff,
+ 0xff, 0xff, 0xbc, 0xff, 0xff, 0x9e, 0xef, 0xff,
+ 0xfb, 0xff, 0xf7, 0xff, 0xf3, 0xff, 0xff, 0xff,
+ 0x7f, 0xff, 0xbf, 0xc6, 0x5f, 0x7f, 0xcf, 0xff,
+ 0xff, 0xf6, 0xff, 0xfd, 0x3f, 0xe3, 0xcf, 0xf7,
+ 0xdf, 0xef, 0xef, 0x6f, 0xbf, 0xff, 0xbf, 0xbf,
+ 0xd1, 0xff, 0xcf, 0xef, 0xff, 0xfe, 0x1e, 0xff,
+ 0x7f, 0xec, 0x97, 0xff, 0xfd, 0xf6, 0xfe, 0xed,
+ 0xbf, 0xde, 0xff, 0xfe, 0x6f, 0xfc, 0x3d, 0xe7,
+ 0xac, 0xd0, 0x57, 0x3e, 0xef, 0xfc, 0xff, 0x9e,
+ 0xee, 0xdf, 0x6f, 0x6b, 0xec, 0xff, 0xff, 0x7f,
+ 0xff, 0x9b, 0xfa, 0xaf, 0xfe, 0xd6, 0xfa, 0xdf,
+ 0x7e, 0x9f, 0xfd, 0xdf, 0xb7, 0xfd, 0x9f, 0xbf,
+ 0xfb, 0xff, 0xfe, 0xff, 0xbf, 0xbf, 0xe6, 0xfe,
+ 0xab, 0x5f, 0xfb, 0xef, 0x7f, 0x67, 0x7e, 0x9f,
+ 0xfe, 0xa7, 0xbb, 0x59, 0xbe, 0x7f, 0x76, 0x7f,
+ 0xfd, 0xbf, 0xbf, 0xf9, 0xbf, 0xfb, 0xdf, 0xff,
+ 0xfe, 0x7a, 0xfb, 0xff, 0xff, 0xff, 0xfc, 0xff,
+ 0x9f, 0xfb, 0xff, 0xf9, 0xf7, 0xff, 0xff, 0x6f,
+ 0xee, 0xfd, 0xfe, 0xff, 0xff, 0xbf, 0xbb, 0xee,
+ 0xff, 0xbf, 0xbf, 0xff, 0xff, 0xf7, 0xff, 0x5f,
+ 0xff, 0xfd, 0xdf, 0xff, 0x1b, 0x7e, 0x75, 0xf7,
+ 0x95, 0x7f, 0x7f, 0xfd, 0xf1, 0xb5, 0xd7, 0xbe,
+ 0xf6, 0xda, 0xfb, 0xff, 0xbe, 0xf7, 0xdf, 0x0b,
+ 0xef, 0xa6, 0xff, 0xaf, 0xff, 0xb3, 0x5b, 0xcf,
+ 0x6b, 0xff, 0xd7, 0xc3, 0xf7, 0xf7, 0x53, 0x2f,
+ 0xf5, 0xb7, 0x72, 0xff, 0xff, 0xbf, 0xd9, 0xff,
+ 0xee, 0xff, 0xec, 0xff, 0xfd, 0xfe, 0x7f, 0xf5,
+ 0x7c, 0xff, 0xfd, 0xf2, 0x4b, 0x7e, 0x9f, 0xfd,
+ 0xff, 0xff, 0x6d, 0xfe, 0xb7, 0x5f, 0xff, 0xbb,
+ 0xff, 0xbf, 0xfc, 0xff, 0xff, 0xdd, 0x4f, 0xff,
+ 0xe5, 0x97, 0xdb, 0xef, 0xf5, 0xff, 0x7f, 0x1b,
+ 0xf5, 0xb5, 0xe7, 0xff, 0x7e, 0xfe, 0x8f, 0xff,
+ 0xff, 0x7f, 0xdd, 0xd3, 0x6f, 0xf9, 0xf5, 0xda,
+ 0x6b, 0xff, 0xff, 0x57, 0xe6, 0xbe, 0x6d, 0xff,
+ 0x95, 0xf7, 0xdb, 0x0b, 0xf5, 0xfd, 0xf6, 0x37,
+ 0xf3, 0x44, 0x33, 0xe5, 0x37, 0xf3, 0xfe, 0xff,
+ 0xbb, 0x91, 0xff, 0xee, 0x7f, 0xe7, 0xfe, 0x5b,
+ 0xfe, 0xbd, 0xbf, 0x7e, 0xf7, 0xbd, 0xd3, 0x4f,
+ 0x7d, 0xef, 0xbd, 0xff, 0xff, 0x6c, 0xec, 0xbf,
+ 0xcb, 0xff, 0xfa, 0xfd, 0x97, 0xbe, 0x3f, 0xff,
+ 0xdf, 0x6d, 0x7f, 0x65, 0xd4, 0xdf, 0xab, 0xed,
+ 0xff, 0xbf, 0x19, 0xf9, 0xbf, 0xbd, 0x57, 0x4e,
+ 0x3c, 0xec, 0xfe, 0xc3, 0xcf, 0xdf, 0xf2, 0x7b,
+ 0xf5, 0x15, 0xde, 0x78, 0xfb, 0xff, 0x6f, 0x86,
+ 0xbd, 0xd9, 0xff, 0xfb, 0xfd, 0xb7, 0xfd, 0x7e,
+ 0xdb, 0xfd, 0xec, 0xfd, 0xfd, 0xb3, 0xeb, 0xfd,
+ 0xff, 0xfd, 0xff, 0xbd, 0x79, 0x9f, 0xe6, 0x6b,
+ 0x7c, 0xfe, 0xd9, 0x67, 0x9c, 0x79, 0x7e, 0xf3,
+ 0x55, 0xfe, 0xf2, 0x7c, 0xff, 0x7d, 0xfe, 0x7f,
+ 0x6d, 0xa6, 0xbf, 0xf8, 0xfb, 0xcf, 0x35, 0xd3,
+ 0xfc, 0x73, 0xcd, 0x5f, 0xfc, 0xfd, 0xf6, 0x9f,
+ 0x5f, 0x7f, 0xfd, 0xf7, 0xbf, 0x99, 0xf8, 0xef,
+ 0xff, 0xff, 0xff, 0xfd, 0xf7, 0xff, 0xff, 0xff,
+ 0xf7, 0xff, 0x9f, 0xff, 0xbf, 0xf7, 0xdf, 0xff,
+ 0xff, 0xee, 0xe6, 0xfe, 0xfb, 0xff, 0xff, 0xeb,
+ 0x6f, 0xff, 0xff, 0xfe, 0xfb, 0xfd, 0xff, 0xf7,
+ 0xff, 0xf7, 0xfd, 0xb7, 0xff, 0xdf, 0xbb, 0xb9,
+ 0xfd, 0x47, 0xff, 0x2d, 0xdc, 0xd1, 0xe7, 0x4b,
+ 0x7f, 0xfc, 0xe3, 0xbf, 0xd7, 0xff, 0xf8, 0xef,
+ 0xbf, 0xff, 0xff, 0x6e, 0xde, 0xff, 0xf9, 0xe7,
+ 0x8b, 0x7f, 0xd6, 0xc9, 0xe2, 0x9d, 0xfd, 0xec,
+ 0xd3, 0xd5, 0x7f, 0xff, 0xfd, 0xf7, 0xff, 0xdf,
+ 0x9b, 0xff, 0x7f, 0xbb, 0xfe, 0xea, 0xfb, 0x6f,
+ 0xff, 0xff, 0xff, 0xbf, 0x5f, 0x7f, 0xbd, 0xff,
+ 0xfe, 0x5d, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff,
+ 0xa3, 0x8f, 0x2e, 0xf7, 0xfc, 0xfb, 0xcf, 0x3d,
+ 0x7f, 0xd4, 0x55, 0xd7, 0x1b, 0x7f, 0xd1, 0xe1,
+ 0x9f, 0xbf, 0xf9, 0xff, 0xe2, 0xcb, 0x7f, 0xfb,
+ 0xf9, 0xfe, 0xcb, 0x6f, 0x7e, 0xdd, 0xf5, 0x15,
+ 0xf7, 0x5e, 0xfd, 0xf5, 0xfb, 0xef, 0x6f, 0xfe,
+ 0xbf, 0xfe, 0xf2, 0xdf, 0xfb, 0xff, 0x7f, 0xf2,
+ 0xff, 0x5f, 0x1f, 0xfd, 0x74, 0xfb, 0x4b, 0x57,
+ 0x3d, 0xff, 0xff, 0x9b, 0xff, 0xaf, 0xfe, 0xfb,
+ 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xee, 0x57, 0xfb,
+ 0xd5, 0x75, 0x4f, 0x55, 0xff, 0xf5, 0xff, 0xff,
+ 0xe6, 0xff, 0xeb, 0x7f, 0xff, 0xef, 0xff, 0xff,
+ 0xfd, 0xff, 0xff, 0xf4, 0xfe, 0x59, 0xe6, 0xbf,
+ 0x75, 0xff, 0xfb, 0xef, 0xbf, 0xf9, 0xbf, 0xff,
+ 0xdb, 0x4f, 0xbf, 0xfd, 0xfe, 0xff, 0xef, 0xbf,
+ 0xff, 0xe7, 0x27, 0xf7, 0xff, 0xe7, 0xe9, 0xff,
+ 0xff, 0x6f, 0xf6, 0xff, 0xeb, 0xa6, 0xba, 0xde,
+ 0x7a, 0xe3, 0xa7, 0x37, 0xfe, 0xe5, 0xd3, 0x5d,
+ 0x7f, 0xec, 0xd5, 0xd6, 0x5f, 0xfb, 0x9b, 0xff,
+ 0xb7, 0xbe, 0xff, 0xbf, 0xf9, 0xff, 0xd7, 0x6c,
+ 0xdb, 0xff, 0xff, 0xf7, 0xe9, 0xbf, 0x7e, 0xff,
+ 0xff, 0xff, 0xff, 0xc6, 0xff, 0xff, 0xfe, 0xf9,
+ 0xef, 0x3f, 0xff, 0x1e, 0xf2, 0x7d, 0xff, 0xbd,
+ 0x6f, 0xbf, 0x6f, 0x7f, 0xfb, 0xfe, 0xfb, 0x9f,
+ 0xf9, 0xff, 0x7b, 0xff, 0xff, 0xff, 0xf7, 0xff,
+ 0xfd, 0xb5, 0xd3, 0xef, 0xfe, 0xf3, 0xee, 0xff,
+ 0xe7, 0xff, 0xff, 0xff, 0x6f, 0xf8, 0x3e, 0xe7,
+ 0xfa, 0x63, 0xfd, 0x37, 0xf9, 0xff, 0xbb, 0x7f,
+ 0x6e, 0xbd, 0xf5, 0xff, 0x7f, 0xff, 0xbd, 0xff,
+ 0xfe, 0x99, 0xff, 0xf9, 0xef, 0xfd, 0xfd, 0x7f,
+ 0xf6, 0xff, 0xbf, 0x7b, 0xff, 0x77, 0x5b, 0x7d,
+ 0xff, 0x7b, 0xd7, 0xdf, 0xff, 0xff, 0xe6, 0xff,
+ 0xef, 0xad, 0xff, 0xef, 0xb3, 0xdd, 0xff, 0x7f,
+ 0xf4, 0xe5, 0xd3, 0x3f, 0xff, 0xbf, 0xf5, 0xcf,
+ 0xff, 0xf7, 0xbf, 0xf9, 0xeb, 0xff, 0xdf, 0x7f,
+ 0x0f, 0xff, 0xff, 0x7f, 0xef, 0xfa, 0xff, 0xeb,
+ 0xbf, 0xf9, 0x7e, 0xfd, 0xe5, 0x7f, 0xff, 0x6f,
+ 0xfa, 0xee, 0x75, 0xe7, 0xff, 0xef, 0xf5, 0xdf,
+ 0xbf, 0xaf, 0xfd, 0xfa, 0xff, 0xfe, 0xff, 0xfb,
+ 0xee, 0xff, 0xbf, 0xf9, 0x9a, 0xff, 0xff, 0x7f,
+ 0xc3, 0x7f, 0xdf, 0xfe, 0xfb, 0xdf, 0xf8, 0x7f,
+ 0xfd, 0x7d, 0xf8, 0x6d, 0xe7, 0xef, 0xfb, 0xff,
+ 0xff, 0xe6, 0xff, 0xbf, 0x7e, 0xdf, 0xef, 0xff,
+ 0xbf, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0x56,
+ 0x7f, 0xb5, 0xff, 0xff, 0xff, 0xbf, 0xb9, 0xf7,
+ 0xe2, 0xcf, 0xff, 0xfe, 0x7d, 0xf7, 0x48, 0xbf,
+ 0xf7, 0x9b, 0xf4, 0x5f, 0xff, 0xfd, 0xff, 0xc7,
+ 0xfd, 0xff, 0x6e, 0xee, 0xff, 0xbe, 0xf9, 0x7f,
+ 0x7f, 0xff, 0xfd, 0xfb, 0xef, 0x57, 0x7f, 0xdd,
+ 0xf3, 0x7f, 0x7f, 0xff, 0x71, 0xfe, 0xff, 0x9b,
+ 0xfd, 0xbf, 0x7f, 0xdf, 0xbf, 0xff, 0xfe, 0xff,
+ 0xfe, 0xea, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xdf,
+ 0x9f, 0xf5, 0xff, 0xef, 0x86, 0xff, 0xff, 0xb9,
+ 0xf2, 0xf2, 0xef, 0x6f, 0xff, 0xb2, 0xca, 0x9f,
+ 0xf7, 0x5f, 0xcf, 0x93, 0x5d, 0x36, 0xeb, 0xfc,
+ 0x8f, 0xd9, 0xff, 0x3f, 0xfb, 0xf9, 0xff, 0xfb,
+ 0xfe, 0xff, 0xfc, 0xf3, 0x3f, 0xff, 0xd4, 0xf3,
+ 0xe7, 0xb7, 0x76, 0xfe, 0xff, 0x6d, 0xfe, 0xa7,
+ 0xce, 0x23, 0xab, 0xbf, 0x97, 0xff, 0x6f, 0x9e,
+ 0x55, 0x7d, 0xfb, 0xf5, 0x7c, 0xeb, 0xae, 0xf7,
+ 0xdf, 0xff, 0x9b, 0xf5, 0xa9, 0x3f, 0xff, 0x3e,
+ 0xef, 0xec, 0xff, 0xcf, 0x38, 0xd7, 0xbf, 0x7d,
+ 0x3c, 0xff, 0xfe, 0xf9, 0xff, 0xff, 0xd7, 0xe6,
+ 0xfe, 0x7f, 0x37, 0xd8, 0xfe, 0xde, 0xef, 0xf6,
+ 0xbd, 0x52, 0xbf, 0xd7, 0xeb, 0xfb, 0x7f, 0x94,
+ 0xf2, 0xed, 0xff, 0xbb, 0x99, 0xff, 0x5f, 0x78,
+ 0xff, 0xbf, 0xf7, 0xee, 0xff, 0xff, 0xfd, 0xaf,
+ 0xfc, 0xff, 0xff, 0x5f, 0xd7, 0xd4, 0xff, 0xff,
+ 0x6c, 0xec, 0xbf, 0xd6, 0x7b, 0xe9, 0xaf, 0xbf,
+ 0x5f, 0xef, 0xdf, 0x5f, 0x7f, 0xf9, 0xaf, 0xbf,
+ 0x59, 0x6f, 0xfd, 0xff, 0xbf, 0x99, 0xfb, 0xbf,
+ 0xed, 0x57, 0xde, 0x6b, 0xef, 0xf7, 0xc7, 0x1a,
+ 0xdf, 0xde, 0xaf, 0xf7, 0xed, 0x57, 0x76, 0xff,
+ 0xff, 0xef, 0xe6, 0xfd, 0xff, 0x7f, 0xff, 0x6f,
+ 0xbf, 0xfd, 0x78, 0xff, 0xff, 0x7e, 0xfb, 0xfd,
+ 0xfe, 0xdf, 0xaf, 0xff, 0xff, 0xff, 0xbd, 0x79,
+ 0xff, 0x7f, 0x9f, 0xff, 0xe6, 0xff, 0x6f, 0x9f,
+ 0x7f, 0xe7, 0xbf, 0xdf, 0x38, 0xfa, 0xaf, 0xb3,
+ 0xff, 0xff, 0x7f, 0x6f, 0xec, 0xd7, 0x6e, 0xd3,
+ 0xed, 0xbf, 0xff, 0xbe, 0x63, 0xcd, 0x7f, 0xf7,
+ 0xfd, 0x66, 0xdf, 0x63, 0x9e, 0xfd, 0xf7, 0xbf,
+ 0x99, 0xf9, 0xf7, 0xcf, 0x3f, 0xff, 0xff, 0xf7,
+ 0xff, 0xff, 0xff, 0xfd, 0xef, 0x9f, 0xff, 0xff,
+ 0xff, 0xec, 0xff, 0xff, 0xcf, 0xe6, 0xbe, 0xff,
+ 0xfb, 0xee, 0xff, 0x7f, 0xbf, 0xff, 0xff, 0xdf,
+ 0xff, 0xfe, 0xf7, 0xff, 0xff, 0xdf, 0xfe, 0xff,
+ 0xff, 0xbb, 0xa9, 0xff, 0xdf, 0x8f, 0xaf, 0xbd,
+ 0xf6, 0xda, 0x0f, 0xef, 0xfe, 0xef, 0x95, 0x37,
+ 0xff, 0x7d, 0xe1, 0xfd, 0xff, 0xff, 0x6a, 0xde,
+ 0xff, 0x7a, 0xe3, 0xab, 0xac, 0xfe, 0xfa, 0x63,
+ 0x8b, 0x7f, 0x7d, 0x95, 0x4f, 0xb7, 0x4f, 0x7c,
+ 0xfb, 0xff, 0xdf, 0x9b, 0xff, 0xbf, 0xd3, 0xcc,
+ 0xff, 0xff, 0xbd, 0xdf, 0xfa, 0xf3, 0xdf, 0x5f,
+ 0xaf, 0xff, 0xdf, 0xdf, 0xff, 0xff, 0xdf, 0xff,
+ 0xe6, 0xff, 0xef, 0xb3, 0xc7, 0x3f, 0xff, 0xfc,
+ 0xb3, 0x8f, 0x2e, 0xf7, 0xb0, 0xef, 0xa6, 0xbf,
+ 0xe4, 0xf1, 0xe7, 0x9f, 0xbf, 0xf9, 0xff, 0xfb,
+ 0xcf, 0xb5, 0xff, 0xfe, 0xf2, 0xcf, 0x67, 0xff,
+ 0xfd, 0xf5, 0xf7, 0xff, 0xfe, 0xfb, 0xf6, 0xff,
+ 0xff, 0x6f, 0xfe, 0xff, 0xfe, 0xfb, 0xfb, 0xbf,
+ 0xff, 0x7e, 0xfb, 0xeb, 0x7b, 0x3f, 0xfd, 0xfe,
+ 0xbb, 0xef, 0xfe, 0xff, 0xff, 0xff, 0x9b, 0xff,
+ 0xbf, 0xfe, 0xf8, 0xeb, 0xaf, 0x3f, 0xde, 0xf8,
+ 0xa3, 0x5f, 0x4b, 0x9d, 0x17, 0xfe, 0x78, 0x5f,
+ 0xff, 0xff, 0xff, 0xe6, 0xff, 0xef, 0xbf, 0xb7,
+ 0xff, 0xfb, 0xff, 0xbd, 0xb7, 0xfc, 0xf7, 0xf6,
+ 0xf9, 0xe7, 0xdb, 0xf7, 0xf6, 0xff, 0xff, 0xbf,
+ 0xf9, 0xff, 0xf6, 0x5b, 0xef, 0xa7, 0xff, 0xf3,
+ 0xff, 0xef, 0x7e, 0xfb, 0xe5, 0xff, 0x5f, 0x7e,
+ 0xf9, 0xed, 0x7f, 0xff, 0x6f, 0xfa, 0xff, 0xe9,
+ 0xaf, 0xbe, 0xf8, 0xea, 0xeb, 0xaf, 0xbe, 0xfe,
+ 0xf5, 0xc7, 0x5f, 0x74, 0xbd, 0x35, 0xd7, 0x5f,
+ 0xfb, 0x9a, 0xbd, 0xc7, 0x1e, 0xff, 0xbd, 0xe7,
+ 0x7b, 0xff, 0xff, 0xd9, 0x67, 0x37, 0xfe, 0xdf,
+ 0x7f, 0xdf, 0xdf, 0xef, 0xff, 0xff, 0xc6, 0xff,
+ 0xdf, 0xfe, 0xff, 0x7f, 0xdf, 0xd7, 0xf7, 0xff,
+ 0xbe, 0x7f, 0xde, 0xef, 0xff, 0x77, 0xff, 0x7f,
+ 0xf7, 0xff, 0x9f, 0xf9, 0xff, 0xff, 0x7f, 0x7f,
+ 0x7d, 0xdb, 0xff, 0xff, 0x7e, 0xdf, 0xaf, 0xbd,
+ 0xfe, 0xf7, 0xff, 0xf2, 0xff, 0xff, 0xff, 0x6f,
+ 0xfe, 0x3f, 0xdf, 0x74, 0xe9, 0xa9, 0xef, 0x7f,
+ 0xff, 0xfd, 0x7e, 0xdd, 0xff, 0xff, 0x94, 0x53,
+ 0x7b, 0xfd, 0x5f, 0xfe, 0x9b, 0xff, 0xff, 0xff,
+ 0xf7, 0xb7, 0xdf, 0xff, 0xfe, 0xff, 0xff, 0xff,
+ 0xff, 0xf7, 0xef, 0x73, 0xb3, 0xf7, 0xfe, 0xf7,
+ 0xff, 0xe6, 0xef, 0xff, 0xbb, 0x37, 0xfe, 0xf6,
+ 0xff, 0xfb, 0x73, 0xfe, 0x7d, 0xdf, 0xff, 0xff,
+ 0xfd, 0x7f, 0xc7, 0x7f, 0xfb, 0xbf, 0xf9, 0x7f,
+ 0xf7, 0xd3, 0xef, 0xbf, 0xff, 0xff, 0x9f, 0x6f,
+ 0xfb, 0xfb, 0xf4, 0x97, 0x1f, 0x7d, 0xfb, 0xe5,
+ 0xf7, 0xfd, 0x6f, 0xf6, 0xfe, 0xff, 0xfe, 0xfb,
+ 0xb7, 0xfd, 0xbf, 0x8f, 0x7b, 0xff, 0xef, 0xfb,
+ 0xff, 0xff, 0x73, 0xff, 0xff, 0xe6, 0xff, 0x9b,
+ 0xfd, 0xfb, 0xff, 0x73, 0xbf, 0xff, 0xc7, 0x0b,
+ 0x7f, 0x2f, 0xfd, 0xef, 0xb5, 0x9f, 0xee, 0xff,
+ 0xd7, 0xf7, 0xee, 0xff, 0x66, 0xff, 0xff, 0xff,
+ 0xfe, 0xff, 0x7f, 0xeb, 0xaf, 0xff, 0xfb, 0x7f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbf, 0xff,
+ 0xbf, 0xf9, 0xff, 0xff, 0xcf, 0xa6, 0xff, 0xbe,
+ 0xff, 0xbd, 0xb7, 0xdf, 0xbf, 0xd7, 0xde, 0x5c,
+ 0xab, 0x7f, 0xa6, 0xff, 0xff, 0x6f, 0xfc, 0xfb,
+ 0xed, 0xf9, 0xff, 0xb7, 0xfb, 0xff, 0xd7, 0x8f,
+ 0xff, 0xf7, 0xf8, 0xfb, 0x9f, 0xff, 0xff, 0xdd,
+ 0xff, 0xff, 0x98, 0xff, 0xff, 0x7f, 0xff, 0xff,
+ 0xf3, 0xff, 0xfd, 0xff, 0xfa, 0xff, 0xbf, 0xff,
+ 0xff, 0xf7, 0x7f, 0x9f, 0xff, 0xff, 0xff, 0xa6,
+ 0xfc, 0xfb, 0xf9, 0xf2, 0x93, 0x6f, 0xfa, 0xfc,
+ 0xfe, 0xff, 0xdd, 0x5f, 0xff, 0xfd, 0xf7, 0xff,
+ 0x5c, 0xd9, 0xfd, 0xaf, 0xd9, 0xff, 0x7f, 0xfe,
+ 0xf9, 0xff, 0x9d, 0x3f, 0xff, 0xff, 0xff, 0xf5,
+ 0xdf, 0x77, 0xff, 0xfd, 0xff, 0x6d, 0xb6, 0xff,
+ 0x6d, 0xde, 0xa7, 0x56, 0x6f, 0x9a, 0xff, 0xbf,
+ 0xff, 0x2f, 0xff, 0x5f, 0xff, 0xfd, 0x7f, 0xde,
+ 0xeb, 0x7f, 0x8b, 0xe7, 0xdf, 0x1b, 0xf5, 0xbd,
+ 0xe7, 0x9f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x7f,
+ 0xd7, 0xff, 0x7f, 0xff, 0xf7, 0xfe, 0xd3, 0x4f,
+ 0xf7, 0x57, 0xe6, 0xfe, 0xfa, 0xff, 0xdb, 0xf0,
+ 0xd2, 0x7b, 0xff, 0xfd, 0xb7, 0xfd, 0x97, 0x7e,
+ 0x32, 0x6b, 0x77, 0x73, 0x6a, 0xb3, 0xbb, 0x99,
+ 0xff, 0xef, 0xfd, 0xb7, 0xbf, 0xf4, 0xef, 0xff,
+ 0xff, 0xfe, 0xd5, 0xbc, 0xd3, 0xce, 0x7b, 0xb7,
+ 0xdc, 0x73, 0xff, 0x6c, 0xec, 0xbf, 0xbe, 0xff,
+ 0xea, 0x2f, 0xbd, 0xc7, 0xff, 0xbf, 0x5d, 0x7b,
+ 0x7d, 0xf7, 0xd5, 0x5f, 0x7f, 0x37, 0xd7, 0xbf,
+ 0x19, 0xf8, 0xbf, 0xbf, 0xf7, 0x0a, 0x4b, 0xff,
+ 0xfc, 0xf3, 0x3e, 0xd6, 0xdb, 0x7a, 0xe9, 0xa5,
+ 0xd7, 0xcb, 0x5b, 0xef, 0x6f, 0xe6, 0x3d, 0xff,
+ 0xf6, 0xfb, 0xff, 0x3f, 0xdf, 0x7f, 0xff, 0xff,
+ 0x7e, 0xb9, 0xff, 0xb6, 0xdb, 0xff, 0xbf, 0xfc,
+ 0xfb, 0xbd, 0x79, 0xdf, 0x7f, 0xbe, 0x75, 0xfe,
+ 0xf9, 0x67, 0x9f, 0xff, 0xe6, 0xe7, 0xdf, 0x7f,
+ 0xff, 0xad, 0xbf, 0xcf, 0xfa, 0x7e, 0x6f, 0xec,
+ 0xfb, 0xfe, 0x3b, 0xcd, 0x37, 0xd7, 0xe4, 0xf3,
+ 0x6f, 0x77, 0xff, 0xf5, 0xd7, 0x5f, 0x63, 0xa7,
+ 0xd1, 0xf7, 0xbf, 0x99, 0xf9, 0xf7, 0xff, 0xff,
+ 0xbf, 0xfd, 0xf7, 0xff, 0xff, 0xff, 0xfc, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xef, 0xfb, 0xff, 0xce,
+ 0xe6, 0x7e, 0xff, 0xff, 0xff, 0xbf, 0xaf, 0xbf,
+ 0xff, 0xfe, 0xef, 0xdf, 0xff, 0xff, 0xff, 0xff,
+ 0x7f, 0xff, 0xff, 0xef, 0xbb, 0xb9, 0xff, 0xff,
+ 0x6f, 0x37, 0xf5, 0xf7, 0xc2, 0x5f, 0xaf, 0xfd,
+ 0xed, 0xa7, 0x97, 0x7e, 0x7a, 0xfd, 0xa4, 0xff,
+ 0xff, 0x6e, 0xde, 0xff, 0xfd, 0xab, 0x9f, 0x7e,
+ 0x96, 0xf8, 0xe7, 0x8b, 0xde, 0xfd, 0xf5, 0xd5,
+ 0x5f, 0x5f, 0x7e, 0xf1, 0xce, 0xdf, 0x9b, 0xff,
+ 0xaf, 0xbf, 0xde, 0xfb, 0xff, 0x3f, 0xff, 0xff,
+ 0xff, 0xff, 0x5f, 0xff, 0xff, 0xf7, 0xdf, 0x7f,
+ 0xff, 0xff, 0xff, 0xe6, 0xff, 0xeb, 0xa3, 0xcf,
+ 0x3f, 0xff, 0xf8, 0xf3, 0xcf, 0x3f, 0xff, 0xd0,
+ 0xe1, 0x87, 0x1d, 0xfc, 0xd1, 0xe7, 0x9f, 0xbf,
+ 0xf9, 0xff, 0xfb, 0xef, 0xff, 0xff, 0xff, 0xfa,
+ 0xdf, 0x2f, 0xff, 0xf1, 0xf7, 0xdf, 0x5f, 0xff,
+ 0xf3, 0xfd, 0xd7, 0xff, 0x6f, 0xfe, 0xbf, 0xff,
+ 0xfb, 0xff, 0xff, 0xbf, 0xfe, 0xf7, 0xeb, 0xdf,
+ 0xbf, 0xbd, 0xf6, 0xd2, 0xed, 0xff, 0xff, 0xf5,
+ 0xff, 0x9b, 0xff, 0xbf, 0xff, 0xfb, 0xef, 0xbf,
+ 0xaf, 0xfe, 0xfb, 0xe7, 0x7f, 0xfb, 0xd5, 0x55,
+ 0xdf, 0xfc, 0xff, 0x7d, 0xf5, 0xff, 0xe6, 0xff,
+ 0xfb, 0xff, 0xff, 0xff, 0xfb, 0xeb, 0xff, 0xff,
+ 0xff, 0xff, 0xfa, 0x63, 0x8f, 0x5f, 0xee, 0xff,
+ 0x5f, 0xff, 0xbf, 0xf9, 0xff, 0xf5, 0x9b, 0x3f,
+ 0xff, 0xff, 0xfe, 0xff, 0x6f, 0xbe, 0xff, 0xe5,
+ 0x97, 0x5f, 0xde, 0xff, 0xe7, 0x97, 0xff, 0x6f,
+ 0xfe, 0xff, 0xeb, 0xad, 0xbf, 0xfe, 0xf2, 0xeb,
+ 0xaf, 0x3f, 0xee, 0xe5, 0xd7, 0x5f, 0x7d, 0xfd,
+ 0xb5, 0xc7, 0x5b, 0xff, 0x9b, 0xcd, 0xf7, 0xbb,
+ 0xff, 0xbb, 0xcf, 0xdf, 0xfd, 0xf8, 0xd8, 0x5f,
+ 0x3d, 0xfb, 0xba, 0xf3, 0x7e, 0x7e, 0xdf, 0xfd,
+ 0xff, 0xe6, 0xff, 0xbf, 0xff, 0xff, 0xfd, 0xdd,
+ 0xff, 0x27, 0xde, 0x7a, 0xff, 0xff, 0xdf, 0xf7,
+ 0x5f, 0xde, 0xff, 0xf7, 0xfb, 0x9f, 0xf9, 0xff,
+ 0xbf, 0xfd, 0xdf, 0xff, 0xfe, 0xff, 0xbd, 0xfa,
+ 0xf4, 0xdd, 0xba, 0xfb, 0xaf, 0xff, 0xef, 0xb7,
+ 0xdf, 0xff, 0x6f, 0xfc, 0x3f, 0xfe, 0xf8, 0xeb,
+ 0xbc, 0xbf, 0xf6, 0x7f, 0x6b, 0xff, 0x77, 0xff,
+ 0xf5, 0xd7, 0xdf, 0xef, 0xbf, 0xf1, 0xff, 0x19,
+ 0xff, 0xef, 0xff, 0xef, 0xfb, 0xbb, 0x76, 0xef,
+ 0xbf, 0x7a, 0xff, 0xff, 0xf6, 0xda, 0xeb, 0xbd,
+ 0xef, 0xff, 0xff, 0xff, 0xe6, 0xed, 0xff, 0xef,
+ 0xbf, 0xff, 0xb9, 0xdb, 0xff, 0xfb, 0xff, 0xff,
+ 0x7f, 0x3f, 0xff, 0xfc, 0xf3, 0xdf, 0x5f, 0xfb,
+ 0xbf, 0xf1, 0xbf, 0xff, 0x7f, 0xff, 0xb9, 0xfb,
+ 0xff, 0xff, 0x7f, 0xef, 0xfb, 0xef, 0xf3, 0xdf,
+ 0xfb, 0xff, 0xf9, 0xf7, 0xff, 0x6f, 0xfc, 0xff,
+ 0xff, 0xdf, 0xfe, 0xbe, 0xf6, 0xf7, 0xef, 0xfd,
+ 0xff, 0xfb, 0xb7, 0x9d, 0x77, 0xf2, 0xff, 0xed,
+ 0xe6, 0xfb, 0x1b, 0xfe, 0xff, 0xff, 0xff, 0xee,
+ 0x33, 0xce, 0x1f, 0xfd, 0xa7, 0xff, 0xf7, 0xfb,
+ 0xdf, 0xff, 0xff, 0xff, 0xf7, 0xf6, 0xff, 0xe6,
+ 0xff, 0xfe, 0xff, 0xa7, 0xff, 0xf7, 0xdb, 0xaf,
+ 0xff, 0x5f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xfd, 0x7f, 0xff, 0xb7, 0xf9, 0xf7, 0xf7, 0xff,
+ 0xfb, 0x5d, 0x7f, 0x57, 0xfd, 0xad, 0xff, 0xfd,
+ 0xe7, 0xdf, 0x7f, 0x3f, 0xed, 0xf5, 0x97, 0xff,
+ 0x6f, 0xf6, 0xbf, 0xf6, 0xfa, 0xbf, 0xff, 0xff,
+ 0xff, 0xff, 0xe9, 0x3f, 0xb3, 0xfc, 0xfb, 0xef,
+ 0x7f, 0xff, 0xfd, 0xf5, 0xfb, 0x9b, 0xfe, 0xff,
+ 0xff, 0xfb, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xef,
+ 0xef, 0x6f, 0xff, 0xff, 0xff, 0xef, 0x7f, 0xfd,
+ 0xff, 0xfb, 0x86, 0xff, 0xab, 0xaf, 0xbf, 0xc9,
+ 0x2f, 0xbf, 0xfc, 0xe4, 0x9b, 0xbf, 0xf7, 0xff,
+ 0xcb, 0xe7, 0x9f, 0x7f, 0x7e, 0xff, 0x8f, 0xd9,
+ 0x5f, 0xff, 0xff, 0x6f, 0xf1, 0x95, 0x3f, 0xff,
+ 0xf9, 0xf2, 0xff, 0xfd, 0xd7, 0x4b, 0x7f, 0xf5,
+ 0xd5, 0xf4, 0xff, 0x6d, 0xfe, 0xf7, 0xdb, 0x3f,
+ 0xef, 0x7f, 0xbf, 0xfa, 0xef, 0xff, 0x5f, 0xe3,
+ 0xbd, 0xf5, 0x56, 0x5b, 0x6f, 0x9d, 0xbd, 0xff,
+ 0x9b, 0xf5, 0xa5, 0x97, 0xce, 0xfb, 0xff, 0xac,
+ 0xff, 0xff, 0x3b, 0xd7, 0x7f, 0xaf, 0xbf, 0xfe,
+ 0xfa, 0xeb, 0x4f, 0xff, 0xd7, 0xe6, 0xfe, 0x6b,
+ 0xa5, 0x9f, 0xff, 0xc7, 0x7f, 0xff, 0xfd, 0x77,
+ 0xff, 0xf7, 0x5f, 0x3b, 0xdd, 0x34, 0xd3, 0xde,
+ 0xab, 0xbb, 0x99, 0xff, 0xdf, 0xfd, 0xe2, 0xfe,
+ 0x58, 0xef, 0xbf, 0xef, 0xca, 0xf7, 0xfd, 0xff,
+ 0xf6, 0xbf, 0xef, 0x3e, 0x73, 0xef, 0x6c, 0xec,
+ 0xff, 0xbf, 0xff, 0x6f, 0xff, 0x95, 0xfe, 0xff,
+ 0x9f, 0x5f, 0xef, 0xfd, 0xff, 0xfe, 0xf7, 0xdf,
+ 0xff, 0xfd, 0xbd, 0x99, 0xf9, 0xaf, 0xbd, 0x56,
+ 0xfb, 0x17, 0xad, 0xf4, 0x53, 0x52, 0xd7, 0x70,
+ 0x7f, 0x2d, 0xb4, 0xd7, 0x5e, 0x7b, 0x87, 0xef,
+ 0x66, 0xfd, 0xfb, 0xee, 0xfb, 0xef, 0xdf, 0xde,
+ 0x7b, 0xff, 0xbf, 0x7e, 0xfb, 0xdf, 0x77, 0xdf,
+ 0x7d, 0xff, 0xfd, 0xb2, 0xbd, 0x79, 0xff, 0x3e,
+ 0xbb, 0xac, 0xf3, 0xd1, 0xe7, 0x9f, 0xff, 0xf7,
+ 0xbf, 0xdd, 0xf7, 0xd9, 0x65, 0x9f, 0x7d, 0x3e,
+ 0x7b, 0x6f, 0xec, 0x9f, 0x7e, 0xfa, 0xef, 0xbf,
+ 0xec, 0xf4, 0xf3, 0xed, 0x73, 0x77, 0xfd, 0xf5,
+ 0xd7, 0x4f, 0x3f, 0xfd, 0xe6, 0xbd, 0x99, 0xf9,
+ 0x66, 0x8f, 0xfd, 0xff, 0x3f, 0xff, 0xff, 0xef,
+ 0xbf, 0xfd, 0xcf, 0x3f, 0xfb, 0x6c, 0xb3, 0xdd,
+ 0xb6, 0xef, 0xcf, 0xe6, 0xfe, 0xda, 0x6e, 0xff,
+ 0xff, 0xff, 0xbf, 0xff, 0xfe, 0xdf, 0xff, 0xfe,
+ 0xdd, 0x76, 0xbb, 0xed, 0xb7, 0xfd, 0xfd, 0xab,
+ 0xa9, 0xdf, 0x5b, 0x6f, 0xfd, 0xfd, 0xd7, 0xc2,
+ 0x1f, 0xbf, 0xfc, 0xbf, 0xff, 0xd7, 0x5e, 0x7b,
+ 0xad, 0xb5, 0x97, 0xfe, 0x6e, 0xd8, 0xbf, 0xfb,
+ 0x2e, 0xbf, 0x77, 0xbe, 0xf8, 0xef, 0xad, 0xfd,
+ 0x7d, 0x95, 0xdf, 0x7f, 0xfd, 0xed, 0xf7, 0xc5,
+ 0xdf, 0x98, 0xff, 0xef, 0xbf, 0xff, 0xfa, 0xeb,
+ 0xaf, 0xfe, 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xe6, 0xff,
+ 0xef, 0xb3, 0x8f, 0x3e, 0xfa, 0xe8, 0xf3, 0xcf,
+ 0x3c, 0xff, 0xd1, 0x47, 0x1f, 0x7d, 0xf4, 0xd1,
+ 0x47, 0x9f, 0xbf, 0xf9, 0xef, 0xfe, 0xfb, 0xaf,
+ 0xbf, 0xfe, 0xf2, 0xdf, 0x6f, 0x7e, 0xfd, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x6f,
+ 0xf8, 0xff, 0xfe, 0xfb, 0xeb, 0xaf, 0xbf, 0xfc,
+ 0xf7, 0xfb, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 0x5f,
+ 0x7f, 0xfd, 0xff, 0xff, 0x9b, 0xff, 0xbf, 0xfe,
+ 0xfa, 0xef, 0xab, 0xaf, 0xfe, 0xfb, 0xee, 0x57,
+ 0xff, 0x7d, 0xf5, 0xd5, 0x57, 0x5f, 0xfd, 0xf7,
+ 0xff, 0xe6, 0xfe, 0xfb, 0xef, 0xff, 0xff, 0xfa,
+ 0xeb, 0xff, 0xbf, 0xff, 0xe4, 0xd7, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff,
+ 0xde, 0xfb, 0x6f, 0xff, 0xfc, 0xff, 0xff, 0xeb,
+ 0xbf, 0xff, 0xef, 0xf6, 0x9f, 0x7c, 0xff, 0xfd,
+ 0xa7, 0xf7, 0x6f, 0xfa, 0xff, 0xab, 0xae, 0xbb,
+ 0xfe, 0xfa, 0xe9, 0x8f, 0xb7, 0xfa, 0xe5, 0x93,
+ 0x5d, 0x6f, 0xad, 0x75, 0xd7, 0x1d, 0xff, 0x9a,
+ 0xff, 0xdf, 0xff, 0xff, 0xfe, 0x8f, 0xff, 0xff,
+ 0xd3, 0xbb, 0xff, 0xdf, 0xf7, 0xff, 0xff, 0x9f,
+ 0x7f, 0xfe, 0xfd, 0xff, 0xc6, 0xff, 0xfd, 0xf7,
+ 0xdf, 0x7f, 0xfe, 0x7d, 0xf7, 0xdf, 0xef, 0x7f,
+ 0xff, 0xfa, 0xff, 0x7f, 0x75, 0xf6, 0xfd, 0xfb,
+ 0x9f, 0xf9, 0xff, 0xf7, 0xff, 0xff, 0x7d, 0xff,
+ 0xff, 0xbf, 0xbf, 0xfd, 0xff, 0xbf, 0xff, 0xff,
+ 0xf6, 0xbf, 0xb7, 0xee, 0xff, 0x6f, 0xfe, 0xff,
+ 0xfe, 0xbb, 0xeb, 0xbf, 0xff, 0xf7, 0xf7, 0xd3,
+ 0x7d, 0xbb, 0x75, 0xfd, 0xd7, 0x5f, 0x7b, 0xf9,
+ 0xb7, 0xff, 0x9b, 0xff, 0xff, 0xf7, 0xfb, 0xfb,
+ 0xff, 0xff, 0xff, 0xaf, 0xff, 0xef, 0xff, 0xff,
+ 0x7d, 0xf7, 0xb5, 0xfb, 0x76, 0xef, 0xff, 0xe6,
+ 0xff, 0xfb, 0xef, 0xbf, 0xf7, 0xfe, 0xef, 0xfb,
+ 0xff, 0xae, 0x7f, 0xc7, 0xff, 0x7d, 0xdd, 0xf6,
+ 0xd7, 0x7f, 0xff, 0xbf, 0xf9, 0xe7, 0xdf, 0x7f,
+ 0xff, 0xff, 0xed, 0xec, 0xff, 0xcf, 0xff, 0xff,
+ 0xed, 0xff, 0x9f, 0xff, 0xda, 0xeb, 0x6b, 0xff,
+ 0x6f, 0xfe, 0xfe, 0xff, 0xff, 0xbf, 0xff, 0xbf,
+ 0xbf, 0xcf, 0x2f, 0xed, 0x7f, 0xbf, 0xdf, 0xdf,
+ 0xeb, 0xff, 0xff, 0x5f, 0x7f, 0x9b, 0xff, 0xff,
+ 0xff, 0xff, 0xbf, 0xff, 0xff, 0x6b, 0x7f, 0xfd,
+ 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xe7,
+ 0xf7, 0xff, 0xe6, 0xdf, 0xff, 0xf7, 0xdf, 0xff,
+ 0xff, 0x3f, 0xbb, 0xff, 0x6e, 0xef, 0xff, 0xff,
+ 0xbf, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xbf, 0xf9,
+ 0xff, 0xff, 0xea, 0xbf, 0xbf, 0x7e, 0xff, 0xff,
+ 0xbf, 0xff, 0x7b, 0x77, 0xdf, 0x5f, 0xff, 0xfd,
+ 0xf7, 0xdf, 0xff, 0x6f, 0xfc, 0x9f, 0xfe, 0xb3,
+ 0x4d, 0xbf, 0xff, 0xfb, 0xdf, 0xdf, 0xfe, 0x77,
+ 0xfd, 0xf3, 0xdf, 0x2f, 0xfb, 0xec, 0xe3, 0xfd,
+ 0x99, 0xfe, 0xff, 0xff, 0xfe, 0xda, 0xf7, 0xff,
+ 0xff, 0xfb, 0xfe, 0x7d, 0xdb, 0xfd, 0xfd, 0xd7,
+ 0x6f, 0xbf, 0xff, 0xde, 0xff, 0xa6, 0xff, 0xab,
+ 0xbf, 0xbd, 0xfb, 0xda, 0x7b, 0xff, 0xd6, 0x93,
+ 0xdf, 0xf7, 0xff, 0xff, 0x3f, 0xdf, 0x7f, 0xf3,
+ 0xfd, 0xaf, 0xd9, 0xff, 0xef, 0xef, 0xe9, 0xff,
+ 0xff, 0x7e, 0xdd, 0x7c, 0x57, 0xfb, 0xff, 0xff,
+ 0x5f, 0x7f, 0xfd, 0xe5, 0xd7, 0xff, 0x6d, 0xfe,
+ 0xf7, 0xff, 0x7b, 0xaf, 0xfd, 0xa7, 0xfd, 0xfa,
+ 0xff, 0xff, 0xe7, 0xbf, 0xf6, 0xd6, 0x5b, 0x6d,
+ 0xbd, 0x55, 0xfe, 0x1b, 0xf5, 0xa5, 0xff, 0x5e,
+ 0x7b, 0xe9, 0xed, 0xbf, 0xfe, 0xff, 0xf7, 0xff,
+ 0xe7, 0xbd, 0xfe, 0xfa, 0xeb, 0xaf, 0x9f, 0xd7,
+ 0xc6, 0xbe, 0xe9, 0xb6, 0xfd, 0xf6, 0x9a, 0x38,
+ 0xff, 0xbd, 0xf4, 0x37, 0xd3, 0xcf, 0x7b, 0xed,
+ 0xb5, 0xd7, 0x5e, 0xff, 0xbb, 0x99, 0xff, 0xff,
+ 0x6f, 0xbf, 0xfd, 0xf7, 0xee, 0xbf, 0xaf, 0x7f,
+ 0xf5, 0x5d, 0xf1, 0xfe, 0xab, 0xaf, 0xbe, 0xfa,
+ 0xff, 0x6c, 0xec, 0xff, 0xf7, 0xdb, 0xfb, 0xff,
+ 0xbf, 0x51, 0xea, 0xab, 0x7f, 0x7d, 0xfd, 0xf5,
+ 0xff, 0xfb, 0xfb, 0xef, 0xff, 0xbf, 0x99, 0xf9,
+ 0xaf, 0xfd, 0xfe, 0xde, 0x6b, 0x6c, 0xbf, 0xf6,
+ 0xd2, 0xd7, 0x5e, 0x7f, 0xfd, 0x35, 0xd4, 0x5e,
+ 0x7b, 0xed, 0xef, 0x46, 0xfd, 0xfb, 0xfe, 0xdb,
+ 0xef, 0xbe, 0x5f, 0x7f, 0xff, 0xed, 0xee, 0xff,
+ 0xff, 0x7f, 0xdf, 0x7d, 0xf7, 0xfd, 0xf7, 0x9d,
+ 0x71, 0xff, 0x2f, 0xbf, 0xff, 0xf3, 0xcf, 0xc7,
+ 0x9f, 0x7f, 0xde, 0xf3, 0xff, 0xf4, 0xdf, 0x67,
+ 0x9f, 0x7d, 0x76, 0x79, 0x6f, 0xec, 0x9f, 0xfe,
+ 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 0xe3, 0x4d, 0x7f,
+ 0xf8, 0xfd, 0xf5, 0xd2, 0x4b, 0x7f, 0xbd, 0xf4,
+ 0xbb, 0x99, 0xf9, 0x6b, 0x9f, 0xff, 0xf6, 0xd9,
+ 0xef, 0xfc, 0xef, 0xff, 0xff, 0xff, 0x3f, 0xff,
+ 0xec, 0xb7, 0xcf, 0x3e, 0xdb, 0xce, 0xe6, 0xfe,
+ 0xdb, 0xfd, 0xbe, 0xbd, 0xf6, 0xbf, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xfb, 0x77, 0xfb, 0xed, 0xb5,
+ 0xdb, 0xee, 0xbb, 0xb9, 0xff, 0xdb, 0xeb, 0xbf,
+ 0xfd, 0xf6, 0xff, 0x1f, 0x6f, 0xf4, 0xe1, 0xf5,
+ 0xdf, 0x5f, 0x6b, 0xed, 0xb5, 0xd6, 0xfe, 0x6e,
+ 0xde, 0xbf, 0xeb, 0xe2, 0xbb, 0xef, 0xfe, 0xfb,
+ 0xef, 0x8f, 0x7e, 0x7c, 0xf9, 0xd5, 0x7f, 0xff,
+ 0xfd, 0xf7, 0x5f, 0xdf, 0x9b, 0xff, 0xef, 0xbf,
+ 0xfe, 0xbe, 0xfb, 0xfe, 0xff, 0x7f, 0xfb, 0xdf,
+ 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf7, 0xdf,
+ 0xff, 0xe6, 0xff, 0xef, 0xa3, 0xcf, 0x3e, 0xfb,
+ 0xfc, 0x71, 0xcf, 0x3d, 0xe7, 0xd8, 0x6d, 0x37,
+ 0x9d, 0xf4, 0xd1, 0x47, 0x9f, 0xbf, 0xf9, 0xff,
+ 0xfe, 0x0b, 0xef, 0xbf, 0xff, 0x77, 0xdf, 0x7f,
+ 0x7f, 0xf9, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xfe, 0xfa, 0xef,
+ 0xbf, 0xff, 0x7f, 0xff, 0xff, 0x5f, 0xbf, 0xff,
+ 0xf4, 0xd3, 0x4f, 0x7f, 0xfd, 0xf5, 0xff, 0x9b,
+ 0xff, 0xbf, 0xbe, 0xfe, 0xeb, 0xaf, 0x7f, 0xde,
+ 0xf9, 0xe3, 0x3f, 0xeb, 0x97, 0x57, 0x54, 0x50,
+ 0x5f, 0x7d, 0xf5, 0xff, 0xe6, 0xff, 0xfb, 0xaf,
+ 0xbf, 0xff, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xfe,
+ 0xfe, 0x79, 0xe7, 0x9f, 0xff, 0xff, 0xff, 0xff,
+ 0xbf, 0xb9, 0xff, 0xfe, 0xdb, 0x6f, 0xbf, 0xff,
+ 0xf2, 0xff, 0xff, 0x7f, 0xe9, 0xed, 0x9f, 0xdf,
+ 0x7e, 0xba, 0xe9, 0x97, 0xfe, 0x6f, 0xfa, 0xef,
+ 0xcb, 0xaf, 0xb5, 0xd2, 0xfa, 0xeb, 0xaf, 0xbf,
+ 0xbe, 0xa5, 0xd7, 0x5f, 0x2d, 0xd9, 0x35, 0x57,
+ 0x5b, 0xff, 0x9b, 0x3f, 0x5f, 0x3a, 0xf3, 0xee,
+ 0xfe, 0x9f, 0xdb, 0xe8, 0xe3, 0xdf, 0x9f, 0xf7,
+ 0x7f, 0x5d, 0xfd, 0xff, 0xff, 0xf7, 0xff, 0x46,
+ 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xff, 0xfd, 0xe7,
+ 0x9d, 0xbf, 0xf7, 0xff, 0xed, 0xb7, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x9f, 0xe9, 0xff, 0x5f, 0xff,
+ 0xff, 0xdd, 0xfb, 0xfb, 0xb7, 0x5f, 0xf4, 0xff,
+ 0xff, 0xff, 0xff, 0xfb, 0xff, 0xdf, 0x7f, 0xff,
+ 0x6f, 0xfe, 0xbe, 0xfc, 0xee, 0xaf, 0x4f, 0x37,
+ 0xec, 0xff, 0xaf, 0xdf, 0xfb, 0xf5, 0xe5, 0xc7,
+ 0x6f, 0x7d, 0xfd, 0xf5, 0xff, 0x99, 0xff, 0xbf,
+ 0xff, 0xce, 0xfe, 0xbf, 0xdf, 0xdf, 0xef, 0x5f,
+ 0xbf, 0xfe, 0xff, 0x7b, 0xfb, 0xef, 0x7b, 0xef,
+ 0xf5, 0xff, 0xe6, 0xef, 0xfb, 0xbb, 0x6f, 0xee,
+ 0xdb, 0xff, 0xbd, 0xaf, 0xef, 0xaf, 0xd7, 0x5f,
+ 0xfb, 0xdf, 0xbe, 0xd1, 0x56, 0xff, 0xbf, 0xf9,
+ 0xff, 0xff, 0xf6, 0xff, 0x7c, 0xff, 0xff, 0xf3,
+ 0xfc, 0xff, 0xff, 0xed, 0xf7, 0xff, 0xff, 0xff,
+ 0x5d, 0xb7, 0xff, 0x6f, 0xfe, 0xdf, 0xf7, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xeb, 0xff, 0xef, 0xf3,
+ 0xf1, 0xc7, 0xff, 0xf3, 0xff, 0xf9, 0xe7, 0xff,
+ 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f,
+ 0x5b, 0x7d, 0xbc, 0xfd, 0x8f, 0xbf, 0xff, 0xbe,
+ 0xff, 0xff, 0xff, 0xff, 0xdf, 0xe6, 0xfc, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xee, 0xbf, 0xbf, 0xfe,
+ 0xdf, 0x5f, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff,
+ 0xff, 0xbf, 0xf9, 0xff, 0x7f, 0xef, 0xa7, 0xbf,
+ 0xf6, 0x3f, 0xeb, 0xba, 0xd3, 0xff, 0x31, 0xd3,
+ 0x6f, 0xb7, 0xf5, 0xf7, 0xd7, 0xef, 0x6f, 0xf8,
+ 0xdf, 0xff, 0xfa, 0xef, 0x3f, 0xff, 0xfc, 0xfa,
+ 0xef, 0xff, 0x6f, 0xbd, 0x65, 0xff, 0xff, 0xbf,
+ 0xf8, 0xf4, 0xff, 0x9b, 0xff, 0xff, 0xb7, 0x7f,
+ 0xed, 0xef, 0xdf, 0xff, 0xff, 0x7a, 0xff, 0xff,
+ 0xef, 0xbf, 0xbd, 0xf6, 0x7f, 0xfd, 0xff, 0xff,
+ 0x86, 0xff, 0xfb, 0xac, 0xbe, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0x9f, 0x37, 0x3e, 0x7f, 0xfc, 0xff,
+ 0xff, 0xff, 0xff, 0xfe, 0x8f, 0xd9, 0xff, 0x7f,
+ 0xed, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0x65,
+ 0xef, 0xff, 0xda, 0xdf, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x6d, 0xfe, 0xa7, 0xf6, 0x6b, 0xfe, 0xff,
+ 0xff, 0xff, 0xff, 0xdf, 0xd5, 0xcf, 0xb7, 0xdc,
+ 0xd4, 0xf8, 0x4f, 0x9f, 0xfd, 0xff, 0x9b, 0xf5,
+ 0xbd, 0xb7, 0x9e, 0x7b, 0xf3, 0xff, 0xff, 0xff,
+ 0xed, 0xf7, 0xfb, 0xcf, 0xbf, 0x7f, 0xfe, 0xdf,
+ 0x4f, 0xff, 0xd7, 0xe6, 0xfe, 0xfa, 0xeb, 0x9b,
+ 0x1f, 0xbf, 0xdd, 0xaf, 0xfd, 0xff, 0xb7, 0xdd,
+ 0xcf, 0x97, 0xbf, 0xfc, 0xf3, 0xdf, 0xff, 0xbb,
+ 0x99, 0xff, 0xaf, 0xa9, 0xe7, 0xda, 0x5b, 0xf7,
+ 0xcb, 0xff, 0x7f, 0xf7, 0xd5, 0x70, 0xdf, 0x7d,
+ 0x75, 0xdc, 0x77, 0xff, 0x6c, 0xec, 0xbf, 0xfe,
+ 0xfa, 0xee, 0xbf, 0xff, 0x5d, 0x62, 0xff, 0xdc,
+ 0x2f, 0xfd, 0xf7, 0xf7, 0x5f, 0x5f, 0xff, 0x3d,
+ 0xbe, 0x99, 0xfb, 0xbf, 0xbf, 0xf7, 0xfb, 0xff,
+ 0x7f, 0xbf, 0xb6, 0x3f, 0x77, 0x7a, 0xff, 0xff,
+ 0xff, 0xdf, 0xdf, 0x7f, 0x9f, 0xef, 0xe6, 0xfd,
+ 0xff, 0xf6, 0xfb, 0xff, 0xff, 0xdf, 0xff, 0xf3,
+ 0xef, 0x6e, 0xf9, 0xfd, 0xe7, 0xff, 0x7f, 0xff,
+ 0xff, 0xff, 0xbd, 0x79, 0xff, 0xff, 0xff, 0xf7,
+ 0xf7, 0xdf, 0xff, 0xbf, 0xff, 0xde, 0xb3, 0xff,
+ 0xfa, 0xff, 0xff, 0x3f, 0xfe, 0xff, 0x7b, 0x6f,
+ 0xec, 0xd7, 0xfe, 0xfb, 0xef, 0xb3, 0xcf, 0x7e,
+ 0xdb, 0xef, 0x7f, 0xf6, 0xdd, 0xb6, 0xdf, 0x6f,
+ 0xbf, 0xfd, 0xf6, 0xbd, 0x99, 0xf9, 0xff, 0xdf,
+ 0xff, 0xbf, 0xfd, 0xfe, 0xef, 0xff, 0xff, 0xfd,
+ 0xef, 0xdf, 0xff, 0x7e, 0xfb, 0xf7, 0xb7, 0xff,
+ 0xcf, 0xa6, 0xfe, 0xff, 0xfe, 0xff, 0xdf, 0xff,
+ 0xff, 0xff, 0xff, 0xeb, 0xdf, 0xfd, 0xff, 0xdf,
+ 0x7f, 0xff, 0xff, 0xfd, 0xff, 0xbb, 0xb9, 0xff,
+ 0xff, 0xeb, 0xbf, 0xff, 0x78, 0xe3, 0x6f, 0x3f,
+ 0x7c, 0xa9, 0xfd, 0xf7, 0x7f, 0x7f, 0xff, 0xf7,
+ 0xdf, 0xff, 0x6a, 0xde, 0xff, 0xfd, 0xe2, 0xcf,
+ 0xff, 0xff, 0xfd, 0x27, 0x8d, 0x5f, 0x7c, 0xf9,
+ 0xe7, 0x97, 0xcf, 0xbe, 0xf9, 0xe4, 0xdf, 0x9b,
+ 0xfe, 0xaf, 0xbf, 0x6e, 0xfe, 0xff, 0x3f, 0xff,
+ 0xde, 0xf7, 0xdf, 0x5f, 0xbf, 0xff, 0xfe, 0xff,
+ 0x7f, 0xff, 0xff, 0xff, 0xa6, 0xff, 0xeb, 0xa3,
+ 0x8f, 0x3f, 0xf7, 0xfc, 0xf3, 0xcf, 0x3f, 0xfd,
+ 0xf9, 0xc7, 0x9f, 0x7f, 0xfc, 0xd9, 0xe7, 0x9f,
+ 0xbf, 0xf9, 0xff, 0xfb, 0xff, 0xbf, 0xff, 0xfe,
+ 0xe7, 0xdb, 0xff, 0x7f, 0xff, 0xef, 0xdf, 0x7f,
+ 0x7f, 0xfd, 0xf7, 0xdf, 0xff, 0x6f, 0xfe, 0xbf,
+ 0xff, 0xff, 0xef, 0xff, 0xbf, 0xff, 0xf6, 0xff,
+ 0x7f, 0x7f, 0xfb, 0xf5, 0xf7, 0xff, 0xff, 0xff,
+ 0xf5, 0xff, 0x9b, 0xff, 0xbf, 0xff, 0xfb, 0xfe,
+ 0xff, 0xff, 0xff, 0xfb, 0xef, 0x7f, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xf7, 0x7f, 0xff, 0xff, 0xff, 0x86,
+ 0xbf, 0xfb, 0xff, 0xbf, 0xff, 0xff, 0xdb, 0xff,
+ 0xff, 0xff, 0xfe, 0xbf, 0x7f, 0xff, 0xfd, 0xff,
+ 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xf2, 0xcb,
+ 0x2b, 0xbf, 0xfc, 0xff, 0xff, 0xff, 0xbf, 0xf9,
+ 0xfd, 0x97, 0x7f, 0x7e, 0xf7, 0xcf, 0xbe, 0xff,
+ 0x6f, 0xfe, 0x7f, 0x6b, 0xae, 0xb9, 0x6c, 0xf2,
+ 0x8b, 0x2f, 0xbf, 0xe6, 0xf5, 0x46, 0x5f, 0x7e,
+ 0xb5, 0xe5, 0xd7, 0x5f, 0xff, 0x9a, 0xfe, 0xff,
+ 0xff, 0xff, 0xff, 0xfd, 0xf7, 0xfb, 0xec, 0xf3,
+ 0x9f, 0xfb, 0xbf, 0xfe, 0xfe, 0xff, 0xdf, 0x7f,
+ 0xdf, 0xff, 0xc6, 0xff, 0xfe, 0xff, 0xff, 0xff,
+ 0xcf, 0xff, 0x97, 0xeb, 0xee, 0x5d, 0xfd, 0xff,
+ 0xff, 0xff, 0xfe, 0xfb, 0xef, 0xff, 0x9f, 0xf9,
+ 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
+ 0xe7, 0xc7, 0xfd, 0x7f, 0xff, 0xff, 0xf9, 0xff,
+ 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xbf, 0xff, 0x5a,
+ 0xff, 0xff, 0xbf, 0xfe, 0x7b, 0xef, 0x9f, 0x7e,
+ 0xff, 0xf4, 0xd7, 0x55, 0x7f, 0xfd, 0xff, 0xef,
+ 0x9b, 0xff, 0x7f, 0x7f, 0xfe, 0xdf, 0xff, 0x9f,
+ 0xff, 0xbf, 0x3f, 0xff, 0x7d, 0xff, 0x7a, 0x6d,
+ 0xdf, 0xdf, 0xfe, 0xff, 0xff, 0xe6, 0xff, 0xff,
+ 0xff, 0xdb, 0xff, 0xff, 0xff, 0xea, 0xbb, 0xfe,
+ 0xfe, 0xfd, 0x7b, 0xbf, 0xfd, 0xe0, 0xbf, 0xff,
+ 0xff, 0xbf, 0xf9, 0xef, 0xff, 0xff, 0xff, 0xfd,
+ 0xff, 0xf7, 0xdf, 0xdf, 0xdf, 0xff, 0xef, 0xff,
+ 0xdf, 0x7f, 0xff, 0xdf, 0xff, 0xfd, 0x6f, 0xfe,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf,
+ 0xff, 0xef, 0xff, 0xff, 0xef, 0x9f, 0x75, 0xff,
+ 0xff, 0xff, 0xfb, 0x9b, 0xff, 0x7f, 0xfe, 0xdf,
+ 0xff, 0xff, 0x8f, 0x7f, 0xfb, 0xfd, 0xff, 0xf5,
+ 0xbe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xe6, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0xef, 0xdf,
+ 0xbd, 0xff, 0xbd, 0xff, 0x79, 0xff, 0xfb, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0x7e, 0xfb,
+ 0xeb, 0xa7, 0xff, 0xff, 0xff, 0xeb, 0xf7, 0xf5,
+ 0x6f, 0xff, 0x9b, 0x4f, 0xff, 0xc9, 0xf7, 0xd7,
+ 0xff, 0x6f, 0x7c, 0xff, 0xfe, 0xfb, 0xaf, 0xff,
+ 0xff, 0x7f, 0xf2, 0xfe, 0xff, 0xfe, 0xff, 0xf7,
+ 0xd7, 0x3e, 0xfb, 0xdf, 0xf4, 0xff, 0x99, 0xef,
+ 0xaf, 0xff, 0xfe, 0xfd, 0xff, 0xff, 0xfe, 0xdf,
+ 0xff, 0xff, 0xfb, 0x7f, 0xfd, 0xfe, 0xdf, 0xdf,
+ 0xfb, 0xff, 0xff, 0xa6, 0xff, 0xff, 0xfc, 0xfe,
+ 0x5f, 0x27, 0xbf, 0xe9, 0xfd, 0x52, 0x8f, 0xf7,
+ 0xdf, 0x7f, 0xfd, 0xed, 0xbf, 0xff, 0xff, 0x8d,
+ 0xd9, 0xff, 0x7f, 0xfd, 0xff, 0xf3, 0x9f, 0xff,
+ 0xfb, 0x79, 0xd5, 0xff, 0xfd, 0xf7, 0x5f, 0xff,
+ 0xfd, 0xff, 0xff, 0xff, 0x6d, 0xfe, 0xff, 0xff,
+ 0xef, 0xff, 0xff, 0xfe, 0xfb, 0xde, 0xef, 0xff,
+ 0xcd, 0x3d, 0xff, 0xff, 0xeb, 0xaf, 0xff, 0xff,
+ 0xbf, 0x9b, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xbf, 0xff, 0xff, 0xff, 0xd9, 0xe7, 0x9f,
+ 0x7d, 0xd6, 0x79, 0xff, 0xff, 0xd7, 0xe6, 0xfe,
+ 0xfd, 0xff, 0xfd, 0xff, 0xff, 0x7f, 0x6f, 0xbd,
+ 0x66, 0xff, 0xf7, 0xcc, 0xfb, 0xfd, 0x7c, 0xf3,
+ 0xed, 0xff, 0xba, 0xb9, 0x3f, 0xef, 0xff, 0xff,
+ 0xfe, 0xff, 0xff, 0x7b, 0xef, 0xd6, 0xff, 0xbd,
+ 0xf2, 0x5e, 0x8d, 0xf7, 0xd5, 0xff, 0xff, 0x6c,
+ 0xee, 0xef, 0xff, 0xef, 0xff, 0xff, 0xfd, 0xfb,
+ 0x7e, 0xeb, 0xff, 0xff, 0xfd, 0xf5, 0xd7, 0x5f,
+ 0x2f, 0x9d, 0xff, 0xbf, 0x99, 0xf9, 0xff, 0xff,
+ 0xf7, 0xff, 0xff, 0xff, 0xbd, 0xb5, 0xce, 0xff,
+ 0xdf, 0x7f, 0xfd, 0xff, 0xff, 0x7f, 0xaf, 0xff,
+ 0xef, 0x86, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xdf, 0x7f, 0xff, 0xcd, 0xfe, 0xff, 0xfd, 0xe7,
+ 0xdf, 0x7f, 0xfe, 0xf9, 0xe7, 0xbd, 0x79, 0x57,
+ 0x7f, 0xfe, 0xfd, 0xe7, 0xff, 0xe7, 0x9f, 0x7f,
+ 0xe6, 0xff, 0xff, 0xfa, 0xfb, 0xaf, 0xff, 0xff,
+ 0xfe, 0x73, 0x6f, 0xec, 0xfb, 0x76, 0xfb, 0x6e,
+ 0xbf, 0xff, 0x58, 0xf3, 0xcd, 0x7f, 0xff, 0xdd,
+ 0xf7, 0xd8, 0x6d, 0xab, 0x6d, 0xf6, 0xbf, 0x99,
+ 0xf9, 0xf7, 0xdb, 0x7f, 0xff, 0xff, 0xff, 0xdf,
+ 0x3f, 0xff, 0xff, 0xef, 0xff, 0xff, 0xfe, 0xf9,
+ 0xef, 0xb7, 0xff, 0x4f, 0xe6, 0xbe, 0xff, 0xfd,
+ 0xef, 0xff, 0xff, 0xff, 0xfb, 0xee, 0xfb, 0xff,
+ 0xfe, 0xff, 0xdf, 0xbf, 0xff, 0xfd, 0xfd, 0xff,
+ 0xbb, 0xb9, 0xff, 0xfe, 0x6f, 0xb7, 0xff, 0xff,
+ 0xc7, 0x1f, 0x3f, 0xfc, 0xff, 0xf5, 0xd7, 0xdf,
+ 0x7f, 0xfd, 0xf5, 0xd7, 0xfb, 0x68, 0xde, 0x9f,
+ 0xdc, 0xeb, 0xcd, 0xff, 0xff, 0x7b, 0xe2, 0x9b,
+ 0xff, 0x7f, 0xb5, 0xdd, 0xbb, 0xff, 0x7e, 0xfb,
+ 0xe4, 0xcf, 0x9b, 0xff, 0xff, 0xbf, 0xef, 0xfb,
+ 0xff, 0x7f, 0xfb, 0xdd, 0xfb, 0xff, 0x7f, 0xf7,
+ 0xfd, 0xff, 0xff, 0xef, 0x7f, 0xff, 0xff, 0xe6,
+ 0xff, 0xfb, 0xe3, 0x8f, 0x3f, 0x7f, 0xfc, 0xb3,
+ 0x8f, 0x3d, 0xff, 0xf1, 0xe7, 0x9f, 0x7f, 0xf6,
+ 0xf1, 0xe7, 0x9f, 0xbf, 0xf9, 0xff, 0xfe, 0xcf,
+ 0xbf, 0xff, 0x7f, 0xf7, 0xff, 0x2f, 0xff, 0xff,
+ 0xfd, 0xd7, 0xff, 0xff, 0xfd, 0xf7, 0xd7, 0xdf,
+ 0x6f, 0xfe, 0x9f, 0xfe, 0xfb, 0xfb, 0xff, 0xff,
+ 0xff, 0xfe, 0xeb, 0xff, 0xff, 0xfd, 0xfd, 0xd7,
+ 0xff, 0xff, 0xff, 0xf5, 0xff, 0x9b, 0xff, 0xff,
+ 0xbf, 0xf9, 0xfb, 0xff, 0x7d, 0xfe, 0xfb, 0xe7,
+ 0xff, 0xff, 0xfd, 0xf5, 0xf5, 0xf7, 0xdf, 0x7f,
+ 0xff, 0xff, 0xe6, 0xfd, 0xfb, 0xef, 0xff, 0xfe,
+ 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff,
+ 0x7f, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xbf, 0x79,
+ 0xdf, 0xff, 0xfe, 0xfd, 0xff, 0xff, 0xef, 0x7a,
+ 0xef, 0xff, 0xbf, 0xed, 0xb7, 0x5f, 0x6e, 0xff,
+ 0xed, 0xfe, 0xff, 0x6f, 0xee, 0xff, 0xeb, 0xaf,
+ 0xbe, 0xfe, 0xda, 0xa9, 0x2f, 0xb7, 0xf6, 0x75,
+ 0xd7, 0x5d, 0x7f, 0xfd, 0x65, 0x57, 0x5f, 0xff,
+ 0x9a, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff,
+ 0x7f, 0x7f, 0xf3, 0xff, 0xdf, 0x7d, 0xff, 0xfb,
+ 0xef, 0xdf, 0xff, 0xff, 0xfe, 0xc6, 0xff, 0xff,
+ 0xe7, 0xff, 0xfb, 0xf7, 0xff, 0x77, 0xff, 0xfe,
+ 0x7f, 0xbf, 0xff, 0xff, 0xfb, 0xdf, 0xff, 0xff,
+ 0xff, 0x9b, 0xe9, 0xff, 0xff, 0x7f, 0xf3, 0xff,
+ 0xbf, 0xf7, 0xfe, 0x65, 0xdf, 0xdf, 0xfe, 0x7b,
+ 0xff, 0xef, 0x7f, 0xff, 0xfd, 0xf3, 0x6c, 0xfc,
+ 0xff, 0xfb, 0xf2, 0xe3, 0xff, 0xff, 0x7d, 0xfc,
+ 0xdb, 0xff, 0xff, 0xfd, 0xff, 0xd7, 0x5f, 0x7d,
+ 0xdd, 0xfe, 0xfb, 0x9b, 0xff, 0xff, 0xff, 0xf6,
+ 0xfe, 0xff, 0xff, 0xff, 0xaf, 0xeb, 0xff, 0xf6,
+ 0xf7, 0xff, 0x6b, 0xbf, 0xff, 0xfe, 0xf7, 0xff,
+ 0xa6, 0xff, 0xff, 0xeb, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x5f, 0xfc, 0xef, 0xf7, 0xff, 0xf7, 0xff,
+ 0xf5, 0xf3, 0xff, 0xbf, 0xbf, 0xf9, 0xdb, 0xff,
+ 0xdf, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xee, 0xff,
+ 0xff, 0xbf, 0xbf, 0xff, 0x7f, 0xff, 0xdf, 0xff,
+ 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xbf, 0xff, 0xef, 0xef, 0xff, 0xff, 0xfe,
+ 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0x9b, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xef, 0xff, 0xfd, 0xff, 0xef, 0xff, 0xff, 0xff,
+ 0xfe, 0xef, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xf7,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xfd,
+ 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xef, 0xbf,
+ 0xf9, 0xff, 0xdf, 0x9f, 0xfe, 0xf9, 0xfb, 0xff,
+ 0xff, 0xfb, 0xff, 0x5f, 0xff, 0xd7, 0xfd, 0x7f,
+ 0xfd, 0xff, 0x7f, 0xff, 0x6f, 0xfe, 0xfb, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf7, 0x6f, 0x5e,
+ 0xfd, 0xff, 0xff, 0xff, 0x7e, 0xf9, 0xdf, 0xff,
+ 0xff, 0x99, 0xfd, 0xff, 0xff, 0xfb, 0x7f, 0xff,
+ 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xef,
+ 0xff, 0xdf, 0xfd, 0xbb, 0xff, 0xff, 0x66, 0xff,
+ 0xcf, 0x3f, 0xdf, 0xfc, 0xf3, 0xc3, 0x3f, 0xff,
+ 0xfc, 0xef, 0x9e, 0xfb, 0xee, 0xf9, 0xef, 0x9f,
+ 0x7f, 0xfe, 0x9f, 0xf9, 0xff, 0xf7, 0xcf, 0x7f,
+ 0xdf, 0xfd, 0xf1, 0x8f, 0x3f, 0xdb, 0xdd, 0xef,
+ 0xff, 0x7f, 0xfe, 0xff, 0xef, 0xbf, 0xf7, 0x6f,
+ 0xfe, 0xdf, 0xfe, 0xfb, 0xef, 0x9f, 0x1b, 0xfe,
+ 0xfb, 0xcf, 0x6f, 0xbf, 0xfd, 0x77, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xff, 0x9b, 0xff, 0xff, 0xfd,
+ 0xfd, 0xdf, 0x7f, 0xb7, 0xfd, 0x7d, 0xd7, 0xff,
+ 0xff, 0xfb, 0xef, 0xff, 0xff, 0xfe, 0xff, 0xff,
+ 0xff, 0xa6, 0xff, 0xee, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xe7, 0xbf, 0xff, 0xfb, 0xe6, 0xdf, 0x7f, 0xef,
+ 0xf9, 0xb7, 0xde, 0x7f, 0xff, 0xbf, 0xf9, 0xff,
+ 0x7c, 0xf3, 0xcf, 0x7f, 0xff, 0xfd, 0xf3, 0xcf,
+ 0x7f, 0xfe, 0xf9, 0xe3, 0x8f, 0x7f, 0xfe, 0xb9,
+ 0x67, 0xf7, 0x6f, 0xfe, 0xbf, 0xfb, 0xbe, 0xfb,
+ 0xef, 0xbf, 0xff, 0xbe, 0xfb, 0xdb, 0x76, 0xff,
+ 0xed, 0xf7, 0xdd, 0x7a, 0xff, 0xbd, 0xff, 0x9b,
+ 0xff, 0x9f, 0x7e, 0xfa, 0xe9, 0xa7, 0x9f, 0x7e,
+ 0xfa, 0xfd, 0xef, 0x3f, 0xfd, 0xfe, 0xd3, 0xef,
+ 0x3f, 0xfd, 0xf4, 0xff, 0xe6, 0xff, 0xf7, 0xdf,
+ 0x7f, 0xfb, 0xfd, 0xf7, 0xde, 0x7d, 0xef, 0x9b,
+ 0xef, 0xbf, 0xff, 0xee, 0xfb, 0xef, 0xbf, 0xff,
+ 0xbf, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xbf, 0x7f, 0xff, 0xf3, 0xff, 0xbf, 0xef,
+ 0xff, 0xfb, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0x7f,
+ 0xff, 0xfd, 0xff, 0xdf, 0x7e, 0xff, 0xf5, 0xfe,
+ 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0x7e,
+ 0xfb, 0xff, 0x9b, 0xff, 0xff, 0xdf, 0xff, 0xfc,
+ 0xfd, 0xff, 0xf7, 0x7f, 0xf5, 0xfd, 0xfb, 0xab,
+ 0xb7, 0xff, 0xfa, 0xef, 0xff, 0xff, 0xff, 0xe6,
+ 0xff, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0x9f, 0x75,
+ 0xfe, 0xfd, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef,
+ 0xbf, 0xff, 0xfe, 0xbf, 0xb9, 0xff, 0x37, 0xdf,
+ 0x6e, 0xf3, 0xed, 0xb7, 0xdf, 0x4e, 0xfb, 0xdb,
+ 0x6f, 0xbf, 0xfd, 0xf6, 0x5b, 0x6f, 0xbf, 0xf9,
+ 0x6f, 0xfe, 0xff, 0xf7, 0xdf, 0x7f, 0xff, 0xfd,
+ 0xb5, 0xdf, 0x7e, 0xef, 0xfb, 0xef, 0xbf, 0xff,
+ 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0x9b, 0xff, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xbd, 0xf7,
+ 0xbf, 0xef, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xbe,
+ 0xfb, 0xee, 0xe6, 0xff, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xef, 0xbf, 0xfb, 0xfe, 0xfb, 0xdf, 0x7f, 0xff,
+ 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xbf, 0xf9,
+ 0xff, 0x2f, 0xbf, 0xff, 0xf2, 0xfb, 0xaf, 0xbf,
+ 0xfe, 0xfa, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7,
+ 0x5f, 0x7f, 0xf9, 0x6f, 0xfe, 0xff, 0xfb, 0xef,
+ 0xbf, 0xff, 0xfe, 0xf9, 0xef, 0xbf, 0xff, 0xfd,
+ 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0xff,
+ 0x9b, 0xff, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xff,
+ 0xfc, 0xf3, 0xcf, 0x7b, 0xfe, 0xf9, 0xe7, 0x9f,
+ 0x7f, 0xfe, 0xf9, 0xe7, 0xf7, 0xe6, 0xff, 0x5f,
+ 0x7f, 0xfd, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5,
+ 0xaf, 0xbb, 0xfe, 0xba, 0xeb, 0xaf, 0xbf, 0xfe,
+ 0xfa, 0xbf, 0xf9, 0xff, 0x1f, 0x7f, 0xfd, 0xf1,
+ 0xd7, 0x5b, 0x7f, 0xfd, 0xf5, 0x2f, 0xbf, 0xfe,
+ 0xf2, 0xeb, 0xaf, 0xbf, 0xfe, 0xf8, 0x6f, 0xee,
+ 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xaf, 0x7f, 0xbf, 0xfd, 0xb7, 0xdb, 0x7f, 0xfb,
+ 0xfd, 0xd7, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xdf,
+ 0xff, 0xff, 0xfd, 0xff, 0xff, 0xef, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff,
+ 0xe6, 0xfe, 0xdb, 0xef, 0xbb, 0xff, 0xbe, 0xfb,
+ 0xee, 0xbf, 0xed, 0x6d, 0xf7, 0xdf, 0x72, 0xff,
+ 0xad, 0xf7, 0xdf, 0xff, 0xbf, 0xf9, 0xbf, 0xf5,
+ 0xf5, 0xd6, 0x5f, 0x6f, 0xbd, 0xf5, 0x17, 0xd3,
+ 0xd8, 0xfa, 0x8b, 0xad, 0xbf, 0xb8, 0xfa, 0xeb,
+ 0xef, 0x6f, 0xfe, 0xff
+};
+
+
+/* rom names */
+
+#define EPP_ROM_CROM0_R_0 0
+#define EPP_ROM_CROM0_R_1 16
+#define EPP_ROM_CROM0_R_2 32
+#define EPP_ROM_CROM0_R_3 48
+#define EPP_ROM_CROM0_R_4 64
+#define EPP_ROM_CROM0_R_5 80
+#define EPP_ROM_CROM0_R_6 96
+#define EPP_ROM_CROM0_R_7 112
+#define EPP_ROM_CROM1_R_0 128
+#define EPP_ROM_CROM1_R_1 144
+#define EPP_ROM_CROM1_R_2 160
+#define EPP_ROM_CROM1_R_3 176
+#define EPP_ROM_CROM1_R_4 192
+#define EPP_ROM_CROM1_R_5 208
+#define EPP_ROM_CROM1_R_6 224
+#define EPP_ROM_CROM1_R_7 240
+#define EPP_ROM_DIVROM0 256
+#define EPP_ROM_DIVROM1 272
+#define EPP_ROM_DIVROM2 288
+#define EPP_ROM_SWROMID 304
+#define EPP_ROM_SWROMIE 320
+#define EPP_ROM_SWROMIS 336
+#define EPP_ROM_SWROMOE 352
+#define EPP_ROM_SWROMOS 368
+#define EPP_ROM_SWROMIC 384
+#define EPP_ROM_SWROMOC 400
+#define EPP_ROM_SWROMDCD 416
+#define EPP_ROM_CLKSELROM 432
+#define EPP_ROM_PTTMUTEROM 448
+#define EPP_ROM_STIROM 464
+#define EPP_ROM_STOROM 480
+
+
+/* rom locations */
+static const unsigned long epp_roms[496] = {
+ 81983, 81319, 82149, 81485, 82151, 81487, 81985, 81321,
+ 81651, 80987, 81817, 81153, 81819, 81155, 81653, 80989,
+ 87969, 87305, 87637, 86973, 88137, 87473, 87805, 87141,
+ 88135, 87471, 87803, 87139, 87971, 87307, 87639, 86975,
+ 81993, 81661, 82159, 81827, 82161, 81829, 81995, 81663,
+ 81329, 80997, 81495, 81163, 81497, 81165, 81331, 80999,
+ 87979, 88147, 87315, 87483, 88145, 87981, 87481, 87317,
+ 87647, 87815, 86983, 87151, 87813, 87649, 87149, 86985,
+ 81973, 82139, 81641, 81807, 82141, 81975, 81809, 81643,
+ 81309, 81475, 80977, 81143, 81477, 81311, 81145, 80979,
+ 87989, 87657, 87325, 86993, 88157, 87825, 87493, 87161,
+ 88155, 87823, 87491, 87159, 87991, 87659, 87327, 86995,
+ 58109, 57777, 57445, 57113, 58277, 57945, 57613, 57281,
+ 58275, 57943, 57611, 57279, 58111, 57779, 57447, 57115,
+ 82003, 82169, 81339, 81505, 82171, 82005, 81507, 81341,
+ 81671, 81837, 81007, 81173, 81839, 81673, 81175, 81009,
+ 78997, 78829, 79329, 79161, 79661, 79493, 79993, 79825,
+ 78831, 78995, 79163, 79327, 79495, 79659, 79827, 79991,
+ 84983, 84815, 84817, 84981, 85647, 85479, 85481, 85645,
+ 85315, 85147, 85149, 85313, 85979, 85811, 85813, 85977,
+ 79007, 78841, 79339, 79173, 79671, 79505, 80003, 79837,
+ 78839, 79005, 79171, 79337, 79503, 79669, 79835, 80001,
+ 84993, 85657, 84825, 85489, 85325, 85989, 85157, 85821,
+ 84827, 85491, 84991, 85655, 85159, 85823, 85323, 85987,
+ 78987, 79319, 78821, 79153, 79651, 79983, 79485, 79817,
+ 78819, 79151, 78985, 79317, 79483, 79815, 79649, 79981,
+ 85003, 84835, 85335, 85167, 85667, 85499, 85999, 85831,
+ 84837, 85001, 85169, 85333, 85501, 85665, 85833, 85997,
+ 55123, 54955, 55455, 55287, 55787, 55619, 56119, 55951,
+ 54957, 55121, 55289, 55453, 55621, 55785, 55953, 56117,
+ 79017, 79349, 78849, 79181, 79681, 80013, 79513, 79845,
+ 78851, 79183, 79015, 79347, 79515, 79847, 79679, 80011,
+ 45880, 45548, 46048, 45716, 46046, 45714, 45882, 45550,
+ 45216, 44884, 45384, 45052, 45382, 45050, 45218, 44886,
+ 30962, 30796, 31626, 31460, 30794, 30960, 31458, 31624,
+ 31294, 31128, 31958, 31792, 31126, 31292, 31790, 31956,
+ 45900, 45568, 46068, 45736, 45236, 44904, 45404, 45072,
+ 46066, 45734, 45902, 45570, 45402, 45070, 45238, 44906,
+ 81902, 81238, 82068, 81404, 82070, 81406, 81904, 81240,
+ 81570, 80906, 81736, 81072, 81738, 81074, 81572, 80908,
+ 87878, 87546, 88046, 87714, 87214, 86882, 87382, 87050,
+ 88044, 87712, 87880, 87548, 87380, 87048, 87216, 86884,
+ 27962, 28130, 28128, 27964, 27298, 27466, 27464, 27300,
+ 27630, 27798, 27796, 27632, 26966, 27134, 27132, 26968,
+ 70000, 70168, 69336, 69504, 70166, 70002, 69502, 69338,
+ 69668, 69836, 69004, 69172, 69834, 69670, 69170, 69006,
+ 55062, 54896, 55394, 55228, 54894, 55060, 55226, 55392,
+ 55726, 55560, 56058, 55892, 55558, 55724, 55890, 56056,
+ 64024, 63692, 63360, 63028, 64192, 63860, 63528, 63196,
+ 64190, 63858, 63526, 63194, 64026, 63694, 63362, 63030,
+ 57998, 58166, 57334, 57502, 58164, 58000, 57500, 57336,
+ 57666, 57834, 57002, 57170, 57832, 57668, 57168, 57004,
+ 72970, 72802, 73302, 73134, 73634, 73466, 73966, 73798,
+ 72804, 72968, 73136, 73300, 73468, 73632, 73800, 73964,
+ 75926, 75262, 76092, 75428, 76094, 75430, 75928, 75264,
+ 75594, 74930, 75760, 75096, 75762, 75098, 75596, 74932,
+ 70011, 69347, 70177, 69513, 70179, 69515, 70013, 69349,
+ 69679, 69015, 69845, 69181, 69847, 69183, 69681, 69017,
+ 66984, 67648, 67316, 67980, 66816, 67480, 67148, 67812,
+ 66818, 67482, 67150, 67814, 66982, 67646, 67314, 67978,
+ 63994, 64160, 64162, 63996, 63662, 63828, 63830, 63664,
+ 63330, 63496, 63498, 63332, 62998, 63164, 63166, 63000
+};
+
diff --git a/main/epp_fpga.h b/main/epp_fpga.h
new file mode 100644
index 0000000..542ce88
--- /dev/null
+++ b/main/epp_fpga.h
@@ -0,0 +1,238 @@
+/*****************************************************************************/
+
+/*
+ * epp_fpga.h -- HDLC packet radio modem for EPP using FPGA utility.
+ *
+ * Copyright (C) 1998 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+/* automatically generated, do not edit */
+
+#define FPGA_PART "XCS10_PC84"
+#define FPGA_BOUND 344
+#define FPGA_FRAMELEN 166
+#define FPGA_NUMFRAMES 572
+/*#define FPGA_CONFIGSIZE ((FPGA_FRAMELEN*FPGA_NUMFRAMES+56)/8)*/
+#define FPGA_CONFIGSIZE 11876
+#define FPGA_BOUNDSIZE ((FPGA_BOUND+7)/8)
+
+/* safe boundary */
+static const unsigned char fpga_safebound[] = {
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f,
+ 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff
+};
+
+/* IO pin names */
+#define FPGA_PIN_RAMD0_T 253
+#define FPGA_PIN_RAMD0_O 254
+#define FPGA_PIN_RAMD0_I 255
+#define FPGA_PIN_RAMD1_T 241
+#define FPGA_PIN_RAMD1_O 242
+#define FPGA_PIN_RAMD1_I 243
+#define FPGA_PIN_RAMD2_T 229
+#define FPGA_PIN_RAMD2_O 230
+#define FPGA_PIN_RAMD2_I 231
+#define FPGA_PIN_RAMD3_T 217
+#define FPGA_PIN_RAMD3_O 218
+#define FPGA_PIN_RAMD3_I 219
+#define FPGA_PIN_RAMD4_T 220
+#define FPGA_PIN_RAMD4_O 221
+#define FPGA_PIN_RAMD4_I 222
+#define FPGA_PIN_RAMD5_T 232
+#define FPGA_PIN_RAMD5_O 233
+#define FPGA_PIN_RAMD5_I 234
+#define FPGA_PIN_RAMD6_T 244
+#define FPGA_PIN_RAMD6_O 245
+#define FPGA_PIN_RAMD6_I 246
+#define FPGA_PIN_RAMD7_T 256
+#define FPGA_PIN_RAMD7_O 257
+#define FPGA_PIN_RAMD7_I 258
+#define FPGA_PIN_RAMA0_T 259
+#define FPGA_PIN_RAMA0_O 260
+#define FPGA_PIN_RAMA0_I 261
+#define FPGA_PIN_RAMA1_T 262
+#define FPGA_PIN_RAMA1_O 263
+#define FPGA_PIN_RAMA1_I 264
+#define FPGA_PIN_RAMA2_T 283
+#define FPGA_PIN_RAMA2_O 284
+#define FPGA_PIN_RAMA2_I 285
+#define FPGA_PIN_RAMA3_T 295
+#define FPGA_PIN_RAMA3_O 296
+#define FPGA_PIN_RAMA3_I 297
+#define FPGA_PIN_RAMA4_T 301
+#define FPGA_PIN_RAMA4_O 302
+#define FPGA_PIN_RAMA4_I 303
+#define FPGA_PIN_RAMA5_T 313
+#define FPGA_PIN_RAMA5_O 314
+#define FPGA_PIN_RAMA5_I 315
+#define FPGA_PIN_RAMA6_T 325
+#define FPGA_PIN_RAMA6_O 326
+#define FPGA_PIN_RAMA6_I 327
+#define FPGA_PIN_RAMA7_T 337
+#define FPGA_PIN_RAMA7_O 338
+#define FPGA_PIN_RAMA7_I 339
+#define FPGA_PIN_RAMA8_T 328
+#define FPGA_PIN_RAMA8_O 329
+#define FPGA_PIN_RAMA8_I 330
+#define FPGA_PIN_RAMA9_T 316
+#define FPGA_PIN_RAMA9_O 317
+#define FPGA_PIN_RAMA9_I 318
+#define FPGA_PIN_RAMA10_T 286
+#define FPGA_PIN_RAMA10_O 287
+#define FPGA_PIN_RAMA10_I 288
+#define FPGA_PIN_RAMA11_T 304
+#define FPGA_PIN_RAMA11_O 305
+#define FPGA_PIN_RAMA11_I 306
+#define FPGA_PIN_RAMA12_T 2
+#define FPGA_PIN_RAMA12_O 3
+#define FPGA_PIN_RAMA12_I 4
+#define FPGA_PIN_RAMA13_T 340
+#define FPGA_PIN_RAMA13_O 341
+#define FPGA_PIN_RAMA13_I 342
+#define FPGA_PIN_RAMA14_T 14
+#define FPGA_PIN_RAMA14_O 15
+#define FPGA_PIN_RAMA14_I 16
+#define FPGA_PIN_RAMCE_T 271
+#define FPGA_PIN_RAMCE_O 272
+#define FPGA_PIN_RAMCE_I 273
+#define FPGA_PIN_RAMOE_T 298
+#define FPGA_PIN_RAMOE_O 299
+#define FPGA_PIN_RAMOE_I 300
+#define FPGA_PIN_RAMWR_T 5
+#define FPGA_PIN_RAMWR_O 6
+#define FPGA_PIN_RAMWR_I 7
+#define FPGA_PIN_EPPDATA0_T -1
+#define FPGA_PIN_EPPDATA0_O -1
+#define FPGA_PIN_EPPDATA0_I -1
+#define FPGA_PIN_EPPDATA1_T -1
+#define FPGA_PIN_EPPDATA1_O -1
+#define FPGA_PIN_EPPDATA1_I -1
+#define FPGA_PIN_EPPDATA2_T -1
+#define FPGA_PIN_EPPDATA2_O -1
+#define FPGA_PIN_EPPDATA2_I -1
+#define FPGA_PIN_EPPDATA3_T 113
+#define FPGA_PIN_EPPDATA3_O 114
+#define FPGA_PIN_EPPDATA3_I 115
+#define FPGA_PIN_EPPDATA4_T 122
+#define FPGA_PIN_EPPDATA4_O 123
+#define FPGA_PIN_EPPDATA4_I 124
+#define FPGA_PIN_EPPDATA5_T 125
+#define FPGA_PIN_EPPDATA5_O 126
+#define FPGA_PIN_EPPDATA5_I 127
+#define FPGA_PIN_EPPDATA6_T 128
+#define FPGA_PIN_EPPDATA6_O 129
+#define FPGA_PIN_EPPDATA6_I 130
+#define FPGA_PIN_EPPDATA7_T 131
+#define FPGA_PIN_EPPDATA7_O 132
+#define FPGA_PIN_EPPDATA7_I 133
+#define FPGA_PIN_EPPNADDRSTB_T 140
+#define FPGA_PIN_EPPNADDRSTB_O 141
+#define FPGA_PIN_EPPNADDRSTB_I 142
+#define FPGA_PIN_EPPNDATASTB_T 86
+#define FPGA_PIN_EPPNDATASTB_O 87
+#define FPGA_PIN_EPPNDATASTB_I 88
+#define FPGA_PIN_EPPNWRITE_T 89
+#define FPGA_PIN_EPPNWRITE_O 90
+#define FPGA_PIN_EPPNWRITE_I 91
+#define FPGA_PIN_EPPNRESET_T 83
+#define FPGA_PIN_EPPNRESET_O 84
+#define FPGA_PIN_EPPNRESET_I 85
+#define FPGA_PIN_EPPNWAIT_T -1
+#define FPGA_PIN_EPPNWAIT_O -1
+#define FPGA_PIN_EPPNWAIT_I -1
+#define FPGA_PIN_EPPNINTR_T -1
+#define FPGA_PIN_EPPNINTR_O -1
+#define FPGA_PIN_EPPNINTR_I -1
+#define FPGA_PIN_SPPSELECT_T -1
+#define FPGA_PIN_SPPSELECT_O -1
+#define FPGA_PIN_SPPSELECT_I -1
+#define FPGA_PIN_DAC0_T 47
+#define FPGA_PIN_DAC0_O 48
+#define FPGA_PIN_DAC0_I 49
+#define FPGA_PIN_DAC1_T 56
+#define FPGA_PIN_DAC1_O 57
+#define FPGA_PIN_DAC1_I 58
+#define FPGA_PIN_DAC2_T 59
+#define FPGA_PIN_DAC2_O 60
+#define FPGA_PIN_DAC2_I 61
+#define FPGA_PIN_DAC3_T 68
+#define FPGA_PIN_DAC3_O 69
+#define FPGA_PIN_DAC3_I 70
+#define FPGA_PIN_DAC4_T 71
+#define FPGA_PIN_DAC4_O 72
+#define FPGA_PIN_DAC4_I 73
+#define FPGA_PIN_DAC5_T 41
+#define FPGA_PIN_DAC5_O 42
+#define FPGA_PIN_DAC5_I 43
+#define FPGA_PIN_DAC6_T 38
+#define FPGA_PIN_DAC6_O 39
+#define FPGA_PIN_DAC6_I 40
+#define FPGA_PIN_DINDAC_T 44
+#define FPGA_PIN_DINDAC_O 45
+#define FPGA_PIN_DINDAC_I 46
+#define FPGA_PIN_DIN_T 80
+#define FPGA_PIN_DIN_O 81
+#define FPGA_PIN_DIN_I 82
+#define FPGA_PIN_RXC_T 143
+#define FPGA_PIN_RXC_O 144
+#define FPGA_PIN_RXC_I 145
+#define FPGA_PIN_RXD_T 164
+#define FPGA_PIN_RXD_O 165
+#define FPGA_PIN_RXD_I 166
+#define FPGA_PIN_TXC_T 152
+#define FPGA_PIN_TXC_O 153
+#define FPGA_PIN_TXC_I 154
+#define FPGA_PIN_TXD_T 178
+#define FPGA_PIN_TXD_O 179
+#define FPGA_PIN_TXD_I 180
+#define FPGA_PIN_DCD_T 167
+#define FPGA_PIN_DCD_O 168
+#define FPGA_PIN_DCD_I 169
+#define FPGA_PIN_MRES_T 199
+#define FPGA_PIN_MRES_O 200
+#define FPGA_PIN_MRES_I 201
+#define FPGA_PIN_EPPNERR_T 202
+#define FPGA_PIN_EPPNERR_O 203
+#define FPGA_PIN_EPPNERR_I 204
+#define FPGA_PIN_SPPPE_T 211
+#define FPGA_PIN_SPPPE_O 212
+#define FPGA_PIN_SPPPE_I 213
+#define FPGA_PIN_CLKFPGA_T 175
+#define FPGA_PIN_CLKFPGA_O 176
+#define FPGA_PIN_CLKFPGA_I 177
+#define FPGA_PIN_LEDPTT_T 190
+#define FPGA_PIN_LEDPTT_O 191
+#define FPGA_PIN_LEDPTT_I 192
+#define FPGA_PIN_LEDDCD_T 17
+#define FPGA_PIN_LEDDCD_O 18
+#define FPGA_PIN_LEDDCD_I 19
+#define FPGA_PIN_LEDSTA_T 26
+#define FPGA_PIN_LEDSTA_O 27
+#define FPGA_PIN_LEDSTA_I 28
+#define FPGA_PIN_LEDCON_T 29
+#define FPGA_PIN_LEDCON_O 30
+#define FPGA_PIN_LEDCON_I 31
diff --git a/main/eppafsk_firmware.h b/main/eppafsk_firmware.h
new file mode 100644
index 0000000..558e301
--- /dev/null
+++ b/main/eppafsk_firmware.h
@@ -0,0 +1,1551 @@
+/*****************************************************************************/
+
+/*
+ * eppafsk_firmware.h -- HDLC packet radio modem for EPP using FPGA utility.
+ *
+ * Copyright (C) 1998 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+/* automatically generated, do not edit */
+
+#define EPPAFSK_FIRMWAREDATE "19990628"
+
+/* firmware */
+static const unsigned char eppafsk_firmware[] = {
+ 0xff, 0x04, 0xe8, 0x8c, 0xf9, 0xde, 0xff, 0xff,
+ 0xfd, 0xfd, 0xd7, 0xdf, 0xff, 0xb5, 0xfd, 0xff,
+ 0xff, 0xda, 0xfe, 0xaf, 0xed, 0xff, 0xde, 0xfe,
+ 0xff, 0x9b, 0xff, 0xff, 0xaf, 0xff, 0xfb, 0xfb,
+ 0xff, 0xaf, 0xed, 0xff, 0xfe, 0xd7, 0xf6, 0x7f,
+ 0x6d, 0xff, 0xd7, 0xf7, 0x7f, 0xff, 0xe6, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7,
+ 0xff, 0xff, 0xff, 0xfb, 0xff, 0xbf, 0xff, 0xff,
+ 0xfb, 0xff, 0xbf, 0xb9, 0xff, 0xf8, 0xed, 0x9f,
+ 0xff, 0xfe, 0xf8, 0xed, 0x8f, 0x77, 0xfc, 0xf6,
+ 0xc7, 0x6f, 0x7f, 0xfc, 0xf6, 0xc7, 0xef, 0x6f,
+ 0xfe, 0xff, 0xd7, 0x5f, 0x7b, 0xfd, 0xf5, 0xd7,
+ 0x5f, 0x7f, 0xf5, 0xeb, 0xaf, 0xbf, 0xfe, 0xfa,
+ 0xeb, 0xaf, 0xbf, 0xfe, 0x9b, 0xff, 0x7f, 0xfd,
+ 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 0xbf,
+ 0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 0xeb,
+ 0xff, 0xc6, 0xff, 0x3f, 0xff, 0xfc, 0xf3, 0xcf,
+ 0x3f, 0xff, 0xfc, 0xf3, 0x9f, 0x7f, 0xfe, 0xf9,
+ 0xe7, 0x9f, 0x7f, 0xfe, 0xf9, 0xbf, 0xf9, 0xff,
+ 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff,
+ 0xfe, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf,
+ 0x7f, 0xff, 0x6f, 0xfe, 0xff, 0xfb, 0xaf, 0xbf,
+ 0xfe, 0xfa, 0xfb, 0xef, 0xbf, 0xfb, 0xdd, 0xf7,
+ 0xdf, 0x7d, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0x9b,
+ 0xff, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe,
+ 0xfb, 0xef, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xff, 0xc6, 0xff, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xbd, 0xef,
+ 0xbd, 0xef, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe,
+ 0xbf, 0xf9, 0xff, 0xdf, 0x7f, 0xff, 0xdd, 0xf7,
+ 0xdf, 0x7f, 0xff, 0xfd, 0xef, 0xbf, 0xff, 0xf6,
+ 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0x6f, 0xf4, 0xfb,
+ 0xed, 0xb7, 0xdf, 0x5e, 0x3b, 0xed, 0xb7, 0xdf,
+ 0xfe, 0xf6, 0xdb, 0x6e, 0xbf, 0xfd, 0xf6, 0xdb,
+ 0x6f, 0xff, 0x9b, 0xff, 0x7f, 0xff, 0xfd, 0xf7,
+ 0xdf, 0x7f, 0xff, 0xfd, 0xe7, 0x3f, 0xff, 0xfe,
+ 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xff, 0xe6,
+ 0xff, 0xdf, 0x7f, 0xff, 0xfd, 0xf5, 0xd7, 0x77,
+ 0xff, 0x7d, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef,
+ 0xbf, 0xff, 0xfe, 0xbf, 0xf9, 0xff, 0xfc, 0xf3,
+ 0xcf, 0xbe, 0xff, 0xee, 0xb3, 0xcf, 0x7f, 0xfe,
+ 0xf9, 0xe6, 0x9d, 0x7f, 0xfe, 0xf9, 0xe6, 0xff,
+ 0x6f, 0xfe, 0xff, 0x7d, 0xf7, 0xdf, 0x77, 0xff,
+ 0xfd, 0xf7, 0xdf, 0xff, 0xfe, 0xfb, 0xef, 0xbf,
+ 0xfe, 0xfe, 0xfb, 0xef, 0xff, 0x9b, 0xdd, 0xcf,
+ 0x3e, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xf7, 0xfc,
+ 0xe7, 0x9f, 0x7f, 0xf6, 0xf9, 0xe7, 0x9f, 0x7f,
+ 0xfe, 0xdd, 0x66, 0xff, 0xef, 0xbf, 0xff, 0xfe,
+ 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xf7, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xb7, 0xf9,
+ 0xf7, 0xfe, 0xfb, 0xe7, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xef, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff,
+ 0xfd, 0xf7, 0xff, 0x6f, 0xfe, 0xbf, 0xfd, 0xf6,
+ 0xdb, 0x6f, 0xbf, 0xfd, 0xf7, 0xdb, 0xd7, 0x3e,
+ 0xfb, 0xec, 0xb7, 0xdf, 0x7a, 0xfb, 0xad, 0xfb,
+ 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x3f, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff,
+ 0xff, 0xbf, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xfd, 0xf7, 0xff, 0xff, 0xbf, 0xff,
+ 0xef, 0xfb, 0xff, 0xff, 0xff, 0xfb, 0x6f, 0x7e,
+ 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd,
+ 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0x7f, 0x9b, 0xff, 0x7f, 0xff, 0xfd,
+ 0xf7, 0xdf, 0x77, 0xff, 0xfd, 0xf7, 0xbf, 0xff,
+ 0xfe, 0xfb, 0xef, 0xbf, 0xef, 0xfe, 0xfb, 0xff,
+ 0xe6, 0xff, 0xff, 0xff, 0xef, 0xbf, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xfe, 0x7f, 0xf7, 0xcd, 0xef,
+ 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xff,
+ 0x9f, 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xfe, 0xaf,
+ 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x6e, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xf5,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff,
+ 0xff, 0xff, 0xf7, 0xe6, 0xff, 0xff, 0xf9, 0xff,
+ 0xef, 0xff, 0xff, 0xfb, 0xdd, 0x6f, 0xff, 0xfd,
+ 0xfb, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf,
+ 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xf7,
+ 0xdf, 0xff, 0xff, 0xff, 0xfe, 0xfd, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xfd, 0x6f, 0xfe, 0xff, 0x7f,
+ 0xff, 0x7f, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x9b, 0xff, 0xbf, 0xff, 0xff, 0xf9, 0xef,
+ 0x9f, 0xff, 0xde, 0x5f, 0xff, 0xfe, 0xff, 0xff,
+ 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff,
+ 0x6b, 0xff, 0xff, 0xf5, 0xf4, 0xdf, 0x4f, 0xbf,
+ 0xef, 0xfe, 0x7f, 0xfb, 0xff, 0xff, 0xff, 0xfb,
+ 0xff, 0xff, 0xbf, 0xf9, 0xfb, 0xf7, 0xff, 0xfb,
+ 0xff, 0xfe, 0xff, 0xef, 0xbf, 0xbe, 0xf7, 0xff,
+ 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f,
+ 0xfe, 0xfd, 0xfd, 0xf7, 0xff, 0x8f, 0xef, 0xff,
+ 0xff, 0xe3, 0xff, 0xff, 0xd7, 0xff, 0x7f, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xfd, 0xff,
+ 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0xff,
+ 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xef,
+ 0xff, 0xe6, 0xff, 0x2f, 0xff, 0xff, 0xfe, 0xfa,
+ 0xeb, 0xaf, 0xfb, 0xcd, 0x6f, 0xfc, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xef,
+ 0xfa, 0xff, 0xaf, 0xf7, 0xfe, 0xfb, 0xef, 0xf7,
+ 0x5f, 0xed, 0xb5, 0xd5, 0x5d, 0x7b, 0xfd, 0xff,
+ 0xff, 0xff, 0x6f, 0xfe, 0xbf, 0x6f, 0xff, 0xfb,
+ 0xbf, 0x7b, 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b,
+ 0xfe, 0xef, 0xff, 0xff, 0xfb, 0xfb, 0xbf, 0xbf,
+ 0xff, 0xee, 0x5f, 0x7e, 0xf9, 0xa5, 0xdc, 0xdf,
+ 0xfe, 0xff, 0xff, 0xbf, 0x66, 0xff, 0xfb, 0xff,
+ 0xbf, 0xff, 0xfe, 0x7b, 0xef, 0xbd, 0xfb, 0xdd,
+ 0x77, 0xdf, 0x65, 0xff, 0xfd, 0xff, 0xff, 0xff,
+ 0xb7, 0xf9, 0xff, 0xde, 0xff, 0xbf, 0xbd, 0xf7,
+ 0xfb, 0xfb, 0xf9, 0x77, 0xbf, 0xfd, 0xf6, 0x7b,
+ 0x6d, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xd4, 0xbf,
+ 0xff, 0xff, 0xfb, 0xe9, 0xbf, 0xff, 0x3e, 0xfb,
+ 0x75, 0xaf, 0xbd, 0xf6, 0xda, 0x6b, 0xff, 0xff,
+ 0xff, 0x5f, 0x99, 0xfb, 0xbf, 0xdb, 0xff, 0xfe,
+ 0xff, 0xef, 0xff, 0xfe, 0xf2, 0xdf, 0x6c, 0xb3,
+ 0xcd, 0xbc, 0xdf, 0xec, 0xff, 0xff, 0xef, 0x66,
+ 0xfe, 0xbf, 0xf5, 0xff, 0xfb, 0xef, 0xbf, 0xff,
+ 0x96, 0x6c, 0xbd, 0xf7, 0xde, 0x2b, 0xef, 0xbd,
+ 0xff, 0xff, 0xff, 0xb3, 0xb1, 0xff, 0xfb, 0xff,
+ 0xef, 0xff, 0xfe, 0xfe, 0xef, 0xbf, 0x7d, 0xef,
+ 0xfd, 0xf7, 0x7e, 0x7b, 0xbf, 0xfe, 0xff, 0xff,
+ 0x66, 0xec, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff,
+ 0xff, 0xff, 0x7b, 0x7f, 0xfb, 0xed, 0xb7, 0xdf,
+ 0x7e, 0xe3, 0xff, 0xff, 0xbf, 0x99, 0xf7, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xb7,
+ 0xf3, 0xdd, 0x77, 0xff, 0x7f, 0xf7, 0xff, 0xff,
+ 0xff, 0xf7, 0xe6, 0xfd, 0xff, 0xfd, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xf7, 0xcc, 0x7f, 0xfe, 0xf9,
+ 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xbd, 0xb1,
+ 0xff, 0xbb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef,
+ 0x3e, 0x7d, 0xfd, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd,
+ 0xf7, 0xdf, 0xff, 0x66, 0xe6, 0xff, 0xff, 0xff,
+ 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xff, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xdf, 0xff, 0xff, 0xff, 0x3f,
+ 0x9b, 0xfb, 0xff, 0xff, 0xef, 0xbf, 0xff, 0xfe,
+ 0xfb, 0xff, 0xff, 0xb7, 0xdf, 0x7e, 0xff, 0xed,
+ 0xf7, 0xff, 0xff, 0xff, 0xef, 0xe6, 0xfe, 0xfb,
+ 0xaf, 0xff, 0xff, 0xff, 0xfd, 0xf7, 0xf7, 0xd1,
+ 0xbf, 0xfe, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xff,
+ 0xff, 0xbb, 0x79, 0xff, 0xf6, 0xcb, 0x27, 0xbf,
+ 0xfc, 0xf2, 0xcb, 0xfd, 0xf6, 0xb7, 0xdf, 0x7e,
+ 0xff, 0xfd, 0xf7, 0xff, 0xff, 0x7f, 0x6f, 0xfe,
+ 0xbf, 0xff, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xcb, 0x5c, 0x67, 0x9d, 0x7f, 0xd7, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x9b, 0xff, 0xef, 0x8f, 0x3e,
+ 0xfa, 0xe8, 0xa3, 0x8b, 0x3f, 0xfa, 0xd4, 0x47,
+ 0x9f, 0x5f, 0x74, 0xfc, 0xf1, 0x9f, 0x7f, 0xfe,
+ 0xe6, 0xff, 0xef, 0xaf, 0xff, 0xff, 0xf7, 0xff,
+ 0xff, 0xbf, 0xfe, 0xf5, 0xd7, 0x5f, 0x7f, 0x7d,
+ 0xf5, 0xfd, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xfb,
+ 0xeb, 0xef, 0xbf, 0xfd, 0xfe, 0xea, 0xaf, 0x7f,
+ 0xfd, 0xf5, 0xd7, 0x57, 0x37, 0xdd, 0xfe, 0xff,
+ 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xfa, 0xff, 0xff,
+ 0xff, 0xef, 0xff, 0xbf, 0xff, 0xfd, 0xf7, 0x55,
+ 0x7f, 0x53, 0xcd, 0xff, 0xff, 0xff, 0x9b, 0xff,
+ 0xff, 0xbf, 0xfe, 0xfe, 0xdb, 0xef, 0xbb, 0xff,
+ 0xff, 0xfb, 0xff, 0x7f, 0xfd, 0x7f, 0xd7, 0xfd,
+ 0xff, 0xff, 0xff, 0x66, 0xff, 0x9b, 0xff, 0xbe,
+ 0xfc, 0xfe, 0xcb, 0xef, 0xbf, 0xff, 0xff, 0xff,
+ 0xff, 0x7f, 0xfa, 0xff, 0xfe, 0xff, 0xff, 0xbf,
+ 0xf9, 0xff, 0xad, 0xbf, 0xde, 0xba, 0xab, 0xad,
+ 0xbb, 0xe6, 0xda, 0xd7, 0x5e, 0x7d, 0xbd, 0xe5,
+ 0xd7, 0x5f, 0x7f, 0xfd, 0x6f, 0xfe, 0xbe, 0xef,
+ 0xff, 0xff, 0xfe, 0xfb, 0xff, 0xdf, 0x1f, 0xff,
+ 0xf8, 0xf1, 0xe7, 0x7f, 0xfd, 0xbd, 0xff, 0xff,
+ 0xff, 0x1b, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xbf,
+ 0xff, 0xef, 0xbf, 0xfd, 0xef, 0xde, 0x3f, 0xfd,
+ 0xbf, 0xfb, 0xff, 0xff, 0xff, 0x7f, 0xe6, 0xff,
+ 0xff, 0xff, 0xef, 0x3f, 0xff, 0xfd, 0xf7, 0xfd,
+ 0x7f, 0xdf, 0xdf, 0xff, 0xbf, 0xff, 0xfe, 0xff,
+ 0xff, 0xff, 0x9f, 0xf9, 0xff, 0xfe, 0xfd, 0xef,
+ 0xb5, 0xdf, 0x7e, 0xff, 0xb9, 0xfd, 0xf5, 0xf7,
+ 0xdd, 0x7d, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0x6f,
+ 0xfc, 0xff, 0xf5, 0xff, 0xdf, 0xbf, 0xfd, 0xbd,
+ 0xff, 0xbf, 0xdb, 0x3f, 0xff, 0xfd, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0x99, 0xff, 0xff, 0xff,
+ 0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x9f,
+ 0xff, 0xfe, 0xff, 0x70, 0xf7, 0xfe, 0xff, 0xff,
+ 0xff, 0xc6, 0xff, 0xfd, 0x7f, 0xff, 0xf7, 0xff,
+ 0xff, 0xff, 0xbf, 0xfb, 0xf9, 0xff, 0xf7, 0x7f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff,
+ 0xdf, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xfd, 0xbf,
+ 0x1b, 0x7f, 0x7f, 0xff, 0x7f, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0x6f, 0xbe, 0x3f, 0xfb, 0x98, 0xff,
+ 0xff, 0xff, 0xef, 0xbf, 0xff, 0xfb, 0xff, 0xff,
+ 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x99,
+ 0xff, 0x6e, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xfd, 0xef,
+ 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xcf, 0xaf,
+ 0x9f, 0xdc, 0x72, 0xcf, 0x3d, 0xd7, 0x7f, 0xf7,
+ 0xdf, 0x7f, 0xff, 0xdd, 0xf7, 0xff, 0xff, 0xff,
+ 0xbf, 0xf9, 0xff, 0xd9, 0xef, 0xbf, 0xff, 0xfe,
+ 0xfa, 0xeb, 0x7f, 0x77, 0xf8, 0xe3, 0x8f, 0x37,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xff,
+ 0xfe, 0xfb, 0xf7, 0xbe, 0xbe, 0xff, 0xfe, 0xff,
+ 0xff, 0xfd, 0xf6, 0xdb, 0xdf, 0xdf, 0xff, 0xff,
+ 0xff, 0xef, 0x1b, 0xfe, 0xbf, 0xbf, 0xfa, 0xfa,
+ 0xeb, 0xa5, 0xf2, 0x9a, 0xef, 0xd7, 0xdf, 0xf9,
+ 0xa5, 0xde, 0x7a, 0x7e, 0xff, 0xff, 0x3f, 0x66,
+ 0xff, 0xef, 0x7f, 0xff, 0xff, 0x3f, 0xff, 0xef,
+ 0xd7, 0xf7, 0xfd, 0x77, 0xdf, 0xe5, 0x3b, 0xef,
+ 0xff, 0xff, 0xff, 0xb7, 0xf9, 0xff, 0x7b, 0xff,
+ 0xfd, 0xf7, 0xdf, 0x6f, 0xbb, 0xb5, 0x7e, 0xbd,
+ 0xf7, 0xf6, 0xeb, 0xae, 0x3b, 0xf5, 0xff, 0xff,
+ 0x6f, 0xd6, 0xff, 0x5e, 0x7a, 0xe9, 0xa5, 0x97,
+ 0x5e, 0x3b, 0xef, 0x5d, 0xaf, 0xbd, 0x76, 0xbe,
+ 0xf9, 0xef, 0xfd, 0xff, 0x5f, 0x9b, 0xfb, 0xbf,
+ 0xbd, 0x66, 0x9a, 0x69, 0xa6, 0xd5, 0x56, 0xfe,
+ 0x96, 0xdf, 0xfb, 0xcd, 0x3e, 0x7b, 0x64, 0xaf,
+ 0xff, 0xef, 0x66, 0xfe, 0x6f, 0xff, 0xfd, 0x77,
+ 0xdf, 0x7d, 0xef, 0xbd, 0xfb, 0xe5, 0xf2, 0xde,
+ 0xfb, 0xcf, 0x3e, 0x7b, 0xef, 0xff, 0xb3, 0xb1,
+ 0xff, 0xfb, 0xff, 0xff, 0xe7, 0x1f, 0xff, 0xfb,
+ 0xbf, 0x7f, 0xf9, 0xb7, 0xf7, 0xbe, 0xe7, 0xbe,
+ 0xf4, 0xfd, 0xff, 0x66, 0xee, 0xff, 0xfe, 0xda,
+ 0x6b, 0xa8, 0xb1, 0xf6, 0xdb, 0x6f, 0x5f, 0xe7,
+ 0xed, 0xb7, 0xff, 0xfa, 0xe3, 0xfd, 0xff, 0xbf,
+ 0x9b, 0xf7, 0xff, 0x9b, 0xef, 0xbe, 0xfb, 0xee,
+ 0xbb, 0xef, 0xbf, 0xfb, 0xff, 0x77, 0xff, 0x77,
+ 0xdc, 0xf9, 0xff, 0xff, 0xf7, 0xe6, 0xfd, 0xbb,
+ 0xef, 0xb3, 0xcf, 0x3e, 0xfb, 0xec, 0xb3, 0xce,
+ 0xef, 0xff, 0xf9, 0xff, 0xbf, 0xff, 0xfe, 0xf3,
+ 0xff, 0xbd, 0xb1, 0x7f, 0x7a, 0xe9, 0xaf, 0xbf,
+ 0x5e, 0xfa, 0xeb, 0xbf, 0xd7, 0xf9, 0xf5, 0xd7,
+ 0x6f, 0x9f, 0x7d, 0xf7, 0xdf, 0xff, 0x66, 0xe6,
+ 0x9b, 0x7f, 0xf6, 0xd9, 0x6f, 0x9f, 0x7d, 0xf6,
+ 0xff, 0xff, 0x7f, 0xff, 0xfd, 0xf9, 0xe7, 0xbf,
+ 0xff, 0xff, 0x3f, 0x9b, 0x7b, 0xfb, 0xba, 0xed,
+ 0xf6, 0xdb, 0x6e, 0xb7, 0xfd, 0xff, 0xff, 0xdf,
+ 0x7e, 0xbf, 0xf7, 0xde, 0xfb, 0xff, 0xff, 0xef,
+ 0xa6, 0xde, 0xeb, 0xbf, 0xf5, 0xd6, 0x5b, 0x6f,
+ 0xbd, 0xfd, 0xf7, 0xef, 0xff, 0xfe, 0xfb, 0xe7,
+ 0xbf, 0xff, 0x5f, 0xff, 0xab, 0x61, 0xff, 0x72,
+ 0xbb, 0xef, 0xbe, 0xfb, 0xee, 0xbb, 0xff, 0xfe,
+ 0xfb, 0xdf, 0x7f, 0xfb, 0xfd, 0xf7, 0xef, 0x97,
+ 0x7f, 0x63, 0xfe, 0xbf, 0xfe, 0xfe, 0xfb, 0xef,
+ 0xbf, 0xff, 0xfe, 0xeb, 0xf6, 0x6f, 0xbd, 0xff,
+ 0x7f, 0xfd, 0xff, 0xfd, 0xf5, 0xff, 0x9b, 0xff,
+ 0xaf, 0xcf, 0x3e, 0xfb, 0xec, 0xb3, 0xcf, 0x3e,
+ 0xba, 0xfc, 0x47, 0x9f, 0x7f, 0xfe, 0xf9, 0xd7,
+ 0x1f, 0x7d, 0xfe, 0xe6, 0xff, 0xcb, 0xef, 0xbf,
+ 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xfe, 0xcf, 0xd7,
+ 0x5f, 0xff, 0xfb, 0xff, 0xd7, 0x5f, 0xff, 0xbf,
+ 0xe1, 0xef, 0xf2, 0xef, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xef, 0xaf, 0xeb, 0xff, 0xf5, 0xd7, 0xff, 0xff,
+ 0xff, 0xf4, 0xd7, 0xff, 0x6f, 0xfe, 0xbf, 0xfe,
+ 0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0xbf, 0xdf,
+ 0xff, 0xf7, 0xd5, 0x3f, 0xff, 0xfd, 0xfd, 0xf5,
+ 0xff, 0x1b, 0xfa, 0xaf, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xef, 0xbf, 0xff, 0xbf, 0xbb, 0xff, 0x7f, 0xfd,
+ 0xff, 0xff, 0xdb, 0x7f, 0xfd, 0xff, 0xe6, 0xff,
+ 0xdb, 0xef, 0xbf, 0xfc, 0xe7, 0xfb, 0x4f, 0xbf,
+ 0xff, 0xe7, 0x9f, 0xfb, 0x7d, 0xbf, 0xad, 0xa7,
+ 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xae, 0xb5, 0xee,
+ 0xea, 0xeb, 0xad, 0xb7, 0xe6, 0xba, 0xd7, 0x5f,
+ 0x7d, 0xf5, 0x64, 0xd7, 0x5a, 0x7f, 0xfd, 0x6b,
+ 0xfa, 0xbf, 0xff, 0xff, 0xff, 0xef, 0xff, 0xef,
+ 0xbf, 0xff, 0xf9, 0xf7, 0xf1, 0xe7, 0x8f, 0x5d,
+ 0xfc, 0xff, 0xff, 0x7f, 0x1b, 0xff, 0xfb, 0xef,
+ 0xbf, 0xf7, 0xff, 0xfb, 0xff, 0x77, 0xff, 0xfe,
+ 0xbf, 0xff, 0xfa, 0xfd, 0xfd, 0xff, 0xff, 0xff,
+ 0x7f, 0xe6, 0xff, 0x5f, 0xff, 0xde, 0xff, 0x5f,
+ 0xff, 0xf5, 0xff, 0x9f, 0xff, 0xeb, 0xae, 0xff,
+ 0xed, 0xf4, 0xff, 0xfe, 0xff, 0xbf, 0xf9, 0xff,
+ 0xfe, 0xef, 0xaf, 0xe7, 0xfe, 0xfa, 0xeb, 0xc9,
+ 0xef, 0xf9, 0xe7, 0xe7, 0x57, 0x7e, 0xee, 0xe7,
+ 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xfe, 0xff, 0xef,
+ 0xdf, 0xff, 0xbd, 0xf7, 0xfd, 0xdf, 0xff, 0xdf,
+ 0x7f, 0xbf, 0xfd, 0xff, 0xfe, 0xff, 0xff, 0x9b,
+ 0xff, 0xff, 0xbb, 0xfe, 0xfa, 0xff, 0x8f, 0xbf,
+ 0xfe, 0xff, 0xff, 0x1f, 0xff, 0xdf, 0xfd, 0xfb,
+ 0x3f, 0xff, 0xfd, 0xff, 0xa6, 0xff, 0xff, 0xaf,
+ 0x7d, 0xf7, 0xb7, 0x7e, 0x4f, 0xff, 0xfd, 0x6f,
+ 0xf7, 0xff, 0xdd, 0xaf, 0xee, 0xf7, 0x9f, 0xff,
+ 0xbf, 0xf9, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff,
+ 0xff, 0xed, 0xf1, 0x9f, 0xbf, 0xf7, 0xff, 0xff,
+ 0xfb, 0xef, 0xf6, 0xf7, 0xff, 0x6f, 0xfe, 0xfe,
+ 0xfd, 0xbf, 0xfb, 0xcf, 0xdf, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xbb, 0xff, 0xff, 0xef, 0x7f, 0xfc,
+ 0xff, 0xff, 0x9b, 0xff, 0xff, 0xfe, 0xbf, 0xfe,
+ 0xef, 0xff, 0xf7, 0xff, 0xbf, 0xff, 0xef, 0xff,
+ 0xff, 0xff, 0xff, 0x7d, 0xbd, 0xf7, 0xff, 0x66,
+ 0xff, 0xef, 0xff, 0xff, 0xff, 0xfd, 0xeb, 0xab,
+ 0xff, 0xfe, 0xe7, 0xdc, 0x5f, 0x6f, 0xd9, 0xf5,
+ 0xff, 0x5f, 0xff, 0xbf, 0xf1, 0xff, 0xf2, 0xff,
+ 0xff, 0x9f, 0xf6, 0xfb, 0x2d, 0xf7, 0xf9, 0xfb,
+ 0xf3, 0x9f, 0x7f, 0xff, 0xfd, 0xfe, 0xff, 0xff,
+ 0x67, 0xfe, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x7f,
+ 0xf7, 0xdd, 0xfb, 0xdf, 0xf7, 0xbe, 0xfb, 0xef,
+ 0x7f, 0xff, 0xff, 0xfe, 0xff, 0x9b, 0xfe, 0xaf,
+ 0xff, 0xfe, 0xfa, 0x9b, 0xbf, 0xbf, 0xcf, 0xce,
+ 0x5f, 0xff, 0x7b, 0xf5, 0xd5, 0x57, 0xdf, 0x79,
+ 0xff, 0xbf, 0x66, 0xff, 0xff, 0xef, 0xff, 0xfe,
+ 0xf6, 0x6f, 0xbf, 0x97, 0xff, 0xdd, 0xff, 0xff,
+ 0xfd, 0xf7, 0xdf, 0x77, 0xdf, 0xfb, 0xb7, 0xf9,
+ 0xff, 0xfa, 0xef, 0xaf, 0xd7, 0xce, 0xf7, 0xff,
+ 0xbd, 0x76, 0xbf, 0xf6, 0xfe, 0xfb, 0xef, 0x9f,
+ 0x7f, 0xd6, 0xff, 0x6f, 0xd4, 0xff, 0xff, 0x7e,
+ 0xeb, 0xbc, 0x7f, 0x9b, 0x7f, 0xed, 0x75, 0xe7,
+ 0xbd, 0xf4, 0xd2, 0x4b, 0xff, 0xff, 0xf5, 0x5f,
+ 0x99, 0xfb, 0xaf, 0x9f, 0x2f, 0xfb, 0xf9, 0x3f,
+ 0xff, 0xfe, 0xfe, 0xdf, 0xca, 0x7b, 0xfd, 0x34,
+ 0xd3, 0x5e, 0x7f, 0xff, 0xef, 0x66, 0xfe, 0xbf,
+ 0xb2, 0x9a, 0x1c, 0xee, 0xaf, 0xef, 0x96, 0xff,
+ 0xbd, 0xf3, 0xfe, 0x8f, 0xaf, 0xbe, 0x57, 0xdf,
+ 0xfd, 0xb3, 0xb1, 0xff, 0xfa, 0xfb, 0x2f, 0xff,
+ 0x5e, 0xfb, 0xef, 0xbf, 0x7f, 0x6f, 0xf5, 0xff,
+ 0xff, 0xff, 0xef, 0xb7, 0xff, 0xff, 0x66, 0xec,
+ 0xff, 0xff, 0xfb, 0xeb, 0xbf, 0xf3, 0x5f, 0xfe,
+ 0x6f, 0x7f, 0x7b, 0xfd, 0xb5, 0xd7, 0x5e, 0xfb,
+ 0xed, 0xff, 0xbf, 0x99, 0xf7, 0xff, 0xf3, 0xcf,
+ 0xff, 0xff, 0x7f, 0xdb, 0xff, 0xbf, 0xf3, 0xff,
+ 0x7f, 0xdf, 0x7d, 0xf7, 0xfd, 0xf7, 0xff, 0xf7,
+ 0xe6, 0xfd, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 0xdf,
+ 0xfd, 0xff, 0xcb, 0xff, 0xf7, 0xdf, 0x65, 0x9f,
+ 0x7d, 0xd6, 0xf9, 0xff, 0xbd, 0xb1, 0xff, 0xdb,
+ 0xee, 0x3e, 0xcf, 0x76, 0xf3, 0xee, 0xaf, 0x7f,
+ 0xbd, 0xf4, 0xd7, 0x4f, 0x7f, 0xfd, 0xb7, 0xdb,
+ 0xeb, 0x66, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xf3,
+ 0xfb, 0x7f, 0xff, 0xfb, 0xdf, 0x3f, 0xff, 0x6d,
+ 0xb3, 0xcf, 0xfe, 0xdf, 0xff, 0x3b, 0x9b, 0xfb,
+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xef, 0xff,
+ 0xf6, 0xf7, 0xf7, 0x7f, 0xbb, 0x6d, 0xb7, 0xff,
+ 0xff, 0x7f, 0xef, 0xe6, 0xfe, 0xfb, 0xff, 0xff,
+ 0xda, 0xff, 0x8f, 0xef, 0xff, 0xf7, 0xbf, 0xdf,
+ 0x7f, 0xfb, 0xed, 0xb7, 0xfe, 0xff, 0xff, 0xbb,
+ 0x79, 0xff, 0xf6, 0xdf, 0xef, 0x9f, 0xfc, 0xfb,
+ 0xdf, 0xff, 0xfa, 0xb7, 0xd5, 0x77, 0xdd, 0x7d,
+ 0xf7, 0xdf, 0x93, 0x7f, 0x6f, 0xfe, 0xff, 0x7e,
+ 0xfa, 0xdf, 0xff, 0xff, 0x7b, 0xfe, 0xeb, 0xfd,
+ 0xff, 0xff, 0xfd, 0xf7, 0xdf, 0x77, 0xfd, 0xff,
+ 0xff, 0x9b, 0xff, 0xbf, 0x8f, 0x3e, 0xff, 0xe8,
+ 0xb3, 0xcf, 0x3f, 0xfa, 0xfc, 0x67, 0x97, 0x7d,
+ 0x76, 0xdd, 0x45, 0x1f, 0x7d, 0xfe, 0xe6, 0xff,
+ 0xfb, 0xaf, 0xff, 0xff, 0xe7, 0xef, 0xef, 0xbf,
+ 0xfe, 0xf5, 0xdf, 0xdf, 0x7f, 0x7f, 0xfd, 0x95,
+ 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xfe, 0xeb, 0xff,
+ 0xbf, 0xfe, 0xfb, 0xff, 0xaf, 0x7f, 0xfd, 0xf5,
+ 0xdd, 0x7f, 0xbf, 0xfd, 0xe5, 0xd7, 0xff, 0x6f,
+ 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xbf, 0xff,
+ 0xfe, 0xbf, 0x5f, 0xfd, 0xd7, 0xd7, 0x5f, 0x75,
+ 0xd5, 0xf7, 0xff, 0xff, 0x9b, 0xff, 0xbf, 0xff,
+ 0xff, 0xff, 0xcb, 0xff, 0xff, 0xff, 0xff, 0xd7,
+ 0x7f, 0x7f, 0xff, 0x7d, 0xf6, 0xfd, 0x7e, 0xfd,
+ 0xff, 0xe6, 0xff, 0xfb, 0xfb, 0xff, 0xfd, 0xfe,
+ 0xcb, 0xff, 0xff, 0xfd, 0xff, 0x9c, 0xdf, 0x7e,
+ 0x79, 0xfd, 0xa7, 0x9f, 0xfe, 0xbf, 0xf9, 0xff,
+ 0xad, 0xbf, 0xf6, 0xaa, 0xab, 0xad, 0xbd, 0xf6,
+ 0xda, 0x17, 0x5f, 0x6a, 0xbd, 0xa5, 0xd6, 0x5a,
+ 0x77, 0xfd, 0x6f, 0xfe, 0xff, 0xff, 0xff, 0xfb,
+ 0xff, 0xf7, 0xec, 0xbf, 0xbb, 0x7f, 0xf5, 0xff,
+ 0xa5, 0x9f, 0x7d, 0xfe, 0xf9, 0xff, 0xff, 0x1b,
+ 0xbf, 0xff, 0xfe, 0xbf, 0xff, 0x7f, 0xef, 0xef,
+ 0xaf, 0xff, 0xff, 0xff, 0xfe, 0xbf, 0x7f, 0xff,
+ 0xff, 0xfb, 0xff, 0x7f, 0x66, 0xff, 0x7f, 0xff,
+ 0xff, 0xef, 0xff, 0xef, 0xff, 0xff, 0xff, 0xf7,
+ 0xff, 0x5f, 0x7f, 0xed, 0x64, 0x57, 0xff, 0xff,
+ 0x9f, 0xf9, 0xff, 0xef, 0xcb, 0xef, 0xf7, 0xff,
+ 0xfe, 0xff, 0x8d, 0xf9, 0xb9, 0x7d, 0xb7, 0x4b,
+ 0xff, 0xfd, 0xf9, 0xff, 0xff, 0x67, 0xfc, 0xff,
+ 0xff, 0xfa, 0xee, 0xfe, 0xff, 0xfd, 0xff, 0xfe,
+ 0xff, 0xfd, 0x7d, 0xef, 0xaf, 0xde, 0xbf, 0x5f,
+ 0xff, 0xff, 0x99, 0xff, 0xff, 0xff, 0xfe, 0xfb,
+ 0xed, 0xbf, 0xff, 0xfe, 0x3e, 0xd7, 0xff, 0xbb,
+ 0xdf, 0xf6, 0xff, 0x7d, 0xff, 0xff, 0x7f, 0xc6,
+ 0xff, 0xff, 0xaf, 0xb5, 0xf6, 0xf4, 0x7f, 0xff,
+ 0xfb, 0xfd, 0xf9, 0xfe, 0xfd, 0xdf, 0xff, 0xef,
+ 0xc7, 0xff, 0xed, 0xbf, 0xf9, 0xff, 0x7f, 0xdf,
+ 0x7f, 0xbf, 0xff, 0x77, 0xdf, 0xf5, 0x75, 0xff,
+ 0xff, 0xff, 0xff, 0xfe, 0xef, 0xbf, 0xff, 0xf3,
+ 0x6f, 0xfe, 0xff, 0xff, 0xbf, 0xa3, 0x8f, 0x3f,
+ 0x7e, 0xfc, 0xff, 0x1e, 0xeb, 0xff, 0xff, 0xaf,
+ 0x9b, 0xbf, 0xff, 0xcf, 0xff, 0x9b, 0xff, 0xff,
+ 0xff, 0xff, 0xf7, 0xdf, 0x7e, 0x3e, 0xfb, 0xff,
+ 0xdf, 0xfe, 0xff, 0xff, 0xf6, 0xe7, 0xff, 0xff,
+ 0xff, 0xff, 0xe6, 0xff, 0xff, 0xaf, 0xfd, 0xfa,
+ 0xfb, 0xff, 0xf7, 0xf7, 0xdf, 0x7f, 0xd1, 0x5b,
+ 0x6f, 0xf9, 0xf7, 0x9f, 0xff, 0xfc, 0xbf, 0xf9,
+ 0xff, 0xff, 0xef, 0xbf, 0x9f, 0xfe, 0xbf, 0x7f,
+ 0xff, 0xfd, 0xff, 0x75, 0xd3, 0x7f, 0xbf, 0xdb,
+ 0xe7, 0xdb, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xfd,
+ 0xeb, 0xef, 0xff, 0xff, 0x9f, 0xbf, 0xff, 0xff,
+ 0xef, 0xdf, 0x5f, 0xcf, 0x7f, 0xfe, 0xfb, 0xff,
+ 0x1b, 0xfe, 0xbf, 0xff, 0xff, 0xe6, 0xeb, 0x3f,
+ 0xbc, 0xf8, 0x7e, 0xfe, 0x79, 0x65, 0xf5, 0x97,
+ 0xfc, 0xff, 0x7c, 0xf7, 0x3f, 0x66, 0xff, 0xfb,
+ 0xff, 0xbf, 0xf3, 0xfa, 0xcf, 0xa9, 0xbf, 0xcf,
+ 0x7f, 0xf6, 0xf9, 0xcf, 0xb9, 0xfe, 0xfc, 0xdf,
+ 0xfd, 0xb7, 0xf9, 0x5f, 0x7e, 0x6d, 0xec, 0xe7,
+ 0x9e, 0x7f, 0xa9, 0xff, 0xd7, 0xbf, 0xdd, 0x7e,
+ 0x73, 0xaf, 0xff, 0xd7, 0x9e, 0xff, 0x6f, 0xd6,
+ 0xf3, 0xce, 0x3a, 0xff, 0x8f, 0xf7, 0xdf, 0x3a,
+ 0xff, 0xfc, 0xaf, 0xbd, 0xf4, 0xdf, 0xf9, 0x67,
+ 0xbf, 0xf6, 0x5f, 0x9b, 0xfb, 0xbf, 0xdf, 0x5f,
+ 0xff, 0xe9, 0xbb, 0xaf, 0x6e, 0xde, 0xff, 0x7e,
+ 0x2b, 0xad, 0x3c, 0xfb, 0xcc, 0x37, 0xf7, 0xef,
+ 0x66, 0xfe, 0xbb, 0xf2, 0xda, 0x2b, 0xaa, 0xf9,
+ 0xa7, 0x9e, 0xf7, 0x5f, 0xf3, 0xee, 0x3b, 0xef,
+ 0x3e, 0x5b, 0xcd, 0xff, 0xb3, 0xb1, 0xff, 0xfe,
+ 0xff, 0xff, 0xfd, 0xfe, 0xfb, 0xee, 0xfb, 0xfd,
+ 0x87, 0xbd, 0xfd, 0xd6, 0xdf, 0xee, 0xf5, 0xdf,
+ 0xfa, 0x66, 0xee, 0xff, 0xfe, 0xfa, 0xff, 0xbf,
+ 0xbf, 0xcd, 0xfa, 0xff, 0xdf, 0xfb, 0xed, 0xb5,
+ 0xf7, 0xfe, 0x2b, 0xfd, 0xb7, 0xb8, 0x9b, 0xf7,
+ 0xff, 0xfb, 0xff, 0xff, 0xff, 0x76, 0xdb, 0x6f,
+ 0xbf, 0xb9, 0xdd, 0x77, 0xdf, 0x7f, 0xdb, 0xf9,
+ 0xb7, 0xcf, 0xf7, 0xa6, 0xfd, 0xff, 0xf7, 0xf7,
+ 0xdf, 0xff, 0xff, 0xfd, 0xff, 0x9f, 0x47, 0xfe,
+ 0xf9, 0xe7, 0xbf, 0xff, 0xfe, 0xfb, 0xe5, 0xbd,
+ 0xb1, 0xff, 0xfb, 0xed, 0xb1, 0xdb, 0x56, 0xfb,
+ 0x6e, 0xbf, 0xff, 0xa1, 0xf4, 0xd7, 0x4b, 0x9f,
+ 0x7d, 0x76, 0xd2, 0xff, 0x66, 0xe6, 0xff, 0xef,
+ 0xff, 0xff, 0xfb, 0xdf, 0x7f, 0xff, 0xff, 0xff,
+ 0x3f, 0xfb, 0xec, 0xf3, 0xe7, 0x9f, 0xff, 0xac,
+ 0x3f, 0x9b, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xfd, 0xf7, 0xff, 0xff, 0xff, 0xdb, 0x6e, 0x7b,
+ 0xff, 0xde, 0xfb, 0x6f, 0xfb, 0xef, 0xa6, 0xfe,
+ 0xff, 0xbf, 0xbf, 0xff, 0xf7, 0xeb, 0xbf, 0xff,
+ 0xdf, 0x85, 0xff, 0x7e, 0xbb, 0xff, 0x9f, 0xd7,
+ 0xff, 0xfb, 0xab, 0x79, 0xff, 0xf7, 0xdb, 0x3f,
+ 0xbf, 0xff, 0xfa, 0xcb, 0xff, 0x7e, 0xf1, 0xdf,
+ 0x77, 0x7f, 0xfc, 0xf7, 0xe7, 0x7f, 0x7d, 0x63,
+ 0xfe, 0xbf, 0x7e, 0xfb, 0xff, 0xed, 0x9f, 0xfe,
+ 0xba, 0xff, 0xff, 0x6f, 0xdd, 0xfd, 0xde, 0xf9,
+ 0xff, 0xfd, 0xf5, 0xfe, 0x9b, 0xff, 0xaf, 0xcf,
+ 0x3e, 0xff, 0xfc, 0xa3, 0x8f, 0x3e, 0xff, 0xbc,
+ 0x47, 0x9f, 0x7d, 0xf4, 0xb9, 0xe7, 0x1f, 0x7d,
+ 0xfe, 0xe6, 0xff, 0xeb, 0xbf, 0xbf, 0xfd, 0xf7,
+ 0x8b, 0x3f, 0xbf, 0xfe, 0xe5, 0xd7, 0xdf, 0xff,
+ 0xff, 0xef, 0xd7, 0x5f, 0xff, 0xbf, 0xf9, 0xff,
+ 0xfa, 0xfb, 0x2f, 0xbf, 0xff, 0xfe, 0xdb, 0xaf,
+ 0x7f, 0xf9, 0xf5, 0xdf, 0x7f, 0xff, 0xff, 0xf7,
+ 0xd7, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xfb, 0xfb,
+ 0x6f, 0xbf, 0xfe, 0xfb, 0xbf, 0xff, 0xfd, 0xf7,
+ 0xd7, 0x5f, 0xff, 0xfc, 0xfd, 0xdf, 0xff, 0x9b,
+ 0xff, 0xff, 0xff, 0xfe, 0xf6, 0xdf, 0x2f, 0xbf,
+ 0xfd, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xe5, 0xff,
+ 0xff, 0xff, 0xff, 0x3f, 0xe6, 0xff, 0xfe, 0x5f,
+ 0xff, 0xfd, 0xf7, 0xfe, 0xef, 0xef, 0xfd, 0xcc,
+ 0xff, 0xdf, 0x6f, 0xbf, 0xed, 0xfd, 0xdf, 0xfe,
+ 0xbf, 0xe9, 0xdf, 0x2f, 0xbf, 0xfc, 0xe2, 0xeb,
+ 0xaf, 0xbd, 0xf6, 0x72, 0x57, 0x5f, 0x37, 0xb5,
+ 0x75, 0xd7, 0x5f, 0x7f, 0xfd, 0x69, 0xfe, 0xff,
+ 0xff, 0xff, 0xcb, 0x6f, 0xff, 0xab, 0xdd, 0xbb,
+ 0xdf, 0xe7, 0xb7, 0x5f, 0xfd, 0x5f, 0xfa, 0xff,
+ 0xc1, 0xff, 0x1b, 0xff, 0xf7, 0xef, 0x7f, 0xbd,
+ 0xfa, 0xfe, 0xde, 0x7f, 0xff, 0x7f, 0xef, 0xde,
+ 0xff, 0xff, 0xf3, 0xff, 0xf5, 0xef, 0x7f, 0xe6,
+ 0xff, 0x7f, 0xff, 0xfe, 0xfe, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xfd, 0x57, 0xf7,
+ 0xff, 0x5f, 0xff, 0xbf, 0xe9, 0xf7, 0xfb, 0xff,
+ 0xab, 0xf6, 0xff, 0xbe, 0xdf, 0xab, 0xf5, 0x7f,
+ 0xf7, 0xdf, 0x7e, 0x7f, 0x7e, 0x7f, 0xdf, 0xfe,
+ 0x6f, 0xfe, 0xbd, 0xff, 0xff, 0xef, 0xfe, 0xff,
+ 0xed, 0xff, 0xda, 0xf7, 0xbf, 0xff, 0xff, 0xef,
+ 0xff, 0xff, 0xff, 0xdb, 0xfd, 0x9b, 0xff, 0xbf,
+ 0xfb, 0xf6, 0xf8, 0xff, 0xbe, 0xdb, 0xef, 0xfb,
+ 0xbf, 0xda, 0x5f, 0x6f, 0xf7, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xe6, 0xff, 0xdb, 0xef, 0xbf, 0xfe,
+ 0xbe, 0xff, 0xef, 0x3f, 0xfb, 0xff, 0xbf, 0xff,
+ 0x6f, 0xda, 0xff, 0xbf, 0xff, 0xff, 0xbf, 0xf9,
+ 0xff, 0x73, 0x4f, 0xfd, 0xbf, 0xfb, 0xf7, 0xf9,
+ 0xbd, 0x94, 0xdf, 0xff, 0xff, 0xd7, 0xfb, 0xff,
+ 0xff, 0xff, 0xdf, 0x6f, 0xfe, 0xff, 0xff, 0xff,
+ 0x31, 0xfe, 0x7a, 0xff, 0xff, 0xf1, 0xff, 0xff,
+ 0xfb, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xf9, 0xfd,
+ 0x9b, 0xfb, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xd7,
+ 0xff, 0xf3, 0xf7, 0xff, 0xfe, 0xff, 0xff, 0xff,
+ 0xff, 0xeb, 0xff, 0xfb, 0xff, 0xe6, 0xff, 0xff,
+ 0xbf, 0x7f, 0x7e, 0xe3, 0xeb, 0xff, 0x2f, 0xee,
+ 0xf5, 0xf9, 0x59, 0xbf, 0xdf, 0xb5, 0x7f, 0xab,
+ 0xff, 0xbf, 0xf1, 0xff, 0xff, 0xe1, 0xbf, 0xff,
+ 0xfe, 0xeb, 0x69, 0x7f, 0xff, 0xfd, 0xff, 0xfb,
+ 0xff, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 0x67, 0xfe,
+ 0xff, 0xff, 0xff, 0xb3, 0xaf, 0x7f, 0xff, 0xef,
+ 0x7f, 0xbf, 0xff, 0xbf, 0xff, 0xff, 0xbd, 0xff,
+ 0xfe, 0xfb, 0xfb, 0x9b, 0xfe, 0xff, 0xff, 0x9f,
+ 0x33, 0x6b, 0xaf, 0xbf, 0xf7, 0x2e, 0xd7, 0x7f,
+ 0xe5, 0xe9, 0x57, 0x56, 0x78, 0xf9, 0xf5, 0xbf,
+ 0x66, 0xff, 0x7f, 0xef, 0xa7, 0x5e, 0xfb, 0xeb,
+ 0xef, 0xbf, 0x95, 0xff, 0x9f, 0xfe, 0xcf, 0xb5,
+ 0xfe, 0xf2, 0xdf, 0xfe, 0xb7, 0xf9, 0xff, 0xfb,
+ 0xff, 0xb5, 0xbf, 0x5c, 0xfb, 0xfb, 0xbd, 0xf7,
+ 0x9f, 0xf7, 0xfc, 0xd3, 0xef, 0xb3, 0xcd, 0xb6,
+ 0xeb, 0x6f, 0xd4, 0xbf, 0x9e, 0x3e, 0xf7, 0x0c,
+ 0xb3, 0xfe, 0x7e, 0xed, 0x55, 0xef, 0xbd, 0xfd,
+ 0xf4, 0x4b, 0xad, 0xb5, 0xd6, 0x5e, 0x99, 0xfb,
+ 0xff, 0xd7, 0xff, 0x7b, 0x49, 0xef, 0xdf, 0xf7,
+ 0xdb, 0xd7, 0x76, 0xdb, 0xfd, 0xe6, 0xd2, 0x6c,
+ 0xb3, 0x4d, 0x6e, 0x66, 0xfe, 0xbf, 0xf5, 0x9a,
+ 0x5a, 0xb2, 0xad, 0xfb, 0xfd, 0xfa, 0xdf, 0xdf,
+ 0xff, 0x8d, 0xfd, 0xbe, 0xf7, 0xde, 0xab, 0xb3,
+ 0xb1, 0xff, 0xfa, 0xfb, 0xef, 0xbf, 0xdc, 0xfe,
+ 0xff, 0xef, 0xf6, 0xbf, 0x86, 0xff, 0xd9, 0xdf,
+ 0xff, 0xbd, 0xf7, 0xff, 0x66, 0xec, 0xbf, 0xfe,
+ 0xfb, 0xeb, 0x2c, 0xe6, 0xfe, 0xff, 0x7b, 0x58,
+ 0xe1, 0xe9, 0xfd, 0xb6, 0x5f, 0xfb, 0xed, 0xb7,
+ 0x3f, 0x9b, 0xf7, 0xff, 0xfb, 0xef, 0xb7, 0xdf,
+ 0xf8, 0xff, 0xff, 0xb7, 0xb3, 0xfd, 0xfe, 0x7f,
+ 0xef, 0xf7, 0xdc, 0x73, 0xcf, 0x57, 0xe6, 0xfd,
+ 0xff, 0xf7, 0xd7, 0x5f, 0x67, 0xff, 0xfd, 0xff,
+ 0xc9, 0x4f, 0xbe, 0xff, 0x7f, 0xf3, 0x7d, 0xf6,
+ 0xd9, 0xe7, 0x9d, 0xb1, 0x5f, 0xfb, 0xef, 0x33,
+ 0xcf, 0x6e, 0x3b, 0xed, 0x27, 0x5e, 0xe9, 0xf4,
+ 0xdf, 0x5e, 0x3e, 0xfd, 0xf4, 0xd2, 0xff, 0x66,
+ 0xe6, 0xdf, 0x7f, 0xff, 0xfc, 0xf3, 0xfb, 0x7f,
+ 0xbf, 0xd9, 0xdb, 0x36, 0xff, 0xfe, 0xf7, 0xcd,
+ 0x1a, 0xeb, 0xac, 0x3b, 0x9b, 0xfb, 0xfe, 0xef,
+ 0xef, 0xbf, 0xff, 0xff, 0xef, 0xdf, 0xf6, 0x37,
+ 0xf7, 0xdf, 0xff, 0xff, 0xb6, 0xd7, 0x6e, 0x7b,
+ 0xef, 0xe6, 0xfe, 0xfb, 0xaf, 0xff, 0xd8, 0xe7,
+ 0xfb, 0xff, 0xdf, 0xf0, 0x87, 0xdf, 0x5e, 0xef,
+ 0xa3, 0xb7, 0xd7, 0xfe, 0xfb, 0xbb, 0x79, 0xff,
+ 0xf3, 0xc9, 0xbf, 0xff, 0xeb, 0x73, 0xbb, 0x67,
+ 0x76, 0xf3, 0xdd, 0xb3, 0x4f, 0x74, 0xf7, 0xd5,
+ 0x7f, 0x7f, 0x6f, 0xfe, 0xdf, 0xfe, 0xfe, 0xff,
+ 0xee, 0xb6, 0xdf, 0x7f, 0xbb, 0xdf, 0xff, 0xfd,
+ 0xf5, 0xff, 0xdf, 0xff, 0xff, 0x75, 0xff, 0x9b,
+ 0xff, 0xef, 0x8f, 0x3e, 0xf3, 0xfc, 0xb3, 0x8f,
+ 0x3f, 0xfb, 0x9c, 0xc7, 0x1f, 0x7f, 0xe4, 0xd9,
+ 0xe7, 0x1f, 0x7d, 0xfe, 0xe6, 0xff, 0xfb, 0xff,
+ 0xff, 0xfe, 0xfa, 0xdf, 0xff, 0xbf, 0xfd, 0xed,
+ 0x9f, 0xdf, 0xff, 0xff, 0xfd, 0xff, 0x5f, 0xff,
+ 0xbf, 0xf9, 0xff, 0xfb, 0xff, 0xff, 0xbf, 0xfe,
+ 0xf3, 0xfb, 0xbf, 0xff, 0xfd, 0xfd, 0xd7, 0x5f,
+ 0xff, 0xfd, 0xff, 0xd7, 0xff, 0x6f, 0xfe, 0xff,
+ 0xfe, 0xff, 0xff, 0xef, 0xfe, 0xff, 0xef, 0x8f,
+ 0x7f, 0xfc, 0xf1, 0xfd, 0x7f, 0x7f, 0x7d, 0xf5,
+ 0xdf, 0xff, 0x9b, 0xff, 0xef, 0xff, 0xff, 0xff,
+ 0xff, 0x7f, 0xbf, 0xff, 0xfe, 0xf3, 0xdf, 0x7f,
+ 0xf9, 0xf5, 0xf7, 0x5f, 0xff, 0xff, 0xff, 0xe6,
+ 0xff, 0xdf, 0x4f, 0xbf, 0xf7, 0x73, 0xff, 0x2f,
+ 0x7f, 0xfd, 0xcc, 0xb7, 0xbf, 0x7e, 0xe9, 0xc7,
+ 0x1e, 0xd7, 0xff, 0xbb, 0xf9, 0xff, 0xaf, 0xb7,
+ 0xf6, 0xea, 0xeb, 0xaf, 0xb7, 0xf6, 0xf2, 0xc7,
+ 0x5b, 0x7f, 0xd9, 0xc5, 0x17, 0x5f, 0x76, 0xe9,
+ 0x6d, 0xf6, 0xbf, 0xff, 0xff, 0xf7, 0xfd, 0xff,
+ 0xef, 0xbf, 0xcf, 0x1f, 0x7e, 0xd3, 0x7e, 0x9f,
+ 0x7f, 0xf4, 0xf9, 0xa7, 0xff, 0x1b, 0xff, 0x7f,
+ 0xfb, 0xef, 0xef, 0x7d, 0xfb, 0xff, 0xff, 0xda,
+ 0xed, 0xdf, 0xf6, 0xdf, 0xff, 0xdb, 0x7f, 0xff,
+ 0xfd, 0x7f, 0xe6, 0xef, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xf7, 0xff, 0x7f, 0xf7, 0xfb, 0xff,
+ 0x7d, 0xfd, 0xfc, 0x77, 0xce, 0x97, 0x9f, 0xf9,
+ 0xff, 0xff, 0xab, 0x0f, 0x3f, 0xdf, 0xfe, 0x3f,
+ 0xac, 0x7d, 0xb9, 0xf5, 0x87, 0x5b, 0xef, 0xfd,
+ 0xf6, 0xe7, 0xff, 0x67, 0xfc, 0xff, 0xff, 0xbb,
+ 0xfb, 0xff, 0xff, 0xba, 0xff, 0xda, 0x5f, 0x7f,
+ 0xfb, 0xfc, 0xd7, 0xff, 0x77, 0xff, 0xff, 0xff,
+ 0x99, 0xff, 0xff, 0xbf, 0xfe, 0xf9, 0xff, 0x9f,
+ 0xfb, 0xff, 0xd7, 0xfb, 0xfd, 0xff, 0x7f, 0xf3,
+ 0xd7, 0xff, 0xff, 0xff, 0x7f, 0xc6, 0xdf, 0xfb,
+ 0xcf, 0xfd, 0xff, 0xdf, 0xfb, 0xfa, 0xed, 0xfb,
+ 0xef, 0x3f, 0xff, 0x7b, 0xfb, 0xf1, 0xff, 0xee,
+ 0xff, 0xbd, 0xf9, 0xff, 0x7b, 0xfb, 0xfd, 0xff,
+ 0xe7, 0xde, 0x7c, 0xf7, 0xbe, 0xff, 0xff, 0xff,
+ 0x7f, 0xff, 0xff, 0xff, 0xfe, 0xfb, 0x6b, 0xfe,
+ 0xff, 0xef, 0xff, 0xf3, 0xce, 0xd7, 0xff, 0xfd,
+ 0xd3, 0x1d, 0xbd, 0xfe, 0xea, 0x52, 0xbe, 0xff,
+ 0xfe, 0xbb, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xf7,
+ 0x7b, 0xdd, 0xff, 0x76, 0xef, 0xea, 0xdf, 0xff,
+ 0xfe, 0xfb, 0xbf, 0xbb, 0xb3, 0xff, 0xfe, 0xde,
+ 0xe6, 0xff, 0xff, 0xaf, 0x7f, 0x7f, 0xf0, 0xed,
+ 0xff, 0xe7, 0xe7, 0xf5, 0xd7, 0x7b, 0xff, 0xdd,
+ 0xff, 0x9d, 0xef, 0xef, 0xbf, 0xf9, 0xff, 0xfb,
+ 0xfd, 0xff, 0xfd, 0xfa, 0xf9, 0xed, 0xbf, 0xdf,
+ 0xdf, 0xbf, 0xbf, 0x33, 0xff, 0xff, 0x9f, 0x1f,
+ 0xf7, 0x6b, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xdf,
+ 0xff, 0xfe, 0xfd, 0xf7, 0xff, 0xff, 0xff, 0xfd,
+ 0xde, 0xff, 0x6f, 0xf7, 0xf7, 0xff, 0x1b, 0xfe,
+ 0xff, 0xff, 0xff, 0xe7, 0xaf, 0xac, 0xff, 0xfa,
+ 0x2b, 0x5f, 0x7f, 0x7d, 0xe7, 0xdf, 0x7f, 0x73,
+ 0xff, 0xfd, 0x3f, 0x66, 0xff, 0xff, 0xff, 0xff,
+ 0xfd, 0x73, 0xe9, 0xef, 0xb2, 0x93, 0xdd, 0xb7,
+ 0xdf, 0xae, 0xff, 0x9f, 0xf2, 0xdf, 0xff, 0xb7,
+ 0xf9, 0x9f, 0x1e, 0xeb, 0xf5, 0xff, 0x56, 0x7a,
+ 0xfb, 0xed, 0x77, 0xbf, 0xfd, 0xde, 0xeb, 0xcc,
+ 0xbf, 0xbd, 0xf6, 0xfe, 0x6f, 0xd6, 0xb3, 0xde,
+ 0x3a, 0xff, 0xbf, 0xb3, 0x5e, 0x7b, 0xed, 0x75,
+ 0xaf, 0xbd, 0x76, 0x7e, 0xf9, 0xaf, 0xbd, 0xf6,
+ 0x5f, 0x9b, 0xfb, 0xff, 0xaf, 0x7f, 0xfe, 0x6f,
+ 0x2f, 0xd5, 0x66, 0x9b, 0xdd, 0x6e, 0x33, 0xef,
+ 0x7f, 0xfb, 0x6c, 0xfb, 0xad, 0xee, 0x66, 0xfe,
+ 0xbf, 0xb6, 0x8e, 0x6a, 0xeb, 0xeb, 0xe6, 0xbe,
+ 0x7b, 0xdd, 0x71, 0xdf, 0xfd, 0xdf, 0xde, 0x72,
+ 0xdf, 0xfd, 0xb3, 0xb1, 0xff, 0xfa, 0xeb, 0xab,
+ 0xff, 0xda, 0x42, 0xb9, 0xef, 0x6e, 0x77, 0xfd,
+ 0xde, 0xbb, 0xff, 0xbf, 0xdc, 0xf7, 0xfe, 0x66,
+ 0xee, 0xbf, 0xfe, 0xfa, 0xeb, 0xbf, 0xe1, 0x54,
+ 0x5b, 0x6d, 0x7f, 0xfb, 0x05, 0x97, 0xfd, 0xda,
+ 0xa9, 0xed, 0xd7, 0xbf, 0x9b, 0xf7, 0xff, 0xdb,
+ 0xef, 0xbf, 0xfd, 0x7f, 0x9b, 0xfd, 0xb6, 0xb3,
+ 0xdd, 0xf6, 0xdb, 0x77, 0xbc, 0xdd, 0x76, 0xfb,
+ 0xf7, 0xe6, 0xfd, 0xff, 0xff, 0xc7, 0xff, 0x7f,
+ 0x9f, 0x6f, 0xbe, 0xc9, 0x4d, 0x36, 0xd9, 0xe4,
+ 0xb7, 0x47, 0x3e, 0xf9, 0xfc, 0xbd, 0xb1, 0xff,
+ 0x7b, 0xed, 0xb7, 0xdf, 0x3e, 0xe3, 0x8b, 0x2f,
+ 0x7e, 0xe1, 0xa5, 0x97, 0x6f, 0xdf, 0xf9, 0x85,
+ 0x97, 0xff, 0x66, 0xe6, 0xff, 0x7f, 0xff, 0xfc,
+ 0xf6, 0xcf, 0xff, 0xfe, 0xfb, 0xdf, 0x7f, 0xff,
+ 0xfd, 0xf9, 0xff, 0x7f, 0xff, 0xfd, 0x3f, 0x9b,
+ 0xfb, 0xff, 0xf7, 0xdf, 0xff, 0xfe, 0xfe, 0xbf,
+ 0xff, 0xf6, 0xb7, 0xdf, 0x7c, 0xb3, 0xf7, 0x7f,
+ 0xdf, 0x7e, 0xf7, 0xef, 0xa6, 0xfe, 0xef, 0xbf,
+ 0xff, 0xfe, 0xfb, 0x8b, 0x7f, 0xfc, 0xd1, 0x8f,
+ 0x3f, 0xee, 0xe8, 0xe7, 0x8f, 0x3f, 0xfa, 0xfc,
+ 0xab, 0x79, 0xff, 0xf6, 0xd9, 0x3f, 0xbf, 0xfa,
+ 0xeb, 0x9f, 0x7f, 0xfe, 0xf3, 0xce, 0x3f, 0xff,
+ 0xf5, 0xb3, 0xce, 0x7f, 0x6f, 0x6f, 0xfe, 0xdf,
+ 0xfe, 0xfb, 0xed, 0xae, 0xb3, 0xff, 0xaf, 0xc9,
+ 0x57, 0x7e, 0xd5, 0xd5, 0xbf, 0x59, 0x3e, 0xf9,
+ 0x6f, 0xff, 0x9a, 0xff, 0xef, 0x8f, 0x3e, 0x7b,
+ 0xe8, 0x33, 0xcf, 0x3f, 0x7a, 0xd4, 0x47, 0x1f,
+ 0x7d, 0xfe, 0xd1, 0x47, 0x9f, 0x5f, 0xbe, 0xe6,
+ 0xff, 0xef, 0xaf, 0xff, 0x5e, 0xe3, 0xcb, 0x2f,
+ 0xbf, 0x7e, 0xf5, 0x97, 0x5f, 0xfe, 0xf3, 0xc5,
+ 0xd7, 0xff, 0xf7, 0xbf, 0xf9, 0xff, 0xff, 0xeb,
+ 0xff, 0xff, 0xfe, 0xfa, 0xcb, 0xaf, 0x77, 0xfd,
+ 0xf5, 0xd7, 0xff, 0x7f, 0xfd, 0xf5, 0xff, 0xf7,
+ 0x6f, 0xfe, 0xff, 0xfe, 0xfa, 0xef, 0xaf, 0xbe,
+ 0xf8, 0xea, 0xbf, 0xff, 0xfd, 0xf3, 0xcf, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xdf, 0xff, 0x9b, 0xff, 0xef,
+ 0xbf, 0xfe, 0xfb, 0xeb, 0xaf, 0xbf, 0xfe, 0x7f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x3f, 0x66, 0xff, 0xcb, 0xff, 0x7f, 0xfd,
+ 0xf7, 0xcb, 0xff, 0xff, 0xff, 0xde, 0xff, 0x7f,
+ 0x7a, 0xef, 0xff, 0x7f, 0xff, 0xff, 0xbf, 0xe9,
+ 0xff, 0xae, 0x9e, 0xfe, 0xfa, 0xa3, 0xad, 0xbf,
+ 0xf4, 0xa2, 0xd7, 0x5e, 0x7d, 0xf5, 0xa5, 0x47,
+ 0x4f, 0x7e, 0xf9, 0x6f, 0xfe, 0xfd, 0xef, 0xff,
+ 0xff, 0xee, 0xfd, 0xe8, 0xf3, 0xcf, 0x7e, 0xfa,
+ 0x1d, 0xe7, 0xae, 0xff, 0xfe, 0xdf, 0x7f, 0xff,
+ 0x1a, 0xff, 0xff, 0xdb, 0x6f, 0x3f, 0xff, 0xbf,
+ 0x5f, 0xff, 0xbd, 0xef, 0x77, 0x3f, 0xff, 0xfa,
+ 0x75, 0xff, 0xbe, 0xff, 0x7f, 0xe6, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x7f, 0xba, 0x3d, 0xfd, 0xf6,
+ 0xf7, 0xff, 0xb7, 0xdc, 0xf7, 0xfe, 0xf8, 0xff,
+ 0xff, 0xbf, 0xf9, 0xff, 0xfa, 0xef, 0x8f, 0xbf,
+ 0xff, 0xfb, 0xbf, 0xad, 0xfb, 0x9d, 0xb7, 0xc5,
+ 0x5f, 0xe9, 0xfd, 0xf7, 0xdf, 0xff, 0x6b, 0xfe,
+ 0x6f, 0xfe, 0xfe, 0xfb, 0xbe, 0xbf, 0xff, 0xbf,
+ 0xef, 0xfd, 0xff, 0xd7, 0xfd, 0xbf, 0xff, 0x7f,
+ 0xff, 0x7b, 0xff, 0x9b, 0xff, 0xbe, 0x7f, 0xee,
+ 0xf9, 0xe7, 0xff, 0xef, 0xff, 0xf8, 0xc3, 0x1f,
+ 0xff, 0xdf, 0xfd, 0xf3, 0xff, 0xf7, 0xff, 0xff,
+ 0xe6, 0xff, 0xfb, 0xaf, 0xbf, 0xd6, 0xfa, 0xfb,
+ 0xff, 0xbf, 0xff, 0xbf, 0xf7, 0xf8, 0xff, 0xff,
+ 0xf5, 0x37, 0xdf, 0xbf, 0xbf, 0xf9, 0xff, 0xf3,
+ 0x7f, 0xfd, 0xcf, 0xdf, 0x6b, 0xbf, 0xbf, 0xdf,
+ 0xff, 0xfd, 0xff, 0xfe, 0xdb, 0xbf, 0xf7, 0xf7,
+ 0xff, 0x6b, 0xfe, 0xff, 0xcf, 0xff, 0xff, 0x5f,
+ 0xff, 0xff, 0xef, 0xff, 0xff, 0xbe, 0xfb, 0x7f,
+ 0xff, 0xff, 0xf1, 0x67, 0xff, 0xff, 0x9b, 0xfb,
+ 0xfb, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xfd, 0xff,
+ 0xff, 0xff, 0xff, 0xbf, 0xbf, 0xff, 0xff, 0xff,
+ 0xff, 0xef, 0xfd, 0xe6, 0xff, 0xcb, 0xbf, 0xf7,
+ 0xf4, 0x7b, 0xfd, 0xb5, 0xe7, 0xf5, 0xbf, 0xd9,
+ 0x7e, 0xbf, 0xff, 0xf7, 0xfa, 0xff, 0xff, 0xbf,
+ 0xe1, 0xff, 0xfa, 0xef, 0xbf, 0xf7, 0xfe, 0xf3,
+ 0xca, 0xfe, 0xdb, 0xff, 0xff, 0xff, 0xff, 0xfd,
+ 0xfd, 0x27, 0xd7, 0xff, 0x67, 0xf6, 0xff, 0xff,
+ 0xbc, 0xf3, 0xcf, 0xfe, 0xfe, 0xfe, 0xff, 0xfd,
+ 0x7f, 0xf7, 0xdd, 0xff, 0x5f, 0xff, 0xfd, 0xff,
+ 0xff, 0x9b, 0xfe, 0xfc, 0xf2, 0x9b, 0xef, 0x3f,
+ 0x7f, 0xbe, 0xff, 0xff, 0xff, 0xfe, 0xfb, 0x9d,
+ 0xdf, 0x77, 0xdf, 0xfd, 0xff, 0xbf, 0x66, 0x7f,
+ 0xea, 0xa5, 0xbf, 0xfe, 0xf2, 0xbb, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x5f, 0xcf, 0xf7, 0xd7, 0x5f,
+ 0xff, 0xfb, 0xb7, 0xf9, 0xdf, 0x6a, 0xab, 0xad,
+ 0xb6, 0xce, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xdf, 0x79, 0xeb, 0xbd, 0xf7, 0xf7, 0xeb, 0x6f,
+ 0xd4, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xf7, 0xdf,
+ 0xfe, 0xff, 0xff, 0xff, 0xff, 0x75, 0xde, 0xcb,
+ 0x2f, 0xff, 0xf7, 0x5c, 0x99, 0xfb, 0xaf, 0x99,
+ 0xf6, 0xba, 0xe9, 0xf1, 0xaf, 0x56, 0xfb, 0xdf,
+ 0x7e, 0xfb, 0xfd, 0xef, 0xdf, 0x6c, 0xab, 0xcf,
+ 0xee, 0x66, 0xfe, 0x7f, 0xf7, 0xd5, 0x6f, 0xff,
+ 0xbf, 0xb7, 0xd6, 0xfe, 0xb7, 0xdf, 0x5e, 0xb5,
+ 0xf3, 0xbd, 0xf2, 0xee, 0xb9, 0x93, 0xb1, 0xff,
+ 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xee, 0xbc,
+ 0xff, 0xfd, 0xf7, 0xdf, 0x6b, 0x7f, 0xff, 0xbd,
+ 0xfd, 0xf7, 0x66, 0xec, 0xbf, 0xf6, 0xda, 0x6b,
+ 0xaf, 0xfd, 0xff, 0x6a, 0xef, 0x7f, 0xff, 0xfd,
+ 0xf5, 0xda, 0x7e, 0xfb, 0xed, 0xff, 0xbf, 0x99,
+ 0xf7, 0xef, 0xbb, 0xef, 0xbe, 0xff, 0xfe, 0xdb,
+ 0xbd, 0xff, 0xfb, 0xed, 0xff, 0xff, 0x6f, 0xf7,
+ 0xdd, 0xff, 0x9f, 0x77, 0xe6, 0xfd, 0xfb, 0xec,
+ 0xb3, 0xcb, 0x2e, 0xff, 0xf9, 0xf7, 0xfb, 0xff,
+ 0xfe, 0xff, 0xcf, 0x99, 0x7f, 0xfe, 0xff, 0xcf,
+ 0xbd, 0xb1, 0xff, 0xfa, 0xeb, 0xa5, 0xbf, 0x5e,
+ 0x7b, 0xed, 0xbe, 0xff, 0x7d, 0xf7, 0xdf, 0x6e,
+ 0x7e, 0xfd, 0xf5, 0xda, 0xbf, 0x6e, 0xe6, 0x9f,
+ 0xfd, 0xf6, 0xdb, 0x6f, 0xdf, 0x7f, 0xff, 0xfd,
+ 0xff, 0xff, 0xff, 0xff, 0xf9, 0xdf, 0x7f, 0xff,
+ 0xff, 0x3b, 0x9b, 0xfb, 0x6d, 0xbf, 0xfd, 0xf6,
+ 0xdb, 0xfd, 0xfb, 0xbf, 0xff, 0xff, 0xff, 0xff,
+ 0x7f, 0xff, 0xb7, 0xdf, 0xff, 0xbf, 0xef, 0xe6,
+ 0xfe, 0x6b, 0xaf, 0xbd, 0xf6, 0xda, 0xef, 0x37,
+ 0xfe, 0xff, 0xff, 0xfe, 0x7f, 0x2b, 0xe3, 0xbd,
+ 0xff, 0xfe, 0x7f, 0xbb, 0x79, 0xdf, 0xef, 0xbf,
+ 0xff, 0xfa, 0xeb, 0xf2, 0x9f, 0xff, 0xfa, 0xb7,
+ 0xdf, 0x3b, 0x7f, 0x7d, 0xf7, 0xdf, 0x17, 0x7f,
+ 0x6f, 0xfe, 0xff, 0xff, 0x3f, 0xff, 0xfd, 0xbf,
+ 0xfe, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf,
+ 0x79, 0xf7, 0xff, 0x7f, 0xff, 0x9b, 0xff, 0xaf,
+ 0x83, 0x1e, 0xfa, 0xe8, 0xa2, 0xcf, 0x3f, 0xff,
+ 0xfc, 0xe5, 0x9f, 0x3f, 0xec, 0xd9, 0xe7, 0x1f,
+ 0x7f, 0xfe, 0xe6, 0xff, 0xff, 0xf7, 0xdf, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf5, 0xdf, 0xff,
+ 0xaf, 0xfd, 0xf7, 0xd7, 0xff, 0xff, 0xbf, 0xf9,
+ 0xff, 0xba, 0xea, 0xad, 0xbf, 0xae, 0xff, 0xff,
+ 0xef, 0x7f, 0x5d, 0xf7, 0xff, 0xdf, 0xff, 0xfd,
+ 0xf5, 0xd7, 0xff, 0x6f, 0xfe, 0xbf, 0xda, 0xea,
+ 0xab, 0xaf, 0xfe, 0xff, 0xef, 0xaf, 0xff, 0xfd,
+ 0xf5, 0xdf, 0x77, 0xdf, 0x7d, 0xf5, 0xdf, 0xff,
+ 0x9b, 0xff, 0xff, 0xfb, 0xdf, 0xff, 0xff, 0xfe,
+ 0xff, 0xff, 0xfe, 0xfb, 0x7d, 0xff, 0xbf, 0xf7,
+ 0xf7, 0x5f, 0x7f, 0xff, 0xff, 0x66, 0xff, 0x93,
+ 0x6f, 0x7d, 0xf5, 0xf5, 0xdb, 0x4f, 0xf5, 0xbc,
+ 0xe7, 0x1f, 0xdf, 0x7e, 0xf3, 0xff, 0xff, 0xff,
+ 0xfb, 0xbf, 0xf9, 0xff, 0x2e, 0xbb, 0xfe, 0xfa,
+ 0xeb, 0xae, 0xbf, 0xfc, 0xf0, 0xc7, 0x5f, 0x7f,
+ 0xf9, 0xf5, 0x97, 0x5f, 0x7e, 0xf5, 0x6f, 0xfe,
+ 0xdf, 0xff, 0xee, 0xfd, 0xff, 0xba, 0xfc, 0xed,
+ 0xbe, 0xff, 0xed, 0xff, 0x58, 0x07, 0x6a, 0xb8,
+ 0xf1, 0xff, 0xe7, 0x1b, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xfd, 0x9f, 0xff, 0xff, 0x5f, 0xff, 0xef,
+ 0xef, 0xaf, 0xf7, 0xdf, 0x6f, 0xef, 0xff, 0xff,
+ 0x66, 0xef, 0xff, 0x7f, 0xfb, 0xfd, 0xff, 0xff,
+ 0xfd, 0xff, 0xff, 0xff, 0x3b, 0xff, 0x7f, 0xef,
+ 0xfd, 0xb7, 0xfe, 0xff, 0xb7, 0xf9, 0xff, 0xde,
+ 0xeb, 0xef, 0xf7, 0xfe, 0xda, 0xed, 0xa9, 0x75,
+ 0xed, 0xe5, 0xe6, 0x7f, 0xf7, 0xfd, 0xf9, 0xff,
+ 0xfb, 0x67, 0xfc, 0xff, 0xbd, 0xfb, 0xde, 0xeb,
+ 0x9f, 0xfd, 0xfd, 0xdb, 0xde, 0x7e, 0x6b, 0xff,
+ 0xfb, 0xfd, 0xf7, 0xd7, 0xff, 0xff, 0x99, 0xff,
+ 0x9c, 0xbf, 0x55, 0xbf, 0xbf, 0xff, 0xff, 0xff,
+ 0xff, 0xcb, 0xfd, 0xe7, 0xfd, 0xf1, 0xc6, 0x3f,
+ 0xbf, 0xfb, 0xff, 0xc6, 0xff, 0xab, 0xff, 0xff,
+ 0xff, 0xdf, 0xff, 0xfb, 0xff, 0xe7, 0xcd, 0xbf,
+ 0xff, 0x6e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f,
+ 0xf9, 0xff, 0xff, 0x3f, 0xff, 0xfd, 0xdf, 0xff,
+ 0xfe, 0xff, 0x1d, 0xff, 0xbf, 0xbf, 0x7e, 0xef,
+ 0xaf, 0xbf, 0xff, 0xff, 0x6b, 0xfe, 0x7d, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0x4f, 0xce, 0xfd, 0xff,
+ 0x3b, 0xbc, 0xf8, 0xc7, 0xfe, 0xf7, 0xff, 0xff,
+ 0xff, 0x99, 0xff, 0xbf, 0xff, 0xff, 0xff, 0x7f,
+ 0xff, 0xbe, 0xfb, 0xbf, 0xff, 0xff, 0xb6, 0xfb,
+ 0xfb, 0xff, 0xff, 0xbf, 0xb7, 0xbf, 0x66, 0xff,
+ 0xed, 0xaf, 0xbf, 0xbe, 0xfa, 0xbd, 0xf4, 0xfe,
+ 0xfa, 0xa7, 0xd7, 0xb7, 0xbf, 0xe5, 0xd5, 0x9b,
+ 0x7f, 0xbf, 0xb7, 0xf9, 0xff, 0x7b, 0xed, 0xab,
+ 0xbf, 0xfe, 0xfb, 0xbf, 0xbf, 0xdd, 0xdc, 0xf5,
+ 0xff, 0x37, 0xdf, 0xfd, 0xef, 0xcd, 0xfd, 0x6f,
+ 0xfe, 0x3d, 0xf7, 0xfb, 0xbf, 0xff, 0x7f, 0xff,
+ 0xff, 0xab, 0xbf, 0xff, 0xff, 0xff, 0xdf, 0xbf,
+ 0x7f, 0xff, 0xd7, 0xff, 0x9b, 0xff, 0x7b, 0xe7,
+ 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdf, 0x7f, 0x7f,
+ 0xff, 0xf9, 0xfb, 0xef, 0xbc, 0xf5, 0xd1, 0xaf,
+ 0xff, 0xa6, 0xff, 0xbf, 0xef, 0xbf, 0x5f, 0xeb,
+ 0xef, 0xaf, 0xff, 0x5f, 0xdf, 0x5c, 0xdf, 0xad,
+ 0xf7, 0xf5, 0xff, 0x7f, 0xff, 0xaf, 0xd9, 0xff,
+ 0xf2, 0xfb, 0xef, 0x97, 0xff, 0xfe, 0xeb, 0xff,
+ 0xd5, 0x9f, 0xfd, 0xb7, 0xf9, 0x7e, 0xfd, 0xff,
+ 0xff, 0xff, 0x65, 0xfe, 0xb7, 0x5e, 0x7b, 0xef,
+ 0xed, 0xb6, 0xff, 0xfa, 0xff, 0xf9, 0x6d, 0xb7,
+ 0xfc, 0xba, 0xf9, 0x7f, 0xff, 0xf7, 0xfa, 0x1b,
+ 0xf5, 0xf5, 0xe7, 0x5e, 0x7b, 0xed, 0xb5, 0xbf,
+ 0xfe, 0x3f, 0xff, 0x6b, 0x6f, 0x9f, 0xff, 0xdf,
+ 0x79, 0xe7, 0x9d, 0x57, 0xe6, 0xbe, 0xe9, 0x66,
+ 0xbd, 0xf7, 0x5b, 0x6d, 0xa5, 0xff, 0xfd, 0x35,
+ 0xdb, 0xd6, 0xaf, 0xd7, 0xb4, 0xd3, 0xef, 0xb7,
+ 0x9b, 0x91, 0x6f, 0x7f, 0xf9, 0xef, 0xbd, 0x77,
+ 0xde, 0xa9, 0xff, 0x7f, 0xed, 0xdc, 0xf7, 0xff,
+ 0x37, 0x4d, 0xf4, 0xf5, 0xef, 0x6c, 0xec, 0xff,
+ 0xff, 0xdb, 0x6f, 0xe5, 0xad, 0xb7, 0xfa, 0xff,
+ 0x5f, 0x5b, 0xf7, 0xfd, 0xef, 0xff, 0x7b, 0xff,
+ 0xfd, 0xbd, 0x19, 0xf9, 0xaf, 0xfd, 0xf8, 0x5b,
+ 0x6d, 0xbf, 0x95, 0xfe, 0xf7, 0xdf, 0x7e, 0xfb,
+ 0xff, 0xbf, 0xfa, 0x7f, 0xff, 0xff, 0xef, 0x86,
+ 0x3d, 0xfb, 0x7e, 0xff, 0xef, 0xbe, 0xfb, 0xff,
+ 0xff, 0x6f, 0x7e, 0xb7, 0xff, 0xf7, 0x9d, 0x7f,
+ 0xff, 0xf9, 0xf7, 0x9d, 0x79, 0x9f, 0x2f, 0xbf,
+ 0xff, 0xf3, 0xcf, 0xff, 0xff, 0x7f, 0xf7, 0xbf,
+ 0xcc, 0x57, 0xf9, 0xed, 0xff, 0xde, 0x7f, 0x63,
+ 0x65, 0xae, 0x9f, 0x7e, 0xfa, 0xeb, 0xaf, 0xbf,
+ 0xfe, 0xfb, 0xcf, 0x7e, 0x77, 0xf1, 0xf7, 0xdb,
+ 0x67, 0xaf, 0xfd, 0xf7, 0xba, 0x99, 0xf8, 0x66,
+ 0xbb, 0xff, 0xfe, 0xfb, 0xef, 0xff, 0x7f, 0xff,
+ 0xfd, 0xdf, 0xff, 0x7f, 0x7e, 0xff, 0xef, 0xff,
+ 0xff, 0xce, 0xe6, 0xbe, 0xdb, 0xff, 0xbf, 0xfd,
+ 0xf6, 0xfb, 0xff, 0xfb, 0xdf, 0xff, 0xf7, 0xff,
+ 0xef, 0xfd, 0xff, 0xfd, 0xff, 0xef, 0xbb, 0xb9,
+ 0xfd, 0xda, 0xdf, 0xff, 0xfd, 0xf7, 0xdf, 0xff,
+ 0xff, 0x7f, 0xef, 0x8e, 0xff, 0xfe, 0x7b, 0xff,
+ 0xf5, 0xdf, 0xff, 0x6e, 0xde, 0xff, 0xeb, 0xaa,
+ 0xbf, 0xff, 0xfe, 0xdb, 0xff, 0xdf, 0x5f, 0xfd,
+ 0xb3, 0x4f, 0x7f, 0x7d, 0xfd, 0xd5, 0x57, 0xdf,
+ 0x9b, 0xff, 0xfd, 0xf7, 0xff, 0xfa, 0xeb, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xfb, 0x6e, 0xbd, 0xff,
+ 0xdf, 0x7f, 0xff, 0xdd, 0xff, 0xe6, 0xff, 0xeb,
+ 0xa3, 0x8b, 0x3e, 0xfa, 0xfc, 0xf3, 0xcf, 0x3f,
+ 0xff, 0xf9, 0x47, 0x9f, 0x7f, 0xfc, 0xf0, 0x67,
+ 0x9f, 0xbf, 0xf9, 0xff, 0xff, 0xff, 0xaf, 0xbf,
+ 0xfe, 0xfa, 0xdf, 0xff, 0x7f, 0xfd, 0xe5, 0xd7,
+ 0xff, 0xff, 0xff, 0xf4, 0xff, 0xff, 0x6f, 0xfe,
+ 0xbf, 0xfe, 0xfa, 0xea, 0xaf, 0xbf, 0xfe, 0xf7,
+ 0xff, 0x5f, 0x7f, 0xfd, 0xf5, 0xff, 0x7f, 0xef,
+ 0xff, 0xff, 0xff, 0x9b, 0xff, 0xaf, 0xfe, 0xeb,
+ 0xef, 0xbf, 0xaf, 0xfe, 0xff, 0xff, 0x7f, 0x5f,
+ 0xfc, 0xf7, 0xdf, 0x5f, 0x7f, 0x7d, 0xf5, 0xff,
+ 0xe6, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xeb,
+ 0x7f, 0xff, 0xfe, 0xff, 0xd7, 0xff, 0xff, 0xff,
+ 0xfd, 0xde, 0x5f, 0xff, 0xbf, 0xf9, 0xff, 0xf6,
+ 0xdb, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
+ 0xfb, 0xff, 0xa7, 0xdb, 0x7d, 0xff, 0xbf, 0xa7,
+ 0xfe, 0x6f, 0xfe, 0xbf, 0x69, 0xaf, 0xb7, 0xfa,
+ 0xfa, 0xeb, 0xaf, 0xbf, 0xdc, 0xa5, 0x57, 0x5d,
+ 0x7b, 0xd9, 0xf5, 0xd7, 0x5f, 0xff, 0x9b, 0xfd,
+ 0xef, 0x3f, 0xcb, 0xbf, 0xff, 0xfe, 0xff, 0xcf,
+ 0xf3, 0xf7, 0x7f, 0xee, 0xd7, 0x63, 0xff, 0xfd,
+ 0xfd, 0xf6, 0xf9, 0xc6, 0xff, 0xff, 0xfa, 0xff,
+ 0x77, 0xff, 0xff, 0xff, 0xbf, 0xf2, 0xff, 0xf5,
+ 0xed, 0xff, 0xff, 0xee, 0xff, 0xef, 0xff, 0xbb,
+ 0xf9, 0xfb, 0xff, 0xbf, 0xff, 0xec, 0xb7, 0xef,
+ 0xfe, 0xff, 0xff, 0x73, 0x97, 0xff, 0x5f, 0xff,
+ 0x7f, 0x7f, 0xff, 0xfb, 0x6f, 0xfc, 0xb7, 0xfe,
+ 0xfb, 0xee, 0xbf, 0xee, 0xfe, 0xbf, 0xe9, 0x9f,
+ 0x3b, 0xfa, 0xe7, 0xd7, 0x5b, 0x77, 0xfc, 0xf0,
+ 0xff, 0x98, 0xff, 0xbf, 0xaf, 0x7f, 0xbe, 0xfa,
+ 0xef, 0xfb, 0xeb, 0xf9, 0xfe, 0xff, 0x7f, 0x7f,
+ 0xef, 0xdf, 0xbf, 0xf7, 0xff, 0x7f, 0xe6, 0xef,
+ 0xfb, 0xff, 0xfb, 0xff, 0xfb, 0xef, 0xbd, 0xf7,
+ 0xfe, 0x56, 0xfe, 0xfd, 0x77, 0xdc, 0x74, 0x9f,
+ 0xdf, 0xf7, 0xbf, 0xf9, 0xff, 0xfa, 0xff, 0xfe,
+ 0xff, 0xff, 0xed, 0xf7, 0xef, 0xd7, 0xff, 0xff,
+ 0xff, 0xdf, 0xff, 0xff, 0xdf, 0xf7, 0xff, 0x67,
+ 0xee, 0xd5, 0xbf, 0xff, 0x7f, 0x7f, 0xd7, 0xff,
+ 0xff, 0x5b, 0xff, 0xfa, 0xf7, 0xbf, 0xdf, 0xfa,
+ 0xba, 0xfb, 0xf7, 0x7d, 0x9a, 0xff, 0x4f, 0xff,
+ 0xed, 0xf8, 0xfd, 0xfb, 0xdf, 0xff, 0x7f, 0xc5,
+ 0xf9, 0xfe, 0xff, 0xf5, 0xbf, 0xfd, 0xff, 0xff,
+ 0x7f, 0x66, 0xff, 0xef, 0xff, 0xfd, 0xde, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xfd,
+ 0xff, 0xff, 0xff, 0xf7, 0x9f, 0xb7, 0xf9, 0xff,
+ 0xe9, 0xad, 0xff, 0xbe, 0xfe, 0x7b, 0xcc, 0xff,
+ 0xff, 0x5f, 0xfe, 0xbf, 0x6d, 0x7f, 0xf5, 0xff,
+ 0xff, 0xfe, 0x6f, 0xf6, 0xdf, 0xbe, 0xff, 0xfd,
+ 0xbf, 0x5f, 0xf2, 0xdd, 0xe9, 0xff, 0x7e, 0xdd,
+ 0xff, 0xcf, 0x5d, 0xbf, 0xff, 0xf7, 0xff, 0x9b,
+ 0xff, 0xaf, 0xbe, 0xff, 0xef, 0xaf, 0xdf, 0xfc,
+ 0xef, 0xff, 0xff, 0xfd, 0xf7, 0xf7, 0xf6, 0xff,
+ 0xff, 0xbf, 0xfd, 0xff, 0x86, 0xff, 0x9b, 0xbf,
+ 0xff, 0xff, 0xfb, 0xff, 0x6f, 0xf3, 0xf7, 0xc5,
+ 0xf2, 0xfe, 0xe5, 0xf7, 0xfd, 0xff, 0xfe, 0xff,
+ 0x8f, 0xd9, 0xff, 0xf6, 0xff, 0xff, 0xff, 0xfe,
+ 0xdf, 0xeb, 0xff, 0x7d, 0xf9, 0xb5, 0x77, 0xeb,
+ 0x7e, 0xff, 0xf5, 0xd7, 0xff, 0x6d, 0xfe, 0xbf,
+ 0xcf, 0xfb, 0xff, 0xb9, 0xd7, 0x5f, 0x3a, 0xfb,
+ 0x5f, 0x7b, 0x3f, 0xf7, 0xba, 0xcb, 0x6f, 0xbd,
+ 0xf5, 0xff, 0x9b, 0xf5, 0xec, 0xb7, 0xff, 0xfd,
+ 0xef, 0xfc, 0xb3, 0xfe, 0xff, 0xdf, 0x5f, 0x67,
+ 0x9d, 0xdf, 0xfc, 0xeb, 0xaf, 0xff, 0xd7, 0xe6,
+ 0xfe, 0xff, 0xb3, 0xdb, 0xfd, 0xbb, 0xf9, 0x6f,
+ 0xff, 0xf5, 0xf5, 0xf3, 0xed, 0xb3, 0xcf, 0x74,
+ 0xd3, 0x4a, 0xfb, 0xbb, 0x99, 0xff, 0xee, 0xba,
+ 0x75, 0xff, 0x7b, 0xaf, 0xf9, 0x75, 0x56, 0x55,
+ 0xd4, 0xf3, 0xfe, 0x33, 0xfd, 0xbf, 0xfb, 0xfe,
+ 0x6c, 0xec, 0xbf, 0xf7, 0xfb, 0xff, 0xbd, 0xef,
+ 0xff, 0x7e, 0xbd, 0x5f, 0x2b, 0x1f, 0xf7, 0xef,
+ 0xf9, 0xfb, 0x7f, 0xbf, 0xbf, 0x99, 0xfb, 0xef,
+ 0xbf, 0xff, 0x7f, 0xee, 0xff, 0xbf, 0x5d, 0xf7,
+ 0xd7, 0x4b, 0x2f, 0xed, 0xbf, 0xda, 0x5f, 0x7f,
+ 0xfd, 0xcf, 0xe6, 0xfd, 0xff, 0xfe, 0xf3, 0xaf,
+ 0xff, 0xff, 0x76, 0xfb, 0xed, 0x7e, 0xff, 0xfd,
+ 0xff, 0x9d, 0x7f, 0xfb, 0xdd, 0xf7, 0xb5, 0x79,
+ 0xff, 0x7f, 0xfd, 0x79, 0xdf, 0xdf, 0xff, 0xff,
+ 0xf1, 0xc6, 0xff, 0xde, 0xfa, 0xff, 0xef, 0xf7,
+ 0x7f, 0xfe, 0x79, 0x6f, 0xec, 0xd7, 0x16, 0xfb,
+ 0xcd, 0xb7, 0xef, 0xfe, 0xf3, 0x8d, 0x75, 0xff,
+ 0x7d, 0xf7, 0xdb, 0x77, 0x3f, 0xbd, 0xf4, 0xbf,
+ 0x99, 0xf9, 0xf7, 0xdf, 0x3f, 0xbf, 0xff, 0xff,
+ 0xff, 0x3f, 0xff, 0xff, 0xef, 0xbf, 0x7f, 0xfe,
+ 0xff, 0xc7, 0x3e, 0xfb, 0xcf, 0xe6, 0xfe, 0xfe,
+ 0xfd, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff,
+ 0xff, 0x7d, 0xf7, 0xef, 0xfd, 0xff, 0xb5, 0xdb,
+ 0xfe, 0xbb, 0xa9, 0xff, 0xfa, 0xef, 0xef, 0xde,
+ 0xfe, 0xff, 0xdb, 0x6d, 0xdf, 0xff, 0xb5, 0xdf,
+ 0xfa, 0xf9, 0xff, 0xf5, 0xd7, 0xff, 0x6a, 0xde,
+ 0x9f, 0x7c, 0xf2, 0xcf, 0x7f, 0xff, 0xfd, 0x7f,
+ 0xab, 0xff, 0x7e, 0xf1, 0xdd, 0x7f, 0xfb, 0xf5,
+ 0xf7, 0xdf, 0xdf, 0x9b, 0xff, 0xaf, 0xff, 0x7f,
+ 0xef, 0xfd, 0xe7, 0xdf, 0xff, 0xfa, 0xff, 0xff,
+ 0xef, 0xfd, 0xdf, 0xdf, 0xff, 0xef, 0xff, 0xff,
+ 0xe6, 0xff, 0xfb, 0xf2, 0xcf, 0x3e, 0xbf, 0xf8,
+ 0xf3, 0x8f, 0x3e, 0xf7, 0xf9, 0xc7, 0x9f, 0x7f,
+ 0xf6, 0xd1, 0x47, 0x9f, 0xbf, 0xf9, 0xff, 0xff,
+ 0xeb, 0xef, 0xff, 0xef, 0xff, 0xeb, 0xef, 0xff,
+ 0xf3, 0xff, 0xdf, 0xff, 0xff, 0xfd, 0xff, 0xff,
+ 0xff, 0x6f, 0xfe, 0xff, 0xbf, 0xfa, 0xef, 0xff,
+ 0xef, 0xff, 0xff, 0xeb, 0xff, 0xff, 0xff, 0xf7,
+ 0xff, 0x7f, 0x7f, 0xfd, 0xf5, 0xff, 0x9b, 0xff,
+ 0xff, 0xfb, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff,
+ 0xee, 0xff, 0xff, 0xfd, 0xf5, 0xdf, 0x7f, 0x5f,
+ 0x7d, 0xf5, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xbf,
+ 0xfe, 0xbf, 0xff, 0xff, 0xbf, 0xfe, 0xee, 0xff,
+ 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf,
+ 0xf9, 0xff, 0xff, 0xd3, 0xff, 0xbf, 0xfb, 0xf2,
+ 0xfb, 0x6f, 0x7d, 0xff, 0xe5, 0x77, 0xdb, 0xff,
+ 0xfb, 0xff, 0xff, 0xff, 0x6f, 0xf2, 0xff, 0xab,
+ 0xae, 0xbf, 0xe6, 0x70, 0xcb, 0x2e, 0x3d, 0xbc,
+ 0x75, 0xd7, 0x5f, 0x7f, 0xf9, 0xf1, 0x47, 0x0f,
+ 0xff, 0x9a, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff,
+ 0xff, 0xdd, 0xfc, 0xec, 0xff, 0xf7, 0xf7, 0xd8,
+ 0x73, 0xf7, 0xef, 0xff, 0xff, 0xff, 0xc6, 0xbf,
+ 0xff, 0xfb, 0xeb, 0xef, 0xdf, 0xbf, 0xab, 0xeb,
+ 0x5f, 0xff, 0xff, 0xfd, 0xf7, 0x7f, 0xef, 0xff,
+ 0xef, 0xef, 0x9f, 0xf9, 0xbf, 0xdf, 0xff, 0xfd,
+ 0xf3, 0xff, 0xbf, 0x7f, 0xff, 0xff, 0xfb, 0xbf,
+ 0xd3, 0xaf, 0xbf, 0xf7, 0x7f, 0xff, 0xfe, 0x6f,
+ 0xfe, 0xf7, 0x7e, 0xf8, 0xee, 0xbf, 0xbf, 0xde,
+ 0x3e, 0xe9, 0xd9, 0x7f, 0xfd, 0xf5, 0xd7, 0x7f,
+ 0xff, 0xfd, 0xf7, 0x7f, 0x9b, 0xff, 0xff, 0x7f,
+ 0xff, 0xfd, 0xf6, 0x9f, 0xff, 0x79, 0xf5, 0xdf,
+ 0xa9, 0xfe, 0xfb, 0xcf, 0xf5, 0xff, 0xff, 0xff,
+ 0xff, 0xe6, 0xcf, 0x7b, 0x7b, 0xff, 0xef, 0xb9,
+ 0xdf, 0x9b, 0x7f, 0xee, 0xf3, 0xdf, 0xd9, 0x7f,
+ 0xcc, 0xf2, 0xf7, 0xdf, 0xf7, 0xbf, 0xd9, 0xff,
+ 0xfa, 0xfb, 0xff, 0xbf, 0xfe, 0x2e, 0xcb, 0x6f,
+ 0x3f, 0xcf, 0xf9, 0xff, 0xdf, 0x7f, 0xe5, 0xe5,
+ 0xf7, 0xff, 0x6d, 0xfe, 0xff, 0xff, 0xfb, 0x3f,
+ 0xff, 0xef, 0xfe, 0xdf, 0xef, 0x7c, 0x7f, 0xbf,
+ 0xfe, 0xdf, 0xff, 0xbf, 0xaf, 0xf7, 0xbf, 0x9b,
+ 0xfd, 0xfd, 0x3b, 0xef, 0xf8, 0x33, 0xed, 0xff,
+ 0xdf, 0xff, 0xff, 0xf4, 0x75, 0xfe, 0xe9, 0xfd,
+ 0xfb, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0xcf,
+ 0xff, 0xfe, 0xec, 0xfb, 0xff, 0xdb, 0xdf, 0xbf,
+ 0xff, 0xfe, 0x4e, 0xfe, 0xff, 0xff, 0xff, 0xff,
+ 0xbb, 0xf9, 0xff, 0xfb, 0xff, 0xa7, 0xff, 0x7e,
+ 0xff, 0xed, 0xb7, 0xff, 0xfd, 0xee, 0xed, 0x7d,
+ 0xfe, 0xff, 0xe7, 0xbe, 0xff, 0x6f, 0xfc, 0xff,
+ 0xfe, 0xfb, 0xeb, 0xb5, 0xfd, 0xf6, 0xdb, 0x27,
+ 0x3f, 0xff, 0xfd, 0xbf, 0xcf, 0xef, 0xbf, 0xfd,
+ 0xf6, 0x7f, 0x99, 0xff, 0xaf, 0xdf, 0xfe, 0xff,
+ 0xf3, 0xbf, 0x3f, 0xff, 0xfb, 0x5f, 0x7f, 0xfd,
+ 0xff, 0xf7, 0xff, 0x5f, 0xed, 0xfd, 0xff, 0xa6,
+ 0xff, 0xeb, 0x3f, 0xd6, 0xf9, 0xe7, 0xfb, 0xef,
+ 0xff, 0xfe, 0x7f, 0x7e, 0xff, 0xfd, 0xf7, 0xf5,
+ 0xff, 0xff, 0xff, 0xaf, 0xd9, 0xff, 0xda, 0x4f,
+ 0xfc, 0xff, 0xfd, 0xff, 0xeb, 0xbf, 0xff, 0x9f,
+ 0xff, 0xb2, 0xeb, 0x4e, 0xef, 0xf5, 0xd7, 0xff,
+ 0x6d, 0xfe, 0xe7, 0xff, 0xfb, 0x1f, 0xff, 0xbf,
+ 0xff, 0xde, 0xeb, 0xf9, 0xfb, 0xf7, 0xe7, 0xba,
+ 0x53, 0x6f, 0xbd, 0xf5, 0xff, 0x9b, 0xf5, 0xf9,
+ 0xff, 0xfe, 0x7d, 0xff, 0xff, 0xbf, 0xfe, 0x7a,
+ 0xff, 0xfb, 0x67, 0x98, 0xff, 0xd6, 0xeb, 0xaf,
+ 0x9f, 0x57, 0xe6, 0xfe, 0xe9, 0xe5, 0xdf, 0xbb,
+ 0xfb, 0xfd, 0xaf, 0xff, 0x3e, 0xf5, 0xfd, 0xff,
+ 0xfa, 0x57, 0xf4, 0xd2, 0x4a, 0xb3, 0xbb, 0x99,
+ 0x1f, 0xae, 0xad, 0x71, 0xff, 0x3b, 0xef, 0xa9,
+ 0xb7, 0xce, 0xb5, 0xfe, 0xf3, 0xef, 0x37, 0xdd,
+ 0xbe, 0xfb, 0xea, 0x64, 0xec, 0xbf, 0xfe, 0xfe,
+ 0xdf, 0xaf, 0xef, 0xbf, 0xfa, 0xee, 0xdb, 0xff,
+ 0x7f, 0xf7, 0xed, 0x5f, 0xfe, 0x7f, 0xff, 0xbf,
+ 0x99, 0xfb, 0xef, 0xff, 0xfe, 0x3f, 0xfb, 0xff,
+ 0xbf, 0xfe, 0xfa, 0xff, 0xdf, 0x7b, 0xe5, 0xbf,
+ 0x92, 0x5f, 0x7f, 0xfd, 0x0f, 0xc6, 0x3d, 0xff,
+ 0xff, 0xf3, 0xff, 0x3f, 0xff, 0xf6, 0xdb, 0x6f,
+ 0x7e, 0xfb, 0xfd, 0xf7, 0x9d, 0xff, 0xf7, 0xdd,
+ 0xf7, 0x9d, 0x79, 0xdf, 0x7f, 0xff, 0xf9, 0xf7,
+ 0x9f, 0x7f, 0xfe, 0xf9, 0xf7, 0xbf, 0xdf, 0x3a,
+ 0xe3, 0x6d, 0xff, 0x7d, 0xf6, 0x79, 0x6f, 0xec,
+ 0xdb, 0x3e, 0xfb, 0xcf, 0xb3, 0xfd, 0x76, 0xfb,
+ 0xed, 0x7e, 0xf7, 0xdd, 0xe7, 0xdb, 0x57, 0x2f,
+ 0xfd, 0xf4, 0xaa, 0x9b, 0xf9, 0xf6, 0xef, 0x7f,
+ 0xbf, 0xfd, 0xff, 0xdb, 0xef, 0xff, 0xfd, 0xff,
+ 0xbf, 0x7f, 0xfe, 0xf7, 0xcf, 0x36, 0xfb, 0xcf,
+ 0xe6, 0x7e, 0xff, 0xff, 0xf7, 0xdf, 0xff, 0xff,
+ 0xfb, 0xff, 0xbf, 0xff, 0xff, 0xfd, 0xef, 0xfd,
+ 0xff, 0xb5, 0xdb, 0xfe, 0xbb, 0xb9, 0xff, 0xfe,
+ 0xfb, 0x77, 0xfe, 0xff, 0xff, 0xef, 0xbf, 0xff,
+ 0xfd, 0xb5, 0x9a, 0xfe, 0xfb, 0xf7, 0xff, 0xd7,
+ 0xdf, 0x6e, 0xde, 0xbd, 0xfd, 0xf6, 0xdf, 0x37,
+ 0xff, 0xfd, 0xf3, 0xdb, 0x77, 0x7e, 0x95, 0x4d,
+ 0x7f, 0xed, 0x6e, 0xb5, 0xdf, 0xdf, 0x9b, 0xff,
+ 0xff, 0xbf, 0xee, 0xf3, 0xff, 0xf5, 0xff, 0xfe,
+ 0xfa, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xfa, 0x5f,
+ 0xff, 0xff, 0xff, 0xe6, 0xff, 0xfb, 0xa3, 0x8f,
+ 0x3e, 0xfb, 0xf8, 0xf3, 0x8f, 0x1e, 0x7f, 0xda,
+ 0xe7, 0xb7, 0x7f, 0xee, 0xf9, 0x47, 0x9f, 0xbf,
+ 0xf9, 0xff, 0xfa, 0xff, 0xef, 0xff, 0xff, 0xf7,
+ 0xeb, 0x7f, 0xff, 0xfd, 0xff, 0xff, 0xff, 0x7f,
+ 0xfd, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xbf, 0xfe,
+ 0xfe, 0xff, 0xbf, 0xff, 0xfd, 0xfa, 0xff, 0xf5,
+ 0xbf, 0xff, 0xfe, 0xff, 0x5f, 0x7f, 0xfd, 0xf5,
+ 0xff, 0x9b, 0xff, 0xbf, 0xff, 0xfe, 0xfa, 0xfb,
+ 0xaf, 0xff, 0xfe, 0xf3, 0xdd, 0x61, 0xbd, 0x57,
+ 0xdf, 0xd7, 0x5f, 0x7d, 0xf5, 0xff, 0xe6, 0xff,
+ 0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 0xcb, 0xbf, 0xff,
+ 0xdc, 0x7f, 0xde, 0xfb, 0xf7, 0xff, 0xe5, 0xff,
+ 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xf7, 0xfb, 0xff,
+ 0xff, 0xfc, 0xff, 0xfb, 0xef, 0x7f, 0xf7, 0xe7,
+ 0x27, 0xdf, 0x7f, 0xfb, 0xc9, 0xb7, 0xfb, 0x6f,
+ 0xfe, 0xff, 0x6b, 0xad, 0xbd, 0xfe, 0xfa, 0x6b,
+ 0xae, 0x36, 0xee, 0xf5, 0xd7, 0x5b, 0x7d, 0xf9,
+ 0x75, 0xd7, 0x0b, 0xff, 0x9b, 0xcd, 0xef, 0xff,
+ 0xef, 0xdf, 0xff, 0xfe, 0xfa, 0xff, 0xb7, 0xef,
+ 0xfd, 0xe5, 0xf9, 0xd3, 0xe7, 0xfe, 0x7f, 0xff,
+ 0xd9, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xef, 0xbf,
+ 0xdd, 0xfb, 0xbb, 0x7f, 0xff, 0xfb, 0xdc, 0xfd,
+ 0xff, 0xff, 0xfe, 0xed, 0xeb, 0xbf, 0xe9, 0xff,
+ 0xdf, 0xff, 0xf7, 0xdd, 0xfb, 0xff, 0x7f, 0xf7,
+ 0xff, 0xdf, 0xff, 0xaf, 0xbf, 0xfa, 0xff, 0xff,
+ 0xff, 0xff, 0x6f, 0xdc, 0xbf, 0xde, 0xee, 0xeb,
+ 0xad, 0x3f, 0x6e, 0x76, 0xc3, 0x59, 0x7f, 0xfc,
+ 0xf5, 0xd7, 0xdd, 0x7f, 0xe5, 0xd1, 0x7b, 0x19,
+ 0xff, 0xbb, 0xdf, 0xfd, 0xf6, 0xda, 0xee, 0xdf,
+ 0xbe, 0xfd, 0xbf, 0xbf, 0x37, 0xfb, 0xef, 0xbd,
+ 0x35, 0x5f, 0xf7, 0x7f, 0xe6, 0xee, 0xfb, 0xbe,
+ 0x7f, 0xee, 0xf9, 0x9e, 0x9f, 0xff, 0xff, 0xfc,
+ 0xfe, 0xff, 0x77, 0xfc, 0xf2, 0x8f, 0x3e, 0xf7,
+ 0xbf, 0xf1, 0xff, 0xff, 0xdf, 0xaf, 0xbf, 0xe6,
+ 0xfa, 0xeb, 0xed, 0xff, 0xfb, 0xbe, 0x97, 0xdf,
+ 0x7f, 0xf7, 0xfd, 0xf7, 0xff, 0x67, 0xfc, 0xff,
+ 0xff, 0xf7, 0xfd, 0xff, 0xd5, 0x37, 0xdf, 0xbb,
+ 0xfd, 0xfd, 0xcf, 0xff, 0xdf, 0x76, 0xbb, 0xbd,
+ 0xf6, 0xff, 0x1a, 0xfd, 0x8f, 0xff, 0xfb, 0xdc,
+ 0xf1, 0xff, 0xff, 0xef, 0xec, 0xe5, 0xe7, 0x9f,
+ 0x7f, 0xff, 0xff, 0xff, 0xff, 0xef, 0x7e, 0xe6,
+ 0xff, 0xaf, 0xff, 0xbf, 0xf5, 0xf6, 0xff, 0xff,
+ 0xbe, 0xfe, 0xef, 0xfe, 0xff, 0xbf, 0xff, 0xff,
+ 0xff, 0xfe, 0xff, 0xaf, 0xf9, 0xff, 0xfa, 0xff,
+ 0xbf, 0xfb, 0xee, 0x7f, 0xef, 0xb3, 0xdf, 0xec,
+ 0xf6, 0xdf, 0x7f, 0xc7, 0x9d, 0x77, 0xde, 0xff,
+ 0x6f, 0xfe, 0x9d, 0x76, 0xff, 0xe7, 0x9f, 0xdf,
+ 0x7c, 0xfb, 0xef, 0xff, 0xf7, 0xef, 0xfb, 0x4d,
+ 0x2f, 0xbf, 0xfc, 0xf2, 0x7f, 0x9b, 0xff, 0xff,
+ 0xff, 0xff, 0xfb, 0xef, 0xdf, 0x3f, 0xff, 0xfc,
+ 0xf7, 0xdf, 0xff, 0xff, 0xf7, 0xdf, 0x7f, 0xff,
+ 0xdd, 0xbf, 0x86, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xfb, 0x7c, 0xbe, 0xff, 0xff, 0x7f, 0xfe,
+ 0xff, 0xff, 0x7f, 0x3e, 0xff, 0xff, 0x8f, 0xd9,
+ 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x5f, 0x6e,
+ 0xef, 0x7f, 0xff, 0xdf, 0xff, 0x4b, 0x7f, 0x3d,
+ 0xf5, 0xd7, 0xff, 0x6d, 0xfe, 0xff, 0x9f, 0x3b,
+ 0xff, 0xff, 0xbd, 0x9c, 0x2e, 0xdb, 0x55, 0x2f,
+ 0x9d, 0xfd, 0xd6, 0x5b, 0x6b, 0xb5, 0xf5, 0xff,
+ 0x9b, 0xf5, 0xdf, 0xa7, 0x9f, 0x7f, 0xff, 0xc9,
+ 0xb7, 0xdf, 0x78, 0xd6, 0x5b, 0x67, 0xbf, 0xfe,
+ 0xfa, 0xeb, 0xaf, 0xff, 0xd7, 0xe6, 0xfe, 0xff,
+ 0xff, 0xff, 0x1f, 0xff, 0xab, 0xfb, 0xaf, 0x60,
+ 0xaf, 0xdd, 0x6b, 0x7b, 0xfd, 0xf5, 0xd7, 0x4b,
+ 0xb7, 0xbb, 0x99, 0xff, 0xf7, 0xbb, 0xf6, 0xda,
+ 0xfb, 0xe2, 0xbb, 0xa5, 0x7f, 0xbb, 0xfc, 0xda,
+ 0xfe, 0xfd, 0xf7, 0xdf, 0x7b, 0xff, 0x6c, 0xec,
+ 0xff, 0xdd, 0xff, 0xf7, 0xdd, 0xb3, 0xdc, 0x7e,
+ 0xe9, 0xf5, 0xfc, 0xfd, 0xf5, 0xff, 0xff, 0xff,
+ 0x7f, 0xff, 0xbf, 0x99, 0xfb, 0xff, 0xa7, 0xff,
+ 0x7f, 0xfe, 0x2c, 0xa7, 0x5f, 0xea, 0xb7, 0xdf,
+ 0x7b, 0xfd, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0x8f,
+ 0xe6, 0xfd, 0xff, 0xf2, 0xdb, 0xbe, 0xbb, 0xdd,
+ 0xf2, 0xfb, 0xef, 0xee, 0xff, 0xed, 0x77, 0xff,
+ 0x7d, 0xf7, 0xfd, 0xf7, 0xbd, 0x79, 0xff, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xdf, 0x77, 0xfe, 0x77, 0xde,
+ 0x37, 0xdf, 0xf4, 0xcb, 0x7f, 0x9f, 0x7d, 0xf6,
+ 0x79, 0x6f, 0xec, 0xff, 0x34, 0xfb, 0xec, 0xb3,
+ 0xef, 0xfc, 0xfb, 0xcd, 0x75, 0xfc, 0xfd, 0x74,
+ 0xd3, 0x4f, 0x3f, 0xbd, 0xf4, 0xbf, 0x99, 0xf9,
+ 0xf7, 0xfb, 0x6f, 0xbf, 0xfd, 0xff, 0xdf, 0x3f,
+ 0xff, 0xff, 0xff, 0x77, 0x7f, 0xec, 0xb5, 0xd7,
+ 0x3e, 0xfb, 0xcf, 0xe6, 0xbe, 0xff, 0xff, 0xfb,
+ 0xde, 0xfb, 0xff, 0xfb, 0xef, 0xff, 0xff, 0xff,
+ 0xff, 0x5f, 0xfb, 0xed, 0xb7, 0xd7, 0xfe, 0xbb,
+ 0xa9, 0xff, 0xe7, 0xf9, 0xff, 0xfe, 0x7f, 0xf7,
+ 0xff, 0x2d, 0xf6, 0xf3, 0xb5, 0xdf, 0xff, 0x7f,
+ 0xfd, 0xf5, 0xd7, 0xff, 0x6a, 0xde, 0xdf, 0xfd,
+ 0xf3, 0x9f, 0x7f, 0xfe, 0xff, 0x77, 0x8b, 0xfc,
+ 0x7d, 0x95, 0xd5, 0xfe, 0xff, 0xfe, 0xfb, 0xee,
+ 0xdf, 0x98, 0xff, 0xff, 0xfe, 0x7f, 0xef, 0xfd,
+ 0xef, 0xff, 0xcf, 0x32, 0xbf, 0xdf, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xe6, 0xff,
+ 0xff, 0xb3, 0xcf, 0x3f, 0xff, 0xf8, 0xf3, 0x8f,
+ 0x3e, 0xff, 0xf1, 0x67, 0x9f, 0x7f, 0xf4, 0xd1,
+ 0x47, 0x9f, 0xbf, 0xf9, 0xff, 0xfa, 0xfb, 0x7f,
+ 0xff, 0xf9, 0xfb, 0x9f, 0xaf, 0xff, 0xfb, 0xf7,
+ 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f,
+ 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xbe,
+ 0xfe, 0xeb, 0xdf, 0xff, 0xfd, 0xf5, 0xff, 0x5f,
+ 0x7f, 0xfd, 0xf5, 0xff, 0x9b, 0xff, 0xaf, 0xff,
+ 0xff, 0xe7, 0xbf, 0xbf, 0xff, 0xff, 0xea, 0x3f,
+ 0xff, 0xfd, 0xf7, 0xff, 0xd7, 0x5f, 0x7f, 0xfd,
+ 0xff, 0x66, 0xff, 0xeb, 0xff, 0xff, 0xff, 0xff,
+ 0xef, 0x7e, 0xff, 0xff, 0xfe, 0xff, 0x7f, 0xff,
+ 0xfb, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xf9, 0xff,
+ 0xff, 0xfb, 0xef, 0xff, 0xfc, 0xf2, 0xfb, 0x6f,
+ 0x77, 0xfb, 0xff, 0x1f, 0x5f, 0x7e, 0xff, 0xfd,
+ 0xf7, 0xff, 0x6f, 0xfa, 0xff, 0xeb, 0xae, 0xbd,
+ 0xfa, 0x78, 0xc3, 0x2e, 0xbf, 0xbe, 0xf1, 0xd7,
+ 0x4f, 0x6b, 0xdd, 0x75, 0xd7, 0x5c, 0xf7, 0x9b,
+ 0x7f, 0xff, 0xff, 0xef, 0x31, 0xcf, 0x37, 0xfb,
+ 0xff, 0xfc, 0x97, 0x7f, 0xf4, 0xbf, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xbf, 0xc6, 0xfb, 0xff, 0xfc,
+ 0xfb, 0x63, 0x7e, 0xf7, 0xfd, 0xef, 0xab, 0xff,
+ 0xf7, 0xee, 0xff, 0xff, 0xff, 0xfe, 0xf7, 0xbe,
+ 0x9f, 0xf9, 0xff, 0xff, 0xbd, 0xaf, 0xfe, 0xfe,
+ 0xfb, 0x7d, 0xf7, 0x5f, 0xfd, 0xf7, 0xfd, 0xff,
+ 0xe9, 0xff, 0xfe, 0x7f, 0xff, 0x6f, 0xfe, 0xbf,
+ 0xfe, 0xfc, 0xeb, 0xab, 0xff, 0xee, 0x7a, 0xcb,
+ 0xdf, 0xee, 0xfd, 0xf5, 0xc5, 0xff, 0x6f, 0x7d,
+ 0xf1, 0x7d, 0x9b, 0xff, 0xbf, 0xff, 0xff, 0xb7,
+ 0xdb, 0xff, 0xef, 0xfe, 0xf7, 0xde, 0xf5, 0xff,
+ 0xda, 0xfc, 0xff, 0x53, 0xff, 0xfe, 0xff, 0xe6,
+ 0xef, 0xfa, 0xbf, 0xbb, 0xec, 0xb7, 0xe3, 0xaf,
+ 0xbf, 0xee, 0xf3, 0xf7, 0xef, 0xff, 0xdf, 0xaf,
+ 0xff, 0x7f, 0xff, 0xaf, 0xf9, 0xff, 0xfe, 0xf3,
+ 0xcf, 0xbf, 0xaf, 0xcf, 0x7b, 0x4f, 0xff, 0xef,
+ 0xf5, 0xff, 0xfe, 0xee, 0xff, 0x3f, 0x77, 0xff,
+ 0x6b, 0xfe, 0xfe, 0xfe, 0xfb, 0x6f, 0xef, 0xf5,
+ 0xff, 0x66, 0x6d, 0xf7, 0xfb, 0xff, 0x3f, 0xff,
+ 0xff, 0xfb, 0xe7, 0x6d, 0xfd, 0x9b, 0xff, 0xff,
+ 0xff, 0x7f, 0xf8, 0xff, 0xff, 0xfe, 0xe9, 0xed,
+ 0xff, 0xff, 0xff, 0xbf, 0xff, 0x7f, 0x1f, 0x9d,
+ 0xee, 0xff, 0xe6, 0xff, 0xff, 0xfe, 0xff, 0x7e,
+ 0xff, 0x7f, 0xf9, 0xff, 0xfe, 0xff, 0xff, 0xff,
+ 0xff, 0xef, 0xff, 0xdb, 0xff, 0xfe, 0xaf, 0xf9,
+ 0xff, 0x7f, 0xff, 0xa4, 0xbf, 0x6e, 0xaa, 0xdf,
+ 0xab, 0x7b, 0xdd, 0xde, 0xd7, 0xef, 0x7f, 0x7d,
+ 0xff, 0xd7, 0xfb, 0x6f, 0xfc, 0xdb, 0xfe, 0xfb,
+ 0x2f, 0xbe, 0xff, 0xfe, 0xf3, 0x2d, 0x7f, 0xfb,
+ 0xcf, 0xf5, 0xff, 0x7f, 0xbf, 0xef, 0xf7, 0x7f,
+ 0x99, 0xff, 0xdf, 0x7f, 0xff, 0xdb, 0xf7, 0xdf,
+ 0x7f, 0xff, 0xbb, 0xef, 0xff, 0xff, 0xf7, 0xff,
+ 0xef, 0xff, 0xff, 0xfe, 0xff, 0xa6, 0xfd, 0xfb,
+ 0xef, 0xe7, 0xff, 0xff, 0xfb, 0xaf, 0xd5, 0xfb,
+ 0xff, 0x7f, 0x73, 0xe5, 0xe7, 0xf7, 0xff, 0xff,
+ 0xff, 0xaf, 0xd9, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xf7, 0x5e, 0xf9, 0x7f, 0xff, 0xff, 0x5f, 0xf6,
+ 0xf8, 0xaf, 0xef, 0xff, 0xff, 0xff, 0x6d, 0xee,
+ 0xbf, 0x9e, 0x1e, 0xdf, 0xff, 0xbf, 0xff, 0xfb,
+ 0xeb, 0x5c, 0xff, 0xbf, 0xdd, 0x54, 0x53, 0xaf,
+ 0x3f, 0xfd, 0xff, 0x1b, 0xf5, 0xef, 0xf7, 0x9f,
+ 0x6f, 0xfe, 0xef, 0xbf, 0x9f, 0xfa, 0xd7, 0xf9,
+ 0xaf, 0xbd, 0xf5, 0xf7, 0x7b, 0xef, 0x9f, 0x57,
+ 0xe6, 0xfe, 0xff, 0xf3, 0xdb, 0x7f, 0xff, 0xfd,
+ 0x3f, 0xbd, 0xf7, 0xf7, 0xff, 0x7f, 0x93, 0xeb,
+ 0xf7, 0xdd, 0xe4, 0xab, 0xbb, 0x91, 0xff, 0xef,
+ 0xfc, 0xf5, 0xee, 0x2b, 0xef, 0xdb, 0xef, 0x7e,
+ 0xd7, 0xfe, 0x73, 0xef, 0xfe, 0xd7, 0xde, 0x5a,
+ 0xed, 0x64, 0xec, 0xff, 0xbf, 0xf6, 0xf7, 0xdf,
+ 0xff, 0xff, 0xdb, 0x7b, 0x7f, 0xff, 0x7f, 0xfd,
+ 0x10, 0x5a, 0xff, 0x85, 0xdd, 0xbf, 0x99, 0xfb,
+ 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xbf, 0xf9,
+ 0xce, 0xf7, 0xdf, 0xff, 0xa5, 0x25, 0xf4, 0x7f,
+ 0xaf, 0xfd, 0x6f, 0xe6, 0xfd, 0xff, 0xfe, 0xff,
+ 0xee, 0xbb, 0xff, 0x7f, 0xff, 0xed, 0xfe, 0xff,
+ 0xdd, 0xde, 0x9f, 0xff, 0xbf, 0xff, 0xfe, 0x9d,
+ 0x71, 0xff, 0x7f, 0xdc, 0xfd, 0xd7, 0x7f, 0xff,
+ 0xbf, 0x7f, 0xd6, 0xff, 0x57, 0x3e, 0xff, 0xfc,
+ 0xff, 0xcf, 0x3e, 0x7b, 0x6f, 0xec, 0xdf, 0xf6,
+ 0xbb, 0x6d, 0xb3, 0xff, 0xfe, 0xf3, 0xcf, 0x71,
+ 0xfb, 0xfd, 0xe5, 0x9f, 0x6b, 0xbf, 0xc1, 0xc6,
+ 0xad, 0x9b, 0xf9, 0xf3, 0xdf, 0x6f, 0xbf, 0xfd,
+ 0xf7, 0xff, 0xff, 0xff, 0xfd, 0xff, 0x7d, 0xff,
+ 0xff, 0xfb, 0xe7, 0x9f, 0xff, 0xce, 0xe6, 0x7e,
+ 0xff, 0xfe, 0xfb, 0xee, 0xbb, 0xff, 0xff, 0xfe,
+ 0xeb, 0xff, 0xff, 0xdf, 0xfd, 0xbf, 0xff, 0xfd,
+ 0xfd, 0xdf, 0xbb, 0xb9, 0xff, 0xfb, 0xeb, 0xff,
+ 0xfe, 0xfb, 0x7f, 0xcb, 0x2f, 0x7c, 0xfd, 0xbf,
+ 0x3e, 0x5e, 0xf9, 0xfd, 0xcf, 0x3f, 0xdf, 0x6e,
+ 0xde, 0xdf, 0xfd, 0xfb, 0x9d, 0x77, 0xbe, 0xdd,
+ 0xea, 0x8b, 0xdf, 0xfe, 0xd3, 0xcf, 0x13, 0xd9,
+ 0xfe, 0xf3, 0xcf, 0xdf, 0x9b, 0xff, 0xaf, 0xff,
+ 0xff, 0xf7, 0xff, 0xff, 0xbf, 0xfe, 0xfe, 0xd7,
+ 0x4b, 0xff, 0xf7, 0xe5, 0xdf, 0xfb, 0x7e, 0xdd,
+ 0xff, 0xe6, 0xff, 0xef, 0xf3, 0xcf, 0x2f, 0xf7,
+ 0xf8, 0xa3, 0x8b, 0x3d, 0xfd, 0xd1, 0xe7, 0x1f,
+ 0x7d, 0xfc, 0xf9, 0xc7, 0x9e, 0xbf, 0xf9, 0xff,
+ 0xfb, 0xef, 0xff, 0xfb, 0xfd, 0xff, 0xfb, 0x3f,
+ 0xff, 0xfd, 0xf5, 0x97, 0xff, 0xfc, 0xfd, 0xc7,
+ 0xbf, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xff, 0xff,
+ 0xfb, 0xbf, 0xff, 0xba, 0xee, 0xff, 0x7f, 0xfd,
+ 0xf5, 0xff, 0x7f, 0x7f, 0xff, 0xef, 0xff, 0x9b,
+ 0xff, 0xbf, 0xff, 0xff, 0xef, 0x9f, 0xff, 0xff,
+ 0xfb, 0xe7, 0xdf, 0xff, 0x7d, 0xf1, 0xd5, 0xdf,
+ 0xff, 0xfd, 0xf5, 0xff, 0xe6, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xfe,
+ 0xff, 0x5f, 0x7f, 0xfd, 0xe7, 0xff, 0xff, 0xff,
+ 0xbf, 0xf9, 0xff, 0xf6, 0xcb, 0x6f, 0xaf, 0xbf,
+ 0xfe, 0xfb, 0x79, 0xaf, 0x7f, 0xe5, 0xff, 0xf7,
+ 0x7f, 0xfb, 0xef, 0x97, 0xff, 0x6f, 0xfa, 0xbf,
+ 0xab, 0xaf, 0x3d, 0xe6, 0xfa, 0xeb, 0xad, 0xbf,
+ 0xfe, 0x45, 0xd3, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7,
+ 0x5a, 0xff, 0x9b, 0xff, 0xe7, 0x5f, 0xff, 0xf0,
+ 0xef, 0xd7, 0xff, 0xff, 0xee, 0xff, 0x7f, 0xfe,
+ 0xd9, 0x9f, 0xe7, 0xdf, 0xff, 0xff, 0xd9, 0xc6,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff,
+ 0xff, 0x7f, 0xff, 0xf7, 0x3f, 0xb7, 0xff, 0xff,
+ 0xbf, 0xff, 0xff, 0xbb, 0xe9, 0xff, 0xff, 0xff,
+ 0xaf, 0x7d, 0xdf, 0xff, 0xff, 0xfb, 0xdf, 0xdf,
+ 0xc6, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x6b, 0xfe, 0xbf, 0xff, 0xfe, 0xef, 0x2f, 0xfb,
+ 0xff, 0x7a, 0xcd, 0x7f, 0x6d, 0xf1, 0xb5, 0xe7,
+ 0x7f, 0xef, 0xbd, 0xf7, 0xff, 0x99, 0xff, 0xbf,
+ 0xff, 0xfe, 0xff, 0xef, 0xff, 0xff, 0xfe, 0xdf,
+ 0xf6, 0xf7, 0xee, 0x73, 0xff, 0xfd, 0xdf, 0xff,
+ 0xde, 0x7f, 0xe6, 0xff, 0xef, 0xbf, 0xbf, 0xfe,
+ 0xfa, 0xe7, 0x2f, 0xad, 0xfd, 0x7f, 0xf7, 0x1d,
+ 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xbf, 0xf9,
+ 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xf9, 0xfe, 0xf4,
+ 0xfe, 0xbf, 0xff, 0xff, 0xf7, 0xfe, 0xff, 0xef,
+ 0xb5, 0xff, 0xff, 0x67, 0xfe, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xdf, 0xfa, 0xdf, 0x7f, 0xef, 0xb9,
+ 0xff, 0xd6, 0xfe, 0xfb, 0xff, 0xef, 0xdf, 0x7c,
+ 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff,
+ 0xfa, 0xdf, 0xe8, 0x7f, 0xe7, 0xff, 0xfe, 0xff,
+ 0xff, 0x1d, 0x7d, 0xf6, 0x7a, 0xe6, 0xff, 0xff,
+ 0xff, 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xdf, 0xcd,
+ 0xff, 0xff, 0x7e, 0xbd, 0xff, 0x9f, 0xdf, 0x4f,
+ 0xff, 0xaf, 0xf9, 0xff, 0xfb, 0xef, 0xbf, 0xff,
+ 0xf6, 0xfb, 0xef, 0xfe, 0xfe, 0xd7, 0xff, 0xd7,
+ 0x7f, 0xff, 0xfd, 0xee, 0xff, 0xf7, 0x6f, 0xfc,
+ 0x7f, 0xee, 0xf9, 0xe7, 0x9f, 0x7f, 0xfe, 0xf9,
+ 0xef, 0x77, 0xff, 0x7f, 0x77, 0x97, 0x5f, 0xff,
+ 0xf7, 0xbf, 0xff, 0x9b, 0xff, 0xdf, 0x7f, 0xff,
+ 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xef, 0xff,
+ 0xff, 0xfd, 0xfd, 0xf7, 0xff, 0xf7, 0xf7, 0xff,
+ 0x86, 0xff, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xbf, 0xff, 0x9f, 0x97, 0xdf, 0xff, 0xf9, 0xe5,
+ 0x3d, 0x3e, 0x5f, 0xff, 0x8f, 0xd9, 0xff, 0xfb,
+ 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xff, 0x67,
+ 0xff, 0xb7, 0xbf, 0xd3, 0x7f, 0xbf, 0xfe, 0xd7,
+ 0xff, 0x6d, 0xfe, 0xf7, 0xde, 0x7b, 0xef, 0xbd,
+ 0xf7, 0xde, 0xfe, 0x7f, 0x7c, 0xfc, 0xbf, 0xfe,
+ 0x76, 0x7b, 0xff, 0xb7, 0xfe, 0xff, 0x9b, 0xf5,
+ 0xe5, 0x97, 0x5f, 0x7e, 0xf9, 0xe5, 0x97, 0xff,
+ 0xfd, 0xe7, 0xff, 0xcf, 0xbf, 0xf6, 0xda, 0xf3,
+ 0xef, 0xff, 0xd7, 0xe6, 0xfe, 0x6f, 0xb6, 0xd9,
+ 0x66, 0x9b, 0x6d, 0xe5, 0xff, 0xfd, 0x87, 0xdf,
+ 0x5f, 0xaf, 0xcd, 0xbc, 0xd7, 0x57, 0xff, 0xbb,
+ 0x99, 0xff, 0x5e, 0x79, 0xe5, 0x9d, 0x77, 0xde,
+ 0xfb, 0xff, 0x7f, 0xcf, 0xd6, 0xd7, 0xcf, 0x7b,
+ 0xef, 0xd5, 0x57, 0xff, 0x6c, 0xec, 0xbf, 0xf7,
+ 0xde, 0x7b, 0xeb, 0xaf, 0xff, 0xfb, 0xff, 0x75,
+ 0xaf, 0xff, 0xb5, 0xf5, 0x7f, 0xfb, 0xff, 0xff,
+ 0xbf, 0x99, 0xfb, 0xbf, 0xff, 0xfe, 0xfb, 0xef,
+ 0xbf, 0xff, 0xfe, 0x77, 0xbf, 0xea, 0xff, 0xed,
+ 0xb7, 0xdf, 0xf8, 0xff, 0xff, 0xef, 0xe6, 0xfd,
+ 0xfb, 0xef, 0xbb, 0xef, 0xbe, 0xfb, 0xfe, 0xfb,
+ 0x2f, 0x6e, 0xfe, 0xff, 0x67, 0xff, 0x7f, 0xff,
+ 0xff, 0xb7, 0xbd, 0x79, 0xff, 0xfe, 0xfb, 0xec,
+ 0xb3, 0xcf, 0x3e, 0xbb, 0x7c, 0xf7, 0x3f, 0xff,
+ 0x7f, 0xdf, 0x7f, 0x9f, 0xdf, 0x7c, 0x7f, 0x6f,
+ 0xec, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe,
+ 0xfa, 0xef, 0x7e, 0xfe, 0xfd, 0xf6, 0xd7, 0x5f,
+ 0xff, 0xfd, 0xf6, 0xbf, 0x99, 0xf9, 0xef, 0xbf,
+ 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xff, 0xff,
+ 0xff, 0xdf, 0xff, 0xfd, 0xf7, 0xff, 0x9f, 0xff,
+ 0xcf, 0xe6, 0xfe, 0xfb, 0x6f, 0xbf, 0xfd, 0xf6,
+ 0xdb, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
+ 0xff, 0xed, 0x7f, 0xfb, 0xfd, 0xbb, 0xa9, 0xff,
+ 0xff, 0xfb, 0xed, 0xb7, 0xdf, 0x7e, 0xfb, 0x7f,
+ 0xfe, 0xf1, 0xff, 0xfe, 0xfe, 0xfb, 0xef, 0xfc,
+ 0xdf, 0xff, 0x6a, 0xde, 0xff, 0xfb, 0xee, 0xbb,
+ 0xef, 0xbe, 0xfb, 0xae, 0xdd, 0x77, 0xfc, 0xfb,
+ 0x57, 0x7f, 0xff, 0xbd, 0xf1, 0xd7, 0xdf, 0x98,
+ 0xff, 0xff, 0xff, 0xfe, 0xbb, 0xef, 0xbe, 0xff,
+ 0x6e, 0xef, 0xdf, 0xfb, 0xff, 0xfd, 0xff, 0xd7,
+ 0x5f, 0xef, 0xfd, 0xff, 0xe6, 0xff, 0xff, 0xb3,
+ 0xcf, 0x3e, 0x7b, 0xec, 0xb3, 0xe7, 0xaf, 0x67,
+ 0xfc, 0x75, 0x9f, 0x1f, 0x74, 0xd3, 0xe7, 0x8f,
+ 0xbf, 0xf9, 0xff, 0xfa, 0xef, 0xbf, 0xff, 0x7e,
+ 0xfb, 0xef, 0xbf, 0xef, 0x7d, 0x65, 0xdd, 0x57,
+ 0x5f, 0xfd, 0xef, 0xb7, 0xeb, 0x6f, 0xfe, 0xbf,
+ 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xfd,
+ 0x77, 0x3f, 0xfd, 0xf6, 0xd3, 0x4d, 0xf7, 0xfb,
+ 0xed, 0xff, 0x9b, 0xff, 0xa7, 0xbe, 0xfb, 0xee,
+ 0xbb, 0xed, 0xbe, 0xdb, 0xbf, 0x7e, 0x51, 0xde,
+ 0x75, 0xd4, 0x7c, 0xf7, 0xfd, 0xf7, 0xff, 0xe6,
+ 0xff, 0xeb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef,
+ 0xf7, 0xcf, 0x7f, 0x96, 0x79, 0x67, 0xdd, 0x7e,
+ 0xff, 0xdf, 0xff, 0xbf, 0xf9, 0xff, 0xff, 0xff,
+ 0xff, 0xfe, 0xff, 0xff, 0xfb, 0xff, 0x7f, 0xf1,
+ 0xfd, 0xb7, 0xfb, 0xff, 0xf9, 0xbf, 0x7f, 0xff,
+ 0x6f, 0xfa, 0xff, 0xeb, 0xaf, 0xbf, 0xfa, 0xfa,
+ 0xab, 0xad, 0x3f, 0xa4, 0x65, 0xd7, 0x1e, 0x7f,
+ 0xfd, 0xd5, 0xd7, 0x5f, 0xff, 0x9a, 0x7f, 0xff,
+ 0xfc, 0xfb, 0xbf, 0xff, 0xfe, 0xfd, 0x73, 0xff,
+ 0xff, 0xfd, 0x7e, 0xf6, 0x5f, 0xff, 0xfe, 0xbd,
+ 0xff, 0xff, 0xc6, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff,
+ 0xff, 0xff, 0xbe, 0xfb, 0xfe, 0xbf, 0x9e, 0xf9,
+ 0xff, 0xdf, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x77, 0xdf, 0xef, 0xfe, 0xfb, 0xff, 0xff, 0xff,
+ 0xff, 0x7d, 0xff, 0x6f, 0xfe, 0xbf, 0xfe, 0xfa,
+ 0xeb, 0xaf, 0xbf, 0xf2, 0xb2, 0x63, 0x5f, 0x7e,
+ 0xfc, 0xe7, 0x9d, 0x97, 0xdb, 0xbd, 0x75, 0xff,
+ 0x9b, 0xff, 0xbf, 0xff, 0xfe, 0xeb, 0xef, 0x6e,
+ 0xff, 0xfe, 0xdf, 0xdf, 0xf7, 0xef, 0x9f, 0x7f,
+ 0xfb, 0xff, 0xfd, 0x5d, 0xff, 0xe6, 0xff, 0xe3,
+ 0xef, 0x3f, 0xfe, 0xa2, 0xe7, 0x8e, 0xbf, 0xf7,
+ 0x74, 0xf7, 0xdf, 0x7f, 0xfc, 0xff, 0xf7, 0xdf,
+ 0xff, 0xaf, 0xf9, 0xff, 0xff, 0x5f, 0xff, 0x3f,
+ 0xff, 0xff, 0xff, 0x67, 0xbf, 0xfa, 0xef, 0xff,
+ 0xdf, 0xff, 0xfb, 0xff, 0x7f, 0x7f, 0x6f, 0xfe,
+ 0xe7, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff,
+ 0xbb, 0xff, 0xff, 0xff, 0xff, 0xde, 0xff, 0xfd,
+ 0xff, 0x7f, 0xfe, 0x9b, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xdf, 0xdf, 0xec, 0xe5, 0xaa,
+ 0xff, 0xff, 0xfb, 0x86, 0xfd, 0xfc, 0xfb, 0xff,
+ 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff,
+ 0xff, 0x3f, 0xe3, 0xd9, 0xef, 0xff, 0xdf, 0xfe,
+ 0xf7, 0xfb, 0xf7, 0xff, 0xbf, 0xf9, 0xff, 0xfa,
+ 0xff, 0xbf, 0xbf, 0xfe, 0xfa, 0xeb, 0x2a, 0xff,
+ 0xff, 0xff, 0xde, 0x7d, 0x7e, 0xfd, 0xf5, 0xff,
+ 0xff, 0x6f, 0xfc, 0xdf, 0x7e, 0xff, 0xc5, 0xb7,
+ 0xdf, 0xfe, 0xfb, 0xef, 0xf6, 0xff, 0xfd, 0xf6,
+ 0xce, 0x7f, 0xfc, 0xfd, 0xf7, 0xff, 0x99, 0xff,
+ 0xdf, 0xff, 0xff, 0xfb, 0xb7, 0xdf, 0x7f, 0xff,
+ 0xfb, 0xff, 0x7b, 0x7f, 0xdd, 0xf7, 0xdf, 0xbf,
+ 0xff, 0xe5, 0xfd, 0xa6, 0xff, 0xef, 0xbf, 0xff,
+ 0xfc, 0xfb, 0xef, 0xef, 0xbf, 0xfb, 0xd5, 0x5f,
+ 0xdf, 0xc9, 0xf7, 0xff, 0xfa, 0xdf, 0xff, 0x8f,
+ 0xd9, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe,
+ 0xef, 0x3f, 0x7f, 0xfb, 0xed, 0x77, 0xeb, 0xff,
+ 0x9f, 0xff, 0xdf, 0xff, 0x6d, 0xfe, 0xff, 0xce,
+ 0xff, 0x6f, 0xbf, 0xfd, 0xde, 0x7b, 0xef, 0x5f,
+ 0x6b, 0xbf, 0xf7, 0x7a, 0x53, 0xff, 0xbf, 0xf4,
+ 0xff, 0x9b, 0xf7, 0xef, 0xe7, 0xff, 0xfe, 0xfb,
+ 0xef, 0x97, 0x5f, 0x7e, 0xd7, 0x6b, 0xaf, 0x9d,
+ 0x7f, 0xd6, 0xff, 0xe7, 0xff, 0xd7, 0xe6, 0xfe,
+ 0xfd, 0xb5, 0xd7, 0x5f, 0x7f, 0xfd, 0xb6, 0xd9,
+ 0x2e, 0xf5, 0xdf, 0xcc, 0xff, 0xcf, 0x36, 0xfb,
+ 0xdf, 0xfb, 0xbb, 0x99, 0xbf, 0xef, 0xb9, 0xf7,
+ 0xda, 0x6b, 0xef, 0x79, 0xe5, 0x5f, 0xf5, 0xbd,
+ 0xf2, 0xff, 0xb3, 0xf7, 0xfe, 0x5f, 0xee, 0x6c,
+ 0xea, 0xff, 0x1f, 0xff, 0xfe, 0xf5, 0xff, 0xbf,
+ 0xde, 0xfb, 0x5b, 0x7f, 0xef, 0xf7, 0xef, 0x5b,
+ 0xd9, 0xff, 0xf5, 0xbd, 0x99, 0xfb, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xd6, 0xdb, 0xd7,
+ 0x7e, 0xfb, 0xed, 0x3f, 0xd4, 0xff, 0xff, 0xff,
+ 0xef, 0xc6, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xef, 0xaf, 0xef, 0x7e, 0xf7, 0xff, 0xf7,
+ 0x9d, 0xef, 0xff, 0xf9, 0xf7, 0xbd, 0x79, 0x17,
+ 0xff, 0xff, 0xfd, 0xff, 0xdf, 0xff, 0xfb, 0xef,
+ 0x72, 0x9d, 0xfd, 0x77, 0xf9, 0xef, 0x33, 0xff,
+ 0xfc, 0x6b, 0x6f, 0xec, 0xd7, 0x56, 0x1b, 0xed,
+ 0xbf, 0xfb, 0xfe, 0xfa, 0xeb, 0x75, 0x7f, 0xfd,
+ 0xf5, 0xdb, 0x77, 0xbc, 0xfd, 0xf6, 0x3d, 0x99,
+ 0xf9, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xbf,
+ 0xff, 0xfe, 0xfd, 0xdf, 0x7f, 0x7f, 0xfe, 0xff,
+ 0xfd, 0x9f, 0xff, 0xcf, 0xe6, 0xfe, 0xff, 0xff,
+ 0xfb, 0xff, 0xff, 0xff, 0xef, 0xbf, 0xed, 0xff,
+ 0xf7, 0xdf, 0xee, 0xfd, 0xff, 0xff, 0xfb, 0xff,
+ 0xbb, 0xb9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xfe, 0x7f, 0xef, 0x75, 0xef, 0xbf, 0xff, 0xfe,
+ 0xf9, 0xf3, 0xfd, 0xd6, 0xff, 0x6a, 0xde, 0x9f,
+ 0x7d, 0xf7, 0xcd, 0x77, 0x9f, 0xfd, 0x6f, 0xbb,
+ 0x7e, 0xfd, 0xf7, 0x5f, 0x7f, 0xeb, 0xfc, 0xf9,
+ 0xcf, 0xce, 0x9b, 0xff, 0xfd, 0xff, 0xfe, 0xff,
+ 0xef, 0xef, 0xff, 0xef, 0xfb, 0xdf, 0xfb, 0x77,
+ 0x9d, 0xdf, 0x97, 0xeb, 0x7f, 0xff, 0xff, 0xe6,
+ 0xff, 0xfb, 0xe3, 0xcf, 0x3e, 0xfb, 0xf8, 0xf3,
+ 0xcf, 0x9e, 0x7d, 0xfc, 0x57, 0x8f, 0x5f, 0x77,
+ 0xf9, 0xc7, 0x9f, 0xbf, 0xf9, 0xff, 0xe7, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xeb, 0xbf, 0xff, 0x7d,
+ 0xf5, 0xd7, 0xe7, 0xde, 0x7b, 0xf7, 0xd7, 0xdf,
+ 0x6f, 0xfe, 0x9f, 0xff, 0xff, 0xef, 0xff, 0xff,
+ 0xff, 0xfa, 0xef, 0xd5, 0x3f, 0xfd, 0xf4, 0xfa,
+ 0xef, 0x7f, 0xfd, 0xff, 0xff, 0x9b, 0xff, 0xff,
+ 0xff, 0xfe, 0xff, 0xef, 0xff, 0xbf, 0xfa, 0xee,
+ 0x77, 0x51, 0xfd, 0x77, 0x4f, 0x1d, 0xf5, 0x7f,
+ 0xf7, 0xff, 0xe6, 0xff, 0xdb, 0xef, 0xff, 0xfe,
+ 0xfb, 0xff, 0xaf, 0xbf, 0xdf, 0xf7, 0xd6, 0xfb,
+ 0xe7, 0x9f, 0x7f, 0x9f, 0xdf, 0xff, 0xbf, 0xf9,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x7f, 0xfb, 0xff, 0xb7, 0xdf, 0x7f, 0xf3,
+ 0xff, 0x97, 0xf7, 0x6f, 0xfe, 0xff, 0xeb, 0xaf,
+ 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0x3f, 0xfe, 0xd4,
+ 0xd7, 0x5f, 0x7f, 0xf9, 0xf5, 0xd7, 0x5a, 0xff,
+ 0x9a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x7f, 0xef, 0x67, 0xff, 0x7f, 0xf0, 0x62,
+ 0x07, 0xf7, 0xff, 0xff, 0xff, 0xc6, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff,
+ 0xff, 0xbf, 0xdf, 0x6f, 0xfd, 0x75, 0xff, 0xff,
+ 0xfd, 0x9f, 0xf9, 0xdf, 0xff, 0xff, 0xfb, 0xfd,
+ 0xff, 0xdf, 0xff, 0xff, 0xdf, 0xef, 0xfe, 0xda,
+ 0xff, 0xbf, 0xff, 0xbe, 0xff, 0xff, 0x6f, 0xfc,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfb,
+ 0xcb, 0x7f, 0x7e, 0xfe, 0xe5, 0xd7, 0x7f, 0xfe,
+ 0xbd, 0x6f, 0x7f, 0x9b, 0xff, 0xff, 0xff, 0x7f,
+ 0xff, 0xff, 0xef, 0xbf, 0xef, 0xbb, 0xff, 0xf4,
+ 0x77, 0xdb, 0xef, 0xf7, 0xff, 0xf7, 0xf7, 0xff,
+ 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xbf, 0xfb, 0xfc, 0xff, 0x7f, 0x5f, 0xff,
+ 0xf6, 0xf7, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xff,
+ 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfd,
+ 0x7f, 0xff, 0xe7, 0xff, 0x7f, 0x7e, 0xff, 0xff,
+ 0xff, 0x6f, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xf3, 0xbf, 0xff, 0xf7,
+ 0xff, 0xdf, 0xdf, 0xff, 0xbf, 0xfe, 0x9b, 0xff,
+ 0xfe, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x7f, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xbf,
+ 0xf9, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xfe, 0x7b, 0xfd, 0xff, 0xda, 0xf8, 0xf5,
+ 0xff, 0xfe, 0xff, 0xf7, 0x6e, 0xfe, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xef, 0x77,
+ 0xfd, 0xfb, 0xf3, 0xff, 0xff, 0xf7, 0xff, 0xff,
+ 0xbe, 0x99, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xfb, 0x7d, 0xdf, 0xef, 0xff, 0xfd,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x66, 0xef,
+ 0xcf, 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xf7,
+ 0xdd, 0xef, 0x9e, 0xfb, 0xfe, 0xf9, 0xef, 0x9f,
+ 0x7e, 0xfe, 0x9f, 0xf9, 0xff, 0xf7, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xf7, 0x9f, 0xff, 0xcf, 0xff, 0xef,
+ 0xdf, 0x6d, 0xfe, 0xfd, 0xe7, 0xbf, 0xf7, 0x6f,
+ 0xfe, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xf7, 0xee,
+ 0xfb, 0xaf, 0xff, 0xe7, 0xf5, 0xff, 0xdf, 0xfb,
+ 0x7f, 0xbd, 0xf7, 0xff, 0x9b, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xdf, 0xfb,
+ 0xff, 0xfb, 0xfd, 0xb7, 0xdf, 0x7f, 0xff, 0xff,
+ 0xff, 0xa6, 0xff, 0xef, 0xbf, 0xff, 0xfa, 0xfb,
+ 0xef, 0xbd, 0xff, 0xdf, 0xf7, 0xdf, 0x7f, 0xff,
+ 0xfd, 0x76, 0xd3, 0x7f, 0xed, 0xbf, 0xf9, 0xff,
+ 0xfc, 0xf3, 0xcf, 0x3f, 0xf7, 0xfc, 0xf3, 0xcf,
+ 0x7f, 0xfe, 0xf9, 0xe7, 0x9f, 0x7f, 0xfe, 0xfb,
+ 0x67, 0xff, 0x6f, 0xfe, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0x53, 0x7f, 0xff,
+ 0x74, 0xf7, 0x5e, 0x6f, 0xdf, 0xfd, 0xff, 0x9b,
+ 0xff, 0x9f, 0x7e, 0xfa, 0xe9, 0xa7, 0x9f, 0x7e,
+ 0xfa, 0xfd, 0xef, 0x3f, 0xfd, 0xfe, 0xd3, 0xef,
+ 0x3f, 0xfd, 0xf4, 0xff, 0xe6, 0xff, 0xf7, 0xdf,
+ 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xfd, 0xfb,
+ 0xef, 0xbf, 0xff, 0xbe, 0xfb, 0xee, 0xbe, 0xff,
+ 0xbf, 0xf9, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff,
+ 0xdf, 0x7f, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xdf, 0x7b, 0xff, 0xfd, 0xf6,
+ 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xef, 0x7f,
+ 0xfb, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x5f, 0x7f, 0xff, 0xeb, 0xef,
+ 0xf7, 0xfe, 0xfb, 0xbf, 0xff, 0xff, 0xff, 0xe6,
+ 0xff, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xef, 0xbf, 0xff, 0xbe, 0xfb, 0xef,
+ 0xbf, 0xff, 0xfe, 0xbf, 0xb9, 0xff, 0x37, 0xdf,
+ 0x7e, 0xf3, 0xed, 0xb7, 0xdd, 0x7e, 0xeb, 0xdb,
+ 0x6f, 0xbf, 0xfd, 0xf6, 0xdb, 0x6b, 0xbf, 0xe9,
+ 0x6f, 0xfe, 0xff, 0xf5, 0xdf, 0x7f, 0xff, 0xed,
+ 0xf5, 0xdf, 0x7f, 0xef, 0xfb, 0xef, 0xbf, 0xef,
+ 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0x9b, 0xff, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7,
+ 0xbf, 0xff, 0xfe, 0xfb, 0xe9, 0xbf, 0xff, 0xfe,
+ 0xfb, 0xef, 0xe6, 0xff, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xdf, 0x7f, 0xff,
+ 0xfd, 0xf7, 0xdb, 0x7f, 0xff, 0xfd, 0xbf, 0xf9,
+ 0xff, 0x2f, 0xbf, 0xfe, 0xf2, 0xab, 0xaf, 0xbf,
+ 0xfe, 0xfe, 0xf7, 0x5f, 0x7f, 0xff, 0xf5, 0xf7,
+ 0x5f, 0x7f, 0xf9, 0x6f, 0xfe, 0xff, 0xf9, 0xef,
+ 0xbf, 0xff, 0xfe, 0xf9, 0xef, 0xbf, 0xfb, 0xdd,
+ 0xf7, 0xdf, 0x7f, 0xdf, 0xfd, 0xf7, 0xdf, 0xff,
+ 0x9b, 0xff, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xff,
+ 0xfc, 0xf3, 0xcf, 0x79, 0xee, 0xf9, 0xe7, 0x9f,
+ 0x7f, 0xfe, 0xf9, 0xe7, 0xf7, 0xe6, 0xff, 0x5f,
+ 0x7f, 0xfd, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5,
+ 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0xad, 0xbf, 0xfe,
+ 0xfa, 0xbf, 0xf9, 0xff, 0x1b, 0x7f, 0xfd, 0xf1,
+ 0xd7, 0x5b, 0x7f, 0xfd, 0xe5, 0x2f, 0xbf, 0xfe,
+ 0xfa, 0xeb, 0xae, 0xbf, 0xfe, 0xf8, 0x6f, 0xee,
+ 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xf6, 0xfb,
+ 0x2f, 0x77, 0xbf, 0xf5, 0xf7, 0xdf, 0x5f, 0xfd,
+ 0xfd, 0xd7, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff,
+ 0xfd, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xff,
+ 0xe6, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0x7b,
+ 0xee, 0xbf, 0xf5, 0x6d, 0xf7, 0xdf, 0x76, 0xff,
+ 0x7d, 0xf7, 0xdf, 0xff, 0xbf, 0xf9, 0xbf, 0xfd,
+ 0xf5, 0xd7, 0x5f, 0x7f, 0xbd, 0xf5, 0x37, 0xdf,
+ 0xd9, 0xfa, 0x9b, 0xa9, 0xbf, 0x9f, 0xfa, 0xeb,
+ 0xef, 0x6f, 0xfe, 0xff
+};
+
+
+/* rom names */
+
+#define EPPAFSK_ROM_DIVROM0 0
+#define EPPAFSK_ROM_DIVROM1 16
+#define EPPAFSK_ROM_DIVROM2 32
+#define EPPAFSK_ROM_SWROMIE 48
+#define EPPAFSK_ROM_SWROMOE 64
+#define EPPAFSK_ROM_CLKSELROM 80
+#define EPPAFSK_ROM_PTTMUTEROM 96
+
+
+/* rom locations */
+static const unsigned long eppafsk_roms[112] = {
+ 37019, 36851, 37683, 37515, 37351, 37183, 38015, 37847,
+ 36853, 37017, 37517, 37681, 37185, 37349, 37849, 38013,
+ 25027, 24859, 25691, 25523, 25359, 25191, 26023, 25855,
+ 24861, 25025, 25525, 25689, 25193, 25357, 25857, 26021,
+ 58069, 58235, 58237, 58071, 57405, 57571, 57573, 57407,
+ 57737, 57903, 57905, 57739, 57073, 57239, 57241, 57075,
+ 31033, 30865, 31365, 31197, 31697, 31529, 32029, 31861,
+ 30867, 31031, 31199, 31363, 31531, 31695, 31863, 32027,
+ 25057, 24889, 25721, 25553, 25389, 25221, 26053, 25885,
+ 24891, 25055, 25555, 25719, 25223, 25387, 25887, 26051,
+ 15990, 15326, 16156, 15492, 16158, 15494, 15992, 15328,
+ 15658, 14994, 15824, 15160, 15826, 15162, 15660, 14996,
+ 31013, 30845, 31345, 31177, 31677, 31509, 32009, 31841,
+ 30847, 31011, 31179, 31343, 31511, 31675, 31843, 32007
+};
+
diff --git a/main/eppchk_firmware.h b/main/eppchk_firmware.h
new file mode 100644
index 0000000..24200e0
--- /dev/null
+++ b/main/eppchk_firmware.h
@@ -0,0 +1,1531 @@
+/*****************************************************************************/
+
+/*
+ * eppchk_firmware.h -- HDLC packet radio modem for EPP using FPGA utility.
+ *
+ * Copyright (C) 1998 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+/* automatically generated, do not edit */
+
+#define EPPCHK_FIRMWAREDATE "19990705"
+
+/* firmware */
+static const unsigned char eppchk_firmware[] = {
+ 0xff, 0x04, 0xe8, 0x8c, 0xf9, 0xfe, 0xff, 0xff,
+ 0xfd, 0xed, 0xd7, 0xdf, 0xfe, 0xfd, 0xfd, 0x7f,
+ 0xef, 0xfe, 0xf6, 0xee, 0x6f, 0xef, 0xfe, 0xf6,
+ 0xfe, 0x9b, 0xff, 0xff, 0xaf, 0xff, 0xfd, 0xfb,
+ 0xff, 0xaf, 0xff, 0x7f, 0xfe, 0xdf, 0xff, 0xff,
+ 0xfd, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xe6, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xf8, 0xed, 0xcf,
+ 0xff, 0xfe, 0xfb, 0xed, 0x8f, 0xdf, 0xfd, 0xf7,
+ 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 0x6f,
+ 0xfe, 0xff, 0xd7, 0x5f, 0x7b, 0xfd, 0xf5, 0xd7,
+ 0x5f, 0x7f, 0xf7, 0xeb, 0xaf, 0xbf, 0xfe, 0xfa,
+ 0xeb, 0xaf, 0xbf, 0xfe, 0x1b, 0xff, 0x6f, 0xed,
+ 0xf5, 0xd3, 0x5f, 0x7f, 0xed, 0xf5, 0xd7, 0xbe,
+ 0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 0xeb,
+ 0xff, 0xc6, 0xff, 0x3f, 0xff, 0xfc, 0xf3, 0xcf,
+ 0x3f, 0xff, 0xbc, 0xf3, 0x9f, 0x7f, 0xfe, 0xf9,
+ 0xe7, 0x9f, 0x7f, 0xfe, 0xf9, 0xbf, 0xf9, 0xff,
+ 0xef, 0xbe, 0xbf, 0xfe, 0xfb, 0xef, 0xbe, 0xff,
+ 0xda, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf,
+ 0x7f, 0xff, 0x6f, 0xfc, 0xff, 0xfb, 0xaf, 0xbf,
+ 0xfe, 0xfa, 0xfb, 0xaf, 0xbf, 0xff, 0xfd, 0xd7,
+ 0xdf, 0x7f, 0xfd, 0xfd, 0xd7, 0xdf, 0xff, 0x9b,
+ 0xff, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe,
+ 0xfb, 0xed, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xff, 0xe6, 0xff, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xed, 0xef,
+ 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe,
+ 0xbf, 0xf9, 0xff, 0xdf, 0x7f, 0xff, 0xfd, 0xf7,
+ 0xdf, 0x7d, 0xff, 0xfd, 0xef, 0xbf, 0xff, 0xfe,
+ 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0x6f, 0xf4, 0xff,
+ 0xed, 0xb7, 0xdf, 0x7e, 0xfb, 0xed, 0xb7, 0xd7,
+ 0xfe, 0xf6, 0xdb, 0x6f, 0xbf, 0xfd, 0xf6, 0xdb,
+ 0x6f, 0xfb, 0x9b, 0xff, 0x7f, 0xff, 0xfd, 0xf7,
+ 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xbd, 0xff, 0xfe,
+ 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xff, 0xe6,
+ 0xff, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f,
+ 0x7f, 0xfd, 0xaf, 0xbf, 0xff, 0xfe, 0xfb, 0xcf,
+ 0xbf, 0xff, 0xfe, 0xbf, 0xf9, 0xf7, 0xfc, 0xf3,
+ 0xcf, 0x3f, 0xff, 0xfc, 0xf3, 0xef, 0x7f, 0xfe,
+ 0xf9, 0xe7, 0x9f, 0x7f, 0xfe, 0xf9, 0xe7, 0xf7,
+ 0x6f, 0xf6, 0xff, 0xfd, 0xf7, 0xdf, 0x77, 0xff,
+ 0xfd, 0x77, 0xdf, 0xef, 0xfe, 0xfb, 0xee, 0xbf,
+ 0xff, 0xfe, 0xfb, 0xef, 0xf7, 0x9b, 0xdd, 0xcf,
+ 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xef, 0xfc,
+ 0xe7, 0x9e, 0x7f, 0xfe, 0x79, 0xe7, 0x9f, 0x7b,
+ 0xfe, 0xdd, 0x66, 0xff, 0xef, 0xbf, 0xff, 0xfe,
+ 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xf7, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xb7, 0xf9,
+ 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xef, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x77, 0xff,
+ 0xfd, 0xf7, 0xff, 0x6f, 0xfe, 0xbf, 0xfd, 0xf6,
+ 0xdb, 0x6f, 0xbf, 0xfd, 0xf6, 0xd9, 0xd7, 0x3e,
+ 0xfb, 0xed, 0xb7, 0xdf, 0x7e, 0xfb, 0xed, 0xf7,
+ 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff,
+ 0xff, 0xbf, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xdf,
+ 0xf7, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfe,
+ 0xff, 0x7f, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xfb,
+ 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x9b, 0xff, 0x7f, 0xff, 0xfd,
+ 0xf7, 0xdf, 0x7f, 0xff, 0xf5, 0xf7, 0xbf, 0xff,
+ 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xff,
+ 0xe6, 0xff, 0xff, 0xff, 0xfe, 0xfb, 0xff, 0xff,
+ 0xff, 0xfe, 0xff, 0xfc, 0xff, 0x5f, 0xfe, 0xff,
+ 0xe5, 0xff, 0xfb, 0xff, 0xbf, 0xf9, 0xff, 0xbf,
+ 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xfb, 0xaf,
+ 0xfe, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
+ 0xff, 0x6f, 0x7e, 0xdf, 0xff, 0xff, 0xff, 0xfd,
+ 0xff, 0x7f, 0xbf, 0xfe, 0xff, 0xff, 0xbf, 0xfb,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xdf,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xe6, 0xfd, 0xbd, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf,
+ 0x79, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xf6,
+ 0xdf, 0xff, 0x7f, 0xf4, 0xff, 0xd7, 0xff, 0xf7,
+ 0xfd, 0xff, 0xc7, 0xff, 0x6f, 0xfe, 0xf7, 0xdb,
+ 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xbf,
+ 0xff, 0xff, 0xf5, 0xff, 0xdf, 0xff, 0xff, 0xfd,
+ 0xff, 0x9b, 0xdf, 0xfb, 0xff, 0xff, 0xfe, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xfb, 0x2d, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff,
+ 0xff, 0xf7, 0xff, 0xff, 0x9f, 0x7f, 0x7f, 0xff,
+ 0xfd, 0xfe, 0xb7, 0xff, 0xff, 0xfb, 0xff, 0xff,
+ 0xff, 0xef, 0xbf, 0xf9, 0xff, 0xef, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xf7,
+ 0xff, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f,
+ 0xfe, 0xfb, 0xdf, 0xfd, 0xf3, 0xdf, 0xbf, 0x7e,
+ 0xf8, 0xfd, 0xf7, 0xff, 0xfe, 0xff, 0xbf, 0xff,
+ 0xfe, 0xff, 0xff, 0xff, 0x9b, 0xbf, 0xff, 0xff,
+ 0xfd, 0xfa, 0xdf, 0xff, 0xff, 0xfd, 0xff, 0xff,
+ 0x7f, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xe6, 0xaf, 0xef, 0xff, 0xff, 0xff, 0xff,
+ 0xfe, 0xff, 0xff, 0xff, 0xef, 0xdf, 0xfd, 0xf7,
+ 0xdf, 0x5f, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff,
+ 0xfb, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
+ 0xfd, 0xef, 0xf3, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0x6f, 0x7e, 0xff, 0xfd, 0xff, 0xff,
+ 0xff, 0xf7, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xfd,
+ 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x9b,
+ 0xff, 0xfc, 0xff, 0xfb, 0xef, 0xbf, 0xf5, 0xfe,
+ 0x9b, 0xff, 0x9f, 0xf3, 0xfd, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xa7, 0x66, 0x7f, 0xfd, 0xff,
+ 0xfe, 0xfb, 0x2f, 0xbf, 0xff, 0xfe, 0xff, 0x7d,
+ 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xb7, 0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0x7f, 0x6f, 0xde, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x5f, 0x99, 0xfb, 0xff, 0xfd, 0xf7, 0xdf,
+ 0x7f, 0xff, 0xfd, 0xf7, 0xff, 0xdf, 0xef, 0xb7,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x66,
+ 0xfe, 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xdd, 0x7d, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xb3, 0xa9, 0xbf, 0xcf, 0xbf,
+ 0xfc, 0xd6, 0xdb, 0xef, 0xff, 0xfc, 0xff, 0x9d,
+ 0xf7, 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xff,
+ 0x66, 0xee, 0xff, 0xc7, 0x5f, 0x7d, 0xfc, 0xed,
+ 0xf7, 0x4f, 0xfd, 0xdf, 0xaf, 0xff, 0xff, 0xff,
+ 0xf9, 0xff, 0xff, 0xff, 0xbf, 0x19, 0xf7, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xff,
+ 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xf7, 0xe6, 0xfd, 0x9f, 0x7f, 0xfe, 0xf9,
+ 0xe7, 0x9f, 0x7f, 0xfe, 0xff, 0xff, 0x7f, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbd, 0xb1,
+ 0xff, 0xe3, 0x8f, 0x3f, 0xfe, 0xf8, 0xe3, 0xcf,
+ 0xbf, 0xff, 0xbd, 0xf6, 0xdf, 0x7f, 0xff, 0xfd,
+ 0xf7, 0xdf, 0xff, 0x66, 0xee, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3b,
+ 0x9b, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x7f, 0xef, 0xe6, 0xfe, 0x4d,
+ 0x7d, 0xfc, 0xf1, 0xc7, 0x1f, 0x7d, 0xfc, 0xff,
+ 0xff, 0xdf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xbb, 0x61, 0xff, 0xe3, 0xbf, 0x7f, 0xfe,
+ 0xdb, 0xef, 0xbf, 0xff, 0xff, 0xff, 0xce, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x6f, 0xfe,
+ 0xff, 0xfe, 0xf7, 0xdf, 0x7d, 0xfb, 0xcd, 0xb7,
+ 0xff, 0xff, 0xef, 0xff, 0xff, 0xfe, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x9b, 0xff, 0xbf, 0xcf, 0x8f,
+ 0x3f, 0xfe, 0xf8, 0xe3, 0x3f, 0xff, 0xfc, 0xe7,
+ 0x9f, 0x7f, 0xfe, 0xf9, 0xe7, 0x9f, 0x7f, 0xfe,
+ 0xe6, 0xff, 0xef, 0x7f, 0xee, 0xb9, 0xe7, 0xfe,
+ 0x7b, 0xfe, 0xff, 0xfe, 0xbf, 0xff, 0xff, 0xf3,
+ 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xfb,
+ 0xff, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xfb, 0xff,
+ 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x6f, 0xfe, 0xff, 0xfe, 0xbf, 0xfe, 0xfa,
+ 0xeb, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1b, 0xfe,
+ 0xbf, 0xfd, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xe7,
+ 0xf7, 0xff, 0xff, 0xfb, 0xff, 0xef, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xe6, 0xff, 0xbf, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xf7,
+ 0xff, 0xfd, 0xff, 0xdf, 0x7f, 0xff, 0xff, 0xbf,
+ 0xf9, 0xff, 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf,
+ 0xbf, 0xfc, 0xa2, 0xd7, 0x5f, 0x7e, 0xf9, 0xd5,
+ 0xd7, 0x5f, 0x7f, 0xed, 0x6f, 0xfe, 0xff, 0xfc,
+ 0xf3, 0xcf, 0x3f, 0xf7, 0xfc, 0xb3, 0xff, 0xff,
+ 0xb7, 0xfe, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff,
+ 0xef, 0x1b, 0xff, 0xef, 0xef, 0xfe, 0xfb, 0xef,
+ 0xb7, 0x6f, 0xbe, 0xff, 0xff, 0xfb, 0xef, 0x7f,
+ 0xff, 0xff, 0xf7, 0xbf, 0xff, 0xbd, 0xa6, 0xff,
+ 0xef, 0xef, 0xbf, 0x7f, 0xfe, 0xfb, 0xff, 0xff,
+ 0xff, 0xff, 0x7b, 0xff, 0xf7, 0xff, 0xff, 0xfb,
+ 0xff, 0xff, 0xbf, 0x79, 0xff, 0x7f, 0xbf, 0xff,
+ 0xff, 0x7f, 0xff, 0xdf, 0x7f, 0xfb, 0xdb, 0xe5,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x67,
+ 0xfc, 0xff, 0x7f, 0xdf, 0xff, 0xff, 0xdb, 0xff,
+ 0xef, 0xff, 0xf7, 0xef, 0xfb, 0xff, 0xff, 0xef,
+ 0xff, 0xff, 0xff, 0xff, 0x99, 0xfb, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xfd, 0xff, 0xf7, 0xd3, 0xdf,
+ 0xdd, 0xff, 0xfd, 0xfe, 0xff, 0x3f, 0xff, 0xed,
+ 0xff, 0xc6, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0x3f, 0xef, 0xf9, 0x7f, 0x0d, 0xfe,
+ 0xff, 0xef, 0xf7, 0xbf, 0xff, 0x9f, 0xf9, 0xef,
+ 0xff, 0xff, 0xff, 0xef, 0xfb, 0xef, 0xff, 0xbf,
+ 0xbd, 0xed, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfd,
+ 0xff, 0xfb, 0x6f, 0xfe, 0xff, 0xff, 0xff, 0xff,
+ 0xdf, 0x9f, 0x3f, 0xfc, 0xe1, 0xf7, 0xdf, 0xff,
+ 0xf0, 0xfb, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x99,
+ 0xdf, 0xff, 0xff, 0xff, 0xef, 0xdf, 0xed, 0xf7,
+ 0xed, 0xf7, 0xff, 0xff, 0xf9, 0xfb, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xab, 0xaf,
+ 0xbf, 0xfe, 0xdf, 0xff, 0xdf, 0xb7, 0x8e, 0xf5,
+ 0xdf, 0xff, 0xff, 0x79, 0xef, 0xdf, 0x7f, 0xfe,
+ 0xbf, 0xf9, 0xf7, 0xf3, 0xee, 0xbf, 0xdf, 0xff,
+ 0xdf, 0x7f, 0xbf, 0xfd, 0x7d, 0xfe, 0xdf, 0x1f,
+ 0xbf, 0xff, 0xf6, 0xce, 0xff, 0x6f, 0xfe, 0xff,
+ 0x7e, 0xfd, 0xaf, 0xff, 0xd7, 0xff, 0xff, 0xaf,
+ 0x7f, 0x7b, 0xf7, 0xb7, 0xff, 0xff, 0x7f, 0xfe,
+ 0xfb, 0xff, 0x1b, 0xfe, 0x6c, 0xbe, 0xff, 0x63,
+ 0xbe, 0xff, 0xfe, 0xcf, 0x47, 0xfe, 0x5f, 0x67,
+ 0xf7, 0x6f, 0xfe, 0xdf, 0x4f, 0xef, 0x3f, 0x66,
+ 0x7f, 0xee, 0xbf, 0xff, 0xca, 0xff, 0xbf, 0xff,
+ 0xe7, 0xff, 0xff, 0xd7, 0xcb, 0xfb, 0x3f, 0xbf,
+ 0xdf, 0x7f, 0xff, 0xb7, 0xf9, 0xdf, 0x6b, 0xef,
+ 0xed, 0xfd, 0xfb, 0xff, 0xff, 0xfc, 0xfe, 0x3b,
+ 0xf5, 0x77, 0xff, 0xcf, 0xb9, 0xe7, 0x9e, 0xff,
+ 0x6f, 0xd6, 0x97, 0x5f, 0x7e, 0xf9, 0xff, 0xff,
+ 0xff, 0x3f, 0xff, 0xf9, 0xe7, 0xfd, 0xfd, 0xff,
+ 0x79, 0x2e, 0xbf, 0xec, 0x5f, 0x9b, 0xfb, 0xef,
+ 0x97, 0x5f, 0xfb, 0x7f, 0xff, 0xfd, 0xf7, 0xf7,
+ 0x3f, 0x4b, 0xb7, 0xef, 0xff, 0xff, 0x7f, 0xb9,
+ 0xfd, 0xee, 0x66, 0xfe, 0xaf, 0xb5, 0xda, 0xfa,
+ 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, 0x57, 0xff,
+ 0xfd, 0xff, 0xdf, 0xf7, 0xc2, 0x9f, 0xb3, 0xb1,
+ 0xff, 0xfb, 0xef, 0xef, 0xff, 0xfb, 0x6f, 0x7f,
+ 0xdd, 0xf7, 0xbe, 0xf5, 0xff, 0xfa, 0xaf, 0xbd,
+ 0xfc, 0xf6, 0xf7, 0x66, 0xee, 0xbf, 0xff, 0xfe,
+ 0xfb, 0xff, 0xfd, 0xb7, 0x4f, 0xdc, 0xf8, 0x46,
+ 0xfd, 0x1f, 0xfc, 0x7f, 0xe7, 0x1d, 0xf7, 0xbf,
+ 0x9b, 0xf7, 0xef, 0xbb, 0xef, 0xbf, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xbb, 0xd9, 0xff, 0xe7, 0xfb, 0xff,
+ 0xff, 0xdc, 0x73, 0xcf, 0xf7, 0xe6, 0xfd, 0xfb,
+ 0xec, 0xb3, 0xcf, 0xe7, 0x9f, 0x7f, 0xfe, 0xff,
+ 0xff, 0xff, 0xff, 0xfc, 0xff, 0x57, 0xfe, 0xf9,
+ 0xe5, 0xbd, 0xb1, 0xff, 0xfa, 0xeb, 0xaf, 0xff,
+ 0xf8, 0xe3, 0xcf, 0x77, 0xd7, 0xfb, 0xf7, 0x9b,
+ 0x7f, 0xff, 0xfd, 0xf5, 0xd7, 0xff, 0x66, 0xe6,
+ 0xbf, 0xff, 0xfe, 0xfb, 0xff, 0xff, 0xff, 0xbf,
+ 0xfd, 0xf7, 0xbf, 0xdf, 0xfe, 0xff, 0xef, 0x7f,
+ 0xef, 0xbd, 0x3f, 0x9b, 0xfb, 0x6f, 0xbf, 0xfd,
+ 0xf6, 0xff, 0xff, 0xff, 0xbb, 0xbb, 0xdf, 0xf7,
+ 0xf7, 0xf7, 0xff, 0x7d, 0xdf, 0x7e, 0xfb, 0xef,
+ 0xa6, 0xfe, 0xeb, 0xaf, 0xbf, 0xfe, 0xc7, 0x1f,
+ 0x7f, 0xdd, 0x79, 0xcf, 0xfb, 0xeb, 0x78, 0xbf,
+ 0xfd, 0xf7, 0xdf, 0xff, 0xab, 0x79, 0xff, 0xf2,
+ 0xcb, 0x2f, 0xff, 0xfb, 0xef, 0xbf, 0xff, 0xfe,
+ 0xf7, 0xef, 0x1f, 0xdf, 0xee, 0xb5, 0xdd, 0x77,
+ 0x7d, 0x6f, 0xfe, 0xdf, 0xff, 0xff, 0xff, 0x7d,
+ 0xff, 0xfd, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xef,
+ 0xf7, 0x7f, 0xff, 0xfd, 0xf7, 0xff, 0x9b, 0xff,
+ 0xff, 0xcb, 0x1f, 0x3f, 0xfc, 0xf0, 0xcb, 0x3f,
+ 0xff, 0xbc, 0xe7, 0x9f, 0x7d, 0xfc, 0xf1, 0x67,
+ 0x9f, 0x7d, 0xfe, 0xe6, 0xff, 0xff, 0xfe, 0xff,
+ 0xff, 0xe7, 0x9f, 0x7f, 0xff, 0xfd, 0xee, 0xdf,
+ 0xff, 0xfc, 0xff, 0xc7, 0xdf, 0x7f, 0xff, 0xbf,
+ 0xe1, 0xff, 0xff, 0xfe, 0xf7, 0xdf, 0x5f, 0xff,
+ 0xdf, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x7f,
+ 0xff, 0xf7, 0xdf, 0xff, 0x6f, 0xfe, 0xbf, 0xfe,
+ 0x7a, 0xea, 0xf8, 0xeb, 0xaf, 0xff, 0xdf, 0xff,
+ 0xfe, 0xff, 0xdf, 0xff, 0xdf, 0x7d, 0xf7, 0xdd,
+ 0xff, 0x9b, 0xfb, 0xaf, 0xbf, 0x0e, 0xba, 0x7c,
+ 0xf1, 0xe9, 0xf7, 0xdf, 0xff, 0xfe, 0xff, 0xfd,
+ 0xff, 0xdf, 0xdf, 0x7f, 0xff, 0xff, 0xe6, 0xfe,
+ 0xff, 0xff, 0xbf, 0xfd, 0xff, 0xff, 0xff, 0xbf,
+ 0xfc, 0xe9, 0xb7, 0x9f, 0xfe, 0xff, 0xe9, 0xff,
+ 0xff, 0xfd, 0xbf, 0xf9, 0xff, 0xaf, 0xbe, 0xde,
+ 0xfa, 0xeb, 0xaf, 0xbf, 0xde, 0xea, 0x96, 0x5f,
+ 0x7a, 0xfd, 0xb5, 0xc6, 0x5f, 0x7f, 0xfd, 0x6b,
+ 0xfa, 0xff, 0xff, 0xff, 0xdb, 0xfe, 0xef, 0xfc,
+ 0x3b, 0xcf, 0x7f, 0x32, 0xfe, 0xfb, 0xff, 0xff,
+ 0xfd, 0xff, 0xff, 0xff, 0x1b, 0xff, 0xf7, 0xff,
+ 0xff, 0xee, 0xff, 0xbf, 0xef, 0x3e, 0xfe, 0xef,
+ 0xfb, 0xff, 0xbf, 0xff, 0xfd, 0xf5, 0xf7, 0xff,
+ 0x7f, 0xe6, 0xff, 0xff, 0xfd, 0xfd, 0xef, 0xff,
+ 0xfb, 0xff, 0xff, 0x7e, 0xf7, 0x7b, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff,
+ 0xfa, 0xff, 0xaf, 0xdf, 0xdf, 0xf7, 0xdf, 0x67,
+ 0x7f, 0xfc, 0xf7, 0xff, 0x5f, 0x7b, 0xfe, 0xfd,
+ 0xd7, 0xfd, 0x6f, 0xfa, 0xff, 0x7e, 0xff, 0xef,
+ 0xff, 0xff, 0xff, 0xbf, 0x9f, 0xb7, 0xf7, 0xf7,
+ 0xff, 0xbf, 0xff, 0xdf, 0xfd, 0xab, 0xff, 0x9b,
+ 0xff, 0xef, 0xff, 0xef, 0xfe, 0xff, 0xff, 0x77,
+ 0xbe, 0xff, 0xdf, 0xdf, 0xff, 0xef, 0xfd, 0xcf,
+ 0x7f, 0xff, 0xfc, 0xff, 0xe6, 0xff, 0xff, 0xff,
+ 0xff, 0xfd, 0xf7, 0xdf, 0xef, 0xbb, 0xfb, 0xf9,
+ 0xff, 0xff, 0x7d, 0xed, 0x35, 0xe7, 0x5e, 0xbf,
+ 0xbf, 0xf9, 0xff, 0xbf, 0xff, 0xff, 0xef, 0xff,
+ 0xff, 0xfb, 0xbf, 0xbb, 0xfd, 0xff, 0x7f, 0xff,
+ 0xfd, 0xff, 0xf6, 0xff, 0xff, 0x6f, 0xfe, 0xff,
+ 0xff, 0xcf, 0xf7, 0xcf, 0x2f, 0xbf, 0xff, 0xf3,
+ 0x97, 0xbe, 0xf7, 0xff, 0x7f, 0xee, 0xff, 0xff,
+ 0xff, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xfd,
+ 0xdd, 0xbe, 0xeb, 0x7f, 0xf6, 0xbf, 0xff, 0xfb,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6,
+ 0xff, 0xef, 0xff, 0xff, 0xde, 0xfd, 0xf7, 0xbf,
+ 0xff, 0xb7, 0x31, 0x97, 0x7f, 0xff, 0xfd, 0xf7,
+ 0x97, 0x77, 0xff, 0xbf, 0xf1, 0x7f, 0xfb, 0xef,
+ 0xbf, 0xff, 0xff, 0xf7, 0xb7, 0xbe, 0xff, 0xfd,
+ 0xf6, 0xcd, 0x6f, 0xff, 0xdd, 0xf6, 0xdf, 0xff,
+ 0x67, 0xfe, 0xbf, 0xfe, 0xfb, 0xeb, 0xff, 0xdf,
+ 0xff, 0xef, 0xef, 0x7f, 0xff, 0xfe, 0xbb, 0xd7,
+ 0x9f, 0xfd, 0xf5, 0xd9, 0xff, 0x9b, 0xff, 0xef,
+ 0xbf, 0xff, 0xfe, 0xff, 0xbf, 0xe6, 0xff, 0x7f,
+ 0x3e, 0x5f, 0xfb, 0x85, 0x7d, 0xf6, 0xdf, 0x4b,
+ 0xff, 0xbf, 0x66, 0xff, 0xef, 0xbf, 0xff, 0xfe,
+ 0xff, 0x5b, 0xf9, 0xff, 0x9f, 0xef, 0xd7, 0xf2,
+ 0xc9, 0x3d, 0xf7, 0xdf, 0x73, 0xff, 0xb7, 0xd9,
+ 0xdf, 0x5b, 0x6f, 0xbd, 0xff, 0xff, 0xfb, 0xdf,
+ 0xf5, 0xff, 0x3b, 0xff, 0xdf, 0x7b, 0xee, 0xb9,
+ 0xe7, 0x9e, 0xff, 0x6f, 0xde, 0x97, 0x5f, 0x7e,
+ 0xf9, 0xff, 0xbf, 0x9f, 0x7f, 0xff, 0xfd, 0xcf,
+ 0xff, 0xff, 0xb2, 0xcb, 0x2e, 0xbf, 0xec, 0x5e,
+ 0x9b, 0xfb, 0xe7, 0xbf, 0x7f, 0xfe, 0x7d, 0xbf,
+ 0xd9, 0xb9, 0x77, 0x3c, 0x5f, 0xff, 0xad, 0x36,
+ 0xdb, 0x6d, 0xf9, 0x3d, 0xee, 0x66, 0xfe, 0xae,
+ 0xbf, 0xca, 0x1a, 0xff, 0xbb, 0xf5, 0xdf, 0x6f,
+ 0xff, 0x53, 0xff, 0x35, 0xef, 0xfd, 0xf7, 0xde,
+ 0xbf, 0xb3, 0xa9, 0xff, 0xfb, 0xef, 0xbf, 0xff,
+ 0xdb, 0x6b, 0xf5, 0xd9, 0xff, 0x3e, 0xff, 0xdf,
+ 0xdb, 0x7f, 0xef, 0xfd, 0xf6, 0xf7, 0x66, 0xee,
+ 0xbf, 0xff, 0xfe, 0xfb, 0xff, 0x85, 0x57, 0x77,
+ 0xde, 0xf5, 0xde, 0xff, 0x9f, 0xdd, 0x7f, 0xff,
+ 0x3d, 0xf7, 0xbf, 0x1b, 0xf7, 0xec, 0xbb, 0xef,
+ 0xfe, 0xdf, 0x7f, 0xff, 0x2e, 0xfb, 0xdb, 0xed,
+ 0xff, 0xfb, 0xbd, 0xf7, 0xdc, 0x53, 0xcf, 0x77,
+ 0xe6, 0x7d, 0xff, 0xfc, 0xf3, 0xff, 0xe7, 0x9f,
+ 0xff, 0xe7, 0xdf, 0xff, 0xfc, 0xff, 0x7c, 0xff,
+ 0x5d, 0xf6, 0xd9, 0xe5, 0xbd, 0xb1, 0xef, 0xfa,
+ 0xeb, 0xaf, 0xfd, 0xf8, 0x63, 0xdd, 0x77, 0xcf,
+ 0xfb, 0xf7, 0x9f, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7,
+ 0xef, 0x66, 0xee, 0xbf, 0xff, 0xfe, 0xfb, 0xff,
+ 0xff, 0x7f, 0xff, 0xfc, 0xf6, 0xff, 0xff, 0xff,
+ 0xf7, 0xde, 0x7b, 0xef, 0xbd, 0x39, 0x9b, 0xfb,
+ 0x6f, 0xbf, 0xfd, 0xfe, 0xff, 0xff, 0xfb, 0xbe,
+ 0x7b, 0xdf, 0xff, 0xff, 0xf7, 0xfd, 0xb7, 0xdf,
+ 0x7e, 0xbb, 0xef, 0xe6, 0xfe, 0xeb, 0xaf, 0xff,
+ 0xff, 0xd7, 0x1f, 0x7f, 0xff, 0xfd, 0xcf, 0xf6,
+ 0xfb, 0xf8, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 0xbb,
+ 0x79, 0xff, 0xf2, 0xcb, 0x7f, 0xff, 0xfb, 0xef,
+ 0xbf, 0xf7, 0xfe, 0xb7, 0xdd, 0x3e, 0xff, 0x6d,
+ 0xd7, 0xdd, 0x76, 0x7d, 0x6f, 0xfa, 0xff, 0x7f,
+ 0xff, 0xfd, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff,
+ 0x77, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xfd, 0xf7,
+ 0xff, 0x9b, 0xfe, 0xff, 0xcf, 0x1f, 0xbf, 0xfc,
+ 0xf0, 0xc3, 0x3f, 0xff, 0xbc, 0xc7, 0x8f, 0x7b,
+ 0xfe, 0xd9, 0x67, 0x9f, 0x7d, 0xfe, 0xe6, 0xff,
+ 0xff, 0xff, 0x9f, 0x7c, 0xf7, 0xdd, 0xf7, 0xff,
+ 0xf9, 0xee, 0xdf, 0x6f, 0x7c, 0xfd, 0xf7, 0xdf,
+ 0x7f, 0xff, 0xbf, 0xf9, 0xff, 0xff, 0xff, 0x23,
+ 0xcb, 0x1d, 0x7f, 0xfc, 0xff, 0xff, 0xfb, 0xf7,
+ 0xdf, 0x5f, 0xff, 0xfd, 0xf7, 0xdf, 0xff, 0x6f,
+ 0xfe, 0xbf, 0xfe, 0x7a, 0xea, 0xfb, 0xeb, 0xad,
+ 0xff, 0xff, 0xff, 0xff, 0xbd, 0xd7, 0x57, 0xdf,
+ 0x7d, 0xf7, 0xdd, 0xff, 0x1b, 0xfe, 0xaf, 0xbf,
+ 0xce, 0x32, 0x7f, 0xfd, 0xf5, 0xf7, 0xdf, 0xff,
+ 0x7e, 0xfb, 0xfd, 0xf5, 0xf7, 0xdf, 0x7f, 0xff,
+ 0xff, 0xe6, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xef,
+ 0xff, 0x4f, 0x3f, 0xfd, 0xfc, 0xfe, 0x5f, 0xfc,
+ 0xff, 0xff, 0x7e, 0xff, 0xff, 0xbf, 0xf9, 0xfd,
+ 0x8f, 0x3e, 0xfc, 0xf2, 0xeb, 0xaf, 0x37, 0x56,
+ 0x5a, 0x57, 0x5f, 0x74, 0xf9, 0xd5, 0xd7, 0x5f,
+ 0x7f, 0xfd, 0x6f, 0xfe, 0xff, 0xff, 0xff, 0xff,
+ 0x7f, 0xe7, 0xfc, 0xd3, 0xcf, 0xfb, 0xf7, 0xe7,
+ 0xe7, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x1b,
+ 0xff, 0xf7, 0xdf, 0xfd, 0x77, 0xf7, 0x97, 0xaf,
+ 0x7e, 0xb6, 0xfe, 0xfd, 0x7e, 0xf7, 0xff, 0xff,
+ 0xef, 0xff, 0xff, 0x7f, 0xe6, 0xff, 0xff, 0xff,
+ 0xff, 0xf9, 0xff, 0xbd, 0xff, 0xff, 0xbe, 0xff,
+ 0xfb, 0xbf, 0xff, 0xef, 0xbf, 0xff, 0xff, 0xff,
+ 0x9f, 0xf1, 0x7b, 0xfa, 0xeb, 0xaf, 0xf3, 0xff,
+ 0xf7, 0xcf, 0xbd, 0x7f, 0xfd, 0xf5, 0xd5, 0xdf,
+ 0x5d, 0xfd, 0xd5, 0xf7, 0xff, 0x67, 0xf6, 0xbf,
+ 0xbe, 0xfb, 0xa9, 0xfb, 0xff, 0xff, 0xfd, 0xf6,
+ 0x7f, 0xff, 0xfd, 0xf3, 0xbf, 0x5e, 0xdf, 0xfa,
+ 0xf7, 0xff, 0x99, 0xff, 0x9f, 0x3f, 0xfe, 0xbb,
+ 0x67, 0xbf, 0xff, 0xfc, 0x9b, 0xb7, 0xdb, 0xfe,
+ 0xeb, 0xf2, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xe6,
+ 0xff, 0xeb, 0xaf, 0xfd, 0xff, 0xfa, 0xd3, 0xcf,
+ 0x3f, 0xef, 0xf5, 0xff, 0xff, 0x7d, 0xfb, 0x6f,
+ 0xbf, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xff, 0x7d,
+ 0x7f, 0xfd, 0xff, 0xfb, 0xfb, 0xef, 0xef, 0xff,
+ 0xbf, 0xff, 0x7e, 0xff, 0xe7, 0xff, 0xfb, 0xff,
+ 0x6f, 0xfe, 0x3f, 0xfb, 0xfc, 0xf0, 0xcf, 0x3f,
+ 0xfe, 0xfc, 0xe2, 0xf5, 0xfe, 0xff, 0xff, 0xff,
+ 0xbf, 0xbf, 0xfb, 0xff, 0xff, 0x9b, 0xff, 0x7d,
+ 0xf7, 0xdd, 0xf7, 0xde, 0x7f, 0x1f, 0xff, 0xbb,
+ 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xdf, 0xff, 0xff,
+ 0xff, 0xff, 0xe6, 0xdf, 0xc5, 0x5f, 0x7b, 0xef,
+ 0xf0, 0xeb, 0xad, 0xbd, 0xbe, 0xf7, 0xbf, 0xff,
+ 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xff, 0xbf, 0xf9,
+ 0xff, 0x7b, 0xff, 0xbf, 0xff, 0xef, 0xfb, 0xff,
+ 0xf7, 0x7d, 0xf5, 0xff, 0xff, 0xbf, 0xbe, 0xe7,
+ 0xff, 0xff, 0xff, 0x6f, 0xfe, 0x9f, 0xfe, 0xff,
+ 0xef, 0xff, 0xff, 0xde, 0xff, 0xff, 0xdf, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xdf, 0xff,
+ 0x1b, 0xfe, 0xff, 0xff, 0xff, 0xda, 0xff, 0xf5,
+ 0xe7, 0xcf, 0xff, 0xbf, 0xff, 0xff, 0xfb, 0xff,
+ 0x5f, 0xff, 0xfd, 0xff, 0x3f, 0x66, 0xff, 0xfb,
+ 0xef, 0xbf, 0xf7, 0x7e, 0xfe, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x7c, 0xff,
+ 0xff, 0xb7, 0xf9, 0xff, 0xff, 0xff, 0xaf, 0xff,
+ 0x5f, 0xff, 0xdf, 0x79, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0x3d, 0xf7, 0xff, 0xff, 0x6f, 0xd6,
+ 0xbf, 0xff, 0xfe, 0xeb, 0xef, 0xff, 0xdf, 0x7f,
+ 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef,
+ 0xfd, 0xff, 0x5f, 0x9b, 0xfb, 0xbf, 0xbd, 0xff,
+ 0xda, 0xed, 0x77, 0xc7, 0xb9, 0xb7, 0xb5, 0xff,
+ 0xfb, 0xff, 0xfd, 0xda, 0xe2, 0xfb, 0xff, 0xed,
+ 0x66, 0xfe, 0x6b, 0xaf, 0xbf, 0x2e, 0x7a, 0xfc,
+ 0xf6, 0xd7, 0x5f, 0xe7, 0xff, 0xff, 0xff, 0xf5,
+ 0xde, 0x7b, 0xff, 0xff, 0xb3, 0xb1, 0xff, 0xfb,
+ 0xfb, 0x2f, 0xfd, 0xfe, 0x7d, 0xf7, 0xdf, 0x77,
+ 0xbb, 0xde, 0xfe, 0xcb, 0xdf, 0x35, 0xf7, 0xff,
+ 0xff, 0x66, 0xee, 0xbf, 0xfe, 0xfa, 0xab, 0xaf,
+ 0xff, 0x8d, 0x77, 0xdf, 0x78, 0xfe, 0x1f, 0xff,
+ 0xdf, 0xff, 0xcb, 0x85, 0xff, 0xbf, 0x9b, 0xf7,
+ 0xff, 0xfd, 0x67, 0x9f, 0x7d, 0xbf, 0xff, 0x2e,
+ 0xfb, 0xbb, 0xfd, 0xfe, 0xff, 0xff, 0xbf, 0xe5,
+ 0xfe, 0xff, 0xf7, 0xe6, 0xfd, 0xff, 0xff, 0xf6,
+ 0xdb, 0xef, 0xff, 0xfd, 0xf7, 0xdf, 0xdf, 0x3a,
+ 0xff, 0xff, 0x3f, 0xcf, 0x3e, 0xfb, 0xff, 0xbd,
+ 0xb1, 0x5f, 0xfb, 0xef, 0xb6, 0xd0, 0xfe, 0xf7,
+ 0xdc, 0x7e, 0xd3, 0xdd, 0xc7, 0xdf, 0x7f, 0xff,
+ 0x71, 0xe7, 0xdd, 0xff, 0x66, 0xe6, 0xdf, 0x77,
+ 0xdf, 0x7e, 0xff, 0xdd, 0x6f, 0xff, 0xfd, 0xff,
+ 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x3f, 0x9b, 0xfb, 0xfb, 0xef, 0xff, 0xff, 0xff,
+ 0xbe, 0xf7, 0xbe, 0xfb, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xfd, 0xff, 0xef, 0xa6, 0xfe,
+ 0xef, 0xaf, 0xbf, 0xfe, 0xfb, 0x9f, 0x7f, 0xde,
+ 0xf9, 0xe5, 0x3f, 0xff, 0xff, 0xff, 0x8f, 0x3f,
+ 0xfe, 0xff, 0xab, 0x79, 0xff, 0xeb, 0xab, 0xa6,
+ 0xb6, 0xeb, 0xef, 0xbd, 0xff, 0x56, 0xd1, 0xdf,
+ 0xff, 0xff, 0xbe, 0xf3, 0xcf, 0xff, 0x7f, 0x6f,
+ 0xfe, 0xf7, 0xce, 0xfb, 0xe9, 0xbf, 0xff, 0xfb,
+ 0xff, 0xdf, 0x5f, 0xff, 0xf7, 0xff, 0xdf, 0xff,
+ 0xee, 0xf7, 0xff, 0xff, 0x9b, 0xff, 0xbf, 0x8f,
+ 0x3f, 0xfa, 0xf8, 0xf3, 0xcf, 0x3d, 0xff, 0xd4,
+ 0xe3, 0x9f, 0x7f, 0xf6, 0xf9, 0xe7, 0x9f, 0x7f,
+ 0xf6, 0xe6, 0xff, 0xef, 0xff, 0xbf, 0xfe, 0xfb,
+ 0xff, 0x7f, 0xff, 0xf9, 0xf4, 0xbb, 0xff, 0xff,
+ 0xff, 0xc5, 0xd7, 0xff, 0xff, 0xbf, 0xf9, 0xff,
+ 0xfe, 0xff, 0xaf, 0xff, 0xfe, 0xff, 0xdf, 0xff,
+ 0x7f, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfd, 0xf5,
+ 0xff, 0xff, 0x6f, 0xfe, 0xdf, 0xfa, 0xeb, 0xaf,
+ 0xbf, 0xfe, 0xff, 0xff, 0xff, 0x5f, 0xef, 0xfb,
+ 0xff, 0xdf, 0xff, 0xfd, 0xf7, 0xff, 0xff, 0x9b,
+ 0xff, 0xef, 0xbf, 0xff, 0xfa, 0xef, 0xff, 0xfd,
+ 0xf7, 0xdf, 0xd3, 0xfe, 0xfb, 0xff, 0xf7, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xd3, 0x2f,
+ 0xbf, 0xff, 0xf6, 0x8b, 0xef, 0xff, 0xff, 0xfe,
+ 0xff, 0xf7, 0xff, 0xff, 0xe9, 0xa7, 0xff, 0xdd,
+ 0xbf, 0xe9, 0xff, 0xae, 0x37, 0xfe, 0xaa, 0xeb,
+ 0xad, 0xb7, 0x76, 0xfa, 0x17, 0x1f, 0x7e, 0xf1,
+ 0xf5, 0xd7, 0x4f, 0x7f, 0xfd, 0x6b, 0xfe, 0xff,
+ 0xff, 0x6f, 0x85, 0xec, 0xff, 0xff, 0xff, 0xff,
+ 0x7e, 0xf6, 0xfb, 0xff, 0xfb, 0x2f, 0xfe, 0xfc,
+ 0xff, 0xff, 0x1b, 0xff, 0xf7, 0xff, 0xff, 0xbf,
+ 0xff, 0xfa, 0xdb, 0xef, 0xbf, 0xd6, 0xdd, 0xef,
+ 0xff, 0xef, 0xef, 0xfb, 0xfd, 0xbf, 0x7f, 0x26,
+ 0xfe, 0xff, 0xff, 0x9f, 0x7e, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb,
+ 0xdf, 0xff, 0xff, 0xbf, 0xf9, 0xbf, 0x78, 0xff,
+ 0xcf, 0x3b, 0x5f, 0xfe, 0xfb, 0xaf, 0x77, 0xed,
+ 0xef, 0xff, 0xff, 0x7f, 0xb4, 0xe1, 0xbf, 0xff,
+ 0x6f, 0xfe, 0x7f, 0xb7, 0xff, 0xff, 0xff, 0xff,
+ 0xfd, 0xeb, 0xea, 0x7f, 0xf7, 0xff, 0x7f, 0xff,
+ 0xfb, 0xdf, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff,
+ 0x7f, 0xee, 0xbf, 0xff, 0xff, 0x7b, 0xfe, 0xf7,
+ 0xf7, 0xff, 0xff, 0xff, 0x7f, 0xd7, 0xcf, 0xff,
+ 0xff, 0xff, 0xe6, 0xff, 0xdf, 0xff, 0xbf, 0xff,
+ 0xff, 0xfd, 0xfb, 0xfd, 0xf9, 0xfe, 0xbf, 0xf9,
+ 0xff, 0xf3, 0xb1, 0xf7, 0xff, 0xff, 0xbf, 0xf9,
+ 0xff, 0xff, 0x3f, 0xed, 0xfa, 0xdf, 0xff, 0x7f,
+ 0xf7, 0x9f, 0xf7, 0xbf, 0xff, 0xfe, 0xff, 0x7f,
+ 0xf7, 0x7f, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xfc,
+ 0xbd, 0xd3, 0xff, 0x7f, 0xff, 0xff, 0x9f, 0x7f,
+ 0xfe, 0xfe, 0x7f, 0xff, 0xbe, 0xfb, 0xfe, 0xff,
+ 0x9b, 0xff, 0xff, 0xef, 0xce, 0xef, 0xdf, 0xff,
+ 0xff, 0xff, 0xdf, 0xbf, 0x77, 0xff, 0xff, 0xfe,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xe9,
+ 0x8f, 0xff, 0xff, 0xf7, 0xff, 0xb9, 0xf7, 0xff,
+ 0xe3, 0x6f, 0x7f, 0xff, 0xff, 0xf7, 0xdf, 0x5f,
+ 0xfe, 0xbf, 0xf1, 0xff, 0xfb, 0xef, 0xbf, 0xff,
+ 0x7f, 0xef, 0xf7, 0xff, 0xff, 0xed, 0xdf, 0xff,
+ 0xff, 0x3b, 0xfc, 0xff, 0xdb, 0xff, 0x67, 0xfe,
+ 0x7f, 0xfb, 0xfd, 0xef, 0xff, 0xf7, 0xff, 0xff,
+ 0xff, 0x5f, 0xff, 0xf7, 0xfd, 0xff, 0xff, 0x7d,
+ 0xff, 0xf7, 0xfb, 0x9b, 0xf3, 0xff, 0xff, 0xff,
+ 0xfb, 0xbf, 0xbf, 0xfe, 0xfb, 0xff, 0x5f, 0xfe,
+ 0xff, 0x3d, 0x7f, 0xde, 0xfe, 0xff, 0xff, 0xbf,
+ 0x66, 0xff, 0xff, 0xff, 0xbf, 0xff, 0x6f, 0xfa,
+ 0xef, 0xfe, 0xf7, 0x9d, 0xff, 0x5f, 0xcf, 0x3f,
+ 0xfd, 0xff, 0xdf, 0xfb, 0xb7, 0xd9, 0xff, 0x7f,
+ 0xea, 0x3f, 0xff, 0xff, 0xeb, 0xff, 0xac, 0xff,
+ 0xfd, 0xff, 0xdf, 0xff, 0xff, 0xf9, 0xbf, 0xfa,
+ 0xff, 0x6f, 0xdc, 0xff, 0xdf, 0xfa, 0xbb, 0xff,
+ 0xbf, 0xff, 0x7e, 0xeb, 0xdf, 0xff, 0xfe, 0xf5,
+ 0xff, 0xdf, 0xfe, 0x9f, 0xff, 0x5e, 0x99, 0xfb,
+ 0xff, 0xaf, 0xf7, 0x5e, 0x7d, 0xbf, 0xd9, 0x34,
+ 0xff, 0x9f, 0xee, 0xfe, 0xfd, 0xff, 0xff, 0x5f,
+ 0xbf, 0x7f, 0x6e, 0x66, 0xfe, 0xff, 0xef, 0xbd,
+ 0x67, 0xff, 0xbb, 0xa5, 0xef, 0xfb, 0xbd, 0xb9,
+ 0x5f, 0xfd, 0xff, 0xdf, 0x72, 0xe7, 0x8d, 0xb3,
+ 0xa9, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xcb, 0x2b,
+ 0x6f, 0xaf, 0xff, 0x2d, 0xee, 0xde, 0xff, 0xff,
+ 0xff, 0xf5, 0xfd, 0xf9, 0x66, 0xec, 0xff, 0xff,
+ 0xfe, 0xfb, 0xff, 0x95, 0x57, 0xc2, 0xeb, 0xdf,
+ 0xe2, 0x1b, 0xf5, 0xff, 0xff, 0x7f, 0xff, 0xff,
+ 0xba, 0x9b, 0xf7, 0xff, 0xff, 0xc7, 0xdf, 0xdf,
+ 0x7f, 0xff, 0xfd, 0xbf, 0xf9, 0xff, 0xf6, 0xdf,
+ 0xfe, 0xff, 0xf8, 0xb7, 0xff, 0x77, 0xe6, 0xfd,
+ 0xff, 0xfd, 0xff, 0xdf, 0xe7, 0x9f, 0xfd, 0xf6,
+ 0x9f, 0xdf, 0xbc, 0xeb, 0xcf, 0xff, 0xff, 0xff,
+ 0xfb, 0xed, 0x9d, 0xb1, 0xff, 0xfb, 0xee, 0xbf,
+ 0xfb, 0xf8, 0xa3, 0xef, 0xbe, 0xff, 0xad, 0x66,
+ 0xdb, 0x7e, 0xff, 0xfd, 0x76, 0xda, 0xfd, 0x66,
+ 0xee, 0xff, 0x7f, 0xdf, 0x7d, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xf7, 0xbf, 0xdf, 0xfe, 0xff, 0xff,
+ 0x9b, 0xff, 0xfe, 0x3f, 0x9b, 0xfb, 0xff, 0xfb,
+ 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x7f,
+ 0xf7, 0xef, 0xff, 0xff, 0xff, 0xfd, 0xdf, 0xf7,
+ 0xef, 0xe6, 0xfe, 0xe9, 0xaf, 0xff, 0xde, 0xc7,
+ 0x0b, 0x3f, 0xbd, 0xff, 0x97, 0x7f, 0x5f, 0xff,
+ 0xbf, 0xfd, 0xff, 0x7f, 0xff, 0xbb, 0x61, 0xff,
+ 0x72, 0xbb, 0xef, 0xfe, 0x5b, 0xe2, 0xaf, 0x66,
+ 0xdf, 0xf3, 0xef, 0x97, 0xff, 0x7f, 0xf7, 0xef,
+ 0x57, 0x7f, 0x6f, 0xfe, 0xbb, 0xfe, 0x3b, 0xef,
+ 0xff, 0xfe, 0xdb, 0xfb, 0xff, 0xff, 0xf6, 0xf7,
+ 0xfd, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xff, 0x9b,
+ 0xff, 0xaf, 0xcf, 0x3f, 0xfb, 0xfc, 0xf3, 0xcf,
+ 0x3e, 0xff, 0xfc, 0xe7, 0x1f, 0x7d, 0xfe, 0xd9,
+ 0xe7, 0x1f, 0x3d, 0xfe, 0xe6, 0xff, 0xeb, 0xaf,
+ 0xff, 0xfe, 0xf7, 0xcb, 0xaf, 0xbf, 0xff, 0xce,
+ 0xff, 0x5f, 0xff, 0xff, 0xfd, 0xff, 0x7f, 0xbc,
+ 0xbf, 0xe1, 0xff, 0xfa, 0xfb, 0xef, 0xff, 0xfd,
+ 0xfa, 0xeb, 0xef, 0xff, 0xff, 0xff, 0xd7, 0xff,
+ 0x7f, 0xff, 0xfd, 0xd7, 0xfb, 0x6f, 0xfe, 0xff,
+ 0xfe, 0xeb, 0xaf, 0xff, 0xff, 0xfd, 0xff, 0xff,
+ 0xff, 0x7f, 0xff, 0xf5, 0xff, 0x7f, 0x7d, 0xfd,
+ 0xf5, 0xff, 0x9b, 0xfb, 0xaf, 0xff, 0xff, 0xfb,
+ 0x7f, 0xff, 0xfd, 0xf7, 0xff, 0xfb, 0x7e, 0x7f,
+ 0xfd, 0xef, 0xdf, 0x5f, 0x7f, 0xad, 0xff, 0xe6,
+ 0xff, 0xff, 0xef, 0xbf, 0xff, 0xff, 0xff, 0xef,
+ 0xfe, 0xff, 0xbe, 0xff, 0xdf, 0xdf, 0xff, 0xff,
+ 0x97, 0xdf, 0xfd, 0xbf, 0xf9, 0xff, 0xaf, 0xbb,
+ 0xe6, 0xf2, 0x8b, 0x2f, 0xba, 0xf8, 0x92, 0x47,
+ 0x5f, 0x7e, 0xed, 0xb5, 0xd7, 0x5a, 0x74, 0xfd,
+ 0x6f, 0xfe, 0xff, 0xff, 0xff, 0xcf, 0x3e, 0xff,
+ 0xfd, 0xff, 0x7f, 0x7f, 0xfd, 0xff, 0xfa, 0xff,
+ 0xff, 0xff, 0xdf, 0xff, 0xfe, 0x1b, 0xff, 0xf7,
+ 0xf7, 0xbf, 0xfd, 0xee, 0xd7, 0xdf, 0x7f, 0xff,
+ 0xff, 0xfd, 0xed, 0xf7, 0xff, 0xff, 0xf7, 0xff,
+ 0xff, 0x7f, 0xa6, 0xde, 0x7f, 0xff, 0xff, 0xfe,
+ 0xfe, 0xff, 0xf7, 0xdf, 0x5d, 0xf7, 0xfb, 0xf1,
+ 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfd, 0x9f, 0xf9,
+ 0xff, 0x7a, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xeb,
+ 0xff, 0xff, 0xf5, 0xf7, 0x97, 0xfd, 0xed, 0xbf,
+ 0xfd, 0xdb, 0xff, 0x67, 0xfc, 0xe7, 0xfe, 0xdf,
+ 0xff, 0xff, 0xff, 0xbf, 0xfb, 0xbe, 0xfe, 0xf7,
+ 0xff, 0xee, 0xfe, 0xff, 0xff, 0xfd, 0x3d, 0xfe,
+ 0x98, 0xf7, 0xef, 0xff, 0xef, 0xdf, 0xcf, 0xbf,
+ 0xbf, 0xff, 0xfb, 0xd7, 0x5b, 0x77, 0xef, 0xbf,
+ 0xcf, 0x7f, 0xdf, 0xfd, 0x7f, 0x46, 0xef, 0xdb,
+ 0x77, 0xfb, 0xff, 0xfc, 0x77, 0x7f, 0x3f, 0xf6,
+ 0xdd, 0xa5, 0xff, 0xff, 0xff, 0xed, 0xa6, 0xfd,
+ 0xff, 0xbf, 0xf9, 0xff, 0x7b, 0xff, 0xff, 0xff,
+ 0xfe, 0xff, 0xfe, 0xff, 0x7f, 0xf3, 0xbd, 0xfe,
+ 0xff, 0x7f, 0xff, 0xd7, 0xbf, 0xff, 0x6f, 0xfe,
+ 0xff, 0xff, 0xff, 0xf3, 0xff, 0xcf, 0x7f, 0xf5,
+ 0xfd, 0xd6, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff,
+ 0xf3, 0xff, 0xbb, 0x9b, 0xff, 0xf9, 0xff, 0xff,
+ 0xfb, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xf7, 0xef,
+ 0xff, 0x97, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff,
+ 0xe6, 0xff, 0xdf, 0x7b, 0x7f, 0xfd, 0xff, 0xff,
+ 0xff, 0xd3, 0x4e, 0x77, 0xd7, 0x7f, 0xbf, 0xbd,
+ 0xf6, 0x9f, 0x67, 0xfe, 0xbf, 0xf9, 0xff, 0xfb,
+ 0xdf, 0xfe, 0xdf, 0x7e, 0xff, 0xff, 0xdf, 0xf7,
+ 0xed, 0xbf, 0xfd, 0x3f, 0xff, 0xfc, 0xf4, 0xcf,
+ 0xfd, 0x6f, 0xfe, 0xff, 0xee, 0xff, 0xff, 0xdf,
+ 0xff, 0xff, 0x7f, 0xff, 0x9f, 0xf7, 0xff, 0xfd,
+ 0x5f, 0xbf, 0x7f, 0xff, 0xd7, 0xff, 0x1b, 0xfe,
+ 0xff, 0xff, 0xcb, 0xef, 0xbf, 0xbf, 0xd4, 0xfb,
+ 0xef, 0xbf, 0xfe, 0xcf, 0xff, 0xfd, 0xff, 0xff,
+ 0x7f, 0xfd, 0x3f, 0x66, 0xff, 0xff, 0xf5, 0xd6,
+ 0xfd, 0xef, 0xbf, 0x7c, 0xff, 0xfb, 0xff, 0xff,
+ 0xde, 0x7f, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xb7,
+ 0xf9, 0x5f, 0xf2, 0xff, 0xff, 0x97, 0xff, 0xfb,
+ 0xff, 0xec, 0x7f, 0xfd, 0xff, 0xf4, 0x4b, 0xcf,
+ 0xff, 0xff, 0xdc, 0xfe, 0x6f, 0xd6, 0xb3, 0xfe,
+ 0xff, 0xff, 0xbf, 0xff, 0xff, 0x7f, 0xfa, 0x5f,
+ 0xcf, 0xff, 0xf5, 0xd4, 0xf9, 0xff, 0x9f, 0xf7,
+ 0x5f, 0x9b, 0xfb, 0xef, 0xfe, 0xf7, 0xdf, 0x4f,
+ 0x2f, 0xdd, 0xf7, 0xd3, 0xf7, 0x7f, 0xb6, 0xbf,
+ 0xfc, 0xff, 0xcf, 0x3a, 0xfd, 0xee, 0x66, 0xfe,
+ 0xfb, 0xff, 0xff, 0xff, 0xde, 0x7b, 0xf3, 0xff,
+ 0xfe, 0xdd, 0xbf, 0xcd, 0x2d, 0xf7, 0x5d, 0x91,
+ 0x43, 0x8d, 0xb3, 0xb1, 0xff, 0x7e, 0xbd, 0xfc,
+ 0xbe, 0xf6, 0xfa, 0xfe, 0xa5, 0x7d, 0xbf, 0xff,
+ 0xf7, 0x5f, 0xff, 0xff, 0xfd, 0xff, 0xff, 0x66,
+ 0xee, 0xbf, 0x5f, 0x5f, 0x7d, 0x2f, 0xbd, 0xf5,
+ 0x0f, 0x0b, 0xdf, 0xc7, 0xfb, 0xf5, 0xd7, 0xff,
+ 0x7f, 0xf3, 0xf7, 0x3f, 0x9b, 0xf7, 0xff, 0xfd,
+ 0xfd, 0xf7, 0xdf, 0x7c, 0xdb, 0xfd, 0xb7, 0xfb,
+ 0xfd, 0xf6, 0xdf, 0x7e, 0xff, 0xfd, 0xfe, 0xdf,
+ 0xb7, 0xe6, 0xfd, 0xbf, 0x7f, 0xfe, 0xf9, 0x6f,
+ 0xbf, 0x7f, 0xfe, 0x5b, 0xff, 0xfa, 0xeb, 0xff,
+ 0xbf, 0xfe, 0x7b, 0xff, 0xaf, 0xbd, 0xb1, 0xff,
+ 0xfb, 0x8f, 0x3f, 0xfe, 0xea, 0xeb, 0xcf, 0xbf,
+ 0xc7, 0xdd, 0x27, 0xdb, 0x6e, 0xf7, 0xad, 0xc6,
+ 0xda, 0xf6, 0x66, 0xe6, 0xdf, 0xf7, 0xff, 0xff,
+ 0xf7, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbf, 0x7f,
+ 0xfe, 0xfd, 0xef, 0xbf, 0xff, 0xfe, 0x3f, 0x9b,
+ 0xfb, 0xfe, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
+ 0xfb, 0xff, 0xfe, 0xf7, 0xf7, 0xff, 0xff, 0xfe,
+ 0xfd, 0xdf, 0xff, 0xef, 0xa6, 0xde, 0xef, 0x7d,
+ 0xf4, 0xf1, 0xd3, 0x4f, 0x7f, 0xfc, 0xf4, 0xfd,
+ 0x9f, 0x7f, 0x7f, 0xfd, 0xff, 0x97, 0x5b, 0xff,
+ 0xab, 0x79, 0xdf, 0xaa, 0xbf, 0xff, 0xb6, 0xfa,
+ 0x6b, 0xbf, 0xbf, 0x7a, 0xf9, 0xee, 0x92, 0x5f,
+ 0xfe, 0xbb, 0xdd, 0x56, 0x7f, 0x6f, 0xfe, 0xf7,
+ 0xfe, 0xef, 0xff, 0xff, 0xbf, 0xfe, 0x7f, 0xef,
+ 0x5f, 0xff, 0xff, 0xf5, 0xf7, 0xef, 0xef, 0xdd,
+ 0x75, 0xff, 0x9b, 0xff, 0xaf, 0xcf, 0x6f, 0xb7,
+ 0xed, 0xa4, 0xd3, 0x3d, 0xfb, 0xd4, 0xe7, 0x1f,
+ 0x7d, 0xf4, 0xd9, 0xc7, 0x1f, 0x7d, 0xfe, 0xe6,
+ 0xff, 0xff, 0xff, 0xff, 0xfd, 0xfb, 0xff, 0x7f,
+ 0xbe, 0xfe, 0xe4, 0xff, 0x5f, 0x7f, 0xfd, 0xff,
+ 0xd7, 0x7f, 0xff, 0xbf, 0xf9, 0xff, 0xfe, 0xff,
+ 0xf7, 0x9f, 0x5e, 0x7f, 0xfd, 0xaf, 0x7f, 0xf9,
+ 0xff, 0xd7, 0x5f, 0xff, 0xff, 0xf5, 0xf5, 0xff,
+ 0x6f, 0xfe, 0xdf, 0xfb, 0xbf, 0xdc, 0xf2, 0x8b,
+ 0x2f, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xf5, 0xd7,
+ 0xff, 0x7f, 0xfd, 0xf7, 0xff, 0x9b, 0xff, 0xef,
+ 0xff, 0xc7, 0x1f, 0x6f, 0xed, 0xf5, 0xf7, 0xdf,
+ 0x93, 0xff, 0x7f, 0xf9, 0xf5, 0xff, 0x5f, 0x73,
+ 0xed, 0xff, 0x66, 0xff, 0xcf, 0xff, 0xff, 0xff,
+ 0xff, 0xcf, 0xff, 0xfe, 0xbc, 0xfd, 0x97, 0xbf,
+ 0x7e, 0xef, 0xfd, 0xa7, 0xdf, 0xff, 0xbf, 0xe9,
+ 0xdf, 0x2f, 0xbe, 0xfa, 0xea, 0xab, 0x2f, 0xbe,
+ 0xfc, 0xba, 0xd7, 0x5b, 0x7f, 0xdd, 0x75, 0xd7,
+ 0x5b, 0x34, 0xfc, 0x6b, 0xfe, 0xdf, 0xff, 0xd7,
+ 0xcf, 0x7e, 0xf7, 0xf6, 0xff, 0xee, 0xbf, 0xbf,
+ 0xbf, 0xfe, 0xff, 0xfb, 0xaf, 0xdf, 0xff, 0xff,
+ 0x1b, 0xff, 0x7f, 0xbf, 0xfd, 0xfe, 0x7b, 0xf7,
+ 0xff, 0xef, 0x7f, 0x7f, 0xff, 0xe7, 0x1f, 0xde,
+ 0xff, 0xff, 0xb7, 0xfb, 0x5e, 0xe6, 0xdf, 0xff,
+ 0xff, 0x67, 0x7f, 0xff, 0xf5, 0xff, 0x7f, 0xdf,
+ 0xef, 0xfb, 0xee, 0xff, 0xdf, 0xef, 0xff, 0xfd,
+ 0xff, 0xbf, 0xf9, 0xdf, 0xff, 0xfd, 0xff, 0xfd,
+ 0xff, 0xb3, 0xde, 0xaf, 0x7f, 0xf5, 0xf7, 0x67,
+ 0xdb, 0x7f, 0x7d, 0xdd, 0x46, 0xff, 0x6b, 0xfe,
+ 0xff, 0xff, 0x7f, 0xff, 0xfb, 0x7d, 0xff, 0xff,
+ 0xda, 0x37, 0x7f, 0xdf, 0xff, 0xbf, 0x6f, 0xd5,
+ 0xfd, 0xfb, 0xff, 0x9b, 0xff, 0xff, 0xef, 0xff,
+ 0xdf, 0xff, 0xff, 0xfb, 0xf7, 0xff, 0xff, 0x39,
+ 0xff, 0xdf, 0xef, 0xf6, 0x7f, 0xff, 0xb7, 0xff,
+ 0xe6, 0xdd, 0xff, 0x7b, 0xdf, 0xff, 0xf7, 0x9f,
+ 0xff, 0xff, 0xfd, 0xfe, 0xd7, 0xfd, 0xfe, 0xff,
+ 0xbf, 0xbe, 0x5f, 0xbf, 0xb7, 0xb9, 0xff, 0xff,
+ 0xff, 0xff, 0xfe, 0xfb, 0xef, 0xff, 0xfb, 0xbd,
+ 0xef, 0xbf, 0xfa, 0xfb, 0xff, 0xff, 0x2f, 0x7f,
+ 0xfa, 0x6f, 0xfe, 0xdf, 0xdf, 0x5f, 0xfd, 0xd7,
+ 0xdd, 0x7f, 0xfa, 0xfd, 0xf6, 0x3f, 0xf4, 0xf1,
+ 0xff, 0xff, 0xbd, 0xff, 0x7e, 0xff, 0x9b, 0xfd,
+ 0xff, 0xdf, 0xff, 0xff, 0xef, 0xff, 0xff, 0xef,
+ 0xff, 0xff, 0xff, 0xf6, 0xed, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xfe, 0xe6, 0xff, 0xff, 0xff, 0xef,
+ 0xff, 0xff, 0xff, 0xff, 0xdf, 0x6e, 0xff, 0xdf,
+ 0x7f, 0xbf, 0xdd, 0x7e, 0xfb, 0x6f, 0xfe, 0xbf,
+ 0xf1, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x17,
+ 0x7f, 0xbf, 0xfc, 0xeb, 0xfb, 0xef, 0xed, 0xfb,
+ 0xf7, 0xff, 0xcd, 0xfb, 0x63, 0xfe, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xfe,
+ 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7,
+ 0xff, 0x9b, 0xff, 0xff, 0x97, 0xf7, 0xff, 0xbf,
+ 0xff, 0xff, 0xcf, 0x6b, 0x5d, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x2f, 0xfd, 0xbf, 0x66, 0xff,
+ 0xff, 0xec, 0xbf, 0x5f, 0xff, 0xfb, 0xff, 0xbf,
+ 0x9b, 0xdd, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff,
+ 0x58, 0xff, 0xb7, 0xd9, 0xff, 0xff, 0xfb, 0xff,
+ 0xff, 0xfb, 0xff, 0xff, 0xfc, 0x73, 0x3f, 0xaf,
+ 0xff, 0xff, 0xff, 0x3b, 0xff, 0xdf, 0xf9, 0x6f,
+ 0xde, 0xff, 0xff, 0xfe, 0xfb, 0xff, 0xbf, 0xff,
+ 0x7f, 0xff, 0xdc, 0x67, 0xfe, 0xfb, 0xef, 0xbf,
+ 0xed, 0xbf, 0x75, 0x5e, 0x9b, 0xfb, 0xf5, 0xbf,
+ 0xf7, 0x9b, 0x7d, 0xbf, 0xd9, 0xb7, 0x9b, 0xdd,
+ 0xea, 0xf8, 0xff, 0xff, 0xbf, 0xf7, 0xdf, 0xcb,
+ 0xee, 0x66, 0xbe, 0xfd, 0xef, 0xbe, 0x66, 0xff,
+ 0x6b, 0xf6, 0xbf, 0x5b, 0xdd, 0x7b, 0xeb, 0xff,
+ 0xff, 0xef, 0x7f, 0xff, 0xb5, 0xb3, 0xa9, 0xff,
+ 0xff, 0xbb, 0xbf, 0xff, 0xdb, 0xfb, 0x7f, 0xac,
+ 0x72, 0x27, 0x7f, 0xfe, 0xeb, 0xef, 0xbb, 0xfd,
+ 0x9f, 0xfe, 0x66, 0xee, 0xff, 0xff, 0x1e, 0xeb,
+ 0xff, 0x85, 0xfe, 0xcf, 0x6b, 0xd5, 0xc3, 0xb7,
+ 0xff, 0xfe, 0xe3, 0x8e, 0xfd, 0xc5, 0xbf, 0x1b,
+ 0xf7, 0xff, 0xff, 0x6d, 0x3f, 0xdf, 0xff, 0xdb,
+ 0xfd, 0xf7, 0xbf, 0xf9, 0xdf, 0x7f, 0x7f, 0xfe,
+ 0xed, 0xff, 0xdb, 0x77, 0xe6, 0x5d, 0xff, 0x7f,
+ 0xfe, 0xff, 0xe7, 0xff, 0x79, 0xfe, 0xf9, 0xcf,
+ 0x7e, 0xfb, 0xcf, 0x3f, 0xef, 0xff, 0xfb, 0xac,
+ 0xb5, 0xb1, 0xef, 0xfb, 0x8f, 0xb7, 0xff, 0x78,
+ 0xfb, 0xcd, 0x35, 0xd6, 0xd1, 0x16, 0x9a, 0x7f,
+ 0xfa, 0xf9, 0x77, 0xdf, 0xe3, 0x66, 0xee, 0xff,
+ 0xff, 0xff, 0xfc, 0xff, 0xcf, 0x3f, 0xff, 0xfd,
+ 0xff, 0xb7, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff,
+ 0xfe, 0x3b, 0x9b, 0xfb, 0xff, 0xff, 0xdf, 0xff,
+ 0xff, 0xfd, 0xf7, 0xdb, 0xff, 0xff, 0xf7, 0xf7,
+ 0xdf, 0xff, 0xfe, 0xf7, 0xdf, 0x77, 0xef, 0xe6,
+ 0xfe, 0xff, 0x2f, 0xfc, 0xfe, 0xc7, 0xef, 0x3f,
+ 0xbc, 0xf0, 0x87, 0x7a, 0x4f, 0x7d, 0xf5, 0xce,
+ 0xf7, 0x7f, 0xfe, 0xbb, 0x79, 0xff, 0x7f, 0x89,
+ 0xed, 0xfe, 0xfb, 0x6e, 0x99, 0x3f, 0x76, 0xb3,
+ 0xce, 0x97, 0x6f, 0xfe, 0xfb, 0xe7, 0x5f, 0x7f,
+ 0x6f, 0xfa, 0xff, 0xff, 0xff, 0xeb, 0x7f, 0xbf,
+ 0xde, 0xf3, 0xa9, 0x5e, 0xed, 0xfb, 0xd5, 0x57,
+ 0xef, 0x3d, 0xff, 0x7f, 0xdf, 0x9b, 0xfe, 0xff,
+ 0xcf, 0x0d, 0xba, 0xfc, 0xa3, 0x8f, 0x3f, 0xfb,
+ 0xd4, 0xe7, 0x17, 0x3d, 0xf4, 0xd8, 0x41, 0x8f,
+ 0x5f, 0xfe, 0xe6, 0xff, 0xff, 0x2f, 0xf7, 0xfe,
+ 0xe7, 0xef, 0x3f, 0xdf, 0xfe, 0xf6, 0xff, 0x5f,
+ 0x3f, 0xfd, 0x7e, 0xfa, 0x6b, 0xff, 0xbf, 0xf9,
+ 0x6f, 0xff, 0xeb, 0xe7, 0xdf, 0xff, 0xfe, 0xfb,
+ 0xff, 0x7f, 0xff, 0xff, 0xd5, 0x5f, 0xdf, 0x7f,
+ 0xff, 0xd7, 0xf7, 0x6f, 0xfe, 0xff, 0xff, 0xb7,
+ 0xfe, 0xfa, 0xef, 0xff, 0xf3, 0xef, 0xff, 0x7f,
+ 0xdf, 0xf5, 0xd6, 0xfb, 0x7f, 0xff, 0x77, 0xff,
+ 0x1b, 0xfe, 0xff, 0xff, 0x27, 0x1f, 0x7c, 0xfa,
+ 0xbd, 0xd7, 0xdf, 0xfb, 0xfe, 0x7b, 0xbf, 0x75,
+ 0xde, 0xd9, 0x7f, 0xef, 0xff, 0xe6, 0xff, 0xff,
+ 0xed, 0x3f, 0xfd, 0xef, 0x93, 0xff, 0xff, 0xff,
+ 0xfc, 0xa7, 0xff, 0xff, 0xef, 0xff, 0xff, 0x97,
+ 0xea, 0xbf, 0xf9, 0xff, 0xaf, 0x37, 0x7c, 0xf2,
+ 0xab, 0x0f, 0xbf, 0xfa, 0xe0, 0x96, 0x1f, 0x7d,
+ 0xfd, 0xb5, 0xd7, 0x5f, 0x73, 0xfd, 0x6f, 0xfe,
+ 0xef, 0x7f, 0xf7, 0xf7, 0xff, 0x7e, 0xf3, 0xb7,
+ 0xcf, 0x7f, 0xf8, 0xfe, 0xff, 0xff, 0xff, 0xfe,
+ 0xdf, 0xdf, 0xff, 0x1b, 0xfd, 0xfe, 0xbb, 0xdf,
+ 0xff, 0xfe, 0xf7, 0x5f, 0x6d, 0xfe, 0x17, 0xff,
+ 0xff, 0xcf, 0xff, 0x77, 0xfe, 0xff, 0xef, 0x7f,
+ 0xe6, 0xff, 0xfe, 0xf6, 0xdf, 0x75, 0xdf, 0xfd,
+ 0xff, 0xdb, 0xea, 0x7f, 0xbf, 0xff, 0xaf, 0xef,
+ 0xff, 0xff, 0xfe, 0xff, 0xbf, 0xf1, 0xff, 0xff,
+ 0x7f, 0xcd, 0xff, 0xff, 0x7b, 0xfe, 0xcf, 0xff,
+ 0x7d, 0xe7, 0xd7, 0x5e, 0xd6, 0xe7, 0xe9, 0xde,
+ 0xfe, 0x67, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfb,
+ 0xef, 0xff, 0xff, 0xfe, 0xf7, 0xdf, 0xfe, 0xeb,
+ 0x5f, 0xff, 0xdf, 0xff, 0xff, 0xff, 0x9b, 0xbf,
+ 0xff, 0xf3, 0xff, 0xf7, 0xef, 0xef, 0xdb, 0xdf,
+ 0xd7, 0xb7, 0xfe, 0xc7, 0x9f, 0xfd, 0xff, 0x35,
+ 0x77, 0xdf, 0xbf, 0xe6, 0xff, 0xdd, 0x7f, 0xbf,
+ 0xfe, 0x77, 0xdf, 0x7d, 0xff, 0xef, 0xde, 0xfe,
+ 0xff, 0xef, 0x9b, 0xef, 0xf7, 0xef, 0xff, 0xbf,
+ 0xf9, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xb5, 0xff,
+ 0xfd, 0xf7, 0xf7, 0x6f, 0x9f, 0x7e, 0xff, 0xfd,
+ 0xbf, 0xbc, 0xff, 0xfb, 0x6f, 0xfe, 0xef, 0xff,
+ 0xff, 0xf3, 0xff, 0x37, 0xd7, 0xbf, 0xff, 0xdf,
+ 0xef, 0xff, 0xbe, 0x43, 0xff, 0xf9, 0xbf, 0xff,
+ 0xff, 0x9b, 0xff, 0xff, 0xff, 0xdf, 0xfb, 0xff,
+ 0xaf, 0xff, 0xff, 0xdf, 0xf7, 0xf5, 0xff, 0xf7,
+ 0x97, 0x7b, 0xfd, 0xff, 0xff, 0xdf, 0x66, 0xff,
+ 0xff, 0xfe, 0x7f, 0xbf, 0xe3, 0xff, 0xff, 0xf7,
+ 0x4f, 0xff, 0xdf, 0xf9, 0xf5, 0xf5, 0xff, 0xdf,
+ 0x6d, 0xaf, 0xbf, 0xf9, 0xff, 0xff, 0xff, 0x7b,
+ 0x3f, 0x56, 0xff, 0xfd, 0x7e, 0xff, 0xcf, 0xa1,
+ 0xfd, 0xbf, 0xfd, 0xff, 0xf3, 0xd7, 0xff, 0x6f,
+ 0xfe, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xfb, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xfd, 0xfd, 0xfb, 0x9b, 0xff, 0xfc, 0xf1,
+ 0xc1, 0x2f, 0xbf, 0x78, 0xf4, 0x95, 0xd7, 0xff,
+ 0xf2, 0xef, 0x7b, 0xff, 0xfe, 0xf2, 0xef, 0x8f,
+ 0xff, 0xa6, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xff,
+ 0xbf, 0xff, 0xfe, 0xfa, 0xdf, 0xff, 0xff, 0x2f,
+ 0xf5, 0xff, 0xdf, 0xff, 0xff, 0xbf, 0xd9, 0xff,
+ 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xdf, 0xec,
+ 0xff, 0xfb, 0xff, 0xff, 0x59, 0xfe, 0xff, 0xfd,
+ 0xff, 0xff, 0x6d, 0xfe, 0xff, 0xff, 0xff, 0xff,
+ 0xbf, 0xff, 0xff, 0xff, 0xaf, 0xff, 0x2f, 0xbf,
+ 0xfc, 0xd4, 0xff, 0xe6, 0xff, 0xff, 0x5f, 0x1b,
+ 0xf5, 0xff, 0xff, 0xff, 0x3f, 0xfb, 0xff, 0xff,
+ 0xff, 0xfe, 0xff, 0xd9, 0x67, 0x9f, 0xf5, 0xef,
+ 0xf9, 0xff, 0xff, 0x57, 0xe6, 0x7e, 0xfd, 0xff,
+ 0xbf, 0xfe, 0x9a, 0x7d, 0xff, 0xfd, 0x76, 0xbf,
+ 0x9f, 0x7e, 0x7a, 0xcf, 0xde, 0xdf, 0xff, 0xff,
+ 0xbb, 0x91, 0x5f, 0xff, 0xff, 0xaf, 0xbe, 0x66,
+ 0xff, 0xff, 0xef, 0xee, 0xff, 0xb7, 0xdf, 0x5e,
+ 0xbd, 0xff, 0x5f, 0xfb, 0xff, 0x64, 0xec, 0xff,
+ 0xff, 0xff, 0xeb, 0xbf, 0xff, 0xf7, 0x4f, 0xad,
+ 0xff, 0x65, 0xfd, 0xf5, 0xd7, 0xe3, 0xef, 0xfd,
+ 0xff, 0xbf, 0x19, 0xf9, 0xff, 0xff, 0xff, 0xfa,
+ 0xfb, 0xff, 0xfc, 0xc7, 0xde, 0xff, 0x4a, 0x7e,
+ 0xf9, 0x15, 0xfe, 0xf7, 0xff, 0xff, 0xef, 0x86,
+ 0xbd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xef, 0xbf, 0xf9, 0xe6, 0xdb, 0xee,
+ 0xff, 0xf9, 0xe7, 0xbd, 0x69, 0x5f, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xe7, 0x9f, 0x7f, 0xfe, 0xf3,
+ 0xdf, 0x7e, 0xfb, 0xec, 0x3f, 0xff, 0xfc, 0x73,
+ 0x67, 0xae, 0xef, 0x7e, 0xfb, 0xef, 0xb7, 0xff,
+ 0xfc, 0xe3, 0x8f, 0x7f, 0xfc, 0x75, 0xd7, 0x9d,
+ 0x77, 0xfb, 0xed, 0xf7, 0xbb, 0x99, 0xf8, 0xff,
+ 0xdb, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xbf,
+ 0xdf, 0xef, 0xe6, 0xf6, 0xff, 0xfe, 0xff, 0xdf,
+ 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xef, 0xf7, 0xff, 0xff, 0xfb, 0xff, 0xbb, 0xb9,
+ 0xff, 0xff, 0xef, 0xff, 0xbf, 0xfe, 0xd2, 0x5f,
+ 0x7f, 0xf5, 0xeb, 0xe5, 0x97, 0xfb, 0xb8, 0xff,
+ 0xfd, 0xdf, 0xff, 0x6e, 0xde, 0xff, 0xff, 0xf6,
+ 0xff, 0xef, 0xbe, 0xf8, 0xef, 0xbf, 0xff, 0x7d,
+ 0xb5, 0xd5, 0x3e, 0xff, 0x7e, 0xfb, 0xef, 0xdf,
+ 0x9b, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xeb, 0xaf,
+ 0xf7, 0xff, 0xbf, 0xff, 0xdd, 0xff, 0xff, 0x7f,
+ 0xf7, 0xdf, 0xbf, 0xfd, 0xff, 0xe6, 0xff, 0xff,
+ 0xe3, 0xcb, 0x0f, 0xfe, 0xe8, 0xf1, 0xc3, 0x0f,
+ 0x7f, 0xf0, 0xe5, 0x9f, 0x7b, 0xfc, 0xf9, 0xe7,
+ 0x9f, 0xbf, 0xf9, 0xff, 0xff, 0xcf, 0xf6, 0xdb,
+ 0x7e, 0xe7, 0x9d, 0x77, 0x9e, 0xf3, 0xf6, 0xdb,
+ 0xff, 0xfc, 0xff, 0xfd, 0xdf, 0xff, 0x6f, 0xfe,
+ 0xff, 0xff, 0xfe, 0xfc, 0xf3, 0xcf, 0x3f, 0x7f,
+ 0xfc, 0xf1, 0x8f, 0x7d, 0xfc, 0xdf, 0xff, 0x7f,
+ 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xbc,
+ 0x7f, 0xee, 0xfb, 0xe7, 0xaf, 0xbf, 0xfe, 0xf5,
+ 0xd7, 0xfd, 0xff, 0xd7, 0xff, 0xff, 0xff, 0xff,
+ 0xe6, 0xff, 0xff, 0x6f, 0xf3, 0xff, 0x1f, 0x7f,
+ 0xfc, 0xf5, 0xd7, 0xbe, 0xfe, 0xd8, 0xfb, 0xef,
+ 0xf5, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xff,
+ 0xff, 0xff, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xbf,
+ 0xff, 0xfd, 0x97, 0xdf, 0xfe, 0xff, 0xed, 0xff,
+ 0xf3, 0x6d, 0xfe, 0xff, 0xeb, 0xaf, 0xbe, 0xfc,
+ 0xfa, 0xe3, 0xaf, 0xbe, 0xea, 0xd5, 0x16, 0x5b,
+ 0x77, 0xed, 0x55, 0xd7, 0x5f, 0xfb, 0x9b, 0xff,
+ 0xff, 0xf7, 0xbc, 0xff, 0xbf, 0xbf, 0xd7, 0xcd,
+ 0xf3, 0xdf, 0xfd, 0xf9, 0xbf, 0xdd, 0x9f, 0xdf,
+ 0xff, 0xff, 0xff, 0xc6, 0xff, 0xde, 0x6f, 0xfb,
+ 0xff, 0x9f, 0x6d, 0xef, 0x5f, 0xfc, 0xf7, 0xfb,
+ 0xef, 0xb7, 0x7f, 0xfd, 0xfb, 0xff, 0xdf, 0x9f,
+ 0xf9, 0xff, 0xff, 0xf7, 0xfd, 0xfd, 0xff, 0xef,
+ 0xfd, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xfe, 0xff,
+ 0xfd, 0xbf, 0xfe, 0xff, 0x6f, 0xfc, 0xff, 0xff,
+ 0xbf, 0xff, 0xbf, 0xb5, 0xff, 0xff, 0xfe, 0xff,
+ 0xfe, 0xb5, 0xfd, 0xdf, 0x7f, 0x5f, 0xff, 0xb5,
+ 0xff, 0x99, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff,
+ 0x7b, 0xff, 0xff, 0x7f, 0xfe, 0xf7, 0xf7, 0x7b,
+ 0xfd, 0xf3, 0x7f, 0xff, 0x4d, 0xff, 0xe6, 0xff,
+ 0xfd, 0xbf, 0xff, 0xfc, 0xfe, 0xff, 0x7c, 0xff,
+ 0xf1, 0x6f, 0xf7, 0x7f, 0xf7, 0xff, 0xff, 0xff,
+ 0xcf, 0xff, 0xaf, 0xf9, 0xf3, 0xff, 0xdf, 0xdf,
+ 0xff, 0xfd, 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xff,
+ 0xc7, 0x5f, 0x7d, 0xed, 0x6d, 0xd7, 0xff, 0x6f,
+ 0xfa, 0xff, 0xff, 0x97, 0xff, 0xff, 0xdf, 0xff,
+ 0xfb, 0xbf, 0xef, 0xf9, 0xaf, 0xff, 0xfa, 0xff,
+ 0xdb, 0xfd, 0xff, 0xfe, 0x9b, 0xff, 0xff, 0xff,
+ 0xbf, 0xff, 0xf3, 0xfd, 0xdf, 0xff, 0x1f, 0xff,
+ 0x99, 0xf7, 0xfe, 0x5f, 0xfe, 0xff, 0xbc, 0xff,
+ 0xff, 0xe6, 0xff, 0xff, 0xfe, 0xff, 0xdf, 0xd6,
+ 0x3f, 0xfe, 0xdf, 0x37, 0xff, 0xbb, 0xbf, 0xfb,
+ 0xff, 0xff, 0xfe, 0xfb, 0xff, 0xbf, 0xb9, 0xff,
+ 0x7f, 0xdf, 0x7f, 0xfb, 0xef, 0x7f, 0xfd, 0xb8,
+ 0xf3, 0x5f, 0xf3, 0x9f, 0x7b, 0xff, 0xfd, 0x7e,
+ 0xdf, 0xef, 0x6f, 0xee, 0xff, 0xff, 0xf7, 0xff,
+ 0xf5, 0xff, 0xff, 0xdb, 0xef, 0x7f, 0xfb, 0xeb,
+ 0xcf, 0x9d, 0x7f, 0xbf, 0xf7, 0xd7, 0xff, 0x9b,
+ 0xfd, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xfe, 0xfc,
+ 0xfe, 0xea, 0xdf, 0xdb, 0x7f, 0xef, 0x55, 0xd7,
+ 0xed, 0x7f, 0xfd, 0xff, 0x86, 0xff, 0xff, 0xff,
+ 0xfd, 0xff, 0xee, 0xff, 0xbf, 0xfd, 0xff, 0xff,
+ 0x3f, 0xff, 0xfc, 0xed, 0xff, 0xf7, 0x7f, 0xff,
+ 0x8f, 0xd9, 0xff, 0xff, 0xfb, 0xff, 0xbf, 0xfd,
+ 0xfe, 0xfb, 0xff, 0xff, 0xbf, 0xee, 0xbf, 0xdf,
+ 0xff, 0xff, 0xff, 0xd7, 0xff, 0x6d, 0xfe, 0xff,
+ 0xff, 0xff, 0xff, 0xef, 0xff, 0x5e, 0x7b, 0xf9,
+ 0xd5, 0xcf, 0xff, 0xfd, 0xda, 0xf3, 0x2f, 0xff,
+ 0xf5, 0xff, 0x9b, 0xf5, 0xff, 0xbf, 0xff, 0xff,
+ 0xfb, 0xad, 0xb3, 0xcf, 0x3e, 0xf7, 0xf9, 0xff,
+ 0x9d, 0xfd, 0xfc, 0x7f, 0x6f, 0xfd, 0xd7, 0xe6,
+ 0xfe, 0xff, 0xbf, 0x99, 0xf6, 0xde, 0xfe, 0x75,
+ 0xd9, 0xf4, 0xa7, 0xff, 0x7f, 0xaf, 0xcb, 0x7e,
+ 0xb3, 0x57, 0xaf, 0xbb, 0x99, 0xff, 0xff, 0x6b,
+ 0xa6, 0xbe, 0xfb, 0xee, 0x7d, 0xbf, 0xfd, 0xed,
+ 0xdf, 0x77, 0xeb, 0xab, 0xb7, 0x66, 0x53, 0xed,
+ 0x6c, 0xec, 0xff, 0xff, 0xfb, 0xab, 0xec, 0xd7,
+ 0xbe, 0xfa, 0xeb, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7,
+ 0xff, 0x7f, 0xbf, 0xf4, 0xbf, 0x99, 0xfb, 0xff,
+ 0xbf, 0xfe, 0x7a, 0x39, 0xac, 0xbf, 0xfc, 0xf2,
+ 0x97, 0x5f, 0x7f, 0xfd, 0xe5, 0xdf, 0x7f, 0x7f,
+ 0xfd, 0xcf, 0xe6, 0xfd, 0xff, 0xff, 0xff, 0xfd,
+ 0xf7, 0xff, 0x7f, 0xf3, 0xcd, 0x6f, 0xfe, 0xf9,
+ 0xb7, 0x9b, 0xff, 0xbf, 0xff, 0xff, 0xad, 0x79,
+ 0xff, 0xff, 0xff, 0x79, 0xfe, 0xf9, 0xff, 0xbf,
+ 0xfd, 0xf6, 0xb7, 0xff, 0xfc, 0xfb, 0xed, 0xbf,
+ 0xff, 0xfe, 0x7b, 0x6f, 0xe8, 0xff, 0x7e, 0xfb,
+ 0x8f, 0x3f, 0xd7, 0xf6, 0xeb, 0xac, 0x7b, 0x8d,
+ 0xfd, 0x76, 0x5f, 0x77, 0xf3, 0x79, 0xf6, 0xbd,
+ 0x99, 0xf9, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xf7,
+ 0xff, 0x3f, 0xff, 0xff, 0xef, 0xb7, 0xff, 0xff,
+ 0xff, 0xff, 0xb7, 0xff, 0xcf, 0xe6, 0xfe, 0xff,
+ 0xfd, 0xff, 0xff, 0xef, 0xfe, 0xff, 0xef, 0xff,
+ 0x7f, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xfb,
+ 0xff, 0xbb, 0xa9, 0x7f, 0xfa, 0xef, 0x6f, 0xbe,
+ 0xf4, 0xfb, 0xcb, 0x3f, 0x7f, 0xf9, 0xf5, 0xf7,
+ 0x5f, 0xfe, 0xff, 0xcf, 0xf7, 0xff, 0x6a, 0xde,
+ 0xbf, 0xdc, 0xee, 0x9b, 0x2d, 0xfe, 0xfc, 0x6a,
+ 0xab, 0x5f, 0x7d, 0xf9, 0xe5, 0x57, 0xff, 0xbe,
+ 0xfb, 0xef, 0xdf, 0x9b, 0xff, 0xaf, 0xbf, 0x7e,
+ 0x6e, 0xeb, 0xb6, 0xbf, 0xdf, 0xff, 0xf7, 0x5f,
+ 0x7f, 0xfd, 0x7d, 0xf3, 0xff, 0xfd, 0xff, 0xff,
+ 0xe6, 0xff, 0xeb, 0xa3, 0x87, 0x1f, 0x7a, 0xec,
+ 0xe1, 0x87, 0x0f, 0xfd, 0xd8, 0x41, 0x1f, 0x7f,
+ 0xfc, 0xf9, 0xe7, 0x9f, 0xbf, 0xf9, 0xff, 0xff,
+ 0xef, 0x77, 0x97, 0x58, 0xfb, 0xed, 0xb7, 0x9f,
+ 0xfd, 0xf4, 0xd3, 0x7f, 0xff, 0xff, 0xff, 0xf7,
+ 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xfe, 0xfc, 0xa3,
+ 0x8f, 0x3f, 0xfb, 0xe8, 0x73, 0x1f, 0x7d, 0xf4,
+ 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xff,
+ 0xff, 0xff, 0x9f, 0xf7, 0xea, 0xbb, 0xe7, 0x9f,
+ 0x3f, 0xfe, 0x53, 0x47, 0xfd, 0xff, 0xf7, 0x5f,
+ 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xf1,
+ 0xe7, 0x9a, 0xfb, 0xfc, 0xb1, 0xc7, 0x3f, 0x96,
+ 0x5d, 0xff, 0xef, 0xfd, 0xd7, 0xff, 0xff, 0xbf,
+ 0xf9, 0xff, 0xff, 0xcb, 0xff, 0xef, 0xf9, 0xf2,
+ 0xff, 0x2f, 0x2f, 0xf9, 0xff, 0xfd, 0xff, 0x7f,
+ 0x7a, 0xe9, 0xf7, 0xff, 0x6f, 0xfa, 0xff, 0xcb,
+ 0xae, 0xbf, 0xf6, 0x7a, 0x6b, 0xaf, 0xb9, 0xce,
+ 0xf5, 0xd7, 0x5f, 0x7f, 0xdd, 0xf5, 0xd6, 0x5d,
+ 0xff, 0x9a, 0xfd, 0xff, 0xff, 0xfb, 0x63, 0xdb,
+ 0xfd, 0xf7, 0x6b, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xdf, 0xff, 0xff, 0xef, 0xff, 0xdf, 0xc6, 0xff,
+ 0xff, 0xfb, 0x9f, 0xfb, 0x9d, 0xdd, 0xfe, 0xff,
+ 0xff, 0xbf, 0x7f, 0xff, 0xed, 0xff, 0xff, 0x3f,
+ 0xff, 0xfd, 0x9f, 0xf9, 0x9f, 0xff, 0x7d, 0x57,
+ 0xfb, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfb, 0x7f,
+ 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f,
+ 0xfe, 0x3f, 0xfa, 0xfb, 0xef, 0xfb, 0xbe, 0xff,
+ 0xbb, 0xff, 0x7b, 0xdf, 0xb5, 0xf0, 0xdf, 0xfd,
+ 0xff, 0xfd, 0xff, 0xff, 0x9b, 0xff, 0xff, 0xeb,
+ 0xf7, 0xff, 0xfd, 0x7b, 0xff, 0x5f, 0xff, 0xf5,
+ 0xfb, 0xff, 0xf6, 0x7f, 0xff, 0xd7, 0xff, 0x5f,
+ 0xff, 0xe6, 0xff, 0xfb, 0xef, 0xbf, 0xf7, 0xbf,
+ 0xff, 0xef, 0xfe, 0xff, 0xf7, 0xf7, 0xfd, 0x77,
+ 0xbf, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xef,
+ 0xff, 0xff, 0xff, 0xbf, 0xfc, 0xf6, 0xdf, 0x7f,
+ 0x3b, 0xfc, 0xff, 0x7f, 0xff, 0xf7, 0xbb, 0xfd,
+ 0xfe, 0xff, 0x6f, 0xfe, 0xff, 0xef, 0xff, 0xff,
+ 0xff, 0xff, 0x7e, 0xff, 0xff, 0xef, 0xff, 0xaf,
+ 0xff, 0xfe, 0xff, 0x79, 0x77, 0xff, 0xfa, 0x9b,
+ 0xff, 0xff, 0x3f, 0x7f, 0xfc, 0xd1, 0xf7, 0x3f,
+ 0xfe, 0xf8, 0xc7, 0xed, 0x77, 0xff, 0xff, 0xbf,
+ 0xfb, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0x6f,
+ 0xbf, 0xf9, 0xe6, 0xff, 0xbf, 0xef, 0xb5, 0xb7,
+ 0xff, 0xdf, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff,
+ 0xbf, 0x99, 0xff, 0xff, 0xee, 0xaf, 0xdd, 0xff,
+ 0xff, 0xeb, 0x2f, 0xf7, 0xdf, 0x47, 0xfe, 0xfb,
+ 0xef, 0xff, 0xf7, 0xff, 0xff, 0x6f, 0xec, 0xff,
+ 0xff, 0xfb, 0xef, 0xff, 0xff, 0xea, 0xbb, 0xef,
+ 0xfe, 0xed, 0xfe, 0xff, 0xbd, 0x5d, 0xff, 0xff,
+ 0xff, 0x7f, 0x98, 0xff, 0xff, 0xbf, 0xfe, 0xfd,
+ 0xff, 0xbf, 0xfb, 0xfe, 0xfd, 0x7f, 0xee, 0xfd,
+ 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xa6,
+ 0xff, 0xeb, 0xbf, 0xfe, 0xf2, 0xef, 0xfb, 0xbf,
+ 0xfc, 0xf2, 0xdf, 0x1a, 0xff, 0xff, 0xff, 0xff,
+ 0xf7, 0xff, 0xff, 0xaf, 0xd9, 0xff, 0xfa, 0xdb,
+ 0x6f, 0xff, 0x9d, 0xfe, 0xdb, 0x6f, 0xff, 0x9b,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff,
+ 0x6d, 0xfe, 0xbf, 0xde, 0x76, 0xdb, 0x69, 0xbf,
+ 0xdf, 0x76, 0xdb, 0xff, 0x4e, 0xf5, 0xff, 0xff,
+ 0x6b, 0x2f, 0xff, 0xff, 0xfa, 0x9b, 0xf5, 0xaf,
+ 0xd7, 0x5a, 0x6b, 0xbb, 0xef, 0xd7, 0x5e, 0xfb,
+ 0xff, 0xd3, 0xff, 0xff, 0x7f, 0xf6, 0xd9, 0xff,
+ 0xbf, 0xd7, 0xe6, 0xfe, 0x6b, 0xbf, 0xd9, 0x26,
+ 0xfb, 0xef, 0xb7, 0xd8, 0x62, 0xd5, 0xdf, 0xff,
+ 0xff, 0xff, 0x2d, 0xbb, 0xfe, 0xdf, 0xbb, 0x99,
+ 0x6f, 0xea, 0x7b, 0xe5, 0xfd, 0xfa, 0xae, 0x78,
+ 0xef, 0x7d, 0xf5, 0xdf, 0xfa, 0xff, 0xff, 0xed,
+ 0xff, 0xff, 0xff, 0x6c, 0xec, 0xbf, 0xfa, 0xfe,
+ 0xfb, 0xaf, 0xff, 0xfe, 0x5e, 0xfb, 0x5d, 0x67,
+ 0xfd, 0xff, 0xff, 0x5f, 0x7f, 0xfd, 0xff, 0xbf,
+ 0x99, 0xf8, 0xaf, 0xff, 0xf6, 0xdb, 0x6b, 0xef,
+ 0xff, 0x16, 0x5b, 0xd4, 0xdf, 0xff, 0xff, 0xff,
+ 0x97, 0x5f, 0xfc, 0xff, 0xef, 0xc6, 0xfd, 0xff,
+ 0xef, 0xbd, 0xe7, 0x9f, 0xff, 0xec, 0xbd, 0xe7,
+ 0x7e, 0xff, 0xff, 0xff, 0xdf, 0x6e, 0xbe, 0xf9,
+ 0xff, 0x9d, 0x79, 0xdf, 0x7f, 0xfb, 0xef, 0xb3,
+ 0xce, 0x7f, 0xfa, 0xef, 0x73, 0x9d, 0xff, 0xfe,
+ 0xff, 0xcf, 0xb7, 0xdf, 0xfe, 0x7f, 0x6f, 0xec,
+ 0xef, 0xee, 0xfa, 0xeb, 0xbf, 0xff, 0xf6, 0xfa,
+ 0xeb, 0x7f, 0xbf, 0xdd, 0xf7, 0xdf, 0x7f, 0x8d,
+ 0x7d, 0xf7, 0xbf, 0x99, 0xf9, 0xff, 0xbf, 0xf7,
+ 0xde, 0x7f, 0xff, 0xbf, 0xf7, 0xde, 0xff, 0xec,
+ 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xce,
+ 0xe6, 0xfe, 0xff, 0xef, 0xbf, 0xfd, 0xff, 0xff,
+ 0xef, 0xbf, 0xfd, 0xff, 0xfe, 0xff, 0xff, 0xff,
+ 0xff, 0xfd, 0xff, 0xdf, 0xbb, 0xb9, 0xff, 0xff,
+ 0x7f, 0xff, 0xfd, 0xf7, 0xfa, 0x7f, 0xff, 0xf5,
+ 0xef, 0xf5, 0xd7, 0x5f, 0x7f, 0xf9, 0xe7, 0xd7,
+ 0xff, 0x6e, 0xde, 0xff, 0xfb, 0xef, 0xbf, 0xff,
+ 0xbe, 0xfc, 0xef, 0xbf, 0xff, 0xbd, 0xb9, 0xe5,
+ 0x97, 0x5f, 0x7d, 0xd5, 0xe5, 0xdf, 0x9b, 0xff,
+ 0xaf, 0xfb, 0xef, 0xfa, 0xeb, 0xe7, 0xf7, 0xff,
+ 0xfa, 0xd7, 0x4f, 0x7f, 0xfd, 0xff, 0xf7, 0xfb,
+ 0x7f, 0xfd, 0xff, 0xe6, 0xff, 0xeb, 0xf3, 0x83,
+ 0x0e, 0xba, 0xf8, 0xf3, 0x83, 0x0e, 0x75, 0xd1,
+ 0x47, 0x9f, 0x7f, 0xfc, 0xd9, 0x47, 0x9f, 0xbf,
+ 0xf9, 0xff, 0xf7, 0xeb, 0xa7, 0x9f, 0xfe, 0xfb,
+ 0xeb, 0xa7, 0x1f, 0xfd, 0xf5, 0x97, 0x5f, 0xff,
+ 0xfd, 0xf7, 0xd7, 0xff, 0x6f, 0xfe, 0xff, 0xff,
+ 0xba, 0xe8, 0xa2, 0xeb, 0xfe, 0xba, 0xe8, 0x52,
+ 0x57, 0xfd, 0xe5, 0xd7, 0x7f, 0x7f, 0xfd, 0xf5,
+ 0xff, 0x9b, 0xff, 0x2f, 0xbe, 0x9e, 0x7f, 0xfe,
+ 0xfb, 0xbf, 0x9e, 0x7f, 0xfe, 0x57, 0x7f, 0xfd,
+ 0xff, 0xff, 0xff, 0x7f, 0xfd, 0xff, 0xe6, 0xff,
+ 0xeb, 0xaf, 0xf9, 0xe7, 0x9f, 0xdf, 0xaf, 0xf9,
+ 0xe7, 0x3e, 0xd7, 0x5f, 0xfe, 0xff, 0xbf, 0xdf,
+ 0x5e, 0xff, 0xbf, 0xf9, 0xff, 0xff, 0xff, 0xff,
+ 0x3f, 0xbd, 0xf4, 0xff, 0xff, 0xbf, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xed, 0xff, 0xff, 0x6f,
+ 0xfe, 0xff, 0xeb, 0xaf, 0xbf, 0xfe, 0xba, 0xab,
+ 0xaf, 0xbf, 0xe6, 0xf5, 0xd7, 0x5f, 0x7b, 0xfd,
+ 0xf5, 0xd7, 0x5f, 0xff, 0x9b, 0xfd, 0x3d, 0xfe,
+ 0x7c, 0xf3, 0xc5, 0xff, 0xff, 0xef, 0xef, 0x7f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xfd, 0xff,
+ 0xff, 0xc6, 0xff, 0xfb, 0xbf, 0xff, 0xfe, 0x7b,
+ 0xbf, 0xff, 0xdb, 0xff, 0xff, 0xfb, 0xef, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xfd, 0x9f, 0xf9, 0xff,
+ 0xfd, 0xfb, 0xef, 0xbd, 0xff, 0xf7, 0xff, 0xff,
+ 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x7f,
+ 0xff, 0xff, 0x6f, 0xfc, 0xff, 0xff, 0xfb, 0xef,
+ 0xcf, 0xff, 0xfe, 0x7b, 0xef, 0x7d, 0x7f, 0x9f,
+ 0xff, 0xff, 0x7f, 0xdf, 0xef, 0xff, 0xff, 0x99,
+ 0xfd, 0xff, 0xbf, 0xff, 0xee, 0xfe, 0xeb, 0xbf,
+ 0xbf, 0xff, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xf7,
+ 0xff, 0xff, 0x6f, 0xff, 0xe6, 0xff, 0xe7, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfd, 0xfc,
+ 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xfb, 0xff,
+ 0xbf, 0xf9, 0xff, 0xfa, 0xff, 0x7f, 0xff, 0xfd,
+ 0xff, 0xff, 0xff, 0xff, 0xf3, 0x6f, 0xbf, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xef, 0xf7, 0x5f, 0x7f, 0xfe, 0xff, 0xff, 0xbf,
+ 0xdf, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7,
+ 0xff, 0xff, 0xc7, 0x9f, 0xff, 0xff, 0xff, 0xe6,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xef, 0xff,
+ 0xff, 0xef, 0xff, 0xff, 0xff, 0xfd, 0xf7, 0xfb,
+ 0xdf, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xfb, 0xef,
+ 0xbf, 0xdf, 0xfe, 0xf9, 0xef, 0xbd, 0x77, 0xbd,
+ 0xf4, 0xd7, 0x5f, 0x77, 0xfd, 0xf1, 0xd7, 0xff,
+ 0x6f, 0xf6, 0xff, 0xfe, 0xf9, 0xe7, 0x1f, 0x7f,
+ 0xfc, 0x79, 0xe7, 0x7f, 0xf7, 0xfd, 0xf7, 0xdf,
+ 0x7f, 0xfe, 0xff, 0xff, 0xff, 0x9b, 0xef, 0xcf,
+ 0x7f, 0xfb, 0xed, 0xf7, 0xdf, 0x7f, 0xdb, 0xfd,
+ 0xdf, 0xbf, 0xff, 0xfd, 0xfb, 0x5f, 0xff, 0xff,
+ 0xff, 0xff, 0x86, 0xff, 0xff, 0xbf, 0xfd, 0xf6,
+ 0xdb, 0xef, 0xbf, 0xfd, 0xf6, 0xb7, 0xdf, 0x7e,
+ 0xab, 0xed, 0xf7, 0xf7, 0xde, 0xfb, 0x8f, 0xd9,
+ 0xff, 0xfa, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xef, 0x7f, 0xff, 0xfd, 0xf7, 0xd3, 0x7f, 0xff,
+ 0xfd, 0xf7, 0xff, 0x6d, 0xfe, 0xe7, 0xde, 0x76,
+ 0xdb, 0x6d, 0xb7, 0xdf, 0x76, 0xdb, 0xdd, 0x6f,
+ 0xbf, 0xfd, 0xb6, 0xdb, 0xef, 0xbd, 0xe7, 0xff,
+ 0x9b, 0xf5, 0xe9, 0xd7, 0x5a, 0x6b, 0xad, 0xb5,
+ 0xd7, 0x5e, 0x7b, 0xdd, 0x6b, 0xaf, 0xbd, 0xe6,
+ 0xda, 0x6b, 0xaf, 0xf5, 0xd7, 0xe6, 0xfe, 0x6f,
+ 0xb6, 0xd9, 0x66, 0x9b, 0x6d, 0xb5, 0xd8, 0x62,
+ 0x37, 0xdb, 0x6c, 0xb3, 0xcd, 0xb6, 0xf2, 0xde,
+ 0xff, 0xbb, 0x99, 0xff, 0x5e, 0x79, 0xef, 0xbd,
+ 0xf7, 0xde, 0x79, 0xef, 0x7d, 0xef, 0xbd, 0xf7,
+ 0xde, 0x7b, 0xef, 0xbc, 0xf7, 0xff, 0x6c, 0xec,
+ 0xff, 0xfe, 0xfe, 0xfb, 0xef, 0xbf, 0xb7, 0x7e,
+ 0xfb, 0xdd, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0xdb,
+ 0xfd, 0x77, 0xbe, 0x99, 0xfb, 0xef, 0xff, 0xfe,
+ 0xfb, 0xef, 0xbf, 0xff, 0x1e, 0x7b, 0xdc, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xad, 0xef,
+ 0xe6, 0xfd, 0xff, 0xef, 0xbd, 0xe7, 0x9e, 0x7b,
+ 0xee, 0xb9, 0xe7, 0x3c, 0xf7, 0xdc, 0x73, 0xcf,
+ 0x3d, 0xff, 0xfc, 0xd3, 0xbd, 0x79, 0xff, 0x7f,
+ 0xfb, 0xef, 0xb3, 0xcf, 0x3e, 0xfb, 0xec, 0x73,
+ 0x9f, 0x7d, 0xf6, 0xd9, 0x67, 0x9f, 0x7d, 0x7e,
+ 0x79, 0x6f, 0xe0, 0xff, 0xbe, 0xfa, 0xeb, 0xaf,
+ 0xbf, 0xfe, 0xfa, 0xeb, 0x5f, 0x7f, 0xfd, 0xf5,
+ 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xbf, 0x99, 0xf9,
+ 0xff, 0xbf, 0xf7, 0xde, 0x7b, 0xef, 0xbd, 0xf7,
+ 0xde, 0xf7, 0xde, 0x7b, 0xef, 0xbd, 0xf7, 0xde,
+ 0x7b, 0xef, 0xcf, 0xe6, 0xfe, 0xff, 0xef, 0xbf,
+ 0xfd, 0xf6, 0xdb, 0x6f, 0xbf, 0xfd, 0xed, 0xb7,
+ 0xdf, 0x7e, 0xfb, 0xed, 0xb7, 0xdf, 0xfe, 0xbb,
+ 0xa9, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xfe, 0x6a, 0xd8, 0xb7, 0xfb,
+ 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff,
+ 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0x5f,
+ 0xdf, 0x9b, 0xff, 0xaf, 0xfb, 0xff, 0xfa, 0xeb,
+ 0xaf, 0xbf, 0xfe, 0xfa, 0xd7, 0x5f, 0x7f, 0xfd,
+ 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xff, 0xe6, 0xff,
+ 0xff, 0xf3, 0x83, 0x0e, 0x3a, 0xe8, 0xa0, 0x83,
+ 0x0e, 0x75, 0xd0, 0x41, 0x07, 0x1d, 0x74, 0xd0,
+ 0x41, 0x9f, 0xbf, 0xf9, 0xff, 0xfb, 0xeb, 0xaf,
+ 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0x3f, 0xfd, 0xf5,
+ 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 0xff, 0x6f,
+ 0xfe, 0x9f, 0xff, 0xba, 0xe9, 0xa6, 0x9b, 0x6e,
+ 0xba, 0xe9, 0x56, 0x37, 0xdd, 0x74, 0xd3, 0x4d,
+ 0x37, 0xdd, 0xf4, 0xff, 0x9b, 0xff, 0xaf, 0xbe,
+ 0x9e, 0x7f, 0xfe, 0xf9, 0xe7, 0x9f, 0x7f, 0xfe,
+ 0xf3, 0xcf, 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 0xff,
+ 0xff, 0xe6, 0xff, 0xff, 0xaf, 0xc9, 0x27, 0x9f,
+ 0x7c, 0xf2, 0xc9, 0x27, 0x3f, 0xf9, 0xe4, 0x93,
+ 0x4f, 0x3e, 0xf9, 0xe4, 0xfb, 0xbf, 0xf9, 0xff,
+ 0xf4, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xbf, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xe7,
+ 0x37, 0xff, 0x6f, 0xfa, 0xbf, 0x6b, 0xaf, 0xbf,
+ 0xfe, 0xea, 0xeb, 0xaf, 0xbe, 0xfe, 0xf5, 0xd7,
+ 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 0x5d, 0xff, 0x9a,
+ 0xff, 0xff, 0xff, 0xfc, 0xf3, 0xcf, 0xff, 0xff,
+ 0xef, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff,
+ 0xff, 0x7f, 0xfb, 0xdf, 0xc6, 0xff, 0xff, 0xbf,
+ 0xdf, 0xfe, 0xfb, 0xff, 0xff, 0xff, 0xbf, 0xff,
+ 0xfb, 0xff, 0xbf, 0xff, 0xfe, 0xfd, 0xde, 0xff,
+ 0x9f, 0xc9, 0xff, 0xff, 0xfb, 0xef, 0xbf, 0xef,
+ 0xff, 0xff, 0xff, 0xff, 0xdf, 0xbf, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xfe, 0x6b, 0xfe, 0xff,
+ 0xff, 0xf4, 0x93, 0xcf, 0x3f, 0xff, 0xdc, 0xd3,
+ 0x9d, 0xff, 0xf9, 0xe9, 0xa7, 0x9f, 0x7e, 0xba,
+ 0xf5, 0xff, 0x9b, 0xff, 0xff, 0xfb, 0xff, 0x7f,
+ 0xfe, 0xfa, 0xff, 0xbf, 0xff, 0xfe, 0xff, 0xfd,
+ 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7b, 0xff, 0xe6,
+ 0xff, 0xff, 0x7f, 0xff, 0xfd, 0xff, 0xff, 0xff,
+ 0xff, 0xf7, 0xfe, 0xf7, 0xff, 0xf7, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xaf, 0xf9, 0x7f, 0xff, 0xff,
+ 0xff, 0xfb, 0xff, 0xf7, 0xff, 0xff, 0xbe, 0xff,
+ 0xdf, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff,
+ 0x6f, 0xfe, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0x7f, 0xff, 0xff, 0x9b, 0xff, 0xfb,
+ 0xff, 0xff, 0xff, 0xf3, 0xce, 0xff, 0xff, 0xbd,
+ 0xe7, 0xff, 0xf7, 0x7e, 0xf9, 0xe7, 0xbf, 0x7e,
+ 0xfb, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xfb, 0xef, 0xff, 0x7f, 0xff, 0xf7, 0xff, 0xff,
+ 0xfe, 0xfd, 0xf7, 0xef, 0xdd, 0xff, 0xbf, 0xb9,
+ 0xff, 0xf7, 0xdf, 0xff, 0x5f, 0xfe, 0xfd, 0xef,
+ 0xff, 0xff, 0xfc, 0xf4, 0xd7, 0x17, 0x7f, 0xfc,
+ 0xf5, 0xd7, 0xff, 0x6f, 0xfc, 0xff, 0xff, 0xf7,
+ 0xdf, 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 0x7f, 0xfe,
+ 0xdf, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xfe,
+ 0x99, 0xfb, 0xff, 0xff, 0x7f, 0xff, 0xeb, 0xb7,
+ 0xbf, 0xfe, 0xfb, 0xd7, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xa6, 0xff, 0xff,
+ 0xbf, 0xa7, 0xfe, 0x7b, 0xae, 0xbf, 0xfc, 0xfa,
+ 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 0x5c, 0x7f,
+ 0xff, 0xaf, 0xd9, 0xff, 0xff, 0xfb, 0xa5, 0xbf,
+ 0x9f, 0xfe, 0xbb, 0x6f, 0x57, 0xff, 0xdd, 0x77,
+ 0xdf, 0x7d, 0x37, 0xfd, 0xf7, 0xff, 0x6d, 0xfe,
+ 0xff, 0xff, 0xfb, 0xeb, 0xed, 0xb7, 0xdb, 0x76,
+ 0xdb, 0xdd, 0x6d, 0xbf, 0xfd, 0xf6, 0xdb, 0x6f,
+ 0xb7, 0xfd, 0xfc, 0x9b, 0xf5, 0xff, 0xbf, 0xff,
+ 0x7a, 0xed, 0xb5, 0xd7, 0x5e, 0x7b, 0xdd, 0x6b,
+ 0xaf, 0xbd, 0xf6, 0xda, 0x6b, 0xaf, 0xfd, 0xd7,
+ 0xe6, 0xfe, 0x7f, 0xbf, 0x9d, 0xf6, 0x5b, 0x6d,
+ 0xb5, 0xd8, 0x52, 0xb7, 0xda, 0x6c, 0xab, 0xad,
+ 0xb6, 0xda, 0x6a, 0xb3, 0xbb, 0x99, 0x6f, 0xff,
+ 0xbb, 0xab, 0xbe, 0x77, 0xde, 0x79, 0xef, 0x5d,
+ 0xef, 0xbc, 0xf2, 0xce, 0x3b, 0xef, 0xbc, 0xf3,
+ 0xea, 0x6c, 0xec, 0xff, 0xfb, 0x6b, 0xab, 0xed,
+ 0xa5, 0xb7, 0x7e, 0x7b, 0xd9, 0x5b, 0xff, 0xbd,
+ 0xf5, 0xd6, 0x5b, 0x6f, 0x7d, 0xbe, 0x99, 0xfb,
+ 0xff, 0xb3, 0x8f, 0xda, 0x6e, 0xb9, 0xfd, 0x16,
+ 0x5b, 0xdc, 0x7e, 0xfb, 0xed, 0xb7, 0xdf, 0x7e,
+ 0xfb, 0xad, 0xef, 0xc6, 0xfd, 0xdf, 0x7f, 0xff,
+ 0xfd, 0xde, 0x7a, 0xee, 0xb9, 0xe7, 0x3d, 0xf7,
+ 0xdc, 0x73, 0xcf, 0x3d, 0xf7, 0xdc, 0xd3, 0x9d,
+ 0x79, 0xff, 0xe7, 0x9f, 0x7f, 0xbe, 0xff, 0x3e,
+ 0xfb, 0xec, 0x73, 0x9f, 0x7d, 0xf6, 0xd9, 0x67,
+ 0x9f, 0x7d, 0xf6, 0x79, 0x6f, 0xec, 0xff, 0xf8,
+ 0xe3, 0x8f, 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0x5f,
+ 0x7f, 0xfd, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5,
+ 0xbf, 0x99, 0xf9, 0xff, 0xff, 0xff, 0xff, 0x7b,
+ 0xef, 0xbd, 0xf7, 0xde, 0xf7, 0xde, 0x7b, 0xef,
+ 0xbd, 0xf7, 0xde, 0x7b, 0xef, 0xcf, 0xe6, 0xfe,
+ 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdb, 0x6f, 0xbf,
+ 0xfd, 0xed, 0xb7, 0xdf, 0x7e, 0xfb, 0xed, 0xb7,
+ 0xdf, 0xfe, 0xbb, 0xb9, 0x7f, 0xe6, 0x99, 0x2d,
+ 0xfc, 0xf7, 0x5f, 0x7f, 0xff, 0xf5, 0xef, 0xbf,
+ 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0x6e,
+ 0xde, 0xbf, 0xf9, 0xe6, 0x8b, 0xff, 0xfe, 0xfb,
+ 0xef, 0xbf, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff,
+ 0xfd, 0xf7, 0xdf, 0xdf, 0x9b, 0xff, 0xe7, 0x9e,
+ 0xfb, 0x7a, 0xff, 0xad, 0xbf, 0xde, 0xfa, 0xd7,
+ 0x5b, 0x67, 0xbd, 0xf5, 0xd6, 0x5f, 0x6f, 0xdd,
+ 0xff, 0xe6, 0xff, 0xfb, 0xe3, 0x8b, 0x0c, 0xff,
+ 0xe8, 0xa0, 0x8f, 0x3e, 0xf5, 0xd1, 0x47, 0x1f,
+ 0x7d, 0xf4, 0xd1, 0x47, 0x9f, 0xbf, 0xf9, 0xff,
+ 0xf3, 0xdf, 0x76, 0x9f, 0x7e, 0xfa, 0xe9, 0xaf,
+ 0x3f, 0xfd, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5,
+ 0xd7, 0xff, 0x6f, 0xf8, 0xff, 0xfe, 0xff, 0xfc,
+ 0xa1, 0x8f, 0x3e, 0xfa, 0xeb, 0x5f, 0x7f, 0xfd,
+ 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xff, 0x9b,
+ 0xff, 0x3f, 0xff, 0xbd, 0xb7, 0xea, 0xfb, 0xe3,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0x86, 0xfe, 0x6f, 0xff,
+ 0xf5, 0xd7, 0x1a, 0x7f, 0xfc, 0xfd, 0xf7, 0xbf,
+ 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xbf, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xf2, 0xf7,
+ 0x8b, 0x2f, 0xbd, 0xf8, 0xfa, 0xab, 0xaf, 0xbe,
+ 0xfe, 0xd5, 0xd7, 0x5f, 0x7d, 0xfd, 0xb5, 0xd7,
+ 0x5f, 0xff, 0x9b, 0xff, 0x37, 0xfe, 0xf8, 0xf3,
+ 0xfe, 0xf7, 0xff, 0xe8, 0xff, 0x7f, 0x7f, 0xfe,
+ 0xf9, 0xe7, 0x9f, 0xff, 0xfd, 0xff, 0xff, 0xc6,
+ 0xff, 0xfb, 0xef, 0xff, 0xfb, 0xff, 0x7f, 0xe7,
+ 0xdf, 0x77, 0xff, 0xd3, 0xcf, 0x7b, 0xfd, 0x3d,
+ 0xff, 0xf7, 0xff, 0x9a, 0xf9, 0xff, 0xfd, 0xf7,
+ 0xaf, 0xfb, 0xff, 0xff, 0x6f, 0xfb, 0xdf, 0xff,
+ 0xfe, 0xdf, 0xf7, 0xbb, 0xfd, 0xbf, 0xff, 0xfb,
+ 0x6f, 0xfe, 0xf6, 0xdc, 0xfb, 0xe3, 0xbf, 0xfd,
+ 0xf6, 0xb3, 0xef, 0x7d, 0xfb, 0xf9, 0xb6, 0x9f,
+ 0x7f, 0xbf, 0xbd, 0xf7, 0xff, 0x99, 0xfd, 0xff,
+ 0xff, 0xf7, 0xff, 0xba, 0xef, 0xff, 0xbf, 0xfe,
+ 0xff, 0xdf, 0x7b, 0x7f, 0xdd, 0xf7, 0xdf, 0x7f,
+ 0xff, 0xff, 0xe6, 0xff, 0xfb, 0xef, 0xbf, 0xf7,
+ 0xff, 0xff, 0xef, 0xff, 0xff, 0xfc, 0xff, 0xff,
+ 0xf7, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9,
+ 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xfe, 0xff, 0xdf, 0xff, 0xfd, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xef, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xdd, 0xff, 0xff, 0xff,
+ 0x9b, 0xff, 0xcf, 0x3f, 0xfb, 0xfc, 0xf2, 0xcf,
+ 0xff, 0xbf, 0xbf, 0xe7, 0xf7, 0x57, 0x7e, 0xf9,
+ 0xe5, 0xf7, 0xd7, 0xff, 0xff, 0xe6, 0xff, 0xaf,
+ 0xbf, 0xf7, 0xfe, 0xfb, 0xef, 0xfd, 0xff, 0xdf,
+ 0xf7, 0xfe, 0x7b, 0xef, 0xfd, 0xf8, 0xfe, 0xff,
+ 0xff, 0xbf, 0xf9, 0xff, 0xf9, 0xf7, 0x9f, 0x7f,
+ 0xdb, 0xf9, 0xff, 0xbf, 0xef, 0xfc, 0xf6, 0xcf,
+ 0x3f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfc,
+ 0xff, 0xfe, 0xdb, 0x6f, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xef, 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x9b, 0xff, 0xaf, 0xff, 0xfe,
+ 0xfa, 0xad, 0xad, 0xfe, 0xfe, 0xea, 0xef, 0xbf,
+ 0xfd, 0xf6, 0xdb, 0x7f, 0xfb, 0xfd, 0xf7, 0xfb,
+ 0x86, 0x7f, 0x2e, 0xbf, 0xfc, 0xf6, 0xcb, 0x2f,
+ 0xbf, 0xe4, 0xf2, 0x97, 0x5f, 0x7e, 0x79, 0xe7,
+ 0xcf, 0xff, 0xff, 0xff, 0x8f, 0xd9, 0x9f, 0xfe,
+ 0xbb, 0xef, 0x97, 0xff, 0xee, 0xbb, 0xe5, 0x7e,
+ 0xf7, 0xdd, 0x77, 0xdf, 0xfd, 0xfb, 0xff, 0xff,
+ 0xff, 0x6d, 0xfe, 0xb7, 0xdb, 0x7e, 0xfb, 0xed,
+ 0xb6, 0xdf, 0x76, 0xdb, 0xdd, 0x6f, 0xbb, 0xfd,
+ 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xf5,
+ 0xb5, 0xd7, 0x5e, 0x7b, 0xed, 0xb5, 0xd7, 0x5e,
+ 0x73, 0xdd, 0x6b, 0xaf, 0xbd, 0xf6, 0xff, 0xff,
+ 0xff, 0xff, 0xd7, 0xe6, 0xfe, 0x6f, 0xb6, 0xd9,
+ 0x66, 0x9b, 0x6d, 0xb6, 0xd8, 0x66, 0x37, 0x5b,
+ 0x6c, 0x33, 0xef, 0xff, 0xff, 0xff, 0xff, 0xbb,
+ 0x99, 0xfe, 0xde, 0x7b, 0xef, 0xbd, 0xf7, 0xde,
+ 0x7b, 0xef, 0x7d, 0xef, 0xbd, 0xf7, 0xde, 0xfb,
+ 0xff, 0xff, 0xff, 0xbf, 0x6c, 0xec, 0xbf, 0xff,
+ 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0x7e, 0xfb, 0xdf,
+ 0x7f, 0x9f, 0xfd, 0xdf, 0xff, 0xef, 0xff, 0xff,
+ 0xbf, 0x99, 0xfb, 0xbf, 0xfd, 0xf6, 0x5b, 0x6d,
+ 0xbf, 0xfd, 0x16, 0xdb, 0xdf, 0x7e, 0xab, 0xed,
+ 0xb7, 0xff, 0xf3, 0xff, 0xff, 0xef, 0xe6, 0xfd,
+ 0x7b, 0xee, 0xb9, 0xe7, 0x9e, 0x7b, 0xee, 0xb9,
+ 0xe7, 0x3d, 0xf7, 0xdc, 0xf3, 0xcf, 0xff, 0xfd,
+ 0xff, 0xff, 0xbd, 0x79, 0xff, 0x3e, 0xfb, 0xec,
+ 0xb3, 0xcf, 0x3e, 0xfb, 0xec, 0x73, 0x9f, 0x7d,
+ 0xf6, 0xd9, 0xe7, 0xff, 0xff, 0xff, 0x7f, 0x6f,
+ 0xec, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe,
+ 0xfa, 0xeb, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 0x7f,
+ 0xff, 0xfd, 0xf7, 0x3f, 0x99, 0xf9, 0xef, 0xbd,
+ 0xf7, 0xde, 0x7b, 0xef, 0xbd, 0xf7, 0xde, 0xf7,
+ 0xde, 0x7b, 0xef, 0xbd, 0xff, 0xff, 0xff, 0xff,
+ 0xcf, 0xe6, 0xfe, 0xdb, 0x6f, 0xbf, 0xfd, 0xf6,
+ 0xdb, 0x6f, 0xbf, 0xfd, 0xed, 0xb7, 0xdf, 0x7e,
+ 0xfb, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xa9, 0xff,
+ 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff,
+ 0xfd, 0xef, 0xbf, 0xff, 0xfe, 0x7b, 0xfd, 0xff,
+ 0xff, 0xff, 0x6a, 0xde, 0xfd, 0xfb, 0xef, 0xbf,
+ 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfd, 0xf7,
+ 0xdf, 0x7f, 0x5f, 0xfe, 0xff, 0xff, 0xdf, 0x98,
+ 0xff, 0xaf, 0xbb, 0xee, 0xfa, 0xeb, 0xae, 0xbb,
+ 0xee, 0xba, 0xd7, 0x5d, 0x77, 0xfd, 0xf5, 0xd7,
+ 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xeb, 0xa3,
+ 0x8b, 0x2e, 0xfa, 0xe8, 0xa2, 0x8f, 0x2e, 0x75,
+ 0xd1, 0x45, 0x17, 0x7d, 0x74, 0xf8, 0xe3, 0x9f,
+ 0xbf, 0xf9, 0xff, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe,
+ 0xfa, 0xeb, 0xaf, 0x3f, 0xfd, 0xf5, 0xd7, 0x5f,
+ 0x7f, 0xf1, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xbf,
+ 0xfe, 0xfa, 0xe9, 0xa7, 0x9f, 0x7e, 0xfa, 0xe9,
+ 0x57, 0x3f, 0xfd, 0xf4, 0xd3, 0x4f, 0xaf, 0xff,
+ 0xfe, 0xff, 0x9b, 0xff, 0xf7, 0xff, 0xaf, 0xbf,
+ 0xfe, 0xfb, 0xeb, 0xbf, 0xbf, 0xfe, 0xf5, 0xd7,
+ 0x5f, 0xff, 0xd5, 0xf5, 0xcf, 0xff, 0xff, 0x86,
+ 0xff, 0x7f, 0xff, 0xc1, 0x07, 0x1f, 0x7c, 0xf0,
+ 0xc1, 0x07, 0x3f, 0xf8, 0xe0, 0x83, 0x0f, 0x64,
+ 0xf8, 0xe1, 0xff, 0x8f, 0xd9, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff,
+ 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff,
+ 0x6f, 0xfa, 0xff, 0xeb, 0xaf, 0xbf, 0xfa, 0xfa,
+ 0xab, 0xaf, 0xbf, 0xfa, 0xf5, 0xd7, 0x5f, 0x7f,
+ 0xfd, 0xf5, 0xd7, 0x5f, 0xff, 0x9a, 0xff, 0xf7,
+ 0xcf, 0x7c, 0xff, 0xff, 0x3f, 0xff, 0xec, 0xf3,
+ 0x9f, 0x7f, 0xfe, 0xf1, 0xe6, 0xfe, 0xff, 0xef,
+ 0xff, 0xff, 0xc6, 0xfb, 0xfd, 0x67, 0xff, 0xdd,
+ 0x7f, 0x7f, 0xff, 0xfd, 0x7f, 0xbf, 0xfb, 0xfe,
+ 0xfb, 0xff, 0xfe, 0xfe, 0xfe, 0xff, 0x9f, 0xf9,
+ 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xfa, 0xea,
+ 0xa7, 0x5f, 0xfd, 0xf4, 0xd3, 0x4f, 0xff, 0x7f,
+ 0xff, 0xfb, 0xff, 0x6f, 0xfe, 0x17, 0xdf, 0xfc,
+ 0xf3, 0xcf, 0x3f, 0xff, 0xdc, 0xf3, 0x9d, 0x7f,
+ 0xfe, 0xf7, 0xa6, 0xef, 0xfe, 0xff, 0xff, 0xfb,
+ 0x9b, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd,
+ 0xff, 0x9f, 0xff, 0xfe, 0xff, 0xdd, 0x7f, 0xff,
+ 0xff, 0xf7, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff,
+ 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7,
+ 0xbe, 0xff, 0xde, 0xf7, 0xef, 0xbf, 0xff, 0xff,
+ 0xff, 0xbf, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xdf, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xf6,
+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f,
+ 0xfe, 0xef, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x9b, 0x7f, 0xcf, 0x3f, 0xbf,
+ 0xfc, 0xf3, 0xcb, 0x2f, 0xfe, 0xf8, 0xe6, 0x17,
+ 0xdf, 0x7f, 0xe9, 0x7f, 0xf7, 0xff, 0xff, 0xff,
+ 0xe6, 0xff, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef,
+ 0x7f, 0xff, 0xfe, 0xf7, 0xdf, 0xff, 0xff, 0xfd,
+ 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xd9,
+ 0xa7, 0x9f, 0x77, 0xfe, 0xf9, 0xef, 0xbf, 0xef,
+ 0xfc, 0x76, 0xdf, 0x3f, 0xbf, 0xff, 0xf7, 0xd5,
+ 0xff, 0x6a, 0xfc, 0x2f, 0xfc, 0xf0, 0xc3, 0x0f,
+ 0x3f, 0xfc, 0xf0, 0xc3, 0x1f, 0x7e, 0xf8, 0xf1,
+ 0x85, 0x5f, 0x7f, 0xdc, 0xf5, 0xff, 0x99, 0xff,
+ 0xf7, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xef, 0x7f, 0xef, 0xff, 0xf7, 0xdf, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xa6, 0x7c, 0xae, 0xb9, 0xfc,
+ 0x9e, 0x0b, 0x2f, 0xbf, 0xe4, 0xf2, 0x97, 0x5f,
+ 0x78, 0xfd, 0xe5, 0x97, 0x77, 0xff, 0xff, 0x8f,
+ 0xd9, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0x5f, 0xfe,
+ 0xdb, 0x65, 0x7f, 0xf7, 0xed, 0x72, 0xdf, 0x7d,
+ 0xf7, 0xdd, 0xff, 0xff, 0x6d, 0xfe, 0xb7, 0xdb,
+ 0x6e, 0xfb, 0xed, 0xb6, 0xdb, 0x76, 0xdb, 0xdd,
+ 0x6f, 0xbb, 0xed, 0xf6, 0xdb, 0xee, 0xf9, 0xff,
+ 0xff, 0x1b, 0xf5, 0xb5, 0xd7, 0x5e, 0x7b, 0xed,
+ 0xb5, 0xd7, 0x5e, 0x73, 0xdd, 0x6b, 0xaf, 0xb9,
+ 0xf6, 0xda, 0x6b, 0xff, 0xff, 0xd7, 0xe6, 0xfe,
+ 0x6f, 0xb5, 0xd9, 0x56, 0x9b, 0x6d, 0xb6, 0xd8,
+ 0x66, 0x37, 0x5b, 0x6c, 0xab, 0xcd, 0x16, 0x73,
+ 0xfe, 0xff, 0xbb, 0x99, 0xff, 0xde, 0x79, 0xef,
+ 0x9d, 0xf7, 0xde, 0x7b, 0xef, 0x7d, 0xef, 0xbd,
+ 0xf7, 0xce, 0x7b, 0xef, 0xbd, 0xff, 0xff, 0x6c,
+ 0xec, 0xbf, 0xb7, 0xfe, 0x7b, 0xe9, 0xbf, 0xff,
+ 0x7e, 0xfb, 0xdf, 0x7f, 0x9f, 0xbd, 0xf5, 0xdf,
+ 0xe7, 0xad, 0xff, 0xbf, 0x19, 0xfb, 0xbf, 0xfd,
+ 0xf6, 0x1b, 0x6e, 0xbf, 0xfd, 0x16, 0xdb, 0xdf,
+ 0x7e, 0xab, 0xed, 0xb7, 0xdf, 0x6a, 0xcb, 0xff,
+ 0xef, 0xe6, 0xfd, 0x7b, 0xef, 0xbd, 0xe7, 0x9e,
+ 0x7b, 0xee, 0xb9, 0xe7, 0x3d, 0xf7, 0xdc, 0x73,
+ 0xcf, 0x3d, 0xff, 0xf4, 0xff, 0xbd, 0x79, 0xff,
+ 0xff, 0xfb, 0xef, 0xb3, 0xcf, 0x3e, 0xfb, 0xec,
+ 0x73, 0x9f, 0x7d, 0xf6, 0xd9, 0x67, 0x9f, 0x7d,
+ 0xfe, 0x7f, 0x6f, 0xec, 0xbf, 0xfe, 0xfa, 0xeb,
+ 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0x5f, 0x7f, 0xfd,
+ 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf7, 0xbf, 0x99,
+ 0xf9, 0xef, 0xbd, 0xf7, 0xde, 0x7b, 0xef, 0xbd,
+ 0xf7, 0xde, 0xf7, 0xde, 0x7b, 0xef, 0xbd, 0xf7,
+ 0xde, 0xfb, 0xff, 0xcf, 0xe6, 0xfe, 0xfb, 0xef,
+ 0xbf, 0xfd, 0xf6, 0xdb, 0x6f, 0xbf, 0xfd, 0xed,
+ 0xb7, 0xdf, 0x7e, 0xfb, 0xed, 0xb7, 0xff, 0xff,
+ 0xbb, 0xb9, 0xff, 0xdf, 0x7f, 0xff, 0xfd, 0xf7,
+ 0xdf, 0x7f, 0xff, 0xfd, 0xef, 0xbf, 0xff, 0xfe,
+ 0xfb, 0xef, 0xbf, 0xdf, 0xff, 0x6a, 0xde, 0xff,
+ 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf,
+ 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7,
+ 0xe7, 0xde, 0x98, 0xff, 0xff, 0xfb, 0xff, 0xfa,
+ 0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 0xd7, 0x5f, 0x7f,
+ 0xfd, 0xf5, 0xd7, 0x5f, 0xff, 0xbd, 0xff, 0xe6,
+ 0xff, 0xff, 0xf3, 0x83, 0x0e, 0x3a, 0xe8, 0xa0,
+ 0x83, 0x4e, 0x75, 0xd2, 0x49, 0x07, 0x1d, 0x74,
+ 0xd0, 0x61, 0x9f, 0xbf, 0xf9, 0xff, 0xfa, 0xeb,
+ 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0x3f, 0xfd,
+ 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xdf, 0xff,
+ 0x6f, 0xfe, 0xbf, 0xfe, 0xba, 0xe9, 0xa6, 0x9b,
+ 0x6e, 0xba, 0xe9, 0x56, 0x37, 0xdd, 0x74, 0xd3,
+ 0x4d, 0x37, 0xdd, 0xf6, 0xff, 0x9b, 0xff, 0xaf,
+ 0xbf, 0x9e, 0x7f, 0xfe, 0xf9, 0xe7, 0x9f, 0x7f,
+ 0xfc, 0xe3, 0x8f, 0x3f, 0xff, 0xfc, 0xf3, 0xcf,
+ 0xfd, 0xff, 0xe6, 0xff, 0x6b, 0xaf, 0xc9, 0x27,
+ 0x9f, 0x7c, 0xf2, 0xc9, 0xe7, 0x3e, 0xff, 0xfc,
+ 0x93, 0x4f, 0x3e, 0xf9, 0x64, 0xff, 0xbf, 0xf9,
+ 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xe9, 0x7f, 0xff, 0x6f, 0xfe, 0xff, 0xe9, 0xaf,
+ 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xee, 0xf5,
+ 0xd7, 0x5e, 0x7f, 0xfd, 0xf5, 0xd6, 0x5f, 0xff,
+ 0x9a, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x6f, 0xff, 0x9e, 0xff, 0xdf, 0x39, 0xe7,
+ 0x9f, 0x7f, 0xfe, 0xff, 0xff, 0xc6, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0x7f,
+ 0xff, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
+ 0xef, 0x9f, 0xf9, 0xff, 0xff, 0xfe, 0xff, 0xeb,
+ 0xbf, 0xff, 0x7f, 0xff, 0x66, 0x7d, 0x7f, 0x53,
+ 0x5f, 0x57, 0xf5, 0xf5, 0x7d, 0xf7, 0x6e, 0xfe,
+ 0xff, 0xde, 0xfc, 0xf1, 0xcf, 0x17, 0x7f, 0x7c,
+ 0xf3, 0x9b, 0x7f, 0xfe, 0xf9, 0xe5, 0x9f, 0x7f,
+ 0xde, 0xff, 0xff, 0x9b, 0xff, 0xef, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x7d, 0xf7,
+ 0xdf, 0xdf, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff,
+ 0xe6, 0xff, 0xff, 0xfe, 0xfb, 0xff, 0xbf, 0xff,
+ 0xfe, 0xfb, 0xef, 0x76, 0xff, 0x7d, 0xff, 0x7f,
+ 0xff, 0xff, 0xf7, 0xff, 0xbf, 0xf9, 0xff, 0x3f,
+ 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xef, 0x7f,
+ 0xfe, 0xff, 0xe7, 0xff, 0xfd, 0xff, 0xff, 0xff,
+ 0xff, 0x6f, 0xfe, 0xfe, 0xff, 0xff, 0x7f, 0xff,
+ 0xff, 0xff, 0xff, 0xef, 0xcf, 0xbd, 0xff, 0xd7,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x9b, 0xff,
+ 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xbf,
+ 0xff, 0xfd, 0xff, 0xff, 0xcf, 0x3f, 0xff, 0xff,
+ 0xfe, 0xf7, 0xff, 0xe6, 0xbf, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfd,
+ 0xfb, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf,
+ 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef,
+ 0xbf, 0xff, 0xef, 0xff, 0xff, 0x7f, 0xff, 0xaf,
+ 0x6f, 0xff, 0x7f, 0xff, 0x6f, 0xfc, 0xff, 0xfd,
+ 0xf7, 0xdf, 0x7f, 0xff, 0xf5, 0xd7, 0x4f, 0x7f,
+ 0xf8, 0xeb, 0xef, 0xbf, 0x7f, 0xfe, 0xfb, 0xff,
+ 0xff, 0x99, 0xff, 0xff, 0xfa, 0x6f, 0xff, 0xff,
+ 0xff, 0xdf, 0xef, 0x7d, 0xdf, 0xfd, 0xbf, 0xdf,
+ 0xff, 0xee, 0xff, 0xff, 0xff, 0xff, 0x66, 0xff,
+ 0xcf, 0x3d, 0xf7, 0xdc, 0x73, 0xcf, 0x3d, 0xf7,
+ 0xd5, 0xef, 0x9e, 0xfb, 0xee, 0xb1, 0xee, 0x9e,
+ 0x7f, 0xfe, 0x9f, 0xf9, 0xff, 0xf7, 0xde, 0x7f,
+ 0xfb, 0xfd, 0xf7, 0x9e, 0xdf, 0xfb, 0xdf, 0xef,
+ 0xdb, 0xff, 0xfe, 0xff, 0xee, 0xbf, 0xef, 0x6f,
+ 0xfe, 0xbf, 0xfe, 0xf9, 0xeb, 0xaf, 0xb7, 0xfe,
+ 0xfa, 0xeb, 0x5f, 0x7f, 0xfd, 0xf5, 0xc7, 0xdb,
+ 0x7f, 0xbd, 0x71, 0xff, 0x9b, 0xff, 0xef, 0xdf,
+ 0x77, 0xff, 0x7d, 0xf7, 0xdf, 0x77, 0xff, 0xf9,
+ 0xef, 0xfd, 0xfb, 0xff, 0xfb, 0xfe, 0xff, 0xff,
+ 0xff, 0xa6, 0xff, 0xef, 0xbf, 0x7f, 0xfa, 0xf9,
+ 0xe7, 0x9f, 0x7f, 0xde, 0xf3, 0xcf, 0x5f, 0x69,
+ 0xfd, 0xf3, 0xd6, 0x3f, 0xff, 0xbf, 0xf9, 0xff,
+ 0xfd, 0xfb, 0xff, 0xbf, 0xff, 0xff, 0xfb, 0xff,
+ 0x7f, 0xaf, 0xfb, 0x7f, 0xcf, 0x7f, 0xf7, 0xff,
+ 0xef, 0xff, 0x6f, 0xfe, 0xbf, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xbf, 0xdf, 0xdf, 0xff, 0xfa, 0xff,
+ 0x6f, 0xff, 0x7f, 0xff, 0xff, 0xfd, 0xff, 0x9b,
+ 0xff, 0x9f, 0x7e, 0xfa, 0xe9, 0xa7, 0x9f, 0x7e,
+ 0xfa, 0xfd, 0xef, 0x7f, 0xfd, 0xfe, 0xd3, 0xef,
+ 0x3f, 0xfd, 0xf4, 0xff, 0xe6, 0xff, 0xf7, 0xff,
+ 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff,
+ 0xf7, 0xf7, 0xfd, 0xf7, 0xff, 0xff, 0xbe, 0xff,
+ 0xbf, 0xf9, 0xfb, 0xef, 0xbf, 0xff, 0xff, 0xfb,
+ 0xef, 0xbf, 0x7f, 0xbe, 0xf3, 0xdf, 0xbf, 0xfb,
+ 0xfb, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0x7f,
+ 0xff, 0xfe, 0xf3, 0xef, 0x3f, 0xff, 0xfe, 0xf3,
+ 0xdf, 0xfb, 0xfe, 0xf9, 0xf7, 0xdf, 0x7f, 0x7e,
+ 0xff, 0xfb, 0x9b, 0xff, 0xff, 0x3f, 0xdf, 0x7d,
+ 0xf7, 0xdd, 0x77, 0xdf, 0x7d, 0xef, 0xbb, 0xaf,
+ 0xbe, 0xfa, 0xfa, 0x9b, 0x6f, 0xfe, 0xff, 0xe6,
+ 0xff, 0xdf, 0x7f, 0xff, 0xfd, 0x77, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef,
+ 0xbf, 0xff, 0xfe, 0xbf, 0xb9, 0xff, 0xb7, 0xdf,
+ 0x4e, 0x3b, 0x6d, 0xb4, 0xd3, 0x46, 0x7b, 0xda,
+ 0x69, 0xa7, 0x95, 0x76, 0xdb, 0x6f, 0xb7, 0xf9,
+ 0x6f, 0xfe, 0xff, 0xf7, 0xdf, 0x7f, 0xff, 0xfd,
+ 0x77, 0xdf, 0x7f, 0xe7, 0xdb, 0xef, 0xbf, 0xff,
+ 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0x9b, 0xff, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7,
+ 0xbf, 0xe7, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xbe,
+ 0xfb, 0xef, 0xe6, 0xff, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xdf, 0x7f, 0xbf,
+ 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xbf, 0xf9,
+ 0xff, 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xbf,
+ 0xfe, 0xfe, 0xf7, 0x5f, 0x7f, 0xff, 0xf5, 0xf7,
+ 0x5f, 0x7f, 0xfd, 0x6f, 0xfe, 0xff, 0xfb, 0xef,
+ 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfd,
+ 0xf7, 0xdd, 0x7f, 0xff, 0xdd, 0xf7, 0xdf, 0xfe,
+ 0x9b, 0xff, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xff,
+ 0xfc, 0xf3, 0xcf, 0x7f, 0xfe, 0xf9, 0xe7, 0x9f,
+ 0x7f, 0xf6, 0xf9, 0xe7, 0xf7, 0xe6, 0xff, 0x5f,
+ 0x7f, 0xfd, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5,
+ 0xaf, 0xbf, 0xde, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe,
+ 0xfa, 0xbf, 0xf9, 0xff, 0x5f, 0x7f, 0xfd, 0xf5,
+ 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xaf, 0xbf, 0xee,
+ 0xfa, 0xeb, 0x2f, 0xbf, 0xfe, 0xf8, 0x6f, 0xee,
+ 0xff, 0xf6, 0xfb, 0xef, 0xbf, 0xff, 0xf2, 0xfb,
+ 0x6f, 0x7f, 0xfb, 0xfd, 0xb5, 0xdf, 0x7f, 0xb9,
+ 0xfd, 0xd7, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xff,
+ 0xe6, 0xfe, 0x5b, 0xef, 0xbf, 0xef, 0xfe, 0x7b,
+ 0xef, 0xbf, 0xe5, 0x2d, 0xf7, 0xdf, 0x72, 0xff,
+ 0x2d, 0xf7, 0xdf, 0xfe, 0xbf, 0xf9, 0xbf, 0xf5,
+ 0xf5, 0xd7, 0x5b, 0x7f, 0xfd, 0xf5, 0x37, 0xd3,
+ 0x99, 0xfa, 0xbb, 0xa9, 0xbf, 0xd9, 0xfa, 0xab,
+ 0xef, 0x6f, 0xfe, 0xff
+};
+
+
+/* rom names */
+
+
+
+/* rom locations */
+static const unsigned long eppchk_roms[0] = {
+
+};
+
diff --git a/main/eppfpga.8 b/main/eppfpga.8
new file mode 100644
index 0000000..ff8eed9
--- /dev/null
+++ b/main/eppfpga.8
@@ -0,0 +1,129 @@
+.\" Copyright 1998 Thomas Sailer (sailer at ife.ee.ethz.ch)
+.\" May be distributed under the GNU General Public License
+.\"
+.\" "
+.TH EPPFPGA 8 "30 March 2000" "Eppfpga 0.8" "Linux AX.25 Utilities Manual"
+.SH NAME
+eppfpga \- Baycom EPP modem with FPGA configuration/diagnostics tool
+.SH SYNOPSIS
+.B eppfpga
+.B "[ \-vh ]"
+.B "[\-p portaddr]"
+.B "[\-m modestr]"
+.B "[\-t test]"
+
+
+.SH DESCRIPTION
+.B eppfpga
+is the configuration and diagnostics utility for the Baycom EPP modem.
+It can be used to download the FPGA ``firmware'' or to execute various tests.
+This utility is also needed during
+.I "ifconfig bcex up"
+and therefore should reside in /sbin.
+
+
+.SH OPTIONS
+.B eppfpga
+accepts the following options:
+
+.TP
+.B \-h
+Display an overview of the available command line parameters and exit.
+.TP
+.B \-v
+Increases the verbosity of the output. May be cumulated.
+.TP
+.B \-p
+Specifies the base address of the EPP capable parallel port to which
+the modem is connected. Use the
+.I 0x
+prefix to specify hexadecimal numbers.
+.TP
+.B \-m
+Specifies various ``firmware'' options.
+.TP
+.B \-t
+Execute the named test. Tests may be stopped by pressing
+\fICTRL\-C\fP.
+
+.SH "FIRMWARE OPTIONS"
+
+.TP
+.B intclk
+uses FPGA internal clock; \fBdon't\fP use if an external oscillator is on board.
+.TP
+.B extclk
+uses the external oscillator; recommended if the internal modem is used, as the
+frequency of the FPGA oscillator is not accurate enough.
+.TP
+.B intmodem
+uses the internal modem
+.TP
+.B extmodem
+uses a DF9IC type modem connected to the high speed modem connector
+.TP
+.B divider=x
+sets the clock divider for the internal modem (baud=fquartz/16/divider)
+.TP
+.B loopback
+sets an internal modem loopback
+.TP
+.B extstat
+allows extended status readback
+.TP
+.B noextstat
+disallows extended status readback
+.TP
+.B pttmute
+mutes modulation signal output when PTT is off (default)
+.TP
+.B nopttmute
+modulation signal is continuously output
+
+.SH TESTS
+
+.TP
+.B ram
+tests the on board SRAM using boundary scan
+.TP
+.B bled
+tests the on board LED's using boundary scan; \fBdisconnect PTT\fP during
+the test.
+.TP
+.B dac
+tests the on board DAC using boundary scan
+.TP
+.B led
+tests the CON and STA leds using EPP address write
+.TP
+.B ledfast
+tests the CON and STA leds using fast EPP address write
+.TP
+.B berr
+performs a BER test using the complete adapter. An external
+loopback is required.
+.TP
+.B berrv
+performs a BER test using the complete adapter. Also prints out
+the received bits. An external loopback is required.
+.TP
+.B ccnt
+frequency counter using the check firmware
+.TP
+.B cdac
+fast DAC test using the check firmware
+.TP
+.B cram
+fast RAM test using the check firmware
+.TP
+.B cled
+LED test using the check firmware
+
+.SH "SEE ALSO"
+.nf
+.BR ifconfig "\ (8), " sethdlc "\ (8), "
+linux/drivers/net/hamradio/baycom_epp.c
+.fi
+
+.SH AUTHOR
+eppfpga was written by Thomas Sailer, HB9JNX/AE4WA (sailer at ife.ee.ethz.ch).
diff --git a/main/eppfpga.c b/main/eppfpga.c
new file mode 100644
index 0000000..8be52b6
--- /dev/null
+++ b/main/eppfpga.c
@@ -0,0 +1,329 @@
+/*****************************************************************************/
+
+/*
+ * eppfpga.c -- HDLC packet radio modem for EPP using FPGA utility.
+ *
+ * Copyright (C) 1998-2000 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <signal.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#else
+#include "getopt.h"
+#endif
+
+#ifdef HAVE_SYSLOG_H
+#include <syslog.h>
+#endif
+
+#include "parport.h"
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+static unsigned verboselevel = 0;
+static unsigned syslogmsg = 0;
+static struct adapter_config cfg = { 19666600, 9600, 0, 0, 0, 1, 1, 0, 1 };
+static int quit = 0;
+
+/* ---------------------------------------------------------------------- */
+
+int lprintf(unsigned vl, const char *format, ...)
+{
+ va_list ap;
+ int r;
+
+ if (vl > verboselevel)
+ return 0;
+ va_start(ap, format);
+#ifdef HAVE_VSYSLOG
+ if (syslogmsg) {
+ static const int logprio[] = { LOG_ERR, LOG_INFO };
+ vsyslog((vl > 1) ? LOG_DEBUG : logprio[vl], format, ap);
+ r = 0;
+ } else
+#endif
+ r = vfprintf(stderr, format, ap);
+ va_end(ap);
+ return r;
+}
+
+int tprintf(const char *format, ...)
+{
+ va_list ap;
+ int i;
+
+ va_start(ap, format);
+ i = vprintf(format, ap);
+ va_end(ap);
+ fflush(stdout);
+ return i;
+}
+
+int idle_callback(unsigned us_delay)
+{
+ if (us_delay)
+ usleep(us_delay);
+ return quit;
+}
+
+void epp_error(const char *msg)
+{
+ lprintf(0, msg);
+ reset_modem();
+ exit(1);
+}
+
+static void signal_quit(int signum)
+{
+ quit = 1;
+}
+
+/* ---------------------------------------------------------------------- */
+
+int main(int argc, char *argv[])
+{
+ static const struct option long_options[] = {
+#ifdef HAVE_PPUSER
+ { "ppuser", 1, 0, 0x400 },
+ { "ppdev", 1, 0, 0x402 },
+#endif
+#ifdef HAVE_PPKDRV
+ { "ppkdrv", 1, 0, 0x401 },
+#endif
+#ifdef WIN32
+ { "ppgenport", 0, 0, 0x403 },
+ { "ppwin", 1, 0, 0x404 },
+ { "pplpt", 1, 0, 0x404 },
+ { "ppring0", 0, 0, 0x405 },
+#endif
+ { "ppforcehwepp", 0, 0, 0x410 },
+ { "ppswemulepp", 0, 0, 0x411 },
+ { "ppswemulecp", 0, 0, 0x412 },
+ { 0, 0, 0, 0 }
+ };
+ int c, err = 0;
+ const struct eppfpgatests *tst = NULL;
+ unsigned int iobase = 0x378, ntddkgenport = 0, ntdrv = 0, w9xring0 = 0, ppflags = 0;
+ const char *ppuser = NULL, *ppkdrv = NULL, *ppdev = NULL;
+
+ printf("eppfpga v" VERSION " (c) 1998-2000 by Thomas Sailer, HB9JNX/AE4WA\n");
+ while ((c = getopt_long(argc, argv, "svp:m:t:", long_options, NULL)) != EOF) {
+ switch (c) {
+ case 0x400:
+ ppuser = optarg;
+ ppkdrv = NULL;
+ ppdev = NULL;
+ ntddkgenport = 0;
+ ntdrv = 0;
+ w9xring0 = 0;
+ break;
+
+ case 0x401:
+ ppkdrv = optarg;
+ ppuser = NULL;
+ ppdev = NULL;
+ ntddkgenport = 0;
+ ntdrv = 0;
+ w9xring0 = 0;
+ break;
+
+ case 0x402:
+ ppkdrv = NULL;
+ ppuser = NULL;
+ ppdev = optarg;
+ ntddkgenport = 0;
+ ntdrv = 0;
+ w9xring0 = 0;
+ break;
+
+ case 0x403:
+ ppkdrv = NULL;
+ ppuser = NULL;
+ ppdev = NULL;
+ ntddkgenport = 1;
+ ntdrv = 0;
+ w9xring0 = 0;
+ break;
+
+ case 0x404:
+ ppkdrv = NULL;
+ ppuser = NULL;
+ ppdev = NULL;
+ ntddkgenport = 0;
+ ntdrv = strtoul(optarg, NULL, 0);
+ w9xring0 = 0;
+ break;
+
+ case 0x405:
+ ppkdrv = NULL;
+ ppuser = NULL;
+ ppdev = NULL;
+ ntddkgenport = 0;
+ ntdrv = 0;
+ w9xring0 = 1;
+ break;
+
+ case 0x410:
+ ppflags |= PPFLAG_FORCEHWEPP;
+ break;
+
+ case 0x411:
+ ppflags |= PPFLAG_SWEMULEPP;
+ break;
+
+ case 0x412:
+ ppflags |= PPFLAG_SWEMULECP;
+ break;
+
+#if defined(HAVE_SYSLOG) && defined(HAVE_VSYSLOG)
+ case 's':
+ if (syslogmsg)
+ break;
+ openlog("eppfpga", LOG_PID, LOG_USER);
+ syslogmsg = 1;
+ break;
+#endif
+
+ case 'v':
+ verboselevel++;
+ break;
+
+ case 'p':
+ iobase = strtoul(optarg, NULL, 0);
+ if (iobase <= 0 || iobase >= 0x3f8)
+ err++;
+ ppuser = NULL;
+ ppkdrv = NULL;
+ break;
+
+ case 'm':
+ parseconfig(&cfg, optarg);
+ break;
+
+ case 't':
+ if (tst != NULL) {
+ err++;
+ break;
+ }
+ for (tst = eppfpgatests; tst->name && strcmp(optarg, tst->name); tst++);
+ if (!tst->name)
+ err++;
+ break;
+
+ default:
+ err++;
+ break;
+ }
+ }
+ if (err) {
+ lprintf(0, "usage: %s [-v] [-p <portaddr>] [-m <modestr>] [-t <test>]\n"
+ " mode options:\n"
+ " intclk uses FPGA internal clock; DON'T use if an external osc is on board\n"
+ " extclk uses the external oscillator; recommended if the internal modem is used\n"
+ " intmodem uses the internal modem\n"
+ " extmodem uses a DF9IC type modem connected to the high speed modem connector\n"
+ " fclk= sets the FPGA clock frequency (default 19.6666 MHz)\n"
+ " bitrate= sets the bitrate for the FSK modem\n"
+ " loopback sets an internal modem loopback\n"
+ " extstat allows extended status readback\n"
+ " noextstat disallows extended status readback\n"
+ " test options:\n", argv[0]);
+ for (tst = eppfpgatests; tst->name; tst++)
+ lprintf(0, " %-15s%s\n", tst->name, tst->desc);
+ exit(1);
+ }
+#ifdef HAVE_PPUSER
+ if (ppkdrv) {
+ if (parport_init_ppkdrv(ppkdrv)) {
+ fprintf(stderr, "no kernel interface %s driver found\n", ppkdrv);
+ exit(1);
+ }
+ } else
+#endif
+#ifdef HAVE_PPUSER
+ if (ppdev) {
+ if (parport_init_ppdev(ppdev)) {
+ fprintf(stderr, "no ppdev driver found at %s\n", ppdev);
+ exit(1);
+ }
+ } else if (ppuser) {
+ if (parport_init_ppuser(ppuser)) {
+ fprintf(stderr, "no ppuser driver found at %s\n", ppuser);
+ exit(1);
+ }
+ } else
+#endif
+#ifdef WIN32
+ if (ntdrv) {
+ if (parport_init_win_flags(ntdrv-1, ppflags)) {
+ fprintf(stderr, "no eppflex.sys/vxd driver found\n");
+ exit(1);
+ }
+ } else if (ntddkgenport) {
+ if (parport_init_ntddkgenport()) {
+ fprintf(stderr, "no NTDDK genport.sys driver found\n");
+ exit(1);
+ }
+ } else if (w9xring0) {
+ if (parport_init_w9xring0_flags(iobase, ppflags)) {
+ fprintf(stderr, "no parport found at 0x%x\n", iobase);
+ exit(1);
+ }
+ } else
+#endif
+ if (parport_init_direct_flags(iobase, ppflags)) {
+ fprintf(stderr, "no parport found at 0x%x\n", iobase);
+ exit(1);
+ }
+ if (!tst) {
+ err = abs(adapter_start_epp(&cfg));
+ goto out;
+ }
+#ifdef SIGHUP
+ signal(SIGHUP, signal_quit);
+#endif
+ signal(SIGINT, signal_quit);
+#ifdef SIGQUIT
+ signal(SIGQUIT, signal_quit);
+#endif
+ signal(SIGTERM, signal_quit);
+ err = abs(tst->func(&cfg));
+ out:
+#ifdef WIN32
+ if (!ppkdrv && !ppuser && !ppdev && !ntddkgenport && ntdrv)
+ parport_stop_win();
+#endif
+ exit(err);
+}
diff --git a/main/eppsamp_firmware.h b/main/eppsamp_firmware.h
new file mode 100644
index 0000000..87fe576
--- /dev/null
+++ b/main/eppsamp_firmware.h
@@ -0,0 +1,1545 @@
+/*****************************************************************************/
+
+/*
+ * eppsamp_firmware.h -- HDLC packet radio modem for EPP using FPGA utility.
+ *
+ * Copyright (C) 1998 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+/* automatically generated, do not edit */
+
+#define EPPSAMP_FIRMWAREDATE "19990716"
+
+/* firmware */
+static const unsigned char eppsamp_firmware[] = {
+ 0xff, 0x04, 0xe8, 0x8c, 0xf9, 0xfe, 0xff, 0xff,
+ 0xfd, 0xed, 0xd7, 0xdf, 0xde, 0xfd, 0xed, 0x7d,
+ 0xef, 0xfe, 0xf6, 0xee, 0x6f, 0xef, 0xfe, 0xfe,
+ 0xff, 0x9b, 0xff, 0xfd, 0xaf, 0xff, 0xfd, 0xfb,
+ 0xff, 0xaf, 0xff, 0x7f, 0xfe, 0xd7, 0xff, 0x7f,
+ 0xfd, 0xff, 0xd7, 0xff, 0x7f, 0xff, 0xe6, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xfc, 0xed, 0xcf,
+ 0xff, 0xfe, 0xfc, 0xed, 0xcf, 0x5f, 0xfe, 0xf6,
+ 0xe7, 0x6f, 0x7f, 0xfe, 0xf6, 0xe7, 0xef, 0x6f,
+ 0xfe, 0xbf, 0x77, 0x5f, 0x7b, 0xfd, 0xb5, 0x77,
+ 0x5f, 0x7b, 0xd7, 0xbb, 0xaf, 0xbd, 0xfb, 0xda,
+ 0xbb, 0xaf, 0xbd, 0xfb, 0x9b, 0xff, 0x3f, 0xed,
+ 0xf5, 0xd3, 0x5f, 0x3f, 0xfd, 0xf5, 0xd3, 0x9f,
+ 0xfe, 0xfa, 0xe9, 0xaf, 0x9f, 0xfe, 0xfa, 0x69,
+ 0xff, 0xc6, 0xff, 0x3b, 0xfb, 0xfc, 0xf3, 0xcf,
+ 0x3f, 0xff, 0xfc, 0xf3, 0x9e, 0x7f, 0xfe, 0xf9,
+ 0xe7, 0x9f, 0x7f, 0xde, 0xb9, 0xbf, 0xf9, 0xff,
+ 0xaf, 0xbf, 0xff, 0xfe, 0xfb, 0xaf, 0xbf, 0xff,
+ 0xfa, 0xd7, 0xdf, 0x7f, 0xfd, 0xfd, 0xd7, 0xdf,
+ 0x7f, 0xfd, 0x6f, 0xfe, 0xff, 0xfa, 0xaf, 0xae,
+ 0xfa, 0xfa, 0xfa, 0xaf, 0xaf, 0x7f, 0xfd, 0xd7,
+ 0xd7, 0x7f, 0x7d, 0xfd, 0xd7, 0xd7, 0x7f, 0x9b,
+ 0xff, 0xdf, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe,
+ 0xfb, 0xef, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xf6, 0xff, 0xc6, 0xff, 0xdf, 0x7f,
+ 0xef, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xef,
+ 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe,
+ 0xbf, 0xf9, 0xff, 0x9f, 0x7f, 0xff, 0xed, 0xf7,
+ 0x9f, 0x7f, 0xff, 0xf9, 0xcf, 0xbf, 0xff, 0xfc,
+ 0xfb, 0xcf, 0xbf, 0xff, 0xfc, 0x6f, 0xf4, 0xff,
+ 0xed, 0xb7, 0xdf, 0x76, 0xfb, 0xed, 0xb7, 0xdf,
+ 0xfe, 0xf6, 0xdb, 0x6f, 0xbf, 0xfd, 0xf6, 0xdb,
+ 0x6f, 0xff, 0x9b, 0xff, 0x7f, 0xff, 0xf9, 0xf7,
+ 0xdf, 0x7f, 0xff, 0xfd, 0xe7, 0xbf, 0xff, 0xfc,
+ 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xff, 0xe6,
+ 0xbf, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f,
+ 0xf7, 0xdd, 0xef, 0xbf, 0xff, 0xee, 0xbb, 0xef,
+ 0xbf, 0xff, 0xfe, 0xbf, 0xf9, 0xff, 0xfc, 0xf3,
+ 0xcf, 0x35, 0xff, 0xec, 0xf3, 0xcf, 0x7f, 0xfe,
+ 0xf9, 0xa7, 0x9f, 0x7f, 0xfe, 0xf9, 0xe7, 0xff,
+ 0x6f, 0xfe, 0xff, 0xfd, 0x77, 0xdf, 0x7f, 0xff,
+ 0xfd, 0xf7, 0xdf, 0xff, 0xfe, 0xfb, 0xef, 0xbf,
+ 0xff, 0xfe, 0xfb, 0xef, 0xfd, 0x9b, 0xdd, 0xcf,
+ 0x3f, 0xbf, 0xfc, 0xf2, 0xcf, 0x3d, 0xf7, 0xcc,
+ 0xe7, 0x9f, 0x77, 0xfe, 0xf9, 0xe7, 0x9f, 0x7f,
+ 0xfe, 0xdd, 0x66, 0xff, 0xef, 0xbf, 0xff, 0xfe,
+ 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xf7, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xb7, 0xf9,
+ 0xef, 0xfe, 0xfb, 0xef, 0xb7, 0xff, 0xfe, 0xfb,
+ 0xef, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff,
+ 0xfd, 0xf7, 0xf7, 0x6f, 0xfe, 0xbf, 0xfd, 0xf6,
+ 0xdb, 0x6f, 0x9d, 0xfd, 0xf6, 0xdb, 0xdf, 0x7a,
+ 0xfb, 0xed, 0xb7, 0xdf, 0x7e, 0xfb, 0xad, 0xff,
+ 0x9b, 0xff, 0xff, 0xff, 0xfd, 0xbf, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff,
+ 0xff, 0xff, 0xfb, 0xff, 0xff, 0xe6, 0xff, 0x7f,
+ 0xf7, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xfe, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xbf, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xbf, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0x6f, 0xf6,
+ 0x3f, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xfe, 0xff, 0x9b, 0xff, 0x5f, 0xff, 0xfd,
+ 0xf7, 0x5f, 0x7d, 0xf5, 0xdd, 0xf7, 0xbd, 0xff,
+ 0xee, 0xfb, 0xef, 0xbf, 0xff, 0xfa, 0xfb, 0xff,
+ 0xe6, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xbf, 0xfd, 0xe9, 0xff, 0x7f, 0xfe, 0xff,
+ 0xed, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xf7,
+ 0xfe, 0xff, 0xef, 0xff, 0xff, 0xff, 0xdf, 0xbf,
+ 0x7f, 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0xff,
+ 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xdf, 0xfe, 0xfb,
+ 0xef, 0xf7, 0xff, 0xfb, 0xbf, 0xff, 0xef, 0xff,
+ 0xff, 0xde, 0xff, 0xff, 0xff, 0xff, 0x1b, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xef,
+ 0x7f, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xfe, 0xff,
+ 0xff, 0xff, 0xf7, 0x66, 0xfe, 0xff, 0xff, 0xff,
+ 0xbf, 0xf7, 0xff, 0xff, 0xff, 0x7f, 0xdf, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf,
+ 0xf9, 0xff, 0xff, 0xff, 0xaf, 0xde, 0xff, 0xfb,
+ 0xfd, 0xef, 0x7b, 0xfe, 0xff, 0x57, 0xff, 0xf7,
+ 0xfd, 0xff, 0xff, 0xff, 0x6f, 0xf6, 0xf7, 0xff,
+ 0xef, 0xd7, 0xff, 0xdf, 0xff, 0xdf, 0xef, 0xff,
+ 0xfb, 0xff, 0xef, 0x7f, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x9a, 0xfc, 0xff, 0xff, 0xf6, 0xfb, 0xfe,
+ 0xed, 0xff, 0xff, 0xff, 0xff, 0xef, 0x7f, 0xfb,
+ 0xf7, 0xf7, 0xfe, 0xff, 0xff, 0xff, 0xe6, 0xff,
+ 0xff, 0xcf, 0x2f, 0xf7, 0xfa, 0x5d, 0xff, 0xff,
+ 0xff, 0xf4, 0xb7, 0x5f, 0xf7, 0x7b, 0xdf, 0xbf,
+ 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xff, 0xef, 0xed,
+ 0xf7, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xf7,
+ 0xff, 0xff, 0xca, 0xff, 0xff, 0xff, 0xff, 0x6b,
+ 0xfe, 0xfd, 0x7f, 0xff, 0xfd, 0xf7, 0xf7, 0xff,
+ 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xfb, 0xff,
+ 0xf7, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, 0xf5,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xe6, 0xbf, 0xff, 0xbf, 0xfa, 0xee, 0xf2,
+ 0xef, 0xaf, 0xff, 0xfc, 0xf7, 0xfd, 0x7f, 0xff,
+ 0xfb, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0x7f,
+ 0xff, 0xe6, 0xbf, 0xff, 0xbf, 0xff, 0xef, 0xbf,
+ 0xf7, 0x7d, 0xf7, 0xdb, 0xfe, 0xff, 0xff, 0xff,
+ 0xff, 0xfb, 0x6f, 0x7e, 0xff, 0xff, 0x7b, 0xf3,
+ 0xff, 0xbf, 0xff, 0xfd, 0xf3, 0x5f, 0xff, 0xfd,
+ 0xf9, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x9b,
+ 0xff, 0x7f, 0xff, 0xff, 0x7b, 0x89, 0xff, 0xe7,
+ 0x5a, 0xe3, 0xdf, 0xff, 0xff, 0xfd, 0xf5, 0xff,
+ 0xff, 0xff, 0xff, 0xbf, 0xe6, 0xff, 0xff, 0xff,
+ 0xfd, 0xfe, 0xfa, 0xff, 0xbc, 0xa7, 0xff, 0xf5,
+ 0xdf, 0x5f, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff,
+ 0xb7, 0x79, 0xff, 0x7f, 0xf9, 0xb5, 0x97, 0xf2,
+ 0xff, 0xaf, 0xbf, 0xfe, 0xfd, 0xbf, 0xdc, 0x4b,
+ 0xff, 0xff, 0xff, 0xff, 0xeb, 0x6f, 0xdc, 0xff,
+ 0xcf, 0x3f, 0xef, 0xaf, 0xff, 0xff, 0xfb, 0xfb,
+ 0x5f, 0xff, 0xfd, 0xfd, 0xdf, 0xff, 0xff, 0xff,
+ 0xff, 0x5f, 0x99, 0xfb, 0xf5, 0xbf, 0x7f, 0xdb,
+ 0xff, 0xff, 0xff, 0xfe, 0xfb, 0xd5, 0xeb, 0x7f,
+ 0xfd, 0xb4, 0xff, 0xff, 0xff, 0xff, 0xef, 0x46,
+ 0xfe, 0xff, 0xbf, 0xca, 0x58, 0x6f, 0xfd, 0x3f,
+ 0xbf, 0xbb, 0xdd, 0x7b, 0x5f, 0x95, 0xed, 0xfe,
+ 0xff, 0xff, 0xfd, 0x93, 0x99, 0xff, 0x7f, 0xf9,
+ 0x3f, 0xff, 0xfe, 0xff, 0xcf, 0xbf, 0x7f, 0x7d,
+ 0xff, 0xd7, 0x5f, 0xdb, 0xff, 0xff, 0xff, 0xff,
+ 0x66, 0xec, 0xff, 0xcf, 0xfb, 0x9f, 0xff, 0xff,
+ 0xff, 0xfb, 0xfb, 0xdf, 0xff, 0xff, 0xf5, 0xd7,
+ 0xff, 0xff, 0xff, 0xff, 0xbf, 0x19, 0xf7, 0xf6,
+ 0xff, 0xef, 0xb7, 0xff, 0xf6, 0xdb, 0xfd, 0xbf,
+ 0xf9, 0xff, 0xb7, 0x9f, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x77, 0xe6, 0x7d, 0xff, 0xff, 0xdf, 0x79,
+ 0x7f, 0xff, 0x79, 0xf6, 0xff, 0xff, 0xfc, 0xfb,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbd, 0xb9,
+ 0xbe, 0xfb, 0xed, 0x35, 0xfe, 0x6e, 0xfb, 0xcd,
+ 0xbe, 0xff, 0xfd, 0xf7, 0xd9, 0x7f, 0xff, 0xfd,
+ 0xf7, 0xdf, 0xae, 0x6e, 0xee, 0xff, 0x3f, 0xff,
+ 0xfd, 0xf7, 0xcf, 0xef, 0xef, 0xff, 0xff, 0xff,
+ 0x77, 0xde, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x3d,
+ 0x9b, 0xf9, 0xff, 0xf7, 0xef, 0xbf, 0xff, 0xfe,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xdf, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xef, 0xe6, 0xf6, 0xff,
+ 0xaf, 0xff, 0xff, 0xfb, 0xeb, 0x2d, 0xbd, 0xff,
+ 0xff, 0xde, 0x5b, 0x7f, 0xfd, 0xff, 0xff, 0xff,
+ 0x7f, 0xbb, 0x61, 0xff, 0xff, 0xcb, 0xbd, 0x9e,
+ 0x7c, 0xf2, 0xa9, 0x66, 0xff, 0xbb, 0xd7, 0x57,
+ 0xff, 0xfd, 0xff, 0xff, 0xff, 0x7f, 0x6f, 0xfa,
+ 0xff, 0x7f, 0xfa, 0xef, 0xfe, 0xbf, 0xfe, 0xfa,
+ 0xeb, 0xfd, 0x7f, 0xbd, 0xf7, 0xd6, 0xfd, 0xff,
+ 0xff, 0xff, 0xff, 0x9b, 0xfe, 0xff, 0x8f, 0x3e,
+ 0xfb, 0xfc, 0xa3, 0x9b, 0x5e, 0x3a, 0xfd, 0x47,
+ 0x9f, 0xdf, 0xfe, 0xf9, 0xe7, 0x9f, 0x7f, 0xfe,
+ 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xeb,
+ 0xaf, 0xbf, 0xdf, 0xed, 0xff, 0x5f, 0xff, 0xfd,
+ 0xff, 0xff, 0xff, 0xff, 0xbf, 0xe1, 0xff, 0xff,
+ 0xef, 0xff, 0xff, 0xfe, 0xfa, 0xeb, 0xe7, 0x5f,
+ 0xfb, 0xff, 0xd7, 0xcf, 0xbf, 0xff, 0xff, 0xff,
+ 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xfb, 0xbf, 0xff,
+ 0xbf, 0xae, 0x6a, 0xe8, 0xf2, 0x7f, 0xf5, 0x57,
+ 0x59, 0xef, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xff,
+ 0xff, 0xff, 0xfe, 0xff, 0xff, 0x6f, 0xbb, 0xcf,
+ 0xba, 0xbf, 0x5f, 0xff, 0x9d, 0xfd, 0xfe, 0xff,
+ 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0x6d, 0x3f,
+ 0xf9, 0xf2, 0xff, 0x2f, 0xff, 0xf7, 0xe4, 0xb4,
+ 0x9f, 0x7e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf,
+ 0xf9, 0xff, 0xaf, 0xb7, 0xee, 0x7a, 0x43, 0xaf,
+ 0xb5, 0xfc, 0xe2, 0xd7, 0x5f, 0x75, 0xfd, 0xf5,
+ 0xd7, 0x5f, 0x7f, 0xfd, 0x6f, 0x3e, 0xfe, 0xff,
+ 0xbe, 0x7f, 0xff, 0xff, 0xeb, 0xf3, 0xff, 0xbf,
+ 0x7f, 0xfe, 0xff, 0x6f, 0xf5, 0xff, 0xff, 0xff,
+ 0xe7, 0x9b, 0xff, 0xf7, 0xef, 0xbf, 0xff, 0xff,
+ 0xff, 0xa9, 0x66, 0xff, 0xff, 0xfb, 0xf7, 0xdf,
+ 0xff, 0xfe, 0xff, 0xff, 0xff, 0xbf, 0xe6, 0xfb,
+ 0xff, 0xff, 0xdd, 0x7f, 0xdf, 0xbd, 0xff, 0xfe,
+ 0xff, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xbf, 0x71, 0xfe, 0xff, 0xeb, 0xaf,
+ 0xbd, 0xdd, 0xfa, 0xef, 0xff, 0x71, 0xf9, 0xf7,
+ 0xc7, 0x9b, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x67,
+ 0xbc, 0xfb, 0xff, 0xfb, 0xea, 0x7f, 0xbf, 0xfd,
+ 0xfd, 0xff, 0xbf, 0xbe, 0xff, 0xfb, 0xff, 0xfe,
+ 0xff, 0xff, 0xff, 0xff, 0x99, 0xfb, 0xff, 0xbb,
+ 0xff, 0xd9, 0x5f, 0xff, 0xef, 0xfe, 0xcb, 0xf9,
+ 0xdf, 0xff, 0xbf, 0xf3, 0xdf, 0xfe, 0xff, 0xff,
+ 0xff, 0xc6, 0xfb, 0xbf, 0xef, 0xbd, 0xff, 0xff,
+ 0xff, 0x4e, 0xbf, 0xff, 0xbf, 0xff, 0xdf, 0xff,
+ 0xf3, 0xf9, 0xbe, 0xff, 0xff, 0x9f, 0xe1, 0xef,
+ 0xff, 0xee, 0xbe, 0xdf, 0xeb, 0xff, 0xfb, 0x3d,
+ 0xff, 0xdf, 0xff, 0xf7, 0xf6, 0xeb, 0xfd, 0xff,
+ 0xff, 0xff, 0x6b, 0xfc, 0xff, 0xff, 0xfd, 0xfd,
+ 0xff, 0xff, 0x7f, 0xff, 0xfd, 0x12, 0xbd, 0x7f,
+ 0xfe, 0xfb, 0x9f, 0xf7, 0xff, 0xff, 0xff, 0x99,
+ 0xfd, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xfb, 0xff,
+ 0xff, 0xdf, 0x5f, 0xff, 0xef, 0xff, 0xff, 0xbf,
+ 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0xff,
+ 0xef, 0xde, 0xda, 0xef, 0xaf, 0x9b, 0xee, 0xff,
+ 0xd7, 0xef, 0x7f, 0xfd, 0xf1, 0xff, 0xff, 0xdf,
+ 0xbf, 0xf9, 0xf7, 0xda, 0xff, 0xdf, 0xff, 0xfa,
+ 0xff, 0xfe, 0xaf, 0xff, 0xff, 0xf5, 0xfd, 0x7f,
+ 0xf6, 0xfd, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xfd,
+ 0xff, 0xff, 0xbf, 0xbf, 0xbf, 0xdf, 0xef, 0xfd,
+ 0xff, 0xbf, 0xdf, 0x9f, 0x6f, 0x7f, 0xef, 0xff,
+ 0xff, 0xff, 0x1b, 0xfe, 0xff, 0xff, 0xff, 0xda,
+ 0x9f, 0x7f, 0xff, 0xcf, 0x2f, 0x3f, 0xf2, 0xff,
+ 0x3d, 0xf5, 0xdf, 0xff, 0xff, 0xff, 0x3f, 0x66,
+ 0xff, 0xff, 0xff, 0xbf, 0xce, 0xff, 0x6f, 0xff,
+ 0xfd, 0xcf, 0xbf, 0xff, 0xdf, 0x2f, 0xfd, 0xb7,
+ 0xff, 0xff, 0xff, 0xb7, 0xf9, 0xff, 0x7f, 0xfe,
+ 0xaf, 0xff, 0xf9, 0xff, 0xdf, 0x7c, 0xfe, 0xf3,
+ 0xaf, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x6f, 0xd6, 0xff, 0x9f, 0xff, 0xfb, 0x5f, 0xe7,
+ 0xcf, 0xed, 0xf7, 0xbf, 0xff, 0xfa, 0xfd, 0xde,
+ 0xfb, 0xff, 0xff, 0xff, 0x5f, 0x9b, 0xfb, 0xff,
+ 0xbf, 0x6d, 0xba, 0xfd, 0xff, 0x9b, 0xf5, 0xc7,
+ 0x7f, 0xff, 0x7f, 0x5d, 0xa4, 0xf0, 0xff, 0xff,
+ 0xff, 0xef, 0x66, 0xfe, 0xff, 0x7f, 0x96, 0x6e,
+ 0xf7, 0xbb, 0xff, 0xd6, 0xff, 0xff, 0xff, 0x5f,
+ 0x2d, 0xf9, 0xdd, 0xff, 0xff, 0xff, 0xb3, 0xb1,
+ 0xff, 0xff, 0xdf, 0xaf, 0xfd, 0xcd, 0x7a, 0xff,
+ 0xe5, 0xd5, 0xbb, 0xef, 0xd7, 0xff, 0x7e, 0xfd,
+ 0xff, 0xff, 0xff, 0x66, 0xe2, 0xff, 0xff, 0xff,
+ 0xeb, 0x7f, 0xb3, 0x8e, 0xef, 0x3b, 0xff, 0xdf,
+ 0xff, 0xf5, 0x7f, 0x5f, 0xff, 0xff, 0xff, 0xbf,
+ 0x9b, 0xf7, 0xff, 0xf3, 0x6f, 0x3f, 0xdf, 0xff,
+ 0xf3, 0xcf, 0x3f, 0xbb, 0xf9, 0xb7, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xf7, 0xe6, 0xfd, 0xff,
+ 0x79, 0xf7, 0x9b, 0xe7, 0xff, 0x7f, 0xfe, 0x99,
+ 0xef, 0xbe, 0xfb, 0xff, 0xb7, 0xff, 0xff, 0xff,
+ 0xff, 0xbd, 0xb1, 0x7f, 0xfb, 0x4d, 0xb1, 0xd7,
+ 0x5c, 0xfb, 0x8d, 0x3f, 0xd7, 0x79, 0xa7, 0xdd,
+ 0x7f, 0x9c, 0xfd, 0xf7, 0xdf, 0xff, 0x62, 0xe6,
+ 0xef, 0x3f, 0xff, 0xfd, 0xf7, 0xdf, 0x6f, 0xff,
+ 0xfd, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xed, 0xff,
+ 0xff, 0xff, 0x3f, 0x9b, 0xfb, 0xff, 0xf7, 0xbf,
+ 0xff, 0xbe, 0xfe, 0xf7, 0xbf, 0xbf, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xef,
+ 0xa6, 0xfe, 0xeb, 0xff, 0xb6, 0xde, 0x77, 0xff,
+ 0x77, 0xfe, 0xfd, 0xcf, 0xf7, 0xff, 0xaf, 0xf1,
+ 0xf5, 0xff, 0xff, 0xff, 0xab, 0x79, 0xff, 0xf2,
+ 0xff, 0xaf, 0xda, 0xf9, 0xf7, 0x9f, 0x7f, 0xda,
+ 0xfb, 0xed, 0xbf, 0x7b, 0x7c, 0xf9, 0xff, 0xff,
+ 0x7f, 0x6f, 0xfe, 0x9f, 0xfe, 0x72, 0xef, 0xff,
+ 0xbf, 0xef, 0x2e, 0xff, 0xff, 0x7e, 0xfd, 0xff,
+ 0xd7, 0x5d, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xff,
+ 0xaf, 0x8f, 0x3e, 0xfe, 0xfc, 0xf3, 0xdb, 0x7f,
+ 0x3f, 0xfd, 0x47, 0x9f, 0x9f, 0xe4, 0xd1, 0xe7,
+ 0x9f, 0x7f, 0xfe, 0xe6, 0xff, 0xff, 0xbf, 0xbf,
+ 0xfe, 0xe7, 0xdf, 0xef, 0xbf, 0xff, 0xff, 0xd7,
+ 0x7f, 0xe7, 0xfd, 0xe5, 0xff, 0xff, 0xff, 0xbf,
+ 0xf9, 0xff, 0xff, 0xfb, 0xaf, 0xbf, 0xff, 0xff,
+ 0xff, 0xf7, 0xdf, 0xff, 0xf5, 0xf7, 0x6f, 0x3f,
+ 0xfb, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xff,
+ 0xfa, 0xaf, 0xff, 0xfe, 0xad, 0xef, 0xbc, 0x70,
+ 0xff, 0xfd, 0xf7, 0x51, 0x4f, 0xff, 0xff, 0xff,
+ 0xff, 0x9b, 0xff, 0xef, 0xbf, 0xfe, 0xfa, 0xfb,
+ 0x7f, 0xfb, 0xcf, 0x3f, 0xf7, 0x7f, 0x7f, 0xdf,
+ 0xf5, 0xb6, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff,
+ 0xff, 0x6f, 0xbf, 0xfc, 0xff, 0xdf, 0x4d, 0xbf,
+ 0xff, 0xff, 0xff, 0xff, 0x7b, 0xfb, 0xed, 0xff,
+ 0xf7, 0xff, 0xbf, 0xe9, 0xff, 0xaf, 0xbd, 0xf6,
+ 0xda, 0xeb, 0xa7, 0x9a, 0xd6, 0xfa, 0xd7, 0x5f,
+ 0x7f, 0xc9, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0x6b,
+ 0xfe, 0xff, 0xf7, 0xbc, 0x37, 0x3f, 0x9e, 0xac,
+ 0xc3, 0xdf, 0xff, 0xff, 0xd9, 0xff, 0x77, 0x9d,
+ 0xff, 0xff, 0xff, 0xff, 0x1b, 0xff, 0xff, 0xef,
+ 0xaf, 0xff, 0xfa, 0xed, 0xbf, 0xff, 0xad, 0xfd,
+ 0x5d, 0xd7, 0xff, 0x3e, 0x7f, 0xfb, 0xff, 0xff,
+ 0x7e, 0xe6, 0x7f, 0xdf, 0xff, 0xfd, 0xff, 0x1d,
+ 0xef, 0x5f, 0xfd, 0x5f, 0xff, 0x7f, 0xff, 0xfb,
+ 0xff, 0xff, 0xff, 0xf7, 0xff, 0xbb, 0xf9, 0xff,
+ 0xfe, 0xff, 0xa7, 0x3b, 0xfe, 0x7b, 0xe3, 0x2f,
+ 0x7f, 0xd8, 0xed, 0xf7, 0xff, 0xff, 0xf9, 0xef,
+ 0xff, 0xef, 0x6f, 0xfe, 0xff, 0xde, 0xff, 0x9b,
+ 0xdf, 0xb7, 0xf7, 0x1d, 0xe7, 0xbf, 0xef, 0x5b,
+ 0xaf, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x9b,
+ 0xfe, 0xff, 0x6f, 0xfe, 0xb9, 0xff, 0xff, 0x7f,
+ 0xfe, 0xfb, 0xcf, 0x7f, 0xef, 0xe8, 0x5f, 0xc7,
+ 0xfd, 0xff, 0x7f, 0xff, 0xe6, 0xff, 0xfb, 0xaf,
+ 0xbd, 0xff, 0xf7, 0x7f, 0xff, 0x3e, 0xb7, 0xcc,
+ 0xd7, 0xff, 0x7f, 0xfb, 0xf5, 0xff, 0xfd, 0xff,
+ 0xbf, 0xf9, 0xfe, 0xfb, 0xff, 0xbf, 0xdd, 0xfb,
+ 0xef, 0xff, 0xbf, 0xbf, 0xfd, 0xef, 0xff, 0x7f,
+ 0xe9, 0x7f, 0xff, 0xff, 0xff, 0x6e, 0xbe, 0xff,
+ 0xff, 0xe7, 0xfe, 0xfe, 0x5f, 0x7f, 0xff, 0x91,
+ 0xf6, 0x3d, 0x54, 0xe4, 0xfb, 0xff, 0xfd, 0xfe,
+ 0xff, 0xff, 0x9b, 0xef, 0xff, 0xf7, 0xbf, 0xff,
+ 0x7f, 0xdf, 0xfe, 0xff, 0xec, 0xff, 0xbf, 0xff,
+ 0xff, 0xff, 0x7f, 0x6f, 0xff, 0xff, 0xff, 0xe6,
+ 0xdf, 0xff, 0xff, 0xfd, 0xfe, 0xfa, 0xef, 0xae,
+ 0x99, 0x5e, 0x3f, 0xda, 0x5d, 0xf7, 0xfd, 0xc7,
+ 0xff, 0xff, 0xff, 0xbb, 0xc1, 0x7f, 0xff, 0xff,
+ 0x1f, 0xdf, 0xff, 0xdb, 0x6f, 0xad, 0x7f, 0xfd,
+ 0xb5, 0xdf, 0x1f, 0xfe, 0xed, 0xff, 0xff, 0xff,
+ 0x66, 0xba, 0xff, 0xf7, 0xff, 0xaf, 0xff, 0xbf,
+ 0xde, 0xfd, 0xbf, 0xf5, 0x7f, 0xff, 0xfb, 0xff,
+ 0x9f, 0xfd, 0xff, 0xff, 0xfb, 0x9b, 0xfe, 0xaf,
+ 0xbf, 0x98, 0xff, 0xff, 0xb9, 0xbe, 0xff, 0x6b,
+ 0xd5, 0xdf, 0x7d, 0xe3, 0xd7, 0xff, 0xfe, 0xfc,
+ 0xff, 0xbf, 0xa6, 0xff, 0x6b, 0xbf, 0xfc, 0xff,
+ 0xff, 0xdb, 0xef, 0xbf, 0xcd, 0xf5, 0xb2, 0xdf,
+ 0x62, 0xff, 0xfd, 0xbf, 0xff, 0xff, 0xb7, 0x79,
+ 0xff, 0x7a, 0xea, 0xf5, 0xf3, 0xff, 0x73, 0xf9,
+ 0xb5, 0xff, 0xf9, 0xfd, 0xf7, 0xfe, 0xfd, 0xff,
+ 0xff, 0xff, 0xf3, 0x6f, 0xd4, 0xa7, 0xde, 0x3b,
+ 0xff, 0xef, 0xbf, 0xfd, 0x7e, 0xfb, 0x19, 0x7e,
+ 0xff, 0x7d, 0xfe, 0xf3, 0xff, 0xff, 0xff, 0x5e,
+ 0x99, 0xfb, 0xb7, 0xaf, 0x5e, 0xbe, 0x7d, 0x3f,
+ 0xd9, 0xbf, 0xbf, 0xd5, 0xde, 0xff, 0xff, 0xf7,
+ 0xfa, 0xea, 0xff, 0x7f, 0xef, 0x86, 0x7e, 0xac,
+ 0xbf, 0xda, 0x7b, 0xdf, 0xdb, 0xf5, 0xff, 0x7f,
+ 0xb5, 0x57, 0xff, 0x7d, 0xbf, 0x3e, 0xfb, 0xff,
+ 0xff, 0x93, 0xb9, 0xff, 0xfa, 0x6f, 0xff, 0xef,
+ 0xff, 0xf3, 0xeb, 0xaf, 0xef, 0xab, 0xbd, 0xff,
+ 0x5f, 0xff, 0xef, 0xff, 0xff, 0xff, 0x66, 0xec,
+ 0xbf, 0xfe, 0xfb, 0xff, 0xef, 0xbf, 0xf1, 0x5a,
+ 0x6b, 0xff, 0x47, 0xed, 0xff, 0xd7, 0xfe, 0xff,
+ 0xff, 0xff, 0x3f, 0x18, 0xf7, 0xfc, 0xf3, 0xff,
+ 0x3f, 0xff, 0xf6, 0xfd, 0xbf, 0xbf, 0xf9, 0xed,
+ 0xb7, 0xff, 0x7f, 0xfb, 0xff, 0xff, 0xdf, 0x77,
+ 0xe6, 0xfd, 0xff, 0xf9, 0xf7, 0x9f, 0xef, 0x1f,
+ 0xf9, 0xfe, 0xfb, 0xbf, 0xfe, 0xfb, 0xff, 0x37,
+ 0xff, 0xfe, 0xff, 0x8f, 0xb5, 0xb9, 0x5e, 0xfb,
+ 0xef, 0xbb, 0xfd, 0xfe, 0xeb, 0xef, 0xb5, 0xd7,
+ 0x6d, 0xf7, 0xd9, 0x6f, 0xaf, 0x7d, 0xf7, 0xdf,
+ 0xbf, 0x6e, 0xee, 0xdf, 0x7f, 0xff, 0xfd, 0xf7,
+ 0xdf, 0x73, 0xff, 0xfd, 0xf7, 0xff, 0x7f, 0xfe,
+ 0xf9, 0xef, 0xff, 0xff, 0xff, 0x3b, 0x9b, 0xf9,
+ 0xfd, 0xef, 0xbf, 0xbf, 0xff, 0xfd, 0xf7, 0xbf,
+ 0xff, 0xfe, 0xff, 0xef, 0xdf, 0x7f, 0xff, 0xff,
+ 0xff, 0xbf, 0xef, 0xe6, 0xf6, 0xfb, 0xf7, 0xbf,
+ 0xde, 0x7a, 0x7f, 0xbf, 0xfd, 0xf6, 0xf5, 0xff,
+ 0x7f, 0x7f, 0xad, 0xff, 0xff, 0x4f, 0x7f, 0xbb,
+ 0x61, 0xff, 0xf6, 0xdf, 0x6f, 0x9f, 0xc9, 0xe7,
+ 0xab, 0xae, 0x7a, 0xf5, 0xdf, 0x57, 0xdf, 0xf5,
+ 0xf7, 0xff, 0x97, 0x7f, 0x6f, 0xfe, 0xdf, 0xff,
+ 0xfe, 0xeb, 0xaf, 0xff, 0xff, 0xfb, 0xff, 0x5d,
+ 0xff, 0xfd, 0xf7, 0xdf, 0xff, 0xff, 0xdf, 0xff,
+ 0xdf, 0x9b, 0xff, 0xff, 0xcf, 0x3e, 0xfa, 0xe8,
+ 0xf3, 0x8f, 0x8e, 0x3b, 0xde, 0x67, 0x1f, 0x7d,
+ 0xff, 0xfc, 0xe7, 0x9f, 0x7f, 0xfe, 0xe6, 0xff,
+ 0xfb, 0xff, 0xbf, 0xff, 0xfa, 0xff, 0xfb, 0xef,
+ 0xbe, 0xc5, 0xff, 0xff, 0x7f, 0xfd, 0xfd, 0xff,
+ 0x5f, 0xff, 0xbf, 0xf9, 0xff, 0xfe, 0xff, 0xef,
+ 0xbf, 0xfe, 0xff, 0xfb, 0xa6, 0x57, 0xfd, 0xff,
+ 0xf7, 0xcf, 0xaf, 0xff, 0xff, 0xd7, 0xff, 0x6f,
+ 0xfe, 0xbf, 0xff, 0xff, 0xfb, 0xaf, 0xfe, 0xbb,
+ 0x6f, 0xbe, 0x5a, 0xfd, 0xf5, 0xdf, 0x5f, 0xff,
+ 0xfd, 0xff, 0xff, 0xff, 0x1b, 0xfe, 0xff, 0xff,
+ 0xff, 0xf6, 0xeb, 0xbf, 0xbb, 0xef, 0x7b, 0x9f,
+ 0x7f, 0x7e, 0xbf, 0xff, 0xfe, 0xff, 0xff, 0xff,
+ 0xff, 0xe6, 0xff, 0xdf, 0xff, 0x3f, 0xf9, 0xff,
+ 0xfe, 0x2f, 0xfe, 0xbb, 0xfc, 0xa7, 0xdf, 0xfe,
+ 0xf7, 0xe5, 0x7d, 0xff, 0xff, 0xbf, 0xf9, 0xbf,
+ 0x8f, 0xbd, 0xda, 0xea, 0xab, 0x07, 0xbf, 0xfc,
+ 0x32, 0x17, 0x4f, 0x6d, 0xfd, 0xf1, 0xd6, 0x5f,
+ 0x7f, 0xed, 0x6f, 0x3e, 0xbf, 0xff, 0xbb, 0xff,
+ 0xff, 0xff, 0xfb, 0xdd, 0xff, 0xfe, 0xde, 0x9e,
+ 0x9d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b,
+ 0xff, 0xff, 0xdf, 0xfa, 0xff, 0xfd, 0xf7, 0xee,
+ 0x7f, 0xff, 0xf5, 0xec, 0xf7, 0x7f, 0xff, 0xbf,
+ 0xff, 0xff, 0xfb, 0x7f, 0xe6, 0x7f, 0xff, 0xff,
+ 0xff, 0xf7, 0xdf, 0xfe, 0xf7, 0xdf, 0x7f, 0xff,
+ 0xfb, 0xee, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x9f, 0xf1, 0xff, 0xbb, 0xcb, 0xff, 0xbf, 0xde,
+ 0x7e, 0xe3, 0xff, 0xfe, 0xbf, 0xef, 0xdf, 0xff,
+ 0x7f, 0xdf, 0xdf, 0xff, 0xff, 0x67, 0xf8, 0xbd,
+ 0xef, 0xba, 0xfc, 0xaf, 0xff, 0xfa, 0xfd, 0xff,
+ 0xfb, 0xff, 0x7f, 0xbf, 0xff, 0xff, 0xfe, 0xff,
+ 0xff, 0xff, 0x99, 0xf7, 0xf7, 0x7f, 0xd6, 0x7f,
+ 0xef, 0xfb, 0xfb, 0xef, 0xff, 0xcb, 0x7e, 0x7b,
+ 0xdf, 0xe7, 0xbf, 0xff, 0xfb, 0xff, 0x7f, 0xc6,
+ 0xdf, 0xeb, 0xef, 0xf7, 0xff, 0xff, 0xdf, 0x7e,
+ 0xd7, 0xfd, 0xf5, 0xff, 0xfb, 0xff, 0xff, 0xdf,
+ 0xff, 0xff, 0xff, 0xbf, 0xb1, 0xff, 0x3f, 0x6f,
+ 0xff, 0xff, 0x79, 0xdf, 0xff, 0xff, 0xb1, 0xef,
+ 0xef, 0xff, 0xf3, 0xea, 0xff, 0xff, 0xff, 0xef,
+ 0x6f, 0xfc, 0xff, 0xfd, 0xbf, 0xdf, 0xde, 0x7f,
+ 0xff, 0xff, 0xf3, 0xff, 0xff, 0xda, 0xf1, 0xff,
+ 0x1f, 0x77, 0xfc, 0xff, 0xff, 0x9b, 0xdb, 0xff,
+ 0xff, 0xff, 0x6f, 0xf7, 0xbf, 0xff, 0xff, 0xfc,
+ 0xfe, 0x7f, 0xff, 0xfd, 0x7f, 0xdf, 0x7f, 0xff,
+ 0xff, 0xff, 0xe6, 0xff, 0xed, 0xaf, 0xff, 0xff,
+ 0xb3, 0xff, 0xf7, 0xcf, 0xff, 0xff, 0x93, 0xed,
+ 0xff, 0xf9, 0xff, 0xd3, 0xff, 0xfe, 0xab, 0xf9,
+ 0xf7, 0xfb, 0xef, 0xaf, 0x7f, 0xfe, 0xd7, 0x7f,
+ 0xfd, 0xfd, 0xfd, 0xc7, 0xff, 0x53, 0xff, 0xfb,
+ 0xf7, 0xff, 0xff, 0x6d, 0xfe, 0x3f, 0xff, 0xfd,
+ 0xbf, 0xb7, 0xfe, 0xff, 0xbf, 0xff, 0x7f, 0xfb,
+ 0xfd, 0xff, 0xf7, 0xff, 0xff, 0xfe, 0xff, 0xff,
+ 0x1b, 0xfe, 0xaf, 0xbf, 0x5f, 0x63, 0xbe, 0xfc,
+ 0xe6, 0x9b, 0x6e, 0x7e, 0x4b, 0xfd, 0xf7, 0xfd,
+ 0x7c, 0xff, 0xe7, 0xf7, 0x3f, 0x66, 0xff, 0xeb,
+ 0xff, 0xbf, 0x5b, 0xf7, 0xff, 0xf5, 0x96, 0x5d,
+ 0xdf, 0x92, 0xff, 0x7e, 0xbf, 0xfe, 0xff, 0xeb,
+ 0xfd, 0xb7, 0xf9, 0x9f, 0x7f, 0x79, 0x35, 0xd5,
+ 0xf7, 0xef, 0xff, 0xef, 0xf3, 0xed, 0xe5, 0xff,
+ 0xeb, 0xff, 0xf7, 0xff, 0xff, 0xff, 0x6f, 0xd6,
+ 0xf7, 0xff, 0x3b, 0xd3, 0xed, 0xff, 0xff, 0xff,
+ 0xfb, 0xd9, 0x7f, 0xf4, 0xff, 0xfc, 0xff, 0xff,
+ 0xfe, 0xff, 0x5f, 0x9b, 0xeb, 0x3b, 0x9b, 0xff,
+ 0xfa, 0x7c, 0xf6, 0xfd, 0xf7, 0xde, 0xd7, 0xca,
+ 0xfa, 0xef, 0xbd, 0xff, 0xfe, 0xfa, 0xef, 0xef,
+ 0x66, 0xfe, 0xdf, 0xb7, 0x9a, 0xbe, 0xef, 0xff,
+ 0xff, 0xbf, 0xfb, 0xd5, 0x33, 0xff, 0x7f, 0xef,
+ 0xff, 0xff, 0xff, 0xff, 0xb3, 0xb1, 0xff, 0xff,
+ 0xfa, 0xaf, 0xff, 0xc3, 0xcf, 0xbf, 0xed, 0xfe,
+ 0x6d, 0xcd, 0xff, 0x5b, 0xff, 0xf7, 0xff, 0x7a,
+ 0xeb, 0x66, 0xee, 0xff, 0xfd, 0xfb, 0xdb, 0xff,
+ 0xfd, 0xf7, 0x5f, 0x7a, 0xdf, 0x79, 0xab, 0x1f,
+ 0xd4, 0xff, 0xfb, 0xf7, 0x3f, 0xbe, 0x9b, 0xf7,
+ 0x7f, 0xdb, 0x6f, 0xff, 0xdf, 0x7f, 0xff, 0xbd,
+ 0xf7, 0xbb, 0xff, 0xdf, 0xfb, 0x7f, 0xfe, 0xff,
+ 0xff, 0xfb, 0xf7, 0xe6, 0xfd, 0xff, 0xfd, 0xf7,
+ 0xdb, 0x67, 0x1f, 0x7f, 0xfc, 0xf1, 0xcf, 0x3f,
+ 0xf3, 0xf8, 0xbf, 0xff, 0xbf, 0xfb, 0xfc, 0xad,
+ 0xb1, 0x5f, 0xf3, 0xee, 0xb3, 0xcf, 0xe8, 0xe3,
+ 0x8f, 0x3f, 0xde, 0xf9, 0xd7, 0x9f, 0x7f, 0xdf,
+ 0xfd, 0x67, 0x1f, 0xff, 0x66, 0xe6, 0xdf, 0x7f,
+ 0xbf, 0xfd, 0xf3, 0xff, 0xfb, 0xef, 0xbf, 0xf6,
+ 0xff, 0xf7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x3f, 0x9b, 0xfb, 0xfe, 0xfb, 0xdf, 0xff, 0xfe,
+ 0xff, 0xff, 0xff, 0xbf, 0x7f, 0xff, 0xff, 0xf7,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xa6, 0xfe,
+ 0xdf, 0xef, 0xdf, 0xdf, 0xc2, 0x1f, 0x7f, 0xbc,
+ 0xf0, 0x87, 0x7f, 0xfb, 0x7a, 0xfd, 0xff, 0x13,
+ 0xff, 0xf8, 0xab, 0x79, 0xff, 0xff, 0xdd, 0x7d,
+ 0x9a, 0xf8, 0xef, 0xbf, 0x2f, 0x7e, 0xf1, 0xce,
+ 0x7f, 0x5f, 0xfd, 0xf7, 0xc5, 0x7f, 0x7f, 0x6f,
+ 0xfe, 0xbf, 0xfe, 0x7e, 0xff, 0xef, 0xf2, 0xdd,
+ 0x6f, 0xe9, 0x7f, 0xee, 0xf7, 0x7f, 0xdf, 0xff,
+ 0xb7, 0xf5, 0xdf, 0xff, 0x9b, 0xff, 0xbf, 0x8f,
+ 0x3f, 0xff, 0xe8, 0xf3, 0xdb, 0x4f, 0x32, 0xd5,
+ 0xe7, 0x9f, 0x9f, 0xf6, 0xf9, 0x67, 0x9f, 0x7f,
+ 0xfe, 0xe6, 0xff, 0xeb, 0xaf, 0xff, 0xfe, 0xfa,
+ 0xdf, 0xff, 0xff, 0xfd, 0xff, 0xf7, 0xff, 0x7c,
+ 0xff, 0xef, 0xdf, 0xff, 0xff, 0xbf, 0xf9, 0xff,
+ 0xfa, 0xeb, 0xff, 0xbf, 0xfe, 0xbf, 0xff, 0xf5,
+ 0xdb, 0xfd, 0xfd, 0xff, 0xcd, 0xbf, 0xfb, 0xf7,
+ 0xff, 0xff, 0x6f, 0xfe, 0x9f, 0xfe, 0xfa, 0xbf,
+ 0xaf, 0xfe, 0xb9, 0xaf, 0x9c, 0xf1, 0xfd, 0xf7,
+ 0xdf, 0x78, 0xef, 0x7d, 0xf5, 0xdf, 0xff, 0x9b,
+ 0xff, 0xaf, 0xbf, 0xfe, 0xff, 0xeb, 0xff, 0xfb,
+ 0xdf, 0xbf, 0xdf, 0xff, 0xff, 0xdf, 0xff, 0xfe,
+ 0x5f, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xfb, 0xef,
+ 0xaf, 0xfd, 0xf6, 0xff, 0xff, 0xb7, 0xfd, 0xdf,
+ 0xa7, 0xff, 0x6f, 0xfb, 0xff, 0xff, 0xff, 0xfb,
+ 0xbf, 0xe9, 0xff, 0xad, 0xbd, 0xd6, 0xba, 0xab,
+ 0x2f, 0x3f, 0x76, 0xea, 0xd7, 0x5c, 0x7d, 0xcd,
+ 0xf5, 0xd7, 0x5f, 0x7f, 0xed, 0x6b, 0xde, 0xff,
+ 0xff, 0xfd, 0x9b, 0xee, 0xff, 0x7c, 0xf3, 0xc2,
+ 0x7e, 0xf4, 0xf9, 0x6f, 0xf7, 0xef, 0xef, 0xff,
+ 0xcf, 0xff, 0x1b, 0x7d, 0xff, 0xff, 0xef, 0xed,
+ 0xfe, 0xef, 0xbb, 0x6f, 0xfb, 0xdd, 0x57, 0xff,
+ 0xfa, 0xff, 0xfe, 0xef, 0xed, 0xfe, 0x7f, 0xa6,
+ 0xff, 0x9f, 0xff, 0xef, 0xf7, 0xe7, 0xef, 0xdf,
+ 0xb7, 0x7f, 0x7d, 0xfb, 0xe7, 0xff, 0x77, 0xfe,
+ 0xff, 0xfd, 0xff, 0xaf, 0xf9, 0xff, 0xac, 0xa9,
+ 0xcf, 0x37, 0x5f, 0x7f, 0xff, 0x29, 0xff, 0xfd,
+ 0xf1, 0xff, 0x7f, 0xff, 0xdf, 0xd1, 0xff, 0xff,
+ 0x6f, 0xfe, 0xf7, 0xff, 0xfb, 0xfd, 0xff, 0xff,
+ 0xbb, 0xff, 0x6b, 0xff, 0xf5, 0x7e, 0xff, 0xf7,
+ 0xf6, 0xff, 0xfe, 0xfe, 0xff, 0x9b, 0xbe, 0x9f,
+ 0x3f, 0xee, 0xff, 0xe7, 0xff, 0xdb, 0xff, 0xf9,
+ 0x53, 0x7f, 0xff, 0xdd, 0xaf, 0xfe, 0x7d, 0xf7,
+ 0xff, 0xff, 0xe6, 0xfd, 0xdf, 0x2f, 0xbf, 0xfc,
+ 0xce, 0xdf, 0x7b, 0xaf, 0xff, 0xb0, 0x87, 0x1f,
+ 0xfe, 0xf7, 0xff, 0xff, 0xff, 0xbf, 0xbf, 0xb9,
+ 0xff, 0x5f, 0x3f, 0xff, 0xff, 0xfe, 0xdf, 0xfe,
+ 0xbf, 0xf7, 0xaf, 0xff, 0xfd, 0xfb, 0xf9, 0xff,
+ 0xef, 0xff, 0xfb, 0x6f, 0xfa, 0xff, 0xfb, 0xff,
+ 0x23, 0x7b, 0xcb, 0x7f, 0xfe, 0xfd, 0xf7, 0xad,
+ 0xdf, 0x7e, 0xfb, 0xfb, 0xf7, 0xf7, 0xff, 0xff,
+ 0x9b, 0xfb, 0xff, 0xff, 0xdf, 0xf7, 0xfc, 0xff,
+ 0xb7, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xfe, 0xff, 0xff, 0xff, 0xe6, 0xdf, 0xe9,
+ 0xba, 0xdf, 0xff, 0xfb, 0xef, 0xf7, 0xda, 0xde,
+ 0xf7, 0xdf, 0x6b, 0xf7, 0xff, 0xf7, 0xbb, 0xff,
+ 0xff, 0xbb, 0xf1, 0xff, 0xfb, 0xed, 0x7e, 0x79,
+ 0xfc, 0xff, 0x3f, 0xff, 0x75, 0xd4, 0xf1, 0xc7,
+ 0xff, 0xff, 0xb7, 0xf5, 0xff, 0xff, 0x67, 0xfe,
+ 0x7f, 0xff, 0xfc, 0xbf, 0xbf, 0xbb, 0xff, 0xff,
+ 0xfb, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0xcf, 0xff,
+ 0xff, 0xfe, 0xbf, 0x9b, 0xfe, 0xff, 0xbf, 0xf6,
+ 0xea, 0x8b, 0xff, 0xf3, 0xf6, 0xff, 0xdf, 0x7f,
+ 0xff, 0xef, 0xff, 0xdf, 0x7f, 0xff, 0xff, 0xbf,
+ 0xa6, 0xff, 0xff, 0xaf, 0xbf, 0xfa, 0xeb, 0xfb,
+ 0xec, 0xff, 0xff, 0xfd, 0xf7, 0xfe, 0xff, 0xff,
+ 0xfd, 0xf7, 0xff, 0xff, 0xb7, 0x79, 0xff, 0x7b,
+ 0xee, 0xa5, 0x97, 0x5e, 0x3b, 0xfb, 0xb5, 0xff,
+ 0xfd, 0x77, 0xd6, 0xd2, 0xff, 0x3d, 0xff, 0xff,
+ 0xff, 0x6f, 0xd4, 0xf7, 0xdf, 0xfa, 0xeb, 0xa9,
+ 0xb3, 0x9e, 0x7e, 0xfa, 0xdf, 0x7f, 0x3f, 0x75,
+ 0xde, 0xdf, 0xef, 0xff, 0xff, 0x5e, 0x99, 0xfb,
+ 0xf1, 0xaf, 0x66, 0x9f, 0xe9, 0xff, 0xd5, 0x76,
+ 0x9a, 0xf5, 0xcf, 0xb3, 0xcd, 0xb6, 0xf3, 0x65,
+ 0xb3, 0x7f, 0x6f, 0x86, 0xfe, 0xbf, 0xa6, 0xd6,
+ 0xfb, 0xaa, 0x79, 0xe7, 0x8a, 0x56, 0xdd, 0x70,
+ 0xcc, 0x79, 0x27, 0x5c, 0x73, 0xec, 0xff, 0xb3,
+ 0xb9, 0xfe, 0xff, 0xab, 0xbf, 0xb5, 0xfe, 0xdb,
+ 0xba, 0xbc, 0x7f, 0xff, 0xbd, 0xdf, 0x5f, 0x7f,
+ 0xef, 0xf5, 0xff, 0xff, 0x66, 0xec, 0xff, 0xff,
+ 0xfa, 0x3f, 0xa1, 0xbf, 0xfe, 0xde, 0xfb, 0xdf,
+ 0x7f, 0xff, 0xfd, 0xd7, 0xdf, 0x7f, 0xfd, 0xff,
+ 0xbf, 0x1b, 0xf7, 0xf6, 0xdb, 0xff, 0x37, 0xff,
+ 0xff, 0xfb, 0xfd, 0x3f, 0xfb, 0xff, 0xf7, 0xdf,
+ 0x7f, 0xff, 0xff, 0xff, 0xff, 0x77, 0xa6, 0xfd,
+ 0xff, 0xff, 0xf6, 0xd9, 0x7f, 0xff, 0x75, 0xf6,
+ 0xdf, 0xdf, 0xff, 0xeb, 0xaf, 0xbf, 0xde, 0xfc,
+ 0xff, 0xff, 0x8d, 0xb9, 0x7e, 0xdb, 0xef, 0x36,
+ 0xd3, 0xbe, 0xbb, 0x8d, 0xbb, 0xcf, 0xfd, 0x77,
+ 0xdf, 0x67, 0xb7, 0xfd, 0xf6, 0xdf, 0xeb, 0x66,
+ 0xee, 0xdb, 0xff, 0xbf, 0xfd, 0xf7, 0xff, 0x6f,
+ 0xff, 0xff, 0xf3, 0xff, 0xff, 0xff, 0xf9, 0xe7,
+ 0x9f, 0xff, 0xff, 0x3f, 0x9b, 0xf9, 0xfd, 0xff,
+ 0xdb, 0xef, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xfe,
+ 0xff, 0xff, 0xbf, 0xff, 0xfe, 0xfb, 0xff, 0xff,
+ 0xef, 0xe6, 0xf6, 0xeb, 0xaf, 0xbf, 0xf1, 0xff,
+ 0xeb, 0x2f, 0xbc, 0xfe, 0xf5, 0xd7, 0x5f, 0x7f,
+ 0xfd, 0xf7, 0xdf, 0xff, 0xff, 0xbb, 0x79, 0x7f,
+ 0xf2, 0x89, 0x35, 0xfe, 0xfd, 0xea, 0x8b, 0xaf,
+ 0x7e, 0xd3, 0xc5, 0x17, 0x5f, 0x7c, 0xd1, 0xc5,
+ 0xff, 0x7f, 0x6f, 0xfa, 0xbf, 0xfe, 0x7e, 0xbf,
+ 0xff, 0xfb, 0x7e, 0x7b, 0xef, 0x56, 0xff, 0xfd,
+ 0xf6, 0xdf, 0xff, 0xff, 0xfd, 0xff, 0xff, 0x9b,
+ 0xfe, 0xef, 0x8f, 0x2f, 0x7f, 0xf8, 0xb3, 0x9b,
+ 0x5d, 0xbb, 0xf5, 0x67, 0x97, 0xbd, 0xfc, 0xf1,
+ 0x47, 0x9f, 0x7f, 0xfe, 0xe6, 0xff, 0xeb, 0x2f,
+ 0xbf, 0x5c, 0xff, 0xff, 0x6f, 0xbf, 0xff, 0xf7,
+ 0xf7, 0xdd, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff,
+ 0xbf, 0xe1, 0xff, 0xfa, 0xeb, 0x3b, 0xff, 0xff,
+ 0xff, 0xcf, 0xe7, 0xdf, 0xff, 0xfd, 0xf5, 0xef,
+ 0x3f, 0xfd, 0xfd, 0xff, 0xff, 0x6f, 0xfe, 0xbf,
+ 0xff, 0xa7, 0xaf, 0xff, 0xff, 0xaa, 0x6f, 0xbc,
+ 0x72, 0xfd, 0xf7, 0xdf, 0x58, 0xef, 0xfd, 0xf7,
+ 0xff, 0xff, 0x1b, 0xfe, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xbf, 0xfb, 0xcf, 0x3f, 0xfb, 0xff, 0xf7,
+ 0x9f, 0xfd, 0xf6, 0xdf, 0xff, 0xfb, 0xff, 0xe6,
+ 0xff, 0xff, 0x6f, 0xb7, 0xfd, 0xf6, 0x7b, 0x6f,
+ 0xff, 0xff, 0xcc, 0xa7, 0xff, 0xff, 0xe7, 0xcd,
+ 0xff, 0xff, 0xfb, 0xbf, 0xf9, 0xff, 0xaf, 0xbf,
+ 0xee, 0xfa, 0xab, 0xaf, 0xbf, 0xfe, 0xba, 0xd7,
+ 0x5b, 0x7d, 0xf5, 0xf5, 0xd3, 0x5f, 0x7f, 0xfd,
+ 0x6f, 0x3e, 0xff, 0xff, 0xe0, 0xab, 0x86, 0x7f,
+ 0xdb, 0xec, 0xbf, 0x96, 0xf5, 0xf7, 0xdf, 0xff,
+ 0x9f, 0xfd, 0xef, 0xff, 0xff, 0x9b, 0xff, 0xf7,
+ 0x6b, 0xbf, 0xbf, 0xbf, 0xff, 0xdf, 0xff, 0xf7,
+ 0xff, 0xef, 0xfb, 0xff, 0xee, 0xff, 0xff, 0xff,
+ 0xff, 0x7f, 0xe6, 0xfd, 0xfd, 0xbb, 0x7f, 0xff,
+ 0xeb, 0xfd, 0xff, 0xdb, 0xcf, 0x5f, 0xfb, 0xef,
+ 0xbf, 0xff, 0xfe, 0xf9, 0xff, 0xff, 0x8f, 0xf1,
+ 0xff, 0xfb, 0xaf, 0xcb, 0xff, 0xdc, 0xb3, 0xea,
+ 0xbf, 0x7f, 0xbe, 0xb7, 0x9e, 0x9f, 0xff, 0xbf,
+ 0xf9, 0xff, 0xff, 0x67, 0xfc, 0xff, 0xff, 0xff,
+ 0xff, 0xfb, 0xef, 0xfb, 0x76, 0xff, 0xff, 0xff,
+ 0x7f, 0xbf, 0xfe, 0xff, 0xff, 0xff, 0x7f, 0xff,
+ 0x99, 0xf7, 0x6f, 0xb3, 0xff, 0xf9, 0xfb, 0xef,
+ 0xfb, 0xfe, 0xfe, 0xbf, 0xdf, 0x77, 0xff, 0xff,
+ 0xbf, 0x7e, 0xff, 0xff, 0x7f, 0xc6, 0xff, 0xff,
+ 0xff, 0xbd, 0xff, 0xf7, 0xff, 0xc8, 0xff, 0xf7,
+ 0xff, 0xb7, 0xff, 0xfe, 0xfb, 0xff, 0xbf, 0xef,
+ 0xf7, 0xbf, 0xf1, 0xe7, 0xff, 0xff, 0xbf, 0xdf,
+ 0xef, 0xff, 0xee, 0xf6, 0xbf, 0xff, 0xf7, 0xff,
+ 0xfb, 0xff, 0xef, 0xef, 0xff, 0xfb, 0x6d, 0xf8,
+ 0x3f, 0xbe, 0xfc, 0x76, 0xff, 0xbe, 0x76, 0xf0,
+ 0xe3, 0x96, 0x9f, 0xfe, 0x3a, 0x63, 0x9f, 0x75,
+ 0x76, 0xff, 0xff, 0x9b, 0xff, 0xdf, 0xfd, 0xfd,
+ 0xf7, 0xff, 0xff, 0xff, 0x9e, 0x7d, 0xd7, 0x7e,
+ 0xf7, 0xfb, 0xb9, 0xbf, 0x7f, 0xff, 0xdf, 0xef,
+ 0xe6, 0xfe, 0xff, 0xde, 0xff, 0xfd, 0xff, 0xef,
+ 0xf3, 0xff, 0xff, 0xf7, 0xff, 0xef, 0xbd, 0xf7,
+ 0xf1, 0xab, 0xff, 0xdd, 0xab, 0xa9, 0xff, 0xff,
+ 0x7f, 0x7f, 0xfe, 0xf7, 0xfb, 0xfe, 0xfb, 0xfb,
+ 0x7d, 0xff, 0x7f, 0xff, 0xfe, 0xff, 0xaf, 0xff,
+ 0xff, 0x6f, 0xfe, 0xff, 0x7f, 0xbf, 0xff, 0xff,
+ 0xbf, 0xfe, 0xff, 0xff, 0x5f, 0xbf, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xdf, 0xdf, 0xff, 0x1b, 0xfe,
+ 0xff, 0xff, 0xcb, 0xca, 0xdf, 0xfc, 0xf2, 0xfb,
+ 0xcf, 0x5f, 0x53, 0xaf, 0xed, 0xbf, 0x7c, 0xf9,
+ 0xfd, 0xff, 0x3f, 0x66, 0xff, 0xff, 0x7f, 0x97,
+ 0xfc, 0x7f, 0xdd, 0xfc, 0xff, 0xcf, 0xff, 0xf4,
+ 0xd9, 0xcf, 0xbf, 0x5e, 0x7e, 0xff, 0xff, 0xb7,
+ 0xf9, 0xff, 0x7f, 0xfa, 0xec, 0x97, 0xfe, 0xff,
+ 0x3f, 0xff, 0x66, 0xf5, 0xe5, 0xdf, 0xff, 0xfe,
+ 0xfb, 0xbf, 0xff, 0xff, 0x6f, 0xd6, 0xff, 0xcf,
+ 0x7b, 0xfa, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xd9,
+ 0x67, 0xf8, 0xfd, 0xbf, 0xff, 0xff, 0xff, 0xff,
+ 0x5f, 0x9b, 0xfb, 0xff, 0xff, 0xf7, 0xda, 0xff,
+ 0xff, 0xbd, 0xf6, 0xdf, 0xdf, 0x4a, 0xb7, 0xed,
+ 0xbf, 0x7f, 0x7e, 0xfb, 0xff, 0xef, 0x66, 0xfe,
+ 0xff, 0xff, 0xbe, 0xfa, 0xef, 0xff, 0xaf, 0xfe,
+ 0xff, 0x5f, 0x53, 0xdf, 0xbd, 0xff, 0xff, 0x5f,
+ 0xff, 0xff, 0xb3, 0xb1, 0xff, 0xff, 0xbb, 0xfd,
+ 0xbc, 0x5e, 0xcf, 0xab, 0xfd, 0x7e, 0xb5, 0xe5,
+ 0xdf, 0xf1, 0xaf, 0xef, 0xf7, 0xff, 0xff, 0x66,
+ 0xee, 0xff, 0xff, 0xdb, 0x7e, 0xaf, 0xd7, 0xf7,
+ 0x5a, 0x7e, 0xdf, 0x0b, 0xfd, 0x9d, 0x7f, 0xea,
+ 0xe1, 0xe5, 0xff, 0xbf, 0x9b, 0xf7, 0xff, 0xff,
+ 0x6f, 0xff, 0xff, 0x7e, 0xff, 0xbd, 0xb7, 0xb9,
+ 0xff, 0xe6, 0xfb, 0xaf, 0xbf, 0xec, 0xfe, 0xff,
+ 0xf7, 0xe6, 0xfd, 0xff, 0xff, 0xf7, 0xfb, 0x7f,
+ 0x1d, 0x7f, 0xfc, 0xd1, 0xcf, 0x3c, 0xf3, 0xf8,
+ 0xf3, 0xcf, 0x3f, 0xff, 0xff, 0xbd, 0xb1, 0xff,
+ 0xfb, 0xef, 0xb3, 0xff, 0xbe, 0xe3, 0x8f, 0x3f,
+ 0xce, 0xb1, 0x86, 0x9f, 0x7f, 0xae, 0xf9, 0xe7,
+ 0xdf, 0xff, 0x66, 0xe6, 0xff, 0xff, 0xbf, 0xfd,
+ 0xff, 0xff, 0xfb, 0xef, 0xbf, 0xf6, 0xbf, 0xf7,
+ 0xdf, 0xff, 0xee, 0xfb, 0xff, 0xff, 0x3f, 0x9b,
+ 0xfb, 0xff, 0xff, 0xef, 0xef, 0xff, 0xff, 0xff,
+ 0xff, 0xbf, 0xff, 0xf7, 0xff, 0xf7, 0xdf, 0x7d,
+ 0xff, 0xfd, 0xff, 0xef, 0xa6, 0xde, 0xff, 0xff,
+ 0xb7, 0xf7, 0x7f, 0x0f, 0x7f, 0xbc, 0xf0, 0x85,
+ 0x3f, 0xff, 0xf8, 0xab, 0x85, 0x3f, 0xfe, 0xff,
+ 0xab, 0x79, 0xff, 0xff, 0x9f, 0x3f, 0xde, 0x7d,
+ 0x63, 0xbf, 0x25, 0xf6, 0xf1, 0xcf, 0x7e, 0xff,
+ 0x7d, 0xb1, 0xcf, 0xfe, 0x7f, 0x6f, 0xfe, 0xff,
+ 0xff, 0xba, 0xfb, 0xaf, 0xfb, 0xfe, 0xaf, 0xdf,
+ 0x7f, 0xae, 0xfb, 0xff, 0xfe, 0x5b, 0xb7, 0xfb,
+ 0xff, 0xff, 0x9b, 0xff, 0xff, 0x8f, 0x3e, 0xbb,
+ 0xe8, 0x33, 0xcb, 0x8f, 0x3f, 0xfe, 0xe7, 0x9f,
+ 0x1b, 0xff, 0x95, 0xe7, 0x9f, 0x3f, 0xfe, 0xe6,
+ 0xff, 0xdf, 0x7f, 0xbe, 0xff, 0xfa, 0xcf, 0x7b,
+ 0xaf, 0xbc, 0xc5, 0xf7, 0xff, 0xde, 0xfb, 0xe5,
+ 0xdf, 0xff, 0xbe, 0xbf, 0xf9, 0xff, 0xf7, 0xff,
+ 0xbf, 0xaf, 0xfe, 0xbb, 0xdf, 0xa5, 0xdb, 0xfd,
+ 0xf7, 0xbf, 0xed, 0x3e, 0xf9, 0xfd, 0xff, 0xfb,
+ 0x6f, 0xfe, 0xff, 0xff, 0xef, 0xbb, 0xae, 0xff,
+ 0xb8, 0xaf, 0x9e, 0x79, 0xfd, 0xf7, 0xdf, 0x7c,
+ 0x7f, 0xfd, 0xf5, 0xef, 0xff, 0x9b, 0xfd, 0x7f,
+ 0xff, 0xff, 0xfb, 0xeb, 0xbf, 0xfb, 0xdf, 0xbf,
+ 0xff, 0xff, 0xff, 0xdf, 0xff, 0xd6, 0xdf, 0xff,
+ 0xbb, 0xff, 0xe6, 0xff, 0xff, 0xff, 0x3f, 0xbd,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x97, 0xf7,
+ 0xff, 0xff, 0x9f, 0xa7, 0xff, 0xff, 0xbf, 0xe9,
+ 0xbf, 0xaf, 0x9f, 0xda, 0xfa, 0xab, 0xaf, 0xbf,
+ 0xfa, 0xfa, 0x97, 0x1d, 0x7e, 0xf9, 0xd5, 0xd7,
+ 0x5d, 0x3d, 0xfd, 0x6b, 0xf6, 0xff, 0xff, 0xff,
+ 0xfe, 0xfe, 0xff, 0xfd, 0xff, 0xcf, 0xfe, 0xf7,
+ 0xff, 0xfe, 0x9f, 0x7f, 0xfe, 0xe9, 0x47, 0xff,
+ 0x1b, 0xfb, 0xff, 0xff, 0xff, 0xf7, 0xfd, 0xe7,
+ 0xdf, 0x7f, 0xbb, 0xfe, 0xfd, 0xfd, 0xfb, 0xf5,
+ 0xef, 0x2f, 0xbf, 0xbf, 0x7f, 0xa6, 0xff, 0xfe,
+ 0xff, 0xdf, 0x7f, 0xef, 0x5f, 0x77, 0x9f, 0xb7,
+ 0xff, 0xff, 0xfe, 0xbf, 0xfb, 0xb7, 0xff, 0x5f,
+ 0xff, 0xb7, 0xf9, 0xff, 0x7f, 0xea, 0xff, 0xff,
+ 0xde, 0x7f, 0xff, 0xfd, 0xda, 0xbf, 0xe6, 0xfe,
+ 0xfb, 0x67, 0xbe, 0xd0, 0xff, 0xfb, 0x6d, 0xfe,
+ 0xff, 0x7f, 0xfb, 0xff, 0xeb, 0xff, 0xef, 0xdf,
+ 0xfe, 0xfe, 0x7f, 0xdf, 0x7e, 0xff, 0xf8, 0xff,
+ 0x76, 0xff, 0xfd, 0x9b, 0xfe, 0xff, 0xbf, 0xfe,
+ 0xdf, 0xff, 0xbb, 0x7f, 0xfe, 0xfb, 0xcb, 0x7f,
+ 0xff, 0xdb, 0xff, 0xfc, 0x7f, 0xf7, 0xec, 0x9f,
+ 0xe6, 0xdf, 0xeb, 0xcf, 0xff, 0xff, 0x9f, 0xbb,
+ 0xaf, 0xfd, 0xd7, 0xfc, 0xf6, 0xfe, 0xff, 0xfb,
+ 0xbf, 0xa7, 0xef, 0xfd, 0xaf, 0xf9, 0xf7, 0xff,
+ 0xed, 0xff, 0xff, 0xff, 0xf3, 0xff, 0x75, 0xef,
+ 0xed, 0xed, 0xff, 0xf7, 0xef, 0xff, 0xf7, 0xfe,
+ 0xfb, 0x6f, 0xfe, 0xff, 0xff, 0xcf, 0xff, 0xff,
+ 0xff, 0xcf, 0xbf, 0xff, 0x9f, 0x17, 0xde, 0xf8,
+ 0xf3, 0xbf, 0x75, 0xfe, 0xff, 0xff, 0x9b, 0xff,
+ 0xff, 0xff, 0xf7, 0xef, 0xff, 0xff, 0xef, 0xff,
+ 0xff, 0x56, 0x7f, 0x7b, 0xfd, 0xfd, 0xeb, 0xd7,
+ 0xfe, 0xef, 0xff, 0xe6, 0xff, 0xcf, 0x2e, 0xdb,
+ 0x6b, 0xbf, 0x7d, 0xae, 0xf7, 0xf9, 0x75, 0xcf,
+ 0xe9, 0xaf, 0xbf, 0xff, 0xd7, 0x5f, 0xf7, 0xbf,
+ 0xf1, 0xff, 0xf3, 0xef, 0xff, 0xff, 0xff, 0xff,
+ 0x6f, 0xff, 0x7d, 0xfd, 0xf7, 0xff, 0xf6, 0xf9,
+ 0xfb, 0xf7, 0x9f, 0xff, 0x67, 0xbe, 0xbf, 0xfe,
+ 0xfb, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff,
+ 0x77, 0xfd, 0xff, 0xff, 0xff, 0xf7, 0xfd, 0xfb,
+ 0xfb, 0x9b, 0xfe, 0xef, 0xbf, 0xff, 0x1f, 0xfb,
+ 0x75, 0xfe, 0xf3, 0xfe, 0x57, 0x52, 0xe7, 0x37,
+ 0xbd, 0xb7, 0x6b, 0xf9, 0xe5, 0xa7, 0xa6, 0xff,
+ 0xef, 0xbf, 0xff, 0xcf, 0x7f, 0xfd, 0xf9, 0xff,
+ 0x5f, 0x6d, 0xf6, 0xff, 0x7e, 0xff, 0xfd, 0xb2,
+ 0xd9, 0xfd, 0xb7, 0x79, 0xdf, 0x7b, 0xef, 0xff,
+ 0xbf, 0xff, 0xcf, 0x2f, 0xef, 0x67, 0x99, 0xe5,
+ 0xbf, 0xdf, 0x7f, 0xef, 0xf7, 0xdf, 0xeb, 0x6f,
+ 0xd4, 0x97, 0x5f, 0xfe, 0xff, 0xff, 0xff, 0xcf,
+ 0xfe, 0xff, 0x5d, 0x7d, 0xf9, 0xff, 0xf7, 0xdf,
+ 0x7f, 0xff, 0xfd, 0x5e, 0x99, 0xfb, 0xb7, 0xff,
+ 0x66, 0xff, 0xfb, 0xaf, 0xbf, 0x66, 0x5a, 0xd4,
+ 0x5e, 0xb3, 0xe7, 0xbd, 0xf7, 0xff, 0xb3, 0x4f,
+ 0xee, 0x86, 0x7e, 0xf8, 0xe5, 0xfd, 0xff, 0xaf,
+ 0xa9, 0xaf, 0xbe, 0x63, 0xf5, 0xd3, 0xff, 0x7f,
+ 0xf7, 0xdd, 0x7f, 0xff, 0xfd, 0x93, 0xb9, 0xff,
+ 0xfe, 0xfb, 0xff, 0xb7, 0xdf, 0x7a, 0xef, 0xac,
+ 0x7f, 0x31, 0xe4, 0x7e, 0xde, 0x2f, 0xbf, 0xff,
+ 0xfa, 0xfb, 0x66, 0xec, 0xff, 0xfe, 0xfb, 0xff,
+ 0xf9, 0xa7, 0x1e, 0x4e, 0xfb, 0x5f, 0x63, 0x35,
+ 0xbf, 0x72, 0xca, 0xdf, 0x87, 0x9f, 0x38, 0x18,
+ 0xf7, 0xe6, 0xbb, 0xef, 0xbf, 0xfe, 0xf2, 0xff,
+ 0xbd, 0xbf, 0xfb, 0xfe, 0x93, 0xeb, 0xaf, 0xff,
+ 0xff, 0xfe, 0xfb, 0x77, 0xe6, 0x7d, 0xba, 0xec,
+ 0xb3, 0xce, 0xef, 0xff, 0x7f, 0xfe, 0x5f, 0xdf,
+ 0x7e, 0xf2, 0xfc, 0xf3, 0xff, 0x3e, 0xff, 0xfc,
+ 0xbd, 0xb9, 0xfe, 0xfa, 0xeb, 0xb7, 0xd7, 0xfe,
+ 0x7b, 0xcd, 0xbf, 0xdb, 0x35, 0xf6, 0x1a, 0x7f,
+ 0xfe, 0xdd, 0xe7, 0x9f, 0xbe, 0x6e, 0xee, 0xbf,
+ 0xff, 0xfe, 0xfe, 0xf7, 0xff, 0x7f, 0xff, 0xfd,
+ 0xf6, 0xb9, 0xef, 0xbe, 0xff, 0xfe, 0xff, 0xff,
+ 0xff, 0x3b, 0x9a, 0xf9, 0x6f, 0xbf, 0xfd, 0xff,
+ 0xbe, 0xff, 0xef, 0xbb, 0xff, 0xfe, 0xfd, 0xf5,
+ 0xff, 0xdf, 0xff, 0xff, 0xfd, 0xd7, 0xcf, 0xe6,
+ 0xf6, 0xfb, 0xef, 0xb7, 0xff, 0xdf, 0xeb, 0x3f,
+ 0xf4, 0xfe, 0xd5, 0xd7, 0x7e, 0xfa, 0xe3, 0xfe,
+ 0x37, 0xde, 0x78, 0xbb, 0x61, 0xdf, 0xae, 0xbb,
+ 0xbf, 0xfe, 0xf9, 0xf2, 0x8b, 0x67, 0x7e, 0xb5,
+ 0xd5, 0x33, 0xfb, 0xfd, 0xfb, 0xcd, 0x37, 0x7f,
+ 0x6f, 0xfe, 0xff, 0xee, 0xbb, 0xef, 0xbf, 0xbf,
+ 0xee, 0xeb, 0xef, 0x5f, 0x7f, 0x9d, 0xf7, 0xff,
+ 0x4f, 0x7f, 0xf7, 0xdd, 0xff, 0x9b, 0xff, 0xbf,
+ 0xcf, 0x3e, 0xfe, 0xf8, 0xa3, 0x9b, 0x5e, 0xbe,
+ 0x95, 0x41, 0x1f, 0x9f, 0xee, 0xd0, 0xc7, 0x1f,
+ 0x7f, 0xfe, 0xe6, 0xff, 0xef, 0xbf, 0xff, 0xf8,
+ 0xff, 0x9f, 0x7e, 0xbf, 0xfe, 0xc5, 0x93, 0x7f,
+ 0xff, 0xfb, 0xef, 0xff, 0xff, 0xff, 0xbf, 0xf9,
+ 0xef, 0xfb, 0xef, 0xef, 0xff, 0xff, 0xff, 0xcf,
+ 0xa7, 0x5f, 0x3d, 0xe5, 0xf7, 0xeb, 0xaf, 0xfb,
+ 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xbf, 0xfb, 0xee,
+ 0xbb, 0xbf, 0xfe, 0xbf, 0x6f, 0xbc, 0x72, 0xf5,
+ 0xf5, 0x57, 0x39, 0x4f, 0xff, 0xf7, 0xdf, 0xff,
+ 0x1b, 0xfe, 0xef, 0xbf, 0xff, 0xf3, 0xfb, 0x7f,
+ 0xfb, 0xce, 0x3f, 0xd3, 0x5b, 0x7f, 0xbf, 0xff,
+ 0x96, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff,
+ 0xff, 0xff, 0xfb, 0xc5, 0xff, 0xff, 0xaf, 0xfc,
+ 0xe9, 0xa7, 0xfe, 0x5f, 0xef, 0xed, 0xff, 0xff,
+ 0xff, 0xbf, 0xf9, 0xfd, 0xaf, 0xbd, 0xfe, 0xfa,
+ 0xeb, 0xaf, 0xbf, 0xfe, 0xe2, 0xd6, 0x5d, 0x7f,
+ 0xfd, 0x55, 0xd7, 0x5f, 0x7f, 0xfd, 0x6f, 0x36,
+ 0xff, 0xfb, 0xff, 0xff, 0xfe, 0xff, 0xef, 0xaf,
+ 0xf7, 0x7f, 0xf7, 0xfd, 0xf6, 0xae, 0xdf, 0x9f,
+ 0xdf, 0x47, 0xe6, 0x9b, 0x7b, 0xf7, 0xeb, 0xaf,
+ 0xbf, 0xfd, 0xf7, 0xdf, 0xff, 0xff, 0xfd, 0xf9,
+ 0xef, 0xcd, 0xba, 0xff, 0xfe, 0xef, 0xbe, 0xff,
+ 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
+ 0xff, 0xd7, 0xf5, 0xb7, 0x9b, 0xfe, 0xbb, 0xbf,
+ 0xdf, 0x7f, 0xbe, 0xff, 0xbf, 0x31, 0xdf, 0x7e,
+ 0xff, 0xb5, 0xff, 0x7f, 0x78, 0x2f, 0x8f, 0x57,
+ 0xb8, 0xe7, 0xfc, 0xff, 0xf3, 0xff, 0xe9, 0xdf,
+ 0xff, 0x67, 0xfc, 0xed, 0xee, 0xff, 0xfb, 0xff,
+ 0xff, 0xfb, 0xff, 0xf6, 0xfe, 0xff, 0xf7, 0xfe,
+ 0xfd, 0xef, 0xeb, 0x7f, 0xff, 0x7b, 0x99, 0xfe,
+ 0xbf, 0xff, 0xfe, 0xfb, 0xee, 0xee, 0xaf, 0xee,
+ 0xff, 0xf2, 0xdd, 0xf7, 0xff, 0xff, 0xdf, 0xf7,
+ 0x7f, 0xdf, 0xf7, 0x46, 0xff, 0xeb, 0xad, 0xbf,
+ 0xf6, 0xea, 0xff, 0x67, 0xff, 0xd7, 0xff, 0xfe,
+ 0xff, 0xfe, 0xef, 0xe9, 0xff, 0xfb, 0xe7, 0x9f,
+ 0xf1, 0xf7, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0x5f,
+ 0x8f, 0xfc, 0xbb, 0x67, 0xff, 0x7e, 0xfd, 0xed,
+ 0xfd, 0xff, 0x7f, 0xff, 0x67, 0xfc, 0xfb, 0xff,
+ 0xff, 0xff, 0xff, 0xdb, 0x6f, 0xcf, 0xe1, 0xb5,
+ 0xb7, 0xce, 0xb0, 0xc3, 0x1f, 0xf7, 0x86, 0x9b,
+ 0xff, 0x98, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xbe,
+ 0xff, 0xff, 0xff, 0xf7, 0xef, 0xff, 0xfa, 0xfb,
+ 0x77, 0xbd, 0xbb, 0xff, 0xfe, 0xef, 0x66, 0xff,
+ 0xee, 0xbf, 0xdf, 0xfe, 0xfb, 0xfd, 0xaf, 0xdf,
+ 0xf7, 0x77, 0xf9, 0xfd, 0xbf, 0xef, 0xe7, 0xfb,
+ 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xfa, 0xcb, 0xa9,
+ 0xbf, 0xfe, 0xff, 0xeb, 0xfb, 0x6f, 0xfc, 0xdf,
+ 0x3f, 0xff, 0xbe, 0xfc, 0xef, 0xff, 0xff, 0x6d,
+ 0xfe, 0xbf, 0xef, 0xfe, 0xfb, 0xef, 0xfe, 0xfb,
+ 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xbf,
+ 0xf9, 0xff, 0xff, 0xff, 0x9b, 0x78, 0xe2, 0xfc,
+ 0xfb, 0x9f, 0x1f, 0x7f, 0xe4, 0xd5, 0xf7, 0xbe,
+ 0xfe, 0xf8, 0x9b, 0x6f, 0x7d, 0xf9, 0xd0, 0x33,
+ 0xdf, 0xa6, 0xff, 0xfb, 0xef, 0xbf, 0xff, 0x7e,
+ 0x1d, 0x2f, 0xe6, 0xcb, 0xdf, 0x72, 0xff, 0xf9,
+ 0xf7, 0xd5, 0x7a, 0xff, 0xfc, 0xaf, 0xd9, 0xff,
+ 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xff, 0xab, 0x7f,
+ 0xd7, 0x97, 0xdd, 0xba, 0xf9, 0x4e, 0xbb, 0xfe,
+ 0x7f, 0xff, 0x6d, 0xfe, 0xf7, 0xde, 0x7b, 0xef,
+ 0xbd, 0xff, 0xfb, 0xfa, 0xdf, 0xff, 0x7e, 0x3b,
+ 0xa5, 0xbf, 0x53, 0x7e, 0xf5, 0xff, 0xfa, 0x1b,
+ 0xf5, 0xe5, 0x97, 0x5f, 0x7e, 0xf9, 0xff, 0xbf,
+ 0xfe, 0xef, 0xff, 0xdf, 0x67, 0xf9, 0x7f, 0x96,
+ 0x53, 0xff, 0x9f, 0x57, 0xe6, 0xbe, 0x6d, 0xbf,
+ 0xdd, 0xf6, 0xfb, 0xfd, 0xff, 0xff, 0xf7, 0x9f,
+ 0x77, 0xfe, 0xfb, 0xe7, 0xb5, 0xfa, 0xfe, 0xff,
+ 0x9b, 0x91, 0xff, 0xde, 0x7b, 0xe3, 0xbd, 0x1f,
+ 0xff, 0xbf, 0xff, 0xff, 0xff, 0xdd, 0x7f, 0xff,
+ 0x7f, 0xf5, 0xde, 0xff, 0xff, 0x6c, 0xec, 0xbf,
+ 0xff, 0xfe, 0xfa, 0xef, 0xff, 0xdf, 0xff, 0x3f,
+ 0xfd, 0x69, 0xe7, 0xd5, 0xff, 0x5f, 0x5f, 0xed,
+ 0xff, 0xbf, 0x19, 0xfb, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xef, 0xff, 0xef, 0xff, 0xdf, 0xfe, 0xd6, 0x2b,
+ 0xad, 0x1f, 0x56, 0x4a, 0xa9, 0xff, 0xef, 0xc6,
+ 0xfd, 0xfb, 0xee, 0xbb, 0xef, 0xfe, 0xff, 0xff,
+ 0xfb, 0xf5, 0xae, 0xbf, 0xfe, 0xda, 0x8b, 0x2f,
+ 0xbb, 0xfe, 0xff, 0x9d, 0x79, 0xf7, 0x3f, 0xff,
+ 0xfc, 0xf3, 0xfb, 0xff, 0xff, 0x71, 0xfe, 0xf3,
+ 0xcf, 0x3f, 0xff, 0xec, 0x33, 0xcf, 0xff, 0x7f,
+ 0x67, 0xae, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xff,
+ 0xfe, 0xfb, 0x8f, 0x7f, 0xfc, 0xf1, 0xc7, 0x9f,
+ 0x77, 0xfe, 0xf9, 0xf7, 0xbf, 0x99, 0xf8, 0xef,
+ 0xbf, 0xff, 0xfe, 0xfb, 0xff, 0xff, 0xff, 0xdf,
+ 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xff, 0xce, 0xe6, 0xfe, 0xdb, 0x6f, 0xbf, 0xfd,
+ 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xf7, 0xdf, 0x7f, 0xff, 0xf7, 0xbb, 0xb9,
+ 0xfd, 0x7e, 0xfb, 0xef, 0xff, 0xff, 0xfa, 0xe9,
+ 0x2f, 0xf4, 0xe1, 0x85, 0x3e, 0x5e, 0x7a, 0xa1,
+ 0xaf, 0xfb, 0xff, 0x6e, 0xde, 0xbf, 0xfb, 0xee,
+ 0xbb, 0xff, 0xba, 0xfc, 0xf2, 0x8b, 0x7f, 0x6c,
+ 0xf1, 0xdf, 0x13, 0x5f, 0xfc, 0xf7, 0xef, 0xdf,
+ 0x9b, 0xff, 0xbf, 0xfb, 0xee, 0x7b, 0xff, 0xad,
+ 0xbf, 0x5f, 0xaa, 0xdf, 0x4b, 0xfe, 0xf7, 0xff,
+ 0x57, 0xfb, 0xbf, 0xff, 0xff, 0xe6, 0xff, 0xef,
+ 0xb3, 0xcf, 0x3e, 0xff, 0xe8, 0xe3, 0x8f, 0x0e,
+ 0x67, 0xd0, 0xe1, 0x87, 0x1f, 0x74, 0xf8, 0xe5,
+ 0x97, 0xbf, 0xf9, 0xff, 0xfb, 0xef, 0xbf, 0xbf,
+ 0xfe, 0xe7, 0xeb, 0xff, 0xff, 0xf9, 0xff, 0xbf,
+ 0x5f, 0x7f, 0xf9, 0xcf, 0x97, 0xff, 0x6f, 0xfe,
+ 0xff, 0xfe, 0xfb, 0xef, 0xaf, 0xff, 0xff, 0xfa,
+ 0xff, 0x75, 0xb6, 0xbf, 0x7e, 0xd3, 0x4d, 0xb7,
+ 0xff, 0x64, 0xff, 0x9b, 0xff, 0xef, 0xbe, 0xfb,
+ 0xee, 0xab, 0xff, 0xbf, 0xff, 0xaf, 0x5e, 0xf3,
+ 0xd5, 0x33, 0xdf, 0x1c, 0xf3, 0x55, 0x7d, 0xff,
+ 0xe6, 0xff, 0xfb, 0xef, 0xbf, 0xff, 0xfa, 0xdf,
+ 0xef, 0xff, 0x1f, 0x76, 0xf9, 0xe3, 0x97, 0x5f,
+ 0x74, 0xf9, 0x41, 0xd6, 0xbf, 0xf9, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xfd, 0xb7,
+ 0xf7, 0xe5, 0xff, 0xff, 0x7f, 0xf9, 0xdf, 0xff,
+ 0xff, 0x6f, 0xfe, 0xff, 0xcb, 0xaf, 0xbf, 0xfc,
+ 0xfa, 0xeb, 0xaf, 0xbe, 0xea, 0xb5, 0x56, 0x5f,
+ 0x7b, 0xad, 0xf5, 0xc7, 0x5e, 0xff, 0x9b, 0xfd,
+ 0xff, 0xfc, 0xf7, 0xaf, 0xff, 0xfc, 0xfb, 0xec,
+ 0xfb, 0x9f, 0xf9, 0xee, 0xfd, 0x47, 0xbf, 0x7f,
+ 0xfe, 0xdf, 0xd9, 0xc6, 0xfb, 0xfd, 0xf7, 0xef,
+ 0x7f, 0xff, 0xfd, 0x67, 0xdf, 0xff, 0xdf, 0xf5,
+ 0x7f, 0xf7, 0xfc, 0xfb, 0x8f, 0xff, 0xff, 0xbf,
+ 0xf9, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xbb, 0xff,
+ 0xed, 0xdf, 0x6a, 0x55, 0xcf, 0xfd, 0xfe, 0xdb,
+ 0xf7, 0x7f, 0xfc, 0xf9, 0x6f, 0xfe, 0xbf, 0xdb,
+ 0xeb, 0xfb, 0xcf, 0xaf, 0xfe, 0xff, 0xfe, 0xf5,
+ 0xff, 0x7d, 0xfe, 0xfd, 0x9d, 0xff, 0xff, 0xf5,
+ 0x9f, 0x19, 0xff, 0x7e, 0xff, 0xff, 0xfb, 0xff,
+ 0xaf, 0xf7, 0xfb, 0x7f, 0xff, 0xdd, 0xff, 0xbf,
+ 0x7f, 0xff, 0xff, 0xf7, 0x3c, 0x3f, 0xe6, 0xff,
+ 0xc7, 0xe7, 0xe3, 0xef, 0xbf, 0xdd, 0xff, 0xdb,
+ 0x36, 0xf7, 0xdb, 0x7f, 0xf7, 0xff, 0xf3, 0x5f,
+ 0xf7, 0xb7, 0xbf, 0xd1, 0xff, 0xfa, 0xfd, 0x7b,
+ 0xff, 0xff, 0xbf, 0xff, 0x0f, 0x3f, 0xfc, 0xe1,
+ 0x87, 0xdf, 0xff, 0xbb, 0xf9, 0xff, 0xfd, 0x67,
+ 0xee, 0xff, 0x7f, 0xff, 0xff, 0xf5, 0xef, 0xcf,
+ 0xff, 0x7d, 0xf6, 0xbb, 0x8f, 0x5f, 0xf7, 0xfb,
+ 0xbf, 0xbd, 0xbf, 0xbe, 0x99, 0xff, 0xcf, 0xff,
+ 0x6f, 0xff, 0xfb, 0xfe, 0xfc, 0xef, 0xf8, 0xc6,
+ 0xbd, 0x7f, 0xff, 0x6f, 0x7b, 0x9f, 0xff, 0xff,
+ 0x7f, 0xe6, 0xff, 0xf3, 0xfd, 0xf7, 0xef, 0x7e,
+ 0xff, 0xfb, 0xf5, 0xfe, 0xef, 0xef, 0xdf, 0xff,
+ 0xff, 0x7f, 0xe6, 0xfe, 0xfd, 0xbb, 0xf9, 0xef,
+ 0xff, 0xff, 0xf7, 0xff, 0x7f, 0x7f, 0xef, 0xbf,
+ 0xff, 0xfd, 0xf7, 0x5b, 0xff, 0x6b, 0xfd, 0x75,
+ 0x7f, 0xf7, 0x6f, 0xfe, 0xdf, 0x4f, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xe9, 0x61, 0x13, 0x7a, 0xec,
+ 0xc1, 0xd3, 0x77, 0xb6, 0xfd, 0xff, 0xff, 0x9b,
+ 0xff, 0xff, 0xff, 0xef, 0xbf, 0xff, 0xff, 0x7f,
+ 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xef,
+ 0x7f, 0xff, 0xff, 0xff, 0x86, 0xff, 0xbf, 0xb9,
+ 0xe4, 0xfb, 0xee, 0xef, 0xaf, 0xbf, 0xfb, 0xdd,
+ 0xf7, 0xdf, 0x7d, 0xf7, 0xdd, 0xf7, 0xdf, 0xff,
+ 0x8f, 0xd9, 0xff, 0x6f, 0xbe, 0xf9, 0xbc, 0xfb,
+ 0xfb, 0xeb, 0x3f, 0xff, 0xf9, 0xf7, 0xda, 0x7e,
+ 0xc9, 0xe5, 0xf7, 0xf7, 0xff, 0x6d, 0xfe, 0xd7,
+ 0xff, 0x7b, 0xfa, 0xef, 0xff, 0xfe, 0x7f, 0x4f,
+ 0x7d, 0xee, 0xad, 0x97, 0x9e, 0x7b, 0xea, 0xed,
+ 0xfd, 0xff, 0x9b, 0xf5, 0xf9, 0xff, 0xdf, 0xfb,
+ 0xfb, 0xbf, 0xff, 0x5f, 0x6e, 0xf5, 0xcb, 0x2f,
+ 0xbf, 0xfc, 0xb2, 0xcb, 0x7f, 0xff, 0xd7, 0xe6,
+ 0xfe, 0x6b, 0xbf, 0xc9, 0x77, 0xde, 0xef, 0xaf,
+ 0xff, 0x76, 0x17, 0xdb, 0x6f, 0xb7, 0xf5, 0xf6,
+ 0xdb, 0xcf, 0xff, 0xbb, 0x99, 0xff, 0xea, 0xbf,
+ 0xf7, 0xae, 0xfb, 0xeb, 0xab, 0xef, 0x44, 0xc7,
+ 0xdc, 0x70, 0xcd, 0x0d, 0x37, 0xdc, 0x70, 0xff,
+ 0x6c, 0xec, 0xff, 0xff, 0xfb, 0x3a, 0xe5, 0xff,
+ 0xf6, 0xdf, 0x7b, 0xdf, 0x7f, 0xef, 0xfd, 0xf7,
+ 0xdf, 0x7b, 0xaf, 0xfd, 0xbf, 0x99, 0xf9, 0xff,
+ 0xf0, 0xd3, 0x5b, 0x3b, 0xbd, 0xff, 0xff, 0xdb,
+ 0xdf, 0x6a, 0xab, 0xed, 0x37, 0xde, 0x7e, 0x4b,
+ 0xff, 0xef, 0xa6, 0xfd, 0xdf, 0x7f, 0xef, 0xad,
+ 0xf7, 0xfe, 0xfe, 0xbf, 0xf7, 0x3c, 0xf7, 0xdc,
+ 0x73, 0xcf, 0x3d, 0xf7, 0xf4, 0xf7, 0xbd, 0x69,
+ 0xff, 0x67, 0x9f, 0x7f, 0xde, 0xf9, 0xdf, 0x7d,
+ 0xef, 0x7f, 0x9f, 0x5d, 0x76, 0xd9, 0x65, 0x97,
+ 0x5d, 0xd6, 0x79, 0x6f, 0xe4, 0xdf, 0xbc, 0xf3,
+ 0x8f, 0x3f, 0xff, 0x56, 0xfb, 0xeb, 0x5f, 0x7f,
+ 0xfd, 0xb5, 0xd7, 0x5f, 0x7f, 0xed, 0xf6, 0xbf,
+ 0x99, 0xf9, 0xfb, 0xdf, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xde, 0xf7, 0xde, 0x7b, 0xef, 0xbd,
+ 0xf7, 0xde, 0x9b, 0xff, 0xcf, 0xe6, 0xfe, 0xbf,
+ 0xfb, 0xfe, 0xff, 0xef, 0xff, 0xff, 0xbf, 0xff,
+ 0xed, 0xb7, 0xdf, 0x7e, 0xfb, 0xed, 0xb7, 0xfd,
+ 0xff, 0xbb, 0xa9, 0xff, 0xc6, 0x1f, 0x77, 0xfc,
+ 0xd1, 0xfa, 0xef, 0xff, 0x75, 0xef, 0xbd, 0xf7,
+ 0xde, 0x7b, 0xaf, 0xbd, 0xf7, 0xff, 0x6a, 0xde,
+ 0xdf, 0x78, 0xe7, 0x9f, 0xff, 0xbe, 0xda, 0xef,
+ 0x9d, 0xdf, 0x3c, 0xd3, 0x4c, 0x33, 0xdd, 0x34,
+ 0xd3, 0xe7, 0xdf, 0x9b, 0xff, 0xff, 0xf2, 0xdf,
+ 0xef, 0xbf, 0xff, 0xff, 0xde, 0xff, 0xdd, 0x6f,
+ 0xbf, 0xfd, 0x76, 0xdb, 0x6b, 0xff, 0xfd, 0xff,
+ 0xe6, 0xff, 0xff, 0x73, 0xcf, 0x3f, 0xff, 0xfc,
+ 0xf3, 0xcf, 0x0f, 0x77, 0xd8, 0x65, 0x97, 0x5d,
+ 0x76, 0xd9, 0xc5, 0x97, 0xbf, 0xf9, 0xff, 0xf6,
+ 0x8f, 0xaf, 0xff, 0xfd, 0xf7, 0xef, 0xaf, 0xff,
+ 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf,
+ 0xfd, 0x6f, 0xfe, 0xff, 0xfc, 0xfe, 0xeb, 0x7f,
+ 0xff, 0xff, 0xff, 0xeb, 0x75, 0xb7, 0xfd, 0xf6,
+ 0xdb, 0x6f, 0xbf, 0xfd, 0xfc, 0xff, 0x9b, 0xff,
+ 0xff, 0xfe, 0xfa, 0xef, 0xbf, 0x7f, 0xfe, 0xfa,
+ 0xaa, 0x76, 0xd3, 0x55, 0x57, 0x5d, 0x75, 0xd5,
+ 0x55, 0x7f, 0xff, 0xe6, 0xff, 0xff, 0xef, 0xff,
+ 0xff, 0xff, 0xdf, 0x7f, 0xbf, 0x1e, 0x7d, 0xf1,
+ 0xc1, 0x07, 0x1f, 0x7c, 0xf0, 0x61, 0xdf, 0xbf,
+ 0xf9, 0xff, 0xff, 0xdf, 0xff, 0xbf, 0xf4, 0xd4,
+ 0xff, 0xff, 0xbf, 0xff, 0xff, 0xfe, 0xff, 0xef,
+ 0xbf, 0xff, 0xa6, 0xff, 0x6f, 0xfa, 0xff, 0xeb,
+ 0xaf, 0xbf, 0xdc, 0x7a, 0xab, 0xaf, 0xbf, 0xfa,
+ 0xd5, 0xd7, 0x5f, 0x7b, 0xf5, 0xf5, 0xd7, 0x5f,
+ 0xff, 0x9a, 0x7f, 0x3f, 0xba, 0xfc, 0xf3, 0x5d,
+ 0xbf, 0xff, 0xef, 0xbb, 0xfe, 0xfd, 0xa7, 0x5f,
+ 0x57, 0x3e, 0xf9, 0xe7, 0xde, 0xff, 0xc6, 0xff,
+ 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xf7, 0xe7,
+ 0xfe, 0xef, 0xff, 0xfb, 0xfb, 0xbb, 0xfd, 0xff,
+ 0xfb, 0xfb, 0x9f, 0xf9, 0xf7, 0xfa, 0xeb, 0x2f,
+ 0xfd, 0xff, 0xdd, 0xff, 0xff, 0xff, 0xff, 0xbf,
+ 0xff, 0xbf, 0xff, 0xef, 0xff, 0xff, 0xff, 0x6b,
+ 0xfe, 0xf7, 0xff, 0xfb, 0xe3, 0xff, 0xff, 0xfc,
+ 0xf7, 0xcb, 0x5f, 0x77, 0xfe, 0xf5, 0xe6, 0x9f,
+ 0x7f, 0xfa, 0xf5, 0xff, 0x9b, 0xff, 0xff, 0xbf,
+ 0xef, 0xfd, 0xff, 0xdf, 0xee, 0xef, 0xf5, 0xbe,
+ 0xfd, 0xdf, 0xfb, 0xff, 0xff, 0xfd, 0xff, 0xfb,
+ 0xff, 0xe6, 0xff, 0xef, 0xff, 0xf7, 0xef, 0x2f,
+ 0x5f, 0xff, 0xff, 0x7f, 0xfc, 0xfb, 0xcd, 0xb7,
+ 0xfc, 0xf2, 0xfb, 0x4d, 0xf7, 0xbf, 0xf9, 0xef,
+ 0xfa, 0x7f, 0x7f, 0xff, 0xfd, 0xff, 0xff, 0x7f,
+ 0x9a, 0xaf, 0xef, 0xff, 0x4f, 0x7e, 0xfd, 0xff,
+ 0xaf, 0xff, 0x6f, 0xfe, 0xff, 0xfd, 0xdf, 0xfd,
+ 0xff, 0xee, 0xf3, 0xbf, 0x7f, 0xf5, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfd, 0x9b,
+ 0xff, 0xef, 0xbf, 0xef, 0xfc, 0xf3, 0x8f, 0x1f,
+ 0x7e, 0x7d, 0x77, 0xbd, 0x6f, 0x9f, 0x61, 0x46,
+ 0xbe, 0xdf, 0xff, 0xdf, 0xe6, 0xff, 0xfb, 0xef,
+ 0xff, 0xed, 0xfc, 0xee, 0xbf, 0x7f, 0x7f, 0xfd,
+ 0xef, 0xdc, 0xff, 0xfd, 0xcf, 0xef, 0xff, 0xfd,
+ 0xbf, 0xb9, 0xff, 0xfa, 0xdf, 0xdf, 0xff, 0xff,
+ 0xff, 0xfe, 0xf7, 0xfa, 0xff, 0xfe, 0xff, 0xff,
+ 0xff, 0xf7, 0xff, 0xff, 0xff, 0x6f, 0xe8, 0xff,
+ 0xfe, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x3f,
+ 0xff, 0xfe, 0xf7, 0xaf, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0x99, 0xff, 0xdf, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xfd,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa6,
+ 0x7f, 0x2d, 0x6f, 0xfe, 0x93, 0x2f, 0xbf, 0xfc,
+ 0xa6, 0x9b, 0xdf, 0x5c, 0xf3, 0xfd, 0x37, 0xdf,
+ 0x7c, 0xff, 0xff, 0xa9, 0xd9, 0x5f, 0xfe, 0xdb,
+ 0x79, 0xff, 0xfd, 0xff, 0xff, 0x6c, 0xe5, 0x3b,
+ 0xed, 0xbc, 0xf3, 0xce, 0x3b, 0xef, 0xff, 0xff,
+ 0x6d, 0xfe, 0xff, 0x92, 0xdf, 0xff, 0xff, 0xff,
+ 0xfb, 0xef, 0xdb, 0xff, 0xfe, 0xf9, 0xef, 0xbf,
+ 0xff, 0xfe, 0xfb, 0xff, 0xdf, 0x1b, 0xf7, 0xef,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xee,
+ 0xff, 0xdf, 0xfd, 0xff, 0xef, 0x7f, 0xff, 0xfd,
+ 0xff, 0x57, 0xe6, 0xf6, 0x7f, 0xef, 0xff, 0xf7,
+ 0xdf, 0x7f, 0xff, 0xbd, 0xf7, 0x9f, 0xdf, 0xee,
+ 0x79, 0xed, 0xb5, 0xff, 0x5e, 0xff, 0xbb, 0xb9,
+ 0xff, 0xaf, 0xb9, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xef, 0xfe, 0xff, 0xdd, 0xfd, 0x5f, 0x7d, 0xf5,
+ 0xff, 0x57, 0xff, 0x64, 0xee, 0xff, 0xdf, 0xff,
+ 0xff, 0xff, 0xf3, 0xfb, 0x4f, 0xb9, 0xff, 0xfd,
+ 0xf5, 0xdf, 0xd7, 0x59, 0xff, 0xff, 0xf5, 0xbf,
+ 0x19, 0xf8, 0xff, 0xe4, 0xff, 0xcf, 0x3f, 0xf5,
+ 0xfd, 0xc7, 0x5e, 0xff, 0xd8, 0xeb, 0x8f, 0x95,
+ 0x57, 0xfa, 0x69, 0xfd, 0x0f, 0xe6, 0xfd, 0xdf,
+ 0xfb, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xb5,
+ 0xae, 0xbf, 0xf6, 0xfa, 0xeb, 0xaf, 0xbd, 0xf6,
+ 0xff, 0x9d, 0x79, 0x9f, 0xe7, 0xff, 0x7f, 0xfe,
+ 0xf9, 0xe7, 0x9f, 0x7f, 0xfe, 0xb3, 0xcf, 0x3f,
+ 0xff, 0xec, 0xf3, 0xcf, 0xff, 0x7f, 0x6d, 0xec,
+ 0xdf, 0x7c, 0xfb, 0xcf, 0x3f, 0xff, 0xf8, 0xe3,
+ 0x8f, 0x7f, 0xdc, 0xf1, 0xc7, 0x9f, 0x77, 0xfe,
+ 0xf9, 0xb7, 0x2a, 0x9a, 0xf9, 0xfb, 0xcf, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xfe,
+ 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xff, 0xce,
+ 0xe6, 0xfe, 0xbf, 0xfe, 0xff, 0xfb, 0xef, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7,
+ 0xdf, 0x7f, 0xff, 0xdf, 0xb3, 0xb9, 0xff, 0xc7,
+ 0xfb, 0x2f, 0xfc, 0xf1, 0xd7, 0x1f, 0x7f, 0x7c,
+ 0xe1, 0x8f, 0x3f, 0x5e, 0xfa, 0xe3, 0x8f, 0xff,
+ 0xdf, 0x6e, 0xde, 0xff, 0xf8, 0x73, 0x8b, 0xff,
+ 0xfe, 0xfb, 0xef, 0xbf, 0x5f, 0xfc, 0xf7, 0xdf,
+ 0x17, 0xff, 0xfd, 0xf7, 0xff, 0xdf, 0x9b, 0xff,
+ 0x7f, 0x9f, 0xff, 0xfa, 0xbf, 0xff, 0xf7, 0xfb,
+ 0xff, 0xff, 0xff, 0xff, 0xbf, 0x7f, 0xfe, 0xfd,
+ 0xff, 0xff, 0xff, 0xe6, 0xff, 0xef, 0xb3, 0x8f,
+ 0x3c, 0xff, 0xfc, 0xf3, 0xcf, 0x8d, 0x6f, 0xb8,
+ 0xe1, 0x86, 0x1f, 0x6e, 0xb9, 0xe1, 0x9f, 0xbf,
+ 0xf9, 0xff, 0xe7, 0xff, 0x2f, 0xff, 0xff, 0xf7,
+ 0xdf, 0x7f, 0x6e, 0xf9, 0xcf, 0xbf, 0x5f, 0xe4,
+ 0xd3, 0xcf, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xfe,
+ 0xff, 0xeb, 0xff, 0xff, 0xfd, 0xf7, 0xff, 0x55,
+ 0xb7, 0xbf, 0x7e, 0xd3, 0xef, 0xbf, 0xdf, 0xfe,
+ 0xff, 0x9b, 0xff, 0xff, 0xfe, 0xff, 0xe2, 0xbf,
+ 0xff, 0xfe, 0xfb, 0xaf, 0x3e, 0xf3, 0xd5, 0x33,
+ 0xdf, 0x7d, 0xf7, 0xcd, 0x7f, 0xff, 0x86, 0xff,
+ 0xef, 0xff, 0xbf, 0xfe, 0xff, 0xff, 0xff, 0xff,
+ 0xdf, 0x7f, 0xf9, 0xe3, 0x97, 0x3f, 0xfe, 0xf8,
+ 0xe5, 0xdf, 0xbf, 0xf9, 0xff, 0xff, 0x8b, 0xfb,
+ 0xff, 0xf7, 0xff, 0xff, 0x7f, 0xff, 0xbf, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f,
+ 0x7e, 0xff, 0xeb, 0x8d, 0xbf, 0xfe, 0xfa, 0xab,
+ 0xaf, 0xbc, 0xfe, 0xf5, 0xd7, 0x5f, 0x7f, 0xfc,
+ 0xf5, 0x57, 0x5f, 0xff, 0x9b, 0xff, 0xf6, 0xfd,
+ 0xf7, 0xf3, 0xfd, 0x3d, 0xff, 0xef, 0xb6, 0xbf,
+ 0xfd, 0xf6, 0xf9, 0xe6, 0xdf, 0xed, 0xf6, 0xff,
+ 0xf9, 0xc6, 0xff, 0xbf, 0xff, 0xdf, 0xce, 0xff,
+ 0xe9, 0xf7, 0xbf, 0x7f, 0xfb, 0xf6, 0x6f, 0x3f,
+ 0x7d, 0xbf, 0xf3, 0xff, 0xef, 0xbb, 0xf9, 0xff,
+ 0xff, 0xff, 0xef, 0xfd, 0xff, 0xf7, 0x7f, 0xff,
+ 0xfe, 0xff, 0xbf, 0xb7, 0xff, 0xff, 0xfe, 0xff,
+ 0xff, 0xff, 0x6f, 0xfc, 0xff, 0xfd, 0x70, 0xff,
+ 0xff, 0xff, 0xff, 0xef, 0xff, 0xfd, 0xbf, 0xff,
+ 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x99,
+ 0x7f, 0xff, 0xbf, 0xbf, 0xff, 0xff, 0xff, 0xff,
+ 0xfb, 0xff, 0x7e, 0xff, 0xd7, 0xdf, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x7f, 0xe6, 0xff, 0xff, 0xfe,
+ 0xff, 0xdd, 0xbf, 0xef, 0xfd, 0xfb, 0xef, 0xef,
+ 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xbb, 0xf9, 0xff, 0xbf, 0xbd, 0xff, 0xff, 0xff,
+ 0xf7, 0xff, 0x7f, 0xef, 0xfb, 0xef, 0x7b, 0xff,
+ 0xfe, 0xfb, 0xfe, 0xff, 0xff, 0x67, 0xfe, 0xff,
+ 0xd7, 0xdf, 0x7f, 0xff, 0xff, 0xbd, 0xef, 0xff,
+ 0xfd, 0xdf, 0xbf, 0xbf, 0xfe, 0xff, 0xeb, 0xff,
+ 0xff, 0xff, 0x99, 0xdf, 0xff, 0xff, 0xff, 0xbf,
+ 0xff, 0xff, 0x3f, 0xf7, 0xbd, 0x77, 0xdf, 0xf7,
+ 0xfe, 0x7b, 0xf6, 0xbf, 0xff, 0xfe, 0x7f, 0xe6,
+ 0xbf, 0xff, 0xff, 0xfb, 0xfb, 0xbf, 0x7f, 0xc7,
+ 0x7f, 0xf7, 0xfd, 0xf7, 0xbf, 0xff, 0xfe, 0xfd,
+ 0xef, 0xbf, 0xff, 0xbf, 0xf9, 0xff, 0xfa, 0xeb,
+ 0xaf, 0xfb, 0xbf, 0xfb, 0xff, 0xf7, 0xdf, 0xff,
+ 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x6e, 0xfe, 0xff, 0xf8, 0xfb, 0xef, 0x7f, 0xbf,
+ 0xfc, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xfd, 0xbf,
+ 0x7b, 0xff, 0xfb, 0xff, 0xef, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff,
+ 0xff, 0xcf, 0x86, 0xff, 0xeb, 0x2f, 0xbf, 0xfe,
+ 0x67, 0x2e, 0xe5, 0xe6, 0x9a, 0xdf, 0x7c, 0xf3,
+ 0xcd, 0x37, 0xdf, 0x7c, 0x53, 0xfd, 0x8f, 0xd9,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xcb, 0x3e, 0xdb,
+ 0x6c, 0xff, 0x9b, 0xdf, 0x7f, 0xff, 0xfe, 0xfb,
+ 0xef, 0xd4, 0xff, 0x6d, 0xfe, 0xf7, 0xdf, 0x5f,
+ 0x7f, 0xff, 0xe7, 0xfb, 0xfe, 0xcf, 0xff, 0x7e,
+ 0xfd, 0xff, 0xbf, 0xff, 0xfe, 0xfb, 0xd5, 0xff,
+ 0x9b, 0xf5, 0xa5, 0x97, 0x5e, 0xfa, 0xff, 0xff,
+ 0xbf, 0xff, 0xfe, 0x7f, 0x5b, 0xff, 0xff, 0xff,
+ 0xbf, 0xff, 0x7d, 0xfd, 0xd7, 0xe6, 0xfe, 0xeb,
+ 0xa6, 0xbf, 0x6e, 0xff, 0xfb, 0xe6, 0xfd, 0x72,
+ 0xbf, 0xfd, 0xfe, 0xfb, 0xe7, 0xbf, 0xff, 0x5e,
+ 0xfb, 0xbb, 0x99, 0xfe, 0x6f, 0xbd, 0xf7, 0xfe,
+ 0xff, 0x7e, 0xb9, 0xef, 0xce, 0xff, 0xdf, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0x57, 0xff, 0x6c, 0xec,
+ 0xff, 0xff, 0x7f, 0xfc, 0xff, 0xbf, 0xff, 0x3e,
+ 0xef, 0xf9, 0x6f, 0xfd, 0x9f, 0x7f, 0xfb, 0xff,
+ 0xff, 0xb5, 0xbe, 0x99, 0xfb, 0xaf, 0xbf, 0xfe,
+ 0xfa, 0xff, 0xef, 0xbd, 0xc3, 0xce, 0x7e, 0x42,
+ 0xe9, 0x8f, 0x3f, 0x7c, 0xfe, 0x61, 0x05, 0xef,
+ 0xe6, 0xfd, 0xfb, 0xee, 0xbb, 0xef, 0xbf, 0xff,
+ 0x76, 0xff, 0xf5, 0xae, 0xbf, 0xf6, 0xfa, 0xeb,
+ 0xaf, 0xbf, 0xfe, 0xfa, 0xbd, 0x79, 0xff, 0x3e,
+ 0xfb, 0xec, 0xb3, 0xce, 0x6f, 0x9f, 0x7f, 0xfe,
+ 0xf3, 0xcf, 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 0x3f,
+ 0x7f, 0x6f, 0xec, 0x9f, 0xfe, 0xfa, 0xe9, 0xb7,
+ 0xdf, 0xbe, 0xf3, 0xcf, 0x7f, 0xfe, 0xf9, 0xc7,
+ 0x1f, 0x7f, 0xfe, 0xf9, 0xe7, 0xbf, 0x99, 0xf9,
+ 0x6b, 0x9f, 0x3d, 0xb6, 0xfd, 0xf3, 0xff, 0xff,
+ 0xdf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe,
+ 0xfb, 0xef, 0xcf, 0xe6, 0xfe, 0xdb, 0x6b, 0xaf,
+ 0xdd, 0xbf, 0xff, 0xff, 0xfe, 0xfb, 0xdf, 0x7f,
+ 0xff, 0xff, 0xff, 0xdf, 0x7f, 0xff, 0xfd, 0xbb,
+ 0xa9, 0xdf, 0xfb, 0xed, 0xbf, 0xff, 0xfe, 0xdb,
+ 0x1f, 0x7f, 0xfc, 0xa3, 0x8f, 0x3f, 0xfe, 0xf8,
+ 0xe3, 0x8f, 0x3f, 0xfe, 0x6a, 0xd8, 0xbf, 0xfd,
+ 0xf6, 0xdb, 0x6f, 0xf7, 0xea, 0xef, 0xbf, 0xff,
+ 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf,
+ 0xdf, 0x9b, 0xff, 0xe7, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff,
+ 0xff, 0x7f, 0xff, 0xef, 0xf7, 0xff, 0xe6, 0xff,
+ 0xef, 0xb2, 0xc7, 0x1e, 0xfb, 0xec, 0x73, 0xcb,
+ 0x0d, 0x6f, 0xb8, 0xe5, 0x8e, 0x1b, 0x7e, 0xb8,
+ 0xe1, 0x97, 0xbf, 0xf9, 0xff, 0xf6, 0xf9, 0xe7,
+ 0x9f, 0xff, 0xfb, 0x9f, 0x7f, 0xdf, 0xf3, 0x4e,
+ 0x3b, 0xef, 0xbe, 0xfb, 0xce, 0xbb, 0xfd, 0x6f,
+ 0xfe, 0xdf, 0x3e, 0xfb, 0xec, 0xb3, 0xef, 0xfe,
+ 0xbf, 0xfe, 0xf2, 0x8f, 0x7f, 0xfe, 0xf9, 0xe3,
+ 0x97, 0x5f, 0xfe, 0xfd, 0x9b, 0xff, 0x3f, 0xeb,
+ 0x9e, 0x7b, 0xee, 0xfb, 0xfe, 0xbb, 0x67, 0x7e,
+ 0xf5, 0xdd, 0x37, 0x4f, 0x3d, 0xf3, 0xcd, 0x73,
+ 0xff, 0x86, 0xff, 0xdb, 0xec, 0xb3, 0xcf, 0xbe,
+ 0xff, 0xff, 0xfb, 0xef, 0xff, 0xfe, 0xfb, 0xe7,
+ 0xbf, 0x7f, 0xff, 0xfd, 0xff, 0xbf, 0xf9, 0xff,
+ 0xf4, 0xdb, 0x4f, 0xfe, 0xf7, 0xf6, 0xcb, 0xff,
+ 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xfb, 0x6f, 0xfe, 0xbf, 0xab, 0xaf, 0xbb,
+ 0xfe, 0xf2, 0xab, 0xad, 0x3f, 0xfe, 0xf5, 0x57,
+ 0x5f, 0x7f, 0xed, 0xf1, 0xd7, 0x5f, 0xff, 0x9a,
+ 0xfe, 0x3f, 0x3f, 0xdf, 0x7f, 0xcd, 0xcf, 0xf7,
+ 0xef, 0xb3, 0xbe, 0x7d, 0xfe, 0xb9, 0xe7, 0x9f,
+ 0xff, 0xf7, 0xfb, 0xff, 0xc6, 0xef, 0xfb, 0xff,
+ 0xf7, 0xff, 0x7a, 0xff, 0xf7, 0x9f, 0xdf, 0xbd,
+ 0xf3, 0x4e, 0xff, 0xfd, 0xfc, 0xfd, 0xdf, 0xfb,
+ 0x9f, 0xf9, 0xfb, 0xf3, 0xff, 0x7f, 0xfd, 0xfd,
+ 0xff, 0xff, 0xdf, 0xff, 0xff, 0xf7, 0xff, 0xde,
+ 0xff, 0xfe, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xd7,
+ 0xfe, 0xfa, 0xbf, 0xbf, 0x3f, 0xff, 0xff, 0xff,
+ 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef,
+ 0xff, 0xff, 0x9b, 0xfd, 0xff, 0x7f, 0xed, 0xff,
+ 0xfb, 0xff, 0xff, 0xff, 0xef, 0xfe, 0xf7, 0xd7,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa6,
+ 0xff, 0x7b, 0xff, 0xef, 0xf7, 0xbf, 0xcf, 0xff,
+ 0xff, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xdf, 0x7f,
+ 0xbf, 0xff, 0xf7, 0xbf, 0xf9, 0xf7, 0xff, 0x7f,
+ 0xff, 0xfc, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xbf,
+ 0xbf, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff,
+ 0x6f, 0xfe, 0xff, 0xf7, 0x5f, 0xff, 0xff, 0xff,
+ 0xf5, 0xff, 0xff, 0xef, 0xdf, 0xdf, 0xbf, 0xfe,
+ 0xff, 0xff, 0xbf, 0xff, 0xff, 0x9b, 0xff, 0xfe,
+ 0xef, 0xff, 0xcf, 0x23, 0xf7, 0xff, 0xf7, 0x3d,
+ 0xef, 0xbb, 0xef, 0xfe, 0x7b, 0xef, 0xb3, 0xff,
+ 0xff, 0xff, 0x66, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xf7, 0xff, 0xff, 0xfd, 0xfe, 0xef, 0xef, 0xff,
+ 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xff, 0xbf, 0xf9,
+ 0xff, 0xff, 0xef, 0xff, 0xfb, 0x7e, 0xf7, 0xfd,
+ 0xf3, 0xff, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff,
+ 0x7f, 0xdf, 0xff, 0x6f, 0xfc, 0xff, 0xfe, 0xbb,
+ 0xfd, 0x87, 0xfb, 0xfd, 0xfa, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff,
+ 0x99, 0xff, 0xbf, 0xbf, 0x7e, 0xff, 0xff, 0xff,
+ 0xfe, 0xff, 0xff, 0xff, 0xff, 0xef, 0xf7, 0xff,
+ 0xff, 0xff, 0x7f, 0xfd, 0xff, 0xa6, 0xff, 0xeb,
+ 0xaf, 0xbf, 0xfc, 0x7f, 0xbe, 0xf9, 0xe7, 0xfb,
+ 0xdf, 0x5a, 0xf9, 0xcd, 0x37, 0xdf, 0x7c, 0x5f,
+ 0xff, 0xad, 0xd9, 0xff, 0xdf, 0x7f, 0xff, 0xff,
+ 0xc7, 0x7e, 0xfe, 0x7c, 0xe7, 0x3b, 0xbd, 0xbf,
+ 0xf3, 0xce, 0x3b, 0xef, 0xd7, 0xff, 0x6c, 0xde,
+ 0xf7, 0xdf, 0x7f, 0xff, 0xff, 0xd7, 0xfb, 0xff,
+ 0xdf, 0xff, 0xfe, 0xf5, 0xef, 0xbf, 0xff, 0xfe,
+ 0xfb, 0xf5, 0xff, 0x1b, 0xf5, 0xa5, 0x97, 0x5e,
+ 0xfa, 0xff, 0xe9, 0xff, 0xff, 0xff, 0xbf, 0xdf,
+ 0xff, 0xfb, 0xff, 0xbf, 0xff, 0x7f, 0x3d, 0x57,
+ 0xe6, 0xbe, 0xe9, 0xa6, 0x9b, 0x5e, 0xff, 0x7b,
+ 0xff, 0xff, 0xf3, 0xbf, 0xdf, 0xea, 0xfb, 0xe7,
+ 0xbf, 0x7f, 0x5e, 0x7f, 0xbb, 0x91, 0x7f, 0xef,
+ 0xbf, 0xff, 0xd6, 0xfb, 0xda, 0xff, 0xff, 0xff,
+ 0xff, 0x5d, 0xfb, 0xff, 0xff, 0xff, 0xff, 0x57,
+ 0xff, 0x64, 0xec, 0xef, 0xff, 0xff, 0xff, 0xfc,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xbd, 0xff,
+ 0x7f, 0xfb, 0xe5, 0xb7, 0xf4, 0xbf, 0x19, 0xfb,
+ 0xaf, 0xbf, 0xfe, 0x3a, 0xff, 0xef, 0xfd, 0xff,
+ 0x0f, 0x7f, 0xc2, 0x89, 0xa7, 0xbe, 0xfc, 0xea,
+ 0x63, 0xfd, 0x6f, 0xc6, 0xfd, 0xfb, 0xee, 0xbb,
+ 0xff, 0xff, 0xff, 0xf6, 0xdb, 0xf5, 0xae, 0xbf,
+ 0xfe, 0xfa, 0x6b, 0xaf, 0xbf, 0xfe, 0xb7, 0x9d,
+ 0x79, 0xff, 0x3f, 0xff, 0xfc, 0xff, 0xff, 0x7f,
+ 0xff, 0x7f, 0xfe, 0xf3, 0xcf, 0x3f, 0xff, 0xfc,
+ 0xf3, 0xcf, 0xff, 0x7b, 0x6f, 0xae, 0xbf, 0x7e,
+ 0xfa, 0xeb, 0xa7, 0xdf, 0x1e, 0xfb, 0xcf, 0x7f,
+ 0xfe, 0xf9, 0xe7, 0x1f, 0x7f, 0xfc, 0xf1, 0xf7,
+ 0xa9, 0x9b, 0xf9, 0x67, 0x8f, 0xfd, 0xf6, 0xf8,
+ 0xfb, 0xdf, 0xff, 0xdf, 0xff, 0xfe, 0xfb, 0xef,
+ 0xbf, 0xff, 0xfe, 0xfb, 0xdf, 0xce, 0x66, 0x7e,
+ 0xdb, 0x6b, 0xbf, 0xed, 0xff, 0xff, 0xfe, 0xff,
+ 0xfb, 0xdf, 0x7f, 0xff, 0xfd, 0xff, 0xff, 0xff,
+ 0xff, 0xf7, 0xb3, 0xb9, 0xf5, 0xfb, 0xef, 0xaf,
+ 0xbf, 0xfe, 0xda, 0xef, 0x7f, 0xfc, 0xeb, 0xaf,
+ 0xbf, 0xfe, 0xf8, 0xe3, 0x8f, 0xdb, 0xdf, 0x6e,
+ 0xde, 0xbf, 0xfd, 0xf6, 0xc9, 0x2f, 0xbf, 0x7a,
+ 0xf7, 0xbf, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff,
+ 0xfd, 0xf7, 0xee, 0xdf, 0x9b, 0xff, 0xe7, 0xbf,
+ 0x7f, 0xfa, 0xe9, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xbf, 0xff,
+ 0xff, 0xe6, 0xff, 0xef, 0xb3, 0x8f, 0x3e, 0xfa,
+ 0xec, 0xf3, 0xcf, 0x0d, 0x7f, 0xf8, 0xe1, 0x87,
+ 0x1b, 0x7e, 0xb8, 0xe1, 0x97, 0xbd, 0xf9, 0xff,
+ 0xfe, 0xfb, 0xaf, 0xbf, 0xfc, 0xff, 0xff, 0x7f,
+ 0xdf, 0xf3, 0xce, 0x3b, 0xef, 0xbe, 0xfb, 0xee,
+ 0xfb, 0xfd, 0x6f, 0xfe, 0xff, 0xfe, 0xfb, 0xeb,
+ 0x2f, 0xff, 0xff, 0xff, 0xff, 0xf2, 0x8f, 0x5f,
+ 0xfe, 0xf8, 0xe3, 0x8f, 0x3f, 0xfe, 0xfd, 0x9b,
+ 0xff, 0xbf, 0xff, 0xfe, 0xfa, 0xeb, 0xff, 0xfe,
+ 0xff, 0x67, 0x7e, 0xf5, 0xcd, 0x57, 0x4f, 0x3d,
+ 0xf5, 0xd4, 0x7f, 0xff, 0xe6, 0xff, 0xfb, 0xef,
+ 0xbf, 0xfe, 0xf2, 0xef, 0x7f, 0xff, 0xef, 0xff,
+ 0xfe, 0xfd, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xff,
+ 0xbf, 0xf9, 0xff, 0xf6, 0xfb, 0xef, 0xff, 0xff,
+ 0xe3, 0xfe, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xf7,
+ 0xff, 0xf7, 0xff, 0xff, 0xff, 0x6f, 0xfa, 0x5f,
+ 0xeb, 0xae, 0xbf, 0xfe, 0xda, 0xeb, 0xaf, 0x3d,
+ 0xfe, 0xd1, 0xd7, 0x4f, 0x7f, 0xfd, 0xf5, 0xc7,
+ 0x4f, 0x7f, 0x9b, 0xbd, 0xef, 0xff, 0xff, 0xfd,
+ 0xbc, 0xff, 0xff, 0xef, 0xd3, 0x9d, 0x7f, 0xb6,
+ 0xf9, 0xe7, 0xbf, 0x7f, 0xee, 0xff, 0xf9, 0xc6,
+ 0xfe, 0xff, 0xfe, 0xeb, 0xc7, 0xff, 0xfe, 0xff,
+ 0xaf, 0xff, 0xf5, 0xcb, 0x5f, 0xef, 0xfd, 0xfb,
+ 0xf7, 0xff, 0xff, 0xbf, 0xf9, 0xfb, 0xff, 0xbd,
+ 0xff, 0xef, 0x5d, 0xff, 0xbf, 0xdf, 0xfd, 0xff,
+ 0xff, 0xff, 0xd6, 0xff, 0xff, 0xbb, 0xff, 0xff,
+ 0x6f, 0xfe, 0x37, 0xff, 0xfa, 0xef, 0xbf, 0xff,
+ 0x66, 0xfa, 0xfe, 0xfd, 0xf7, 0xff, 0xff, 0xbf,
+ 0xff, 0xfe, 0xfb, 0xe7, 0xdf, 0x99, 0xff, 0xfb,
+ 0xbf, 0xfe, 0x7d, 0xf7, 0xfd, 0xb5, 0xfe, 0xff,
+ 0xfe, 0xff, 0xff, 0xbf, 0xfe, 0xff, 0xff, 0x5f,
+ 0xff, 0x7f, 0xe6, 0xff, 0xef, 0xff, 0xff, 0xfe,
+ 0xf9, 0xe3, 0xfe, 0xfb, 0xff, 0xff, 0xff, 0x7b,
+ 0xff, 0xef, 0xff, 0xde, 0x7f, 0xff, 0xbb, 0xf9,
+ 0xf7, 0xf8, 0x5b, 0xff, 0xbf, 0xfd, 0xfe, 0xff,
+ 0x7e, 0xbe, 0xef, 0xed, 0xa7, 0xfd, 0x5d, 0xfb,
+ 0xb5, 0xd7, 0xff, 0x67, 0xfe, 0xf9, 0xdf, 0xfb,
+ 0xdf, 0xb7, 0xde, 0xfe, 0xdf, 0xff, 0xee, 0xff,
+ 0x7d, 0xf7, 0xfe, 0xdf, 0xff, 0xbb, 0xee, 0x7b,
+ 0x99, 0xff, 0xcf, 0x3b, 0xc3, 0xfc, 0x73, 0xff,
+ 0xff, 0xfb, 0xfc, 0xbf, 0xff, 0xe7, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0x7f, 0xe6, 0xff, 0xde,
+ 0x77, 0xdf, 0xf5, 0xd7, 0xff, 0xfd, 0xfe, 0xfe,
+ 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xf9, 0xbf, 0xf9, 0xff, 0xfd, 0xf7, 0xdf, 0x77,
+ 0xef, 0xda, 0xef, 0xd7, 0xfd, 0xff, 0xf7, 0xd7,
+ 0xff, 0xfb, 0xff, 0xf7, 0x9f, 0xf7, 0x6f, 0xfc,
+ 0xff, 0xff, 0xff, 0xff, 0xf7, 0xfe, 0xfc, 0xfb,
+ 0xff, 0xff, 0x6f, 0xfd, 0xf7, 0xdf, 0x5f, 0x3f,
+ 0xfd, 0xf5, 0xff, 0x9b, 0xff, 0xf7, 0xff, 0xdf,
+ 0xff, 0xff, 0xdf, 0xbf, 0xfa, 0xff, 0xff, 0xdf,
+ 0xff, 0xbd, 0xf7, 0xff, 0xdf, 0x7f, 0xff, 0xff,
+ 0x86, 0x3f, 0xbf, 0xec, 0xfe, 0xfb, 0xef, 0xbf,
+ 0xff, 0xe7, 0xcb, 0xdf, 0xdf, 0xfe, 0xe7, 0xfb,
+ 0xf7, 0xf7, 0xdf, 0xff, 0x8f, 0xd9, 0xcf, 0xf7,
+ 0xdb, 0x7f, 0xff, 0xfd, 0xef, 0xff, 0xfc, 0xd6,
+ 0xf7, 0xfd, 0xff, 0xf3, 0x7f, 0xff, 0xfd, 0xf7,
+ 0xff, 0x6d, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0xf5,
+ 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x3d, 0xf5,
+ 0xff, 0x79, 0x67, 0x3f, 0xfd, 0xff, 0x9b, 0xf5,
+ 0xff, 0xbf, 0xff, 0xff, 0xff, 0xec, 0xff, 0xff,
+ 0xff, 0xff, 0xd3, 0x4f, 0xfd, 0xff, 0xf7, 0xdf,
+ 0x6f, 0xff, 0xd7, 0xe6, 0xfe, 0x6f, 0xff, 0xbd,
+ 0xf7, 0xda, 0x7f, 0xf6, 0xff, 0xf7, 0xbf, 0xdf,
+ 0xef, 0xbf, 0xff, 0xb7, 0xf7, 0xd6, 0xab, 0xbb,
+ 0x99, 0xff, 0xeb, 0xbf, 0xbf, 0x9e, 0xfa, 0xdb,
+ 0xff, 0xff, 0xff, 0xff, 0x7d, 0xf9, 0xe3, 0x7f,
+ 0xaf, 0x3c, 0xf3, 0xae, 0x6c, 0xec, 0xff, 0xfa,
+ 0xef, 0x7b, 0xfb, 0xfe, 0xfe, 0x7f, 0xfd, 0xfd,
+ 0xef, 0xfd, 0xf5, 0xff, 0x7f, 0x7f, 0xff, 0xfd,
+ 0xbd, 0x99, 0xfb, 0xbf, 0xfd, 0xf7, 0x4b, 0x7d,
+ 0xa5, 0xfd, 0x5f, 0x4f, 0x7c, 0xe2, 0xff, 0xfd,
+ 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xef, 0xe6, 0xfd,
+ 0xdf, 0x7f, 0xff, 0x6d, 0xb7, 0xff, 0xfe, 0xf3,
+ 0xf5, 0xae, 0xff, 0xed, 0xb7, 0xdf, 0x7f, 0xfb,
+ 0xed, 0xff, 0xbd, 0x79, 0xff, 0xe7, 0x9f, 0x7f,
+ 0xe6, 0x19, 0x7f, 0xdd, 0x7f, 0xfe, 0xf3, 0xdf,
+ 0x7e, 0xfb, 0xbf, 0xbf, 0xff, 0xff, 0x73, 0x6f,
+ 0xec, 0xff, 0xf0, 0xe3, 0x4f, 0x3f, 0xfe, 0x6e,
+ 0xf3, 0xcf, 0x7f, 0xae, 0x7d, 0xf6, 0xd8, 0x6f,
+ 0x9f, 0xfd, 0xf7, 0xbf, 0x99, 0xf9, 0xf7, 0xdf,
+ 0xff, 0xff, 0xff, 0xf7, 0xcf, 0xff, 0xdf, 0xff,
+ 0xee, 0xdf, 0xff, 0x7e, 0xff, 0xfd, 0xbf, 0xff,
+ 0xcf, 0xe6, 0xbe, 0xff, 0xfe, 0xff, 0xfb, 0xff,
+ 0xfe, 0xfb, 0xff, 0xfb, 0x5f, 0xff, 0xff, 0xf7,
+ 0xff, 0xff, 0xff, 0xf7, 0xff, 0xbb, 0xa9, 0x7f,
+ 0xc7, 0x5f, 0x7f, 0xdd, 0xf5, 0xdb, 0xfd, 0x2f,
+ 0xfc, 0xe3, 0xfd, 0xf7, 0x6f, 0x7f, 0xbf, 0xfd,
+ 0xf7, 0xff, 0x6a, 0xde, 0xff, 0x79, 0xe7, 0x9d,
+ 0x7f, 0xfe, 0xdb, 0xf7, 0x8b, 0xff, 0x7d, 0xd5,
+ 0x55, 0xbe, 0x5f, 0x7d, 0xb5, 0xd5, 0xdf, 0x9b,
+ 0xff, 0xff, 0xff, 0xff, 0xfa, 0xeb, 0xaf, 0xdb,
+ 0xff, 0xfa, 0xff, 0xff, 0xf7, 0xdf, 0xfe, 0xd6,
+ 0x5d, 0x77, 0xdd, 0xff, 0xe6, 0xff, 0xdf, 0xf0,
+ 0x83, 0x2e, 0xba, 0xf8, 0xf3, 0x8f, 0x0c, 0x6f,
+ 0xf8, 0xe3, 0x9f, 0x1f, 0x74, 0xd0, 0x45, 0x9f,
+ 0xbf, 0xf9, 0xff, 0xf3, 0xed, 0x77, 0xfe, 0xf9,
+ 0xfb, 0x9f, 0x2f, 0xde, 0xf3, 0xf4, 0xd3, 0xef,
+ 0xbf, 0xff, 0xfe, 0xfb, 0xff, 0x6f, 0xfe, 0xbf,
+ 0x2f, 0xbe, 0xfc, 0xfa, 0xeb, 0xff, 0xff, 0xea,
+ 0xf2, 0x0f, 0x7d, 0xf4, 0xf9, 0xe7, 0x9f, 0x7f,
+ 0xfe, 0xfd, 0x9b, 0xff, 0x3f, 0xe6, 0x9a, 0xef,
+ 0xbe, 0xbb, 0xbe, 0xbf, 0x6a, 0x7e, 0xf5, 0xcd,
+ 0x77, 0x7f, 0x7c, 0xf1, 0xd5, 0x77, 0xff, 0xe6,
+ 0xff, 0xfb, 0xee, 0xfb, 0xef, 0xbf, 0xff, 0x7f,
+ 0xbb, 0xee, 0xff, 0xfe, 0xf9, 0xe7, 0xdb, 0x7f,
+ 0xfe, 0xf9, 0xff, 0x8f, 0xf9, 0xdf, 0xf2, 0xfb,
+ 0xff, 0xff, 0xbf, 0xf4, 0xff, 0xfb, 0xff, 0xe7,
+ 0xe5, 0x97, 0xfe, 0x7f, 0xf9, 0xe5, 0x97, 0xff,
+ 0x6f, 0xea, 0xbf, 0xab, 0xae, 0xbf, 0xf6, 0x7a,
+ 0xcb, 0xaf, 0xbf, 0xfa, 0x75, 0x57, 0x5d, 0x7f,
+ 0xad, 0xf5, 0xd6, 0x5a, 0xff, 0x9a, 0xff, 0x77,
+ 0xfb, 0xfc, 0xf3, 0xcf, 0x3f, 0xff, 0xfe, 0x33,
+ 0x9f, 0xeb, 0xf5, 0xff, 0xbf, 0x7f, 0xfe, 0xf9,
+ 0xf7, 0xff, 0xc6, 0xff, 0xfb, 0x9f, 0x7f, 0xff,
+ 0xf9, 0xff, 0xf7, 0x9e, 0x6f, 0xf5, 0xff, 0xed,
+ 0xfb, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x9e, 0xd9,
+ 0x77, 0xff, 0xff, 0xdb, 0xdd, 0x5f, 0xfa, 0xd5,
+ 0xb4, 0xf8, 0xff, 0xff, 0xff, 0xef, 0xf9, 0xe7,
+ 0xff, 0xff, 0xe6, 0x6f, 0xfe, 0xbf, 0xfe, 0xda,
+ 0xef, 0xaf, 0xbf, 0xec, 0xfa, 0xff, 0xff, 0x5f,
+ 0xfd, 0xf5, 0xc7, 0x5f, 0x4f, 0xf5, 0xd5, 0xff,
+ 0x9b, 0xfd, 0x9e, 0x7d, 0xee, 0xfd, 0xef, 0xbf,
+ 0xbf, 0xf9, 0xff, 0x7f, 0x3f, 0xff, 0xfc, 0xbb,
+ 0xdf, 0x7e, 0xbf, 0x6d, 0xff, 0xe6, 0xff, 0x7f,
+ 0x9f, 0xff, 0xfe, 0xbe, 0xfb, 0xfe, 0xff, 0xef,
+ 0xff, 0xff, 0xf5, 0xff, 0xef, 0x7d, 0xf7, 0xdf,
+ 0xff, 0xbf, 0xf9, 0xff, 0xfe, 0xfb, 0x8f, 0xfb,
+ 0xff, 0xf7, 0x7f, 0xfd, 0xef, 0xdb, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x6f, 0xfe,
+ 0xbf, 0xef, 0xfb, 0xff, 0xff, 0xff, 0xdf, 0xdf,
+ 0x3f, 0xef, 0xdf, 0xe7, 0xdf, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x9b, 0x7d, 0xcf, 0x17, 0xef,
+ 0xff, 0xfd, 0xf7, 0x3f, 0xff, 0xfc, 0xff, 0x17,
+ 0xef, 0xbf, 0xcf, 0xe7, 0xff, 0xdf, 0xff, 0xff,
+ 0x66, 0xdf, 0xdf, 0x7f, 0xfd, 0xff, 0x7f, 0xff,
+ 0x7f, 0xbf, 0xd9, 0xff, 0xbb, 0xff, 0xff, 0xdf,
+ 0xef, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xf1,
+ 0xe7, 0x7d, 0xd7, 0xfe, 0xda, 0xe3, 0x7b, 0xff,
+ 0x7d, 0xf7, 0xdb, 0x6f, 0xff, 0xec, 0xd7, 0xdf,
+ 0xff, 0x6f, 0xdc, 0x6f, 0xff, 0xfb, 0xeb, 0x9f,
+ 0xfe, 0xfe, 0xfb, 0xef, 0xf7, 0x7f, 0xdc, 0xd1,
+ 0xc7, 0x0f, 0x3f, 0xfc, 0xf0, 0xff, 0x99, 0xff,
+ 0xff, 0xbf, 0xfe, 0xff, 0xf7, 0xbf, 0x7a, 0xdf,
+ 0xfb, 0xf7, 0xfb, 0xfd, 0xf7, 0xff, 0xff, 0xfb,
+ 0xbf, 0xff, 0xff, 0xa6, 0xff, 0x3f, 0xff, 0xfe,
+ 0xff, 0xc7, 0x3b, 0xbf, 0xa4, 0xf7, 0xbf, 0x37,
+ 0x7f, 0xfc, 0xfd, 0x87, 0xda, 0x7f, 0xff, 0x8f,
+ 0xf9, 0xff, 0xf7, 0xdf, 0xff, 0xff, 0xfb, 0xfe,
+ 0xdb, 0xf9, 0xff, 0xff, 0xad, 0xf2, 0xdf, 0x7f,
+ 0x9b, 0xfd, 0xf7, 0xff, 0x6d, 0xda, 0xff, 0xfe,
+ 0x3f, 0xfb, 0xbf, 0xf7, 0xda, 0xfe, 0xdb, 0x5c,
+ 0xef, 0xbd, 0xdd, 0xf6, 0xdb, 0x6f, 0xbf, 0xfd,
+ 0xff, 0x1b, 0xf7, 0xed, 0xf3, 0xfe, 0xfb, 0xef,
+ 0xb5, 0xd7, 0xfe, 0x35, 0xd7, 0x6b, 0xaf, 0xbd,
+ 0xf6, 0xda, 0x6b, 0xaf, 0xfd, 0xd7, 0xe6, 0xfe,
+ 0xee, 0xb5, 0x97, 0xff, 0xff, 0xfb, 0xbf, 0x99,
+ 0x67, 0xff, 0xf2, 0x7f, 0xb7, 0xdd, 0xf6, 0xda,
+ 0x6b, 0xaf, 0xbb, 0x99, 0xff, 0x7b, 0xf9, 0xe6,
+ 0xdb, 0xfb, 0xfe, 0x7b, 0xff, 0xfe, 0xdf, 0xdc,
+ 0x77, 0xcf, 0x2d, 0xd7, 0x5c, 0x73, 0xed, 0x6c,
+ 0xe6, 0xff, 0xfe, 0xdb, 0xfb, 0xb5, 0xff, 0xfe,
+ 0xfe, 0x7b, 0x5f, 0xff, 0xfd, 0xfd, 0xf5, 0xdf,
+ 0x7f, 0xff, 0xfd, 0xbf, 0x19, 0xfb, 0xef, 0xbd,
+ 0xf6, 0x5e, 0xed, 0xbf, 0xfd, 0xf6, 0xef, 0xdf,
+ 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd,
+ 0xef, 0xe6, 0xbd, 0xff, 0xff, 0xff, 0x6f, 0xff,
+ 0xff, 0xee, 0xff, 0x6f, 0xfe, 0xff, 0xdd, 0x77,
+ 0xdf, 0x7d, 0xf7, 0xdd, 0xff, 0xbd, 0x79, 0x17,
+ 0x6f, 0xbe, 0xfd, 0xfe, 0xff, 0x2f, 0xff, 0xff,
+ 0xf6, 0xb7, 0x7f, 0xfe, 0xf9, 0xe7, 0x9f, 0x7f,
+ 0xfe, 0x7f, 0x6f, 0xec, 0xdf, 0x7e, 0xfb, 0xec,
+ 0xbf, 0xbf, 0xfe, 0x7a, 0xed, 0x7e, 0x5f, 0xfd,
+ 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xbf, 0x99,
+ 0xfb, 0xf6, 0xfb, 0x6f, 0xff, 0xff, 0xef, 0xbf,
+ 0x7f, 0xff, 0xfd, 0xdf, 0x7f, 0xff, 0xfd, 0xf7,
+ 0xdf, 0x7f, 0xff, 0x4f, 0xe6, 0x7e, 0xff, 0xff,
+ 0xf7, 0xff, 0xff, 0xdb, 0xef, 0xfb, 0xdb, 0xff,
+ 0xb7, 0xdf, 0x7e, 0xfb, 0xed, 0xb7, 0xdf, 0xff,
+ 0xbb, 0xb9, 0xdf, 0x5b, 0x6f, 0xbf, 0xdd, 0xde,
+ 0xdf, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x6a, 0xd8, 0xfd,
+ 0xeb, 0xab, 0xbf, 0x36, 0xff, 0xeb, 0x6f, 0x9f,
+ 0xdd, 0xb5, 0xfb, 0xee, 0xbb, 0xef, 0xbe, 0xfb,
+ 0xee, 0xce, 0x9b, 0xff, 0xaf, 0xbf, 0xff, 0xfa,
+ 0xef, 0xaf, 0xf3, 0xff, 0xbb, 0xdf, 0x5f, 0x7f,
+ 0xfd, 0xf5, 0xd7, 0x5b, 0xff, 0xff, 0xff, 0xe6,
+ 0xff, 0xef, 0xb3, 0xcf, 0x3e, 0xfb, 0xe8, 0xf3,
+ 0xcf, 0x3f, 0xfd, 0xd1, 0x47, 0x1f, 0x7d, 0xf4,
+ 0xd1, 0xe7, 0x9f, 0xbf, 0xf9, 0xef, 0xfb, 0xef,
+ 0xbf, 0x9f, 0xfe, 0xfa, 0xeb, 0x7f, 0xff, 0xfd,
+ 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 0xdf,
+ 0x6f, 0xfe, 0xff, 0xff, 0xfb, 0xff, 0xa7, 0xbf,
+ 0xfe, 0xfa, 0xdf, 0xdf, 0x7f, 0xfd, 0xf5, 0xd7,
+ 0x5f, 0x7f, 0xfd, 0xf5, 0xff, 0x9b, 0xff, 0xbf,
+ 0xfe, 0xfb, 0xeb, 0xeb, 0xff, 0xbe, 0xfa, 0xef,
+ 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
+ 0xfd, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xdf,
+ 0xfa, 0xff, 0xaf, 0xff, 0xff, 0xfc, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xbf, 0x5f, 0xff, 0xbf, 0xf9,
+ 0xff, 0xfe, 0xca, 0x6f, 0xbf, 0xfc, 0xf7, 0xff,
+ 0x2f, 0x3f, 0xf2, 0xe9, 0x7f, 0xff, 0xdf, 0xff,
+ 0xff, 0xff, 0xf7, 0x6f, 0xfe, 0x7f, 0xa3, 0xad,
+ 0x39, 0xda, 0xea, 0x6b, 0xaf, 0x3e, 0xbe, 0x75,
+ 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 0x5f, 0xff,
+ 0x9a, 0xff, 0xff, 0xfe, 0xff, 0xee, 0xcd, 0xef,
+ 0xff, 0xff, 0xf1, 0xff, 0xeb, 0xf7, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xc6, 0xef, 0xdf,
+ 0xff, 0xff, 0xf7, 0xce, 0xff, 0xff, 0xff, 0xfb,
+ 0xbf, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x9f, 0xf9, 0xff, 0xbf, 0xff, 0xff, 0xff,
+ 0xfe, 0xff, 0xfe, 0xab, 0xfd, 0xfb, 0xff, 0xff,
+ 0xff, 0xfe, 0xdb, 0xef, 0xff, 0xff, 0x6f, 0xfc,
+ 0xff, 0xfe, 0xfb, 0xef, 0xef, 0xbf, 0xfe, 0xfb,
+ 0xc1, 0x77, 0x5f, 0xdd, 0xf7, 0xdf, 0x7f, 0xef,
+ 0xfd, 0xb7, 0xff, 0x9b, 0xff, 0xff, 0xbf, 0xff,
+ 0xbe, 0xdf, 0x6e, 0xbf, 0xff, 0xef, 0xed, 0xdf,
+ 0x7e, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xef, 0xff,
+ 0xe6, 0xff, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x7f, 0xbf, 0xff, 0xf6, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xf1, 0xf7, 0xdf, 0xff, 0xbf, 0xe9, 0xbf, 0xfe,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x3f,
+ 0xfe, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff,
+ 0xff, 0x6f, 0xfe, 0xbf, 0xff, 0xbf, 0xff, 0xff,
+ 0xff, 0xff, 0x7f, 0xfb, 0x7a, 0xfd, 0xff, 0xff,
+ 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0x9b, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xdf, 0x7b, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf,
+ 0xf9, 0xff, 0x7f, 0xff, 0xfd, 0xf7, 0xfb, 0x7f,
+ 0xff, 0xbd, 0x7f, 0xdd, 0xff, 0xdf, 0xff, 0xff,
+ 0x3f, 0xff, 0xbf, 0xff, 0x6f, 0xfe, 0xff, 0xfa,
+ 0xff, 0xff, 0xff, 0xff, 0xfb, 0xdf, 0xef, 0x5f,
+ 0xff, 0xdf, 0xf7, 0xff, 0x7f, 0xff, 0xff, 0xfe,
+ 0xff, 0x99, 0xff, 0xbf, 0xff, 0xfb, 0xef, 0xff,
+ 0xff, 0xfe, 0x73, 0xbc, 0x7f, 0xff, 0x7f, 0xfe,
+ 0xff, 0xef, 0xff, 0xef, 0xff, 0xff, 0x66, 0xff,
+ 0xcf, 0x3e, 0xff, 0xfc, 0xf3, 0xdf, 0x3f, 0xdf,
+ 0xfc, 0xef, 0x9f, 0xfd, 0xfe, 0x79, 0xef, 0x9f,
+ 0x7f, 0xfe, 0x9f, 0xf9, 0xff, 0xbf, 0xdd, 0xff,
+ 0x5f, 0x7d, 0xb3, 0xcf, 0x7f, 0xff, 0xdf, 0x6f,
+ 0xff, 0x7f, 0xfe, 0xff, 0xee, 0xbf, 0xff, 0x6f,
+ 0xfe, 0xff, 0xff, 0xfb, 0xef, 0xbe, 0x3f, 0xfe,
+ 0x7b, 0xce, 0x75, 0xff, 0xbd, 0xf6, 0xdd, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xff, 0x9b, 0xff, 0xff, 0xf7,
+ 0xff, 0xbf, 0x7f, 0xbf, 0xfd, 0xfd, 0xdf, 0xff,
+ 0xfe, 0xeb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xa6, 0xff, 0xaf, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xe7, 0xbf, 0xef, 0xdf, 0xf7, 0xdf, 0x7f, 0xdf,
+ 0xf9, 0xf7, 0xde, 0x7f, 0xff, 0xbf, 0xf9, 0xff,
+ 0xfc, 0xf3, 0xcf, 0x37, 0xff, 0xdd, 0xf3, 0xcb,
+ 0x7f, 0xfe, 0xf9, 0xe7, 0x97, 0x7f, 0xfe, 0xf9,
+ 0xe7, 0xff, 0x6f, 0xfe, 0xbb, 0xfe, 0xfe, 0xeb,
+ 0xef, 0xaf, 0xff, 0xbe, 0xfb, 0xdf, 0x7e, 0xef,
+ 0xed, 0xf7, 0xcd, 0x7a, 0xff, 0xfc, 0xff, 0x9b,
+ 0xff, 0xdf, 0x7f, 0xfa, 0xf9, 0xa7, 0xdf, 0x7e,
+ 0xfa, 0xfd, 0xef, 0x3f, 0xfd, 0xfe, 0xd3, 0xef,
+ 0x3f, 0xfd, 0xf4, 0xff, 0xe6, 0xff, 0xf7, 0xdf,
+ 0x7f, 0xff, 0xfd, 0xf7, 0xde, 0x7f, 0xff, 0xfb,
+ 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff,
+ 0xbf, 0xf9, 0xfd, 0xfb, 0xff, 0xff, 0xff, 0xbf,
+ 0xf7, 0xff, 0x7f, 0xff, 0xfb, 0xff, 0xbf, 0xff,
+ 0xff, 0xfb, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0x7f,
+ 0xfb, 0xfd, 0xf7, 0xf7, 0xff, 0xff, 0xbf, 0xb7,
+ 0xbf, 0xff, 0xf6, 0xfb, 0xef, 0xbe, 0xff, 0x7e,
+ 0xfb, 0xfe, 0x9b, 0xdf, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xcf, 0x7f, 0xff, 0xf7, 0xfd, 0xff, 0xbf,
+ 0xff, 0xdf, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xe6,
+ 0xff, 0xdf, 0x7f, 0xff, 0xf9, 0xf7, 0x9f, 0x7f,
+ 0xff, 0xfd, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xcf,
+ 0xbf, 0xff, 0xfe, 0xbf, 0xb9, 0xff, 0xb7, 0xdf,
+ 0x7e, 0xbb, 0xed, 0xb7, 0xd7, 0x7e, 0xfb, 0xdb,
+ 0x6f, 0xbf, 0xfd, 0xf6, 0xdb, 0x6f, 0xbf, 0xf9,
+ 0x6f, 0xfe, 0xff, 0xf7, 0xdf, 0x7f, 0xfb, 0xfd,
+ 0xb7, 0xdf, 0x7e, 0xff, 0xfb, 0xef, 0xbf, 0xff,
+ 0xf6, 0xdb, 0xef, 0xbf, 0xff, 0x9b, 0xff, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xbd, 0xf7,
+ 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbd, 0xf7, 0xbe,
+ 0xfb, 0xef, 0xe6, 0xff, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xef, 0xb7, 0xfb, 0xfe, 0xfb, 0xdf, 0x7f, 0xff,
+ 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xbf, 0xf9,
+ 0xff, 0xaf, 0xbf, 0xfe, 0xea, 0xeb, 0xaf, 0xbf,
+ 0xfe, 0xfe, 0xf7, 0x5f, 0x7f, 0xff, 0xf5, 0xf7,
+ 0x5f, 0x7f, 0xf9, 0x6f, 0xfe, 0xff, 0xfb, 0xef,
+ 0xbf, 0xfb, 0xbe, 0xfb, 0xef, 0xbf, 0xff, 0xfd,
+ 0xf7, 0xdf, 0x7d, 0xff, 0xfd, 0xf7, 0xdf, 0xff,
+ 0x9b, 0xff, 0xff, 0xfc, 0xf3, 0xcf, 0x3d, 0xff,
+ 0xfc, 0xf3, 0xcf, 0x7b, 0xfe, 0xf9, 0xe7, 0x9e,
+ 0x7f, 0xfe, 0xf9, 0xe7, 0xf7, 0xe6, 0xff, 0x5f,
+ 0x7f, 0xfd, 0xf5, 0xd7, 0x5b, 0x7f, 0xfd, 0xf5,
+ 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe,
+ 0xfa, 0xbf, 0xf9, 0xff, 0x5f, 0x7f, 0xfd, 0xe5,
+ 0xd7, 0x5d, 0x7f, 0xfd, 0xf5, 0xaf, 0xbf, 0xfe,
+ 0xf2, 0xeb, 0xaf, 0xbf, 0xfe, 0xf8, 0x6f, 0xee,
+ 0xff, 0xfe, 0xfb, 0x6f, 0xb7, 0xbf, 0xfe, 0xfb,
+ 0x2f, 0x7f, 0xfd, 0xfd, 0xd7, 0xdb, 0x7f, 0xf9,
+ 0xfd, 0xd7, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xf7, 0xff, 0xff, 0xff, 0xef, 0x7f, 0xff,
+ 0xff, 0xf7, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0xff,
+ 0xe6, 0xfe, 0xdf, 0xee, 0xbf, 0xe7, 0xf6, 0xdf,
+ 0xee, 0xbf, 0xf7, 0x7d, 0xf7, 0xdf, 0x77, 0xff,
+ 0xbd, 0xf7, 0xdf, 0xff, 0xbf, 0xf9, 0xbf, 0x31,
+ 0xf7, 0xd7, 0xfb, 0x7d, 0xb5, 0xf5, 0xb7, 0xd7,
+ 0x9d, 0xfa, 0xdb, 0xad, 0xbf, 0xbd, 0xfa, 0xeb,
+ 0xef, 0x6f, 0xfe, 0xff
+};
+
+
+/* rom names */
+
+#define EPPSAMP_ROM_DIVROM0 0
+#define EPPSAMP_ROM_DIVROM1 16
+#define EPPSAMP_ROM_DIVROM2 32
+#define EPPSAMP_ROM_MULROM 48
+#define EPPSAMP_ROM_CLKSELROM 64
+
+
+/* rom locations */
+static const unsigned long eppsamp_roms[80] = {
+ 76047, 76213, 75715, 75881, 76215, 76049, 75883, 75717,
+ 75383, 75549, 75051, 75217, 75551, 75385, 75219, 75053,
+ 81993, 81661, 82161, 81829, 82159, 81827, 81995, 81663,
+ 81329, 80997, 81497, 81165, 81495, 81163, 81331, 80999,
+ 87928, 87264, 88094, 87430, 88096, 87432, 87930, 87266,
+ 87596, 86932, 87762, 87098, 87764, 87100, 87598, 86934,
+ 75966, 75302, 76134, 75470, 76132, 75468, 75968, 75304,
+ 75634, 74970, 75802, 75138, 75800, 75136, 75636, 74972,
+ 75946, 75282, 76112, 75448, 76114, 75450, 75948, 75284,
+ 75614, 74950, 75780, 75116, 75782, 75118, 75616, 74952
+};
+
diff --git a/main/fpga.h b/main/fpga.h
new file mode 100644
index 0000000..aa327d9
--- /dev/null
+++ b/main/fpga.h
@@ -0,0 +1,169 @@
+/*****************************************************************************/
+
+/*
+ * fpga.h -- FPGA test library exports (and imports).
+ *
+ * Copyright (C) 1998, 1999, 2000 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifndef _FPGA_H
+#define _FPGA_H
+
+/* ---------------------------------------------------------------------- */
+
+#include "sysdeps.h"
+#include "parport.h"
+
+/* ---------------------------------------------------------------------- */
+
+struct adapter_config {
+ unsigned int fclk;
+ unsigned int bitrate;
+ unsigned int intclk;
+ unsigned int extmodem;
+ unsigned int loopback;
+ unsigned int extstat;
+ unsigned int pttmute;
+ unsigned int filtmode;
+ unsigned int gain;
+};
+
+/* ---------------------------------------------------------------------- */
+
+extern void printconfig(const struct adapter_config *cfg);
+extern void parseconfig(struct adapter_config *cfg, const char *modestr);
+
+extern int adapter_start_no_firmware(void);
+extern int adapter_start_eppchk(void);
+extern int adapter_start_epp(struct adapter_config *cfg);
+extern int adapter_start_ecp(struct adapter_config *cfg);
+extern int adapter_start_eppafsk(struct adapter_config *cfg);
+extern int adapter_start_sppafsk(struct adapter_config *cfg);
+extern int adapter_start_eppsamp(struct adapter_config *cfg);
+
+/* ---------------------------------------------------------------------- */
+
+extern inline void sppafsk_wrcmd(unsigned char d)
+{
+ parport_write_data(d);
+ parport_write_control(LPTCTRL_PROGRAM | 0x09);
+ parport_write_control(LPTCTRL_PROGRAM | 0x08);
+}
+
+extern inline void sppafsk_wrdata(unsigned char d)
+{
+ parport_write_data(d);
+ parport_write_control(LPTCTRL_PROGRAM | 0x01);
+ parport_write_control(LPTCTRL_PROGRAM | 0x00);
+}
+
+extern inline unsigned char sppafsk_rdcmd(void)
+{
+ unsigned char d1, d2;
+
+ parport_write_control(LPTCTRL_PROGRAM | 0x0b);
+ parport_read_status();
+ d2 = parport_read_status();
+ d1 = ((d2 & 0xe0) | ((d2 << 1) & 0x10)) >> 4;
+ parport_write_control(LPTCTRL_PROGRAM | 0x0a);
+ parport_read_status();
+ d2 = parport_read_status();
+ d1 |= (d2 & 0xe0) | ((d2 << 1) & 0x10);
+ return d1;
+}
+
+extern inline unsigned char sppafsk_rddata(void)
+{
+ unsigned char d1, d2;
+
+ parport_write_control(LPTCTRL_PROGRAM | 0x03);
+ parport_read_status();
+ d2 = parport_read_status();
+ d1 = ((d2 & 0xe0) | ((d2 << 1) & 0x10)) >> 4;
+ parport_write_control(LPTCTRL_PROGRAM | 0x02);
+ parport_read_status();
+ d2 = parport_read_status();
+ d1 |= (d2 & 0xe0) | ((d2 << 1) & 0x10);
+ return d1;
+}
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ * description of the test procedures defined
+ */
+
+extern const struct eppfpgatests {
+ const char *name;
+ const char *desc;
+ int (*func)(struct adapter_config *);
+} eppfpgatests[];
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ * provided externally!
+ */
+
+extern int lprintf(unsigned vl, const char *format, ...)
+__attribute__ ((format (printf, 2, 3)));
+
+extern int tprintf(const char *format, ...)
+__attribute__ ((format (printf, 1, 2)));
+
+extern int idle_callback(unsigned us_delay);
+
+/* ---------------------------------------------------------------------- */
+
+extern int snprintpkt(char *buf, size_t sz, const u_int8_t *pkt, unsigned len);
+
+/* ---------------------------------------------------------------------- */
+
+extern inline void reset_modem(void)
+{
+ unsigned char null = 0;
+
+ parport_epp_write_addr(&null, 1);
+ parport_write_control(LPTCTRL_ADDRSTB);
+}
+
+/* ---------------------------------------------------------------------- */
+
+extern inline unsigned readboundary(const unsigned char *b, unsigned x)
+{
+ return (b[x >> 3] >> (x & 7)) & 1;
+}
+
+extern inline void writeboundary(unsigned char *b, unsigned x, int v)
+{
+ b[x >> 3] &= ~(1 << (x & 7));
+ b[x >> 3] |= (v & 1) << (x & 7);
+}
+
+/* ---------------------------------------------------------------------- */
+
+extern void boundary(unsigned int blen, const unsigned char *in, unsigned char *out, unsigned char eppdata);
+
+/* ---------------------------------------------------------------------- */
+#endif /* _FPGA_H */
diff --git a/main/fpgatests.c b/main/fpgatests.c
new file mode 100644
index 0000000..a32ca0f
--- /dev/null
+++ b/main/fpgatests.c
@@ -0,0 +1,3151 @@
+/*****************************************************************************/
+
+/*
+ * fpgatests.c -- HDLC packet radio modem for EPP using FPGA utility library.
+ *
+ * Copyright (C) 1998 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+#include <math.h>
+#include <unistd.h>
+#include <stdarg.h>
+
+#include "parport.h"
+#include "fpga.h"
+#include "util.h"
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ *The doubly scrambled BERR tests
+ * (once in software, once in the modem)
+ * exercise the data exchange between modem and PC
+ */
+
+/* note: this is the reverse direction */
+
+#if 0
+#define SCRAM_TAP1 0x00001 /* X^17 */
+#define SCRAM_TAPN 0x21000 /* X^0+X^5 */
+
+#define DESCRAM_TAPSH1 0
+#define DESCRAM_TAPSH2 5
+#define DESCRAM_TAPSH3 17
+#endif
+
+#define DESCRAM_TAPSH1 0
+#define DESCRAM_TAPSH2 7
+#define DESCRAM_TAPSH3 10
+
+#define SCRAM_TAP1 1
+#define SCRAM_TAPN ((1<<DESCRAM_TAPSH3)|(1<<(DESCRAM_TAPSH3-DESCRAM_TAPSH2)))
+
+/* ---------------------------------------------------------------------- */
+
+#include "epp_fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+static unsigned readboundaryword(const unsigned char *b, const unsigned *x, unsigned num)
+{
+ unsigned mask = 1, ret = 0;
+
+ for (; num > 0; num--, x++, mask <<= 1)
+ if (readboundary(b, *x))
+ ret |= mask;
+ return ret;
+}
+
+static void writeboundaryword(unsigned char *b, const unsigned *x, unsigned num, unsigned v)
+{
+ unsigned sh = 0;
+
+ for (; num > 0; num--, x++, sh++)
+ writeboundary(b, *x, (v >> sh) & 1);
+}
+
+/* ========= BOUNDARY SCAN ONLY TESTS =================================== */
+
+/*
+ * RAM-Test
+ */
+
+static const unsigned int ram_addr_o[15] =
+{
+ FPGA_PIN_RAMA0_O,
+ FPGA_PIN_RAMA1_O,
+ FPGA_PIN_RAMA2_O,
+ FPGA_PIN_RAMA3_O,
+ FPGA_PIN_RAMA4_O,
+ FPGA_PIN_RAMA5_O,
+ FPGA_PIN_RAMA6_O,
+ FPGA_PIN_RAMA7_O,
+ FPGA_PIN_RAMA8_O,
+ FPGA_PIN_RAMA9_O,
+ FPGA_PIN_RAMA10_O,
+ FPGA_PIN_RAMA11_O,
+ FPGA_PIN_RAMA12_O,
+ FPGA_PIN_RAMA13_O,
+ FPGA_PIN_RAMA14_O
+};
+
+static const unsigned int ram_addr_t[15] =
+{
+ FPGA_PIN_RAMA0_T,
+ FPGA_PIN_RAMA1_T,
+ FPGA_PIN_RAMA2_T,
+ FPGA_PIN_RAMA3_T,
+ FPGA_PIN_RAMA4_T,
+ FPGA_PIN_RAMA5_T,
+ FPGA_PIN_RAMA6_T,
+ FPGA_PIN_RAMA7_T,
+ FPGA_PIN_RAMA8_T,
+ FPGA_PIN_RAMA9_T,
+ FPGA_PIN_RAMA10_T,
+ FPGA_PIN_RAMA11_T,
+ FPGA_PIN_RAMA12_T,
+ FPGA_PIN_RAMA13_T,
+ FPGA_PIN_RAMA14_T
+};
+
+static const unsigned int ram_data_t[8] =
+{
+ FPGA_PIN_RAMD0_T,
+ FPGA_PIN_RAMD1_T,
+ FPGA_PIN_RAMD2_T,
+ FPGA_PIN_RAMD3_T,
+ FPGA_PIN_RAMD4_T,
+ FPGA_PIN_RAMD5_T,
+ FPGA_PIN_RAMD6_T,
+ FPGA_PIN_RAMD7_T
+};
+
+static const unsigned int ram_data_o[8] =
+{
+ FPGA_PIN_RAMD0_O,
+ FPGA_PIN_RAMD1_O,
+ FPGA_PIN_RAMD2_O,
+ FPGA_PIN_RAMD3_O,
+ FPGA_PIN_RAMD4_O,
+ FPGA_PIN_RAMD5_O,
+ FPGA_PIN_RAMD6_O,
+ FPGA_PIN_RAMD7_O
+};
+
+static const unsigned int ram_data_i[8] =
+{
+ FPGA_PIN_RAMD0_I,
+ FPGA_PIN_RAMD1_I,
+ FPGA_PIN_RAMD2_I,
+ FPGA_PIN_RAMD3_I,
+ FPGA_PIN_RAMD4_I,
+ FPGA_PIN_RAMD5_I,
+ FPGA_PIN_RAMD6_I,
+ FPGA_PIN_RAMD7_I
+};
+
+/* ---------------------------------------------------------------------- */
+
+static unsigned int ramaccess(unsigned addr, unsigned data, unsigned write)
+{
+ unsigned char bd1[FPGA_BOUNDSIZE], bd2[FPGA_BOUNDSIZE];
+
+ memcpy(bd1, fpga_safebound, FPGA_BOUNDSIZE);
+ writeboundaryword(bd1, ram_addr_t, 15, 0);
+ writeboundaryword(bd1, ram_addr_o, 15, addr);
+ writeboundary(bd1, FPGA_PIN_RAMCE_T, 0);
+ writeboundary(bd1, FPGA_PIN_RAMOE_T, 0);
+ writeboundary(bd1, FPGA_PIN_RAMWR_T, 0);
+ writeboundary(bd1, FPGA_PIN_RAMCE_O, 0);
+ writeboundary(bd1, FPGA_PIN_RAMOE_O, (write) & 1);
+ writeboundary(bd1, FPGA_PIN_RAMWR_O, (!write) & 1);
+ if (write) {
+ writeboundaryword(bd1, ram_data_t, 8, 0);
+ writeboundaryword(bd1, ram_data_o, 8, data);
+ }
+ boundary(FPGA_BOUND, bd1, bd2, 0);
+ writeboundary(bd1, FPGA_PIN_RAMCE_O, 1);
+ writeboundary(bd1, FPGA_PIN_RAMOE_O, 1);
+ writeboundary(bd1, FPGA_PIN_RAMWR_O, 1);
+ boundary(FPGA_BOUND, bd1, bd2, 0);
+ if (write)
+ return 0;
+ return readboundaryword(bd2, ram_data_i, 8);
+}
+
+static unsigned char *to_bin(unsigned char *buf, unsigned val, unsigned num)
+{
+ unsigned int i;
+
+ for (i = 0; i < num; i++, val <<= 1)
+ buf[i] = ((val >> (num-1)) & 1) + '0';
+ buf[num] = 0;
+ return buf;
+}
+
+static unsigned ramtestdata(unsigned data)
+{
+ unsigned val;
+ unsigned char s[10];
+
+ ramaccess(0, data, 1);
+ val = ramaccess(0, 0, 0);
+ tprintf("Testing data pattern 0x%02x read 0x%02x failure mask %8s\n",
+ data, val, to_bin(s, val ^ data, 8));
+ idle_callback(0);
+ return val ^ data;
+}
+
+static unsigned ramtestaddr(void)
+{
+ unsigned char ramd[32768];
+ unsigned int i, j, k, l, mask = 0;
+ unsigned char s[16];
+
+ for (i = 0; i < 32768; i++) {
+ if (!(i & 0xff)) {
+ tprintf("Writing RAM address 0x%04x...\r", i);
+ if (idle_callback(0))
+ return mask;
+ }
+ ramd[i] = random();
+ ramaccess(i, ramd[i], 1);
+ }
+ for (i = 0; i < 32768; i++) {
+ if (!(i & 0xff)) {
+ tprintf("Reading RAM address 0x%04x...\r", i);
+ if (idle_callback(0))
+ return mask;
+ }
+ j = ramaccess(i, 0, 0);
+ if (j == ramd[i])
+ continue;
+ l = 0xffff;
+ for (k = 0; k < 32768; k++) {
+ if (ramd[k] != j)
+ continue;
+ if (hweight32(l) > hweight32(k ^ i))
+ l = k ^ i;
+ }
+ mask |= k;
+ tprintf("RAM address error at 0x%04x minimum error mask %15s\n",
+ i, to_bin(s, k, 15));
+ if (idle_callback(0))
+ return mask;
+ }
+ return mask;
+}
+
+static int ramtest(struct adapter_config *cfg)
+{
+ unsigned mask;
+ unsigned char s[16];
+ int i;
+
+ if ((i = adapter_start_no_firmware()))
+ return i;
+ tprintf("Performing RAM test...\n");
+ mask = ramtestdata(0xff);
+ mask |= ramtestdata(0x00);
+ mask |= ramtestdata(0x55);
+ mask |= ramtestdata(0xaa);
+ mask |= ramtestdata(0xcc);
+ mask |= ramtestdata(0x33);
+ if (mask) {
+ tprintf("RAM data error mask %s\nRAM data test failed, exiting\n",
+ to_bin(s, mask, 8));
+ reset_modem();
+ return -4;
+ }
+ if ((mask = ramtestaddr())) {
+ tprintf("RAM address error mask %s\nRAM address test failed, exiting\n",
+ to_bin(s, mask, 15));
+ reset_modem();
+ return -5;
+ }
+ if (!idle_callback(0))
+ tprintf("\nRAM test passed\n");
+ reset_modem();
+ return 0;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * LED test
+ */
+
+static int ledtest(struct adapter_config *cfg)
+{
+ unsigned led = 0;
+ unsigned char bd1[FPGA_BOUNDSIZE], bd2[FPGA_BOUNDSIZE];
+ int i;
+
+ if ((i = adapter_start_no_firmware()))
+ return i;
+ memcpy(bd1, fpga_safebound, FPGA_BOUNDSIZE);
+ tprintf("LED test, DISCONNECT PTT!!\n");
+ for (;;) {
+ led = (++led) & 3;
+ writeboundary(bd1, FPGA_PIN_LEDSTA_O, led != 0);
+ writeboundary(bd1, FPGA_PIN_LEDCON_O, led != 1);
+ writeboundary(bd1, FPGA_PIN_LEDDCD_O, led != 2);
+ writeboundary(bd1, FPGA_PIN_LEDPTT_O, led == 3);
+ writeboundary(bd1, FPGA_PIN_LEDCON_T, 0);
+ writeboundary(bd1, FPGA_PIN_LEDSTA_T, 0);
+ writeboundary(bd1, FPGA_PIN_LEDDCD_T, 0);
+ writeboundary(bd1, FPGA_PIN_LEDPTT_T, 0);
+ boundary(FPGA_BOUND, bd1, bd2, 0);
+ tprintf("Lighting LED %s\r", ((const char *[4]){ "STA", "CON", "DCD", "PTT"})[led]);
+ if (idle_callback(500000)) {
+ reset_modem();
+ return 0;
+ }
+ }
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * DAC test
+ */
+
+static const unsigned int dac_t[7] =
+{
+ FPGA_PIN_DAC0_T,
+ FPGA_PIN_DAC1_T,
+ FPGA_PIN_DAC2_T,
+ FPGA_PIN_DAC3_T,
+ FPGA_PIN_DAC4_T,
+ FPGA_PIN_DAC5_T,
+ FPGA_PIN_DAC6_T
+};
+
+static const unsigned int dac_o[7] =
+{
+ FPGA_PIN_DAC0_O,
+ FPGA_PIN_DAC1_O,
+ FPGA_PIN_DAC2_O,
+ FPGA_PIN_DAC3_O,
+ FPGA_PIN_DAC4_O,
+ FPGA_PIN_DAC5_O,
+ FPGA_PIN_DAC6_O
+};
+
+
+static int dactest(struct adapter_config *cfg)
+{
+ unsigned phase = 0, data, rot = 0;
+ unsigned char bd1[FPGA_BOUNDSIZE], bd2[FPGA_BOUNDSIZE];
+ int i;
+
+ if ((i = adapter_start_no_firmware()))
+ return i;
+ memcpy(bd1, fpga_safebound, FPGA_BOUNDSIZE);
+ tprintf("DAC test\n");
+ for (;;) {
+ data = 64 + 63 * sin(M_PI / 128 * phase);
+ writeboundaryword(bd1, dac_t, 7, 0);
+ writeboundaryword(bd1, dac_o, 7, data);
+ boundary(FPGA_BOUND, bd1, bd2, 0);
+ phase = (phase + 1) & 0xff;
+ if (phase)
+ continue;
+ rot = (rot + 1) & 3;
+ tprintf("%c\r", "|\\-/"[rot]);
+ if (idle_callback(0)) {
+ reset_modem();
+ return 0;
+ }
+ }
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * Parport Signal Tests
+ */
+
+static const unsigned int ppinsig[] = {
+ FPGA_PIN_EPPNWRITE_I, /* strobe */
+ FPGA_PIN_EPPNDATASTB_I, /* nAutoFD */
+ FPGA_PIN_EPPNRESET_I, /* nInit */
+ FPGA_PIN_EPPNADDRSTB_I, /* SlctIn */
+ FPGA_PIN_EPPDATA3_I,
+ FPGA_PIN_EPPDATA4_I,
+ FPGA_PIN_EPPDATA5_I,
+ FPGA_PIN_EPPDATA6_I,
+ FPGA_PIN_EPPDATA7_I
+};
+
+static const unsigned int ppoutsig[] = {
+ FPGA_PIN_EPPNERR_O,
+ FPGA_PIN_SPPPE_O
+};
+
+static const unsigned int ppoutsigt[] = {
+ FPGA_PIN_EPPNERR_T,
+ FPGA_PIN_SPPPE_T
+};
+
+static const char *ppsigstr[] = {
+ "nError (15)", "PE (12)",
+ "nWrite/Strobe (1)", "nDataStb/nAutoFD (14)", "nReset/nInit (16)", "nAddrStb/nSlctIn (17)",
+ "D3 (5)", "D4 (6)", "D5 (7)", "D6 (8)", "D7 (9)"
+};
+
+static unsigned ppsigcheckone(unsigned val)
+{
+ unsigned char bd1[FPGA_BOUNDSIZE], bd2[FPGA_BOUNDSIZE];
+ unsigned v;
+
+ memcpy(bd1, fpga_safebound, FPGA_BOUNDSIZE);
+ writeboundaryword(bd1, ppoutsigt, 2, 0);
+ writeboundaryword(bd1, ppoutsig, 2, val);
+ parport_write_control(((val >> 2) & 0xf) ^ (LPTCTRL_WRITE|LPTCTRL_ADDRSTB|LPTCTRL_DATASTB));
+ boundary(FPGA_BOUND, bd1, bd2, val >> 3);
+ v = parport_read_status();
+ v = ((v >> 3) & 1) | ((v >> 4) & 2);
+ boundary(FPGA_BOUND, bd1, bd2, val >> 3);
+ parport_write_control(LPTCTRL_PROGRAM);
+ return v | ((readboundaryword(bd2, ppinsig, 9) << 2) & 0x7fc);
+}
+
+static int ppsigtest(struct adapter_config *cfg)
+{
+ unsigned val, v2, err[11];
+ int i, ret = 0;
+
+ if ((i = adapter_start_no_firmware()))
+ return i;
+ for (i = 0; i < 11; i++)
+ err[i] = 0;
+ tprintf("Checking parallel port signals...\n");
+ for (val = 0; val < 0x800; val++) {
+ /* make sure the FPGA is not reset */
+ if (!(val & ((LPTCTRL_ADDRSTB|LPTCTRL_PROGRAM)<<2)))
+ continue;
+ if (idle_callback(0)) {
+ reset_modem();
+ return 0;
+ }
+ v2 = ppsigcheckone(val);
+#if 0
+ tprintf("check: 0x%03x ret: 0x%03x diff: 0x%03x\n", val, v2, v2 ^ val);
+#endif
+ v2 ^= val;
+ if (val & 0x400)
+ v2 &= 0x7fc;
+ if (!v2)
+ continue;
+ ret = -1;
+ for (i = 0; i < 11; i++)
+ err[i] += ((v2 >> i) & 1);
+ }
+ tprintf("Parport Signal Errors:\n");
+ for (i = 0; i < 11; i++)
+ tprintf("%-22s %5d\n", ppsigstr[i], err[i]);
+ reset_modem();
+ return ret;
+}
+
+/* ========= EPP CHECK FIRMWARE TESTS =================================== */
+
+static int chkcountertest(struct adapter_config *cfg)
+{
+ struct timeval time1, time2;
+ unsigned int cnt0 = 0, cnt1 = 0, cnt2 = 0, cnt3 = 0,
+ prevcnt0 = 0, prevcnt1 = 0, prevcnt2 = 0, prevcnt3 = 0,
+ freq0 = 0, freq1 = 0, freq2 = 0, freq3 = 0, usec;
+ int i;
+ unsigned char eio[3];
+
+ if ((i = adapter_start_eppchk()))
+ return i;
+ /* reset counters */
+ eio[0] = 0;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ tprintf("Frequency counter\n"
+ "Counter value Frequency (Hz)\n"
+ "fclk__ clk___ RxC___ TxC___ fclk____ clk_____ RxC_____ TxC_____\n");
+ if (gettime(&time1)) {
+ reset_modem();
+ return -6;
+ }
+ for (;;) {
+ /* read counters */
+ eio[0] = 4;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ if (parport_epp_read_data(eio, 3) != 3)
+ goto errret;
+ cnt0 = eio[0] | (((unsigned int)eio[1]) << 8) | (((unsigned int)eio[2]) << 16);
+ eio[0] = 5;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ if (parport_epp_read_data(eio, 3) != 3)
+ goto errret;
+ cnt1 = eio[0] | (((unsigned int)eio[1]) << 8) | (((unsigned int)eio[2]) << 16);
+ eio[0] = 6;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ if (parport_epp_read_data(eio, 3) != 3)
+ goto errret;
+ cnt2 = eio[0] | (((unsigned int)eio[1]) << 8) | (((unsigned int)eio[2]) << 16);
+ eio[0] = 7;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ if (parport_epp_read_data(eio, 3) != 3)
+ goto errret;
+ cnt3 = eio[0] | (((unsigned int)eio[1]) << 8) | (((unsigned int)eio[2]) << 16);
+ if (gettime(&time2)) {
+ reset_modem();
+ return -6;
+ }
+ usec = ((time2.tv_sec - time1.tv_sec) % 60 * 1000000)
+ + time2.tv_usec - time1.tv_usec;
+ if (usec >= 1000000) {
+ time1 = time2;
+ freq0 = ((cnt0 - prevcnt0) & 0xffffff) * 1000000.0 / usec;
+ prevcnt0 = cnt0;
+ freq1 = ((cnt1 - prevcnt1) & 0xffffff) * 8000000.0 / usec;
+ prevcnt1 = cnt1;
+ freq2 = ((cnt2 - prevcnt2) & 0xffffff) * 1000000.0 / usec;
+ prevcnt2 = cnt2;
+ freq3 = ((cnt3 - prevcnt3) & 0xffffff) * 1000000.0 / usec;
+ prevcnt3 = cnt3;
+ }
+ tprintf("%06x %06x %06x %06x %8d %8d %8d %8d\r",
+ cnt0, cnt1, cnt2, cnt3, freq0, freq1, freq2, freq3);
+ if (idle_callback(200000)) {
+ reset_modem();
+ return 0;
+ }
+ }
+ return 0;
+
+errret:
+ lprintf(0, "EPP timeout\n");
+ return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * LED test
+ */
+
+static int chkledtest(struct adapter_config *cfg)
+{
+ unsigned led = 0;
+ int i;
+ unsigned char eio;
+
+ if ((i = adapter_start_eppchk()))
+ return i;
+ tprintf("LED test, DISCONNECT PTT!!\n");
+ eio = 1;
+ if (parport_epp_write_addr(&eio, 1) != 1)
+ goto errret;
+ for (;;) {
+ led = (++led) & 3;
+ eio = 1 << led;
+ if (parport_epp_write_data(&eio, 1) != 1)
+ goto errret;
+ tprintf("Lighting LED %s\r", ((const char *[4]){ "DCD", "CON", "STA", "PTT"})[led]);
+ if (idle_callback(500000)) {
+ reset_modem();
+ return 0;
+ }
+ }
+ return 0;
+
+errret:
+ lprintf(0, "EPP timeout\n");
+ return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * DAC test
+ */
+
+static int chkdactest(struct adapter_config *cfg)
+{
+ unsigned phase = 0, rot = 0;
+ unsigned char eio;
+ int i;
+
+ if ((i = adapter_start_eppchk()))
+ return i;
+ tprintf("DAC test\n");
+ eio = 2;
+ if (parport_epp_write_addr(&eio, 1) != 1)
+ goto errret;
+ for (;;) {
+ eio = 128 + 127 * sin(M_PI / 128 * phase);
+ if (parport_epp_write_data(&eio, 1) != 1)
+ goto errret;
+ phase = (phase + 1) & 0xff;
+ if (phase)
+ continue;
+ rot = (rot + 1) & 3;
+ tprintf("%c\r", "|\\-/"[rot]);
+ if (idle_callback(0)) {
+ reset_modem();
+ return 0;
+ }
+ }
+ return 0;
+
+errret:
+ lprintf(0, "EPP timeout\n");
+ return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * Register test
+ */
+
+static int chkregtest(struct adapter_config *cfg)
+{
+ unsigned data, read, cnt = 0, err = 0;
+ unsigned char eio[5];
+ int i;
+
+ if ((i = adapter_start_eppchk()))
+ return i;
+ tprintf("Checking LED register\n");
+ eio[0] = 1;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ for (data = 0; data < 0x100; data += 0x40) {
+ eio[0] = data;
+ if (parport_epp_write_data(eio, 1) != 1)
+ goto errret;
+ read = parport_read_status();
+ tprintf("LED register: 0x%02x LPT port status: 0x%02x %sOK\n", data, read,
+ (((data ^ (read << 4)) & 0x80) | ((data ^ (read << 1)) & 0x40)) ? "NOT " : "");
+ }
+ tprintf("EPP register read/write test\n");
+ for (;;) {
+ eio[0] = data;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ if (parport_epp_read_addr(eio, 5) != 5)
+ goto errret;
+ if ((data ^ eio[0]) & 0xff)
+ err++;
+ cnt++;
+ data++;
+ tprintf("Count: %6d Errors: %6d\r", cnt, err);
+ if (idle_callback(0)) {
+ reset_modem();
+ return 0;
+ }
+ }
+ return 0;
+
+errret:
+ lprintf(0, "EPP timeout\n");
+ return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * RAM-Test
+ */
+
+static int chkramaccess(unsigned addr, unsigned data, unsigned write)
+{
+ unsigned char rd;
+ unsigned char eio[3];
+
+ eio[0] = 8;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ return -1;
+ eio[0] = addr & 0xff;
+ if (parport_epp_write_data(eio, 1) != 1)
+ return -1;
+ eio[0] = 9;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ return -1;
+ eio[0] = addr >> 8;
+ if (parport_epp_write_data(eio, 1) != 1)
+ return -1;
+ if (write) {
+ eio[0] = 11;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ return -1;
+ eio[0] = data;
+ if (parport_epp_write_data(eio, 1) != 1)
+ return -1;
+ eio[0] = 8;
+ eio[1] = 10;
+ eio[2] = 8;
+ if (parport_epp_write_addr(eio, 3) != 3)
+ return -1;
+ return 0;
+ }
+ eio[0] = 11;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ return -1;
+ if (parport_epp_read_data(eio, 1) != 1)
+ return -1;
+ rd = eio[0];
+ eio[0] = 8;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ return -1;
+ return rd;
+}
+
+static int chkramtestdata(unsigned data)
+{
+ int val;
+ unsigned char s[10];
+
+ if (chkramaccess(0, data, 1))
+ return -1;
+ val = chkramaccess(0, 0, 0);
+ if (val == -1)
+ return -1;
+ tprintf("Testing data pattern 0x%02x read 0x%02x failure mask %8s\n",
+ data, val, to_bin(s, val ^ data, 8));
+ idle_callback(0);
+ return val ^ data;
+}
+
+static int chkramtestaddr(void)
+{
+ unsigned char ramd[32768];
+ unsigned int i, j, k, l, mask = 0;
+ unsigned char s[16];
+
+ for (i = 0; i < 32768; i++) {
+ if (!(i & 0xff)) {
+ tprintf("Writing RAM address 0x%04x...\r", i);
+ if (idle_callback(0))
+ return mask;
+ }
+ ramd[i] = random();
+ if (chkramaccess(i, ramd[i], 1))
+ return -1;
+ }
+ for (i = 0; i < 32768; i++) {
+ if (!(i & 0xff)) {
+ tprintf("Reading RAM address 0x%04x...\r", i);
+ if (idle_callback(0))
+ return mask;
+ }
+ j = chkramaccess(i, 0, 0);
+ if (j == -1)
+ return -1;
+ if (j == ramd[i])
+ continue;
+ l = 0xffff;
+ for (k = 0; k < 32768; k++) {
+ if (ramd[k] != j)
+ continue;
+ if (hweight32(l) > hweight32(k ^ i))
+ l = k ^ i;
+ }
+ mask |= k;
+ tprintf("RAM address error at 0x%04x minimum error mask %15s\n",
+ i, to_bin(s, k, 15));
+ if (idle_callback(0))
+ return mask;
+ }
+ return mask;
+}
+
+static int chkramtest(struct adapter_config *cfg)
+{
+ int mask, val;
+ unsigned char s[16];
+ int i;
+
+ if ((i = adapter_start_eppchk()))
+ return i;
+ tprintf("Performing RAM test...\n");
+ if ((mask = chkramtestdata(0xff)) == -1)
+ goto errret;
+ if ((val = chkramtestdata(0x00)) == -1)
+ goto errret;
+ mask |= val;
+ if ((val = chkramtestdata(0x55)) == -1)
+ goto errret;
+ mask |= val;
+ if ((val = chkramtestdata(0xaa)) == -1)
+ goto errret;
+ mask |= val;
+ if ((val = chkramtestdata(0xcc)) == -1)
+ goto errret;
+ mask |= val;
+ if ((val = chkramtestdata(0x33)) == -1)
+ goto errret;
+ mask |= val;
+ if (mask) {
+ tprintf("RAM data error mask %s\nRAM data test failed, exiting\n",
+ to_bin(s, mask, 8));
+ reset_modem();
+ return -4;
+ }
+ if ((mask = chkramtestaddr()) == -1)
+ goto errret;
+ if (mask) {
+ tprintf("RAM address error mask %s\nRAM address test failed, exiting\n",
+ to_bin(s, mask, 15));
+ reset_modem();
+ return -5;
+ }
+ if (!idle_callback(0))
+ tprintf("\nRAM test passed\n");
+ reset_modem();
+ return 0;
+
+errret:
+ lprintf(0, "EPP timeout\n");
+ return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * Sigma Delta A/D converter
+ */
+
+static int chkadctest(struct adapter_config *cfg)
+{
+ unsigned char eio;
+ int i;
+
+ if ((i = adapter_start_eppchk()))
+ return i;
+ tprintf("Performing SigmaDelta A/D converter test...\n");
+ tprintf("ADC signal is now routed to DAC...\n");
+ i = 19666660 / 9600;
+ eio = 0x1e;
+ if (parport_epp_write_addr(&eio, 1) != 1)
+ goto errret;
+ eio = i;
+ if (parport_epp_write_data(&eio, 1) != 1)
+ goto errret;
+ eio = 0x1f;
+ if (parport_epp_write_addr(&eio, 1) != 1)
+ goto errret;
+ eio = i >> 8;
+ if (parport_epp_write_data(&eio, 1) != 1)
+ goto errret;
+ eio = 0x10;
+ if (parport_epp_write_addr(&eio, 1) != 1)
+ goto errret;
+ for (;;) {
+ if (idle_callback(100000))
+ break;
+ }
+ reset_modem();
+ return 0;
+
+errret:
+ lprintf(0, "EPP timeout\n");
+ return -1;
+}
+
+/* ========= EPP FIRMWARE TESTS ========================================= */
+
+/*
+ * EPP LED test
+ */
+
+static int eppledtest(struct adapter_config *cfg)
+{
+ unsigned led = 0;
+ unsigned char eio;
+ int i;
+
+ if ((i = adapter_start_epp(cfg)))
+ return i;
+ tprintf("EPP port LED test\n");
+ for (;;) {
+ led = !led;
+ eio = led ? EPP_LED_STA : EPP_LED_CON;
+ if (parport_epp_write_addr(&eio, 1) != 1)
+ goto errret;
+ tprintf("Lighting LED %s\r", ((const char *[2]){ "CON", "STA" })[led]);
+ if (idle_callback(500000)) {
+ reset_modem();
+ return 0;
+ }
+ }
+ return 0;
+
+errret:
+ lprintf(0, "EPP timeout\n");
+ return -1;
+}
+
+static int eppledtest2(struct adapter_config *cfg)
+{
+ unsigned led = 0;
+ unsigned char eio;
+ int i;
+
+ if ((i = adapter_start_epp(cfg)))
+ return i;
+ tprintf("EPP port LED test (fast)\n");
+ for (;;) {
+ led = !led;
+ eio = led ? EPP_LED_STA : EPP_LED_CON;
+ if (parport_epp_write_addr(&eio, 1) != 1)
+ goto errret;
+ if (idle_callback(0)) {
+ reset_modem();
+ return 0;
+ }
+ }
+ return 0;
+
+errret:
+ lprintf(0, "EPP timeout\n");
+ return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * EPP modem test
+ */
+
+static int eppmodemtest(struct adapter_config *cfg, unsigned int flags)
+{
+ unsigned int enc_state = 0x100;
+ unsigned int dec_state = 0;
+ unsigned int mask1, mask2;
+ unsigned char stat;
+ int cnt, cntx, i, j, icnt, ocnt, icntx, ocntx;
+ unsigned int berr = 0;
+#if 0
+ unsigned int pcnt = 0;
+#endif
+ unsigned char eio[2048];
+
+ if ((i = adapter_start_epp(cfg)))
+ return i;
+ /* reset modem */
+ eio[0] = 0;
+ eio[1] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+ if (parport_epp_write_addr(eio, 2) != 2)
+ goto errret;
+ for (;;) {
+ if (parport_epp_read_addr(&stat, 1) != 1)
+ goto errret;
+ /* determine TX fifo size from status bits */
+ switch (stat & (EPP_NTAEF|EPP_NTHF)) {
+ case EPP_NTHF:
+ ocntx = 2048 - 256;
+ break;
+
+ case EPP_NTAEF:
+ ocntx = 2048 - 1793;
+ break;
+
+ case 0:
+ ocntx = 0;
+ break;
+
+ default:
+ ocntx = 2048 - 1025;
+ break;
+ }
+ /* determine RX fifo size from status bits */
+ switch (stat & (EPP_NRAEF|EPP_NRHF)) {
+ case EPP_NRHF:
+ icntx = 0;
+ break;
+
+ case EPP_NRAEF:
+ icntx = 1025;
+ break;
+
+ case 0:
+ icntx = 1793;
+ break;
+
+ default:
+ icntx = 256;
+ break;
+ }
+ ocnt = ocntx;
+ icnt = icntx;
+ /* try to determine the FIFO count if in extended mode */
+ if (cfg->extstat) {
+ eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE|1;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+getpid();
+ if (parport_epp_read_addr(eio, 2) != 2)
+ goto errret;
+getpid();
+ icnt = eio[0] | (((unsigned int)eio[1]) << 8);
+ eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE|2;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+getpid();
+ if (parport_epp_read_addr(eio, 2) != 2)
+ goto errret;
+getpid();
+ ocnt = eio[0] | (((unsigned int)eio[1]) << 8);
+ eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ ocnt = 16384 - (ocnt & 0x7fff);
+ icnt &= 0x7fff;
+#if 0
+ {
+ unsigned ocnt2, icnt2;
+ eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE|1;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ if (parport_epp_read_addr(eio, 2) != 2)
+ goto errret;
+ icnt2 = eio[0] | (((unsigned int)eio[1]) << 8);
+ eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE|2;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ if (parport_epp_read_addr(eio, 2) != 2)
+ goto errret;
+ ocnt2 = eio[0] | (((unsigned int)eio[1]) << 8);
+ eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ ocnt2 = 16384 - (ocnt2 & 0x7fff);
+ icnt2 &= 0x7fff;
+
+ if (icnt != icnt2 || ocnt != ocnt2) {
+ printf("\nCOUNT ERROR!! icnt 0x%x icnt2 0x%x ocnt 0x%x ocnt2 0x%x\n",
+ icnt, icnt2, ocnt, ocnt2);
+ }
+ }
+#endif
+
+ }
+ /* try to tx */
+ for (cntx = ocnt; cntx > 0; cntx -= cnt) {
+ cnt = cntx;
+ if (cnt > sizeof(eio))
+ cnt = sizeof(eio);
+ if (flags & 2) {
+ for (j = 0; j < cnt; j++) {
+ enc_state >>= 8;
+ for (i = 0, mask1 = SCRAM_TAP1, mask2 = SCRAM_TAPN;
+ i < 8; i++, mask1 <<= 1, mask2 <<= 1)
+ if (enc_state & mask1)
+ enc_state ^= mask2;
+ eio[j] = enc_state;
+ }
+ } else
+ memset(eio, 0, cnt);
+ if (parport_epp_write_data(eio, cnt) != cnt)
+ goto errret;
+ }
+ if (icnt <= 0) {
+ if (idle_callback(10000)) {
+ reset_modem();
+ return 0;
+ }
+ } else {
+ for (cntx = icnt; cntx > 0; cntx -= cnt) {
+ cnt = cntx;
+ if (cnt > sizeof(eio))
+ cnt = sizeof(eio);
+ if (parport_epp_read_data(eio, cnt) != cnt)
+ goto errret;
+ if (flags & 2) {
+ for (j = 0; j < cnt; j++) {
+ dec_state = (dec_state >> 8) | (((unsigned int)eio[j]) << DESCRAM_TAPSH3);
+ eio[j] = ((dec_state >> DESCRAM_TAPSH1) ^
+ (dec_state >> DESCRAM_TAPSH2) ^
+ (dec_state >> DESCRAM_TAPSH3)) & 0xff;
+ }
+ }
+ for (j = 0; j < cnt; j++) {
+ if (eio[j])
+ berr += hweight8(eio[j]);
+ if (flags & 1)
+ for (i = 0; i < 8; i++)
+ fputc('0' + ((eio[j] >> i) & 1), stdout);
+ }
+ }
+ if (flags & 1)
+ fputc('\n', stdout);
+ }
+#if 0
+ pcnt = (++pcnt) & 0x3f;
+ if (pcnt)
+ continue;
+#endif
+ /* DCD has inverse logic */
+ tprintf("BERR: %8d DCD:%c stat: %02x icnt %5d icntx %5d ocnt %5d ocntx %5d\r",
+ berr, (stat & EPP_DCDBIT) ? '-' : 'D', stat, icnt, icntx, ocnt, ocntx);
+ if (idle_callback(0)) {
+ reset_modem();
+ return 0;
+ }
+ }
+ return 0;
+
+errret:
+ lprintf(0, "EPP timeout\n");
+ return -1;
+}
+
+static int eppmodemtest1(struct adapter_config *cfg)
+{
+ return eppmodemtest(cfg, 0);
+}
+
+static int eppmodemtest2(struct adapter_config *cfg)
+{
+ return eppmodemtest(cfg, 1);
+}
+
+static int eppmodemtest3(struct adapter_config *cfg)
+{
+ return eppmodemtest(cfg, 2);
+}
+
+static int eppmodemtest4(struct adapter_config *cfg)
+{
+ return eppmodemtest(cfg, 3);
+}
+
+/* ========= ECP FIRMWARE TESTS ========================================= */
+
+/*
+ * ECP LED test
+ */
+
+static int ecpledtest(struct adapter_config *cfg)
+{
+ unsigned led = 0;
+ unsigned char eio;
+ int i;
+
+ if ((i = adapter_start_ecp(cfg)))
+ return i;
+ tprintf("ECP port LED test\n");
+ for (;;) {
+ led = !led;
+ eio = 0xb0 | (led + 1);
+ if (parport_ecp_write_addr(&eio, 1) != 1)
+ goto errret;
+ tprintf("Lighting LED %s\r", ((const char *[2]){ "CON", "STA" })[led]);
+ if (idle_callback(500000)) {
+ reset_modem();
+ return 0;
+ }
+ }
+ return 0;
+
+errret:
+ lprintf(0, "ECP timeout\n");
+ return -1;
+}
+
+static int ecpledtest2(struct adapter_config *cfg)
+{
+ unsigned led = 0;
+ unsigned char eio;
+ int i;
+
+ if ((i = adapter_start_ecp(cfg)))
+ return i;
+ tprintf("ECP port LED test (fast)\n");
+ for (;;) {
+ led = !led;
+ eio = 0xb0 | (led + 1);
+ if (parport_ecp_write_addr(&eio, 1) != 1)
+ goto errret;
+ if (idle_callback(0)) {
+ reset_modem();
+ return 0;
+ }
+ }
+ return 0;
+
+errret:
+ lprintf(0, "ECP timeout\n");
+ return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * ECP modem test
+ */
+
+static int ecpmodemtest(struct adapter_config *cfg, unsigned int flags)
+{
+ unsigned int enc_state = 0x100;
+ unsigned int dec_state = 0;
+ unsigned int mask1, mask2;
+ unsigned char stat[6];
+ unsigned char data[4096];
+ int cnt, cntx, i, j, icnt, ocnt;
+ unsigned int berr = 0;
+#if 0
+ unsigned int pcnt = 0;
+#endif
+
+ if ((i = adapter_start_ecp(cfg)))
+ return i;
+ data[0] = 0xaf; /* reset register: all reset */
+ data[1] = 0xa0; /* reset register: terminate reset */
+ data[2] = 0xb0;
+ if (parport_ecp_write_addr(data, 3) != 3)
+ goto errret;
+ for (;;) {
+ data[0] = 0x81;
+ if (parport_ecp_write_addr(data, 1) != 1)
+ goto errret;
+ if (parport_ecp_read_data(stat, 6) != 6)
+ goto errret;
+ data[0] = 0x80;
+ if (parport_ecp_write_addr(data, 1) != 1)
+ goto errret;
+ icnt = ((unsigned int)stat[2] << 8) | stat[1];
+ ocnt = ((unsigned int)stat[4] << 8) | stat[3];
+ /* read */
+ if (icnt > 0) {
+ for (cntx = icnt; cntx > 0; cntx -= cnt) {
+ cnt = cntx;
+ if (cnt > sizeof(data))
+ cnt = sizeof(data);
+ if (cnt > 0xfff)
+ cnt = 0xfff;
+ data[0] = 0xc0 | (cnt & 0xf);
+ data[1] = 0xd0 | ((cnt >> 4) & 0xf);
+ data[2] = 0xe0 | ((cnt >> 8) & 0xf);
+ if (parport_ecp_write_addr(data, 3) != 3)
+ goto errret;
+ if (parport_ecp_read_data(data, cnt) != cnt)
+ goto errret;
+ /* if doubly scrambled do it in place */
+ if (flags & 2) {
+ for (i = 0; i < cnt; i++) {
+ dec_state = (dec_state >> 8) | (((unsigned)data[i]) << DESCRAM_TAPSH3);
+ data[i] = (dec_state >> DESCRAM_TAPSH1) ^
+ (dec_state >> DESCRAM_TAPSH2) ^
+ (dec_state >> DESCRAM_TAPSH3);
+ }
+ }
+ for (i = 0; i < cnt; i++) {
+ if (data[i])
+ berr += hweight8(data[i]);
+ if (flags & 1)
+ for (i = 0; i < 8; i++)
+ fputc('0' + ((data[i] >> i) & 1), stdout);
+ }
+ }
+ if (flags & 1)
+ fputc('\n', stdout);
+ } else {
+ if (idle_callback(10000)) {
+ reset_modem();
+ return 0;
+ }
+ }
+ /* write */
+ for (cntx = 16384 - ocnt; cntx > 0; cntx -= cnt) {
+ cnt = cntx;
+ if (cnt > sizeof(data))
+ cnt = sizeof(data);
+ if (flags & 2) {
+ for (i = 0; i < cnt; i++) {
+ enc_state >>= 8;
+ for (j = 0, mask1 = SCRAM_TAP1, mask2 = SCRAM_TAPN;
+ j < 8; j++, mask1 <<= 1, mask2 <<= 1)
+ if (enc_state & mask1)
+ enc_state ^= mask2;
+ data[i] = enc_state;
+ }
+ } else
+ memset(data, 0, cnt);
+ if (parport_ecp_write_data(data, cnt) != cnt)
+ goto errret;
+ }
+#if 0
+ pcnt = (++pcnt) & 0x3f;
+ if (pcnt)
+ continue;
+#endif
+ /* DCD has inverse logic */
+ tprintf("BERR: %8d DCD:%c stat: %02x icnt %5d ocnt %5d\r",
+ berr, (stat[0] & EPP_DCDBIT) ? '-' : 'D', stat[0], icnt, ocnt);
+ if (idle_callback(0)) {
+ reset_modem();
+ return 0;
+ }
+ }
+ return 0;
+
+errret:
+ lprintf(0, "ECP timeout\n");
+ return -1;
+}
+
+static int ecpmodemtest1(struct adapter_config *cfg)
+{
+ return ecpmodemtest(cfg, 0);
+}
+
+static int ecpmodemtest2(struct adapter_config *cfg)
+{
+ return ecpmodemtest(cfg, 1);
+}
+
+static int ecpmodemtest3(struct adapter_config *cfg)
+{
+ return ecpmodemtest(cfg, 2);
+}
+
+static int ecpmodemtest4(struct adapter_config *cfg)
+{
+ return ecpmodemtest(cfg, 3);
+}
+
+/* ========= EPPAFSK FIRMWARE TESTS ===================================== */
+
+/*
+ * EPP AFSK LED test
+ */
+
+static int eppafskledtest(struct adapter_config *cfg)
+{
+ unsigned led = 0;
+ unsigned char eio;
+ int i;
+
+ cfg->bitrate = 1200;
+ if ((i = adapter_start_eppafsk(cfg)))
+ return i;
+ tprintf("EPPAFSK port LED test\n");
+ for (;;) {
+ led = !led;
+ eio = led ? EPP_LED_STA : EPP_LED_CON;
+ if (parport_epp_write_addr(&eio, 1) != 1)
+ goto errret;
+ tprintf("Lighting LED %s\r", ((const char *[2]){ "CON", "STA" })[led]);
+ if (idle_callback(500000)) {
+ reset_modem();
+ return 0;
+ }
+ }
+ return 0;
+
+errret:
+ lprintf(0, "EPP timeout\n");
+ return -1;
+}
+
+static int eppafskledtest2(struct adapter_config *cfg)
+{
+ unsigned led = 0;
+ unsigned char eio;
+ int i;
+
+ cfg->bitrate = 1200;
+ if ((i = adapter_start_eppafsk(cfg)))
+ return i;
+ tprintf("EPPAFSK port LED test (fast)\n");
+ for (;;) {
+ led = !led;
+ eio = led ? EPP_LED_STA : EPP_LED_CON;
+ if (parport_epp_write_addr(&eio, 1) != 1)
+ goto errret;
+ if (idle_callback(0)) {
+ reset_modem();
+ return 0;
+ }
+ }
+ return 0;
+
+errret:
+ lprintf(0, "EPP timeout\n");
+ return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * EPP AFSK modem test
+ */
+
+static int eppafskmodemtest(struct adapter_config *cfg, unsigned int flags)
+{
+ unsigned int enc_state = 0x100;
+ unsigned int dec_state = 0;
+ unsigned int mask1, mask2;
+ unsigned char stat, txbyte;
+ int i, j, icnt, ocnt;
+ unsigned int berr = 0;
+#if 0
+ unsigned int pcnt = 0;
+#endif
+ unsigned char eio[32];
+
+ cfg->bitrate = 1200;
+ if ((i = adapter_start_eppafsk(cfg)))
+ return i;
+ txbyte = -((flags >> 1) & 1);
+ /* reset modem */
+ eio[0] = 0x00;
+ eio[1] = 0x18;
+ if (parport_epp_write_addr(eio, 2) != 2)
+ goto errret;
+ for (;;) {
+ if (parport_epp_read_addr(&stat, 1) != 1)
+ goto errret;
+ /* determine the FIFO count */
+ eio[0] = 0x19;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ if (parport_epp_read_addr(eio, 1) != 1)
+ goto errret;
+ ocnt = 0x10 - (eio[0] & 0x1f);
+ eio[0] = 0x1a;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ if (parport_epp_read_addr(eio, 1) != 1)
+ goto errret;
+ icnt = eio[0] & 0x1f;
+ eio[0] = 0x18;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ /* try to tx */
+ if (ocnt > 0) {
+ if (flags & 2) {
+ for (j = 0; j < ocnt; j++) {
+ enc_state >>= 8;
+ for (i = 0, mask1 = SCRAM_TAP1, mask2 = SCRAM_TAPN;
+ i < 8; i++, mask1 <<= 1, mask2 <<= 1)
+ if (enc_state & mask1)
+ enc_state ^= mask2;
+ eio[j] = enc_state;
+ }
+ } else
+ memset(eio, 0, ocnt);
+ if (parport_epp_write_data(eio, ocnt) != ocnt)
+ goto errret;
+ }
+ if (icnt <= 0) {
+ if (idle_callback(1000)) {
+ reset_modem();
+ return 0;
+ }
+ }
+ else {
+ if (parport_epp_read_data(eio, icnt) != icnt)
+ goto errret;
+ if (flags & 2) {
+ for (j = 0; j < icnt; j++) {
+ dec_state = (dec_state >> 8) | (((unsigned int)eio[j]) << DESCRAM_TAPSH3);
+ eio[j] = ((dec_state >> DESCRAM_TAPSH1) ^
+ (dec_state >> DESCRAM_TAPSH2) ^
+ (dec_state >> DESCRAM_TAPSH3)) & 0xff;
+ }
+ }
+ for (j = 0; j < icnt; j++) {
+ if (eio[j])
+ berr += hweight8(eio[j]);
+ if (flags & 1)
+ for (i = 0; i < 8; i++)
+ fputc('0' + ((eio[j] >> i) & 1), stdout);
+ }
+ if (flags & 1)
+ fputc('\n', stdout);
+ }
+#if 0
+ pcnt = (++pcnt) & 0x3f;
+ if (pcnt)
+ continue;
+#endif
+ /* DCD has inverse logic */
+ tprintf("BERR: %8d DCD:%c PTT:%c stat: %02x icnt %5d ocnt %5d\r",
+ berr, (stat & 0x80) ? '-' : 'D', (stat & 0x40) ? '-' : 'P', stat, icnt, ocnt);
+ if (idle_callback(0)) {
+ reset_modem();
+ return 0;
+ }
+ }
+ return 0;
+
+errret:
+ lprintf(0, "EPP timeout\n");
+ return -1;
+}
+
+static int eppafskmodemtest1(struct adapter_config *cfg)
+{
+ return eppafskmodemtest(cfg, 0);
+}
+
+static int eppafskmodemtest2(struct adapter_config *cfg)
+{
+ return eppafskmodemtest(cfg, 1);
+}
+
+static int eppafskmodemtest3(struct adapter_config *cfg)
+{
+ return eppafskmodemtest(cfg, 2);
+}
+
+static int eppafskmodemtest4(struct adapter_config *cfg)
+{
+ return eppafskmodemtest(cfg, 3);
+}
+
+static int eppafskmodemtest5(struct adapter_config *cfg)
+{
+ return eppafskmodemtest(cfg, 4);
+}
+
+static int eppafskmodemtest6(struct adapter_config *cfg)
+{
+ return eppafskmodemtest(cfg, 6);
+}
+
+/* ========= SPPAFSK FIRMWARE TESTS ===================================== */
+
+/*
+ * SPP AFSK LED test
+ */
+
+static int sppafskledtest(struct adapter_config *cfg)
+{
+ unsigned led = 0;
+ int i;
+
+ cfg->bitrate = 1200;
+ if ((i = adapter_start_sppafsk(cfg)))
+ return i;
+ tprintf("SPPAFSK port LED test\n");
+ for (;;) {
+ led = !led;
+ sppafsk_wrcmd(led ? EPP_LED_STA : EPP_LED_CON);
+ tprintf("Lighting LED %s\r", ((const char *[2]){ "CON", "STA" })[led]);
+ if (idle_callback(500000)) {
+ reset_modem();
+ return 0;
+ }
+ }
+ return 0;
+}
+
+static int sppafskledtest2(struct adapter_config *cfg)
+{
+ unsigned led = 0;
+ int i;
+
+ cfg->bitrate = 1200;
+ if ((i = adapter_start_eppafsk(cfg)))
+ return i;
+ tprintf("SPPAFSK port LED test (fast)\n");
+ for (;;) {
+ led = !led;
+ sppafsk_wrcmd(led ? EPP_LED_STA : EPP_LED_CON);
+ if (idle_callback(0)) {
+ reset_modem();
+ return 0;
+ }
+ }
+ return 0;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * SPP AFSK modem test
+ */
+
+static int sppafskmodemtest(struct adapter_config *cfg, unsigned int flags)
+{
+ unsigned int enc_state = 0x100;
+ unsigned int dec_state = 0;
+ unsigned int mask1, mask2;
+ unsigned char stat, txbyte;
+ int i, j, icnt, ocnt;
+ unsigned int berr = 0;
+#if 0
+ unsigned int pcnt = 0;
+#endif
+ unsigned char currx;
+
+ cfg->bitrate = 1200;
+ if ((i = adapter_start_sppafsk(cfg)))
+ return i;
+ txbyte = -((flags >> 1) & 1);
+ /* reset modem */
+ sppafsk_wrcmd(0x00);
+ sppafsk_wrcmd(0x18);
+ for (;;) {
+ stat = sppafsk_rdcmd();
+ /* determine the FIFO count */
+ sppafsk_wrcmd(0x19);
+ ocnt = sppafsk_rdcmd();
+ sppafsk_wrcmd(0x1a);
+ icnt = sppafsk_rdcmd();
+ sppafsk_wrcmd(0x18);
+ if (icnt > 0x10 || ocnt > 0x10)
+ goto errret;
+ ocnt = 0x10 - ocnt;
+ /* try to tx */
+ if (ocnt > 0) {
+ if (flags & 2) {
+ for (j = 0; j < ocnt; j++) {
+ enc_state >>= 8;
+ for (i = 0, mask1 = SCRAM_TAP1, mask2 = SCRAM_TAPN;
+ i < 8; i++, mask1 <<= 1, mask2 <<= 1)
+ if (enc_state & mask1)
+ enc_state ^= mask2;
+ sppafsk_wrdata(enc_state);
+ }
+ } else {
+ for (j = 0; j < ocnt; j++)
+ sppafsk_wrdata(0);
+ }
+ }
+ if (icnt <= 0) {
+ if (idle_callback(1000)) {
+ reset_modem();
+ return 0;
+ }
+ }
+ else {
+ for (j = 0; j < icnt; j++) {
+ currx = sppafsk_rddata();
+ if (flags & 2) {
+ dec_state = (dec_state >> 8) | (((unsigned int)currx) << DESCRAM_TAPSH3);
+ currx = ((dec_state >> DESCRAM_TAPSH1) ^
+ (dec_state >> DESCRAM_TAPSH2) ^
+ (dec_state >> DESCRAM_TAPSH3)) & 0xff;
+ }
+ if (currx)
+ berr += hweight8(currx);
+ if (flags & 1)
+ for (i = 0; i < 8; i++)
+ fputc('0' + ((currx >> i) & 1), stdout);
+ }
+ if (flags & 1)
+ fputc('\n', stdout);
+ }
+#if 0
+ pcnt = (++pcnt) & 0x3f;
+ if (pcnt)
+ continue;
+#endif
+ /* DCD has inverse logic */
+ tprintf("BERR: %8d DCD:%c PTT:%c stat: %02x icnt %5d ocnt %5d\r",
+ berr, (stat & 0x80) ? '-' : 'D', (stat & 0x40) ? '-' : 'P', stat, icnt, ocnt);
+ if (idle_callback(0)) {
+ reset_modem();
+ return 0;
+ }
+ }
+ return 0;
+
+errret:
+ lprintf(0, "SPP bogus values read\n");
+ return -1;
+}
+
+static int sppafskmodemtest1(struct adapter_config *cfg)
+{
+ return sppafskmodemtest(cfg, 0);
+}
+
+static int sppafskmodemtest2(struct adapter_config *cfg)
+{
+ return sppafskmodemtest(cfg, 1);
+}
+
+static int sppafskmodemtest3(struct adapter_config *cfg)
+{
+ return sppafskmodemtest(cfg, 2);
+}
+
+static int sppafskmodemtest4(struct adapter_config *cfg)
+{
+ return sppafskmodemtest(cfg, 3);
+}
+
+static int sppafskmodemtest5(struct adapter_config *cfg)
+{
+ return sppafskmodemtest(cfg, 4);
+}
+
+static int sppafskmodemtest6(struct adapter_config *cfg)
+{
+ return sppafskmodemtest(cfg, 6);
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * HDLC receive tests
+ */
+
+static void tprintpkt(const unsigned char *pkt, unsigned len)
+{
+ unsigned char v1=1,cmd=0;
+ unsigned char i,j;
+
+ if (!pkt || len < 8)
+ return;
+ if (pkt[1] & 1) {
+ /*
+ * FlexNet Header Compression
+ */
+ v1 = 0;
+ cmd = (pkt[1] & 2) != 0;
+ tprintf("fm ? to ");
+ i = (pkt[2] >> 2) & 0x3f;
+ if (i)
+ tprintf("%c",i+0x20);
+ i = ((pkt[2] << 4) | ((pkt[3] >> 4) & 0xf)) & 0x3f;
+ if (i)
+ tprintf("%c", i+0x20);
+ i = ((pkt[3] << 2) | ((pkt[4] >> 6) & 3)) & 0x3f;
+ if (i)
+ tprintf("%c", i+0x20);
+ i = pkt[4] & 0x3f;
+ if (i)
+ tprintf("%c", i+0x20);
+ i = (pkt[5] >> 2) & 0x3f;
+ if (i)
+ tprintf("%c", i+0x20);
+ i = ((pkt[5] << 4) | ((pkt[6] >> 4) & 0xf)) & 0x3f;
+ if (i)
+ tprintf("%c", i+0x20);
+ tprintf("-%u QSO Nr %u", pkt[6] & 0xf, (pkt[0] << 6) | (pkt[1] >> 2));
+ pkt += 7;
+ len -= 7;
+ } else {
+ /*
+ * normal header
+ */
+ if (len < 15)
+ return;
+ if ((pkt[6] & 0x80) != (pkt[13] & 0x80)) {
+ v1 = 0;
+ cmd = (pkt[6] & 0x80);
+ }
+ tprintf("fm ");
+ for(i = 7; i < 13; i++)
+ if ((pkt[i] &0xfe) != 0x40)
+ tprintf("%c", pkt[i] >> 1);
+ tprintf("-%u to ", (pkt[13] >> 1) & 0xf);
+ for(i = 0; i < 6; i++)
+ if ((pkt[i] &0xfe) != 0x40)
+ tprintf("%c", pkt[i] >> 1);
+ tprintf("-%u", (pkt[6] >> 1) & 0xf);
+ pkt += 14;
+ len -= 14;
+ if ((!(pkt[-1] & 1)) && (len >= 7))
+ tprintf(" via ");
+ while ((!(pkt[-1] & 1)) && (len >= 7)) {
+ for(i = 0; i < 6; i++)
+ if ((pkt[i] &0xfe) != 0x40)
+ tprintf("%c", pkt[i] >> 1);
+ tprintf("-%u", (pkt[6] >> 1) & 0xf);
+ pkt += 7;
+ len -= 7;
+ if ((!(pkt[-1] & 1)) && (len >= 7))
+ tprintf(",");
+ }
+ }
+ if(!len)
+ return;
+ i = *pkt++;
+ len--;
+ j = v1 ? ((i & 0x10) ? '!' : ' ') :
+ ((i & 0x10) ? (cmd ? '+' : '-') : (cmd ? '^' : 'v'));
+ if (!(i & 1)) {
+ /*
+ * Info frame
+ */
+ tprintf(" I%u%u%c", (i >> 5) & 7, (i >> 1) & 7, j);
+ } else if (i & 2) {
+ /*
+ * U frame
+ */
+ switch (i & (~0x10)) {
+ case 0x03:
+ tprintf(" UI%c", j);
+ break;
+ case 0x2f:
+ tprintf(" SABM%c", j);
+ break;
+ case 0x43:
+ tprintf(" DISC%c", j);
+ break;
+ case 0x0f:
+ tprintf(" DM%c", j);
+ break;
+ case 0x63:
+ tprintf(" UA%c", j);
+ break;
+ case 0x87:
+ tprintf(" FRMR%c", j);
+ break;
+ default:
+ tprintf(" unknown U (0x%x)%c", i & (~0x10), j);
+ break;
+ }
+ } else {
+ /*
+ * supervisory
+ */
+ switch (i & 0xf) {
+ case 0x1:
+ tprintf(" RR%u%c", (i >> 5) & 7, j);
+ break;
+ case 0x5:
+ tprintf(" RNR%u%c", (i >> 5) & 7, j);
+ break;
+ case 0x9:
+ tprintf(" REJ%u%c", (i >> 5) & 7, j);
+ break;
+ default:
+ tprintf(" unknown S (0x%x)%u%c", i & 0xf, (i >> 5) & 7, j);
+ break;
+ }
+ }
+ if (!len) {
+ tprintf("\n");
+ return;
+ }
+ tprintf(" pid=%02X\n", *pkt++);
+ len--;
+ j = 0;
+ while (len) {
+ i = *pkt++;
+ if ((i >= 32) && (i < 128))
+ tprintf("%c", i);
+ else if (i == 13) {
+ if (j)
+ tprintf("\n");
+ j = 0;
+ } else
+ tprintf(".");
+ if (i >= 32)
+ j = 1;
+ len--;
+ }
+ if (j)
+ tprintf("\n");
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * the CRC routines are stolen from WAMPES
+ * by Dieter Deyke
+ */
+
+static const u_int16_t crc_ccitt_table[0x100] = {
+ 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
+ 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
+ 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
+ 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
+ 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
+ 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
+ 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
+ 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
+ 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
+ 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
+ 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
+ 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
+ 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
+ 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
+ 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
+ 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
+ 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
+ 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
+ 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
+ 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
+ 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
+ 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
+ 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
+ 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
+ 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
+ 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
+ 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
+ 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
+ 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
+ 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
+ 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
+ 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
+};
+
+/* --------------------------------------------------------------------- */
+
+extern inline u_int16_t calc_crc_ccitt(const u_int8_t *buffer, int len)
+{
+ u_int16_t crc = 0xffff;
+
+ for (;len>0;len--)
+ crc = (crc >> 8) ^ crc_ccitt_table[(crc ^ *buffer++) & 0xff];
+ crc ^= 0xffff;
+ return crc;
+}
+
+extern inline void append_crc_ccitt(u_int8_t *buffer, int len)
+{
+ u_int16_t crc = calc_crc_ccitt(buffer, len);
+ *buffer++ = crc;
+ *buffer++ = crc >> 8;
+}
+
+extern inline int check_crc_ccitt(const u_int8_t *buffer, int len)
+{
+ u_int16_t crc = calc_crc_ccitt(buffer, len);
+ return (crc & 0xffff) == 0x0f47;
+}
+
+/* ---------------------------------------------------------------------- */
+
+#define MAXFLEN 512
+#define RXBUFFER_SIZE ((MAXFLEN*6/5)+8)
+
+struct hdlc_receiver {
+ unsigned int bitbuf, bitstream, numbits, state;
+ unsigned char *bufptr;
+ int bufcnt;
+ unsigned char buf[RXBUFFER_SIZE];
+};
+
+extern inline void hdlc_initrx(struct hdlc_receiver *h)
+{
+ memset(h, 0, sizeof(struct hdlc_receiver));
+ h->bufptr = h->buf;
+}
+
+static void do_rxpacket(struct hdlc_receiver *h)
+{
+ if (h->bufcnt < 4)
+ return;
+ if (!check_crc_ccitt(h->buf, h->bufcnt))
+ return;
+ tprintf(" \r");
+ tprintpkt(h->buf, h->bufcnt-2);
+}
+
+#define DECODEITERA(j) \
+({ \
+ if (!(notbitstream & (0x0fc << j))) /* flag or abort */ \
+ goto flgabrt##j; \
+ if ((bitstream & (0x1f8 << j)) == (0xf8 << j)) /* stuffed bit */ \
+ goto stuff##j; \
+ enditer##j: \
+})
+
+#define DECODEITERB(j) \
+({ \
+ flgabrt##j: \
+ if (!(notbitstream & (0x1fc << j))) { /* abort received */ \
+ state = 0; \
+ goto enditer##j; \
+ } \
+ if ((bitstream & (0x1fe << j)) != (0x0fc << j)) /* flag received */ \
+ goto enditer##j; \
+ if (state) \
+ do_rxpacket(h); \
+ h->bufcnt = 0; \
+ h->bufptr = h->buf; \
+ state = 1; \
+ numbits = 7-j; \
+ goto enditer##j; \
+ stuff##j: \
+ numbits--; \
+ bitbuf = (bitbuf & ((~0xff) << j)) | ((bitbuf & ~((~0xff) << j)) << 1); \
+ goto enditer##j; \
+})
+
+/* ---------------------------------------------------------------------- */
+
+static void hdlc_receive(struct hdlc_receiver *h, u_int8_t *bits, int cnt)
+{
+ unsigned int bitbuf, notbitstream, bitstream, numbits, state;
+ u_int8_t ch;
+
+ numbits = h->numbits;
+ state = h->state;
+ bitstream = h->bitstream;
+ bitbuf = h->bitbuf;
+ for (; cnt > 0; cnt--) {
+ ch = *bits++;
+ bitstream >>= 8;
+ bitstream |= ch << 8;
+ bitbuf >>= 8;
+ bitbuf |= ch << 8;
+ numbits += 8;
+ notbitstream = ~bitstream;
+ DECODEITERA(0);
+ DECODEITERA(1);
+ DECODEITERA(2);
+ DECODEITERA(3);
+ DECODEITERA(4);
+ DECODEITERA(5);
+ DECODEITERA(6);
+ DECODEITERA(7);
+ goto enddec;
+ DECODEITERB(0);
+ DECODEITERB(1);
+ DECODEITERB(2);
+ DECODEITERB(3);
+ DECODEITERB(4);
+ DECODEITERB(5);
+ DECODEITERB(6);
+ DECODEITERB(7);
+ enddec:
+ while (state && numbits >= 8) {
+ if (h->bufcnt >= RXBUFFER_SIZE) {
+ state = 0;
+ } else {
+ *(h->bufptr)++ = bitbuf >> (16-numbits);
+ h->bufcnt++;
+ numbits -= 8;
+ }
+ }
+ }
+ h->numbits = numbits;
+ h->state = state;
+ h->bitstream = bitstream;
+ h->bitbuf = bitbuf;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static int epprx(struct adapter_config *cfg)
+{
+ u_int8_t stat;
+ int cnt, cntx, i, icnt, ocnt, icntx, ocntx;
+#if 0
+ unsigned int pcnt = 0;
+#endif
+ struct hdlc_receiver hdlcrx;
+ unsigned char eio[1024];
+
+ hdlc_initrx(&hdlcrx);
+ if ((i = adapter_start_epp(cfg)))
+ return i;
+ /* reset modem */
+ eio[0] = 0;
+ eio[1] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+ if (parport_epp_write_addr(eio, 2) != 2)
+ goto errret;
+ for (;;) {
+ if (parport_epp_read_addr(&stat, 1) != 1)
+ goto errret;
+ /* determine TX fifo size from status bits */
+ switch (stat & (EPP_NTAEF|EPP_NTHF)) {
+ case EPP_NTHF:
+ ocntx = 2048 - 256;
+ break;
+
+ case EPP_NTAEF:
+ ocntx = 2048 - 1793;
+ break;
+
+ case 0:
+ ocntx = 0;
+ break;
+
+ default:
+ ocntx = 2048 - 1025;
+ break;
+ }
+ /* determine RX fifo size from status bits */
+ switch (stat & (EPP_NRAEF|EPP_NRHF)) {
+ case EPP_NRHF:
+ icntx = 0;
+ break;
+
+ case EPP_NRAEF:
+ icntx = 1025;
+ break;
+
+ case 0:
+ icntx = 1793;
+ break;
+
+ default:
+ icntx = 256;
+ break;
+ }
+ ocnt = ocntx;
+ icnt = icntx;
+ /* try to determine the FIFO count if in extended mode */
+ if (cfg->extstat) {
+ eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE|1;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ if (parport_epp_read_addr(eio, 2) != 2)
+ goto errret;
+ icnt = eio[0] | (((unsigned int)eio[1]) << 8);
+ eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE|2;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ if (parport_epp_read_addr(eio, 2) != 2)
+ goto errret;
+ ocnt = eio[0] | (((unsigned int)eio[1]) << 8);
+ eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ ocnt = 16384 - (ocnt & 0x7fff);
+ icnt &= 0x7fff;
+ }
+ /* try to tx */
+#if 0
+ if (ocnt > 0) {
+ }
+#endif
+ if (icnt > 0) {
+ for (cntx = icnt; cntx > 0; cntx -= cnt) {
+ cnt = cntx;
+ if (cnt > sizeof(eio))
+ cnt = sizeof(eio);
+ if (parport_epp_read_data(eio, cnt) != cnt)
+ goto errret;
+ hdlc_receive(&hdlcrx, eio, cnt);
+ }
+ } else {
+ if (idle_callback(10000)) {
+ reset_modem();
+ return 0;
+ }
+ }
+#if 0
+ pcnt = (++pcnt) & 0x3f;
+ if (pcnt)
+ continue;
+#endif
+ /* DCD has inverse logic */
+ tprintf("DCD:%c stat: %02x icnt %5d icntx %5d ocnt %5d ocntx %5d\r",
+ (stat & EPP_DCDBIT) ? '-' : 'D', stat, icnt, icntx, ocnt, ocntx);
+ if (idle_callback(0)) {
+ reset_modem();
+ return 0;
+ }
+ }
+ return 0;
+
+errret:
+ lprintf(0, "EPP timeout\n");
+ return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static int ecprx(struct adapter_config *cfg)
+{
+ u_int8_t stat[6];
+ int cnt, cntx, i, icnt, ocnt;
+#if 0
+ unsigned int pcnt = 0;
+#endif
+ unsigned char data[4096];
+ struct hdlc_receiver hdlcrx;
+
+ hdlc_initrx(&hdlcrx);
+ if ((i = adapter_start_ecp(cfg)))
+ return i;
+ data[0] = 0xaf; /* reset register: all reset */
+ data[1] = 0xa0; /* reset register: terminate reset */
+ data[2] = 0xb0;
+ if (parport_ecp_write_addr(data, 3) != 3)
+ goto errret;
+ for (;;) {
+ data[0] = 0x81;
+ if (parport_ecp_write_addr(data, 1) != 1)
+ goto errret;
+ if (parport_ecp_read_data(stat, 6) != 6)
+ goto errret;
+ data[0] = 0x80;
+ if (parport_ecp_write_addr(data, 1) != 1)
+ goto errret;
+ icnt = ((unsigned)stat[2] << 8) | stat[1];
+ ocnt = ((unsigned)stat[4] << 8) | stat[3];
+ /* read */
+ if (icnt > 0) {
+ for (cntx = icnt; cntx > 0; cntx -= cnt) {
+ cnt = cntx;
+ if (cnt > sizeof(data))
+ cnt = sizeof(data);
+ if (cnt > 0xfff)
+ cnt = 0xfff;
+ data[0] = 0xc0 | (cnt & 0xf);
+ data[1] = 0xd0 | ((cnt >> 4) & 0xf);
+ data[2] = 0xe0 | ((cnt >> 8) & 0xf);
+ if (parport_ecp_write_addr(data, 3) != 3)
+ goto errret;
+ if (parport_ecp_read_data(data, cnt) != cnt)
+ goto errret;
+ hdlc_receive(&hdlcrx, data, cnt);
+ }
+ } else {
+ if (idle_callback(10000)) {
+ reset_modem();
+ return 0;
+ }
+ }
+ /* write */
+#if 0
+ if (ocnt < 8192) { /* fixme */
+ cnt = 8192 - ocnt;
+ if (cnt > sizeof(data))
+ cnt = sizeof(data);
+ }
+#endif
+#if 0
+ pcnt = (++pcnt) & 0x3f;
+ if (pcnt)
+ continue;
+#endif
+ /* DCD has inverse logic */
+ tprintf("DCD:%c stat: %02x icnt %5d ocnt %5d\r",
+ (stat[0] & EPP_DCDBIT) ? '-' : 'D', stat[0], icnt, ocnt);
+ if (idle_callback(0)) {
+ reset_modem();
+ return 0;
+ }
+ }
+ return 0;
+
+errret:
+ lprintf(0, "ECP timeout\n");
+ return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static int eppafskrx(struct adapter_config *cfg)
+{
+ u_int8_t stat;
+ int i, icnt, ocnt;
+#if 0
+ int j;
+ unsigned int pcnt = 0;
+#endif
+ unsigned char eio[32];
+ struct hdlc_receiver hdlcrx;
+
+ hdlc_initrx(&hdlcrx);
+ cfg->bitrate = 1200;
+ if ((i = adapter_start_eppafsk(cfg)))
+ return i;
+ /* reset modem */
+ eio[0] = 0x00;
+ eio[1] = 0x18;
+ if (parport_epp_write_addr(eio, 2) != 2)
+ goto errret;
+ for (;;) {
+ if (parport_epp_read_addr(&stat, 1) != 1)
+ goto errret;
+ /* determine the FIFO count */
+ eio[0] = 0x19;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ if (parport_epp_read_addr(eio, 1) != 1)
+ goto errret;
+ ocnt = 0x10 - (eio[0] & 0x1f);
+ eio[0] = 0x1a;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ if (parport_epp_read_addr(eio, 1) != 1)
+ goto errret;
+ icnt = eio[0] & 0x1f;
+ eio[0] = 0x18;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ /* try to tx */
+#if 0
+ if (ocnt > 0) {
+ }
+#endif
+ if (icnt > 0) {
+ if (parport_epp_read_data(eio, icnt) != icnt)
+ goto errret;
+#if 0
+ for (i = 0; i < icnt; i++)
+ for (j = 0; j < 8; j++)
+ putc('0' + ((eio[i] >> j) & 1), stdout);
+ fflush(stdout);
+#endif
+ hdlc_receive(&hdlcrx, eio, icnt);
+ } else {
+ if (idle_callback(10000)) {
+ reset_modem();
+ return 0;
+ }
+ }
+#if 0
+ pcnt = (++pcnt) & 0x3f;
+ if (pcnt)
+ continue;
+#endif
+ /* DCD has inverse logic */
+#if 1
+ tprintf("DCD:%c stat: %02x icnt %5d ocnt %5d\r",
+ (stat & EPP_DCDBIT) ? '-' : 'D', stat, icnt, ocnt);
+#endif
+ if (idle_callback(0)) {
+ reset_modem();
+ return 0;
+ }
+ }
+ return 0;
+
+errret:
+ lprintf(0, "EPP timeout\n");
+ return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static int sppafskrx(struct adapter_config *cfg)
+{
+ u_int8_t stat;
+ int i, icnt, ocnt;
+#if 0
+ unsigned int pcnt = 0;
+#endif
+ unsigned char eio[32];
+ struct hdlc_receiver hdlcrx;
+
+ hdlc_initrx(&hdlcrx);
+ cfg->bitrate = 1200;
+ if ((i = adapter_start_sppafsk(cfg)))
+ return i;
+ /* reset modem */
+ sppafsk_wrcmd(0x00);
+ sppafsk_wrcmd(0x18);
+ for (;;) {
+ stat = sppafsk_rdcmd();
+ /* determine the FIFO count */
+ sppafsk_wrcmd(0x19);
+ ocnt = sppafsk_rdcmd();
+ sppafsk_wrcmd(0x1a);
+ icnt = sppafsk_rdcmd();
+ sppafsk_wrcmd(0x18);
+ if (icnt > 0x10 || ocnt > 0x10)
+ goto errret;
+ ocnt = 0x10 - ocnt;
+ /* try to tx */
+#if 0
+ if (ocnt > 0) {
+ }
+#endif
+ if (icnt > 0) {
+ for (i = 0; i < icnt; i++)
+ eio[i] = sppafsk_rddata();
+ hdlc_receive(&hdlcrx, eio, icnt);
+ } else {
+ if (idle_callback(10000)) {
+ reset_modem();
+ return 0;
+ }
+ }
+#if 0
+ pcnt = (++pcnt) & 0x3f;
+ if (pcnt)
+ continue;
+#endif
+ /* DCD has inverse logic */
+ tprintf("DCD:%c stat: %02x icnt %5d ocnt %5d\r",
+ (stat & EPP_DCDBIT) ? '-' : 'D', stat, icnt, ocnt);
+ if (idle_callback(0)) {
+ reset_modem();
+ return 0;
+ }
+ }
+ return 0;
+
+errret:
+ lprintf(0, "SPP bogus values read\n");
+ return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * Sample IO Firmware Tests
+ */
+
+static int sine1k(struct adapter_config *cfg)
+{
+#if 0
+ static const char scdisp[] = " *\n";
+#endif
+ signed char sine[128];
+ unsigned char eio[1024];
+ unsigned char ctrl = 0;
+ unsigned phase = 0, ledcnt = 0;
+ int i, icnt, ocnt, cnt, cntx;
+
+ cfg->bitrate = 8000;
+ if ((i = adapter_start_eppsamp(cfg)))
+ return i;
+ for (i = 0; i < sizeof(sine); i++)
+ sine[i] = 127 * sin((2.0 * M_PI / sizeof(sine)) * i);
+ tprintf("Sine 1k Test\n");
+ eio[0] = 7;
+ eio[1] = 0;
+ if (parport_epp_write_addr(eio, 2) != 2)
+ goto errret;
+ for (;;) {
+ /* determine the FIFO count */
+ eio[0] = ctrl | 1;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ if (parport_epp_read_addr(eio, 2) != 2)
+ goto errret;
+ icnt = eio[0] | (((unsigned int)eio[1]) << 8);
+ eio[0] = ctrl | 2;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ if (parport_epp_read_addr(eio, 2) != 2)
+ goto errret;
+ ocnt = eio[0] | (((unsigned int)eio[1]) << 8);
+ eio[0] = ctrl;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ ocnt = 16384 - (ocnt & 0x7fff);
+ icnt &= 0x7fff;
+ /* try to tx */
+ if (ocnt > 0) {
+ for (cntx = ocnt; cntx > 0; cntx -= cnt) {
+ cnt = cntx;
+ if (cnt > sizeof(eio))
+ cnt = sizeof(eio);
+ for (i = 0; i < cnt; i++) {
+ eio[i] = sine[(phase >> 9) & 0x7f];
+ phase += 0x1789; /* pretty arbitrary */
+ }
+ if (parport_epp_write_data(eio, cnt) != cnt)
+ goto errret;
+ }
+ }
+ if (icnt > 0) {
+ for (cntx = icnt; cntx > 0; cntx -= cnt) {
+ cnt = cntx;
+ if (cnt > sizeof(eio))
+ cnt = sizeof(eio);
+ if (parport_epp_read_data(eio, cnt) != cnt)
+ goto errret;
+ for (i = 0; i < cnt; i++) {
+#if 0
+ tprintf(scdisp + (((eio[i] + 128) & 0xff) / 4));
+#elif 1
+ if (i < 64)
+ tprintf("%4d\n", ((signed char)eio[i]));
+ else if (i == 64)
+ tprintf("--\n");
+#endif
+ if ((++ledcnt) >= 4000) {
+ ledcnt = 0;
+ ctrl += 0x40;
+ }
+ }
+ }
+ } else {
+ if (idle_callback(10000)) {
+ reset_modem();
+ return 0;
+ }
+ }
+ }
+
+errret:
+ lprintf(0, "EPP timeout\n");
+ return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+
+#ifdef HAVE_LINUX_SOUNDCARD_H
+
+#include <linux/soundcard.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/uio.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+
+#define SNDLATENCY 4000 /* approx 1/2 seconds */
+#define PHASEFRAC 12
+#define PHASEMASK ((1<<PHASEFRAC)-1)
+#define SINEOVERLAY
+
+static int saudio(struct adapter_config *cfg)
+{
+ unsigned char bufu[8192]; /* must be significantly bigger than SNDLATENCY! */
+ signed char bufs[8192]; /* must be significantly bigger than SNDLATENCY! */
+ audio_buf_info aboinfo, abiinfo;
+ int fddsp, apar;
+ unsigned srate;
+ unsigned char ctrl = 0;
+ unsigned phinceppdsp, phincdspepp, pheppdsp = 0, phdspepp = 0;
+ unsigned ledcnt = 0;
+ int i, icnt, ocnt, cnt, ocnts, omax;
+#ifdef SINEOVERLAY
+ signed char sine[128];
+ unsigned phase = 0;
+#endif
+
+#ifdef SINEOVERLAY
+ for (i = 0; i < sizeof(sine); i++)
+ sine[i] = 63 * sin((2.0 * M_PI / sizeof(sine)) * i);
+#endif
+ cfg->bitrate = 8000;
+ if ((i = adapter_start_eppsamp(cfg)))
+ return i;
+ if ((fddsp = open("/dev/dsp", O_RDWR | O_NONBLOCK)) == -1) {
+ lprintf(0, "cannot open /dev/dsp (%s)\n", strerror(errno));
+ return -1;
+ }
+ fcntl(fddsp, F_SETFL, fcntl(fddsp, F_GETFL, 0) | O_NONBLOCK);
+ if (ioctl(fddsp, SNDCTL_DSP_NONBLOCK, 0) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_NONBLOCK failed (%s)\n", strerror(errno));
+ goto errsnd;
+ }
+ if (ioctl(fddsp, SNDCTL_DSP_GETCAPS, &apar) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_GETCAPS failed (%s)\n", strerror(errno));
+ goto errsnd;
+ }
+ if (!(apar & DSP_CAP_DUPLEX)) {
+ lprintf(0, "full duplex soundcard required\n");
+ goto errsnd;
+ }
+ if (!(apar & DSP_CAP_TRIGGER)) {
+ lprintf(0, "soundcard does not support trigger\n");
+ goto errsnd;
+ }
+ if (ioctl(fddsp, SNDCTL_DSP_SETDUPLEX, 0) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_SETDUPLEX failed (%s)\n", strerror(errno));
+ goto errsnd;
+ }
+ apar = AFMT_U8;
+ if (ioctl(fddsp, SNDCTL_DSP_SETFMT, &apar) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_SETFMT failed (%s), U8 not supported??\n", strerror(errno));
+ goto errsnd;
+ }
+ apar = 0;
+ if (ioctl(fddsp, SNDCTL_DSP_STEREO, &apar) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_STEREO failed (%s), mono not supported??\n", strerror(errno));
+ goto errsnd;
+ }
+ srate = cfg->bitrate;
+ if (ioctl(fddsp, SNDCTL_DSP_SPEED, &srate) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_SPEED failed (%s), samplingrate %u not supported??\n",
+ strerror(errno), cfg->bitrate);
+ goto errsnd;
+ }
+ lprintf(1, "epp adapter sampling rate %u, soundcard sampling rate %u\n", cfg->bitrate, srate);
+ if (abs(cfg->bitrate - srate) > cfg->bitrate / 2) {
+ lprintf(0, "sampling rates (%u,%u) too different\n", cfg->bitrate, srate);
+ goto errsnd;
+ }
+ phinceppdsp = ((1 << PHASEFRAC) * cfg->bitrate + srate / 2) / srate;
+ phincdspepp = ((1 << PHASEFRAC) * srate + cfg->bitrate / 2) / cfg->bitrate;
+ lprintf(1, "epp->dsp phase inc: 0x%05x dsp->epp phase inc: 0x%05x\n", phinceppdsp, phincdspepp);
+ if (ioctl(fddsp, SNDCTL_DSP_GETOSPACE, &aboinfo) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_GETOSPACE failed (%s)\n", strerror(errno));
+ goto errsnd;
+ }
+ if (ioctl(fddsp, SNDCTL_DSP_GETISPACE, &abiinfo) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_GETISPACE failed (%s)\n", strerror(errno));
+ goto errsnd;
+ }
+ if (aboinfo.fragstotal * aboinfo.fragsize < 2*SNDLATENCY ||
+ abiinfo.fragstotal * abiinfo.fragsize < 2*SNDLATENCY) {
+ lprintf(0, "soundcard buffers too small (%u,%u)\n",
+ aboinfo.fragstotal * aboinfo.fragsize,
+ abiinfo.fragstotal * abiinfo.fragsize);
+ goto errsnd;
+ }
+ tprintf("Audio IO to Linux Soundcard\n");
+ /* reset the EPP adapter */
+ bufu[0] = 7;
+ bufu[1] = 0;
+ if (parport_epp_write_addr(bufu, 2) != 2)
+ goto errret;
+ /* prefill EPP adapter to nominal queue size */
+ memset(bufs, 0, SNDLATENCY);
+ if (parport_epp_write_data(bufs, SNDLATENCY) != SNDLATENCY)
+ goto errret;
+ /* prefill to nominal queue size and stard soundcard */
+ memset(bufu, 0x80, SNDLATENCY);
+ if ((i = write(fddsp, bufu, SNDLATENCY)) != SNDLATENCY) {
+ lprintf(0, "write(%d) failed %i (%s)\n", SNDLATENCY, i, strerror(errno));
+ goto errsnd;
+ }
+ apar = PCM_ENABLE_INPUT | PCM_ENABLE_OUTPUT;
+ if (ioctl(fddsp, SNDCTL_DSP_SETTRIGGER, &apar) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_SETTRIGGER failed (%s)\n", strerror(errno));
+ goto errsnd;
+ }
+ /* start the whole thing */
+ for (;;) {
+ /* first do the epp->dsp direction */
+ /* get FIFO count */
+ bufu[0] = ctrl | 1;
+ if (parport_epp_write_addr(bufu, 1) != 1)
+ goto errret;
+ if (parport_epp_read_addr(bufu, 2) != 2)
+ goto errret;
+ icnt = bufu[0] | (((unsigned int)bufu[1]) << 8);
+ bufu[0] = ctrl;
+ if (parport_epp_write_addr(bufu, 1) != 1)
+ goto errret;
+ icnt &= 0x7fff;
+ if (icnt > 0) {
+ if (icnt > sizeof(bufs)/2)
+ icnt = sizeof(bufs)/2;
+ if (parport_epp_read_data(bufs, icnt) != icnt)
+ goto errret;
+ pheppdsp &= PHASEMASK;
+ cnt = 0;
+ while (pheppdsp < (icnt << PHASEFRAC)) {
+ bufu[cnt] = bufs[pheppdsp >> PHASEFRAC] + 128;
+ pheppdsp += phinceppdsp;
+ cnt++;
+ }
+ if ((i = write(fddsp, bufu, cnt)) != cnt) {
+ lprintf(0, "write(%d) failed %i (%s)\n", cnt, i, strerror(errno));
+ goto errsnd;
+ }
+ if (ioctl(fddsp, SNDCTL_DSP_GETODELAY, &apar) == -1) {
+ lprintf(0, "ioctl SNDCTL_DSP_GETODELAY failed (%s)\n", strerror(errno));
+ goto errsnd;
+ }
+ /* adjust speed */
+ lprintf(4, "icnt %d cnt %d odel %d\n", icnt, cnt, apar);
+ if (apar > SNDLATENCY)
+ phinceppdsp++;
+ else if (apar < SNDLATENCY)
+ phinceppdsp--;
+ if (phinceppdsp < (0x9 << (PHASEFRAC-4)) || phinceppdsp > (0x1f << (PHASEFRAC-4))) {
+ lprintf(0, "phinceppdsp (0x%05x) out of range\n", phinceppdsp);
+ goto errsnd;
+ }
+ /* play games with the LEDS */
+ ledcnt += icnt;
+ if (ledcnt >= 4000) {
+ ledcnt %= 4000;
+ ctrl += 0x40;
+ }
+ }
+ /* next do the dsp->epp direction */
+ /* get FIFO count */
+ bufu[0] = ctrl | 2;
+ if (parport_epp_write_addr(bufu, 1) != 1)
+ goto errret;
+ if (parport_epp_read_addr(bufu, 2) != 2)
+ goto errret;
+ ocnt = bufu[0] | (((unsigned int)bufu[1]) << 8);
+ bufu[0] = ctrl;
+ if (parport_epp_write_addr(bufu, 1) != 1)
+ goto errret;
+ ocnt &= 0x7fff;
+ omax = 16384 - ocnt;
+ /* read sound */
+ ocnts = read(fddsp, bufu, sizeof(bufu)/2);
+ if (ocnts == -1 && errno == EAGAIN)
+ ocnts = 0;
+ if (ocnts < 0) {
+ lprintf(0, "read(%d) failed %i (%s)\n", sizeof(bufu)/2, ocnts, strerror(errno));
+ goto errsnd;
+ }
+ if (ocnts > 0) {
+ phdspepp &= PHASEMASK;
+ cnt = 0;
+ while (phdspepp < (ocnts << PHASEFRAC)) {
+ bufs[cnt] = bufu[phdspepp >> PHASEFRAC] - 128;
+ phdspepp += phincdspepp;
+ cnt++;
+ }
+ if (cnt > omax) {
+ lprintf(0, "epp adapter output overrun (%d, %d)\n", cnt, omax);
+ goto errsnd;
+ }
+#ifdef SINEOVERLAY
+ for (i = 0; i < cnt; i++) {
+ bufs[i] += sine[(phase >> 9) & 0x7f];
+ phase += 0x1789; /* pretty arbitrary */
+ }
+#endif
+ if (parport_epp_write_data(bufs, cnt) != cnt)
+ goto errret;
+ /* reget the FIFO count */
+ bufu[0] = ctrl | 2;
+ if (parport_epp_write_addr(bufu, 1) != 1)
+ goto errret;
+ if (parport_epp_read_addr(bufu, 2) != 2)
+ goto errret;
+ ocnt = bufu[0] | (((unsigned int)bufu[1]) << 8);
+ bufu[0] = ctrl;
+ if (parport_epp_write_addr(bufu, 1) != 1)
+ goto errret;
+ ocnt &= 0x7fff;
+ /* adjust speed */
+ lprintf(4, "ocnts %d cnt %d ocnt %d\n", ocnts, cnt, ocnt);
+ if (ocnt > SNDLATENCY)
+ phincdspepp++;
+ else if (ocnt < SNDLATENCY)
+ phincdspepp--;
+ if (phincdspepp < (0x9 << (PHASEFRAC-4)) || phincdspepp > (0x1f << (PHASEFRAC-4))) {
+ lprintf(0, "phincdspepp (0x%05x) out of range\n", phincdspepp);
+ goto errsnd;
+ }
+ }
+ /* wait a bit */
+ if (idle_callback(50000)) {
+ reset_modem();
+ return 0;
+ }
+ lprintf(1, "phase increments: 0x%05x 0x%05x\n", phinceppdsp, phincdspepp);
+ }
+
+errret:
+ lprintf(0, "EPP timeout\n");
+errsnd:
+ close(fddsp);
+ return -1;
+}
+
+#endif /* HAVE_LINUX_SOUNDCARD_H */
+
+/* ---------------------------------------------------------------------- */
+
+#ifdef HAVE_DIRECTX
+
+#include <directx.h>
+
+#define SNDLATENCY 4000 /* approx 1/2 seconds */
+#define PHASEFRAC 12
+#define PHASEMASK ((1<<PHASEFRAC)-1)
+#define SINEOVERLAY
+
+static BOOL CALLBACK DSEnumProc(LPGUID guid, LPCSTR lpszDesc, LPCSTR lpszDrvName, LPVOID lpcontext)
+{
+ lprintf(1, "has %sGUID, desc %s drvname %s\n", guid ? "" : "no ", lpszDesc, lpszDrvName);
+ return TRUE;
+}
+
+static LRESULT CALLBACK MyWndProc(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
+{
+ switch (umsg) {
+ /* Add cases such as WM_CREATE, WM_COMMAND, WM_PAINT if you don't
+ want to pass these messages along for default processing. */
+ case WM_CLOSE:
+ DestroyWindow (hwnd);
+ return 0;
+
+ case WM_DESTROY:
+ PostQuitMessage (0);
+ return 0;
+ }
+ return DefWindowProc (hwnd, umsg, wParam, lParam);
+}
+
+static int saudio(struct adapter_config *cfg)
+{
+ LPDIRECTSOUND dsplay = NULL;
+ LPDIRECTSOUNDCAPTURE dsrec = NULL;
+ LPDIRECTSOUNDBUFFER playbuf = NULL;
+ LPDIRECTSOUNDCAPTUREBUFFER recbuf = NULL;
+ WNDCLASS wndclass;
+ HRESULT res;
+ WAVEFORMATEX waveformat;
+ DSBUFFERDESC bdesc;
+ DSCBUFFERDESC cbdesc;
+ HANDLE hinst;
+ HWND hwnd;
+ DWORD playbufsz, recbufsz, playptr = 0, recptr = 0;
+ DWORD lockbytes, lockbytes2, delay;
+ unsigned char *uptr;
+ unsigned char *uptr2;
+ unsigned char *uptr3;
+ int retval = -1;
+ unsigned char bufu[8];
+ signed char bufs[8192]; /* must be significantly bigger than SNDLATENCY! */
+ unsigned char ctrl = 0;
+ unsigned phinceppdsp, phincdspepp, pheppdsp = 0, phdspepp = 0;
+ unsigned ledcnt = 0;
+ int i, icnt, ocnt, cnt, ocnts, omax;
+#ifdef SINEOVERLAY
+ signed char sine[128];
+ unsigned phase = 0;
+#endif
+
+#ifdef SINEOVERLAY
+ for (i = 0; i < sizeof(sine); i++)
+ sine[i] = 63 * sin((2.0 * M_PI / sizeof(sine)) * i);
+#endif
+ lprintf(1, "DirectSound drivers\n");
+ DirectSoundEnumerateA(DSEnumProc, NULL);
+ lprintf(1, "DirectSoundCapture drivers\n");
+ DirectSoundCaptureEnumerateA(DSEnumProc, NULL);
+ hinst = GetModuleHandleA(0);
+ wndclass.style = CS_HREDRAW | CS_VREDRAW;
+ wndclass.lpfnWndProc = (WNDPROC)MyWndProc;
+ wndclass.cbClsExtra = 0;
+ wndclass.cbWndExtra = 0;
+ wndclass.hIcon = NULL;
+ wndclass.hInstance = hinst;
+ wndclass.hCursor = NULL;
+ wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
+ wndclass.lpszMenuName = NULL;
+ wndclass.lpszClassName = "MyClass";
+ if (!RegisterClass(&wndclass)) {
+ lprintf(0, "RegisterClass error, %d\n", GetLastError());
+ return -1;
+ }
+ hwnd = CreateWindowEx(WS_EX_APPWINDOW, "MyClass", "eppfpga", WS_DISABLED | WS_POPUP,
+ 0, 0, 0, 0, NULL, NULL, hinst, NULL);
+ if (!hwnd) {
+ lprintf(0, "CreateWindowEx error, %d\n", GetLastError());
+ goto errcreatewin;
+ }
+ if (FAILED(res = DirectSoundCreate(NULL, &dsplay, NULL))) {
+ lprintf(0, "DirectSoundCreate error %lu\n", res);
+ goto errdscreate;
+ }
+ if (FAILED(res = IDirectSound_SetCooperativeLevel(dsplay, hwnd, DSSCL_NORMAL))) {
+ lprintf(0, "SetCooperativeLevel error %lu\n", res);
+ goto errdscreate1;
+ }
+ if (FAILED(res = DirectSoundCaptureCreate(NULL, &dsrec, NULL))) {
+ lprintf(0, "DirectSoundCaptureCreate error %lu\n", res);
+ goto errdscreate1;
+ }
+ memset(&waveformat, 0, sizeof(waveformat));
+ waveformat.wFormatTag = WAVE_FORMAT_PCM;
+ waveformat.wBitsPerSample = 8;
+ waveformat.nChannels = 1;
+ waveformat.nSamplesPerSec = 8000;
+ waveformat.nBlockAlign = waveformat.nChannels * waveformat.wBitsPerSample / 8;
+ waveformat.nAvgBytesPerSec = waveformat.nSamplesPerSec * waveformat.nBlockAlign;
+ memset(&cbdesc, 0, sizeof(cbdesc));
+ cbdesc.dwSize = sizeof(cbdesc);
+ cbdesc.dwFlags = /* DSCBCAPS_WAVEMAPPED */ 0;
+ recbufsz = cbdesc.dwBufferBytes = waveformat.nAvgBytesPerSec;
+ cbdesc.lpwfxFormat = &waveformat;
+ if (FAILED(res = IDirectSoundCapture_CreateCaptureBuffer(dsrec, &cbdesc, &recbuf, NULL))) {
+ lprintf(0, "CreateSoundCaptureBuffer error %lu\n", res);
+ goto errdscreate2;
+ }
+ memset(&waveformat, 0, sizeof(waveformat));
+ waveformat.wFormatTag = WAVE_FORMAT_PCM;
+ waveformat.wBitsPerSample = 8;
+ waveformat.nChannels = 1;
+ waveformat.nSamplesPerSec = 8000;
+ waveformat.nBlockAlign = waveformat.nChannels * waveformat.wBitsPerSample / 8;
+ waveformat.nAvgBytesPerSec = waveformat.nSamplesPerSec * waveformat.nBlockAlign;
+ memset(&bdesc, 0, sizeof(bdesc));
+ bdesc.dwSize = sizeof(bdesc);
+ bdesc.dwFlags = DSBCAPS_GETCURRENTPOSITION2 | DSBCAPS_GLOBALFOCUS | DSBCAPS_CTRLPAN;
+ playbufsz = bdesc.dwBufferBytes = waveformat.nAvgBytesPerSec;
+ bdesc.lpwfxFormat = &waveformat;
+ if (FAILED(res = IDirectSound_CreateSoundBuffer(dsplay, &bdesc, &playbuf, NULL))) {
+ lprintf(0, "CreateSoundBuffer error %lu\n", res);
+ goto errdscreate3;
+ }
+ cfg->bitrate = 8000;
+ if ((i = adapter_start_eppsamp(cfg))) {
+ retval = i;
+ goto errdscreate4;
+ }
+ phinceppdsp = ((1 << PHASEFRAC) * cfg->bitrate + 8000 / 2) / 8000;
+ phincdspepp = ((1 << PHASEFRAC) * 8000 + cfg->bitrate / 2) / cfg->bitrate;
+ lprintf(1, "epp->dsp phase inc: 0x%05x dsp->epp phase inc: 0x%05x\n", phinceppdsp, phincdspepp);
+ tprintf("Audio IO to DirectX\n");
+ /* reset the EPP adapter */
+ bufu[0] = 7;
+ bufu[1] = 0;
+ if (parport_epp_write_addr(bufu, 2) != 2)
+ goto errret;
+ /* prefill EPP adapter to nominal queue size */
+ memset(bufs, 0, SNDLATENCY);
+ if (parport_epp_write_data(bufs, SNDLATENCY) != SNDLATENCY)
+ goto errret;
+ /* prefill to nominal queue size and stard soundcard */
+ if (FAILED(res = IDirectSoundBuffer_Lock(playbuf, 0, SNDLATENCY, (LPVOID)&uptr, &lockbytes, NULL, NULL, 0))) {
+ lprintf(0, "IDirectSoundBuffer_Lock error %lu\n", res);
+ goto errresmodem;
+ }
+ memset(uptr, 0x80, SNDLATENCY);
+ if (FAILED(res = IDirectSoundBuffer_Unlock(playbuf, uptr, lockbytes, NULL, 0))) {
+ lprintf(0, "IDirectSoundBuffer_Unlock error %lu\n", res);
+ goto errresmodem;
+ }
+ playptr = SNDLATENCY;
+ if (FAILED(res = IDirectSoundBuffer_Play(playbuf, 0, 0, DSBPLAY_LOOPING))) {
+ lprintf(0, "IDirectSoundBuffer_Play error %lu\n", res);
+ goto errresmodem;
+ }
+ if (FAILED(res = IDirectSoundCaptureBuffer_Start(recbuf, DSCBSTART_LOOPING))) {
+ lprintf(0, "IDirectSoundCaptureBuffer_Start error %lu\n", res);
+ goto errresmodem;
+ }
+ /* start the whole thing */
+ for (;;) {
+ /* first do the epp->dsp direction */
+ /* get FIFO count */
+ bufu[0] = ctrl | 1;
+ if (parport_epp_write_addr(bufu, 1) != 1)
+ goto errret;
+ if (parport_epp_read_addr(bufu, 2) != 2)
+ goto errret;
+ icnt = bufu[0] | (((unsigned int)bufu[1]) << 8);
+ bufu[0] = ctrl;
+ if (parport_epp_write_addr(bufu, 1) != 1)
+ goto errret;
+ icnt &= 0x7fff;
+ if (icnt > 0) {
+ if (icnt > sizeof(bufs)/2)
+ icnt = sizeof(bufs)/2;
+ if (parport_epp_read_data(bufs, icnt) != icnt)
+ goto errret;
+ pheppdsp &= PHASEMASK;
+ /* write to direct sound and convert */
+ if (FAILED(res = IDirectSoundBuffer_Lock(playbuf, playptr, SNDLATENCY, (LPVOID)&uptr, &lockbytes,
+ (LPVOID)&uptr2, &lockbytes2, 0))) {
+ lprintf(0, "IDirectSoundBuffer_Lock error %lu\n", res);
+ goto errresmodem;
+ }
+ uptr3 = uptr;
+ while (pheppdsp < (icnt << PHASEFRAC)) {
+ *uptr3++ = bufs[pheppdsp >> PHASEFRAC] + 128;
+ pheppdsp += phinceppdsp;
+ playptr++;
+ if (playptr >= playbufsz) {
+ playptr = 0;
+ uptr3 = uptr2;
+ }
+ }
+ if (FAILED(res = IDirectSoundBuffer_Unlock(playbuf, uptr, lockbytes, uptr2, lockbytes2))) {
+ lprintf(0, "IDirectSoundBuffer_Unlock error %lu\n", res);
+ goto errresmodem;
+ }
+ /* get output delay */
+ if (FAILED(res = IDirectSoundBuffer_GetCurrentPosition(playbuf, &delay, NULL))) {
+ lprintf(0, "IDirectSoundBuffer_GetCurrentPosition error %lu\n", res);
+ goto errresmodem;
+ }
+ delay = (playbufsz + playptr - delay) % playbufsz;
+ /* adjust speed */
+ lprintf(4, "icnt %d cnt %d odel %u\n", icnt, cnt, delay);
+ if (delay > SNDLATENCY)
+ phinceppdsp++;
+ else if (delay < SNDLATENCY)
+ phinceppdsp--;
+ if (phinceppdsp < (0x9 << (PHASEFRAC-4)) || phinceppdsp > (0x1f << (PHASEFRAC-4))) {
+ lprintf(0, "phinceppdsp (0x%05x) out of range\n", phinceppdsp);
+ goto errresmodem;
+ }
+ /* play games with the LEDS */
+ ledcnt += icnt;
+ if (ledcnt >= 4000) {
+ ledcnt %= 4000;
+ ctrl += 0x40;
+ }
+ }
+ /* next do the dsp->epp direction */
+ /* get FIFO count */
+ bufu[0] = ctrl | 2;
+ if (parport_epp_write_addr(bufu, 1) != 1)
+ goto errret;
+ if (parport_epp_read_addr(bufu, 2) != 2)
+ goto errret;
+ ocnt = bufu[0] | (((unsigned int)bufu[1]) << 8);
+ bufu[0] = ctrl;
+ if (parport_epp_write_addr(bufu, 1) != 1)
+ goto errret;
+ ocnt &= 0x7fff;
+ omax = 16384 - ocnt;
+ /* read sound */
+ if (FAILED(res = IDirectSoundCaptureBuffer_GetCurrentPosition(recbuf, &delay, NULL))) {
+ lprintf(0, "IDirectSoundCaptureBuffer_GetCurrentPosition error %lu\n", res);
+ goto errresmodem;
+ }
+ ocnts = (recbufsz + delay - recptr) % recbufsz;
+ if (ocnts > 0) {
+ if (FAILED(res = IDirectSoundCaptureBuffer_Lock(recbuf, recptr, SNDLATENCY, (LPVOID)&uptr, &lockbytes,
+ (LPVOID)&uptr2, &lockbytes2, 0))) {
+ lprintf(0, "IDirectSoundCaptureBuffer_Lock error %lu\n", res);
+ goto errresmodem;
+ }
+ uptr3 = uptr;
+ phdspepp &= PHASEMASK;
+ cnt = 0;
+ while (phdspepp < (ocnts << PHASEFRAC)) {
+ if (phdspepp >= ((recbufsz - recptr) << PHASEFRAC)) {
+ uptr3 = uptr2;
+ phdspepp -= (recbufsz - recptr) << PHASEFRAC;
+ recptr = 0;
+ }
+ bufs[cnt] = uptr3[phdspepp >> PHASEFRAC] - 128;
+ phdspepp += phincdspepp;
+ cnt++;
+ }
+ recptr = (recptr + (phdspepp >> PHASEFRAC)) % recbufsz;
+ if (FAILED(res = IDirectSoundCaptureBuffer_Unlock(recbuf, uptr, lockbytes, uptr2, lockbytes2))) {
+ lprintf(0, "IDirectSoundCaptureBuffer_Unlock error %lu\n", res);
+ goto errresmodem;
+ }
+ if (cnt > omax) {
+ lprintf(0, "epp adapter output overrun (%d, %d)\n", cnt, omax);
+ goto errresmodem;
+ }
+#ifdef SINEOVERLAY
+ for (i = 0; i < cnt; i++) {
+ bufs[i] += sine[(phase >> 9) & 0x7f];
+ phase += 0x1789; /* pretty arbitrary */
+ }
+#endif
+ if (parport_epp_write_data(bufs, cnt) != cnt)
+ goto errret;
+ /* reget the FIFO count */
+ bufu[0] = ctrl | 2;
+ if (parport_epp_write_addr(bufu, 1) != 1)
+ goto errret;
+ if (parport_epp_read_addr(bufu, 2) != 2)
+ goto errret;
+ ocnt = bufu[0] | (((unsigned int)bufu[1]) << 8);
+ bufu[0] = ctrl;
+ if (parport_epp_write_addr(bufu, 1) != 1)
+ goto errret;
+ ocnt &= 0x7fff;
+ /* adjust speed */
+ lprintf(4, "ocnts %d cnt %d ocnt %d\n", ocnts, cnt, ocnt);
+ if (ocnt > SNDLATENCY)
+ phincdspepp++;
+ else if (ocnt < SNDLATENCY)
+ phincdspepp--;
+ if (phincdspepp < (0x9 << (PHASEFRAC-4)) || phincdspepp > (0x1f << (PHASEFRAC-4))) {
+ lprintf(0, "phincdspepp (0x%05x) out of range\n", phincdspepp);
+ goto errresmodem;
+ }
+ }
+ /* wait a bit */
+ if (idle_callback(50000)) {
+ reset_modem();
+ retval = 0;
+ goto errresmodem;
+ }
+ lprintf(1, "phase increments: 0x%05x 0x%05x\n", phinceppdsp, phincdspepp);
+ }
+
+errret:
+ lprintf(0, "EPP timeout\n");
+errresmodem:
+ IDirectSoundBuffer_Stop(playbuf);
+ IDirectSoundCaptureBuffer_Stop(recbuf);
+ reset_modem();
+errdscreate4:
+ IDirectSoundBuffer_Release(playbuf);
+errdscreate3:
+ IDirectSoundCaptureBuffer_Release(recbuf);
+errdscreate2:
+ IDirectSoundCapture_Release(dsrec);
+errdscreate1:
+ IDirectSound_Release(dsplay);
+errdscreate:
+ DestroyWindow(hwnd);
+errcreatewin:
+ UnregisterClass("MyClass", hinst);
+ return -1;
+}
+
+#endif /* HAVE_DIRECTX */
+
+/* ---------------------------------------------------------------------- */
+
+const struct eppfpgatests eppfpgatests[] = {
+ { "ram", "tests the on board SRAM", ramtest },
+ { "bled", "tests the on board LED's using boundary scan", ledtest },
+ { "dac", "tests the on board DAC", dactest },
+ { "ppsig", "tests the parallel port signals using boundary scan", ppsigtest },
+ { "led", "tests the CON and STA leds using EPP address write", eppledtest },
+ { "ledfast", "tests the CON and STA leds using fast EPP address write", eppledtest2 },
+ { "berr", "tests the complete adapter", eppmodemtest1 },
+ { "berrv", "tests the complete adapter (verbose)", eppmodemtest2 },
+ { "berrd", "tests the complete adapter (exercises data transfer)", eppmodemtest3 },
+ { "berrdv", "tests the complete adapter (exercises data transfer, verbose)", eppmodemtest4 },
+ { "ccnt", "frequency counter using the check firmware", chkcountertest },
+ { "cdac", "fast DAC test using the check firmware", chkdactest },
+ { "creg", "EPP register read/write test using the check firmware", chkregtest },
+ { "cram", "fast RAM test using the check firmware", chkramtest },
+ { "cled", "LED test using the check firmware", chkledtest },
+ { "cadc", "tests the sigma delta A/D converter", chkadctest },
+ { "ecpled", "tests the CON and STA leds using ECP write", ecpledtest },
+ { "ecpledfast", "tests the CON and STA leds using fast ECP write", ecpledtest2 },
+ { "ecpberr", "tests the complete adapter in ECP mode", ecpmodemtest1 },
+ { "ecpberrv", "tests the complete adapter in ECP mode (verbose)", ecpmodemtest2 },
+ { "ecpberrd", "tests the complete adapter in ECP mode (exercises data transfer)", ecpmodemtest3 },
+ { "ecpberrdv", "tests the complete adapter in ECP mode (exercises data transfer, verbose)", ecpmodemtest4 },
+ { "eppafskled", "tests the CON and STA leds using EPP address write", eppafskledtest },
+ { "eppafskledfast", "tests the CON and STA leds using fast EPP address write", eppafskledtest2 },
+ { "eppafskberr", "tests the complete adapter", eppafskmodemtest1 },
+ { "eppafskberrv", "tests the complete adapter (verbose)", eppafskmodemtest2 },
+ { "eppafskberrd", "tests the complete adapter (exercises data transfer)", eppafskmodemtest3 },
+ { "eppafskberrdv", "tests the complete adapter (exercises data transfer, verbose)", eppafskmodemtest4 },
+ { "eppafsktx0", "transmit AFSK 0 constantly", eppafskmodemtest5 },
+ { "eppafsktx1", "transmit AFSK 1 constantly", eppafskmodemtest6 },
+ { "sppafskled", "tests the CON and STA leds using EPP address write", sppafskledtest },
+ { "sppafskledfast", "tests the CON and STA leds using fast EPP address write", sppafskledtest2 },
+ { "sppafskberr", "tests the complete adapter", sppafskmodemtest1 },
+ { "sppafskberrv", "tests the complete adapter (verbose)", sppafskmodemtest2 },
+ { "sppafskberrd", "tests the complete adapter (exercises data transfer)", sppafskmodemtest3 },
+ { "sppafskberrdv", "tests the complete adapter (exercises data transfer, verbose)", sppafskmodemtest4 },
+ { "sppafsktx0", "transmit AFSK 0 constantly", sppafskmodemtest5 },
+ { "sppafsktx1", "transmit AFSK 1 constantly", sppafskmodemtest6 },
+ { "epprx", "decodes received packets using EPP mode", epprx },
+ { "ecprx", "decodes received packets using ECP mode", ecprx },
+ { "eppafskrx", "decodes received packets using EPP AFSK mode", eppafskrx },
+ { "sppafskrx", "decodes received packets using SPP AFSK mode", sppafskrx },
+ { "sine1k", "generate approx 1k sine using the sample IO firmware", sine1k },
+#if defined(HAVE_LINUX_SOUNDCARD_H) || defined(HAVE_DIRECTX)
+ { "saudio", "generate approx 1k sine using the sample IO firmware", saudio },
+#endif /* HAVE_LINUX_SOUNDCARD_H */
+ { NULL, NULL, NULL }
+};
+
+/* ---------------------------------------------------------------------- */
diff --git a/main/getopt.c b/main/getopt.c
new file mode 100644
index 0000000..a59a013
--- /dev/null
+++ b/main/getopt.c
@@ -0,0 +1,731 @@
+/* Getopt for GNU.
+ NOTE: getopt is now part of the C library, so if you don't know what
+ "Keep this file name-space clean" means, talk to roland at gnu.ai.mit.edu
+ before changing it!
+
+ Copyright (C) 1987, 88, 89, 90, 91, 92, 1993
+ Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/* NOTE!!! AIX requires this to be the first thing in the file.
+ Do not put ANYTHING before it! */
+#if !defined (__GNUC__) && defined (_AIX)
+ #pragma alloca
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef __GNUC__
+#define alloca __builtin_alloca
+#else /* not __GNUC__ */
+#if defined (HAVE_ALLOCA_H) || (defined(sparc) && (defined(sun) || (!defined(USG) && !defined(SVR4) && !defined(__svr4__))))
+#include <alloca.h>
+#else
+#ifndef _AIX
+char *alloca ();
+#endif
+#endif /* alloca.h */
+#endif /* not __GNUC__ */
+
+#if !__STDC__ && !defined(const) && IN_GCC
+#define const
+#endif
+
+/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>. */
+#ifndef _NO_PROTO
+#define _NO_PROTO
+#endif
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+ actually compiling the library itself. This code is part of the GNU C
+ Library, but also included in many other GNU distributions. Compiling
+ and linking in this code is a waste when using the GNU C library
+ (especially if it is a shared library). Rather than having every GNU
+ program understand `configure --with-gnu-libc' and omit the object files,
+ it is simpler to just do this in the source for each such file. */
+
+#if defined (_LIBC) || !defined (__GNU_LIBRARY__)
+
+
+/* This needs to come after some library #include
+ to get __GNU_LIBRARY__ defined. */
+#ifdef __GNU_LIBRARY__
+#undef alloca
+/* Don't include stdlib.h for non-GNU C libraries because some of them
+ contain conflicting prototypes for getopt. */
+#include <stdlib.h>
+#else /* Not GNU C library. */
+#define __alloca alloca
+#endif /* GNU C library. */
+
+/* If GETOPT_COMPAT is defined, `+' as well as `--' can introduce a
+ long-named option. Because this is not POSIX.2 compliant, it is
+ being phased out. */
+/* #define GETOPT_COMPAT */
+
+/* This version of `getopt' appears to the caller like standard Unix `getopt'
+ but it behaves differently for the user, since it allows the user
+ to intersperse the options with the other arguments.
+
+ As `getopt' works, it permutes the elements of ARGV so that,
+ when it is done, all the options precede everything else. Thus
+ all application programs are extended to handle flexible argument order.
+
+ Setting the environment variable POSIXLY_CORRECT disables permutation.
+ Then the behavior is completely standard.
+
+ GNU application programs can use a third alternative mode in which
+ they can distinguish the relative order of options and other arguments. */
+
+#include "getopt.h"
+
+/* For communication from `getopt' to the caller.
+ When `getopt' finds an option that takes an argument,
+ the argument value is returned here.
+ Also, when `ordering' is RETURN_IN_ORDER,
+ each non-option ARGV-element is returned here. */
+
+char *optarg = 0;
+
+/* Index in ARGV of the next element to be scanned.
+ This is used for communication to and from the caller
+ and for communication between successive calls to `getopt'.
+
+ On entry to `getopt', zero means this is the first call; initialize.
+
+ When `getopt' returns EOF, this is the index of the first of the
+ non-option elements that the caller should itself scan.
+
+ Otherwise, `optind' communicates from one call to the next
+ how much of ARGV has been scanned so far. */
+
+/* XXX 1003.2 says this must be 1 before any call. */
+int optind = 0;
+
+/* The next char to be scanned in the option-element
+ in which the last option character we returned was found.
+ This allows us to pick up the scan where we left off.
+
+ If this is zero, or a null string, it means resume the scan
+ by advancing to the next ARGV-element. */
+
+static char *nextchar;
+
+/* Callers store zero here to inhibit the error message
+ for unrecognized options. */
+
+int opterr = 1;
+
+/* Set to an option character which was unrecognized.
+ This must be initialized on some systems to avoid linking in the
+ system's own getopt implementation. */
+
+int optopt = '?';
+
+/* Describe how to deal with options that follow non-option ARGV-elements.
+
+ If the caller did not specify anything,
+ the default is REQUIRE_ORDER if the environment variable
+ POSIXLY_CORRECT is defined, PERMUTE otherwise.
+
+ REQUIRE_ORDER means don't recognize them as options;
+ stop option processing when the first non-option is seen.
+ This is what Unix does.
+ This mode of operation is selected by either setting the environment
+ variable POSIXLY_CORRECT, or using `+' as the first character
+ of the list of option characters.
+
+ PERMUTE is the default. We permute the contents of ARGV as we scan,
+ so that eventually all the non-options are at the end. This allows options
+ to be given in any order, even with programs that were not written to
+ expect this.
+
+ RETURN_IN_ORDER is an option available to programs that were written
+ to expect options and other ARGV-elements in any order and that care about
+ the ordering of the two. We describe each non-option ARGV-element
+ as if it were the argument of an option with character code 1.
+ Using `-' as the first character of the list of option characters
+ selects this mode of operation.
+
+ The special argument `--' forces an end of option-scanning regardless
+ of the value of `ordering'. In the case of RETURN_IN_ORDER, only
+ `--' can cause `getopt' to return EOF with `optind' != ARGC. */
+
+static enum
+{
+ REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
+} ordering;
+
+#ifdef __GNU_LIBRARY__
+/* We want to avoid inclusion of string.h with non-GNU libraries
+ because there are many ways it can cause trouble.
+ On some systems, it contains special magic macros that don't work
+ in GCC. */
+#include <string.h>
+#define my_index strchr
+#define my_bcopy(src, dst, n) memcpy ((dst), (src), (n))
+#else
+
+/* Avoid depending on library functions or files
+ whose names are inconsistent. */
+
+char *getenv ();
+
+static char *
+my_index (str, chr)
+ const char *str;
+ int chr;
+{
+ while (*str)
+ {
+ if (*str == chr)
+ return (char *) str;
+ str++;
+ }
+ return 0;
+}
+
+static void
+my_bcopy (from, to, size)
+ const char *from;
+ char *to;
+ int size;
+{
+ int i;
+ for (i = 0; i < size; i++)
+ to[i] = from[i];
+}
+#endif /* GNU C library. */
+
+/* Handle permutation of arguments. */
+
+/* Describe the part of ARGV that contains non-options that have
+ been skipped. `first_nonopt' is the index in ARGV of the first of them;
+ `last_nonopt' is the index after the last of them. */
+
+static int first_nonopt;
+static int last_nonopt;
+
+/* Exchange two adjacent subsequences of ARGV.
+ One subsequence is elements [first_nonopt,last_nonopt)
+ which contains all the non-options that have been skipped so far.
+ The other is elements [last_nonopt,optind), which contains all
+ the options processed since those non-options were skipped.
+
+ `first_nonopt' and `last_nonopt' are relocated so that they describe
+ the new indices of the non-options in ARGV after they are moved. */
+
+static void
+exchange (argv)
+ char **argv;
+{
+ int nonopts_size = (last_nonopt - first_nonopt) * sizeof (char *);
+ char **temp = (char **) __alloca (nonopts_size);
+
+ /* Interchange the two blocks of data in ARGV. */
+
+ my_bcopy ((char *) &argv[first_nonopt], (char *) temp, nonopts_size);
+ my_bcopy ((char *) &argv[last_nonopt], (char *) &argv[first_nonopt],
+ (optind - last_nonopt) * sizeof (char *));
+ my_bcopy ((char *) temp,
+ (char *) &argv[first_nonopt + optind - last_nonopt],
+ nonopts_size);
+
+ /* Update records for the slots the non-options now occupy. */
+
+ first_nonopt += (optind - last_nonopt);
+ last_nonopt = optind;
+}
+
+/* Scan elements of ARGV (whose length is ARGC) for option characters
+ given in OPTSTRING.
+
+ If an element of ARGV starts with '-', and is not exactly "-" or "--",
+ then it is an option element. The characters of this element
+ (aside from the initial '-') are option characters. If `getopt'
+ is called repeatedly, it returns successively each of the option characters
+ from each of the option elements.
+
+ If `getopt' finds another option character, it returns that character,
+ updating `optind' and `nextchar' so that the next call to `getopt' can
+ resume the scan with the following option character or ARGV-element.
+
+ If there are no more option characters, `getopt' returns `EOF'.
+ Then `optind' is the index in ARGV of the first ARGV-element
+ that is not an option. (The ARGV-elements have been permuted
+ so that those that are not options now come last.)
+
+ OPTSTRING is a string containing the legitimate option characters.
+ If an option character is seen that is not listed in OPTSTRING,
+ return '?' after printing an error message. If you set `opterr' to
+ zero, the error message is suppressed but we still return '?'.
+
+ If a char in OPTSTRING is followed by a colon, that means it wants an arg,
+ so the following text in the same ARGV-element, or the text of the following
+ ARGV-element, is returned in `optarg'. Two colons mean an option that
+ wants an optional arg; if there is text in the current ARGV-element,
+ it is returned in `optarg', otherwise `optarg' is set to zero.
+
+ If OPTSTRING starts with `-' or `+', it requests different methods of
+ handling the non-option ARGV-elements.
+ See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
+
+ Long-named options begin with `--' instead of `-'.
+ Their names may be abbreviated as long as the abbreviation is unique
+ or is an exact match for some defined option. If they have an
+ argument, it follows the option name in the same ARGV-element, separated
+ from the option name by a `=', or else the in next ARGV-element.
+ When `getopt' finds a long-named option, it returns 0 if that option's
+ `flag' field is nonzero, the value of the option's `val' field
+ if the `flag' field is zero.
+
+ The elements of ARGV aren't really const, because we permute them.
+ But we pretend they're const in the prototype to be compatible
+ with other systems.
+
+ LONGOPTS is a vector of `struct option' terminated by an
+ element containing a name which is zero.
+
+ LONGIND returns the index in LONGOPT of the long-named option found.
+ It is only valid when a long-named option has been found by the most
+ recent call.
+
+ If LONG_ONLY is nonzero, '-' as well as '--' can introduce
+ long-named options. */
+
+int
+_getopt_internal (argc, argv, optstring, longopts, longind, long_only)
+ int argc;
+ char *const *argv;
+ const char *optstring;
+ const struct option *longopts;
+ int *longind;
+ int long_only;
+{
+ int option_index;
+
+ optarg = 0;
+
+ /* Initialize the internal data when the first call is made.
+ Start processing options with ARGV-element 1 (since ARGV-element 0
+ is the program name); the sequence of previously skipped
+ non-option ARGV-elements is empty. */
+
+ if (optind == 0)
+ {
+ first_nonopt = last_nonopt = optind = 1;
+
+ nextchar = NULL;
+
+ /* Determine how to handle the ordering of options and nonoptions. */
+
+ if (optstring[0] == '-')
+ {
+ ordering = RETURN_IN_ORDER;
+ ++optstring;
+ }
+ else if (optstring[0] == '+')
+ {
+ ordering = REQUIRE_ORDER;
+ ++optstring;
+ }
+ else if (getenv ("POSIXLY_CORRECT") != NULL)
+ ordering = REQUIRE_ORDER;
+ else
+ ordering = PERMUTE;
+ }
+
+ if (nextchar == NULL || *nextchar == '\0')
+ {
+ if (ordering == PERMUTE)
+ {
+ /* If we have just processed some options following some non-options,
+ exchange them so that the options come first. */
+
+ if (first_nonopt != last_nonopt && last_nonopt != optind)
+ exchange ((char **) argv);
+ else if (last_nonopt != optind)
+ first_nonopt = optind;
+
+ /* Now skip any additional non-options
+ and extend the range of non-options previously skipped. */
+
+ while (optind < argc
+ && (argv[optind][0] != '-' || argv[optind][1] == '\0')
+#ifdef GETOPT_COMPAT
+ && (longopts == NULL
+ || argv[optind][0] != '+' || argv[optind][1] == '\0')
+#endif /* GETOPT_COMPAT */
+ )
+ optind++;
+ last_nonopt = optind;
+ }
+
+ /* Special ARGV-element `--' means premature end of options.
+ Skip it like a null option,
+ then exchange with previous non-options as if it were an option,
+ then skip everything else like a non-option. */
+
+ if (optind != argc && !strcmp (argv[optind], "--"))
+ {
+ optind++;
+
+ if (first_nonopt != last_nonopt && last_nonopt != optind)
+ exchange ((char **) argv);
+ else if (first_nonopt == last_nonopt)
+ first_nonopt = optind;
+ last_nonopt = argc;
+
+ optind = argc;
+ }
+
+ /* If we have done all the ARGV-elements, stop the scan
+ and back over any non-options that we skipped and permuted. */
+
+ if (optind == argc)
+ {
+ /* Set the next-arg-index to point at the non-options
+ that we previously skipped, so the caller will digest them. */
+ if (first_nonopt != last_nonopt)
+ optind = first_nonopt;
+ return EOF;
+ }
+
+ /* If we have come to a non-option and did not permute it,
+ either stop the scan or describe it to the caller and pass it by. */
+
+ if ((argv[optind][0] != '-' || argv[optind][1] == '\0')
+#ifdef GETOPT_COMPAT
+ && (longopts == NULL
+ || argv[optind][0] != '+' || argv[optind][1] == '\0')
+#endif /* GETOPT_COMPAT */
+ )
+ {
+ if (ordering == REQUIRE_ORDER)
+ return EOF;
+ optarg = argv[optind++];
+ return 1;
+ }
+
+ /* We have found another option-ARGV-element.
+ Start decoding its characters. */
+
+ nextchar = (argv[optind] + 1
+ + (longopts != NULL && argv[optind][1] == '-'));
+ }
+
+ if (longopts != NULL
+ && ((argv[optind][0] == '-'
+ && (argv[optind][1] == '-' || long_only))
+#ifdef GETOPT_COMPAT
+ || argv[optind][0] == '+'
+#endif /* GETOPT_COMPAT */
+ ))
+ {
+ const struct option *p;
+ char *s = nextchar;
+ int exact = 0;
+ int ambig = 0;
+ const struct option *pfound = NULL;
+ int indfound;
+
+ while (*s && *s != '=')
+ s++;
+
+ /* Test all options for either exact match or abbreviated matches. */
+ for (p = longopts, option_index = 0; p->name;
+ p++, option_index++)
+ if (!strncmp (p->name, nextchar, s - nextchar))
+ {
+ if (s - nextchar == strlen (p->name))
+ {
+ /* Exact match found. */
+ pfound = p;
+ indfound = option_index;
+ exact = 1;
+ break;
+ }
+ else if (pfound == NULL)
+ {
+ /* First nonexact match found. */
+ pfound = p;
+ indfound = option_index;
+ }
+ else
+ /* Second nonexact match found. */
+ ambig = 1;
+ }
+
+ if (ambig && !exact)
+ {
+ if (opterr)
+ fprintf (stderr, "%s: option `%s' is ambiguous\n",
+ argv[0], argv[optind]);
+ nextchar += strlen (nextchar);
+ optind++;
+ return '?';
+ }
+
+ if (pfound != NULL)
+ {
+ option_index = indfound;
+ optind++;
+ if (*s)
+ {
+ /* Don't test has_arg with >, because some C compilers don't
+ allow it to be used on enums. */
+ if (pfound->has_arg)
+ optarg = s + 1;
+ else
+ {
+ if (opterr)
+ {
+ if (argv[optind - 1][1] == '-')
+ /* --option */
+ fprintf (stderr,
+ "%s: option `--%s' doesn't allow an argument\n",
+ argv[0], pfound->name);
+ else
+ /* +option or -option */
+ fprintf (stderr,
+ "%s: option `%c%s' doesn't allow an argument\n",
+ argv[0], argv[optind - 1][0], pfound->name);
+ }
+ nextchar += strlen (nextchar);
+ return '?';
+ }
+ }
+ else if (pfound->has_arg == 1)
+ {
+ if (optind < argc)
+ optarg = argv[optind++];
+ else
+ {
+ if (opterr)
+ fprintf (stderr, "%s: option `%s' requires an argument\n",
+ argv[0], argv[optind - 1]);
+ nextchar += strlen (nextchar);
+ return optstring[0] == ':' ? ':' : '?';
+ }
+ }
+ nextchar += strlen (nextchar);
+ if (longind != NULL)
+ *longind = option_index;
+ if (pfound->flag)
+ {
+ *(pfound->flag) = pfound->val;
+ return 0;
+ }
+ return pfound->val;
+ }
+ /* Can't find it as a long option. If this is not getopt_long_only,
+ or the option starts with '--' or is not a valid short
+ option, then it's an error.
+ Otherwise interpret it as a short option. */
+ if (!long_only || argv[optind][1] == '-'
+#ifdef GETOPT_COMPAT
+ || argv[optind][0] == '+'
+#endif /* GETOPT_COMPAT */
+ || my_index (optstring, *nextchar) == NULL)
+ {
+ if (opterr)
+ {
+ if (argv[optind][1] == '-')
+ /* --option */
+ fprintf (stderr, "%s: unrecognized option `--%s'\n",
+ argv[0], nextchar);
+ else
+ /* +option or -option */
+ fprintf (stderr, "%s: unrecognized option `%c%s'\n",
+ argv[0], argv[optind][0], nextchar);
+ }
+ nextchar = (char *) "";
+ optind++;
+ return '?';
+ }
+ }
+
+ /* Look at and handle the next option-character. */
+
+ {
+ char c = *nextchar++;
+ char *temp = my_index (optstring, c);
+
+ /* Increment `optind' when we start to process its last character. */
+ if (*nextchar == '\0')
+ ++optind;
+
+ if (temp == NULL || c == ':')
+ {
+ if (opterr)
+ {
+#if 0
+ if (c < 040 || c >= 0177)
+ fprintf (stderr, "%s: unrecognized option, character code 0%o\n",
+ argv[0], c);
+ else
+ fprintf (stderr, "%s: unrecognized option `-%c'\n", argv[0], c);
+#else
+ /* 1003.2 specifies the format of this message. */
+ fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c);
+#endif
+ }
+ optopt = c;
+ return '?';
+ }
+ if (temp[1] == ':')
+ {
+ if (temp[2] == ':')
+ {
+ /* This is an option that accepts an argument optionally. */
+ if (*nextchar != '\0')
+ {
+ optarg = nextchar;
+ optind++;
+ }
+ else
+ optarg = 0;
+ nextchar = NULL;
+ }
+ else
+ {
+ /* This is an option that requires an argument. */
+ if (*nextchar != '\0')
+ {
+ optarg = nextchar;
+ /* If we end this ARGV-element by taking the rest as an arg,
+ we must advance to the next element now. */
+ optind++;
+ }
+ else if (optind == argc)
+ {
+ if (opterr)
+ {
+#if 0
+ fprintf (stderr, "%s: option `-%c' requires an argument\n",
+ argv[0], c);
+#else
+ /* 1003.2 specifies the format of this message. */
+ fprintf (stderr, "%s: option requires an argument -- %c\n",
+ argv[0], c);
+#endif
+ }
+ optopt = c;
+ if (optstring[0] == ':')
+ c = ':';
+ else
+ c = '?';
+ }
+ else
+ /* We already incremented `optind' once;
+ increment it again when taking next ARGV-elt as argument. */
+ optarg = argv[optind++];
+ nextchar = NULL;
+ }
+ }
+ return c;
+ }
+}
+
+int
+getopt (argc, argv, optstring)
+ int argc;
+ char *const *argv;
+ const char *optstring;
+{
+ return _getopt_internal (argc, argv, optstring,
+ (const struct option *) 0,
+ (int *) 0,
+ 0);
+}
+
+#endif /* _LIBC or not __GNU_LIBRARY__. */
+
+#ifdef TEST
+
+/* Compile with -DTEST to make an executable for use in testing
+ the above definition of `getopt'. */
+
+int
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ int c;
+ int digit_optind = 0;
+
+ while (1)
+ {
+ int this_option_optind = optind ? optind : 1;
+
+ c = getopt (argc, argv, "abc:d:0123456789");
+ if (c == EOF)
+ break;
+
+ switch (c)
+ {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if (digit_optind != 0 && digit_optind != this_option_optind)
+ printf ("digits occur in two different argv-elements.\n");
+ digit_optind = this_option_optind;
+ printf ("option %c\n", c);
+ break;
+
+ case 'a':
+ printf ("option a\n");
+ break;
+
+ case 'b':
+ printf ("option b\n");
+ break;
+
+ case 'c':
+ printf ("option c with value `%s'\n", optarg);
+ break;
+
+ case '?':
+ break;
+
+ default:
+ printf ("?? getopt returned character code 0%o ??\n", c);
+ }
+ }
+
+ if (optind < argc)
+ {
+ printf ("non-option ARGV-elements: ");
+ while (optind < argc)
+ printf ("%s ", argv[optind++]);
+ printf ("\n");
+ }
+
+ exit (0);
+}
+
+#endif /* TEST */
diff --git a/main/getopt.h b/main/getopt.h
new file mode 100644
index 0000000..45541f5
--- /dev/null
+++ b/main/getopt.h
@@ -0,0 +1,129 @@
+/* Declarations for getopt.
+ Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#ifndef _GETOPT_H
+#define _GETOPT_H 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* For communication from `getopt' to the caller.
+ When `getopt' finds an option that takes an argument,
+ the argument value is returned here.
+ Also, when `ordering' is RETURN_IN_ORDER,
+ each non-option ARGV-element is returned here. */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+ This is used for communication to and from the caller
+ and for communication between successive calls to `getopt'.
+
+ On entry to `getopt', zero means this is the first call; initialize.
+
+ When `getopt' returns EOF, this is the index of the first of the
+ non-option elements that the caller should itself scan.
+
+ Otherwise, `optind' communicates from one call to the next
+ how much of ARGV has been scanned so far. */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+ for unrecognized options. */
+
+extern int opterr;
+
+/* Set to an option character which was unrecognized. */
+
+extern int optopt;
+
+/* Describe the long-named options requested by the application.
+ The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+ of `struct option' terminated by an element containing a name which is
+ zero.
+
+ The field `has_arg' is:
+ no_argument (or 0) if the option does not take an argument,
+ required_argument (or 1) if the option requires an argument,
+ optional_argument (or 2) if the option takes an optional argument.
+
+ If the field `flag' is not NULL, it points to a variable that is set
+ to the value given in the field `val' when the option is found, but
+ left unchanged if the option is not found.
+
+ To have a long-named option do something other than set an `int' to
+ a compiled-in constant, such as set a value from `optarg', set the
+ option's `flag' field to zero and its `val' field to a nonzero
+ value (the equivalent single-letter option character, if there is
+ one). For long options that have a zero `flag' field, `getopt'
+ returns the contents of the `val' field. */
+
+struct option
+{
+#if __STDC__
+ const char *name;
+#else
+ char *name;
+#endif
+ /* has_arg can't be an enum because some compilers complain about
+ type mismatches in all the code that assumes it is an int. */
+ int has_arg;
+ int *flag;
+ int val;
+};
+
+/* Names for the values of the `has_arg' field of `struct option'. */
+
+#define no_argument 0
+#define required_argument 1
+#define optional_argument 2
+
+#if __STDC__
+#if defined(__GNU_LIBRARY__)
+/* Many other libraries have conflicting prototypes for getopt, with
+ differences in the consts, in stdlib.h. To avoid compilation
+ errors, only prototype getopt for the GNU C library. */
+extern int getopt (int argc, char *const *argv, const char *shortopts);
+#else /* not __GNU_LIBRARY__ */
+extern int getopt ();
+#endif /* not __GNU_LIBRARY__ */
+extern int getopt_long (int argc, char *const *argv, const char *shortopts,
+ const struct option *longopts, int *longind);
+extern int getopt_long_only (int argc, char *const *argv,
+ const char *shortopts,
+ const struct option *longopts, int *longind);
+
+/* Internal only. Users should not call this directly. */
+extern int _getopt_internal (int argc, char *const *argv,
+ const char *shortopts,
+ const struct option *longopts, int *longind,
+ int long_only);
+#else /* not __STDC__ */
+extern int getopt ();
+extern int getopt_long ();
+extern int getopt_long_only ();
+
+extern int _getopt_internal ();
+#endif /* not __STDC__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GETOPT_H */
diff --git a/main/getopt1.c b/main/getopt1.c
new file mode 100644
index 0000000..a32615c
--- /dev/null
+++ b/main/getopt1.c
@@ -0,0 +1,176 @@
+/* getopt_long and getopt_long_only entry points for GNU getopt.
+ Copyright (C) 1987, 88, 89, 90, 91, 92, 1993
+ Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "getopt.h"
+
+#if !__STDC__ && !defined(const) && IN_GCC
+#define const
+#endif
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+ actually compiling the library itself. This code is part of the GNU C
+ Library, but also included in many other GNU distributions. Compiling
+ and linking in this code is a waste when using the GNU C library
+ (especially if it is a shared library). Rather than having every GNU
+ program understand `configure --with-gnu-libc' and omit the object files,
+ it is simpler to just do this in the source for each such file. */
+
+#if defined (_LIBC) || !defined (__GNU_LIBRARY__)
+
+
+/* This needs to come after some library #include
+ to get __GNU_LIBRARY__ defined. */
+#ifdef __GNU_LIBRARY__
+#include <stdlib.h>
+#else
+char *getenv ();
+#endif
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+int
+getopt_long (argc, argv, options, long_options, opt_index)
+ int argc;
+ char *const *argv;
+ const char *options;
+ const struct option *long_options;
+ int *opt_index;
+{
+ return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
+}
+
+/* Like getopt_long, but '-' as well as '--' can indicate a long option.
+ If an option that starts with '-' (not '--') doesn't match a long option,
+ but does match a short option, it is parsed as a short option
+ instead. */
+
+int
+getopt_long_only (argc, argv, options, long_options, opt_index)
+ int argc;
+ char *const *argv;
+ const char *options;
+ const struct option *long_options;
+ int *opt_index;
+{
+ return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
+}
+
+
+#endif /* _LIBC or not __GNU_LIBRARY__. */
+
+#ifdef TEST
+
+#include <stdio.h>
+
+int
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ int c;
+ int digit_optind = 0;
+
+ while (1)
+ {
+ int this_option_optind = optind ? optind : 1;
+ int option_index = 0;
+ static struct option long_options[] =
+ {
+ {"add", 1, 0, 0},
+ {"append", 0, 0, 0},
+ {"delete", 1, 0, 0},
+ {"verbose", 0, 0, 0},
+ {"create", 0, 0, 0},
+ {"file", 1, 0, 0},
+ {0, 0, 0, 0}
+ };
+
+ c = getopt_long (argc, argv, "abc:d:0123456789",
+ long_options, &option_index);
+ if (c == EOF)
+ break;
+
+ switch (c)
+ {
+ case 0:
+ printf ("option %s", long_options[option_index].name);
+ if (optarg)
+ printf (" with arg %s", optarg);
+ printf ("\n");
+ break;
+
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if (digit_optind != 0 && digit_optind != this_option_optind)
+ printf ("digits occur in two different argv-elements.\n");
+ digit_optind = this_option_optind;
+ printf ("option %c\n", c);
+ break;
+
+ case 'a':
+ printf ("option a\n");
+ break;
+
+ case 'b':
+ printf ("option b\n");
+ break;
+
+ case 'c':
+ printf ("option c with value `%s'\n", optarg);
+ break;
+
+ case 'd':
+ printf ("option d with value `%s'\n", optarg);
+ break;
+
+ case '?':
+ break;
+
+ default:
+ printf ("?? getopt returned character code 0%o ??\n", c);
+ }
+ }
+
+ if (optind < argc)
+ {
+ printf ("non-option ARGV-elements: ");
+ while (optind < argc)
+ printf ("%s ", argv[optind++]);
+ printf ("\n");
+ }
+
+ exit (0);
+}
+
+#endif /* TEST */
diff --git a/main/openpty.c b/main/openpty.c
new file mode 100644
index 0000000..7948e7f
--- /dev/null
+++ b/main/openpty.c
@@ -0,0 +1,88 @@
+/*****************************************************************************/
+
+/*
+ * openpty.c -- openpty.
+ *
+ * From glibc2, Copyright (C) Free Software Foundation
+ * Modified by Thomas Sailer, sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <termios.h>
+#include <fcntl.h>
+#include <grp.h>
+#include <errno.h>
+
+int openpty(int *amaster, int *aslave, char *name, struct termios *termp, struct winsize *winp)
+{
+ char line[11];
+ const char *cp1, *cp2;
+ int master, slave, ttygid;
+ struct group *gr;
+
+ strcpy (line, "/dev/ptyXX");
+ if (gr = getgrnam("tty"))
+ ttygid = gr->gr_gid;
+ else
+ ttygid = -1;
+ for (cp1 = "pqrs"; *cp1; cp1++) {
+ line[8] = *cp1;
+ for (cp2 = "0123456789abcdef"; *cp2; cp2++) {
+ line[9] = *cp2;
+ if ((master = open(line, O_RDWR, 0)) == -1) {
+ if (errno == ENOENT)
+ return (-1); /* out of ptys */
+ } else {
+ line[5] = 't';
+ (void)chown(line, getuid(), ttygid);
+ (void)chmod(line, S_IRUSR|S_IWUSR|S_IWGRP);
+#ifdef HAVE_REVOKE
+ revoke(line);
+#endif
+ if ((slave = open(line, O_RDWR, 0)) != -1) {
+ *amaster = master;
+ *aslave = slave;
+ if (name)
+ strcpy(name, line);
+ if (termp)
+ (void)tcsetattr(slave, TCSAFLUSH, termp);
+ if (winp)
+ (void)ioctl(slave, TIOCSWINSZ, (char *)winp);
+ return 0;
+ }
+ (void)close(master);
+ line[5] = 'p';
+ }
+ }
+ }
+ errno = ENOENT; /* out of ptys */
+ return -1;
+}
diff --git a/main/parport.h b/main/parport.h
new file mode 100644
index 0000000..03c2fcc
--- /dev/null
+++ b/main/parport.h
@@ -0,0 +1,217 @@
+/*****************************************************************************/
+
+/*
+ * parport.h -- FPGA test library exports (and imports).
+ *
+ * Copyright (C) 1998, 2000 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifndef _PARPORT_H
+#define _PARPORT_H
+
+/* ---------------------------------------------------------------------- */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "sysdeps.h"
+
+/* ---------------------------------------------------------------------- */
+
+/* LPT control register */
+#define LPTCTRL_PROGRAM 0x04 /* 0 to reprogram */
+#define LPTCTRL_WRITE 0x01
+#define LPTCTRL_ADDRSTB 0x08
+#define LPTCTRL_DATASTB 0x02
+#define LPTCTRL_INTEN 0x10
+#define LPTCTRL_DIRECTION 0x20
+
+/* LPT status register */
+#define LPTSTAT_SHIFT_NINTR 6
+#define LPTSTAT_WAIT 0x80
+#define LPTSTAT_NINTR (1<<LPTSTAT_SHIFT_NINTR)
+#define LPTSTAT_PE 0x20
+#define LPTSTAT_DONE 0x10
+#define LPTSTAT_NERROR 0x08
+#define LPTSTAT_EPPTIMEOUT 0x01
+
+/* ECP device status register */
+#define LPTDSR_PERIPHACK 0x80 /* inv */
+#define LPTDSR_NACK 0x40 /* noninv */
+#define LPTDSR_NACKREVERSE 0x20 /* noninv */
+#define LPTDSR_SELECT 0x10 /* noninv */
+#define LPTDSR_NPERIPHREQ 0x08 /* noninv */
+
+/* ECP device control register */
+#define LPTDCR_DIRECTION 0x20 /* reverse dir when set */
+#define LPTDCR_ACKINTEN 0x10 /* enable int on rising edge of nAck */
+#define LPTDCR_1284MODE 0x08 /* inv */
+#define LPTDCR_NREVERSEREQ 0x04 /* noninv */
+#define LPTDCR_HOSTACK 0x02 /* inv */
+#define LPTDCR_STROBE 0x01 /* inv */
+
+/* EPP status register */
+#define EPP_DCDBIT 0x80
+#define EPP_PTTBIT 0x08
+#define EPP_NREF 0x01
+#define EPP_NRAEF 0x02
+#define EPP_NRHF 0x04
+#define EPP_NTHF 0x20
+#define EPP_NTAEF 0x10
+#define EPP_NTEF EPP_PTTBIT
+
+/* EPP control register */
+#define EPP_TX_FIFO_ENABLE 0x10
+#define EPP_RX_FIFO_ENABLE 0x08
+#define EPP_MODEM_ENABLE 0x20
+#define EPP_LED_STA 0x80
+#define EPP_LED_CON 0x40
+#define EPP_LEDS (EPP_LED_STA|EPP_LED_CON)
+#define EPP_IRQ_ENABLE 0x10
+
+#define PARPORT_CONTROL_STROBE 0x1
+#define PARPORT_CONTROL_AUTOFD 0x2
+#define PARPORT_CONTROL_INIT 0x4
+#define PARPORT_CONTROL_SELECT 0x8
+#define PARPORT_CONTROL_INTEN 0x10
+#define PARPORT_CONTROL_DIRECTION 0x20
+
+#define PARPORT_STATUS_ERROR 0x8
+#define PARPORT_STATUS_SELECT 0x10
+#define PARPORT_STATUS_PAPEROUT 0x20
+#define PARPORT_STATUS_ACK 0x40
+#define PARPORT_STATUS_BUSY 0x80
+
+/* ---------------------------------------------------------------------- */
+
+/* change mode constants */
+
+#define PARPORT_MODE_PCSPP (1<<0)
+#define PARPORT_MODE_PCPS2 (1<<1)
+#define PARPORT_MODE_PCEPP (1<<2)
+#define PARPORT_MODE_PCECR (1<<3) /* ECR Register Exists */
+#define PARPORT_MODE_PCECP (1<<4)
+#define PARPORT_MODE_PCECPEPP (1<<5)
+#define PARPORT_MODE_PCECPPS2 (1<<6)
+
+/* ---------------------------------------------------------------------- */
+
+struct parport_ops {
+ unsigned char (*parport_read_data)(void);
+ void (*parport_write_data)(unsigned char d);
+ unsigned char (*parport_read_status)(void);
+ unsigned char (*parport_read_control)(void);
+ void (*parport_write_control)(unsigned char d);
+ void (*parport_frob_control)(unsigned char mask, unsigned char val);
+ unsigned (*parport_epp_write_data)(const void *buf, unsigned sz);
+ unsigned (*parport_epp_read_data)(void *buf, unsigned sz);
+ unsigned (*parport_epp_write_addr)(const void *buf, unsigned sz);
+ unsigned (*parport_epp_read_addr)(void *buf, unsigned sz);
+ unsigned (*parport_ecp_write_data)(const void *buf, unsigned sz);
+ unsigned (*parport_ecp_read_data)(void *buf, unsigned sz);
+ unsigned (*parport_ecp_write_addr)(const void *buf, unsigned sz);
+ unsigned (*parport_fpgaconfig_write)(const void *buf, unsigned sz);
+};
+
+extern struct parport_ops parport_ops;
+
+/* ---------------------------------------------------------------------- */
+
+extern inline unsigned char parport_read_data(void) {
+ return parport_ops.parport_read_data();
+}
+
+extern inline void parport_write_data(unsigned char d) {
+ parport_ops.parport_write_data(d);
+}
+
+extern inline unsigned char parport_read_status(void) {
+ return parport_ops.parport_read_status();
+}
+
+extern inline unsigned char parport_read_control(void) {
+ return parport_ops.parport_read_control();
+}
+
+extern inline void parport_write_control(unsigned char d) {
+ parport_ops.parport_write_control(d);
+}
+
+extern inline void parport_frob_control(unsigned char mask, unsigned char val) {
+ parport_ops.parport_frob_control(mask, val);
+}
+
+extern inline unsigned parport_epp_write_data(const void *buf, unsigned sz) {
+ return parport_ops.parport_epp_write_data(buf, sz);
+}
+
+extern inline unsigned parport_epp_read_data(void *buf, unsigned sz) {
+ return parport_ops.parport_epp_read_data(buf, sz);
+}
+
+extern inline unsigned parport_epp_write_addr(const void *buf, unsigned sz) {
+ return parport_ops.parport_epp_write_addr(buf, sz);
+}
+
+extern inline unsigned parport_epp_read_addr(void *buf, unsigned sz) {
+ return parport_ops.parport_epp_read_addr(buf, sz);
+}
+
+extern inline unsigned parport_ecp_write_data(const void *buf, unsigned sz) {
+ return parport_ops.parport_ecp_write_data(buf, sz);
+}
+
+extern inline unsigned parport_ecp_read_data(void *buf, unsigned sz) {
+ return parport_ops.parport_ecp_read_data(buf, sz);
+}
+
+extern inline unsigned parport_ecp_write_addr(const void *buf, unsigned sz) {
+ return parport_ops.parport_ecp_write_addr(buf, sz);
+}
+
+extern inline unsigned parport_fpgaconfig_write(const void *buf, unsigned sz) {
+ return parport_ops.parport_fpgaconfig_write(buf, sz);
+}
+
+/* ---------------------------------------------------------------------- */
+
+#define PPFLAG_SWEMULEPP 1
+#define PPFLAG_SWEMULECP 2
+#define PPFLAG_FORCEHWEPP 4
+
+extern int parport_init_direct(unsigned io);
+extern int parport_init_direct_flags(unsigned io, unsigned int flags);
+extern int parport_init_ppuser(const char *path);
+extern int parport_init_ppdev(const char *path);
+extern int parport_init_ppkdrv(const char *ifname);
+extern int parport_init_ntddkgenport(void);
+extern int parport_init_win(unsigned int portnr);
+extern int parport_init_win_flags(unsigned int portnr, unsigned int flags);
+extern void parport_stop_win(void);
+extern int parport_init_w9xring0(unsigned int portnr);
+extern int parport_init_w9xring0_flags(unsigned int portnr, unsigned int flags);
+
+/* ---------------------------------------------------------------------- */
+#endif /* _PARPORT_H */
diff --git a/main/ppdev.c b/main/ppdev.c
new file mode 100644
index 0000000..290eab8
--- /dev/null
+++ b/main/ppdev.c
@@ -0,0 +1,235 @@
+/*****************************************************************************/
+
+/*
+ * ppdev.c -- Parport access via Linux PPDEV device.
+ *
+ * Copyright (C) 1998-1999 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#include <sys/ioctl.h>
+#include <unistd.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+#include "ppdev.h"
+
+/* ---------------------------------------------------------------------- */
+
+int pp_dev_fd = -1;
+int pp_dev_mode;
+
+/* ---------------------------------------------------------------------- */
+
+void parport_dev_exit(void)
+{
+ if (pp_dev_fd != -1) {
+ ioctl(pp_dev_fd, PPRELEASE, 0);
+ close(pp_dev_fd);
+ }
+ pp_dev_fd = -1;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static void setmode(int newmode)
+{
+ int datadir = 0;
+
+ if (newmode == pp_dev_mode)
+ return;
+ pp_dev_mode = newmode;
+ ioctl(pp_dev_fd, PPSETMODE, &pp_dev_mode);
+ if (pp_dev_mode == IEEE1284_MODE_COMPAT)
+ ioctl(pp_dev_fd, PPDATADIR, &datadir);
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned char parport_dev_read_data(void)
+{
+ unsigned char r;
+
+ ioctl(pp_dev_fd, PPRDATA, &r);
+ return r;
+}
+
+void parport_dev_write_data(unsigned char d)
+{
+ setmode(IEEE1284_MODE_COMPAT);
+ ioctl(pp_dev_fd, PPWDATA, &d);
+}
+
+unsigned char parport_dev_read_status(void)
+{
+ unsigned char r;
+
+ ioctl(pp_dev_fd, PPRSTATUS, &r);
+ return r;
+}
+
+
+unsigned char parport_dev_read_control(void)
+{
+ unsigned char r;
+
+ ioctl(pp_dev_fd, PPRCONTROL, &r);
+ return r;
+}
+
+void parport_dev_write_control(unsigned char d)
+{
+ ioctl(pp_dev_fd, PPWCONTROL, &d);
+}
+
+void parport_dev_frob_control(unsigned char mask, unsigned char val)
+{
+ struct ppdev_frob_struct f = { mask, val };
+
+ ioctl(pp_dev_fd, PPFCONTROL, &f);
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_dev_epp_write_data(const void *buf, unsigned sz)
+{
+ ssize_t ret;
+
+ setmode(IEEE1284_MODE_EPP | IEEE1284_DATA);
+ ret = write(pp_dev_fd, buf, sz);
+ if (ret < 0)
+ return 0;
+ return ret;
+}
+
+unsigned parport_dev_epp_read_data(void *buf, unsigned sz)
+{
+ ssize_t ret;
+
+ setmode(IEEE1284_MODE_EPP | IEEE1284_DATA);
+ ret = read(pp_dev_fd, buf, sz);
+ if (ret < 0)
+ return 0;
+ return ret;
+}
+
+unsigned parport_dev_epp_write_addr(const void *buf, unsigned sz)
+{
+ ssize_t ret;
+
+ setmode(IEEE1284_MODE_EPP | IEEE1284_ADDR);
+ ret = write(pp_dev_fd, buf, sz);
+ if (ret < 0)
+ return 0;
+ return ret;
+}
+
+unsigned parport_dev_epp_read_addr(void *buf, unsigned sz)
+{
+ ssize_t ret;
+
+ setmode(IEEE1284_MODE_EPP | IEEE1284_ADDR);
+ ret = read(pp_dev_fd, buf, sz);
+ if (ret < 0)
+ return 0;
+ return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_dev_ecp_write_data(const void *buf, unsigned sz)
+{
+ ssize_t ret;
+
+ setmode(IEEE1284_MODE_ECP | IEEE1284_DATA);
+ ret = write(pp_dev_fd, buf, sz);
+ if (ret < 0)
+ return 0;
+ return ret;
+}
+
+unsigned parport_dev_ecp_write_addr(const void *buf, unsigned sz)
+{
+ ssize_t ret;
+
+ setmode(IEEE1284_MODE_ECP | IEEE1284_ADDR);
+ ret = write(pp_dev_fd, buf, sz);
+ if (ret < 0)
+ return 0;
+ return ret;
+}
+
+unsigned parport_dev_ecp_read_data(void *buf, unsigned sz)
+{
+ ssize_t ret;
+
+ setmode(IEEE1284_MODE_ECP | IEEE1284_DATA);
+ ret = read(pp_dev_fd, buf, sz);
+ if (ret < 0)
+ return 0;
+ return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_dev_fpgaconfig_write(const void *buf, unsigned sz)
+{
+#if 1
+ const unsigned char *bp = buf;
+ unsigned u;
+
+ for (u = 0; u < sz; u++, bp++)
+ parport_dev_write_data(*bp);
+ return sz;
+#else
+ ssize_t ret;
+
+ setmode(IEEE1284_MODE_COMPAT);
+ ret = write(pp_dev_fd, buf, sz);
+ if (ret < 0)
+ return 0;
+ return ret;
+#endif
+}
+
+/* ---------------------------------------------------------------------- */
+
+const struct parport_ops parport_dev_ops = {
+ parport_dev_read_data,
+ parport_dev_write_data,
+ parport_dev_read_status,
+ parport_dev_read_control,
+ parport_dev_write_control,
+ parport_dev_frob_control,
+ parport_dev_epp_write_data,
+ parport_dev_epp_read_data,
+ parport_dev_epp_write_addr,
+ parport_dev_epp_read_addr,
+ parport_dev_ecp_write_data,
+ parport_dev_ecp_read_data,
+ parport_dev_ecp_write_addr,
+ parport_dev_fpgaconfig_write
+};
+
+/* ---------------------------------------------------------------------- */
diff --git a/main/ppdev.h b/main/ppdev.h
new file mode 100644
index 0000000..4de2f79
--- /dev/null
+++ b/main/ppdev.h
@@ -0,0 +1,102 @@
+/*
+ * linux/drivers/char/ppdev.h
+ *
+ * User-space parallel port device driver (header file).
+ *
+ * Copyright (C) 1998-9 Tim Waugh <tim at cyberelk.demon.co.uk>
+ *
+ * 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.
+ *
+ */
+
+#define PP_MAJOR 99
+
+#define PP_IOCTL 'p'
+
+/* Set mode for read/write (e.g. IEEE1284_MODE_EPP) */
+#define PPSETMODE _IOW(PP_IOCTL, 0x80, int)
+
+/* Read status */
+#define PPRSTATUS _IOR(PP_IOCTL, 0x81, unsigned char)
+#define PPWSTATUS OBSOLETE__IOW(PP_IOCTL, 0x82, unsigned char)
+
+/* Read/write control */
+#define PPRCONTROL _IOR(PP_IOCTL, 0x83, unsigned char)
+#define PPWCONTROL _IOW(PP_IOCTL, 0x84, unsigned char)
+
+struct ppdev_frob_struct {
+ unsigned char mask;
+ unsigned char val;
+};
+#define PPFCONTROL _IOW(PP_IOCTL, 0x8e, struct ppdev_frob_struct)
+
+/* Read/write data */
+#define PPRDATA _IOR(PP_IOCTL, 0x85, unsigned char)
+#define PPWDATA _IOW(PP_IOCTL, 0x86, unsigned char)
+
+/* Read/write econtrol (not used) */
+#define PPRECONTROL OBSOLETE__IOR(PP_IOCTL, 0x87, unsigned char)
+#define PPWECONTROL OBSOLETE__IOW(PP_IOCTL, 0x88, unsigned char)
+
+/* Read/write FIFO (not used) */
+#define PPRFIFO OBSOLETE__IOR(PP_IOCTL, 0x89, unsigned char)
+#define PPWFIFO OBSOLETE__IOW(PP_IOCTL, 0x8a, unsigned char)
+
+/* Claim the port to start using it */
+#define PPCLAIM _IO(PP_IOCTL, 0x8b)
+
+/* Release the port when you aren't using it */
+#define PPRELEASE _IO(PP_IOCTL, 0x8c)
+
+/* Yield the port (release it if another driver is waiting,
+ * then reclaim) */
+#define PPYIELD _IO(PP_IOCTL, 0x8d)
+
+/* Register device exclusively (must be before PPCLAIM). */
+#define PPEXCL _IO(PP_IOCTL, 0x8f)
+
+/* Data line direction: non-zero for input mode. */
+#define PPDATADIR _IOW(PP_IOCTL, 0x90, int)
+
+/* Negotiate a particular IEEE 1284 mode. */
+#define PPNEGOT _IOW(PP_IOCTL, 0x91, int)
+
+/* IEEE1284 modes:
+ Nibble mode, byte mode, ECP, ECPRLE and EPP are their own
+ 'extensibility request' values. Others are special.
+ 'Real' ECP modes must have the IEEE1284_MODE_ECP bit set. */
+#define IEEE1284_MODE_NIBBLE 0
+#define IEEE1284_MODE_BYTE (1<<0)
+#define IEEE1284_MODE_COMPAT (1<<8)
+#define IEEE1284_MODE_BECP (1<<9) /* Bounded ECP mode */
+#define IEEE1284_MODE_ECP (1<<4)
+#define IEEE1284_MODE_ECPRLE (IEEE1284_MODE_ECP | (1<<5))
+#define IEEE1284_MODE_ECPSWE (1<<10) /* Software-emulated */
+#define IEEE1284_MODE_EPP (1<<6)
+#define IEEE1284_MODE_EPPSL (1<<11) /* EPP 1.7 */
+#define IEEE1284_MODE_EPPSWE (1<<12) /* Software-emulated */
+#define IEEE1284_DEVICEID (1<<2) /* This is a flag */
+
+/* For the benefit of parport_read/write, you can use these with
+ * parport_negotiate to use address operations. They have no effect
+ * other than to make parport_read/write use address transfers. */
+#define IEEE1284_ADDR (1<<13) /* This is a flag */
+#define IEEE1284_DATA 0 /* So is this */
+
+/* IEEE1284 phases */
+enum ieee1284_phase {
+ IEEE1284_PH_FWD_DATA,
+ IEEE1284_PH_FWD_IDLE,
+ IEEE1284_PH_TERMINATE,
+ IEEE1284_PH_NEGOTIATION,
+ IEEE1284_PH_HBUSY_DNA,
+ IEEE1284_PH_REV_IDLE,
+ IEEE1284_PH_HBUSY_DAVAIL,
+ IEEE1284_PH_REV_DATA,
+ IEEE1284_PH_ECP_SETUP,
+ IEEE1284_PH_ECP_FWD_TO_REV,
+ IEEE1284_PH_ECP_REV_TO_FWD
+};
diff --git a/main/ppdevinit.c b/main/ppdevinit.c
new file mode 100644
index 0000000..0a23fee
--- /dev/null
+++ b/main/ppdevinit.c
@@ -0,0 +1,97 @@
+/*****************************************************************************/
+
+/*
+ * ppdevinit.c -- Parport access via Linux PPDEV device (init routines).
+ *
+ * Copyright (C) 1998-1999 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+#include "ppdev.h"
+
+/* ---------------------------------------------------------------------- */
+
+extern int pp_dev_fd;
+extern int pp_dev_mode;
+extern const struct parport_ops parport_dev_ops;
+extern void parport_dev_exit(void);
+
+/* ---------------------------------------------------------------------- */
+
+int parport_init_ppdev(const char *path)
+{
+ int datadir = 0;
+
+ if ((pp_dev_fd = open(path, O_RDWR | O_NONBLOCK)) == -1) {
+ lprintf(0, "Cannot open ppdev device %s (error %s)\n", path,
+ strerror(errno));
+ return -1;
+ }
+ if (ioctl(pp_dev_fd, PPEXCL, 0)) {
+ lprintf(0, "Cannot set exclusive mode on ppdev device %s (error %s)\n", path,
+ strerror(errno));
+ goto err;
+ }
+ if (ioctl(pp_dev_fd, PPCLAIM, 0)) {
+ lprintf(0, "Cannot claim ppdev device %s (error %s)\n", path,
+ strerror(errno));
+ goto err;
+ }
+ pp_dev_mode = IEEE1284_MODE_COMPAT;
+ if (ioctl(pp_dev_fd, PPSETMODE, &pp_dev_mode)) {
+ lprintf(0, "Cannot set mode on ppdev device %s (error %s)\n", path,
+ strerror(errno));
+ goto err;
+ }
+ if (ioctl(pp_dev_fd, PPDATADIR, &datadir)) {
+ lprintf(0, "Cannot set data direction on ppdev device %s (error %s)\n", path,
+ strerror(errno));
+ goto err;
+ }
+ if (atexit(parport_dev_exit)) {
+ lprintf(0, "Cannot install atexit handler (error %s)\n", strerror(errno));
+ goto errrelease;
+ }
+ parport_ops = parport_dev_ops;
+ return 0;
+
+errrelease:
+ ioctl(pp_dev_fd, PPRELEASE, 0);
+err:
+ close(pp_dev_fd);
+ pp_dev_fd = -1;
+ return -1;
+}
diff --git a/main/ppdirect.c b/main/ppdirect.c
new file mode 100644
index 0000000..a2f8084
--- /dev/null
+++ b/main/ppdirect.c
@@ -0,0 +1,738 @@
+/*****************************************************************************/
+
+/*
+ * ppdirect.c -- Parport direct access.
+ *
+ * Copyright (C) 1998-1999 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#if defined(HAVE_SYS_IO_H)
+#include <sys/io.h>
+#elif defined(HAVE_ASM_IO_H)
+#include <asm/io.h>
+#endif
+
+#include "parport.h"
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+/* LPT registers */
+/* ECP specific registers */
+#define LPTREG_ECONTROL 0x402
+#define LPTREG_CONFIGB 0x401
+#define LPTREG_CONFIGA 0x400
+#define LPTREG_TFIFO 0x400
+#define LPTREG_DFIFO 0x400
+#define LPTREG_AFIFO 0x000
+#define LPTREG_DSR 0x001
+#define LPTREG_DCR 0x002
+/* EPP specific registers */
+#define LPTREG_EPPDATA 0x004
+#define LPTREG_EPPADDR 0x003
+/* standard registers */
+#define LPTREG_CONTROL 0x002
+#define LPTREG_STATUS 0x001
+#define LPTREG_DATA 0x000
+
+/* ECP config A */
+#define LPTCFGA_INTRISALEVEL 0x80
+#define LPTCFGA_IMPIDMASK 0x70
+#define LPTCFGA_IMPID16BIT 0x00
+#define LPTCFGA_IMPID8BIT 0x10
+#define LPTCFGA_IMPID32BIT 0x20
+#define LPTCFGA_NOPIPELINE 0x04
+#define LPTCFGA_PWORDCOUNT 0x03
+
+/* ECP config B */
+#define LPTCFGB_COMPRESS 0x80
+#define LPTCFGB_INTRVALUE 0x40
+#define LPTCFGB_IRQMASK 0x38
+#define LPTCFGB_IRQ5 0x38
+#define LPTCFGB_IRQ15 0x30
+#define LPTCFGB_IRQ14 0x28
+#define LPTCFGB_IRQ11 0x20
+#define LPTCFGB_IRQ10 0x18
+#define LPTCFGB_IRQ9 0x10
+#define LPTCFGB_IRQ7 0x08
+#define LPTCFGB_IRQJUMPER 0x00
+#define LPTCFGB_DMAMASK 0x07
+#define LPTCFGB_DMA7 0x07
+#define LPTCFGB_DMA6 0x06
+#define LPTCFGB_DMA5 0x05
+#define LPTCFGB_DMAJUMPER16 0x04
+#define LPTCFGB_DMA3 0x03
+#define LPTCFGB_DMA2 0x02
+#define LPTCFGB_DMA1 0x01
+#define LPTCFGB_DMAJUMPER8 0x00
+
+/* ECP ECR */
+#define LPTECR_MODEMASK 0xe0
+#define LPTECR_MODESPP 0x00
+#define LPTECR_MODEPS2 0x20
+#define LPTECR_MODESPPFIFO 0x40
+#define LPTECR_MODEECP 0x60
+#define LPTECR_MODEECPEPP 0x80
+#define LPTECR_MODETEST 0xc0
+#define LPTECR_MODECFG 0xe0
+#define LPTECR_NERRINTRDIS 0x10
+#define LPTECR_DMAEN 0x08
+#define LPTECR_SERVICEINTR 0x04
+#define LPTECR_FIFOFULL 0x02
+#define LPTECR_FIFOEMPTY 0x01
+
+/* ---------------------------------------------------------------------- */
+
+unsigned int pp_direct_iobase = 0x378;
+unsigned int pp_direct_flags = 0;
+
+#define FLAGS_PCSPP (1<<0)
+#define FLAGS_PCPS2 (1<<1)
+#define FLAGS_PCEPP (1<<2)
+#define FLAGS_PCECR (1<<3) /* ECR Register Exists */
+#define FLAGS_PCECP (1<<4)
+#define FLAGS_PCECPEPP (1<<5)
+#define FLAGS_PCECPPS2 (1<<6)
+
+/* ---------------------------------------------------------------------- */
+
+extern inline void setecr(unsigned char ecr)
+{
+ if (pp_direct_flags & FLAGS_PCECR)
+ outb(ecr, pp_direct_iobase + LPTREG_ECONTROL);
+}
+
+int pp_direct_epp_clear_timeout(void)
+{
+ unsigned char r;
+
+ if (!(inb(pp_direct_iobase + LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT))
+ return 1;
+ /* To clear timeout some chips require double read */
+ inb(pp_direct_iobase + LPTREG_STATUS);
+ r = inb(pp_direct_iobase + LPTREG_STATUS);
+ outb(r | 0x01, pp_direct_iobase + LPTREG_STATUS); /* Some reset by writing 1 */
+ outb(r & 0xfe, pp_direct_iobase + LPTREG_STATUS); /* Others by writing 0 */
+ r = inb(pp_direct_iobase + LPTREG_STATUS);
+ return !(r & 0x01);
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned char parport_direct_read_data(void)
+{
+ return inb(pp_direct_iobase + LPTREG_DATA);
+}
+
+void parport_direct_write_data(unsigned char d)
+{
+ outb(d, pp_direct_iobase + LPTREG_DATA);
+}
+
+unsigned char parport_direct_read_status(void)
+{
+ return inb(pp_direct_iobase + LPTREG_STATUS);
+}
+
+
+unsigned char parport_direct_read_control(void)
+{
+ return inb(pp_direct_iobase + LPTREG_CONTROL);
+}
+
+void parport_direct_write_control(unsigned char d)
+{
+ outb(d, pp_direct_iobase + LPTREG_CONTROL);
+}
+
+void parport_direct_frob_control(unsigned char mask, unsigned char val)
+{
+ unsigned char d = inb(pp_direct_iobase + LPTREG_CONTROL);
+ d = (d & (~mask)) ^ val;
+ outb(d, pp_direct_iobase + LPTREG_CONTROL);
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_direct_epp_write_data(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+
+ setecr(0x90); /* EPP mode */
+ for (; sz > 0; sz--, bp++) {
+ outb(*bp, pp_direct_iobase + LPTREG_EPPDATA);
+ if (inb(pp_direct_iobase + LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+ pp_direct_epp_clear_timeout();
+ goto rt;
+ }
+ ret++;
+ }
+ rt:
+ setecr(0x30); /* PS/2 mode */
+ return ret;
+}
+
+unsigned parport_direct_epp_read_data(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+
+ setecr(0x90); /* EPP mode */
+ for (; sz > 0; sz--, bp++) {
+ *bp = inb(pp_direct_iobase + LPTREG_EPPDATA);
+ if (inb(pp_direct_iobase + LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+ pp_direct_epp_clear_timeout();
+ goto rt;
+ }
+ ret++;
+ }
+ rt:
+ setecr(0x30); /* PS/2 mode */
+ return ret;
+}
+
+unsigned parport_direct_epp_write_addr(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+
+ setecr(0x90); /* EPP mode */
+ for (; sz > 0; sz--, bp++) {
+ outb(*bp, pp_direct_iobase + LPTREG_EPPADDR);
+ if (inb(pp_direct_iobase + LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+ pp_direct_epp_clear_timeout();
+ goto rt;
+ }
+ ret++;
+ }
+ rt:
+ setecr(0x30); /* PS/2 mode */
+ return ret;
+}
+
+unsigned parport_direct_epp_read_addr(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+
+ setecr(0x90); /* EPP mode */
+ for (; sz > 0; sz--, bp++) {
+ *bp = inb(pp_direct_iobase + LPTREG_EPPADDR);
+ if (inb(pp_direct_iobase + LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+ pp_direct_epp_clear_timeout();
+ goto rt;
+ }
+ ret++;
+ }
+ rt:
+ setecr(0x30); /* PS/2 mode */
+ return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_direct_emul_epp_write_data(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo;
+
+ outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE, pp_direct_iobase + LPTREG_CONTROL);
+ for (; sz > 0; sz--, bp++) {
+ outb(*bp, pp_direct_iobase + LPTREG_DATA);
+ for (tmo = 0; ; tmo++) {
+ if (inb(pp_direct_iobase + LPTREG_STATUS) & LPTSTAT_WAIT)
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE | LPTCTRL_DATASTB, pp_direct_iobase + LPTREG_CONTROL);
+ for (tmo = 0; ; tmo++) {
+ if (!(inb(pp_direct_iobase + LPTREG_STATUS) & LPTSTAT_WAIT))
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE, pp_direct_iobase + LPTREG_CONTROL);
+ ret++;
+ }
+ return ret;
+}
+
+unsigned parport_direct_emul_epp_read_data(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo;
+
+ outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION, pp_direct_iobase + LPTREG_CONTROL);
+ for (; sz > 0; sz--, bp++) {
+ for (tmo = 0; ; tmo++) {
+ if (inb(pp_direct_iobase + LPTREG_STATUS) & LPTSTAT_WAIT)
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION | LPTCTRL_DATASTB, pp_direct_iobase + LPTREG_CONTROL);
+ for (tmo = 0; ; tmo++) {
+ if (!(inb(pp_direct_iobase + LPTREG_STATUS) & LPTSTAT_WAIT))
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ *bp = inb(pp_direct_iobase + LPTREG_DATA);
+ outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION, pp_direct_iobase + LPTREG_CONTROL);
+ ret++;
+ }
+ return ret;
+}
+
+unsigned parport_direct_emul_epp_write_addr(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo;
+
+ outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE, pp_direct_iobase + LPTREG_CONTROL);
+ for (; sz > 0; sz--, bp++) {
+ outb(*bp, pp_direct_iobase + LPTREG_DATA);
+ for (tmo = 0; ; tmo++) {
+ if (inb(pp_direct_iobase + LPTREG_STATUS) & LPTSTAT_WAIT)
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE | LPTCTRL_ADDRSTB, pp_direct_iobase + LPTREG_CONTROL);
+ for (tmo = 0; ; tmo++) {
+ if (!(inb(pp_direct_iobase + LPTREG_STATUS) & LPTSTAT_WAIT))
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE, pp_direct_iobase + LPTREG_CONTROL);
+ ret++;
+ }
+ return ret;
+}
+
+unsigned parport_direct_emul_epp_read_addr(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo;
+
+ outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION, pp_direct_iobase + LPTREG_CONTROL);
+ for (; sz > 0; sz--, bp++) {
+ for (tmo = 0; ; tmo++) {
+ if (inb(pp_direct_iobase + LPTREG_STATUS) & LPTSTAT_WAIT)
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION | LPTCTRL_ADDRSTB, pp_direct_iobase + LPTREG_CONTROL);
+ for (tmo = 0; ; tmo++) {
+ if (!(inb(pp_direct_iobase + LPTREG_STATUS) & LPTSTAT_WAIT))
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ *bp = inb(pp_direct_iobase + LPTREG_DATA);
+ outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION, pp_direct_iobase + LPTREG_CONTROL);
+ ret++;
+ }
+ return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static int ecp_forward(void)
+{
+ unsigned tmo = 0x10000;
+
+ if (inb(pp_direct_iobase + LPTREG_DSR) & 0x20)
+ return 0;
+ /* Event 47: Set nInit high */
+ outb(0x26, pp_direct_iobase + LPTREG_DCR);
+ /* Event 49: PError goes high */
+ while (!(inb(pp_direct_iobase + LPTREG_DSR) & 0x20)) {
+ if (!(--tmo))
+ return -1;
+ }
+ /* start driving the bus */
+ outb(0x04, pp_direct_iobase + LPTREG_DCR);
+ return 0;
+}
+
+static int ecp_reverse(void)
+{
+ unsigned tmo = 0x10000;
+
+ if (!(inb(pp_direct_iobase + LPTREG_DSR) & 0x20))
+ return 0;
+ outb(0x24, pp_direct_iobase + LPTREG_DCR);
+ /* Event 39: Set nInit low to initiate bus reversal */
+ outb(0x20, pp_direct_iobase + LPTREG_DCR);
+ while (inb(pp_direct_iobase + LPTREG_DSR) & 0x20) {
+ if (!(--tmo))
+ return -1;
+ }
+ return 0;
+}
+
+static unsigned emptyfifo(unsigned cnt)
+{
+ unsigned fcnt = 0;
+
+ outb(0xd0, pp_direct_iobase + LPTREG_ECONTROL); /* FIFOtest mode */
+ while ((inb(pp_direct_iobase + LPTREG_ECONTROL) & 0x01) && fcnt < 32 && fcnt < cnt) {
+ inb(pp_direct_iobase + LPTREG_TFIFO);
+ fcnt++;
+ }
+ printf("emptyfifo: FIFO contained %d bytes\n", fcnt);
+ outb(0x30, pp_direct_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+ return cnt - fcnt;
+}
+
+unsigned parport_direct_ecp_write_data(const void *buf, unsigned sz)
+{
+ const unsigned char *bp = (const unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo = 0x10000;
+ unsigned char stat;
+
+ if (ecp_forward())
+ return 0;
+ outb(0x70, pp_direct_iobase + LPTREG_ECONTROL); /* ECP mode */
+ while (sz > 0) {
+ while ((stat = inb(pp_direct_iobase + LPTREG_ECONTROL)) & 0x02) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ if (stat & 0x01 && sz >= 8) {
+ outsb(pp_direct_iobase + LPTREG_DFIFO, bp, 8);
+ bp += 8;
+ sz -= 8;
+ ret += 8;
+ } else {
+ outb(*bp++, pp_direct_iobase + LPTREG_DFIFO);
+ sz--;
+ ret++;
+ }
+ tmo = 0x10000;
+ }
+ while (!(inb(pp_direct_iobase + LPTREG_ECONTROL) & 0x01) || !(inb(pp_direct_iobase + LPTREG_DSR) & 0x80)) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ outb(0x30, pp_direct_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+ return ret;
+}
+
+unsigned parport_direct_ecp_read_data(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo = 0x10000;
+ unsigned char stat;
+
+ if (ecp_reverse())
+ return 0;
+ outb(0x70, pp_direct_iobase + LPTREG_ECONTROL); /* ECP mode */
+ while (sz > 0) {
+ while ((stat = inb(pp_direct_iobase + LPTREG_ECONTROL)) & 0x01)
+ if (!(--tmo)) {
+ outb(0xd0, pp_direct_iobase + LPTREG_ECONTROL); /* FIFOTEST mode */
+ while (!(inb(pp_direct_iobase + LPTREG_ECONTROL) & 0x01) && sz > 0) {
+ *bp++ = inb(pp_direct_iobase + LPTREG_TFIFO);
+ sz--;
+ ret++;
+ }
+ outb(0x30, pp_direct_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+ return ret;
+ }
+ if (stat & 0x02 && sz >= 8) {
+ insb(pp_direct_iobase + LPTREG_DFIFO, bp, 8);
+ bp += 8;
+ sz -= 8;
+ ret += 8;
+ } else {
+ *bp++ = inb(pp_direct_iobase + LPTREG_DFIFO);
+ sz--;
+ ret++;
+ }
+ tmo = 0x10000;
+ }
+ outb(0x30, pp_direct_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+ return ret;
+}
+
+unsigned parport_direct_ecp_write_addr(const void *buf, unsigned sz)
+{
+ const unsigned char *bp = (const unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo = 0x10000;
+ unsigned char stat;
+
+ if (ecp_forward())
+ return 0;
+ outb(0x70, pp_direct_iobase + LPTREG_ECONTROL); /* ECP mode */
+ while (sz > 0) {
+ while ((stat = inb(pp_direct_iobase + LPTREG_ECONTROL)) & 0x02) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ if (stat & 0x01 && sz >= 8) {
+ outsb(pp_direct_iobase + LPTREG_AFIFO, bp, 8);
+ bp += 8;
+ sz -= 8;
+ ret += 8;
+ } else {
+ outb(*bp++, pp_direct_iobase + LPTREG_AFIFO);
+ sz--;
+ ret++;
+ }
+ tmo = 0x10000;
+ }
+ while (!(inb(pp_direct_iobase + LPTREG_ECONTROL) & 0x01) || !(inb(pp_direct_iobase + LPTREG_DSR) & 0x80)) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ outb(0x30, pp_direct_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+ return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_direct_emul_ecp_write_data(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret;
+ unsigned char ctl;
+ unsigned tmo;
+
+ if (ecp_forward())
+ return 0;
+ ctl = inb(pp_direct_iobase + LPTREG_CONTROL) & ~PARPORT_CONTROL_AUTOFD;
+ /* HostAck high (data, not command) */
+ outb(ctl, pp_direct_iobase + LPTREG_CONTROL);
+ for (ret = 0; ret < sz; ret++, bp++) {
+ outb(*bp, pp_direct_iobase + LPTREG_DATA);
+ outb(ctl | PARPORT_CONTROL_STROBE, pp_direct_iobase + LPTREG_CONTROL);
+ for (tmo = 0; inb(pp_direct_iobase + LPTREG_STATUS) & PARPORT_STATUS_BUSY; tmo++)
+ if (tmo > 0x1000)
+ return ret;
+ outb(ctl, pp_direct_iobase + LPTREG_CONTROL);
+ for (tmo = 0; !(inb(pp_direct_iobase + LPTREG_STATUS) & PARPORT_STATUS_BUSY); tmo++)
+ if (tmo > 0x1000)
+ return ret;
+ }
+ return ret;
+}
+
+unsigned parport_direct_emul_ecp_write_addr(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret;
+ unsigned char ctl;
+ unsigned tmo;
+
+ if (ecp_forward())
+ return 0;
+ ctl = inb(pp_direct_iobase + LPTREG_CONTROL) | PARPORT_CONTROL_AUTOFD;
+ /* HostAck low (command, not data) */
+ outb(ctl, pp_direct_iobase + LPTREG_CONTROL);
+ for (ret = 0; ret < sz; ret++, bp++) {
+ outb(*bp, pp_direct_iobase + LPTREG_DATA);
+ outb(ctl | PARPORT_CONTROL_STROBE, pp_direct_iobase + LPTREG_CONTROL);
+ for (tmo = 0; inb(pp_direct_iobase + LPTREG_STATUS) & PARPORT_STATUS_BUSY; tmo++)
+ if (tmo > 0x1000)
+ return ret;
+ outb(ctl, pp_direct_iobase + LPTREG_CONTROL);
+ for (tmo = 0; !(inb(pp_direct_iobase + LPTREG_STATUS) & PARPORT_STATUS_BUSY); tmo++)
+ if (tmo > 0x1000)
+ return ret;
+ }
+ return ret;
+}
+
+unsigned parport_direct_emul_ecp_read_data(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned char ctl, stat;
+ int command;
+ unsigned tmo;
+
+ if (ecp_reverse())
+ return 0;
+ ctl = inb(pp_direct_iobase + LPTREG_CONTROL);
+ /* Set HostAck low to start accepting data. */
+ outb(ctl | PARPORT_CONTROL_AUTOFD, pp_direct_iobase + LPTREG_CONTROL);
+ while (ret < sz) {
+ /* Event 43: Peripheral sets nAck low. It can take as
+ long as it wants. */
+ tmo = 0;
+ do {
+ stat = inb(pp_direct_iobase + LPTREG_STATUS);
+ if ((++tmo) > 0x10000)
+ goto out;
+ } while (stat & PARPORT_STATUS_ACK);
+ /* Is this a command? */
+ command = stat & PARPORT_STATUS_BUSY;
+ if (command) {
+ //lprintf(3, "ECP: warning: emulation does not support RLE\n");
+ goto out;
+ }
+ /* Read the data. */
+ *bp = inb(pp_direct_iobase + LPTREG_DATA);
+ /* Event 44: Set HostAck high, acknowledging handshake. */
+ outb(ctl & ~PARPORT_CONTROL_AUTOFD, pp_direct_iobase + LPTREG_CONTROL);
+ /* Event 45: The peripheral has 35ms to set nAck high. */
+ tmo = 0;
+ do {
+ stat = inb(pp_direct_iobase + LPTREG_STATUS);
+ if ((++tmo) > 0x10000)
+ goto out;
+ } while (!(stat & PARPORT_STATUS_ACK));
+ /* Event 46: Set HostAck low and accept the data. */
+ outb(ctl | PARPORT_CONTROL_AUTOFD, pp_direct_iobase + LPTREG_CONTROL);
+ /* Normal data byte. */
+ bp++;
+ ret++;
+ }
+
+ out:
+ return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+#if 1
+unsigned parport_direct_fpgaconfig_write(const void *buf, unsigned sz)
+{
+ const unsigned char *bp = buf;
+ unsigned u;
+
+ for (u = 0; u < sz; u++, bp++)
+ outb(*bp, pp_direct_iobase + LPTREG_DATA);
+ return sz;
+}
+#else
+
+unsigned parport_direct_fpgaconfig_write(const void *buf, unsigned sz)
+{
+ const unsigned char *bp = buf;
+ unsigned ret = 0;
+ unsigned tmo = 0x10000;
+ unsigned char stat;
+
+ if (pp_direct_modes & PARPORT_MODE_PCECR) {
+ outb(0x50, pp_direct_iobase + LPTREG_ECONTROL); /* COMPAT FIFO mode */
+ while (sz > 0) {
+ while ((stat = inb(pp_direct_iobase + LPTREG_ECONTROL)) & 0x02) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ if (stat & 0x01 && sz >= 8) {
+ outsb(pp_direct_iobase + LPTREG_DFIFO, bp, 8);
+ bp += 8;
+ sz -= 8;
+ ret += 8;
+ } else {
+ outb(*bp++, pp_direct_iobase + LPTREG_DFIFO);
+ sz--;
+ ret++;
+ }
+ tmo = 0x10000;
+ }
+ while (!(inb(pp_direct_iobase + LPTREG_ECONTROL) & 0x01) || !(inb(pp_direct_iobase + LPTREG_DSR) & 0x80)) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ outb(0x30, pp_direct_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+ return ret;
+ }
+ for (ret = 0; ret < sz; ret++, bp++)
+ outb(*bp, pp_direct_iobase + LPTREG_DATA);
+ return sz;
+}
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+const struct parport_ops parport_direct_ops = {
+ parport_direct_read_data,
+ parport_direct_write_data,
+ parport_direct_read_status,
+ parport_direct_read_control,
+ parport_direct_write_control,
+ parport_direct_frob_control,
+ parport_direct_epp_write_data,
+ parport_direct_epp_read_data,
+ parport_direct_epp_write_addr,
+ parport_direct_epp_read_addr,
+ parport_direct_ecp_write_data,
+ parport_direct_ecp_read_data,
+ parport_direct_ecp_write_addr,
+ parport_direct_fpgaconfig_write
+};
+
+const struct parport_ops parport_direct_emul_ops = {
+ parport_direct_read_data,
+ parport_direct_write_data,
+ parport_direct_read_status,
+ parport_direct_read_control,
+ parport_direct_write_control,
+ parport_direct_frob_control,
+ parport_direct_emul_epp_write_data,
+ parport_direct_emul_epp_read_data,
+ parport_direct_emul_epp_write_addr,
+ parport_direct_emul_epp_read_addr,
+ parport_direct_emul_ecp_write_data,
+ parport_direct_emul_ecp_read_data,
+ parport_direct_emul_ecp_write_addr,
+ parport_direct_fpgaconfig_write
+};
+
+/* ---------------------------------------------------------------------- */
+
+struct parport_ops parport_ops = {
+ parport_direct_read_data,
+ parport_direct_write_data,
+ parport_direct_read_status,
+ parport_direct_read_control,
+ parport_direct_write_control,
+ parport_direct_frob_control,
+ parport_direct_emul_epp_write_data,
+ parport_direct_emul_epp_read_data,
+ parport_direct_emul_epp_write_addr,
+ parport_direct_emul_epp_read_addr,
+ parport_direct_emul_ecp_write_data,
+ parport_direct_emul_ecp_read_data,
+ parport_direct_emul_ecp_write_addr,
+ parport_direct_fpgaconfig_write
+};
+
+/* ---------------------------------------------------------------------- */
diff --git a/main/ppdirectinit.c b/main/ppdirectinit.c
new file mode 100644
index 0000000..0c0a254
--- /dev/null
+++ b/main/ppdirectinit.c
@@ -0,0 +1,677 @@
+/*****************************************************************************/
+
+/*
+ * ppdirectinit.c -- Parport direct access (init routines).
+ *
+ * Copyright (C) 1998-2000 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#if defined(HAVE_SYS_IO_H)
+#include <sys/io.h>
+#elif defined(HAVE_ASM_IO_H)
+#include <asm/io.h>
+#endif
+
+#include <errno.h>
+#include <string.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+#ifndef HAVE_IOPL
+#ifdef HAVE_WINDOWS_H
+#include <windows.h>
+extern inline int iopl(unsigned int level)
+{
+ OSVERSIONINFO info;
+
+ info.dwOSVersionInfoSize = sizeof(info);
+ if (GetVersionEx(&info) &&
+ (info.dwPlatformId == VER_PLATFORM_WIN32s ||
+ info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS))
+ return 0;
+ return 1;
+}
+#else
+extern inline int iopl(unsigned int level)
+{
+ return 0;
+}
+#endif
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+/* LPT registers */
+/* ECP specific registers */
+#define LPTREG_ECONTROL 0x402
+#define LPTREG_CONFIGB 0x401
+#define LPTREG_CONFIGA 0x400
+#define LPTREG_TFIFO 0x400
+#define LPTREG_DFIFO 0x400
+#define LPTREG_AFIFO 0x000
+#define LPTREG_DSR 0x001
+#define LPTREG_DCR 0x002
+/* EPP specific registers */
+#define LPTREG_EPPDATA 0x004
+#define LPTREG_EPPADDR 0x003
+/* standard registers */
+#define LPTREG_CONTROL 0x002
+#define LPTREG_STATUS 0x001
+#define LPTREG_DATA 0x000
+
+/* ECP config A */
+#define LPTCFGA_INTRISALEVEL 0x80
+#define LPTCFGA_IMPIDMASK 0x70
+#define LPTCFGA_IMPID16BIT 0x00
+#define LPTCFGA_IMPID8BIT 0x10
+#define LPTCFGA_IMPID32BIT 0x20
+#define LPTCFGA_NOPIPELINE 0x04
+#define LPTCFGA_PWORDCOUNT 0x03
+
+/* ECP config B */
+#define LPTCFGB_COMPRESS 0x80
+#define LPTCFGB_INTRVALUE 0x40
+#define LPTCFGB_IRQMASK 0x38
+#define LPTCFGB_IRQ5 0x38
+#define LPTCFGB_IRQ15 0x30
+#define LPTCFGB_IRQ14 0x28
+#define LPTCFGB_IRQ11 0x20
+#define LPTCFGB_IRQ10 0x18
+#define LPTCFGB_IRQ9 0x10
+#define LPTCFGB_IRQ7 0x08
+#define LPTCFGB_IRQJUMPER 0x00
+#define LPTCFGB_DMAMASK 0x07
+#define LPTCFGB_DMA7 0x07
+#define LPTCFGB_DMA6 0x06
+#define LPTCFGB_DMA5 0x05
+#define LPTCFGB_DMAJUMPER16 0x04
+#define LPTCFGB_DMA3 0x03
+#define LPTCFGB_DMA2 0x02
+#define LPTCFGB_DMA1 0x01
+#define LPTCFGB_DMAJUMPER8 0x00
+
+/* ECP ECR */
+#define LPTECR_MODEMASK 0xe0
+#define LPTECR_MODESPP 0x00
+#define LPTECR_MODEPS2 0x20
+#define LPTECR_MODESPPFIFO 0x40
+#define LPTECR_MODEECP 0x60
+#define LPTECR_MODEECPEPP 0x80
+#define LPTECR_MODETEST 0xc0
+#define LPTECR_MODECFG 0xe0
+#define LPTECR_NERRINTRDIS 0x10
+#define LPTECR_DMAEN 0x08
+#define LPTECR_SERVICEINTR 0x04
+#define LPTECR_FIFOFULL 0x02
+#define LPTECR_FIFOEMPTY 0x01
+
+/* ---------------------------------------------------------------------- */
+
+extern unsigned int pp_direct_iobase;
+extern unsigned int pp_direct_flags;
+extern const struct parport_ops parport_direct_ops, parport_direct_emul_ops;
+
+extern int pp_direct_epp_clear_timeout(void);
+
+#define FLAGS_PCSPP (1<<0)
+#define FLAGS_PCPS2 (1<<1)
+#define FLAGS_PCEPP (1<<2)
+#define FLAGS_PCECR (1<<3) /* ECR Register Exists */
+#define FLAGS_PCECP (1<<4)
+#define FLAGS_PCECPEPP (1<<5)
+#define FLAGS_PCECPPS2 (1<<6)
+
+/* ---------------------------------------------------------------------- */
+#if 0
+#ifndef EPPEMUL
+
+static int detect_epp(void)
+{
+ /* pulse PROGRAM low, reset FPGA just to be safe */
+ outb(LPTCTRL_ADDRSTB, iobase+LPTREG_CONTROL);
+ usleep(10);
+ outb(LPTCTRL_PROGRAM, iobase+LPTREG_CONTROL);
+ /* start of ordinary test */
+ if (!epp_clear_timeout())
+ return -1;
+ outb(inb(iobase + LPTREG_CONTROL) | 0x20, iobase + LPTREG_CONTROL);
+ outb(inb(iobase + LPTREG_CONTROL) | 0x10, iobase + LPTREG_CONTROL);
+ epp_clear_timeout();
+ inb(iobase + LPTREG_EPPDATA);
+ /* udelay(30); */
+ if (inb(iobase + LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+ epp_clear_timeout();
+ return 0;
+ }
+ /*return -1;*/
+ lprintf(3, "warning: no EPP timeout\n");
+ return 0;
+}
+
+#endif /* !EPPEMUL */
+
+static int detect_ecr(void)
+{
+ unsigned char r, oc, oec;
+
+ oec = inb(iobase + LPTREG_ECONTROL);
+ oc = inb(iobase + LPTREG_CONTROL);
+ if ((oc & 3) == (oec & 3)) {
+ outb(oc ^ 2, iobase + LPTREG_CONTROL);
+ r = inb(iobase + LPTREG_CONTROL);
+ if ((inb(iobase + LPTREG_ECONTROL) & 2) == (r & 2)) {
+ outb(oc, iobase + LPTREG_CONTROL);
+ return -1;
+ }
+ }
+ if ((oec & 3) != 1)
+ return -1;
+ outb(0x34, iobase + LPTREG_ECONTROL);
+ r = inb(iobase + LPTREG_ECONTROL);
+ outb(oc, iobase + LPTREG_CONTROL);
+ outb(oec, iobase + LPTREG_ECONTROL);
+ return -(r != 0x35);
+}
+
+int detect_port(void)
+{
+ outb(LPTCTRL_ADDRSTB, iobase+LPTREG_CONTROL);
+ pp_direct_epp_clear_timeout(); /* prevent lockup of some SMSC IC's */
+ /* this routine is mostly copied from Linux Kernel parport */
+ outb(0xc, iobase+LPTREG_ECONTROL);
+ outb(0xc, iobase+LPTREG_CONTROL);
+ outb(0xaa, iobase+LPTREG_DATA);
+ if (inb(iobase+LPTREG_DATA) != 0xaa)
+ goto fail_spp;
+ outb(0x55, iobase+LPTREG_DATA);
+ if (inb(iobase+LPTREG_DATA) != 0x55)
+ goto fail_spp;
+#ifdef EPPEMUL
+ /* tentatively enable PS/2 mode if ECP port */
+ outb(0x20, iobase + LPTREG_ECONTROL);
+ outb(LPTCTRL_PROGRAM, iobase+LPTREG_CONTROL);
+ if ((inb(iobase+LPTREG_CONTROL) & 0x3f) != LPTCTRL_PROGRAM)
+ goto fail_ps2;
+ outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION, iobase+LPTREG_CONTROL);
+ if ((inb(iobase+LPTREG_CONTROL) & 0x3f) != (LPTCTRL_PROGRAM | LPTCTRL_DIRECTION))
+ goto fail_ps2;
+ return 0;
+
+ fail_ps2:
+ lprintf(3, "parport (PS/2 bidir) test failed\n");
+ return -1;
+
+#else /* !EPPEMUL */
+ if (!detect_ecr()) {
+ outb(0x80, iobase + LPTREG_ECONTROL);
+ lprintf(3, "parport SMSC style ECP+EPP detected\n");
+ return 0;
+ }
+ if (!detect_epp())
+ return 0;
+ /* goto fail_epp; */
+ fail_epp:
+ lprintf(3, "parport (EPP) test failed\n");
+ return -1;
+#endif /* !EPPEMUL */
+
+ fail_spp:
+ lprintf(3, "parport (SPP) test failed\n");
+ return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * ECP routines
+ */
+
+static void ecp_port_cap(void)
+{
+ static const char *pwordstr[8] = { "2 bytes", "1 byte", "4 bytes", "3?", "4?",
+ "5?", "6?", "7?" };
+ static const char *irqstr[8] = { "jumpered", "7", "9", "10", "11", "14", "15", "5" };
+ static const char *dmastr[8] = { "jumpered 8bit", "1", "2", "3", "jumpered 16bit", "5", "6", "7" };
+ unsigned char cnfga, cnfgb;
+ unsigned int cnt, fwcnt, wthr = ~0, frcnt, rthr = ~0;
+
+ outb(0x30, iobase + LPTREG_ECONTROL); /* PS/2 mode */
+ outb(0xf0, iobase + LPTREG_ECONTROL); /* config mode */
+ cnfga = inb(iobase + LPTREG_CONFIGA);
+ cnfgb = inb(iobase + LPTREG_CONFIGB);
+ outb(cnfgb & 0x7f, iobase + LPTREG_CONFIGB); /* disable compression */
+ outb(0x30, iobase + LPTREG_ECONTROL); /* PS/2 mode */
+ outb(0x04, iobase + LPTREG_DCR); /* direction=output */
+ outb(0xd0, iobase + LPTREG_ECONTROL); /* test mode */
+ for (cnt = 0; cnt < 1024 && !(inb(iobase + LPTREG_ECONTROL) & 0x02); cnt++)
+ outb(0, iobase + LPTREG_TFIFO);
+ outb(0xd0, iobase + LPTREG_ECONTROL); /* test mode, clear serviceintr */
+ for (fwcnt = 0; fwcnt < 1024 && !(inb(iobase + LPTREG_ECONTROL) & 0x01); fwcnt++) {
+ inb(iobase + LPTREG_TFIFO);
+ if (inb(iobase + LPTREG_ECONTROL) & 0x04) {
+ wthr = fwcnt;
+ outb(0xd0, iobase + LPTREG_ECONTROL); /* test mode, clear serviceintr */
+ }
+ }
+ outb(0x24, iobase + LPTREG_DCR); /* direction=input */
+ outb(0xd0, iobase + LPTREG_ECONTROL); /* test mode */
+ for (cnt = 0; cnt < 1024 && !(inb(iobase + LPTREG_ECONTROL) & 0x02); cnt++)
+ outb(0, iobase + LPTREG_TFIFO);
+ outb(0xd0, iobase + LPTREG_ECONTROL); /* test mode, clear serviceintr */
+ for (frcnt = 0; frcnt < 1024 && !(inb(iobase + LPTREG_ECONTROL) & 0x01); frcnt++) {
+ inb(iobase + LPTREG_TFIFO);
+ if (inb(iobase + LPTREG_ECONTROL) & 0x04) {
+ rthr = frcnt;
+ outb(0xd0, iobase + LPTREG_ECONTROL); /* test mode, clear serviceintr */
+ }
+ }
+ outb(0x30, iobase + LPTREG_ECONTROL); /* PS/2 mode */
+ outb(0x04, iobase + LPTREG_DCR); /* direction=output */
+ lprintf(3, "ECP capabilities: %s int, PWord %s, %sextra tx pipe, IRQ %s, DMA %s\n"
+ "Tx: FIFO size %d threshold %d Rx: FIFO size %d threshold %d\n",
+ (cnfga & 0x80) ? "level" : "edge", pwordstr[(cnfga >> 4) & 7],
+ (cnfga & 0x04) ? "no" : "", irqstr[(cnfgb >> 3) & 7], dmastr[cnfgb & 7],
+ fwcnt, wthr, frcnt, rthr);
+}
+
+int detect_port_ecp(void)
+{
+ epp_clear_timeout(); /* prevent lockup of some SMSC IC's */
+ /* this routine is mostly copied from Linux Kernel parport */
+ outb(0xc, iobase+LPTREG_ECONTROL);
+ outb(0xc, iobase+LPTREG_CONTROL);
+ outb(0xaa, iobase+LPTREG_DATA);
+ if (inb(iobase+LPTREG_DATA) != 0xaa)
+ goto fail_spp;
+ outb(0x55, iobase+LPTREG_DATA);
+ if (inb(iobase+LPTREG_DATA) != 0x55)
+ goto fail_spp;
+ /* check for ECP ECR mode */
+ if (detect_ecr())
+ goto fail_ecp;
+ ecp_port_cap();
+ return 0;
+
+ fail_ecp:
+ lprintf(0, "parport (ECP) test failed\n");
+ return -1;
+
+ fail_spp:
+ lprintf(0, "parport (SPP) test failed\n");
+ return -1;
+}
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+static int parport_spp(void)
+{
+ pp_direct_epp_clear_timeout(); /* prevent lockup of some SMSC IC's */
+ /* this routine is mostly copied from Linux Kernel parport */
+ outb(0xc, pp_direct_iobase+LPTREG_ECONTROL);
+ outb(0xc, pp_direct_iobase+LPTREG_CONTROL);
+ outb(0xaa, pp_direct_iobase+LPTREG_DATA);
+ if (inb(pp_direct_iobase+LPTREG_DATA) != 0xaa)
+ return 0;
+ outb(0x55, pp_direct_iobase+LPTREG_DATA);
+ if (inb(pp_direct_iobase+LPTREG_DATA) != 0x55)
+ return 0;
+ return PARPORT_MODE_PCSPP;
+}
+
+/* Check for ECP
+ *
+ * Old style XT ports alias io ports every 0x400, hence accessing ECR
+ * on these cards actually accesses the CTR.
+ *
+ * Modern cards don't do this but reading from ECR will return 0xff
+ * regardless of what is written here if the card does NOT support
+ * ECP.
+ *
+ * We will write 0x2c to ECR and 0xcc to CTR since both of these
+ * values are "safe" on the CTR since bits 6-7 of CTR are unused.
+ */
+static int parport_ecr(void)
+{
+ unsigned char r = 0xc;
+
+ outb(r, pp_direct_iobase + LPTREG_CONTROL);
+ if ((inb(pp_direct_iobase + LPTREG_ECONTROL) & 0x3) == (r & 0x3)) {
+ outb(r ^ 0x2, pp_direct_iobase + LPTREG_CONTROL); /* Toggle bit 1 */
+ r = inb(pp_direct_iobase + LPTREG_CONTROL);
+ if ((inb(pp_direct_iobase + LPTREG_ECONTROL) & 0x2) == (r & 0x2))
+ goto no_reg; /* Sure that no ECR register exists */
+ }
+
+ if ((inb(pp_direct_iobase + LPTREG_ECONTROL) & 0x3 ) != 0x1)
+ goto no_reg;
+
+ outb(0x34, pp_direct_iobase + LPTREG_ECONTROL);
+ if (inb(pp_direct_iobase + LPTREG_ECONTROL) != 0x35)
+ goto no_reg;
+
+ outb(0xc, pp_direct_iobase + LPTREG_CONTROL);
+
+ /* Go to mode 000 */
+ outb(inb(pp_direct_iobase + LPTREG_ECONTROL) & ~0xe0, pp_direct_iobase + LPTREG_ECONTROL);
+
+ return PARPORT_MODE_PCECR;
+
+ no_reg:
+ outb(0xc, pp_direct_iobase + LPTREG_CONTROL);
+ return 0;
+}
+
+static int parport_ecp(void)
+{
+ int i;
+ int config;
+ int pword;
+ int fifo_depth, writeIntrThreshold, readIntrThreshold;
+
+ /* Find out FIFO depth */
+ outb(0x00, pp_direct_iobase + LPTREG_ECONTROL); /* Reset FIFO */
+ outb(0xc0, pp_direct_iobase + LPTREG_ECONTROL); /* TEST FIFO */
+ for (i=0; i < 1024 && !(inb(pp_direct_iobase + LPTREG_ECONTROL) & 0x02); i++)
+ outb(0xaa, pp_direct_iobase + LPTREG_TFIFO);
+ /*
+ * Using LGS chipset it uses ECR register, but
+ * it doesn't support ECP or FIFO MODE
+ */
+ if (i == 1024) {
+ outb(0x00, pp_direct_iobase + LPTREG_ECONTROL);
+ return 0;
+ }
+
+ fifo_depth = i;
+ lprintf(3, "ECP: FIFO depth is %d bytes\n", fifo_depth);
+
+ /* Find out writeIntrThreshold */
+ outb(inb(pp_direct_iobase + LPTREG_ECONTROL) | (1<<2), pp_direct_iobase + LPTREG_ECONTROL);
+ outb(inb(pp_direct_iobase + LPTREG_ECONTROL) & ~(1<<2) , pp_direct_iobase + LPTREG_ECONTROL);
+ for (i = 1; i <= fifo_depth; i++) {
+ inb(pp_direct_iobase + LPTREG_TFIFO);
+ usleep(50);
+ if (inb(pp_direct_iobase + LPTREG_ECONTROL) & (1<<2))
+ break;
+ }
+
+ if (i <= fifo_depth)
+ lprintf(3, "ECP: writeIntrThreshold is %d\n", i);
+ else
+ /* Number of bytes we know we can write if we get an
+ interrupt. */
+ i = 0;
+
+ writeIntrThreshold = i;
+
+ /* Find out readIntrThreshold */
+ outb((inb(pp_direct_iobase + LPTREG_ECONTROL) & ~0xe0) | 0x20, pp_direct_iobase + LPTREG_ECONTROL); /* Reset FIFO, PS2 */
+ outb(inb(pp_direct_iobase + LPTREG_CONTROL) | PARPORT_CONTROL_DIRECTION, pp_direct_iobase + LPTREG_CONTROL);
+ outb((inb(pp_direct_iobase + LPTREG_ECONTROL) & ~0xe0) | 0xc0, pp_direct_iobase + LPTREG_ECONTROL); /* Test FIFO */
+ outb(inb(pp_direct_iobase + LPTREG_ECONTROL) | (1<<2), pp_direct_iobase + LPTREG_ECONTROL);
+ outb(inb(pp_direct_iobase + LPTREG_ECONTROL) & ~(1<<2) , pp_direct_iobase + LPTREG_ECONTROL);
+ for (i = 1; i <= fifo_depth; i++) {
+ outb(0xaa, pp_direct_iobase + LPTREG_TFIFO);
+ if (inb(pp_direct_iobase + LPTREG_ECONTROL) & (1<<2))
+ break;
+ }
+
+ if (i <= fifo_depth)
+ lprintf(3, "ECP: readIntrThreshold is %d\n", i);
+ else
+ /* Number of bytes we can read if we get an interrupt. */
+ i = 0;
+
+ readIntrThreshold = i;
+
+ outb(0x00, pp_direct_iobase + LPTREG_ECONTROL); /* Reset FIFO */
+ outb(0xf4, pp_direct_iobase + LPTREG_ECONTROL); /* Configuration mode */
+ config = inb(pp_direct_iobase + LPTREG_CONFIGA);
+ pword = (config >> 4) & 0x7;
+ switch (pword) {
+ case 0:
+ pword = 2;
+ lprintf(0, "ECP: Unsupported pword size! (2)\n");
+ break;
+ case 2:
+ pword = 4;
+ lprintf(0, "ECP: Unsupported pword size! (4)\n");
+ break;
+ default:
+ lprintf(0, "ECP: Unknown implementation ID (%d)\n", pword);
+ /* Assume 1 */
+ case 1:
+ pword = 1;
+ }
+ lprintf(3, "ECP: PWord is %d bits\n", 8 * pword);
+
+ config = inb(pp_direct_iobase + LPTREG_CONFIGB);
+ lprintf(3, "ECP: Interrupts are ISA-%s\n", config & 0x80 ? "Level" : "Pulses");
+
+ if (!(config & 0x40))
+ lprintf(3, "ECP: IRQ conflict!\n");
+
+ /* Go back to mode 000 */
+ outb(inb(pp_direct_iobase + LPTREG_ECONTROL) & ~0xe0, pp_direct_iobase + LPTREG_ECONTROL);
+
+ return PARPORT_MODE_PCECP;
+}
+
+/* EPP mode detection */
+
+static int parport_epp(void)
+{
+ /* If EPP timeout bit clear then EPP available */
+ if (!pp_direct_epp_clear_timeout())
+ return 0; /* No way to clear timeout */
+
+ /*
+ * Theory:
+ * Write two values to the EPP address register and
+ * read them back. When the transfer times out, the state of
+ * the EPP register is undefined in some cases (EPP 1.9?) but
+ * in others (EPP 1.7, ECPEPP?) it is possible to read back
+ * its value.
+ */
+
+ pp_direct_epp_clear_timeout();
+ usleep(30); /* Wait for possible EPP timeout */
+
+ outb(0x55, pp_direct_iobase + LPTREG_EPPADDR);
+ pp_direct_epp_clear_timeout();
+ usleep(30); /* Wait for possible EPP timeout */
+
+ if (inb(pp_direct_iobase + LPTREG_EPPADDR) == 0x55) {
+ outb(0xaa, pp_direct_iobase + LPTREG_EPPADDR);
+ pp_direct_epp_clear_timeout();
+ usleep(30); /* Wait for possible EPP timeout */
+ if (inb(pp_direct_iobase + LPTREG_EPPADDR) == 0xaa) {
+ pp_direct_epp_clear_timeout();
+ return PARPORT_MODE_PCEPP;
+ }
+ }
+
+ /*
+ * Theory:
+ * Bit 0 of STR is the EPP timeout bit, this bit is 0
+ * when EPP is possible and is set high when an EPP timeout
+ * occurs (EPP uses the HALT line to stop the CPU while it does
+ * the byte transfer, an EPP timeout occurs if the attached
+ * device fails to respond after 10 micro seconds).
+ *
+ * This bit is cleared by either reading it (National Semi)
+ * or writing a 1 to the bit (SMC, UMC, WinBond), others ???
+ * This bit is always high in non EPP modes.
+ */
+
+ outb(inb(pp_direct_iobase + LPTREG_CONTROL) | 0x20, pp_direct_iobase + LPTREG_CONTROL);
+ outb(inb(pp_direct_iobase + LPTREG_CONTROL) | 0x10, pp_direct_iobase + LPTREG_CONTROL);
+ pp_direct_epp_clear_timeout();
+
+ inb(pp_direct_iobase + LPTREG_EPPDATA);
+ usleep(30); /* Wait for possible EPP timeout */
+
+ if (inb(pp_direct_iobase + LPTREG_STATUS) & 0x01) {
+ pp_direct_epp_clear_timeout();
+ return PARPORT_MODE_PCEPP;
+ }
+ return 0;
+}
+
+static int parport_ecpepp(void)
+{
+ int mode;
+ unsigned char oecr;
+
+ oecr = inb(pp_direct_iobase + LPTREG_ECONTROL);
+ /* Search for SMC style EPP+ECP mode */
+ outb(0x80, pp_direct_iobase + LPTREG_ECONTROL);
+ mode = parport_epp();
+ outb(oecr, pp_direct_iobase + LPTREG_ECONTROL);
+ return mode ? PARPORT_MODE_PCECPEPP : 0;
+}
+
+/* Detect PS/2 support.
+ *
+ * Bit 5 (0x20) sets the PS/2 data direction; setting this high
+ * allows us to read data from the data lines. In theory we would get back
+ * 0xff but any peripheral attached to the port may drag some or all of the
+ * lines down to zero. So if we get back anything that isn't the contents
+ * of the data register we deem PS/2 support to be present.
+ *
+ * Some SPP ports have "half PS/2" ability - you can't turn off the line
+ * drivers, but an external peripheral with sufficiently beefy drivers of
+ * its own can overpower them and assert its own levels onto the bus, from
+ * where they can then be read back as normal. Ports with this property
+ * and the right type of device attached are likely to fail the SPP test,
+ * (as they will appear to have stuck bits) and so the fact that they might
+ * be misdetected here is rather academic.
+ */
+
+static int parport_ps2(void)
+{
+ int ok = 0;
+ unsigned char octr = inb(pp_direct_iobase + LPTREG_CONTROL);
+
+ pp_direct_epp_clear_timeout();
+
+ outb(octr | 0x20, pp_direct_iobase + LPTREG_CONTROL); /* try to tri-state the buffer */
+
+ outb(0x55, pp_direct_iobase + LPTREG_DATA);
+ if (inb(pp_direct_iobase + LPTREG_DATA) != 0x55) ok++;
+ outb(0xaa, pp_direct_iobase + LPTREG_DATA);
+ if (inb(pp_direct_iobase + LPTREG_DATA) != 0xaa) ok++;
+
+ outb(octr, pp_direct_iobase); /* cancel input mode */
+
+ return ok ? PARPORT_MODE_PCPS2 : 0;
+}
+
+static int parport_ecpps2(void)
+{
+ int mode;
+ unsigned char oecr;
+
+ oecr = inb(pp_direct_iobase + LPTREG_ECONTROL);
+ outb(0x20, pp_direct_iobase + LPTREG_ECONTROL);
+ mode = parport_ps2();
+ outb(oecr, pp_direct_iobase + LPTREG_ECONTROL);
+ return mode ? PARPORT_MODE_PCECPPS2 : 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+int parport_init_direct_flags(unsigned io, unsigned int flags)
+{
+ pp_direct_flags = FLAGS_PCSPP;
+ pp_direct_iobase = io;
+ if (iopl(3)) {
+ lprintf(0, "Cannot get direct IO port access (iopl: %s)\n", strerror(errno));
+ return -1;
+ }
+ if (!parport_spp()) {
+ lprintf(0, "No parport present at 0x%x\n", pp_direct_iobase);
+ return -1;
+ }
+ if (parport_ecr()) {
+ pp_direct_flags |= FLAGS_PCECR;
+ pp_direct_flags |= parport_ecp();
+ pp_direct_flags |= parport_ecpps2();
+ pp_direct_flags |= parport_ecpepp();
+ if ((flags & PPFLAG_FORCEHWEPP) &&
+ (pp_direct_flags & (FLAGS_PCPS2|FLAGS_PCECPPS2)) &&
+ !(pp_direct_flags & (FLAGS_PCEPP|FLAGS_PCECPEPP)))
+ pp_direct_flags |= FLAGS_PCECPEPP;
+ else
+ flags &= ~PPFLAG_FORCEHWEPP;
+ } else {
+ pp_direct_flags |= parport_ps2();
+ pp_direct_flags |= parport_epp();
+ if ((flags & PPFLAG_FORCEHWEPP) &&
+ (pp_direct_flags & (FLAGS_PCPS2|FLAGS_PCECPPS2)) &&
+ !(pp_direct_flags & (FLAGS_PCEPP|FLAGS_PCECPEPP)))
+ pp_direct_flags |= FLAGS_PCEPP;
+ else
+ flags &= ~PPFLAG_FORCEHWEPP;
+ }
+ lprintf(0, "Parport 0x%x capabilities: SPP%s%s%s%s%s%s\n",
+ pp_direct_iobase,
+ (pp_direct_flags & FLAGS_PCPS2) ? ", PS2" : "",
+ (pp_direct_flags & FLAGS_PCEPP) ? ((flags & PPFLAG_FORCEHWEPP) ? ", EPP (forced)" : ", EPP") : "",
+ (pp_direct_flags & FLAGS_PCECR) ? ", ECR" : "",
+ (pp_direct_flags & FLAGS_PCECP) ? ", ECP" : "",
+ (pp_direct_flags & FLAGS_PCECPEPP) ? ((flags & PPFLAG_FORCEHWEPP) ? ", ECPEPP (forced)" : ", ECPEPP") : "",
+ (pp_direct_flags & FLAGS_PCECPPS2) ? ", ECPPS2" : "");
+ if (!(pp_direct_flags & (FLAGS_PCPS2 | FLAGS_PCECPPS2))) {
+ lprintf(0, "Parport 0x%x does not even support PS/2 mode, cannot use it\n",
+ pp_direct_iobase);
+ return -1;
+ }
+ lprintf(0, "Parport 0x%x using direct hardware access\n", pp_direct_iobase);
+ if (pp_direct_flags & FLAGS_PCECR)
+ outb(0x30, pp_direct_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+ parport_ops = parport_direct_ops;
+ if ((flags & PPFLAG_SWEMULECP) || !(pp_direct_flags & FLAGS_PCECP)) {
+ parport_ops.parport_ecp_write_data = parport_direct_emul_ops.parport_ecp_write_data;
+ parport_ops.parport_ecp_read_data = parport_direct_emul_ops.parport_ecp_read_data;
+ parport_ops.parport_ecp_write_addr = parport_direct_emul_ops.parport_ecp_write_addr;
+ lprintf(0, "Parport 0x%x emulating ECP\n", pp_direct_iobase);
+ }
+ if ((flags & PPFLAG_SWEMULEPP) || !(pp_direct_flags & (FLAGS_PCEPP | FLAGS_PCECPEPP))) {
+ parport_ops.parport_epp_write_data = parport_direct_emul_ops.parport_epp_write_data;
+ parport_ops.parport_epp_read_data = parport_direct_emul_ops.parport_epp_read_data;
+ parport_ops.parport_epp_write_addr = parport_direct_emul_ops.parport_epp_write_addr;
+ parport_ops.parport_epp_read_addr = parport_direct_emul_ops.parport_epp_read_addr;
+ lprintf(0, "Parport 0x%x emulating EPP\n", pp_direct_iobase);
+ }
+ return 0;
+}
+
+int parport_init_direct(unsigned io)
+{
+ return parport_init_direct_flags(io, 0);
+}
diff --git a/main/ppkdrv.c b/main/ppkdrv.c
new file mode 100644
index 0000000..b161fc3
--- /dev/null
+++ b/main/ppkdrv.c
@@ -0,0 +1,290 @@
+/*****************************************************************************/
+
+/*
+ * ppkdrv.c -- Parport access via Linux kernel driver.
+ *
+ * Copyright (C) 1998-1999 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <linux/socket.h>
+#include <net/if.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+int pp_kdrv_fd = -1;
+struct ifreq pp_kdrv_ifr;
+
+/* ---------------------------------------------------------------------- */
+
+void parport_kdrv_exit(void)
+{
+ if (pp_kdrv_fd != -1)
+ close(pp_kdrv_fd);
+ pp_kdrv_fd = -1;
+}
+
+/* ---------------------------------------------------------------------- */
+
+struct eppflex_ioctl_params {
+ int cmd;
+ int mode;
+ union {
+ unsigned char d;
+ struct {
+ unsigned size;
+ unsigned char *data;
+ } blk;
+ } u;
+};
+
+#define EPPFLEX_PPRSTATUS _IOR(0xbc, 0x81, struct eppflex_ioctl_params)
+#define EPPFLEX_PPRCONTROL _IOR(0xbc, 0x83, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWCONTROL _IOW(0xbc, 0x84, struct eppflex_ioctl_params)
+#define EPPFLEX_PPRDATA _IOR(0xbc, 0x85, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWDATA _IOW(0xbc, 0x86, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWFPGACFG _IOW(0xbc, 0x87, struct eppflex_ioctl_params)
+#define EPPFLEX_PPREPPDATA _IOR(0xbc, 0x88, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWEPPDATA _IOW(0xbc, 0x89, struct eppflex_ioctl_params)
+#define EPPFLEX_PPREPPADDR _IOR(0xbc, 0x8a, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWEPPADDR _IOW(0xbc, 0x8b, struct eppflex_ioctl_params)
+#define EPPFLEX_PPRECPDATA _IOR(0xbc, 0x8c, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWECPDATA _IOW(0xbc, 0x8d, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWECPCMD _IOW(0xbc, 0x8e, struct eppflex_ioctl_params)
+#define EPPFLEX_PPCHANGEMODE _IOW(0xbc, 0x8f, struct eppflex_ioctl_params)
+
+/* ---------------------------------------------------------------------- */
+
+unsigned char parport_kdrv_read_data(void)
+{
+ struct ifreq ifr = pp_kdrv_ifr;
+ struct eppflex_ioctl_params i = { EPPFLEX_PPRDATA, };
+
+ ifr.ifr_data = (caddr_t)&i;
+ ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr);
+ return i.u.d;
+}
+
+void parport_kdrv_write_data(unsigned char d)
+{
+ struct ifreq ifr = pp_kdrv_ifr;
+ struct eppflex_ioctl_params i = { EPPFLEX_PPWDATA, };
+
+ ifr.ifr_data = (caddr_t)&i;
+ i.u.d = d;
+ ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr);
+}
+
+unsigned char parport_kdrv_read_status(void)
+{
+ struct ifreq ifr = pp_kdrv_ifr;
+ struct eppflex_ioctl_params i = { EPPFLEX_PPRSTATUS, };
+
+ ifr.ifr_data = (caddr_t)&i;
+ ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr);
+ return i.u.d;
+}
+
+
+unsigned char parport_kdrv_read_control(void)
+{
+ struct ifreq ifr = pp_kdrv_ifr;
+ struct eppflex_ioctl_params i = { EPPFLEX_PPRCONTROL, };
+
+ ifr.ifr_data = (caddr_t)&i;
+ ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr);
+ return i.u.d;
+}
+
+void parport_kdrv_write_control(unsigned char d)
+{
+ struct ifreq ifr = pp_kdrv_ifr;
+ struct eppflex_ioctl_params i = { EPPFLEX_PPWCONTROL, };
+
+ ifr.ifr_data = (caddr_t)&i;
+ i.u.d = d;
+ ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr);
+}
+
+void parport_kdrv_frob_control(unsigned char mask, unsigned char val)
+{
+ struct ifreq ifr = pp_kdrv_ifr;
+ struct eppflex_ioctl_params i = { EPPFLEX_PPRCONTROL, };
+
+ ifr.ifr_data = (caddr_t)&i;
+ ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr);
+ i.u.d = (i.u.d & (~mask)) ^ val;
+ i.cmd = EPPFLEX_PPWCONTROL;
+ ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr);
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_kdrv_epp_write_data(const void *buf, unsigned sz)
+{
+ struct ifreq ifr = pp_kdrv_ifr;
+ struct eppflex_ioctl_params i = { EPPFLEX_PPWEPPDATA, };
+
+ ifr.ifr_data = (caddr_t)&i;
+ i.u.blk.size = sz;
+ i.u.blk.data = (void *)buf;
+ if (ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr))
+ return 0;
+ return sz;
+}
+
+unsigned parport_kdrv_epp_read_data(void *buf, unsigned sz)
+{
+ struct ifreq ifr = pp_kdrv_ifr;
+ struct eppflex_ioctl_params i = { EPPFLEX_PPREPPDATA, };
+
+ ifr.ifr_data = (caddr_t)&i;
+ i.u.blk.size = sz;
+ i.u.blk.data = (void *)buf;
+ if (ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr))
+ return 0;
+ return sz;
+}
+
+unsigned parport_kdrv_epp_write_addr(const void *buf, unsigned sz)
+{
+ struct ifreq ifr = pp_kdrv_ifr;
+ struct eppflex_ioctl_params i = { EPPFLEX_PPWEPPADDR, };
+
+ ifr.ifr_data = (caddr_t)&i;
+ i.u.blk.size = sz;
+ i.u.blk.data = (void *)buf;
+ if (ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr))
+ return 0;
+ return sz;
+}
+
+unsigned parport_kdrv_epp_read_addr(void *buf, unsigned sz)
+{
+ struct ifreq ifr = pp_kdrv_ifr;
+ struct eppflex_ioctl_params i = { EPPFLEX_PPREPPADDR, };
+
+ ifr.ifr_data = (caddr_t)&i;
+ i.u.blk.size = sz;
+ i.u.blk.data = (void *)buf;
+ if (ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr))
+ return 0;
+ return sz;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_kdrv_ecp_write_data(const void *buf, unsigned sz)
+{
+ struct ifreq ifr = pp_kdrv_ifr;
+ struct eppflex_ioctl_params i = { EPPFLEX_PPWECPDATA, };
+
+ ifr.ifr_data = (caddr_t)&i;
+ i.u.blk.size = sz;
+ i.u.blk.data = (void *)buf;
+ if (ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr))
+ return 0;
+ return sz;
+}
+
+unsigned parport_kdrv_ecp_write_addr(const void *buf, unsigned sz)
+{
+ struct ifreq ifr = pp_kdrv_ifr;
+ struct eppflex_ioctl_params i = { EPPFLEX_PPWECPCMD, };
+
+ ifr.ifr_data = (caddr_t)&i;
+ i.u.blk.size = sz;
+ i.u.blk.data = (void *)buf;
+ if (ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr))
+ return 0;
+ return sz;
+}
+
+unsigned parport_kdrv_ecp_read_data(void *buf, unsigned sz)
+{
+ struct ifreq ifr = pp_kdrv_ifr;
+ struct eppflex_ioctl_params i = { EPPFLEX_PPRECPDATA, };
+
+ ifr.ifr_data = (caddr_t)&i;
+ i.u.blk.size = sz;
+ i.u.blk.data = (void *)buf;
+ if (ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr))
+ return 0;
+ return sz;
+}
+
+/* ---------------------------------------------------------------------- */
+#if 0
+
+unsigned parport_kdrv_fpgaconfig_write(const void *buf, unsigned sz)
+{
+ const unsigned char *bp = buf;
+ unsigned u;
+
+ for (u = 0; u < sz; u++, bp++)
+ parport_kdrv_write_data(*bp);
+ return sz;
+}
+
+#else
+
+unsigned parport_kdrv_fpgaconfig_write(const void *buf, unsigned sz)
+{
+ struct ifreq ifr = pp_kdrv_ifr;
+ struct eppflex_ioctl_params i = { EPPFLEX_PPWFPGACFG, };
+
+ ifr.ifr_data = (caddr_t)&i;
+ i.u.blk.size = sz;
+ i.u.blk.data = (void *)buf;
+ if (ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr))
+ return 0;
+ return sz;
+}
+
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+const struct parport_ops parport_kdrv_ops = {
+ parport_kdrv_read_data,
+ parport_kdrv_write_data,
+ parport_kdrv_read_status,
+ parport_kdrv_read_control,
+ parport_kdrv_write_control,
+ parport_kdrv_frob_control,
+ parport_kdrv_epp_write_data,
+ parport_kdrv_epp_read_data,
+ parport_kdrv_epp_write_addr,
+ parport_kdrv_epp_read_addr,
+ parport_kdrv_ecp_write_data,
+ parport_kdrv_ecp_read_data,
+ parport_kdrv_ecp_write_addr,
+ parport_kdrv_fpgaconfig_write
+};
+
+/* ---------------------------------------------------------------------- */
diff --git a/main/ppkdrvinit.c b/main/ppkdrvinit.c
new file mode 100644
index 0000000..4379430
--- /dev/null
+++ b/main/ppkdrvinit.c
@@ -0,0 +1,114 @@
+/*****************************************************************************/
+
+/*
+ * ppkdrvinit.c -- Parport access via Linux kernel driver (init routines).
+ *
+ * Copyright (C) 1998-1999 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <linux/socket.h>
+#include <net/if.h>
+#include <linux/if_ether.h>
+#include <netinet/in.h>
+
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+extern int pp_kdrv_fd;
+extern struct ifreq pp_kdrv_ifr;
+extern const struct parport_ops parport_kdrv_ops;
+extern void parport_kdrv_exit(void);
+
+/* ---------------------------------------------------------------------- */
+
+struct eppflex_ioctl_params {
+ int cmd;
+ int mode;
+ union {
+ unsigned char d;
+ struct {
+ unsigned size;
+ unsigned char *data;
+ } blk;
+ } u;
+};
+
+#define EPPFLEX_PPRSTATUS _IOR(0xbc, 0x81, struct eppflex_ioctl_params)
+#define EPPFLEX_PPRCONTROL _IOR(0xbc, 0x83, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWCONTROL _IOW(0xbc, 0x84, struct eppflex_ioctl_params)
+#define EPPFLEX_PPRDATA _IOR(0xbc, 0x85, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWDATA _IOW(0xbc, 0x86, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWFPGACFG _IOW(0xbc, 0x87, struct eppflex_ioctl_params)
+#define EPPFLEX_PPREPPDATA _IOR(0xbc, 0x88, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWEPPDATA _IOW(0xbc, 0x89, struct eppflex_ioctl_params)
+#define EPPFLEX_PPREPPADDR _IOR(0xbc, 0x8a, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWEPPADDR _IOW(0xbc, 0x8b, struct eppflex_ioctl_params)
+#define EPPFLEX_PPRECPDATA _IOR(0xbc, 0x8c, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWECPDATA _IOW(0xbc, 0x8d, struct eppflex_ioctl_params)
+#define EPPFLEX_PPWECPCMD _IOW(0xbc, 0x8e, struct eppflex_ioctl_params)
+#define EPPFLEX_PPCHANGEMODE _IOW(0xbc, 0x8f, struct eppflex_ioctl_params)
+
+/* ---------------------------------------------------------------------- */
+
+int parport_init_ppkdrv(const char *ifname)
+{
+ struct ifreq ifr;
+ struct eppflex_ioctl_params i;
+
+ strncpy(pp_kdrv_ifr.ifr_name, ifname, sizeof(pp_kdrv_ifr.ifr_name));
+ if ((pp_kdrv_fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_AX25))) == -1) {
+ lprintf(0, "Cannot open socket (error %s)\n", strerror(errno));
+ return -1;
+ }
+ if (ioctl(pp_kdrv_fd, SIOCGIFINDEX, &pp_kdrv_ifr)) {
+ lprintf(0, "Cannot open interface %s (error %s)\n", ifname, strerror(errno));
+ close(pp_kdrv_fd);
+ return -1;
+ }
+ ifr = pp_kdrv_ifr;
+ i.cmd = EPPFLEX_PPRCONTROL;
+ ifr.ifr_data = (caddr_t)&i;
+ if (ioctl(pp_kdrv_fd, SIOCDEVPRIVATE, &ifr)) {
+ lprintf(0, "Cannot access parport through kernel driver %s (error %s)\n", ifname,
+ strerror(errno));
+ close(pp_kdrv_fd);
+ return -1;
+ }
+ if (atexit(parport_kdrv_exit)) {
+ lprintf(0, "Cannot install atexit handler (error %s)\n", strerror(errno));
+ close(pp_kdrv_fd);
+ pp_kdrv_fd = -1;
+ return -1;
+ }
+ parport_ops = parport_kdrv_ops;
+ return 0;
+}
diff --git a/main/ppnt.c b/main/ppnt.c
new file mode 100644
index 0000000..33a8ef1
--- /dev/null
+++ b/main/ppnt.c
@@ -0,0 +1,1023 @@
+/*****************************************************************************/
+
+/*
+ * ppnt.c -- Parport direct access with NT eppflex.sys.
+ *
+ * Copyright (C) 2000 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#include <windows.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+#define DEVICE_TYPE DWORD
+
+#define CTL_CODE( DeviceType, Function, Method, Access ) ( \
+ ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
+)
+
+#define METHOD_BUFFERED 0
+#define METHOD_IN_DIRECT 1
+#define METHOD_OUT_DIRECT 2
+#define METHOD_NEITHER 3
+
+#define FILE_ANY_ACCESS 0
+#define FILE_READ_ACCESS (0x0001)
+#define FILE_WRITE_ACCESS (0x0002)
+
+#include "eppflex.h"
+
+/* ---------------------------------------------------------------------- */
+
+/* LPT registers */
+/* ECP specific registers */
+#define LPTREG_ECONTROL 0x402
+#define LPTREG_CONFIGB 0x401
+#define LPTREG_CONFIGA 0x400
+#define LPTREG_TFIFO 0x400
+#define LPTREG_DFIFO 0x400
+#define LPTREG_AFIFO 0x000
+#define LPTREG_DSR 0x001
+#define LPTREG_DCR 0x002
+/* EPP specific registers */
+#define LPTREG_EPPDATA 0x004
+#define LPTREG_EPPADDR 0x003
+/* standard registers */
+#define LPTREG_CONTROL 0x002
+#define LPTREG_STATUS 0x001
+#define LPTREG_DATA 0x000
+
+/* ECP config A */
+#define LPTCFGA_INTRISALEVEL 0x80
+#define LPTCFGA_IMPIDMASK 0x70
+#define LPTCFGA_IMPID16BIT 0x00
+#define LPTCFGA_IMPID8BIT 0x10
+#define LPTCFGA_IMPID32BIT 0x20
+#define LPTCFGA_NOPIPELINE 0x04
+#define LPTCFGA_PWORDCOUNT 0x03
+
+/* ECP config B */
+#define LPTCFGB_COMPRESS 0x80
+#define LPTCFGB_INTRVALUE 0x40
+#define LPTCFGB_IRQMASK 0x38
+#define LPTCFGB_IRQ5 0x38
+#define LPTCFGB_IRQ15 0x30
+#define LPTCFGB_IRQ14 0x28
+#define LPTCFGB_IRQ11 0x20
+#define LPTCFGB_IRQ10 0x18
+#define LPTCFGB_IRQ9 0x10
+#define LPTCFGB_IRQ7 0x08
+#define LPTCFGB_IRQJUMPER 0x00
+#define LPTCFGB_DMAMASK 0x07
+#define LPTCFGB_DMA7 0x07
+#define LPTCFGB_DMA6 0x06
+#define LPTCFGB_DMA5 0x05
+#define LPTCFGB_DMAJUMPER16 0x04
+#define LPTCFGB_DMA3 0x03
+#define LPTCFGB_DMA2 0x02
+#define LPTCFGB_DMA1 0x01
+#define LPTCFGB_DMAJUMPER8 0x00
+
+/* ECP ECR */
+#define LPTECR_MODEMASK 0xe0
+#define LPTECR_MODESPP 0x00
+#define LPTECR_MODEPS2 0x20
+#define LPTECR_MODESPPFIFO 0x40
+#define LPTECR_MODEECP 0x60
+#define LPTECR_MODEECPEPP 0x80
+#define LPTECR_MODETEST 0xc0
+#define LPTECR_MODECFG 0xe0
+#define LPTECR_NERRINTRDIS 0x10
+#define LPTECR_DMAEN 0x08
+#define LPTECR_SERVICEINTR 0x04
+#define LPTECR_FIFOFULL 0x02
+#define LPTECR_FIFOEMPTY 0x01
+
+/* ---------------------------------------------------------------------- */
+
+HANDLE pp_nt_handle = INVALID_HANDLE_VALUE;
+unsigned int pp_nt_flags = 0;
+
+#define FLAGS_PCSPP (1<<0)
+#define FLAGS_PCPS2 (1<<1)
+#define FLAGS_PCEPP (1<<2)
+#define FLAGS_PCECR (1<<3) /* ECR Register Exists */
+#define FLAGS_PCECP (1<<4)
+#define FLAGS_PCECPEPP (1<<5)
+#define FLAGS_PCECPPS2 (1<<6)
+
+/* ---------------------------------------------------------------------- */
+
+unsigned char parport_nt_read_data(void)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_nt_handle == INVALID_HANDLE_VALUE)
+ return 0xff;
+ res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_READ_DATA, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res) {
+ lprintf(0, "Parport: parport_nt_read_data failed, error 0x%08lx\n", GetLastError());
+ return 0xff;
+ }
+ if (retl != sizeof(rw)) {
+ lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+ return 0xff;
+ }
+ return rw.data;
+}
+
+void parport_nt_write_data(unsigned char d)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_nt_handle == INVALID_HANDLE_VALUE)
+ return;
+ rw.data = d;
+ res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_WRITE_DATA, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res)
+ lprintf(0, "Parport: parport_nt_write_data failed, error 0x%08lx\n", GetLastError());
+}
+
+unsigned char parport_nt_read_status(void)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_nt_handle == INVALID_HANDLE_VALUE)
+ return 0xff;
+ res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_READ_STATUS, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res) {
+ lprintf(0, "Parport: parport_nt_read_status failed, error 0x%08lx\n", GetLastError());
+ return 0xff;
+ }
+ if (retl != sizeof(rw)) {
+ lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+ return 0xff;
+ }
+ return rw.data;
+}
+
+void parport_nt_write_status(unsigned char d)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_nt_handle == INVALID_HANDLE_VALUE)
+ return;
+ rw.data = d;
+ res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_WRITE_STATUS, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res)
+ lprintf(0, "Parport: parport_nt_write_status failed, error 0x%08lx\n", GetLastError());
+}
+
+unsigned char parport_nt_read_control(void)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_nt_handle == INVALID_HANDLE_VALUE)
+ return 0xff;
+ res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_READ_CONTROL, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res) {
+ lprintf(0, "Parport: parport_nt_read_control failed, error 0x%08lx\n", GetLastError());
+ return 0xff;
+ }
+ if (retl != sizeof(rw)) {
+ lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+ return 0xff;
+ }
+ return rw.data;
+}
+
+void parport_nt_write_control(unsigned char d)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_nt_handle == INVALID_HANDLE_VALUE)
+ return;
+ rw.data = d;
+ res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_WRITE_CONTROL, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res)
+ lprintf(0, "Parport: parport_nt_write_control failed, error 0x%08lx\n", GetLastError());
+}
+
+void parport_nt_frob_control(unsigned char mask, unsigned char val)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_nt_handle == INVALID_HANDLE_VALUE)
+ return;
+ rw.data = val;
+ rw.mask = mask;
+ res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_FROB_CONTROL, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res) {
+ lprintf(0, "Parport: parport_nt_frob_control failed, error 0x%08lx\n", GetLastError());
+ return;
+ }
+ if (retl != sizeof(rw)) {
+ lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+ return;
+ }
+}
+
+unsigned char parport_nt_read_configa(void)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_nt_handle == INVALID_HANDLE_VALUE)
+ return 0xff;
+ res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_READ_CONFIGA, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res) {
+ lprintf(0, "Parport: parport_nt_read_configa failed, error 0x%08lx\n", GetLastError());
+ return 0xff;
+ }
+ if (retl != sizeof(rw)) {
+ lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+ return 0xff;
+ }
+ return rw.data;
+}
+
+void parport_nt_write_configa(unsigned char d)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_nt_handle == INVALID_HANDLE_VALUE)
+ return;
+ rw.data = d;
+ res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_WRITE_CONFIGA, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res)
+ lprintf(0, "Parport: parport_nt_write_configa failed, error 0x%08lx\n", GetLastError());
+}
+
+unsigned char parport_nt_read_configb(void)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_nt_handle == INVALID_HANDLE_VALUE)
+ return 0xff;
+ res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_READ_CONFIGB, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res) {
+ lprintf(0, "Parport: parport_nt_read_configb failed, error 0x%08lx\n", GetLastError());
+ return 0xff;
+ }
+ if (retl != sizeof(rw)) {
+ lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+ return 0xff;
+ }
+ return rw.data;
+}
+
+void parport_nt_write_configb(unsigned char d)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_nt_handle == INVALID_HANDLE_VALUE)
+ return;
+ rw.data = d;
+ res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_WRITE_CONFIGB, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res)
+ lprintf(0, "Parport: parport_nt_write_configb failed, error 0x%08lx\n", GetLastError());
+}
+
+unsigned char parport_nt_read_econtrol(void)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_nt_handle == INVALID_HANDLE_VALUE)
+ return 0xff;
+ res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_READ_ECONTROL, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res) {
+ lprintf(0, "Parport: parport_nt_read_econtrol failed, error 0x%08lx\n", GetLastError());
+ return 0xff;
+ }
+ if (retl != sizeof(rw)) {
+ lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+ return 0xff;
+ }
+ return rw.data;
+}
+
+void parport_nt_write_econtrol(unsigned char d)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_nt_handle == INVALID_HANDLE_VALUE)
+ return;
+ rw.data = d;
+ res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_WRITE_ECONTROL, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res)
+ lprintf(0, "Parport: parport_nt_write_econtrol failed, error 0x%08lx\n", GetLastError());
+}
+
+void parport_nt_frob_econtrol(unsigned char mask, unsigned char val)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_nt_handle == INVALID_HANDLE_VALUE)
+ return;
+ rw.data = val;
+ rw.mask = mask;
+ res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_FROB_ECONTROL, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res) {
+ lprintf(0, "Parport: parport_nt_frob_econtrol failed, error 0x%08lx\n", GetLastError());
+ return;
+ }
+ if (retl != sizeof(rw)) {
+ lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+ return;
+ }
+}
+
+unsigned char parport_nt_read_eppaddr(void)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_nt_handle == INVALID_HANDLE_VALUE)
+ return 0xff;
+ res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_READ_EPPADDR, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res) {
+ lprintf(0, "Parport: parport_nt_read_eppaddr failed, error 0x%08lx\n", GetLastError());
+ return 0xff;
+ }
+ if (retl != sizeof(rw)) {
+ lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+ return 0xff;
+ }
+ return rw.data;
+}
+
+void parport_nt_write_eppaddr(unsigned char d)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_nt_handle == INVALID_HANDLE_VALUE)
+ return;
+ rw.data = d;
+ res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_WRITE_EPPADDR, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res)
+ lprintf(0, "Parport: parport_nt_write_eppaddr failed, error 0x%08lx\n", GetLastError());
+}
+
+unsigned char parport_nt_read_eppdata(void)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_nt_handle == INVALID_HANDLE_VALUE)
+ return 0xff;
+ res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_READ_EPPDATA, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res) {
+ lprintf(0, "Parport: parport_nt_read_eppdata failed, error 0x%08lx\n", GetLastError());
+ return 0xff;
+ }
+ if (retl != sizeof(rw)) {
+ lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+ return 0xff;
+ }
+ return rw.data;
+}
+
+void parport_nt_write_eppdata(unsigned char d)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_nt_handle == INVALID_HANDLE_VALUE)
+ return;
+ rw.data = d;
+ res = DeviceIoControl(pp_nt_handle, IOCTL_EPPFLEX_WRITE_EPPDATA, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res)
+ lprintf(0, "Parport: parport_nt_write_eppdata failed, error 0x%08lx\n", GetLastError());
+}
+
+/* ---------------------------------------------------------------------- */
+
+extern inline void setecr(unsigned char ecr)
+{
+ if (pp_nt_flags & FLAGS_PCECR)
+ parport_nt_write_econtrol(ecr);
+}
+
+int pp_nt_epp_clear_timeout(void)
+{
+ unsigned char r;
+
+ if (!(parport_nt_read_status() & LPTSTAT_EPPTIMEOUT))
+ return 1;
+ /* To clear timeout some chips require double read */
+ parport_nt_read_status();
+ r = parport_nt_read_status();
+ parport_nt_write_status(r | 0x01); /* Some reset by writing 1 */
+ parport_nt_write_status(r & 0xfe); /* Others by writing 0 */
+ r = parport_nt_read_status();
+ return !(r & 0x01);
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_nt_epp_write_data(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+
+ setecr(0x90); /* EPP mode */
+ for (; sz > 0; sz--, bp++) {
+ parport_nt_write_eppdata(*bp);
+ if (parport_nt_read_status() & LPTSTAT_EPPTIMEOUT) {
+ pp_nt_epp_clear_timeout();
+ goto rt;
+ }
+ ret++;
+ }
+ rt:
+ setecr(0x30); /* PS/2 mode */
+ return ret;
+}
+
+unsigned parport_nt_epp_read_data(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+
+ setecr(0x90); /* EPP mode */
+ for (; sz > 0; sz--, bp++) {
+ *bp = parport_nt_read_eppdata();
+ if (parport_nt_read_status() & LPTSTAT_EPPTIMEOUT) {
+ pp_nt_epp_clear_timeout();
+ goto rt;
+ }
+ ret++;
+ }
+ rt:
+ setecr(0x30); /* PS/2 mode */
+ return ret;
+}
+
+unsigned parport_nt_epp_write_addr(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+
+ setecr(0x90); /* EPP mode */
+ for (; sz > 0; sz--, bp++) {
+ parport_nt_write_eppaddr(*bp);
+ if (parport_nt_read_status() & LPTSTAT_EPPTIMEOUT) {
+ pp_nt_epp_clear_timeout();
+ goto rt;
+ }
+ ret++;
+ }
+ rt:
+ setecr(0x30); /* PS/2 mode */
+ return ret;
+}
+
+unsigned parport_nt_epp_read_addr(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+
+ setecr(0x90); /* EPP mode */
+ for (; sz > 0; sz--, bp++) {
+ *bp = parport_nt_read_eppaddr();
+ if (parport_nt_read_status() & LPTSTAT_EPPTIMEOUT) {
+ pp_nt_epp_clear_timeout();
+ goto rt;
+ }
+ ret++;
+ }
+ rt:
+ setecr(0x30); /* PS/2 mode */
+ return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_nt_emul_epp_write_data(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo;
+
+ parport_nt_write_control(LPTCTRL_PROGRAM | LPTCTRL_WRITE);
+ for (; sz > 0; sz--, bp++) {
+ parport_nt_write_data(*bp);
+ for (tmo = 0; ; tmo++) {
+ if (parport_nt_read_status() & LPTSTAT_WAIT)
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ parport_nt_write_control(LPTCTRL_PROGRAM | LPTCTRL_WRITE | LPTCTRL_DATASTB);
+ for (tmo = 0; ; tmo++) {
+ if (!(parport_nt_read_status() & LPTSTAT_WAIT))
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ parport_nt_write_control(LPTCTRL_PROGRAM | LPTCTRL_WRITE);
+ ret++;
+ }
+ return ret;
+}
+
+unsigned parport_nt_emul_epp_read_data(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo;
+
+ parport_nt_write_control(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION);
+ for (; sz > 0; sz--, bp++) {
+ for (tmo = 0; ; tmo++) {
+ if (parport_nt_read_status() & LPTSTAT_WAIT)
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ parport_nt_write_control(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION | LPTCTRL_DATASTB);
+ for (tmo = 0; ; tmo++) {
+ if (!(parport_nt_read_status() & LPTSTAT_WAIT))
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ *bp = parport_nt_read_data();
+ parport_nt_write_control(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION);
+ ret++;
+ }
+ return ret;
+}
+
+unsigned parport_nt_emul_epp_write_addr(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo;
+
+ parport_nt_write_control(LPTCTRL_PROGRAM | LPTCTRL_WRITE);
+ for (; sz > 0; sz--, bp++) {
+ parport_nt_write_data(*bp);
+ for (tmo = 0; ; tmo++) {
+ if (parport_nt_read_status() & LPTSTAT_WAIT)
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ parport_nt_write_control(LPTCTRL_PROGRAM | LPTCTRL_WRITE | LPTCTRL_ADDRSTB);
+ for (tmo = 0; ; tmo++) {
+ if (!(parport_nt_read_status() & LPTSTAT_WAIT))
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ parport_nt_write_control(LPTCTRL_PROGRAM | LPTCTRL_WRITE);
+ ret++;
+ }
+ return ret;
+}
+
+unsigned parport_nt_emul_epp_read_addr(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo;
+
+ parport_nt_write_control(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION);
+ for (; sz > 0; sz--, bp++) {
+ for (tmo = 0; ; tmo++) {
+ if (parport_nt_read_status() & LPTSTAT_WAIT)
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ parport_nt_write_control(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION | LPTCTRL_ADDRSTB);
+ for (tmo = 0; ; tmo++) {
+ if (!(parport_nt_read_status() & LPTSTAT_WAIT))
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ *bp = parport_nt_read_data();
+ parport_nt_write_control(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION);
+ ret++;
+ }
+ return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static int ecp_forward(void)
+{
+ unsigned tmo = 0x10000;
+
+ if (parport_nt_read_status() & 0x20)
+ return 0;
+ /* Event 47: Set nInit high */
+ parport_nt_write_control(0x26);
+ /* Event 49: PError goes high */
+ while (!(parport_nt_read_status() & 0x20)) {
+ if (!(--tmo))
+ return -1;
+ }
+ /* start driving the bus */
+ parport_nt_write_control(0x04);
+ return 0;
+}
+
+static int ecp_reverse(void)
+{
+ unsigned tmo = 0x10000;
+
+ if (!(parport_nt_read_status() & 0x20))
+ return 0;
+ parport_nt_write_control(0x24);
+ /* Event 39: Set nInit low to initiate bus reversal */
+ parport_nt_write_control(0x20);
+ while (parport_nt_read_status() & 0x20) {
+ if (!(--tmo))
+ return -1;
+ }
+ return 0;
+}
+
+static unsigned emptyfifo(unsigned cnt)
+{
+ unsigned fcnt = 0;
+
+ parport_nt_write_econtrol(0xd0); /* FIFOtest mode */
+ while ((parport_nt_read_econtrol() & 0x01) && fcnt < 32 && fcnt < cnt) {
+ parport_nt_read_configa();
+ fcnt++;
+ }
+ lprintf(10, "emptyfifo: FIFO contained %d bytes\n", fcnt);
+ parport_nt_write_econtrol(0x30); /* PS/2 mode */
+ return cnt - fcnt;
+}
+
+unsigned parport_nt_ecp_write_data(const void *buf, unsigned sz)
+{
+ const unsigned char *bp = (const unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo = 0x10000;
+ unsigned char stat;
+ unsigned int i;
+
+ if (ecp_forward())
+ return 0;
+ parport_nt_write_econtrol(0x70); /* ECP mode */
+ while (sz > 0) {
+ while ((stat = parport_nt_read_econtrol()) & 0x02) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ if (stat & 0x01 && sz >= 8) {
+ for (i = 0; i < 8; i++)
+ parport_nt_write_configa(bp[i]);
+ bp += 8;
+ sz -= 8;
+ ret += 8;
+ } else {
+ parport_nt_write_configa(*bp++);
+ sz--;
+ ret++;
+ }
+ tmo = 0x10000;
+ }
+ while (!(parport_nt_read_econtrol() & 0x01) || !(parport_nt_read_status() & 0x80)) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ parport_nt_write_econtrol(0x30); /* PS/2 mode */
+ return ret;
+}
+
+unsigned parport_nt_ecp_read_data(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo = 0x10000;
+ unsigned char stat;
+ unsigned int i;
+
+ if (ecp_reverse())
+ return 0;
+ parport_nt_write_econtrol(0x70); /* ECP mode */
+ while (sz > 0) {
+ while ((stat = parport_nt_read_econtrol()) & 0x01)
+ if (!(--tmo)) {
+ parport_nt_write_econtrol(0xd0); /* FIFOTEST mode */
+ while (!(parport_nt_read_econtrol() & 0x01) && sz > 0) {
+ *bp++ = parport_nt_read_configa();
+ sz--;
+ ret++;
+ }
+ parport_nt_write_econtrol(0x30); /* PS/2 mode */
+ return ret;
+ }
+ if (stat & 0x02 && sz >= 8) {
+ for (i = 0; i < 8; i++)
+ bp[i] = parport_nt_read_configa();
+ bp += 8;
+ sz -= 8;
+ ret += 8;
+ } else {
+ *bp++ = parport_nt_read_configa();
+ sz--;
+ ret++;
+ }
+ tmo = 0x10000;
+ }
+ parport_nt_write_econtrol(0x30); /* PS/2 mode */
+ return ret;
+}
+
+unsigned parport_nt_ecp_write_addr(const void *buf, unsigned sz)
+{
+ const unsigned char *bp = (const unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo = 0x10000;
+ unsigned char stat;
+ unsigned int i;
+
+ if (ecp_forward())
+ return 0;
+ parport_nt_write_econtrol(0x70); /* ECP mode */
+ while (sz > 0) {
+ while ((stat = parport_nt_read_econtrol()) & 0x02) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ if (stat & 0x01 && sz >= 8) {
+ for (i = 0; i < 8; i++)
+ parport_nt_write_data(bp[i]);
+ bp += 8;
+ sz -= 8;
+ ret += 8;
+ } else {
+ parport_nt_write_data(*bp++);
+ sz--;
+ ret++;
+ }
+ tmo = 0x10000;
+ }
+ while (!(parport_nt_read_econtrol() & 0x01) || !(parport_nt_read_status() & 0x80)) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ parport_nt_write_econtrol(0x30); /* PS/2 mode */
+ return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_nt_emul_ecp_write_data(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret;
+ unsigned char ctl;
+ unsigned tmo;
+
+ if (ecp_forward())
+ return 0;
+ ctl = parport_nt_read_control() & ~PARPORT_CONTROL_AUTOFD;
+ /* HostAck high (data, not command) */
+ parport_nt_write_control(ctl);
+ for (ret = 0; ret < sz; ret++, bp++) {
+ parport_nt_write_data(*bp);
+ parport_nt_write_control(ctl | PARPORT_CONTROL_STROBE);
+ for (tmo = 0; parport_nt_read_status() & PARPORT_STATUS_BUSY; tmo++)
+ if (tmo > 0x1000)
+ return ret;
+ parport_nt_write_control(ctl);
+ for (tmo = 0; !(parport_nt_read_status() & PARPORT_STATUS_BUSY); tmo++)
+ if (tmo > 0x1000)
+ return ret;
+ }
+ return ret;
+}
+
+unsigned parport_nt_emul_ecp_write_addr(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret;
+ unsigned char ctl;
+ unsigned tmo;
+
+ if (ecp_forward())
+ return 0;
+ ctl = parport_nt_read_control() | PARPORT_CONTROL_AUTOFD;
+ /* HostAck low (command, not data) */
+ parport_nt_write_control(ctl);
+ for (ret = 0; ret < sz; ret++, bp++) {
+ parport_nt_write_data(*bp);
+ parport_nt_write_control(ctl | PARPORT_CONTROL_STROBE);
+ for (tmo = 0; parport_nt_read_status() & PARPORT_STATUS_BUSY; tmo++)
+ if (tmo > 0x1000)
+ return ret;
+ parport_nt_write_control(ctl);
+ for (tmo = 0; !(parport_nt_read_status() & PARPORT_STATUS_BUSY); tmo++)
+ if (tmo > 0x1000)
+ return ret;
+ }
+ return ret;
+}
+
+unsigned parport_nt_emul_ecp_read_data(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned char ctl, stat;
+ int command;
+ unsigned tmo;
+
+ if (ecp_reverse())
+ return 0;
+ ctl = parport_nt_read_control();
+ /* Set HostAck low to start accepting data. */
+ parport_nt_write_control(ctl | PARPORT_CONTROL_AUTOFD);
+ while (ret < sz) {
+ /* Event 43: Peripheral sets nAck low. It can take as
+ long as it wants. */
+ tmo = 0;
+ do {
+ stat = parport_nt_read_status();
+ if ((++tmo) > 0x10000)
+ goto out;
+ } while (stat & PARPORT_STATUS_ACK);
+ /* Is this a command? */
+ command = stat & PARPORT_STATUS_BUSY;
+ if (command) {
+ //lprintf(3, "ECP: warning: emulation does not support RLE\n");
+ goto out;
+ }
+ /* Read the data. */
+ *bp = parport_nt_read_data();
+ /* Event 44: Set HostAck high, acknowledging handshake. */
+ parport_nt_write_control(ctl & ~PARPORT_CONTROL_AUTOFD);
+ /* Event 45: The peripheral has 35ms to set nAck high. */
+ tmo = 0;
+ do {
+ stat = parport_nt_read_status();
+ if ((++tmo) > 0x10000)
+ goto out;
+ } while (!(stat & PARPORT_STATUS_ACK));
+ /* Event 46: Set HostAck low and accept the data. */
+ parport_nt_write_control(ctl | PARPORT_CONTROL_AUTOFD);
+ /* Normal data byte. */
+ bp++;
+ ret++;
+ }
+
+ out:
+ return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+#if 1
+unsigned parport_nt_fpgaconfig_write(const void *buf, unsigned sz)
+{
+ const unsigned char *bp = buf;
+ unsigned u;
+
+ for (u = 0; u < sz; u++, bp++)
+ parport_nt_write_data(*bp);
+ return sz;
+}
+#else
+
+unsigned parport_nt_fpgaconfig_write(const void *buf, unsigned sz)
+{
+ const unsigned char *bp = buf;
+ unsigned ret = 0;
+ unsigned tmo = 0x10000;
+ unsigned char stat;
+ unsigned int i;
+
+ if (pp_nt_modes & PARPORT_MODE_PCECR) {
+ parport_nt_write_econtrol(0x50); /* COMPAT FIFO mode */
+ while (sz > 0) {
+ while ((stat = parport_nt_read_econtrol()) & 0x02) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ if (stat & 0x01 && sz >= 8) {
+ for (i = 0; i < 8; i++)
+ parport_nt_write_configa(bp[i]);
+ bp += 8;
+ sz -= 8;
+ ret += 8;
+ } else {
+ parport_nt_write_configa(*bp++);
+ sz--;
+ ret++;
+ }
+ tmo = 0x10000;
+ }
+ while (!(parport_nt_read_econtrol() & 0x01) || !(parport_nt_read_status() & 0x80)) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ parport_nt_write_econtrol(0x30); /* PS/2 mode */
+ return ret;
+ }
+ for (ret = 0; ret < sz; ret++, bp++)
+ parport_nt_write_data(*bp);
+ return sz;
+}
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+const struct parport_ops parport_nt_ops = {
+ parport_nt_read_data,
+ parport_nt_write_data,
+ parport_nt_read_status,
+ parport_nt_read_control,
+ parport_nt_write_control,
+ parport_nt_frob_control,
+ parport_nt_epp_write_data,
+ parport_nt_epp_read_data,
+ parport_nt_epp_write_addr,
+ parport_nt_epp_read_addr,
+ parport_nt_ecp_write_data,
+ parport_nt_ecp_read_data,
+ parport_nt_ecp_write_addr,
+ parport_nt_fpgaconfig_write
+};
+
+const struct parport_ops parport_nt_emul_ops = {
+ parport_nt_read_data,
+ parport_nt_write_data,
+ parport_nt_read_status,
+ parport_nt_read_control,
+ parport_nt_write_control,
+ parport_nt_frob_control,
+ parport_nt_emul_epp_write_data,
+ parport_nt_emul_epp_read_data,
+ parport_nt_emul_epp_write_addr,
+ parport_nt_emul_epp_read_addr,
+ parport_nt_emul_ecp_write_data,
+ parport_nt_emul_ecp_read_data,
+ parport_nt_emul_ecp_write_addr,
+ parport_nt_fpgaconfig_write
+};
+
+/* ---------------------------------------------------------------------- */
diff --git a/main/ppntddkgenport.c b/main/ppntddkgenport.c
new file mode 100644
index 0000000..a283815
--- /dev/null
+++ b/main/ppntddkgenport.c
@@ -0,0 +1,813 @@
+/*****************************************************************************/
+
+/*
+ * ppntddkgenport.c -- Parport direct access with NTDDK genport.sys.
+ *
+ * Copyright (C) 2000 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#include <windows.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+#define DEVICE_TYPE DWORD
+
+#define CTL_CODE( DeviceType, Function, Method, Access ) ( \
+ ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
+)
+
+#define METHOD_BUFFERED 0
+#define METHOD_IN_DIRECT 1
+#define METHOD_OUT_DIRECT 2
+#define METHOD_NEITHER 3
+
+#define FILE_ANY_ACCESS 0
+#define FILE_READ_ACCESS (0x0001)
+#define FILE_WRITE_ACCESS (0x0002)
+
+#define GPD_TYPE 40000
+
+#define IOCTL_GPD_READ_PORT_UCHAR \
+ CTL_CODE( GPD_TYPE, 0x900, METHOD_BUFFERED, FILE_READ_ACCESS )
+
+#define IOCTL_GPD_READ_PORT_USHORT \
+ CTL_CODE( GPD_TYPE, 0x901, METHOD_BUFFERED, FILE_READ_ACCESS )
+
+#define IOCTL_GPD_READ_PORT_ULONG \
+ CTL_CODE( GPD_TYPE, 0x902, METHOD_BUFFERED, FILE_READ_ACCESS )
+
+#define IOCTL_GPD_WRITE_PORT_UCHAR \
+ CTL_CODE(GPD_TYPE, 0x910, METHOD_BUFFERED, FILE_WRITE_ACCESS)
+
+#define IOCTL_GPD_WRITE_PORT_USHORT \
+ CTL_CODE(GPD_TYPE, 0x911, METHOD_BUFFERED, FILE_WRITE_ACCESS)
+
+#define IOCTL_GPD_WRITE_PORT_ULONG \
+ CTL_CODE(GPD_TYPE, 0x912, METHOD_BUFFERED, FILE_WRITE_ACCESS)
+
+typedef struct _GENPORT_WRITE_INPUT {
+ ULONG PortNumber; /* Port # to write to */
+ union { /* Data to be output to port */
+ ULONG LongData;
+ USHORT ShortData;
+ UCHAR CharData;
+ };
+} GENPORT_WRITE_INPUT;
+
+/* ---------------------------------------------------------------------- */
+
+/* LPT registers */
+/* ECP specific registers */
+#define LPTREG_ECONTROL 0x402
+#define LPTREG_CONFIGB 0x401
+#define LPTREG_CONFIGA 0x400
+#define LPTREG_TFIFO 0x400
+#define LPTREG_DFIFO 0x400
+#define LPTREG_AFIFO 0x000
+#define LPTREG_DSR 0x001
+#define LPTREG_DCR 0x002
+/* EPP specific registers */
+#define LPTREG_EPPDATA 0x004
+#define LPTREG_EPPADDR 0x003
+/* standard registers */
+#define LPTREG_CONTROL 0x002
+#define LPTREG_STATUS 0x001
+#define LPTREG_DATA 0x000
+
+/* ECP config A */
+#define LPTCFGA_INTRISALEVEL 0x80
+#define LPTCFGA_IMPIDMASK 0x70
+#define LPTCFGA_IMPID16BIT 0x00
+#define LPTCFGA_IMPID8BIT 0x10
+#define LPTCFGA_IMPID32BIT 0x20
+#define LPTCFGA_NOPIPELINE 0x04
+#define LPTCFGA_PWORDCOUNT 0x03
+
+/* ECP config B */
+#define LPTCFGB_COMPRESS 0x80
+#define LPTCFGB_INTRVALUE 0x40
+#define LPTCFGB_IRQMASK 0x38
+#define LPTCFGB_IRQ5 0x38
+#define LPTCFGB_IRQ15 0x30
+#define LPTCFGB_IRQ14 0x28
+#define LPTCFGB_IRQ11 0x20
+#define LPTCFGB_IRQ10 0x18
+#define LPTCFGB_IRQ9 0x10
+#define LPTCFGB_IRQ7 0x08
+#define LPTCFGB_IRQJUMPER 0x00
+#define LPTCFGB_DMAMASK 0x07
+#define LPTCFGB_DMA7 0x07
+#define LPTCFGB_DMA6 0x06
+#define LPTCFGB_DMA5 0x05
+#define LPTCFGB_DMAJUMPER16 0x04
+#define LPTCFGB_DMA3 0x03
+#define LPTCFGB_DMA2 0x02
+#define LPTCFGB_DMA1 0x01
+#define LPTCFGB_DMAJUMPER8 0x00
+
+/* ECP ECR */
+#define LPTECR_MODEMASK 0xe0
+#define LPTECR_MODESPP 0x00
+#define LPTECR_MODEPS2 0x20
+#define LPTECR_MODESPPFIFO 0x40
+#define LPTECR_MODEECP 0x60
+#define LPTECR_MODEECPEPP 0x80
+#define LPTECR_MODETEST 0xc0
+#define LPTECR_MODECFG 0xe0
+#define LPTECR_NERRINTRDIS 0x10
+#define LPTECR_DMAEN 0x08
+#define LPTECR_SERVICEINTR 0x04
+#define LPTECR_FIFOFULL 0x02
+#define LPTECR_FIFOEMPTY 0x01
+
+/* ---------------------------------------------------------------------- */
+
+HANDLE pp_ntddkgenport_handle = INVALID_HANDLE_VALUE;
+unsigned int pp_ntddkgenport_flags = 0;
+
+#define FLAGS_PCSPP (1<<0)
+#define FLAGS_PCPS2 (1<<1)
+#define FLAGS_PCEPP (1<<2)
+#define FLAGS_PCECR (1<<3) /* ECR Register Exists */
+#define FLAGS_PCECP (1<<4)
+#define FLAGS_PCECPEPP (1<<5)
+#define FLAGS_PCECPPS2 (1<<6)
+
+/* ---------------------------------------------------------------------- */
+
+unsigned char pp_ntddkgenport_inb(unsigned int port)
+{
+ ULONG p = port;
+ UCHAR ch;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_ntddkgenport_handle == INVALID_HANDLE_VALUE)
+ return 0xff;
+ res = DeviceIoControl(pp_ntddkgenport_handle, IOCTL_GPD_READ_PORT_UCHAR, &p, sizeof(p), &ch, sizeof(ch), &retl, NULL);
+ if (!res) {
+ lprintf(0, "Parport: inb ioctl failed, error 0x%08lx\n", GetLastError());
+ return 0xff;
+ }
+ if (retl != sizeof(ch)) {
+ lprintf(0, "Parport: inb ioctl returned invalid length, %lu\n", retl);
+ return 0xff;
+ }
+ return ch;
+}
+
+void pp_ntddkgenport_outb(unsigned char val, unsigned int port)
+{
+ GENPORT_WRITE_INPUT buf;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_ntddkgenport_handle == INVALID_HANDLE_VALUE)
+ return;
+ buf.PortNumber = port;
+ buf.CharData = val;
+ res = DeviceIoControl(pp_ntddkgenport_handle, IOCTL_GPD_WRITE_PORT_UCHAR, &buf, sizeof(buf), NULL, 0, &retl, NULL);
+ if (!res) {
+ lprintf(0, "Parport: outb ioctl failed, error 0x%08lx\n", GetLastError());
+ return;
+ }
+}
+
+void pp_ntddkgenport_insb(unsigned int port, unsigned char *bp, unsigned int len)
+{
+ for (; len > 0; len--, bp++)
+ *bp = pp_ntddkgenport_inb(port);
+}
+
+void pp_ntddkgenport_outsb(unsigned int port, const unsigned char *bp, unsigned int len)
+{
+ for (; len > 0; len--, bp++)
+ pp_ntddkgenport_outb(*bp, port);
+}
+
+/* ---------------------------------------------------------------------- */
+
+extern inline void setecr(unsigned char ecr)
+{
+ if (pp_ntddkgenport_flags & FLAGS_PCECR)
+ pp_ntddkgenport_outb(ecr, LPTREG_ECONTROL);
+}
+
+int pp_ntddkgenport_epp_clear_timeout(void)
+{
+ unsigned char r;
+
+ if (!(pp_ntddkgenport_inb(LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT))
+ return 1;
+ /* To clear timeout some chips require double read */
+ pp_ntddkgenport_inb(LPTREG_STATUS);
+ r = pp_ntddkgenport_inb(LPTREG_STATUS);
+ pp_ntddkgenport_outb(r | 0x01, LPTREG_STATUS); /* Some reset by writing 1 */
+ pp_ntddkgenport_outb(r & 0xfe, LPTREG_STATUS); /* Others by writing 0 */
+ r = pp_ntddkgenport_inb(LPTREG_STATUS);
+ return !(r & 0x01);
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned char parport_ntddkgenport_read_data(void)
+{
+ return pp_ntddkgenport_inb(LPTREG_DATA);
+}
+
+void parport_ntddkgenport_write_data(unsigned char d)
+{
+ pp_ntddkgenport_outb(d, LPTREG_DATA);
+}
+
+unsigned char parport_ntddkgenport_read_status(void)
+{
+ return pp_ntddkgenport_inb(LPTREG_STATUS);
+}
+
+
+unsigned char parport_ntddkgenport_read_control(void)
+{
+ return pp_ntddkgenport_inb(LPTREG_CONTROL);
+}
+
+void parport_ntddkgenport_write_control(unsigned char d)
+{
+ pp_ntddkgenport_outb(d, LPTREG_CONTROL);
+}
+
+void parport_ntddkgenport_frob_control(unsigned char mask, unsigned char val)
+{
+ unsigned char d = pp_ntddkgenport_inb(LPTREG_CONTROL);
+ d = (d & (~mask)) ^ val;
+ pp_ntddkgenport_outb(d, LPTREG_CONTROL);
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_ntddkgenport_epp_write_data(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+
+ setecr(0x90); /* EPP mode */
+ for (; sz > 0; sz--, bp++) {
+ pp_ntddkgenport_outb(*bp, LPTREG_EPPDATA);
+ if (pp_ntddkgenport_inb(LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+ pp_ntddkgenport_epp_clear_timeout();
+ goto rt;
+ }
+ ret++;
+ }
+ rt:
+ setecr(0x30); /* PS/2 mode */
+ return ret;
+}
+
+unsigned parport_ntddkgenport_epp_read_data(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+
+ setecr(0x90); /* EPP mode */
+ for (; sz > 0; sz--, bp++) {
+ *bp = pp_ntddkgenport_inb(LPTREG_EPPDATA);
+ if (pp_ntddkgenport_inb(LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+ pp_ntddkgenport_epp_clear_timeout();
+ goto rt;
+ }
+ ret++;
+ }
+ rt:
+ setecr(0x30); /* PS/2 mode */
+ return ret;
+}
+
+unsigned parport_ntddkgenport_epp_write_addr(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+
+ setecr(0x90); /* EPP mode */
+ for (; sz > 0; sz--, bp++) {
+ pp_ntddkgenport_outb(*bp, LPTREG_EPPADDR);
+ if (pp_ntddkgenport_inb(LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+ pp_ntddkgenport_epp_clear_timeout();
+ goto rt;
+ }
+ ret++;
+ }
+ rt:
+ setecr(0x30); /* PS/2 mode */
+ return ret;
+}
+
+unsigned parport_ntddkgenport_epp_read_addr(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+
+ setecr(0x90); /* EPP mode */
+ for (; sz > 0; sz--, bp++) {
+ *bp = pp_ntddkgenport_inb(LPTREG_EPPADDR);
+ if (pp_ntddkgenport_inb(LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+ pp_ntddkgenport_epp_clear_timeout();
+ goto rt;
+ }
+ ret++;
+ }
+ rt:
+ setecr(0x30); /* PS/2 mode */
+ return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_ntddkgenport_emul_epp_write_data(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo;
+
+ pp_ntddkgenport_outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE, LPTREG_CONTROL);
+ for (; sz > 0; sz--, bp++) {
+ pp_ntddkgenport_outb(*bp, LPTREG_DATA);
+ for (tmo = 0; ; tmo++) {
+ if (pp_ntddkgenport_inb(LPTREG_STATUS) & LPTSTAT_WAIT)
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ pp_ntddkgenport_outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE | LPTCTRL_DATASTB, LPTREG_CONTROL);
+ for (tmo = 0; ; tmo++) {
+ if (!(pp_ntddkgenport_inb(LPTREG_STATUS) & LPTSTAT_WAIT))
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ pp_ntddkgenport_outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE, LPTREG_CONTROL);
+ ret++;
+ }
+ return ret;
+}
+
+unsigned parport_ntddkgenport_emul_epp_read_data(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo;
+
+ pp_ntddkgenport_outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION, LPTREG_CONTROL);
+ for (; sz > 0; sz--, bp++) {
+ for (tmo = 0; ; tmo++) {
+ if (pp_ntddkgenport_inb(LPTREG_STATUS) & LPTSTAT_WAIT)
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ pp_ntddkgenport_outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION | LPTCTRL_DATASTB, LPTREG_CONTROL);
+ for (tmo = 0; ; tmo++) {
+ if (!(pp_ntddkgenport_inb(LPTREG_STATUS) & LPTSTAT_WAIT))
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ *bp = pp_ntddkgenport_inb(LPTREG_DATA);
+ pp_ntddkgenport_outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION, LPTREG_CONTROL);
+ ret++;
+ }
+ return ret;
+}
+
+unsigned parport_ntddkgenport_emul_epp_write_addr(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo;
+
+ pp_ntddkgenport_outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE, LPTREG_CONTROL);
+ for (; sz > 0; sz--, bp++) {
+ pp_ntddkgenport_outb(*bp, LPTREG_DATA);
+ for (tmo = 0; ; tmo++) {
+ if (pp_ntddkgenport_inb(LPTREG_STATUS) & LPTSTAT_WAIT)
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ pp_ntddkgenport_outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE | LPTCTRL_ADDRSTB, LPTREG_CONTROL);
+ for (tmo = 0; ; tmo++) {
+ if (!(pp_ntddkgenport_inb(LPTREG_STATUS) & LPTSTAT_WAIT))
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ pp_ntddkgenport_outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE, LPTREG_CONTROL);
+ ret++;
+ }
+ return ret;
+}
+
+unsigned parport_ntddkgenport_emul_epp_read_addr(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo;
+
+ pp_ntddkgenport_outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION, LPTREG_CONTROL);
+ for (; sz > 0; sz--, bp++) {
+ for (tmo = 0; ; tmo++) {
+ if (pp_ntddkgenport_inb(LPTREG_STATUS) & LPTSTAT_WAIT)
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ pp_ntddkgenport_outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION | LPTCTRL_ADDRSTB, LPTREG_CONTROL);
+ for (tmo = 0; ; tmo++) {
+ if (!(pp_ntddkgenport_inb(LPTREG_STATUS) & LPTSTAT_WAIT))
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ *bp = pp_ntddkgenport_inb(LPTREG_DATA);
+ pp_ntddkgenport_outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION, LPTREG_CONTROL);
+ ret++;
+ }
+ return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static int ecp_forward(void)
+{
+ unsigned tmo = 0x10000;
+
+ if (pp_ntddkgenport_inb(LPTREG_DSR) & 0x20)
+ return 0;
+ /* Event 47: Set nInit high */
+ pp_ntddkgenport_outb(0x26, LPTREG_DCR);
+ /* Event 49: PError goes high */
+ while (!(pp_ntddkgenport_inb(LPTREG_DSR) & 0x20)) {
+ if (!(--tmo))
+ return -1;
+ }
+ /* start driving the bus */
+ pp_ntddkgenport_outb(0x04, LPTREG_DCR);
+ return 0;
+}
+
+static int ecp_reverse(void)
+{
+ unsigned tmo = 0x10000;
+
+ if (!(pp_ntddkgenport_inb(LPTREG_DSR) & 0x20))
+ return 0;
+ pp_ntddkgenport_outb(0x24, LPTREG_DCR);
+ /* Event 39: Set nInit low to initiate bus reversal */
+ pp_ntddkgenport_outb(0x20, LPTREG_DCR);
+ while (pp_ntddkgenport_inb(LPTREG_DSR) & 0x20) {
+ if (!(--tmo))
+ return -1;
+ }
+ return 0;
+}
+
+static unsigned emptyfifo(unsigned cnt)
+{
+ unsigned fcnt = 0;
+
+ pp_ntddkgenport_outb(0xd0, LPTREG_ECONTROL); /* FIFOtest mode */
+ while ((pp_ntddkgenport_inb(LPTREG_ECONTROL) & 0x01) && fcnt < 32 && fcnt < cnt) {
+ pp_ntddkgenport_inb(LPTREG_TFIFO);
+ fcnt++;
+ }
+ lprintf(10, "emptyfifo: FIFO contained %d bytes\n", fcnt);
+ pp_ntddkgenport_outb(0x30, LPTREG_ECONTROL); /* PS/2 mode */
+ return cnt - fcnt;
+}
+
+unsigned parport_ntddkgenport_ecp_write_data(const void *buf, unsigned sz)
+{
+ const unsigned char *bp = (const unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo = 0x10000;
+ unsigned char stat;
+
+ if (ecp_forward())
+ return 0;
+ pp_ntddkgenport_outb(0x70, LPTREG_ECONTROL); /* ECP mode */
+ while (sz > 0) {
+ while ((stat = pp_ntddkgenport_inb(LPTREG_ECONTROL)) & 0x02) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ if (stat & 0x01 && sz >= 8) {
+ pp_ntddkgenport_outsb(LPTREG_DFIFO, bp, 8);
+ bp += 8;
+ sz -= 8;
+ ret += 8;
+ } else {
+ pp_ntddkgenport_outb(*bp++, LPTREG_DFIFO);
+ sz--;
+ ret++;
+ }
+ tmo = 0x10000;
+ }
+ while (!(pp_ntddkgenport_inb(LPTREG_ECONTROL) & 0x01) || !(pp_ntddkgenport_inb(LPTREG_DSR) & 0x80)) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ pp_ntddkgenport_outb(0x30, LPTREG_ECONTROL); /* PS/2 mode */
+ return ret;
+}
+
+unsigned parport_ntddkgenport_ecp_read_data(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo = 0x10000;
+ unsigned char stat;
+
+ if (ecp_reverse())
+ return 0;
+ pp_ntddkgenport_outb(0x70, LPTREG_ECONTROL); /* ECP mode */
+ while (sz > 0) {
+ while ((stat = pp_ntddkgenport_inb(LPTREG_ECONTROL)) & 0x01)
+ if (!(--tmo)) {
+ pp_ntddkgenport_outb(0xd0, LPTREG_ECONTROL); /* FIFOTEST mode */
+ while (!(pp_ntddkgenport_inb(LPTREG_ECONTROL) & 0x01) && sz > 0) {
+ *bp++ = pp_ntddkgenport_inb(LPTREG_TFIFO);
+ sz--;
+ ret++;
+ }
+ pp_ntddkgenport_outb(0x30, LPTREG_ECONTROL); /* PS/2 mode */
+ return ret;
+ }
+ if (stat & 0x02 && sz >= 8) {
+ pp_ntddkgenport_insb(LPTREG_DFIFO, bp, 8);
+ bp += 8;
+ sz -= 8;
+ ret += 8;
+ } else {
+ *bp++ = pp_ntddkgenport_inb(LPTREG_DFIFO);
+ sz--;
+ ret++;
+ }
+ tmo = 0x10000;
+ }
+ pp_ntddkgenport_outb(0x30, LPTREG_ECONTROL); /* PS/2 mode */
+ return ret;
+}
+
+unsigned parport_ntddkgenport_ecp_write_addr(const void *buf, unsigned sz)
+{
+ const unsigned char *bp = (const unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo = 0x10000;
+ unsigned char stat;
+
+ if (ecp_forward())
+ return 0;
+ pp_ntddkgenport_outb(0x70, LPTREG_ECONTROL); /* ECP mode */
+ while (sz > 0) {
+ while ((stat = pp_ntddkgenport_inb(LPTREG_ECONTROL)) & 0x02) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ if (stat & 0x01 && sz >= 8) {
+ pp_ntddkgenport_outsb(LPTREG_AFIFO, bp, 8);
+ bp += 8;
+ sz -= 8;
+ ret += 8;
+ } else {
+ pp_ntddkgenport_outb(*bp++, LPTREG_AFIFO);
+ sz--;
+ ret++;
+ }
+ tmo = 0x10000;
+ }
+ while (!(pp_ntddkgenport_inb(LPTREG_ECONTROL) & 0x01) || !(pp_ntddkgenport_inb(LPTREG_DSR) & 0x80)) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ pp_ntddkgenport_outb(0x30, LPTREG_ECONTROL); /* PS/2 mode */
+ return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_ntddkgenport_emul_ecp_write_data(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret;
+ unsigned char ctl;
+ unsigned tmo;
+
+ if (ecp_forward())
+ return 0;
+ ctl = pp_ntddkgenport_inb(LPTREG_CONTROL) & ~PARPORT_CONTROL_AUTOFD;
+ /* HostAck high (data, not command) */
+ pp_ntddkgenport_outb(ctl, LPTREG_CONTROL);
+ for (ret = 0; ret < sz; ret++, bp++) {
+ pp_ntddkgenport_outb(*bp, LPTREG_DATA);
+ pp_ntddkgenport_outb(ctl | PARPORT_CONTROL_STROBE, LPTREG_CONTROL);
+ for (tmo = 0; pp_ntddkgenport_inb(LPTREG_STATUS) & PARPORT_STATUS_BUSY; tmo++)
+ if (tmo > 0x1000)
+ return ret;
+ pp_ntddkgenport_outb(ctl, LPTREG_CONTROL);
+ for (tmo = 0; !(pp_ntddkgenport_inb(LPTREG_STATUS) & PARPORT_STATUS_BUSY); tmo++)
+ if (tmo > 0x1000)
+ return ret;
+ }
+ return ret;
+}
+
+unsigned parport_ntddkgenport_emul_ecp_write_addr(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret;
+ unsigned char ctl;
+ unsigned tmo;
+
+ if (ecp_forward())
+ return 0;
+ ctl = pp_ntddkgenport_inb(LPTREG_CONTROL) | PARPORT_CONTROL_AUTOFD;
+ /* HostAck low (command, not data) */
+ pp_ntddkgenport_outb(ctl, LPTREG_CONTROL);
+ for (ret = 0; ret < sz; ret++, bp++) {
+ pp_ntddkgenport_outb(*bp, LPTREG_DATA);
+ pp_ntddkgenport_outb(ctl | PARPORT_CONTROL_STROBE, LPTREG_CONTROL);
+ for (tmo = 0; pp_ntddkgenport_inb(LPTREG_STATUS) & PARPORT_STATUS_BUSY; tmo++)
+ if (tmo > 0x1000)
+ return ret;
+ pp_ntddkgenport_outb(ctl, LPTREG_CONTROL);
+ for (tmo = 0; !(pp_ntddkgenport_inb(LPTREG_STATUS) & PARPORT_STATUS_BUSY); tmo++)
+ if (tmo > 0x1000)
+ return ret;
+ }
+ return ret;
+}
+
+unsigned parport_ntddkgenport_emul_ecp_read_data(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned char ctl, stat;
+ int command;
+ unsigned tmo;
+
+ if (ecp_reverse())
+ return 0;
+ ctl = pp_ntddkgenport_inb(LPTREG_CONTROL);
+ /* Set HostAck low to start accepting data. */
+ pp_ntddkgenport_outb(ctl | PARPORT_CONTROL_AUTOFD, LPTREG_CONTROL);
+ while (ret < sz) {
+ /* Event 43: Peripheral sets nAck low. It can take as
+ long as it wants. */
+ tmo = 0;
+ do {
+ stat = pp_ntddkgenport_inb(LPTREG_STATUS);
+ if ((++tmo) > 0x10000)
+ goto out;
+ } while (stat & PARPORT_STATUS_ACK);
+ /* Is this a command? */
+ command = stat & PARPORT_STATUS_BUSY;
+ if (command) {
+ //lprintf(3, "ECP: warning: emulation does not support RLE\n");
+ goto out;
+ }
+ /* Read the data. */
+ *bp = pp_ntddkgenport_inb(LPTREG_DATA);
+ /* Event 44: Set HostAck high, acknowledging handshake. */
+ pp_ntddkgenport_outb(ctl & ~PARPORT_CONTROL_AUTOFD, LPTREG_CONTROL);
+ /* Event 45: The peripheral has 35ms to set nAck high. */
+ tmo = 0;
+ do {
+ stat = pp_ntddkgenport_inb(LPTREG_STATUS);
+ if ((++tmo) > 0x10000)
+ goto out;
+ } while (!(stat & PARPORT_STATUS_ACK));
+ /* Event 46: Set HostAck low and accept the data. */
+ pp_ntddkgenport_outb(ctl | PARPORT_CONTROL_AUTOFD, LPTREG_CONTROL);
+ /* Normal data byte. */
+ bp++;
+ ret++;
+ }
+
+ out:
+ return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+#if 1
+unsigned parport_ntddkgenport_fpgaconfig_write(const void *buf, unsigned sz)
+{
+ const unsigned char *bp = buf;
+ unsigned u;
+
+ for (u = 0; u < sz; u++, bp++)
+ pp_ntddkgenport_outb(*bp, LPTREG_DATA);
+ return sz;
+}
+#else
+
+unsigned parport_ntddkgenport_fpgaconfig_write(const void *buf, unsigned sz)
+{
+ const unsigned char *bp = buf;
+ unsigned ret = 0;
+ unsigned tmo = 0x10000;
+ unsigned char stat;
+
+ if (pp_ntddkgenport_modes & PARPORT_MODE_PCECR) {
+ pp_ntddkgenport_outb(0x50, LPTREG_ECONTROL); /* COMPAT FIFO mode */
+ while (sz > 0) {
+ while ((stat = pp_ntddkgenport_inb(LPTREG_ECONTROL)) & 0x02) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ if (stat & 0x01 && sz >= 8) {
+ pp_ntddkgenport_outsb(LPTREG_DFIFO, bp, 8);
+ bp += 8;
+ sz -= 8;
+ ret += 8;
+ } else {
+ pp_ntddkgenport_outb(*bp++, LPTREG_DFIFO);
+ sz--;
+ ret++;
+ }
+ tmo = 0x10000;
+ }
+ while (!(pp_ntddkgenport_inb(LPTREG_ECONTROL) & 0x01) || !(pp_ntddkgenport_inb(LPTREG_DSR) & 0x80)) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ pp_ntddkgenport_outb(0x30, LPTREG_ECONTROL); /* PS/2 mode */
+ return ret;
+ }
+ for (ret = 0; ret < sz; ret++, bp++)
+ pp_ntddkgenport_outb(*bp, LPTREG_DATA);
+ return sz;
+}
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+const struct parport_ops parport_ntddkgenport_ops = {
+ parport_ntddkgenport_read_data,
+ parport_ntddkgenport_write_data,
+ parport_ntddkgenport_read_status,
+ parport_ntddkgenport_read_control,
+ parport_ntddkgenport_write_control,
+ parport_ntddkgenport_frob_control,
+ parport_ntddkgenport_epp_write_data,
+ parport_ntddkgenport_epp_read_data,
+ parport_ntddkgenport_epp_write_addr,
+ parport_ntddkgenport_epp_read_addr,
+ parport_ntddkgenport_ecp_write_data,
+ parport_ntddkgenport_ecp_read_data,
+ parport_ntddkgenport_ecp_write_addr,
+ parport_ntddkgenport_fpgaconfig_write
+};
+
+const struct parport_ops parport_ntddkgenport_emul_ops = {
+ parport_ntddkgenport_read_data,
+ parport_ntddkgenport_write_data,
+ parport_ntddkgenport_read_status,
+ parport_ntddkgenport_read_control,
+ parport_ntddkgenport_write_control,
+ parport_ntddkgenport_frob_control,
+ parport_ntddkgenport_emul_epp_write_data,
+ parport_ntddkgenport_emul_epp_read_data,
+ parport_ntddkgenport_emul_epp_write_addr,
+ parport_ntddkgenport_emul_epp_read_addr,
+ parport_ntddkgenport_emul_ecp_write_data,
+ parport_ntddkgenport_emul_ecp_read_data,
+ parport_ntddkgenport_emul_ecp_write_addr,
+ parport_ntddkgenport_fpgaconfig_write
+};
+
+/* ---------------------------------------------------------------------- */
diff --git a/main/ppntddkgenportinit.c b/main/ppntddkgenportinit.c
new file mode 100644
index 0000000..3bcc464
--- /dev/null
+++ b/main/ppntddkgenportinit.c
@@ -0,0 +1,469 @@
+/*****************************************************************************/
+
+/*
+ * ppntddkgenportinit.c -- Parport direct access with NTDDK genport.sys (init routines).
+ *
+ * Copyright (C) 2000 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#include <windows.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+#define DEVNAME "\\\\.\\GpdDev"
+
+/* ---------------------------------------------------------------------- */
+
+/* LPT registers */
+/* ECP specific registers */
+#define LPTREG_ECONTROL 0x402
+#define LPTREG_CONFIGB 0x401
+#define LPTREG_CONFIGA 0x400
+#define LPTREG_TFIFO 0x400
+#define LPTREG_DFIFO 0x400
+#define LPTREG_AFIFO 0x000
+#define LPTREG_DSR 0x001
+#define LPTREG_DCR 0x002
+/* EPP specific registers */
+#define LPTREG_EPPDATA 0x004
+#define LPTREG_EPPADDR 0x003
+/* standard registers */
+#define LPTREG_CONTROL 0x002
+#define LPTREG_STATUS 0x001
+#define LPTREG_DATA 0x000
+
+/* ECP config A */
+#define LPTCFGA_INTRISALEVEL 0x80
+#define LPTCFGA_IMPIDMASK 0x70
+#define LPTCFGA_IMPID16BIT 0x00
+#define LPTCFGA_IMPID8BIT 0x10
+#define LPTCFGA_IMPID32BIT 0x20
+#define LPTCFGA_NOPIPELINE 0x04
+#define LPTCFGA_PWORDCOUNT 0x03
+
+/* ECP config B */
+#define LPTCFGB_COMPRESS 0x80
+#define LPTCFGB_INTRVALUE 0x40
+#define LPTCFGB_IRQMASK 0x38
+#define LPTCFGB_IRQ5 0x38
+#define LPTCFGB_IRQ15 0x30
+#define LPTCFGB_IRQ14 0x28
+#define LPTCFGB_IRQ11 0x20
+#define LPTCFGB_IRQ10 0x18
+#define LPTCFGB_IRQ9 0x10
+#define LPTCFGB_IRQ7 0x08
+#define LPTCFGB_IRQJUMPER 0x00
+#define LPTCFGB_DMAMASK 0x07
+#define LPTCFGB_DMA7 0x07
+#define LPTCFGB_DMA6 0x06
+#define LPTCFGB_DMA5 0x05
+#define LPTCFGB_DMAJUMPER16 0x04
+#define LPTCFGB_DMA3 0x03
+#define LPTCFGB_DMA2 0x02
+#define LPTCFGB_DMA1 0x01
+#define LPTCFGB_DMAJUMPER8 0x00
+
+/* ECP ECR */
+#define LPTECR_MODEMASK 0xe0
+#define LPTECR_MODESPP 0x00
+#define LPTECR_MODEPS2 0x20
+#define LPTECR_MODESPPFIFO 0x40
+#define LPTECR_MODEECP 0x60
+#define LPTECR_MODEECPEPP 0x80
+#define LPTECR_MODETEST 0xc0
+#define LPTECR_MODECFG 0xe0
+#define LPTECR_NERRINTRDIS 0x10
+#define LPTECR_DMAEN 0x08
+#define LPTECR_SERVICEINTR 0x04
+#define LPTECR_FIFOFULL 0x02
+#define LPTECR_FIFOEMPTY 0x01
+
+/* ---------------------------------------------------------------------- */
+
+extern HANDLE pp_ntddkgenport_handle;
+extern unsigned int pp_ntddkgenport_flags;
+extern const struct parport_ops parport_ntddkgenport_ops, parport_ntddkgenport_emul_ops;
+
+extern unsigned char pp_ntddkgenport_inb(unsigned int port);
+extern void pp_ntddkgenport_outb(unsigned char val, unsigned int port);
+extern int pp_ntddkgenport_epp_clear_timeout(void);
+
+#define FLAGS_PCSPP (1<<0)
+#define FLAGS_PCPS2 (1<<1)
+#define FLAGS_PCEPP (1<<2)
+#define FLAGS_PCECR (1<<3) /* ECR Register Exists */
+#define FLAGS_PCECP (1<<4)
+#define FLAGS_PCECPEPP (1<<5)
+#define FLAGS_PCECPPS2 (1<<6)
+
+/* ---------------------------------------------------------------------- */
+
+static int parport_spp(void)
+{
+ pp_ntddkgenport_epp_clear_timeout(); /* prevent lockup of some SMSC IC's */
+ /* this routine is mostly copied from Linux Kernel parport */
+ pp_ntddkgenport_outb(0xc, LPTREG_ECONTROL);
+ pp_ntddkgenport_outb(0xc, LPTREG_CONTROL);
+ pp_ntddkgenport_outb(0xaa, LPTREG_DATA);
+ if (pp_ntddkgenport_inb(LPTREG_DATA) != 0xaa)
+ return 0;
+ pp_ntddkgenport_outb(0x55, LPTREG_DATA);
+ if (pp_ntddkgenport_inb(LPTREG_DATA) != 0x55)
+ return 0;
+ return PARPORT_MODE_PCSPP;
+}
+
+/* Check for ECP
+ *
+ * Old style XT ports alias io ports every 0x400, hence accessing ECR
+ * on these cards actually accesses the CTR.
+ *
+ * Modern cards don't do this but reading from ECR will return 0xff
+ * regardless of what is written here if the card does NOT support
+ * ECP.
+ *
+ * We will write 0x2c to ECR and 0xcc to CTR since both of these
+ * values are "safe" on the CTR since bits 6-7 of CTR are unused.
+ */
+static int parport_ecr(void)
+{
+ unsigned char r = 0xc;
+
+ pp_ntddkgenport_outb(r, LPTREG_CONTROL);
+ if ((pp_ntddkgenport_inb(LPTREG_ECONTROL) & 0x3) == (r & 0x3)) {
+ pp_ntddkgenport_outb(r ^ 0x2, LPTREG_CONTROL); /* Toggle bit 1 */
+ r = pp_ntddkgenport_inb(LPTREG_CONTROL);
+ if ((pp_ntddkgenport_inb(LPTREG_ECONTROL) & 0x2) == (r & 0x2))
+ goto no_reg; /* Sure that no ECR register exists */
+ }
+
+ if ((pp_ntddkgenport_inb(LPTREG_ECONTROL) & 0x3 ) != 0x1)
+ goto no_reg;
+
+ pp_ntddkgenport_outb(0x34, LPTREG_ECONTROL);
+ if (pp_ntddkgenport_inb(LPTREG_ECONTROL) != 0x35)
+ goto no_reg;
+
+ pp_ntddkgenport_outb(0xc, LPTREG_CONTROL);
+
+ /* Go to mode 000 */
+ pp_ntddkgenport_outb(pp_ntddkgenport_inb(LPTREG_ECONTROL) & ~0xe0, LPTREG_ECONTROL);
+
+ return PARPORT_MODE_PCECR;
+
+ no_reg:
+ pp_ntddkgenport_outb(0xc, LPTREG_CONTROL);
+ return 0;
+}
+
+static int parport_ecp(void)
+{
+ int i;
+ int config;
+ int pword;
+ int fifo_depth, writeIntrThreshold, readIntrThreshold;
+
+ /* Find out FIFO depth */
+ pp_ntddkgenport_outb(0x00, LPTREG_ECONTROL); /* Reset FIFO */
+ pp_ntddkgenport_outb(0xc0, LPTREG_ECONTROL); /* TEST FIFO */
+ for (i=0; i < 1024 && !(pp_ntddkgenport_inb(LPTREG_ECONTROL) & 0x02); i++)
+ pp_ntddkgenport_outb(0xaa, LPTREG_TFIFO);
+ /*
+ * Using LGS chipset it uses ECR register, but
+ * it doesn't support ECP or FIFO MODE
+ */
+ if (i == 1024) {
+ pp_ntddkgenport_outb(0x00, LPTREG_ECONTROL);
+ return 0;
+ }
+
+ fifo_depth = i;
+ lprintf(3, "ECP: FIFO depth is %d bytes\n", fifo_depth);
+
+ /* Find out writeIntrThreshold */
+ pp_ntddkgenport_outb(pp_ntddkgenport_inb(LPTREG_ECONTROL) | (1<<2), LPTREG_ECONTROL);
+ pp_ntddkgenport_outb(pp_ntddkgenport_inb(LPTREG_ECONTROL) & ~(1<<2) , LPTREG_ECONTROL);
+ for (i = 1; i <= fifo_depth; i++) {
+ pp_ntddkgenport_inb(LPTREG_TFIFO);
+ usleep(50);
+ if (pp_ntddkgenport_inb(LPTREG_ECONTROL) & (1<<2))
+ break;
+ }
+
+ if (i <= fifo_depth)
+ lprintf(3, "ECP: writeIntrThreshold is %d\n", i);
+ else
+ /* Number of bytes we know we can write if we get an
+ interrupt. */
+ i = 0;
+
+ writeIntrThreshold = i;
+
+ /* Find out readIntrThreshold */
+ pp_ntddkgenport_outb((pp_ntddkgenport_inb(LPTREG_ECONTROL) & ~0xe0) | 0x20, LPTREG_ECONTROL); /* Reset FIFO, PS2 */
+ pp_ntddkgenport_outb(pp_ntddkgenport_inb(LPTREG_CONTROL) | PARPORT_CONTROL_DIRECTION, LPTREG_CONTROL);
+ pp_ntddkgenport_outb((pp_ntddkgenport_inb(LPTREG_ECONTROL) & ~0xe0) | 0xc0, LPTREG_ECONTROL); /* Test FIFO */
+ pp_ntddkgenport_outb(pp_ntddkgenport_inb(LPTREG_ECONTROL) | (1<<2), LPTREG_ECONTROL);
+ pp_ntddkgenport_outb(pp_ntddkgenport_inb(LPTREG_ECONTROL) & ~(1<<2) , LPTREG_ECONTROL);
+ for (i = 1; i <= fifo_depth; i++) {
+ pp_ntddkgenport_outb(0xaa, LPTREG_TFIFO);
+ if (pp_ntddkgenport_inb(LPTREG_ECONTROL) & (1<<2))
+ break;
+ }
+
+ if (i <= fifo_depth)
+ lprintf(3, "ECP: readIntrThreshold is %d\n", i);
+ else
+ /* Number of bytes we can read if we get an interrupt. */
+ i = 0;
+
+ readIntrThreshold = i;
+
+ pp_ntddkgenport_outb(0x00, LPTREG_ECONTROL); /* Reset FIFO */
+ pp_ntddkgenport_outb(0xf4, LPTREG_ECONTROL); /* Configuration mode */
+ config = pp_ntddkgenport_inb(LPTREG_CONFIGA);
+ pword = (config >> 4) & 0x7;
+ switch (pword) {
+ case 0:
+ pword = 2;
+ lprintf(0, "ECP: Unsupported pword size! (2)\n");
+ break;
+ case 2:
+ pword = 4;
+ lprintf(0, "ECP: Unsupported pword size! (4)\n");
+ break;
+ default:
+ lprintf(0, "ECP: Unknown implementation ID (%d)\n", pword);
+ /* Assume 1 */
+ case 1:
+ pword = 1;
+ }
+ lprintf(3, "ECP: PWord is %d bits\n", 8 * pword);
+
+ config = pp_ntddkgenport_inb(LPTREG_CONFIGB);
+ lprintf(3, "ECP: Interrupts are ISA-%s\n", config & 0x80 ? "Level" : "Pulses");
+
+ if (!(config & 0x40))
+ lprintf(3, "ECP: IRQ conflict!\n");
+
+ /* Go back to mode 000 */
+ pp_ntddkgenport_outb(pp_ntddkgenport_inb(LPTREG_ECONTROL) & ~0xe0, LPTREG_ECONTROL);
+
+ return PARPORT_MODE_PCECP;
+}
+
+/* EPP mode detection */
+
+static int parport_epp(void)
+{
+ /* If EPP timeout bit clear then EPP available */
+ if (!pp_ntddkgenport_epp_clear_timeout())
+ return 0; /* No way to clear timeout */
+
+ /*
+ * Theory:
+ * Write two values to the EPP address register and
+ * read them back. When the transfer times out, the state of
+ * the EPP register is undefined in some cases (EPP 1.9?) but
+ * in others (EPP 1.7, ECPEPP?) it is possible to read back
+ * its value.
+ */
+
+ pp_ntddkgenport_epp_clear_timeout();
+ usleep(30); /* Wait for possible EPP timeout */
+
+ pp_ntddkgenport_outb(0x55, LPTREG_EPPADDR);
+ pp_ntddkgenport_epp_clear_timeout();
+ usleep(30); /* Wait for possible EPP timeout */
+
+ if (pp_ntddkgenport_inb(LPTREG_EPPADDR) == 0x55) {
+ pp_ntddkgenport_outb(0xaa, LPTREG_EPPADDR);
+ pp_ntddkgenport_epp_clear_timeout();
+ usleep(30); /* Wait for possible EPP timeout */
+ if (pp_ntddkgenport_inb(LPTREG_EPPADDR) == 0xaa) {
+ pp_ntddkgenport_epp_clear_timeout();
+ return PARPORT_MODE_PCEPP;
+ }
+ }
+
+ /*
+ * Theory:
+ * Bit 0 of STR is the EPP timeout bit, this bit is 0
+ * when EPP is possible and is set high when an EPP timeout
+ * occurs (EPP uses the HALT line to stop the CPU while it does
+ * the byte transfer, an EPP timeout occurs if the attached
+ * device fails to respond after 10 micro seconds).
+ *
+ * This bit is cleared by either reading it (National Semi)
+ * or writing a 1 to the bit (SMC, UMC, WinBond), others ???
+ * This bit is always high in non EPP modes.
+ */
+
+ pp_ntddkgenport_outb(pp_ntddkgenport_inb(LPTREG_CONTROL) | 0x20, LPTREG_CONTROL);
+ pp_ntddkgenport_outb(pp_ntddkgenport_inb(LPTREG_CONTROL) | 0x10, LPTREG_CONTROL);
+ pp_ntddkgenport_epp_clear_timeout();
+
+ pp_ntddkgenport_inb(LPTREG_EPPDATA);
+ usleep(30); /* Wait for possible EPP timeout */
+
+ if (pp_ntddkgenport_inb(LPTREG_STATUS) & 0x01) {
+ pp_ntddkgenport_epp_clear_timeout();
+ return PARPORT_MODE_PCEPP;
+ }
+ return 0;
+}
+
+static int parport_ecpepp(void)
+{
+ int mode;
+ unsigned char oecr;
+
+ oecr = pp_ntddkgenport_inb(LPTREG_ECONTROL);
+ /* Search for SMC style EPP+ECP mode */
+ pp_ntddkgenport_outb(0x80, LPTREG_ECONTROL);
+ mode = parport_epp();
+ pp_ntddkgenport_outb(oecr, LPTREG_ECONTROL);
+ return mode ? PARPORT_MODE_PCECPEPP : 0;
+}
+
+/* Detect PS/2 support.
+ *
+ * Bit 5 (0x20) sets the PS/2 data direction; setting this high
+ * allows us to read data from the data lines. In theory we would get back
+ * 0xff but any peripheral attached to the port may drag some or all of the
+ * lines down to zero. So if we get back anything that isn't the contents
+ * of the data register we deem PS/2 support to be present.
+ *
+ * Some SPP ports have "half PS/2" ability - you can't turn off the line
+ * drivers, but an external peripheral with sufficiently beefy drivers of
+ * its own can overpower them and assert its own levels onto the bus, from
+ * where they can then be read back as normal. Ports with this property
+ * and the right type of device attached are likely to fail the SPP test,
+ * (as they will appear to have stuck bits) and so the fact that they might
+ * be misdetected here is rather academic.
+ */
+
+static int parport_ps2(void)
+{
+ int ok = 0;
+ unsigned char octr = pp_ntddkgenport_inb(LPTREG_CONTROL);
+
+ pp_ntddkgenport_epp_clear_timeout();
+
+ pp_ntddkgenport_outb(octr | 0x20, LPTREG_CONTROL); /* try to tri-state the buffer */
+
+ pp_ntddkgenport_outb(0x55, LPTREG_DATA);
+ if (pp_ntddkgenport_inb(LPTREG_DATA) != 0x55) ok++;
+ pp_ntddkgenport_outb(0xaa, LPTREG_DATA);
+ if (pp_ntddkgenport_inb(LPTREG_DATA) != 0xaa) ok++;
+
+ pp_ntddkgenport_outb(octr, 0); /* cancel input mode */
+
+ return ok ? PARPORT_MODE_PCPS2 : 0;
+}
+
+static int parport_ecpps2(void)
+{
+ int mode;
+ unsigned char oecr;
+
+ oecr = pp_ntddkgenport_inb(LPTREG_ECONTROL);
+ pp_ntddkgenport_outb(0x20, LPTREG_ECONTROL);
+ mode = parport_ps2();
+ pp_ntddkgenport_outb(oecr, LPTREG_ECONTROL);
+ return mode ? PARPORT_MODE_PCECPPS2 : 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+int parport_init_ntddkgenport(void)
+{
+ if (pp_ntddkgenport_handle != INVALID_HANDLE_VALUE)
+ CloseHandle(pp_ntddkgenport_handle);
+ pp_ntddkgenport_handle = CreateFile(DEVNAME, GENERIC_READ | GENERIC_WRITE,
+ FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
+ OPEN_EXISTING, 0, NULL);
+ if (pp_ntddkgenport_handle == INVALID_HANDLE_VALUE) {
+ lprintf(0, "Cannot open genport.sys driver, error 0x%08lx\n", GetLastError());
+ return -1;
+ }
+ pp_ntddkgenport_flags = FLAGS_PCSPP;
+ if (!parport_spp()) {
+ lprintf(0, "No parport present\n");
+ goto err;
+ }
+ if (parport_ecr()) {
+ pp_ntddkgenport_flags |= FLAGS_PCECR;
+ pp_ntddkgenport_flags |= parport_ecp();
+ pp_ntddkgenport_flags |= parport_ecpps2();
+ pp_ntddkgenport_flags |= parport_ecpepp();
+ } else {
+ pp_ntddkgenport_flags |= parport_ps2();
+ pp_ntddkgenport_flags |= parport_epp();
+ }
+ lprintf(0, "Parport capabilities: SPP");
+ if (pp_ntddkgenport_flags & FLAGS_PCPS2)
+ lprintf(0, ", PS2");
+ if (pp_ntddkgenport_flags & FLAGS_PCEPP)
+ lprintf(0, ", EPP");
+ if (pp_ntddkgenport_flags & FLAGS_PCECR)
+ lprintf(0, ", ECR");
+ if (pp_ntddkgenport_flags & FLAGS_PCECP)
+ lprintf(0, ", ECP");
+ if (pp_ntddkgenport_flags & FLAGS_PCECPEPP)
+ lprintf(0, ", ECPEPP");
+ if (pp_ntddkgenport_flags & FLAGS_PCECPPS2)
+ lprintf(0, ", ECPPS2");
+ if (!(pp_ntddkgenport_flags & (FLAGS_PCPS2 | FLAGS_PCECPPS2))) {
+ lprintf(0, "\nParport does not even support PS/2 mode, cannot use it\n");
+ goto err;
+ }
+ lprintf(0, "\nParport using NTDDK genport.sys hardware access");
+ if (pp_ntddkgenport_flags & FLAGS_PCECR)
+ pp_ntddkgenport_outb(0x30, LPTREG_ECONTROL); /* PS/2 mode */
+ parport_ops = parport_ntddkgenport_ops;
+ if (!(pp_ntddkgenport_flags & FLAGS_PCECP)) {
+ parport_ops.parport_ecp_write_data = parport_ntddkgenport_emul_ops.parport_ecp_write_data;
+ parport_ops.parport_ecp_read_data = parport_ntddkgenport_emul_ops.parport_ecp_read_data;
+ parport_ops.parport_ecp_write_addr = parport_ntddkgenport_emul_ops.parport_ecp_write_addr;
+ lprintf(0, ", emulating ECP");
+ }
+ if (!(pp_ntddkgenport_flags & (FLAGS_PCEPP | FLAGS_PCECPEPP))) {
+ parport_ops.parport_epp_write_data = parport_ntddkgenport_emul_ops.parport_epp_write_data;
+ parport_ops.parport_epp_read_data = parport_ntddkgenport_emul_ops.parport_epp_read_data;
+ parport_ops.parport_epp_write_addr = parport_ntddkgenport_emul_ops.parport_epp_write_addr;
+ parport_ops.parport_epp_read_addr = parport_ntddkgenport_emul_ops.parport_epp_read_addr;
+ lprintf(0, ", emulating EPP");
+ }
+ lprintf(0, "\n");
+ return 0;
+
+ err:
+ CloseHandle(pp_ntddkgenport_handle);
+ pp_ntddkgenport_handle = INVALID_HANDLE_VALUE;
+ return -1;
+}
diff --git a/main/ppntinit.c b/main/ppntinit.c
new file mode 100644
index 0000000..d709214
--- /dev/null
+++ b/main/ppntinit.c
@@ -0,0 +1,587 @@
+/*****************************************************************************/
+
+/*
+ * ppntinit.c -- Parport direct access with NT eppflex.sys (init routines).
+ *
+ * Copyright (C) 2000-2001 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#include <windows.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+#define DEVNAME "\\\\.\\GpdDev"
+
+/* ---------------------------------------------------------------------- */
+
+/* LPT registers */
+/* ECP specific registers */
+#define LPTREG_ECONTROL 0x402
+#define LPTREG_CONFIGB 0x401
+#define LPTREG_CONFIGA 0x400
+#define LPTREG_TFIFO 0x400
+#define LPTREG_DFIFO 0x400
+#define LPTREG_AFIFO 0x000
+#define LPTREG_DSR 0x001
+#define LPTREG_DCR 0x002
+/* EPP specific registers */
+#define LPTREG_EPPDATA 0x004
+#define LPTREG_EPPADDR 0x003
+/* standard registers */
+#define LPTREG_CONTROL 0x002
+#define LPTREG_STATUS 0x001
+#define LPTREG_DATA 0x000
+
+/* ECP config A */
+#define LPTCFGA_INTRISALEVEL 0x80
+#define LPTCFGA_IMPIDMASK 0x70
+#define LPTCFGA_IMPID16BIT 0x00
+#define LPTCFGA_IMPID8BIT 0x10
+#define LPTCFGA_IMPID32BIT 0x20
+#define LPTCFGA_NOPIPELINE 0x04
+#define LPTCFGA_PWORDCOUNT 0x03
+
+/* ECP config B */
+#define LPTCFGB_COMPRESS 0x80
+#define LPTCFGB_INTRVALUE 0x40
+#define LPTCFGB_IRQMASK 0x38
+#define LPTCFGB_IRQ5 0x38
+#define LPTCFGB_IRQ15 0x30
+#define LPTCFGB_IRQ14 0x28
+#define LPTCFGB_IRQ11 0x20
+#define LPTCFGB_IRQ10 0x18
+#define LPTCFGB_IRQ9 0x10
+#define LPTCFGB_IRQ7 0x08
+#define LPTCFGB_IRQJUMPER 0x00
+#define LPTCFGB_DMAMASK 0x07
+#define LPTCFGB_DMA7 0x07
+#define LPTCFGB_DMA6 0x06
+#define LPTCFGB_DMA5 0x05
+#define LPTCFGB_DMAJUMPER16 0x04
+#define LPTCFGB_DMA3 0x03
+#define LPTCFGB_DMA2 0x02
+#define LPTCFGB_DMA1 0x01
+#define LPTCFGB_DMAJUMPER8 0x00
+
+/* ECP ECR */
+#define LPTECR_MODEMASK 0xe0
+#define LPTECR_MODESPP 0x00
+#define LPTECR_MODEPS2 0x20
+#define LPTECR_MODESPPFIFO 0x40
+#define LPTECR_MODEECP 0x60
+#define LPTECR_MODEECPEPP 0x80
+#define LPTECR_MODETEST 0xc0
+#define LPTECR_MODECFG 0xe0
+#define LPTECR_NERRINTRDIS 0x10
+#define LPTECR_DMAEN 0x08
+#define LPTECR_SERVICEINTR 0x04
+#define LPTECR_FIFOFULL 0x02
+#define LPTECR_FIFOEMPTY 0x01
+
+/* ---------------------------------------------------------------------- */
+
+extern HANDLE pp_nt_handle;
+extern unsigned int pp_nt_flags;
+extern const struct parport_ops parport_nt_ops, parport_nt_emul_ops;
+
+extern unsigned char parport_nt_read_data(void);
+extern void parport_nt_write_data(unsigned char d);
+extern unsigned char parport_nt_read_status(void);
+extern unsigned char parport_nt_read_control(void);
+extern void parport_nt_write_control(unsigned char d);
+extern void parport_nt_frob_control(unsigned char mask, unsigned char val);
+extern unsigned char parport_nt_read_configa(void);
+extern void parport_nt_write_configa(unsigned char d);
+extern unsigned char parport_nt_read_configb(void);
+extern void parport_nt_write_configb(unsigned char d);
+extern unsigned char parport_nt_read_econtrol(void);
+extern void parport_nt_write_econtrol(unsigned char d);
+extern void parport_nt_frob_econtrol(unsigned char mask, unsigned char val);
+extern unsigned char parport_nt_read_eppaddr(void);
+extern void parport_nt_write_eppaddr(unsigned char d);
+extern unsigned char parport_nt_read_eppdata(void);
+extern void parport_nt_write_eppdata(unsigned char d);
+extern int pp_nt_epp_clear_timeout(void);
+
+#define FLAGS_PCSPP (1<<0)
+#define FLAGS_PCPS2 (1<<1)
+#define FLAGS_PCEPP (1<<2)
+#define FLAGS_PCECR (1<<3) /* ECR Register Exists */
+#define FLAGS_PCECP (1<<4)
+#define FLAGS_PCECPEPP (1<<5)
+#define FLAGS_PCECPPS2 (1<<6)
+
+/* ---------------------------------------------------------------------- */
+
+static int parport_spp(void)
+{
+ pp_nt_epp_clear_timeout(); /* prevent lockup of some SMSC IC's */
+ /* this routine is mostly copied from Linux Kernel parport */
+ parport_nt_write_econtrol(0xc);
+ parport_nt_write_control(0xc);
+ parport_nt_write_data(0xaa);
+ if (parport_nt_read_data() != 0xaa)
+ return 0;
+ parport_nt_write_data(0x55);
+ if (parport_nt_read_data() != 0x55)
+ return 0;
+ return PARPORT_MODE_PCSPP;
+}
+
+/* Check for ECP
+ *
+ * Old style XT ports alias io ports every 0x400, hence accessing ECR
+ * on these cards actually accesses the CTR.
+ *
+ * Modern cards don't do this but reading from ECR will return 0xff
+ * regardless of what is written here if the card does NOT support
+ * ECP.
+ *
+ * We will write 0x2c to ECR and 0xcc to CTR since both of these
+ * values are "safe" on the CTR since bits 6-7 of CTR are unused.
+ */
+static int parport_ecr(void)
+{
+ unsigned char r = 0xc;
+
+ parport_nt_write_control(r);
+ if ((parport_nt_read_econtrol() & 0x3) == (r & 0x3)) {
+ parport_nt_write_control(r ^ 0x2); /* Toggle bit 1 */
+ r = parport_nt_read_control();
+ if ((parport_nt_read_econtrol() & 0x2) == (r & 0x2))
+ goto no_reg; /* Sure that no ECR register exists */
+ }
+
+ if ((parport_nt_read_econtrol() & 0x3 ) != 0x1)
+ goto no_reg;
+
+ parport_nt_write_econtrol(0x34);
+ if (parport_nt_read_econtrol() != 0x35)
+ goto no_reg;
+
+ parport_nt_write_control(0xc);
+
+ /* Go to mode 000 */
+ parport_nt_frob_econtrol(0xe0, 0);
+
+ return PARPORT_MODE_PCECR;
+
+ no_reg:
+ parport_nt_write_control(0xc);
+ return 0;
+}
+
+static int parport_ecp(void)
+{
+ int i;
+ int config;
+ int pword;
+ int fifo_depth, writeIntrThreshold, readIntrThreshold;
+
+ /* Find out FIFO depth */
+ parport_nt_write_econtrol(0x00); /* Reset FIFO */
+ parport_nt_write_econtrol(0xc0); /* TEST FIFO */
+ for (i=0; i < 1024 && !(parport_nt_read_econtrol() & 0x02); i++)
+ parport_nt_write_configa(0xaa);
+ /*
+ * Using LGS chipset it uses ECR register, but
+ * it doesn't support ECP or FIFO MODE
+ */
+ if (i == 1024) {
+ parport_nt_write_econtrol(0x00);
+ return 0;
+ }
+
+ fifo_depth = i;
+ lprintf(3, "ECP: FIFO depth is %d bytes\n", fifo_depth);
+
+ /* Find out writeIntrThreshold */
+ parport_nt_frob_econtrol((1<<2), (1<<2));
+ parport_nt_frob_econtrol((1<<2), 0);
+ for (i = 1; i <= fifo_depth; i++) {
+ parport_nt_read_configa();
+ usleep(50);
+ if (parport_nt_read_econtrol() & (1<<2))
+ break;
+ }
+
+ if (i <= fifo_depth)
+ lprintf(3, "ECP: writeIntrThreshold is %d\n", i);
+ else
+ /* Number of bytes we know we can write if we get an
+ interrupt. */
+ i = 0;
+
+ writeIntrThreshold = i;
+
+ /* Find out readIntrThreshold */
+ parport_nt_frob_econtrol(0xe0, 0x20); /* Reset FIFO, PS2 */
+ parport_nt_frob_control(PARPORT_CONTROL_DIRECTION, PARPORT_CONTROL_DIRECTION);
+ parport_nt_frob_econtrol(0xe0, 0xc0); /* Test FIFO */
+ parport_nt_frob_econtrol((1<<2), (1<<2));
+ parport_nt_frob_econtrol((1<<2), 0);
+ for (i = 1; i <= fifo_depth; i++) {
+ parport_nt_write_configa(0xaa);
+ if (parport_nt_read_econtrol() & (1<<2))
+ break;
+ }
+
+ if (i <= fifo_depth)
+ lprintf(3, "ECP: readIntrThreshold is %d\n", i);
+ else
+ /* Number of bytes we can read if we get an interrupt. */
+ i = 0;
+
+ readIntrThreshold = i;
+
+ parport_nt_write_econtrol(0x00); /* Reset FIFO */
+ parport_nt_write_econtrol(0xf4); /* Configuration mode */
+ config = parport_nt_read_configa();
+ pword = (config >> 4) & 0x7;
+ switch (pword) {
+ case 0:
+ pword = 2;
+ lprintf(0, "ECP: Unsupported pword size! (2)\n");
+ break;
+ case 2:
+ pword = 4;
+ lprintf(0, "ECP: Unsupported pword size! (4)\n");
+ break;
+ default:
+ lprintf(0, "ECP: Unknown implementation ID (%d)\n", pword);
+ /* Assume 1 */
+ case 1:
+ pword = 1;
+ }
+ lprintf(3, "ECP: PWord is %d bits\n", 8 * pword);
+
+ config = parport_nt_read_configb();
+ lprintf(3, "ECP: Interrupts are ISA-%s\n", config & 0x80 ? "Level" : "Pulses");
+
+ if (!(config & 0x40))
+ lprintf(3, "ECP: IRQ conflict!\n");
+
+ /* Go back to mode 000 */
+ parport_nt_frob_econtrol(0xe0, 0);
+
+ return PARPORT_MODE_PCECP;
+}
+
+/* EPP mode detection */
+
+static int parport_epp(void)
+{
+ /* If EPP timeout bit clear then EPP available */
+ if (!pp_nt_epp_clear_timeout())
+ return 0; /* No way to clear timeout */
+
+ /*
+ * Theory:
+ * Write two values to the EPP address register and
+ * read them back. When the transfer times out, the state of
+ * the EPP register is undefined in some cases (EPP 1.9?) but
+ * in others (EPP 1.7, ECPEPP?) it is possible to read back
+ * its value.
+ */
+
+ pp_nt_epp_clear_timeout();
+ usleep(30); /* Wait for possible EPP timeout */
+
+ parport_nt_write_eppaddr(0x55);
+ pp_nt_epp_clear_timeout();
+ usleep(30); /* Wait for possible EPP timeout */
+
+ if (parport_nt_read_eppaddr() == 0x55) {
+ parport_nt_write_eppaddr(0xaa);
+ pp_nt_epp_clear_timeout();
+ usleep(30); /* Wait for possible EPP timeout */
+ if (parport_nt_read_eppaddr() == 0xaa) {
+ pp_nt_epp_clear_timeout();
+ return PARPORT_MODE_PCEPP;
+ }
+ }
+
+ /*
+ * Theory:
+ * Bit 0 of STR is the EPP timeout bit, this bit is 0
+ * when EPP is possible and is set high when an EPP timeout
+ * occurs (EPP uses the HALT line to stop the CPU while it does
+ * the byte transfer, an EPP timeout occurs if the attached
+ * device fails to respond after 10 micro seconds).
+ *
+ * This bit is cleared by either reading it (National Semi)
+ * or writing a 1 to the bit (SMC, UMC, WinBond), others ???
+ * This bit is always high in non EPP modes.
+ */
+
+ parport_nt_frob_control(0x20, 0x20);
+ parport_nt_frob_control(0x10, 0x10);
+ pp_nt_epp_clear_timeout();
+
+ parport_nt_read_eppdata();
+ usleep(30); /* Wait for possible EPP timeout */
+
+ if (parport_nt_read_status() & 0x01) {
+ pp_nt_epp_clear_timeout();
+ return PARPORT_MODE_PCEPP;
+ }
+ return 0;
+}
+
+static int parport_ecpepp(void)
+{
+ int mode;
+ unsigned char oecr;
+
+ oecr = parport_nt_read_econtrol();
+ /* Search for SMC style EPP+ECP mode */
+ parport_nt_write_econtrol(0x80);
+ mode = parport_epp();
+ parport_nt_write_econtrol(oecr);
+ return mode ? PARPORT_MODE_PCECPEPP : 0;
+}
+
+/* Detect PS/2 support.
+ *
+ * Bit 5 (0x20) sets the PS/2 data direction; setting this high
+ * allows us to read data from the data lines. In theory we would get back
+ * 0xff but any peripheral attached to the port may drag some or all of the
+ * lines down to zero. So if we get back anything that isn't the contents
+ * of the data register we deem PS/2 support to be present.
+ *
+ * Some SPP ports have "half PS/2" ability - you can't turn off the line
+ * drivers, but an external peripheral with sufficiently beefy drivers of
+ * its own can overpower them and assert its own levels onto the bus, from
+ * where they can then be read back as normal. Ports with this property
+ * and the right type of device attached are likely to fail the SPP test,
+ * (as they will appear to have stuck bits) and so the fact that they might
+ * be misdetected here is rather academic.
+ */
+
+static int parport_ps2(void)
+{
+ int ok = 0;
+ unsigned char octr = parport_nt_read_control();
+
+ pp_nt_epp_clear_timeout();
+
+ parport_nt_write_control(octr | 0x20); /* try to tri-state the buffer */
+
+ parport_nt_write_data(0x55);
+ if (parport_nt_read_data() != 0x55) ok++;
+ parport_nt_write_data(0xaa);
+ if (parport_nt_read_data() != 0xaa) ok++;
+
+ parport_nt_write_control(octr); /* cancel input mode */
+
+ return ok ? PARPORT_MODE_PCPS2 : 0;
+}
+
+static int parport_ecpps2(void)
+{
+ int mode;
+ unsigned char oecr;
+
+ oecr = parport_nt_read_econtrol();
+ parport_nt_write_econtrol(0x20);
+ mode = parport_ps2();
+ parport_nt_write_econtrol(oecr);
+ return mode ? PARPORT_MODE_PCECPPS2 : 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+#define SERVICENAME "eppflex"
+#define SERVICEDISPLAYNAME "Baycom EPPFLEX"
+//#define SERVICEBINARY "\"\\??\\g:\\nteppflex\\eppflex.sys\""
+#define SERVICEBINARY "System32\\drivers\\eppflex.sys"
+
+static int start_service(void)
+{
+ int ret = -1;
+ SC_HANDLE hscm, hserv;
+
+ hscm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
+ if (!hscm) {
+ lprintf(5, "Cannot open SC manager, error 0x%08lx\n", GetLastError());
+ return -1;
+ }
+ hserv = CreateService(hscm, SERVICENAME, SERVICEDISPLAYNAME,
+ SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
+ SERVICEBINARY, NULL, NULL, NULL, NULL, NULL);
+ if (!hserv) {
+ lprintf(5, "Cannot create service, error 0x%08lx\n", GetLastError());
+ hserv = OpenService(hscm, SERVICENAME, SERVICE_ALL_ACCESS);
+ if (!hserv) {
+ lprintf(5, "Cannot open service, error 0x%08lx\n", GetLastError());
+ goto closescm;
+ }
+ }
+ if (!StartService(hserv, 0, NULL)) {
+ lprintf(5, "Cannot start service, error 0x%08lx\n", GetLastError());
+ goto closeserv;
+ }
+ lprintf(1, "Service %s started successfully\n", SERVICENAME);
+ ret = 0;
+
+ closeserv:
+ if (!CloseServiceHandle(hserv))
+ lprintf(5, "Cannot close service handle, error 0x%08lx\n", GetLastError());
+ closescm:
+ if (!CloseServiceHandle(hscm))
+ lprintf(5, "Cannot close service manager handle, error 0x%08lx\n", GetLastError());
+ return ret;
+}
+
+static int stop_service(void)
+{
+ int ret = -1;
+ SC_HANDLE hscm, hserv;
+ SERVICE_STATUS sstat;
+
+ hscm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
+ if (!hscm) {
+ lprintf(5, "Cannot open SC manager, error 0x%08lx\n", GetLastError());
+ return -1;
+ }
+ hserv = OpenService(hscm, SERVICENAME, SERVICE_ALL_ACCESS);
+ if (!hserv) {
+ lprintf(5, "Cannot open service, error 0x%08lx\n", GetLastError());
+ goto closescm;
+ }
+ ret = 0;
+ if (!ControlService(hserv, SERVICE_CONTROL_STOP, &sstat)) {
+ lprintf(5, "Cannot delete service, error 0x%08lx\n", GetLastError());
+ ret = -1;
+ }
+ if (!DeleteService(hserv)) {
+ lprintf(5, "Cannot delete service, error 0x%08lx\n", GetLastError());
+ ret = -1;
+ }
+ if (!ret)
+ lprintf(1, "Service %s stopped successfully\n", SERVICENAME);
+ if (!CloseServiceHandle(hserv))
+ lprintf(5, "Cannot close service handle, error 0x%08lx\n", GetLastError());
+ closescm:
+ if (!CloseServiceHandle(hscm))
+ lprintf(5, "Cannot close service manager handle, error 0x%08lx\n", GetLastError());
+ return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+void parport_stop_nt(void)
+{
+ if (pp_nt_handle != INVALID_HANDLE_VALUE)
+ CloseHandle(pp_nt_handle);
+ pp_nt_handle = INVALID_HANDLE_VALUE;
+ stop_service();
+}
+
+/* ---------------------------------------------------------------------- */
+
+int parport_init_nt_flags(unsigned int portnr, unsigned int flags)
+{
+ char buf[32];
+
+ if (pp_nt_handle != INVALID_HANDLE_VALUE)
+ CloseHandle(pp_nt_handle);
+ start_service();
+ snprintf(buf, sizeof(buf), "\\\\.\\eppflex\\%u", portnr);
+ pp_nt_handle = CreateFile(buf, GENERIC_READ | GENERIC_WRITE,
+ FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
+ OPEN_EXISTING, 0, NULL);
+ if (pp_nt_handle == INVALID_HANDLE_VALUE) {
+ lprintf(0, "Cannot open eppflex.sys driver, error 0x%08lx\n", GetLastError());
+ goto err;
+ }
+ pp_nt_flags = FLAGS_PCSPP;
+ if (!parport_spp()) {
+ lprintf(0, "No parport present\n");
+ goto err;
+ }
+ if (parport_ecr()) {
+ pp_nt_flags |= FLAGS_PCECR;
+ pp_nt_flags |= parport_ecp();
+ pp_nt_flags |= parport_ecpps2();
+ pp_nt_flags |= parport_ecpepp();
+ if ((flags & PPFLAG_FORCEHWEPP) &&
+ (pp_nt_flags & (FLAGS_PCPS2|FLAGS_PCECPPS2)) &&
+ !(pp_nt_flags & (FLAGS_PCEPP|FLAGS_PCECPEPP)))
+ pp_nt_flags |= FLAGS_PCECPEPP;
+ else
+ flags &= ~PPFLAG_FORCEHWEPP;
+ } else {
+ pp_nt_flags |= parport_ps2();
+ pp_nt_flags |= parport_epp();
+ if ((flags & PPFLAG_FORCEHWEPP) &&
+ (pp_nt_flags & (FLAGS_PCPS2|FLAGS_PCECPPS2)) &&
+ !(pp_nt_flags & (FLAGS_PCEPP|FLAGS_PCECPEPP)))
+ pp_nt_flags |= FLAGS_PCEPP;
+ else
+ flags &= ~PPFLAG_FORCEHWEPP;
+ }
+ lprintf(0, "Parport capabilities: SPP%s%s%s%s%s%s\n",
+ (pp_nt_flags & FLAGS_PCPS2) ? ", PS2" : "",
+ (pp_nt_flags & FLAGS_PCEPP) ? ((flags & PPFLAG_FORCEHWEPP) ? ", EPP (forced)" : ", EPP") : "",
+ (pp_nt_flags & FLAGS_PCECR) ? ", ECR" : "",
+ (pp_nt_flags & FLAGS_PCECP) ? ", ECP" : "",
+ (pp_nt_flags & FLAGS_PCECPEPP) ? ((flags & PPFLAG_FORCEHWEPP) ? ", ECPEPP (forced)" : ", ECPEPP") : "",
+ (pp_nt_flags & FLAGS_PCECPPS2) ? ", ECPPS2" : "");
+ if (!(pp_nt_flags & (FLAGS_PCPS2 | FLAGS_PCECPPS2))) {
+ lprintf(0, "Parport does not even support PS/2 mode, cannot use it\n");
+ goto err;
+ }
+ lprintf(0, "Parport using NT eppflex.sys hardware access");
+ if (pp_nt_flags & FLAGS_PCECR)
+ parport_nt_write_econtrol(0x30); /* PS/2 mode */
+ parport_ops = parport_nt_ops;
+ if ((flags & PPFLAG_SWEMULECP) || !(pp_nt_flags & FLAGS_PCECP)) {
+ parport_ops.parport_ecp_write_data = parport_nt_emul_ops.parport_ecp_write_data;
+ parport_ops.parport_ecp_read_data = parport_nt_emul_ops.parport_ecp_read_data;
+ parport_ops.parport_ecp_write_addr = parport_nt_emul_ops.parport_ecp_write_addr;
+ lprintf(0, ", emulating ECP");
+ }
+ if ((flags & PPFLAG_SWEMULEPP) || !(pp_nt_flags & (FLAGS_PCEPP | FLAGS_PCECPEPP))) {
+ parport_ops.parport_epp_write_data = parport_nt_emul_ops.parport_epp_write_data;
+ parport_ops.parport_epp_read_data = parport_nt_emul_ops.parport_epp_read_data;
+ parport_ops.parport_epp_write_addr = parport_nt_emul_ops.parport_epp_write_addr;
+ parport_ops.parport_epp_read_addr = parport_nt_emul_ops.parport_epp_read_addr;
+ lprintf(0, ", emulating EPP");
+ }
+ lprintf(0, "\n");
+ return 0;
+
+ err:
+ parport_stop_nt();
+ return -1;
+}
+
+int parport_init_nt(unsigned int portnr)
+{
+ return parport_init_nt_flags(portnr, 0);
+}
diff --git a/main/ppuser.c b/main/ppuser.c
new file mode 100644
index 0000000..8f8a0d5
--- /dev/null
+++ b/main/ppuser.c
@@ -0,0 +1,450 @@
+/*****************************************************************************/
+
+/*
+ * ppuser.c -- Parport access via Linux PPUSER device.
+ *
+ * Copyright (C) 1998-1999 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#include <sys/ioctl.h>
+#include <unistd.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+#include "ppuser.h"
+
+/* ---------------------------------------------------------------------- */
+
+int pp_user_fd = -1;
+
+/* ---------------------------------------------------------------------- */
+
+void parport_user_exit(void)
+{
+ if (pp_user_fd != -1) {
+ ioctl(pp_user_fd, PPRELEASE, 0);
+ close(pp_user_fd);
+ }
+ pp_user_fd = -1;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned char parport_user_read_data(void)
+{
+ unsigned char r;
+
+ ioctl(pp_user_fd, PPRDATA, &r);
+ return r;
+}
+
+void parport_user_write_data(unsigned char d)
+{
+ ioctl(pp_user_fd, PPWDATA, &d);
+}
+
+unsigned char parport_user_read_status(void)
+{
+ unsigned char r;
+
+ ioctl(pp_user_fd, PPRSTATUS, &r);
+ return r;
+}
+
+
+unsigned char parport_user_read_control(void)
+{
+ unsigned char r;
+
+ ioctl(pp_user_fd, PPRCONTROL, &r);
+ return r;
+}
+
+void parport_user_write_control(unsigned char d)
+{
+ ioctl(pp_user_fd, PPWCONTROL, &d);
+}
+
+void parport_user_frob_control(unsigned char mask, unsigned char val)
+{
+ unsigned char d;
+
+ ioctl(pp_user_fd, PPRCONTROL, &d);
+ d = (d & (~mask)) ^ val;
+ ioctl(pp_user_fd, PPWCONTROL, &d);
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_user_epp_write_data(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo;
+ unsigned char d;
+
+ d = LPTCTRL_PROGRAM | LPTCTRL_WRITE;
+ ioctl(pp_user_fd, PPWCONTROL, &d);
+ for (; sz > 0; sz--, bp++) {
+ ioctl(pp_user_fd, PPWDATA, bp);
+ for (tmo = 0; ; tmo++) {
+ ioctl(pp_user_fd, PPRSTATUS, &d);
+ if (d & LPTSTAT_WAIT)
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ d = LPTCTRL_PROGRAM | LPTCTRL_WRITE | LPTCTRL_DATASTB;
+ ioctl(pp_user_fd, PPWCONTROL, &d);
+ for (tmo = 0; ; tmo++) {
+ ioctl(pp_user_fd, PPRSTATUS, &d);
+ if (!(d & LPTSTAT_WAIT))
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ d = LPTCTRL_PROGRAM | LPTCTRL_WRITE;
+ ioctl(pp_user_fd, PPWCONTROL, &d);
+ ret++;
+ }
+ return ret;
+}
+
+unsigned parport_user_epp_read_data(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo;
+ unsigned char d;
+
+ d = LPTCTRL_PROGRAM | LPTCTRL_DIRECTION;
+ ioctl(pp_user_fd, PPWCONTROL, &d);
+ for (; sz > 0; sz--, bp++) {
+ for (tmo = 0; ; tmo++) {
+ ioctl(pp_user_fd, PPRSTATUS, &d);
+ if (d & LPTSTAT_WAIT)
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ d = LPTCTRL_PROGRAM | LPTCTRL_DIRECTION | LPTCTRL_DATASTB;
+ ioctl(pp_user_fd, PPWCONTROL, &d);
+ for (tmo = 0; ; tmo++) {
+ ioctl(pp_user_fd, PPRSTATUS, &d);
+ if (!(d & LPTSTAT_WAIT))
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ ioctl(pp_user_fd, PPRDATA, bp);
+ d = LPTCTRL_PROGRAM | LPTCTRL_DIRECTION;
+ ioctl(pp_user_fd, PPWCONTROL, &d);
+ ret++;
+ }
+ return ret;
+}
+
+unsigned parport_user_epp_write_addr(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo;
+ unsigned char d;
+
+ d = LPTCTRL_PROGRAM | LPTCTRL_WRITE;
+ ioctl(pp_user_fd, PPWCONTROL, &d);
+ for (; sz > 0; sz--, bp++) {
+ ioctl(pp_user_fd, PPWDATA, bp);
+ for (tmo = 0; ; tmo++) {
+ ioctl(pp_user_fd, PPRSTATUS, &d);
+ if (d & LPTSTAT_WAIT)
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ d = LPTCTRL_PROGRAM | LPTCTRL_WRITE | LPTCTRL_ADDRSTB;
+ ioctl(pp_user_fd, PPWCONTROL, &d);
+ for (tmo = 0; ; tmo++) {
+ ioctl(pp_user_fd, PPRSTATUS, &d);
+ if (!(d & LPTSTAT_WAIT))
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ d = LPTCTRL_PROGRAM | LPTCTRL_WRITE;
+ ioctl(pp_user_fd, PPWCONTROL, &d);
+ ret++;
+ }
+ return ret;
+}
+
+unsigned parport_user_epp_read_addr(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo;
+ unsigned char d;
+
+ d = LPTCTRL_PROGRAM | LPTCTRL_DIRECTION;
+ ioctl(pp_user_fd, PPWCONTROL, &d);
+ for (; sz > 0; sz--, bp++) {
+ for (tmo = 0; ; tmo++) {
+ ioctl(pp_user_fd, PPRSTATUS, &d);
+ if (d & LPTSTAT_WAIT)
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ d = LPTCTRL_PROGRAM | LPTCTRL_DIRECTION | LPTCTRL_ADDRSTB;
+ ioctl(pp_user_fd, PPWCONTROL, &d);
+ for (tmo = 0; ; tmo++) {
+ ioctl(pp_user_fd, PPRSTATUS, &d);
+ if (!(d & LPTSTAT_WAIT))
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ ioctl(pp_user_fd, PPRDATA, bp);
+ d = LPTCTRL_PROGRAM | LPTCTRL_DIRECTION;
+ ioctl(pp_user_fd, PPWCONTROL, &d);
+ ret++;
+ }
+ return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static int ecp_forward(void)
+{
+ unsigned tmo = 0x10000;
+ unsigned char d;
+
+ ioctl(pp_user_fd, PPRSTATUS, &d);
+ if (d & 0x20)
+ return 0;
+ /* Event 47: Set nInit high */
+ d = 0x26;
+ ioctl(pp_user_fd, PPWCONTROL, &d);
+ /* Event 49: PError goes high */
+ for (;;) {
+ ioctl(pp_user_fd, PPRSTATUS, &d);
+ if (d & 0x20)
+ break;
+ if (!(--tmo))
+ return -1;
+ }
+ /* start driving the bus */
+ d = 0x04;
+ ioctl(pp_user_fd, PPWCONTROL, &d);
+ return 0;
+}
+
+static int ecp_reverse(void)
+{
+ unsigned tmo = 0x10000;
+ unsigned char d;
+
+ ioctl(pp_user_fd, PPRSTATUS, &d);
+ if (!(d & 0x20))
+ return 0;
+ d = 0x24;
+ ioctl(pp_user_fd, PPWCONTROL, &d);
+ /* Event 39: Set nInit low to initiate bus reversal */
+ d = 0x20;
+ ioctl(pp_user_fd, PPWCONTROL, &d);
+ for (;;) {
+ ioctl(pp_user_fd, PPRSTATUS, &d);
+ if (!(d & 0x20))
+ break;
+ if (!(--tmo))
+ return -1;
+ }
+ return 0;
+}
+
+unsigned parport_user_ecp_write_data(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret;
+ unsigned char ctl, d;
+ unsigned tmo;
+
+ if (ecp_forward())
+ return 0;
+ ioctl(pp_user_fd, PPRCONTROL, &ctl);
+ ctl &= ~PARPORT_CONTROL_AUTOFD;
+ /* HostAck high (data, not command) */
+ ioctl(pp_user_fd, PPWCONTROL, &ctl);
+ for (ret = 0; ret < sz; ret++, bp++) {
+ ioctl(pp_user_fd, PPWDATA, bp);
+ d = ctl | PARPORT_CONTROL_STROBE;
+ ioctl(pp_user_fd, PPWCONTROL, &d);
+ tmo = 0;
+ do {
+ if (tmo > 0x1000)
+ return ret;
+ tmo++;
+ ioctl(pp_user_fd, PPRSTATUS, &d);
+ } while (d & PARPORT_STATUS_BUSY);
+ ioctl(pp_user_fd, PPWCONTROL, &ctl);
+ tmo = 0;
+ do {
+ if (tmo > 0x1000)
+ return ret;
+ tmo++;
+ ioctl(pp_user_fd, PPRSTATUS, &d);
+ } while (!(d & PARPORT_STATUS_BUSY));
+ }
+ return ret;
+}
+
+unsigned parport_user_ecp_write_addr(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret;
+ unsigned char ctl, d;
+ unsigned tmo;
+
+ if (ecp_forward())
+ return 0;
+ ioctl(pp_user_fd, PPRCONTROL, &ctl);
+ ctl |= PARPORT_CONTROL_AUTOFD;
+ /* HostAck low (command, not data) */
+ ioctl(pp_user_fd, PPWCONTROL, &ctl);
+ for (ret = 0; ret < sz; ret++, bp++) {
+ ioctl(pp_user_fd, PPWDATA, bp);
+ d = ctl | PARPORT_CONTROL_STROBE;
+ ioctl(pp_user_fd, PPWCONTROL, &d);
+ tmo = 0;
+ do {
+ if (tmo > 0x1000)
+ return ret;
+ tmo++;
+ ioctl(pp_user_fd, PPRSTATUS, &d);
+ } while (d & PARPORT_STATUS_BUSY);
+ ioctl(pp_user_fd, PPWCONTROL, &ctl);
+ tmo = 0;
+ do {
+ if (tmo > 0x1000)
+ return ret;
+ tmo++;
+ ioctl(pp_user_fd, PPRSTATUS, &d);
+ } while (!(d & PARPORT_STATUS_BUSY));
+ }
+ return ret;
+}
+
+unsigned parport_user_ecp_read_data(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned char ctl, stat;
+ int command;
+ unsigned tmo;
+ unsigned char d;
+
+ if (ecp_reverse())
+ return 0;
+ ioctl(pp_user_fd, PPRCONTROL, &ctl);
+ /* Set HostAck low to start accepting data. */
+ d = ctl | PARPORT_CONTROL_AUTOFD;
+ ioctl(pp_user_fd, PPWCONTROL, &d);
+ while (ret < sz) {
+ /* Event 43: Peripheral sets nAck low. It can take as
+ long as it wants. */
+ tmo = 0;
+ do {
+ ioctl(pp_user_fd, PPRSTATUS, &stat);
+ if ((++tmo) > 0x10000)
+ goto out;
+ } while (stat & PARPORT_STATUS_ACK);
+
+ /* Is this a command? */
+ command = stat & PARPORT_STATUS_BUSY;
+ if (command) {
+ //lprintf(3, "ECP: warning: emulation does not support RLE\n");
+ goto out;
+ }
+
+ /* Read the data. */
+ ioctl(pp_user_fd, PPRDATA, bp);
+
+ /* Event 44: Set HostAck high, acknowledging handshake. */
+ d = ctl & ~PARPORT_CONTROL_AUTOFD;
+ ioctl(pp_user_fd, PPWCONTROL, &d);
+
+ /* Event 45: The peripheral has 35ms to set nAck high. */
+ tmo = 0;
+ do {
+ ioctl(pp_user_fd, PPRSTATUS, &stat);
+ if ((++tmo) > 0x10000)
+ goto out;
+ } while (!(stat & PARPORT_STATUS_ACK));
+
+ /* Event 46: Set HostAck low and accept the data. */
+ d = ctl | PARPORT_CONTROL_AUTOFD;
+ ioctl(pp_user_fd, PPWCONTROL, &d);
+
+ /* Normal data byte. */
+ bp++;
+ ret++;
+ }
+
+ out:
+ return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_user_fpgaconfig_write(const void *buf, unsigned sz)
+{
+ const unsigned char *bp = buf;
+ unsigned u;
+
+ for (u = 0; u < sz; u++, bp++)
+ parport_user_write_data(*bp);
+ return sz;
+}
+
+/* ---------------------------------------------------------------------- */
+
+const struct parport_ops parport_user_ops = {
+ parport_user_read_data,
+ parport_user_write_data,
+ parport_user_read_status,
+ parport_user_read_control,
+ parport_user_write_control,
+ parport_user_frob_control,
+ parport_user_epp_write_data,
+ parport_user_epp_read_data,
+ parport_user_epp_write_addr,
+ parport_user_epp_read_addr,
+ parport_user_ecp_write_data,
+ parport_user_ecp_read_data,
+ parport_user_ecp_write_addr,
+ parport_user_fpgaconfig_write
+};
+
+/* ---------------------------------------------------------------------- */
diff --git a/main/ppuser.h b/main/ppuser.h
new file mode 100644
index 0000000..2b32be0
--- /dev/null
+++ b/main/ppuser.h
@@ -0,0 +1,48 @@
+/*
+ * User-space parallel port device driver (header file).
+ *
+ * Copyright (C) 1998-9 Tim Waugh <tim at cyberelk.demon.co.uk>
+ *
+ * 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.
+ *
+ */
+
+#define PP_MAJOR 99
+
+#define PP_IOCTL 'p'
+
+/* Set mode for read/write (e.g. PARPORT_MODE_PCEPP) */
+#define PPSETMODE _IOW(PP_IOCTL, 0x80, int)
+
+/* Read/write status */
+#define PPRSTATUS _IOR(PP_IOCTL, 0x81, unsigned char)
+#define PPWSTATUS _IOW(PP_IOCTL, 0x82, unsigned char)
+
+/* Read/write control */
+#define PPRCONTROL _IOR(PP_IOCTL, 0x83, unsigned char)
+#define PPWCONTROL _IOW(PP_IOCTL, 0x84, unsigned char)
+
+/* Read/write data */
+#define PPRDATA _IOR(PP_IOCTL, 0x85, unsigned char)
+#define PPWDATA _IOW(PP_IOCTL, 0x86, unsigned char)
+
+/* Read/write econtrol */
+#define PPRECONTROL _IOR(PP_IOCTL, 0x87, unsigned char)
+#define PPWECONTROL _IOW(PP_IOCTL, 0x88, unsigned char)
+
+/* Read/write FIFO */
+#define PPRFIFO _IOR(PP_IOCTL, 0x89, unsigned char)
+#define PPWFIFO _IOW(PP_IOCTL, 0x8a, unsigned char)
+
+/* Claim the port to start using it */
+#define PPCLAIM _IO(PP_IOCTL, 0x8b)
+
+/* Release the port when you aren't using it */
+#define PPRELEASE _IO(PP_IOCTL, 0x8c)
+
+/* Yield the port (release it if another driver is waiting,
+ * then reclaim) */
+#define PPYIELD _IO(PP_IOCTL, 0x8d)
diff --git a/main/ppuserinit.c b/main/ppuserinit.c
new file mode 100644
index 0000000..f99d3a5
--- /dev/null
+++ b/main/ppuserinit.c
@@ -0,0 +1,80 @@
+/*****************************************************************************/
+
+/*
+ * ppuserinit.c -- Parport access via Linux PPUSER device (init routines).
+ *
+ * Copyright (C) 1998-1999 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+#include "ppuser.h"
+
+/* ---------------------------------------------------------------------- */
+
+extern int pp_user_fd;
+extern const struct parport_ops parport_user_ops;
+extern void parport_user_exit(void);
+
+/* ---------------------------------------------------------------------- */
+
+int parport_init_ppuser(const char *path)
+{
+ unsigned char d;
+
+ if ((pp_user_fd = open(path, O_RDWR | O_NONBLOCK)) == -1) {
+ lprintf(0, "Cannot open ppuser device %s (error %s)\n", path,
+ strerror(errno));
+ return -1;
+ }
+ if (ioctl(pp_user_fd, PPCLAIM, 0)) {
+ lprintf(0, "Cannot claim ppuser device %s (error %s)\n", path,
+ strerror(errno));
+ close(pp_user_fd);
+ pp_user_fd = -1;
+ return -1;
+ }
+ if (atexit(parport_user_exit)) {
+ lprintf(0, "Cannot install atexit handler (error %s)\n", strerror(errno));
+ ioctl(pp_user_fd, PPRELEASE, 0);
+ close(pp_user_fd);
+ pp_user_fd = -1;
+ return -1;
+ }
+ d = 0x30; /* set PS/2 mode */
+ ioctl(pp_user_fd, PPWECONTROL, &d);
+ parport_ops = parport_user_ops;
+ return 0;
+}
diff --git a/main/ppw9xring0.c b/main/ppw9xring0.c
new file mode 100644
index 0000000..bac28a7
--- /dev/null
+++ b/main/ppw9xring0.c
@@ -0,0 +1,797 @@
+/*****************************************************************************/
+
+/*
+ * ppw9xring0.c -- Parport direct access under Win9x using Ring0 hack.
+ *
+ * Copyright (C) 1998-2000 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#include <windows.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+/* LPT registers */
+/* ECP specific registers */
+#define LPTREG_ECONTROL 0x402
+#define LPTREG_CONFIGB 0x401
+#define LPTREG_CONFIGA 0x400
+#define LPTREG_TFIFO 0x400
+#define LPTREG_DFIFO 0x400
+#define LPTREG_AFIFO 0x000
+#define LPTREG_DSR 0x001
+#define LPTREG_DCR 0x002
+/* EPP specific registers */
+#define LPTREG_EPPDATA 0x004
+#define LPTREG_EPPADDR 0x003
+/* standard registers */
+#define LPTREG_CONTROL 0x002
+#define LPTREG_STATUS 0x001
+#define LPTREG_DATA 0x000
+
+/* ECP config A */
+#define LPTCFGA_INTRISALEVEL 0x80
+#define LPTCFGA_IMPIDMASK 0x70
+#define LPTCFGA_IMPID16BIT 0x00
+#define LPTCFGA_IMPID8BIT 0x10
+#define LPTCFGA_IMPID32BIT 0x20
+#define LPTCFGA_NOPIPELINE 0x04
+#define LPTCFGA_PWORDCOUNT 0x03
+
+/* ECP config B */
+#define LPTCFGB_COMPRESS 0x80
+#define LPTCFGB_INTRVALUE 0x40
+#define LPTCFGB_IRQMASK 0x38
+#define LPTCFGB_IRQ5 0x38
+#define LPTCFGB_IRQ15 0x30
+#define LPTCFGB_IRQ14 0x28
+#define LPTCFGB_IRQ11 0x20
+#define LPTCFGB_IRQ10 0x18
+#define LPTCFGB_IRQ9 0x10
+#define LPTCFGB_IRQ7 0x08
+#define LPTCFGB_IRQJUMPER 0x00
+#define LPTCFGB_DMAMASK 0x07
+#define LPTCFGB_DMA7 0x07
+#define LPTCFGB_DMA6 0x06
+#define LPTCFGB_DMA5 0x05
+#define LPTCFGB_DMAJUMPER16 0x04
+#define LPTCFGB_DMA3 0x03
+#define LPTCFGB_DMA2 0x02
+#define LPTCFGB_DMA1 0x01
+#define LPTCFGB_DMAJUMPER8 0x00
+
+/* ECP ECR */
+#define LPTECR_MODEMASK 0xe0
+#define LPTECR_MODESPP 0x00
+#define LPTECR_MODEPS2 0x20
+#define LPTECR_MODESPPFIFO 0x40
+#define LPTECR_MODEECP 0x60
+#define LPTECR_MODEECPEPP 0x80
+#define LPTECR_MODETEST 0xc0
+#define LPTECR_MODECFG 0xe0
+#define LPTECR_NERRINTRDIS 0x10
+#define LPTECR_DMAEN 0x08
+#define LPTECR_SERVICEINTR 0x04
+#define LPTECR_FIFOFULL 0x02
+#define LPTECR_FIFOEMPTY 0x01
+
+/* ---------------------------------------------------------------------- */
+
+unsigned int pp_w9xring0_iobase = 0x378;
+unsigned int pp_w9xring0_flags = 0;
+
+#define FLAGS_PCSPP (1<<0)
+#define FLAGS_PCPS2 (1<<1)
+#define FLAGS_PCEPP (1<<2)
+#define FLAGS_PCECR (1<<3) /* ECR Register Exists */
+#define FLAGS_PCECP (1<<4)
+#define FLAGS_PCECPEPP (1<<5)
+#define FLAGS_PCECPPS2 (1<<6)
+
+/* ---------------------------------------------------------------------- */
+
+asm(".text\n\t"
+ ".align\t4\n"
+ "_do_ring0_inb:\n\t"
+ "inb %dx,%al\n\t"
+ "lret\n\n\t"
+ ".align\t4\n"
+ "_do_ring0_outb:\n\t"
+ "outb %al,%dx\n\t"
+ "lret\n\n\t"
+ ".align\t4\n\t"
+ ".data\n\t");
+
+extern int do_ring0_inb(int,int);
+extern int do_ring0_outb(int,int);
+
+static int call_ring0(int (*routine)(int,int), int param1, int param2)
+{
+ unsigned short gdtbase[3];
+ unsigned short callgateaddr[3];
+ struct gdt {
+ unsigned short offslo;
+ unsigned short selector;
+ unsigned short flags;
+ unsigned short offshi;
+ } *gdt, *mygdt;
+ unsigned int i, maxgdt;
+ int ret;
+
+ asm("sgdt\t%0" : "=m" (gdtbase));
+ gdt = (struct gdt *)((gdtbase[2] << 16) | gdtbase[1]);
+ maxgdt = gdtbase[0]/8; /* gdt limit */
+ for (i = 1; i < maxgdt; i++) {
+ if (!gdt[i].flags && !gdt[i].selector && !gdt[i].offslo && !gdt[i].offshi)
+ break;
+ }
+ if (i >= maxgdt) {
+ lprintf(3, "Cannot find free GDT entry\n");
+ return -1;
+ }
+ mygdt = &gdt[i];
+ mygdt->flags = (1 << 15) | /* present */
+ (0x0c00) | /* type: call gate */
+ (3 << 13) | /* DPL */
+ 0; /* dword count */
+ mygdt->selector = 0x28;
+ mygdt->offslo = ((unsigned long)routine);
+ mygdt->offshi = ((unsigned long)routine) >> 16;
+ callgateaddr[0] = callgateaddr[1] = 0;
+ callgateaddr[2] = (i << 3) | 3;
+ asm("lcall\t%1" : "=a" (ret) : "m" (callgateaddr[0]), "d" (param1), "0" (param2) : "memory");
+ memset(mygdt, 0, sizeof(struct gdt));
+ return ret;
+}
+
+unsigned char ring0_inb(unsigned int port)
+{
+ return call_ring0(do_ring0_inb, port, 0);
+}
+
+void ring0_outb(unsigned char val, unsigned int port)
+{
+ call_ring0(do_ring0_outb, port, val);
+}
+
+void ring0_outsb(unsigned int port, const unsigned char *bp, unsigned int count)
+{
+ while (count > 0) {
+ ring0_outb(*bp++, port);
+ count--;
+ }
+}
+
+void ring0_insb(unsigned int port, unsigned char *bp, unsigned int count)
+{
+ while (count > 0) {
+ *bp++ = ring0_inb(port);
+ count--;
+ }
+}
+
+/* ---------------------------------------------------------------------- */
+
+extern inline void setecr(unsigned char ecr)
+{
+ if (pp_w9xring0_flags & FLAGS_PCECR)
+ ring0_outb(ecr, pp_w9xring0_iobase + LPTREG_ECONTROL);
+}
+
+int pp_w9xring0_epp_clear_timeout(void)
+{
+ unsigned char r;
+
+ if (!(ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT))
+ return 1;
+ /* To clear timeout some chips require double read */
+ ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS);
+ r = ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS);
+ ring0_outb(r | 0x01, pp_w9xring0_iobase + LPTREG_STATUS); /* Some reset by writing 1 */
+ ring0_outb(r & 0xfe, pp_w9xring0_iobase + LPTREG_STATUS); /* Others by writing 0 */
+ r = ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS);
+ return !(r & 0x01);
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned char parport_w9xring0_read_data(void)
+{
+ return ring0_inb(pp_w9xring0_iobase + LPTREG_DATA);
+}
+
+void parport_w9xring0_write_data(unsigned char d)
+{
+ ring0_outb(d, pp_w9xring0_iobase + LPTREG_DATA);
+}
+
+unsigned char parport_w9xring0_read_status(void)
+{
+ return ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS);
+}
+
+
+unsigned char parport_w9xring0_read_control(void)
+{
+ return ring0_inb(pp_w9xring0_iobase + LPTREG_CONTROL);
+}
+
+void parport_w9xring0_write_control(unsigned char d)
+{
+ ring0_outb(d, pp_w9xring0_iobase + LPTREG_CONTROL);
+}
+
+void parport_w9xring0_frob_control(unsigned char mask, unsigned char val)
+{
+ unsigned char d = ring0_inb(pp_w9xring0_iobase + LPTREG_CONTROL);
+ d = (d & (~mask)) ^ val;
+ ring0_outb(d, pp_w9xring0_iobase + LPTREG_CONTROL);
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_w9xring0_epp_write_data(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+
+ setecr(0x90); /* EPP mode */
+ for (; sz > 0; sz--, bp++) {
+ ring0_outb(*bp, pp_w9xring0_iobase + LPTREG_EPPDATA);
+ if (ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+ pp_w9xring0_epp_clear_timeout();
+ goto rt;
+ }
+ ret++;
+ }
+ rt:
+ setecr(0x30); /* PS/2 mode */
+ return ret;
+}
+
+unsigned parport_w9xring0_epp_read_data(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+
+ setecr(0x90); /* EPP mode */
+ for (; sz > 0; sz--, bp++) {
+ *bp = ring0_inb(pp_w9xring0_iobase + LPTREG_EPPDATA);
+ if (ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+ pp_w9xring0_epp_clear_timeout();
+ goto rt;
+ }
+ ret++;
+ }
+ rt:
+ setecr(0x30); /* PS/2 mode */
+ return ret;
+}
+
+unsigned parport_w9xring0_epp_write_addr(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+
+ setecr(0x90); /* EPP mode */
+ for (; sz > 0; sz--, bp++) {
+ ring0_outb(*bp, pp_w9xring0_iobase + LPTREG_EPPADDR);
+ if (ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+ pp_w9xring0_epp_clear_timeout();
+ goto rt;
+ }
+ ret++;
+ }
+ rt:
+ setecr(0x30); /* PS/2 mode */
+ return ret;
+}
+
+unsigned parport_w9xring0_epp_read_addr(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+
+ setecr(0x90); /* EPP mode */
+ for (; sz > 0; sz--, bp++) {
+ *bp = ring0_inb(pp_w9xring0_iobase + LPTREG_EPPADDR);
+ if (ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+ pp_w9xring0_epp_clear_timeout();
+ goto rt;
+ }
+ ret++;
+ }
+ rt:
+ setecr(0x30); /* PS/2 mode */
+ return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_w9xring0_emul_epp_write_data(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo;
+
+ ring0_outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE, pp_w9xring0_iobase + LPTREG_CONTROL);
+ for (; sz > 0; sz--, bp++) {
+ ring0_outb(*bp, pp_w9xring0_iobase + LPTREG_DATA);
+ for (tmo = 0; ; tmo++) {
+ if (ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & LPTSTAT_WAIT)
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ ring0_outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE | LPTCTRL_DATASTB, pp_w9xring0_iobase + LPTREG_CONTROL);
+ for (tmo = 0; ; tmo++) {
+ if (!(ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & LPTSTAT_WAIT))
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ ring0_outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE, pp_w9xring0_iobase + LPTREG_CONTROL);
+ ret++;
+ }
+ return ret;
+}
+
+unsigned parport_w9xring0_emul_epp_read_data(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo;
+
+ ring0_outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION, pp_w9xring0_iobase + LPTREG_CONTROL);
+ for (; sz > 0; sz--, bp++) {
+ for (tmo = 0; ; tmo++) {
+ if (ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & LPTSTAT_WAIT)
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ ring0_outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION | LPTCTRL_DATASTB, pp_w9xring0_iobase + LPTREG_CONTROL);
+ for (tmo = 0; ; tmo++) {
+ if (!(ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & LPTSTAT_WAIT))
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ *bp = ring0_inb(pp_w9xring0_iobase + LPTREG_DATA);
+ ring0_outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION, pp_w9xring0_iobase + LPTREG_CONTROL);
+ ret++;
+ }
+ return ret;
+}
+
+unsigned parport_w9xring0_emul_epp_write_addr(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo;
+
+ ring0_outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE, pp_w9xring0_iobase + LPTREG_CONTROL);
+ for (; sz > 0; sz--, bp++) {
+ ring0_outb(*bp, pp_w9xring0_iobase + LPTREG_DATA);
+ for (tmo = 0; ; tmo++) {
+ if (ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & LPTSTAT_WAIT)
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ ring0_outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE | LPTCTRL_ADDRSTB, pp_w9xring0_iobase + LPTREG_CONTROL);
+ for (tmo = 0; ; tmo++) {
+ if (!(ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & LPTSTAT_WAIT))
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ ring0_outb(LPTCTRL_PROGRAM | LPTCTRL_WRITE, pp_w9xring0_iobase + LPTREG_CONTROL);
+ ret++;
+ }
+ return ret;
+}
+
+unsigned parport_w9xring0_emul_epp_read_addr(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo;
+
+ ring0_outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION, pp_w9xring0_iobase + LPTREG_CONTROL);
+ for (; sz > 0; sz--, bp++) {
+ for (tmo = 0; ; tmo++) {
+ if (ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & LPTSTAT_WAIT)
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ ring0_outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION | LPTCTRL_ADDRSTB, pp_w9xring0_iobase + LPTREG_CONTROL);
+ for (tmo = 0; ; tmo++) {
+ if (!(ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & LPTSTAT_WAIT))
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ *bp = ring0_inb(pp_w9xring0_iobase + LPTREG_DATA);
+ ring0_outb(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION, pp_w9xring0_iobase + LPTREG_CONTROL);
+ ret++;
+ }
+ return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static int ecp_forward(void)
+{
+ unsigned tmo = 0x10000;
+
+ if (ring0_inb(pp_w9xring0_iobase + LPTREG_DSR) & 0x20)
+ return 0;
+ /* Event 47: Set nInit high */
+ ring0_outb(0x26, pp_w9xring0_iobase + LPTREG_DCR);
+ /* Event 49: PError goes high */
+ while (!(ring0_inb(pp_w9xring0_iobase + LPTREG_DSR) & 0x20)) {
+ if (!(--tmo))
+ return -1;
+ }
+ /* start driving the bus */
+ ring0_outb(0x04, pp_w9xring0_iobase + LPTREG_DCR);
+ return 0;
+}
+
+static int ecp_reverse(void)
+{
+ unsigned tmo = 0x10000;
+
+ if (!(ring0_inb(pp_w9xring0_iobase + LPTREG_DSR) & 0x20))
+ return 0;
+ ring0_outb(0x24, pp_w9xring0_iobase + LPTREG_DCR);
+ /* Event 39: Set nInit low to initiate bus reversal */
+ ring0_outb(0x20, pp_w9xring0_iobase + LPTREG_DCR);
+ while (ring0_inb(pp_w9xring0_iobase + LPTREG_DSR) & 0x20) {
+ if (!(--tmo))
+ return -1;
+ }
+ return 0;
+}
+
+static unsigned emptyfifo(unsigned cnt)
+{
+ unsigned fcnt = 0;
+
+ ring0_outb(0xd0, pp_w9xring0_iobase + LPTREG_ECONTROL); /* FIFOtest mode */
+ while ((ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & 0x01) && fcnt < 32 && fcnt < cnt) {
+ ring0_inb(pp_w9xring0_iobase + LPTREG_TFIFO);
+ fcnt++;
+ }
+ printf("emptyfifo: FIFO contained %d bytes\n", fcnt);
+ ring0_outb(0x30, pp_w9xring0_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+ return cnt - fcnt;
+}
+
+unsigned parport_w9xring0_ecp_write_data(const void *buf, unsigned sz)
+{
+ const unsigned char *bp = (const unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo = 0x10000;
+ unsigned char stat;
+
+ if (ecp_forward())
+ return 0;
+ ring0_outb(0x70, pp_w9xring0_iobase + LPTREG_ECONTROL); /* ECP mode */
+ while (sz > 0) {
+ while ((stat = ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL)) & 0x02) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ if (stat & 0x01 && sz >= 8) {
+ ring0_outsb(pp_w9xring0_iobase + LPTREG_DFIFO, bp, 8);
+ bp += 8;
+ sz -= 8;
+ ret += 8;
+ } else {
+ ring0_outb(*bp++, pp_w9xring0_iobase + LPTREG_DFIFO);
+ sz--;
+ ret++;
+ }
+ tmo = 0x10000;
+ }
+ while (!(ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & 0x01) || !(ring0_inb(pp_w9xring0_iobase + LPTREG_DSR) & 0x80)) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ ring0_outb(0x30, pp_w9xring0_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+ return ret;
+}
+
+unsigned parport_w9xring0_ecp_read_data(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo = 0x10000;
+ unsigned char stat;
+
+ if (ecp_reverse())
+ return 0;
+ ring0_outb(0x70, pp_w9xring0_iobase + LPTREG_ECONTROL); /* ECP mode */
+ while (sz > 0) {
+ while ((stat = ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL)) & 0x01)
+ if (!(--tmo)) {
+ ring0_outb(0xd0, pp_w9xring0_iobase + LPTREG_ECONTROL); /* FIFOTEST mode */
+ while (!(ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & 0x01) && sz > 0) {
+ *bp++ = ring0_inb(pp_w9xring0_iobase + LPTREG_TFIFO);
+ sz--;
+ ret++;
+ }
+ ring0_outb(0x30, pp_w9xring0_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+ return ret;
+ }
+ if (stat & 0x02 && sz >= 8) {
+ ring0_insb(pp_w9xring0_iobase + LPTREG_DFIFO, bp, 8);
+ bp += 8;
+ sz -= 8;
+ ret += 8;
+ } else {
+ *bp++ = ring0_inb(pp_w9xring0_iobase + LPTREG_DFIFO);
+ sz--;
+ ret++;
+ }
+ tmo = 0x10000;
+ }
+ ring0_outb(0x30, pp_w9xring0_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+ return ret;
+}
+
+unsigned parport_w9xring0_ecp_write_addr(const void *buf, unsigned sz)
+{
+ const unsigned char *bp = (const unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo = 0x10000;
+ unsigned char stat;
+
+ if (ecp_forward())
+ return 0;
+ ring0_outb(0x70, pp_w9xring0_iobase + LPTREG_ECONTROL); /* ECP mode */
+ while (sz > 0) {
+ while ((stat = ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL)) & 0x02) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ if (stat & 0x01 && sz >= 8) {
+ ring0_outsb(pp_w9xring0_iobase + LPTREG_AFIFO, bp, 8);
+ bp += 8;
+ sz -= 8;
+ ret += 8;
+ } else {
+ ring0_outb(*bp++, pp_w9xring0_iobase + LPTREG_AFIFO);
+ sz--;
+ ret++;
+ }
+ tmo = 0x10000;
+ }
+ while (!(ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & 0x01) || !(ring0_inb(pp_w9xring0_iobase + LPTREG_DSR) & 0x80)) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ ring0_outb(0x30, pp_w9xring0_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+ return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_w9xring0_emul_ecp_write_data(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret;
+ unsigned char ctl;
+ unsigned tmo;
+
+ if (ecp_forward())
+ return 0;
+ ctl = ring0_inb(pp_w9xring0_iobase + LPTREG_CONTROL) & ~PARPORT_CONTROL_AUTOFD;
+ /* HostAck high (data, not command) */
+ ring0_outb(ctl, pp_w9xring0_iobase + LPTREG_CONTROL);
+ for (ret = 0; ret < sz; ret++, bp++) {
+ ring0_outb(*bp, pp_w9xring0_iobase + LPTREG_DATA);
+ ring0_outb(ctl | PARPORT_CONTROL_STROBE, pp_w9xring0_iobase + LPTREG_CONTROL);
+ for (tmo = 0; ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & PARPORT_STATUS_BUSY; tmo++)
+ if (tmo > 0x1000)
+ return ret;
+ ring0_outb(ctl, pp_w9xring0_iobase + LPTREG_CONTROL);
+ for (tmo = 0; !(ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & PARPORT_STATUS_BUSY); tmo++)
+ if (tmo > 0x1000)
+ return ret;
+ }
+ return ret;
+}
+
+unsigned parport_w9xring0_emul_ecp_write_addr(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret;
+ unsigned char ctl;
+ unsigned tmo;
+
+ if (ecp_forward())
+ return 0;
+ ctl = ring0_inb(pp_w9xring0_iobase + LPTREG_CONTROL) | PARPORT_CONTROL_AUTOFD;
+ /* HostAck low (command, not data) */
+ ring0_outb(ctl, pp_w9xring0_iobase + LPTREG_CONTROL);
+ for (ret = 0; ret < sz; ret++, bp++) {
+ ring0_outb(*bp, pp_w9xring0_iobase + LPTREG_DATA);
+ ring0_outb(ctl | PARPORT_CONTROL_STROBE, pp_w9xring0_iobase + LPTREG_CONTROL);
+ for (tmo = 0; ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & PARPORT_STATUS_BUSY; tmo++)
+ if (tmo > 0x1000)
+ return ret;
+ ring0_outb(ctl, pp_w9xring0_iobase + LPTREG_CONTROL);
+ for (tmo = 0; !(ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & PARPORT_STATUS_BUSY); tmo++)
+ if (tmo > 0x1000)
+ return ret;
+ }
+ return ret;
+}
+
+unsigned parport_w9xring0_emul_ecp_read_data(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned char ctl, stat;
+ int command;
+ unsigned tmo;
+
+ if (ecp_reverse())
+ return 0;
+ ctl = ring0_inb(pp_w9xring0_iobase + LPTREG_CONTROL);
+ /* Set HostAck low to start accepting data. */
+ ring0_outb(ctl | PARPORT_CONTROL_AUTOFD, pp_w9xring0_iobase + LPTREG_CONTROL);
+ while (ret < sz) {
+ /* Event 43: Peripheral sets nAck low. It can take as
+ long as it wants. */
+ tmo = 0;
+ do {
+ stat = ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS);
+ if ((++tmo) > 0x10000)
+ goto out;
+ } while (stat & PARPORT_STATUS_ACK);
+ /* Is this a command? */
+ command = stat & PARPORT_STATUS_BUSY;
+ if (command) {
+ //lprintf(3, "ECP: warning: emulation does not support RLE\n");
+ goto out;
+ }
+ /* Read the data. */
+ *bp = ring0_inb(pp_w9xring0_iobase + LPTREG_DATA);
+ /* Event 44: Set HostAck high, acknowledging handshake. */
+ ring0_outb(ctl & ~PARPORT_CONTROL_AUTOFD, pp_w9xring0_iobase + LPTREG_CONTROL);
+ /* Event 45: The peripheral has 35ms to set nAck high. */
+ tmo = 0;
+ do {
+ stat = ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS);
+ if ((++tmo) > 0x10000)
+ goto out;
+ } while (!(stat & PARPORT_STATUS_ACK));
+ /* Event 46: Set HostAck low and accept the data. */
+ ring0_outb(ctl | PARPORT_CONTROL_AUTOFD, pp_w9xring0_iobase + LPTREG_CONTROL);
+ /* Normal data byte. */
+ bp++;
+ ret++;
+ }
+
+ out:
+ return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+#if 1
+unsigned parport_w9xring0_fpgaconfig_write(const void *buf, unsigned sz)
+{
+ const unsigned char *bp = buf;
+ unsigned u;
+
+ for (u = 0; u < sz; u++, bp++)
+ ring0_outb(*bp, pp_w9xring0_iobase + LPTREG_DATA);
+ return sz;
+}
+#else
+
+unsigned parport_w9xring0_fpgaconfig_write(const void *buf, unsigned sz)
+{
+ const unsigned char *bp = buf;
+ unsigned ret = 0;
+ unsigned tmo = 0x10000;
+ unsigned char stat;
+
+ if (pp_w9xring0_modes & PARPORT_MODE_PCECR) {
+ ring0_outb(0x50, pp_w9xring0_iobase + LPTREG_ECONTROL); /* COMPAT FIFO mode */
+ while (sz > 0) {
+ while ((stat = ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL)) & 0x02) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ if (stat & 0x01 && sz >= 8) {
+ ring0_outsb(pp_w9xring0_iobase + LPTREG_DFIFO, bp, 8);
+ bp += 8;
+ sz -= 8;
+ ret += 8;
+ } else {
+ ring0_outb(*bp++, pp_w9xring0_iobase + LPTREG_DFIFO);
+ sz--;
+ ret++;
+ }
+ tmo = 0x10000;
+ }
+ while (!(ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & 0x01) || !(ring0_inb(pp_w9xring0_iobase + LPTREG_DSR) & 0x80)) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ ring0_outb(0x30, pp_w9xring0_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+ return ret;
+ }
+ for (ret = 0; ret < sz; ret++, bp++)
+ ring0_outb(*bp, pp_w9xring0_iobase + LPTREG_DATA);
+ return sz;
+}
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+const struct parport_ops parport_w9xring0_ops = {
+ parport_w9xring0_read_data,
+ parport_w9xring0_write_data,
+ parport_w9xring0_read_status,
+ parport_w9xring0_read_control,
+ parport_w9xring0_write_control,
+ parport_w9xring0_frob_control,
+ parport_w9xring0_epp_write_data,
+ parport_w9xring0_epp_read_data,
+ parport_w9xring0_epp_write_addr,
+ parport_w9xring0_epp_read_addr,
+ parport_w9xring0_ecp_write_data,
+ parport_w9xring0_ecp_read_data,
+ parport_w9xring0_ecp_write_addr,
+ parport_w9xring0_fpgaconfig_write
+};
+
+const struct parport_ops parport_w9xring0_emul_ops = {
+ parport_w9xring0_read_data,
+ parport_w9xring0_write_data,
+ parport_w9xring0_read_status,
+ parport_w9xring0_read_control,
+ parport_w9xring0_write_control,
+ parport_w9xring0_frob_control,
+ parport_w9xring0_emul_epp_write_data,
+ parport_w9xring0_emul_epp_read_data,
+ parport_w9xring0_emul_epp_write_addr,
+ parport_w9xring0_emul_epp_read_addr,
+ parport_w9xring0_emul_ecp_write_data,
+ parport_w9xring0_emul_ecp_read_data,
+ parport_w9xring0_emul_ecp_write_addr,
+ parport_w9xring0_fpgaconfig_write
+};
+
+/* ---------------------------------------------------------------------- */
diff --git a/main/ppw9xring0init.c b/main/ppw9xring0init.c
new file mode 100644
index 0000000..71c88e3
--- /dev/null
+++ b/main/ppw9xring0init.c
@@ -0,0 +1,681 @@
+/*****************************************************************************/
+
+/*
+ * ppw9xring0init.c -- Parport direct access under Win9x using Ring0 hack (init routines).
+ *
+ * Copyright (C) 1998-2000 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#if defined(HAVE_SYS_IO_H)
+#include <sys/io.h>
+#elif defined(HAVE_ASM_IO_H)
+#include <asm/io.h>
+#endif
+
+#include <errno.h>
+#include <string.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+#ifndef HAVE_IOPL
+#ifdef HAVE_WINDOWS_H
+#include <windows.h>
+extern inline int iopl(unsigned int level)
+{
+ OSVERSIONINFO info;
+
+ info.dwOSVersionInfoSize = sizeof(info);
+ if (GetVersionEx(&info) &&
+ (info.dwPlatformId == VER_PLATFORM_WIN32s ||
+ info.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS))
+ return 0;
+ return 1;
+}
+#else
+extern inline int iopl(unsigned int level)
+{
+ return 0;
+}
+#endif
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+/* LPT registers */
+/* ECP specific registers */
+#define LPTREG_ECONTROL 0x402
+#define LPTREG_CONFIGB 0x401
+#define LPTREG_CONFIGA 0x400
+#define LPTREG_TFIFO 0x400
+#define LPTREG_DFIFO 0x400
+#define LPTREG_AFIFO 0x000
+#define LPTREG_DSR 0x001
+#define LPTREG_DCR 0x002
+/* EPP specific registers */
+#define LPTREG_EPPDATA 0x004
+#define LPTREG_EPPADDR 0x003
+/* standard registers */
+#define LPTREG_CONTROL 0x002
+#define LPTREG_STATUS 0x001
+#define LPTREG_DATA 0x000
+
+/* ECP config A */
+#define LPTCFGA_INTRISALEVEL 0x80
+#define LPTCFGA_IMPIDMASK 0x70
+#define LPTCFGA_IMPID16BIT 0x00
+#define LPTCFGA_IMPID8BIT 0x10
+#define LPTCFGA_IMPID32BIT 0x20
+#define LPTCFGA_NOPIPELINE 0x04
+#define LPTCFGA_PWORDCOUNT 0x03
+
+/* ECP config B */
+#define LPTCFGB_COMPRESS 0x80
+#define LPTCFGB_INTRVALUE 0x40
+#define LPTCFGB_IRQMASK 0x38
+#define LPTCFGB_IRQ5 0x38
+#define LPTCFGB_IRQ15 0x30
+#define LPTCFGB_IRQ14 0x28
+#define LPTCFGB_IRQ11 0x20
+#define LPTCFGB_IRQ10 0x18
+#define LPTCFGB_IRQ9 0x10
+#define LPTCFGB_IRQ7 0x08
+#define LPTCFGB_IRQJUMPER 0x00
+#define LPTCFGB_DMAMASK 0x07
+#define LPTCFGB_DMA7 0x07
+#define LPTCFGB_DMA6 0x06
+#define LPTCFGB_DMA5 0x05
+#define LPTCFGB_DMAJUMPER16 0x04
+#define LPTCFGB_DMA3 0x03
+#define LPTCFGB_DMA2 0x02
+#define LPTCFGB_DMA1 0x01
+#define LPTCFGB_DMAJUMPER8 0x00
+
+/* ECP ECR */
+#define LPTECR_MODEMASK 0xe0
+#define LPTECR_MODESPP 0x00
+#define LPTECR_MODEPS2 0x20
+#define LPTECR_MODESPPFIFO 0x40
+#define LPTECR_MODEECP 0x60
+#define LPTECR_MODEECPEPP 0x80
+#define LPTECR_MODETEST 0xc0
+#define LPTECR_MODECFG 0xe0
+#define LPTECR_NERRINTRDIS 0x10
+#define LPTECR_DMAEN 0x08
+#define LPTECR_SERVICEINTR 0x04
+#define LPTECR_FIFOFULL 0x02
+#define LPTECR_FIFOEMPTY 0x01
+
+/* ---------------------------------------------------------------------- */
+
+extern unsigned int pp_w9xring0_iobase;
+extern unsigned int pp_w9xring0_flags;
+extern const struct parport_ops parport_w9xring0_ops, parport_w9xring0_emul_ops;
+
+extern unsigned char ring0_inb(unsigned int port);
+extern void ring0_outb(unsigned char val, unsigned int port);
+extern void ring0_outsb(unsigned int port, const unsigned char *bp, unsigned int count);
+extern void ring0_insb(unsigned int port, unsigned char *bp, unsigned int count);
+extern int pp_w9xring0_epp_clear_timeout(void);
+
+#define FLAGS_PCSPP (1<<0)
+#define FLAGS_PCPS2 (1<<1)
+#define FLAGS_PCEPP (1<<2)
+#define FLAGS_PCECR (1<<3) /* ECR Register Exists */
+#define FLAGS_PCECP (1<<4)
+#define FLAGS_PCECPEPP (1<<5)
+#define FLAGS_PCECPPS2 (1<<6)
+
+/* ---------------------------------------------------------------------- */
+#if 0
+#ifndef EPPEMUL
+
+static int detect_epp(void)
+{
+ /* pulse PROGRAM low, reset FPGA just to be safe */
+ ring0_outb(LPTCTRL_ADDRSTB, iobase+LPTREG_CONTROL);
+ usleep(10);
+ ring0_outb(LPTCTRL_PROGRAM, iobase+LPTREG_CONTROL);
+ /* start of ordinary test */
+ if (!epp_clear_timeout())
+ return -1;
+ ring0_outb(ring0_inb(iobase + LPTREG_CONTROL) | 0x20, iobase + LPTREG_CONTROL);
+ ring0_outb(ring0_inb(iobase + LPTREG_CONTROL) | 0x10, iobase + LPTREG_CONTROL);
+ epp_clear_timeout();
+ ring0_inb(iobase + LPTREG_EPPDATA);
+ /* udelay(30); */
+ if (ring0_inb(iobase + LPTREG_STATUS) & LPTSTAT_EPPTIMEOUT) {
+ epp_clear_timeout();
+ return 0;
+ }
+ /*return -1;*/
+ lprintf(3, "warning: no EPP timeout\n");
+ return 0;
+}
+
+#endif /* !EPPEMUL */
+
+static int detect_ecr(void)
+{
+ unsigned char r, oc, oec;
+
+ oec = ring0_inb(iobase + LPTREG_ECONTROL);
+ oc = ring0_inb(iobase + LPTREG_CONTROL);
+ if ((oc & 3) == (oec & 3)) {
+ ring0_outb(oc ^ 2, iobase + LPTREG_CONTROL);
+ r = ring0_inb(iobase + LPTREG_CONTROL);
+ if ((ring0_inb(iobase + LPTREG_ECONTROL) & 2) == (r & 2)) {
+ ring0_outb(oc, iobase + LPTREG_CONTROL);
+ return -1;
+ }
+ }
+ if ((oec & 3) != 1)
+ return -1;
+ ring0_outb(0x34, iobase + LPTREG_ECONTROL);
+ r = ring0_inb(iobase + LPTREG_ECONTROL);
+ ring0_outb(oc, iobase + LPTREG_CONTROL);
+ ring0_outb(oec, iobase + LPTREG_ECONTROL);
+ return -(r != 0x35);
+}
+
+int detect_port(void)
+{
+ ring0_outb(LPTCTRL_ADDRSTB, iobase+LPTREG_CONTROL);
+ pp_w9xring0_epp_clear_timeout(); /* prevent lockup of some SMSC IC's */
+ /* this routine is mostly copied from Linux Kernel parport */
+ ring0_outb(0xc, iobase+LPTREG_ECONTROL);
+ ring0_outb(0xc, iobase+LPTREG_CONTROL);
+ ring0_outb(0xaa, iobase+LPTREG_DATA);
+ if (ring0_inb(iobase+LPTREG_DATA) != 0xaa)
+ goto fail_spp;
+ ring0_outb(0x55, iobase+LPTREG_DATA);
+ if (ring0_inb(iobase+LPTREG_DATA) != 0x55)
+ goto fail_spp;
+#ifdef EPPEMUL
+ /* tentatively enable PS/2 mode if ECP port */
+ ring0_outb(0x20, iobase + LPTREG_ECONTROL);
+ ring0_outb(LPTCTRL_PROGRAM, iobase+LPTREG_CONTROL);
+ if ((ring0_inb(iobase+LPTREG_CONTROL) & 0x3f) != LPTCTRL_PROGRAM)
+ goto fail_ps2;
+ ring0_outb(LPTCTRL_PROGRAM | LPTCTRL_W9XRING0ION, iobase+LPTREG_CONTROL);
+ if ((ring0_inb(iobase+LPTREG_CONTROL) & 0x3f) != (LPTCTRL_PROGRAM | LPTCTRL_W9XRING0ION))
+ goto fail_ps2;
+ return 0;
+
+ fail_ps2:
+ lprintf(3, "parport (PS/2 bidir) test failed\n");
+ return -1;
+
+#else /* !EPPEMUL */
+ if (!detect_ecr()) {
+ ring0_outb(0x80, iobase + LPTREG_ECONTROL);
+ lprintf(3, "parport SMSC style ECP+EPP detected\n");
+ return 0;
+ }
+ if (!detect_epp())
+ return 0;
+ /* goto fail_epp; */
+ fail_epp:
+ lprintf(3, "parport (EPP) test failed\n");
+ return -1;
+#endif /* !EPPEMUL */
+
+ fail_spp:
+ lprintf(3, "parport (SPP) test failed\n");
+ return -1;
+}
+
+/* ---------------------------------------------------------------------- */
+/*
+ * ECP routines
+ */
+
+static void ecp_port_cap(void)
+{
+ static const char *pwordstr[8] = { "2 bytes", "1 byte", "4 bytes", "3?", "4?",
+ "5?", "6?", "7?" };
+ static const char *irqstr[8] = { "jumpered", "7", "9", "10", "11", "14", "15", "5" };
+ static const char *dmastr[8] = { "jumpered 8bit", "1", "2", "3", "jumpered 16bit", "5", "6", "7" };
+ unsigned char cnfga, cnfgb;
+ unsigned int cnt, fwcnt, wthr = ~0, frcnt, rthr = ~0;
+
+ ring0_outb(0x30, iobase + LPTREG_ECONTROL); /* PS/2 mode */
+ ring0_outb(0xf0, iobase + LPTREG_ECONTROL); /* config mode */
+ cnfga = ring0_inb(iobase + LPTREG_CONFIGA);
+ cnfgb = ring0_inb(iobase + LPTREG_CONFIGB);
+ ring0_outb(cnfgb & 0x7f, iobase + LPTREG_CONFIGB); /* disable compression */
+ ring0_outb(0x30, iobase + LPTREG_ECONTROL); /* PS/2 mode */
+ ring0_outb(0x04, iobase + LPTREG_DCR); /* w9xring0ion=output */
+ ring0_outb(0xd0, iobase + LPTREG_ECONTROL); /* test mode */
+ for (cnt = 0; cnt < 1024 && !(ring0_inb(iobase + LPTREG_ECONTROL) & 0x02); cnt++)
+ ring0_outb(0, iobase + LPTREG_TFIFO);
+ ring0_outb(0xd0, iobase + LPTREG_ECONTROL); /* test mode, clear serviceintr */
+ for (fwcnt = 0; fwcnt < 1024 && !(ring0_inb(iobase + LPTREG_ECONTROL) & 0x01); fwcnt++) {
+ ring0_inb(iobase + LPTREG_TFIFO);
+ if (ring0_inb(iobase + LPTREG_ECONTROL) & 0x04) {
+ wthr = fwcnt;
+ ring0_outb(0xd0, iobase + LPTREG_ECONTROL); /* test mode, clear serviceintr */
+ }
+ }
+ ring0_outb(0x24, iobase + LPTREG_DCR); /* w9xring0ion=input */
+ ring0_outb(0xd0, iobase + LPTREG_ECONTROL); /* test mode */
+ for (cnt = 0; cnt < 1024 && !(ring0_inb(iobase + LPTREG_ECONTROL) & 0x02); cnt++)
+ ring0_outb(0, iobase + LPTREG_TFIFO);
+ ring0_outb(0xd0, iobase + LPTREG_ECONTROL); /* test mode, clear serviceintr */
+ for (frcnt = 0; frcnt < 1024 && !(ring0_inb(iobase + LPTREG_ECONTROL) & 0x01); frcnt++) {
+ ring0_inb(iobase + LPTREG_TFIFO);
+ if (ring0_inb(iobase + LPTREG_ECONTROL) & 0x04) {
+ rthr = frcnt;
+ ring0_outb(0xd0, iobase + LPTREG_ECONTROL); /* test mode, clear serviceintr */
+ }
+ }
+ ring0_outb(0x30, iobase + LPTREG_ECONTROL); /* PS/2 mode */
+ ring0_outb(0x04, iobase + LPTREG_DCR); /* w9xring0ion=output */
+ lprintf(3, "ECP capabilities: %s int, PWord %s, %sextra tx pipe, IRQ %s, DMA %s\n"
+ "Tx: FIFO size %d threshold %d Rx: FIFO size %d threshold %d\n",
+ (cnfga & 0x80) ? "level" : "edge", pwordstr[(cnfga >> 4) & 7],
+ (cnfga & 0x04) ? "no" : "", irqstr[(cnfgb >> 3) & 7], dmastr[cnfgb & 7],
+ fwcnt, wthr, frcnt, rthr);
+}
+
+int detect_port_ecp(void)
+{
+ epp_clear_timeout(); /* prevent lockup of some SMSC IC's */
+ /* this routine is mostly copied from Linux Kernel parport */
+ ring0_outb(0xc, iobase+LPTREG_ECONTROL);
+ ring0_outb(0xc, iobase+LPTREG_CONTROL);
+ ring0_outb(0xaa, iobase+LPTREG_DATA);
+ if (ring0_inb(iobase+LPTREG_DATA) != 0xaa)
+ goto fail_spp;
+ ring0_outb(0x55, iobase+LPTREG_DATA);
+ if (ring0_inb(iobase+LPTREG_DATA) != 0x55)
+ goto fail_spp;
+ /* check for ECP ECR mode */
+ if (detect_ecr())
+ goto fail_ecp;
+ ecp_port_cap();
+ return 0;
+
+ fail_ecp:
+ lprintf(0, "parport (ECP) test failed\n");
+ return -1;
+
+ fail_spp:
+ lprintf(0, "parport (SPP) test failed\n");
+ return -1;
+}
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+static int parport_spp(void)
+{
+ pp_w9xring0_epp_clear_timeout(); /* prevent lockup of some SMSC IC's */
+ /* this routine is mostly copied from Linux Kernel parport */
+ ring0_outb(0xc, pp_w9xring0_iobase+LPTREG_ECONTROL);
+ ring0_outb(0xc, pp_w9xring0_iobase+LPTREG_CONTROL);
+ ring0_outb(0xaa, pp_w9xring0_iobase+LPTREG_DATA);
+ if (ring0_inb(pp_w9xring0_iobase+LPTREG_DATA) != 0xaa)
+ return 0;
+ ring0_outb(0x55, pp_w9xring0_iobase+LPTREG_DATA);
+ if (ring0_inb(pp_w9xring0_iobase+LPTREG_DATA) != 0x55)
+ return 0;
+ return PARPORT_MODE_PCSPP;
+}
+
+/* Check for ECP
+ *
+ * Old style XT ports alias io ports every 0x400, hence accessing ECR
+ * on these cards actually accesses the CTR.
+ *
+ * Modern cards don't do this but reading from ECR will return 0xff
+ * regardless of what is written here if the card does NOT support
+ * ECP.
+ *
+ * We will write 0x2c to ECR and 0xcc to CTR since both of these
+ * values are "safe" on the CTR since bits 6-7 of CTR are unused.
+ */
+static int parport_ecr(void)
+{
+ unsigned char r = 0xc;
+
+ ring0_outb(r, pp_w9xring0_iobase + LPTREG_CONTROL);
+ if ((ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & 0x3) == (r & 0x3)) {
+ ring0_outb(r ^ 0x2, pp_w9xring0_iobase + LPTREG_CONTROL); /* Toggle bit 1 */
+ r = ring0_inb(pp_w9xring0_iobase + LPTREG_CONTROL);
+ if ((ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & 0x2) == (r & 0x2))
+ goto no_reg; /* Sure that no ECR register exists */
+ }
+
+ if ((ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & 0x3 ) != 0x1)
+ goto no_reg;
+
+ ring0_outb(0x34, pp_w9xring0_iobase + LPTREG_ECONTROL);
+ if (ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) != 0x35)
+ goto no_reg;
+
+ ring0_outb(0xc, pp_w9xring0_iobase + LPTREG_CONTROL);
+
+ /* Go to mode 000 */
+ ring0_outb(ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & ~0xe0, pp_w9xring0_iobase + LPTREG_ECONTROL);
+
+ return PARPORT_MODE_PCECR;
+
+ no_reg:
+ ring0_outb(0xc, pp_w9xring0_iobase + LPTREG_CONTROL);
+ return 0;
+}
+
+static int parport_ecp(void)
+{
+ int i;
+ int config;
+ int pword;
+ int fifo_depth, writeIntrThreshold, readIntrThreshold;
+
+ /* Find out FIFO depth */
+ ring0_outb(0x00, pp_w9xring0_iobase + LPTREG_ECONTROL); /* Reset FIFO */
+ ring0_outb(0xc0, pp_w9xring0_iobase + LPTREG_ECONTROL); /* TEST FIFO */
+ for (i=0; i < 1024 && !(ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & 0x02); i++)
+ ring0_outb(0xaa, pp_w9xring0_iobase + LPTREG_TFIFO);
+ /*
+ * Using LGS chipset it uses ECR register, but
+ * it doesn't support ECP or FIFO MODE
+ */
+ if (i == 1024) {
+ ring0_outb(0x00, pp_w9xring0_iobase + LPTREG_ECONTROL);
+ return 0;
+ }
+
+ fifo_depth = i;
+ lprintf(3, "ECP: FIFO depth is %d bytes\n", fifo_depth);
+
+ /* Find out writeIntrThreshold */
+ ring0_outb(ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) | (1<<2), pp_w9xring0_iobase + LPTREG_ECONTROL);
+ ring0_outb(ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & ~(1<<2) , pp_w9xring0_iobase + LPTREG_ECONTROL);
+ for (i = 1; i <= fifo_depth; i++) {
+ ring0_inb(pp_w9xring0_iobase + LPTREG_TFIFO);
+ usleep(50);
+ if (ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & (1<<2))
+ break;
+ }
+
+ if (i <= fifo_depth)
+ lprintf(3, "ECP: writeIntrThreshold is %d\n", i);
+ else
+ /* Number of bytes we know we can write if we get an
+ interrupt. */
+ i = 0;
+
+ writeIntrThreshold = i;
+
+ /* Find out readIntrThreshold */
+ ring0_outb((ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & ~0xe0) | 0x20, pp_w9xring0_iobase + LPTREG_ECONTROL); /* Reset FIFO, PS2 */
+ ring0_outb(ring0_inb(pp_w9xring0_iobase + LPTREG_CONTROL) | PARPORT_CONTROL_DIRECTION, pp_w9xring0_iobase + LPTREG_CONTROL);
+ ring0_outb((ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & ~0xe0) | 0xc0, pp_w9xring0_iobase + LPTREG_ECONTROL); /* Test FIFO */
+ ring0_outb(ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) | (1<<2), pp_w9xring0_iobase + LPTREG_ECONTROL);
+ ring0_outb(ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & ~(1<<2) , pp_w9xring0_iobase + LPTREG_ECONTROL);
+ for (i = 1; i <= fifo_depth; i++) {
+ ring0_outb(0xaa, pp_w9xring0_iobase + LPTREG_TFIFO);
+ if (ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & (1<<2))
+ break;
+ }
+
+ if (i <= fifo_depth)
+ lprintf(3, "ECP: readIntrThreshold is %d\n", i);
+ else
+ /* Number of bytes we can read if we get an interrupt. */
+ i = 0;
+
+ readIntrThreshold = i;
+
+ ring0_outb(0x00, pp_w9xring0_iobase + LPTREG_ECONTROL); /* Reset FIFO */
+ ring0_outb(0xf4, pp_w9xring0_iobase + LPTREG_ECONTROL); /* Configuration mode */
+ config = ring0_inb(pp_w9xring0_iobase + LPTREG_CONFIGA);
+ pword = (config >> 4) & 0x7;
+ switch (pword) {
+ case 0:
+ pword = 2;
+ lprintf(0, "ECP: Unsupported pword size! (2)\n");
+ break;
+ case 2:
+ pword = 4;
+ lprintf(0, "ECP: Unsupported pword size! (4)\n");
+ break;
+ default:
+ lprintf(0, "ECP: Unknown implementation ID (%d)\n", pword);
+ /* Assume 1 */
+ case 1:
+ pword = 1;
+ }
+ lprintf(3, "ECP: PWord is %d bits\n", 8 * pword);
+
+ config = ring0_inb(pp_w9xring0_iobase + LPTREG_CONFIGB);
+ lprintf(3, "ECP: Interrupts are ISA-%s\n", config & 0x80 ? "Level" : "Pulses");
+
+ if (!(config & 0x40))
+ lprintf(3, "ECP: IRQ conflict!\n");
+
+ /* Go back to mode 000 */
+ ring0_outb(ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL) & ~0xe0, pp_w9xring0_iobase + LPTREG_ECONTROL);
+
+ return PARPORT_MODE_PCECP;
+}
+
+/* EPP mode detection */
+
+static int parport_epp(void)
+{
+ /* If EPP timeout bit clear then EPP available */
+ if (!pp_w9xring0_epp_clear_timeout())
+ return 0; /* No way to clear timeout */
+
+ /*
+ * Theory:
+ * Write two values to the EPP address register and
+ * read them back. When the transfer times out, the state of
+ * the EPP register is undefined in some cases (EPP 1.9?) but
+ * in others (EPP 1.7, ECPEPP?) it is possible to read back
+ * its value.
+ */
+
+ pp_w9xring0_epp_clear_timeout();
+ usleep(30); /* Wait for possible EPP timeout */
+
+ ring0_outb(0x55, pp_w9xring0_iobase + LPTREG_EPPADDR);
+ pp_w9xring0_epp_clear_timeout();
+ usleep(30); /* Wait for possible EPP timeout */
+
+ if (ring0_inb(pp_w9xring0_iobase + LPTREG_EPPADDR) == 0x55) {
+ ring0_outb(0xaa, pp_w9xring0_iobase + LPTREG_EPPADDR);
+ pp_w9xring0_epp_clear_timeout();
+ usleep(30); /* Wait for possible EPP timeout */
+ if (ring0_inb(pp_w9xring0_iobase + LPTREG_EPPADDR) == 0xaa) {
+ pp_w9xring0_epp_clear_timeout();
+ return PARPORT_MODE_PCEPP;
+ }
+ }
+
+ /*
+ * Theory:
+ * Bit 0 of STR is the EPP timeout bit, this bit is 0
+ * when EPP is possible and is set high when an EPP timeout
+ * occurs (EPP uses the HALT line to stop the CPU while it does
+ * the byte transfer, an EPP timeout occurs if the attached
+ * device fails to respond after 10 micro seconds).
+ *
+ * This bit is cleared by either reading it (National Semi)
+ * or writing a 1 to the bit (SMC, UMC, Wring0_inbond), others ???
+ * This bit is always high in non EPP modes.
+ */
+
+ ring0_outb(ring0_inb(pp_w9xring0_iobase + LPTREG_CONTROL) | 0x20, pp_w9xring0_iobase + LPTREG_CONTROL);
+ ring0_outb(ring0_inb(pp_w9xring0_iobase + LPTREG_CONTROL) | 0x10, pp_w9xring0_iobase + LPTREG_CONTROL);
+ pp_w9xring0_epp_clear_timeout();
+
+ ring0_inb(pp_w9xring0_iobase + LPTREG_EPPDATA);
+ usleep(30); /* Wait for possible EPP timeout */
+
+ if (ring0_inb(pp_w9xring0_iobase + LPTREG_STATUS) & 0x01) {
+ pp_w9xring0_epp_clear_timeout();
+ return PARPORT_MODE_PCEPP;
+ }
+ return 0;
+}
+
+static int parport_ecpepp(void)
+{
+ int mode;
+ unsigned char oecr;
+
+ oecr = ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL);
+ /* Search for SMC style EPP+ECP mode */
+ ring0_outb(0x80, pp_w9xring0_iobase + LPTREG_ECONTROL);
+ mode = parport_epp();
+ ring0_outb(oecr, pp_w9xring0_iobase + LPTREG_ECONTROL);
+ return mode ? PARPORT_MODE_PCECPEPP : 0;
+}
+
+/* Detect PS/2 support.
+ *
+ * Bit 5 (0x20) sets the PS/2 data w9xring0ion; setting this high
+ * allows us to read data from the data lines. In theory we would get back
+ * 0xff but any peripheral attached to the port may drag some or all of the
+ * lines down to zero. So if we get back anything that isn't the contents
+ * of the data register we deem PS/2 support to be present.
+ *
+ * Some SPP ports have "half PS/2" ability - you can't turn off the line
+ * drivers, but an external peripheral with sufficiently beefy drivers of
+ * its own can overpower them and assert its own levels onto the bus, from
+ * where they can then be read back as normal. Ports with this property
+ * and the right type of device attached are likely to fail the SPP test,
+ * (as they will appear to have stuck bits) and so the fact that they might
+ * be misdetected here is rather academic.
+ */
+
+static int parport_ps2(void)
+{
+ int ok = 0;
+ unsigned char octr = ring0_inb(pp_w9xring0_iobase + LPTREG_CONTROL);
+
+ pp_w9xring0_epp_clear_timeout();
+
+ ring0_outb(octr | 0x20, pp_w9xring0_iobase + LPTREG_CONTROL); /* try to tri-state the buffer */
+
+ ring0_outb(0x55, pp_w9xring0_iobase + LPTREG_DATA);
+ if (ring0_inb(pp_w9xring0_iobase + LPTREG_DATA) != 0x55) ok++;
+ ring0_outb(0xaa, pp_w9xring0_iobase + LPTREG_DATA);
+ if (ring0_inb(pp_w9xring0_iobase + LPTREG_DATA) != 0xaa) ok++;
+
+ ring0_outb(octr, pp_w9xring0_iobase); /* cancel input mode */
+
+ return ok ? PARPORT_MODE_PCPS2 : 0;
+}
+
+static int parport_ecpps2(void)
+{
+ int mode;
+ unsigned char oecr;
+
+ oecr = ring0_inb(pp_w9xring0_iobase + LPTREG_ECONTROL);
+ ring0_outb(0x20, pp_w9xring0_iobase + LPTREG_ECONTROL);
+ mode = parport_ps2();
+ ring0_outb(oecr, pp_w9xring0_iobase + LPTREG_ECONTROL);
+ return mode ? PARPORT_MODE_PCECPPS2 : 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+int parport_init_w9xring0_flags(unsigned io, unsigned int flags)
+{
+ pp_w9xring0_flags = FLAGS_PCSPP;
+ pp_w9xring0_iobase = io;
+ if (iopl(3)) {
+ lprintf(0, "Cannot get direct IO port access (iopl: %s)\n", strerror(errno));
+ return -1;
+ }
+ if (!parport_spp()) {
+ lprintf(0, "No parport present at 0x%x\n", pp_w9xring0_iobase);
+ return -1;
+ }
+ if (parport_ecr()) {
+ pp_w9xring0_flags |= FLAGS_PCECR;
+ pp_w9xring0_flags |= parport_ecp();
+ pp_w9xring0_flags |= parport_ecpps2();
+ pp_w9xring0_flags |= parport_ecpepp();
+ if ((flags & PPFLAG_FORCEHWEPP) &&
+ (pp_w9xring0_flags & (FLAGS_PCPS2|FLAGS_PCECPPS2)) &&
+ !(pp_w9xring0_flags & (FLAGS_PCEPP|FLAGS_PCECPEPP)))
+ pp_w9xring0_flags |= FLAGS_PCECPEPP;
+ else
+ flags &= ~PPFLAG_FORCEHWEPP;
+ } else {
+ pp_w9xring0_flags |= parport_ps2();
+ pp_w9xring0_flags |= parport_epp();
+ if ((flags & PPFLAG_FORCEHWEPP) &&
+ (pp_w9xring0_flags & (FLAGS_PCPS2|FLAGS_PCECPPS2)) &&
+ !(pp_w9xring0_flags & (FLAGS_PCEPP|FLAGS_PCECPEPP)))
+ pp_w9xring0_flags |= FLAGS_PCEPP;
+ else
+ flags &= ~PPFLAG_FORCEHWEPP;
+ }
+ lprintf(0, "Parport 0x%x capabilities: SPP%s%s%s%s%s%s\n",
+ pp_w9xring0_iobase,
+ (pp_w9xring0_flags & FLAGS_PCPS2) ? ", PS2" : "",
+ (pp_w9xring0_flags & FLAGS_PCEPP) ? ((flags & PPFLAG_FORCEHWEPP) ? ", EPP (forced)" : ", EPP") : "",
+ (pp_w9xring0_flags & FLAGS_PCECR) ? ", ECR" : "",
+ (pp_w9xring0_flags & FLAGS_PCECP) ? ", ECP" : "",
+ (pp_w9xring0_flags & FLAGS_PCECPEPP) ? ((flags & PPFLAG_FORCEHWEPP) ? ", ECPEPP (forced)" : ", ECPEPP") : "",
+ (pp_w9xring0_flags & FLAGS_PCECPPS2) ? ", ECPPS2" : "");
+ if (!(pp_w9xring0_flags & (FLAGS_PCPS2 | FLAGS_PCECPPS2))) {
+ lprintf(0, "Parport 0x%x does not even support PS/2 mode, cannot use it\n",
+ pp_w9xring0_iobase);
+ return -1;
+ }
+ lprintf(0, "Parport 0x%x using direct Win9x Ring0 hardware access\n", pp_w9xring0_iobase);
+ if (pp_w9xring0_flags & FLAGS_PCECR)
+ ring0_outb(0x30, pp_w9xring0_iobase + LPTREG_ECONTROL); /* PS/2 mode */
+ parport_ops = parport_w9xring0_ops;
+ if ((flags & PPFLAG_SWEMULECP) || !(pp_w9xring0_flags & FLAGS_PCECP)) {
+ parport_ops.parport_ecp_write_data = parport_w9xring0_emul_ops.parport_ecp_write_data;
+ parport_ops.parport_ecp_read_data = parport_w9xring0_emul_ops.parport_ecp_read_data;
+ parport_ops.parport_ecp_write_addr = parport_w9xring0_emul_ops.parport_ecp_write_addr;
+ lprintf(0, "Parport 0x%x emulating ECP\n", pp_w9xring0_iobase);
+ }
+ if ((flags & PPFLAG_SWEMULEPP) || !(pp_w9xring0_flags & (FLAGS_PCEPP | FLAGS_PCECPEPP))) {
+ parport_ops.parport_epp_write_data = parport_w9xring0_emul_ops.parport_epp_write_data;
+ parport_ops.parport_epp_read_data = parport_w9xring0_emul_ops.parport_epp_read_data;
+ parport_ops.parport_epp_write_addr = parport_w9xring0_emul_ops.parport_epp_write_addr;
+ parport_ops.parport_epp_read_addr = parport_w9xring0_emul_ops.parport_epp_read_addr;
+ lprintf(0, "Parport 0x%x emulating EPP\n", pp_w9xring0_iobase);
+ }
+ return 0;
+}
+
+int parport_init_w9xring0(unsigned io)
+{
+ return parport_init_w9xring0_flags(io, 0);
+}
diff --git a/main/ppwin.c b/main/ppwin.c
new file mode 100644
index 0000000..c765927
--- /dev/null
+++ b/main/ppwin.c
@@ -0,0 +1,1010 @@
+/*****************************************************************************/
+
+/*
+ * ppnt.c -- Parport direct access with eppflex.sys/vxd.
+ *
+ * Copyright (C) 2000 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#include <windows.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+#define DEVICE_TYPE DWORD
+
+#include "w9xdrv/eppflex.h"
+
+/* ---------------------------------------------------------------------- */
+
+/* LPT registers */
+/* ECP specific registers */
+#define LPTREG_ECONTROL 0x402
+#define LPTREG_CONFIGB 0x401
+#define LPTREG_CONFIGA 0x400
+#define LPTREG_TFIFO 0x400
+#define LPTREG_DFIFO 0x400
+#define LPTREG_AFIFO 0x000
+#define LPTREG_DSR 0x001
+#define LPTREG_DCR 0x002
+/* EPP specific registers */
+#define LPTREG_EPPDATA 0x004
+#define LPTREG_EPPADDR 0x003
+/* standard registers */
+#define LPTREG_CONTROL 0x002
+#define LPTREG_STATUS 0x001
+#define LPTREG_DATA 0x000
+
+/* ECP config A */
+#define LPTCFGA_INTRISALEVEL 0x80
+#define LPTCFGA_IMPIDMASK 0x70
+#define LPTCFGA_IMPID16BIT 0x00
+#define LPTCFGA_IMPID8BIT 0x10
+#define LPTCFGA_IMPID32BIT 0x20
+#define LPTCFGA_NOPIPELINE 0x04
+#define LPTCFGA_PWORDCOUNT 0x03
+
+/* ECP config B */
+#define LPTCFGB_COMPRESS 0x80
+#define LPTCFGB_INTRVALUE 0x40
+#define LPTCFGB_IRQMASK 0x38
+#define LPTCFGB_IRQ5 0x38
+#define LPTCFGB_IRQ15 0x30
+#define LPTCFGB_IRQ14 0x28
+#define LPTCFGB_IRQ11 0x20
+#define LPTCFGB_IRQ10 0x18
+#define LPTCFGB_IRQ9 0x10
+#define LPTCFGB_IRQ7 0x08
+#define LPTCFGB_IRQJUMPER 0x00
+#define LPTCFGB_DMAMASK 0x07
+#define LPTCFGB_DMA7 0x07
+#define LPTCFGB_DMA6 0x06
+#define LPTCFGB_DMA5 0x05
+#define LPTCFGB_DMAJUMPER16 0x04
+#define LPTCFGB_DMA3 0x03
+#define LPTCFGB_DMA2 0x02
+#define LPTCFGB_DMA1 0x01
+#define LPTCFGB_DMAJUMPER8 0x00
+
+/* ECP ECR */
+#define LPTECR_MODEMASK 0xe0
+#define LPTECR_MODESPP 0x00
+#define LPTECR_MODEPS2 0x20
+#define LPTECR_MODESPPFIFO 0x40
+#define LPTECR_MODEECP 0x60
+#define LPTECR_MODEECPEPP 0x80
+#define LPTECR_MODETEST 0xc0
+#define LPTECR_MODECFG 0xe0
+#define LPTECR_NERRINTRDIS 0x10
+#define LPTECR_DMAEN 0x08
+#define LPTECR_SERVICEINTR 0x04
+#define LPTECR_FIFOFULL 0x02
+#define LPTECR_FIFOEMPTY 0x01
+
+/* ---------------------------------------------------------------------- */
+
+HANDLE pp_win_handle = INVALID_HANDLE_VALUE;
+unsigned int pp_win_flags = 0;
+
+#define FLAGS_PCSPP (1<<0)
+#define FLAGS_PCPS2 (1<<1)
+#define FLAGS_PCEPP (1<<2)
+#define FLAGS_PCECR (1<<3) /* ECR Register Exists */
+#define FLAGS_PCECP (1<<4)
+#define FLAGS_PCECPEPP (1<<5)
+#define FLAGS_PCECPPS2 (1<<6)
+
+/* ---------------------------------------------------------------------- */
+
+unsigned char parport_win_read_data(void)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_win_handle == INVALID_HANDLE_VALUE)
+ return 0xff;
+ res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_READ_DATA, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res) {
+ lprintf(0, "Parport: parport_win_read_data failed, error 0x%08lx\n", GetLastError());
+ return 0xff;
+ }
+ if (retl != sizeof(rw)) {
+ lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+ return 0xff;
+ }
+ return rw.data;
+}
+
+void parport_win_write_data(unsigned char d)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_win_handle == INVALID_HANDLE_VALUE)
+ return;
+ rw.data = d;
+ res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_WRITE_DATA, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res)
+ lprintf(0, "Parport: parport_win_write_data failed, error 0x%08lx\n", GetLastError());
+}
+
+unsigned char parport_win_read_status(void)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_win_handle == INVALID_HANDLE_VALUE)
+ return 0xff;
+ res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_READ_STATUS, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res) {
+ lprintf(0, "Parport: parport_win_read_status failed, error 0x%08lx\n", GetLastError());
+ return 0xff;
+ }
+ if (retl != sizeof(rw)) {
+ lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+ return 0xff;
+ }
+ return rw.data;
+}
+
+void parport_win_write_status(unsigned char d)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_win_handle == INVALID_HANDLE_VALUE)
+ return;
+ rw.data = d;
+ res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_WRITE_STATUS, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res)
+ lprintf(0, "Parport: parport_win_write_status failed, error 0x%08lx\n", GetLastError());
+}
+
+unsigned char parport_win_read_control(void)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_win_handle == INVALID_HANDLE_VALUE)
+ return 0xff;
+ res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_READ_CONTROL, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res) {
+ lprintf(0, "Parport: parport_win_read_control failed, error 0x%08lx\n", GetLastError());
+ return 0xff;
+ }
+ if (retl != sizeof(rw)) {
+ lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+ return 0xff;
+ }
+ return rw.data;
+}
+
+void parport_win_write_control(unsigned char d)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_win_handle == INVALID_HANDLE_VALUE)
+ return;
+ rw.data = d;
+ res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_WRITE_CONTROL, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res)
+ lprintf(0, "Parport: parport_win_write_control failed, error 0x%08lx\n", GetLastError());
+}
+
+void parport_win_frob_control(unsigned char mask, unsigned char val)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_win_handle == INVALID_HANDLE_VALUE)
+ return;
+ rw.data = val;
+ rw.mask = mask;
+ res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_FROB_CONTROL, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res) {
+ lprintf(0, "Parport: parport_win_frob_control failed, error 0x%08lx\n", GetLastError());
+ return;
+ }
+ if (retl != sizeof(rw)) {
+ lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+ return;
+ }
+}
+
+unsigned char parport_win_read_configa(void)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_win_handle == INVALID_HANDLE_VALUE)
+ return 0xff;
+ res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_READ_CONFIGA, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res) {
+ lprintf(0, "Parport: parport_win_read_configa failed, error 0x%08lx\n", GetLastError());
+ return 0xff;
+ }
+ if (retl != sizeof(rw)) {
+ lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+ return 0xff;
+ }
+ return rw.data;
+}
+
+void parport_win_write_configa(unsigned char d)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_win_handle == INVALID_HANDLE_VALUE)
+ return;
+ rw.data = d;
+ res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_WRITE_CONFIGA, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res)
+ lprintf(0, "Parport: parport_win_write_configa failed, error 0x%08lx\n", GetLastError());
+}
+
+unsigned char parport_win_read_configb(void)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_win_handle == INVALID_HANDLE_VALUE)
+ return 0xff;
+ res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_READ_CONFIGB, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res) {
+ lprintf(0, "Parport: parport_win_read_configb failed, error 0x%08lx\n", GetLastError());
+ return 0xff;
+ }
+ if (retl != sizeof(rw)) {
+ lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+ return 0xff;
+ }
+ return rw.data;
+}
+
+void parport_win_write_configb(unsigned char d)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_win_handle == INVALID_HANDLE_VALUE)
+ return;
+ rw.data = d;
+ res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_WRITE_CONFIGB, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res)
+ lprintf(0, "Parport: parport_win_write_configb failed, error 0x%08lx\n", GetLastError());
+}
+
+unsigned char parport_win_read_econtrol(void)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_win_handle == INVALID_HANDLE_VALUE)
+ return 0xff;
+ res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_READ_ECONTROL, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res) {
+ lprintf(0, "Parport: parport_win_read_econtrol failed, error 0x%08lx\n", GetLastError());
+ return 0xff;
+ }
+ if (retl != sizeof(rw)) {
+ lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+ return 0xff;
+ }
+ return rw.data;
+}
+
+void parport_win_write_econtrol(unsigned char d)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_win_handle == INVALID_HANDLE_VALUE)
+ return;
+ rw.data = d;
+ res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_WRITE_ECONTROL, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res)
+ lprintf(0, "Parport: parport_win_write_econtrol failed, error 0x%08lx\n", GetLastError());
+}
+
+void parport_win_frob_econtrol(unsigned char mask, unsigned char val)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_win_handle == INVALID_HANDLE_VALUE)
+ return;
+ rw.data = val;
+ rw.mask = mask;
+ res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_FROB_ECONTROL, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res) {
+ lprintf(0, "Parport: parport_win_frob_econtrol failed, error 0x%08lx\n", GetLastError());
+ return;
+ }
+ if (retl != sizeof(rw)) {
+ lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+ return;
+ }
+}
+
+unsigned char parport_win_read_eppaddr(void)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_win_handle == INVALID_HANDLE_VALUE)
+ return 0xff;
+ res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_READ_EPPADDR, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res) {
+ lprintf(0, "Parport: parport_win_read_eppaddr failed, error 0x%08lx\n", GetLastError());
+ return 0xff;
+ }
+ if (retl != sizeof(rw)) {
+ lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+ return 0xff;
+ }
+ return rw.data;
+}
+
+void parport_win_write_eppaddr(unsigned char d)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_win_handle == INVALID_HANDLE_VALUE)
+ return;
+ rw.data = d;
+ res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_WRITE_EPPADDR, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res)
+ lprintf(0, "Parport: parport_win_write_eppaddr failed, error 0x%08lx\n", GetLastError());
+}
+
+unsigned char parport_win_read_eppdata(void)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_win_handle == INVALID_HANDLE_VALUE)
+ return 0xff;
+ res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_READ_EPPDATA, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res) {
+ lprintf(0, "Parport: parport_win_read_eppdata failed, error 0x%08lx\n", GetLastError());
+ return 0xff;
+ }
+ if (retl != sizeof(rw)) {
+ lprintf(0, "Parport: ioctl returned invalid length, %lu\n", retl);
+ return 0xff;
+ }
+ return rw.data;
+}
+
+void parport_win_write_eppdata(unsigned char d)
+{
+ struct eppflex_rwdata rw;
+ BOOL res;
+ DWORD retl;
+
+ if (pp_win_handle == INVALID_HANDLE_VALUE)
+ return;
+ rw.data = d;
+ res = DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_WRITE_EPPDATA, &rw, sizeof(rw), &rw, sizeof(rw), &retl, NULL);
+ if (!res)
+ lprintf(0, "Parport: parport_win_write_eppdata failed, error 0x%08lx\n", GetLastError());
+}
+
+/* ---------------------------------------------------------------------- */
+
+extern inline void setecr(unsigned char ecr)
+{
+ if (pp_win_flags & FLAGS_PCECR)
+ parport_win_write_econtrol(ecr);
+}
+
+int pp_win_epp_clear_timeout(void)
+{
+ unsigned char r;
+
+ if (!(parport_win_read_status() & LPTSTAT_EPPTIMEOUT))
+ return 1;
+ /* To clear timeout some chips require double read */
+ parport_win_read_status();
+ r = parport_win_read_status();
+ parport_win_write_status(r | 0x01); /* Some reset by writing 1 */
+ parport_win_write_status(r & 0xfe); /* Others by writing 0 */
+ r = parport_win_read_status();
+ return !(r & 0x01);
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_win_epp_write_data(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+
+ setecr(0x90); /* EPP mode */
+ for (; sz > 0; sz--, bp++) {
+ parport_win_write_eppdata(*bp);
+ if (parport_win_read_status() & LPTSTAT_EPPTIMEOUT) {
+ pp_win_epp_clear_timeout();
+ goto rt;
+ }
+ ret++;
+ }
+ rt:
+ setecr(0x30); /* PS/2 mode */
+ return ret;
+}
+
+unsigned parport_win_epp_read_data(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+
+ setecr(0x90); /* EPP mode */
+ for (; sz > 0; sz--, bp++) {
+ *bp = parport_win_read_eppdata();
+ if (parport_win_read_status() & LPTSTAT_EPPTIMEOUT) {
+ pp_win_epp_clear_timeout();
+ goto rt;
+ }
+ ret++;
+ }
+ rt:
+ setecr(0x30); /* PS/2 mode */
+ return ret;
+}
+
+unsigned parport_win_epp_write_addr(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+
+ setecr(0x90); /* EPP mode */
+ for (; sz > 0; sz--, bp++) {
+ parport_win_write_eppaddr(*bp);
+ if (parport_win_read_status() & LPTSTAT_EPPTIMEOUT) {
+ pp_win_epp_clear_timeout();
+ goto rt;
+ }
+ ret++;
+ }
+ rt:
+ setecr(0x30); /* PS/2 mode */
+ return ret;
+}
+
+unsigned parport_win_epp_read_addr(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+
+ setecr(0x90); /* EPP mode */
+ for (; sz > 0; sz--, bp++) {
+ *bp = parport_win_read_eppaddr();
+ if (parport_win_read_status() & LPTSTAT_EPPTIMEOUT) {
+ pp_win_epp_clear_timeout();
+ goto rt;
+ }
+ ret++;
+ }
+ rt:
+ setecr(0x30); /* PS/2 mode */
+ return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_win_emul_epp_write_data(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo;
+
+ parport_win_write_control(LPTCTRL_PROGRAM | LPTCTRL_WRITE);
+ for (; sz > 0; sz--, bp++) {
+ parport_win_write_data(*bp);
+ for (tmo = 0; ; tmo++) {
+ if (parport_win_read_status() & LPTSTAT_WAIT)
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ parport_win_write_control(LPTCTRL_PROGRAM | LPTCTRL_WRITE | LPTCTRL_DATASTB);
+ for (tmo = 0; ; tmo++) {
+ if (!(parport_win_read_status() & LPTSTAT_WAIT))
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ parport_win_write_control(LPTCTRL_PROGRAM | LPTCTRL_WRITE);
+ ret++;
+ }
+ return ret;
+}
+
+unsigned parport_win_emul_epp_read_data(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo;
+
+ parport_win_write_control(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION);
+ for (; sz > 0; sz--, bp++) {
+ for (tmo = 0; ; tmo++) {
+ if (parport_win_read_status() & LPTSTAT_WAIT)
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ parport_win_write_control(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION | LPTCTRL_DATASTB);
+ for (tmo = 0; ; tmo++) {
+ if (!(parport_win_read_status() & LPTSTAT_WAIT))
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ *bp = parport_win_read_data();
+ parport_win_write_control(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION);
+ ret++;
+ }
+ return ret;
+}
+
+unsigned parport_win_emul_epp_write_addr(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo;
+
+ parport_win_write_control(LPTCTRL_PROGRAM | LPTCTRL_WRITE);
+ for (; sz > 0; sz--, bp++) {
+ parport_win_write_data(*bp);
+ for (tmo = 0; ; tmo++) {
+ if (parport_win_read_status() & LPTSTAT_WAIT)
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ parport_win_write_control(LPTCTRL_PROGRAM | LPTCTRL_WRITE | LPTCTRL_ADDRSTB);
+ for (tmo = 0; ; tmo++) {
+ if (!(parport_win_read_status() & LPTSTAT_WAIT))
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ parport_win_write_control(LPTCTRL_PROGRAM | LPTCTRL_WRITE);
+ ret++;
+ }
+ return ret;
+}
+
+unsigned parport_win_emul_epp_read_addr(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo;
+
+ parport_win_write_control(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION);
+ for (; sz > 0; sz--, bp++) {
+ for (tmo = 0; ; tmo++) {
+ if (parport_win_read_status() & LPTSTAT_WAIT)
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ parport_win_write_control(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION | LPTCTRL_ADDRSTB);
+ for (tmo = 0; ; tmo++) {
+ if (!(parport_win_read_status() & LPTSTAT_WAIT))
+ break;
+ if (tmo > 1000)
+ return ret;
+ }
+ *bp = parport_win_read_data();
+ parport_win_write_control(LPTCTRL_PROGRAM | LPTCTRL_DIRECTION);
+ ret++;
+ }
+ return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static int ecp_forward(void)
+{
+ unsigned tmo = 0x10000;
+
+ if (parport_win_read_status() & 0x20)
+ return 0;
+ /* Event 47: Set nInit high */
+ parport_win_write_control(0x26);
+ /* Event 49: PError goes high */
+ while (!(parport_win_read_status() & 0x20)) {
+ if (!(--tmo))
+ return -1;
+ }
+ /* start driving the bus */
+ parport_win_write_control(0x04);
+ return 0;
+}
+
+static int ecp_reverse(void)
+{
+ unsigned tmo = 0x10000;
+
+ if (!(parport_win_read_status() & 0x20))
+ return 0;
+ parport_win_write_control(0x24);
+ /* Event 39: Set nInit low to initiate bus reversal */
+ parport_win_write_control(0x20);
+ while (parport_win_read_status() & 0x20) {
+ if (!(--tmo))
+ return -1;
+ }
+ return 0;
+}
+
+static unsigned emptyfifo(unsigned cnt)
+{
+ unsigned fcnt = 0;
+
+ parport_win_write_econtrol(0xd0); /* FIFOtest mode */
+ while ((parport_win_read_econtrol() & 0x01) && fcnt < 32 && fcnt < cnt) {
+ parport_win_read_configa();
+ fcnt++;
+ }
+ lprintf(10, "emptyfifo: FIFO contained %d bytes\n", fcnt);
+ parport_win_write_econtrol(0x30); /* PS/2 mode */
+ return cnt - fcnt;
+}
+
+unsigned parport_win_ecp_write_data(const void *buf, unsigned sz)
+{
+ const unsigned char *bp = (const unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo = 0x10000;
+ unsigned char stat;
+ unsigned int i;
+
+ if (ecp_forward())
+ return 0;
+ parport_win_write_econtrol(0x70); /* ECP mode */
+ while (sz > 0) {
+ while ((stat = parport_win_read_econtrol()) & 0x02) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ if (stat & 0x01 && sz >= 8) {
+ for (i = 0; i < 8; i++)
+ parport_win_write_configa(bp[i]);
+ bp += 8;
+ sz -= 8;
+ ret += 8;
+ } else {
+ parport_win_write_configa(*bp++);
+ sz--;
+ ret++;
+ }
+ tmo = 0x10000;
+ }
+ while (!(parport_win_read_econtrol() & 0x01) || !(parport_win_read_status() & 0x80)) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ parport_win_write_econtrol(0x30); /* PS/2 mode */
+ return ret;
+}
+
+unsigned parport_win_ecp_read_data(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo = 0x10000;
+ unsigned char stat;
+ unsigned int i;
+
+ if (ecp_reverse())
+ return 0;
+ parport_win_write_econtrol(0x70); /* ECP mode */
+ while (sz > 0) {
+ while ((stat = parport_win_read_econtrol()) & 0x01)
+ if (!(--tmo)) {
+ parport_win_write_econtrol(0xd0); /* FIFOTEST mode */
+ while (!(parport_win_read_econtrol() & 0x01) && sz > 0) {
+ *bp++ = parport_win_read_configa();
+ sz--;
+ ret++;
+ }
+ parport_win_write_econtrol(0x30); /* PS/2 mode */
+ return ret;
+ }
+ if (stat & 0x02 && sz >= 8) {
+ for (i = 0; i < 8; i++)
+ bp[i] = parport_win_read_configa();
+ bp += 8;
+ sz -= 8;
+ ret += 8;
+ } else {
+ *bp++ = parport_win_read_configa();
+ sz--;
+ ret++;
+ }
+ tmo = 0x10000;
+ }
+ parport_win_write_econtrol(0x30); /* PS/2 mode */
+ return ret;
+}
+
+unsigned parport_win_ecp_write_addr(const void *buf, unsigned sz)
+{
+ const unsigned char *bp = (const unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned tmo = 0x10000;
+ unsigned char stat;
+ unsigned int i;
+
+ if (ecp_forward())
+ return 0;
+ parport_win_write_econtrol(0x70); /* ECP mode */
+ while (sz > 0) {
+ while ((stat = parport_win_read_econtrol()) & 0x02) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ if (stat & 0x01 && sz >= 8) {
+ for (i = 0; i < 8; i++)
+ parport_win_write_data(bp[i]);
+ bp += 8;
+ sz -= 8;
+ ret += 8;
+ } else {
+ parport_win_write_data(*bp++);
+ sz--;
+ ret++;
+ }
+ tmo = 0x10000;
+ }
+ while (!(parport_win_read_econtrol() & 0x01) || !(parport_win_read_status() & 0x80)) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ parport_win_write_econtrol(0x30); /* PS/2 mode */
+ return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+unsigned parport_win_emul_ecp_write_data(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret;
+ unsigned char ctl;
+ unsigned tmo;
+
+ if (ecp_forward())
+ return 0;
+ ctl = parport_win_read_control() & ~PARPORT_CONTROL_AUTOFD;
+ /* HostAck high (data, not command) */
+ parport_win_write_control(ctl);
+ for (ret = 0; ret < sz; ret++, bp++) {
+ parport_win_write_data(*bp);
+ parport_win_write_control(ctl | PARPORT_CONTROL_STROBE);
+ for (tmo = 0; parport_win_read_status() & PARPORT_STATUS_BUSY; tmo++)
+ if (tmo > 0x1000)
+ return ret;
+ parport_win_write_control(ctl);
+ for (tmo = 0; !(parport_win_read_status() & PARPORT_STATUS_BUSY); tmo++)
+ if (tmo > 0x1000)
+ return ret;
+ }
+ return ret;
+}
+
+unsigned parport_win_emul_ecp_write_addr(const void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret;
+ unsigned char ctl;
+ unsigned tmo;
+
+ if (ecp_forward())
+ return 0;
+ ctl = parport_win_read_control() | PARPORT_CONTROL_AUTOFD;
+ /* HostAck low (command, not data) */
+ parport_win_write_control(ctl);
+ for (ret = 0; ret < sz; ret++, bp++) {
+ parport_win_write_data(*bp);
+ parport_win_write_control(ctl | PARPORT_CONTROL_STROBE);
+ for (tmo = 0; parport_win_read_status() & PARPORT_STATUS_BUSY; tmo++)
+ if (tmo > 0x1000)
+ return ret;
+ parport_win_write_control(ctl);
+ for (tmo = 0; !(parport_win_read_status() & PARPORT_STATUS_BUSY); tmo++)
+ if (tmo > 0x1000)
+ return ret;
+ }
+ return ret;
+}
+
+unsigned parport_win_emul_ecp_read_data(void *buf, unsigned sz)
+{
+ unsigned char *bp = (unsigned char *)buf;
+ unsigned ret = 0;
+ unsigned char ctl, stat;
+ int command;
+ unsigned tmo;
+
+ if (ecp_reverse())
+ return 0;
+ ctl = parport_win_read_control();
+ /* Set HostAck low to start accepting data. */
+ parport_win_write_control(ctl | PARPORT_CONTROL_AUTOFD);
+ while (ret < sz) {
+ /* Event 43: Peripheral sets nAck low. It can take as
+ long as it wants. */
+ tmo = 0;
+ do {
+ stat = parport_win_read_status();
+ if ((++tmo) > 0x10000)
+ goto out;
+ } while (stat & PARPORT_STATUS_ACK);
+ /* Is this a command? */
+ command = stat & PARPORT_STATUS_BUSY;
+ if (command) {
+ //lprintf(3, "ECP: warning: emulation does not support RLE\n");
+ goto out;
+ }
+ /* Read the data. */
+ *bp = parport_win_read_data();
+ /* Event 44: Set HostAck high, acknowledging handshake. */
+ parport_win_write_control(ctl & ~PARPORT_CONTROL_AUTOFD);
+ /* Event 45: The peripheral has 35ms to set nAck high. */
+ tmo = 0;
+ do {
+ stat = parport_win_read_status();
+ if ((++tmo) > 0x10000)
+ goto out;
+ } while (!(stat & PARPORT_STATUS_ACK));
+ /* Event 46: Set HostAck low and accept the data. */
+ parport_win_write_control(ctl | PARPORT_CONTROL_AUTOFD);
+ /* Normal data byte. */
+ bp++;
+ ret++;
+ }
+
+ out:
+ return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+#if 1
+unsigned parport_win_fpgaconfig_write(const void *buf, unsigned sz)
+{
+ const unsigned char *bp = buf;
+ unsigned u;
+
+ for (u = 0; u < sz; u++, bp++)
+ parport_win_write_data(*bp);
+ return sz;
+}
+#else
+
+unsigned parport_win_fpgaconfig_write(const void *buf, unsigned sz)
+{
+ const unsigned char *bp = buf;
+ unsigned ret = 0;
+ unsigned tmo = 0x10000;
+ unsigned char stat;
+ unsigned int i;
+
+ if (pp_win_modes & PARPORT_MODE_PCECR) {
+ parport_win_write_econtrol(0x50); /* COMPAT FIFO mode */
+ while (sz > 0) {
+ while ((stat = parport_win_read_econtrol()) & 0x02) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ if (stat & 0x01 && sz >= 8) {
+ for (i = 0; i < 8; i++)
+ parport_win_write_configa(bp[i]);
+ bp += 8;
+ sz -= 8;
+ ret += 8;
+ } else {
+ parport_win_write_configa(*bp++);
+ sz--;
+ ret++;
+ }
+ tmo = 0x10000;
+ }
+ while (!(parport_win_read_econtrol() & 0x01) || !(parport_win_read_status() & 0x80)) {
+ if (!(--tmo))
+ return emptyfifo(ret);
+ }
+ parport_win_write_econtrol(0x30); /* PS/2 mode */
+ return ret;
+ }
+ for (ret = 0; ret < sz; ret++, bp++)
+ parport_win_write_data(*bp);
+ return sz;
+}
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+const struct parport_ops parport_win_ops = {
+ parport_win_read_data,
+ parport_win_write_data,
+ parport_win_read_status,
+ parport_win_read_control,
+ parport_win_write_control,
+ parport_win_frob_control,
+ parport_win_epp_write_data,
+ parport_win_epp_read_data,
+ parport_win_epp_write_addr,
+ parport_win_epp_read_addr,
+ parport_win_ecp_write_data,
+ parport_win_ecp_read_data,
+ parport_win_ecp_write_addr,
+ parport_win_fpgaconfig_write
+};
+
+const struct parport_ops parport_win_emul_ops = {
+ parport_win_read_data,
+ parport_win_write_data,
+ parport_win_read_status,
+ parport_win_read_control,
+ parport_win_write_control,
+ parport_win_frob_control,
+ parport_win_emul_epp_write_data,
+ parport_win_emul_epp_read_data,
+ parport_win_emul_epp_write_addr,
+ parport_win_emul_epp_read_addr,
+ parport_win_emul_ecp_write_data,
+ parport_win_emul_ecp_read_data,
+ parport_win_emul_ecp_write_addr,
+ parport_win_fpgaconfig_write
+};
+
+/* ---------------------------------------------------------------------- */
diff --git a/main/ppwininit.c b/main/ppwininit.c
new file mode 100644
index 0000000..ddc3cd7
--- /dev/null
+++ b/main/ppwininit.c
@@ -0,0 +1,624 @@
+/*****************************************************************************/
+
+/*
+ * ppntinit.c -- Parport direct access with eppflex.sys/vxd (init routines).
+ *
+ * Copyright (C) 2000-2001 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#include <windows.h>
+
+#include "parport.h"
+#include "fpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+#define DEVICE_TYPE DWORD
+
+#include "w9xdrv/eppflex.h"
+
+/* ---------------------------------------------------------------------- */
+
+/* LPT registers */
+/* ECP specific registers */
+#define LPTREG_ECONTROL 0x402
+#define LPTREG_CONFIGB 0x401
+#define LPTREG_CONFIGA 0x400
+#define LPTREG_TFIFO 0x400
+#define LPTREG_DFIFO 0x400
+#define LPTREG_AFIFO 0x000
+#define LPTREG_DSR 0x001
+#define LPTREG_DCR 0x002
+/* EPP specific registers */
+#define LPTREG_EPPDATA 0x004
+#define LPTREG_EPPADDR 0x003
+/* standard registers */
+#define LPTREG_CONTROL 0x002
+#define LPTREG_STATUS 0x001
+#define LPTREG_DATA 0x000
+
+/* ECP config A */
+#define LPTCFGA_INTRISALEVEL 0x80
+#define LPTCFGA_IMPIDMASK 0x70
+#define LPTCFGA_IMPID16BIT 0x00
+#define LPTCFGA_IMPID8BIT 0x10
+#define LPTCFGA_IMPID32BIT 0x20
+#define LPTCFGA_NOPIPELINE 0x04
+#define LPTCFGA_PWORDCOUNT 0x03
+
+/* ECP config B */
+#define LPTCFGB_COMPRESS 0x80
+#define LPTCFGB_INTRVALUE 0x40
+#define LPTCFGB_IRQMASK 0x38
+#define LPTCFGB_IRQ5 0x38
+#define LPTCFGB_IRQ15 0x30
+#define LPTCFGB_IRQ14 0x28
+#define LPTCFGB_IRQ11 0x20
+#define LPTCFGB_IRQ10 0x18
+#define LPTCFGB_IRQ9 0x10
+#define LPTCFGB_IRQ7 0x08
+#define LPTCFGB_IRQJUMPER 0x00
+#define LPTCFGB_DMAMASK 0x07
+#define LPTCFGB_DMA7 0x07
+#define LPTCFGB_DMA6 0x06
+#define LPTCFGB_DMA5 0x05
+#define LPTCFGB_DMAJUMPER16 0x04
+#define LPTCFGB_DMA3 0x03
+#define LPTCFGB_DMA2 0x02
+#define LPTCFGB_DMA1 0x01
+#define LPTCFGB_DMAJUMPER8 0x00
+
+/* ECP ECR */
+#define LPTECR_MODEMASK 0xe0
+#define LPTECR_MODESPP 0x00
+#define LPTECR_MODEPS2 0x20
+#define LPTECR_MODESPPFIFO 0x40
+#define LPTECR_MODEECP 0x60
+#define LPTECR_MODEECPEPP 0x80
+#define LPTECR_MODETEST 0xc0
+#define LPTECR_MODECFG 0xe0
+#define LPTECR_NERRINTRDIS 0x10
+#define LPTECR_DMAEN 0x08
+#define LPTECR_SERVICEINTR 0x04
+#define LPTECR_FIFOFULL 0x02
+#define LPTECR_FIFOEMPTY 0x01
+
+/* ---------------------------------------------------------------------- */
+
+extern HANDLE pp_win_handle;
+extern unsigned int pp_win_flags;
+extern const struct parport_ops parport_win_ops, parport_win_emul_ops;
+
+extern unsigned char parport_win_read_data(void);
+extern void parport_win_write_data(unsigned char d);
+extern unsigned char parport_win_read_status(void);
+extern unsigned char parport_win_read_control(void);
+extern void parport_win_write_control(unsigned char d);
+extern void parport_win_frob_control(unsigned char mask, unsigned char val);
+extern unsigned char parport_win_read_configa(void);
+extern void parport_win_write_configa(unsigned char d);
+extern unsigned char parport_win_read_configb(void);
+extern void parport_win_write_configb(unsigned char d);
+extern unsigned char parport_win_read_econtrol(void);
+extern void parport_win_write_econtrol(unsigned char d);
+extern void parport_win_frob_econtrol(unsigned char mask, unsigned char val);
+extern unsigned char parport_win_read_eppaddr(void);
+extern void parport_win_write_eppaddr(unsigned char d);
+extern unsigned char parport_win_read_eppdata(void);
+extern void parport_win_write_eppdata(unsigned char d);
+extern int pp_win_epp_clear_timeout(void);
+
+#define FLAGS_PCSPP (1<<0)
+#define FLAGS_PCPS2 (1<<1)
+#define FLAGS_PCEPP (1<<2)
+#define FLAGS_PCECR (1<<3) /* ECR Register Exists */
+#define FLAGS_PCECP (1<<4)
+#define FLAGS_PCECPEPP (1<<5)
+#define FLAGS_PCECPPS2 (1<<6)
+
+/* ---------------------------------------------------------------------- */
+
+static int parport_spp(void)
+{
+ pp_win_epp_clear_timeout(); /* prevent lockup of some SMSC IC's */
+ /* this routine is mostly copied from Linux Kernel parport */
+ parport_win_write_econtrol(0xc);
+ parport_win_write_control(0xc);
+ parport_win_write_data(0xaa);
+ if (parport_win_read_data() != 0xaa)
+ return 0;
+ parport_win_write_data(0x55);
+ if (parport_win_read_data() != 0x55)
+ return 0;
+ return PARPORT_MODE_PCSPP;
+}
+
+/* Check for ECP
+ *
+ * Old style XT ports alias io ports every 0x400, hence accessing ECR
+ * on these cards actually accesses the CTR.
+ *
+ * Modern cards don't do this but reading from ECR will return 0xff
+ * regardless of what is written here if the card does NOT support
+ * ECP.
+ *
+ * We will write 0x2c to ECR and 0xcc to CTR since both of these
+ * values are "safe" on the CTR since bits 6-7 of CTR are unused.
+ */
+static int parport_ecr(void)
+{
+ unsigned char r = 0xc;
+
+ parport_win_write_control(r);
+ if ((parport_win_read_econtrol() & 0x3) == (r & 0x3)) {
+ parport_win_write_control(r ^ 0x2); /* Toggle bit 1 */
+ r = parport_win_read_control();
+ if ((parport_win_read_econtrol() & 0x2) == (r & 0x2))
+ goto no_reg; /* Sure that no ECR register exists */
+ }
+
+ if ((parport_win_read_econtrol() & 0x3 ) != 0x1)
+ goto no_reg;
+
+ parport_win_write_econtrol(0x34);
+ if (parport_win_read_econtrol() != 0x35)
+ goto no_reg;
+
+ parport_win_write_control(0xc);
+
+ /* Go to mode 000 */
+ parport_win_frob_econtrol(0xe0, 0);
+
+ return PARPORT_MODE_PCECR;
+
+ no_reg:
+ parport_win_write_control(0xc);
+ return 0;
+}
+
+static int parport_ecp(void)
+{
+ int i;
+ int config;
+ int pword;
+ int fifo_depth, writeIntrThreshold, readIntrThreshold;
+
+ /* Find out FIFO depth */
+ parport_win_write_econtrol(0x00); /* Reset FIFO */
+ parport_win_write_econtrol(0xc0); /* TEST FIFO */
+ for (i=0; i < 1024 && !(parport_win_read_econtrol() & 0x02); i++)
+ parport_win_write_configa(0xaa);
+ /*
+ * Using LGS chipset it uses ECR register, but
+ * it doesn't support ECP or FIFO MODE
+ */
+ if (i == 1024) {
+ parport_win_write_econtrol(0x00);
+ return 0;
+ }
+
+ fifo_depth = i;
+ lprintf(3, "ECP: FIFO depth is %d bytes\n", fifo_depth);
+
+ /* Find out writeIntrThreshold */
+ parport_win_frob_econtrol((1<<2), (1<<2));
+ parport_win_frob_econtrol((1<<2), 0);
+ for (i = 1; i <= fifo_depth; i++) {
+ parport_win_read_configa();
+ usleep(50);
+ if (parport_win_read_econtrol() & (1<<2))
+ break;
+ }
+
+ if (i <= fifo_depth)
+ lprintf(3, "ECP: writeIntrThreshold is %d\n", i);
+ else
+ /* Number of bytes we know we can write if we get an
+ interrupt. */
+ i = 0;
+
+ writeIntrThreshold = i;
+
+ /* Find out readIntrThreshold */
+ parport_win_frob_econtrol(0xe0, 0x20); /* Reset FIFO, PS2 */
+ parport_win_frob_control(PARPORT_CONTROL_DIRECTION, PARPORT_CONTROL_DIRECTION);
+ parport_win_frob_econtrol(0xe0, 0xc0); /* Test FIFO */
+ parport_win_frob_econtrol((1<<2), (1<<2));
+ parport_win_frob_econtrol((1<<2), 0);
+ for (i = 1; i <= fifo_depth; i++) {
+ parport_win_write_configa(0xaa);
+ if (parport_win_read_econtrol() & (1<<2))
+ break;
+ }
+
+ if (i <= fifo_depth)
+ lprintf(3, "ECP: readIntrThreshold is %d\n", i);
+ else
+ /* Number of bytes we can read if we get an interrupt. */
+ i = 0;
+
+ readIntrThreshold = i;
+
+ parport_win_write_econtrol(0x00); /* Reset FIFO */
+ parport_win_write_econtrol(0xf4); /* Configuration mode */
+ config = parport_win_read_configa();
+ pword = (config >> 4) & 0x7;
+ switch (pword) {
+ case 0:
+ pword = 2;
+ lprintf(0, "ECP: Unsupported pword size! (2)\n");
+ break;
+ case 2:
+ pword = 4;
+ lprintf(0, "ECP: Unsupported pword size! (4)\n");
+ break;
+ default:
+ lprintf(0, "ECP: Unknown implementation ID (%d)\n", pword);
+ /* Assume 1 */
+ case 1:
+ pword = 1;
+ }
+ lprintf(3, "ECP: PWord is %d bits\n", 8 * pword);
+
+ config = parport_win_read_configb();
+ lprintf(3, "ECP: Interrupts are ISA-%s\n", config & 0x80 ? "Level" : "Pulses");
+
+ if (!(config & 0x40))
+ lprintf(3, "ECP: IRQ conflict!\n");
+
+ /* Go back to mode 000 */
+ parport_win_frob_econtrol(0xe0, 0);
+
+ return PARPORT_MODE_PCECP;
+}
+
+/* EPP mode detection */
+
+static int parport_epp(void)
+{
+ /* If EPP timeout bit clear then EPP available */
+ if (!pp_win_epp_clear_timeout())
+ return 0; /* No way to clear timeout */
+
+ /*
+ * Theory:
+ * Write two values to the EPP address register and
+ * read them back. When the transfer times out, the state of
+ * the EPP register is undefined in some cases (EPP 1.9?) but
+ * in others (EPP 1.7, ECPEPP?) it is possible to read back
+ * its value.
+ */
+
+ pp_win_epp_clear_timeout();
+ usleep(30); /* Wait for possible EPP timeout */
+
+ parport_win_write_eppaddr(0x55);
+ pp_win_epp_clear_timeout();
+ usleep(30); /* Wait for possible EPP timeout */
+
+ if (parport_win_read_eppaddr() == 0x55) {
+ parport_win_write_eppaddr(0xaa);
+ pp_win_epp_clear_timeout();
+ usleep(30); /* Wait for possible EPP timeout */
+ if (parport_win_read_eppaddr() == 0xaa) {
+ pp_win_epp_clear_timeout();
+ return PARPORT_MODE_PCEPP;
+ }
+ }
+
+ /*
+ * Theory:
+ * Bit 0 of STR is the EPP timeout bit, this bit is 0
+ * when EPP is possible and is set high when an EPP timeout
+ * occurs (EPP uses the HALT line to stop the CPU while it does
+ * the byte transfer, an EPP timeout occurs if the attached
+ * device fails to respond after 10 micro seconds).
+ *
+ * This bit is cleared by either reading it (National Semi)
+ * or writing a 1 to the bit (SMC, UMC, WinBond), others ???
+ * This bit is always high in non EPP modes.
+ */
+
+ parport_win_frob_control(0x20, 0x20);
+ parport_win_frob_control(0x10, 0x10);
+ pp_win_epp_clear_timeout();
+
+ parport_win_read_eppdata();
+ usleep(30); /* Wait for possible EPP timeout */
+
+ if (parport_win_read_status() & 0x01) {
+ pp_win_epp_clear_timeout();
+ return PARPORT_MODE_PCEPP;
+ }
+ return 0;
+}
+
+static int parport_ecpepp(void)
+{
+ int mode;
+ unsigned char oecr;
+
+ oecr = parport_win_read_econtrol();
+ /* Search for SMC style EPP+ECP mode */
+ parport_win_write_econtrol(0x80);
+ mode = parport_epp();
+ parport_win_write_econtrol(oecr);
+ return mode ? PARPORT_MODE_PCECPEPP : 0;
+}
+
+/* Detect PS/2 support.
+ *
+ * Bit 5 (0x20) sets the PS/2 data direction; setting this high
+ * allows us to read data from the data lines. In theory we would get back
+ * 0xff but any peripheral attached to the port may drag some or all of the
+ * lines down to zero. So if we get back anything that isn't the contents
+ * of the data register we deem PS/2 support to be present.
+ *
+ * Some SPP ports have "half PS/2" ability - you can't turn off the line
+ * drivers, but an external peripheral with sufficiently beefy drivers of
+ * its own can overpower them and assert its own levels onto the bus, from
+ * where they can then be read back as normal. Ports with this property
+ * and the right type of device attached are likely to fail the SPP test,
+ * (as they will appear to have stuck bits) and so the fact that they might
+ * be misdetected here is rather academic.
+ */
+
+static int parport_ps2(void)
+{
+ int ok = 0;
+ unsigned char octr = parport_win_read_control();
+
+ pp_win_epp_clear_timeout();
+
+ parport_win_write_control(octr | 0x20); /* try to tri-state the buffer */
+
+ parport_win_write_data(0x55);
+ if (parport_win_read_data() != 0x55) ok++;
+ parport_win_write_data(0xaa);
+ if (parport_win_read_data() != 0xaa) ok++;
+
+ parport_win_write_control(octr); /* cancel input mode */
+
+ return ok ? PARPORT_MODE_PCPS2 : 0;
+}
+
+static int parport_ecpps2(void)
+{
+ int mode;
+ unsigned char oecr;
+
+ oecr = parport_win_read_econtrol();
+ parport_win_write_econtrol(0x20);
+ mode = parport_ps2();
+ parport_win_write_econtrol(oecr);
+ return mode ? PARPORT_MODE_PCECPPS2 : 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+#define SERVICENAME "eppflex"
+#define SERVICEDISPLAYNAME "Baycom EPPFLEX"
+//#define SERVICEBINARY "\"\\??\\g:\\nteppflex\\eppflex.sys\""
+#define SERVICEBINARY "System32\\drivers\\eppflex.sys"
+
+static int start_service(void)
+{
+ int ret = -1;
+ SC_HANDLE hscm, hserv;
+
+ hscm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
+ if (!hscm) {
+ lprintf(5, "Cannot open SC manager, error 0x%08lx\n", GetLastError());
+ return -1;
+ }
+ hserv = CreateService(hscm, SERVICENAME, SERVICEDISPLAYNAME,
+ SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
+ SERVICEBINARY, NULL, NULL, NULL, NULL, NULL);
+ if (!hserv) {
+ lprintf(5, "Cannot create service, error 0x%08lx\n", GetLastError());
+ hserv = OpenService(hscm, SERVICENAME, SERVICE_ALL_ACCESS);
+ if (!hserv) {
+ lprintf(5, "Cannot open service, error 0x%08lx\n", GetLastError());
+ goto closescm;
+ }
+ }
+ if (!StartService(hserv, 0, NULL)) {
+ lprintf(5, "Cannot start service, error 0x%08lx\n", GetLastError());
+ goto closeserv;
+ }
+ lprintf(1, "Service %s started successfully\n", SERVICENAME);
+ ret = 0;
+
+ closeserv:
+ if (!CloseServiceHandle(hserv))
+ lprintf(5, "Cannot close service handle, error 0x%08lx\n", GetLastError());
+ closescm:
+ if (!CloseServiceHandle(hscm))
+ lprintf(5, "Cannot close service manager handle, error 0x%08lx\n", GetLastError());
+ return ret;
+}
+
+static int stop_service(void)
+{
+ int ret = -1;
+ SC_HANDLE hscm, hserv;
+ SERVICE_STATUS sstat;
+
+ hscm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
+ if (!hscm) {
+ lprintf(5, "Cannot open SC manager, error 0x%08lx\n", GetLastError());
+ return -1;
+ }
+ hserv = OpenService(hscm, SERVICENAME, SERVICE_ALL_ACCESS);
+ if (!hserv) {
+ lprintf(5, "Cannot open service, error 0x%08lx\n", GetLastError());
+ goto closescm;
+ }
+ ret = 0;
+ if (!ControlService(hserv, SERVICE_CONTROL_STOP, &sstat)) {
+ lprintf(5, "Cannot delete service, error 0x%08lx\n", GetLastError());
+ ret = -1;
+ }
+ if (!DeleteService(hserv)) {
+ lprintf(5, "Cannot delete service, error 0x%08lx\n", GetLastError());
+ ret = -1;
+ }
+ if (!ret)
+ lprintf(1, "Service %s stopped successfully\n", SERVICENAME);
+ if (!CloseServiceHandle(hserv))
+ lprintf(5, "Cannot close service handle, error 0x%08lx\n", GetLastError());
+ closescm:
+ if (!CloseServiceHandle(hscm))
+ lprintf(5, "Cannot close service manager handle, error 0x%08lx\n", GetLastError());
+ return ret;
+}
+
+/* ---------------------------------------------------------------------- */
+
+extern inline int isnt()
+{
+ OSVERSIONINFO info;
+
+ info.dwOSVersionInfoSize = sizeof(info);
+ if (GetVersionEx(&info) && info.dwPlatformId == VER_PLATFORM_WIN32_NT)
+ return 1;
+ return 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+void parport_stop_win(void)
+{
+ DWORD bytesret;
+ int nt = isnt();
+
+ if (pp_win_handle != INVALID_HANDLE_VALUE) {
+ if (!nt)
+ DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_RELEASEPORT, NULL, 0, NULL, 0, &bytesret, NULL);
+ CloseHandle(pp_win_handle);
+ }
+ pp_win_handle = INVALID_HANDLE_VALUE;
+ if (nt)
+ stop_service();
+}
+
+/* ---------------------------------------------------------------------- */
+
+int parport_init_win_flags(unsigned int portnr, unsigned int flags)
+{
+ char buf[32];
+ DWORD bytesret;
+
+ if (pp_win_handle != INVALID_HANDLE_VALUE)
+ CloseHandle(pp_win_handle);
+ if (isnt()) {
+ start_service();
+ snprintf(buf, sizeof(buf), "\\\\.\\eppflex\\%u", portnr);
+ pp_win_handle = CreateFile(buf, GENERIC_READ | GENERIC_WRITE,
+ FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
+ OPEN_EXISTING, 0, NULL);
+ if (pp_win_handle == INVALID_HANDLE_VALUE) {
+ lprintf(0, "Cannot open eppflex.sys driver, error 0x%08lx\n", GetLastError());
+ goto err;
+ }
+ } else {
+ pp_win_handle = CreateFile("\\\\.\\EPPFLEX.VXD", 0, 0, NULL, OPEN_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE, NULL);
+ if (pp_win_handle == INVALID_HANDLE_VALUE) {
+ lprintf(0, "Cannot open eppflex.vxd driver, error 0x%08lx\n", GetLastError());
+ goto err;
+ }
+ if (!DeviceIoControl(pp_win_handle, IOCTL_EPPFLEX_ACQUIREPORT, &portnr, sizeof(portnr),
+ NULL, 0, &bytesret, NULL)) {
+ CloseHandle(pp_win_handle);
+ pp_win_handle = INVALID_HANDLE_VALUE;
+ lprintf(0, "Cannot open acquire port LPT%u, error 0x%08lx\n", portnr+1, GetLastError());
+ goto err;
+ }
+ }
+ pp_win_flags = FLAGS_PCSPP;
+ if (!parport_spp()) {
+ lprintf(0, "No parport present\n");
+ goto err;
+ }
+ if (parport_ecr()) {
+ pp_win_flags |= FLAGS_PCECR;
+ pp_win_flags |= parport_ecp();
+ pp_win_flags |= parport_ecpps2();
+ pp_win_flags |= parport_ecpepp();
+ if ((flags & PPFLAG_FORCEHWEPP) &&
+ (pp_win_flags & (FLAGS_PCPS2|FLAGS_PCECPPS2)) &&
+ !(pp_win_flags & (FLAGS_PCEPP|FLAGS_PCECPEPP)))
+ pp_win_flags |= FLAGS_PCECPEPP;
+ else
+ flags &= ~PPFLAG_FORCEHWEPP;
+ } else {
+ pp_win_flags |= parport_ps2();
+ pp_win_flags |= parport_epp();
+ if ((flags & PPFLAG_FORCEHWEPP) &&
+ (pp_win_flags & (FLAGS_PCPS2|FLAGS_PCECPPS2)) &&
+ !(pp_win_flags & (FLAGS_PCEPP|FLAGS_PCECPEPP)))
+ pp_win_flags |= FLAGS_PCEPP;
+ else
+ flags &= ~PPFLAG_FORCEHWEPP;
+ }
+ lprintf(0, "Parport capabilities: SPP%s%s%s%s%s%s\n",
+ (pp_win_flags & FLAGS_PCPS2) ? ", PS2" : "",
+ (pp_win_flags & FLAGS_PCEPP) ? ((flags & PPFLAG_FORCEHWEPP) ? ", EPP (forced)" : ", EPP") : "",
+ (pp_win_flags & FLAGS_PCECR) ? ", ECR" : "",
+ (pp_win_flags & FLAGS_PCECP) ? ", ECP" : "",
+ (pp_win_flags & FLAGS_PCECPEPP) ? ((flags & PPFLAG_FORCEHWEPP) ? ", ECPEPP (forced)" : ", ECPEPP") : "",
+ (pp_win_flags & FLAGS_PCECPPS2) ? ", ECPPS2" : "");
+ if (!(pp_win_flags & (FLAGS_PCPS2 | FLAGS_PCECPPS2))) {
+ lprintf(0, "Parport does not even support PS/2 mode, cannot use it\n");
+ goto err;
+ }
+ lprintf(0, "Parport using eppflex.sys/vxd hardware access");
+ if (pp_win_flags & FLAGS_PCECR)
+ parport_win_write_econtrol(0x30); /* PS/2 mode */
+ parport_ops = parport_win_ops;
+ if ((flags & PPFLAG_SWEMULECP) || !(pp_win_flags & FLAGS_PCECP)) {
+ parport_ops.parport_ecp_write_data = parport_win_emul_ops.parport_ecp_write_data;
+ parport_ops.parport_ecp_read_data = parport_win_emul_ops.parport_ecp_read_data;
+ parport_ops.parport_ecp_write_addr = parport_win_emul_ops.parport_ecp_write_addr;
+ lprintf(0, ", emulating ECP");
+ }
+ if ((flags & PPFLAG_SWEMULEPP) || !(pp_win_flags & (FLAGS_PCEPP | FLAGS_PCECPEPP))) {
+ parport_ops.parport_epp_write_data = parport_win_emul_ops.parport_epp_write_data;
+ parport_ops.parport_epp_read_data = parport_win_emul_ops.parport_epp_read_data;
+ parport_ops.parport_epp_write_addr = parport_win_emul_ops.parport_epp_write_addr;
+ parport_ops.parport_epp_read_addr = parport_win_emul_ops.parport_epp_read_addr;
+ lprintf(0, ", emulating EPP");
+ }
+ lprintf(0, "\n");
+ return 0;
+
+ err:
+ parport_stop_win();
+ return -1;
+}
+
+int parport_init_win(unsigned int portnr)
+{
+ return parport_init_win_flags(portnr, 0);
+}
diff --git a/main/snprintpkt.c b/main/snprintpkt.c
new file mode 100644
index 0000000..61fc50d
--- /dev/null
+++ b/main/snprintpkt.c
@@ -0,0 +1,255 @@
+/*****************************************************************************/
+
+/*
+ * snprintpkt.c -- Print an AX.25 packet (with header) into a buffer.
+ *
+ * Copyright (C) 1996 Thomas Sailer (sailer at ife.ee.ethz.ch)
+ * Swiss Federal Institute of Technology (ETH), Electronics Lab
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *
+ * This is the Linux realtime sound output driver
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define _GNU_SOURCE
+#include <stdio.h>
+
+#include "fpga.h"
+
+/* --------------------------------------------------------------------- */
+
+#define ADDCH(c) \
+do { \
+ if (p + 1 >= endp) \
+ return -1; \
+ *p++ = (c); \
+} while(0)
+
+#define ADDSTR(s) \
+do { \
+ int l = strlen(s); \
+ if (p + l >= endp) \
+ return -1; \
+ memcpy(p, s, l); \
+ p += l; \
+} while(0)
+
+#ifdef HAVE_SNPRINTF
+
+#define ADDF(fmt, args...) \
+do { \
+ int xlen = snprintf(p, endp-p, fmt, ## args); \
+ if (xlen < 0) \
+ return -1; \
+ p += xlen; \
+} while(0)
+
+#else /* HAVE_SNPRINTF */
+
+#define ADDF(fmt, args...) \
+do { \
+ char xbuf[64]; \
+ int xlen = sprintf(xbuf, fmt, ## args); \
+ if (p + xlen >= endp) \
+ return -1; \
+ memcpy(p, xbuf, xlen); \
+ p += xlen; \
+} while(0)
+
+#endif /* HAVE_SNPRINTF */
+
+int snprintpkt(char *buf, size_t sz, const u_int8_t *pkt, unsigned len)
+{
+ u_int8_t v1=1 , cmd=0;
+ u_int8_t i, j;
+ char *p = buf;
+ char *endp = buf + sz;
+
+ if (sz < 2)
+ return -1;
+ *buf = 0;
+ if (!pkt || len < 8)
+ return 0;
+ if (pkt[1] & 1) {
+ /*
+ * FlexNet Header Compression
+ */
+ v1 = 0;
+ cmd = (pkt[1] & 2) != 0;
+ ADDSTR("fm ? to ");
+ i = (pkt[2] >> 2) & 0x3f;
+ if (i) {
+ ADDCH(i+0x20);
+ }
+ i = ((pkt[2] << 4) | ((pkt[3] >> 4) & 0xf)) & 0x3f;
+ if (i) {
+ ADDCH(i+0x20);
+ }
+ i = ((pkt[3] << 2) | ((pkt[4] >> 6) & 3)) & 0x3f;
+ if (i) {
+ ADDCH(i+0x20);
+ }
+ i = pkt[4] & 0x3f;
+ if (i) {
+ ADDCH(i+0x20);
+ }
+ i = (pkt[5] >> 2) & 0x3f;
+ if (i) {
+ ADDCH(i+0x20);
+ }
+ i = ((pkt[5] << 4) | ((pkt[6] >> 4) & 0xf)) & 0x3f;
+ if (i) {
+ ADDCH(i+0x20);
+ }
+ ADDF("-%u QSO Nr %u", pkt[6] & 0xf, (pkt[0] << 6) | (pkt[1] >> 2));
+ pkt += 7;
+ len -= 7;
+ } else {
+ /*
+ * normal header
+ */
+ if (len < 15)
+ return 0;
+ if ((pkt[6] & 0x80) != (pkt[13] & 0x80)) {
+ v1 = 0;
+ cmd = (pkt[6] & 0x80);
+ }
+ ADDSTR("fm ");
+ for(i = 7; i < 13; i++)
+ if ((pkt[i] &0xfe) != 0x40) {
+ ADDCH(pkt[i] >> 1);
+ }
+ ADDF("-%u to ", (pkt[13] >> 1) & 0xf);
+ for(i = 0; i < 6; i++)
+ if ((pkt[i] &0xfe) != 0x40) {
+ ADDCH(pkt[i] >> 1);
+ }
+ ADDF("-%u", (pkt[6] >> 1) & 0xf);
+ pkt += 14;
+ len -= 14;
+ if ((!(pkt[-1] & 1)) && (len >= 7)) {
+ ADDSTR(" via ");
+ }
+ while ((!(pkt[-1] & 1)) && (len >= 7)) {
+ for(i = 0; i < 6; i++)
+ if ((pkt[i] &0xfe) != 0x40) {
+ ADDCH(pkt[i] >> 1);
+ }
+ ADDF("-%u", (pkt[6] >> 1) & 0xf);
+ pkt += 7;
+ len -= 7;
+ if ((!(pkt[-1] & 1)) && (len >= 7)) {
+ ADDCH(',');
+ }
+ }
+ }
+ if (!len) {
+ *p = 0;
+ return p - buf;
+ }
+ i = *pkt++;
+ len--;
+ j = v1 ? ((i & 0x10) ? '!' : ' ') :
+ ((i & 0x10) ? (cmd ? '+' : '-') : (cmd ? '^' : 'v'));
+ if (!(i & 1)) {
+ /*
+ * Info frame
+ */
+ ADDF(" I%u%u%c", (i >> 5) & 7, (i >> 1) & 7, j);
+ } else if (i & 2) {
+ /*
+ * U frame
+ */
+ switch (i & (~0x10)) {
+ case 0x03:
+ ADDF(" UI%c", j);
+ break;
+ case 0x2f:
+ ADDF(" SABM%c", j);
+ break;
+ case 0x43:
+ ADDF(" DISC%c", j);
+ break;
+ case 0x0f:
+ ADDF(" DM%c", j);
+ break;
+ case 0x63:
+ ADDF(" UA%c", j);
+ break;
+ case 0x87:
+ ADDF(" FRMR%c", j);
+ break;
+ default:
+ ADDF(" unknown U (0x%x)%c", i & (~0x10), j);
+ break;
+ }
+ } else {
+ /*
+ * supervisory
+ */
+ switch (i & 0xf) {
+ case 0x1:
+ ADDF(" RR%u%c", (i >> 5) & 7, j);
+ break;
+ case 0x5:
+ ADDF(" RNR%u%c", (i >> 5) & 7, j);
+ break;
+ case 0x9:
+ ADDF(" REJ%u%c", (i >> 5) & 7, j);
+ break;
+ default:
+ ADDF(" unknown S (0x%x)%u%c", i & 0xf, (i >> 5) & 7, j);
+ break;
+ }
+ }
+ if (!len) {
+ ADDCH('\n');
+ *p = 0;
+ return p - buf;
+ }
+ ADDF(" pid=%02X\n", *pkt++);
+ len--;
+ j = 0;
+ while (len) {
+ i = *pkt++;
+ if ((i >= 32) && (i < 128)) {
+ ADDCH(i);
+ }
+ else if (i == 13) {
+ if (j) {
+ ADDCH('\n');
+ }
+ j = 0;
+ } else {
+ ADDCH('.');
+ }
+ if (i >= 32)
+ j = 1;
+ len--;
+ }
+ if (j) {
+ ADDCH('\n');
+ }
+ *p = 0;
+ return p - buf;
+}
+
diff --git a/main/sppafsk_firmware.h b/main/sppafsk_firmware.h
new file mode 100644
index 0000000..78f6aeb
--- /dev/null
+++ b/main/sppafsk_firmware.h
@@ -0,0 +1,1551 @@
+/*****************************************************************************/
+
+/*
+ * sppafsk_firmware.h -- HDLC packet radio modem for EPP using FPGA utility.
+ *
+ * Copyright (C) 1998 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+/* automatically generated, do not edit */
+
+#define SPPAFSK_FIRMWAREDATE "19990628"
+
+/* firmware */
+static const unsigned char sppafsk_firmware[] = {
+ 0xff, 0x04, 0xe8, 0x8c, 0xf9, 0xfe, 0xff, 0xff,
+ 0xf5, 0xfd, 0xd7, 0xdb, 0xff, 0xbd, 0xfd, 0xff,
+ 0xff, 0xfe, 0xfe, 0xef, 0xef, 0xff, 0xfe, 0xfe,
+ 0xff, 0x9b, 0xff, 0xff, 0xaf, 0xfd, 0xfb, 0xfb,
+ 0xfe, 0xaf, 0xef, 0xff, 0xfe, 0xd7, 0xff, 0x7f,
+ 0xfd, 0xff, 0xd7, 0xff, 0x7f, 0xff, 0xe6, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf7,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xf8, 0xed, 0x9f,
+ 0xff, 0xfe, 0xf8, 0xed, 0x8f, 0x77, 0xfc, 0xf6,
+ 0xc7, 0x6f, 0x7f, 0xfc, 0xf6, 0xc7, 0xef, 0x6f,
+ 0xfe, 0xff, 0xd7, 0x5f, 0x7b, 0xfd, 0xf5, 0xd7,
+ 0x5f, 0x7f, 0xf5, 0xeb, 0xaf, 0xbf, 0xfe, 0xfa,
+ 0xeb, 0xaf, 0xbf, 0xfe, 0x9b, 0xff, 0x7f, 0xfd,
+ 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 0xbf,
+ 0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 0xeb,
+ 0xff, 0xc6, 0xff, 0x3f, 0xff, 0xfc, 0xf3, 0xcf,
+ 0x3f, 0xff, 0xfc, 0xf3, 0x9f, 0x7f, 0xfe, 0xf9,
+ 0xe7, 0x9f, 0x7f, 0xfe, 0xf9, 0xbf, 0xf9, 0xff,
+ 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff,
+ 0xfe, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdf,
+ 0x7f, 0xff, 0x6f, 0xfe, 0xff, 0xfb, 0xaf, 0xbf,
+ 0xfe, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfd, 0xd7,
+ 0xdf, 0x7f, 0xfd, 0xfd, 0xd7, 0xdf, 0xff, 0x9b,
+ 0xff, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe,
+ 0xfb, 0xef, 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xff, 0xc6, 0xff, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xef,
+ 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe,
+ 0xbf, 0xf9, 0xff, 0xdf, 0x7f, 0xff, 0xfd, 0xf7,
+ 0xdf, 0x7f, 0xff, 0xbd, 0xef, 0xbf, 0xff, 0xfe,
+ 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0x6f, 0xf4, 0xff,
+ 0xed, 0xb7, 0xdf, 0x7a, 0x7b, 0xed, 0xb6, 0xdf,
+ 0xfe, 0xf6, 0xdb, 0x6f, 0xbf, 0xfd, 0xf6, 0xdb,
+ 0x69, 0xff, 0x9b, 0xff, 0x7f, 0xff, 0xfd, 0xf7,
+ 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xbf, 0xff, 0xfe,
+ 0xfb, 0xef, 0xbf, 0xff, 0x7e, 0xfb, 0xff, 0xe6,
+ 0xff, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xdb, 0x77,
+ 0xff, 0x7d, 0xef, 0xbf, 0xef, 0xfe, 0xfb, 0xef,
+ 0xbf, 0xff, 0xfe, 0xbf, 0xf9, 0xff, 0xfc, 0xf3,
+ 0xcf, 0x3f, 0xdb, 0xfe, 0xfb, 0xcd, 0x7f, 0xfe,
+ 0xd9, 0xe7, 0x9f, 0x7f, 0xfe, 0xf9, 0xf7, 0xff,
+ 0x6f, 0xfe, 0xff, 0xfd, 0xe7, 0xdf, 0x77, 0xff,
+ 0xfd, 0xf7, 0x9f, 0xff, 0xfe, 0xfb, 0xef, 0xbf,
+ 0xff, 0xfe, 0xfb, 0xef, 0xff, 0x9b, 0xdd, 0xcf,
+ 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xf7, 0xfc,
+ 0xe7, 0x9f, 0x6b, 0xfe, 0xf9, 0xe6, 0x9f, 0x7f,
+ 0xfe, 0xdd, 0x66, 0xff, 0xef, 0xbf, 0xff, 0xfe,
+ 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xf7, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xb7, 0xf9,
+ 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xef, 0x5f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff,
+ 0xfc, 0xf7, 0xff, 0x6f, 0xfe, 0xbf, 0xfd, 0xf6,
+ 0xdb, 0x6f, 0xbf, 0xfd, 0xf7, 0xdb, 0xdf, 0x7e,
+ 0xfb, 0xad, 0xbf, 0xef, 0x7e, 0xfb, 0xaf, 0xff,
+ 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xbf, 0xff, 0xff, 0xff, 0xef, 0xfe, 0xff, 0xed,
+ 0xe7, 0xff, 0x7b, 0xff, 0xff, 0xe6, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xdf, 0x7f, 0xff, 0xff, 0xf7,
+ 0xff, 0xdf, 0xfe, 0xff, 0xfd, 0xff, 0xff, 0xff,
+ 0xff, 0xbf, 0xf9, 0xff, 0xff, 0x7f, 0xff, 0xdd,
+ 0xff, 0xff, 0xfb, 0xff, 0xbf, 0xff, 0xff, 0xff,
+ 0x9f, 0xff, 0xff, 0xff, 0xf3, 0xfb, 0x6f, 0xfe,
+ 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x9b, 0xff, 0x5f, 0xdf, 0xfd,
+ 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xbf, 0xff,
+ 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfa, 0xfb, 0xff,
+ 0xe6, 0xff, 0xbf, 0xff, 0xfe, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xbf, 0xfe, 0xfd, 0xff, 0xdf, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xff,
+ 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xff,
+ 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xfd,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9b, 0xff,
+ 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xdf,
+ 0xff, 0xfe, 0xfb, 0xef, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xbf, 0xff, 0xfe, 0xff, 0x7f, 0x7f, 0x7b,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf,
+ 0xf9, 0xff, 0xbf, 0x7f, 0x7f, 0xff, 0xfd, 0xff,
+ 0xff, 0xff, 0xff, 0xef, 0xef, 0xbf, 0xff, 0xfd,
+ 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xfb,
+ 0x7f, 0xff, 0xfb, 0xff, 0xff, 0xdf, 0x7d, 0xfd,
+ 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x9b, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff,
+ 0xbf, 0xff, 0xde, 0xb9, 0xcf, 0xff, 0xff, 0xfc,
+ 0xf7, 0xdf, 0xff, 0xff, 0xfd, 0xff, 0xe6, 0xff,
+ 0xff, 0x7e, 0xff, 0xf7, 0xfa, 0xd3, 0xaf, 0xbf,
+ 0xfd, 0x7c, 0xbf, 0xff, 0x7f, 0xfe, 0xf4, 0xff,
+ 0xdf, 0xff, 0xbf, 0xf9, 0xff, 0x5f, 0xbc, 0xff,
+ 0xfe, 0xff, 0xfb, 0xdf, 0xef, 0x3f, 0xff, 0xff,
+ 0xff, 0x7f, 0xef, 0xfb, 0xff, 0x9f, 0xff, 0x6f,
+ 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xef, 0xff, 0xff, 0xff, 0x9b, 0xff, 0xff, 0xff,
+ 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfe,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xe6, 0xff, 0xca, 0xaf, 0xbd, 0xfc, 0xff,
+ 0xab, 0xbf, 0xbf, 0xfe, 0xe5, 0xfb, 0x7f, 0x7f,
+ 0xfd, 0xf7, 0xff, 0x5f, 0xff, 0xbf, 0xf9, 0xff,
+ 0xfb, 0xff, 0xb7, 0xfd, 0xf7, 0x7b, 0xeb, 0xbf,
+ 0xff, 0xfd, 0xf7, 0xc7, 0x7f, 0x7f, 0xfd, 0xdf,
+ 0xd7, 0xff, 0x6f, 0xfe, 0x7f, 0xff, 0xff, 0xf7,
+ 0xff, 0xff, 0xfe, 0xfe, 0xef, 0xb7, 0xff, 0xfd,
+ 0xff, 0xdf, 0xdf, 0xbf, 0xff, 0xff, 0xff, 0x9b,
+ 0xfe, 0xbf, 0xe5, 0xc2, 0x2b, 0x3b, 0xff, 0xbf,
+ 0xfe, 0xff, 0xdf, 0xff, 0xff, 0xfd, 0xff, 0xdf,
+ 0x7f, 0xff, 0xfd, 0xbf, 0x66, 0xff, 0xfb, 0xec,
+ 0xa7, 0x5f, 0xfe, 0xff, 0xaf, 0xff, 0xff, 0xfd,
+ 0xff, 0xdf, 0x7b, 0xfd, 0xfd, 0xf7, 0xdf, 0xff,
+ 0xb7, 0xf9, 0xdf, 0x7e, 0xbb, 0xed, 0xa6, 0xcb,
+ 0x3b, 0xeb, 0xfc, 0xfd, 0xbd, 0xbc, 0xdc, 0xf3,
+ 0xaf, 0xad, 0xfc, 0xfa, 0xff, 0x6f, 0xd4, 0xd7,
+ 0x5e, 0x7b, 0xed, 0xed, 0xff, 0xff, 0x7a, 0xfe,
+ 0xdd, 0x7f, 0xbf, 0xfd, 0xf6, 0xdb, 0xff, 0x3d,
+ 0xfd, 0x5f, 0x99, 0xfb, 0xbf, 0xd9, 0x66, 0x9b,
+ 0x78, 0xff, 0x9f, 0xfe, 0xfb, 0x9e, 0xfe, 0xdf,
+ 0x7f, 0xfe, 0xf9, 0x7f, 0xff, 0xfd, 0xef, 0x66,
+ 0xfe, 0x7b, 0xe5, 0x95, 0x67, 0xde, 0xb9, 0xf1,
+ 0xda, 0x7f, 0xed, 0x7a, 0xff, 0xdd, 0x57, 0x5c,
+ 0x73, 0xdf, 0xbd, 0xb3, 0xb1, 0xff, 0x5e, 0x7b,
+ 0xef, 0xbd, 0xbf, 0xfb, 0xeb, 0x2f, 0x6f, 0xed,
+ 0xfd, 0xf7, 0xff, 0xff, 0xfd, 0xfd, 0xdf, 0xf7,
+ 0x66, 0xec, 0xff, 0xb6, 0xdb, 0x6f, 0xaf, 0xbf,
+ 0xff, 0xfb, 0xdb, 0xdf, 0x7c, 0xff, 0xf7, 0xff,
+ 0xdf, 0xff, 0xfd, 0xfd, 0xbf, 0x99, 0xf7, 0xef,
+ 0xbf, 0xef, 0xbe, 0xff, 0xfe, 0xfb, 0x6f, 0x37,
+ 0xbb, 0xfd, 0xb7, 0xff, 0x7f, 0xfe, 0xed, 0xb7,
+ 0xdf, 0xf6, 0xe6, 0xfd, 0xfb, 0xef, 0xb3, 0xcf,
+ 0x3a, 0xff, 0xf7, 0xf7, 0xdf, 0xff, 0xfb, 0xfb,
+ 0xff, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbd, 0xb1,
+ 0xff, 0xfa, 0xeb, 0xaf, 0xff, 0x5e, 0x5b, 0x6d,
+ 0xb6, 0xcf, 0xf9, 0xf7, 0xdd, 0x7f, 0x9f, 0xdd,
+ 0xf7, 0xd9, 0xf6, 0x66, 0xe6, 0xbf, 0xff, 0xfe,
+ 0xfb, 0xff, 0xdf, 0x7f, 0xbf, 0xfd, 0xfb, 0xbf,
+ 0xff, 0xfe, 0xff, 0xe7, 0xff, 0x7f, 0xff, 0x3f,
+ 0x9b, 0xfb, 0xef, 0xbf, 0xfd, 0xf6, 0xff, 0xfe,
+ 0xef, 0xbf, 0xff, 0xff, 0xfd, 0xdf, 0xff, 0xff,
+ 0xfd, 0xff, 0xff, 0xff, 0xef, 0xe6, 0xfe, 0x7f,
+ 0xff, 0xf5, 0xd7, 0xdf, 0xff, 0xbf, 0xff, 0xfa,
+ 0xe5, 0xd7, 0x7f, 0x7f, 0xff, 0xff, 0xfb, 0x5f,
+ 0xff, 0xbb, 0x79, 0xdf, 0x6f, 0xbf, 0xfd, 0xf6,
+ 0xfb, 0xf7, 0xdb, 0xa7, 0x7f, 0xf5, 0xe5, 0xbb,
+ 0xdf, 0xfe, 0xfb, 0xef, 0x97, 0x7f, 0x6f, 0xfe,
+ 0xff, 0xcf, 0x3a, 0xeb, 0xac, 0xbf, 0xff, 0xfb,
+ 0xcb, 0xdf, 0xf7, 0xfd, 0xf6, 0xdf, 0xef, 0x7f,
+ 0xfd, 0xfe, 0xff, 0x9b, 0xff, 0xff, 0x8f, 0x2e,
+ 0x7a, 0xe8, 0xf3, 0x8f, 0x3e, 0xfa, 0xdc, 0x47,
+ 0x9f, 0x7f, 0xf6, 0xf9, 0x43, 0x9f, 0x7f, 0xfe,
+ 0xe6, 0xff, 0xeb, 0xaf, 0xbf, 0x7e, 0xfa, 0xfb,
+ 0xbf, 0xbf, 0xfe, 0xf5, 0xdf, 0x7f, 0x7f, 0xff,
+ 0xff, 0xd3, 0x5f, 0xff, 0xbf, 0xf9, 0xff, 0xfa,
+ 0xeb, 0xaa, 0xbf, 0xfe, 0xfb, 0xfb, 0xef, 0x7f,
+ 0xfd, 0xfd, 0xff, 0xdf, 0xff, 0xfd, 0xf5, 0xdf,
+ 0xff, 0x6f, 0xfe, 0xbf, 0xfa, 0xef, 0xbf, 0xfd,
+ 0xbe, 0xff, 0xfb, 0xeb, 0x5f, 0xfd, 0xfd, 0xf7,
+ 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x9b, 0xff,
+ 0xaf, 0xff, 0xef, 0xff, 0xff, 0xbf, 0xbf, 0xff,
+ 0xfa, 0xdb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfb,
+ 0xff, 0xff, 0xff, 0xe6, 0xff, 0x7f, 0xff, 0xff,
+ 0xff, 0xf4, 0xd3, 0x4f, 0x2d, 0xfd, 0xe4, 0xaf,
+ 0xf7, 0x7f, 0xf9, 0xe5, 0xff, 0x5f, 0xfe, 0xbf,
+ 0xf9, 0xff, 0xaf, 0xbf, 0xfe, 0xba, 0xeb, 0x2f,
+ 0xbf, 0xea, 0x32, 0xd7, 0x1f, 0x7f, 0xdd, 0x75,
+ 0x57, 0x5f, 0x77, 0xfd, 0x6f, 0xfe, 0xff, 0xfb,
+ 0xef, 0xff, 0xff, 0x7f, 0xff, 0x7d, 0xff, 0xfe,
+ 0xeb, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff,
+ 0xff, 0x1b, 0xff, 0x7f, 0xff, 0xef, 0xbf, 0xfd,
+ 0xfa, 0xfb, 0xfd, 0xf7, 0xff, 0xfb, 0xfe, 0x7f,
+ 0xff, 0xff, 0xef, 0xef, 0xff, 0x7f, 0xe6, 0xff,
+ 0x7f, 0xff, 0xfd, 0xf7, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0x9f, 0xf9, 0xff, 0x3b, 0xd3, 0xcd,
+ 0x3f, 0xff, 0xf8, 0xe3, 0x8f, 0x7f, 0x78, 0xf1,
+ 0xff, 0x5f, 0x7f, 0xb4, 0xfd, 0xc6, 0xff, 0x6f,
+ 0xfc, 0xbf, 0xbb, 0xff, 0xfe, 0xfb, 0x7f, 0xff,
+ 0xff, 0xf7, 0xba, 0x7f, 0xff, 0xff, 0xaf, 0xff,
+ 0xdf, 0xfb, 0x7f, 0xff, 0x99, 0xff, 0xff, 0xff,
+ 0xfe, 0xfb, 0xe7, 0xbd, 0xbb, 0xdc, 0xfb, 0xdb,
+ 0x7f, 0xff, 0xff, 0xa7, 0xd7, 0xff, 0x7f, 0xfc,
+ 0xff, 0xc6, 0xff, 0xff, 0xcf, 0x3f, 0xf9, 0xf6,
+ 0xd3, 0x8f, 0x3b, 0xf6, 0xf8, 0xe7, 0xdf, 0x7f,
+ 0xfc, 0xb1, 0xbf, 0xff, 0xff, 0xbf, 0xf9, 0xff,
+ 0xdf, 0xfb, 0xe1, 0xf3, 0xf6, 0xfb, 0xff, 0xf7,
+ 0x7f, 0xff, 0xfd, 0xf7, 0xfd, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xff, 0x7e,
+ 0xef, 0x3f, 0x59, 0xff, 0xff, 0xff, 0xef, 0xff,
+ 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x99,
+ 0xff, 0xff, 0xf7, 0xf7, 0xff, 0xfb, 0x6f, 0xff,
+ 0xfb, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xdf, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xff, 0xf7,
+ 0xaf, 0xfe, 0xbf, 0xeb, 0xae, 0xbb, 0xf6, 0xf7,
+ 0x53, 0x7b, 0xff, 0xdd, 0xf7, 0xff, 0x4f, 0xbf,
+ 0xbf, 0xf9, 0xff, 0xf7, 0xde, 0x7b, 0xef, 0xbd,
+ 0xfb, 0xab, 0xaa, 0xef, 0xee, 0xff, 0x47, 0x1f,
+ 0x7f, 0xfc, 0xff, 0xde, 0xff, 0x6f, 0xfe, 0xff,
+ 0xfb, 0xef, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xfb, 0xff, 0x1b, 0xfe, 0xff, 0xff, 0xff, 0xfe,
+ 0xff, 0xbf, 0xff, 0xff, 0xc7, 0xdf, 0x7e, 0xff,
+ 0xfd, 0xf7, 0xdf, 0xdf, 0xff, 0xfd, 0x3f, 0x66,
+ 0xff, 0xff, 0xbf, 0xbf, 0xfe, 0xff, 0xef, 0xff,
+ 0xff, 0xfb, 0xff, 0xff, 0xff, 0x7f, 0xef, 0xfd,
+ 0xf7, 0xdf, 0xff, 0xb7, 0xf9, 0xff, 0x7f, 0x7d,
+ 0xef, 0xbd, 0xcf, 0x3f, 0xfb, 0xb9, 0xf3, 0x3f,
+ 0xb7, 0xff, 0xf9, 0xe7, 0xff, 0xb7, 0xdf, 0xff,
+ 0x6f, 0xd6, 0xff, 0xdf, 0x7f, 0xeb, 0xfc, 0xf3,
+ 0x9f, 0x7e, 0xef, 0xfc, 0x67, 0xbf, 0xff, 0xf7,
+ 0xdf, 0xef, 0xfd, 0xfd, 0x5f, 0x9b, 0xfb, 0xff,
+ 0xef, 0x1d, 0x7e, 0xfd, 0x6f, 0xdf, 0x1f, 0xff,
+ 0xfd, 0x6d, 0x97, 0xbd, 0xf6, 0xdb, 0xc3, 0x7f,
+ 0xdf, 0xee, 0x66, 0xfe, 0xff, 0xff, 0xfe, 0x7b,
+ 0xbf, 0xcd, 0xf1, 0xfe, 0x2b, 0xdd, 0x73, 0xed,
+ 0x3d, 0x37, 0x5c, 0x73, 0xff, 0xad, 0xb3, 0xb1,
+ 0xff, 0xff, 0xdf, 0xbf, 0xaf, 0xfc, 0xf6, 0xef,
+ 0xef, 0xff, 0x7f, 0xf7, 0xdf, 0x77, 0xff, 0xfd,
+ 0xf7, 0xf7, 0xff, 0x66, 0xee, 0xff, 0xff, 0xf7,
+ 0xeb, 0xaf, 0xff, 0xfc, 0xfe, 0xeb, 0xff, 0x7f,
+ 0xff, 0xff, 0xf7, 0xdf, 0xff, 0xfd, 0xff, 0xbf,
+ 0x9b, 0xf7, 0xff, 0xff, 0xcd, 0xff, 0xff, 0xff,
+ 0xdb, 0xff, 0xff, 0xfb, 0xed, 0xb7, 0xdf, 0x7e,
+ 0xfb, 0xfd, 0xb7, 0xdf, 0xf6, 0xe6, 0xfd, 0xff,
+ 0x7f, 0xf7, 0x9f, 0xff, 0x9f, 0xfd, 0xff, 0xff,
+ 0xff, 0xfc, 0xf3, 0xef, 0x3f, 0xff, 0xfb, 0xfb,
+ 0xcf, 0xbd, 0xb1, 0xff, 0x7b, 0xed, 0xb4, 0xdf,
+ 0x76, 0xe3, 0xec, 0xbf, 0xd7, 0xfd, 0xf7, 0xdb,
+ 0x67, 0xbf, 0xfd, 0xf7, 0xdd, 0xfe, 0x66, 0xe6,
+ 0xff, 0xff, 0xff, 0xff, 0xfe, 0xdb, 0x6f, 0xff,
+ 0xfd, 0xff, 0xbf, 0xdf, 0x7f, 0xff, 0xfd, 0xff,
+ 0xff, 0xff, 0x3f, 0x9b, 0xfb, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xfb, 0xfb, 0xbf, 0xff, 0xff, 0xfb,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef,
+ 0xa6, 0xfe, 0xff, 0x2f, 0xff, 0xfe, 0xef, 0x9d,
+ 0xb7, 0x9f, 0xff, 0xf5, 0xdf, 0x5f, 0x7f, 0xfd,
+ 0xf5, 0xff, 0xdf, 0xff, 0xab, 0x79, 0xff, 0xff,
+ 0xe9, 0x67, 0xff, 0xfd, 0xe7, 0xdb, 0x7f, 0x7f,
+ 0xf5, 0xe5, 0x93, 0x5f, 0x3e, 0xf9, 0xee, 0xb7,
+ 0x7f, 0x6f, 0xfe, 0xff, 0xff, 0xfa, 0xff, 0x7f,
+ 0x9f, 0xfc, 0xfb, 0xfb, 0x5f, 0xf7, 0xff, 0xff,
+ 0xff, 0xff, 0x7f, 0xfd, 0xf7, 0xff, 0x9b, 0xff,
+ 0xff, 0x8f, 0x1e, 0xff, 0xfc, 0xb3, 0x8f, 0x3f,
+ 0x3f, 0xd4, 0xe7, 0x9f, 0x7f, 0xfe, 0xf9, 0x47,
+ 0x9f, 0x7d, 0xfe, 0xe6, 0xff, 0xff, 0xaf, 0xd7,
+ 0xfe, 0xfb, 0xff, 0xbf, 0xbf, 0x4f, 0xf5, 0xd7,
+ 0x5f, 0x7f, 0xfd, 0xf5, 0xd7, 0xdf, 0xff, 0xbf,
+ 0xf9, 0xff, 0xff, 0xeb, 0xef, 0xbf, 0xff, 0xff,
+ 0xeb, 0xff, 0xef, 0xfd, 0xf5, 0xdf, 0x7f, 0xff,
+ 0xfd, 0xf5, 0xf7, 0xff, 0x6f, 0xfe, 0xff, 0xff,
+ 0xfb, 0xfb, 0xbf, 0xbf, 0xfa, 0xfa, 0xfb, 0x5f,
+ 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x9b, 0xff, 0xff, 0xbf, 0xde, 0xfe, 0xfb,
+ 0xaf, 0xbf, 0xfe, 0x7f, 0xd7, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff,
+ 0xbf, 0x4f, 0xff, 0xdf, 0xf6, 0xda, 0x6f, 0xbf,
+ 0xfd, 0xef, 0xa7, 0xbf, 0xfe, 0xfa, 0xcb, 0xf7,
+ 0x5f, 0xfe, 0xbf, 0xe9, 0xff, 0xaf, 0xb7, 0xfe,
+ 0xba, 0xeb, 0xaf, 0xbb, 0xee, 0xba, 0xd7, 0x5b,
+ 0x7d, 0xfd, 0xd5, 0x57, 0x5c, 0x7f, 0xed, 0x6b,
+ 0xfe, 0xff, 0xff, 0xff, 0xff, 0xef, 0x3f, 0xff,
+ 0xbe, 0xcb, 0xdf, 0xff, 0xdf, 0xff, 0xff, 0xfb,
+ 0xf7, 0xdf, 0xfb, 0xff, 0x1b, 0xff, 0xff, 0xff,
+ 0xf7, 0xff, 0xff, 0xf6, 0xff, 0xff, 0xee, 0xfe,
+ 0xff, 0xfb, 0xef, 0xbf, 0xfb, 0xff, 0xbf, 0xff,
+ 0x7f, 0x66, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0xff,
+ 0xff, 0xff, 0xff, 0xfe, 0xff, 0xfb, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff,
+ 0x1f, 0xbf, 0xed, 0x2f, 0xf6, 0xea, 0xbb, 0x7f,
+ 0x7e, 0xfb, 0xe7, 0x83, 0x1f, 0x7f, 0xbc, 0xf5,
+ 0xd7, 0xff, 0x6f, 0xfe, 0xff, 0xbf, 0xff, 0xef,
+ 0xff, 0xbf, 0xfd, 0xfb, 0xff, 0x7f, 0xff, 0xd6,
+ 0xfd, 0xf7, 0xdf, 0xd7, 0xfc, 0xeb, 0xff, 0x9b,
+ 0xff, 0x9f, 0xff, 0xf6, 0xf7, 0xfb, 0xbf, 0xff,
+ 0xf6, 0xb9, 0xde, 0xfd, 0xfb, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xdd, 0xff, 0xe6, 0xff, 0xff, 0xef,
+ 0xfb, 0xff, 0xef, 0xd3, 0x8f, 0xbf, 0x7d, 0xfc,
+ 0xd6, 0xdf, 0x73, 0xfd, 0xfd, 0xd7, 0xdf, 0xff,
+ 0xbf, 0xf9, 0xff, 0xff, 0xdb, 0xff, 0xe3, 0xf7,
+ 0xfb, 0xfd, 0xbf, 0x3f, 0xeb, 0xff, 0xdf, 0xef,
+ 0xfd, 0xfd, 0xff, 0x9b, 0xef, 0x6f, 0xfe, 0xff,
+ 0xef, 0x2f, 0xfe, 0xf7, 0xde, 0xff, 0xff, 0xff,
+ 0x9f, 0x7f, 0xf4, 0xbe, 0x7f, 0xfd, 0xdb, 0xff,
+ 0x9e, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xbf, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xbf, 0xbf, 0xbf, 0xff,
+ 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6,
+ 0xff, 0xeb, 0xfb, 0xff, 0xfb, 0xbf, 0xeb, 0xfe,
+ 0xfa, 0xfe, 0xfb, 0x9f, 0xef, 0xff, 0xbd, 0xfe,
+ 0x9b, 0x5f, 0xff, 0xbf, 0xf1, 0xff, 0xfb, 0x7f,
+ 0xff, 0xef, 0xf7, 0xdb, 0xeb, 0x9f, 0xf7, 0x7b,
+ 0xb7, 0xdf, 0x7f, 0xfb, 0xfd, 0xf7, 0xd7, 0xff,
+ 0x67, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xfa, 0xff, 0xef, 0xff, 0x7f, 0xfd, 0xf7, 0xd7,
+ 0x7f, 0x7f, 0xfd, 0xff, 0xff, 0x9b, 0xfe, 0xef,
+ 0xbd, 0xfe, 0xfe, 0xfb, 0xef, 0xbf, 0x9e, 0x7b,
+ 0x56, 0xff, 0xcd, 0xf7, 0x9f, 0xff, 0xf3, 0xfd,
+ 0xfd, 0xbf, 0x66, 0xff, 0xfb, 0xbf, 0xff, 0xff,
+ 0xfe, 0xef, 0xff, 0xb3, 0x5e, 0xfd, 0x97, 0x4b,
+ 0x67, 0xfd, 0xf5, 0xd2, 0xff, 0xfb, 0xb7, 0xf9,
+ 0xff, 0x3e, 0xeb, 0xef, 0xe7, 0xff, 0x7e, 0xea,
+ 0xb5, 0x7f, 0xa5, 0xf5, 0x56, 0x5b, 0x6d, 0xbd,
+ 0xd5, 0xdf, 0xff, 0x6f, 0xd4, 0xbf, 0xff, 0xfb,
+ 0xff, 0xff, 0xff, 0xde, 0x3f, 0xef, 0x5f, 0xaf,
+ 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xff, 0xff, 0x5f,
+ 0x99, 0xfb, 0xff, 0xbd, 0x5e, 0xde, 0x79, 0xff,
+ 0x8b, 0x6e, 0x73, 0xf5, 0x4a, 0x7b, 0xdd, 0xf4,
+ 0xd7, 0x4d, 0x7b, 0xfd, 0xef, 0x66, 0xfe, 0x7f,
+ 0xbf, 0xfe, 0x37, 0xde, 0xbf, 0xf6, 0x9e, 0x6b,
+ 0x5f, 0xfb, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xee,
+ 0xbd, 0xb3, 0xb1, 0xff, 0xff, 0xeb, 0xef, 0xef,
+ 0xf7, 0xff, 0xff, 0xfb, 0x7f, 0xbf, 0xbe, 0xff,
+ 0xff, 0xff, 0xbf, 0xbf, 0xd5, 0xf7, 0x66, 0xec,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa,
+ 0xdf, 0x7f, 0x79, 0xed, 0xb5, 0xd7, 0x5e, 0x0b,
+ 0xed, 0xff, 0xbf, 0x99, 0xf7, 0xff, 0xdb, 0xff,
+ 0xff, 0xff, 0xff, 0xf3, 0xcf, 0xbf, 0xbb, 0xdf,
+ 0x77, 0xdf, 0x7d, 0xf7, 0xfd, 0xf7, 0xff, 0xf7,
+ 0xe6, 0xfd, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff,
+ 0xfd, 0xe7, 0x5d, 0xcd, 0xf7, 0xd9, 0x65, 0x97,
+ 0x5d, 0xf6, 0xf9, 0xff, 0xbd, 0xb1, 0xff, 0xfb,
+ 0xec, 0xb5, 0xdf, 0xfe, 0xfb, 0x6c, 0x3f, 0x7b,
+ 0xb9, 0xf4, 0xd3, 0x4f, 0x7f, 0xfd, 0xf4, 0xdb,
+ 0xef, 0x66, 0xe6, 0xff, 0x3f, 0xff, 0xfd, 0xf3,
+ 0xff, 0x6f, 0xff, 0xff, 0xdf, 0x7f, 0xdb, 0xec,
+ 0xb1, 0xdf, 0x36, 0x7b, 0x7f, 0x3f, 0x9b, 0xfb,
+ 0xff, 0xf7, 0xef, 0xbf, 0xff, 0xff, 0xf7, 0xff,
+ 0xff, 0x7f, 0xdf, 0x6e, 0xbb, 0xed, 0xb7, 0xdd,
+ 0xfe, 0xff, 0xef, 0xe6, 0xfe, 0xfb, 0xf7, 0xbf,
+ 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xdb, 0x8f, 0xd7,
+ 0x5a, 0x6b, 0xad, 0xb5, 0xd6, 0xfe, 0xff, 0xbb,
+ 0x79, 0xff, 0xee, 0xdf, 0xbf, 0xfe, 0xfa, 0xf6,
+ 0xcf, 0xef, 0xff, 0xb3, 0xdf, 0x7f, 0xfd, 0xf5,
+ 0xd7, 0xdf, 0x9b, 0x7f, 0x6f, 0xfe, 0xf7, 0xff,
+ 0xff, 0xfb, 0xee, 0xdb, 0xff, 0xff, 0xfd, 0xf7,
+ 0xfd, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xdf, 0xff,
+ 0xff, 0x9b, 0xff, 0xff, 0xcf, 0x3f, 0xbb, 0xec,
+ 0xf2, 0xcf, 0x3e, 0xf2, 0xfc, 0x45, 0x0f, 0x7d,
+ 0xf4, 0xd1, 0x47, 0x8f, 0x7d, 0xfe, 0xe6, 0xff,
+ 0xfb, 0xbf, 0xff, 0xff, 0xff, 0xfb, 0xef, 0xff,
+ 0xff, 0xe5, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff,
+ 0x6f, 0xff, 0xbf, 0xf9, 0xff, 0xfe, 0xfb, 0xff,
+ 0xeb, 0xaf, 0xfe, 0xef, 0xaf, 0x7f, 0x79, 0xf5,
+ 0xd6, 0x5f, 0x7f, 0xfd, 0xf5, 0xf7, 0xff, 0x6f,
+ 0xfe, 0xff, 0xfb, 0xfb, 0xbf, 0xff, 0xfe, 0xff,
+ 0xfe, 0xef, 0x5f, 0x75, 0xf5, 0xd5, 0x57, 0x5f,
+ 0x7d, 0xb5, 0xf7, 0xff, 0x9b, 0xff, 0xff, 0xbf,
+ 0xff, 0xbf, 0xff, 0xfe, 0xff, 0xfe, 0xfb, 0xd7,
+ 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff,
+ 0xff, 0xe6, 0xff, 0x5b, 0x2f, 0xbf, 0xfd, 0xf6,
+ 0xff, 0xef, 0xff, 0xfc, 0xec, 0xf7, 0x9f, 0xfe,
+ 0x6a, 0xc9, 0xa7, 0x5f, 0xfe, 0xbb, 0xf9, 0xff,
+ 0xad, 0xb7, 0xde, 0x5a, 0xeb, 0xaf, 0xba, 0x7c,
+ 0x2a, 0xd7, 0x1d, 0x6f, 0xfd, 0xd5, 0x57, 0x5f,
+ 0x7b, 0xed, 0x6f, 0xfe, 0xbf, 0xfb, 0xff, 0x7b,
+ 0xe7, 0xfe, 0xff, 0xff, 0xff, 0xde, 0xff, 0xff,
+ 0xdf, 0xfe, 0xbf, 0xff, 0x9e, 0xfb, 0xff, 0x1b,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xdf,
+ 0xbf, 0xef, 0xfd, 0xf7, 0xef, 0x9f, 0xff, 0xfb,
+ 0xef, 0xfb, 0xff, 0x7f, 0xe6, 0xff, 0xff, 0xf7,
+ 0xfe, 0xfb, 0xef, 0xff, 0xf7, 0xdf, 0xaf, 0xff,
+ 0x7f, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xfb,
+ 0x9f, 0xf9, 0xff, 0xff, 0xfb, 0xaf, 0xbf, 0xee,
+ 0xef, 0xef, 0xef, 0x6f, 0x7d, 0x37, 0xf7, 0x9f,
+ 0x5b, 0xb8, 0xf7, 0xd7, 0xff, 0x67, 0xfc, 0xff,
+ 0xbf, 0xf7, 0xef, 0xbf, 0xff, 0xfb, 0xfe, 0xde,
+ 0xdc, 0xbe, 0xff, 0xef, 0xfb, 0xbf, 0xf7, 0xff,
+ 0xab, 0xff, 0x99, 0xff, 0xff, 0xff, 0xff, 0xfe,
+ 0xfb, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xdd, 0xb7,
+ 0xed, 0x7f, 0xff, 0xdf, 0xff, 0xdf, 0x7f, 0xc6,
+ 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xfe, 0xff,
+ 0xff, 0xff, 0xef, 0xff, 0xdf, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xdf, 0xff, 0xff,
+ 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x8f,
+ 0xbf, 0x9f, 0xff, 0xfb, 0xff, 0xdf, 0xff, 0xfe,
+ 0x6f, 0x7e, 0xff, 0xef, 0xdf, 0xff, 0xff, 0xff,
+ 0xff, 0xef, 0xeb, 0xff, 0xff, 0xff, 0x7f, 0xff,
+ 0xff, 0xff, 0xff, 0x7f, 0xef, 0x9b, 0xff, 0xff,
+ 0xfd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xef, 0xdf,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xe6, 0xff, 0xeb, 0xb7, 0xff, 0xfe,
+ 0xfb, 0xef, 0xbf, 0xdf, 0xfe, 0xff, 0xfc, 0xff,
+ 0xff, 0xfd, 0xf7, 0xdb, 0xef, 0xff, 0xbf, 0xf9,
+ 0xff, 0xfb, 0xe7, 0x17, 0x5f, 0xfe, 0xf9, 0x7d,
+ 0xff, 0xfb, 0x7d, 0xf6, 0xff, 0x5f, 0x77, 0xfd,
+ 0xf5, 0xdf, 0xff, 0x6f, 0xbe, 0xff, 0xfe, 0xfd,
+ 0xf7, 0xdf, 0x7f, 0xff, 0xfe, 0xfb, 0xbf, 0xff,
+ 0xbe, 0xff, 0xf7, 0xdf, 0x7f, 0xff, 0xf7, 0xff,
+ 0x1b, 0xfe, 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0x6c,
+ 0xfe, 0xf5, 0xe7, 0xff, 0xf9, 0xfc, 0xf7, 0xf7,
+ 0x54, 0x5f, 0x7d, 0xf5, 0x3f, 0x66, 0xff, 0xfb,
+ 0xef, 0xbf, 0xff, 0x7e, 0xfa, 0xff, 0xf3, 0xfd,
+ 0xff, 0xff, 0xff, 0x7d, 0x3f, 0xff, 0x7f, 0xff,
+ 0xfd, 0xb7, 0xf9, 0xdf, 0x7e, 0xfb, 0xed, 0xb7,
+ 0xdf, 0xeb, 0xff, 0x7f, 0xff, 0xeb, 0xcf, 0xda,
+ 0xda, 0xef, 0xb7, 0xff, 0xfe, 0xff, 0x6f, 0xd6,
+ 0xd7, 0x5e, 0x7b, 0xed, 0xb5, 0xd7, 0xfe, 0xff,
+ 0xf7, 0xbf, 0xfd, 0xb6, 0xf7, 0xda, 0x4b, 0x2f,
+ 0xbd, 0xf4, 0x5f, 0x9b, 0xfb, 0xbf, 0xdb, 0x6e,
+ 0x7b, 0xed, 0xe5, 0xff, 0xff, 0xe7, 0xff, 0xff,
+ 0x5e, 0xff, 0x37, 0xd3, 0x4d, 0x2f, 0xad, 0xee,
+ 0x66, 0xfa, 0xbb, 0xe6, 0xbe, 0x6b, 0xae, 0xb9,
+ 0xff, 0xff, 0xfd, 0xff, 0xbf, 0xdf, 0x7d, 0xaf,
+ 0x7e, 0xfb, 0xeb, 0xb3, 0xb3, 0xb1, 0xff, 0xfe,
+ 0xfb, 0xef, 0xbf, 0xff, 0xdb, 0xff, 0xf5, 0xf7,
+ 0xfb, 0xbf, 0xdf, 0xdf, 0xef, 0xff, 0xff, 0xff,
+ 0xff, 0x66, 0xe6, 0xff, 0xfe, 0xfb, 0xef, 0xbf,
+ 0xff, 0xfe, 0x3f, 0xff, 0xfb, 0xae, 0xff, 0xf7,
+ 0xdf, 0x52, 0x7b, 0xed, 0xb5, 0xbf, 0x9b, 0xf5,
+ 0xef, 0xbf, 0xef, 0xbe, 0xfb, 0xfe, 0xfb, 0xff,
+ 0xb7, 0xbb, 0xff, 0xf6, 0xdf, 0x7d, 0xf5, 0xdd,
+ 0x77, 0xdf, 0xf7, 0xe6, 0xfd, 0xfb, 0xef, 0xb3,
+ 0xcf, 0x3e, 0xfb, 0xfc, 0xf7, 0x1f, 0xff, 0xfe,
+ 0x6b, 0xe7, 0x9f, 0x5f, 0x7e, 0xf9, 0xe7, 0xbd,
+ 0xb1, 0xff, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe, 0xfa,
+ 0xef, 0xb3, 0xdd, 0x7d, 0x76, 0xdf, 0x4f, 0x3f,
+ 0xbd, 0xf4, 0xd2, 0xff, 0x66, 0xe6, 0xbf, 0xff,
+ 0xfe, 0xfb, 0xef, 0xbf, 0x7f, 0xbf, 0xfd, 0xf3,
+ 0xb7, 0xff, 0xff, 0xb1, 0xc7, 0x3e, 0xfb, 0xed,
+ 0x3f, 0x9b, 0xfb, 0xef, 0xbf, 0xfd, 0xf6, 0xdb,
+ 0x6f, 0xef, 0xdf, 0xff, 0xfe, 0xfb, 0xff, 0x7f,
+ 0xed, 0xb6, 0xdd, 0x7e, 0xfb, 0xef, 0xa6, 0xfe,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xbf,
+ 0xf8, 0xcd, 0x17, 0xff, 0xfb, 0xed, 0xb7, 0xdf,
+ 0x7e, 0xfb, 0xab, 0x61, 0xff, 0xf7, 0xdd, 0x77,
+ 0xdf, 0xfd, 0xf7, 0xcf, 0x2f, 0xdf, 0xf9, 0xe5,
+ 0x7f, 0xdf, 0x6d, 0xd7, 0x5d, 0x77, 0x7f, 0x63,
+ 0xfe, 0xdf, 0xff, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe,
+ 0xfe, 0xef, 0xfe, 0xfd, 0xbb, 0xf5, 0xf7, 0xdf,
+ 0x7f, 0xff, 0x7d, 0xff, 0x9a, 0xff, 0xff, 0x8b,
+ 0x3e, 0xfa, 0xe8, 0xa3, 0xcf, 0x3e, 0xf2, 0xdc,
+ 0xe7, 0x1f, 0x3d, 0xf6, 0xd8, 0x67, 0x9f, 0x7d,
+ 0xbe, 0xe6, 0xff, 0xeb, 0xae, 0xbf, 0xfe, 0xfa,
+ 0xeb, 0xef, 0xff, 0xff, 0xfd, 0xdf, 0x5f, 0x3f,
+ 0xff, 0xfc, 0xf7, 0xdf, 0xff, 0xbf, 0xf9, 0xff,
+ 0xfa, 0xea, 0xaf, 0xbf, 0xfe, 0xfa, 0xff, 0xff,
+ 0xff, 0xfd, 0xf5, 0xd7, 0x7b, 0xff, 0xfd, 0xf7,
+ 0xdf, 0xff, 0x6f, 0xfe, 0xbf, 0xfe, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xfe, 0xff, 0xdf, 0xff, 0xff,
+ 0xdf, 0x5f, 0x7b, 0xfd, 0xf5, 0xd7, 0xff, 0x1b,
+ 0xf6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xfe, 0xfb, 0xdf, 0x7f, 0xff, 0xbf, 0xfd, 0xf7,
+ 0xdf, 0x7f, 0xff, 0x3f, 0xe6, 0xfd, 0xbf, 0xff,
+ 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xbf,
+ 0xfe, 0xff, 0xfe, 0xfa, 0xfd, 0xf7, 0x5f, 0xf8,
+ 0xbf, 0xa9, 0xff, 0xaf, 0xbe, 0xfe, 0xfa, 0xeb,
+ 0xaf, 0xbf, 0xfe, 0xba, 0x57, 0x5f, 0x7f, 0xfc,
+ 0x35, 0xd7, 0x5f, 0x75, 0xed, 0x6b, 0xfe, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xbd, 0x7f, 0xff, 0xfd,
+ 0x7f, 0xfe, 0xfd, 0xe5, 0xff, 0xed, 0xff, 0xf8,
+ 0xc7, 0xff, 0x1b, 0xff, 0xfb, 0xff, 0xff, 0x7f,
+ 0xff, 0xff, 0xff, 0xfb, 0x7f, 0xef, 0xfb, 0x7d,
+ 0xfd, 0xbf, 0xff, 0xdf, 0x7f, 0xfd, 0x7f, 0xe6,
+ 0xff, 0xdf, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff,
+ 0xff, 0xd5, 0x7b, 0xef, 0xfd, 0xdd, 0x7f, 0xff,
+ 0xde, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xfe, 0xef,
+ 0xcf, 0xff, 0xfe, 0xfb, 0xcb, 0x2f, 0x7f, 0xfc,
+ 0xf7, 0xde, 0x57, 0x5f, 0xfc, 0xf4, 0xd7, 0xfd,
+ 0x6f, 0xfe, 0xff, 0xbd, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xf7, 0xda, 0xbf, 0x7f, 0xbf, 0xff, 0x37,
+ 0xff, 0xff, 0xdd, 0xf7, 0xff, 0x9b, 0xff, 0xff,
+ 0xbf, 0xef, 0xbf, 0xfb, 0xef, 0x9f, 0xfd, 0xff,
+ 0xdb, 0xfa, 0x7e, 0xf7, 0xbf, 0xc7, 0x5f, 0x7f,
+ 0xff, 0xff, 0xe6, 0xff, 0xbf, 0xff, 0xff, 0xff,
+ 0xdf, 0xff, 0xff, 0xff, 0xfd, 0xe9, 0xf7, 0xff,
+ 0xfb, 0xff, 0x3f, 0xf7, 0xff, 0xbf, 0xbf, 0xf9,
+ 0xdf, 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0x7f,
+ 0xff, 0xbf, 0x95, 0xbd, 0xff, 0xff, 0xfb, 0xff,
+ 0xed, 0xfb, 0xdb, 0x6f, 0xfe, 0xff, 0xff, 0xff,
+ 0xff, 0xf7, 0xdf, 0xf7, 0xff, 0xff, 0xfd, 0xfb,
+ 0xff, 0xfb, 0xfe, 0xef, 0xff, 0xff, 0x71, 0xff,
+ 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xe6, 0xbf, 0xef, 0xff, 0xfe, 0xff, 0xfd, 0xff,
+ 0xff, 0xfb, 0xff, 0xfb, 0xff, 0xe6, 0xff, 0xef,
+ 0xbb, 0xfd, 0xfc, 0xfa, 0xff, 0x3f, 0xf7, 0xfc,
+ 0xf5, 0xfb, 0x7f, 0x7b, 0xfd, 0xf5, 0xdb, 0x5f,
+ 0xdf, 0xbf, 0xe1, 0xff, 0xf8, 0xe3, 0x8f, 0xfd,
+ 0xf6, 0xff, 0xe3, 0x8f, 0xfd, 0x75, 0xb5, 0xdd,
+ 0xef, 0xfd, 0xfd, 0xf3, 0xdb, 0xff, 0x67, 0xfe,
+ 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff,
+ 0xff, 0x76, 0xff, 0xff, 0xf5, 0x7f, 0xbf, 0xff,
+ 0xf6, 0xfa, 0xff, 0x9b, 0xfe, 0xbf, 0xfc, 0xf6,
+ 0xee, 0xef, 0xf5, 0xff, 0xfa, 0x4e, 0x9e, 0x5f,
+ 0xff, 0xff, 0xf5, 0xff, 0x7f, 0x7b, 0xf5, 0xbf,
+ 0x66, 0xff, 0xbb, 0xef, 0xbf, 0xfb, 0x3e, 0xff,
+ 0xef, 0xbe, 0xcb, 0xf7, 0xf7, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xfe, 0xb7, 0xf9, 0xdf, 0x7e,
+ 0xfb, 0xbd, 0xe7, 0x5f, 0x56, 0xfb, 0xbd, 0x67,
+ 0x9f, 0x75, 0x96, 0x5f, 0x7f, 0xbd, 0xfe, 0xfe,
+ 0xf3, 0x6f, 0xd4, 0xd7, 0x5e, 0x7b, 0xed, 0xff,
+ 0x27, 0x5b, 0x7b, 0xed, 0x7f, 0x7f, 0xff, 0xd5,
+ 0xff, 0x59, 0x67, 0xbf, 0xf4, 0x5f, 0x99, 0xfb,
+ 0xbf, 0xd9, 0x66, 0xfe, 0x6f, 0x7f, 0xff, 0x66,
+ 0xde, 0xff, 0x4f, 0xff, 0xfb, 0xf5, 0xd3, 0x7f,
+ 0x7b, 0xad, 0x6e, 0x66, 0xfe, 0x7b, 0xef, 0xbd,
+ 0xff, 0x9e, 0xfd, 0xef, 0x95, 0xf7, 0xdf, 0x50,
+ 0xff, 0xfe, 0x77, 0xd4, 0xdf, 0xee, 0xfb, 0xb3,
+ 0xb1, 0xff, 0xfe, 0xfb, 0xbd, 0xfd, 0xff, 0xfe,
+ 0x7b, 0xbf, 0x7f, 0x9f, 0xff, 0xc7, 0x5b, 0xdf,
+ 0xff, 0xfd, 0xfd, 0xff, 0x66, 0xec, 0xff, 0xf6,
+ 0x5b, 0x6e, 0xff, 0xbf, 0xdf, 0xdb, 0x6f, 0x7f,
+ 0xaf, 0xff, 0x75, 0xfc, 0xff, 0x7f, 0xff, 0xb5,
+ 0xbf, 0x9b, 0xf7, 0xef, 0xbf, 0xaf, 0xbf, 0xff,
+ 0x7f, 0xa3, 0xff, 0xbf, 0xfb, 0xfd, 0xb7, 0xfb,
+ 0x7f, 0xfb, 0xff, 0x37, 0xdf, 0x77, 0xe6, 0xfd,
+ 0xfb, 0xef, 0xb3, 0xcb, 0xff, 0x9f, 0xef, 0xbf,
+ 0xcf, 0xff, 0xfa, 0xfb, 0xef, 0xff, 0xff, 0x77,
+ 0xdb, 0xe7, 0x9d, 0xb1, 0xff, 0xfa, 0xeb, 0xaf,
+ 0xdf, 0x7e, 0xf3, 0xeb, 0xaf, 0xdf, 0xdd, 0xb6,
+ 0xd9, 0x77, 0xaf, 0xed, 0x75, 0xd3, 0xff, 0x66,
+ 0xe6, 0xbf, 0xff, 0xfe, 0xfb, 0xf3, 0xdb, 0xfb,
+ 0xfe, 0xfb, 0xf3, 0x9f, 0x7f, 0xfe, 0xff, 0xff,
+ 0x3f, 0x7f, 0xec, 0x3f, 0x9b, 0xfb, 0xef, 0xbf,
+ 0xfd, 0xb6, 0xff, 0xfd, 0xbf, 0xff, 0xb6, 0xff,
+ 0xf7, 0xdf, 0xfd, 0xff, 0xff, 0xfd, 0x5d, 0xfb,
+ 0xef, 0xe6, 0xfe, 0x7f, 0xff, 0xfd, 0xf7, 0xff,
+ 0x0d, 0xfd, 0xfd, 0xf7, 0xf5, 0xd6, 0xef, 0x7c,
+ 0xff, 0xff, 0xd3, 0x7f, 0xfb, 0xbb, 0x79, 0xff,
+ 0xef, 0xbf, 0xff, 0xfa, 0xfa, 0xa7, 0xbf, 0xfd,
+ 0x7e, 0xfb, 0xe6, 0x3f, 0xcf, 0x7e, 0xb9, 0xc5,
+ 0x77, 0x7f, 0x6f, 0xfe, 0xff, 0xff, 0xfa, 0xeb,
+ 0xff, 0xfb, 0xdf, 0xbf, 0xeb, 0xd5, 0x7f, 0xfd,
+ 0xef, 0xdf, 0xff, 0x7f, 0xfd, 0xfd, 0xff, 0x9b,
+ 0xff, 0xff, 0x8f, 0x3e, 0xfa, 0xec, 0x73, 0xcf,
+ 0x3f, 0xfa, 0xfc, 0x67, 0x9f, 0x7f, 0xf6, 0xd1,
+ 0x47, 0x9f, 0x7d, 0xfe, 0xe6, 0xff, 0xeb, 0xaf,
+ 0xbf, 0xfe, 0xff, 0xff, 0xaf, 0xbf, 0xfe, 0xf7,
+ 0x97, 0xff, 0x7c, 0xff, 0xff, 0x17, 0xdf, 0xff,
+ 0xbf, 0xf9, 0xff, 0xfa, 0xeb, 0xaf, 0xff, 0xfe,
+ 0xff, 0xeb, 0xaf, 0x7f, 0xff, 0xf7, 0xff, 0xdf,
+ 0x7f, 0xfd, 0xf5, 0xdf, 0xff, 0x6f, 0xfe, 0xbf,
+ 0xfa, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xea, 0xbf,
+ 0xff, 0x7f, 0xfb, 0xdf, 0xdf, 0xff, 0x7f, 0xf5,
+ 0xd7, 0xff, 0x9b, 0xff, 0xaf, 0xff, 0xff, 0xff,
+ 0xef, 0xff, 0xbf, 0xfe, 0xff, 0xbb, 0xff, 0xfe,
+ 0xff, 0xf7, 0xd7, 0x5f, 0x7f, 0xff, 0xff, 0xe6,
+ 0xff, 0xbf, 0xff, 0xff, 0xfd, 0xef, 0xfb, 0xff,
+ 0xfd, 0xfc, 0xed, 0xf7, 0xff, 0x7b, 0xf9, 0xff,
+ 0xa7, 0xdf, 0xff, 0xbf, 0xf9, 0xff, 0xaf, 0xbf,
+ 0xfa, 0xfa, 0xe3, 0x2e, 0xbe, 0xfe, 0xea, 0x16,
+ 0x5d, 0x7e, 0xbd, 0xf5, 0xd7, 0x5e, 0x77, 0xfd,
+ 0x6f, 0xfe, 0xff, 0xfc, 0xff, 0xc9, 0xff, 0xfe,
+ 0xfc, 0xe3, 0xcf, 0xdf, 0xdf, 0xf9, 0xe6, 0xff,
+ 0xff, 0xff, 0xfe, 0x7f, 0xff, 0x1b, 0xff, 0xa7,
+ 0xef, 0xff, 0xda, 0xff, 0x9f, 0xb7, 0x7c, 0xf6,
+ 0xfd, 0xdb, 0xf7, 0xff, 0xee, 0x7f, 0xff, 0xff,
+ 0xff, 0x7f, 0x66, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xef, 0xfd, 0xff, 0xff, 0xfe, 0xef, 0xdb, 0x5f,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x9f, 0xf9,
+ 0xff, 0xfc, 0xf3, 0xbf, 0xff, 0xfb, 0xfe, 0xf1,
+ 0xbe, 0x7e, 0xfd, 0xe5, 0xf3, 0xff, 0xff, 0xff,
+ 0xf7, 0xff, 0x7f, 0x6f, 0xfc, 0xff, 0xff, 0xff,
+ 0xf7, 0xff, 0xfb, 0xfe, 0xff, 0xfb, 0x3b, 0xff,
+ 0xfd, 0xd7, 0xfe, 0xff, 0x7f, 0xff, 0xff, 0xbd,
+ 0x99, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xef, 0xff,
+ 0xff, 0xff, 0xf3, 0xfb, 0x5f, 0xfb, 0xdd, 0xff,
+ 0xdf, 0x7f, 0xff, 0xfc, 0xff, 0xc6, 0xff, 0xdf,
+ 0xff, 0xff, 0xef, 0xdf, 0x7f, 0xff, 0x3f, 0xff,
+ 0xdf, 0xe7, 0x9f, 0x7e, 0xfd, 0xf9, 0xef, 0xcf,
+ 0xfe, 0xbf, 0xf9, 0xdf, 0xff, 0xff, 0xff, 0xff,
+ 0xf9, 0xff, 0xbf, 0xbf, 0xaf, 0xff, 0xfd, 0xf7,
+ 0xfe, 0xff, 0xbd, 0xff, 0xdf, 0xff, 0x6f, 0x7e,
+ 0xff, 0xff, 0xff, 0xe3, 0xff, 0x7f, 0x7b, 0xdd,
+ 0xdb, 0x5f, 0xdf, 0x9f, 0xdf, 0xff, 0xff, 0xff,
+ 0xff, 0xfe, 0xf5, 0x99, 0xff, 0xfe, 0xff, 0xff,
+ 0xfb, 0xff, 0xd7, 0xfe, 0x7e, 0xfe, 0xff, 0xfe,
+ 0xfb, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff,
+ 0xe6, 0xff, 0xfe, 0xaf, 0xb3, 0xce, 0xf3, 0xeb,
+ 0xff, 0xbf, 0x7e, 0xff, 0xd5, 0xef, 0xff, 0xbd,
+ 0xd5, 0xfe, 0xef, 0xff, 0xbf, 0xf9, 0xff, 0xf7,
+ 0xcf, 0xbf, 0xff, 0xba, 0xdb, 0xdf, 0xff, 0x77,
+ 0xe5, 0xbe, 0xd7, 0x7e, 0xe9, 0xfd, 0xff, 0x9f,
+ 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xbd, 0xaf, 0xcf,
+ 0xff, 0xfa, 0xff, 0xbd, 0xff, 0xff, 0xf7, 0xff,
+ 0xd6, 0x7f, 0xff, 0xdf, 0xfb, 0xff, 0x1b, 0xfe,
+ 0xff, 0xa7, 0xf3, 0xeb, 0xff, 0xff, 0xbc, 0xcb,
+ 0x2f, 0x3f, 0xdf, 0xff, 0xff, 0xfd, 0xf7, 0xdf,
+ 0xff, 0xff, 0x3f, 0x66, 0xff, 0xff, 0xef, 0xbf,
+ 0xfd, 0xff, 0xdf, 0x6f, 0xe7, 0xcb, 0xfd, 0xf7,
+ 0xfe, 0xff, 0xff, 0xbd, 0xf7, 0xff, 0xff, 0xb7,
+ 0xf9, 0x5f, 0x7b, 0xaf, 0xed, 0xe7, 0x57, 0xfa,
+ 0xfb, 0xfc, 0xe7, 0xf7, 0xf7, 0xfc, 0xde, 0x7f,
+ 0xff, 0xbd, 0xda, 0xff, 0x6f, 0xd6, 0xf3, 0x5e,
+ 0x7b, 0xed, 0xfd, 0xb3, 0xfe, 0xfe, 0xf7, 0xff,
+ 0x6f, 0x3f, 0xff, 0xff, 0xdf, 0x7f, 0x9f, 0xfd,
+ 0x5f, 0x9b, 0xfb, 0xff, 0xbd, 0xf7, 0x5b, 0xfc,
+ 0xb5, 0xdd, 0xf6, 0xbf, 0xf5, 0xe3, 0xb7, 0xff,
+ 0xf5, 0xfa, 0xff, 0x7f, 0xdd, 0xee, 0x66, 0xfe,
+ 0x7f, 0xef, 0xbd, 0x77, 0xef, 0x7b, 0xb2, 0xfd,
+ 0x5d, 0x75, 0x7b, 0xcf, 0xad, 0xd7, 0xde, 0x7f,
+ 0x5f, 0xb5, 0xb3, 0xb1, 0xff, 0xfb, 0xef, 0xef,
+ 0xed, 0xff, 0xfe, 0x6f, 0xff, 0xff, 0xfb, 0xff,
+ 0xdd, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x66,
+ 0xee, 0xff, 0xfe, 0xdb, 0x6f, 0xef, 0xff, 0xf6,
+ 0xdb, 0xdb, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xbf, 0x9b, 0xe7, 0xff, 0xff,
+ 0xef, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9,
+ 0xff, 0xb7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x9f,
+ 0xf7, 0xe6, 0xdd, 0xff, 0xff, 0xf3, 0xff, 0x6f,
+ 0xff, 0xff, 0xff, 0xd9, 0xef, 0xfe, 0xfb, 0x8f,
+ 0xbf, 0xff, 0xff, 0xff, 0xcf, 0xbd, 0xb1, 0xff,
+ 0xfb, 0xeb, 0xaf, 0xdf, 0xbe, 0xfb, 0xed, 0xb7,
+ 0xd9, 0x7d, 0x76, 0xdb, 0x6f, 0x9f, 0xfd, 0xf7,
+ 0xdb, 0xff, 0x66, 0xe6, 0xdf, 0xff, 0xfe, 0xfb,
+ 0xf3, 0xdf, 0x3f, 0xff, 0xfc, 0xf3, 0xb7, 0x7f,
+ 0x7e, 0xfb, 0xe7, 0xbf, 0x7f, 0xfe, 0x3f, 0x9b,
+ 0xfb, 0xfe, 0xbf, 0xfd, 0xfe, 0xfe, 0xfb, 0xef,
+ 0xef, 0xbf, 0xff, 0xfb, 0xdf, 0xbf, 0xff, 0xfd,
+ 0xfd, 0xef, 0xff, 0xaf, 0xa6, 0x7e, 0xff, 0xff,
+ 0xfd, 0xf7, 0x7b, 0xff, 0xef, 0xfd, 0xf0, 0xf7,
+ 0xf7, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xef,
+ 0xbb, 0x61, 0xdf, 0xef, 0xbf, 0xfd, 0xbe, 0xe9,
+ 0xea, 0xaf, 0x2f, 0xfa, 0xff, 0xec, 0x9b, 0x7f,
+ 0x7e, 0xfb, 0xee, 0x9b, 0x7b, 0x63, 0xfe, 0xff,
+ 0xff, 0xba, 0xff, 0xbf, 0xff, 0xcf, 0xfe, 0xed,
+ 0x7f, 0x77, 0xff, 0xff, 0xdf, 0xef, 0xff, 0xff,
+ 0xf7, 0xff, 0x9b, 0xff, 0xff, 0x87, 0x3e, 0xff,
+ 0xf8, 0xa3, 0xcb, 0x3e, 0xf7, 0xf4, 0xe7, 0x9f,
+ 0x7f, 0xfc, 0xf1, 0xe7, 0x9f, 0x7f, 0xfe, 0xe6,
+ 0xff, 0xef, 0xa7, 0xbf, 0xfe, 0xff, 0xff, 0xef,
+ 0xff, 0xfe, 0xe7, 0xff, 0x7f, 0xff, 0xff, 0xff,
+ 0xdf, 0xdf, 0xff, 0xbf, 0xf9, 0xff, 0xfe, 0xeb,
+ 0xaf, 0xff, 0xff, 0xfa, 0xee, 0xbf, 0xff, 0xfb,
+ 0xfd, 0xf7, 0x7f, 0x7f, 0xff, 0xfd, 0xdf, 0xff,
+ 0x6f, 0xfe, 0xdf, 0xda, 0xef, 0xab, 0xff, 0xfe,
+ 0xeb, 0xee, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xdf,
+ 0xff, 0xff, 0xfd, 0xf7, 0xff, 0x1b, 0xfe, 0xef,
+ 0xff, 0xff, 0xfa, 0xff, 0xaf, 0xff, 0xfe, 0xff,
+ 0xbf, 0xff, 0xff, 0xff, 0xfd, 0xf7, 0xdf, 0xff,
+ 0xff, 0xff, 0xe6, 0xff, 0xdf, 0x3f, 0xfd, 0xbf,
+ 0xf2, 0x7f, 0x6f, 0x3d, 0xfd, 0xe5, 0xa7, 0x9f,
+ 0xfa, 0xfb, 0xdd, 0x77, 0xfb, 0xff, 0xbf, 0xe9,
+ 0xff, 0xaf, 0xbe, 0xfe, 0xfa, 0x6b, 0xaf, 0xbf,
+ 0xee, 0x7a, 0xd7, 0x5f, 0x77, 0xfd, 0x55, 0xd7,
+ 0x5d, 0x7f, 0xed, 0x6b, 0xfe, 0xbf, 0xff, 0xef,
+ 0xff, 0xdf, 0xfb, 0xff, 0xec, 0xef, 0xff, 0xbf,
+ 0xfe, 0xff, 0xf3, 0xff, 0xbf, 0xdf, 0xff, 0xff,
+ 0x1b, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xbf, 0xff,
+ 0xff, 0xfd, 0xff, 0xfe, 0xef, 0xef, 0xff, 0xff,
+ 0xff, 0xff, 0xbf, 0xff, 0x7f, 0x66, 0xff, 0xff,
+ 0xff, 0xff, 0xf7, 0xf7, 0xff, 0x7f, 0xdf, 0x4e,
+ 0xff, 0xbf, 0xed, 0xf9, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xbf, 0xf9, 0xff, 0xfb, 0xef, 0xcf, 0x1f,
+ 0xfe, 0xbf, 0xff, 0xbf, 0xff, 0x79, 0xfe, 0xc7,
+ 0xfb, 0xe7, 0xff, 0xf1, 0xff, 0xff, 0x6f, 0xfe,
+ 0xbf, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff,
+ 0xfe, 0xbd, 0xef, 0x7f, 0xdb, 0xfd, 0xff, 0x77,
+ 0xff, 0xff, 0xff, 0x9a, 0xff, 0xff, 0xbd, 0xbd,
+ 0xf7, 0xe7, 0xff, 0xef, 0xff, 0xf6, 0xbf, 0xfe,
+ 0xff, 0xff, 0xb7, 0xdf, 0x7f, 0xff, 0xff, 0xff,
+ 0xe6, 0xff, 0x7f, 0x7f, 0xbf, 0xfe, 0xff, 0xff,
+ 0xff, 0xff, 0xdf, 0xff, 0xb7, 0x5f, 0xef, 0xfe,
+ 0xf5, 0xd3, 0xdf, 0xf7, 0xbf, 0xd9, 0xdf, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
+ 0x3f, 0xfd, 0xff, 0xff, 0xeb, 0xfb, 0xef, 0xdf,
+ 0xff, 0x6f, 0xfe, 0xfd, 0xff, 0xf7, 0xff, 0xcd,
+ 0xff, 0x7f, 0xff, 0xd5, 0xf7, 0xff, 0xbf, 0xf1,
+ 0x7f, 0xff, 0xf7, 0xff, 0xff, 0xff, 0x9b, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0x9f, 0xfb, 0xff, 0xf7,
+ 0xfb, 0xff, 0xef, 0xff, 0xeb, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xe6, 0xff, 0xeb, 0xaf, 0xff,
+ 0xff, 0xfd, 0xeb, 0xab, 0xd7, 0x72, 0xff, 0xbd,
+ 0x7f, 0x7e, 0xfd, 0xe7, 0x9b, 0xff, 0xff, 0xbf,
+ 0xf1, 0xff, 0xfb, 0xef, 0x7f, 0xfe, 0xb9, 0xfa,
+ 0xeb, 0x8f, 0x7f, 0x69, 0xff, 0xdb, 0x7f, 0x7f,
+ 0xfd, 0xf5, 0xdd, 0xff, 0x67, 0xfe, 0xff, 0xfe,
+ 0xfd, 0xff, 0xfe, 0xff, 0xff, 0x6f, 0xbf, 0xff,
+ 0xff, 0xff, 0xf5, 0xdf, 0xdf, 0x7f, 0xff, 0xf6,
+ 0xfb, 0x9b, 0xfe, 0xef, 0xbf, 0xff, 0xff, 0xff,
+ 0xbc, 0xb2, 0x9a, 0x2b, 0x77, 0xff, 0xad, 0xfb,
+ 0xcd, 0xdf, 0xdf, 0x7f, 0xff, 0xbf, 0x66, 0xff,
+ 0xef, 0xbf, 0xbd, 0xff, 0xff, 0xfb, 0xff, 0xff,
+ 0x5c, 0xfd, 0xfc, 0xf3, 0x4f, 0xff, 0xf7, 0xdf,
+ 0x7f, 0xff, 0xb7, 0xf9, 0xdf, 0x7b, 0xef, 0xef,
+ 0xd5, 0xdf, 0x6e, 0xbf, 0x3c, 0xff, 0x95, 0x55,
+ 0xbe, 0xde, 0x68, 0xbf, 0xf7, 0xde, 0xf9, 0x6f,
+ 0xd4, 0x97, 0x5f, 0x7e, 0xeb, 0xfc, 0xd7, 0x5e,
+ 0x7a, 0xa7, 0xdc, 0x7f, 0x3d, 0xdf, 0xf7, 0xcb,
+ 0x2f, 0xbf, 0x7c, 0x5e, 0x99, 0xfb, 0xef, 0xbf,
+ 0xbf, 0xff, 0x7f, 0xb7, 0x95, 0x16, 0xde, 0xf5,
+ 0xcd, 0xfb, 0xbf, 0xde, 0xf7, 0x7e, 0xb3, 0xad,
+ 0xee, 0x66, 0xfe, 0xaf, 0xb7, 0xfe, 0xfb, 0xef,
+ 0x78, 0xf7, 0x9d, 0x25, 0xfd, 0xf7, 0xfe, 0xad,
+ 0xf7, 0xbd, 0xf7, 0xce, 0xb3, 0x93, 0xb1, 0xff,
+ 0xfb, 0xee, 0xaf, 0xff, 0x1b, 0xde, 0x7e, 0xeb,
+ 0xff, 0xed, 0xfd, 0xef, 0xbf, 0xab, 0xfd, 0xfd,
+ 0xf5, 0xff, 0x66, 0xec, 0xbf, 0xff, 0xfe, 0xeb,
+ 0xef, 0xd5, 0xf6, 0xda, 0x7b, 0xdf, 0x7b, 0xef,
+ 0x7f, 0xfe, 0x6b, 0xff, 0xfd, 0xf7, 0xbf, 0x99,
+ 0xf7, 0xef, 0xbf, 0xef, 0xbf, 0xdf, 0xee, 0xbb,
+ 0xef, 0xf7, 0xfb, 0xff, 0xb7, 0x9d, 0xff, 0xff,
+ 0xdd, 0x77, 0xdf, 0x77, 0xe6, 0xfd, 0xfb, 0xef,
+ 0xb3, 0xce, 0x23, 0xff, 0xfc, 0xf3, 0x9b, 0xdf,
+ 0xff, 0xff, 0xef, 0x3f, 0x7f, 0xfe, 0xf9, 0xe7,
+ 0xbd, 0xb1, 0xff, 0xda, 0xeb, 0xbf, 0xff, 0x58,
+ 0xfa, 0xeb, 0x25, 0xfe, 0xfd, 0xf7, 0xdb, 0x69,
+ 0x7f, 0xfd, 0xf5, 0xd7, 0xbf, 0x6e, 0xe6, 0xbf,
+ 0xff, 0xfe, 0xff, 0xff, 0x9f, 0x7d, 0xf6, 0xfb,
+ 0xf7, 0xff, 0xdf, 0xfe, 0xfb, 0xdf, 0x7f, 0xff,
+ 0xfd, 0x3b, 0x9b, 0x7b, 0xef, 0xbf, 0xfd, 0xff,
+ 0xff, 0x6d, 0xb7, 0xfd, 0xff, 0xfe, 0xff, 0xf7,
+ 0xbd, 0xf7, 0xb7, 0xdf, 0x7e, 0xdb, 0xef, 0xe6,
+ 0xde, 0xff, 0xaf, 0x9f, 0xde, 0x52, 0x7f, 0xbf,
+ 0xfd, 0xf0, 0xb5, 0xd7, 0xfe, 0xbd, 0xff, 0xfd,
+ 0xf6, 0xdb, 0x7f, 0xbb, 0x79, 0xff, 0xf7, 0xc9,
+ 0x2f, 0xbf, 0xf8, 0xef, 0xbb, 0x77, 0x7e, 0xd7,
+ 0xd5, 0x3f, 0xff, 0x7c, 0xf7, 0xdd, 0x77, 0x7f,
+ 0x6f, 0xfe, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xbb,
+ 0xfe, 0x7e, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff,
+ 0x7b, 0xff, 0xbd, 0x77, 0xff, 0x9b, 0xff, 0xff,
+ 0xcf, 0x3f, 0xff, 0xfc, 0xa3, 0xcf, 0x3e, 0xf7,
+ 0xf4, 0xe7, 0x9f, 0x7b, 0xfe, 0xd9, 0x67, 0x9f,
+ 0x7d, 0xfe, 0xe6, 0xff, 0xeb, 0xff, 0xff, 0xff,
+ 0xf2, 0xeb, 0xef, 0xff, 0xfe, 0xf7, 0xdf, 0xff,
+ 0xfe, 0xfb, 0xf7, 0xdf, 0x7f, 0xff, 0xbf, 0xf9,
+ 0xff, 0xfa, 0xff, 0xff, 0xbf, 0xfc, 0xfa, 0xef,
+ 0xff, 0xff, 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xfd,
+ 0xf7, 0xdd, 0xff, 0x6f, 0xfe, 0x9f, 0xfe, 0xfa,
+ 0xeb, 0xff, 0xfe, 0xfb, 0xeb, 0xbf, 0x7f, 0xfd,
+ 0xf5, 0xdf, 0x3f, 0xdf, 0x7d, 0xf7, 0xdd, 0xff,
+ 0x9b, 0xff, 0xaf, 0xbf, 0xfe, 0xfa, 0xff, 0xff,
+ 0xbf, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff,
+ 0xf7, 0xdf, 0x77, 0xff, 0xff, 0x66, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xfe, 0xcb, 0xff, 0xbe, 0xf5,
+ 0xe5, 0x77, 0xdf, 0x7f, 0xf9, 0xed, 0xff, 0xff,
+ 0xf9, 0xbf, 0xf9, 0xff, 0xaf, 0xbe, 0xfe, 0xe2,
+ 0xab, 0xae, 0x9f, 0xee, 0xba, 0x96, 0x5f, 0x6f,
+ 0xb9, 0x75, 0x57, 0x5f, 0x7f, 0xfd, 0x6f, 0xfe,
+ 0xff, 0xf7, 0xff, 0xff, 0xde, 0xff, 0x6f, 0xff,
+ 0xdb, 0xff, 0xbd, 0xfe, 0xe7, 0x9f, 0xcb, 0xff,
+ 0xff, 0xff, 0xe7, 0x1b, 0xff, 0xfb, 0xdf, 0xff,
+ 0xff, 0xfd, 0xf7, 0xf3, 0xef, 0x6e, 0xff, 0xff,
+ 0xbe, 0xf6, 0xf4, 0xff, 0xfd, 0xb7, 0xff, 0xff,
+ 0xe6, 0x7f, 0xfd, 0x77, 0xdf, 0xf3, 0xf7, 0x7f,
+ 0xff, 0xee, 0xfb, 0xff, 0xff, 0x7f, 0xf9, 0xf3,
+ 0xff, 0xff, 0xff, 0xff, 0xbf, 0xe9, 0xff, 0xfe,
+ 0x6f, 0xbd, 0xff, 0xdf, 0xfc, 0xf3, 0x2f, 0xf7,
+ 0xb9, 0xf7, 0xf7, 0x1f, 0x7f, 0xff, 0xf5, 0xd7,
+ 0xfb, 0x67, 0xfc, 0xff, 0xfd, 0xff, 0xf7, 0xfb,
+ 0xff, 0xff, 0xdf, 0xe6, 0xf7, 0xff, 0xfe, 0xf7,
+ 0xef, 0xff, 0xfe, 0x7d, 0xf7, 0xfd, 0x99, 0xff,
+ 0xff, 0xbb, 0x7f, 0xf1, 0xff, 0xfe, 0xef, 0xf2,
+ 0xbf, 0xf5, 0x7d, 0xde, 0x7b, 0xf3, 0xdf, 0x5b,
+ 0x7f, 0xdd, 0xff, 0xc6, 0xdf, 0xff, 0xff, 0xbf,
+ 0xde, 0xf7, 0xdf, 0xef, 0xff, 0x9d, 0xef, 0xe6,
+ 0x4f, 0xff, 0xff, 0xf5, 0x57, 0x5f, 0xf7, 0x8f,
+ 0xf9, 0xbf, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x4f, 0xfd, 0xdf, 0xcf, 0xfd, 0xff, 0xff, 0xeb,
+ 0xfb, 0xef, 0xbd, 0xfd, 0x6f, 0xfe, 0x3f, 0xff,
+ 0xbc, 0xe3, 0xff, 0x3b, 0xf7, 0xbc, 0x9f, 0xff,
+ 0x9f, 0xff, 0xd8, 0xe2, 0xef, 0xff, 0xff, 0xff,
+ 0xff, 0x99, 0xff, 0xaf, 0xbb, 0xfd, 0xf7, 0xbf,
+ 0x7f, 0xbf, 0xfd, 0xbf, 0xff, 0xff, 0x7f, 0xfd,
+ 0xf5, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xe6, 0xff,
+ 0xea, 0x27, 0xdb, 0x67, 0xfa, 0xe3, 0x77, 0xb7,
+ 0xfe, 0xd5, 0xd3, 0x6b, 0x6f, 0x7d, 0xf7, 0xdf,
+ 0x7f, 0xff, 0xbf, 0xf9, 0xff, 0xfb, 0xef, 0xff,
+ 0xff, 0xf6, 0xf3, 0xdf, 0x37, 0xdf, 0xe5, 0xbf,
+ 0xdd, 0x7f, 0x7d, 0xdd, 0xe5, 0xd1, 0xff, 0x6f,
+ 0xfe, 0x7f, 0xff, 0xfb, 0xff, 0xdf, 0xff, 0x7e,
+ 0xff, 0xef, 0xbf, 0xbf, 0xd7, 0xf5, 0xef, 0xdf,
+ 0x7f, 0xff, 0xfd, 0xff, 0x9b, 0xfe, 0xfb, 0xff,
+ 0xff, 0xf7, 0xbf, 0xfd, 0xff, 0xff, 0xf7, 0x7f,
+ 0xfd, 0xd7, 0xf3, 0xff, 0xfe, 0xff, 0xff, 0x7f,
+ 0xff, 0xa6, 0xff, 0xaf, 0xbf, 0xff, 0xcb, 0xce,
+ 0x2f, 0xf9, 0xd6, 0x5a, 0x97, 0x7f, 0xff, 0xe7,
+ 0xf3, 0xfd, 0xf7, 0xde, 0xff, 0xaf, 0xd9, 0xff,
+ 0xee, 0xfb, 0xef, 0xa4, 0xff, 0x76, 0xbd, 0xec,
+ 0x72, 0xbb, 0xfe, 0xff, 0xff, 0xfd, 0xfd, 0xf7,
+ 0xdf, 0xff, 0x65, 0xfe, 0xb7, 0xdf, 0x1e, 0xff,
+ 0xbd, 0xb6, 0x5f, 0x7f, 0xfb, 0xdd, 0x7f, 0x35,
+ 0xff, 0xff, 0x7b, 0xef, 0xbd, 0xf7, 0xfa, 0x9b,
+ 0xf5, 0xb5, 0xd7, 0xfe, 0x7f, 0xed, 0xb5, 0xff,
+ 0x5f, 0x7b, 0xdd, 0x5b, 0xe7, 0x3f, 0xff, 0xf2,
+ 0xcb, 0x2f, 0x9f, 0x57, 0xe6, 0x7e, 0x6d, 0xbf,
+ 0xbd, 0xf7, 0xfe, 0x6f, 0xf6, 0xd9, 0x66, 0x37,
+ 0xf1, 0xff, 0xb7, 0xbf, 0xf6, 0xdf, 0x6d, 0xb3,
+ 0x9b, 0x99, 0x6f, 0xae, 0xb9, 0xaf, 0xbe, 0xff,
+ 0xde, 0xbf, 0xef, 0x7e, 0xf7, 0xfc, 0x7f, 0xeb,
+ 0x35, 0xff, 0xfd, 0xf2, 0xee, 0x6c, 0xec, 0xbf,
+ 0x5b, 0xee, 0xeb, 0xbf, 0xbf, 0xff, 0xef, 0xbb,
+ 0xdc, 0x47, 0xff, 0xfb, 0xef, 0xca, 0x7f, 0xff,
+ 0xfd, 0xbd, 0x99, 0xfb, 0xbf, 0xf5, 0xf6, 0x0a,
+ 0x6f, 0xbf, 0xbd, 0xf7, 0x5b, 0x5f, 0xca, 0xfb,
+ 0x9f, 0xff, 0xde, 0x7f, 0xff, 0xfd, 0xef, 0xc6,
+ 0xbd, 0xdb, 0x6b, 0xfb, 0xed, 0xbf, 0xfb, 0x7f,
+ 0xbb, 0xad, 0x6c, 0xfb, 0x7f, 0xff, 0x7d, 0xfd,
+ 0xf7, 0xdd, 0xf7, 0x9d, 0x79, 0x5f, 0xe6, 0x9b,
+ 0x2c, 0xf2, 0xcb, 0xff, 0x8f, 0x7c, 0xf2, 0xb3,
+ 0xdf, 0xff, 0xfb, 0x6f, 0xf7, 0x5d, 0xf6, 0x79,
+ 0x67, 0xe4, 0xaf, 0xf8, 0xe2, 0xcf, 0xaf, 0xbf,
+ 0xfe, 0xe3, 0x0b, 0x5f, 0xb6, 0xfd, 0x77, 0xda,
+ 0x57, 0x7f, 0xfd, 0xf5, 0xbf, 0x99, 0xf9, 0xef,
+ 0xbf, 0xff, 0xff, 0xfb, 0xef, 0xff, 0xff, 0xfe,
+ 0xf5, 0xed, 0xbf, 0xff, 0xfe, 0xf7, 0xdf, 0x7f,
+ 0xff, 0xce, 0xe6, 0xfe, 0xfb, 0x6f, 0xff, 0xfb,
+ 0xf6, 0xfb, 0xff, 0xbf, 0xed, 0xdd, 0xfd, 0x7b,
+ 0xef, 0xfd, 0xfd, 0xb7, 0xdf, 0xf6, 0xbb, 0xb9,
+ 0xff, 0xc7, 0x1f, 0x7f, 0xfc, 0xf7, 0xdf, 0x1d,
+ 0x7f, 0x7c, 0xe3, 0xb5, 0xff, 0xff, 0xfd, 0xff,
+ 0xfd, 0xf7, 0xff, 0x6e, 0xde, 0xf7, 0xf9, 0xe7,
+ 0x9f, 0xff, 0xfa, 0xfb, 0xe7, 0x9f, 0x77, 0x7c,
+ 0xd7, 0xcf, 0x3f, 0xfb, 0x75, 0xd7, 0xdd, 0xdf,
+ 0x9b, 0xff, 0x7f, 0xb7, 0x6c, 0x2a, 0xeb, 0xff,
+ 0xbf, 0x7c, 0xba, 0xff, 0x5f, 0xff, 0xff, 0xdf,
+ 0xff, 0x7d, 0xff, 0xfd, 0xff, 0xe6, 0xff, 0xff,
+ 0xa2, 0x8f, 0x3e, 0xfa, 0xfc, 0xa3, 0x8f, 0x3c,
+ 0xef, 0xf1, 0xe7, 0x9f, 0x7f, 0xfe, 0xd9, 0x67,
+ 0x97, 0xbf, 0xf9, 0xff, 0xa2, 0xcb, 0x2f, 0xbf,
+ 0xfe, 0xfa, 0xeb, 0x2f, 0x7e, 0xf3, 0xf7, 0x3f,
+ 0xff, 0x7f, 0xfd, 0xf7, 0xdf, 0xff, 0x6f, 0xfe,
+ 0x9f, 0xbe, 0xfa, 0xcb, 0xaf, 0xaf, 0xfe, 0xfa,
+ 0xeb, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff,
+ 0xfd, 0x77, 0xfd, 0x9b, 0xfd, 0xaf, 0xfe, 0xf9,
+ 0xef, 0xbf, 0xaf, 0xfe, 0xfb, 0xef, 0x7f, 0x7f,
+ 0xfd, 0xf7, 0xdf, 0x57, 0xdf, 0x7d, 0xf7, 0xff,
+ 0xe6, 0xff, 0xeb, 0xff, 0xff, 0xff, 0xbf, 0xeb,
+ 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff,
+ 0xf5, 0xf7, 0xdf, 0xf7, 0xbf, 0xf9, 0xff, 0xef,
+ 0xff, 0x3f, 0xbf, 0xfd, 0xef, 0x9a, 0xff, 0xfd,
+ 0xef, 0x8f, 0xf7, 0xd7, 0xfe, 0x7f, 0xdf, 0xff,
+ 0xff, 0x6f, 0xfe, 0xff, 0x6b, 0x8f, 0xbe, 0xe8,
+ 0xea, 0xcb, 0xad, 0xbf, 0xf6, 0xe5, 0x97, 0x5b,
+ 0x76, 0xf9, 0xd5, 0xd7, 0x5e, 0xff, 0x9b, 0xff,
+ 0x3f, 0xfb, 0xf4, 0xa3, 0xfb, 0xff, 0xba, 0x7c,
+ 0xff, 0xfe, 0xcf, 0xbf, 0xf9, 0xe5, 0xff, 0xff,
+ 0xff, 0xf7, 0xf9, 0xc6, 0xbf, 0xe9, 0xaf, 0xdd,
+ 0xfd, 0xbf, 0xff, 0x1f, 0xfa, 0xfd, 0xff, 0xfe,
+ 0x6f, 0x79, 0xcf, 0x7f, 0xff, 0xfd, 0xbf, 0xbf,
+ 0xf9, 0xf7, 0xff, 0xfe, 0xaf, 0xef, 0xdf, 0xdf,
+ 0xff, 0x7f, 0xfb, 0xfb, 0xff, 0xb7, 0x7f, 0xff,
+ 0xff, 0xff, 0xff, 0xfb, 0x6f, 0xfc, 0xb7, 0xf6,
+ 0x7a, 0xe9, 0xaf, 0xdf, 0xde, 0xe8, 0xe2, 0xd9,
+ 0x6f, 0xfe, 0x7d, 0xe7, 0xdf, 0x6b, 0xf5, 0xf5,
+ 0xff, 0x99, 0xff, 0xaf, 0xba, 0xfe, 0xf9, 0xda,
+ 0xfe, 0xbf, 0xdf, 0xff, 0xbd, 0xff, 0xff, 0xfd,
+ 0xff, 0xdf, 0x5f, 0xdf, 0x5b, 0x5f, 0xe6, 0xbf,
+ 0xe7, 0x9f, 0xff, 0xf4, 0xfb, 0xeb, 0x97, 0x3f,
+ 0xfc, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xf6, 0xff,
+ 0x5b, 0xbf, 0xbf, 0xf9, 0x7f, 0xfa, 0xeb, 0xff,
+ 0x3f, 0xfb, 0xf7, 0xeb, 0xae, 0xbf, 0xdb, 0xef,
+ 0xff, 0xef, 0x7e, 0xfb, 0xdf, 0xe6, 0xef, 0x67,
+ 0xfe, 0xff, 0xff, 0xdf, 0x1d, 0xef, 0xff, 0xfd,
+ 0xff, 0xfe, 0xfd, 0xdf, 0xdf, 0xbf, 0xff, 0x7f,
+ 0xfe, 0xef, 0xf7, 0xff, 0x9b, 0xdf, 0xfb, 0xfe,
+ 0xeb, 0xbe, 0xdf, 0x8f, 0x3f, 0xeb, 0xff, 0xe7,
+ 0x9e, 0x7f, 0xbe, 0xc9, 0xfb, 0xbf, 0xff, 0x7f,
+ 0x7f, 0xe6, 0x7f, 0xff, 0xfd, 0xbf, 0x1f, 0xff,
+ 0xdf, 0xb6, 0xff, 0xf7, 0xf5, 0xd5, 0x4b, 0xff,
+ 0xfb, 0xff, 0xeb, 0xff, 0xff, 0xbf, 0xb9, 0xff,
+ 0xff, 0xdd, 0xff, 0xff, 0xfc, 0x7f, 0xd5, 0xb4,
+ 0xf6, 0xfd, 0xfe, 0xff, 0xb5, 0x7f, 0xfd, 0xf7,
+ 0xfb, 0xff, 0x6f, 0xfe, 0xbf, 0xec, 0xfa, 0x7f,
+ 0x3f, 0xfe, 0xfa, 0xdf, 0xf7, 0xbe, 0x76, 0xf9,
+ 0xf7, 0xff, 0x5f, 0xff, 0xf8, 0xff, 0xff, 0x9b,
+ 0xfb, 0xff, 0xfb, 0xfb, 0xff, 0xf3, 0xbf, 0xff,
+ 0xfb, 0xef, 0xff, 0xfd, 0xfb, 0xfe, 0x7f, 0xff,
+ 0x7f, 0xff, 0xdf, 0xff, 0x86, 0xff, 0x2f, 0xbf,
+ 0xf2, 0xfb, 0xf7, 0xbb, 0xbf, 0xf1, 0xf2, 0xf5,
+ 0x5c, 0x73, 0x79, 0xe7, 0xff, 0x3c, 0xff, 0xff,
+ 0x8f, 0xd9, 0xff, 0xef, 0xbb, 0xf9, 0xfe, 0xf7,
+ 0xf6, 0xff, 0xbc, 0xff, 0x9f, 0x7d, 0xf6, 0xdf,
+ 0xfe, 0x2f, 0xff, 0xff, 0xff, 0x6d, 0xfe, 0x97,
+ 0xfe, 0x3f, 0xdf, 0xbf, 0xa5, 0xff, 0x3b, 0xaf,
+ 0xfd, 0x6f, 0xb7, 0xdd, 0x9e, 0x7f, 0x7f, 0x37,
+ 0xff, 0xff, 0x9b, 0xf5, 0xec, 0xa7, 0xdf, 0x37,
+ 0xff, 0xed, 0xff, 0xdf, 0x7b, 0xd5, 0x6b, 0xaf,
+ 0xbd, 0xf6, 0xdc, 0x7b, 0xcf, 0xff, 0xd7, 0xe6,
+ 0xfe, 0x6f, 0xb5, 0xc5, 0x67, 0xfe, 0x7a, 0xf5,
+ 0x8b, 0x57, 0xb5, 0xda, 0x6c, 0x33, 0xf7, 0xbf,
+ 0xfd, 0x5f, 0xff, 0xbb, 0x99, 0xff, 0x9e, 0x79,
+ 0xff, 0x9d, 0x7a, 0xeb, 0xb9, 0xef, 0xdf, 0xef,
+ 0xbc, 0xf2, 0xde, 0xff, 0xf3, 0xdf, 0x52, 0xff,
+ 0x6c, 0xec, 0xff, 0xfe, 0xfb, 0xf7, 0xa9, 0xe7,
+ 0xba, 0xff, 0xbb, 0xfb, 0x4b, 0xff, 0xfd, 0xdf,
+ 0xea, 0x7a, 0xff, 0xff, 0xbf, 0x99, 0xfb, 0xef,
+ 0xbd, 0xf6, 0x5f, 0xea, 0xe8, 0xbd, 0xff, 0x5e,
+ 0xd7, 0x76, 0xfb, 0xed, 0xb7, 0x7f, 0x7f, 0xff,
+ 0xff, 0xef, 0xe6, 0xf9, 0xff, 0xff, 0xfb, 0x8e,
+ 0xbf, 0xfd, 0xff, 0xff, 0xbf, 0x3c, 0xf7, 0xdc,
+ 0xf3, 0xcf, 0xff, 0xff, 0xed, 0xb7, 0xbc, 0x79,
+ 0xff, 0x7f, 0xff, 0xf7, 0xe7, 0x9f, 0xff, 0xbf,
+ 0xed, 0x7e, 0x9f, 0x7d, 0xf6, 0xd9, 0xe5, 0xff,
+ 0xff, 0xfe, 0x7b, 0x6f, 0xec, 0xff, 0x4e, 0x7b,
+ 0xed, 0xbf, 0xff, 0x56, 0xfb, 0xe8, 0x57, 0x3f,
+ 0xfd, 0xf4, 0xd3, 0x6b, 0xfe, 0xdd, 0x37, 0xbf,
+ 0x99, 0xf9, 0xf7, 0xdf, 0x7f, 0xff, 0xff, 0xff,
+ 0xff, 0x6f, 0xfe, 0xb6, 0xc6, 0x32, 0xcb, 0xac,
+ 0xfb, 0xff, 0xbf, 0xff, 0xcf, 0xa6, 0xbe, 0xff,
+ 0xfe, 0xf7, 0xfe, 0xff, 0xff, 0xff, 0xee, 0xff,
+ 0xed, 0xb5, 0xd7, 0x5e, 0xdb, 0xff, 0xff, 0xf7,
+ 0xff, 0xbb, 0xb9, 0xdf, 0xdb, 0x6b, 0xff, 0xfc,
+ 0xfe, 0xff, 0xef, 0xff, 0xfd, 0xed, 0xb5, 0xff,
+ 0xfe, 0xfb, 0xf9, 0xff, 0xff, 0xff, 0x6a, 0xd8,
+ 0xbf, 0xfb, 0x6a, 0xbf, 0x67, 0xb7, 0xfa, 0xee,
+ 0x89, 0xde, 0x7d, 0xf5, 0xdf, 0x7e, 0xfd, 0xfd,
+ 0xfb, 0xee, 0xdf, 0x9b, 0xff, 0xbc, 0xb7, 0xee,
+ 0xf7, 0xed, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff,
+ 0x77, 0xfd, 0xf5, 0xde, 0x7b, 0xff, 0xfd, 0xff,
+ 0xe6, 0xff, 0xfb, 0xb3, 0xcf, 0x3f, 0xfe, 0xe8,
+ 0xf2, 0x8f, 0x3e, 0xf7, 0xf9, 0x43, 0x1f, 0x5d,
+ 0xfe, 0xd9, 0xc5, 0x9f, 0xbf, 0xf9, 0xff, 0xfb,
+ 0xff, 0x7f, 0xfe, 0xfe, 0xf7, 0xcf, 0x7f, 0x7e,
+ 0xff, 0xff, 0xd3, 0x5f, 0x7f, 0xff, 0xef, 0xff,
+ 0xff, 0x6f, 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xbf,
+ 0xbf, 0xbe, 0xf6, 0xeb, 0x7f, 0xff, 0xff, 0xf5,
+ 0xd7, 0x57, 0xff, 0x7b, 0xff, 0xff, 0x9b, 0xff,
+ 0xbf, 0xfe, 0xfa, 0xef, 0xef, 0x7f, 0xfa, 0xfb,
+ 0xef, 0x5f, 0x5f, 0xed, 0xf7, 0x5f, 0x77, 0x7f,
+ 0xf7, 0xfd, 0xff, 0x86, 0xbf, 0xfb, 0xff, 0xff,
+ 0xff, 0xfe, 0xeb, 0xff, 0xbf, 0xfe, 0xfd, 0xd7,
+ 0xfb, 0xff, 0xdf, 0xf5, 0x9f, 0xdf, 0xff, 0x8f,
+ 0xd9, 0xff, 0xfe, 0xcb, 0x6f, 0xbf, 0xf8, 0xf4,
+ 0xfb, 0x3f, 0xfd, 0xe9, 0x87, 0xb7, 0xff, 0x7e,
+ 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfa, 0xbf, 0xab,
+ 0xa5, 0x39, 0xee, 0xfa, 0xab, 0x2f, 0xbf, 0xec,
+ 0xc4, 0x97, 0x5c, 0x7d, 0xbd, 0xb5, 0xd7, 0x5f,
+ 0xff, 0x9a, 0xff, 0x7f, 0xdd, 0xc9, 0xf6, 0xff,
+ 0x5e, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xf7,
+ 0xfd, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xc6, 0xff,
+ 0xf7, 0xdf, 0x6f, 0xff, 0xff, 0xdb, 0xff, 0xfb,
+ 0xdd, 0xef, 0xff, 0xff, 0xbf, 0xef, 0xff, 0xfe,
+ 0xff, 0xbf, 0x9f, 0xf9, 0xff, 0xc7, 0xfd, 0xff,
+ 0xff, 0xff, 0xf7, 0xbf, 0x77, 0xdb, 0x7b, 0x6e,
+ 0xff, 0xff, 0x7d, 0xfd, 0xff, 0xff, 0xff, 0x6f,
+ 0xfe, 0xb7, 0xff, 0xea, 0xf3, 0x8f, 0xfe, 0xdf,
+ 0xb7, 0xeb, 0x9d, 0xff, 0xfd, 0xf7, 0xdf, 0xdd,
+ 0xef, 0xbf, 0xff, 0xff, 0x9b, 0xff, 0xbf, 0xfe,
+ 0x7e, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xfa, 0x7e,
+ 0xdf, 0xff, 0xff, 0xfa, 0xdf, 0xff, 0xf7, 0x6f,
+ 0xff, 0xe6, 0xff, 0xff, 0x6d, 0x7f, 0xee, 0xbf,
+ 0xff, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0xdf, 0xf7,
+ 0xff, 0xf7, 0xff, 0xf7, 0xff, 0xaf, 0xf9, 0xff,
+ 0xfe, 0xfb, 0xaf, 0xff, 0xff, 0xbf, 0xdb, 0x7f,
+ 0xff, 0xef, 0xee, 0xfb, 0xff, 0xff, 0xf7, 0xbf,
+ 0xff, 0xff, 0x6f, 0xfa, 0xff, 0xd6, 0xfe, 0xff,
+ 0xfd, 0xff, 0xff, 0xde, 0xff, 0xff, 0xff, 0xff,
+ 0xdf, 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, 0x9b,
+ 0xff, 0x8f, 0xff, 0xb7, 0xfc, 0xf5, 0xe6, 0x3b,
+ 0x7f, 0x77, 0xfd, 0xef, 0x73, 0xff, 0xf1, 0xc5,
+ 0xfb, 0x6f, 0xfe, 0xff, 0xe6, 0x7f, 0xf7, 0xfb,
+ 0xbb, 0xed, 0xfd, 0xfb, 0xbb, 0xff, 0xff, 0xff,
+ 0xff, 0xcd, 0xff, 0xbb, 0xf7, 0x7f, 0xff, 0xfe,
+ 0xbf, 0xf9, 0xbf, 0x7f, 0xeb, 0xbf, 0x9f, 0xfe,
+ 0xf2, 0xf7, 0xfd, 0x7d, 0x9d, 0xff, 0xdd, 0x7f,
+ 0xff, 0xff, 0xfe, 0xcf, 0xff, 0x6f, 0xfc, 0xdf,
+ 0xff, 0xeb, 0xef, 0xae, 0xbb, 0xfe, 0xff, 0xef,
+ 0xff, 0xfe, 0xf7, 0x7f, 0xcf, 0xef, 0xef, 0xff,
+ 0xdb, 0xff, 0x99, 0xfd, 0xff, 0xfe, 0xfe, 0xfc,
+ 0xff, 0xff, 0xff, 0xd3, 0xed, 0xff, 0xff, 0x7d,
+ 0xff, 0xdb, 0xff, 0xfd, 0xf7, 0xff, 0xff, 0xa6,
+ 0x7f, 0xad, 0xff, 0xe7, 0xfb, 0x6b, 0xed, 0xaf,
+ 0xbf, 0xf5, 0xdd, 0x57, 0x73, 0xfd, 0xfd, 0xfd,
+ 0xff, 0xff, 0xfc, 0xaf, 0xd9, 0x9f, 0xf7, 0xff,
+ 0xf5, 0xa7, 0xfb, 0xfe, 0xeb, 0xbf, 0xd7, 0x95,
+ 0xf5, 0xb4, 0xff, 0x7f, 0xff, 0xff, 0xbf, 0xff,
+ 0x6d, 0xde, 0xd7, 0xcc, 0x3e, 0x9f, 0xed, 0xb7,
+ 0x9f, 0x7a, 0xef, 0x7d, 0xff, 0xf5, 0xb7, 0xd4,
+ 0xf3, 0xfb, 0xff, 0xfd, 0xfc, 0x1b, 0xf5, 0x4d,
+ 0xf3, 0xcf, 0x6f, 0xed, 0xb5, 0xb3, 0x5e, 0x7e,
+ 0xf5, 0x7f, 0x7f, 0x9f, 0xf7, 0xfe, 0xff, 0xe7,
+ 0x9d, 0x57, 0xe6, 0xfe, 0x6a, 0xe7, 0xff, 0xf7,
+ 0x9b, 0x6d, 0xaf, 0xbd, 0x6f, 0xbd, 0xdb, 0x7e,
+ 0xb2, 0x5d, 0xf4, 0xff, 0xff, 0xff, 0xbb, 0x99,
+ 0xff, 0x56, 0xbc, 0xff, 0x99, 0xfb, 0xae, 0xa9,
+ 0xbf, 0xda, 0x55, 0xd6, 0xf7, 0xed, 0x7d, 0xf5,
+ 0xff, 0x7f, 0xeb, 0x64, 0xec, 0xff, 0xf6, 0xfe,
+ 0x77, 0xef, 0xbe, 0x5f, 0x2e, 0xef, 0x75, 0x69,
+ 0xb5, 0xd7, 0xd7, 0x7f, 0xff, 0xff, 0xfd, 0xbf,
+ 0x19, 0xfb, 0x6f, 0xfd, 0xff, 0x5f, 0x6f, 0xbf,
+ 0xbc, 0xcf, 0x7e, 0xf5, 0x50, 0x43, 0xeb, 0xf7,
+ 0xdf, 0xff, 0xff, 0xfd, 0x6f, 0xe6, 0x3d, 0xdf,
+ 0xff, 0xff, 0x2e, 0xf6, 0xdb, 0x7e, 0xbb, 0xff,
+ 0x6c, 0xbf, 0xfd, 0xfe, 0xff, 0x7f, 0xfe, 0xff,
+ 0xff, 0x9d, 0x79, 0xdf, 0x6f, 0xff, 0xfd, 0xbf,
+ 0xf9, 0x26, 0x8b, 0xec, 0x7f, 0x93, 0x45, 0x3e,
+ 0xff, 0xff, 0xbf, 0xff, 0xff, 0x7f, 0x6f, 0xec,
+ 0xc7, 0x4c, 0xfb, 0xec, 0x2f, 0xbe, 0xf4, 0xe3,
+ 0xeb, 0x5f, 0xf8, 0xf1, 0xe7, 0xda, 0x7f, 0xdf,
+ 0xfd, 0xf6, 0xab, 0x9b, 0xf9, 0xf7, 0xff, 0x6f,
+ 0xff, 0xfb, 0xef, 0xff, 0xff, 0xfe, 0xf7, 0xff,
+ 0xff, 0xff, 0xfe, 0xfb, 0xff, 0x9f, 0xdf, 0xce,
+ 0xe6, 0xfe, 0xfe, 0xff, 0xef, 0xfe, 0xfe, 0x9b,
+ 0xff, 0xbf, 0xff, 0xed, 0xff, 0xff, 0xdf, 0x7f,
+ 0xff, 0xff, 0xfb, 0xef, 0xbb, 0xb9, 0x7f, 0xdf,
+ 0xeb, 0xff, 0xfc, 0xf1, 0xc7, 0x9f, 0xff, 0x7f,
+ 0xa1, 0xa5, 0x37, 0xfa, 0x7f, 0xff, 0xf5, 0xfb,
+ 0xdf, 0x6e, 0xde, 0xd7, 0xe9, 0xf2, 0xbf, 0x7f,
+ 0xfe, 0xf9, 0xe7, 0xdf, 0x57, 0x7c, 0xf1, 0x4c,
+ 0x9f, 0x7f, 0x3e, 0xf9, 0xed, 0xdf, 0x9b, 0xff,
+ 0xbf, 0xbb, 0xfe, 0xef, 0xfd, 0xaf, 0x9f, 0xea,
+ 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xf2, 0x5f,
+ 0xff, 0xdf, 0xff, 0xe6, 0xff, 0xfb, 0xa3, 0xcf,
+ 0x3f, 0xf7, 0xc8, 0xa3, 0xcf, 0x2f, 0xef, 0xf8,
+ 0xc7, 0x9e, 0x7d, 0xf6, 0xd1, 0xc7, 0x9f, 0xbf,
+ 0xf9, 0xff, 0xff, 0xeb, 0x77, 0x9f, 0xfc, 0xf2,
+ 0xcb, 0xaf, 0xfb, 0xf3, 0xce, 0x9f, 0x7f, 0x7e,
+ 0xf9, 0xf5, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xff,
+ 0xfa, 0xdf, 0x2f, 0xbf, 0xfc, 0xf2, 0xeb, 0xfb,
+ 0xef, 0xff, 0xf7, 0x97, 0x5f, 0x7e, 0xfd, 0xfd,
+ 0xff, 0x9b, 0xff, 0xbf, 0xfe, 0xfe, 0xef, 0xab,
+ 0xff, 0xfe, 0xfb, 0xfa, 0x57, 0x5f, 0xfd, 0xf1,
+ 0xf7, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xe6, 0xff,
+ 0xfb, 0xaf, 0xf7, 0xdf, 0xfa, 0xff, 0xff, 0xbf,
+ 0xfe, 0xf5, 0xd6, 0x7f, 0x7f, 0xf9, 0xef, 0xd7,
+ 0xdf, 0xff, 0xbf, 0xf9, 0xff, 0xf4, 0xdf, 0x2f,
+ 0xfe, 0xff, 0xff, 0xfb, 0xff, 0xbf, 0xef, 0xc9,
+ 0xff, 0xdf, 0x7f, 0xfa, 0xff, 0xff, 0xf7, 0x6f,
+ 0xfe, 0xbf, 0xeb, 0xaf, 0xbd, 0xfe, 0xfa, 0xab,
+ 0xae, 0xbf, 0xfa, 0xf5, 0x56, 0x4f, 0x2e, 0xc9,
+ 0xf1, 0xd7, 0x5f, 0xfb, 0x9b, 0xcf, 0xff, 0xbd,
+ 0xef, 0xe1, 0xcf, 0xf6, 0xfe, 0xfb, 0xbf, 0xbf,
+ 0x7f, 0xf6, 0xd1, 0xbf, 0xff, 0xff, 0xff, 0xff,
+ 0xf9, 0xe6, 0xff, 0xbf, 0xfb, 0x7b, 0xfd, 0x3e,
+ 0xff, 0xf7, 0xf3, 0xed, 0xfb, 0xd5, 0xcd, 0xbf,
+ 0xff, 0xff, 0xfd, 0xff, 0xfe, 0xbf, 0xf9, 0xff,
+ 0xff, 0xff, 0x5b, 0xff, 0xbe, 0xef, 0xff, 0xfe,
+ 0xff, 0xfb, 0xbf, 0xef, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0x6f, 0xdc, 0xf7, 0xed, 0xf0, 0xeb,
+ 0xa7, 0xbd, 0xfc, 0xfa, 0xeb, 0x5f, 0x36, 0xfd,
+ 0xf7, 0xf7, 0x1f, 0xff, 0xff, 0xff, 0xff, 0x19,
+ 0xf7, 0xff, 0xfb, 0xbf, 0xd5, 0xeb, 0x7f, 0xf7,
+ 0x7e, 0xfa, 0x3e, 0x7d, 0xdf, 0x7f, 0xf7, 0xef,
+ 0xff, 0xff, 0xff, 0x7f, 0xa6, 0xbd, 0xef, 0x2f,
+ 0xff, 0xf6, 0xdb, 0xfb, 0x8e, 0x7f, 0xde, 0xfc,
+ 0xf7, 0xd9, 0xff, 0xdf, 0xff, 0xcf, 0x7f, 0xf7,
+ 0xbf, 0xf1, 0xfb, 0xfd, 0xff, 0xff, 0x3f, 0xfb,
+ 0xff, 0x7f, 0x6d, 0x3f, 0xef, 0xff, 0xbf, 0xff,
+ 0xfe, 0xcf, 0xff, 0xe7, 0xff, 0x67, 0xfc, 0xfd,
+ 0xd7, 0xf7, 0xdf, 0xe7, 0xe5, 0xff, 0xdf, 0xfb,
+ 0x7f, 0xfb, 0xef, 0xff, 0xfb, 0xef, 0xff, 0xff,
+ 0xf7, 0xfb, 0x1b, 0xff, 0xff, 0xbf, 0x68, 0xfa,
+ 0xfe, 0xcf, 0xda, 0x7f, 0xef, 0xfd, 0xe7, 0xf7,
+ 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xe6,
+ 0xff, 0xbf, 0xfe, 0xf7, 0xff, 0xff, 0xdb, 0xfe,
+ 0xf7, 0xdf, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff,
+ 0x7f, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xff, 0xff,
+ 0xf4, 0xff, 0xdf, 0x6f, 0xdc, 0xfe, 0xdb, 0xff,
+ 0xff, 0x97, 0x5e, 0xfe, 0xfd, 0xf5, 0xd7, 0xff,
+ 0x6f, 0xfe, 0xff, 0xec, 0xff, 0xff, 0x3e, 0xcf,
+ 0xfe, 0x7f, 0xeb, 0xfb, 0x77, 0xfd, 0xf7, 0xdf,
+ 0xff, 0xff, 0xfd, 0xf6, 0xff, 0x9b, 0xff, 0xbf,
+ 0xfe, 0xef, 0xff, 0xef, 0xdf, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xfb, 0xfe, 0xf7, 0xf7, 0xaf, 0xff,
+ 0xfd, 0xff, 0x86, 0xff, 0xbf, 0xf5, 0xf2, 0xfb,
+ 0xff, 0x1f, 0xfc, 0xf3, 0xc3, 0x9d, 0xd7, 0x59,
+ 0x4d, 0xf5, 0xf7, 0x3c, 0xff, 0xff, 0x8f, 0xd9,
+ 0xff, 0xee, 0xff, 0xff, 0xfe, 0x9f, 0x1f, 0xff,
+ 0xff, 0x7f, 0xef, 0xff, 0xff, 0xf3, 0xff, 0x3d,
+ 0xf5, 0xd7, 0xff, 0x6d, 0xfe, 0xe7, 0xcf, 0x2f,
+ 0xff, 0xec, 0xff, 0x93, 0x53, 0xa9, 0x55, 0xed,
+ 0xbf, 0xdf, 0x7e, 0x79, 0x6f, 0xb5, 0xb5, 0xff,
+ 0x9b, 0xf5, 0xec, 0xf3, 0xcf, 0x7f, 0xee, 0xdf,
+ 0x77, 0xcd, 0x3a, 0xd7, 0x4b, 0x2f, 0xbd, 0x74,
+ 0xde, 0xeb, 0xaf, 0xff, 0xd7, 0xe6, 0xfe, 0x7f,
+ 0xf6, 0xd7, 0x57, 0xbe, 0xfd, 0xeb, 0xfd, 0xf6,
+ 0xfd, 0xd7, 0x4e, 0x7b, 0xcd, 0xf6, 0xd7, 0x4f,
+ 0xff, 0xbb, 0x99, 0xff, 0xde, 0xfd, 0xff, 0x95,
+ 0x6f, 0xff, 0x4b, 0xf5, 0x59, 0xf7, 0xbf, 0xfd,
+ 0xea, 0xbb, 0xfd, 0xdf, 0x78, 0xbf, 0x6c, 0xec,
+ 0xbf, 0xbe, 0x7d, 0xf7, 0xef, 0xf3, 0xff, 0xda,
+ 0xeb, 0xff, 0xfb, 0xff, 0xff, 0xff, 0x77, 0xfe,
+ 0xff, 0xff, 0xaf, 0x99, 0xfb, 0xaf, 0xfd, 0x97,
+ 0x1f, 0xeb, 0xf5, 0xbf, 0xd6, 0xde, 0xff, 0x5e,
+ 0x6b, 0xed, 0xb5, 0x9f, 0x5f, 0x7f, 0xfd, 0xef,
+ 0xe6, 0xfd, 0xff, 0xb6, 0xeb, 0xce, 0xff, 0xdf,
+ 0x76, 0xef, 0xff, 0x7e, 0xf7, 0xd5, 0x77, 0xdf,
+ 0xef, 0xff, 0xdd, 0xf7, 0xbd, 0x69, 0xff, 0x7f,
+ 0xbf, 0xf7, 0xf7, 0xfb, 0x7f, 0xde, 0xf9, 0xff,
+ 0x9d, 0x7f, 0xfe, 0xf9, 0xe7, 0xf3, 0x7f, 0xfe,
+ 0x79, 0x6f, 0xec, 0xff, 0xee, 0xfb, 0xed, 0xb6,
+ 0xd7, 0x7c, 0xfb, 0xef, 0x7f, 0x2f, 0xfd, 0xf5,
+ 0xd3, 0x5f, 0x3f, 0xed, 0xf4, 0xbf, 0x99, 0xf9,
+ 0xf7, 0xdf, 0x6f, 0xbf, 0xff, 0xf7, 0xfb, 0xfb,
+ 0xff, 0xff, 0xcf, 0x3e, 0x7b, 0xec, 0xf7, 0xcd,
+ 0x36, 0xfb, 0xcf, 0xe6, 0x7e, 0xff, 0xbb, 0xef,
+ 0xfe, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xb6,
+ 0xdd, 0x76, 0xfb, 0xdf, 0xb5, 0xd7, 0xfe, 0xbb,
+ 0xa9, 0xdf, 0xda, 0x3f, 0xff, 0xfc, 0xf7, 0xe2,
+ 0xdf, 0xbf, 0xfd, 0xef, 0xb7, 0xdf, 0x7e, 0xfb,
+ 0xff, 0xf5, 0xd7, 0xff, 0x6a, 0xde, 0xbf, 0xda,
+ 0xaf, 0xbf, 0x2d, 0xba, 0xdc, 0xef, 0xaf, 0xff,
+ 0x7d, 0xb7, 0xdd, 0x77, 0x7f, 0xfc, 0xfb, 0xef,
+ 0xdf, 0x9b, 0xff, 0xbf, 0xfb, 0xeb, 0xff, 0xff,
+ 0xaf, 0xbf, 0xdf, 0xfb, 0xd7, 0xdd, 0x7f, 0xff,
+ 0xfd, 0xfe, 0xef, 0xf7, 0xff, 0xff, 0xe6, 0xff,
+ 0xff, 0xf3, 0xcf, 0x3d, 0x7a, 0xc8, 0xb3, 0x8b,
+ 0x1e, 0x75, 0xd9, 0x67, 0x9f, 0x7d, 0x76, 0xd0,
+ 0x47, 0x9f, 0xbf, 0xf9, 0xff, 0xfb, 0xdf, 0x7f,
+ 0xfe, 0x5f, 0xfa, 0xff, 0xbf, 0x5f, 0xfd, 0xfd,
+ 0xf7, 0xdf, 0xff, 0xdb, 0xfe, 0xff, 0xff, 0x6f,
+ 0xfe, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xbf, 0xfe,
+ 0xff, 0xee, 0x5f, 0xd7, 0xfd, 0xf7, 0xdf, 0x7f,
+ 0x5f, 0xfd, 0xf5, 0xff, 0x9b, 0xff, 0xb7, 0xfe,
+ 0xf9, 0xef, 0xbf, 0xbf, 0xbf, 0xeb, 0x6f, 0x7f,
+ 0x7f, 0xfd, 0xf5, 0xd7, 0x3f, 0x5b, 0x7f, 0xfd,
+ 0xff, 0xe6, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7a,
+ 0xeb, 0xbf, 0xfb, 0xfe, 0x7f, 0xf7, 0xdf, 0x7f,
+ 0xff, 0xf7, 0xfe, 0xff, 0xff, 0x8f, 0xd9, 0xff,
+ 0xf2, 0xff, 0x6f, 0xff, 0xfd, 0xff, 0x1b, 0x6f,
+ 0x7f, 0xfb, 0xe9, 0xff, 0xdf, 0x7e, 0xfb, 0xed,
+ 0xb7, 0xff, 0x6f, 0xfa, 0xbf, 0x6b, 0x2f, 0xbe,
+ 0x7e, 0xe8, 0xab, 0x2f, 0xbf, 0xfe, 0x35, 0xd3,
+ 0x5f, 0x7f, 0xad, 0x75, 0x57, 0x5d, 0xfb, 0x9b,
+ 0xff, 0x3f, 0xff, 0xfc, 0xf4, 0xf9, 0xff, 0x3f,
+ 0xfd, 0x7c, 0xe7, 0xfd, 0xfd, 0xff, 0xb9, 0x17,
+ 0xdb, 0x7b, 0xdf, 0xbf, 0xc6, 0xff, 0xf5, 0xbf,
+ 0x7f, 0xef, 0xdf, 0x3f, 0xdf, 0xeb, 0xff, 0x7f,
+ 0xfd, 0xee, 0xff, 0x7f, 0xff, 0xfe, 0xff, 0xfd,
+ 0x9f, 0xf9, 0xff, 0xfb, 0xfb, 0xff, 0xff, 0xff,
+ 0x67, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff,
+ 0x7f, 0xfd, 0xff, 0xff, 0xfd, 0x6f, 0xfe, 0xb7,
+ 0xfe, 0xfa, 0xcf, 0xf7, 0xbf, 0xff, 0x7f, 0xfa,
+ 0x7a, 0x7f, 0xbe, 0xf5, 0x77, 0x57, 0xdf, 0xb7,
+ 0xf6, 0xff, 0x9b, 0xff, 0x9f, 0xb7, 0xfe, 0xff,
+ 0xff, 0x7f, 0xfe, 0x7f, 0xfb, 0x77, 0xf7, 0x7f,
+ 0xfb, 0xb6, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xe6,
+ 0xff, 0xcf, 0xff, 0x8f, 0xf6, 0xff, 0x5f, 0x1f,
+ 0xfb, 0xef, 0x7f, 0x4e, 0x7f, 0xe7, 0xe7, 0xb7,
+ 0xff, 0xdf, 0xf7, 0xbf, 0xf9, 0xff, 0xfe, 0x7f,
+ 0xcf, 0xbf, 0xfb, 0xff, 0xeb, 0x6f, 0x9f, 0xfb,
+ 0x3f, 0xf7, 0xff, 0xff, 0xfe, 0xf5, 0xf7, 0xff,
+ 0x6f, 0xfe, 0xbd, 0xf5, 0xff, 0xfb, 0xef, 0xf7,
+ 0x1f, 0x6f, 0xfb, 0xf7, 0xf7, 0xf7, 0xe7, 0x7f,
+ 0xf7, 0xfd, 0xff, 0xf7, 0xff, 0x9b, 0xff, 0xff,
+ 0xef, 0xff, 0xff, 0xfd, 0xd7, 0x7f, 0x7f, 0xfc,
+ 0xef, 0x5e, 0x7f, 0xf8, 0xfe, 0x7f, 0xfd, 0xf3,
+ 0xff, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xef, 0xff,
+ 0xbf, 0xdf, 0xdf, 0xfc, 0xfd, 0xf7, 0xff, 0x7f,
+ 0xff, 0xff, 0x5e, 0xff, 0xff, 0xff, 0xbf, 0xa9,
+ 0x7f, 0xff, 0xef, 0xad, 0xbd, 0x7e, 0x73, 0xff,
+ 0xdd, 0xef, 0xbb, 0xf5, 0x96, 0x7f, 0xf7, 0xff,
+ 0x77, 0xfb, 0xef, 0x6f, 0xfc, 0xff, 0xfe, 0xf8,
+ 0xef, 0xaf, 0x7f, 0xfe, 0xf7, 0x3e, 0xf7, 0xff,
+ 0xfd, 0xf5, 0xbf, 0xff, 0xfb, 0xfd, 0xf7, 0xff,
+ 0x99, 0xff, 0xbf, 0xff, 0xff, 0x6b, 0xff, 0xbf,
+ 0xff, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xfd,
+ 0xff, 0x5f, 0xff, 0xfd, 0xff, 0xa6, 0xff, 0xff,
+ 0xff, 0xd7, 0xfb, 0x6f, 0x9e, 0xbf, 0xe6, 0xf3,
+ 0xd7, 0xff, 0xff, 0xaf, 0x9f, 0xdd, 0xff, 0xff,
+ 0xff, 0xaf, 0xd9, 0xff, 0xff, 0xff, 0xe5, 0xff,
+ 0xcb, 0xcf, 0xdf, 0xfc, 0x7f, 0xfb, 0xbd, 0xff,
+ 0xfe, 0x67, 0xff, 0xf5, 0xd7, 0xff, 0x6d, 0xfe,
+ 0xa7, 0xff, 0x7b, 0xbd, 0xb9, 0xff, 0xf5, 0x7a,
+ 0xbd, 0xd5, 0x2f, 0xff, 0xff, 0xd4, 0xd9, 0x6d,
+ 0xbd, 0x75, 0xfe, 0x1b, 0xf5, 0xec, 0xb3, 0xff,
+ 0xfe, 0xfb, 0x5f, 0xb7, 0x9f, 0x7d, 0xdf, 0x5f,
+ 0xff, 0x9f, 0xf5, 0xf7, 0xeb, 0xaf, 0xff, 0x57,
+ 0xc6, 0x7e, 0x4d, 0x6f, 0xdf, 0x7d, 0x76, 0xfd,
+ 0xbb, 0xd7, 0x35, 0xb7, 0xfa, 0x4c, 0xbb, 0xcd,
+ 0xbc, 0xd7, 0x4f, 0xff, 0xbb, 0x99, 0xff, 0xf6,
+ 0xd9, 0x63, 0xaf, 0x6d, 0xff, 0xfb, 0x76, 0x48,
+ 0xef, 0xde, 0x5b, 0xe5, 0x3d, 0xef, 0x5f, 0x79,
+ 0xed, 0x64, 0xec, 0xbf, 0x1e, 0x7a, 0xe8, 0xaf,
+ 0xff, 0xff, 0xfb, 0xff, 0xdf, 0xdb, 0x07, 0xf5,
+ 0x57, 0x71, 0xff, 0xff, 0xff, 0xbf, 0x99, 0xfb,
+ 0x6f, 0x94, 0x5d, 0xf2, 0xdb, 0xff, 0xbf, 0xf7,
+ 0xde, 0xdf, 0xfe, 0xe7, 0xf5, 0x75, 0xde, 0x5e,
+ 0x7f, 0xfd, 0x6f, 0xc6, 0xfd, 0xdf, 0x7e, 0xdb,
+ 0xed, 0xb7, 0xdd, 0xff, 0xf3, 0xff, 0xfe, 0xbf,
+ 0xff, 0xf6, 0xdb, 0xfe, 0xf7, 0xdf, 0xf7, 0x9d,
+ 0x71, 0xff, 0x7f, 0xbd, 0xf9, 0xc6, 0x9b, 0x7f,
+ 0xbf, 0xf9, 0xfe, 0xff, 0xcf, 0x3f, 0xef, 0x6c,
+ 0xf7, 0xfd, 0xf7, 0x79, 0x6f, 0xec, 0xdf, 0xbc,
+ 0xe3, 0x8d, 0x37, 0xd6, 0x6e, 0xfb, 0xcf, 0x7f,
+ 0xaf, 0xb1, 0xe6, 0x1a, 0x57, 0x7f, 0xfd, 0xb4,
+ 0xaa, 0x9b, 0xf9, 0xf3, 0xdf, 0x6f, 0xff, 0xfc,
+ 0xff, 0xdb, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff,
+ 0xff, 0xf7, 0xcf, 0x36, 0xfb, 0xcf, 0xe6, 0xfe,
+ 0xfe, 0xfb, 0xf7, 0xdf, 0xff, 0xff, 0xfe, 0xff,
+ 0xff, 0xff, 0xff, 0xfd, 0xfd, 0xff, 0x7f, 0xb7,
+ 0xd7, 0xfe, 0xbb, 0xb9, 0xff, 0xf2, 0x4f, 0x3f,
+ 0xf5, 0xd4, 0x7f, 0x6f, 0x7d, 0x7d, 0xef, 0xcf,
+ 0x3f, 0xff, 0xfc, 0xef, 0xff, 0xd7, 0xdf, 0x6e,
+ 0xde, 0xbf, 0xfa, 0xea, 0xab, 0xaf, 0xfe, 0xfd,
+ 0xab, 0xbd, 0x7c, 0x7d, 0xf3, 0xc7, 0x33, 0xff,
+ 0xf4, 0xff, 0xee, 0xdf, 0x9b, 0xff, 0xbf, 0xfb,
+ 0xfe, 0xfb, 0xef, 0xff, 0xf7, 0xfe, 0x7f, 0xf7,
+ 0xfb, 0x7d, 0xbd, 0x5f, 0xfb, 0xff, 0xff, 0xff,
+ 0xff, 0xe6, 0xff, 0xff, 0xe3, 0x8f, 0x3f, 0xfe,
+ 0xfc, 0xe3, 0xcf, 0x3f, 0xf7, 0xf1, 0x67, 0x1e,
+ 0x7f, 0xfe, 0xf9, 0x47, 0x9f, 0xbf, 0xf9, 0xff,
+ 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xf7, 0xef, 0xff,
+ 0x7f, 0xff, 0xef, 0xbf, 0xdf, 0x7f, 0xfd, 0xff,
+ 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xff, 0xfb, 0xef,
+ 0xbf, 0xbf, 0xfd, 0xfb, 0xff, 0x7f, 0xff, 0xfb,
+ 0xe7, 0xf7, 0x5f, 0xff, 0xff, 0xf5, 0xff, 0x9b,
+ 0xff, 0xbf, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xff,
+ 0xfa, 0xef, 0x77, 0xff, 0xfd, 0xf5, 0xdf, 0x57,
+ 0xff, 0x7f, 0xfd, 0xff, 0xe6, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xdf, 0xbf, 0xff, 0xff, 0xf7,
+ 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff,
+ 0xbf, 0xf9, 0xff, 0xfe, 0xfb, 0x4f, 0xbf, 0xfd,
+ 0x7f, 0xdb, 0xef, 0xef, 0xff, 0xfd, 0xf7, 0xdf,
+ 0x7e, 0xf3, 0xe7, 0x97, 0xff, 0x6f, 0xfa, 0x7f,
+ 0xeb, 0xae, 0xbb, 0xe6, 0xfa, 0xe3, 0xaf, 0xbb,
+ 0xfe, 0x75, 0xc7, 0x1f, 0x3f, 0xf5, 0xd5, 0x57,
+ 0x5f, 0xfb, 0x9b, 0xbf, 0xff, 0xfd, 0xfb, 0xff,
+ 0xcb, 0x3e, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xef,
+ 0xb6, 0xd9, 0x67, 0xff, 0xf7, 0xfe, 0xf9, 0xc6,
+ 0xff, 0xff, 0xfb, 0xff, 0xbf, 0xfd, 0xff, 0xff,
+ 0xeb, 0xef, 0xff, 0x7b, 0xf7, 0xbf, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xbf, 0xd9, 0xbf, 0x6f, 0xff,
+ 0xff, 0x7f, 0xfb, 0xd2, 0xfd, 0xf7, 0xdf, 0xdb,
+ 0xbf, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xfe, 0xff,
+ 0x6f, 0xfe, 0xbf, 0xfe, 0x7a, 0x2b, 0xef, 0xff,
+ 0xfe, 0xfb, 0xff, 0xfe, 0xc7, 0xf9, 0xf7, 0xdd,
+ 0xff, 0x7f, 0xfd, 0xf1, 0xff, 0x99, 0xff, 0x9f,
+ 0x7f, 0xde, 0xf9, 0xdf, 0xe7, 0xfe, 0xbf, 0xff,
+ 0xff, 0xdf, 0xb7, 0xff, 0xdf, 0xff, 0x3d, 0x5f,
+ 0xff, 0x7f, 0xe6, 0xbf, 0xff, 0xbe, 0xff, 0xb5,
+ 0xfb, 0xff, 0xef, 0x7f, 0xfe, 0xfe, 0xcf, 0xdf,
+ 0x7f, 0xdf, 0xff, 0x7f, 0xfd, 0xff, 0xbf, 0xf9,
+ 0xff, 0xff, 0xdf, 0xfd, 0x3f, 0xf6, 0xff, 0xbf,
+ 0xaf, 0x7f, 0xfd, 0xf5, 0x7f, 0x5f, 0x5f, 0xff,
+ 0x75, 0xf7, 0xff, 0x67, 0xfe, 0xfe, 0xff, 0xf7,
+ 0x7f, 0xff, 0xf7, 0xef, 0xff, 0xfe, 0xf7, 0xef,
+ 0xd7, 0x7f, 0xff, 0x7f, 0xff, 0xef, 0xd7, 0xfb,
+ 0x9b, 0xff, 0xfd, 0xdf, 0xff, 0xff, 0xe3, 0xce,
+ 0x3e, 0xff, 0xff, 0xe7, 0xbf, 0xff, 0xf7, 0xff,
+ 0xff, 0xff, 0x9f, 0xff, 0x7f, 0xe6, 0xff, 0xfe,
+ 0xfd, 0xdf, 0xff, 0xfb, 0xb3, 0xcf, 0xff, 0xff,
+ 0xf9, 0xef, 0xff, 0xef, 0xff, 0xdf, 0xff, 0xff,
+ 0xff, 0xbf, 0xf9, 0xff, 0x7a, 0xeb, 0xff, 0xff,
+ 0xed, 0xfb, 0xaf, 0xbe, 0xff, 0xfd, 0xe7, 0xff,
+ 0x7f, 0xc7, 0xbf, 0xe7, 0xff, 0xff, 0x6f, 0xfc,
+ 0xff, 0xfe, 0xfa, 0xff, 0xf7, 0x7f, 0xf6, 0xf9,
+ 0xef, 0x7b, 0xff, 0xfd, 0x9f, 0xdd, 0x7e, 0xf3,
+ 0xfd, 0xf7, 0xff, 0x9b, 0xef, 0xdf, 0xff, 0xff,
+ 0xef, 0xff, 0xdf, 0x7f, 0x7f, 0xfc, 0xd7, 0x9f,
+ 0xfd, 0xdf, 0xf5, 0xdf, 0x5f, 0xff, 0xfd, 0xff,
+ 0x86, 0xff, 0xef, 0xff, 0xff, 0x5f, 0xea, 0x3b,
+ 0xbf, 0xbe, 0x9f, 0xff, 0xff, 0xdf, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0x8f, 0xd9, 0xff, 0xff,
+ 0xff, 0xaf, 0xa7, 0xfc, 0xf6, 0xdb, 0xef, 0xff,
+ 0x3f, 0xff, 0xf7, 0x5f, 0x7f, 0xfd, 0xf5, 0xd7,
+ 0xff, 0x6d, 0xfe, 0xa7, 0xce, 0xfe, 0xff, 0xaf,
+ 0xf7, 0xde, 0x3e, 0x7b, 0xff, 0xaf, 0x8d, 0xf7,
+ 0xd6, 0x5b, 0x6f, 0xbd, 0xf5, 0xff, 0x9b, 0xf5,
+ 0xed, 0xb7, 0xff, 0x7a, 0xeb, 0xb5, 0xd7, 0xfe,
+ 0xfe, 0xff, 0x7b, 0xef, 0xbd, 0xfe, 0xfa, 0xeb,
+ 0xaf, 0xff, 0xd7, 0xe6, 0xfe, 0xee, 0x32, 0xff,
+ 0xbf, 0xdf, 0x7b, 0xbf, 0xd5, 0xff, 0xbf, 0xdd,
+ 0xc2, 0x7f, 0xfd, 0xb5, 0xd3, 0x4c, 0xfb, 0xbb,
+ 0x99, 0xfe, 0xef, 0xd9, 0xa7, 0xfe, 0xfb, 0xde,
+ 0x7b, 0xf7, 0xfe, 0xef, 0xdf, 0x73, 0xff, 0xbf,
+ 0x6f, 0x3e, 0xfb, 0xbe, 0x6c, 0xec, 0xbf, 0xbe,
+ 0x7a, 0xfc, 0xaf, 0xfe, 0xfe, 0xde, 0xea, 0xbf,
+ 0xab, 0x75, 0xf7, 0xff, 0xf6, 0xdf, 0xff, 0xff,
+ 0xbf, 0x99, 0xfb, 0xef, 0xbf, 0x5d, 0xfa, 0xeb,
+ 0xbf, 0xfd, 0xf6, 0xfa, 0xff, 0xf8, 0xff, 0xfd,
+ 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xef, 0xe6, 0xfd,
+ 0xff, 0x76, 0xff, 0x6f, 0xff, 0xff, 0xee, 0xff,
+ 0xff, 0x76, 0xbb, 0xfd, 0x7f, 0xdf, 0x7d, 0xf7,
+ 0xfd, 0xf7, 0xbd, 0x79, 0xff, 0x7f, 0xbf, 0xfd,
+ 0xf7, 0xd7, 0x3f, 0xff, 0xff, 0xff, 0xbf, 0xcf,
+ 0xf3, 0xdf, 0x65, 0x9f, 0x7d, 0xf6, 0x79, 0x6f,
+ 0xec, 0xff, 0x6e, 0xe3, 0xee, 0xbb, 0xb9, 0xfe,
+ 0x7a, 0xed, 0x75, 0x9f, 0xf1, 0xb5, 0xd3, 0x4b,
+ 0x3f, 0xbd, 0xf4, 0xbf, 0x99, 0xf9, 0xff, 0xcf,
+ 0xff, 0xff, 0xbf, 0xef, 0xbf, 0xff, 0xff, 0xff,
+ 0xf7, 0x7f, 0xdf, 0xed, 0xb3, 0xcd, 0x3e, 0xfb,
+ 0xcf, 0xe6, 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff,
+ 0xdb, 0xef, 0xff, 0xff, 0xf7, 0xff, 0xff, 0x7f,
+ 0x7b, 0xed, 0xb6, 0xd7, 0xfe, 0xbb, 0xa9, 0xff,
+ 0xfb, 0x4b, 0xf7, 0xbf, 0xf6, 0xdf, 0x7f, 0xaf,
+ 0xff, 0xaf, 0xcf, 0xff, 0xff, 0x7f, 0xfd, 0xf5,
+ 0xd7, 0xff, 0x6a, 0xd8, 0xff, 0xdc, 0xea, 0xdf,
+ 0x2f, 0xfe, 0xfb, 0xef, 0xdb, 0xfd, 0xfd, 0xb3,
+ 0xef, 0x57, 0xf9, 0xfd, 0xb7, 0xdf, 0xdf, 0x9b,
+ 0xff, 0xbf, 0xff, 0xfe, 0xff, 0xeb, 0xae, 0xfb,
+ 0x7f, 0xfa, 0xff, 0x7f, 0xaf, 0xbf, 0xf5, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xe6, 0xff, 0xef, 0xf3,
+ 0xcf, 0x3f, 0xfa, 0xe8, 0xf3, 0x8f, 0x3f, 0xff,
+ 0x91, 0xe5, 0x9f, 0x7f, 0xf4, 0xd1, 0x47, 0x9f,
+ 0xbf, 0xf9, 0xff, 0xfa, 0xef, 0xaf, 0xbf, 0xfe,
+ 0xfa, 0xeb, 0xbf, 0xff, 0xff, 0xef, 0x97, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xbf,
+ 0xfe, 0xff, 0xeb, 0xaf, 0xbf, 0xfe, 0xfa, 0xff,
+ 0xff, 0xff, 0x7b, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd,
+ 0xf5, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xfa, 0xff,
+ 0xbf, 0xff, 0xbe, 0xfa, 0xfb, 0x7f, 0xff, 0x75,
+ 0xf9, 0xd5, 0x57, 0x5f, 0x7d, 0xf5, 0xff, 0x86,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf,
+ 0xff, 0xff, 0xff, 0xf7, 0x5d, 0xfe, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x8f, 0xf9, 0xff, 0xf2, 0xcb,
+ 0x2f, 0xff, 0xff, 0xf3, 0xbf, 0xef, 0xfe, 0xff,
+ 0xcf, 0xa7, 0xdf, 0x7e, 0xfb, 0xef, 0xa7, 0xff,
+ 0x6f, 0xfa, 0xff, 0xeb, 0xad, 0xbf, 0xfe, 0xd8,
+ 0xeb, 0x8f, 0xb7, 0xee, 0xf5, 0xd7, 0x5a, 0x7f,
+ 0xdd, 0xf5, 0xc7, 0x5d, 0xff, 0x9b, 0xff, 0xdf,
+ 0xdf, 0x7f, 0xdd, 0xbf, 0xff, 0xfe, 0xf3, 0xbf,
+ 0x9f, 0xdf, 0xdd, 0xfd, 0xf9, 0xf7, 0xdf, 0xfd,
+ 0xff, 0xbf, 0xc6, 0xff, 0xff, 0xff, 0xff, 0xd3,
+ 0xff, 0xff, 0xff, 0xcf, 0xfb, 0xfd, 0xff, 0xff,
+ 0xd7, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9e, 0xf9,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xdf, 0xfd,
+ 0xfb, 0xff, 0xdd, 0xef, 0xef, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xbf, 0xfe, 0xfa,
+ 0xab, 0xa7, 0xef, 0x7e, 0xfb, 0xcd, 0x5b, 0xff,
+ 0xfd, 0xf1, 0x47, 0x5f, 0x7f, 0xbd, 0xf5, 0xff,
+ 0x9b, 0xff, 0x5f, 0x7f, 0xfe, 0xf5, 0xd7, 0xff,
+ 0xfe, 0xff, 0xff, 0xd7, 0xff, 0x7f, 0xff, 0xdf,
+ 0xdf, 0x7f, 0xff, 0xfc, 0xff, 0xe6, 0xff, 0xdf,
+ 0x9f, 0x7f, 0xfe, 0xab, 0xfb, 0x6e, 0xbf, 0xef,
+ 0xf6, 0xd7, 0x3f, 0x7f, 0xff, 0xe5, 0xd7, 0x7f,
+ 0xf7, 0xbf, 0xf9, 0xff, 0xff, 0xff, 0xed, 0x1f,
+ 0xbf, 0xfe, 0xff, 0x7f, 0x7f, 0xbb, 0x69, 0xfe,
+ 0xff, 0x7f, 0xff, 0xdd, 0xf7, 0x7f, 0x6f, 0xfe,
+ 0xff, 0xff, 0xff, 0x7b, 0xbf, 0xff, 0xfe, 0xff,
+ 0xff, 0xce, 0xbe, 0xfd, 0x7f, 0xff, 0xdf, 0x7e,
+ 0x3b, 0xed, 0xfb, 0x9b, 0xfd, 0xff, 0xff, 0xdf,
+ 0xef, 0xf3, 0x7b, 0xdf, 0x7f, 0xff, 0xfd, 0xff,
+ 0xfd, 0xff, 0xef, 0xff, 0xff, 0xf7, 0xff, 0xff,
+ 0xe6, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xe7, 0xff,
+ 0xfe, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xbf, 0xf9, 0xff, 0xff,
+ 0xff, 0xb7, 0x7f, 0xf9, 0x7b, 0xef, 0xbd, 0xf7,
+ 0xdf, 0x75, 0xd7, 0xff, 0xe7, 0xfb, 0xef, 0xbc,
+ 0xff, 0x6f, 0xfc, 0xff, 0xff, 0xef, 0x37, 0xf7,
+ 0xde, 0xfa, 0xf8, 0xe2, 0x7f, 0xff, 0xed, 0xb7,
+ 0xff, 0xff, 0xff, 0xfd, 0xf7, 0xff, 0x99, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0xff, 0xff,
+ 0xff, 0xef, 0x7f, 0xff, 0xfe, 0xff, 0xfe, 0xbf,
+ 0xff, 0xbe, 0xff, 0xa6, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xcf, 0xff, 0xe9, 0xe4, 0xf2, 0xbf, 0x7a,
+ 0xf3, 0x7d, 0xff, 0xf5, 0xff, 0x5f, 0xff, 0x8f,
+ 0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0x5e,
+ 0xf9, 0xe5, 0xf3, 0x9f, 0xff, 0x7f, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xdf, 0xff, 0x6d, 0xfe, 0xff, 0xff,
+ 0xfe, 0xff, 0xbf, 0xff, 0xd7, 0x6b, 0xbb, 0xff,
+ 0xaf, 0xf7, 0xff, 0xdc, 0x5f, 0xaf, 0xfd, 0xfd,
+ 0xff, 0x9b, 0xf5, 0xff, 0xb7, 0xff, 0xff, 0xff,
+ 0xef, 0xd7, 0x5e, 0xfb, 0xff, 0xff, 0xff, 0xbf,
+ 0xff, 0xf4, 0x79, 0xef, 0xfd, 0xd7, 0xa6, 0x7e,
+ 0xfd, 0xbb, 0xff, 0xff, 0xdf, 0xed, 0xe5, 0xfd,
+ 0x66, 0xbf, 0xfa, 0xea, 0x5b, 0xab, 0xb4, 0xf2,
+ 0xc3, 0xb3, 0xbb, 0x99, 0x5f, 0xff, 0xaf, 0xbf,
+ 0xda, 0x1b, 0xaa, 0x79, 0xef, 0xfd, 0xef, 0x3e,
+ 0xfb, 0xca, 0xac, 0xaf, 0xf4, 0xda, 0xea, 0x6c,
+ 0xe6, 0xff, 0xff, 0xfa, 0xff, 0xff, 0xf6, 0xfe,
+ 0xfb, 0xfb, 0xbf, 0x8f, 0xbe, 0xfa, 0xdf, 0xfe,
+ 0x7f, 0xfd, 0xfd, 0xbf, 0x99, 0xfb, 0xff, 0xbf,
+ 0xfe, 0xfb, 0x7f, 0xa9, 0xff, 0xf6, 0xdb, 0xff,
+ 0xf8, 0xab, 0xaf, 0xdf, 0xff, 0xdf, 0xff, 0xfd,
+ 0xef, 0xc6, 0xbd, 0xff, 0xff, 0xfb, 0x6f, 0x37,
+ 0xfe, 0xfe, 0xbb, 0xff, 0xf6, 0xdf, 0x7f, 0x97,
+ 0x9f, 0x7f, 0xfe, 0xf9, 0xff, 0xbd, 0x79, 0x1f,
+ 0xff, 0xff, 0xf5, 0xff, 0xf9, 0x7f, 0xfd, 0xfc,
+ 0xff, 0x3f, 0xff, 0xfe, 0xfb, 0xee, 0xbf, 0xdf,
+ 0xfe, 0x7b, 0x6f, 0xec, 0xff, 0xfe, 0xfb, 0xee,
+ 0x3f, 0xfe, 0xbe, 0xfa, 0xeb, 0x75, 0xbf, 0x3d,
+ 0x76, 0x9f, 0x69, 0xb7, 0xdd, 0x76, 0xbf, 0x99,
+ 0xf9, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xbf,
+ 0xff, 0xfe, 0xff, 0xe7, 0xff, 0xff, 0xfe, 0xfb,
+ 0xe7, 0xb7, 0xff, 0xcf, 0xe6, 0xfe, 0xff, 0xfb,
+ 0xff, 0xff, 0xff, 0xff, 0x6f, 0xbf, 0xff, 0xf7,
+ 0xdd, 0x7f, 0xdf, 0xbf, 0xff, 0xfe, 0xfb, 0xff,
+ 0xbb, 0xb9, 0xff, 0xff, 0xeb, 0xff, 0xff, 0xf1,
+ 0xfb, 0x7f, 0xff, 0xfd, 0xa7, 0x9f, 0x7f, 0xde,
+ 0xed, 0xff, 0xff, 0xff, 0xff, 0x6a, 0xde, 0xff,
+ 0xff, 0xf2, 0xdd, 0x7d, 0xde, 0xfc, 0xef, 0xbf,
+ 0xfd, 0xfd, 0xf7, 0xdf, 0x5f, 0xff, 0xfd, 0x95,
+ 0xdf, 0xcf, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xfb,
+ 0xbd, 0xa7, 0xbf, 0xfe, 0xff, 0xff, 0xff, 0xed,
+ 0xff, 0xfd, 0xdf, 0x7f, 0xff, 0xfd, 0xfe, 0xe6,
+ 0xff, 0xff, 0xf3, 0xcf, 0x3e, 0xff, 0xe8, 0xa3,
+ 0xcf, 0x3f, 0xef, 0xf9, 0xe7, 0x96, 0x39, 0xfc,
+ 0xf9, 0x43, 0x9f, 0xbf, 0xf9, 0xff, 0xff, 0xef,
+ 0xff, 0xbf, 0xfd, 0xfb, 0xeb, 0xaf, 0xff, 0xfb,
+ 0xef, 0x3f, 0x7f, 0xbf, 0xfd, 0xfd, 0xd3, 0xdf,
+ 0x6f, 0xfe, 0xff, 0xff, 0xfe, 0xff, 0x3f, 0xff,
+ 0xfe, 0xfa, 0xeb, 0xff, 0xff, 0xff, 0xff, 0xf5,
+ 0xdb, 0x7f, 0xbf, 0xf5, 0xff, 0x9b, 0xff, 0xff,
+ 0xff, 0xfe, 0xfe, 0xbf, 0xff, 0xff, 0xfb, 0xea,
+ 0x3f, 0xff, 0xfc, 0xd7, 0xdd, 0x7f, 0xff, 0xfd,
+ 0xf7, 0xff, 0xe6, 0xff, 0xff, 0xef, 0xbf, 0xff,
+ 0xff, 0xff, 0xff, 0xbf, 0xfe, 0xff, 0xff, 0xff,
+ 0xff, 0xbd, 0xff, 0xf7, 0xfb, 0xff, 0x8f, 0xd9,
+ 0xff, 0xef, 0xcb, 0xeb, 0xaf, 0xfc, 0xe6, 0x4f,
+ 0xff, 0xff, 0xfb, 0xed, 0xb7, 0x9f, 0xfe, 0xf3,
+ 0xe5, 0xbf, 0xff, 0x6f, 0xfe, 0xff, 0xeb, 0xaf,
+ 0xb9, 0xde, 0x7a, 0xeb, 0xaf, 0xbe, 0xee, 0xd5,
+ 0xc7, 0x5d, 0x75, 0xfd, 0x75, 0xd7, 0x5f, 0xff,
+ 0x9b, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xfd, 0xe7,
+ 0xef, 0xff, 0xef, 0x97, 0x1f, 0x7e, 0xdb, 0xff,
+ 0xf7, 0xff, 0x7f, 0xff, 0xff, 0xc6, 0xfb, 0xff,
+ 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0x7f,
+ 0x73, 0xd7, 0xbf, 0xfb, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x9f, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xd7, 0xdd, 0x7f, 0xef, 0xdf, 0xff, 0xfa,
+ 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0x6f, 0xfc,
+ 0xff, 0xfb, 0xfa, 0xcb, 0xef, 0x37, 0xff, 0xf4,
+ 0xcf, 0x7f, 0xfe, 0xf9, 0xf9, 0xc7, 0x7f, 0x7f,
+ 0xfd, 0xf7, 0xff, 0x9b, 0xff, 0xff, 0x7f, 0xfd,
+ 0xbb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x77, 0xff,
+ 0xf7, 0x7f, 0x7b, 0xf7, 0x3f, 0x7f, 0xff, 0xff,
+ 0x66, 0xef, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff,
+ 0xff, 0xbf, 0xbf, 0xfe, 0xf7, 0xff, 0xff, 0xfb,
+ 0xff, 0xff, 0xfb, 0xff, 0xbf, 0xd9, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xf7, 0xfe, 0x7f, 0xff,
+ 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x4f, 0xff,
+ 0xff, 0x6f, 0xfa, 0xff, 0xff, 0xff, 0xfe, 0xf7,
+ 0xff, 0xff, 0xbf, 0xff, 0xef, 0xff, 0xff, 0xdf,
+ 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x9b, 0xff,
+ 0xff, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xfd,
+ 0xbf, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xe7, 0xff, 0xff, 0xe6, 0xff, 0xff, 0xff, 0xfe,
+ 0xfb, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf,
+ 0xf9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xbf,
+ 0x7f, 0xff, 0xf3, 0x93, 0x7f, 0xff, 0xff, 0x7f,
+ 0xfd, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xf3, 0xff, 0xf7, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xdf,
+ 0xff, 0x99, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x5f, 0xff, 0xff, 0xf7, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x66, 0xff,
+ 0xcf, 0x3f, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xfd,
+ 0xf8, 0xe7, 0x9f, 0x7f, 0xfa, 0xf9, 0xe7, 0x1f,
+ 0x7f, 0xfe, 0x9f, 0xf9, 0xff, 0xf7, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xdf, 0x3f, 0xff, 0xfb, 0x6f,
+ 0xbf, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0x6f,
+ 0xfe, 0xff, 0xfe, 0xfa, 0xe3, 0xb7, 0xfd, 0xee,
+ 0x7b, 0xed, 0x7e, 0xff, 0xbd, 0xf6, 0xdf, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xff, 0x9b, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff,
+ 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff,
+ 0xff, 0xa6, 0xff, 0xef, 0xaf, 0x7f, 0xfe, 0xfb,
+ 0xaf, 0xbf, 0xff, 0xfc, 0xf7, 0xdf, 0x7f, 0xff,
+ 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xbf, 0xf9, 0xff,
+ 0xfc, 0xf7, 0xdf, 0x3f, 0xff, 0xfc, 0xf3, 0xcf,
+ 0x77, 0xfe, 0xf9, 0xe7, 0x9f, 0x3f, 0xfe, 0xf9,
+ 0xe7, 0xff, 0x6f, 0xfe, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xdf, 0x7f, 0xff,
+ 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xff, 0x9b,
+ 0xff, 0x9f, 0x7e, 0xfa, 0xe9, 0xa7, 0x9f, 0x7e,
+ 0xfa, 0xe9, 0x4f, 0x3f, 0xfd, 0xf4, 0xd3, 0x4f,
+ 0x3f, 0xfd, 0xf4, 0xff, 0xe6, 0xff, 0xf7, 0xdf,
+ 0x7f, 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xdf, 0xbb,
+ 0xef, 0xbf, 0xfb, 0xfe, 0xfb, 0xef, 0xbf, 0xfb,
+ 0xbf, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xfe, 0x7f,
+ 0xfb, 0xfd, 0xf7, 0xdf, 0xff, 0xff, 0x7f, 0xf7,
+ 0xbb, 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe,
+ 0xfb, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xdb, 0x1f, 0xfb, 0xff, 0xff, 0xef, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe6,
+ 0xff, 0xdf, 0x7f, 0xff, 0xf9, 0xf7, 0xd7, 0x7f,
+ 0xff, 0xfd, 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xef,
+ 0xbf, 0xff, 0xfe, 0xbf, 0xb9, 0xff, 0x37, 0xdf,
+ 0x7e, 0xf3, 0xad, 0x37, 0xdf, 0x7e, 0xfb, 0xdb,
+ 0x6f, 0xbf, 0xfd, 0xf6, 0xdb, 0x6f, 0xbf, 0xf9,
+ 0x6f, 0xfe, 0xff, 0xf5, 0xdf, 0x7f, 0xfb, 0xfd,
+ 0xf5, 0xdf, 0x7f, 0xef, 0xdb, 0xef, 0xbb, 0xff,
+ 0xfe, 0xfb, 0xef, 0xaf, 0xff, 0x9b, 0xff, 0x7f,
+ 0xff, 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7,
+ 0xbd, 0xff, 0x7e, 0xfa, 0xee, 0xbf, 0xff, 0xfe,
+ 0xfb, 0xef, 0xe6, 0xff, 0xbf, 0xff, 0xfe, 0xbb,
+ 0xef, 0xbf, 0xff, 0xfe, 0xfb, 0xdf, 0x7f, 0xff,
+ 0xfd, 0xf7, 0xdf, 0x7f, 0xff, 0xfc, 0xbf, 0xf9,
+ 0xff, 0x2f, 0xbf, 0xfe, 0xf2, 0x6b, 0x2f, 0xbf,
+ 0xff, 0xfe, 0x77, 0x5f, 0x7f, 0xff, 0xf5, 0xf7,
+ 0x5f, 0x7f, 0xf9, 0x6f, 0xfe, 0xff, 0xf9, 0xef,
+ 0xbf, 0xff, 0xfe, 0xf9, 0xef, 0xbf, 0xff, 0xfd,
+ 0xf7, 0xdf, 0x7f, 0xff, 0xfd, 0xf7, 0xcf, 0xff,
+ 0x9b, 0xff, 0xff, 0xfc, 0xf3, 0xcf, 0x3f, 0xff,
+ 0xfc, 0xf3, 0xcf, 0x7b, 0xfe, 0xf9, 0xe7, 0x9f,
+ 0x7f, 0xfe, 0xf9, 0xe7, 0xf7, 0xe6, 0xff, 0x5f,
+ 0x7f, 0xfd, 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5,
+ 0xaf, 0xbf, 0xfe, 0xfa, 0xeb, 0xaf, 0xbf, 0xfe,
+ 0xfa, 0xbf, 0xf9, 0xff, 0x1b, 0x7f, 0xfd, 0xf1,
+ 0xd7, 0x1b, 0x7f, 0xfd, 0xf5, 0xaf, 0xbf, 0xfe,
+ 0xfa, 0xeb, 0xaf, 0xbf, 0xde, 0xf8, 0x6f, 0xee,
+ 0xff, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xee, 0xfb,
+ 0x2f, 0x7f, 0xfd, 0xfd, 0xd7, 0xdf, 0x7f, 0xff,
+ 0xfd, 0x77, 0xff, 0x9b, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xdf, 0xef, 0x7f, 0xff,
+ 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xe6, 0xfe, 0xfb, 0xef, 0xbf, 0xff, 0xfe, 0xfb,
+ 0xef, 0xbb, 0xe7, 0x6d, 0xf7, 0xdd, 0x77, 0xff,
+ 0x7f, 0xf7, 0xdf, 0xff, 0xbf, 0xf9, 0xbf, 0xfd,
+ 0xf5, 0xd7, 0x5f, 0x7f, 0xfd, 0xf5, 0xf6, 0xdb,
+ 0xdb, 0x7a, 0xfb, 0xad, 0xbf, 0xdd, 0xfa, 0xeb,
+ 0xef, 0x6f, 0xfe, 0xff
+};
+
+
+/* rom names */
+
+#define SPPAFSK_ROM_DIVROM0 0
+#define SPPAFSK_ROM_DIVROM1 16
+#define SPPAFSK_ROM_DIVROM2 32
+#define SPPAFSK_ROM_SWROMIE 48
+#define SPPAFSK_ROM_SWROMOE 64
+#define SPPAFSK_ROM_CLKSELROM 80
+#define SPPAFSK_ROM_PTTMUTEROM 96
+
+
+/* rom locations */
+static const unsigned long sppafsk_roms[112] = {
+ 49076, 48908, 49408, 49240, 49740, 49572, 50072, 49904,
+ 48910, 49074, 49242, 49406, 49574, 49738, 49906, 50070,
+ 42914, 42746, 43578, 43410, 43246, 43078, 43910, 43742,
+ 42748, 42912, 43412, 43576, 43080, 43244, 43744, 43908,
+ 39924, 40092, 39592, 39760, 39260, 39428, 38928, 39096,
+ 40090, 39926, 39758, 39594, 39426, 39262, 39094, 38930,
+ 55062, 54894, 55726, 55558, 55394, 55226, 56058, 55890,
+ 54896, 55060, 55560, 55724, 55228, 55392, 55892, 56056,
+ 42944, 42776, 43608, 43440, 43276, 43108, 43940, 43772,
+ 42778, 42942, 43442, 43606, 43110, 43274, 43774, 43938,
+ 34039, 33375, 34205, 33541, 34207, 33543, 34041, 33377,
+ 33707, 33043, 33873, 33209, 33875, 33211, 33709, 33045,
+ 67065, 66897, 67397, 67229, 67729, 67561, 68061, 67893,
+ 66899, 67063, 67231, 67395, 67563, 67727, 67895, 68059
+};
+
diff --git a/main/sysdeps.h b/main/sysdeps.h
new file mode 100644
index 0000000..9729a24
--- /dev/null
+++ b/main/sysdeps.h
@@ -0,0 +1,244 @@
+/*****************************************************************************/
+
+/*
+ * sysdeps.h -- System dependencies.
+ *
+ * Copyright (C) 1998 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifndef _SYSDEPS_H
+#define _SYSDEPS_H
+
+/* ---------------------------------------------------------------------- */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#if defined(HAVE_SYS_IO_H)
+#include <sys/io.h>
+#elif defined(HAVE_ASM_IO_H)
+#include <asm/io.h>
+#endif
+
+#ifdef GETOPT_H
+#include <getopt.h>
+#endif
+
+#ifdef UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <sys/types.h>
+#include <stdarg.h>
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ * Bittypes
+ */
+
+#ifndef HAVE_BITTYPES
+
+#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
+typedef int int8_t __attribute__((__mode__(__QI__)));
+typedef unsigned int u_int8_t __attribute__((__mode__(__QI__)));
+typedef int int16_t __attribute__((__mode__(__HI__)));
+typedef unsigned int u_int16_t __attribute__((__mode__(__HI__)));
+typedef int int32_t __attribute__((__mode__(__SI__)));
+typedef unsigned int u_int32_t __attribute__((__mode__(__SI__)));
+typedef int int64_t __attribute__((__mode__(__DI__)));
+typedef unsigned int u_int64_t __attribute__((__mode__(__DI__)));
+#else
+typedef char /* deduced */ int8_t __attribute__((__mode__(__QI__)));
+typedef unsigned char /* deduced */ u_int8_t __attribute__((__mode__(__QI__)));
+typedef short /* deduced */ int16_t __attribute__((__mode__(__HI__)));
+typedef unsigned short /* deduced */ u_int16_t __attribute__((__mode__(__HI__)));
+typedef long /* deduced */ int32_t __attribute__((__mode__(__SI__)));
+typedef unsigned long /* deduced */ u_int32_t __attribute__((__mode__(__SI__)));
+typedef long long /* deduced */ int64_t __attribute__((__mode__(__DI__)));
+typedef unsigned long long /* deduced */ u_int64_t __attribute__((__mode__(__DI__)));
+#endif
+
+#endif /* !HAVE_BITTYPES */
+
+/* ---------------------------------------------------------------------- */
+/*
+ * IO routines
+ */
+
+#ifndef HAVE_IOFUNCS
+
+extern inline unsigned char inb(unsigned short port)
+{
+ unsigned char ret;
+ __asm__ __volatile__("inb %w1,%b0" : "=a" (ret) : "d" (port));
+ return ret;
+}
+
+extern inline void outb(unsigned char val, unsigned short port)
+{
+ __asm__ __volatile__("outb %b0,%w1" : : "a" (val), "d" (port));
+}
+
+extern inline unsigned short inw(unsigned short port)
+{
+ unsigned short ret;
+ __asm__ __volatile__("inw %w1,%w0" : "=a" (ret) : "d" (port));
+ return ret;
+}
+
+extern inline void outw(unsigned short val, unsigned short port)
+{
+ __asm__ __volatile__("outw %w0,%w1" : : "a" (val), "d" (port));
+}
+
+extern inline unsigned int inl(unsigned short port)
+{
+ unsigned int ret;
+ __asm__ __volatile__("inl %w1,%0" : "=a" (ret) : "d" (port));
+ return ret;
+}
+
+extern inline void outl(unsigned int val, unsigned short port)
+{
+ __asm__ __volatile__("outl %0,%w1" : : "a" (val), "d" (port));
+}
+
+extern inline void insb(unsigned short port, unsigned char *addr, unsigned long count)
+{
+ __asm__ __volatile__("cld ; rep ; insb" : "=D" (addr), "=c" (count) :
+ "d" (port),"0" (addr),"1" (count));
+}
+
+extern inline void outsb(unsigned short port, const unsigned char *addr, unsigned long count)
+{
+ __asm__ __volatile__("cld ; rep ; outsb" : "=S" (addr), "=c" (count) :
+ "d" (port),"0" (addr),"1" (count));
+}
+
+#endif /* !HAVE_IOFUNCS */
+
+/* ---------------------------------------------------------------------- */
+/*
+ * syslog routines
+ */
+
+#ifdef HAVE_SYSLOG_H
+#include <syslog.h>
+#else
+
+#define LOG_EMERG 0 /* system is unusable */
+#define LOG_ALERT 1 /* action must be taken immediately */
+#define LOG_CRIT 2 /* critical conditions */
+#define LOG_ERR 3 /* error conditions */
+#define LOG_WARNING 4 /* warning conditions */
+#define LOG_NOTICE 5 /* normal but significant condition */
+#define LOG_INFO 6 /* informational */
+#define LOG_DEBUG 7 /* debug-level messages */
+
+/* facility codes */
+#define LOG_KERN (0<<3) /* kernel messages */
+#define LOG_USER (1<<3) /* random user-level messages */
+#define LOG_MAIL (2<<3) /* mail system */
+#define LOG_DAEMON (3<<3) /* system daemons */
+#define LOG_AUTH (4<<3) /* security/authorization messages */
+#define LOG_SYSLOG (5<<3) /* messages generated internally by syslogd */
+#define LOG_LPR (6<<3) /* line printer subsystem */
+#define LOG_NEWS (7<<3) /* network news subsystem */
+#define LOG_UUCP (8<<3) /* UUCP subsystem */
+#define LOG_CRON (9<<3) /* clock daemon */
+#define LOG_AUTHPRIV (10<<3) /* security/authorization messages (private) */
+#define LOG_FTP (11<<3) /* ftp daemon */
+
+extern inline void closelog(void) {}
+extern inline void openlog(__const char *__ident, int __option, int __facility) {}
+extern inline void vsyslog(int __pri, __const char *__fmt, va_list __ap) {}
+
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+#ifdef __MINGW32__
+#include <windows.h>
+extern inline void usleep(unsigned long x)
+{
+ Sleep(x / 1000);
+}
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+#ifdef HAVE_GETTIMEOFDAY
+
+#include <sys/time.h>
+#include <unistd.h>
+
+extern inline int gettime(struct timeval *tv)
+{
+ return gettimeofday(tv, NULL);
+}
+
+#elif HAVE_GETSYSTEMTIME
+
+#ifdef HAVE_WINDOWS_H
+#include <windows.h>
+#endif
+
+#if 0
+struct timeval {
+ long tv_sec;
+ long tv_usec;
+};
+#endif
+
+extern inline int gettime(struct timeval *tv)
+{
+ SYSTEMTIME tm;
+
+ GetSystemTime(&tm);
+ tv->tv_usec = 1000UL * tm.wMilliseconds;
+ tv->tv_sec = tm.wSecond + 60 * tm.wMinute + 3600 * tm.wHour + 86400 * tm.wDay;
+ return 0;
+}
+
+#else
+
+#error "Don't know how to get a high resolution time"
+
+#endif
+
+/* ---------------------------------------------------------------------- */
+
+#ifndef HAVE_RANDOM
+
+extern inline long int random(void)
+{
+ return rand();
+}
+
+#endif
+
+/* ---------------------------------------------------------------------- */
+#endif /* _SYSDEPS_H */
diff --git a/main/syslog.c b/main/syslog.c
new file mode 100644
index 0000000..d1aa702
--- /dev/null
+++ b/main/syslog.c
@@ -0,0 +1,70 @@
+/*****************************************************************************/
+
+/*
+ * syslog.c -- Syslog "abstraction" routines.
+ *
+ * Copyright (C) 1998 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#define _COMPILE_LIBFPGA
+#include "libfpga.h"
+
+/* ---------------------------------------------------------------------- */
+
+#if defined(__MINGW32__) || defined(__CYGWIN32__) || defined(__CYGWIN__) || defined(GO32)
+
+int syslogprintf(unsigned vl, const char *format, va_list ap)
+{
+ return 0;
+}
+
+int syslogopen(const char *ident)
+{
+ return -1;
+}
+
+#else
+
+#include <syslog.h>
+
+int syslogprintf(unsigned vl, const char *format, va_list ap)
+{
+ static const int logprio[] = { LOG_ERR, LOG_INFO };
+ vsyslog((vl > 1) ? LOG_DEBUG : logprio[vl], format, ap);
+ return 0;
+}
+
+int syslogopen(const char *ident)
+{
+ openlog(ident, LOG_PID, LOG_USER);
+ return 0;
+}
+
+#endif
+
+/* ---------------------------------------------------------------------- */
diff --git a/main/util.h b/main/util.h
new file mode 100644
index 0000000..7083fc2
--- /dev/null
+++ b/main/util.h
@@ -0,0 +1,70 @@
+/*****************************************************************************/
+
+/*
+ * util.h -- Some utility functions.
+ *
+ * Copyright (C) 1998 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifndef _UTIL_H
+#define _UTIL_H
+
+/* ---------------------------------------------------------------------- */
+
+extern inline unsigned int hweight32(unsigned int w)
+{
+ unsigned int res = (w & 0x55555555) + ((w >> 1) & 0x55555555);
+ res = (res & 0x33333333) + ((res >> 2) & 0x33333333);
+ res = (res & 0x0F0F0F0F) + ((res >> 4) & 0x0F0F0F0F);
+ res = (res & 0x00FF00FF) + ((res >> 8) & 0x00FF00FF);
+ return (res & 0x0000FFFF) + ((res >> 16) & 0x0000FFFF);
+}
+
+extern inline unsigned int hweight16(unsigned int w)
+{
+ unsigned int res = (w & 0x5555) + ((w >> 1) & 0x5555);
+ res = (res & 0x3333) + ((res >> 2) & 0x3333);
+ res = (res & 0x0F0F) + ((res >> 4) & 0x0F0F);
+ return (res & 0x00FF) + ((res >> 8) & 0x00FF);
+}
+
+extern inline unsigned int hweight8(unsigned int w)
+{
+ unsigned int res = (w & 0x55) + ((w >> 1) & 0x55);
+ res = (res & 0x33) + ((res >> 2) & 0x33);
+ return (res & 0x0F) + ((res >> 4) & 0x0F);
+}
+
+extern inline unsigned char rev8(unsigned char x)
+{
+ static const unsigned char rev4[16] = {
+ 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7,15
+ };
+
+ return (rev4[x & 15] << 4) | rev4[(x >> 4) & 15];
+}
+
+/* ---------------------------------------------------------------------- */
+#endif /* _UTIL_H */
+
diff --git a/main/vsnprintf.c b/main/vsnprintf.c
new file mode 100644
index 0000000..0b9ab56
--- /dev/null
+++ b/main/vsnprintf.c
@@ -0,0 +1,194 @@
+/*
+ * This file is derived from GLIB by Thomas Sailer, <sailer at ife.ee.ethz.ch>
+ *
+ *
+ * GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <sys/types.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+static unsigned int printf_string_upper_bound (const char *format, va_list args)
+{
+ unsigned int len = 1;
+
+ while (*format) {
+ int long_int = 0;
+ int extra_long = 0;
+ char c;
+
+ c = *format++;
+
+ if (c == '%') {
+ int done = 0;
+
+ while (*format && !done) {
+ switch (*format++) {
+ char *string_arg;
+
+ case '*':
+ len += va_arg (args, int);
+ break;
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ /* add specified format length, since it might exceed the
+ * size we assume it to have.
+ */
+ format -= 1;
+ len += strtol (format, (char**) &format, 10);
+ break;
+ case 'h':
+ /* ignore short int flag, since all args have at least the
+ * same size as an int
+ */
+ break;
+ case 'l':
+ if (long_int)
+ extra_long = 1; /* linux specific */
+ else
+ long_int = 1;
+ break;
+ case 'q':
+ case 'L':
+ long_int = 1;
+ extra_long = 1;
+ break;
+ case 's':
+ string_arg = va_arg (args, char *);
+ if (string_arg)
+ len += strlen (string_arg);
+ else {
+ /* add enough padding to hold "(null)" identifier */
+ len += 16;
+ }
+ done = 1;
+ break;
+ case 'd':
+ case 'i':
+ case 'o':
+ case 'u':
+ case 'x':
+ case 'X':
+ if (long_int)
+ (void) va_arg (args, long);
+ else
+ (void) va_arg (args, int);
+ len += extra_long ? 64 : 32;
+ done = 1;
+ break;
+ case 'D':
+ case 'O':
+ case 'U':
+ (void) va_arg (args, long);
+ len += 32;
+ done = 1;
+ break;
+ case 'e':
+ case 'E':
+ case 'f':
+ case 'g':
+ (void) va_arg (args, double);
+ len += extra_long ? 64 : 32;
+ done = 1;
+ break;
+ case 'c':
+ (void) va_arg (args, int);
+ len += 1;
+ done = 1;
+ break;
+ case 'p':
+ case 'n':
+ (void) va_arg (args, void*);
+ len += 32;
+ done = 1;
+ break;
+ case '%':
+ len += 1;
+ done = 1;
+ break;
+ default:
+ /* ignore unknow/invalid flags */
+ break;
+ }
+ }
+ }
+ else
+ len += 1;
+ }
+ return len;
+}
+
+/* WARNING: This does only work for i386 (plus a few others, but not eg. alpha) !!!! */
+#define VA_COPY(x,y) (x) = (y)
+
+static char *strdup_vprintf (const char *format, va_list args1)
+{
+ char *buffer;
+ va_list args2;
+
+ VA_COPY (args2, args1);
+ buffer = malloc(printf_string_upper_bound (format, args1));
+ if (buffer)
+ vsprintf (buffer, format, args2);
+ va_end (args2);
+ return buffer;
+}
+
+int snprintf (char *str, size_t n, char const *fmt, ...)
+{
+ char *printed;
+ va_list args;
+ int len;
+
+ va_start(args, fmt);
+ printed = strdup_vprintf (fmt, args);
+ va_end (args);
+ if (!printed)
+ return -1;
+ len = strlen(printed);
+ strncpy(str, printed, n);
+ str[n-1] = '\0';
+ free(printed);
+ return len >= n ? -1 : len;
+}
+
+int vsnprintf (char *str, size_t n, char const *fmt, va_list args)
+{
+ char *printed;
+ int len;
+
+ printed = strdup_vprintf (fmt, args);
+ if (!printed)
+ return -1;
+ len = strlen(printed);
+ strncpy(str, printed, n);
+ str[n-1] = '\0';
+ free(printed);
+ return len >= n ? -1 : len;
+}
diff --git a/missing b/missing
new file mode 100755
index 0000000..cbe2b0e
--- /dev/null
+++ b/missing
@@ -0,0 +1,188 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+# Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+# Franc,ois Pinard <pinard at iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+# 02111-1307, USA.
+
+if test $# -eq 0; then
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+fi
+
+case "$1" in
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+
+Supported PROGRAM values:
+ aclocal touch file \`aclocal.m4'
+ autoconf touch file \`configure'
+ autoheader touch file \`config.h.in'
+ automake touch all \`Makefile.in' files
+ bison create \`y.tab.[ch]', if possible, from existing .[ch]
+ flex create \`lex.yy.c', if possible, from existing .c
+ lex create \`lex.yy.c', if possible, from existing .c
+ makeinfo touch the output file
+ yacc create \`y.tab.[ch]', if possible, from existing .[ch]"
+ ;;
+
+ -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+ echo "missing - GNU libit 0.0"
+ ;;
+
+ -*)
+ echo 1>&2 "$0: Unknown \`$1' option"
+ echo 1>&2 "Try \`$0 --help' for more information"
+ exit 1
+ ;;
+
+ aclocal)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`acinclude.m4' or \`configure.in'. You might want
+ to install the \`Automake' and \`Perl' packages. Grab them from
+ any GNU archive site."
+ touch aclocal.m4
+ ;;
+
+ autoconf)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`configure.in'. You might want to install the
+ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
+ archive site."
+ touch configure
+ ;;
+
+ autoheader)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`acconfig.h' or \`configure.in'. You might want
+ to install the \`Autoconf' and \`GNU m4' packages. Grab them
+ from any GNU archive site."
+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER([^):]*:\([^)]*\)).*/\1/p' configure.in`
+ if test -z "$files"; then
+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^):]*\)).*/\1/p' configure.in`
+ test -z "$files" || files="$files.in"
+ else
+ files=`echo "$files" | sed -e 's/:/ /g'`
+ fi
+ test -z "$files" && files="config.h.in"
+ touch $files
+ ;;
+
+ automake)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'.
+ You might want to install the \`Automake' and \`Perl' packages.
+ Grab them from any GNU archive site."
+ find . -type f -name Makefile.am -print \
+ | sed 's/^\(.*\).am$/touch \1.in/' \
+ | sh
+ ;;
+
+ bison|yacc)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified a \`.y' file. You may need the \`Bison' package
+ in order for those modifications to take effect. You can get
+ \`Bison' from any GNU archive site."
+ rm -f y.tab.c y.tab.h
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.y)
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.c
+ fi
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.h
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f y.tab.h ]; then
+ echo >y.tab.h
+ fi
+ if [ ! -f y.tab.c ]; then
+ echo 'main() { return 0; }' >y.tab.c
+ fi
+ ;;
+
+ lex|flex)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified a \`.l' file. You may need the \`Flex' package
+ in order for those modifications to take effect. You can get
+ \`Flex' from any GNU archive site."
+ rm -f lex.yy.c
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.l)
+ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" lex.yy.c
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f lex.yy.c ]; then
+ echo 'main() { return 0; }' >lex.yy.c
+ fi
+ ;;
+
+ makeinfo)
+ echo 1>&2 "\
+WARNING: \`$1' is missing on your system. You should only need it if
+ you modified a \`.texi' or \`.texinfo' file, or any other file
+ indirectly affecting the aspect of the manual. The spurious
+ call might also be the consequence of using a buggy \`make' (AIX,
+ DU, IRIX). You might want to install the \`Texinfo' package or
+ the \`GNU make' package. Grab either from any GNU archive site."
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+ file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
+ fi
+ touch $file
+ ;;
+
+ *)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, and you do not seem to have it handy on your
+ system. You might have modified some files without having the
+ proper tools for further handling them. Check the \`README' file,
+ it often tells you about the needed prerequirements for installing
+ this package. You may also peek at any GNU archive site, in case
+ some other package would contain this missing \`$1' program."
+ exit 1
+ ;;
+esac
+
+exit 0
diff --git a/mkinstalldirs b/mkinstalldirs
new file mode 100755
index 0000000..7021fe2
--- /dev/null
+++ b/mkinstalldirs
@@ -0,0 +1,40 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman at prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+# $Id: mkinstalldirs,v 1.1.1.1 1998/07/03 21:25:39 martijn Exp $
+
+errstatus=0
+
+for file
+do
+ set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+ shift
+
+ pathcomp=
+ for d
+ do
+ pathcomp="$pathcomp$d"
+ case "$pathcomp" in
+ -* ) pathcomp=./$pathcomp ;;
+ esac
+
+ if test ! -d "$pathcomp"; then
+ echo "mkdir $pathcomp" 1>&2
+
+ mkdir "$pathcomp" || lasterr=$?
+
+ if test ! -d "$pathcomp"; then
+ errstatus=$lasterr
+ fi
+ fi
+
+ pathcomp="$pathcomp/"
+ done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
diff --git a/ntdrv/Makefile.am b/ntdrv/Makefile.am
new file mode 100644
index 0000000..3220d89
--- /dev/null
+++ b/ntdrv/Makefile.am
@@ -0,0 +1,9 @@
+EXTRA_DIST = eppflex.c eppflex.rc eppflex.h eppflex.inf eppflex.sys testload.c sources makefile
+
+if WIN32
+
+noinst_PROGRAMS = testload
+
+testload_SOURCES = testload.c
+
+endif
diff --git a/ntdrv/Makefile.in b/ntdrv/Makefile.in
new file mode 100644
index 0000000..ec7b80a
--- /dev/null
+++ b/ntdrv/Makefile.in
@@ -0,0 +1,313 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AS = @AS@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+DATADIRNAME = @DATADIRNAME@
+DLLTOOL = @DLLTOOL@
+DRVLIBOBJS = @DRVLIBOBJS@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+HAVE_BITTYPES = @HAVE_BITTYPES@
+HAVE_DIRECTX = @HAVE_DIRECTX@
+HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@
+HAVE_IOFUNCS = @HAVE_IOFUNCS@
+HAVE_LIB = @HAVE_LIB@
+HAVE_MKISS = @HAVE_MKISS@
+HAVE_PPKDRV = @HAVE_PPKDRV@
+HAVE_PPUSER = @HAVE_PPUSER@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LIB = @LIB@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LTLIB = @LTLIB@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+M_PI = @M_PI@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+
+EXTRA_DIST = eppflex.c eppflex.rc eppflex.h eppflex.inf eppflex.sys testload.c sources makefile
+
+ at WIN32_TRUE@noinst_PROGRAMS = @WIN32_TRUE at testload
+
+ at WIN32_TRUE@testload_SOURCES = @WIN32_TRUE at testload.c
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES =
+ at WIN32_TRUE@noinst_PROGRAMS = testload$(EXEEXT)
+PROGRAMS = $(noinst_PROGRAMS)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+ at WIN32_TRUE@testload_OBJECTS = testload.$(OBJEXT)
+testload_LDADD = $(LDADD)
+testload_DEPENDENCIES =
+testload_LDFLAGS =
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+SOURCES = $(testload_SOURCES)
+OBJECTS = $(testload_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .obj .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps ntdrv/Makefile
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-noinstPROGRAMS:
+
+clean-noinstPROGRAMS:
+ -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
+
+distclean-noinstPROGRAMS:
+
+maintainer-clean-noinstPROGRAMS:
+
+.c.o:
+ $(COMPILE) -c $<
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+ $(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+ -rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+testload$(EXEEXT): $(testload_OBJECTS) $(testload_DEPENDENCIES)
+ @rm -f testload$(EXEEXT)
+ $(LINK) $(testload_LDFLAGS) $(testload_OBJECTS) $(testload_LDADD) $(LIBS)
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = ntdrv
+
+distdir: $(DISTFILES)
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile $(PROGRAMS)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-noinstPROGRAMS mostlyclean-compile \
+ mostlyclean-tags mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-noinstPROGRAMS clean-compile clean-tags clean-generic \
+ mostlyclean-am
+
+clean: clean-am
+
+distclean-am: distclean-noinstPROGRAMS distclean-compile distclean-tags \
+ distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-noinstPROGRAMS \
+ maintainer-clean-compile maintainer-clean-tags \
+ maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-noinstPROGRAMS distclean-noinstPROGRAMS \
+clean-noinstPROGRAMS maintainer-clean-noinstPROGRAMS \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile tags mostlyclean-tags distclean-tags \
+clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \
+check-am installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/ntdrv/eppflex.c b/ntdrv/eppflex.c
new file mode 100644
index 0000000..c6a3669
--- /dev/null
+++ b/ntdrv/eppflex.c
@@ -0,0 +1,428 @@
+
+#include "ntddk.h"
+#include "string.h"
+#include "ddk/parallel.h"
+
+#include "eppflex.h"
+
+
+#define printk DbgPrint
+#define kmalloc(size) ExAllocatePool(NonPagedPool,size)
+#define kfree ExFreePool
+
+#if 0
+#define VLOG(x) do { x; } while (0)
+#else
+#define VLOG(x) do { } while (0)
+#endif
+
+#if 1
+#define ELOG(x) do { x; } while (0)
+#else
+#define ELOG(x) do { } while (0)
+#endif
+
+struct eppflex {
+ unsigned int dummy;
+};
+
+struct eppflexfile {
+ PDEVICE_OBJECT pdo;
+ PFILE_OBJECT pdfo;
+ PARALLEL_PORT_INFORMATION info;
+ PARALLEL_PNP_INFORMATION pnpinfo;
+};
+
+
+static NTSTATUS parcompletion(PDEVICE_OBJECT devobj, PIRP irp, PKEVENT event)
+{
+ KeSetEvent(event, 0, FALSE);
+ return STATUS_MORE_PROCESSING_REQUIRED;
+}
+
+static NTSTATUS callparport(struct eppflexfile *fs, unsigned long ioctlcode,
+ void *buffer, unsigned int inlen, unsigned int outlen,
+ LARGE_INTEGER *timeout)
+{
+ NTSTATUS status;
+ PIRP irp;
+ PIO_STACK_LOCATION irpsp;
+ KEVENT event;
+
+ irp = IoAllocateIrp((CCHAR)(fs->pdo->StackSize+1), FALSE);
+ if (!irp)
+ return STATUS_INSUFFICIENT_RESOURCES;
+ irpsp = IoGetNextIrpStackLocation(irp);
+ irpsp->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
+ irpsp->Parameters.DeviceIoControl.OutputBufferLength = outlen;
+ irpsp->Parameters.DeviceIoControl.InputBufferLength = inlen;
+ irpsp->Parameters.DeviceIoControl.IoControlCode = ioctlcode;
+ irp->AssociatedIrp.SystemBuffer = buffer;
+
+ KeInitializeEvent(&event, NotificationEvent, FALSE);
+ IoSetCompletionRoutine(irp, parcompletion, &event, TRUE, TRUE, TRUE);
+ status = IoCallDriver(fs->pdo, irp);
+ if (!NT_SUCCESS(status)) {
+ IoFreeIrp(irp);
+ return status;
+ }
+
+ status = KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, timeout);
+ if (status == STATUS_TIMEOUT) {
+ IoCancelIrp(irp);
+ status = KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
+ }
+ status = irp->IoStatus.Status;
+ IoFreeIrp(irp);
+ return status;
+}
+
+static NTSTATUS read_port(PDEVICE_OBJECT devobj, PIRP irp, PUCHAR port)
+{
+ NTSTATUS status = STATUS_SUCCESS;
+ PIO_STACK_LOCATION irpsp;
+ PFILE_OBJECT fileobj;
+ struct eppflex *s = devobj->DeviceExtension;
+ struct eppflexfile *fs;
+ struct eppflex_rwdata *rw = (struct eppflex_rwdata *)irp->AssociatedIrp.SystemBuffer;
+
+ irpsp = IoGetCurrentIrpStackLocation(irp);
+ fileobj = irpsp->FileObject;
+ fs = fileobj->FsContext;
+
+ irp->IoStatus.Information = 0;
+ if (irpsp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(struct eppflex_rwdata))
+ status = STATUS_INVALID_PARAMETER;
+ else if ((port < fs->info.Controller || port >= fs->info.Controller+fs->info.SpanOfController) &&
+ (port < fs->pnpinfo.EcpController || port >= fs->pnpinfo.EcpController+fs->pnpinfo.SpanOfEcpController))
+ status = STATUS_ACCESS_VIOLATION;
+ else {
+ rw->data = READ_PORT_UCHAR(port);
+ irp->IoStatus.Information = sizeof(struct eppflex_rwdata);
+ }
+ irp->IoStatus.Status = status;
+ IoCompleteRequest(irp, IO_NO_INCREMENT);
+ return status;
+}
+
+static NTSTATUS write_port(PDEVICE_OBJECT devobj, PIRP irp, PUCHAR port)
+{
+ NTSTATUS status = STATUS_SUCCESS;
+ PIO_STACK_LOCATION irpsp;
+ PFILE_OBJECT fileobj;
+ struct eppflex *s = devobj->DeviceExtension;
+ struct eppflexfile *fs;
+ struct eppflex_rwdata *rw = (struct eppflex_rwdata *)irp->AssociatedIrp.SystemBuffer;
+
+ irpsp = IoGetCurrentIrpStackLocation(irp);
+ fileobj = irpsp->FileObject;
+ fs = fileobj->FsContext;
+
+ irp->IoStatus.Information = 0;
+ if (irpsp->Parameters.DeviceIoControl.InputBufferLength < sizeof(struct eppflex_rwdata))
+ status = STATUS_INVALID_PARAMETER;
+ else if ((port < fs->info.Controller || port >= fs->info.Controller+fs->info.SpanOfController) &&
+ (port < fs->pnpinfo.EcpController || port >= fs->pnpinfo.EcpController+fs->pnpinfo.SpanOfEcpController))
+ status = STATUS_ACCESS_VIOLATION;
+ else {
+ WRITE_PORT_UCHAR(port, rw->data);
+ }
+ irp->IoStatus.Status = status;
+ IoCompleteRequest(irp, IO_NO_INCREMENT);
+ return status;
+}
+
+static NTSTATUS frob_port(PDEVICE_OBJECT devobj, PIRP irp, PUCHAR port)
+{
+ NTSTATUS status = STATUS_SUCCESS;
+ PIO_STACK_LOCATION irpsp;
+ PFILE_OBJECT fileobj;
+ struct eppflex *s = devobj->DeviceExtension;
+ struct eppflexfile *fs;
+ struct eppflex_rwdata *rw = (struct eppflex_rwdata *)irp->AssociatedIrp.SystemBuffer;
+ UCHAR data;
+
+ irpsp = IoGetCurrentIrpStackLocation(irp);
+ fileobj = irpsp->FileObject;
+ fs = fileobj->FsContext;
+
+ irp->IoStatus.Information = 0;
+ if (irpsp->Parameters.DeviceIoControl.InputBufferLength < sizeof(struct eppflex_rwdata) ||
+ irpsp->Parameters.DeviceIoControl.OutputBufferLength < sizeof(struct eppflex_rwdata))
+ status = STATUS_INVALID_PARAMETER;
+ else if ((port < fs->info.Controller || port >= fs->info.Controller+fs->info.SpanOfController) &&
+ (port < fs->pnpinfo.EcpController || port >= fs->pnpinfo.EcpController+fs->pnpinfo.SpanOfEcpController))
+ status = STATUS_ACCESS_VIOLATION;
+ else {
+ data = READ_PORT_UCHAR(port);
+ data = (data & ~rw->mask) ^ rw->data;
+ WRITE_PORT_UCHAR(port, data);
+ rw->data = data;
+ irp->IoStatus.Information = sizeof(struct eppflex_rwdata);
+ }
+ irp->IoStatus.Status = status;
+ IoCompleteRequest(irp, IO_NO_INCREMENT);
+ return status;
+}
+
+static NTSTATUS ioctl(PDEVICE_OBJECT devobj, PIRP irp)
+{
+ NTSTATUS status = STATUS_NOT_IMPLEMENTED;
+ PIO_STACK_LOCATION irpsp;
+ PFILE_OBJECT fileobj;
+ struct eppflex *s = devobj->DeviceExtension;
+ struct eppflexfile *fs;
+
+ irpsp = IoGetCurrentIrpStackLocation(irp);
+ fileobj = irpsp->FileObject;
+ fs = fileobj->FsContext;
+
+ VLOG(printk("eppflex: ioctl\n"));
+
+ if (!fs) {
+ status = irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
+ IoCompleteRequest(irp, IO_NO_INCREMENT);
+ return status;
+ }
+ switch (irpsp->Parameters.DeviceIoControl.IoControlCode) {
+ case IOCTL_EPPFLEX_READ_DATA:
+ return read_port(devobj, irp, fs->info.Controller);
+
+ case IOCTL_EPPFLEX_WRITE_DATA:
+ return write_port(devobj, irp, fs->info.Controller);
+
+ case IOCTL_EPPFLEX_READ_STATUS:
+ return read_port(devobj, irp, fs->info.Controller + 1);
+
+ case IOCTL_EPPFLEX_WRITE_STATUS:
+ return write_port(devobj, irp, fs->info.Controller + 1);
+
+ case IOCTL_EPPFLEX_READ_CONTROL:
+ return read_port(devobj, irp, fs->info.Controller + 2);
+
+ case IOCTL_EPPFLEX_WRITE_CONTROL:
+ return write_port(devobj, irp, fs->info.Controller + 2);
+
+ case IOCTL_EPPFLEX_FROB_CONTROL:
+ return frob_port(devobj, irp, fs->info.Controller + 2);
+
+ case IOCTL_EPPFLEX_READ_ECONTROL:
+ return read_port(devobj, irp, fs->pnpinfo.EcpController + 2);
+
+ case IOCTL_EPPFLEX_WRITE_ECONTROL:
+ return write_port(devobj, irp, fs->pnpinfo.EcpController + 2);
+
+ case IOCTL_EPPFLEX_FROB_ECONTROL:
+ return frob_port(devobj, irp, fs->pnpinfo.EcpController + 2);
+
+ case IOCTL_EPPFLEX_READ_CONFIGA:
+ return read_port(devobj, irp, fs->pnpinfo.EcpController);
+
+ case IOCTL_EPPFLEX_WRITE_CONFIGA:
+ return write_port(devobj, irp, fs->pnpinfo.EcpController);
+
+ case IOCTL_EPPFLEX_READ_CONFIGB:
+ return read_port(devobj, irp, fs->pnpinfo.EcpController + 1);
+
+ case IOCTL_EPPFLEX_WRITE_CONFIGB:
+ return write_port(devobj, irp, fs->pnpinfo.EcpController + 1);
+
+ case IOCTL_EPPFLEX_READ_EPPADDR:
+ return read_port(devobj, irp, fs->info.Controller + 3);
+
+ case IOCTL_EPPFLEX_WRITE_EPPADDR:
+ return write_port(devobj, irp, fs->info.Controller + 3);
+
+ case IOCTL_EPPFLEX_READ_EPPDATA:
+ return read_port(devobj, irp, fs->info.Controller + 4);
+
+ case IOCTL_EPPFLEX_WRITE_EPPDATA:
+ return write_port(devobj, irp, fs->info.Controller + 4);
+ }
+ irp->IoStatus.Status = status;
+ IoCompleteRequest(irp, IO_NO_INCREMENT);
+ return status;
+}
+
+static NTSTATUS create(PDEVICE_OBJECT devobj, PIRP irp)
+{
+ NTSTATUS status;
+ PIO_STACK_LOCATION irpsp;
+ PFILE_OBJECT fileobj;
+ WCHAR ppname[22] = L"\\Device\\ParallelPort0";
+ UNICODE_STRING uppname;
+ struct eppflex *s = devobj->DeviceExtension;
+ struct eppflexfile *fs;
+ ULONG devnr = 0;
+ LARGE_INTEGER timeout;
+ unsigned int i;
+
+ VLOG(printk("eppflex: create\n"));
+ irpsp = IoGetCurrentIrpStackLocation(irp);
+ fileobj = irpsp->FileObject;
+ status = STATUS_NO_MEMORY;
+ fileobj->FsContext = fs = kmalloc(sizeof(struct eppflexfile));
+ if (!fs)
+ goto out;
+
+ VLOG(printk("eppflex: filename length: %u\n", fileobj->FileName.Length));
+
+ for (i = 0; i < fileobj->FileName.Length; i++) {
+ VLOG(printk("eppflex: fn[%2u]: %04x\n", i, fileobj->FileName.Buffer[i]));
+ if (fileobj->FileName.Buffer[i] == (WCHAR)'\\')
+ continue;
+ if (fileobj->FileName.Buffer[i] < (WCHAR)'0' ||
+ fileobj->FileName.Buffer[i] > (WCHAR)'9')
+ break;
+ devnr = 10 * devnr + fileobj->FileName.Buffer[i] - (WCHAR)'0';
+ }
+
+ VLOG(printk("eppflex: Device number %lu\n", devnr));
+
+ status = STATUS_INVALID_PARAMETER;
+ if (devnr > 9)
+ goto out;
+
+
+ ppname[20] = ((WCHAR)'0') + (WCHAR)devnr;
+ RtlInitUnicodeString(&uppname, ppname);
+
+ status = IoGetDeviceObjectPointer(&uppname, STANDARD_RIGHTS_ALL, &fs->pdfo, &fs->pdo);
+ if (!NT_SUCCESS(status)) {
+ ELOG(printk("eppflex: cannot open parallel port %u\n", devnr));
+ goto out;
+ }
+
+ timeout.QuadPart = -(LONGLONG)10*1000*500; /* 500ms, in 100ns units */
+ status = callparport(fs, IOCTL_INTERNAL_GET_PARALLEL_PORT_INFO,
+ &fs->info, 0, sizeof(fs->info), &timeout);
+ if (!NT_SUCCESS(status)) {
+ ELOG(printk("eppflex: GET_PARALLEL_PORT_INFO error 0x%lx\n", status));
+ goto out;
+ }
+ status = callparport(fs, IOCTL_INTERNAL_GET_PARALLEL_PNP_INFO,
+ &fs->pnpinfo, 0, sizeof(fs->pnpinfo), &timeout);
+ if (!NT_SUCCESS(status)) {
+ ELOG(printk("eppflex: warning: GET_PARALLEL_PNP_INFO error 0x%lx\n", status));
+ fs->pnpinfo.EcpController = fs->info.Controller + 0x400;
+ fs->pnpinfo.SpanOfEcpController = fs->info.SpanOfController;
+ fs->pnpinfo.HardwareCapabilities = 0;
+ fs->pnpinfo.FifoDepth = 0;
+ fs->pnpinfo.FifoWidth = 0;
+ }
+
+ VLOG(printk("eppflex: ioaddr: 0x%x(%u) ecpioaddr: 0x%x(%u) cap: 0x%x FIFO: %d,%d\n",
+ fs->info.Controller, fs->info.SpanOfController,
+ fs->pnpinfo.EcpController, fs->pnpinfo.SpanOfEcpController,
+ fs->pnpinfo.HardwareCapabilities, fs->pnpinfo.FifoDepth, fs->pnpinfo.FifoWidth));
+
+ timeout.QuadPart = -(LONGLONG)10*1000*50; /* 50ms, in 100ns units */
+ status = callparport(fs, IOCTL_INTERNAL_PARALLEL_PORT_ALLOCATE, NULL, 0, 0, &timeout);
+ if (!NT_SUCCESS(status)) {
+ ELOG(printk("eppflex: PARALLEL_PORT_ALLOCATE error 0x%lx\n", status));
+ goto out;
+ }
+
+ status = STATUS_SUCCESS;
+
+ out:
+ if (!NT_SUCCESS(status) && fs) {
+ kfree(fs);
+ fileobj->FsContext = NULL;
+ }
+ irp->IoStatus.Status = status;
+ irp->IoStatus.Information = 0L;
+ IoCompleteRequest(irp, IO_NO_INCREMENT);
+ return status;
+}
+
+static NTSTATUS close(PDEVICE_OBJECT devobj, PIRP irp)
+{
+ NTSTATUS status;
+ PIO_STACK_LOCATION irpsp;
+ PFILE_OBJECT fileobj;
+ struct eppflex *s = devobj->DeviceExtension;
+ struct eppflexfile *fs;
+ LARGE_INTEGER timeout;
+
+ irpsp = IoGetCurrentIrpStackLocation(irp);
+ fileobj = irpsp->FileObject;
+ fs = fileobj->FsContext;
+ VLOG(printk("eppflex: close\n"));
+ if (fs) {
+
+ timeout.QuadPart = -(LONGLONG)10*1000*50; /* 50ms, in 100ns units */
+ status = callparport(fs, IOCTL_INTERNAL_RELEASE_PARALLEL_PORT_INFO, NULL, 0, 0, &timeout);
+ if (!NT_SUCCESS(status))
+ ELOG(printk("eppflex: RELEASE_PARALLEL_PORT_INFO error 0x%lx\n", status));
+ status = callparport(fs, IOCTL_INTERNAL_PARALLEL_PORT_FREE, NULL, 0, 0, &timeout);
+ if (!NT_SUCCESS(status))
+ ELOG(printk("eppflex: PARALLEL_PORT_FREE error 0x%lx\n", status));
+ ObDereferenceObject(fs->pdfo);
+ kfree(fs);
+ fileobj->FsContext = NULL;
+ }
+ status = irp->IoStatus.Status = STATUS_SUCCESS;
+ irp->IoStatus.Information = 0L;
+ IoCompleteRequest(irp, IO_NO_INCREMENT);
+ return status;
+}
+
+static void unload(PDRIVER_OBJECT drvobj)
+{
+ struct eppflex *s = drvobj->DeviceObject->DeviceExtension;
+ UNICODE_STRING nameString, linkString;
+
+ printk("eppflex: stop\n");
+
+ IoDeleteDevice(drvobj->DeviceObject);
+ RtlInitUnicodeString(&linkString, L"\\DosDevices\\EPPFLEX" );
+ RtlInitUnicodeString(&nameString, L"\\Device\\eppflex" );
+ IoDeleteSymbolicLink(&linkString);
+}
+
+NTSTATUS DriverEntry(PDRIVER_OBJECT drvobj, PUNICODE_STRING RegistryPath)
+{
+ UNICODE_STRING nameString, linkString;
+ PDEVICE_OBJECT devobj;
+ NTSTATUS status;
+ struct eppflex *s;
+
+
+ /*
+ * Create the device object.
+ */
+ RtlInitUnicodeString(&nameString, L"\\Device\\eppflex" );
+ status = IoCreateDevice(drvobj, sizeof(struct eppflex), &nameString, FILE_DEVICE_UNKNOWN, 0, TRUE, &devobj);
+ if (!NT_SUCCESS(status))
+ return status;
+
+ /*
+ * Create the symbolic link so the VDD can find us.
+ */
+ RtlInitUnicodeString( &linkString, L"\\DosDevices\\EPPFLEX" );
+ status = IoCreateSymbolicLink (&linkString, &nameString);
+ if (!NT_SUCCESS(status)) {
+ IoDeleteDevice(drvobj->DeviceObject);
+ return status;
+ }
+
+ /*
+ * Initialize the driver object with this device driver's entry points.
+ */
+
+ drvobj->DriverUnload = unload;
+ drvobj->MajorFunction[IRP_MJ_CREATE] = create;
+ drvobj->MajorFunction[IRP_MJ_CLOSE] = close;
+ drvobj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ioctl;
+
+ s = devobj->DeviceExtension;
+
+ /*
+ * Initialize the device extension.
+ */
+
+ printk("eppflex: started "__DATE__" "__TIME__"\n");
+
+ return STATUS_SUCCESS;
+}
diff --git a/ntdrv/eppflex.h b/ntdrv/eppflex.h
new file mode 100644
index 0000000..fcd47ab
--- /dev/null
+++ b/ntdrv/eppflex.h
@@ -0,0 +1,49 @@
+
+#ifndef CTL_CODE
+#define CTL_CODE(DeviceType,Function,Method,Access) (((DeviceType)<<16)|((Access)<<14)|((Function)<<2)|(Method))
+#endif
+
+#ifndef METHOD_BUFFERED
+#define METHOD_BUFFERED 0
+#define METHOD_IN_DIRECT 1
+#define METHOD_OUT_DIRECT 2
+#define METHOD_NEITHER 3
+#endif
+
+#ifndef FILE_ANY_ACCESS
+#define FILE_ANY_ACCESS 0
+#define FILE_READ_ACCESS (0x0001)
+#define FILE_WRITE_ACCESS (0x0002)
+#endif
+
+
+#define FILE_DEVICE_EPPFLEX 0x80aa
+
+struct eppflex_rwdata {
+ unsigned char data;
+ unsigned char mask;
+};
+
+#define IOCTL_EPPFLEX_READ_DATA CTL_CODE(FILE_DEVICE_EPPFLEX, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_DATA CTL_CODE(FILE_DEVICE_EPPFLEX, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_STATUS CTL_CODE(FILE_DEVICE_EPPFLEX, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_STATUS CTL_CODE(FILE_DEVICE_EPPFLEX, 3, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_CONTROL CTL_CODE(FILE_DEVICE_EPPFLEX, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_CONTROL CTL_CODE(FILE_DEVICE_EPPFLEX, 5, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_FROB_CONTROL CTL_CODE(FILE_DEVICE_EPPFLEX, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_ECONTROL CTL_CODE(FILE_DEVICE_EPPFLEX, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_ECONTROL CTL_CODE(FILE_DEVICE_EPPFLEX, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_FROB_ECONTROL CTL_CODE(FILE_DEVICE_EPPFLEX, 9, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_CONFIGA CTL_CODE(FILE_DEVICE_EPPFLEX, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_CONFIGA CTL_CODE(FILE_DEVICE_EPPFLEX, 11, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_CONFIGB CTL_CODE(FILE_DEVICE_EPPFLEX, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_CONFIGB CTL_CODE(FILE_DEVICE_EPPFLEX, 13, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_EPPADDR CTL_CODE(FILE_DEVICE_EPPFLEX, 14, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_EPPADDR CTL_CODE(FILE_DEVICE_EPPFLEX, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_EPPDATA CTL_CODE(FILE_DEVICE_EPPFLEX, 16, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_EPPDATA CTL_CODE(FILE_DEVICE_EPPFLEX, 17, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/* only W9x */
+#define IOCTL_EPPFLEX_ACQUIREPORT CTL_CODE(FILE_DEVICE_EPPFLEX, 64, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_RELEASEPORT CTL_CODE(FILE_DEVICE_EPPFLEX, 65, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
diff --git a/ntdrv/eppflex.inf b/ntdrv/eppflex.inf
new file mode 100644
index 0000000..1f3c668
--- /dev/null
+++ b/ntdrv/eppflex.inf
@@ -0,0 +1,57 @@
+[Version]
+Signature="$CHICAGO$"
+Class=Ports
+provider=%MSFT%
+;LayoutFile=layout.inf
+DriverVer=07/21/2000,1.0.0.1
+
+[SourceDisksNames]
+1="EPPFLEX Installation Disk",,,""
+
+[SourceDisksFiles]
+eppflex.sys = 1,,
+
+[Manufacturer]
+%MfgName%=Baycom
+
+[Baycom]
+%EppFlexDev.DeviceDesc%=EPPFLEX_Dev
+
+;[PreCopySection]
+;HKR,,NoSetupUI,,1
+
+[DestinationDirs]
+EPPFLEX.Files.Ext = 10,System32\Drivers
+
+[EPPFLEX_Dev.NT]
+CopyFiles=EPPFLEX.Files.Ext
+AddReg=EPPFLEX.AddReg
+
+[EPPFLEX_Dev.NT.Services]
+Addservice = EPPFLEX, 0x00000002, EPPFLEX.AddService
+
+[EPPFLEX.AddService]
+DisplayName = %EPPFLEX.SvcDesc%
+ServiceType = 1 ; SERVICE_KERNEL_DRIVER
+StartType = 3 ; SERVICE_DEMAND_START
+ErrorControl = 1 ; SERVICE_ERROR_NORMAL
+ServiceBinary = %10%\System32\Drivers\eppflex.sys
+LoadOrderGroup = Base
+
+[EPPFLEX.AddReg]
+HKR,,DevLoader,,*ntkern
+HKR,,NTMPDriver,,eppflex.sys
+;HKLM,"System\Currentcontrolset\Services\USBFLEX\Parameters","TotalBuffers",0x10001,256
+
+
+[EPPFLEX.Files.Ext]
+eppflex.sys
+
+;---------------------------------------------------------------;
+
+[Strings]
+MSFT="Baycom"
+MfgName="Baycom Hard- und Software GmbH"
+EppFlexDev.DeviceDesc="EPPFLEX Radio Modem"
+EPPFLEX.SvcDesc="eppflex.sys EPPFLEX Modem Driver"
+
diff --git a/ntdrv/eppflex.rc b/ntdrv/eppflex.rc
new file mode 100644
index 0000000..1365ca6
--- /dev/null
+++ b/ntdrv/eppflex.rc
@@ -0,0 +1,38 @@
+#include <windows.h>
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 1,0,0,1
+ PRODUCTVERSION 1,0,0,1
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x40004L
+ FILETYPE 0x0L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904b0"
+ BEGIN
+ VALUE "Comments", "\0"
+ VALUE "CompanyName", "Baycom Hard- und Software GmbH\0"
+ VALUE "FileDescription", "eppflex\0"
+ VALUE "FileVersion", "1, 0, 0, 1\0"
+ VALUE "InternalName", "Baycom EPPFLEX FlexNet kernel driver\0"
+ VALUE "LegalCopyright", "Copyright � 2000\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "eppflex.sys\0"
+ VALUE "PrivateBuild", "\0"
+ VALUE "ProductName", "EPPFLEX\0"
+ VALUE "ProductVersion", "1.00a\0"
+ VALUE "SpecialBuild", "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/ntdrv/eppflex.sys b/ntdrv/eppflex.sys
new file mode 100755
index 0000000..f6b94e8
Binary files /dev/null and b/ntdrv/eppflex.sys differ
diff --git a/ntdrv/makefile b/ntdrv/makefile
new file mode 100755
index 0000000..9348f56
--- /dev/null
+++ b/ntdrv/makefile
@@ -0,0 +1,7 @@
+#
+# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source
+# file to this component. This file merely indirects to the real make file
+# that is shared by all the components of Windows NT
+#
+!INCLUDE $(NTMAKEENV)\makefile.def
+
diff --git a/ntdrv/sources b/ntdrv/sources
new file mode 100755
index 0000000..515f607
--- /dev/null
+++ b/ntdrv/sources
@@ -0,0 +1,7 @@
+TARGETNAME=eppflex
+TARGETPATH=obj
+TARGETTYPE=DRIVER
+
+SOURCES=eppflex.c \
+ eppflex.rc
+
diff --git a/ntdrv/testload.c b/ntdrv/testload.c
new file mode 100755
index 0000000..907eeda
--- /dev/null
+++ b/ntdrv/testload.c
@@ -0,0 +1,128 @@
+#include <windows.h>
+#include <stdio.h>
+
+static void getdir(void)
+{
+ HKEY key;
+ char buf[256];
+ DWORD blen, rtype;
+
+ if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\FlexNet", 0, KEY_READ, &key) != ERROR_SUCCESS) {
+ fprintf(stderr, "Cannot open registry key\n");
+ return;
+ }
+ blen = sizeof(buf);
+ if (RegQueryValueEx(key, "Home", NULL, &rtype, buf, &blen) != ERROR_SUCCESS || rtype != REG_SZ)
+ fprintf(stderr, "Invalid/Nonexisting Registry Key/Type\n");
+ else
+ printf("FlexNet Directory %s\n", buf);
+ RegCloseKey(key);
+}
+
+#define SERVICENAME "eppflex"
+#define SERVICEDISPLAYNAME "Baycom EPPFLEX"
+//#define SERVICEBINARY "\"\\??\\g:\\nteppflex\\eppflex.sys\""
+#define SERVICEBINARY "system32\\drivers\\eppflex.sys"
+
+static int start_service(void)
+{
+ int ret = -1;
+ SC_HANDLE hscm, hserv;
+
+ hscm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
+ if (!hscm) {
+ fprintf(stderr, "Cannot open SC manager, error 0x%08lx\n", GetLastError());
+ return -1;
+ }
+ hserv = CreateService(hscm, SERVICENAME, SERVICEDISPLAYNAME,
+ SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
+ SERVICEBINARY, NULL, NULL, NULL, NULL, NULL);
+ if (!hserv) {
+ fprintf(stderr, "Cannot create service, error 0x%08lx\n", GetLastError());
+ hserv = OpenService(hscm, SERVICENAME, SERVICE_ALL_ACCESS);
+ if (!hserv) {
+ fprintf(stderr, "Cannot open service, error 0x%08lx\n", GetLastError());
+ goto closescm;
+ }
+ }
+ if (!StartService(hserv, 0, NULL)) {
+ fprintf(stderr, "Cannot start service, error 0x%08lx\n", GetLastError());
+ goto closeserv;
+ }
+ printf("Service %s started successfully\n", SERVICENAME);
+ ret = 0;
+
+ closeserv:
+ if (!CloseServiceHandle(hserv))
+ fprintf(stderr, "Cannot close service handle, error 0x%08lx\n", GetLastError());
+ closescm:
+ if (!CloseServiceHandle(hscm))
+ fprintf(stderr, "Cannot close service manager handle, error 0x%08lx\n", GetLastError());
+ return ret;
+}
+
+static int stop_service(void)
+{
+ int ret = -1;
+ SC_HANDLE hscm, hserv;
+ SERVICE_STATUS sstat;
+
+ hscm = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
+ if (!hscm) {
+ fprintf(stderr, "Cannot open SC manager, error 0x%08lx\n", GetLastError());
+ return -1;
+ }
+ hserv = OpenService(hscm, SERVICENAME, SERVICE_ALL_ACCESS);
+ if (!hserv) {
+ fprintf(stderr, "Cannot open service, error 0x%08lx\n", GetLastError());
+ goto closescm;
+ }
+ ret = 0;
+ if (!ControlService(hserv, SERVICE_CONTROL_STOP, &sstat)) {
+ fprintf(stderr, "Cannot delete service, error 0x%08lx\n", GetLastError());
+ ret = -1;
+ }
+ if (!DeleteService(hserv)) {
+ fprintf(stderr, "Cannot delete service, error 0x%08lx\n", GetLastError());
+ ret = -1;
+ }
+ if (!ret)
+ printf("Service %s stopped successfully\n", SERVICENAME);
+ if (!CloseServiceHandle(hserv))
+ fprintf(stderr, "Cannot close service handle, error 0x%08lx\n", GetLastError());
+ closescm:
+ if (!CloseServiceHandle(hscm))
+ fprintf(stderr, "Cannot close service manager handle, error 0x%08lx\n", GetLastError());
+ return ret;
+}
+
+static int open_driver(void)
+{
+ HANDLE hdrv;
+ hdrv = CreateFile("\\\\.\\eppflex\\0", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,
+ NULL, OPEN_EXISTING, 0, NULL);
+ if (hdrv == INVALID_HANDLE_VALUE) {
+ fprintf(stderr, "Cannot open driver, error 0x%08lx\n", GetLastError());
+ return -1;
+ }
+ CloseHandle(hdrv);
+ return 0;
+}
+
+int main(int argc, char *argv[])
+{
+ getdir();
+
+ if (argc < 2) {
+ fprintf(stderr, "usage: testload [r|s|o]\n");
+ exit(1);
+ }
+ if (!strcmp(argv[1], "r"))
+ exit(start_service() ? 1 : 0);
+ if (!strcmp(argv[1], "s"))
+ exit(stop_service() ? 1 : 0);
+ if (!strcmp(argv[1], "o"))
+ exit(open_driver() ? 1 : 0);
+ fprintf(stderr, "Invalid command: %s\n", argv[1]);
+ exit(1);
+}
diff --git a/po/ChangeLog b/po/ChangeLog
new file mode 100644
index 0000000..e69de29
diff --git a/po/Makefile.in.in b/po/Makefile.in.in
new file mode 100644
index 0000000..111b40f
--- /dev/null
+++ b/po/Makefile.in.in
@@ -0,0 +1,248 @@
+# Makefile for program source directory in GNU NLS utilities package.
+# Copyright (C) 1995, 1996, 1997 by Ulrich Drepper <drepper at gnu.ai.mit.edu>
+#
+# This file file be copied and used freely without restrictions. It can
+# be used in projects which are not available under the GNU Public License
+# but which still want to provide support for the GNU gettext functionality.
+# Please note that the actual code is *not* freely available.
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+
+SHELL = /bin/sh
+ at SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datadir = $(prefix)/@DATADIRNAME@
+localedir = $(datadir)/locale
+gnulocaledir = $(prefix)/share/locale
+gettextsrcdir = $(prefix)/share/gettext/po
+subdir = po
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+MKINSTALLDIRS = $(top_srcdir)/@MKINSTALLDIRS@
+
+CC = @CC@
+GENCAT = @GENCAT@
+GMSGFMT = PATH=../src:$$PATH @GMSGFMT@
+MSGFMT = @MSGFMT@
+XGETTEXT = PATH=../src:$$PATH @XGETTEXT@
+MSGMERGE = PATH=../src:$$PATH msgmerge
+
+DEFS = @DEFS@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+
+INCLUDES = -I.. -I$(top_srcdir)/intl
+
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
+
+SOURCES = cat-id-tbl.c
+POFILES = @POFILES@
+GMOFILES = @GMOFILES@
+DISTFILES = ChangeLog Makefile.in.in POTFILES.in $(PACKAGE).pot \
+stamp-cat-id $(POFILES) $(GMOFILES) $(SOURCES)
+
+POTFILES = \
+
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+INSTOBJEXT = @INSTOBJEXT@
+
+.SUFFIXES:
+.SUFFIXES: .c .o .po .pox .gmo .mo .msg .cat
+
+.c.o:
+ $(COMPILE) $<
+
+.po.pox:
+ $(MAKE) $(PACKAGE).pot
+ $(MSGMERGE) $< $(srcdir)/$(PACKAGE).pot -o $*.pox
+
+.po.mo:
+ $(MSGFMT) -o $@ $<
+
+.po.gmo:
+ file=$(srcdir)/`echo $* | sed 's,.*/,,'`.gmo \
+ && rm -f $$file && $(GMSGFMT) -o $$file $<
+
+.po.cat:
+ sed -f ../intl/po2msg.sed < $< > $*.msg \
+ && rm -f $@ && $(GENCAT) $@ $*.msg
+
+
+all: all- at USE_NLS@
+
+all-yes: cat-id-tbl.c $(CATALOGS)
+all-no:
+
+$(srcdir)/$(PACKAGE).pot: $(POTFILES)
+ $(XGETTEXT) --default-domain=$(PACKAGE) --directory=$(top_srcdir) \
+ --add-comments --keyword=_ --keyword=N_ \
+ --files-from=$(srcdir)/POTFILES.in \
+ && test ! -f $(PACKAGE).po \
+ || ( rm -f $(srcdir)/$(PACKAGE).pot \
+ && mv $(PACKAGE).po $(srcdir)/$(PACKAGE).pot )
+
+$(srcdir)/cat-id-tbl.c: stamp-cat-id; @:
+$(srcdir)/stamp-cat-id: $(PACKAGE).pot
+ rm -f cat-id-tbl.tmp
+ sed -f ../intl/po2tbl.sed $(srcdir)/$(PACKAGE).pot \
+ | sed -e "s/@PACKAGE NAME@/$(PACKAGE)/" > cat-id-tbl.tmp
+ if cmp -s cat-id-tbl.tmp $(srcdir)/cat-id-tbl.c; then \
+ rm cat-id-tbl.tmp; \
+ else \
+ echo cat-id-tbl.c changed; \
+ rm -f $(srcdir)/cat-id-tbl.c; \
+ mv cat-id-tbl.tmp $(srcdir)/cat-id-tbl.c; \
+ fi
+ cd $(srcdir) && rm -f stamp-cat-id && echo timestamp > stamp-cat-id
+
+
+install: install-exec install-data
+install-exec:
+install-data: install-data- at USE_NLS@
+install-data-no: all
+install-data-yes: all
+ if test -r "$(MKINSTALLDIRS)"; then \
+ $(MKINSTALLDIRS) $(datadir); \
+ else \
+ $(SHELL) $(top_srcdir)/mkinstalldirs $(datadir); \
+ fi
+ @catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ case "$$cat" in \
+ *.gmo) destdir=$(gnulocaledir);; \
+ *) destdir=$(localedir);; \
+ esac; \
+ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \
+ dir=$$destdir/$$lang/LC_MESSAGES; \
+ if test -r "$(MKINSTALLDIRS)"; then \
+ $(MKINSTALLDIRS) $$dir; \
+ else \
+ $(SHELL) $(top_srcdir)/mkinstalldirs $$dir; \
+ fi; \
+ if test -r $$cat; then \
+ $(INSTALL_DATA) $$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \
+ echo "installing $$cat as $$dir/$(PACKAGE)$(INSTOBJEXT)"; \
+ else \
+ $(INSTALL_DATA) $(srcdir)/$$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \
+ echo "installing $(srcdir)/$$cat as" \
+ "$$dir/$(PACKAGE)$(INSTOBJEXT)"; \
+ fi; \
+ if test -r $$cat.m; then \
+ $(INSTALL_DATA) $$cat.m $$dir/$(PACKAGE)$(INSTOBJEXT).m; \
+ echo "installing $$cat.m as $$dir/$(PACKAGE)$(INSTOBJEXT).m"; \
+ else \
+ if test -r $(srcdir)/$$cat.m ; then \
+ $(INSTALL_DATA) $(srcdir)/$$cat.m \
+ $$dir/$(PACKAGE)$(INSTOBJEXT).m; \
+ echo "installing $(srcdir)/$$cat as" \
+ "$$dir/$(PACKAGE)$(INSTOBJEXT).m"; \
+ else \
+ true; \
+ fi; \
+ fi; \
+ done
+ if test "$(PACKAGE)" = "gettext"; then \
+ if test -r "$(MKINSTALLDIRS)"; then \
+ $(MKINSTALLDIRS) $(gettextsrcdir); \
+ else \
+ $(SHELL) $(top_srcdir)/mkinstalldirs $(gettextsrcdir); \
+ fi; \
+ $(INSTALL_DATA) $(srcdir)/Makefile.in.in \
+ $(gettextsrcdir)/Makefile.in.in; \
+ else \
+ : ; \
+ fi
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall:
+ catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \
+ rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \
+ rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT).m; \
+ rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \
+ rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT).m; \
+ done
+ rm -f $(gettextsrcdir)/po-Makefile.in.in
+
+check: all
+
+cat-id-tbl.o: ../intl/libgettext.h
+
+dvi info tags TAGS ID:
+
+mostlyclean:
+ rm -f core core.* *.pox $(PACKAGE).po *.old.po cat-id-tbl.tmp
+ rm -fr *.o
+
+clean: mostlyclean
+
+distclean: clean
+ rm -f Makefile Makefile.in POTFILES *.mo *.msg *.cat *.cat.m
+
+maintainer-clean: distclean
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+ rm -f $(GMOFILES)
+
+distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir: update-po $(DISTFILES)
+ dists="$(DISTFILES)"; \
+ for file in $$dists; do \
+ ln $(srcdir)/$$file $(distdir) 2> /dev/null \
+ || cp -p $(srcdir)/$$file $(distdir); \
+ done
+
+update-po: Makefile
+ $(MAKE) $(PACKAGE).pot
+ PATH=`pwd`/../src:$$PATH; \
+ cd $(srcdir); \
+ catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ cat=`basename $$cat`; \
+ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \
+ mv $$lang.po $$lang.old.po; \
+ echo "$$lang:"; \
+ if $(MSGMERGE) $$lang.old.po $(PACKAGE).pot -o $$lang.po; then \
+ rm -f $$lang.old.po; \
+ else \
+ echo "msgmerge for $$cat failed!"; \
+ rm -f $$lang.po; \
+ mv $$lang.old.po $$lang.po; \
+ fi; \
+ done
+
+POTFILES: POTFILES.in
+ ( if test 'x$(srcdir)' != 'x.'; then \
+ posrcprefix='$(top_srcdir)/'; \
+ else \
+ posrcprefix="../"; \
+ fi; \
+ rm -f $@-t $@ \
+ && (sed -e '/^#/d' -e '/^[ ]*$$/d' \
+ -e "s at .*@ $$posrcprefix& \\\\@" < $(srcdir)/$@.in \
+ | sed -e '$$s/\\$$//') > $@-t \
+ && chmod a-w $@-t \
+ && mv $@-t $@ )
+
+Makefile: Makefile.in.in ../config.status POTFILES
+ cd .. \
+ && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \
+ $(SHELL) ./config.status
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/po/POTFILES.in b/po/POTFILES.in
new file mode 100644
index 0000000..30320a0
--- /dev/null
+++ b/po/POTFILES.in
@@ -0,0 +1,7 @@
+# List of source files containing translatable strings.
+
+eppfm2/src/main.c
+eppfm2/src/audio.c
+eppfm2/src/interface.c
+eppfm2/src/widgets.c
+eppfm2/src/support.c
diff --git a/po/baycomepp.pot b/po/baycomepp.pot
new file mode 100644
index 0000000..c67a284
--- /dev/null
+++ b/po/baycomepp.pot
@@ -0,0 +1,281 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2000-08-07 21:33+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: ENCODING\n"
+
+#: eppfm2/src/main.c:346
+msgid "Squelch on"
+msgstr ""
+
+#: eppfm2/src/interface.c:585 eppfm2/src/main.c:346
+msgid "Squelch off"
+msgstr ""
+
+#: eppfm2/src/interface.c:62
+msgid "EPPFM Input/Output Configuration"
+msgstr ""
+
+#: eppfm2/src/interface.c:72
+msgid "Soundcard Settings"
+msgstr ""
+
+#: eppfm2/src/interface.c:100 eppfm2/src/interface.c:116
+msgid "/dev/dsp"
+msgstr ""
+
+#: eppfm2/src/interface.c:101 eppfm2/src/interface.c:117
+msgid "/dev/dsp1"
+msgstr ""
+
+#: eppfm2/src/interface.c:121
+msgid "Soundcard for Recording"
+msgstr ""
+
+#: eppfm2/src/interface.c:134
+msgid "Soundcard for Playback"
+msgstr ""
+
+#: eppfm2/src/interface.c:147
+msgid "Parallel Port Driver Settings"
+msgstr ""
+
+#: eppfm2/src/interface.c:176
+msgid "0x378"
+msgstr ""
+
+#: eppfm2/src/interface.c:177
+msgid "0x278"
+msgstr ""
+
+#: eppfm2/src/interface.c:194
+msgid "/dev/ppuser0"
+msgstr ""
+
+#: eppfm2/src/interface.c:195
+msgid "/dev/ppuser1"
+msgstr ""
+
+#: eppfm2/src/interface.c:199
+msgid "IO Address"
+msgstr ""
+
+#: eppfm2/src/interface.c:211
+msgid "File"
+msgstr ""
+
+#: eppfm2/src/interface.c:223
+msgid "Driver Selection"
+msgstr ""
+
+#: eppfm2/src/interface.c:235
+msgid "Direct Parport Access"
+msgstr ""
+
+#: eppfm2/src/interface.c:246
+msgid "ppdev Kernel Driver"
+msgstr ""
+
+#: eppfm2/src/interface.c:257
+msgid "Modem Settings"
+msgstr ""
+
+#: eppfm2/src/interface.c:284
+msgid "19666600"
+msgstr ""
+
+#: eppfm2/src/interface.c:285
+msgid "9830400"
+msgstr ""
+
+#: eppfm2/src/interface.c:289
+msgid "FPGA clock frequency"
+msgstr ""
+
+#: eppfm2/src/interface.c:311 eppfm2/src/interface.c:744
+msgid "Ok"
+msgstr ""
+
+#: eppfm2/src/interface.c:319
+msgid "Continue"
+msgstr ""
+
+#: eppfm2/src/interface.c:321
+msgid "Quit"
+msgstr ""
+
+#: eppfm2/src/interface.c:329
+msgid "Quit the application"
+msgstr ""
+
+#: eppfm2/src/interface.c:387
+msgid "EPPFM"
+msgstr ""
+
+#: eppfm2/src/interface.c:415
+msgid "_File"
+msgstr ""
+
+#: eppfm2/src/interface.c:424
+msgid "File Menu"
+msgstr ""
+
+#: eppfm2/src/interface.c:436
+msgid "_DTMF keypad..."
+msgstr ""
+
+#: eppfm2/src/interface.c:448
+msgid "_Oscilloscope display..."
+msgstr ""
+
+#: eppfm2/src/interface.c:460
+msgid "_Spectrum Display..."
+msgstr ""
+
+#: eppfm2/src/interface.c:481
+msgid "_Quit"
+msgstr ""
+
+#: eppfm2/src/interface.c:493
+msgid "_Help"
+msgstr ""
+
+#: eppfm2/src/interface.c:514
+msgid "_About"
+msgstr ""
+
+#: eppfm2/src/interface.c:568
+msgid "PTT"
+msgstr ""
+
+#: eppfm2/src/interface.c:577
+msgid "1750"
+msgstr ""
+
+#: eppfm2/src/interface.c:593
+msgid "DTMF"
+msgstr ""
+
+#: eppfm2/src/interface.c:601 eppfm2/src/interface.c:1144
+msgid "Scope"
+msgstr ""
+
+#: eppfm2/src/interface.c:609 eppfm2/src/interface.c:1175
+msgid "Spectrum"
+msgstr ""
+
+#: eppfm2/src/interface.c:690
+msgid "About"
+msgstr ""
+
+#: eppfm2/src/interface.c:708
+msgid "written by:"
+msgstr ""
+
+#: eppfm2/src/interface.c:718
+msgid "Thomas Sailer"
+msgstr ""
+
+#: eppfm2/src/interface.c:727
+msgid "HB9JNX/AE4WA"
+msgstr ""
+
+#: eppfm2/src/interface.c:797
+msgid "DTMF Keypad"
+msgstr ""
+
+#: eppfm2/src/interface.c:807
+msgid "Keys transmitted"
+msgstr ""
+
+#: eppfm2/src/interface.c:834
+msgid "Clear"
+msgstr ""
+
+#: eppfm2/src/interface.c:843
+msgid "Keypad"
+msgstr ""
+
+#: eppfm2/src/interface.c:861
+msgid "8"
+msgstr ""
+
+#: eppfm2/src/interface.c:871
+msgid "9"
+msgstr ""
+
+#: eppfm2/src/interface.c:881
+msgid "A"
+msgstr ""
+
+#: eppfm2/src/interface.c:891
+msgid "4"
+msgstr ""
+
+#: eppfm2/src/interface.c:901
+msgid "5"
+msgstr ""
+
+#: eppfm2/src/interface.c:911
+msgid "6"
+msgstr ""
+
+#: eppfm2/src/interface.c:921
+msgid "B"
+msgstr ""
+
+#: eppfm2/src/interface.c:931
+msgid "1"
+msgstr ""
+
+#: eppfm2/src/interface.c:941
+msgid "2"
+msgstr ""
+
+#: eppfm2/src/interface.c:951
+msgid "3"
+msgstr ""
+
+#: eppfm2/src/interface.c:961
+msgid "C"
+msgstr ""
+
+#: eppfm2/src/interface.c:971
+msgid "*"
+msgstr ""
+
+#: eppfm2/src/interface.c:981
+msgid "0"
+msgstr ""
+
+#: eppfm2/src/interface.c:991
+msgid "#"
+msgstr ""
+
+#: eppfm2/src/interface.c:1001
+msgid "D"
+msgstr ""
+
+#: eppfm2/src/interface.c:1011
+msgid "7"
+msgstr ""
+
+#: eppfm2/src/support.c:117
+#, c-format
+msgid "Couldn't find pixmap file: %s"
+msgstr ""
+
+#: eppfm2/src/support.c:126
+#, c-format
+msgid "Error loading pixmap file: %s"
+msgstr ""
diff --git a/po/cat-id-tbl.c b/po/cat-id-tbl.c
new file mode 100644
index 0000000..1cc87ba
--- /dev/null
+++ b/po/cat-id-tbl.c
@@ -0,0 +1,79 @@
+/* Automatically generated by po2tbl.sed from baycomepp.pot. */
+
+#if HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "libgettext.h"
+
+const struct _msg_ent _msg_tbl[] = {
+ {"", 1},
+ {"Squelch on", 2},
+ {"Squelch off", 3},
+ {"EPPFM Input/Output Configuration", 4},
+ {"Soundcard Settings", 5},
+ {"/dev/dsp", 6},
+ {"/dev/dsp1", 7},
+ {"Soundcard for Recording", 8},
+ {"Soundcard for Playback", 9},
+ {"Parallel Port Driver Settings", 10},
+ {"0x378", 11},
+ {"0x278", 12},
+ {"/dev/ppuser0", 13},
+ {"/dev/ppuser1", 14},
+ {"IO Address", 15},
+ {"File", 16},
+ {"Driver Selection", 17},
+ {"Direct Parport Access", 18},
+ {"ppdev Kernel Driver", 19},
+ {"Modem Settings", 20},
+ {"19666600", 21},
+ {"9830400", 22},
+ {"FPGA clock frequency", 23},
+ {"Ok", 24},
+ {"Continue", 25},
+ {"Quit", 26},
+ {"Quit the application", 27},
+ {"EPPFM", 28},
+ {"_File", 29},
+ {"File Menu", 30},
+ {"_DTMF keypad...", 31},
+ {"_Oscilloscope display...", 32},
+ {"_Spectrum Display...", 33},
+ {"_Quit", 34},
+ {"_Help", 35},
+ {"_About", 36},
+ {"PTT", 37},
+ {"1750", 38},
+ {"DTMF", 39},
+ {"Scope", 40},
+ {"Spectrum", 41},
+ {"About", 42},
+ {"written by:", 43},
+ {"Thomas Sailer", 44},
+ {"HB9JNX/AE4WA", 45},
+ {"DTMF Keypad", 46},
+ {"Keys transmitted", 47},
+ {"Clear", 48},
+ {"Keypad", 49},
+ {"8", 50},
+ {"9", 51},
+ {"A", 52},
+ {"4", 53},
+ {"5", 54},
+ {"6", 55},
+ {"B", 56},
+ {"1", 57},
+ {"2", 58},
+ {"3", 59},
+ {"C", 60},
+ {"*", 61},
+ {"0", 62},
+ {"#", 63},
+ {"D", 64},
+ {"7", 65},
+ {"Couldn't find pixmap file: %s", 66},
+ {"Error loading pixmap file: %s", 67},
+};
+
+int _msg_tbl_length = 67;
diff --git a/po/stamp-cat-id b/po/stamp-cat-id
new file mode 100644
index 0000000..9788f70
--- /dev/null
+++ b/po/stamp-cat-id
@@ -0,0 +1 @@
+timestamp
diff --git a/stamp-h.in b/stamp-h.in
new file mode 100644
index 0000000..9788f70
--- /dev/null
+++ b/stamp-h.in
@@ -0,0 +1 @@
+timestamp
diff --git a/udriver/Makefile.am b/udriver/Makefile.am
new file mode 100644
index 0000000..4380e3e
--- /dev/null
+++ b/udriver/Makefile.am
@@ -0,0 +1,41 @@
+## Process this file with automake to produce Makefile.in
+
+INCLUDES = -I$(top_srcdir)/main -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" -fPIC -DPIC
+
+if BAYCOMDRV
+DRVPROGS = baycomepp
+DRVEXECSCR = baycomfpga_init.so
+DRVLIBS = libdrvinit.a
+else
+DRVPROGS =
+endif
+
+noinst_LIBRARIES = $(DRVLIBS)
+libexec_SCRIPTS = $(DRVEXECSCR)
+
+man_MANS = baycomepp.8
+
+sbin_PROGRAMS = $(DRVPROGS)
+
+libdrvinit_a_SOURCES = \
+ drvinit.c
+
+baycomfpga_init.so: drvinit.o $(top_builddir)/main/libinit.a $(LIBOBJS)
+ $(CC) -shared -Wl,-soname -Wl,baycomfpga_init.so -o $@ $^
+
+baycomepp_SOURCES = \
+ drvresident.c
+
+baycomepp_LDADD = \
+ $(top_builddir)/main/libresident.a $(top_builddir)/main/libmisc.a \
+ $(DRVLIBOBJS) -ldl
+
+baycomepp_LDFLAGS = \
+ -rdynamic -Wl,-Map -Wl,baycomepp.map -Wl,--rpath -Wl,$(libexecdir)
+
+CLEANFILES = baycomepp.map baycomfpga_init.so
+
+noinst_HEADERS = \
+ drv.h
+
+EXTRA_DIST = baycomepp.8 baycomepp.initscript
diff --git a/udriver/Makefile.in b/udriver/Makefile.in
new file mode 100644
index 0000000..cd397b4
--- /dev/null
+++ b/udriver/Makefile.in
@@ -0,0 +1,463 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AS = @AS@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+DATADIRNAME = @DATADIRNAME@
+DLLTOOL = @DLLTOOL@
+DRVLIBOBJS = @DRVLIBOBJS@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+HAVE_BITTYPES = @HAVE_BITTYPES@
+HAVE_DIRECTX = @HAVE_DIRECTX@
+HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@
+HAVE_IOFUNCS = @HAVE_IOFUNCS@
+HAVE_LIB = @HAVE_LIB@
+HAVE_MKISS = @HAVE_MKISS@
+HAVE_PPKDRV = @HAVE_PPKDRV@
+HAVE_PPUSER = @HAVE_PPUSER@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LIB = @LIB@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LTLIB = @LTLIB@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+M_PI = @M_PI@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+
+INCLUDES = -I$(top_srcdir)/main -DCONFIGDIR=\"$(sysconfdir)\" -DLOCALSTATEDIR=\"$(localstatedir)\" -fPIC -DPIC
+ at BAYCOMDRV_TRUE@DRVPROGS = @BAYCOMDRV_TRUE at baycomepp
+ at BAYCOMDRV_FALSE@DRVPROGS =
+ at BAYCOMDRV_TRUE@DRVEXECSCR = @BAYCOMDRV_TRUE at baycomfpga_init.so
+ at BAYCOMDRV_TRUE@DRVLIBS = @BAYCOMDRV_TRUE at libdrvinit.a
+
+noinst_LIBRARIES = $(DRVLIBS)
+libexec_SCRIPTS = $(DRVEXECSCR)
+
+man_MANS = baycomepp.8
+
+sbin_PROGRAMS = $(DRVPROGS)
+
+libdrvinit_a_SOURCES = \
+ drvinit.c
+
+
+baycomepp_SOURCES = \
+ drvresident.c
+
+
+baycomepp_LDADD = \
+ $(top_builddir)/main/libresident.a $(top_builddir)/main/libmisc.a \
+ $(DRVLIBOBJS) -ldl
+
+
+baycomepp_LDFLAGS = \
+ -rdynamic -Wl,-Map -Wl,baycomepp.map -Wl,--rpath -Wl,$(libexecdir)
+
+
+CLEANFILES = baycomepp.map baycomfpga_init.so
+
+noinst_HEADERS = \
+ drv.h
+
+
+EXTRA_DIST = baycomepp.8 baycomepp.initscript
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES =
+LIBRARIES = $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) -I..
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libdrvinit_a_LIBADD =
+libdrvinit_a_OBJECTS = drvinit.$(OBJEXT)
+ at BAYCOMDRV_FALSE@sbin_PROGRAMS =
+ at BAYCOMDRV_TRUE@sbin_PROGRAMS = baycomepp$(EXEEXT)
+PROGRAMS = $(sbin_PROGRAMS)
+
+baycomepp_OBJECTS = drvresident.$(OBJEXT)
+baycomepp_DEPENDENCIES = $(top_builddir)/main/libresident.a \
+$(top_builddir)/main/libmisc.a
+SCRIPTS = $(libexec_SCRIPTS)
+
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+man8dir = $(mandir)/man8
+MANS = $(man_MANS)
+
+NROFF = nroff
+HEADERS = $(noinst_HEADERS)
+
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+SOURCES = $(libdrvinit_a_SOURCES) $(baycomepp_SOURCES)
+OBJECTS = $(libdrvinit_a_OBJECTS) $(baycomepp_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .obj .s
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps udriver/Makefile
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-noinstLIBRARIES:
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+
+distclean-noinstLIBRARIES:
+
+maintainer-clean-noinstLIBRARIES:
+
+.c.o:
+ $(COMPILE) -c $<
+
+# FIXME: We should only use cygpath when building on Windows,
+# and only if it is available.
+.c.obj:
+ $(COMPILE) -c `cygpath -w $<`
+
+.s.o:
+ $(COMPILE) -c $<
+
+.S.o:
+ $(COMPILE) -c $<
+
+mostlyclean-compile:
+ -rm -f *.o core *.core
+ -rm -f *.$(OBJEXT)
+
+clean-compile:
+
+distclean-compile:
+ -rm -f *.tab.c
+
+maintainer-clean-compile:
+
+libdrvinit.a: $(libdrvinit_a_OBJECTS) $(libdrvinit_a_DEPENDENCIES)
+ -rm -f libdrvinit.a
+ $(AR) cru libdrvinit.a $(libdrvinit_a_OBJECTS) $(libdrvinit_a_LIBADD)
+ $(RANLIB) libdrvinit.a
+
+mostlyclean-sbinPROGRAMS:
+
+clean-sbinPROGRAMS:
+ -test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS)
+
+distclean-sbinPROGRAMS:
+
+maintainer-clean-sbinPROGRAMS:
+
+install-sbinPROGRAMS: $(sbin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(sbindir)
+ @list='$(sbin_PROGRAMS)'; for p in $$list; do \
+ if test -f $$p; then \
+ echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \
+ $(INSTALL_PROGRAM) $$p $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ else :; fi; \
+ done
+
+uninstall-sbinPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ list='$(sbin_PROGRAMS)'; for p in $$list; do \
+ rm -f $(DESTDIR)$(sbindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \
+ done
+
+baycomepp$(EXEEXT): $(baycomepp_OBJECTS) $(baycomepp_DEPENDENCIES)
+ @rm -f baycomepp$(EXEEXT)
+ $(LINK) $(baycomepp_LDFLAGS) $(baycomepp_OBJECTS) $(baycomepp_LDADD) $(LIBS)
+
+install-libexecSCRIPTS: $(libexec_SCRIPTS)
+ @$(NORMAL_INSTALL)
+ $(mkinstalldirs) $(DESTDIR)$(libexecdir)
+ @list='$(libexec_SCRIPTS)'; for p in $$list; do \
+ if test -f $$p; then \
+ echo " $(INSTALL_SCRIPT) $$p $(DESTDIR)$(libexecdir)/`echo $$p|sed '$(transform)'`"; \
+ $(INSTALL_SCRIPT) $$p $(DESTDIR)$(libexecdir)/`echo $$p|sed '$(transform)'`; \
+ else if test -f $(srcdir)/$$p; then \
+ echo " $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(libexecdir)/`echo $$p|sed '$(transform)'`"; \
+ $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(libexecdir)/`echo $$p|sed '$(transform)'`; \
+ else :; fi; fi; \
+ done
+
+uninstall-libexecSCRIPTS:
+ @$(NORMAL_UNINSTALL)
+ list='$(libexec_SCRIPTS)'; for p in $$list; do \
+ rm -f $(DESTDIR)$(libexecdir)/`echo $$p|sed '$(transform)'`; \
+ done
+
+install-man8:
+ $(mkinstalldirs) $(DESTDIR)$(man8dir)
+ @list='$(man8_MANS)'; \
+ l2='$(man_MANS)'; for i in $$l2; do \
+ case "$$i" in \
+ *.8*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+ else file=$$i; fi; \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man8dir)/$$inst"; \
+ $(INSTALL_DATA) $$file $(DESTDIR)$(man8dir)/$$inst; \
+ done
+
+uninstall-man8:
+ @list='$(man8_MANS)'; \
+ l2='$(man_MANS)'; for i in $$l2; do \
+ case "$$i" in \
+ *.8*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " rm -f $(DESTDIR)$(man8dir)/$$inst"; \
+ rm -f $(DESTDIR)$(man8dir)/$$inst; \
+ done
+install-man: $(MANS)
+ @$(NORMAL_INSTALL)
+ $(MAKE) $(AM_MAKEFLAGS) install-man8
+uninstall-man:
+ @$(NORMAL_UNINSTALL)
+ $(MAKE) $(AM_MAKEFLAGS) uninstall-man8
+
+tags: TAGS
+
+ID: $(HEADERS) $(SOURCES) $(LISP)
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ here=`pwd` && cd $(srcdir) \
+ && mkid -f$$here/ID $$unique $(LISP)
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS)'; \
+ unique=`for i in $$list; do echo $$i; done | \
+ awk ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \
+ || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS)
+
+mostlyclean-tags:
+
+clean-tags:
+
+distclean-tags:
+ -rm -f TAGS ID
+
+maintainer-clean-tags:
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = udriver
+
+distdir: $(DISTFILES)
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+drvinit.o: drvinit.c ../config.h ../main/getopt.h drv.h ../main/fpga.h \
+ ../main/sysdeps.h ../main/parport.h
+drvresident.o: drvresident.c ../config.h ../main/getopt.h drv.h \
+ ../main/fpga.h ../main/sysdeps.h ../main/parport.h
+
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am: install-sbinPROGRAMS install-libexecSCRIPTS
+install-exec: install-exec-am
+
+install-data-am: install-man
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-sbinPROGRAMS uninstall-libexecSCRIPTS \
+ uninstall-man
+uninstall: uninstall-am
+all-am: Makefile $(LIBRARIES) $(PROGRAMS) $(SCRIPTS) $(MANS) $(HEADERS)
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+ $(mkinstalldirs) $(DESTDIR)$(sbindir) $(DESTDIR)$(libexecdir) \
+ $(DESTDIR)$(mandir)/man8
+
+
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \
+ mostlyclean-sbinPROGRAMS mostlyclean-tags \
+ mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-noinstLIBRARIES clean-compile clean-sbinPROGRAMS \
+ clean-tags clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am: distclean-noinstLIBRARIES distclean-compile \
+ distclean-sbinPROGRAMS distclean-tags distclean-generic \
+ clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-noinstLIBRARIES \
+ maintainer-clean-compile maintainer-clean-sbinPROGRAMS \
+ maintainer-clean-tags maintainer-clean-generic \
+ distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \
+clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \
+mostlyclean-compile distclean-compile clean-compile \
+maintainer-clean-compile mostlyclean-sbinPROGRAMS \
+distclean-sbinPROGRAMS clean-sbinPROGRAMS maintainer-clean-sbinPROGRAMS \
+uninstall-sbinPROGRAMS install-sbinPROGRAMS uninstall-libexecSCRIPTS \
+install-libexecSCRIPTS install-man8 uninstall-man8 install-man \
+uninstall-man tags mostlyclean-tags distclean-tags clean-tags \
+maintainer-clean-tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+baycomfpga_init.so: drvinit.o $(top_builddir)/main/libinit.a $(LIBOBJS)
+ $(CC) -shared -Wl,-soname -Wl,baycomfpga_init.so -o $@ $^
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/udriver/baycomepp.8 b/udriver/baycomepp.8
new file mode 100644
index 0000000..d3d2ea1
--- /dev/null
+++ b/udriver/baycomepp.8
@@ -0,0 +1,140 @@
+.\" Copyright 1999 Thomas Sailer (sailer at ife.ee.ethz.ch)
+.\" May be distributed under the GNU General Public License
+.\"
+.\" "
+.TH BAYCOMEPP 8 "13 May 1998" "BaycomEPP 0.2" "Linux AX.25 Utilities Manual"
+.SH NAME
+baycomepp \- Baycom EPP modem driver
+.SH SYNOPSIS
+.B baycomepp
+.B "[ \-lknvcaz ]"
+.B "[\-p portaddr]"
+.B "[\-m modestr]"
+.B "[\--epp]"
+.B "[\--ecp]"
+.B "[\--eppconv]"
+.B "[\--eppafsk]"
+.B "[\--ifname name]"
+.B "[\--hwaddr callsign]"
+.B "[\--ipaddr ipaddress]"
+.B "[\--netmask netmask]"
+.B "[\--broadcast broadcast]"
+
+
+.SH DESCRIPTION
+.B baycomepp
+is a user mode driver for the Baycom EPP modem family. It currently
+supports the conventional EPP modem (using the IDT 72xxx FIFO's)
+and the FPGA (Xilinx XCS10) variant. The driver automatically
+initializes the FPGA modem depending on the requested mode.
+In order to keep the resident memory footprint small (approx
+20kBytes plus standard system shared libraries like libc),
+the initialization code is contained in a shared library called
+.I "baycomfpga_init.so".
+This driver is able to automatically attach itself to the
+kernel network stack as a network interface (usually called
+ax0). To do this it requires the Linux Kernel MKISS driver
+(enable CONFIG_MKISS).
+
+
+.SH OPTIONS
+.B baycomepp
+accepts the following options:
+
+.TP
+.B \-h
+.B \--help
+Display an overview of the available command line parameters and exit.
+.TP
+.B \-v
+.B \--verbose
+Increases the verbosity of the output. May be cumulated.
+.TP
+.B \-p
+.B \--port
+Specifies the base address of the EPP capable parallel port to which
+the modem is connected. Use the
+.I 0x
+prefix to specify hexadecimal numbers.
+.TP
+.B \-m
+.B \--mode
+Specifies various ``firmware'' options.
+.TP
+.B \-n
+.B \--no-daemon
+Do not start up in background as a daemon. Also log received
+and transmitted packets to stdout.
+.TP
+.B \-l
+.B \--log
+Log to syslog.
+.TP
+.B \-k
+.B \--kill
+Kill running baycomepp daemons. Don't start the driver proper.
+.TP
+.B \--epp
+Start up in EPP FSK mode. Requires the FPGA version.
+.TP
+.B \--eppafsk
+Start up in EPP AFSK mode. Requires the FPGA version.
+.TP
+.B \--ecp
+Start up in ECP FSK mode. Requires the FPGA version.
+.TP
+.B \--eppconv
+Start up in conventional EPP FSK mode. Requires the conventional version.
+.TP
+.B \--ifname
+Set the name of the interface (requires Linux 2.2.x)
+.TP
+.B \--hwaddr
+Set the hardware address (callsign) of the interface
+.TP
+.B \--ipaddr
+Set the ip address of the interface
+.TP
+.B \--netmask
+Set the netmask of the interface
+.TP
+.B \--broadcast
+Set the broadcast address of the interface
+
+
+.SH "FIRMWARE OPTIONS"
+
+.TP
+.B intclk
+uses FPGA internal clock; \fBdon't\fP use if an external oscillator is on board.
+.TP
+.B extclk
+uses the external oscillator; recommended if the internal modem is used, as the
+frequency of the FPGA oscillator is not accurate enough.
+.TP
+.B intmodem
+uses the internal modem
+.TP
+.B extmodem
+uses a DF9IC type modem connected to the high speed modem connector
+.TP
+.B divider=x
+sets the clock divider for the internal modem (baud=fquartz/16/divider)
+.TP
+.B loopback
+sets an internal modem loopback
+.TP
+.B extstat
+allows extended status readback
+.TP
+.B noextstat
+disallows extended status readback
+
+
+.SH "SEE ALSO"
+.nf
+.BR ifconfig "\ (8), " sethdlc "\ (8), "
+.fi
+
+.SH AUTHOR
+baycomepp was written by Thomas Sailer, HB9JNX/AE4WA (sailer at ife.ee.ethz.ch).
diff --git a/udriver/baycomepp.initscript b/udriver/baycomepp.initscript
new file mode 100755
index 0000000..d07f735
--- /dev/null
+++ b/udriver/baycomepp.initscript
@@ -0,0 +1,63 @@
+#! /bin/sh
+#
+# baycomepp Start Baycom EPP driver.
+#
+# Author: Thomas Sailer, <sailer at ife.ee.ethz.ch>
+#
+# chkconfig: 345 50 50
+# description: This script starts/stops the Baycom EPP driver
+# processname: baycomepp
+# pidfile: /var/run/baycomepp.pid
+
+# Source function library.
+. /etc/rc.d/init.d/functions
+
+# Get config.
+. /etc/sysconfig/network
+
+## Check that networking is up.
+#if [ ${NETWORKING} = "no" ]
+#then
+# exit 0
+#fi
+
+[ -f /usr/sbin/baycomepp ] || exit 0
+
+EPPCONV="-m divider=64 --epp"
+EPPIF=ax0
+MYCALL=hb9jnx
+MYIP=44.142.52.99
+GWCALL=hb9w-11
+GWPATH=hb9zrh
+GWIP=44.142.52.7
+GWMODE="-ipmode v"
+
+# See how we were called.
+case "$1" in
+ start)
+ echo -n "Starting BaycomEPP driver: "
+ if /usr/sbin/baycomepp -v -v -v -l ${EPPCONV} --hwaddr=${MYCALL} --ipaddr=${MYIP}; then
+ /sbin/route add -host ${GWIP} dev ${EPPIF}
+ /sbin/arp -H ax25 -s ${GWIP} ${GWCALL}
+ /usr/sbin/axparms -route add ${EPPIF} ${GWCALL} ${GWPATH} ${GWMODE}
+ /sbin/route add -net 44.0.0.0 netmask 255.0.0.0 gw ${GWIP}
+ else
+ echo "unable to start BaycomEPP"
+ exit 1
+ fi
+ echo
+ ;;
+ stop)
+ echo -n "Stopping BaycomEPP driver: "
+ /usr/sbin/baycomepp -k
+ echo
+ ;;
+ status)
+ killall -USR1 baycomepp
+ ;;
+ *)
+ echo "Usage: baycomepp {start|stop|status}"
+ exit 1
+esac
+
+exit 0
diff --git a/udriver/drv.h b/udriver/drv.h
new file mode 100644
index 0000000..54b6581
--- /dev/null
+++ b/udriver/drv.h
@@ -0,0 +1,172 @@
+/*****************************************************************************/
+
+/*
+ * drv.h -- HDLC packet radio modem for EPP/ECP using FPGA usermode driver.
+ *
+ * Copyright (C) 1998 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifndef _DRV_H
+#define _DRV_H
+
+/* --------------------------------------------------------------------- */
+
+#if defined(HAVE_SYS_IO_H)
+#include <sys/io.h>
+#elif defined(HAVE_ASM_IO_H)
+#include <asm/io.h>
+#endif
+
+#include <syslog.h>
+#include "fpga.h"
+
+/* --------------------------------------------------------------------- */
+
+#define KISS_FEND ((unsigned char)0300)
+#define KISS_FESC ((unsigned char)0333)
+#define KISS_TFEND ((unsigned char)0334)
+#define KISS_TFESC ((unsigned char)0335)
+
+#define KISS_CMD_DATA 0
+#define KISS_CMD_TXDELAY 1
+#define KISS_CMD_PPERSIST 2
+#define KISS_CMD_SLOTTIME 3
+#define KISS_CMD_TXTAIL 4
+#define KISS_CMD_FULLDUP 5
+#define KISS_CMD_HARDWARE 6
+#define KISS_CMD_FECLEVEL 8
+#define KISS_CMD_RETURN 255
+
+/* --------------------------------------------------------------------- */
+
+#define MAXFLEN 512
+#define RXBUFFER_SIZE ((MAXFLEN*6/5)+8)
+#define TXBUFFER_SIZE 8192
+
+#define KISSOUTBUF_SIZE 8192
+#define KISSINBUF_SIZE (2*MAXFLEN+8)
+
+struct baycomepp_state {
+ int kissfd;
+
+ struct adapter_config config;
+
+ struct {
+ unsigned bitrate, bitrateby25;
+ int slotcnt, flagcnt;
+ int dcd, ptt;
+ int calib;
+ enum { tx_idle = 0, tx_keyup, tx_data, tx_tail } state;
+ } access;
+
+ struct chaccesspar {
+ unsigned int txdelay;
+ unsigned int slottime;
+ unsigned int ppersist;
+ unsigned int txtail;
+ unsigned int fulldup;
+ } chaccesspar;
+
+ struct hdlc_receiver {
+ unsigned int bitbuf, bitstream, numbits, state;
+ unsigned char *bufptr;
+ int bufcnt;
+ unsigned char buf[RXBUFFER_SIZE];
+ } hrx;
+
+ struct hdlc_transmitter {
+ unsigned rd, wr;
+ u_int8_t buf[TXBUFFER_SIZE];
+ } htx;
+
+ struct {
+ unsigned ptr;
+ u_int8_t b[KISSINBUF_SIZE];
+ } kissin;
+
+ struct {
+ unsigned rd;
+ unsigned wr;
+ u_int8_t b[KISSOUTBUF_SIZE];
+ } kissout;
+
+ struct statistics {
+ unsigned long pkt_in;
+ unsigned long pkt_out;
+ unsigned long pkt_outerr;
+ unsigned long bytes_in;
+ unsigned long bytes_out;
+ unsigned long kiss_out;
+ unsigned long kiss_outerr;
+ unsigned long kiss_in;
+ unsigned long kiss_inerr;
+ unsigned long ptt_keyed;
+ unsigned int intcnt, icnt1, icnt2, icnt3, ocnt1, ocnt2, ocnt3;
+ u_int8_t status;
+ } stat;
+
+};
+
+/* --------------------------------------------------------------------- */
+
+extern int logging;
+extern int logpackets;
+extern struct baycomepp_state state;
+extern const char *progname;
+
+/* --------------------------------------------------------------------- */
+
+#define SEV_FATAL LOG_CRIT
+#define SEV_ERROR LOG_ERR
+#define SEV_WARNING LOG_WARNING
+#define SEV_NOTICE LOG_NOTICE
+#define SEV_INFO LOG_INFO
+#define SEV_DEBUG LOG_DEBUG
+
+extern void errprintf(int severity, const char *fmt, ...) __attribute__ ((format (printf, 2, 3)));
+extern void errstr(int severity, const char *st);
+extern void sighandler(int sig);
+extern void sig_usr1(int sig);
+extern void sig_usr2(int sig);
+
+/* ---------------------------------------------------------------------- */
+
+#ifdef __i386__
+#define GETTICK(x) \
+({ \
+ __asm__ __volatile__("rdtsc" : "=a" (x) : : "dx"); \
+})
+#else /* __i386__ */
+#define GETTICK(x) ((x)=0)
+#endif /* __i386__ */
+
+/* --------------------------------------------------------------------- */
+
+#define MODE_EPP 0
+#define MODE_ECP 1
+#define MODE_EPPAFSK 2
+#define MODE_EPPCONV 3 /* conventional modem */
+
+/* --------------------------------------------------------------------- */
+#endif /* _DRV_H */
diff --git a/udriver/drvinit.c b/udriver/drvinit.c
new file mode 100644
index 0000000..e494e6e
--- /dev/null
+++ b/udriver/drvinit.c
@@ -0,0 +1,837 @@
+/*****************************************************************************/
+
+/*
+ * drvinit.c -- HDLC packet radio modem for EPP/ECP using FPGA usermode driver.
+ * Init code (discarded at runtime).
+ *
+ * Copyright (C) 1998-2000 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <sys/socket.h>
+#include <sys/param.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <signal.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <time.h>
+#include <errno.h>
+#include <ctype.h>
+
+#ifdef HAVE_LINUX_IF_H
+#include <linux/if.h>
+#elif defined(HAVE_NET_IF_H)
+#include <net/if.h>
+#endif
+
+#ifdef HAVE_SCHED_H
+#include <sched.h>
+#endif
+
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+
+#ifdef HAVE_PTY_H
+#include <pty.h>
+#else
+extern int openpty(int *amaster, int *aslave, char *name, struct termios *termp, struct winsize *winp);
+#endif
+
+#include "drv.h"
+#include "parport.h"
+#include "fpga.h"
+
+#ifdef HAVE_MKISS
+#include <sys/socket.h>
+/* glibc2.0 does not have sockaddr_ax25, ifr.ifr_newname and SIOCSIFNAME */
+#include <linux/ax25.h>
+#include <linux/sockios.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#endif
+
+/* --------------------------------------------------------------------- */
+
+#define PIDFILE LOCALSTATEDIR "/run/baycomepp.pid"
+
+/* ---------------------------------------------------------------------- */
+
+static unsigned verboselevel = 0;
+
+#ifdef HAVE_MKISS
+
+struct ifconfig {
+ char ifname[IFNAMSIZ];
+ ax25_address hwaddr;
+ struct in_addr ipaddr, netmask, broadcast;
+};
+
+#define IFCONFIGINIT { "", { "" }, { INADDR_NONE }, { INADDR_NONE }, { INADDR_NONE } }
+
+#else /* !HAVE_MKISS */
+
+struct ifconfig {
+ char ifname[PATH_MAX];
+};
+
+#define IFCONFIGINIT { "" }
+
+#endif /* !HAVE_MKISS */
+
+/* ---------------------------------------------------------------------- */
+
+int lprintf(unsigned vl, const char *format, ...)
+{
+ static const int logprio[] = { LOG_ERR, LOG_INFO };
+ va_list ap;
+ int r = 0;
+
+ if (vl > verboselevel)
+ return 0;
+ va_start(ap, format);
+ if (logging)
+ vsyslog((vl > 1) ? LOG_DEBUG : logprio[vl], format, ap);
+ else {
+ r = fprintf(stderr, "baycomepp[%u]: ", getpid());
+ r += vfprintf(stderr, format, ap);
+ }
+ va_end(ap);
+ return r;
+}
+
+int tprintf(const char *format, ...)
+{
+ va_list ap;
+ int i;
+
+ va_start(ap, format);
+ i = vprintf(format, ap);
+ va_end(ap);
+ fflush(stdout);
+ return i;
+}
+
+int idle_callback(unsigned us_delay)
+{
+ return 1;
+}
+
+/* --------------------------------------------------------------------- */
+#ifdef HAVE_MKISS
+
+static inline void ifconfigure(struct ifconfig *cfg)
+{
+ int master, slave, fd, disc = N_AX25, encap = 4;
+ char mbuf[512], *mptr = mbuf;
+ struct sockaddr_ax25 sax25;
+ struct sockaddr_in sin;
+ struct termios tm;
+ struct ifreq ifr;
+ unsigned i;
+
+ openpty(&master, &slave, NULL, NULL, NULL);
+ /* set pty/tty pair to raw */
+ memset(&tm, 0, sizeof(tm));
+ tm.c_cflag = CS8 | CREAD | CLOCAL;
+ if (tcsetattr(master, TCSANOW, &tm))
+ errstr(SEV_WARNING, "master: tcsetattr");
+ memset(&tm, 0, sizeof(tm));
+ tm.c_cflag = CS8 | CREAD | CLOCAL;
+ if (tcsetattr(slave, TCSANOW, &tm))
+ errstr(SEV_WARNING, "slave: tcsetattr");
+ if (ioctl(master, TIOCSETD, &disc) == -1)
+ errstr(SEV_FATAL, "ioctl: TIOCSETD");
+ if (ioctl(master, SIOCGIFNAME, ifr.ifr_name) == -1)
+ errstr(SEV_FATAL, "ioctl: SIOCGIFNAME");
+ if (ioctl(master, SIOCSIFENCAP, &encap) == -1)
+ errstr(SEV_FATAL, "ioctl: SIOCSIFENCAP");
+ /* configure interface */
+ if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
+ errstr(SEV_FATAL, "socket");
+#ifdef HAVE_IFRNEWNAME
+ if (cfg->ifname[0]) {
+ strncpy(ifr.ifr_newname, cfg->ifname, sizeof(ifr.ifr_newname));
+ if (ioctl(fd, SIOCSIFNAME, &ifr) == -1) {
+ errstr(SEV_WARNING, "ioctl: SIOCSIFNAME");
+ errprintf(SEV_WARNING, "baycomepp: cannot set ifname to %s, using %s (old kernel version?)\n",
+ cfg->ifname, ifr.ifr_name);
+ } else {
+ memcpy(ifr.ifr_name, ifr.ifr_newname, sizeof(ifr.ifr_name));
+ }
+ }
+#endif /* HAVE_IFRNEWNAME */
+ mptr += sprintf(mptr, "ifname %s mtu 256", ifr.ifr_name);
+ ifr.ifr_mtu = 256;
+ if (ioctl(fd, SIOCSIFMTU, &ifr) < 0)
+ errstr(SEV_FATAL, "ioctl: SIOCSIFMTU");
+ if (cfg->hwaddr.ax25_call[0]) {
+ sax25.sax25_family = AF_AX25;
+ memcpy(&sax25.sax25_call, &cfg->hwaddr, sizeof(sax25.sax25_call));
+ sax25.sax25_ndigis = 0;
+ memcpy(&ifr.ifr_hwaddr, &sax25, sizeof(ifr.ifr_hwaddr));
+ if (ioctl(fd, SIOCSIFHWADDR, &ifr) == -1)
+ errstr(SEV_WARNING, "ioctl: SIOCSIFHWADDR");
+ else {
+ mptr += sprintf(mptr, " hwaddr ");
+ for (i = 0; i < 6; i++)
+ if (sax25.sax25_call.ax25_call[i] != (' ' << 1))
+ *mptr++ = (sax25.sax25_call.ax25_call[i] >> 1) & 0x7f;
+ mptr += sprintf(mptr, "-%d", (sax25.sax25_call.ax25_call[6] >> 1) & 0x7f);
+ }
+ }
+ if (cfg->ipaddr.s_addr != INADDR_NONE) {
+ sin.sin_family = AF_INET;
+ sin.sin_addr = cfg->ipaddr;
+ memcpy(&ifr.ifr_addr, &sin, sizeof(ifr.ifr_addr));
+ if (ioctl(fd, SIOCSIFADDR, &ifr) == -1)
+ errstr(SEV_WARNING, "ioctl: SIOCSIFADDR");
+ else
+ mptr += sprintf(mptr, " ipaddr %s", inet_ntoa(cfg->ipaddr));
+ }
+ if (cfg->netmask.s_addr != INADDR_NONE) {
+ sin.sin_family = AF_INET;
+ sin.sin_addr = cfg->netmask;
+ memcpy(&ifr.ifr_netmask, &sin, sizeof(ifr.ifr_netmask));
+ if (ioctl(fd, SIOCSIFNETMASK, &ifr) == -1)
+ errstr(SEV_WARNING, "ioctl: SIOCSIFNETMASK");
+ else
+ mptr += sprintf(mptr, " netmask %s", inet_ntoa(cfg->netmask));
+ }
+ if (cfg->broadcast.s_addr != INADDR_NONE) {
+ sin.sin_family = AF_INET;
+ sin.sin_addr = cfg->broadcast;
+ memcpy(&ifr.ifr_broadaddr, &sin, sizeof(ifr.ifr_broadaddr));
+ if (ioctl(fd, SIOCSIFBRDADDR, &ifr) == -1)
+ errstr(SEV_WARNING, "ioctl: SIOCSIFBRDADDR");
+ else
+ mptr += sprintf(mptr, " broadcast %s", inet_ntoa(cfg->broadcast));
+ }
+ if (ioctl(fd, SIOCGIFFLAGS, &ifr) == -1)
+ errstr(SEV_FATAL, "ioctl: SIOCGIFFLAGS");
+ ifr.ifr_flags &= ~IFF_NOARP;
+ ifr.ifr_flags |= IFF_UP | IFF_RUNNING;
+ if (ioctl(fd, SIOCSIFFLAGS, &ifr) == -1) {
+ printf("flags: 0x%x name %s\n", ifr.ifr_flags, ifr.ifr_name);
+ errstr(SEV_FATAL, "ioctl: SIOCSIFFLAGS");
+ }
+ close(fd);
+ /* prepare modem state etc. */
+ state.kissfd = slave;
+ /* don't close the master side! */
+ fcntl(state.kissfd, F_SETFL, fcntl(state.kissfd, F_GETFL, 0) | O_NONBLOCK);
+ errprintf(SEV_INFO, "baycomepp: %s\n", mbuf);
+}
+
+#else /* !HAVE_MKISS */
+
+static inline void ifconfigure(struct ifconfig *cfg)
+{
+ int master, slave;
+ struct termios tm;
+ char ttyname[32];
+
+ openpty(&master, &slave, ttyname, NULL, NULL);
+ /* set pty/tty pair to raw */
+ memset(&tm, 0, sizeof(tm));
+ tm.c_cflag = CS8 | CREAD | CLOCAL;
+ if (tcsetattr(master, TCSANOW, &tm))
+ errstr(SEV_WARNING, "master: tcsetattr");
+ memset(&tm, 0, sizeof(tm));
+ tm.c_cflag = CS8 | CREAD | CLOCAL;
+ if (tcsetattr(slave, TCSANOW, &tm))
+ errstr(SEV_WARNING, "slave: tcsetattr");
+ /* make link */
+ if (cfg->ifname[0]) {
+ //fchmod(slave, 0600);
+ unlink(cfg->ifname);
+ if (symlink(ttyname, cfg->ifname))
+ errprintf(SEV_WARNING, "baycomepp: symlink error: %s -> %s\n", ttyname, cfg->ifname);
+ }
+ /* prepare modem state etc. */
+ state.kissfd = master;
+ close(slave);
+ /* don't close the master side! */
+ fcntl(state.kissfd, F_SETFL, fcntl(state.kissfd, F_GETFL, 0) | O_NONBLOCK);
+ errprintf(SEV_INFO, "baycomepp: starting AX.25 interface %s\n", cfg->ifname ? cfg->ifname : ttyname);
+}
+
+#endif /* !HAVE_MKISS */
+
+/* --------------------------------------------------------------------- */
+
+static void write_pid(pid_t pid)
+{
+ FILE *f = fopen(PIDFILE, "a");
+ if (!f) {
+ errprintf(SEV_INFO, "cannot open PID file %s\n", PIDFILE);
+ return;
+ }
+ fprintf(f, "%i\n", pid);
+ fclose(f);
+}
+
+/* --------------------------------------------------------------------- */
+
+static void kill_baycomeppd(void)
+{
+ FILE *f = fopen(PIDFILE, "r");
+ pid_t pid;
+
+ if (!f) {
+ errprintf(SEV_INFO, "cannot open PID file %s\n", PIDFILE);
+ return;
+ }
+ while (fscanf(f, " %i \n", &pid) == 1)
+ if (pid <= 0 || pid == getpid())
+ errprintf(SEV_INFO, "invalid pid %i\n", pid);
+ else {
+ kill(pid, SIGTERM);
+ errprintf(SEV_INFO, "terminating process %i\n", pid);
+ }
+ fclose(f);
+ unlink(PIDFILE);
+}
+
+/* --------------------------------------------------------------------- */
+
+static void init(int mode)
+{
+ unsigned char eio[2048];
+ u_int8_t stat;
+ u_int8_t statecp[6];
+ int cnt, icnt;
+ struct timeval tv1, tv2;
+ unsigned long usec;
+ unsigned bytecnt = 0;
+
+ /* we need this here so that the bitrate autoprobe works correctly */
+ /*
+ * set the process to realtime privs
+ */
+#ifdef HAVE_SCHED_H
+ {
+ struct sched_param schp;
+ memset(&schp, 0, sizeof(schp));
+ schp.sched_priority = sched_get_priority_min(SCHED_RR)+1;
+#if 1
+ if (sched_setscheduler(0, SCHED_RR, &schp) != 0)
+ errstr(SEV_ERROR, "sched_setscheduler");
+#endif
+ }
+#endif /* HAVE_SCHED_H */
+ /*
+ * lock memory down
+ */
+ if (mlockall(MCL_CURRENT | MCL_FUTURE) == -1)
+ errstr(SEV_ERROR, "mlockall");
+ switch(mode) {
+ case MODE_EPP:
+ if (adapter_start_epp(&state.config))
+ exit(1);
+ /* reset modem */
+ eio[0] = 0;
+ eio[1] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+ if (parport_epp_write_addr(eio, 2) != 2)
+ goto errret;
+ gettimeofday(&tv1, NULL);
+ for (;;) {
+ if (parport_epp_read_addr(&stat, 1) != 1)
+ goto errret;
+ /* try to determine the FIFO count if in extended mode */
+ if (state.config.extstat) {
+ eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE|1;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ if (parport_epp_read_addr(eio, 2) != 2)
+ goto errret;
+ icnt = eio[0] | (((unsigned int)eio[1]) << 8);
+ eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ icnt &= 0x7fff;
+ } else {
+ /* determine RX fifo size from status bits */
+ switch (stat & (EPP_NRAEF|EPP_NRHF)) {
+ case EPP_NRHF:
+ icnt = 0;
+ break;
+
+ case EPP_NRAEF:
+ icnt = 1025;
+ break;
+
+ case 0:
+ icnt = 1793;
+ break;
+
+ default:
+ icnt = 256;
+ break;
+ }
+ }
+ /* rx */
+ while (icnt > 0) {
+ cnt = icnt;
+ if (cnt > sizeof(eio))
+ cnt = sizeof(eio);
+ icnt -= cnt;
+ bytecnt += cnt;
+ if (parport_epp_read_data(eio, cnt) != cnt)
+ goto errret;
+ }
+ gettimeofday(&tv2, NULL);
+ usec = ((60 + tv2.tv_sec - tv1.tv_sec) % 60) * 1000000 + tv2.tv_usec - tv1.tv_usec;
+ if (usec >= 500000)
+ break;
+ usleep(8000); /* must be more than 2ms, Linux busy-waits up to 2ms! */
+ }
+ break;
+
+ case MODE_ECP:
+ if (adapter_start_ecp(&state.config))
+ exit(1);
+ eio[0] = 0xaf; /* reset register: all reset */
+ eio[1] = 0xa0; /* reset register: terminate reset */
+ eio[2] = 0xb0;
+ if (parport_ecp_write_addr(eio, 3) != 3)
+ goto errret;
+ gettimeofday(&tv1, NULL);
+ for (;;) {
+ eio[0] = 0x81;
+ if (parport_ecp_write_addr(eio, 1) != 1)
+ goto errret;
+ if (parport_ecp_read_data(statecp, 6) != 6)
+ goto errret;
+ eio[0] = 0x80;
+ if (parport_ecp_write_addr(eio, 1) != 1)
+ goto errret;
+ icnt = ((unsigned)statecp[2] << 8) | statecp[1];
+ /* read */
+ while (icnt > 0) {
+ cnt = icnt;
+ if (cnt > sizeof(eio))
+ cnt = sizeof(eio);
+ icnt -= cnt;
+ bytecnt += cnt;
+ eio[0] = 0xc0 | (cnt & 0xf);
+ eio[1] = 0xd0 | ((cnt >> 4) & 0xf);
+ eio[2] = 0xe0 | ((cnt >> 8) & 0xf);
+ if (parport_ecp_write_addr(eio, 3) != 3)
+ goto errret;
+ if (parport_ecp_read_data(eio, cnt) != cnt)
+ goto errret;
+ }
+ gettimeofday(&tv2, NULL);
+ usec = ((60 + tv2.tv_sec - tv1.tv_sec) % 60) * 1000000 + tv2.tv_usec - tv1.tv_usec;
+ if (usec >= 500000)
+ break;
+ usleep(8000); /* must be more than 2ms, Linux busy-waits up to 2ms! */
+ }
+ break;
+
+ case MODE_EPPAFSK:
+ state.config.bitrate = 1200;
+ if (adapter_start_eppafsk(&state.config))
+ exit(1);
+ /* reset modem */
+ eio[0] = 0x00;
+ eio[1] = 0x18;
+ if (parport_epp_write_addr(eio, 2) != 2)
+ goto errret;
+ gettimeofday(&tv1, NULL);
+ for (;;) {
+ if (parport_epp_read_addr(&stat, 1) != 1)
+ goto errret;
+ /* determine the FIFO count */
+ eio[0] = 0x1a;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ if (parport_epp_read_addr(eio, 1) != 1)
+ goto errret;
+ icnt = eio[0] & 0x1f;
+ eio[0] = 0x18;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ /* rx */
+ if (icnt > 0) {
+ if (parport_epp_read_data(eio, icnt) != icnt)
+ goto errret;
+ bytecnt += icnt;
+ }
+ gettimeofday(&tv2, NULL);
+ usec = ((60 + tv2.tv_sec - tv1.tv_sec) % 60) * 1000000 + tv2.tv_usec - tv1.tv_usec;
+ if (usec >= 500000)
+ break;
+ usleep(8000); /* must be more than 2ms, Linux busy-waits up to 2ms! */
+ }
+ break;
+
+ case MODE_EPPCONV:
+ /* reset modem */
+ eio[0] = 0;
+ eio[1] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+ if (parport_epp_write_addr(eio, 2) != 2)
+ goto errret;
+ gettimeofday(&tv1, NULL);
+ for (;;) {
+ if (parport_epp_read_addr(&stat, 1) != 1)
+ goto errret;
+ /* try to determine the FIFO count if in extended mode */
+ /* determine RX fifo size from status bits */
+ switch (stat & (EPP_NRAEF|EPP_NRHF)) {
+ case EPP_NRHF:
+ icnt = 0;
+ break;
+
+ case EPP_NRAEF:
+ icnt = 1025;
+ break;
+
+ case 0:
+ icnt = 1793;
+ break;
+
+ default:
+ icnt = 256;
+ break;
+ }
+ /* rx */
+ while (icnt > 0) {
+ cnt = icnt;
+ if (cnt > sizeof(eio))
+ cnt = sizeof(eio);
+ icnt -= cnt;
+ bytecnt += cnt;
+ if (parport_epp_read_data(eio, cnt) != cnt)
+ goto errret;
+ }
+ gettimeofday(&tv2, NULL);
+ usec = ((60 + tv2.tv_sec - tv1.tv_sec) % 60) * 1000000 + tv2.tv_usec - tv1.tv_usec;
+ if (usec >= 500000)
+ break;
+ usleep(8000); /* must be more than 2ms, Linux busy-waits up to 2
+ ms! */
+ }
+ for (icnt = 0; icnt < 256; icnt++) {
+ if (parport_epp_read_addr(&stat, 1) != 1)
+ goto errret;
+ if (!(stat & EPP_NREF))
+ break;
+ if (parport_epp_read_data(eio, 1) != 1)
+ goto errret;
+ bytecnt++;
+ }
+ break;
+
+ default:
+ exit(1);
+ }
+ state.access.bitrate = (bytecnt * 8000000ULL + usec / 2ULL) / usec;
+ state.access.bitrateby25 = (state.access.bitrate + 12) / 25;
+ errprintf(SEV_INFO, "autoprobed bitrate: %u\n", state.access.bitrate);
+ return;
+
+errret:
+ errprintf(SEV_FATAL, "Modem timeout\n");
+}
+
+static void init2(struct ifconfig *ifcfg)
+{
+ ifconfigure(ifcfg);
+ /*
+ * sigusr1 is used to display the current state
+ */
+ if (signal(SIGUSR1, sig_usr1) == SIG_ERR)
+ errstr(SEV_ERROR, "signal");
+ if (signal(SIGUSR2, sig_usr2) == SIG_ERR)
+ errstr(SEV_ERROR, "signal");
+ if (signal(SIGHUP, SIG_IGN) == SIG_ERR)
+ errstr(SEV_ERROR, "signal");
+ if (signal(SIGTERM, sighandler) == SIG_ERR)
+ errstr(SEV_ERROR, "signal");
+ /* start the modem */
+ state.access.state = tx_idle;
+ state.access.slotcnt = 1;
+}
+
+/* --------------------------------------------------------------------- */
+/*
+ * convert_call_entry is taken from the ax25 library
+ */
+
+static inline int convert_call_entry(const char *name, char *buf)
+{
+ int ct = 0;
+ int ssid = 0;
+ const char *p = name;
+ char c;
+
+ while (ct < 6) {
+ c = toupper(*p);
+ if (c == '-' || c == '\0')
+ break;
+ if (!isalnum(c)) {
+ fprintf(stderr, "baycomepp: invalid symbol in callsign %s\n", name);
+ return -1;
+ }
+ buf[ct] = c << 1;
+ p++;
+ ct++;
+ }
+ for ( ; ct < 6; ct++)
+ buf[ct] = ' ' << 1;
+ if (*p != '\0') {
+ p++;
+ if (sscanf(p, "%d", &ssid) != 1 || ssid < 0 || ssid > 15) {
+ fprintf(stderr, "baycomepp: SSID must follow '-' and "
+ "be numeric in the range 0-15 - %s\n", name);
+ return -1;
+ }
+ }
+ buf[6] = ((ssid + '0') << 1) & 0x1E;
+ return 0;
+}
+
+/* --------------------------------------------------------------------- */
+
+int driver_init(int argc, char *argv[])
+{
+ static const struct option long_options[] = {
+ { "epp", 0, 0, 0x400+MODE_EPP },
+ { "ecp", 0, 0, 0x400+MODE_ECP },
+ { "eppafsk", 0, 0, 0x400+MODE_EPPAFSK },
+ { "eppconv", 0, 0, 0x400+MODE_EPPCONV },
+ { "log", 0, 0, 'l' },
+ { "kill", 0, 0, 'k' },
+ { "mode", 1, 0, 'm' },
+ { "port", 1, 0, 'p' },
+ { "verbose", 0, 0, 'v' },
+ { "no-daemon", 0, 0, 'n' },
+#ifdef HAVE_MKISS
+#ifdef HAVE_IFRNEWNAME
+ { "ifname", 1, 0, 0x500 },
+#endif /* HAVE_IFRNEWNAME */
+ { "hwaddr", 1, 0, 0x501 },
+ { "ipaddr", 1, 0, 0x502 },
+ { "netmask", 1, 0, 0x503 },
+ { "broadcast", 1, 0, 0x504 },
+#else /* !HAVE_MKISS */
+ { "iflink", 1, 0, 0x600 },
+#endif /* !HAVE_MKISS */
+ { 0, 0, 0, 0}
+ };
+ struct ifconfig ifcfg = IFCONFIGINIT;
+ int c;
+ int err = 0;
+ pid_t pid;
+ int daemon = 1;
+ int mode = MODE_EPP;
+ int pfds[2];
+ unsigned iobase = 0x378;
+
+ printf("baycomepp v" VERSION " (c) 1998-2000,2002 by Thomas Sailer, HB9JNX/AE4WA"
+#ifdef EPPLONG
+ " (epplong)"
+#endif
+#ifdef EPPEMUL
+ " (eppemul)"
+#endif
+ "\n");
+ /* initialize state struct */
+ memset(&state, 0, sizeof(state));
+ state.hrx.bufptr = state.hrx.buf;
+ state.config = (struct adapter_config) { 19666600, 9600, 0, 0, 0, 1, 1, 0, 1 };
+ state.chaccesspar = (struct chaccesspar) { 10, 10, 40, 3, 0 };
+ /* parse arguments */
+ while ((c = getopt_long(argc, argv, "lknvm:p:caz", long_options, NULL)) != EOF)
+ switch (c) {
+ case 'l':
+ logging = 1;
+ break;
+
+ case 'k':
+ kill_baycomeppd();
+ exit(0);
+
+ case 'n':
+ daemon = 0;
+ logpackets = 1;
+ break;
+
+ case 'v':
+ verboselevel++;
+ break;
+
+ case 'm':
+ parseconfig(&state.config, optarg);
+ state.config.extstat = 1;
+ break;
+
+ case 'p':
+ iobase = strtoul(optarg, NULL, 0);
+ if (iobase <= 0 || iobase >= 0x3f8)
+ err++;
+ break;
+
+ case 0x400+MODE_EPPAFSK:
+ case 'a':
+ mode = MODE_EPPAFSK;
+ break;
+
+ case 0x400+MODE_ECP:
+ case 'c':
+ mode = MODE_ECP;
+ break;
+
+ case 0x400+MODE_EPPCONV:
+ case 'z':
+ mode = MODE_EPPCONV;
+ break;
+
+ case 0x400+MODE_EPP:
+ mode = MODE_EPP;
+ break;
+
+#ifdef HAVE_MKISS
+ case 0x500: /* ifname */
+ if (strlen(optarg) >= IFNAMSIZ) {
+ fprintf(stderr, "baycomepp: ifname \"%s\"too long\n", optarg);
+ err++;
+ }
+ strncpy(ifcfg.ifname, optarg, sizeof(ifcfg.ifname)-1);
+ ifcfg.ifname[sizeof(ifcfg.ifname)-1] = 0;
+ break;
+
+ case 0x501: /* hwaddr */
+ if (convert_call_entry(optarg, ifcfg.hwaddr.ax25_call))
+ err++;
+ break;
+
+ case 0x502: /* ipaddr */
+ if (!inet_aton(optarg, &ifcfg.ipaddr)) {
+ fprintf(stderr, "baycomepp: invalid ip address \"%s\"\n", optarg);
+ err++;
+ }
+ break;
+
+ case 0x503: /* netmask */
+ if (!inet_aton(optarg, &ifcfg.netmask)) {
+ fprintf(stderr, "baycomepp: invalid netmask \"%s\"\n", optarg);
+ err++;
+ }
+ break;
+
+ case 0x504: /* broadcast */
+ if (!inet_aton(optarg, &ifcfg.broadcast)) {
+ fprintf(stderr, "baycomepp: invalid broadcast address \"%s\"\n", optarg);
+ err++;
+ }
+ break;
+
+#else /* !HAVE_MKISS */
+ case 0x600: /* iflink */
+ strncpy(ifcfg.ifname, optarg, sizeof(ifcfg.ifname)-1);
+ ifcfg.ifname[sizeof(ifcfg.ifname)-1] = 0;
+ break;
+#endif /* !HAVE_MKISS */
+
+ default:
+ err++;
+ break;
+ }
+ if (err) {
+ fprintf(stderr, "usage: baycomepp [-c <cfgfilename>] [-l] [-k] [-n] [-v] [-p <portaddr>] [-m <modestr>]\n"
+#ifdef HAVE_MKISS
+ " [--ifname=<name>] [--hwaddr=<call>] [--ipaddr=<ip>]\n"
+ " [--netmask=<ip>] [--broadcast=<ip>]\n"
+#else /* !HAVE_MKISS */
+ " [--iflink=<name>]\n"
+#endif /* !HAVE_MKISS */
+ " mode options:\n"
+ " intclk uses FPGA internal clock; DON'T use if an external osc is on board\n"
+ " extclk uses the external oscillator; recommended if the internal modem is used\n"
+ " intmodem uses the internal modem\n"
+ " extmodem uses a DF9IC type modem connected to the high speed modem connector\n"
+ " fclk= sets the FPGA clock frequency (default 19.6666 MHz)\n"
+ " bitrate= sets the bitrate for the FSK modem\n"
+ " loopback sets an internal modem loopback\n"
+ " extstat allows extended status readback\n"
+ " noextstat disallows extended status readback\n");
+ exit(1);
+ }
+ if (parport_init_direct(iobase))
+ errprintf(SEV_FATAL, "no parport found at 0x%x\n", iobase);
+ init(mode);
+ if (!daemon) {
+ setsid(); /* become a process group leader and drop controlling terminal */
+ fclose(stdin); /* no more standard in */
+ if (logging)
+ openlog(progname, LOG_PID, LOG_DAEMON);
+ init2(&ifcfg);
+ return mode;
+ }
+ if (pipe(pfds)) {
+ errstr(SEV_FATAL, "pipe\n");
+ exit(1);
+ }
+ switch (pid = fork()) {
+ case -1:
+ errstr(SEV_FATAL, "fork\n");
+ exit(1);
+
+ case 0: /* child process */
+ close(pfds[0]);
+ setsid(); /* become a process group leader and drop controlling terminal */
+ fclose(stdin); /* no more standard in */
+ if (logging)
+ openlog(progname, LOG_PID, LOG_DAEMON);
+ init2(&ifcfg);
+ if (write(pfds[1], &mode, sizeof(mode)) != sizeof(mode))
+ errstr(SEV_ERROR, "write\n");
+ close(pfds[1]);
+ return mode;
+
+ default:
+ close(pfds[1]);
+ err = read(pfds[0], &c, sizeof(c));
+ if (err != sizeof(c))
+ errprintf(SEV_FATAL, "baycomepp: modem init failed (read: %d errno: %d %s)\n",
+ err, errno, strerror(errno));
+ write_pid(pid);
+ fprintf(stderr, "baycomepp: child pid: %u\n", pid);
+ break;
+ }
+ exit(0);
+}
diff --git a/udriver/drvresident.c b/udriver/drvresident.c
new file mode 100644
index 0000000..20acc8f
--- /dev/null
+++ b/udriver/drvresident.c
@@ -0,0 +1,1109 @@
+/*****************************************************************************/
+
+/*
+ * drvresident.c -- HDLC packet radio modem for EPP/ECP using FPGA usermode driver.
+ *
+ * Copyright (C) 1998-2000, 2002 Thomas Sailer (sailer at 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 distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Please note that the GPL allows you to use the driver, NOT the radio.
+ * In order to use the radio, you need a license from the communications
+ * authority of your country.
+ *
+ */
+
+/*****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/types.h>
+#include <sys/uio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <signal.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <time.h>
+#include <dlfcn.h>
+
+#include "drv.h"
+#include "parport.h"
+
+/* ---------------------------------------------------------------------- */
+
+int logging = 0;
+int logpackets = 0;
+struct baycomepp_state state;
+const char *progname = "baycomepp";
+
+/* --------------------------------------------------------------------- */
+/*
+ * Logging functions
+ */
+
+void errprintf(int severity, const char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ if (logging) {
+ char tmp[512];
+ vsnprintf(tmp, sizeof(tmp), fmt, args);
+ syslog(severity, tmp);
+ } else {
+ fprintf(stderr, "baycomepp[%u]: ", getpid());
+ vfprintf(stderr, fmt, args);
+ }
+ va_end(args);
+ if (severity <= SEV_FATAL)
+ exit(1);
+}
+
+/* --------------------------------------------------------------------- */
+
+void errstr(int severity, const char *st)
+{
+ errprintf(severity, "%s: %s\n", st, strerror(errno));
+}
+
+/* --------------------------------------------------------------------- */
+
+void epp_error(const char *msg)
+{
+ errprintf(SEV_FATAL, msg);
+}
+
+/* --------------------------------------------------------------------- */
+/*
+ * the CRC routines are stolen from WAMPES
+ * by Dieter Deyke
+ */
+
+const u_int16_t crc_ccitt_table[0x100] = {
+ 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
+ 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
+ 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
+ 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
+ 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
+ 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
+ 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
+ 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
+ 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
+ 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
+ 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
+ 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
+ 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
+ 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
+ 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
+ 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
+ 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
+ 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
+ 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
+ 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
+ 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
+ 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
+ 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
+ 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
+ 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
+ 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
+ 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
+ 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
+ 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
+ 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
+ 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
+ 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
+};
+
+/* --------------------------------------------------------------------- */
+
+extern inline u_int16_t calc_crc_ccitt(const u_int8_t *buffer, int len)
+{
+ u_int16_t crc = 0xffff;
+
+ for (;len>0;len--)
+ crc = (crc >> 8) ^ crc_ccitt_table[(crc ^ *buffer++) & 0xff];
+ crc ^= 0xffff;
+ return crc;
+}
+
+extern inline void append_crc_ccitt(u_int8_t *buffer, int len)
+{
+ u_int16_t crc = calc_crc_ccitt(buffer, len);
+ *buffer++ = crc;
+ *buffer++ = crc >> 8;
+}
+
+extern inline int check_crc_ccitt(const u_int8_t *buffer, int len)
+{
+ u_int16_t crc = calc_crc_ccitt(buffer, len);
+ return (crc & 0xffff) == 0x0f47;
+}
+
+/* ---------------------------------------------------------------------- */
+
+#define ADDRXCH(x) \
+do { \
+ state.kissout.b[wr] = (x); \
+ wr = (wr + 1) % KISSOUTBUF_SIZE; \
+ if (wr == rd) \
+ goto errout; \
+ total++; \
+} while (0);
+
+static size_t rxpacket(const struct iovec *vector, size_t count)
+{
+ u_int8_t *bp;
+ size_t len;
+ size_t total = 0;
+ unsigned wr = state.kissout.wr;
+ unsigned rd = state.kissout.rd;
+
+ ADDRXCH(KISS_FEND);
+ for (; count > 0; count--, vector++) {
+ for (bp = vector->iov_base, len = vector->iov_len; len > 0; len--, bp++) {
+ if (*bp == KISS_FEND) {
+ ADDRXCH(KISS_FESC);
+ ADDRXCH(KISS_TFEND);
+ } else if (*bp == KISS_FESC) {
+ ADDRXCH(KISS_FESC);
+ ADDRXCH(KISS_TFESC);
+ } else {
+ ADDRXCH(*bp);
+ }
+ }
+ }
+ if (total <= 1)
+ return 0;
+ ADDRXCH(KISS_FEND);
+ state.kissout.wr = wr;
+ state.stat.kiss_out++;
+ return total;
+
+ errout:
+ state.stat.kiss_outerr++;
+ return 0;
+}
+
+#undef ADDRXCH
+
+/* --------------------------------------------------------------------- */
+/*
+ * high performance HDLC encoder
+ * yes, it's ugly, but generates pretty good code
+ */
+
+#define ENCODEITERA(j) \
+({ \
+ if (!(notbitstream & (0x1f0 << j))) \
+ goto stuff##j; \
+ encodeend##j: \
+})
+
+#define ENCODEITERB(j) \
+({ \
+ stuff##j: \
+ bitstream &= ~(0x100 << j); \
+ bitbuf = (bitbuf & (((2 << j) << numbit) - 1)) | \
+ ((bitbuf & ~(((2 << j) << numbit) - 1)) << 1); \
+ numbit++; \
+ notbitstream = ~bitstream; \
+ goto encodeend##j; \
+})
+
+static int hdlc_enqueue(u_int8_t *pkt, int len)
+{
+ unsigned bitstream, notbitstream, bitbuf, numbit, crc;
+ u_int8_t crcarr[2];
+ unsigned wr = state.htx.wr;
+
+ state.htx.buf[wr] = 0x7e;
+ wr = (wr + 1) % TXBUFFER_SIZE;
+ if (wr == state.htx.rd)
+ return -1;
+ crc = calc_crc_ccitt(pkt, len);
+ crcarr[0] = crc;
+ crcarr[1] = crc >> 8;
+ bitstream = bitbuf = numbit = 0;
+ while (len > -2) {
+ bitstream >>= 8;
+ bitstream |= ((unsigned int)*pkt) << 8;
+ bitbuf |= ((unsigned int)*pkt) << numbit;
+ notbitstream = ~bitstream;
+ pkt++;
+ len--;
+ if (!len)
+ pkt = crcarr;
+ ENCODEITERA(0);
+ ENCODEITERA(1);
+ ENCODEITERA(2);
+ ENCODEITERA(3);
+ ENCODEITERA(4);
+ ENCODEITERA(5);
+ ENCODEITERA(6);
+ ENCODEITERA(7);
+ goto enditer;
+ ENCODEITERB(0);
+ ENCODEITERB(1);
+ ENCODEITERB(2);
+ ENCODEITERB(3);
+ ENCODEITERB(4);
+ ENCODEITERB(5);
+ ENCODEITERB(6);
+ ENCODEITERB(7);
+ enditer:
+ numbit += 8;
+ while (numbit >= 8) {
+ state.htx.buf[wr] = bitbuf;
+ wr = (wr + 1) % TXBUFFER_SIZE;
+ if (wr == state.htx.rd)
+ return -1;
+ bitbuf >>= 8;
+ numbit -= 8;
+ }
+ }
+ bitbuf |= 0x7e7e << numbit;
+ numbit += 16;
+ while (numbit >= 8) {
+ state.htx.buf[wr] = bitbuf;
+ wr = (wr + 1) % TXBUFFER_SIZE;
+ if (wr == state.htx.rd)
+ return -1;
+ bitbuf >>= 8;
+ numbit -= 8;
+ }
+ state.htx.wr = wr;
+ return 0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static void do_rxpacket(void)
+{
+ static const u_int8_t kissdata = KISS_CMD_DATA;
+ struct iovec iov[2];
+ char buf[512];
+
+ if (state.hrx.bufcnt < 4)
+ return;
+ if (!check_crc_ccitt(state.hrx.buf, state.hrx.bufcnt))
+ return;
+ iov[0].iov_len = 1;
+ iov[0].iov_base = &kissdata;
+ iov[1].iov_len = state.hrx.bufcnt-2;
+ iov[1].iov_base = state.hrx.buf;
+ rxpacket(iov, 2);
+ state.stat.pkt_in++;
+ if (!logpackets)
+ return;
+ if (snprintpkt(buf, sizeof(buf), state.hrx.buf, state.hrx.bufcnt-2) != -1)
+ printf("rx: %s", buf);
+}
+
+#define DECODEITERA(j) \
+({ \
+ if (!(notbitstream & (0x0fc << j))) /* flag or abort */ \
+ goto flgabrt##j; \
+ if ((bitstream & (0x1f8 << j)) == (0xf8 << j)) /* stuffed bit */ \
+ goto stuff##j; \
+ enditer##j: \
+})
+
+#define DECODEITERB(j) \
+({ \
+ flgabrt##j: \
+ if (!(notbitstream & (0x1fc << j))) { /* abort received */ \
+ stat = 0; \
+ goto enditer##j; \
+ } \
+ if ((bitstream & (0x1fe << j)) != (0x0fc << j)) /* flag received */ \
+ goto enditer##j; \
+ if (stat) \
+ do_rxpacket(); \
+ state.hrx.bufcnt = 0; \
+ state.hrx.bufptr = state.hrx.buf; \
+ stat = 1; \
+ numbits = 7-j; \
+ goto enditer##j; \
+ stuff##j: \
+ numbits--; \
+ bitbuf = (bitbuf & ((~0xff) << j)) | ((bitbuf & ~((~0xff) << j)) << 1); \
+ goto enditer##j; \
+})
+
+/* --------------------------------------------------------------------- */
+
+static void hdlc_receive(u_int8_t *pkt, int len)
+{
+ unsigned int bitbuf, notbitstream, bitstream, numbits, stat;
+
+ state.stat.bytes_in += len;
+ numbits = state.hrx.numbits;
+ stat = state.hrx.state;
+ bitstream = state.hrx.bitstream;
+ bitbuf = state.hrx.bitbuf;
+ for (; len > 0; len--, pkt++) {
+ bitstream >>= 8;
+ bitstream |= ((unsigned int)*pkt) << 8;
+ bitbuf >>= 8;
+ bitbuf |= ((unsigned int)*pkt) << 8;
+ numbits += 8;
+ notbitstream = ~bitstream;
+ DECODEITERA(0);
+ DECODEITERA(1);
+ DECODEITERA(2);
+ DECODEITERA(3);
+ DECODEITERA(4);
+ DECODEITERA(5);
+ DECODEITERA(6);
+ DECODEITERA(7);
+ goto enddec;
+ DECODEITERB(0);
+ DECODEITERB(1);
+ DECODEITERB(2);
+ DECODEITERB(3);
+ DECODEITERB(4);
+ DECODEITERB(5);
+ DECODEITERB(6);
+ DECODEITERB(7);
+ enddec:
+ while (stat && numbits >= 8) {
+ if (state.hrx.bufcnt >= RXBUFFER_SIZE) {
+ stat = 0;
+ } else {
+ *(state.hrx.bufptr)++ = bitbuf >> (16-numbits);
+ state.hrx.bufcnt++;
+ numbits -= 8;
+ }
+ }
+ }
+ state.hrx.numbits = numbits;
+ state.hrx.state = stat;
+ state.hrx.bitstream = bitstream;
+ state.hrx.bitbuf = bitbuf;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static u_int16_t random_seed;
+
+extern inline u_int16_t random_num(void)
+{
+ random_seed = 28629 * random_seed + 157;
+ return random_seed;
+}
+
+/* --------------------------------------------------------------------- */
+
+/*
+ * here we do the channel access algorithm, and process calibration bytes
+ */
+
+extern inline void arbitrate(void)
+{
+ if (state.htx.rd == state.htx.wr)
+ return;
+ if (!state.chaccesspar.fulldup) {
+ if (state.access.slotcnt > 0)
+ return;
+ state.access.slotcnt = state.chaccesspar.slottime;
+ if (state.access.dcd)
+ return;
+ if ((random_num() % 256) > state.chaccesspar.ppersist)
+ return;
+ }
+ state.access.state = tx_keyup;
+ state.access.flagcnt = (state.access.bitrateby25 * state.chaccesspar.txdelay) >> 5;
+ state.stat.ptt_keyed++;
+}
+
+static int hdlc_transmit(u_int8_t *pkt, int len)
+{
+ int ret = 0, i;
+
+ while (len > 0) {
+ switch (state.access.state) {
+ case tx_keyup:
+ i = state.access.flagcnt;
+ if (i <= 0) {
+ state.access.state = tx_data;
+ break;
+ }
+ if (i > len)
+ i = len;
+ state.access.flagcnt -= i;
+ memset(pkt, 0x7e, i);
+ ret += i;
+ pkt += i;
+ len -= i;
+ break;
+
+ case tx_data:
+ if (state.htx.rd == state.htx.wr) {
+ state.access.state = tx_tail;
+ state.access.flagcnt = (state.access.bitrateby25 * state.chaccesspar.txtail) >> 5;
+ break;
+ }
+ i = ((state.htx.rd > state.htx.wr) ? TXBUFFER_SIZE : state.htx.wr) - state.htx.rd;
+ if (i > len)
+ i = len;
+ memcpy(pkt, state.htx.buf + state.htx.rd, i);
+ state.htx.rd = (state.htx.rd + i) % TXBUFFER_SIZE;
+ ret += i;
+ pkt += i;
+ len -= i;
+ break;
+
+ case tx_tail:
+ i = state.access.flagcnt;
+ if (i <= 0) {
+ if (state.access.ptt)
+ return ret;
+ state.access.state = tx_idle;
+ state.access.slotcnt = state.chaccesspar.slottime;
+ break;
+ }
+ if (i > len)
+ i = len;
+ state.access.flagcnt -= i;
+ memset(pkt, 0x7e, i);
+ ret += i;
+ pkt += i;
+ len -= i;
+ break;
+
+ default:
+ arbitrate();
+ if (state.access.state == tx_keyup)
+ break;
+ i = state.access.calib;
+ if (i <= 0)
+ return ret;
+ if (i > len)
+ i = len;
+ state.access.calib -= i;
+ memset(pkt, 0, i);
+ ret += i;
+ pkt += i;
+ len -= i;
+ break;
+ }
+ }
+ return ret;
+}
+
+/* --------------------------------------------------------------------- */
+
+void sighandler(int sig)
+{
+ errprintf(LOG_INFO, "terminating on receiving signal %i\n", sig);
+ reset_modem();
+ exit(0);
+}
+
+/* --------------------------------------------------------------------- */
+
+void sig_usr2(int sig)
+{
+ if (state.access.calib > 0) {
+ errprintf(LOG_DEBUG, "terminating calibration\n");
+ state.access.calib = 0;
+ } else {
+ errprintf(LOG_DEBUG, "calibrating for 1min\n");
+ state.access.calib = state.access.bitrate * (60/8);
+ }
+ if (signal(SIGUSR2, sig_usr2) == SIG_ERR)
+ errstr(SEV_ERROR, "signal");
+}
+
+/* --------------------------------------------------------------------- */
+
+void sig_usr1(int sig)
+{
+ printf("Statistics:\n KISS out: %ld errors: %ld in: %ld errors: %ld\n"
+ " Packets out: %ld in: %ld\n"
+ " Bytes out: %ld in: %ld\n"
+ " PTT:%c DCD:%c PTT keyed: %ld\n"
+ " ch par: txdel %u slot %u ppersist %u txtail %u fulldup %u\n"
+ " status 0x%02x icnt %d %d %d ocnt %d %d %d IntRate: %d\n",
+ state.stat.kiss_out, state.stat.kiss_outerr,
+ state.stat.kiss_in, state.stat.kiss_inerr,
+ state.stat.pkt_out, state.stat.pkt_in,
+ state.stat.bytes_out, state.stat.bytes_in,
+ state.access.ptt ? 'P' : '-', state.access.dcd ? 'D' : '-', state.stat.ptt_keyed,
+ state.chaccesspar.txdelay, state.chaccesspar.slottime, state.chaccesspar.ppersist,
+ state.chaccesspar.txtail, state.chaccesspar.fulldup,
+ state.stat.status, state.stat.icnt1, state.stat.icnt2, state.stat.icnt3,
+ state.stat.ocnt1, state.stat.ocnt2, state.stat.ocnt3, state.stat.intcnt);
+
+ printf("TX: rd %d wr %d st: %d slotcnt: %d\n",
+ state.htx.rd, state.htx.wr, state.access.state, state.access.slotcnt);
+
+ if (signal(SIGUSR1, sig_usr1) == SIG_ERR)
+ errstr(SEV_ERROR, "signal");
+}
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ * Process KISS io
+ */
+
+extern inline void process_pkt(u_int8_t *pkt, unsigned int len)
+{
+ char buf[512];
+
+ if (len < 2)
+ return;
+ switch (pkt[0]) {
+ case KISS_CMD_DATA:
+ if (hdlc_enqueue(pkt+1, len-1))
+ state.stat.pkt_outerr++;
+ else
+ state.stat.pkt_out++;
+ if (!logpackets)
+ return;
+ if (snprintpkt(buf, sizeof(buf), pkt+1, len-1) != -1)
+ printf("tx: %s", buf);
+ return;
+
+ case KISS_CMD_TXDELAY:
+ state.chaccesspar.txdelay = pkt[1];
+ errprintf(SEV_INFO, "kiss: txdelay = %ums\n", state.chaccesspar.txdelay*10);
+ return;
+
+ case KISS_CMD_SLOTTIME:
+ state.chaccesspar.slottime = pkt[1];
+ errprintf(SEV_INFO, "kiss: slottime = %ums\n", state.chaccesspar.slottime*10);
+ return;
+
+ case KISS_CMD_PPERSIST:
+ state.chaccesspar.ppersist = pkt[1];
+ errprintf(SEV_INFO, "kiss: ppersist = %u/256\n", state.chaccesspar.ppersist);
+ return;
+
+ case KISS_CMD_TXTAIL:
+ state.chaccesspar.txtail = pkt[1];
+ errprintf(SEV_INFO, "kiss: txtail = %ums\n", state.chaccesspar.txtail*10);
+ return;
+
+ case KISS_CMD_FULLDUP:
+ state.chaccesspar.fulldup = !!pkt[1];
+ errprintf(SEV_INFO, "kiss: %sduplex\n", state.chaccesspar.fulldup ? "full" : "half");
+ return;
+
+ default:
+ errprintf(SEV_WARNING, "unknown kiss packet: 0x%02x 0x%02x\n", pkt[0], pkt[1]);
+ return;
+ }
+}
+
+/* --------------------------------------------------------------------- */
+
+/* we decode on the fly in place */
+
+extern inline void kiss_decode(u_int8_t *b, int len)
+{
+ int nlen = 0;
+ u_int8_t *p1 = b, *p2 = b;
+
+ while (len > 0) {
+ if (*p1 != KISS_FESC) {
+ *p2++ = *p1++;
+ nlen++;
+ len--;
+ continue;
+ }
+ if (len < 2)
+ goto err; /* invalid escape */
+ if (p1[1] == KISS_TFEND)
+ *p2++ = KISS_FEND;
+ else if (p1[1] == KISS_TFESC)
+ *p2++ = KISS_FESC;
+ else
+ goto err; /* invalid escape */
+ nlen++;
+ p1 += 2;
+ len -= 2;
+ }
+ process_pkt(b, nlen);
+ state.stat.kiss_in++;
+ return;
+ err:
+ state.stat.kiss_inerr++;
+}
+
+/* --------------------------------------------------------------------- */
+
+extern inline void kiss_read(void)
+{
+ char *cp1, *cp2, *endp;
+ int i;
+
+ if (state.kissin.ptr >= KISSINBUF_SIZE) /* discard oversized packets */
+ state.kissin.ptr = 0;
+ i = read(state.kissfd, state.kissin.b + state.kissin.ptr, KISSINBUF_SIZE - state.kissin.ptr);
+ if (i < 0) {
+ if (errno == EAGAIN)
+ return;
+ errstr(SEV_FATAL, "read");
+ }
+ if (i == 0)
+ return;
+ state.kissin.ptr += i;
+ endp = state.kissin.b + state.kissin.ptr;
+ cp1 = memchr(state.kissin.b, KISS_FEND, state.kissin.ptr);
+ while (cp1) {
+ cp2 = memchr(cp1+1, KISS_FEND, endp - cp1 - 1);
+ if (!cp2) {
+ state.kissin.ptr = endp-cp1;
+ memmove(state.kissin.b, cp1, state.kissin.ptr);
+ return;
+ }
+ kiss_decode(cp1+1, cp2-cp1-1);
+ cp1 = cp2;
+ }
+}
+
+/* ---------------------------------------------------------------------- */
+
+extern inline void kiss_write(void)
+{
+ struct iovec iov[2];
+ int i;
+
+ if (state.kissout.rd == state.kissout.wr)
+ return;
+ if (state.kissout.rd > state.kissout.wr) {
+ iov[0].iov_len = KISSOUTBUF_SIZE - state.kissout.rd;
+ iov[0].iov_base = state.kissout.b + state.kissout.rd;
+ iov[1].iov_len = state.kissout.wr;
+ iov[1].iov_base = state.kissout.b;
+ i = writev(state.kissfd, iov, 2);
+ } else
+ i = write(state.kissfd, state.kissout.b + state.kissout.rd,
+ state.kissout.wr - state.kissout.rd);
+ if (i < 0) {
+ if (errno == EAGAIN)
+ return;
+ errstr(SEV_FATAL, "read");
+ }
+ state.kissout.rd = (state.kissout.rd + i) % KISSOUTBUF_SIZE;
+}
+
+/* ---------------------------------------------------------------------- */
+
+static void handle_kiss(void)
+{
+ kiss_read();
+ kiss_write();
+ /* reschedule */
+ usleep(8000); /* must be more than 2ms, Linux busy-waits up to 2ms! */
+ state.stat.intcnt++;
+ state.access.slotcnt--;
+}
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ * EPP Mode
+ */
+
+/* _MUST_ not return! */
+
+static void epp_modem(void)
+{
+ unsigned char eio[1024];
+ u_int8_t stat;
+ int cnt, icnt, ocnt, icntx, ocntx;
+
+ /* reset modem */
+ eio[0] = 0;
+ eio[1] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+ if (parport_epp_write_addr(eio, 2) != 2)
+ goto errret;
+ for (;;) {
+ if (parport_epp_read_addr(&stat, 1) != 1)
+ goto errret;
+ /* determine TX fifo size from status bits */
+ switch (stat & (EPP_NTAEF|EPP_NTHF)) {
+ case EPP_NTHF:
+ ocntx = 2048 - 256;
+ break;
+
+ case EPP_NTAEF:
+ ocntx = 2048 - 1793;
+ break;
+
+ case 0:
+ ocntx = 0;
+ break;
+
+ default:
+ ocntx = 2048 - 1025;
+ break;
+ }
+ /* determine RX fifo size from status bits */
+ switch (stat & (EPP_NRAEF|EPP_NRHF)) {
+ case EPP_NRHF:
+ icntx = 0;
+ break;
+
+ case EPP_NRAEF:
+ icntx = 1025;
+ break;
+
+ case 0:
+ icntx = 1793;
+ break;
+
+ default:
+ icntx = 256;
+ break;
+ }
+ /* try to determine the FIFO count if in extended mode */
+ if (state.config.extstat) {
+ eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE|1;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ if (parport_epp_read_addr(eio, 2) != 2)
+ goto errret;
+ icnt = eio[0] | (((unsigned int)eio[1]) << 8);
+ eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE|2;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ if (parport_epp_read_addr(eio, 2) != 2)
+ goto errret;
+ ocnt = eio[0] | (((unsigned int)eio[1]) << 8);
+ eio[0] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ ocnt = 16384 - (ocnt & 0x7fff);
+ icnt &= 0x7fff;
+ } else {
+ ocnt = ocntx;
+ icnt = icntx;
+ }
+ /* update status */
+ state.stat.icnt3 = state.stat.icnt1;
+ state.stat.icnt1 = icnt;
+ state.stat.icnt2 = icntx;
+ state.stat.ocnt3 = state.stat.ocnt1;
+ state.stat.ocnt1 = ocnt;
+ state.stat.ocnt2 = ocntx;
+ state.stat.status = stat;
+ state.access.dcd = !(stat & EPP_DCDBIT);
+ state.access.ptt = !!(stat & EPP_PTTBIT);
+ /* rx */
+ while (icnt > 0) {
+ cnt = icnt;
+ if (cnt > sizeof(eio))
+ cnt = sizeof(eio);
+ icnt -= cnt;
+ if (parport_epp_read_data(eio, cnt) != cnt)
+ goto errret;
+ hdlc_receive(eio, cnt);
+ }
+ /* tx */
+ if (ocnt > 0) {
+ if (ocnt > sizeof(eio))
+ ocnt = sizeof(eio);
+ cnt = hdlc_transmit(eio, ocnt);
+ if (parport_epp_write_data(eio, cnt) != cnt)
+ goto errret;
+ }
+ /* KISS and reschedule */
+ handle_kiss();
+ }
+errret:
+ errprintf(SEV_FATAL, "Modem timeout\n");
+}
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ * ECP Mode
+ */
+
+/* _MUST_ not return! */
+
+static void ecp_modem(void)
+{
+ u_int8_t data[1024];
+ unsigned char stat[6];
+ int cnt, icnt, ocnt;
+
+ data[0] = 0xaf; /* reset register: all reset */
+ data[1] = 0xa0; /* reset register: terminate reset */
+ data[2] = 0xb0;
+ if (parport_ecp_write_addr(data, 3) != 3)
+ goto errret;
+ for (;;) {
+ data[0] = 0x81;
+ if (parport_ecp_write_addr(data, 1) != 1)
+ goto errret;
+ if (parport_ecp_read_data(stat, 6) != 6)
+ goto errret;
+ data[0] = 0x80;
+ if (parport_ecp_write_addr(data, 1) != 1)
+ goto errret;
+ icnt = ((unsigned)stat[2] << 8) | stat[1];
+ ocnt = ((unsigned)stat[4] << 8) | stat[3];
+ /* update status */
+ state.stat.icnt3 = state.stat.icnt2;
+ state.stat.icnt2 = state.stat.icnt1;
+ state.stat.icnt1 = icnt;
+ state.stat.ocnt3 = state.stat.ocnt2;
+ state.stat.ocnt2 = state.stat.ocnt1;
+ state.stat.ocnt1 = ocnt;
+ state.stat.status = stat[0];
+ state.access.dcd = !(stat[0] & 0x80);
+ state.access.ptt = !(stat[0] & 0x40);
+ /* read */
+ while (icnt > 0) {
+ cnt = icnt;
+ if (cnt > sizeof(data))
+ cnt = sizeof(data);
+ icnt -= cnt;
+ data[0] = 0xc0 | (cnt & 0xf);
+ data[1] = 0xd0 | ((cnt >> 4) & 0xf);
+ data[2] = 0xe0 | ((cnt >> 8) & 0xf);
+ if (parport_ecp_write_addr(data, 3) != 3)
+ goto errret;
+ if (parport_ecp_read_data(data, cnt) != cnt)
+ goto errret;
+ hdlc_receive(data, cnt);
+ }
+ /* write */
+ if (ocnt < 8192) { /* fixme */
+ cnt = 8192 - ocnt;
+ if (cnt > sizeof(data))
+ cnt = sizeof(data);
+ cnt = hdlc_transmit(data, cnt);
+ if (parport_ecp_write_data(data, cnt) != cnt)
+ goto errret;
+ }
+ /* KISS and reschedule */
+ handle_kiss();
+ }
+errret:
+ errprintf(SEV_FATAL, "Modem timeout\n");
+}
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ * EPP AFSK Mode
+ */
+
+/* _MUST_ not return! */
+
+static void eppafsk_modem(void)
+{
+ unsigned char eio[32];
+ u_int8_t stat;
+ int cnt, icnt, ocnt;
+
+ /* reset modem */
+ eio[0] = 0x00;
+ eio[1] = 0x18;
+ if (parport_epp_write_addr(eio, 2) != 2)
+ goto errret;
+ for (;;) {
+ if (parport_epp_read_addr(&stat, 1) != 1)
+ goto errret;
+ /* determine the FIFO count */
+ eio[0] = 0x19;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ if (parport_epp_read_addr(eio, 1) != 1)
+ goto errret;
+ ocnt = 0x10 - (eio[0] & 0x1f);
+ eio[0] = 0x1a;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ if (parport_epp_read_addr(eio, 1) != 1)
+ goto errret;
+ icnt = eio[0] & 0x1f;
+ eio[0] = 0x18;
+ if (parport_epp_write_addr(eio, 1) != 1)
+ goto errret;
+ /* update status */
+ state.stat.icnt3 = state.stat.icnt2;
+ state.stat.icnt2 = state.stat.icnt1;
+ state.stat.icnt1 = icnt;
+ state.stat.ocnt3 = state.stat.ocnt2;
+ state.stat.ocnt2 = state.stat.ocnt1;
+ state.stat.ocnt1 = ocnt;
+ state.stat.status = stat;
+ state.access.dcd = !(stat & 0x80);
+ state.access.ptt = !(stat & 0x40);
+ /* rx */
+ if (icnt > 0) {
+ if (parport_epp_read_data(eio, icnt) != icnt)
+ goto errret;
+ hdlc_receive(eio, icnt);
+ }
+ /* tx */
+ if (ocnt > 0) {
+ cnt = hdlc_transmit(eio, ocnt);
+ if (parport_epp_write_data(eio, cnt) != cnt)
+ goto errret;
+ }
+ /* KISS and reschedule */
+ handle_kiss();
+ }
+errret:
+ errprintf(SEV_FATAL, "Modem timeout\n");
+}
+
+/* ---------------------------------------------------------------------- */
+
+/*
+ * EPP conventional Mode
+ */
+
+/* _MUST_ not return! */
+
+static void eppconv_modem(void)
+{
+ unsigned char eio[1024];
+ u_int8_t stat;
+ int cnt, i, icnt, ocnt;
+
+ /* reset modem */
+ eio[0] = 0;
+ eio[1] = EPP_TX_FIFO_ENABLE|EPP_RX_FIFO_ENABLE|EPP_MODEM_ENABLE;
+ if (parport_epp_write_addr(eio, 2) != 2)
+ goto errret;
+ for (;;) {
+ if (parport_epp_read_addr(&stat, 1) != 1)
+ goto errret;
+ /* determine TX fifo size from status bits */
+ switch (stat & (EPP_NTAEF|EPP_NTHF)) {
+ case EPP_NTHF:
+ ocnt = 2048 - 256;
+ break;
+
+ case EPP_NTAEF:
+ ocnt = 2048 - 1793;
+ break;
+
+ case 0:
+ ocnt = 0;
+ break;
+
+ default:
+ ocnt = 2048 - 1025;
+ break;
+ }
+ /* determine RX fifo size from status bits */
+ switch (stat & (EPP_NRAEF|EPP_NRHF)) {
+ case EPP_NRHF:
+ icnt = 0;
+ break;
+
+ case EPP_NRAEF:
+ icnt = 1025;
+ break;
+
+ case 0:
+ icnt = 1793;
+ break;
+
+ default:
+ icnt = 256;
+ break;
+ }
+ /* update status */
+ state.stat.icnt3 = state.stat.icnt2;
+ state.stat.icnt2 = state.stat.icnt1;
+ state.stat.icnt1 = icnt;
+ state.stat.ocnt3 = state.stat.ocnt2;
+ state.stat.ocnt2 = state.stat.ocnt1;
+ state.stat.ocnt1 = ocnt;
+ state.stat.status = stat;
+ state.access.dcd = !(stat & EPP_DCDBIT);
+ state.access.ptt = !!(stat & EPP_PTTBIT);
+ /* rx */
+ if (icnt == 0 && state.access.bitrate < 100000) {
+ cnt = 0;
+ i = (state.access.bitrate < 50000) ? 256 : 128;
+ while (i > 0 && cnt < sizeof(eio) && stat & EPP_NREF) {
+ if (parport_epp_read_data(eio+cnt, 1) != 1)
+ goto errret;
+ cnt++;
+ i--;
+ if (parport_epp_read_addr(&stat, 1) != 1)
+ goto errret;
+ }
+ hdlc_receive(eio, cnt);
+ }
+ while (icnt > 0) {
+ cnt = icnt;
+ if (cnt > sizeof(eio))
+ cnt = sizeof(eio);
+ icnt -= cnt;
+ if (parport_epp_read_data(eio, cnt) != cnt)
+ goto errret;
+ hdlc_receive(eio, cnt);
+ }
+ /* tx */
+ if (ocnt > 0) {
+ if (ocnt > sizeof(eio))
+ ocnt = sizeof(eio);
+ cnt = hdlc_transmit(eio, ocnt);
+ if (parport_epp_write_data(eio, cnt) != cnt)
+ goto errret;
+ }
+ /* KISS and reschedule */
+ handle_kiss();
+ }
+errret:
+ errprintf(SEV_FATAL, "Modem timeout\n");
+}
+
+/* ---------------------------------------------------------------------- */
+
+int main(int argc, char *argv[])
+{
+ void *so;
+ int (*drvinit)(int argc, char *argv[]);
+ int mode;
+
+ if (!(so = dlopen("baycomfpga_init.so", RTLD_NOW)) || !(drvinit = dlsym(so, "driver_init"))) {
+ fprintf(stderr, "baycomepp: cannot load initialization code from baycomfpga_init.so\n");
+ exit(1);
+ }
+ mode = drvinit(argc, argv);
+ dlclose(so);
+ switch(mode) {
+ case MODE_EPP:
+ epp_modem();
+ case MODE_ECP:
+ ecp_modem();
+ case MODE_EPPAFSK:
+ eppafsk_modem();
+ case MODE_EPPCONV:
+ eppconv_modem();
+ }
+ exit(1);
+}
+
+/* ---------------------------------------------------------------------- */
diff --git a/w9xdrv/MAKEFILE b/w9xdrv/MAKEFILE
new file mode 100644
index 0000000..1210327
--- /dev/null
+++ b/w9xdrv/MAKEFILE
@@ -0,0 +1,72 @@
+BUILD_TYPE=base
+!INCLUDE $(BASEDIR)\inc\master.mk
+
+# sample make file for building vxd virtual device for Windows
+
+NAME = eppflex
+
+# Definitions for the debug level
+
+!ifdef DEBUG
+DDEBUG =-DDEBLEVEL=1 -DDEBUG
+!else
+DDEBUG =-DDEBLEVEL=0
+!endif
+
+# Definitions for MASM 6 Assembler
+
+CC = cl
+ASM = ml
+ASMENV = ML
+CFLAGS = -DWIN32 -DCON -Di386 -D_X86_ -D_NTWIN -W3 -Gs -D_DEBUG -Zi -I$(INC32)
+CVXDFLAGS = -Oi -Zdp -Gs -c -DIS_32 -Zl -DDEBLEVEL=1 -DDEBUG -DWANTVXDWRAPS=1 -I$(INC32)
+LFLAGS = -machine:i386 -debug:notmapped,full -debugtype:cv -VXD $(BASEDIR)\lib\i386\free\vxdwraps.clb
+AFLAGS = -coff -DBLD_COFF -DIS_32 -W2 -Zd -c -Cx -DMASM6 -DDEBLEVEL=1 -DDEBUG -I$(INC32)
+
+# MASM 6 only inference rules
+
+.asm{obj\i386}.obj:
+ set $(ASMENV)=$(AFLAGS)
+ $(ASM) -Fo$*.obj $<
+
+.c{obj\i386}.obj:
+ $(CC) $(CVXDFLAGS) -Fo$@ %s
+
+.rc{obj\i386}.res:
+ $(RC16B) -r -i $(INC16);$(INC32) -fo$@ %s
+
+all : obj\i386\$(NAME).vxd
+
+OBJS = obj\i386\eppflex.obj obj\i386\eppfctrl.obj
+
+obj\i386\vxdstub.exe: obj\i386\vxdstub.obj
+!ifndef PASS0ONLY
+ @echo link -OUT:$@
+ $(LINK16) obj\i386\vxdstub.obj;
+!endif
+
+obj\i386\generic.obj: generic.asm
+
+obj\i386\$(NAME).vxd: $(NAME).def $(OBJS) obj\i386\$(NAME).res
+!ifndef PASS0ONLY
+ @echo link -OUT:$@
+ link @<<obj\i386\$(NAME).lnk
+$(LFLAGS)
+-ignore:4078 -ignore:4039
+/OUT:obj\i386\$(NAME).vxd
+/MAP:obj\i386\$(NAME).map
+/DEF:$(NAME).def
+$(OBJS)
+<<
+ $(DDKROOT)\bin\Win98\adrc2vxd.exe obj\i386\$(NAME).vxd obj\i386\$(NAME).res
+ mapsym -s -o obj\i386\$(NAME).sym obj\i386\$(NAME).map
+!endif
+
+clean:
+ - at if exist obj\i386\*.obj del obj\i386\*.obj
+ - at if exist obj\i386\*.vxd del obj\i386\*.vxd
+ - at if exist obj\i386\*.exp del obj\i386\*.exp
+ - at if exist obj\i386\*.lib del obj\i386\*.lib
+ - at if exist obj\i386\*.map del obj\i386\*.map
+ - at if exist obj\i386\*.sym del obj\i386\*.sym
+ - at if exist *.bak del *.bak
diff --git a/w9xdrv/Makefile.am b/w9xdrv/Makefile.am
new file mode 100644
index 0000000..12bf6e6
--- /dev/null
+++ b/w9xdrv/Makefile.am
@@ -0,0 +1 @@
+EXTRA_DIST = MAKEFILE SOURCES eppfctrl.asm eppflex.c eppflex.def eppflex.h eppflex.vxd eppflex.rc
diff --git a/w9xdrv/Makefile.in b/w9xdrv/Makefile.in
new file mode 100644
index 0000000..2219b2f
--- /dev/null
+++ b/w9xdrv/Makefile.in
@@ -0,0 +1,215 @@
+# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+
+SHELL = @SHELL@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+bindir = @bindir@
+sbindir = @sbindir@
+libexecdir = @libexecdir@
+datadir = @datadir@
+sysconfdir = @sysconfdir@
+sharedstatedir = @sharedstatedir@
+localstatedir = @localstatedir@
+libdir = @libdir@
+infodir = @infodir@
+mandir = @mandir@
+includedir = @includedir@
+oldincludedir = /usr/include
+
+DESTDIR =
+
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+
+top_builddir = ..
+
+ACLOCAL = @ACLOCAL@
+AUTOCONF = @AUTOCONF@
+AUTOMAKE = @AUTOMAKE@
+AUTOHEADER = @AUTOHEADER@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS)
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+transform = @program_transform_name@
+
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_alias = @build_alias@
+build_triplet = @build@
+host_alias = @host_alias@
+host_triplet = @host@
+target_alias = @target_alias@
+target_triplet = @target@
+AR = @AR@
+AS = @AS@
+BUILD_INCLUDED_LIBINTL = @BUILD_INCLUDED_LIBINTL@
+CATOBJEXT = @CATOBJEXT@
+CC = @CC@
+DATADIRNAME = @DATADIRNAME@
+DLLTOOL = @DLLTOOL@
+DRVLIBOBJS = @DRVLIBOBJS@
+EXEEXT = @EXEEXT@
+GENCAT = @GENCAT@
+GLIBC21 = @GLIBC21@
+GMSGFMT = @GMSGFMT@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_CONFIG = @GTK_CONFIG@
+GTK_LIBS = @GTK_LIBS@
+HAVE_BITTYPES = @HAVE_BITTYPES@
+HAVE_DIRECTX = @HAVE_DIRECTX@
+HAVE_IFRNEWNAME = @HAVE_IFRNEWNAME@
+HAVE_IOFUNCS = @HAVE_IOFUNCS@
+HAVE_LIB = @HAVE_LIB@
+HAVE_MKISS = @HAVE_MKISS@
+HAVE_PPKDRV = @HAVE_PPKDRV@
+HAVE_PPUSER = @HAVE_PPUSER@
+INSTOBJEXT = @INSTOBJEXT@
+INTLBISON = @INTLBISON@
+INTLLIBS = @INTLLIBS@
+INTLOBJS = @INTLOBJS@
+INTL_LIBTOOL_SUFFIX_PREFIX = @INTL_LIBTOOL_SUFFIX_PREFIX@
+LIB = @LIB@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBOBJS = @LIBOBJS@
+LTLIB = @LTLIB@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+MAKEINFO = @MAKEINFO@
+MKINSTALLDIRS = @MKINSTALLDIRS@
+M_PI = @M_PI@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+POSUB = @POSUB@
+RANLIB = @RANLIB@
+USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@
+USE_NLS = @USE_NLS@
+VERSION = @VERSION@
+WINDRES = @WINDRES@
+
+EXTRA_DIST = MAKEFILE SOURCES eppfctrl.asm eppflex.c eppflex.def eppflex.h eppflex.vxd eppflex.rc
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = ../config.h
+CONFIG_CLEAN_FILES =
+DIST_COMMON = Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+ cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps w9xdrv/Makefile
+
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+ cd $(top_builddir) \
+ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = w9xdrv
+
+distdir: $(DISTFILES)
+ @for file in $(DISTFILES); do \
+ d=$(srcdir); \
+ if test -d $$d/$$file; then \
+ cp -pr $$d/$$file $(distdir)/$$file; \
+ else \
+ test -f $(distdir)/$$file \
+ || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+ || cp -p $$d/$$file $(distdir)/$$file || :; \
+ fi; \
+ done
+info-am:
+info: info-am
+dvi-am:
+dvi: dvi-am
+check-am: all-am
+check: check-am
+installcheck-am:
+installcheck: installcheck-am
+install-exec-am:
+install-exec: install-exec-am
+
+install-data-am:
+install-data: install-data-am
+
+install-am: all-am
+ @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am:
+uninstall: uninstall-am
+all-am: Makefile
+all-redirect: all-am
+install-strip:
+ $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+
+
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -rm -f Makefile $(CONFIG_CLEAN_FILES)
+ -rm -f config.cache config.log stamp-h stamp-h[0-9]*
+
+maintainer-clean-generic:
+mostlyclean-am: mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am: clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am: distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am: maintainer-clean-generic distclean-am
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+maintainer-clean: maintainer-clean-am
+
+.PHONY: tags distdir info-am info dvi-am dvi check check-am \
+installcheck-am installcheck install-exec-am install-exec \
+install-data-am install-data install-am install uninstall-am uninstall \
+all-redirect all-am all installdirs mostlyclean-generic \
+distclean-generic clean-generic maintainer-clean-generic clean \
+mostlyclean distclean maintainer-clean
+
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/w9xdrv/SOURCES b/w9xdrv/SOURCES
new file mode 100644
index 0000000..ce425b7
--- /dev/null
+++ b/w9xdrv/SOURCES
@@ -0,0 +1,8 @@
+TARGETNAME=eppflex
+TARGETTYPE=DRIVER
+TARGETPATH=obj
+NTTARGETFILE0=
+
+
+SOURCES=
+
diff --git a/w9xdrv/eppfctrl.asm b/w9xdrv/eppfctrl.asm
new file mode 100644
index 0000000..0255a9d
--- /dev/null
+++ b/w9xdrv/eppfctrl.asm
@@ -0,0 +1,54 @@
+ .386p
+
+;******************************************************************
+; I N C L U D E S
+;******************************************************************
+
+ include vmm.inc
+ include debug.inc
+
+;==================================================================
+; V I R T U A L D E V I C E D E C L A R A T I O N
+;==================================================================
+
+DECLARE_VIRTUAL_DEVICE EPPFLEX, 1, 0, ControlProc, \
+ UNDEFINED_DEVICE_ID, UNDEFINED_INIT_ORDER
+
+VxD_LOCKED_CODE_SEG
+
+;==================================================================
+;
+; PROCEDURE: ControlProc
+;
+; DESCRIPTION:
+; Device control procedure for the SKELETON VxD
+;
+; ENTRY:
+; EAX = Control call ID
+;
+; EXIT:
+; If carry clear then
+; Successful
+; else
+; Control call failed
+;
+; USES:
+; EAX, EBX, ECX, EDX, ESI, EDI, Flags
+;
+;==================================================================
+
+BeginProc ControlProc
+ Control_Dispatch SYS_DYNAMIC_DEVICE_INIT, \
+ _OnSysDynamicDeviceInit, cCall, <ebx>
+ Control_Dispatch SYS_DYNAMIC_DEVICE_EXIT, \
+ _OnSysDynamicDeviceExit, cCall, <ebx>
+ Control_Dispatch W32_DEVICEIOCONTROL, \
+ _OnW32DeviceIoControl, cCall, <esi>
+ clc
+ ret
+
+EndProc ControlProc
+
+VxD_LOCKED_CODE_ENDS
+
+ END
diff --git a/w9xdrv/eppflex.c b/w9xdrv/eppflex.c
new file mode 100644
index 0000000..abcc5c5
--- /dev/null
+++ b/w9xdrv/eppflex.c
@@ -0,0 +1,418 @@
+/*
+ * Thomas Sailer, (C) 2000
+ */
+
+#include <basedef.h>
+#include <vmm.h>
+#include <vmmreg.h>
+#include <debug.h>
+#include <vwin32.h>
+#include <vcomm.h> /* must be included before VXDWRAPS.H */
+#include <vxdwraps.h>
+#include <winerror.h>
+#include <configmg.h>
+#include "eppflex.h"
+
+#pragma VxD_LOCKED_CODE_SEG
+#pragma VxD_LOCKED_DATA_SEG
+
+#define printk(x) Out_Debug_String(x)
+
+#define MAXPORTS 4
+
+static struct portconfig {
+ unsigned int addr0, addr0end;
+ unsigned int addr1, addr1end;
+ int irq;
+ int dma;
+} portconfig[MAXPORTS];
+
+static DWORD porthandle = 0;
+static PFN conthandler = NULL;
+static unsigned int portnr;
+
+static DWORD StealNotifyHandler( void *RefData, DWORD dwNotification )
+{
+ /* steal handler: we do not allow anyone to steal our port */
+ return FALSE;
+}
+
+static UCHAR inb(WORD port)
+{
+ _asm {
+ mov dx,[port]
+ in al,dx
+ jmp del1
+del1: jmp del2
+del2: xor ah,ah
+ }
+}
+
+static void outb(UCHAR data, WORD port)
+{
+ _asm {
+ mov dx,[port]
+ mov al,byte ptr data
+ out dx,al
+ jmp del1
+del1: jmp del2
+del2:
+ }
+}
+
+static void releaseport(void)
+{
+ if (!conthandler)
+ return;
+ (*conthandler)(RELEASE_RESOURCE, porthandle, StealNotifyHandler);
+ porthandle = 0;
+}
+
+static int acquireport(unsigned int port)
+{
+ char lptname[] = "LPTx";
+ int ret;
+
+ if (porthandle)
+ releaseport();
+ porthandle = 0;
+ if (port >= MAXPORTS)
+ return ERROR_BAD_DEVICE;
+ if (!portconfig[port].addr0)
+ return ERROR_BAD_DEVICE;
+ portnr = port;
+ lptname[3] = '1' + port;
+ conthandler = VCOMM_Get_Contention_Handler(lptname);
+ if (!conthandler)
+ return ERROR_BAD_DEVICE;
+ porthandle = VCOMM_Map_Name_To_Resource(lptname);
+ if (!porthandle)
+ return ERROR_BAD_DEVICE;
+ ret = (*conthandler)(ACQUIRE_RESOURCE, porthandle, StealNotifyHandler, porthandle, TRUE);
+ if (!ret)
+ return ERROR_BAD_DEVICE;
+ return NO_ERROR;
+}
+
+/*
+ * LPT find configuration stuff
+ */
+
+static void printknum(DWORD num)
+{
+ char buf[16];
+ char *cp = &buf[16];
+
+ *--cp = 0;
+ do {
+ *--cp = '0' + (num % 10);
+ num /= 10;
+ } while (num);
+ printk(cp);
+}
+
+static void printkhex(DWORD num, DWORD digits)
+{
+ char buf[9];
+ char *cp = &buf[9];
+
+ *--cp = 0;
+ if (digits > 8)
+ digits = 8;
+ if (!digits)
+ return;
+ do {
+ if ((num & 15) >= 10)
+ *--cp = 'A' - 10 + (num & 15);
+ else
+ *--cp = '0' + (num & 15);
+ num >>= 4;
+ digits--;
+ } while (digits);
+ printk(cp);
+}
+
+static void printdevid(DEVNODE dn)
+{
+ char buf[MAX_DEVICE_ID_LEN];
+
+ if (CM_Get_Device_ID(dn, buf, sizeof(buf), 0) != CR_SUCCESS)
+ return;
+ printk("Device ID: ");
+ printk(buf);
+ printk("\n");
+}
+
+static void nodefoundport(DEVNODE dn, unsigned int portnr)
+{
+ LOG_CONF lc;
+ RES_DES rd;
+ IO_DES iod;
+ IRQ_DES irqd;
+ DMA_DES dmad;
+ struct portconfig cfg;
+
+ if (portnr >= MAXPORTS) {
+ printk("Port number overflow\n");
+ return;
+ }
+ cfg.addr0 = cfg.addr0end = cfg.addr1 = cfg.addr1end = 0;
+ cfg.irq = cfg.dma = -1;
+ if (CM_Get_First_Log_Conf(&lc, dn, ALLOC_LOG_CONF) == CR_SUCCESS) {
+ rd = (RES_DES)lc;
+ while (CM_Get_Next_Res_Des(&rd, rd, ResType_IO, NULL, 0) == CR_SUCCESS) {
+ if (CM_Get_Res_Des_Data(rd, &iod, sizeof(iod), 0) == CR_SUCCESS) {
+ if (iod.IOD_Alloc_Base >= 0x400) {
+ cfg.addr1 = iod.IOD_Alloc_Base;
+ cfg.addr1end = iod.IOD_Alloc_End;
+ } else {
+ cfg.addr0 = iod.IOD_Alloc_Base;
+ cfg.addr0end = iod.IOD_Alloc_End;
+ }
+ }
+ }
+ rd = (RES_DES)lc;
+ while (CM_Get_Next_Res_Des(&rd, rd, ResType_IRQ, NULL, 0) == CR_SUCCESS) {
+ if (CM_Get_Res_Des_Data(rd, &irqd, sizeof(irqd), 0) == CR_SUCCESS) {
+ cfg.irq = irqd.IRQD_Alloc_Num;
+ }
+ }
+ rd = (RES_DES)lc;
+ while (CM_Get_Next_Res_Des(&rd, rd, ResType_DMA, NULL, 0) == CR_SUCCESS) {
+ if (CM_Get_Res_Des_Data(rd, &dmad, sizeof(dmad), 0) == CR_SUCCESS) {
+ cfg.dma = dmad.DD_Alloc_Chan;
+ }
+ }
+ }
+ if (cfg.addr0)
+ portconfig[portnr] = cfg;
+ printk("LPT");
+ printknum(portnr+1);
+ printk(": IO Ranges: ");
+ printkhex(cfg.addr0, 4);
+ printk("-");
+ printkhex(cfg.addr0end, 4);
+ printk(" ");
+ printkhex(cfg.addr1, 4);
+ printk("-");
+ printkhex(cfg.addr1end, 4);
+ if (cfg.irq != -1) {
+ printk(" IRQ ");
+ printknum(cfg.irq);
+ }
+ if (cfg.dma != -1) {
+ printk(" DMA ");
+ printknum(cfg.dma);
+ }
+ printk("\n");
+}
+
+static void nodeconfig(DEVNODE dn)
+{
+ char key[MAX_VMM_REG_KEY_LEN];
+ char portname[64];
+ ULONG portsz;
+ VMMHKEY hkey;
+
+ if (CM_Get_DevNode_Key(dn, NULL, &key, sizeof(key), CM_REGISTRY_HARDWARE) == CR_SUCCESS) {
+ portsz = sizeof(portname);
+ if (_RegOpenKey(HKEY_LOCAL_MACHINE, key, &hkey) == ERROR_SUCCESS) {
+ if (_RegQueryValueEx(hkey, "PORTNAME", NULL, NULL, portname, &portsz) == ERROR_SUCCESS) {
+ printdevid(dn);
+ printk("Port name: ");
+ printk(portname);
+ printk("\n");
+ if (portname[0] = 'L' && portname[1] == 'P' && portname[2] == 'T' && portname[4] == 0)
+ nodefoundport(dn, portname[3] - '1');
+ }
+ _RegCloseKey(hkey);
+ }
+ }
+}
+
+static void nodesubtree(DEVNODE dn)
+{
+ DWORD dnch;
+
+ do {
+ nodeconfig(dn);
+ if (CM_Get_Child(&dnch, dn, 0) == CR_SUCCESS)
+ nodesubtree(dnch);
+ } while (CM_Get_Sibling(&dn, dn, 0) == CR_SUCCESS);
+}
+
+static void retrieveconfig(void)
+{
+ DEVNODE dn;
+ CONFIGRET ret;
+
+ ret = CM_Locate_DevNode(&dn, NULL, 0);
+ if (ret != CR_SUCCESS) {
+ printk("Locate_DevNode error: ");
+ printknum(ret);
+ printk("\n");
+ return;
+ }
+ nodesubtree(dn);
+}
+
+BOOL OnSysDynamicDeviceInit(void)
+{
+ printk("eppflex: dynamic init\n");
+
+ memset(portconfig, 0, sizeof(portconfig));
+ retrieveconfig();
+
+ return TRUE;
+}
+
+BOOL OnSysDynamicDeviceExit(void)
+{
+ printk("eppflex: dynamic exit\n");
+ if (porthandle)
+ releaseport();
+ return TRUE;
+}
+
+static DWORD read_port(PDIOCPARAMETERS p, WORD port)
+{
+ struct eppflex_rwdata *rwout = (struct eppflex_rwdata *)p->lpvOutBuffer;
+
+ if (!porthandle)
+ return ERROR_INVALID_PARAMETER;
+ if (p->cbOutBuffer < sizeof(struct eppflex_rwdata))
+ return ERROR_INVALID_PARAMETER;
+ if (!port)
+ return ERROR_INVALID_PARAMETER;
+ if ((port < portconfig[portnr].addr0 || port > portconfig[portnr].addr0end) &&
+ (port < portconfig[portnr].addr1 || port > portconfig[portnr].addr1end))
+ return ERROR_INVALID_PARAMETER;
+ rwout->data = inb(port);
+ if (p->lpcbBytesReturned)
+ *((DWORD *)p->lpcbBytesReturned) = sizeof(struct eppflex_rwdata);
+ return NO_ERROR;
+}
+
+static DWORD write_port(PDIOCPARAMETERS p, WORD port)
+{
+ struct eppflex_rwdata *rwin = (struct eppflex_rwdata *)p->lpvInBuffer;
+
+ if (!porthandle)
+ return ERROR_INVALID_PARAMETER;
+ if (p->cbInBuffer < sizeof(struct eppflex_rwdata))
+ return ERROR_INVALID_PARAMETER;
+ if (!port)
+ return ERROR_INVALID_PARAMETER;
+ if ((port < portconfig[portnr].addr0 || port > portconfig[portnr].addr0end) &&
+ (port < portconfig[portnr].addr1 || port > portconfig[portnr].addr1end))
+ return ERROR_INVALID_PARAMETER;
+ outb(rwin->data, port);
+ if (p->lpcbBytesReturned)
+ *((DWORD *)p->lpcbBytesReturned) = 0;
+ return NO_ERROR;
+}
+
+static DWORD frob_port(PDIOCPARAMETERS p, WORD port)
+{
+ struct eppflex_rwdata *rwin = (struct eppflex_rwdata *)p->lpvInBuffer;
+ struct eppflex_rwdata *rwout = (struct eppflex_rwdata *)p->lpvOutBuffer;
+ unsigned char data;
+
+ if (!porthandle)
+ return ERROR_INVALID_PARAMETER;
+ if (p->cbInBuffer < sizeof(struct eppflex_rwdata) ||
+ p->cbOutBuffer < sizeof(struct eppflex_rwdata))
+ return ERROR_INVALID_PARAMETER;
+ if (!port)
+ return ERROR_INVALID_PARAMETER;
+ if ((port < portconfig[portnr].addr0 || port > portconfig[portnr].addr0end) &&
+ (port < portconfig[portnr].addr1 || port > portconfig[portnr].addr1end))
+ return ERROR_INVALID_PARAMETER;
+ data = inb(port);
+ data = (data & ~rwin->mask) ^ rwin->data;
+ outb(data, port);
+ rwout->data = data;
+ rwout->mask = rwin->mask;
+ if (p->lpcbBytesReturned)
+ *((DWORD *)p->lpcbBytesReturned) = sizeof(struct eppflex_rwdata);
+ return NO_ERROR;
+}
+
+DWORD OnW32DeviceIoControl(PDIOCPARAMETERS p)
+{
+ if (p->lpcbBytesReturned)
+ *((DWORD *)p->lpcbBytesReturned) = 0;
+ switch (p->dwIoControlCode) {
+ case DIOC_OPEN:
+ return NO_ERROR;
+
+ case DIOC_CLOSEHANDLE:
+ return NO_ERROR;
+
+ case IOCTL_EPPFLEX_READ_DATA:
+ return read_port(p, (WORD)(portconfig[portnr].addr0));
+
+ case IOCTL_EPPFLEX_WRITE_DATA:
+ return write_port(p, (WORD)(portconfig[portnr].addr0));
+
+ case IOCTL_EPPFLEX_READ_STATUS:
+ return read_port(p, (WORD)(portconfig[portnr].addr0 + 1));
+
+ case IOCTL_EPPFLEX_WRITE_STATUS:
+ return write_port(p, (WORD)(portconfig[portnr].addr0 + 1));
+
+ case IOCTL_EPPFLEX_READ_CONTROL:
+ return read_port(p, (WORD)(portconfig[portnr].addr0 + 2));
+
+ case IOCTL_EPPFLEX_WRITE_CONTROL:
+ return write_port(p, (WORD)(portconfig[portnr].addr0 + 2));
+
+ case IOCTL_EPPFLEX_FROB_CONTROL:
+ return frob_port(p, (WORD)(portconfig[portnr].addr0 + 2));
+
+ case IOCTL_EPPFLEX_READ_ECONTROL:
+ return read_port(p, (WORD)(portconfig[portnr].addr1 + 2));
+
+ case IOCTL_EPPFLEX_WRITE_ECONTROL:
+ return write_port(p, (WORD)(portconfig[portnr].addr1 + 2));
+
+ case IOCTL_EPPFLEX_FROB_ECONTROL:
+ return frob_port(p, (WORD)(portconfig[portnr].addr1 + 2));
+
+ case IOCTL_EPPFLEX_READ_CONFIGA:
+ return read_port(p, (WORD)(portconfig[portnr].addr1));
+
+ case IOCTL_EPPFLEX_WRITE_CONFIGA:
+ return write_port(p, (WORD)(portconfig[portnr].addr1));
+
+ case IOCTL_EPPFLEX_READ_CONFIGB:
+ return read_port(p, (WORD)(portconfig[portnr].addr1 + 1));
+
+ case IOCTL_EPPFLEX_WRITE_CONFIGB:
+ return write_port(p, (WORD)(portconfig[portnr].addr1 + 1));
+
+ case IOCTL_EPPFLEX_READ_EPPADDR:
+ return read_port(p, (WORD)(portconfig[portnr].addr0 + 3));
+
+ case IOCTL_EPPFLEX_WRITE_EPPADDR:
+ return write_port(p, (WORD)(portconfig[portnr].addr0 + 3));
+
+ case IOCTL_EPPFLEX_READ_EPPDATA:
+ return read_port(p, (WORD)(portconfig[portnr].addr0 + 4));
+
+ case IOCTL_EPPFLEX_WRITE_EPPDATA:
+ return write_port(p, (WORD)(portconfig[portnr].addr0 + 4));
+
+ case IOCTL_EPPFLEX_ACQUIREPORT:
+ if (p->cbInBuffer < sizeof(unsigned int))
+ return ERROR_INVALID_PARAMETER;
+ return acquireport(*((unsigned int *)p->lpvInBuffer));
+
+ case IOCTL_EPPFLEX_RELEASEPORT:
+ releaseport();
+ return NO_ERROR;
+
+ default:
+ return ERROR_NOT_SUPPORTED;
+ }
+}
diff --git a/w9xdrv/eppflex.def b/w9xdrv/eppflex.def
new file mode 100644
index 0000000..8417bd1
--- /dev/null
+++ b/w9xdrv/eppflex.def
@@ -0,0 +1,27 @@
+VXD EPPFLEX DYNAMIC
+SEGMENTS
+ _LTEXT CLASS 'LCODE' PRELOAD NONDISCARDABLE
+ _LDATA CLASS 'LCODE' PRELOAD NONDISCARDABLE
+ _TEXT CLASS 'LCODE' PRELOAD NONDISCARDABLE
+ _DATA CLASS 'LCODE' PRELOAD NONDISCARDABLE
+ _LPTEXT CLASS 'LCODE' PRELOAD NONDISCARDABLE
+ _CONST CLASS 'LCODE' PRELOAD NONDISCARDABLE
+ _BSS CLASS 'LCODE' PRELOAD NONDISCARDABLE
+ _TLS CLASS 'LCODE' PRELOAD NONDISCARDABLE
+ _ITEXT CLASS 'ICODE' DISCARDABLE
+ _IDATA CLASS 'ICODE' DISCARDABLE
+ _PTEXT CLASS 'PCODE' NONDISCARDABLE
+ _PDATA CLASS 'PCODE' NONDISCARDABLE
+ _STEXT CLASS 'SCODE' RESIDENT
+ _SDATA CLASS 'SCODE' RESIDENT
+ _MSGTABLE CLASS 'MCODE' PRELOAD NONDISCARDABLE IOPL
+ _MSGDATA CLASS 'MCODE' PRELOAD NONDISCARDABLE IOPL
+ _IMSGTABLE CLASS 'MCODE' PRELOAD DISCARDABLE IOPL
+ _IMSGDATA CLASS 'MCODE' PRELOAD DISCARDABLE IOPL
+ _DBOSTART CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING
+ _DBOCODE CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING
+ _DBODATA CLASS 'DBOCODE' PRELOAD NONDISCARDABLE CONFORMING
+ _16ICODE CLASS '16ICODE' PRELOAD DISCARDABLE
+ _RCODE CLASS 'RCODE'
+EXPORTS
+ EPPFLEX_DDB @1
diff --git a/w9xdrv/eppflex.h b/w9xdrv/eppflex.h
new file mode 100644
index 0000000..fcd47ab
--- /dev/null
+++ b/w9xdrv/eppflex.h
@@ -0,0 +1,49 @@
+
+#ifndef CTL_CODE
+#define CTL_CODE(DeviceType,Function,Method,Access) (((DeviceType)<<16)|((Access)<<14)|((Function)<<2)|(Method))
+#endif
+
+#ifndef METHOD_BUFFERED
+#define METHOD_BUFFERED 0
+#define METHOD_IN_DIRECT 1
+#define METHOD_OUT_DIRECT 2
+#define METHOD_NEITHER 3
+#endif
+
+#ifndef FILE_ANY_ACCESS
+#define FILE_ANY_ACCESS 0
+#define FILE_READ_ACCESS (0x0001)
+#define FILE_WRITE_ACCESS (0x0002)
+#endif
+
+
+#define FILE_DEVICE_EPPFLEX 0x80aa
+
+struct eppflex_rwdata {
+ unsigned char data;
+ unsigned char mask;
+};
+
+#define IOCTL_EPPFLEX_READ_DATA CTL_CODE(FILE_DEVICE_EPPFLEX, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_DATA CTL_CODE(FILE_DEVICE_EPPFLEX, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_STATUS CTL_CODE(FILE_DEVICE_EPPFLEX, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_STATUS CTL_CODE(FILE_DEVICE_EPPFLEX, 3, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_CONTROL CTL_CODE(FILE_DEVICE_EPPFLEX, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_CONTROL CTL_CODE(FILE_DEVICE_EPPFLEX, 5, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_FROB_CONTROL CTL_CODE(FILE_DEVICE_EPPFLEX, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_ECONTROL CTL_CODE(FILE_DEVICE_EPPFLEX, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_ECONTROL CTL_CODE(FILE_DEVICE_EPPFLEX, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_FROB_ECONTROL CTL_CODE(FILE_DEVICE_EPPFLEX, 9, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_CONFIGA CTL_CODE(FILE_DEVICE_EPPFLEX, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_CONFIGA CTL_CODE(FILE_DEVICE_EPPFLEX, 11, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_CONFIGB CTL_CODE(FILE_DEVICE_EPPFLEX, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_CONFIGB CTL_CODE(FILE_DEVICE_EPPFLEX, 13, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_EPPADDR CTL_CODE(FILE_DEVICE_EPPFLEX, 14, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_EPPADDR CTL_CODE(FILE_DEVICE_EPPFLEX, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_READ_EPPDATA CTL_CODE(FILE_DEVICE_EPPFLEX, 16, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_WRITE_EPPDATA CTL_CODE(FILE_DEVICE_EPPFLEX, 17, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+/* only W9x */
+#define IOCTL_EPPFLEX_ACQUIREPORT CTL_CODE(FILE_DEVICE_EPPFLEX, 64, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_EPPFLEX_RELEASEPORT CTL_CODE(FILE_DEVICE_EPPFLEX, 65, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
diff --git a/w9xdrv/eppflex.rc b/w9xdrv/eppflex.rc
new file mode 100644
index 0000000..af45d2e
--- /dev/null
+++ b/w9xdrv/eppflex.rc
@@ -0,0 +1,38 @@
+#include <windows.h>
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 1,0,0,1
+ PRODUCTVERSION 1,0,0,1
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x40004L
+ FILETYPE 0x0L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904b0"
+ BEGIN
+ VALUE "Comments", "\0"
+ VALUE "CompanyName", "Baycom Hard- und Software GmbH\0"
+ VALUE "FileDescription", "eppflex\0"
+ VALUE "FileVersion", "1, 0, 0, 1\0"
+ VALUE "InternalName", "Baycom EPPFLEX FlexNet kernel driver\0"
+ VALUE "LegalCopyright", "Copyright � 2000\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "eppflex.vxd\0"
+ VALUE "PrivateBuild", "\0"
+ VALUE "ProductName", "EPPFLEX\0"
+ VALUE "ProductVersion", "1.00a\0"
+ VALUE "SpecialBuild", "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x409, 1200
+ END
+END
diff --git a/w9xdrv/eppflex.vxd b/w9xdrv/eppflex.vxd
new file mode 100644
index 0000000..9e8d685
Binary files /dev/null and b/w9xdrv/eppflex.vxd differ
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-hamradio/baycomepp.git
More information about the pkg-hamradio-commits
mailing list