Christian Grothoff 19 tahun lalu
melakukan
b82c480226
91 mengubah file dengan 23458 tambahan dan 0 penghapusan
  1. 27 0
      AUTHORS
  2. 506 0
      COPYING
  3. 7 0
      COPYRIGHT
  4. 245 0
      ChangeLog
  5. 229 0
      INSTALL
  6. 3 0
      Makefile.am
  7. 1 0
      NEWS
  8. 7 0
      README
  9. 51 0
      TODO
  10. 1500 0
      config.guess
  11. 1608 0
      config.sub
  12. 36 0
      configure.ac
  13. 277 0
      contrib/Win32/dirent.c
  14. 56 0
      contrib/Win32/dirent.h
  15. 57 0
      contrib/Win32/flock.c
  16. 31 0
      contrib/Win32/flock.h
  17. 13 0
      contrib/Win32/help/help.cfg
  18. 157 0
      contrib/Win32/help/help.dsp
  19. TEMPAT SAMPAH
      contrib/Win32/help/help.ico
  20. 72 0
      contrib/Win32/help/help.rc
  21. 469 0
      contrib/Win32/help/mime.types
  22. 16 0
      contrib/Win32/help/resource.h
  23. 237 0
      contrib/Win32/libwebserver.dsp
  24. 44 0
      contrib/Win32/libwebserver.dsw
  25. 9 0
      contrib/help/engine.h
  26. 605 0
      contrib/help/examples.h
  27. 800 0
      contrib/help/functions.h
  28. 421 0
      contrib/help/help.c
  29. 13 0
      contrib/help/help.cfg
  30. 87 0
      contrib/help/info.h
  31. 4 0
      contrib/help/makeheader.bat
  32. 469 0
      contrib/help/mime.types
  33. 143 0
      contrib/help/security.h
  34. 4 0
      contrib/tools/checkpid
  35. 41 0
      contrib/tools/data2header.c
  36. 195 0
      contrib/tools/httptest.pl
  37. 1 0
      contrib/tools/myvc_install.bat
  38. 2 0
      contrib/tools/win2unix.sh
  39. 445 0
      doc/examples.html
  40. 24 0
      doc/examples/SoundRecorder/include/debug.h
  41. 39 0
      doc/examples/SoundRecorder/include/soundbuffers.h
  42. 31 0
      doc/examples/SoundRecorder/include/soundcard.h
  43. 23 0
      doc/examples/SoundRecorder/include/soundmixer.h
  44. 296 0
      doc/examples/SoundRecorder/src/main.c
  45. 86 0
      doc/examples/SoundRecorder/src/soundbuffers.c
  46. 49 0
      doc/examples/SoundRecorder/src/soundcard.c
  47. 104 0
      doc/examples/SoundRecorder/src/soundmixer.c
  48. 156 0
      doc/examples/cgi-bin/index.cgi
  49. 14 0
      doc/examples/cgi-bin/simple.cgi
  50. 125 0
      doc/examples/cgi-bin/simple1.cgi
  51. 100 0
      doc/examples/cgi.c
  52. 66 0
      doc/examples/demo.c
  53. 86 0
      doc/examples/foo-cert.pem
  54. 236 0
      doc/examples/packetmounter.c
  55. 355 0
      doc/functions.html
  56. 25 0
      doc/info.html
  57. 67 0
      doc/security.html
  58. 7 0
      include/Makefile.am
  59. 0 0
      include/webserver_gnunet.h
  60. 6871 0
      ltmain.sh
  61. 26 0
      src/Makefile.am
  62. 1190 0
      src/client.c
  63. 159 0
      src/client.h
  64. 1124 0
      src/clientinfo.c
  65. 118 0
      src/clientinfo.h
  66. 133 0
      src/config.h
  67. 29 0
      src/debug.h
  68. 34 0
      src/error.c
  69. 33 0
      src/error.h
  70. 195 0
      src/fnmatch.c
  71. 59 0
      src/fnmatch.h
  72. 96 0
      src/gethandler.c
  73. 60 0
      src/gethandler.h
  74. 396 0
      src/logo.h
  75. 155 0
      src/memory.c
  76. 46 0
      src/memory.h
  77. 22 0
      src/module.c
  78. 25 0
      src/module.h
  79. 587 0
      src/outgif.c
  80. 63 0
      src/outgif.h
  81. 122 0
      src/outstream.c
  82. 53 0
      src/outstream.h
  83. 448 0
      src/server.c
  84. 86 0
      src/server.h
  85. 74 0
      src/socket.c
  86. 51 0
      src/socket.h
  87. 155 0
      src/utils.c
  88. 59 0
      src/utils.h
  89. 129 0
      src/web_server.h
  90. 43 0
      src/weblog.c
  91. 40 0
      src/weblog.h

+ 27 - 0
AUTHORS

@@ -0,0 +1,27 @@
+Luis Figueiredo ([email protected])
+	Main Programmer, designer
+
+Christian Grothoff ([email protected])
+	Adaptation for GNUnet (work in progress)
+
+People who contributed:
+	João Luis Marques ([email protected])
+		minor bug reported (redirectors, stdout)
+	'oddsock' ([email protected]) 
+		Licensing tip, and minor bug reported (segv in querystring)
+	Rocco Carbone ([email protected]) 
+		Return code for web_server_run tip
+	Johannes E. Schindelin ([email protected]) 
+		Spell checking, Makefile portability, and security 'How do I create my own certificate?'
+		bugfixes, examples hello world!
+	Richard Offer ([email protected])
+		checkboxes, (multiple variables) tip
+	Sven Anders ([email protected]) 
+		new web_client_setcookie()
+	Hilobok Andrew ([email protected])
+		FreeBSD portability
+
+#linuxhelp @ ptnet.org 
+
+Rui - to let me know the existence of strftime (yeah i didn't knew)
+João Luis Marques Pinto - a problem with redirection (stdout & exit());

+ 506 - 0
COPYING

@@ -0,0 +1,506 @@
+		  GNU LESSER GENERAL PUBLIC LICENSE
+		       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+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 and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+		  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, 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 library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete 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 distribute a copy of this License along with the
+Library.
+
+  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 Library or any portion
+of it, thus forming a work based on the Library, 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) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+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 Library, 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 Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you 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.
+
+  If distribution of 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 satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be 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.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library 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.
+
+  9. 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 Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+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 with
+this License.
+
+  11. 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 Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library 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 Library.
+
+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.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library 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.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser 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 Library
+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 Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+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
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "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
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. 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 LIBRARY 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
+LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  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 library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 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
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser 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
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+
+
+
+

+ 7 - 0
COPYRIGHT

@@ -0,0 +1,7 @@
+Copyright 2002, 2003 Luis Figueiredo. All rights reserved
+
+See the LICENSE file
+
+The origin of this software must not be misrepresented, either by
+explicit claim or by omission.  Since few users ever read sources,
+credits must appear in the documentation.

+ 245 - 0
ChangeLog

@@ -0,0 +1,245 @@
+Fri Aug 18 15:21:30 PDT 2006
+	Starting to adopt the code to the GNUnet build system.
+	Applied patch to allow for shutdown.
+
+0.5.3
+	Wen Apr 28 14:52:43 GMT 2004
+		Luis Figueiredo -- Long time no see, i've decided to check one mail dated from released version 0.5.2, was about cookies
+						    it seems that was no problem to me, but i made a minor changes anyway
+							void web_client_setcookie(char *name, char *value, char *timeoutf, char *path, char *domain, int secure)
+							path and domain, can be called as "" for disable, instead of previous only, NULL that disables the domain and path
+	Tue Jan 13 18:43:11 GMT 2004
+		Luis Figueiredo -- I've put a prefix in each internal function "__ILWS_"
+
+	Wen Oct 22 18:38:52 GMT 2003
+		Luis Figueiredo -- Applied some changes reported by (freebsd port): Hilobok Andrew ([email protected]), added Last-Modified on lws_list(); improved file handling
+
+	Thu Sep 25 13:11:21 GMT 2003
+		Luis Figueiredo -- Minor change the ClientInfo->request also gives the '/' (for lws_list)
+
+	Wen Sep 24 23:02:51 GMT 2003
+		Luis Figueiredo -- Corrected some code (for portability) reported by Hilobok Andrew ([email protected])
+0.5.2
+	Thu Sep 18 21:33:05 GMT 2003
+		Luis Figueiredo -- Changed function set_EGApalette to web_client_gifsetpalette("filename.act oe "EGA");, and web_client_outputgif to web_client_gifoutput
+		                   (sorry for usual users of web_client_gif* :P)
+
+	Sun Sep 14 22:29:02 GMT 2003
+		Luis Figueiredo -- new functions added (web_server_aliasdir, web_server_useMIMEfile, web_client_contenttype);
+
+0.5.1
+	Wen Sep 10 17:56:14 GMT 2003
+		Luis Figueiredo -- Code clean up, new error system!
+
+	Sex Sep 05 19:12:14 GMT 2003
+		Luis Figueiredo -- improved the function tmpfname, added documentation to section security
+
+	Sex Sep 05 06:16:01 GMT 2003
+		Luis Figueiredo -- i have lie down late, lately :o), well add_oustream prototipe changed to handle flock (filelock)
+						to avoid race condition on temorary files, added the util funtion for winnt flock
+						
+						-- changed way to log "stetic?"
+
+						-- calculate and outputs Content-rage and Content-length if the get handler has the WS_USELEN turned on
+						
+	Wen Sep 03 05:57:11 GMT 2003
+		Luis Figueiredo -- one day after (almost literaly), corrected something in ClientInfo->Cookie(), 
+						And an new feature to web_client_setcookie, this function can now be called after end of headers.
+			
+	Tue Sep 02 05:28:11 GMT 2003
+		Luis Figueiredo -- oh my!, nice hour for coding, finished 206 (partial content) resuming (Content-range:)
+
+	Mon Sep 01 19:35:32 GMT 2003
+		Luis Figueiredo -- now output header : "Content-length:"
+	
+	Mon Sep 01 06:22:21 GMT 2003
+		Luis Figueiredo -- read_client optimized for speed (select removed, non_block sockets only)
+
+	Sex Aug 29 16:07:15 GMT 2003
+		Luis Figueiredo -- Corrected a bug on output_client() (writetemp) if the lib doesn't output (EAGAIN) the function
+		                was returning, and retry using local variable writetemp (reading new data), now fseeks to last data written
+
+	Fri Aug 22 15:20:31 GMT 2003
+		Luis Figueiredo -- removed engine.h from help server (read the source if you want to know how it works), some changes in web_server_getconf!
+
+	Thu Aug 15 16:59:04 GMT 2003
+		Luis Figueiredo -- New functions and flag, flag is WS_DYNVAR (handler), to use dynamic variables on data ouput
+						web_client_setvar, web_client_delvar , web_client_getvar, exchanges "$variable;" into 'variable' value 
+						previous defined with web_client_setvar("variable","something");
+
+0.5.0
+
+	Wen Jul 30 03:45:28 GMT 2003
+		Luis Figueiredo -- IE 5.0 was confusing me with no \r\n\r\n after post data, i solved the problem using content-length value
+		                changed errno (on output_client) to WSAGetLastError() on windows (#ifdef WIN32)
+
+	Fri Jul 25 06:10:03 GMT 2003
+		Luis Figueiredo -- Work around outgif.c, to support transparency
+	
+	Wen Jul 21 20:13:12 GMT 2003
+		Luis Figueiredo -- Added set_gifEGApalette(), and global var GLOBALGIFPAL for web_client_outputgif();
+
+	Tue Jul 15 15:31:10 GMT 2003
+		Luis Figueiredo -- Start develop the config file, added some new elements to struct server, Added a ClientInfo->Conf( to get entries from config file )
+
+    Thu Apr 10 14:11:31 GMT 2003
+		Luis Figueiredo -- Some changes on web_client_setcookie() made by Sven Anders <[email protected]> applied
+	
+	Thu Apr 10 14:11:34 GMT 2003
+		Luis Figueiredo -- Some bugfixes reported by (http://www.stanford.edu/~engler) Ken Ashcraft <[email protected]>
+
+0.4.1
+
+	Thu Mar 20 14:35:23 GMT 2003
+		Luis Figueiredo -- Fuck war! :o), minor Changes in help server
+
+	Wen Mar 19 21:46:32 GMT 2003
+		Luis Figueiredo -- new features for checkbox (or multiple variables) ClientInfo->Query("#xpto") returns the number of references to xpto
+						   ClientInfo->Query("xpto") gives one value and fetches to another; if "#xpto" is bigger than one, "xpto" called twice will be diferent
+
+	Fri Mar 07 11:29:12 GMT 2003
+		Luis Figueiredo -- Added the extern "C" {} to web_server.h
+
+0.4.0   // new features and fixes (new version)
+
+	Wen Feb 12 16:23:13 GMT 2003
+		Luis Figueiredo -- Added Cookie example, and Johannes E. Schindelin entered on project (officialy)
+
+	Mon Feb 09 17:24:45 GMT 2003
+		Luis Figueiredo -- web_client_setcookie(); done, Changed ClientInfo->Header(),Post(),Query(); when is called with
+						NULL argument, this function returns whole client header;
+						Added ClientInfo->Cookie();
+
+	Wen Feb 05 22:12:03 GMT 2003
+		Luis Figueiredo -- Start to develop web_client_setcookie();
+
+	Fri Jan 31 05:24:31 GMT 2003
+		Johannes E. Schindelin (patch) -- More spell checking (even in the code, heh!) client.h, client.c, examples.html functions.html info.html security.html
+			                           He also added an example (hello_world)
+									   bugfix on clientinfo.c: post data and query data!
+	Sun Jan 26 21:22:34 GMT 2003
+		Luis Figueiredo -- Change the order of ChangeLog (this file) (was last version on Bottom)
+
+	Thu Jan 23 17:10:11 GMT 2003
+		Luis Figueiredo -- Patch from Johannes E. Schindelin, spell checking and make file portabilitie
+
+0.3.5
+	
+	Mon Jan 20 01:43:45 GMT 2003
+		Luis Figueiredo -- Changed the return codes from web_server_run() (Rocco Carbone [[email protected]] ideia), and some minor fix's on socket.c
+
+	Sat Jan 18 18:31:23 GMT 2003
+		Luis Figueiredo -- Corrected a querystring parser error(thanks 'oddsock')
+
+0.3.4
+
+	Fri Dec 27 20:01:04 GMT 2002
+		Luis Figueiredo -- using closesocket (when deleting client) on WIN32, when client lost the connection the stat is (5) (5 delete client)
+
+	Thu Dec 26 23:16:21 GMT 2002
+		Luis Figueiredo -- (outstream.[ch]) Added an argument to add_outstream (char *fname); since the lib have a problem with atributing to stdout (*stdout=*nfile),
+						changed the tmpfile(), to 'tmpnam' (tmpfname) and use freopen; (unlinking fname when deleting outstreams)
+0.3.3
+
+	Wen Nov 27 18:16:34 GMT 2002
+		Luis Figueiredo -- Produces output files to projectroot/bin
+
+	Wen Nov 27 00:24:31 GMT 2002
+		Luis Figueiredo -- Built strncasecmp function (Win32 doesn't have) for using in strcasestr (MultiPart in clientinfo)
+
+	Mon Nov 25 16:16:23 GMT 2002
+		Luis Figueiredo -- Help html's converted into header files, help server, doesn't need external files now, help.html directory moved to project root
+
+	Fri Nov 22 17:45:34 GMT 2002
+		Luis Figueiredo -- Win32 project files and help server updated
+	
+	Sat Nov 16 21:22:13 GMT 2002
+		Luis Figueiredo -- Example SoundRecorder w/ new features
+
+	Fri Nov 15 20:38:48 GMT 2002
+		Luis Figueiredo -- Mem checker added (case of low mem)
+
+0.3.2
+
+	Fri Nov 15 11:11:50 GMT 2002
+		Luis Figueiredo -- Added a new example (SoundRecorder)
+
+	Fri Nov 15 00:37:44 GMT 2002
+		Luis Figueiredo -- Created make install
+
+	Thu Nov 14 19:45:47 GMT 2002
+		Luis Figueiredo -- Changed client.c (now outputs 400 invalid request)
+
+	Wed Nov 13 23:39:46 GMT 2002
+		Luis Figueiredo -- added a feature, (web_client_outputgif) using xvgifwr.c (from xv 3.10a)
+				module is callod outgif.c
+	
+	Wed Nov 13 04:27:12 GMT 2002
+		Luis Figueiredo -- Added a debug program (.pl) http butcher
+
+	Wed Nov 13 04:06:48 GMT 2002
+		Luis Figueiredo -- Fixed up a minor bug on client read data, make rule dist (to create package on makefile), removed Hdrdate to new mydate (using strftime)
+				discard hextoi to using strtol(str,NULL,16)
+0.3.1
+
+	Sun Nov 10 21:05:40 GMT 2002
+		Luis Figueiredo -- Code cleanup, removed useless functions, developing documentation
+
+	Sun Nov 10 12:08:02 GMT 2002
+		Luis Figueiredo -- Changed regex to fnmatch once again (regex was giving problems w/ portability, and fnmatch is easier to use for
+				newbies)
+
+
+	Thu Nov  7 20:05:48 GMT 2002
+		Luis Figueiredo -- create module (utils.c) for base64decode, hextoi, strcasestr, Add documentation to example
+
+
+	Wed Nov  6 16:12:22 GMT 2002
+		Luis Figueiredo -- Changed again way of determine that the client sent all data, it checks about 5 times if doesn't have new data,
+						then marks all data readed, ClientInfo upload files (MultiPart) done, wow, new logo, 
+						supports (enctype='Multipart/form-data') (tested in lynx and netscape and IE)
+
+	Thu Oct 31 18:11:28 GMT 2002
+		Luis Figueiredo -- Optimized functions Post,Header,Query // now holds the already queryied into a list, when it requests again
+						lib doesn't process request gives the saved data: ex:
+						if(ClientInfo->Query("queryval")) { // query val doesn't exists in list add
+							blah=atoi(ClientInfo->Query("queryval")); // return previous saved val that's on the list
+						};
+						better for memory and speed optimizations
+
+0.3.0 and previous 
+
+	Wed Oct 30 22:54:37 GMT 2002
+		Luis Figueiredo -- Changed way of determine that the client sent all data 
+						before:
+							if there is no more data then search \r\n\r\n in the hole data readed // wrong, multipart/form-data was not doing right now
+						now:
+							if there is no more data then if the last two bytes is \r\n then mark all readed and process // i think that need improvments
+
+	Mon Oct 14 20:20:05 GMT 2002
+		Luis Figueiredo -- An example of a cgi handler was made, added the Date: header to server header
+
+	Mon Oct  7 16:56:15 GMT 2002
+		Luis Figueiredo -- Repaired some safe bugs, Added vars to stats proposes, inserted an liblogo, added debug instructions
+
+	Wed Apr 10 20:02:55 GMT 2002
+		Luis Figueiredo -- Make use of autoconf , removed open_memstream (doesn't work well w/ stdout structure on netbsd portability)
+						linux slack 7.1 uses "extern FILE *stdout", netbsd uses "extern FILE __sF[]" so i cannot make use of pointers
+
+	Mon Apr  8 15:04:31 GMT 2002
+		Luis Figueiredo -- Oh my.. kurt cobain is dead :o), restructured the code, separated into various files                                                                 
+
+	Wed Mar 27 18:59:10 GMT 2002
+		Luis Figueiredo -- using regex instead of fnmatch(fnmatch only appears becouse of apache, i didn't knew it)
+
+	Mon Mar 25 14:46:13 GMT 2002
+		Luis Figueiredo -- wow, one month later..., discard web_server_addstr, and now process the stdout to server
+						using a tmpfile for streaming (not so good, but :o))
+
+	Mon Feb 25 06:27:58 GMT 2002
+		Luis Figueiredo -- Many corrections and new functions were added, until today
+
+	Fri Dec 28 12:51:11 GMT 2001
+		Luis Figueiredo -- I Corrected the input to handle only data when \n\r(twice) is arrived
+
+

+ 229 - 0
INSTALL

@@ -0,0 +1,229 @@
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software
+Foundation, Inc.
+
+   This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+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, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+   It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring.  (Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.)
+
+   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 you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+   The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'.  You only need
+`configure.ac' 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.  Run `./configure --help'
+for details on some of the pertinent environment variables.
+
+   You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment.  Here
+is an example:
+
+     ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
+
+   *Note Defining Variables::, for more details.
+
+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 support 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' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on.  Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+`--build=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+     CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+     OS KERNEL-OS
+
+   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 machine type.
+
+   If you are _building_ compiler tools for cross-compiling, you should
+use the `--target=TYPE' option to select the type of system they will
+produce code for.
+
+   If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+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.
+
+Defining Variables
+==================
+
+   Variables not defined in a site shell script can be set in the
+environment passed to `configure'.  However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost.  In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'.  For example:
+
+     ./configure CC=/usr/local2/bin/gcc
+
+will cause the specified gcc to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+`configure' Invocation
+======================
+
+   `configure' recognizes the following options to control how it
+operates.
+
+`--help'
+`-h'
+     Print a summary of the options to `configure', and exit.
+
+`--version'
+`-V'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`--cache-file=FILE'
+     Enable the cache: use and save the results of the tests in FILE,
+     traditionally `config.cache'.  FILE defaults to `/dev/null' to
+     disable caching.
+
+`--config-cache'
+`-C'
+     Alias for `--cache-file=config.cache'.
+
+`--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.
+
+`configure' also accepts some other, not widely useful, options.  Run
+`configure --help' for more details.
+

+ 3 - 0
Makefile.am

@@ -0,0 +1,3 @@
+SUBDIRS = include src
+
+

+ 1 - 0
NEWS

@@ -0,0 +1 @@
+See ChangeLog.

+ 7 - 0
README

@@ -0,0 +1,7 @@
+This is an adaptation of libwebserver for GNUnet.
+
+Non-essential code from old libwebserver library
+was moved to contrib/, documentation was moved
+to doc/.  
+
+The build system was changed to use automake.

+ 51 - 0
TODO

@@ -0,0 +1,51 @@
+
+
+
+
+
+
+try to make just makefile for win instead of project file
+
+check for integer overflow
+do a webserver stresser
+
+
+
+
+CORRECT: netbsd dont free's the memory (linux's free) // i don't know why!
+
+
+DONE: WS_USECONF is completed just make test and turn it better
+DONE: WS_DYNVAR ( for using web_client_setvar("color","#FFFFFF")), printf("<BODY bgcolor='$color;>"); ) usefull for web_client_addfile();) <- DONE
+DONE: there is some mem buffer that is not freeing on logfile example something related to web_client_addfile (corrected)
+DONE: upload is missing somethind debug ok, but release is crashing (was related to writetemp[WRITEMAX+1])
+DONE: faster way to upload and download! remove newdata ( is delaying operation) 
+DONE: content-range header (for resuming)
+DONE: logging (put it on process_client)
+DONE: Find a better way to manage "tmpfname" (using flocks)
+DONE: make web_client_setcookie works called in whatever where in the handle function, (keep on an database maybe as varlist);
+DONE: remove wrotesize and varsize from client to outstream
+DONE: The war beguns, and i'm coding :o), reduce error mensaging to one file (reduce static mem space);
+DONE: similar: maybe make the web_server_MIMEfile(server,"const char *");, to next do the web_server_adddir(server,"/home/users/www",WS_LISTING);
+
+MAYBE DONE: Well something wrong about downloading several imgs, sometimes apears the 'X' image! figure why (requires intensive tests)
+DONE: lib isn't close files well, probably is that becouse the Ximage
+DONE: do the freebsd port by Hilobok Andrew ([email protected])
+DONE: URGENT: Change names of internal functions, we don't want conflits with other ppl functions (such as already defined symbols)
+
+
+TODO: The flag WS_USECGI, act as a cgi using env instead ClientInfo
+TODO: better to do is web_server_addcgi("* /*",execfile.exe,0);
+
+
+TODO: make the web_client_addurl function (web_client_addurl("http://127.0.0.1"); as web_client_addfile("path/to/file");)
+TODO: WS_USEMOD (modulated system to use) /(maybe need WS_USECONF, for describe modules)
+
+
+IMPROVE: Find a way to manage dll (stdout,stdin,etc)	 
+IMPROVE: WS_DYNVAR
+
+
+
+
+

+ 1500 - 0
config.guess

@@ -0,0 +1,1500 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
+#   Inc.
+
+timestamp='2006-07-02'
+
+# 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., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, 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.
+
+
+# Originally written by Per Bothner <[email protected]>.
+# Please send patches to <[email protected]>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# 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 build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <[email protected]>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+	for c in cc gcc c89 c99 ; do
+	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# ([email protected] 1994-08-24)
+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
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	case "${UNAME_MACHINE_ARCH}" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE_ARCH}" in
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep __ELF__ >/dev/null
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+	        os=netbsd
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "${UNAME_VERSION}" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit ;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit ;;
+    *:SolidBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    alpha:OSF1:*:*)
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE="alphaev5" ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE="alphaev56" ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE="alphapca56" ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE="alphapca57" ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE="alphaev6" ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE="alphaev67" ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE="alphaev69" ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE="alphaev7" ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE="alphaev79" ;;
+	esac
+	# A Pn.n version is a patched version.
+	# 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.
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	exit ;;
+    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 ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-morphos
+	exit ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+        echo powerpc-ibm-os400
+	exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit ;;
+    arm:riscos:*:*|arm:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# [email protected] (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 ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7; exit ;;
+	esac ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    i86pc:SunOS:5.*:*)
+	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    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 ;;
+    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 ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /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 ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit ;;
+    # 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 ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+        exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	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 -o $dummy $dummy.c &&
+	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit ;;
+    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 ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit ;;
+    ????????: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 ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		eval $set_cc_for_build
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
+	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 ;;
+    *:AIX:*:[45])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${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=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+                        esac ;;
+                    esac
+		fi
+		if [ "${HP_ARCH}" = "" ]; then
+		    eval $set_cc_for_build
+		    sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #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 -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ ${HP_ARCH} = "hppa2.0w" ]
+	then
+	    eval $set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep __LP64__ >/dev/null
+	    then
+		HP_ARCH="hppa2.0w"
+	    else
+		HP_ARCH="hppa64"
+	    fi
+	fi
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit ;;
+    3050*:HI-UX:*:*)
+	eval $set_cc_for_build
+	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 -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	echo unknown-hitachi-hiuxwe2
+	exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+        exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+        exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+        exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+        exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+        exit ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    *:UNICOS/mp:*:*)
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit ;;
+    5000:UNIX_System_V:4.*:*)
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:FreeBSD:*:*)
+	case ${UNAME_MACHINE} in
+	    pc98)
+		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    amd64)
+		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    *)
+		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	esac
+	exit ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit ;;
+    i*:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit ;;
+    i*:windows32*:*)
+    	# uname -m includes "-pc" on this system.
+    	echo ${UNAME_MACHINE}-mingw32
+	exit ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit ;;
+    x86:Interix*:[3456]*)
+	echo i586-pc-interix${UNAME_RELEASE}
+	exit ;;
+    EM64T:Interix*:[3456]*)
+	echo x86_64-unknown-interix${UNAME_RELEASE}
+	exit ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+	echo i${UNAME_MACHINE}-pc-mks
+	exit ;;
+    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 i586-pc-interix
+	exit ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	exit ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit ;;
+    arm*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    avr32*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    cris:Linux:*:*)
+	echo cris-axis-linux-gnu
+	exit ;;
+    crisv32:Linux:*:*)
+	echo crisv32-axis-linux-gnu
+	exit ;;
+    frv:Linux:*:*)
+    	echo frv-unknown-linux-gnu
+	exit ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    mips:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef mips
+	#undef mipsel
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=mipsel
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=mips
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^CPU/{
+		s: ::g
+		p
+	    }'`"
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef mips64
+	#undef mips64el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=mips64el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=mips64
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^CPU/{
+		s: ::g
+		p
+	    }'`"
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    or32:Linux:*:*)
+	echo or32-unknown-linux-gnu
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-gnu
+	exit ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+        esac
+	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit ;;
+    sh64*:Linux:*:*)
+    	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    vax:Linux:*:*)
+	echo ${UNAME_MACHINE}-dec-linux-gnu
+	exit ;;
+    x86_64:Linux:*:*)
+	echo x86_64-unknown-linux-gnu
+	exit ;;
+    i*86: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.
+	# Set LC_ALL=C to ensure ld outputs messages in English.
+	ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+			 | sed -ne '/supported targets:/!d
+				    s/[ 	][ 	]*/ /g
+				    s/.*supported targets: *//
+				    s/ .*//
+				    p'`
+        case "$ld_supported_targets" in
+	  elf32-i386)
+		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+		;;
+	  a.out-i386-linux)
+		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+		exit ;;
+	  coff-i386)
+		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+		exit ;;
+	  "")
+		# Either a pre-BFD a.out linker (linux-gnuoldld) or
+		# one that does not give us useful --help.
+		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+		exit ;;
+	esac
+	# Determine whether the default compiler is a.out or elf
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <features.h>
+	#ifdef __ELF__
+	# ifdef __GLIBC__
+	#  if __GLIBC__ >= 2
+	LIBC=gnu
+	#  else
+	LIBC=gnulibc1
+	#  endif
+	# else
+	LIBC=gnulibc1
+	# endif
+	#else
+	#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+	LIBC=gnu
+	#else
+	LIBC=gnuaout
+	#endif
+	#endif
+	#ifdef __dietlibc__
+	LIBC=dietlibc
+	#endif
+EOF
+	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+	    /^LIBC/{
+		s: ::g
+		p
+	    }'`"
+	test x"${LIBC}" != x && {
+		echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+		exit
+	}
+	test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
+	;;
+    i*86:DYNIX/ptx:4*:*)
+	# 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.
+	echo i386-sequent-sysv4
+	exit ;;
+    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 ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit ;;
+    i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit ;;
+    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 ;;
+    i*86:*:5:[678]*)
+    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit ;;
+    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|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+        # 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 ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit ;;
+    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 ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*: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; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && { echo i486-ncr-sysv4; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    *: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 ;;
+    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                      # says <[email protected]>
+        echo i586-unisys-sysv4
+        exit ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <[email protected]>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit ;;
+    *:*:*:FTX*)
+	# From [email protected].
+	echo i860-stratus-sysv4
+	exit ;;
+    i*86:VOS:*:*)
+	# From [email protected].
+	echo ${UNAME_MACHINE}-stratus-vos
+	exit ;;
+    *:VOS:*:*)
+	# From [email protected].
+	echo hppa1.1-stratus-vos
+	exit ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit ;;
+    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 ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux${UNAME_RELEASE}
+	exit ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	case $UNAME_PROCESSOR in
+	    unknown) UNAME_PROCESSOR=powerpc ;;
+	esac
+	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+	exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = "x86"; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+	exit ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit ;;
+    NSE-?:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit ;;
+    SEI:*:*:SEIUX)
+        echo mips-sei-seiux${UNAME_RELEASE}
+	exit ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    *:*VMS:*:*)
+    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	exit ;;
+    i*86:rdos:*:*)
+	echo ${UNAME_MACHINE}-pc-rdos
+	exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+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\n"); 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)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# 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 -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+	{ echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# 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 ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    c34*)
+	echo c34-convex-bsd
+	exit ;;
+    c38*)
+	echo c38-convex-bsd
+	exit ;;
+    c4*)
+	echo c4-convex-bsd
+	exit ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
+and
+  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <[email protected]> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:

+ 1608 - 0
config.sub

@@ -0,0 +1,1608 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
+#   Inc.
+
+timestamp='2006-07-02'
+
+# 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., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, 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.
+
+
+# Please send patches to <[email protected]>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# 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.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <[email protected]>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+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
+  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
+  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    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 | -axis | -knuth | -cray)
+		os=
+		basic_machine=$1
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+ 	-chorusrdb)
+ 		os=-chorusrdb
+		basic_machine=$1
+ 		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-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/'`
+		;;
+	-sco5v6*)
+		# 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.
+	1750a | 580 \
+	| a29k \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+	| bfin \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+	| maxq | mb | microblaze | mcore \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64vr | mips64vrel \
+	| mips64orion | mips64orionel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| mt \
+	| msp430 \
+	| nios | nios2 \
+	| ns16k | ns32k \
+	| or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+	| pyramid \
+	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+	| spu | strongarm \
+	| tahoe | thumb | tic4x | tic80 | tron \
+	| v850 | v850e \
+	| we32k \
+	| x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
+	| z8k)
+		basic_machine=$basic_machine-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12)
+		# Motorola 68HC11/12.
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
+
+	# 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*86 | x86_64)
+	  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.
+	580-* \
+	| a29k-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* | avr32-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+	| clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| m32c-* | m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
+	| msp430-* \
+	| nios-* | nios2-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+	| pyramid-* \
+	| romp-* | rs6000-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
+	| tahoe-* | thumb-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tron-* \
+	| v850-* | v850e-* | vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
+	| xstormy16-* | xtensa-* \
+	| ymp-* \
+	| z8k-*)
+		;;
+	# 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
+		;;
+    	abacus)
+		basic_machine=abacus-unknown
+		;;
+	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
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		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
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	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 | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16c)
+		basic_machine=cr16c-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	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
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	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*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*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
+		;;
+	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
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	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
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	ms1-*)
+		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+		;;
+	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
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	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
+		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-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/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rdos)
+		basic_machine=i386-pc
+		os=-rdos
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-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
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tic54x | c54x*)
+		basic_machine=tic54x-unknown
+		os=-coff
+		;;
+	tic55x | c55x*)
+		basic_machine=tic55x-unknown
+		os=-coff
+		;;
+	tic6x | c6x*)
+		basic_machine=tic6x-unknown
+		os=-coff
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	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
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	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
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+		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
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		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* | -knetbsd* | -mirbsd* | -netbsd* \
+	      | -openbsd* | -solidbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* \
+	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos* | -toppers*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-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
+		;;
+        -os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+        -tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-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[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-kaos*)
+		os=-kaos
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-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
+        spu-*)
+		os=-elf
+		;;
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+        c4x-* | tic4x-*)
+        	os=-coff
+		;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	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
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+    	*-knuth)
+		os=-mmixware
+		;;
+	*-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
+		;;
+	f30[01]-fujitsu | f700-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
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:

+ 36 - 0
configure.ac

@@ -0,0 +1,36 @@
+dnl Process this file with autoconf to produce a configure script.
+AC_INIT([libwebserver],[0.5.3-GNUnet],[[email protected]])
+AM_INIT_AUTOMAKE([libwebserver], [0.5.3-GNUnet])
+AC_CONFIG_HEADER([config.h])
+
+AC_PROG_CC
+AC_PROG_MAKE_SET
+AC_PROG_INSTALL
+AC_DISABLE_STATIC
+AC_PROG_LIBTOOL
+
+AC_HEADER_STDC
+AC_CHECK_HEADERS([arpa/inet.h fcntl.h limits.h netinet/in.h stddef.h stdlib.h string.h sys/socket.h sys/time.h unistd.h])
+
+# Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+AC_TYPE_SIZE_T
+AC_HEADER_TIME
+AC_STRUCT_TM
+
+# Checks for library functions.
+AC_FUNC_MEMCMP
+AC_TYPE_SIGNAL
+AC_FUNC_STRFTIME
+AC_FUNC_VPRINTF
+AC_CHECK_FUNCS([inet_ntoa memset select socket strchr strerror strncasecmp strstr strtol])
+
+AC_SUBST(INCLUDE)
+AC_SUBST(LIBDIR)
+AC_SUBST(LIBS)
+
+AC_CONFIG_FILES([Makefile 
+src/Makefile
+include/Makefile
+])
+AC_OUTPUT

+ 277 - 0
contrib/Win32/dirent.c

@@ -0,0 +1,277 @@
+/* 
+   dir.c for MS-DOS by Samuel Lam <[email protected]>, June/87 
+ */
+
+/* #ifdef WIN32 */
+/* 
+ * @(#)dir.c 1.4 87/11/06 Public Domain. 
+ * 
+ *  A public domain implementation of BSD directory routines for 
+ *  MS-DOS.  Written by Michael Rendell ({uunet,utai}michael@garfield), 
+ *  August 1897 
+ *  Ported to OS/2 by Kai Uwe Rommel 
+ *  December 1989, February 1990 
+ *  Ported to Windows NT 22 May 91 
+ *    other mods Summer '92 [email protected] 
+ *  opendirx() was horribly written, very inefficient, and did not take care
+ *    of all cases.  It is still not too clean, but it is far more efficient.
+ *    Changes made by Gordon Chaffee ([email protected])
+ */
+
+
+/*Includes: 
+ *    crt 
+ */
+#include <windows.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys\types.h>
+#include <sys\stat.h>
+#include "dirent.h"
+
+#define stat _stat
+
+/* 
+ *    NT specific 
+ */
+#include <stdio.h>
+
+/* 
+ *    random typedefs 
+ */
+#define HDIR        HANDLE
+#define HFILE       HANDLE
+#define PHFILE      PHANDLE
+
+/* 
+ *    local functions 
+ */
+static char *getdirent(char *);
+static void free_dircontents(struct _dircontents *);
+
+static HDIR FindHandle;
+static WIN32_FIND_DATA FileFindData;
+
+static struct dirent dp;
+
+DIR *opendirx(char *name, char *pattern)
+{
+    struct stat statb;
+    DIR *dirp;
+    char c;
+    char *s;
+    struct _dircontents *dp;
+    int len;
+    int unc;
+    char path[OFS_MAXPATHNAME];
+    register char *ip, *op;
+
+    for (ip = name, op = path;; op++, ip++) {
+	*op = *ip;
+	if (*ip == '\0') {
+	    break;
+	}
+    }
+    len = ip - name;
+    if (len > 0) {
+	unc = ((path[0] == '\\' || path[0] == '/') &&
+	       (path[1] == '\\' || path[1] == '/'));
+	c = path[len - 1];
+	if (unc) {
+	    if (c != '\\' && c != '/') {
+		path[len] = '/';
+		len++;
+		path[len] = '\0';
+	    }
+	} else {
+	    if ((c == '\\' || c == '/') && (len > 1)) {
+		len--;
+		path[len] = '\0';
+
+		if (path[len - 1] == ':') {
+		    path[len] = '/';
+		    len++;
+		    path[len] = '.';
+		    len++;
+		    path[len] = '\0';
+		}
+	    } else if (c == ':') {
+		path[len] = '.';
+		len++;
+		path[len] = '\0';
+	    }
+	}
+    } else {
+	unc = 0;
+	path[0] = '.';
+	path[1] = '\0';
+	len = 1;
+    }
+
+    if (stat(path, &statb) < 0 || (statb.st_mode & S_IFMT) != S_IFDIR) {
+	return NULL;
+    }
+    dirp = malloc(sizeof(DIR));
+    if (dirp == NULL) {
+	return dirp;
+    }
+    c = path[len - 1];
+    if (c == '.') {
+	if (len == 1) {
+	    len--;
+	} else {
+	    c = path[len - 2];
+	    if (c == '\\' || c == ':') {
+		len--;
+	    } else {
+		path[len] = '/';
+		len++;
+	    }
+	}
+    } else if (!unc && ((len != 1) || (c != '\\' && c != '/'))) {
+	path[len] = '/';
+	len++;
+    }
+    strcpy(path + len, pattern);
+
+    dirp->dd_loc = 0;
+    dirp->dd_contents = dirp->dd_cp = NULL;
+
+    if ((s = getdirent(path)) == NULL) {
+	return dirp;
+    }
+    do {
+	if (((dp = malloc(sizeof(struct _dircontents))) == NULL) ||
+	     ((dp->_d_entry = malloc(strlen(s) + 1)) == NULL)) {
+	    if (dp)
+		free(dp);
+	    free_dircontents(dirp->dd_contents);
+
+	    return NULL;
+	}
+	if (dirp->dd_contents)
+	    dirp->dd_cp = dirp->dd_cp->_d_next = dp;
+	else
+	    dirp->dd_contents = dirp->dd_cp = dp;
+
+	strcpy(dp->_d_entry, s);
+	dp->_d_next = NULL;
+
+    }
+    while ((s = getdirent(NULL)) != NULL);
+
+    dirp->dd_cp = dirp->dd_contents;
+    return dirp;
+}
+
+DIR *opendir(char *name)
+{
+    return opendirx(name, "*");
+}
+
+void closedir(DIR * dirp)
+{
+    free_dircontents(dirp->dd_contents);
+    free(dirp);
+}
+
+struct dirent *readdir(DIR * dirp)
+{
+    /* static struct dirent dp; */
+    if (dirp->dd_cp == NULL)
+	return NULL;
+
+    /*strcpy(dp.d_name,dirp->dd_cp->_d_entry); */
+
+    dp.d_name = dirp->dd_cp->_d_entry;
+
+    dp.d_namlen = dp.d_reclen =
+	strlen(dp.d_name);
+
+    dp.d_ino = dirp->dd_loc + 1;	/* fake the inode */
+
+    dirp->dd_cp = dirp->dd_cp->_d_next;
+    dirp->dd_loc++;
+
+
+    return &dp;
+}
+
+void seekdir(DIR * dirp, long off)
+{
+    long i = off;
+    struct _dircontents *dp;
+
+    if (off >= 0) {
+	for (dp = dirp->dd_contents; --i >= 0 && dp; dp = dp->_d_next);
+
+	dirp->dd_loc = off - (i + 1);
+	dirp->dd_cp = dp;
+    }
+}
+
+
+long telldir(DIR * dirp)
+{
+    return dirp->dd_loc;
+}
+
+static void free_dircontents(struct _dircontents *dp)
+{
+    struct _dircontents *odp;
+
+    while (dp) {
+	if (dp->_d_entry)
+	    free(dp->_d_entry);
+
+	dp = (odp = dp)->_d_next;
+	free(odp);
+    }
+}
+/* end of "free_dircontents" */
+
+static char *getdirent(char *dir)
+{
+    int got_dirent;
+
+    if (dir != NULL) {		/* get first entry */
+	if ((FindHandle = FindFirstFile(dir, &FileFindData))
+	    == (HDIR) 0xffffffff) {
+	    return NULL;
+	}
+	got_dirent = 1;
+    } else			/* get next entry */
+	got_dirent = FindNextFile(FindHandle, &FileFindData);
+
+    if (got_dirent)
+	return FileFindData.cFileName;
+    else {
+	FindClose(FindHandle);
+	return NULL;
+    }
+}
+/* end of getdirent() */
+
+struct passwd *_cdecl
+ getpwnam(char *name)
+{
+    return NULL;
+}
+
+struct passwd *_cdecl
+ getpwuid(int uid)
+{
+    return NULL;
+}
+
+int getuid()
+{
+    return 0;
+}
+
+void _cdecl
+ endpwent(void)
+{
+}
+
+/* #endif */

+ 56 - 0
contrib/Win32/dirent.h

@@ -0,0 +1,56 @@
+/* 
+ * @(#) dirent.h 2.0 17 Jun 91   Public Domain. 
+ * 
+ *  A public domain implementation of BSD directory routines for 
+ *  MS-DOS.  Written by Michael Rendell ({uunet,utai}michael@garfield), 
+ *  August 1987 
+ * 
+ *  Enhanced and ported to OS/2 by Kai Uwe Rommel; added scandir() prototype 
+ *  December 1989, February 1990 
+ *  Change of MAXPATHLEN for HPFS, October 1990 
+ *   
+ *  Unenhanced and ported to Windows NT by Bill Gallagher 
+ *  17 Jun 91 
+ *  changed d_name to char * instead of array, removed non-std extensions 
+ *  
+ *  Cleanup, other hackery, Summer '92, Brian Moran , [email protected] 
+ */ 
+
+#ifndef _DIRENT
+#define _DIRENT
+
+#include <direct.h>
+
+struct dirent 
+{ 
+    ino_t    d_ino;                   /* a bit of a farce */ 
+    short    d_reclen;                /* more farce */ 
+    short    d_namlen;                /* length of d_name */ 
+    char    *d_name;
+}; 
+ 
+struct _dircontents 
+{ 
+    char *_d_entry; 
+    struct _dircontents *_d_next; 
+}; 
+ 
+typedef struct _dirdesc 
+{ 
+    int  dd_id;			   /* uniquely identify each open directory*/ 
+    long dd_loc;			/* where we are in directory entry */ 
+    struct _dircontents *dd_contents;	/* pointer to contents of dir */ 
+    struct _dircontents *dd_cp;		/* pointer to current position */ 
+} 
+DIR; 
+ 
+extern DIR *opendir(char *); 
+extern struct dirent *readdir(DIR *); 
+extern void seekdir(DIR *, long); 
+extern long telldir(DIR *); 
+extern void closedir(DIR *); 
+#define rewinddir(dirp) seekdir(dirp, 0L) 
+
+#endif /* _DIRENT */
+
+/* end of dirent.h */ 

+ 57 - 0
contrib/Win32/flock.c

@@ -0,0 +1,57 @@
+/* Copyrights 2002 Luis Figueiredo ([email protected]) All rights reserved. 
+ *
+ * See the LICENSE file
+ *
+ * The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission.  Since few users ever read sources,
+ * credits must appear in the documentation.
+ *
+ * date: 19:49,07-49-2002
+ *
+ * -- description: File lock for winnt
+ *
+
+/*********************************************************************************************************/
+/* 
+ * simulate a file lock, using locking region on WINNT
+ */
+#include "flock.h"
+
+
+
+#define LK_ERR(f,i)	((f) ? (i = 0) : (i=-1))
+#define LK_LEN		0xffff0000
+
+int flock(int fd, int oper) {
+    OVERLAPPED o;
+    int i = -1;
+    HANDLE fh;
+
+    fh = (HANDLE)_get_osfhandle(fd);
+    memset(&o, 0, sizeof(o));
+
+    switch(oper) {
+		case LOCK_SH:		/* shared lock */
+			LK_ERR(LockFileEx(fh, 0, 0, LK_LEN, 0, &o),i);
+		break;
+		case LOCK_EX:		/* exclusive lock */
+			LK_ERR(LockFileEx(fh, LOCKFILE_EXCLUSIVE_LOCK, 0, LK_LEN, 0, &o),i);
+		break;
+		case LOCK_SH|LOCK_NB:	/* non-blocking shared lock */
+			LK_ERR(LockFileEx(fh, LOCKFILE_FAIL_IMMEDIATELY, 0, LK_LEN, 0, &o),i);
+		break;
+		case LOCK_EX|LOCK_NB:	/* non-blocking exclusive lock */
+			LK_ERR(LockFileEx(fh,LOCKFILE_EXCLUSIVE_LOCK|LOCKFILE_FAIL_IMMEDIATELY,0, LK_LEN, 0, &o),i);
+		break;
+		case LOCK_UN:		/* unlock lock */
+			LK_ERR(UnlockFileEx(fh, 0, LK_LEN, 0, &o),i);
+		break;
+		default:			/* unknown */
+			//errno = EINVAL; // i heard that on some versions errno is a function (win32 MT lib?)
+		break;
+    }
+    return i;
+}
+
+#undef LK_ERR
+#undef LK_LEN

+ 31 - 0
contrib/Win32/flock.h

@@ -0,0 +1,31 @@
+/* Copyrights 2002 Luis Figueiredo ([email protected]) All rights reserved. 
+ *
+ * See the LICENSE file
+ *
+ * The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission.  Since few users ever read sources,
+ * credits must appear in the documentation.
+ *
+ * file: utils.h
+ *
+ * description: Header
+ *
+ * date: 19:50,07-50-2002
+ */
+
+#ifndef _FLOCK_H_
+#define _FLOCK_H_
+
+#include <windows.h>
+#include <io.h> // this?
+#include <errno.h>
+
+#define LOCK_SH 1
+#define LOCK_EX 2
+#define LOCK_NB 4
+#define LOCK_UN 8	
+
+int flock (int,int);
+
+
+#endif

+ 13 - 0
contrib/Win32/help/help.cfg

@@ -0,0 +1,13 @@
+[LIBWEBSERVER]
+LOG=help.log
+PORT=81
+USESSL=0
+LOCAL=0
+DYNVAR=0
+
+
+[PERSONAL_CONF]
+PORT=Portability
+MOST=general key guard
+IP=127.0.0.1
+

+ 157 - 0
contrib/Win32/help/help.dsp

@@ -0,0 +1,157 @@
+# Microsoft Developer Studio Project File - Name="help" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=help - Win32 Release
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "help.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "help.mak" CFG="help - Win32 Release"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "help - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "help - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "help - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /Zm200 /c
+# ADD BASE RSC /l 0x816 /d "NDEBUG"
+# ADD RSC /l 0x816 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 libwebserver.lib wsock32.lib user32.lib /nologo /subsystem:console /machine:I386 /out:"../../bin/help.exe" /libpath:"../../bin"
+# SUBTRACT LINK32 /pdb:none /nodefaultlib
+
+!ELSEIF  "$(CFG)" == "help - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /Gm /GX /ZI /Od /I "../../include" /D "_CONSOLE" /D "WIN32" /D "DEBUG" /D "_MBCS" /FA /FR /YX /FD /Zm200 /GZ /c
+# ADD BASE RSC /l 0x816 /d "_DEBUG"
+# ADD RSC /l 0x816 /d "DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 libwebserver.lib wsock32.lib user32.lib /nologo /subsystem:console /debug /machine:I386 /out:"../../bin/help.exe" /pdbtype:sept /libpath:"../../bin"
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "help - Win32 Release"
+# Name "help - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\help\help.c
+
+!IF  "$(CFG)" == "help - Win32 Release"
+
+# ADD CPP /I "../../include ./"
+# SUBTRACT CPP /I "../../include"
+
+!ELSEIF  "$(CFG)" == "help - Win32 Debug"
+
+# ADD CPP /I "../../include help/"
+# SUBTRACT CPP /I "../../include"
+
+!ENDIF 
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\help.rc
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\help\examples.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\help\functions.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\help\info.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\help\security.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# Begin Source File
+
+SOURCE=.\help.ico
+# End Source File
+# End Group
+# Begin Source File
+
+SOURCE=..\..\help.html\examples.html
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\help.html\functions.html
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\help.html\info.html
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\help.html\security.html
+# End Source File
+# End Target
+# End Project

TEMPAT SAMPAH
contrib/Win32/help/help.ico


+ 72 - 0
contrib/Win32/help/help.rc

@@ -0,0 +1,72 @@
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// Portuguese (Portugal) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_PTG)
+#ifdef _WIN32
+LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "#include ""afxres.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE 
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_ICON1               ICON    DISCARDABLE     "help.ico"
+#endif    // Portuguese (Portugal) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+

+ 469 - 0
contrib/Win32/help/mime.types

@@ -0,0 +1,469 @@
+# This is a comment. I love comments.
+
+# This file controls what Internet media types are sent to the client for
+# given file extension(s).  Sending the correct media type to the client
+# is important so they know how to handle the content of the file.
+# Extra types can either be added here or by using an AddType directive
+# in your config files. For more information about Internet media types,
+# please read RFC 2045, 2046, 2047, 2048, and 2077.  The Internet media type
+# registry is at <ftp://ftp.iana.org/in-notes/iana/assignments/media-types/>.
+
+# MIME type			Extension
+application/EDI-Consent
+application/EDI-X12
+application/EDIFACT
+application/activemessage
+application/andrew-inset	ez
+application/applefile
+application/atomicmail
+application/batch-SMTP
+application/beep+xml
+application/cals-1840
+application/commonground
+application/cybercash
+application/dca-rft
+application/dec-dx
+application/dvcs
+application/eshop
+application/http
+application/hyperstudio
+application/iges
+application/index
+application/index.cmd
+application/index.obj
+application/index.response
+application/index.vnd
+application/iotp
+application/ipp
+application/isup
+application/font-tdpfr
+application/mac-binhex40	hqx
+application/mac-compactpro	cpt
+application/macwriteii
+application/marc
+application/mathematica
+application/mathematica-old
+application/msword		doc
+application/news-message-id
+application/news-transmission
+application/ocsp-request
+application/ocsp-response
+application/octet-stream	bin dms lha lzh exe class so dll
+application/oda			oda
+application/parityfec
+application/pdf			pdf
+application/pgp-encrypted
+application/pgp-keys
+application/pgp-signature
+application/pkcs10
+application/pkcs7-mime
+application/pkcs7-signature
+application/pkix-cert
+application/pkix-crl
+application/pkixcmp
+application/postscript		ai eps ps
+application/prs.alvestrand.titrax-sheet
+application/prs.cww
+application/prs.nprend
+application/qsig
+application/remote-printing
+application/riscos
+application/rtf
+application/sdp
+application/set-payment
+application/set-payment-initiation
+application/set-registration
+application/set-registration-initiation
+application/sgml
+application/sgml-open-catalog
+application/sieve
+application/slate
+application/smil		smi smil
+application/timestamp-query
+application/timestamp-reply
+application/vemmi
+application/vnd.3M.Post-it-Notes
+application/vnd.FloGraphIt
+application/vnd.accpac.simply.aso
+application/vnd.accpac.simply.imp
+application/vnd.acucobol
+application/vnd.aether.imp
+application/vnd.anser-web-certificate-issue-initiation
+application/vnd.anser-web-funds-transfer-initiation
+application/vnd.audiograph
+application/vnd.businessobjects
+application/vnd.bmi
+application/vnd.canon-cpdl
+application/vnd.canon-lips
+application/vnd.claymore
+application/vnd.commerce-battelle
+application/vnd.commonspace
+application/vnd.comsocaller
+application/vnd.contact.cmsg
+application/vnd.cosmocaller
+application/vnd.cups-postscript
+application/vnd.cups-raster
+application/vnd.cups-raw
+application/vnd.ctc-posml
+application/vnd.cybank
+application/vnd.dna
+application/vnd.dpgraph
+application/vnd.dxr
+application/vnd.ecdis-update
+application/vnd.ecowin.chart
+application/vnd.ecowin.filerequest
+application/vnd.ecowin.fileupdate
+application/vnd.ecowin.series
+application/vnd.ecowin.seriesrequest
+application/vnd.ecowin.seriesupdate
+application/vnd.enliven
+application/vnd.epson.esf
+application/vnd.epson.msf
+application/vnd.epson.quickanime
+application/vnd.epson.salt
+application/vnd.epson.ssf
+application/vnd.ericsson.quickcall
+application/vnd.eudora.data
+application/vnd.fdf
+application/vnd.ffsns
+application/vnd.framemaker
+application/vnd.fsc.weblaunch
+application/vnd.fujitsu.oasys
+application/vnd.fujitsu.oasys2
+application/vnd.fujitsu.oasys3
+application/vnd.fujitsu.oasysgp
+application/vnd.fujitsu.oasysprs
+application/vnd.fujixerox.ddd
+application/vnd.fujixerox.docuworks
+application/vnd.fujixerox.docuworks.binder
+application/vnd.fut-misnet
+application/vnd.grafeq
+application/vnd.groove-account
+application/vnd.groove-identity-message
+application/vnd.groove-injector
+application/vnd.groove-tool-message
+application/vnd.groove-tool-template
+application/vnd.groove-vcard
+application/vnd.hhe.lesson-player
+application/vnd.hp-HPGL
+application/vnd.hp-PCL
+application/vnd.hp-PCLXL
+application/vnd.hp-hpid
+application/vnd.hp-hps
+application/vnd.httphone
+application/vnd.hzn-3d-crossword
+application/vnd.ibm.afplinedata
+application/vnd.ibm.MiniPay
+application/vnd.ibm.modcap
+application/vnd.informix-visionary
+application/vnd.intercon.formnet
+application/vnd.intertrust.digibox
+application/vnd.intertrust.nncp
+application/vnd.intu.qbo
+application/vnd.intu.qfx
+application/vnd.irepository.package+xml
+application/vnd.is-xpr
+application/vnd.japannet-directory-service
+application/vnd.japannet-jpnstore-wakeup
+application/vnd.japannet-payment-wakeup
+application/vnd.japannet-registration
+application/vnd.japannet-registration-wakeup
+application/vnd.japannet-setstore-wakeup
+application/vnd.japannet-verification
+application/vnd.japannet-verification-wakeup
+application/vnd.koan
+application/vnd.lotus-1-2-3
+application/vnd.lotus-approach
+application/vnd.lotus-freelance
+application/vnd.lotus-notes
+application/vnd.lotus-organizer
+application/vnd.lotus-screencam
+application/vnd.lotus-wordpro
+application/vnd.mcd
+application/vnd.mediastation.cdkey
+application/vnd.meridian-slingshot
+application/vnd.mif		mif
+application/vnd.minisoft-hp3000-save
+application/vnd.mitsubishi.misty-guard.trustweb
+application/vnd.mobius.daf
+application/vnd.mobius.dis
+application/vnd.mobius.msl
+application/vnd.mobius.plc
+application/vnd.mobius.txf
+application/vnd.motorola.flexsuite
+application/vnd.motorola.flexsuite.adsi
+application/vnd.motorola.flexsuite.fis
+application/vnd.motorola.flexsuite.gotap
+application/vnd.motorola.flexsuite.kmr
+application/vnd.motorola.flexsuite.ttc
+application/vnd.motorola.flexsuite.wem
+application/vnd.mozilla.xul+xml
+application/vnd.ms-artgalry
+application/vnd.ms-asf
+application/vnd.ms-excel	xls
+application/vnd.ms-lrm
+application/vnd.ms-powerpoint	ppt
+application/vnd.ms-project
+application/vnd.ms-tnef
+application/vnd.ms-works
+application/vnd.mseq
+application/vnd.msign
+application/vnd.music-niff
+application/vnd.musician
+application/vnd.netfpx
+application/vnd.noblenet-directory
+application/vnd.noblenet-sealer
+application/vnd.noblenet-web
+application/vnd.novadigm.EDM
+application/vnd.novadigm.EDX
+application/vnd.novadigm.EXT
+application/vnd.osa.netdeploy
+application/vnd.palm
+application/vnd.pg.format
+application/vnd.pg.osasli
+application/vnd.powerbuilder6
+application/vnd.powerbuilder6-s
+application/vnd.powerbuilder7
+application/vnd.powerbuilder7-s
+application/vnd.powerbuilder75
+application/vnd.powerbuilder75-s
+application/vnd.previewsystems.box
+application/vnd.publishare-delta-tree
+application/vnd.pvi.ptid1
+application/vnd.pwg-xhtml-print+xml
+application/vnd.rapid
+application/vnd.s3sms
+application/vnd.seemail
+application/vnd.shana.informed.formdata
+application/vnd.shana.informed.formtemplate
+application/vnd.shana.informed.interchange
+application/vnd.shana.informed.package
+application/vnd.sss-cod
+application/vnd.sss-dtf
+application/vnd.sss-ntf
+application/vnd.street-stream
+application/vnd.svd
+application/vnd.swiftview-ics
+application/vnd.triscape.mxs
+application/vnd.trueapp
+application/vnd.truedoc
+application/vnd.tve-trigger
+application/vnd.ufdl
+application/vnd.uplanet.alert
+application/vnd.uplanet.alert-wbxml
+application/vnd.uplanet.bearer-choice-wbxml
+application/vnd.uplanet.bearer-choice
+application/vnd.uplanet.cacheop
+application/vnd.uplanet.cacheop-wbxml
+application/vnd.uplanet.channel
+application/vnd.uplanet.channel-wbxml
+application/vnd.uplanet.list
+application/vnd.uplanet.list-wbxml
+application/vnd.uplanet.listcmd
+application/vnd.uplanet.listcmd-wbxml
+application/vnd.uplanet.signal
+application/vnd.vcx
+application/vnd.vectorworks
+application/vnd.vidsoft.vidconference
+application/vnd.visio
+application/vnd.vividence.scriptfile
+application/vnd.wap.sic
+application/vnd.wap.slc
+application/vnd.wap.wbxml	wbxml
+application/vnd.wap.wmlc	wmlc
+application/vnd.wap.wmlscriptc	wmlsc
+application/vnd.webturbo
+application/vnd.wrq-hp3000-labelled
+application/vnd.wt.stf
+application/vnd.xara
+application/vnd.xfdl
+application/vnd.yellowriver-custom-menu
+application/whoispp-query
+application/whoispp-response
+application/wita
+application/wordperfect5.1
+application/x-bcpio		bcpio
+application/x-cdlink		vcd
+application/x-chess-pgn		pgn
+application/x-compress
+application/x-cpio		cpio
+application/x-csh		csh
+application/x-director		dcr dir dxr
+application/x-dvi		dvi
+application/x-futuresplash	spl
+application/x-gtar		gtar
+application/x-gzip
+application/x-hdf		hdf
+application/x-javascript	js
+application/x-koan		skp skd skt skm
+application/x-latex		latex
+application/x-netcdf		nc cdf
+application/x-sh		sh
+application/x-shar		shar
+application/x-shockwave-flash	swf
+application/x-stuffit		sit
+application/x-sv4cpio		sv4cpio
+application/x-sv4crc		sv4crc
+application/x-tar		tar
+application/x-tcl		tcl
+application/x-tex		tex
+application/x-texinfo		texinfo texi
+application/x-troff		t tr roff
+application/x-troff-man		man
+application/x-troff-me		me
+application/x-troff-ms		ms
+application/x-ustar		ustar
+application/x-wais-source	src
+application/x400-bp
+application/xml
+application/xml-dtd
+application/xml-external-parsed-entity
+application/zip			zip
+audio/32kadpcm
+audio/basic			au snd
+audio/g.722.1
+audio/l16
+audio/midi			mid midi kar
+audio/mp4a-latm
+audio/mpa-robust
+audio/mpeg			mpga mp2 mp3
+audio/parityfec
+audio/prs.sid
+audio/telephone-event
+audio/tone
+audio/vnd.cisco.nse
+audio/vnd.cns.anp1
+audio/vnd.cns.inf1
+audio/vnd.digital-winds
+audio/vnd.everad.plj
+audio/vnd.lucent.voice
+audio/vnd.nortel.vbk
+audio/vnd.nuera.ecelp4800
+audio/vnd.nuera.ecelp7470
+audio/vnd.nuera.ecelp9600
+audio/vnd.octel.sbc
+audio/vnd.qcelp
+audio/vnd.rhetorex.32kadpcm
+audio/vnd.vmx.cvsd
+audio/x-aiff			aif aiff aifc
+audio/x-mpegurl			m3u
+audio/x-pn-realaudio		ram rm
+audio/x-pn-realaudio-plugin	rpm
+audio/x-realaudio		ra
+audio/x-wav			wav
+chemical/x-pdb			pdb
+chemical/x-xyz			xyz
+image/bmp			bmp
+image/cgm
+image/g3fax
+image/gif			gif
+image/ief			ief
+image/jpeg			jpeg jpg jpe
+image/naplps
+image/png			png
+image/prs.btif
+image/prs.pti
+image/tiff			tiff tif
+image/vnd.cns.inf2
+image/vnd.dwg
+image/vnd.dxf
+image/vnd.fastbidsheet
+image/vnd.fpx
+image/vnd.fst
+image/vnd.fujixerox.edmics-mmr
+image/vnd.fujixerox.edmics-rlc
+image/vnd.mix
+image/vnd.net-fpx
+image/vnd.svf
+image/vnd.wap.wbmp		wbmp
+image/vnd.xiff
+image/x-cmu-raster		ras
+image/x-portable-anymap		pnm
+image/x-portable-bitmap		pbm
+image/x-portable-graymap	pgm
+image/x-portable-pixmap		ppm
+image/x-rgb			rgb
+image/x-xbitmap			xbm
+image/x-xpixmap			xpm
+image/x-xwindowdump		xwd
+message/delivery-status
+message/disposition-notification
+message/external-body
+message/http
+message/news
+message/partial
+message/rfc822
+message/s-http
+model/iges			igs iges
+model/mesh			msh mesh silo
+model/vnd.dwf
+model/vnd.flatland.3dml
+model/vnd.gdl
+model/vnd.gs-gdl
+model/vnd.gtw
+model/vnd.mts
+model/vnd.vtu
+model/vrml			wrl vrml
+multipart/alternative
+multipart/appledouble
+multipart/byteranges
+multipart/digest
+multipart/encrypted
+multipart/form-data
+multipart/header-set
+multipart/mixed
+multipart/parallel
+multipart/related
+multipart/report
+multipart/signed
+multipart/voice-message
+text/calendar
+text/css			css
+text/directory
+text/enriched
+text/html			html htm
+text/parityfec
+text/plain			asc txt
+text/prs.lines.tag
+text/rfc822-headers
+text/richtext			rtx
+text/rtf			rtf
+text/sgml			sgml sgm
+text/tab-separated-values	tsv
+text/t140
+text/uri-list
+text/vnd.DMClientScript
+text/vnd.IPTC.NITF
+text/vnd.IPTC.NewsML
+text/vnd.abc
+text/vnd.curl
+text/vnd.flatland.3dml
+text/vnd.fly
+text/vnd.fmi.flexstor
+text/vnd.in3d.3dml
+text/vnd.in3d.spot
+text/vnd.latex-z
+text/vnd.motorola.reflex
+text/vnd.ms-mediapackage
+text/vnd.wap.si
+text/vnd.wap.sl
+text/vnd.wap.wml		wml
+text/vnd.wap.wmlscript		wmls
+text/x-setext			etx
+text/xml			xml xsl
+text/xml-external-parsed-entity
+video/mp4v-es
+video/mpeg			mpeg mpg mpe
+video/parityfec
+video/pointer
+video/quicktime			qt mov
+video/vnd.fvt
+video/vnd.motorola.video
+video/vnd.motorola.videop
+video/vnd.mpegurl		mxu
+video/vnd.mts
+video/vnd.nokia.interleaved-multimedia
+video/vnd.vivo
+video/x-msvideo			avi
+video/x-sgi-movie		movie
+x-conference/x-cooltalk		ice

+ 16 - 0
contrib/Win32/help/resource.h

@@ -0,0 +1,16 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by help.rc
+//
+#define IDI_ICON1                       101
+
+// Next default values for new objects
+// 
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        102
+#define _APS_NEXT_COMMAND_VALUE         40001
+#define _APS_NEXT_CONTROL_VALUE         1000
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif

+ 237 - 0
contrib/Win32/libwebserver.dsp

@@ -0,0 +1,237 @@
+# Microsoft Developer Studio Project File - Name="libwebserver" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Static Library" 0x0104
+
+CFG=libwebserver - Win32 Release
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "libwebserver.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "libwebserver.mak" CFG="libwebserver - Win32 Release"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "libwebserver - Win32 Release" (based on "Win32 (x86) Static Library")
+!MESSAGE "libwebserver - Win32 Debug" (based on "Win32 (x86) Static Library")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "libwebserver - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../include" /I "./" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
+# ADD BASE RSC /l 0x816 /d "NDEBUG"
+# ADD RSC /l 0x816 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LIB32=link.exe -lib
+# ADD BASE LIB32 /nologo
+# ADD LIB32 /nologo /out:"../bin/libwebserver.lib"
+
+!ELSEIF  "$(CFG)" == "libwebserver - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
+# ADD CPP /nologo /Gm /GX /ZI /Od /I "./" /I "../include" /D "_LIB" /D "WIN32" /D "_DEBUG" /D "_MBCS" /FA /YX /FD /GZ /c
+# SUBTRACT CPP /X
+# ADD BASE RSC /l 0x816 /d "_DEBUG"
+# ADD RSC /l 0x816 /d "DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LIB32=link.exe -lib
+# ADD BASE LIB32 /nologo
+# ADD LIB32 /nologo /out:"../bin/libwebserver.lib"
+
+!ENDIF 
+
+# Begin Target
+
+# Name "libwebserver - Win32 Release"
+# Name "libwebserver - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\src\client.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\clientinfo.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\dirent.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\error.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\flock.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\fnmatch.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\gethandler.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\memory.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\outgif.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\outstream.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\server.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\socket.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\utils.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\src\weblog.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\include\client.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\include\clientinfo.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\include\config.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\include\debug.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\dirent.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\include\error.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\flock.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\include\fnmatch.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\include\gethandler.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\include\logo.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\include\memory.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\include\module.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\include\outgif.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\include\outstream.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\include\server.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\include\socket.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\include\utils.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\include\web_server.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\include\weblog.h
+# End Source File
+# End Group
+# Begin Source File
+
+SOURCE=..\Authors
+# End Source File
+# Begin Source File
+
+SOURCE=..\ChangeLog
+# End Source File
+# Begin Source File
+
+SOURCE=..\Todo
+# End Source File
+# End Target
+# End Project

+ 44 - 0
contrib/Win32/libwebserver.dsw

@@ -0,0 +1,44 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "help"=".\help\help.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name libwebserver
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "libwebserver"=".\libwebserver.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+

+ 9 - 0
contrib/help/engine.h

@@ -0,0 +1,9 @@
+/*
+ * by data2header by Luis Figueiredo ([email protected])
+ */
+#ifndef _ENGINE_H_
+#define _ENGINE_H_
+
+char engine[]="";
+
+#endif

+ 605 - 0
contrib/help/examples.h

@@ -0,0 +1,605 @@
+/*
+ * by data2header by Luis Figueiredo ([email protected])
+ */
+#ifndef _EXAMPLES_H_
+#define _EXAMPLES_H_
+
+char examples[]="\x3C\x63\x65\x6E\x74\x65\x72\x3E\x3C\x48\x33\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27"
+"\x30\x30\x37\x37\x30\x30\x27\x3E\x6C\x69\x62\x77\x65\x62\x73\x65\x72\x76\x65\x72\x20\x65\x78\x61\x6D\x70"
+"\x6C\x65\x73\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x48\x33\x3E\x3C\x2F\x63\x65\x6E\x74\x65\x72\x3E\x3C\x42"
+"\x52\x3E\x3C\x42\x52\x3E\xA\xA\x3C\x21\x2D\x2D\x20\x4A\x6F\x68\x61\x6E\x6E\x65\x73\x20\x45\x2E\x20\x53"
+"\x63\x68\x69\x6E\x64\x65\x6C\x69\x6E\x20\x2D\x2D\x3E\xA\x3C\x63\x65\x6E\x74\x65\x72\x3E\x3C\x41\x20\x6E"
+"\x61\x6D\x65\x3D\x68\x65\x6C\x6C\x6F\x77\x6F\x72\x6C\x64\x3E\x3C\x42\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F"
+"\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37\x37\x27\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x2F\x68\x65\x6C\x6C"
+"\x6F\x3E\x3C\x48\x33\x3E\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64\x3C\x2F\x48\x33\x3E\x3C\x2F\x61\x3E"
+"\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\x3C\x2F\x63\x65\x6E\x74\x65\x72\x3E\xA\x3C\x73\x6D\x61\x6C"
+"\x6C\x3E\x20\x3C\x42\x3E\x75\x73\x65\x64\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x3A\x3C\x2F\x42\x3E\x3C"
+"\x42\x52\x3E\xA\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69"
+"\x6F\x6E\x73\x23\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x69\x74\x27\x3E\x77\x65\x62\x5F\x73"
+"\x65\x72\x76\x65\x72\x5F\x69\x6E\x69\x74\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA\x3C\x61\x20\x68\x72\x65\x66"
+"\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x73\x65\x72"
+"\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72"
+"\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA\x3C\x61\x20\x68\x72\x65"
+"\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x73\x65"
+"\x72\x76\x65\x72\x5F\x72\x75\x6E\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x72\x75\x6E\x3C\x2F"
+"\x61\x3E\x3C\x42\x52\x3E\xA\x3C\x2F\x73\x6D\x61\x6C\x6C\x3E\x3C\x42\x52\x3E\xA\xA\x54\x68\x69\x73\x20"
+"\x65\x78\x61\x6D\x70\x6C\x65\x20\x73\x74\x61\x72\x74\x73\x20\x74\x68\x65\x20\x73\x65\x72\x76\x65\x72\x20"
+"\x77\x69\x74\x68\x20\x6F\x6E\x65\x20\x68\x61\x6E\x64\x6C\x65\x72\x20\x66\x6F\x72\x20\x61\x6C\x6C\x20\x72"
+"\x65\x71\x75\x65\x73\x74\x73\x20\x70\x6F\x69\x6E\x74\x69\x6E\x67\x20\x74\x6F\x20\x68\x65\x6C\x6C\x6F\x5F"
+"\x77\x6F\x72\x6C\x64\x28\x29\xA\x74\x68\x61\x74\x20\x70\x72\x69\x6E\x74\x73\x20\x74\x68\x65\x20\x63\x6F"
+"\x6E\x74\x65\x6E\x74\x2D\x74\x79\x70\x65\x20\x77\x69\x74\x68\x20\x74\x68\x65\x20\x65\x6E\x64\x20\x6F\x66"
+"\x20\x74\x68\x65\x20\x68\x65\x61\x64\x65\x72\x20\x22\x5C\x72\x5C\x6E\x5C\x72\x5C\x6E\x22\x20\x61\x6E\x64"
+"\x20\x6F\x6E\x65\x20\x73\x69\x6D\x70\x6C\x65\x20\x70\x72\x69\x6E\x74\x66\x20\x77\x69\x74\x68\x20\x48\x65"
+"\x6C\x6C\x6F\x20\x77\x6F\x72\x6C\x64\x3C\x42\x52\x3E\x3C\x42\x52\x3E\xA\xA\x3C\x54\x41\x42\x4C\x45\x20"
+"\x77\x69\x64\x74\x68\x3D\x27\x31\x30\x30\x25\x27\x20\x62\x67\x63\x6F\x6C\x6F\x72\x3D\x27\x43\x46\x43\x46"
+"\x43\x46\x27\x20\x62\x6F\x72\x64\x65\x72\x3D\x30\x3E\x3C\x54\x52\x3E\x3C\x54\x44\x3E\xA\x3C\x43\x4F\x44"
+"\x45\x3E\x3C\x50\x52\x45\x3E\xA\x23\x69\x6E\x63\x6C\x75\x64\x65\x20\x22\x77\x65\x62\x5F\x73\x65\x72\x76"
+"\x65\x72\x2E\x68\x22\xA\x23\x69\x6E\x63\x6C\x75\x64\x65\x20\x26\x6C\x74\x3B\x73\x74\x64\x69\x6F\x2E\x68"
+"\x26\x67\x74\x3B\xA\xA\xA\x76\x6F\x69\x64\x20\x68\x65\x6C\x6C\x6F\x5F\x77\x6F\x72\x6C\x64\x28\x29\x20"
+"\x7B\xA\x9\x70\x72\x69\x6E\x74\x66\x28\x22\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x74\x79\x70\x65\x3A\x20\x74"
+"\x65\x78\x74\x2F\x70\x6C\x61\x69\x6E\x5C\x72\x5C\x6E\x5C\x72\x5C\x6E\x22\x29\x3B\xA\x9\x70\x72\x69\x6E"
+"\x74\x66\x28\x22\x48\x65\x6C\x6C\x6F\x2C\x20\x57\x6F\x72\x6C\x64\x21\x5C\x72\x5C\x6E\x22\x29\x3B\xA\x7D"
+"\xA\xA\x69\x6E\x74\x20\x6D\x61\x69\x6E\x28\x69\x6E\x74\x20\x61\x72\x67\x63\x2C\x63\x68\x61\x72\x2A\x2A"
+"\x20\x61\x72\x67\x76\x29\x20\x7B\xA\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x77\x65"
+"\x62\x5F\x73\x65\x72\x76\x65\x72\x20\x73\x65\x72\x76\x65\x72\x3B\x20\x2F\x2F\x20\x73\x65\x72\x76\x65\x72"
+"\x20\x68\x61\x6E\x64\x6C\x65\x72\xA\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x28\x21\x77\x65\x62\x5F\x73"
+"\x65\x72\x76\x65\x72\x5F\x69\x6E\x69\x74\x28\x26\x73\x65\x72\x76\x65\x72\x2C\x38\x30\x2C\x22\x68\x65\x6C"
+"\x70\x2E\x6C\x6F\x67\x22\x2C\x30\x29\x29\x20\x7B\x20\x2F\x2F\x20\x69\x6E\x69\x74\x69\x61\x6C\x69\x7A\x65"
+"\x20\x61\x6E\x64\x20\x73\x74\x61\x72\x74\x20\x74\x68\x65\x20\x73\x65\x72\x76\x65\x72\x20\x61\x74\x20\x70"
+"\x6F\x72\x74\x20\x38\x30\x2C\x20\x6C\x6F\x67\x67\x69\x6E\x67\x20\x74\x6F\x20\x68\x65\x6C\x70\x2E\x6C\x6F"
+"\x67\xA\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x70\x72\x69\x6E\x74\x66\x28"
+"\x73\x74\x64\x65\x72\x72\x2C\x22\x63\x61\x6E\x27\x74\x20\x6F\x70\x65\x6E\x20\x6C\x69\x73\x74\x65\x6E\x20"
+"\x73\x6F\x63\x6B\x65\x74\x5C\x6E\x22\x29\x3B\xA\x9\x9\x72\x65\x74\x75\x72\x6E\x20\x31\x3B\xA\x20\x20"
+"\x20\x20\x20\x20\x20\x20\x7D\x3B\xA\xA\x20\x20\x20\x20\x20\x20\x20\x20\x77\x65\x62\x5F\x73\x65\x72\x76"
+"\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x28\x26\x73\x65\x72\x76\x65\x72\x2C\x22\x2A\x20\x2A"
+"\x22\x2C\x68\x65\x6C\x6C\x6F\x5F\x77\x6F\x72\x6C\x64\x2C\x30\x29\x3B\x20\x2F\x2F\x20\x61\x64\x64\x20\x68"
+"\x61\x6E\x64\x6C\x65\x72\x20\x66\x6F\x72\x20\x61\x6C\x6C\x20\x72\x65\x71\x75\x65\x73\x74\x73\xA\x20\x20"
+"\x20\x20\x20\x20\x20\x20\x77\x68\x69\x6C\x65\x28\x31\x29\x20\x7B\xA\x20\x20\x20\x20\x20\x20\x20\x20\x20"
+"\x20\x20\x20\x20\x20\x20\x20\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x72\x75\x6E\x28\x26\x73\x65\x72"
+"\x76\x65\x72\x29\x3B\x20\x20\x20\x2F\x2F\x20\x72\x75\x6E\x20\x73\x65\x72\x76\x65\x72\xA\x20\x20\x20\x20"
+"\x20\x20\x20\x20\x7D\x3B\xA\x7D\xA\x3C\x2F\x50\x52\x45\x3E\x3C\x2F\x43\x4F\x44\x45\x3E\xA\x3C\x2F\x54"
+"\x44\x3E\x3C\x2F\x54\x52\x3E\x3C\x2F\x54\x41\x42\x4C\x45\x3E\xA\x3C\x48\x52\x3E\x3C\x42\x52\x3E\xA\xA"
+"\x3C\x63\x65\x6E\x74\x65\x72\x3E\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x6C\x6F\x67\x66\x69\x6C\x65\x3E\x3C\x42"
+"\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37\x37\x27\x3E\x3C\x61\x20\x68"
+"\x72\x65\x66\x3D\x27\x2F\x6C\x6F\x67\x27\x3E\x3C\x48\x33\x3E\x6C\x6F\x67\x66\x69\x6C\x65\x3C\x2F\x48\x33"
+"\x3E\x3C\x2F\x61\x3E\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\x3C\x2F\x63\x65\x6E\x74\x65\x72\x3E\xA"
+"\x3C\x73\x6D\x61\x6C\x6C\x3E\x20\x3C\x42\x3E\x75\x73\x65\x64\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x3A"
+"\x3C\x2F\x42\x3E\x3C\x42\x52\x3E\xA\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66"
+"\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x69\x74\x27\x3E"
+"\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x69\x74\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA\x3C\x61"
+"\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65"
+"\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x27\x3E\x77\x65\x62\x5F\x73"
+"\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA\x3C"
+"\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77"
+"\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x72\x75\x6E\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F"
+"\x72\x75\x6E\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C"
+"\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x61\x64\x64"
+"\x66\x69\x6C\x65\x27\x3E\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x61\x64\x64\x66\x69\x6C\x65\x3C\x2F"
+"\x61\x3E\x3C\x42\x52\x3E\xA\x3C\x2F\x73\x6D\x61\x6C\x6C\x3E\x3C\x42\x52\x3E\xA\xA\x54\x68\x69\x73\x20"
+"\x65\x78\x61\x6D\x70\x6C\x65\x20\x75\x73\x65\x73\x20\x74\x68\x65\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20"
+"\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23"
+"\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x61\x64\x64\x66\x69\x6C\x65\x27\x3E\x77\x65\x62\x5F\x63\x6C"
+"\x69\x65\x6E\x74\x5F\x61\x64\x64\x66\x69\x6C\x65\x3C\x2F\x61\x3E\x20\x74\x6F\x20\x73\x65\x6E\x64\x20\x61"
+"\x20\x66\x69\x6C\x65\x20\x74\x6F\x20\x63\x6C\x69\x65\x6E\x74\xA\x3C\x42\x52\x3E\x3C\x42\x52\x3E\xA\x3C"
+"\x54\x41\x42\x4C\x45\x20\x77\x69\x64\x74\x68\x3D\x27\x31\x30\x30\x25\x27\x20\x62\x67\x63\x6F\x6C\x6F\x72"
+"\x3D\x27\x43\x46\x43\x46\x43\x46\x27\x20\x62\x6F\x72\x64\x65\x72\x3D\x30\x3E\x3C\x54\x52\x3E\x3C\x54\x44"
+"\x3E\xA\x3C\x43\x4F\x44\x45\x3E\x3C\x50\x52\x45\x3E\xA\x23\x69\x6E\x63\x6C\x75\x64\x65\x20\x22\x77\x65"
+"\x62\x5F\x73\x65\x72\x76\x65\x72\x2E\x68\x22\xA\x23\x69\x6E\x63\x6C\x75\x64\x65\x20\x26\x6C\x74\x3B\x73"
+"\x74\x64\x69\x6F\x2E\x68\x26\x67\x74\x3B\xA\xA\x76\x6F\x69\x64\x20\x6C\x6F\x67\x66\x69\x6C\x65\x28\x29"
+"\x20\x7B\xA\x20\x20\x20\x20\x20\x20\x20\x20\x70\x72\x69\x6E\x74\x66\x28\x22\x43\x6F\x6E\x74\x65\x6E\x74"
+"\x2D\x74\x79\x70\x65\x3A\x20\x74\x65\x78\x74\x2F\x70\x6C\x61\x69\x6E\x5C\x72\x5C\x6E\x5C\x72\x5C\x6E\x22"
+"\x29\x3B\xA\x20\x20\x20\x20\x20\x20\x20\x20\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x61\x64\x64\x66"
+"\x69\x6C\x65\x28\x73\x65\x72\x76\x65\x72\x2E\x6C\x6F\x67\x66\x69\x6C\x65\x29\x3B\x20\x2F\x2F\x20\x61\x64"
+"\x64\x20\x68\x65\x6C\x70\x2E\x6C\x6F\x67\x20\x66\x69\x6C\x65\x20\x74\x6F\x20\x6F\x75\x74\x70\x75\x74\xA"
+"\x20\x20\x20\x20\x20\x20\x20\x20\x70\x72\x69\x6E\x74\x66\x28\x22\x45\x6E\x64\x20\x6F\x66\x20\x6C\x6F\x67"
+"\x5C\x6E\x22\x29\x3B\xA\x7D\x3B\xA\x20\x20\x20\x20\x20\x20\x20\x20\xA\xA\x6D\x61\x69\x6E\x28\x29\x20"
+"\x7B\xA\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x77\x65\x62\x5F\x73\x65\x72\x76\x65"
+"\x72\x20\x73\x65\x72\x76\x65\x72\x3B\x20\x2F\x2F\x20\x73\x65\x72\x76\x65\x72\x20\x68\x61\x6E\x64\x6C\x65"
+"\x72\xA\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x28\x21\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x69"
+"\x6E\x69\x74\x28\x26\x73\x65\x72\x76\x65\x72\x2C\x38\x32\x2C\x22\x68\x65\x6C\x70\x2E\x6C\x6F\x67\x22\x2C"
+"\x30\x29\x29\x20\x7B\x20\x2F\x2F\x20\x69\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x65\xA\x20\x20\x20\x20"
+"\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x70\x72\x69\x6E\x74\x66\x28\x73\x74\x64\x65\x72\x72"
+"\x2C\x22\x63\x61\x6E\x27\x74\x20\x6F\x70\x65\x6E\x20\x6C\x69\x73\x74\x65\x6E\x20\x73\x6F\x63\x6B\x65\x74"
+"\x5C\x6E\x22\x29\x3B\xA\x20\x20\x20\x20\x20\x20\x20\x20\x7D\x3B\xA\xA\x20\x20\x20\x20\x20\x20\x20\x20"
+"\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x28\x26\x73\x65\x72"
+"\x76\x65\x72\x2C\x22\x2A\x20\x2F\x6C\x6F\x67\x22\x2C\x6C\x6F\x67\x66\x69\x6C\x65\x2C\x30\x29\x3B\x20\x2F"
+"\x2F\x20\x61\x64\x64\x20\x68\x61\x6E\x64\x6C\x65\x72\x20\x66\x6F\x72\x20\x68\x74\x74\x70\x3A\x2F\x2F\x68"
+"\x6F\x73\x74\x2F\x6C\x6F\x67\x20\x72\x65\x71\x75\x65\x73\x74\x73\xA\x20\x20\x20\x20\x20\x20\x20\x20\x77"
+"\x68\x69\x6C\x65\x28\x31\x29\x20\x7B\xA\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
+"\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x72\x75\x6E\x28\x26\x73\x65\x72\x76\x65\x72\x29\x3B\x20\x20"
+"\x20\x2F\x2F\x20\x72\x75\x6E\x20\x73\x65\x72\x76\x65\x72\xA\x20\x20\x20\x20\x20\x20\x20\x20\x7D\x3B\xA"
+"\x7D\x3B\xA\x3C\x2F\x50\x52\x45\x3E\x3C\x2F\x43\x4F\x44\x45\x3E\xA\x3C\x2F\x54\x44\x3E\x3C\x2F\x54\x52"
+"\x3E\x3C\x2F\x54\x41\x42\x4C\x45\x3E\xA\x3C\x48\x52\x3E\x3C\x42\x52\x3E\xA\xA\xA\x3C\x63\x65\x6E\x74"
+"\x65\x72\x3E\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x69\x6D\x61\x67\x65\x75\x70\x3E\x3C\x42\x3E\x3C\x66\x6F\x6E"
+"\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37\x37\x27\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x27"
+"\x2F\x69\x6D\x61\x67\x65\x27\x3E\x3C\x48\x33\x3E\x49\x6D\x61\x67\x65\x20\x55\x70\x6C\x6F\x61\x64\x65\x72"
+"\x3C\x2F\x48\x33\x3E\x3C\x2F\x61\x3E\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\x3C\x2F\x63\x65\x6E\x74"
+"\x65\x72\x3E\xA\x3C\x73\x6D\x61\x6C\x6C\x3E\x20\x3C\x42\x3E\x75\x73\x65\x64\x20\x66\x75\x6E\x63\x74\x69"
+"\x6F\x6E\x73\x3A\x3C\x2F\x42\x3E\x3C\x42\x52\x3E\xA\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65"
+"\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E"
+"\x69\x74\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x69\x74\x3C\x2F\x61\x3E\x3C\x42\x52"
+"\x3E\xA\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E"
+"\x73\x23\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x27\x3E\x77"
+"\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x3C\x2F\x61\x3E\x3C\x42"
+"\x52\x3E\xA\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F"
+"\x6E\x73\x23\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x72\x75\x6E\x27\x3E\x77\x65\x62\x5F\x73\x65\x72"
+"\x76\x65\x72\x5F\x72\x75\x6E\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F"
+"\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x63\x6C\x69\x65\x6E\x74\x69\x6E\x66\x6F"
+"\x27\x3E\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA\x3C\x2F\x73\x6D\x61"
+"\x6C\x6C\x3E\x3C\x42\x52\x3E\xA\xA\xA\x54\x68\x69\x73\x20\x65\x78\x61\x6D\x70\x6C\x65\x20\x75\x73\x65"
+"\x73\x20\x74\x68\x65\x20\x73\x74\x72\x75\x63\x74\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65"
+"\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x63\x6C\x69\x65\x6E\x74\x69\x6E\x66\x6F\x27\x3E\x43"
+"\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x3C\x2F\x61\x3E\x20\x66\x6F\x72\x20\x66\x65\x74\x63\x68\x69\x6E\x67"
+"\x20\x74\x68\x65\x20\x69\x6E\x70\x75\x74\x20\x66\x72\x6F\x6D\x20\x74\x68\x65\x20\x63\x6C\x69\x65\x6E\x74"
+"\xA\x75\x73\x69\x6E\x67\x20\x74\x68\x65\x20\x51\x75\x65\x72\x79\x28\x22\x69\x6D\x67\x22\x29\x20\x74\x6F"
+"\x20\x73\x65\x6E\x64\x20\x74\x68\x65\x20\x69\x6D\x61\x67\x65\x20\x3C\x42\x52\x3E\xA\x61\x6E\x64\x20\x6D"
+"\x75\x6C\x74\x69\x70\x61\x72\x74\x20\x66\x6F\x72\x20\x66\x65\x74\x63\x68\x69\x6E\x67\x20\x74\x68\x65\x20"
+"\x75\x70\x6C\x6F\x61\x64\x65\x64\x20\x66\x69\x6C\x65\x3C\x42\x52\x3E\xA\xA\xA\x3C\x42\x52\x3E\x3C\x42"
+"\x52\x3E\xA\x3C\x54\x41\x42\x4C\x45\x20\x77\x69\x64\x74\x68\x3D\x27\x31\x30\x30\x25\x27\x20\x62\x67\x63"
+"\x6F\x6C\x6F\x72\x3D\x27\x43\x46\x43\x46\x43\x46\x27\x20\x62\x6F\x72\x64\x65\x72\x3D\x30\x3E\x3C\x54\x52"
+"\x3E\x3C\x54\x44\x3E\xA\x3C\x43\x4F\x44\x45\x3E\x3C\x50\x52\x45\x3E\xA\x23\x69\x6E\x63\x6C\x75\x64\x65"
+"\x20\x22\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x2E\x68\x22\xA\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
+"\x20\x20\x20\x20\x20\x20\xA\x23\x69\x6E\x63\x6C\x75\x64\x65\x20\x26\x6C\x74\x3B\x73\x74\x64\x6C\x69\x62"
+"\x2E\x68\x26\x67\x74\x3B\xA\x20\x20\x20\x20\x20\x20\x20\x20\xA\x73\x74\x72\x75\x63\x74\x20\x69\x6D\x61"
+"\x67\x65\x20\x7B\xA\x9\x63\x68\x61\x72\x20\x2A\x64\x61\x74\x61\x3B\xA\x9\x73\x69\x7A\x65\x5F\x74\x20"
+"\x73\x69\x7A\x65\x3B\xA\x7D\x20\x69\x6D\x61\x67\x65\x3D\x7B\x4E\x55\x4C\x4C\x2C\x30\x7D\x3B\xA\xA\x76"
+"\x6F\x69\x64\x20\x69\x6D\x61\x67\x65\x6F\x75\x74\x28\x29\x20\x7B\xA\x9\x69\x66\x28\x73\x74\x72\x6C\x65"
+"\x6E\x28\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x3E\x51\x75\x65\x72\x79\x28\x22\x69\x6D\x67\x22\x29"
+"\x29\x29\x20\x7B\xA\x9\x9\x69\x66\x28\x69\x6D\x61\x67\x65\x2E\x64\x61\x74\x61\x21\x3D\x4E\x55\x4C\x4C"
+"\x29\x20\x7B\xA\x9\x9\x9\x70\x72\x69\x6E\x74\x66\x28\x22\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x74\x79\x70"
+"\x65\x3A\x20\x69\x6D\x61\x67\x65\x2F\x6A\x70\x65\x67\x5C\x72\x5C\x6E\x5C\x72\x5C\x6E\x22\x29\x3B\xA\x9"
+"\x9\x9\x66\x77\x72\x69\x74\x65\x28\x69\x6D\x61\x67\x65\x2E\x64\x61\x74\x61\x2C\x69\x6D\x61\x67\x65\x2E"
+"\x73\x69\x7A\x65\x2C\x31\x2C\x73\x74\x64\x6F\x75\x74\x29\x3B\xA\x9\x9\x7D\x3B\xA\x9\x9\x72\x65\x74"
+"\x75\x72\x6E\x3B\xA\x9\x7D\x3B\xA\x9\x70\x72\x69\x6E\x74\x66\x28\x22\x43\x6F\x6E\x74\x65\x6E\x74\x2D"
+"\x74\x79\x70\x65\x3A\x20\x74\x65\x78\x74\x2F\x68\x74\x6D\x6C\x5C\x72\x5C\x6E\x5C\x72\x5C\x6E\x22\x29\x3B"
+"\xA\x9\x70\x72\x69\x6E\x74\x66\x28\x22\x26\x6C\x74\x3B\x48\x54\x4D\x4C\x26\x67\x74\x3B\x5C\x6E\x22\x29"
+"\x3B\xA\x9\x70\x72\x69\x6E\x74\x66\x28\x22\x26\x6C\x74\x3B\x42\x4F\x44\x59\x20\x62\x67\x63\x6F\x6C\x6F"
+"\x72\x3D\x27\x45\x46\x45\x46\x45\x46\x27\x26\x67\x74\x3B\x5C\x6E\x22\x29\x3B\x20\x20\x20\x20\x20\x20\x20"
+"\x20\xA\x9\x70\x72\x69\x6E\x74\x66\x28\x22\x26\x6C\x74\x3B\x66\x6F\x72\x6D\x20\x61\x63\x74\x69\x6F\x6E"
+"\x3D\x27\x2F\x27\x20\x65\x6E\x63\x74\x79\x70\x65\x3D\x27\x6D\x75\x6C\x74\x69\x70\x61\x72\x74\x2F\x66\x6F"
+"\x72\x6D\x2D\x64\x61\x74\x61\x27\x26\x67\x74\x3B\x5C\x6E\x22\x29\x3B\xA\x9\x70\x72\x69\x6E\x74\x66\x28"
+"\x22\x26\x6C\x74\x3B\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x66\x69\x6C\x65\x20\x6E\x61\x6D\x65\x3D"
+"\x69\x6D\x61\x67\x65\x26\x67\x74\x3B\x26\x6C\x74\x3B\x42\x52\x26\x67\x74\x3B\x5C\x6E\x22\x29\x3B\xA\x9"
+"\x70\x72\x69\x6E\x74\x66\x28\x22\x26\x6C\x74\x3B\x2F\x66\x6F\x72\x6D\x26\x67\x74\x3B\x5C\x6E\x22\x29\x3B"
+"\xA\x9\x69\x66\x28\x73\x74\x72\x6C\x65\x6E\x28\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x3E\x4D\x75"
+"\x6C\x74\x69\x50\x61\x72\x74\x28\x22\x69\x6D\x61\x67\x65\x22\x29\x2E\x64\x61\x74\x61\x29\x29\x20\x7B\xA"
+"\x9\x9\x70\x72\x69\x6E\x74\x66\x28\x22\x25\x73\x26\x6C\x74\x3B\x42\x52\x26\x67\x74\x3B\x26\x6C\x74\x3B"
+"\x69\x6D\x67\x20\x73\x72\x63\x3D\x27\x2F\x3F\x69\x6D\x67\x3D\x25\x73\x2E\x6A\x70\x67\x27\x26\x67\x74\x3B"
+"\x5C\x6E\x22\x2C\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x3E\x4D\x75\x6C\x74\x69\x50\x61\x72\x74\x28"
+"\x22\x69\x6D\x61\x67\x65\x22\x29\x2E\x66\x69\x6C\x65\x6E\x61\x6D\x65\x2C\x43\x6C\x69\x65\x6E\x74\x49\x6E"
+"\x66\x6F\x2D\x3E\x4D\x75\x6C\x74\x69\x50\x61\x72\x74\x28\x22\x69\x6D\x61\x67\x65\x22\x29\x2E\x66\x69\x6C"
+"\x65\x6E\x61\x6D\x65\x29\x3B\xA\x9\x9\x66\x72\x65\x65\x28\x69\x6D\x61\x67\x65\x2E\x64\x61\x74\x61\x29"
+"\x3B\xA\x9\x9\x69\x6D\x61\x67\x65\x2E\x64\x61\x74\x61\x3D\x6D\x61\x6C\x6C\x6F\x63\x28\x43\x6C\x69\x65"
+"\x6E\x74\x49\x6E\x66\x6F\x2D\x3E\x4D\x75\x6C\x74\x69\x50\x61\x72\x74\x28\x22\x69\x6D\x61\x67\x65\x22\x29"
+"\x2E\x73\x69\x7A\x65\x2B\x31\x29\x3B\xA\x9\x9\x6D\x65\x6D\x63\x70\x79\x28\x69\x6D\x61\x67\x65\x2E\x64"
+"\x61\x74\x61\x2C\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x3E\x4D\x75\x6C\x74\x69\x50\x61\x72\x74\x28"
+"\x22\x69\x6D\x61\x67\x65\x22\x29\x2E\x64\x61\x74\x61\x2C\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x3E"
+"\x4D\x75\x6C\x74\x69\x50\x61\x72\x74\x28\x22\x69\x6D\x61\x67\x65\x22\x29\x2E\x73\x69\x7A\x65\x29\x3B\xA"
+"\x9\x9\x69\x6D\x61\x67\x65\x2E\x73\x69\x7A\x65\x3D\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x3E\x4D"
+"\x75\x6C\x74\x69\x50\x61\x72\x74\x28\x22\x69\x6D\x61\x67\x65\x22\x29\x2E\x73\x69\x7A\x65\x3B\xA\x9\x7D"
+"\x65\x6C\x73\x65\x20\x7B\xA\x9\x9\x66\x72\x65\x65\x28\x69\x6D\x61\x67\x65\x2E\x64\x61\x74\x61\x29\x3B"
+"\xA\x9\x9\x69\x6D\x61\x67\x65\x2E\x64\x61\x74\x61\x3D\x4E\x55\x4C\x4C\x3B\xA\x9\x7D\x3B\xA\x9\x70"
+"\x72\x69\x6E\x74\x66\x28\x22\x26\x6C\x74\x3B\x2F\x42\x4F\x44\x59\x26\x67\x74\x3B\x5C\x6E\x22\x29\x3B\xA"
+"\x9\x70\x72\x69\x6E\x74\x66\x28\x22\x26\x6C\x74\x3B\x2F\x48\x54\x4D\x4C\x26\x67\x74\x3B\x5C\x6E\x22\x29"
+"\x3B\xA\x7D\x3B\xA\xA\xA\xA\x6D\x61\x69\x6E\x28\x29\x20\x7B\xA\x9\x73\x74\x72\x75\x63\x74\x20\x77"
+"\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x20\x73\x65\x72\x76\x65\x72\x3B\xA\x9\x69\x66\x28\x21\x77\x65\x62"
+"\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x69\x74\x28\x26\x73\x65\x72\x76\x65\x72\x2C\x38\x30\x2C\x22\x74"
+"\x65\x73\x74\x65\x2E\x6C\x6F\x67\x22\x2C\x30\x29\x29\x20\x7B\xA\x9\x9\x66\x70\x72\x69\x6E\x74\x66\x28"
+"\x73\x74\x64\x65\x72\x72\x2C\x22\x63\x61\x6E\x27\x74\x20\x6F\x70\x65\x6E\x20\x6C\x69\x73\x74\x65\x6E\x20"
+"\x73\x6F\x63\x6B\x65\x74\x5C\x6E\x22\x29\x3B\xA\x9\x7D\x3B\xA\x9\x77\x65\x62\x5F\x73\x65\x72\x76\x65"
+"\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x28\x26\x73\x65\x72\x76\x65\x72\x2C\x22\x2A\x20\x2F\x22"
+"\x2C\x69\x6D\x61\x67\x65\x6F\x75\x74\x2C\x30\x29\x3B\xA\x9\x77\x68\x69\x6C\x65\x28\x31\x29\x20\x7B\xA"
+"\x9\x9\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x72\x75\x6E\x28\x26\x73\x65\x72\x76\x65\x72\x29\x3B"
+"\xA\x9\x7D\x3B\xA\x7D\x3B\xA\x3C\x2F\x50\x52\x45\x3E\x3C\x2F\x43\x4F\x44\x45\x3E\xA\x3C\x2F\x54\x44"
+"\x3E\x3C\x2F\x54\x52\x3E\x3C\x2F\x54\x41\x42\x4C\x45\x3E\xA\x3C\x48\x52\x3E\x3C\x42\x52\x3E\xA\xA\xA"
+"\x3C\x63\x65\x6E\x74\x65\x72\x3E\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x61\x75\x74\x68\x3E\x3C\x42\x3E\x3C\x66"
+"\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37\x37\x27\x3E\x3C\x61\x20\x68\x72\x65\x66"
+"\x3D\x27\x2F\x61\x75\x74\x68\x27\x3E\x3C\x48\x33\x3E\x41\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x69\x6F"
+"\x6E\x3C\x2F\x48\x33\x3E\x3C\x2F\x61\x3E\x20\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\x3C\x2F\x63\x65"
+"\x6E\x74\x65\x72\x3E\xA\x3C\x73\x6D\x61\x6C\x6C\x3E\x20\x3C\x42\x3E\x75\x73\x65\x64\x20\x66\x75\x6E\x63"
+"\x74\x69\x6F\x6E\x73\x3A\x3C\x2F\x42\x3E\x3C\x42\x52\x3E\xA\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F"
+"\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F"
+"\x69\x6E\x69\x74\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x69\x74\x3C\x2F\x61\x3E\x3C"
+"\x42\x52\x3E\xA\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69"
+"\x6F\x6E\x73\x23\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x27"
+"\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x3C\x2F\x61\x3E"
+"\x3C\x42\x52\x3E\xA\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74"
+"\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x72\x75\x6E\x27\x3E\x77\x65\x62\x5F\x73"
+"\x65\x72\x76\x65\x72\x5F\x72\x75\x6E\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA\x3C\x61\x20\x68\x72\x65\x66\x3D"
+"\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x63\x6C\x69\x65"
+"\x6E\x74\x5F\x48\x54\x54\x50\x64\x69\x72\x65\x63\x74\x69\x76\x65\x27\x3E\x77\x65\x62\x5F\x63\x6C\x69\x65"
+"\x6E\x74\x5F\x48\x54\x54\x50\x64\x69\x72\x65\x63\x74\x69\x76\x65\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA\x3C"
+"\x2F\x73\x6D\x61\x6C\x6C\x3E\x3C\x42\x52\x3E\xA\xA\x48\x65\x72\x65\x20\x77\x65\x27\x72\x65\x20\x75\x73"
+"\x69\x6E\x67\x20\x74\x68\x65\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75"
+"\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x48\x54\x54\x50\x64\x69\x72"
+"\x65\x63\x74\x69\x76\x65\x27\x3E\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x48\x54\x54\x50\x64\x69\x72"
+"\x65\x63\x74\x69\x76\x65\x3C\x2F\x61\x3E\x20\x74\x6F\x20\x73\x65\x74\x20\x75\x70\x20\x74\x68\x65\x20\x73"
+"\x65\x72\x76\x65\x72\x20\x72\x65\x73\x70\x6F\x6E\x73\x65\xA\xA\x3C\x42\x52\x3E\x3C\x42\x52\x3E\xA\x75"
+"\x73\x65\x72\x3A\x20\x22\x75\x73\x65\x72\x6E\x61\x6D\x65\x22\x2C\x20\x70\x61\x73\x73\x3A\x20\x22\x70\x61"
+"\x73\x73\x77\x6F\x72\x64\x22\xA\x3C\x42\x52\x3E\xA\x3C\x54\x41\x42\x4C\x45\x20\x77\x69\x64\x74\x68\x3D"
+"\x27\x31\x30\x30\x25\x27\x20\x62\x67\x63\x6F\x6C\x6F\x72\x3D\x27\x43\x46\x43\x46\x43\x46\x27\x20\x62\x6F"
+"\x72\x64\x65\x72\x3D\x30\x3E\x3C\x54\x52\x3E\x3C\x54\x44\x3E\xA\x3C\x43\x4F\x44\x45\x3E\x3C\x50\x52\x45"
+"\x3E\xA\x23\x69\x6E\x63\x6C\x75\x64\x65\x20\x22\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x2E\x68\x22\xA"
+"\x23\x69\x6E\x63\x6C\x75\x64\x65\x20\x26\x6C\x74\x3B\x73\x74\x64\x69\x6F\x2E\x68\x26\x67\x74\x3B\xA\x23"
+"\x69\x6E\x63\x6C\x75\x64\x65\x20\x26\x6C\x74\x3B\x73\x74\x72\x69\x6E\x67\x2E\x68\x26\x67\x74\x3B\xA\xA"
+"\xA\x76\x6F\x69\x64\x20\x75\x72\x6C\x61\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x28\x29\x20\x7B\xA"
+"\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x28\x21\x73\x74\x72\x6C\x65\x6E\x28\x43\x6C\x69\x65\x6E\x74\x49"
+"\x6E\x66\x6F\x2D\x3E\x75\x73\x65\x72\x29\x20\x7C\x7C\x20\x21\x73\x74\x72\x6C\x65\x6E\x28\x43\x6C\x69\x65"
+"\x6E\x74\x49\x6E\x66\x6F\x2D\x3E\x70\x61\x73\x73\x29\x20\x26\x26\xA\x20\x20\x20\x20\x20\x20\x20\x20\x20"
+"\x20\x20\x20\x73\x74\x72\x63\x6D\x70\x28\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x3E\x75\x73\x65\x72"
+"\x2C\x22\x75\x73\x65\x72\x6E\x61\x6D\x65\x22\x29\x20\x7C\x7C\x20\x73\x74\x72\x63\x6D\x70\x28\x43\x6C\x69"
+"\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x3E\x70\x61\x73\x73\x2C\x22\x70\x61\x73\x73\x77\x6F\x72\x64\x22\x29\x29"
+"\x20\x7B\x20\x2F\x2F\x20\x79\x6F\x75\x20\x63\x61\x6E\x20\x72\x65\x61\x64\x20\x74\x68\x69\x6E\x67\x73\x20"
+"\x66\x72\x6F\x6D\x20\x61\x20\x61\x75\x74\x68\x20\x66\x69\x6C\x65\xA\x20\x20\x20\x20\x20\x20\x20\x20\x20"
+"\x20\x20\x20\x20\x20\x20\x20\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x48\x54\x54\x50\x64\x69\x72\x65"
+"\x63\x74\x69\x76\x65\x28\x22\x48\x54\x54\x50\x2F\x31\x2E\x31\x20\x34\x30\x31\x20\x41\x75\x74\x68\x6F\x72"
+"\x69\x7A\x61\x74\x69\x6F\x6E\x20\x52\x65\x71\x75\x69\x72\x65\x64\x22\x29\x3B\xA\x20\x20\x20\x20\x20\x20"
+"\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x70\x72\x69\x6E\x74\x66\x28\x22\x57\x57\x57\x2D\x41\x75\x74\x68"
+"\x65\x6E\x74\x69\x63\x61\x74\x65\x3A\x20\x42\x61\x73\x69\x63\x20\x72\x65\x61\x6C\x6D\x3D\x5C\x22\x54\x68"
+"\x69\x73\x20\x73\x69\x74\x65\x20\x69\x6E\x66\x6F\x5C\x22\x5C\x72\x5C\x6E\x22\x29\x3B\xA\x20\x20\x20\x20"
+"\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x70\x72\x69\x6E\x74\x66\x28\x22\x43\x6F\x6E\x74\x65\x6E"
+"\x74\x2D\x74\x79\x70\x65\x3A\x20\x74\x65\x78\x74\x2F\x68\x74\x6D\x6C\x5C\x72\x5C\x6E\x5C\x72\x5C\x6E\x22"
+"\x29\x3B\xA\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x70\x72\x69\x6E\x74\x66\x28"
+"\x22\x26\x6C\x74\x3B\x42\x4F\x44\x59\x26\x67\x74\x3B\x5C\x6E\x22\x29\x3B\xA\x20\x20\x20\x20\x20\x20\x20"
+"\x20\x20\x20\x20\x20\x20\x20\x20\x20\x70\x72\x69\x6E\x74\x66\x28\x22\x26\x6C\x74\x3B\x66\x6F\x6E\x74\x20"
+"\x63\x6F\x6C\x6F\x72\x3D\x27\x46\x46\x30\x30\x30\x30\x27\x26\x67\x74\x3B\x41\x63\x63\x65\x73\x73\x20\x64"
+"\x65\x6E\x69\x65\x64\x26\x6C\x74\x3B\x2F\x66\x6F\x6E\x74\x26\x67\x74\x3B\x5C\x6E\x22\x29\x3B\xA\x20\x20"
+"\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x70\x72\x69\x6E\x74\x66\x28\x22\x26\x6C\x74\x3B"
+"\x2F\x42\x4F\x44\x59\x26\x67\x74\x3B\x5C\x6E\x22\x29\x3B\xA\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
+"\x20\x20\x20\x20\x20\x72\x65\x74\x75\x72\x6E\x3B\xA\x20\x20\x20\x20\x20\x20\x20\x20\x7D\xA\x20\x20\x20"
+"\x20\x20\x20\x20\x20\x70\x72\x69\x6E\x74\x66\x28\x22\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x74\x79\x70\x65\x3A"
+"\x20\x74\x65\x78\x74\x2F\x68\x74\x6D\x6C\x5C\x72\x5C\x6E\x5C\x72\x5C\x6E\x22\x29\x3B\x20\x20\x20\x20\x20"
+"\x20\x20\x20\x20\xA\x20\x20\x20\x20\x20\x20\x20\x20\x70\x72\x69\x6E\x74\x66\x28\x22\x26\x6C\x74\x3B\x42"
+"\x4F\x44\x59\x20\x62\x67\x63\x6F\x6C\x6F\x72\x3D\x27\x45\x46\x45\x46\x45\x46\x27\x26\x67\x74\x3B\x5C\x6E"
+"\x22\x29\x3B\x20\x20\x20\x20\x20\x20\x20\x20\xA\x20\x20\x20\x20\x20\x20\x20\x20\x70\x72\x69\x6E\x74\x66"
+"\x28\x22\x59\x6F\x75\x20\x65\x6E\x74\x65\x72\x65\x64\x20\x69\x6E\x20\x79\x6F\x75\x72\x20\x61\x72\x65\x61"
+"\x5C\x6E\x22\x29\x3B\xA\x20\x20\x20\x20\x20\x20\x20\x20\x70\x72\x69\x6E\x74\x66\x28\x22\x26\x6C\x74\x3B"
+"\x2F\x42\x4F\x44\x59\x26\x67\x74\x3B\x26\x6C\x74\x3B\x2F\x48\x54\x4D\x4C\x26\x67\x74\x3B\x5C\x6E\x22\x29"
+"\x3B\xA\x7D\x3B\xA\xA\xA\x6D\x61\x69\x6E\x28\x29\x20\x7B\xA\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74"
+"\x72\x75\x63\x74\x20\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x20\x73\x65\x72\x76\x65\x72\x3B\x20\x2F\x2F"
+"\x20\x73\x65\x72\x76\x65\x72\x20\x68\x61\x6E\x64\x6C\x65\x72\xA\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66"
+"\x28\x21\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x69\x74\x28\x26\x73\x65\x72\x76\x65\x72\x2C"
+"\x38\x33\x2C\x22\x68\x65\x6C\x70\x2E\x6C\x6F\x67\x22\x2C\x30\x29\x29\x20\x7B\x20\x2F\x2F\x20\x69\x6E\x69"
+"\x74\x69\x61\x6C\x69\x7A\x65\xA\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x70"
+"\x72\x69\x6E\x74\x66\x28\x73\x74\x64\x65\x72\x72\x2C\x22\x63\x61\x6E\x27\x74\x20\x6F\x70\x65\x6E\x20\x6C"
+"\x69\x73\x74\x65\x6E\x20\x73\x6F\x63\x6B\x65\x74\x5C\x6E\x22\x29\x3B\xA\x20\x20\x20\x20\x20\x20\x20\x20"
+"\x7D\x3B\xA\xA\x20\x20\x20\x20\x20\x20\x20\x20\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64"
+"\x68\x61\x6E\x64\x6C\x65\x72\x28\x26\x73\x65\x72\x76\x65\x72\x2C\x22\x2A\x20\x2F\x61\x75\x74\x68\x22\x2C"
+"\x75\x72\x6C\x61\x75\x74\x68\x65\x6E\x74\x69\x63\x61\x74\x65\x2C\x30\x29\x3B\xA\x20\x20\x20\x20\x20\x20"
+"\x20\x20\x77\x68\x69\x6C\x65\x28\x31\x29\x20\x7B\xA\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
+"\x20\x20\x20\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x72\x75\x6E\x28\x26\x73\x65\x72\x76\x65\x72\x29"
+"\x3B\x20\x20\x20\x2F\x2F\x20\x72\x75\x6E\x20\x73\x65\x72\x76\x65\x72\xA\x20\x20\x20\x20\x20\x20\x20\x20"
+"\x7D\x3B\xA\x7D\x3B\xA\x3C\x2F\x50\x52\x45\x3E\x3C\x2F\x43\x4F\x44\x45\x3E\xA\x3C\x2F\x54\x44\x3E\x3C"
+"\x2F\x54\x52\x3E\x3C\x2F\x54\x41\x42\x4C\x45\x3E\xA\x3C\x48\x52\x3E\x3C\x42\x52\x3E\xA\xA\xA\x3C\x43"
+"\x45\x4E\x54\x45\x52\x3E\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x73\x73\x6C\x3E\x3C\x42\x3E\x3C\x66\x6F\x6E\x74"
+"\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37\x37\x27\x3E\x3C\x48\x33\x3E\x6F\x70\x65\x6E\x73\x73"
+"\x6C\x20\x66\x6F\x72\x20\x28\x68\x74\x74\x70\x73\x29\x3C\x2F\x48\x33\x3E\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C"
+"\x2F\x42\x3E\x3C\x2F\x43\x45\x4E\x54\x45\x52\x3E\xA\x3C\x73\x6D\x61\x6C\x6C\x3E\x20\x3C\x42\x3E\x75\x73"
+"\x65\x64\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x3A\x3C\x2F\x42\x3E\x3C\x42\x52\x3E\xA\x3C\x61\x20\x68"
+"\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F"
+"\x73\x65\x72\x76\x65\x72\x5F\x48\x54\x54\x50\x64\x69\x72\x65\x63\x74\x69\x76\x65\x27\x3E\x77\x65\x62\x5F"
+"\x73\x65\x72\x76\x65\x72\x5F\x75\x73\x65\x53\x53\x4C\x63\x65\x72\x74\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA"
+"\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23"
+"\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x69\x74\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65"
+"\x72\x5F\x69\x6E\x69\x74\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F"
+"\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F"
+"\x72\x75\x6E\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x72\x75\x6E\x3C\x2F\x61\x3E\x3C\x42\x52"
+"\x3E\xA\x3C\x2F\x73\x6D\x61\x6C\x6C\x3E\x3C\x42\x52\x3E\xA\xA\x48\x65\x72\x65\x20\x77\x65\x20\x73\x65"
+"\x74\x75\x70\x20\x61\x20\x73\x65\x72\x76\x65\x72\x20\x61\x6E\x64\x20\x77\x65\x20\x75\x73\x65\x20\x74\x68"
+"\x65\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E"
+"\x73\x23\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x75\x73\x65\x53\x53\x4C\x63\x65\x72\x74\x27\x3E\x77"
+"\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x75\x73\x65\x53\x53\x4C\x63\x65\x72\x74\x3C\x2F\x61\x3E\x20\x74"
+"\x6F\x20\x75\x73\x65\x20\x73\x70\x65\x63\x69\x66\x69\x63\x20\x63\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65"
+"\x20\x66\x69\x6C\x65\xA\x61\x6E\x64\x20\x77\x65\x20\x73\x74\x61\x72\x74\x20\x74\x68\x65\x20\x73\x65\x72"
+"\x76\x65\x72\x20\x77\x69\x74\x68\x20\x74\x68\x65\x20\x66\x6C\x61\x67\x20\x57\x53\x5F\x55\x53\x45\x53\x53"
+"\x4C\x20\x66\x6F\x72\x20\x73\x65\x63\x75\x72\x65\x20\x63\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x73\x20\x28"
+"\x6C\x69\x62\x77\x65\x62\x73\x65\x72\x76\x65\x72\x20\x63\x6F\x6D\x70\x69\x6C\x65\x64\x20\x77\x2F\x20\x6F"
+"\x70\x65\x6E\x73\x73\x6C\x29\x3C\x42\x52\x3E\x3C\x42\x52\x3E\xA\xA\x53\x65\x65\x20\x61\x6C\x73\x6F\x20"
+"\x74\x68\x65\x20\x70\x61\x63\x6B\x65\x74\x6D\x6F\x75\x6E\x74\x65\x72\x20\x65\x78\x61\x6D\x70\x6C\x65\x20"
+"\x69\x6E\x20\x74\x68\x65\x20\x65\x78\x61\x6D\x70\x6C\x65\x20\x64\x69\x72\x65\x63\x74\x6F\x72\x79\x2E\x20"
+"\xA\x3C\x42\x52\x3E\xA\x3C\x54\x41\x42\x4C\x45\x20\x77\x69\x64\x74\x68\x3D\x27\x31\x30\x30\x25\x27\x20"
+"\x62\x67\x63\x6F\x6C\x6F\x72\x3D\x27\x43\x46\x43\x46\x43\x46\x27\x20\x62\x6F\x72\x64\x65\x72\x3D\x30\x3E"
+"\x3C\x54\x52\x3E\x3C\x54\x44\x3E\xA\x3C\x43\x4F\x44\x45\x3E\x3C\x50\x52\x45\x3E\xA\xA\x20\x20\xA\x23"
+"\x69\x6E\x63\x6C\x75\x64\x65\x20\x22\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x2E\x68\x22\xA\xA\x69\x6E"
+"\x74\x20\x6D\x61\x69\x6E\x28\x29\xA\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x77\x65"
+"\x62\x5F\x73\x65\x72\x76\x65\x72\x20\x73\x65\x72\x76\x65\x72\x73\x73\x6C\x3B\xA\x20\x20\x20\x20\x20\x20"
+"\x20\x20\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x75\x73\x65\x53\x53\x4C\x63\x65\x72\x74\x28\x26\x73"
+"\x65\x72\x76\x65\x72\x73\x73\x6C\x2C\x22\x66\x6F\x6F\x2D\x63\x65\x72\x74\x2E\x70\x65\x6D\x22\x29\x3B\x20"
+"\x2F\x2F\x20\x43\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x20\x66\x69\x6C\x65\x20\x20\x20\x20\xA\x20\x20"
+"\x20\x20\x20\x20\x20\x20\x69\x66\x28\x21\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x69\x74\x28"
+"\x26\x73\x65\x72\x76\x65\x72\x73\x73\x6C\x2C\x34\x34\x33\x2C\x22\x68\x65\x6C\x70\x2E\x6C\x6F\x67\x22\x2C"
+"\x57\x53\x5F\x55\x53\x45\x53\x53\x4C\x29\x29\x20\x7B\xA\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
+"\x20\x20\x20\x20\x66\x70\x72\x69\x6E\x74\x66\x28\x73\x74\x64\x65\x72\x72\x2C\x22\x43\x61\x6E\x6E\x6F\x74"
+"\x20\x6F\x70\x65\x6E\x20\x70\x6F\x72\x74\x5C\x6E\x22\x29\x3B\xA\x20\x20\x20\x20\x20\x20\x20\x20\x7D\x3B"
+"\xA\x20\x20\x20\x20\x20\x20\x20\x20\x77\x68\x69\x6C\x65\x28\x31\x29\x20\x7B\xA\x20\x20\x20\x20\x20\x20"
+"\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x72\x75\x6E\x28\x26"
+"\x73\x65\x72\x76\x65\x72\x73\x73\x6C\x29\x3B\xA\x20\x20\x20\x20\x20\x20\x20\x20\x7D\x3B\xA\x7D\x3B\xA"
+"\x3C\x2F\x50\x52\x45\x3E\x3C\x2F\x43\x4F\x44\x45\x3E\xA\x3C\x2F\x54\x44\x3E\x3C\x2F\x54\x52\x3E\x3C\x2F"
+"\x54\x41\x42\x4C\x45\x3E\xA\x41\x6C\x6C\x20\x74\x68\x65\x20\x72\x65\x73\x74\x20\x69\x73\x20\x74\x68\x65"
+"\x20\x73\x61\x6D\x65\x20\x61\x73\x20\x77\x69\x74\x68\x6F\x75\x74\x20\x53\x53\x4C\x2E\x20\xA\x3C\x48\x52"
+"\x3E\x3C\x42\x52\x3E\xA\xA\xA\x3C\x63\x65\x6E\x74\x65\x72\x3E\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x6F\x75"
+"\x74\x67\x69\x66\x3E\x3C\x42\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37"
+"\x37\x27\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x67\x69\x66\x27\x3E\x3C\x48\x33\x3E\x47\x69\x66\x20"
+"\x67\x65\x6E\x65\x72\x61\x74\x6F\x72\x3C\x2F\x48\x33\x3E\x3C\x2F\x61\x3E\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C"
+"\x2F\x42\x3E\x3C\x2F\x63\x65\x6E\x74\x65\x72\x3E\xA\x3C\x73\x6D\x61\x6C\x6C\x3E\x20\x3C\x42\x3E\x75\x73"
+"\x65\x64\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x3B\x3C\x2F\x42\x3E\x3C\x42\x52\x3E\xA\x3C\x61\x20\x68"
+"\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F"
+"\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x69\x74\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E"
+"\x69\x74\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70"
+"\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68"
+"\x61\x6E\x64\x6C\x65\x72\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64"
+"\x6C\x65\x72\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C"
+"\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x72\x75\x6E"
+"\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x72\x75\x6E\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA\x3C"
+"\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77"
+"\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x67\x69\x66\x73\x65\x74\x70\x61\x6C\x65\x74\x74\x65\x27\x3E\x77"
+"\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x67\x69\x66\x73\x65\x74\x70\x61\x6C\x65\x74\x74\x65\x3C\x2F\x61"
+"\x3E\x3C\x42\x52\x3E\xA\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63"
+"\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x67\x69\x66\x6F\x75\x74\x70\x75\x74"
+"\x27\x3E\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x67\x69\x66\x6F\x75\x74\x70\x75\x74\x3C\x2F\x61\x3E"
+"\x3C\x42\x52\x3E\xA\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74"
+"\x69\x6F\x6E\x73\x23\x63\x6C\x69\x65\x6E\x74\x69\x6E\x66\x6F\x27\x3E\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66"
+"\x6F\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA\x3C\x2F\x73\x6D\x61\x6C\x6C\x3E\x3C\x42\x52\x3E\xA\xA\x54\x68"
+"\x69\x73\x20\x65\x78\x61\x6D\x70\x6C\x65\x20\x64\x72\x61\x77\x73\x20\x61\x6E\x20\x63\x69\x72\x63\x6C\x65"
+"\x20\x61\x74\x20\x78\x2C\x79\x20\x72\x65\x71\x75\x65\x73\x74\x65\x64\x20\x62\x79\x20\x63\x6C\x69\x65\x6E"
+"\x74\x2C\x20\x61\x6E\x64\x20\x6F\x75\x74\x70\x75\x74\x73\x20\x77\x69\x74\x68\x20\x66\x75\x6E\x63\x74\x69"
+"\x6F\x6E\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F"
+"\x6E\x73\x23\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x67\x69\x66\x6F\x75\x74\x70\x75\x74\x27\x3E\x77"
+"\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x67\x69\x66\x6F\x75\x74\x70\x75\x74\x3C\x2F\x61\x3E\xA\xA\xA"
+"\x3C\x42\x52\x3E\x3C\x42\x52\x3E\xA\x3C\x54\x41\x42\x4C\x45\x20\x77\x69\x64\x74\x68\x3D\x27\x31\x30\x30"
+"\x25\x27\x20\x62\x67\x63\x6F\x6C\x6F\x72\x3D\x27\x43\x46\x43\x46\x43\x46\x27\x20\x62\x6F\x72\x64\x65\x72"
+"\x3D\x30\x3E\x3C\x54\x52\x3E\x3C\x54\x44\x3E\xA\x3C\x43\x4F\x44\x45\x3E\x3C\x50\x52\x45\x3E\xA\x23\x69"
+"\x6E\x63\x6C\x75\x64\x65\x20\x22\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x2E\x68\x22\xA\x23\x69\x6E\x63"
+"\x6C\x75\x64\x65\x20\x26\x6C\x74\x3B\x73\x74\x64\x69\x6F\x2E\x68\x26\x67\x74\x3B\xA\x23\x69\x6E\x63\x6C"
+"\x75\x64\x65\x20\x26\x6C\x74\x3B\x6D\x61\x74\x68\x2E\x68\x26\x67\x74\x3B\xA\xA\xA\x23\x64\x65\x66\x69"
+"\x6E\x65\x20\x47\x49\x46\x53\x49\x44\x45\x20\x33\x32\x30\xA\x63\x68\x61\x72\x20\x67\x69\x66\x64\x61\x74"
+"\x61\x5B\x47\x49\x46\x53\x49\x44\x45\x2A\x47\x49\x46\x53\x49\x44\x45\x5D\x3B\xA\x76\x6F\x69\x64\x20\x6F"
+"\x75\x74\x67\x69\x66\x28\x29\x20\x7B\xA\x9\x66\x6C\x6F\x61\x74\x20\x69\x3B\xA\x9\x69\x6E\x74\x20\x78"
+"\x2C\x79\x2C\x78\x63\x2C\x79\x63\x3B\xA\x9\x69\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3B\xA\x9\x77\x65\x62"
+"\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x67\x69\x66\x73\x65\x74\x70\x61\x6C\x65\x74\x74\x65\x28\x22\x45\x47\x41"
+"\x22\x29\x3B\xA\x9\x69\x66\x28\x2A\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x3E\x51\x75\x65\x72\x79"
+"\x28\x22\x69\x6D\x67\x22\x29\x21\x3D\x30\x29\x20\x7B\xA\x9\x9\x70\x72\x69\x6E\x74\x66\x28\x22\x43\x6F"
+"\x6E\x74\x65\x6E\x74\x2D\x74\x79\x70\x65\x3A\x20\x69\x6D\x61\x67\x65\x2F\x67\x69\x66\x5C\x72\x5C\x6E\x5C"
+"\x72\x5C\x6E\x22\x29\x3B\xA\x9\x9\x69\x66\x28\x21\x73\x74\x72\x63\x6D\x70\x28\x43\x6C\x69\x65\x6E\x74"
+"\x49\x6E\x66\x6F\x2D\x3E\x51\x75\x65\x72\x79\x28\x22\x69\x6D\x67\x22\x29\x2C\x22\x63\x69\x72\x63\x6C\x65"
+"\x22\x29\x29\x20\x7B\xA\x9\x9\x9\x78\x63\x3D\x61\x74\x6F\x69\x28\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66"
+"\x6F\x2D\x3E\x51\x75\x65\x72\x79\x28\x22\x78\x22\x29\x29\x25\x47\x49\x46\x53\x49\x44\x45\x3B\xA\x9\x9"
+"\x9\x79\x63\x3D\x61\x74\x6F\x69\x28\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x3E\x51\x75\x65\x72\x79"
+"\x28\x22\x79\x22\x29\x29\x25\x47\x49\x46\x53\x49\x44\x45\x3B\xA\x9\x9\x9\x63\x6F\x6C\x6F\x72\x3D\x28"
+"\x72\x61\x6E\x64\x28\x29\x25\x31\x35\x29\x2B\x31\x3B\xA\x9\x9\x9\x66\x6F\x72\x28\x69\x3D\x30\x3B\x69"
+"\x3C\x36\x2E\x32\x38\x3B\x69\x2B\x3D\x30\x2E\x30\x31\x29\x20\x7B\xA\x9\x9\x9\x9\x78\x3D\x28\x69\x6E"
+"\x74\x29\x28\x47\x49\x46\x53\x49\x44\x45\x2B\x28\x78\x63\x2B\x63\x6F\x73\x28\x69\x29\x2A\x31\x30\x29\x29"
+"\x25\x47\x49\x46\x53\x49\x44\x45\x3B\xA\x9\x9\x9\x9\x79\x3D\x28\x69\x6E\x74\x29\x28\x47\x49\x46\x53"
+"\x49\x44\x45\x2B\x28\x79\x63\x2B\x73\x69\x6E\x28\x69\x29\x2A\x31\x30\x29\x29\x25\x47\x49\x46\x53\x49\x44"
+"\x45\x3B\xA\x9\x9\x9\x9\x67\x69\x66\x64\x61\x74\x61\x5B\x78\x2B\x28\x79\x2A\x47\x49\x46\x53\x49\x44"
+"\x45\x29\x5D\x3D\x63\x6F\x6C\x6F\x72\x3B\xA\x9\x9\x9\x7D\x3B\xA\x9\x9\x7D\x3B\xA\x9\x9\x77\x65"
+"\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x67\x69\x66\x6F\x75\x74\x70\x75\x74\x28\x67\x69\x66\x64\x61\x74\x61"
+"\x2C\x47\x49\x46\x53\x49\x44\x45\x2C\x47\x49\x46\x53\x49\x44\x45\x29\x3B\xA\x9\x7D\x3B\xA\x9\x70\x72"
+"\x69\x6E\x74\x66\x28\x22\x26\x6C\x74\x3B\x63\x65\x6E\x74\x65\x72\x26\x67\x74\x3B\x47\x65\x6E\x65\x72\x61"
+"\x74\x65\x64\x20\x61\x20\x63\x69\x72\x63\x6C\x65\x20\x28\x63\x6C\x69\x63\x6B\x20\x69\x6E\x73\x69\x64\x65"
+"\x20\x74\x68\x65\x20\x69\x6D\x61\x67\x65\x29\x26\x6C\x74\x3B\x42\x52\x26\x67\x74\x3B\x5C\x6E\x22\x29\x3B"
+"\xA\x9\x70\x72\x69\x6E\x74\x66\x28\x22\x50\x72\x65\x73\x73\x65\x64\x20\x78\x3D\x25\x73\x2C\x79\x3D\x25"
+"\x73\x26\x6C\x74\x3B\x42\x52\x26\x67\x74\x3B\x5C\x6E\x22\x2C\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D"
+"\x3E\x51\x75\x65\x72\x79\x28\x22\x78\x22\x29\x2C\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x3E\x51\x75"
+"\x65\x72\x79\x28\x22\x79\x22\x29\x29\x3B\xA\x9\x70\x72\x69\x6E\x74\x66\x28\x22\x26\x6C\x74\x3B\x66\x6F"
+"\x72\x6D\x26\x67\x74\x3B\x26\x6C\x74\x3B\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x69\x6D\x61\x67\x65"
+"\x20\x62\x6F\x72\x64\x65\x72\x3D\x30\x20\x73\x72\x63\x3D\x27\x2F\x67\x69\x66\x3F\x69\x6D\x67\x3D\x63\x69"
+"\x72\x63\x6C\x65\x26\x78\x3D\x25\x73\x26\x79\x3D\x25\x73\x27\x26\x67\x74\x3B\x26\x6C\x74\x3B\x2F\x66\x6F"
+"\x72\x6D\x26\x67\x74\x3B\x26\x6C\x74\x3B\x2F\x43\x45\x4E\x54\x45\x52\x26\x67\x74\x3B\x5C\x6E\x22\x2C\x43"
+"\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x3E\x51\x75\x65\x72\x79\x28\x22\x78\x22\x29\x2C\x43\x6C\x69\x65"
+"\x6E\x74\x49\x6E\x66\x6F\x2D\x3E\x51\x75\x65\x72\x79\x28\x22\x79\x22\x29\x29\x3B\xA\x7D\x3B\xA\xA\xA"
+"\x6D\x61\x69\x6E\x28\x29\x20\x7B\xA\x9\x73\x74\x72\x75\x63\x74\x20\x77\x65\x62\x5F\x73\x65\x72\x76\x65"
+"\x72\x20\x73\x65\x72\x76\x65\x72\x3B\x20\x2F\x2F\x20\x73\x65\x72\x76\x65\x72\x20\x68\x61\x6E\x64\x6C\x65"
+"\x72\xA\x9\x6D\x65\x6D\x73\x65\x74\x28\x67\x69\x66\x64\x61\x74\x61\x2C\x30\x2C\x47\x49\x46\x53\x49\x44"
+"\x45\x2A\x47\x49\x46\x53\x49\x44\x45\x29\x3B\xA\x9\x69\x66\x28\x21\x77\x65\x62\x5F\x73\x65\x72\x76\x65"
+"\x72\x5F\x69\x6E\x69\x74\x28\x26\x73\x65\x72\x76\x65\x72\x2C\x38\x33\x2C\x22\x68\x65\x6C\x70\x2E\x6C\x6F"
+"\x67\x22\x2C\x30\x29\x29\x20\x7B\x20\x2F\x2F\x20\x69\x6E\x69\x74\x69\x61\x6C\x69\x7A\x65\xA\x9\x9\x66"
+"\x70\x72\x69\x6E\x74\x66\x28\x73\x74\x64\x65\x72\x72\x2C\x22\x63\x61\x6E\x27\x74\x20\x6F\x70\x65\x6E\x20"
+"\x6C\x69\x73\x74\x65\x6E\x20\x73\x6F\x63\x6B\x65\x74\x5C\x6E\x22\x29\x3B\xA\x9\x7D\x3B\xA\xA\x9\x77"
+"\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x28\x26\x73\x65\x72\x76"
+"\x65\x72\x2C\x22\x2A\x20\x2F\x67\x69\x66\x22\x2C\x6F\x75\x74\x67\x69\x66\x2C\x30\x29\x3B\xA\x9\x77\x68"
+"\x69\x6C\x65\x28\x31\x29\x20\x7B\xA\x9\x9\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x72\x75\x6E\x28"
+"\x26\x73\x65\x72\x76\x65\x72\x29\x3B\x20\x20\x20\x2F\x2F\x20\x72\x75\x6E\x20\x73\x65\x72\x76\x65\x72\xA"
+"\x9\x7D\x3B\xA\x7D\x3B\xA\x3C\x2F\x50\x52\x45\x3E\x3C\x2F\x43\x4F\x44\x45\x3E\xA\x3C\x2F\x54\x44\x3E"
+"\x3C\x2F\x54\x52\x3E\x3C\x2F\x54\x41\x42\x4C\x45\x3E\xA\x3C\x48\x52\x3E\x3C\x42\x52\x3E\xA\xA\xA\xA"
+"\x3C\x43\x45\x4E\x54\x45\x52\x3E\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x63\x6F\x6F\x6B\x69\x65\x3E\x3C\x42\x3E"
+"\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37\x37\x27\x3E\x3C\x61\x20\x68\x72"
+"\x65\x66\x3D\x2F\x63\x6F\x6F\x6B\x69\x65\x3E\x3C\x48\x33\x3E\x43\x6F\x6F\x6B\x69\x65\x73\x3C\x2F\x48\x33"
+"\x3E\x3C\x2F\x61\x3E\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\x3C\x2F\x43\x45\x4E\x54\x45\x52\x3E\xA"
+"\x3C\x73\x6D\x61\x6C\x6C\x3E\x20\x3C\x42\x3E\x75\x73\x65\x64\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x3B"
+"\x3C\x2F\x42\x3E\x3C\x42\x52\x3E\xA\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66"
+"\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x69\x74\x27\x3E"
+"\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x69\x74\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA\x3C\x61"
+"\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65"
+"\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x27\x3E\x77\x65\x62\x5F\x73"
+"\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA\x3C"
+"\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77"
+"\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x72\x75\x6E\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F"
+"\x72\x75\x6E\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C"
+"\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x63\x6C\x69\x65\x6E\x74\x69\x6E\x66\x6F\x27\x3E\x43\x6C"
+"\x69\x65\x6E\x74\x49\x6E\x66\x6F\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA\x3C\x61\x20\x68\x72\x65\x66\x3D\x27"
+"\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E"
+"\x74\x5F\x73\x65\x74\x63\x6F\x6F\x6B\x69\x65\x27\x3E\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x73\x65"
+"\x74\x63\x6F\x6F\x6B\x69\x65\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA\x3C\x2F\x73\x6D\x61\x6C\x6C\x3E\x3C\x42"
+"\x52\x3E\xA\xA\x54\x68\x69\x73\x20\x65\x78\x61\x6D\x70\x6C\x65\x20\x66\x65\x74\x63\x68\x73\x20\x61\x6E"
+"\x20\x63\x6C\x69\x65\x6E\x74\x20\x69\x6E\x70\x75\x74\x20\x61\x6E\x64\x20\x73\x65\x74\x27\x73\x20\x61\x6E"
+"\x20\x63\x6F\x6F\x6B\x69\x65\x20\x66\x6F\x72\x20\x31\x35\x20\x6D\x69\x6E\x75\x74\x65\x73\x20\x22\x2B\x31"
+"\x35\x4D\x22\x20\x75\x73\x69\x6E\x67\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x3C\x61\x20\x68\x72\x65\x66"
+"\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x63\x6C\x69"
+"\x65\x6E\x74\x5F\x73\x65\x74\x63\x6F\x6F\x6B\x69\x65\x27\x3E\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F"
+"\x73\x65\x74\x63\x6F\x6F\x6B\x69\x65\x3C\x2F\x61\x3E\xA\xA\x3C\x42\x52\x3E\x3C\x42\x52\x3E\xA\x3C\x54"
+"\x41\x42\x4C\x45\x20\x77\x69\x64\x74\x68\x3D\x27\x31\x30\x30\x25\x27\x20\x62\x67\x63\x6F\x6C\x6F\x72\x3D"
+"\x27\x43\x46\x43\x46\x43\x46\x27\x20\x62\x6F\x72\x64\x65\x72\x3D\x30\x3E\x3C\x54\x52\x3E\x3C\x54\x44\x3E"
+"\xA\x3C\x43\x4F\x44\x45\x3E\x3C\x50\x52\x45\x3E\xA\x23\x69\x6E\x63\x6C\x75\x64\x65\x20\x22\x77\x65\x62"
+"\x5F\x73\x65\x72\x76\x65\x72\x2E\x68\x22\xA\x23\x69\x6E\x63\x6C\x75\x64\x65\x20\x26\x6C\x74\x3B\x73\x74"
+"\x64\x69\x6F\x2E\x68\x26\x67\x74\x3B\xA\xA\xA\x76\x6F\x69\x64\x20\x63\x6F\x6F\x6B\x69\x65\x28\x29\x20"
+"\x7B\xA\x9\x69\x66\x28\x73\x74\x72\x6C\x65\x6E\x28\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x3E\x50"
+"\x6F\x73\x74\x28\x22\x75\x73\x65\x72\x22\x29\x29\x29\xA\x9\x9\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74"
+"\x5F\x73\x65\x74\x63\x6F\x6F\x6B\x69\x65\x28\x22\x75\x73\x65\x72\x6E\x61\x6D\x65\x22\x2C\x43\x6C\x69\x65"
+"\x6E\x74\x49\x6E\x66\x6F\x2D\x3E\x50\x6F\x73\x74\x28\x22\x75\x73\x65\x72\x22\x29\x2C\x22\x2B\x31\x35\x4D"
+"\x22\x29\x3B\xA\x9\x70\x72\x69\x6E\x74\x66\x28\x22\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x74\x79\x70\x65\x3A"
+"\x20\x74\x65\x78\x74\x2F\x68\x74\x6D\x6C\x5C\x72\x5C\x6E\x5C\x72\x5C\x6E\x22\x29\x3B\xA\x9\x70\x72\x69"
+"\x6E\x74\x66\x28\x22\x26\x6C\x74\x3B\x66\x6F\x72\x6D\x20\x6D\x65\x74\x68\x6F\x64\x3D\x27\x50\x4F\x53\x54"
+"\x27\x26\x67\x74\x3B\x5C\x72\x5C\x6E\x22\x29\x3B\xA\x9\x70\x72\x69\x6E\x74\x66\x28\x22\x26\x6C\x74\x3B"
+"\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x27\x74\x65\x78\x74\x27\x20\x6E\x61\x6D\x65\x3D\x27\x75\x73"
+"\x65\x72\x27\x20\x76\x61\x6C\x75\x65\x3D\x27\x25\x73\x27\x26\x67\x74\x3B\x5C\x72\x5C\x6E\x26\x6C\x74\x3B"
+"\x42\x52\x26\x67\x74\x3B\x22\x2C\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x3E\x43\x6F\x6F\x6B\x69\x65"
+"\x28\x22\x75\x73\x65\x72\x6E\x61\x6D\x65\x22\x29\x29\x3B\xA\x9\x70\x72\x69\x6E\x74\x66\x28\x22\x26\x6C"
+"\x74\x3B\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x27\x73\x75\x62\x6D\x69\x74\x27\x20\x6E\x61\x6D\x65"
+"\x3D\x27\x73\x65\x6E\x64\x27\x20\x76\x61\x6C\x75\x65\x3D\x27\x20\x47\x4F\x21\x20\x27\x26\x67\x74\x3B\x5C"
+"\x72\x5C\x6E\x26\x6C\x74\x3B\x42\x52\x26\x67\x74\x3B\x22\x29\x3B\xA\x9\x70\x72\x69\x6E\x74\x66\x28\x22"
+"\x26\x6C\x74\x3B\x2F\x66\x6F\x72\x6D\x26\x67\x74\x3B\x5C\x72\x5C\x6E\x22\x29\x3B\xA\x7D\xA\xA\x69\x6E"
+"\x74\x20\x6D\x61\x69\x6E\x28\x69\x6E\x74\x20\x61\x72\x67\x63\x2C\x63\x68\x61\x72\x2A\x2A\x20\x61\x72\x67"
+"\x76\x29\x20\x7B\xA\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x77\x65\x62\x5F\x73\x65"
+"\x72\x76\x65\x72\x20\x73\x65\x72\x76\x65\x72\x3B\x20\x2F\x2F\x20\x73\x65\x72\x76\x65\x72\x20\x68\x61\x6E"
+"\x64\x6C\x65\x72\xA\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x28\x21\x77\x65\x62\x5F\x73\x65\x72\x76\x65"
+"\x72\x5F\x69\x6E\x69\x74\x28\x26\x73\x65\x72\x76\x65\x72\x2C\x38\x30\x2C\x22\x68\x65\x6C\x70\x2E\x6C\x6F"
+"\x67\x22\x2C\x30\x29\x29\x20\x7B\x20\x2F\x2F\x20\x69\x6E\x69\x74\x69\x61\x6C\x69\x7A\x65\xA\x20\x20\x20"
+"\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x70\x72\x69\x6E\x74\x66\x28\x73\x74\x64\x65\x72"
+"\x72\x2C\x22\x63\x61\x6E\x27\x74\x20\x6F\x70\x65\x6E\x20\x6C\x69\x73\x74\x65\x6E\x20\x73\x6F\x63\x6B\x65"
+"\x74\x5C\x6E\x22\x29\x3B\xA\x9\x9\x72\x65\x74\x75\x72\x6E\x20\x31\x3B\xA\x20\x20\x20\x20\x20\x20\x20"
+"\x20\x7D\x3B\xA\xA\x20\x20\x20\x20\x20\x20\x20\x20\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64"
+"\x64\x68\x61\x6E\x64\x6C\x65\x72\x28\x26\x73\x65\x72\x76\x65\x72\x2C\x22\x2A\x20\x2F\x2A\x22\x2C\x63\x6F"
+"\x6F\x6B\x69\x65\x2C\x30\x29\x3B\x20\x2F\x2F\x20\x61\x64\x64\x20\x68\x61\x6E\x64\x6C\x65\x72\x20\x66\x6F"
+"\x72\x20\x61\x6C\x6C\x20\x72\x65\x71\x75\x65\x73\x74\x73\xA\x20\x20\x20\x20\x20\x20\x20\x20\x77\x68\x69"
+"\x6C\x65\x28\x31\x29\x20\x7B\xA\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x77\x65"
+"\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x72\x75\x6E\x28\x26\x73\x65\x72\x76\x65\x72\x29\x3B\x20\x20\x20\x2F"
+"\x2F\x20\x72\x75\x6E\x20\x73\x65\x72\x76\x65\x72\xA\x20\x20\x20\x20\x20\x20\x20\x20\x7D\x3B\xA\x7D\xA"
+"\xA\x3C\x2F\x50\x52\x45\x3E\x3C\x2F\x43\x4F\x44\x45\x3E\xA\x3C\x2F\x54\x44\x3E\x3C\x2F\x54\x52\x3E\x3C"
+"\x2F\x54\x41\x42\x4C\x45\x3E\xA\x3C\x48\x52\x3E\x3C\x42\x52\x3E\xA\xA\x3C\x63\x65\x6E\x74\x65\x72\x3E"
+"\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x63\x68\x65\x63\x6B\x62\x6F\x78\x3E\x3C\x42\x3E\x3C\x66\x6F\x6E\x74\x20"
+"\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37\x37\x27\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x2F\x63\x68"
+"\x65\x63\x6B\x62\x6F\x78\x3E\x3C\x48\x33\x3E\x43\x68\x65\x63\x6B\x62\x6F\x78\x3C\x2F\x48\x33\x3E\x3C\x2F"
+"\x61\x3E\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\x3C\x2F\x63\x65\x6E\x74\x65\x72\x3E\xA\x3C\x73\x6D"
+"\x61\x6C\x6C\x3E\x20\x3C\x42\x3E\x75\x73\x65\x64\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x3B\x3C\x2F\x42"
+"\x3E\x3C\x42\x52\x3E\xA\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63"
+"\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x69\x74\x27\x3E\x77\x65\x62"
+"\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x69\x74\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA\x3C\x61\x20\x68\x72"
+"\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x73"
+"\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76"
+"\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA\x3C\x61\x20\x68"
+"\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F"
+"\x73\x65\x72\x76\x65\x72\x5F\x72\x75\x6E\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x72\x75\x6E"
+"\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66"
+"\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x63\x6C\x69\x65\x6E\x74\x69\x6E\x66\x6F\x27\x3E\x43\x6C\x69\x65\x6E"
+"\x74\x49\x6E\x66\x6F\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA\x3C\x2F\x73\x6D\x61\x6C\x6C\x3E\x3C\x42\x52\x3E"
+"\xA\xA\x54\x68\x69\x73\x20\x65\x78\x61\x6D\x70\x6C\x65\x20\x75\x73\x65\x73\x20\x61\x20\x65\x73\x70\x65"
+"\x63\x69\x66\x69\x63\x20\x63\x61\x73\x65\x20\x66\x72\x6F\x6D\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F"
+"\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x63\x6C\x69\x65\x6E\x74\x69\x6E\x66\x6F"
+"\x27\x3E\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x3C\x2F\x61\x3E\x20\x71\x75\x65\x72\x79\x20\x61\x6E\x64"
+"\x20\x70\x6F\x73\x74\x2C\x20\x75\x73\x69\x6E\x67\x20\x74\x68\x65\x20\x27\x23\x27\x20\x61\x73\x20\x70\x72"
+"\x65\x66\x69\x78\x20\x6F\x66\x20\x76\x61\x72\x6E\x61\x6D\x65\x20\x72\x65\x74\x75\x72\x6E\x69\x6E\x67\x20"
+"\x74\x68\x65\x20\x6E\x75\x6D\x62\x65\x72\x20\x6F\x66\x20\x6F\x63\x63\x75\x72\x65\x6E\x63\x65\x73\xA\xA"
+"\xA\x3C\x42\x52\x3E\x3C\x42\x52\x3E\xA\x3C\x54\x41\x42\x4C\x45\x20\x77\x69\x64\x74\x68\x3D\x27\x31\x30"
+"\x30\x25\x27\x20\x62\x67\x63\x6F\x6C\x6F\x72\x3D\x27\x43\x46\x43\x46\x43\x46\x27\x20\x62\x6F\x72\x64\x65"
+"\x72\x3D\x30\x3E\x3C\x54\x52\x3E\x3C\x54\x44\x3E\xA\x3C\x43\x4F\x44\x45\x3E\x3C\x50\x52\x45\x3E\xA\xA"
+"\x23\x69\x6E\x63\x6C\x75\x64\x65\x20\x22\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x2E\x68\x22\xA\x23\x69"
+"\x6E\x63\x6C\x75\x64\x65\x20\x26\x6C\x74\x3B\x73\x74\x64\x69\x6F\x2E\x68\x26\x67\x74\x3B\xA\xA\xA\x76"
+"\x6F\x69\x64\x20\x63\x68\x65\x63\x6B\x62\x6F\x78\x28\x29\x20\x7B\xA\x9\x69\x6E\x74\x20\x69\x3D\x30\x3B"
+"\xA\x9\x63\x68\x61\x72\x20\x2A\x74\x78\x74\x5B\x5D\x3D\x7B\x22\x6F\x6E\x65\x22\x2C\x22\x74\x77\x6F\x22"
+"\x2C\x22\x74\x68\x72\x65\x65\x22\x2C\x22\x66\x6F\x75\x72\x22\x2C\x22\x66\x69\x76\x65\x22\x7D\x3B\xA\x9"
+"\x70\x72\x69\x6E\x74\x66\x28\x22\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x74\x79\x70\x65\x3A\x20\x74\x65\x78\x74"
+"\x2F\x68\x74\x6D\x6C\x5C\x72\x5C\x6E\x5C\x72\x5C\x6E\x22\x29\x3B\xA\x9\x70\x72\x69\x6E\x74\x66\x28\x22"
+"\x26\x6C\x74\x3B\x66\x6F\x72\x6D\x20\x6D\x65\x74\x68\x6F\x64\x3D\x27\x51\x55\x45\x52\x59\x27\x26\x67\x74"
+"\x3B\x5C\x72\x5C\x6E\x22\x29\x3B\xA\x9\xA\x9\x66\x6F\x72\x28\x69\x3D\x30\x3B\x69\x3C\x35\x3B\x69\x2B"
+"\x2B\x29\x20\x7B\x9\xA\x9\x9\x70\x72\x69\x6E\x74\x66\x28\x22\x26\x6C\x74\x3B\x69\x6E\x70\x75\x74\x20"
+"\x74\x79\x70\x65\x3D\x27\x63\x68\x65\x63\x6B\x62\x6F\x78\x27\x20\x6E\x61\x6D\x65\x3D\x27\x6E\x75\x6D\x62"
+"\x65\x72\x27\x20\x76\x61\x6C\x75\x65\x3D\x27\x25\x73\x27\x26\x67\x74\x3B\x5C\x72\x5C\x6E\x26\x6C\x74\x3B"
+"\x42\x52\x26\x67\x74\x3B\x22\x2C\x74\x78\x74\x5B\x69\x5D\x29\x3B\x9\xA\x9\x7D\x3B\xA\x9\x70\x72\x69"
+"\x6E\x74\x66\x28\x22\x26\x6C\x74\x3B\x69\x6E\x70\x75\x74\x20\x74\x79\x70\x65\x3D\x27\x73\x75\x62\x6D\x69"
+"\x74\x27\x20\x6E\x61\x6D\x65\x3D\x27\x73\x65\x6E\x64\x27\x20\x76\x61\x6C\x75\x65\x3D\x27\x20\x53\x45\x4E"
+"\x44\x20\x27\x26\x67\x74\x3B\x5C\x72\x5C\x6E\x26\x6C\x74\x3B\x42\x52\x26\x67\x74\x3B\x22\x29\x3B\xA\x9"
+"\x70\x72\x69\x6E\x74\x66\x28\x22\x26\x6C\x74\x3B\x2F\x66\x6F\x72\x6D\x26\x67\x74\x3B\x5C\x72\x5C\x6E\x22"
+"\x29\x3B\xA\x9\xA\x9\x70\x72\x69\x6E\x74\x66\x28\x22\x59\x6F\x75\x20\x68\x61\x76\x65\x20\x63\x68\x6F"
+"\x6F\x73\x65\x6E\x20\x26\x6C\x74\x3B\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x46\x46\x30\x30\x30"
+"\x30\x27\x26\x67\x74\x3B\x25\x64\x26\x6C\x74\x3B\x2F\x66\x6F\x6E\x74\x26\x67\x74\x3B\x20\x6E\x75\x6D\x62"
+"\x65\x72\x73\x3A\x20\x5C\x72\x5C\x6E\x22\x2C\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x3E\x51\x75\x65"
+"\x72\x79\x28\x22\x23\x6E\x75\x6D\x62\x65\x72\x22\x29\x29\x3B\xA\x9\x66\x6F\x72\x28\x69\x3D\x30\x3B\x69"
+"\x26\x6C\x74\x3B\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x3E\x51\x75\x65\x72\x79\x28\x22\x23\x6E\x75"
+"\x6D\x62\x65\x72\x22\x29\x3B\x69\x2B\x2B\x29\x20\x7B\x9\xA\x9\x9\x70\x72\x69\x6E\x74\x66\x28\x22\x26"
+"\x6C\x74\x3B\x62\x3E\x25\x73\x26\x6C\x74\x3B\x2F\x62\x26\x67\x74\x3B\x2C\x5C\x72\x5C\x6E\x5C\x72\x5C\x6E"
+"\x22\x2C\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x3E\x51\x75\x65\x72\x79\x28\x22\x6E\x75\x6D\x62\x65"
+"\x72\x22\x29\x29\x3B\xA\x9\x7D\x3B\xA\x9\x70\x72\x69\x6E\x74\x66\x28\x22\x2E\x2E\x2E\x26\x6C\x74\x3B"
+"\x42\x52\x26\x67\x74\x3B\x5C\x72\x5C\x6E\x5C\x72\x5C\x6E\x22\x29\x3B\xA\x9\xA\x7D\xA\x69\x6E\x74\x20"
+"\x6D\x61\x69\x6E\x28\x69\x6E\x74\x20\x61\x72\x67\x63\x2C\x63\x68\x61\x72\x2A\x2A\x20\x61\x72\x67\x76\x29"
+"\x20\x7B\xA\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x77\x65\x62\x5F\x73\x65\x72\x76"
+"\x65\x72\x20\x73\x65\x72\x76\x65\x72\x3B\x20\x2F\x2F\x20\x73\x65\x72\x76\x65\x72\x20\x68\x61\x6E\x64\x6C"
+"\x65\x72\xA\x20\x20\x20\x20\x20\x20\x20\x20\x69\x66\x28\x21\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F"
+"\x69\x6E\x69\x74\x28\x26\x73\x65\x72\x76\x65\x72\x2C\x38\x30\x2C\x22\x68\x65\x6C\x70\x2E\x6C\x6F\x67\x22"
+"\x2C\x30\x29\x29\x20\x7B\x20\x2F\x2F\x20\x69\x6E\x69\x74\x69\x61\x6C\x69\x7A\x65\xA\x20\x20\x20\x20\x20"
+"\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x70\x72\x69\x6E\x74\x66\x28\x73\x74\x64\x65\x72\x72\x2C"
+"\x22\x63\x61\x6E\x27\x74\x20\x6F\x70\x65\x6E\x20\x6C\x69\x73\x74\x65\x6E\x20\x73\x6F\x63\x6B\x65\x74\x5C"
+"\x6E\x22\x29\x3B\xA\x9\x9\x72\x65\x74\x75\x72\x6E\x20\x31\x3B\xA\x20\x20\x20\x20\x20\x20\x20\x20\x7D"
+"\x3B\xA\xA\x20\x20\x20\x20\x20\x20\x20\x20\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68"
+"\x61\x6E\x64\x6C\x65\x72\x28\x26\x73\x65\x72\x76\x65\x72\x2C\x22\x2A\x20\x2F\x2A\x22\x2C\x63\x68\x65\x63"
+"\x6B\x62\x6F\x78\x2C\x30\x29\x3B\x20\x2F\x2F\x20\x61\x64\x64\x20\x68\x61\x6E\x64\x6C\x65\x72\x20\x66\x6F"
+"\x72\x20\x61\x6C\x6C\x20\x72\x65\x71\x75\x65\x73\x74\x73\xA\x20\x20\x20\x20\x20\x20\x20\x20\x77\x68\x69"
+"\x6C\x65\x28\x31\x29\x20\x7B\xA\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x77\x65"
+"\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x72\x75\x6E\x28\x26\x73\x65\x72\x76\x65\x72\x29\x3B\x20\x20\x20\x2F"
+"\x2F\x20\x72\x75\x6E\x20\x73\x65\x72\x76\x65\x72\xA\x20\x20\x20\x20\x20\x20\x20\x20\x7D\x3B\xA\x7D\xA"
+"\xA\x3C\x2F\x50\x52\x45\x3E\x3C\x2F\x43\x4F\x44\x45\x3E\xA\x3C\x2F\x54\x44\x3E\x3C\x2F\x54\x52\x3E\x3C"
+"\x2F\x54\x41\x42\x4C\x45\x3E\xA\x3C\x48\x52\x3E\x3C\x42\x52\x3E\xA\xA\x3C\x41\x20\x6E\x61\x6D\x65\x3D"
+"\x63\x6F\x6E\x66\x65\x78\x61\x6D\x70\x6C\x65\x3E\x3C\x42\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72"
+"\x3D\x27\x30\x30\x30\x30\x37\x37\x27\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x2F\x63\x6F\x6E\x66\x65\x78\x61"
+"\x6D\x70\x6C\x65\x3E\x3C\x48\x33\x3E\x43\x6F\x6E\x66\x69\x67\x20\x65\x78\x61\x6D\x70\x6C\x65\x3C\x2F\x48"
+"\x33\x3E\x3C\x2F\x61\x3E\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\xA\x3C\x73\x6D\x61\x6C\x6C\x3E\x20"
+"\x3C\x42\x3E\x75\x73\x65\x64\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x3B\x3C\x2F\x42\x3E\x3C\x42\x52\x3E"
+"\xA\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73"
+"\x23\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x69\x74\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76"
+"\x65\x72\x5F\x69\x6E\x69\x74\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F"
+"\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72"
+"\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64"
+"\x64\x68\x61\x6E\x64\x6C\x65\x72\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA\x3C\x61\x20\x68\x72\x65\x66\x3D\x27"
+"\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x73\x65\x72\x76\x65"
+"\x72\x5F\x72\x75\x6E\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x72\x75\x6E\x3C\x2F\x61\x3E\x3C"
+"\x42\x52\x3E\xA\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69"
+"\x6F\x6E\x73\x23\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x61\x64\x64\x66\x69\x6C\x65\x27\x3E\x77\x65"
+"\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x61\x64\x64\x66\x69\x6C\x65\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\xA\x3C"
+"\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x63"
+"\x6C\x69\x65\x6E\x74\x69\x6E\x66\x6F\x27\x3E\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x3C\x2F\x61\x3E\x3C"
+"\x42\x52\x3E\xA\x3C\x2F\x73\x6D\x61\x6C\x6C\x3E\x3C\x42\x52\x3E\xA\xA\xA\x3C\x42\x52\x3E\x3C\x42\x52"
+"\x3E\xA\x3C\x54\x41\x42\x4C\x45\x20\x77\x69\x64\x74\x68\x3D\x27\x31\x30\x30\x25\x27\x20\x62\x67\x63\x6F"
+"\x6C\x6F\x72\x3D\x27\x43\x46\x43\x46\x43\x46\x27\x20\x62\x6F\x72\x64\x65\x72\x3D\x30\x3E\x3C\x54\x52\x3E"
+"\x3C\x54\x44\x3E\xA\x3C\x43\x4F\x44\x45\x3E\x3C\x50\x52\x45\x3E\xA\x23\x69\x6E\x63\x6C\x75\x64\x65\x20"
+"\x22\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x2E\x68\x22\xA\x23\x69\x6E\x63\x6C\x75\x64\x65\x20\x26\x6C"
+"\x74\x3B\x73\x74\x64\x69\x6F\x2E\x68\x26\x67\x74\x3B\xA\xA\xA\x76\x6F\x69\x64\x20\x63\x6F\x6E\x66\x65"
+"\x78\x61\x6D\x70\x6C\x65\x28\x29\x20\x7B\xA\x9\x70\x72\x69\x6E\x74\x66\x28\x22\x43\x6F\x6E\x74\x65\x6E"
+"\x74\x2D\x74\x79\x70\x65\x3A\x20\x74\x65\x78\x74\x2F\x68\x74\x6D\x6C\x5C\x72\x5C\x6E\x5C\x72\x5C\x6E\x22"
+"\x29\x3B\xA\x9\x70\x72\x69\x6E\x74\x66\x28\x22\x26\x6C\x74\x3B\x50\x52\x45\x26\x67\x74\x3B\x22\x29\x3B"
+"\xA\x9\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x61\x64\x64\x66\x69\x6C\x65\x28\x73\x65\x72\x76\x65"
+"\x72\x2E\x63\x6F\x6E\x66\x66\x69\x6C\x65\x29\x3B\x20\x2F\x2F\x20\x61\x64\x64\x20\x68\x65\x6C\x70\x2E\x63"
+"\x66\x67\x20\x66\x69\x6C\x65\x20\x74\x6F\x20\x6F\x75\x74\x70\x75\x74\x9\xA\x9\x70\x72\x69\x6E\x74\x66"
+"\x28\x22\x26\x6C\x74\x3B\x2F\x50\x52\x45\x26\x67\x74\x3B\x22\x29\x3B\xA\x9\x70\x72\x69\x6E\x74\x66\x28"
+"\x22\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x3E\x43\x6F\x6E\x66\x28\x5C\x22\x50\x45\x52\x53\x4F\x4E"
+"\x41\x4C\x5F\x43\x4F\x4E\x46\x5C\x22\x2C\x5C\x22\x50\x4F\x52\x54\x5C\x22\x29\x3D\x25\x73\x26\x6C\x74\x3B"
+"\x42\x52\x26\x67\x74\x3B\x5C\x6E\x22\x2C\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x3E\x43\x6F\x6E\x66"
+"\x28\x22\x50\x45\x52\x53\x4F\x4E\x41\x4C\x5F\x43\x4F\x4E\x46\x22\x2C\x22\x50\x4F\x52\x54\x22\x29\x29\x3B"
+"\xA\x9\x70\x72\x69\x6E\x74\x66\x28\x22\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x3E\x43\x6F\x6E\x66"
+"\x28\x5C\x22\x50\x45\x52\x53\x4F\x4E\x41\x4C\x5F\x43\x4F\x4E\x46\x5C\x22\x2C\x5C\x22\x49\x50\x5C\x22\x29"
+"\x3D\x25\x73\x26\x6C\x74\x3B\x42\x52\x26\x67\x74\x3B\x5C\x6E\x22\x2C\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66"
+"\x6F\x2D\x3E\x43\x6F\x6E\x66\x28\x22\x50\x45\x52\x53\x4F\x4E\x41\x4C\x5F\x43\x4F\x4E\x46\x22\x2C\x22\x49"
+"\x50\x22\x29\x29\x3B\xA\x9\x70\x72\x69\x6E\x74\x66\x28\x22\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D"
+"\x3E\x43\x6F\x6E\x66\x28\x5C\x22\x4C\x49\x42\x57\x45\x42\x53\x45\x52\x56\x45\x52\x5C\x22\x2C\x5C\x22\x50"
+"\x4F\x52\x54\x5C\x22\x29\x3D\x25\x73\x26\x6C\x74\x3B\x42\x52\x26\x67\x74\x3B\x5C\x6E\x22\x2C\x43\x6C\x69"
+"\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x3E\x43\x6F\x6E\x66\x28\x22\x4C\x49\x42\x57\x45\x42\x53\x45\x52\x56\x45"
+"\x52\x22\x2C\x22\x50\x4F\x52\x54\x22\x29\x29\x3B\xA\x9\xA\x7D\xA\xA\x69\x6E\x74\x20\x6D\x61\x69\x6E"
+"\x28\x69\x6E\x74\x20\x61\x72\x67\x63\x2C\x63\x68\x61\x72\x2A\x2A\x20\x61\x72\x67\x76\x29\x20\x7B\xA\x20"
+"\x20\x20\x20\x20\x20\x20\x20\x73\x74\x72\x75\x63\x74\x20\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x20\x73"
+"\x65\x72\x76\x65\x72\x3B\x20\x2F\x2F\x20\x73\x65\x72\x76\x65\x72\x20\x68\x61\x6E\x64\x6C\x65\x72\xA\x20"
+"\x20\x20\x20\x20\x20\x20\x20\x69\x66\x28\x21\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x69\x74"
+"\x28\x26\x73\x65\x72\x76\x65\x72\x2C\x38\x30\x2C\x22\x68\x65\x6C\x70\x2E\x63\x66\x67\x22\x2C\x57\x53\x5F"
+"\x55\x53\x45\x45\x58\x54\x43\x4F\x4E\x46\x29\x29\x20\x7B\x20\x2F\x2F\x20\x69\x6E\x69\x74\x69\x61\x6C\x69"
+"\x7A\x65\xA\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x66\x70\x72\x69\x6E\x74\x66"
+"\x28\x73\x74\x64\x65\x72\x72\x2C\x22\x63\x61\x6E\x27\x74\x20\x6F\x70\x65\x6E\x20\x6C\x69\x73\x74\x65\x6E"
+"\x20\x73\x6F\x63\x6B\x65\x74\x5C\x6E\x22\x29\x3B\xA\x9\x9\x72\x65\x74\x75\x72\x6E\x20\x31\x3B\xA\x20"
+"\x20\x20\x20\x20\x20\x20\x20\x7D\x3B\xA\xA\x20\x20\x20\x20\x20\x20\x20\x20\x77\x65\x62\x5F\x73\x65\x72"
+"\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x28\x26\x73\x65\x72\x76\x65\x72\x2C\x22\x2A\x20"
+"\x2A\x22\x2C\x63\x6F\x6E\x66\x65\x78\x61\x6D\x70\x6C\x65\x2C\x30\x29\x3B\x20\x2F\x2F\x20\x61\x64\x64\x20"
+"\x68\x61\x6E\x64\x6C\x65\x72\x20\x66\x6F\x72\x20\x61\x6C\x6C\x20\x72\x65\x71\x75\x65\x73\x74\x73\xA\x20"
+"\x20\x20\x20\x20\x20\x20\x20\x77\x68\x69\x6C\x65\x28\x31\x29\x20\x7B\xA\x20\x20\x20\x20\x20\x20\x20\x20"
+"\x20\x20\x20\x20\x20\x20\x20\x20\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x72\x75\x6E\x28\x26\x73\x65"
+"\x72\x76\x65\x72\x29\x3B\x20\x20\x20\x2F\x2F\x20\x72\x75\x6E\x20\x73\x65\x72\x76\x65\x72\xA\x20\x20\x20"
+"\x20\x20\x20\x20\x20\x7D\x3B\xA\x7D\xA\x3C\x2F\x50\x52\x45\x3E\x3C\x2F\x43\x4F\x44\x45\x3E\xA\x3C\x2F"
+"\x54\x44\x3E\x3C\x2F\x54\x52\x3E\x3C\x2F\x54\x41\x42\x4C\x45\x3E";
+
+#endif

+ 800 - 0
contrib/help/functions.h

@@ -0,0 +1,800 @@
+/*
+ * by data2header by Luis Figueiredo ([email protected])
+ */
+#ifndef _FUNCTIONS_H_
+#define _FUNCTIONS_H_
+
+char functions[]="\x3C\x63\x65\x6E\x74\x65\x72\x3E\x3C\x48\x33\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27"
+"\x30\x30\x37\x37\x30\x30\x27\x3E\x6C\x69\x62\x77\x65\x62\x73\x65\x72\x76\x65\x72\x20\x46\x75\x6E\x63\x74"
+"\x69\x6F\x6E\x73\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x48\x33\x3E\x3C\x2F\x63\x65\x6E\x74\x65\x72\x3E\x3C"
+"\x42\x52\x3E\x3C\x42\x52\x3E\xA\x3C\x66\x6F\x6E\x74\x20\x66\x61\x63\x65\x3D\x27\x56\x65\x72\x64\x61\x6E"
+"\x61\x27\x3E\xA\xA\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E"
+"\x69\x74\x3E\x3C\x42\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37\x37\x27"
+"\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x69\x74\x28\x29\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C"
+"\x2F\x42\x3E\x3C\x42\x52\x3E\x3C\x42\x52\x3E\xA\x3C\x42\x3E\x4E\x41\x4D\x45\x3C\x2F\x42\x3E\xA\x3C\x55"
+"\x4C\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x69\x74\x20\x2D\x20\x49\x6E\x69\x74\x69\x61"
+"\x6C\x69\x7A\x65\x20\x77\x65\x62\x73\x65\x72\x76\x65\x72\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x53\x59\x4E"
+"\x4F\x50\x53\x49\x53\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x23\x69\x6E\x63\x6C\x75\x64\x65\x20\x22\x77\x65"
+"\x62\x5F\x73\x65\x72\x76\x65\x72\x2E\x68\x22\x3C\x42\x52\x3E\x3C\x42\x52\x3E\x69\x6E\x74\x20\x77\x65\x62"
+"\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x69\x74\x28\x73\x74\x72\x75\x63\x74\x20\x77\x65\x62\x5F\x73\x65"
+"\x72\x76\x65\x72\x20\x2A\x3C\x55\x3E\x73\x65\x72\x76\x65\x72\x3C\x2F\x55\x3E\x2C\x20\x69\x6E\x74\x20\x3C"
+"\x55\x3E\x70\x6F\x72\x74\x3C\x2F\x55\x3E\x2C\x20\x63\x6F\x6E\x73\x74\x20\x63\x68\x61\x72\x20\x2A\x3C\x55"
+"\x3E\x6C\x6F\x67\x66\x69\x6C\x65\x3C\x2F\x55\x3E\x2C\x20\x69\x6E\x74\x20\x3C\x55\x3E\x66\x6C\x61\x67\x73"
+"\x3C\x2F\x55\x3E\x29\x3B\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x44\x45\x53\x43\x52\x49\x50\x54\x49\x4F\x4E"
+"\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x54\x68\x65\x20\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E"
+"\x69\x74\x28\x29\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x69\x6E\x69\x74\x69\x61\x6C\x69\x7A\x65\x73\x20"
+"\x74\x68\x65\x20\x73\x65\x72\x76\x65\x72\x20\x68\x61\x6E\x64\x6C\x65\x72\x20\x3C\x55\x3E\x73\x65\x72\x76"
+"\x65\x72\x3C\x2F\x55\x3E\x2C\x20\x73\x74\x61\x72\x74\x20\x61\x20\x6C\x69\x73\x74\x65\x6E\x20\x73\x6F\x63"
+"\x6B\x65\x74\x20\x61\x74\x20\x70\x6F\x72\x74\x20\x3C\x55\x3E\x70\x6F\x72\x74\x3C\x2F\x55\x3E\x2C\x20\x77"
+"\x69\x74\x68\x20\x74\x68\x65\x20\x6C\x6F\x67\x66\x69\x6C\x65\x20\x3C\x55\x3E\x6C\x6F\x67\x66\x69\x6C\x65"
+"\x3C\x2F\x55\x3E\x20\x74\x6F\x20\x70\x72\x6F\x64\x75\x63\x65\x20\x74\x68\x65\x20\x77\x65\x62\x73\x65\x72"
+"\x76\x65\x72\x20\x6C\x6F\x67\x3C\x42\x52\x3E\x20\x69\x66\x20\x57\x53\x5F\x55\x53\x45\x45\x58\x54\x43\x4F"
+"\x4E\x46\x20\x66\x6C\x61\x67\x20\x69\x73\x20\x75\x73\x65\x64\x2C\x20\x74\x68\x65\x20\x3C\x55\x3E\x6C\x6F"
+"\x67\x66\x69\x6C\x65\x3C\x2F\x55\x3E\x20\x77\x69\x6C\x6C\x20\x62\x65\x20\x74\x68\x65\x20\x63\x6F\x6E\x66"
+"\x69\x67\x20\x66\x69\x6C\x65\x20\x3C\x42\x52\x3E\xA\x3C\x55\x3E\x66\x6C\x61\x67\x73\x3C\x2F\x55\x3E\x20"
+"\x3C\x42\x52\x3E\xA\x57\x53\x5F\x55\x53\x45\x53\x53\x4C\x20\x66\x6F\x72\x20\x6F\x70\x65\x6E\x73\x73\x6C"
+"\x20\x63\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x73\x20\x28\x68\x74\x74\x70\x73\x20\x73\x75\x70\x70\x6F\x72"
+"\x74\x29\x3C\x42\x52\x3E\xA\x57\x53\x5F\x55\x53\x45\x45\x58\x54\x43\x4F\x4E\x46\x20\x66\x6F\x72\x20\x75"
+"\x73\x69\x6E\x67\x20\x61\x20\x65\x78\x74\x65\x72\x6E\x61\x6C\x20\x63\x6F\x6E\x66\x69\x67\x20\x66\x69\x6C"
+"\x65\x3C\x42\x52\x3E\xA\x57\x53\x5F\x4C\x4F\x43\x41\x4C\x20\x6F\x6E\x6C\x79\x20\x61\x63\x63\x65\x70\x74"
+"\x73\x20\x31\x32\x37\x2E\x30\x2E\x30\x2E\x31\x20\x28\x6C\x6F\x63\x61\x6C\x29\x20\x63\x6F\x6E\x6E\x65\x63"
+"\x74\x69\x6F\x6E\x73\xA\x3C\x2F\x55\x4C\x3E\xA\xA\x3C\x42\x3E\x52\x45\x54\x55\x52\x4E\x20\x56\x41\x4C"
+"\x55\x45\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x4F\x6E\x20\x73\x75\x63\x63\x65\x73\x73\x2C\x20\x31\x20\x69"
+"\x73\x20\x72\x65\x74\x75\x72\x6E\x65\x64\x2C\x20\x4F\x6E\x20\x65\x72\x72\x6F\x72\x2C\x20\x30\x20\x69\x73"
+"\x20\x72\x65\x74\x75\x72\x6E\x65\x64\x3C\x2F\x55\x4C\x3E\xA\x3C\x48\x52\x3E\x3C\x42\x52\x3E\xA\x20\xA"
+"\xA\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E"
+"\x64\x6C\x65\x72\x3E\x3C\x42\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37"
+"\x37\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x28\x29"
+"\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\x3C\x42\x52\x3E\x3C\x42\x52\x3E\xA\x3C\x42\x3E\x4E\x41\x4D"
+"\x45\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61"
+"\x6E\x64\x6C\x65\x72\x20\x2D\x20\x61\x64\x64\x73\x20\x61\x20\x72\x65\x71\x75\x65\x73\x74\x20\x68\x61\x6E"
+"\x64\x6C\x65\x72\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x53\x59\x4E\x4F\x50\x53\x49\x53\x3C\x2F\x42\x3E\xA"
+"\x3C\x55\x4C\x3E\x23\x69\x6E\x63\x6C\x75\x64\x65\x20\x22\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x2E\x68"
+"\x22\x3C\x42\x52\x3E\x3C\x42\x52\x3E\x69\x6E\x74\x20\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64"
+"\x64\x68\x61\x6E\x64\x6C\x65\x72\x28\x73\x74\x72\x75\x63\x74\x20\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72"
+"\x20\x2A\x3C\x55\x3E\x73\x65\x72\x76\x65\x72\x3C\x2F\x55\x3E\x2C\x20\x63\x6F\x6E\x73\x74\x20\x63\x68\x61"
+"\x72\x20\x2A\x3C\x55\x3E\x6D\x73\x74\x72\x3C\x2F\x55\x3E\x2C\x20\x76\x6F\x69\x64\x20\x28\x2A\x3C\x55\x3E"
+"\x66\x75\x6E\x63\x3C\x2F\x55\x3E\x29\x28\x29\x2C\x20\x69\x6E\x74\x20\x3C\x55\x3E\x66\x6C\x61\x67\x73\x3C"
+"\x2F\x55\x3E\x29\x3B\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x44\x45\x53\x43\x52\x49\x50\x54\x49\x4F\x4E\x3C"
+"\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x54\x68\x65\x20\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64"
+"\x68\x61\x6E\x64\x6C\x65\x72\x28\x29\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x61\x64\x64\x73\x20\x61\x20"
+"\x72\x65\x71\x75\x65\x73\x74\x20\x68\x61\x6E\x64\x6C\x65\x72\x20\x3C\x55\x3E\x6D\x73\x74\x72\x3C\x2F\x55"
+"\x3E\x20\x74\x6F\x20\x74\x68\x65\x20\x73\x65\x72\x76\x65\x72\x20\x68\x61\x6E\x64\x6C\x65\x72\x20\x3C\x55"
+"\x3E\x73\x65\x72\x76\x65\x72\x3C\x2F\x55\x3E\x20\x74\x68\x72\x6F\x75\x67\x68\x20\x74\x68\x65\x20\x66\x75"
+"\x6E\x63\x74\x69\x6F\x6E\x20\x3C\x55\x3E\x66\x75\x6E\x63\x3C\x2F\x55\x3E\x2E\x3C\x42\x52\x3E\xA\x3C\x55"
+"\x3E\x6D\x73\x74\x72\x3C\x2F\x55\x3E\x20\x69\x73\x20\x61\x20\x73\x74\x72\x69\x6E\x67\x20\x63\x6F\x6E\x74"
+"\x61\x69\x6E\x69\x6E\x67\x20\x65\x78\x70\x72\x65\x73\x73\x69\x6F\x6E\x73\x20\x28\x61\x73\x20\x6D\x61\x74"
+"\x63\x68\x69\x6E\x67\x20\x66\x69\x6C\x65\x73\x29\x20\x74\x6F\x20\x6D\x61\x74\x63\x68\x20\x77\x69\x74\x68"
+"\x20\x74\x68\x65\x20\x63\x6C\x69\x65\x6E\x74\x20\x72\x65\x71\x75\x65\x73\x74\x20\x28\x47\x45\x54\x20\x2F"
+"\x3C\x42\x3E\x62\x6C\x61\x68\x2E\x68\x74\x6D\x6C\x3C\x2F\x42\x3E\x3F\x69\x64\x3D\x31\x20\x48\x54\x54\x50"
+"\x2F\x31\x2E\x30\x2C\x20\x77\x69\x6C\x6C\x20\x62\x65\x20\x6D\x61\x74\x63\x68\x65\x64\x20\x62\x79\x20\x3C"
+"\x55\x3E\x6D\x73\x74\x72\x3C\x2F\x55\x3E\x3D\x22\x2A\x20\x2F\x62\x6C\x61\x68\x2E\x68\x74\x6D\x6C\x22\x29"
+"\x3C\x42\x52\x3E\xA\x3C\x55\x3E\x66\x6C\x61\x67\x73\x3A\x3C\x2F\x55\x3E\x20\x3C\x42\x52\x3E\xA\x57\x53"
+"\x5F\x4C\x4F\x43\x41\x4C\x20\x2D\x20\x6F\x6E\x6C\x79\x20\x6C\x6F\x63\x61\x6C\x20\x63\x6F\x6E\x6E\x65\x63"
+"\x74\x69\x6F\x6E\x73\x20\x61\x72\x65\x20\x68\x61\x6E\x64\x6C\x65\x64\x3C\x42\x52\x3E\xA\x57\x53\x5F\x44"
+"\x59\x4E\x56\x41\x52\x20\x2D\x20\x74\x72\x65\x61\x74\x20\x64\x79\x6E\x61\x6D\x69\x63\x20\x76\x61\x72\x69"
+"\x61\x62\x6C\x65\x73\x20\x6F\x6E\x20\x6F\x75\x74\x70\x75\x74\x20\x28\x41\x74\x65\x6E\x74\x69\x6F\x6E\x3A"
+"\x20\x74\x68\x69\x73\x20\x64\x69\x73\x61\x62\x6C\x65\x73\x20\x22\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x72\x61"
+"\x6E\x67\x65\x22\x20\x61\x6E\x64\x20\x22\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x6C\x65\x6E\x67\x74\x68\x22\x20"
+"\x68\x65\x61\x64\x65\x72\x2C\x20\x72\x65\x73\x70\x6F\x6E\x64\x69\x6E\x67\x20\x22\x35\x30\x31\x20\x6E\x6F"
+"\x74\x20\x69\x6D\x70\x6C\x65\x6D\x65\x6E\x74\x65\x64\x22\x29\x3C\x42\x52\x3E\xA\x57\x53\x5F\x55\x53\x45"
+"\x4C\x45\x4E\x20\x2D\x20\x57\x69\x74\x68\x20\x74\x68\x69\x73\x20\x66\x6C\x61\x67\x2C\x20\x6C\x69\x62\x72"
+"\x61\x72\x79\x20\x63\x61\x6C\x63\x75\x6C\x61\x74\x65\x20\x74\x68\x65\x20\x68\x65\x61\x64\x65\x72\x20\x22"
+"\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x6C\x65\x6E\x67\x74\x68\x22\x20\x61\x6E\x64\x20\x22\x43\x6F\x6E\x74\x65"
+"\x6E\x74\x2D\x72\x61\x6E\x67\x65\x22\x20\x69\x74\x20\x73\x65\x6C\x66\x2C\x20\x75\x73\x65\x66\x75\x6C\x20"
+"\x66\x6F\x72\x20\x72\x65\x73\x75\x6D\x69\x6E\x67\x2C\x20\x63\x6F\x6E\x74\x65\x6E\x74\x2D\x6C\x65\x6E\x67"
+"\x74\x68\x20\x63\x61\x6E\x20\x62\x65\x20\x6D\x69\x73\x63\x61\x6C\x63\x75\x6C\x61\x74\x65\x64\x20\x69\x66"
+"\x20\x74\x68\x65\x20\x66\x69\x6C\x65\x20\x61\x64\x64\x65\x64\x20\x62\x79\x20\x28\x77\x65\x62\x5F\x63\x6C"
+"\x69\x65\x6E\x74\x5F\x61\x64\x64\x66\x69\x6C\x65\x29\x20\x63\x68\x61\x6E\x67\x65\x73\x20\x74\x68\x65\x20"
+"\x73\x69\x7A\x65\x20\x6F\x66\x20\x63\x6F\x6E\x74\x65\x6E\x74\x73\x2C\x20\x62\x65\x74\x77\x65\x65\x6E\x20"
+"\x63\x61\x6C\x63\x75\x6C\x61\x74\x69\x6E\x67\x20\x61\x6E\x64\x20\x6F\x75\x74\x70\x75\x74\x3C\x42\x52\x3E"
+"\xA\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x52\x45\x54\x55\x52\x4E\x20\x56\x41\x4C\x55\x45\x3C\x2F\x42\x3E"
+"\xA\x3C\x55\x4C\x3E\x4F\x6E\x20\x73\x75\x63\x63\x65\x73\x73\x2C\x20\x31\x20\x69\x73\x20\x72\x65\x74\x75"
+"\x72\x6E\x65\x64\x2C\x20\x4F\x6E\x20\x65\x72\x72\x6F\x72\x2C\x20\x30\x20\x69\x73\x20\x72\x65\x74\x75\x72"
+"\x6E\x65\x64\x3C\x2F\x55\x4C\x3E\xA\x3C\x48\x52\x3E\x3C\x42\x52\x3E\xA\xA\x3C\x41\x20\x6E\x61\x6D\x65"
+"\x3D\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x6C\x69\x61\x73\x64\x69\x72\x3E\x3C\x42\x3E\x3C\x66"
+"\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37\x37\x27\x3E\x77\x65\x62\x5F\x73\x65\x72"
+"\x76\x65\x72\x5F\x61\x6C\x69\x61\x73\x64\x69\x72\x28\x29\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\x3C"
+"\x42\x52\x3E\x3C\x42\x52\x3E\xA\x3C\x42\x3E\x4E\x41\x4D\x45\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x77\x65"
+"\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x6C\x69\x61\x73\x64\x69\x72\x20\x2D\x20\x47\x65\x6E\x65\x72\x61"
+"\x74\x65\x73\x20\x61\x20\x64\x69\x72\x65\x63\x74\x6F\x72\x79\x20\x6C\x69\x73\x74\x2C\x20\x61\x6E\x64\x20"
+"\x75\x73\x65\x20\x66\x69\x6C\x65\x20\x62\x61\x73\x65\x64\x20\x73\x65\x72\x76\x65\x72\x3C\x2F\x55\x4C\x3E"
+"\xA\x3C\x42\x3E\x53\x59\x4E\x4F\x50\x53\x49\x53\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x23\x69\x6E\x63\x6C"
+"\x75\x64\x65\x20\x22\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x2E\x68\x22\x3C\x42\x52\x3E\x3C\x42\x52\x3E"
+"\x69\x6E\x74\x20\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x6C\x69\x61\x73\x64\x69\x72\x28\x73\x74"
+"\x72\x75\x63\x74\x20\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x20\x2A\x3C\x55\x3E\x73\x65\x72\x76\x65\x72"
+"\x3C\x2F\x55\x3E\x2C\x20\x63\x6F\x6E\x73\x74\x20\x63\x68\x61\x72\x20\x2A\x3C\x55\x3E\x61\x6C\x69\x61\x73"
+"\x3C\x2F\x55\x3E\x2C\x20\x63\x68\x61\x72\x20\x2A\x3C\x55\x3E\x70\x61\x74\x68\x3C\x2F\x55\x3E\x2C\x20\x69"
+"\x6E\x74\x20\x3C\x55\x3E\x66\x6C\x61\x67\x73\x3C\x2F\x55\x3E\x29\x3B\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E"
+"\x44\x45\x53\x43\x52\x49\x50\x54\x49\x4F\x4E\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x54\x68\x65\x20\x77\x65"
+"\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x6C\x69\x61\x73\x64\x69\x72\x28\x29\x20\x66\x75\x6E\x63\x74\x69"
+"\x6F\x6E\x20\x61\x64\x64\x73\x20\x61\x6E\x20\x61\x6C\x69\x61\x73\x20\x3C\x55\x3E\x61\x6C\x69\x61\x73\x3C"
+"\x2F\x55\x3E\x20\x74\x6F\x20\x74\x68\x65\x20\x73\x65\x72\x76\x65\x72\x20\x68\x61\x6E\x64\x6C\x65\x72\x20"
+"\x3C\x55\x3E\x73\x65\x72\x76\x65\x72\x3C\x2F\x55\x3E\x20\x61\x6E\x64\x20\x75\x73\x65\x20\x66\x69\x6C\x65"
+"\x73\x20\x66\x72\x6F\x6D\x20\x3C\x55\x3E\x70\x61\x74\x68\x3C\x2F\x55\x3E\x2E\x3C\x42\x52\x3E\xA\x3C\x55"
+"\x3E\x66\x6C\x61\x67\x73\x3A\x3C\x2F\x55\x3E\x20\x3C\x42\x52\x3E\xA\x57\x53\x5F\x4C\x4F\x43\x41\x4C\x20"
+"\x2D\x20\x6F\x6E\x6C\x79\x20\x6C\x6F\x63\x61\x6C\x20\x63\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x73\x20\x61"
+"\x72\x65\x20\x68\x61\x6E\x64\x6C\x65\x64\x3C\x42\x52\x3E\xA\x57\x53\x5F\x44\x59\x4E\x56\x41\x52\x20\x2D"
+"\x20\x74\x72\x65\x61\x74\x20\x64\x79\x6E\x61\x6D\x69\x63\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x73\x20\x6F"
+"\x6E\x20\x6F\x75\x74\x70\x75\x74\x20\x28\x41\x74\x65\x6E\x74\x69\x6F\x6E\x3A\x20\x74\x68\x69\x73\x20\x64"
+"\x69\x73\x61\x62\x6C\x65\x73\x20\x22\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x72\x61\x6E\x67\x65\x22\x20\x61\x6E"
+"\x64\x20\x22\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x6C\x65\x6E\x67\x74\x68\x22\x20\x68\x65\x61\x64\x65\x72\x2C"
+"\x20\x72\x65\x73\x70\x6F\x6E\x64\x69\x6E\x67\x20\x22\x35\x30\x31\x20\x6E\x6F\x74\x20\x69\x6D\x70\x6C\x65"
+"\x6D\x65\x6E\x74\x65\x64\x22\x29\x3C\x42\x52\x3E\xA\x57\x53\x5F\x55\x53\x45\x4C\x45\x4E\x20\x2D\x20\x57"
+"\x69\x74\x68\x20\x74\x68\x69\x73\x20\x66\x6C\x61\x67\x2C\x20\x6C\x69\x62\x72\x61\x72\x79\x20\x63\x61\x6C"
+"\x63\x75\x6C\x61\x74\x65\x20\x74\x68\x65\x20\x68\x65\x61\x64\x65\x72\x20\x22\x43\x6F\x6E\x74\x65\x6E\x74"
+"\x2D\x6C\x65\x6E\x67\x74\x68\x22\x20\x61\x6E\x64\x20\x22\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x72\x61\x6E\x67"
+"\x65\x22\x20\x69\x74\x20\x73\x65\x6C\x66\x2C\x20\x75\x73\x65\x66\x75\x6C\x20\x66\x6F\x72\x20\x72\x65\x73"
+"\x75\x6D\x69\x6E\x67\x2C\x20\x63\x6F\x6E\x74\x65\x6E\x74\x2D\x6C\x65\x6E\x67\x74\x68\x20\x63\x61\x6E\x20"
+"\x62\x65\x20\x6D\x69\x73\x63\x61\x6C\x63\x75\x6C\x61\x74\x65\x64\x20\x69\x66\x20\x74\x68\x65\x20\x66\x69"
+"\x6C\x65\x20\x61\x64\x64\x65\x64\x20\x62\x79\x20\x28\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x61\x64"
+"\x64\x66\x69\x6C\x65\x29\x20\x63\x68\x61\x6E\x67\x65\x73\x20\x74\x68\x65\x20\x73\x69\x7A\x65\x20\x6F\x66"
+"\x20\x63\x6F\x6E\x74\x65\x6E\x74\x73\x2C\x20\x62\x65\x74\x77\x65\x65\x6E\x20\x63\x61\x6C\x63\x75\x6C\x61"
+"\x74\x69\x6E\x67\x20\x61\x6E\x64\x20\x6F\x75\x74\x70\x75\x74\x3C\x42\x52\x3E\xA\x3C\x2F\x55\x4C\x3E\xA"
+"\x3C\x42\x3E\x52\x45\x54\x55\x52\x4E\x20\x56\x41\x4C\x55\x45\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x4F\x6E"
+"\x20\x73\x75\x63\x63\x65\x73\x73\x2C\x20\x31\x20\x69\x73\x20\x72\x65\x74\x75\x72\x6E\x65\x64\x2C\x20\x4F"
+"\x6E\x20\x65\x72\x72\x6F\x72\x2C\x20\x30\x20\x69\x73\x20\x72\x65\x74\x75\x72\x6E\x65\x64\x3C\x2F\x55\x4C"
+"\x3E\xA\x3C\x48\x52\x3E\x3C\x42\x52\x3E\xA\xA\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x77\x65\x62\x5F\x73\x65"
+"\x72\x76\x65\x72\x5F\x72\x75\x6E\x3E\x3C\x42\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30"
+"\x30\x30\x30\x37\x37\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x72\x75\x6E\x28\x29\x3C\x2F\x66"
+"\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\x3C\x42\x52\x3E\x3C\x42\x52\x3E\xA\x3C\x42\x3E\x4E\x41\x4D\x45\x3C\x2F"
+"\x42\x3E\xA\x3C\x55\x4C\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x72\x75\x6E\x20\x2D\x20\x72\x75"
+"\x6E\x20\x74\x68\x65\x20\x73\x65\x72\x76\x65\x72\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x53\x59\x4E\x4F\x50"
+"\x53\x49\x53\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x23\x69\x6E\x63\x6C\x75\x64\x65\x20\x22\x77\x65\x62\x5F"
+"\x73\x65\x72\x76\x65\x72\x2E\x68\x22\x3C\x42\x52\x3E\x3C\x42\x52\x3E\x69\x6E\x74\x20\x77\x65\x62\x5F\x73"
+"\x65\x72\x76\x65\x72\x5F\x72\x75\x6E\x28\x73\x74\x72\x75\x63\x74\x20\x77\x65\x62\x5F\x73\x65\x72\x76\x65"
+"\x72\x20\x2A\x3C\x55\x3E\x73\x65\x72\x76\x65\x72\x3C\x2F\x55\x3E\x29\x3B\x3C\x2F\x55\x4C\x3E\xA\x3C\x42"
+"\x3E\x44\x45\x53\x43\x52\x49\x50\x54\x49\x4F\x4E\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x54\x68\x65\x20\x77"
+"\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x72\x75\x6E\x28\x29\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x70"
+"\x72\x6F\x63\x65\x73\x73\x65\x73\x20\x72\x65\x71\x75\x65\x73\x74\x73\x20\x74\x6F\x20\x74\x68\x65\x20\x73"
+"\x65\x72\x76\x65\x72\x20\x3C\x55\x3E\x73\x65\x72\x76\x65\x72\x3C\x2F\x55\x3E\x2E\x20\x54\x68\x69\x73\x20"
+"\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x6D\x75\x73\x74\x20\x62\x65\x20\x63\x61\x6C\x6C\x65\x64\x20\x66\x72"
+"\x6F\x6D\x20\x74\x68\x65\x20\x6D\x61\x69\x6E\x20\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x20\x6C\x6F"
+"\x6F\x70\x20\x28\x74\x68\x65\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x20\x64\x6F\x65\x73\x6E\x27\x74\x20"
+"\x6C\x6F\x6F\x70\x20\x69\x74\x20\x73\x65\x6C\x66\x29\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x52\x45\x54\x55"
+"\x52\x4E\x20\x56\x41\x4C\x55\x45\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x4F\x6E\x20\x73\x75\x63\x63\x65\x73"
+"\x73\x2C\x20\x67\x72\x65\x61\x74\x65\x72\x20\x74\x68\x61\x6E\x20\x30\x2C\x20\x69\x73\x20\x72\x65\x74\x75"
+"\x72\x6E\x65\x64\x20\x28\x32\x20\x69\x66\x20\x74\x68\x65\x72\x65\x20\x77\x61\x73\x6E\x27\x74\x20\x63\x6C"
+"\x69\x65\x6E\x74\x2C\x20\x31\x20\x69\x66\x20\x73\x6F\x6D\x65\x20\x72\x65\x71\x75\x65\x73\x74\x20\x77\x61"
+"\x73\x20\x70\x72\x6F\x63\x65\x73\x73\x65\x64\x29\x2C\x20\x4F\x6E\x20\x65\x72\x72\x6F\x72\x2C\x20\x30\x20"
+"\x69\x73\x20\x72\x65\x74\x75\x72\x6E\x65\x64\x3C\x2F\x55\x4C\x3E\xA\x3C\x48\x52\x3E\x3C\x42\x52\x3E\xA"
+"\xA\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x67\x65\x74\x63\x6F\x6E"
+"\x66\x3E\x3C\x42\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37\x37\x27\x3E"
+"\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x67\x65\x74\x63\x6F\x6E\x66\x28\x29\x3C\x2F\x66\x6F\x6E\x74"
+"\x3E\x3C\x2F\x42\x3E\x3C\x42\x52\x3E\x3C\x42\x52\x3E\xA\x3C\x42\x3E\x4E\x41\x4D\x45\x3C\x2F\x42\x3E\xA"
+"\x3C\x55\x4C\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x67\x65\x74\x63\x6F\x6E\x66\x20\x2D\x20\x67"
+"\x65\x74\x20\x64\x61\x74\x61\x20\x66\x72\x6F\x6D\x20\x63\x6F\x6E\x66\x69\x67\x20\x66\x69\x6C\x65\x72\x3C"
+"\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x53\x59\x4E\x4F\x50\x53\x49\x53\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x23"
+"\x69\x6E\x63\x6C\x75\x64\x65\x20\x22\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x2E\x68\x22\x3C\x42\x52\x3E"
+"\x3C\x42\x52\x3E\x63\x68\x61\x72\x20\x2A\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x67\x65\x74\x63\x6F"
+"\x6E\x66\x28\x73\x74\x72\x75\x63\x74\x20\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x20\x2A\x3C\x55\x3E\x73"
+"\x65\x72\x76\x65\x72\x3C\x2F\x55\x3E\x2C\x63\x68\x61\x72\x20\x2A\x3C\x55\x3E\x74\x6F\x70\x69\x63\x3C\x2F"
+"\x55\x3E\x2C\x63\x68\x61\x72\x20\x2A\x3C\x55\x3E\x6B\x65\x79\x3C\x2F\x55\x3E\x29\x3B\x3C\x2F\x55\x4C\x3E"
+"\xA\x3C\x42\x3E\x44\x45\x53\x43\x52\x49\x50\x54\x49\x4F\x4E\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x54\x68"
+"\x65\x20\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x67\x65\x74\x63\x6F\x6E\x66\x28\x29\x20\x66\x75\x6E"
+"\x63\x74\x69\x6F\x6E\x20\x61\x6C\x6C\x6F\x63\x61\x74\x65\x73\x20\x61\x6E\x64\x20\x72\x65\x74\x75\x72\x6E"
+"\x20\x61\x20\x73\x74\x72\x69\x6E\x67\x20\x66\x72\x6F\x6D\x20\x63\x6F\x6E\x66\x69\x67\x20\x66\x69\x6C\x65"
+"\x20\x72\x65\x6C\x61\x74\x65\x64\x20\x74\x6F\x20\x3C\x55\x3E\x74\x6F\x70\x69\x63\x3C\x2F\x55\x3E\x20\x61"
+"\x6E\x64\x20\x3C\x55\x3E\x6B\x65\x79\x3C\x2F\x55\x3E\x20\x28\x73\x65\x65\x20\x3C\x61\x20\x68\x72\x65\x66"
+"\x3D\x22\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x63\x6F\x6E\x66\x69\x67\x66"
+"\x69\x6C\x65\x22\x3E\x63\x6F\x6E\x66\x69\x67\x20\x66\x69\x6C\x65\x20\x68\x65\x6C\x70\x3C\x2F\x61\x3E\x29"
+"\x20\x54\x68\x69\x73\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x6D\x75\x73\x74\x20\x62\x65\x20\x63\x61\x6C"
+"\x6C\x65\x64\x20\x61\x66\x74\x65\x72\x20\x74\x68\x65\x20\x69\x6E\x69\x74\x20\x6F\x66\x20\x74\x68\x65\x20"
+"\x76\x61\x72\x20\x3C\x55\x3E\x73\x65\x72\x76\x65\x72\x3C\x2F\x55\x3E\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E"
+"\x52\x45\x54\x55\x52\x4E\x20\x56\x41\x4C\x55\x45\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x72\x65\x74\x75\x72"
+"\x6E\x73\x20\x61\x6C\x6C\x6F\x63\x61\x74\x65\x64\x20\x73\x74\x72\x69\x6E\x67\x2C\x20\x28\x79\x6F\x75\x20"
+"\x73\x68\x6F\x75\x6C\x64\x20\x66\x72\x65\x65\x20\x61\x66\x74\x65\x72\x20\x75\x73\x65\x29\x20\x6F\x72\x20"
+"\x6E\x75\x6C\x6C\x20\x69\x66\x20\x6E\x6F\x74\x68\x69\x6E\x67\x20\x72\x65\x6C\x61\x74\x65\x64\x20\x74\x6F"
+"\x20\x61\x72\x67\x75\x6D\x65\x6E\x74\x73\x20\x66\x6F\x75\x6E\x64\x3C\x2F\x55\x4C\x3E\xA\x3C\x48\x52\x3E"
+"\x3C\x42\x52\x3E\xA\xA\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x75"
+"\x73\x65\x53\x53\x4C\x63\x65\x72\x74\x3E\x3C\x42\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27"
+"\x30\x30\x30\x30\x37\x37\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x75\x73\x65\x53\x53\x4C\x63"
+"\x65\x72\x74\x28\x29\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\x3C\x42\x52\x3E\x3C\x42\x52\x3E\xA\x3C"
+"\x42\x3E\x4E\x41\x4D\x45\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F"
+"\x75\x73\x65\x53\x53\x4C\x63\x65\x72\x74\x20\x2D\x20\x75\x73\x65\x20\x63\x65\x72\x74\x69\x66\x69\x63\x61"
+"\x74\x65\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x53\x59\x4E\x4F\x50\x53\x49\x53\x3C\x2F\x42\x3E\xA\x3C\x55"
+"\x4C\x3E\x23\x69\x6E\x63\x6C\x75\x64\x65\x20\x22\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x2E\x68\x22\x3C"
+"\x42\x52\x3E\x3C\x42\x52\x3E\x76\x6F\x69\x64\x20\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x75\x73\x65"
+"\x53\x53\x4C\x63\x65\x72\x74\x28\x73\x74\x72\x75\x63\x74\x20\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x20"
+"\x2A\x3C\x55\x3E\x73\x65\x72\x76\x65\x72\x3C\x2F\x55\x3E\x2C\x20\x63\x6F\x6E\x73\x74\x20\x63\x68\x61\x72"
+"\x20\x2A\x3C\x55\x3E\x66\x69\x6C\x65\x3C\x2F\x55\x3E\x29\x3B\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x44\x45"
+"\x53\x43\x52\x49\x50\x54\x49\x4F\x4E\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x54\x68\x65\x20\x77\x65\x62\x5F"
+"\x73\x65\x72\x76\x65\x72\x5F\x75\x73\x65\x53\x53\x4C\x63\x65\x72\x74\x28\x29\x20\x66\x75\x6E\x63\x74\x69"
+"\x6F\x6E\x20\x74\x65\x6C\x6C\x73\x20\x73\x65\x72\x76\x65\x72\x20\x3C\x55\x3E\x73\x65\x72\x76\x65\x72\x3C"
+"\x2F\x55\x3E\x20\x74\x6F\x20\x75\x73\x65\x20\x63\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x20\x66\x69\x6C"
+"\x65\x20\x3C\x55\x3E\x66\x69\x6C\x65\x3C\x2F\x55\x3E\x20\x6F\x6E\x20\x73\x73\x6C\x20\x63\x6F\x6E\x6E\x65"
+"\x63\x74\x69\x6F\x6E\x73\x20\x28\x69\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x65\x64\x20\x77\x2F\x20\x66"
+"\x6C\x61\x67\x20\x57\x53\x5F\x55\x53\x45\x53\x53\x4C\x29\x3C\x2F\x55\x4C\x3E\xA\x3C\x48\x52\x3E\x3C\x42"
+"\x52\x3E\xA\xA\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x75\x73\x65"
+"\x4D\x49\x4D\x45\x66\x69\x6C\x65\x3E\x3C\x42\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30"
+"\x30\x30\x30\x37\x37\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x75\x73\x65\x4D\x49\x4D\x45\x66"
+"\x69\x6C\x65\x28\x29\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\x3C\x42\x52\x3E\x3C\x42\x52\x3E\xA\x3C"
+"\x42\x3E\x4E\x41\x4D\x45\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F"
+"\x75\x73\x65\x4D\x49\x4D\x45\x66\x69\x6C\x65\x20\x2D\x20\x75\x73\x65\x20\x6D\x69\x6D\x65\x20\x74\x79\x70"
+"\x65\x73\x20\x66\x69\x6C\x65\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x53\x59\x4E\x4F\x50\x53\x49\x53\x3C\x2F"
+"\x42\x3E\xA\x3C\x55\x4C\x3E\x23\x69\x6E\x63\x6C\x75\x64\x65\x20\x22\x77\x65\x62\x5F\x73\x65\x72\x76\x65"
+"\x72\x2E\x68\x22\x3C\x42\x52\x3E\x3C\x42\x52\x3E\x76\x6F\x69\x64\x20\x77\x65\x62\x5F\x73\x65\x72\x76\x65"
+"\x72\x5F\x75\x73\x65\x4D\x49\x4D\x45\x66\x69\x6C\x65\x28\x73\x74\x72\x75\x63\x74\x20\x77\x65\x62\x5F\x73"
+"\x65\x72\x76\x65\x72\x20\x2A\x3C\x55\x3E\x73\x65\x72\x76\x65\x72\x3C\x2F\x55\x3E\x2C\x20\x63\x6F\x6E\x73"
+"\x74\x20\x63\x68\x61\x72\x20\x2A\x3C\x55\x3E\x66\x69\x6C\x65\x3C\x2F\x55\x3E\x29\x3B\x3C\x2F\x55\x4C\x3E"
+"\xA\x3C\x42\x3E\x44\x45\x53\x43\x52\x49\x50\x54\x49\x4F\x4E\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x54\x68"
+"\x65\x20\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x75\x73\x65\x4D\x49\x4D\x45\x66\x69\x6C\x65\x28\x29"
+"\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x74\x65\x6C\x6C\x73\x20\x73\x65\x72\x76\x65\x72\x20\x3C\x55\x3E"
+"\x73\x65\x72\x76\x65\x72\x3C\x2F\x55\x3E\x20\x74\x6F\x20\x75\x73\x65\x20\x6D\x69\x6D\x65\x73\x20\x74\x79"
+"\x70\x65\x20\x66\x69\x6C\x65\x20\x3C\x55\x3E\x66\x69\x6C\x65\x3C\x2F\x55\x3E\x20\x66\x6F\x72\x20\x64\x65"
+"\x74\x65\x72\x6D\x69\x6E\x69\x6E\x67\x20\x6D\x69\x6D\x65\x20\x74\x79\x70\x65\x20\x62\x79\x20\x65\x78\x74"
+"\x65\x6E\x73\x69\x6F\x6E\x20\x75\x73\x65\x64\x20\x62\x79\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x3C\x61"
+"\x20\x68\x72\x65\x66\x3D\x22\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65"
+"\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x63\x6F\x6E\x74\x65\x6E\x74\x74\x79\x70\x65\x22\x3E\x77\x65\x62\x5F"
+"\x63\x6C\x69\x65\x6E\x74\x5F\x63\x6F\x6E\x74\x65\x6E\x74\x74\x79\x70\x65\x28\x29\x3C\x2F\x61\x3E\x3C\x2F"
+"\x55\x4C\x3E\xA\x3C\x48\x52\x3E\x3C\x42\x52\x3E\xA\xA\xA\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x77\x65\x62"
+"\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x61\x64\x64\x73\x74\x72\x65\x61\x6D\x3E\x3C\x42\x3E\x3C\x66\x6F\x6E\x74"
+"\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37\x37\x27\x3E\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74"
+"\x5F\x61\x64\x64\x73\x74\x72\x65\x61\x6D\x28\x29\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\x3C\x42\x52"
+"\x3E\x3C\x42\x52\x3E\xA\x3C\x42\x3E\x4E\x41\x4D\x45\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x77\x65\x62\x5F"
+"\x63\x6C\x69\x65\x6E\x74\x5F\x61\x64\x64\x73\x74\x72\x65\x61\x6D\x20\x2D\x20\x61\x64\x64\x20\x61\x6E\x20"
+"\x6F\x75\x74\x70\x75\x74\x20\x73\x74\x72\x65\x61\x6D\x20\x74\x6F\x20\x74\x68\x65\x20\x63\x6C\x69\x65\x6E"
+"\x74\x20\x73\x74\x72\x75\x63\x74\x20\x6F\x6E\x20\x77\x65\x62\x73\x65\x72\x76\x65\x72\x3C\x2F\x55\x4C\x3E"
+"\xA\x3C\x42\x3E\x53\x59\x4E\x4F\x50\x53\x49\x53\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x23\x69\x6E\x63\x6C"
+"\x75\x64\x65\x20\x22\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x2E\x68\x22\x3C\x42\x52\x3E\x3C\x42\x52\x3E"
+"\x69\x6E\x74\x20\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x61\x64\x64\x73\x74\x72\x65\x61\x6D\x28\x46"
+"\x49\x4C\x45\x20\x2A\x3C\x55\x3E\x73\x74\x72\x65\x61\x6D\x3C\x2F\x55\x3E\x29\x3B\x3C\x2F\x55\x4C\x3E\xA"
+"\x3C\x42\x3E\x44\x45\x53\x43\x52\x49\x50\x54\x49\x4F\x4E\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x54\x68\x65"
+"\x20\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x61\x64\x64\x73\x74\x72\x65\x61\x6D\x28\x29\x20\x66\x75"
+"\x6E\x63\x74\x69\x6F\x6E\x20\x61\x64\x64\x73\x20\x74\x68\x65\x20\x73\x74\x72\x65\x61\x6D\x20\x3C\x55\x3E"
+"\x73\x74\x72\x65\x61\x6D\x3C\x2F\x55\x3E\x20\x74\x6F\x20\x74\x68\x65\x20\x6F\x75\x74\x70\x75\x74\x20\x73"
+"\x74\x72\x65\x61\x6D\x20\x6C\x69\x73\x74\x20\x69\x6E\x20\x74\x68\x65\x20\x63\x75\x72\x72\x65\x6E\x74\x20"
+"\x63\x6C\x69\x65\x6E\x74\x20\x6E\x6F\x64\x65\x3C\x2F\x55\x4C\x3E\xA\x20\x3C\x42\x3E\x4E\x4F\x54\x45\x3C"
+"\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x54\x68\x65\x20\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x61\x64\x64"
+"\x73\x74\x72\x65\x61\x6D\x28\x29\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x63\x61\x6E\x20\x3C\x42\x3E\x6F"
+"\x6E\x6C\x79\x3C\x2F\x42\x3E\x20\x62\x65\x20\x63\x61\x6C\x6C\x65\x64\x20\x66\x72\x6F\x6D\x20\x66\x75\x6E"
+"\x63\x74\x69\x6F\x6E\x73\x20\x63\x61\x6C\x6C\x65\x64\x20\x62\x79\x20\x67\x65\x74\x68\x61\x6E\x64\x6C\x65"
+"\x72\x73\x20\x72\x65\x67\x69\x73\x74\x65\x72\x65\x64\x20\x62\x79\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x27"
+"\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x73\x65\x72\x76\x65"
+"\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61"
+"\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x28\x29\x3C\x2F\x61\x3E\x2E\x3C\x2F\x55\x4C\x3E\xA\x3C\x55\x4C\x3E"
+"\x54\x68\x65\x20\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x61\x64\x64\x73\x74\x72\x65\x61\x6D\x28\x29"
+"\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x69\x73\x20\x6F\x62\x73\x6F\x6C\x65\x74\x65\x20\x61\x6E\x64\x20"
+"\x6E\x6F\x20\x6C\x6F\x6E\x67\x65\x72\x20\x69\x6E\x20\x75\x73\x65\x20\x6F\x6E\x20\x30\x2E\x33\x2E\x34\x20"
+"\x76\x65\x72\x73\x69\x6F\x6E\x73\x2C\x20\x75\x73\x65\x20\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x61"
+"\x64\x64\x66\x69\x6C\x65\x20\x69\x6E\x73\x74\x65\x61\x64\x3C\x2F\x75\x6C\x3E\xA\x3C\x42\x3E\x52\x45\x54"
+"\x55\x52\x4E\x20\x56\x41\x4C\x55\x45\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x4F\x6E\x20\x73\x75\x63\x63\x65"
+"\x73\x73\x2C\x20\x31\x20\x69\x73\x20\x72\x65\x74\x75\x72\x6E\x65\x64\x2C\x20\x4F\x6E\x20\x65\x72\x72\x6F"
+"\x72\x2C\x20\x30\x20\x69\x73\x20\x72\x65\x74\x75\x72\x6E\x65\x64\x3C\x2F\x55\x4C\x3E\xA\x3C\x48\x52\x3E"
+"\x3C\x42\x52\x3E\xA\xA\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x61"
+"\x64\x64\x66\x69\x6C\x65\x3E\x3C\x42\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30"
+"\x30\x37\x37\x27\x3E\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x61\x64\x64\x66\x69\x6C\x65\x28\x29\x3C"
+"\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\x3C\x42\x52\x3E\x3C\x42\x52\x3E\xA\x3C\x42\x3E\x4E\x41\x4D\x45"
+"\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x61\x64\x64\x66\x69\x6C"
+"\x65\x20\x2D\x20\x61\x64\x64\x20\x61\x20\x66\x69\x6C\x65\x20\x74\x6F\x20\x74\x68\x65\x20\x6F\x75\x74\x70"
+"\x75\x74\x20\x73\x74\x72\x65\x61\x6D\x20\x6F\x66\x20\x74\x68\x65\x20\x63\x6C\x69\x65\x6E\x74\x20\x73\x74"
+"\x72\x75\x63\x74\x20\x6F\x6E\x20\x74\x68\x65\x20\x77\x65\x62\x73\x65\x72\x76\x65\x72\x3C\x2F\x55\x4C\x3E"
+"\xA\x3C\x42\x3E\x53\x59\x4E\x4F\x50\x53\x49\x53\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x23\x69\x6E\x63\x6C"
+"\x75\x64\x65\x20\x22\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x2E\x68\x22\x3C\x42\x52\x3E\x3C\x42\x52\x3E"
+"\x69\x6E\x74\x20\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x61\x64\x64\x66\x69\x6C\x65\x28\x63\x6F\x6E"
+"\x73\x74\x20\x63\x68\x61\x72\x20\x2A\x3C\x55\x3E\x66\x69\x6C\x65\x3C\x2F\x55\x3E\x29\x3B\x3C\x2F\x55\x4C"
+"\x3E\xA\x3C\x42\x3E\x44\x45\x53\x43\x52\x49\x50\x54\x49\x4F\x4E\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x54"
+"\x68\x65\x20\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x61\x64\x64\x66\x69\x6C\x65\x28\x29\x20\x66\x75"
+"\x6E\x63\x74\x69\x6F\x6E\x20\x6F\x70\x65\x6E\x73\x20\x74\x68\x65\x20\x66\x69\x6C\x65\x20\x3C\x55\x3E\x66"
+"\x69\x6C\x65\x3C\x2F\x55\x3E\x20\x61\x6E\x64\x20\x61\x64\x64\x73\x20\x69\x74\x20\x61\x73\x20\x73\x74\x72"
+"\x65\x61\x6D\x20\x74\x6F\x20\x74\x68\x65\x20\x6F\x75\x74\x70\x75\x74\x20\x73\x74\x72\x65\x61\x6D\x20\x6C"
+"\x69\x73\x74\x20\x69\x6E\x20\x74\x68\x65\x20\x63\x75\x72\x72\x65\x6E\x74\x20\x63\x6C\x69\x65\x6E\x74\x20"
+"\x6E\x6F\x64\x65\x3C\x2F\x55\x4C\x3E\xA\x20\x3C\x42\x3E\x4E\x4F\x54\x45\x3C\x2F\x42\x3E\xA\x3C\x55\x4C"
+"\x3E\x54\x68\x65\x20\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x61\x64\x64\x66\x69\x6C\x65\x28\x29\x20"
+"\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x63\x61\x6E\x20\x62\x65\x20\x63\x61\x6C\x6C\x65\x64\x20\x3C\x42\x3E"
+"\x6F\x6E\x6C\x79\x3C\x2F\x42\x3E\x20\x66\x72\x6F\x6D\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x20\x63\x61"
+"\x6C\x6C\x65\x64\x20\x62\x79\x20\x67\x65\x74\x68\x61\x6E\x64\x6C\x65\x72\x73\x20\x72\x65\x67\x69\x73\x74"
+"\x65\x72\x65\x64\x20\x76\x69\x61\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66"
+"\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E"
+"\x64\x6C\x65\x72\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65"
+"\x72\x28\x29\x3C\x2F\x61\x3E\x2E\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x52\x45\x54\x55\x52\x4E\x20\x56\x41"
+"\x4C\x55\x45\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x4F\x6E\x20\x53\x75\x63\x63\x65\x73\x73\x2C\x20\x31\x20"
+"\x69\x73\x20\x72\x65\x74\x75\x72\x6E\x65\x64\x2C\x20\x4F\x6E\x20\x65\x72\x72\x6F\x72\x2C\x20\x30\x20\x69"
+"\x73\x20\x72\x65\x74\x75\x72\x6E\x65\x64\x3C\x2F\x55\x4C\x3E\xA\x3C\x48\x52\x3E\x3C\x42\x52\x3E\xA\xA"
+"\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x67\x69\x66\x6F\x75\x74\x70"
+"\x75\x74\x3E\x3C\x42\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37\x37\x27"
+"\x3E\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x67\x69\x66\x6F\x75\x74\x70\x75\x74\x28\x29\x3C\x2F\x66"
+"\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\x3C\x42\x52\x3E\x3C\x42\x52\x3E\xA\x3C\x42\x3E\x4E\x41\x4D\x45\x3C\x2F"
+"\x42\x3E\xA\x3C\x55\x4C\x3E\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x67\x69\x66\x6F\x75\x74\x70\x75"
+"\x74\x20\x2D\x20\x65\x78\x70\x6F\x72\x74\x20\x64\x61\x74\x61\x20\x61\x73\x20\x67\x69\x66\x3C\x2F\x55\x4C"
+"\x3E\xA\x3C\x42\x3E\x53\x59\x4E\x4F\x50\x53\x49\x53\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x23\x69\x6E\x63"
+"\x6C\x75\x64\x65\x20\x22\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x2E\x68\x22\x3C\x42\x52\x3E\x3C\x42\x52"
+"\x3E\x69\x6E\x74\x20\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x67\x69\x66\x6F\x75\x74\x70\x75\x74\x28"
+"\x63\x68\x61\x72\x20\x2A\x3C\x55\x3E\x64\x61\x74\x61\x3C\x2F\x55\x3E\x2C\x69\x6E\x74\x20\x3C\x55\x3E\x77"
+"\x3C\x2F\x55\x3E\x2C\x69\x6E\x74\x20\x3C\x55\x3E\x68\x3C\x2F\x75\x3E\x29\x3B\x3C\x2F\x55\x4C\x3E\xA\x3C"
+"\x42\x3E\x44\x45\x53\x43\x52\x49\x50\x54\x49\x4F\x4E\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x54\x68\x65\x20"
+"\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x67\x69\x66\x6F\x75\x74\x70\x75\x74\x28\x29\x20\x66\x75\x6E"
+"\x63\x74\x69\x6F\x6E\x20\x70\x72\x69\x6E\x74\x73\x20\x74\x6F\x20\x73\x74\x64\x6F\x75\x74\x20\x61\x20\x67"
+"\x69\x66\x20\x68\x65\x61\x64\x65\x72\x20\x28\x77\x69\x74\x68\x20\x77\x69\x64\x74\x68\x20\x3C\x55\x3E\x77"
+"\x3C\x2F\x55\x3E\x20\x61\x6E\x64\x20\x68\x65\x69\x67\x68\x74\x20\x3C\x55\x3E\x68\x3C\x2F\x55\x3E\x29\x20"
+"\x61\x6E\x64\x20\x74\x68\x65\x20\x69\x6D\x61\x67\x65\x20\x70\x6F\x69\x6E\x74\x65\x64\x20\x62\x79\x20\x3C"
+"\x55\x3E\x64\x61\x74\x61\x3C\x2F\x55\x3E\x2E\x3C\x42\x52\x3E\xA\x54\x68\x65\x20\x61\x6C\x6C\x6F\x63\x61"
+"\x74\x65\x64\x20\x6D\x65\x6D\x6F\x72\x79\x20\x3C\x55\x3E\x64\x61\x74\x61\x3C\x2F\x55\x3E\x20\x70\x6F\x69"
+"\x6E\x74\x73\x20\x74\x6F\x20\x6D\x75\x73\x74\x6E\x27\x74\x20\x62\x65\x20\x73\x6D\x61\x6C\x6C\x65\x72\x20"
+"\x74\x68\x61\x6E\x20\x3C\x55\x3E\x77\x3C\x2F\x55\x3E\x2A\x3C\x55\x3E\x68\x3C\x2F\x55\x3E\x2E\x3C\x42\x52"
+"\x3E\xA\x54\x68\x65\x20\x67\x69\x66\x20\x70\x61\x6C\x65\x74\x74\x65\x20\x69\x73\x20\x64\x65\x73\x63\x72"
+"\x69\x62\x65\x64\x20\x62\x79\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75"
+"\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x67\x69\x66\x73\x65\x74\x70"
+"\x61\x6C\x65\x74\x74\x65\x27\x3E\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x67\x69\x66\x73\x65\x74\x70"
+"\x61\x6C\x65\x74\x74\x65\x3C\x2F\x61\x3E\xA\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x4E\x4F\x54\x45\x3C\x2F"
+"\x42\x3E\xA\x3C\x55\x4C\x3E\x54\x68\x65\x20\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x67\x69\x66\x6F"
+"\x75\x74\x70\x75\x74\x28\x29\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x63\x61\x6E\x20\x62\x65\x20\x63\x61"
+"\x6C\x6C\x65\x64\x20\x3C\x42\x3E\x6F\x6E\x6C\x79\x3C\x2F\x42\x3E\x20\x66\x72\x6F\x6D\x20\x66\x75\x6E\x63"
+"\x74\x69\x6F\x6E\x73\x20\x63\x61\x6C\x6C\x65\x64\x20\x62\x79\x20\x67\x65\x74\x68\x61\x6E\x64\x6C\x65\x72"
+"\x73\x20\x72\x65\x67\x69\x73\x74\x65\x72\x65\x64\x20\x76\x69\x61\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x27"
+"\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x73\x65\x72\x76\x65"
+"\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61"
+"\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x28\x29\x3C\x2F\x61\x3E\x2E\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x52"
+"\x45\x54\x55\x52\x4E\x20\x56\x41\x4C\x55\x45\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x4F\x6E\x20\x53\x75\x63"
+"\x63\x65\x73\x73\x2C\x20\x30\x20\x69\x73\x20\x72\x65\x74\x75\x72\x6E\x65\x64\x2C\x20\x4F\x6E\x20\x65\x72"
+"\x72\x6F\x72\x2C\x20\x6E\x6F\x6E\x20\x7A\x65\x72\x6F\x20\x69\x73\x20\x72\x65\x74\x75\x72\x6E\x65\x64\x2E"
+"\x3C\x2F\x55\x4C\x3E\xA\x3C\x48\x52\x3E\x3C\x42\x52\x3E\xA\xA\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x77\x65"
+"\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x67\x69\x66\x73\x65\x74\x70\x61\x6C\x65\x74\x74\x65\x3E\x3C\x42\x3E"
+"\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37\x37\x27\x3E\x77\x65\x62\x5F\x63"
+"\x6C\x69\x65\x6E\x74\x5F\x67\x69\x66\x73\x65\x74\x70\x61\x6C\x65\x74\x74\x65\x28\x29\x3C\x2F\x66\x6F\x6E"
+"\x74\x3E\x3C\x2F\x42\x3E\x3C\x42\x52\x3E\x3C\x42\x52\x3E\xA\x3C\x42\x3E\x4E\x41\x4D\x45\x3C\x2F\x42\x3E"
+"\xA\x3C\x55\x4C\x3E\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x67\x69\x66\x73\x65\x74\x70\x61\x6C\x65"
+"\x74\x74\x65\x20\x2D\x20\x53\x65\x74\x75\x70\x20\x74\x68\x65\x20\x67\x69\x66\x20\x70\x61\x6C\x65\x74\x74"
+"\x65\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x53\x59\x4E\x4F\x50\x53\x49\x53\x3C\x2F\x42\x3E\xA\x3C\x55\x4C"
+"\x3E\x23\x69\x6E\x63\x6C\x75\x64\x65\x20\x22\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x2E\x68\x22\x3C\x42"
+"\x52\x3E\x3C\x42\x52\x3E\x76\x6F\x69\x64\x20\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x67\x69\x66\x73"
+"\x65\x74\x70\x61\x6C\x65\x74\x74\x65\x28\x63\x68\x61\x72\x20\x2A\x3C\x55\x3E\x66\x69\x6C\x65\x3C\x2F\x55"
+"\x3E\x29\x3B\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x44\x45\x53\x43\x52\x49\x50\x54\x49\x4F\x4E\x3C\x2F\x42"
+"\x3E\xA\x3C\x55\x4C\x3E\x54\x68\x65\x20\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x67\x69\x66\x73\x65"
+"\x74\x70\x61\x6C\x65\x74\x74\x65\x28\x29\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x6C\x6F\x61\x64\x73\x20"
+"\x72\x61\x77\x20\x70\x61\x6C\x65\x74\x74\x65\x20\x28\x2E\x61\x63\x74\x29\x20\x66\x72\x6F\x6D\x20\x3C\x55"
+"\x3E\x66\x69\x6C\x65\x3C\x2F\x55\x3E\x20\x6F\x72\x20\x69\x66\x20\x3C\x55\x3E\x66\x69\x6C\x65\x3C\x2F\x55"
+"\x3E\x20\x69\x73\x20\x22\x45\x47\x41\x22\x20\x74\x68\x65\x6E\x20\x74\x68\x69\x73\x20\x66\x75\x6E\x63\x74"
+"\x69\x6F\x6E\x20\x73\x65\x74\x75\x70\x73\x20\x74\x68\x65\x20\x70\x61\x6C\x65\x74\x74\x65\x20\x74\x6F\x20"
+"\x45\x47\x41\x20\x6D\x6F\x64\x65\x3C\x42\x52\x3E\xA\x3C\x2F\x55\x4C\x3E\xA\x3C\x48\x52\x3E\x3C\x42\x52"
+"\x3E\xA\xA\xA\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x73\x65\x74"
+"\x63\x6F\x6F\x6B\x69\x65\x3E\x3C\x42\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30"
+"\x30\x37\x37\x27\x3E\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x73\x65\x74\x63\x6F\x6F\x6B\x69\x65\x28"
+"\x29\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\x3C\x42\x52\x3E\x3C\x42\x52\x3E\xA\x3C\x42\x3E\x4E\x41"
+"\x4D\x45\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x73\x65\x74\x63"
+"\x6F\x6F\x6B\x69\x65\x20\x2D\x20\x73\x65\x74\x20\x61\x20\x63\x6F\x6F\x6B\x69\x65\x3C\x2F\x55\x4C\x3E\xA"
+"\x3C\x42\x3E\x53\x59\x4E\x4F\x50\x53\x49\x53\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x23\x69\x6E\x63\x6C\x75"
+"\x64\x65\x20\x22\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x2E\x68\x22\x3C\x42\x52\x3E\x3C\x42\x52\x3E\x76"
+"\x6F\x69\x64\x20\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x73\x65\x74\x63\x6F\x6F\x6B\x69\x65\x28\x63"
+"\x68\x61\x72\x20\x2A\x3C\x55\x3E\x6B\x65\x79\x3C\x2F\x55\x3E\x2C\x20\x63\x68\x61\x72\x20\x2A\x3C\x55\x3E"
+"\x76\x61\x6C\x75\x65\x3C\x2F\x55\x3E\x2C\x20\x63\x68\x61\x72\x20\x2A\x3C\x55\x3E\x74\x69\x6D\x65\x6F\x66"
+"\x66\x73\x65\x74\x3C\x2F\x55\x3E\x2C\x20\x63\x68\x61\x72\x20\x2A\x3C\x55\x3E\x70\x61\x74\x68\x3C\x2F\x55"
+"\x3E\x2C\x63\x68\x61\x72\x20\x2A\x3C\x55\x3E\x64\x6F\x6D\x61\x69\x6E\x3C\x2F\x55\x3E\x2C\x69\x6E\x74\x20"
+"\x3C\x55\x3E\x73\x65\x63\x75\x72\x65\x3C\x2F\x55\x3E\x29\x3B\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x44\x45"
+"\x53\x43\x52\x49\x50\x54\x49\x4F\x4E\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x54\x68\x65\x20\x77\x65\x62\x5F"
+"\x63\x6C\x69\x65\x6E\x74\x5F\x73\x65\x74\x63\x6F\x6F\x6B\x69\x65\x28\x29\x20\x66\x75\x6E\x63\x74\x69\x6F"
+"\x6E\x20\x73\x65\x74\x73\x20\x61\x20\x63\x6F\x6F\x6B\x69\x65\x20\x6F\x6E\x20\x63\x6C\x69\x65\x6E\x74\x20"
+"\x62\x72\x6F\x77\x73\x65\x72\x20\x77\x69\x74\x68\x20\x6B\x65\x79\x20\x3C\x55\x3E\x6B\x65\x79\x3C\x2F\x55"
+"\x3E\x2C\x20\x76\x61\x6C\x75\x65\x20\x3C\x55\x3E\x76\x61\x6C\x75\x65\x3C\x2F\x55\x3E\x20\x61\x6E\x64\x20"
+"\x65\x78\x70\x69\x72\x65\x73\x20\x61\x74\x20\x3C\x55\x3E\x74\x69\x6D\x65\x6F\x66\x66\x73\x65\x74\x3C\x2F"
+"\x55\x3E\x2E\x3C\x42\x52\x3E\xA\x74\x69\x6D\x65\x6F\x66\x66\x73\x65\x74\x20\x66\x6F\x72\x6D\x61\x74\x20"
+"\x69\x73\x20\x6F\x6E\x65\x20\x6C\x69\x6B\x65\x20\x3C\x55\x3E\x73\x69\x67\x6E\x3C\x2F\x55\x3E\x2C\x20\x3C"
+"\x55\x3E\x6E\x75\x6D\x62\x65\x72\x20\x6F\x66\x66\x73\x65\x74\x3C\x2F\x55\x3E\x20\x61\x6E\x64\x20\x3C\x55"
+"\x3E\x64\x69\x72\x65\x63\x74\x69\x76\x65\x3C\x2F\x55\x3E\x20\x3C\x73\x6D\x61\x6C\x6C\x3E\x20\x28\x69\x2E"
+"\x65\x20\x2B\x31\x30\x6D\x2C\x20\x31\x30\x20\x6D\x6F\x6E\x74\x68\x73\x29\x3C\x2F\x73\x6D\x61\x6C\x6C\x3E"
+"\xA\x9\x3C\x55\x4C\x3E\x3C\x55\x3E\x73\x69\x67\x6E\x3C\x2F\x55\x3E\x20\x69\x73\x20\x6F\x6E\x20\x6C\x69"
+"\x6B\x65\x20\x27\x2D\x27\x20\x6F\x72\x20\x27\x2B\x27\x3C\x2F\x55\x4C\x3E\xA\x9\x3C\x55\x4C\x3E\x3C\x55"
+"\x3E\x6E\x75\x6D\x62\x65\x72\x20\x6F\x66\x66\x73\x65\x74\x3C\x2F\x55\x3E\x20\x69\x73\x20\x6C\x69\x6B\x65"
+"\x20\x2B\x3C\x55\x3E\x35\x3C\x2F\x55\x3E\x4D\x20\x6D\x65\x61\x6E\x73\x20\x65\x78\x70\x69\x72\x65\x73\x20"
+"\x61\x74\x20\x6E\x65\x78\x74\x20\x35\x20\x6D\x69\x6E\x75\x74\x65\x73\x20\x3C\x2F\x55\x4C\x3E\xA\x9\x3C"
+"\x55\x4C\x3E\x3C\x55\x3E\x64\x69\x72\x65\x63\x74\x69\x76\x65\x3C\x2F\x55\x3E\x20\x69\x73\x3A\xA\x9\x9"
+"\x3C\x55\x4C\x3E\x53\x20\x2D\x20\x73\x65\x63\x6F\x6E\x64\x73\x3C\x2F\x55\x4C\x3E\xA\x9\x9\x3C\x55\x4C"
+"\x3E\x4D\x20\x2D\x20\x6D\x69\x6E\x75\x74\x65\x73\x3C\x2F\x55\x4C\x3E\xA\x9\x9\x3C\x55\x4C\x3E\x48\x20"
+"\x2D\x20\x68\x6F\x75\x72\x73\x3C\x2F\x55\x4C\x3E\xA\x9\x9\x3C\x55\x4C\x3E\x64\x20\x2D\x20\x64\x61\x79"
+"\x73\x3C\x2F\x55\x4C\x3E\xA\x9\x9\x3C\x55\x4C\x3E\x6D\x20\x2D\x20\x6D\x6F\x6E\x74\x68\x73\x3C\x2F\x55"
+"\x4C\x3E\xA\x9\x9\x3C\x55\x4C\x3E\x79\x20\x2D\x20\x79\x65\x61\x72\x73\x3C\x2F\x55\x4C\x3E\xA\x9\x3C"
+"\x2F\x55\x4C\x3E\xA\x9\x70\x61\x74\x68\x20\x2D\x20\x53\x75\x62\x73\x65\x74\x20\x6F\x66\x20\x55\x52\x4C"
+"\x73\x20\x69\x6E\x20\x61\x20\x64\x6F\x6D\x61\x69\x6E\x20\x66\x6F\x72\x20\x77\x68\x69\x63\x68\x20\x74\x68"
+"\x65\x20\x63\x6F\x6F\x6B\x69\x65\x20\x69\x73\x20\x76\x61\x6C\x69\x64\xA\x20\x20\x20\x20\x20\x20\x20\x20"
+"\x20\x20\x20\x28\x49\x66\x20\x74\x68\x65\x20\x70\x61\x74\x68\x20\x69\x73\x20\x6E\x6F\x74\x20\x73\x70\x65"
+"\x63\x69\x66\x69\x65\x64\x20\x28\x70\x61\x74\x68\x20\x3D\x3D\x20\x4E\x55\x4C\x4C\x29\x2C\x20\x69\x74\x20"
+"\x61\x73\x20\x61\x73\x73\x75\x6D\x65\x64\x20\x74\x6F\x20\x62\x65\xA\x20\x20\x20\x20\x20\x20\x20\x20\x20"
+"\x20\x20\x20\x74\x68\x65\x20\x73\x61\x6D\x65\x20\x70\x61\x74\x68\x20\x61\x73\x20\x74\x68\x65\x20\x64\x6F"
+"\x63\x75\x6D\x65\x6E\x74\x20\x62\x65\x69\x6E\x67\x20\x64\x65\x73\x63\x72\x69\x62\x65\x64\x20\x62\x79\x20"
+"\x74\x68\x65\x20\x68\x65\x61\x64\x65\x72\x20\x77\x68\x69\x63\x68\xA\x20\x20\x20\x20\x20\x20\x20\x20\x20"
+"\x20\x20\x20\x63\x6F\x6E\x74\x61\x69\x6E\x73\x20\x74\x68\x65\x20\x63\x6F\x6F\x6B\x69\x65\x2E\x29\x3C\x42"
+"\x52\x3E\xA\x20\x20\x20\x20\x64\x6F\x6D\x61\x69\x6E\x20\x3D\x20\x44\x6F\x6D\x61\x69\x6E\x20\x74\x68\x65"
+"\x20\x63\x6F\x6F\x6B\x69\x65\x20\x69\x73\x20\x76\x61\x6C\x69\x64\x20\x66\x6F\x72\xA\x20\x20\x20\x20\x20"
+"\x20\x20\x20\x20\x20\x20\x20\x20\x28\x49\x66\x20\x74\x68\x65\x20\x64\x6F\x6D\x61\x69\x6E\x20\x69\x73\x20"
+"\x6E\x6F\x74\x20\x73\x65\x74\x20\x28\x64\x6F\x6D\x61\x69\x6E\x20\x3D\x3D\x20\x4E\x55\x4C\x4C\x29\x2C\x20"
+"\x74\x68\x65\x20\x64\x65\x66\x61\x75\x6C\x74\x20\x76\x61\x6C\x75\x65\x20\x6F\x66\xA\x20\x20\x20\x20\x20"
+"\x20\x20\x20\x20\x20\x20\x20\x20\x64\x6F\x6D\x61\x69\x6E\x20\x69\x73\x20\x74\x68\x65\x20\x68\x6F\x73\x74"
+"\x20\x6E\x61\x6D\x65\x20\x6F\x66\x20\x74\x68\x65\x20\x73\x65\x72\x76\x65\x72\x20\x77\x68\x69\x63\x68\x20"
+"\x67\x65\x6E\x65\x72\x61\x74\x65\x64\x20\x74\x68\x65\x20\x63\x6F\x6F\x6B\x69\x65\xA\x20\x20\x20\x20\x20"
+"\x20\x20\x20\x20\x20\x20\x20\x20\x72\x65\x73\x70\x6F\x6E\x73\x65\x2E\x29\x3C\x42\x52\x3E\xA\x9\x73\x65"
+"\x63\x75\x72\x65\x20\x3D\x20\x49\x66\x20\x61\x20\x63\x6F\x6F\x6B\x69\x65\x20\x69\x73\x20\x6D\x61\x72\x6B"
+"\x65\x64\x20\x73\x65\x63\x75\x72\x65\x20\x28\x73\x65\x63\x75\x72\x65\x20\x3D\x3D\x20\x31\x29\x2C\x20\x69"
+"\x74\x20\x77\x69\x6C\x6C\x20\x6F\x6E\x6C\x79\x20\x62\x65\xA\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
+"\x20\x20\x74\x72\x61\x6E\x73\x6D\x69\x74\x74\x65\x64\x20\x69\x66\x20\x74\x68\x65\x20\x63\x6F\x6D\x6D\x75"
+"\x6E\x69\x63\x61\x74\x69\x6F\x6E\x73\x20\x63\x68\x61\x6E\x6E\x65\x6C\x20\x77\x69\x74\x68\x20\x74\x68\x65"
+"\x20\x68\x6F\x73\x74\x20\x69\x73\x20\x61\xA\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x73\x65"
+"\x63\x75\x72\x65\x20\x6F\x6E\x65\x2E\x20\x43\x75\x72\x72\x65\x6E\x74\x6C\x79\x20\x74\x68\x69\x73\x20\x6D"
+"\x65\x61\x6E\x73\x20\x74\x68\x61\x74\x20\x73\x65\x63\x75\x72\x65\x20\x63\x6F\x6F\x6B\x69\x65\x73\x20\x77"
+"\x69\x6C\x6C\x20\x6F\x6E\x6C\x79\x20\x62\x65\xA\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x73"
+"\x65\x6E\x74\x20\x74\x6F\x20\x48\x54\x54\x50\x53\x20\x28\x48\x54\x54\x50\x20\x6F\x76\x65\x72\x20\x53\x53"
+"\x4C\x29\x20\x73\x65\x72\x76\x65\x72\x73\x2E\xA\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x28"
+"\x49\x66\x20\x73\x65\x63\x75\x72\x65\x20\x69\x73\x20\x6E\x6F\x74\x20\x73\x70\x65\x63\x69\x66\x69\x65\x64"
+"\x20\x28\x73\x65\x63\x75\x72\x65\x20\x3D\x3D\x20\x30\x29\x2C\x20\x61\x20\x63\x6F\x6F\x6B\x69\x65\x20\x69"
+"\x73\x20\x63\x6F\x6E\x73\x69\x64\x65\x72\x65\x64\xA\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
+"\x20\x73\x61\x66\x65\x20\x74\x6F\x20\x62\x65\x20\x73\x65\x6E\x74\x20\x69\x6E\x20\x74\x68\x65\x20\x63\x6C"
+"\x65\x61\x72\x20\x6F\x76\x65\x72\x20\x75\x6E\x73\x65\x63\x75\x72\x65\x64\x20\x63\x68\x61\x6E\x6E\x65\x6C"
+"\x73\x2E\x20\x29\x3C\x42\x52\x3E\xA\x20\xA\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x4E\x4F\x54\x45\x3C\x2F"
+"\x42\x3E\xA\x3C\x55\x4C\x3E\x20\x54\x68\x65\x20\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x73\x65\x74"
+"\x63\x6F\x6F\x6B\x69\x65\x28\x29\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x73\x68\x6F\x75\x6C\x64\x20\x62"
+"\x65\x20\x63\x61\x6C\x6C\x65\x64\x20\x3C\x42\x3E\x6F\x6E\x6C\x79\x3C\x2F\x42\x3E\x20\x66\x72\x6F\x6D\x20"
+"\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x20\x63\x61\x6C\x6C\x65\x64\x20\x62\x79\x20\x67\x65\x74\x68\x61\x6E"
+"\x64\x6C\x65\x72\x73\x20\x72\x65\x67\x69\x73\x74\x65\x72\x65\x64\x20\x76\x69\x61\x20\x3C\x61\x20\x68\x72"
+"\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x73"
+"\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76"
+"\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x28\x29\x3C\x2F\x61\x3E\x3C\x42\x52\x3E\x3C\x2F\x55"
+"\x4C\x3E\xA\x3C\x48\x52\x3E\x3C\x42\x52\x3E\xA\xA\xA\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x77\x65\x62\x5F"
+"\x63\x6C\x69\x65\x6E\x74\x5F\x64\x65\x6C\x65\x74\x65\x63\x6F\x6F\x6B\x69\x65\x3E\x3C\x42\x3E\x3C\x66\x6F"
+"\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37\x37\x27\x3E\x77\x65\x62\x5F\x63\x6C\x69\x65"
+"\x6E\x74\x5F\x64\x65\x6C\x65\x74\x65\x63\x6F\x6F\x6B\x69\x65\x28\x29\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F"
+"\x42\x3E\x3C\x42\x52\x3E\x3C\x42\x52\x3E\xA\x3C\x42\x3E\x4E\x41\x4D\x45\x3C\x2F\x42\x3E\xA\x3C\x55\x4C"
+"\x3E\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x64\x65\x6C\x65\x74\x65\x63\x6F\x6F\x6B\x69\x65\x20\x2D"
+"\x20\x64\x65\x6C\x65\x74\x65\x20\x61\x20\x63\x6F\x6F\x6B\x69\x65\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x53"
+"\x59\x4E\x4F\x50\x53\x49\x53\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x23\x69\x6E\x63\x6C\x75\x64\x65\x20\x22"
+"\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x2E\x68\x22\x3C\x42\x52\x3E\x3C\x42\x52\x3E\x76\x6F\x69\x64\x20"
+"\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x64\x65\x6C\x65\x74\x65\x63\x6F\x6F\x6B\x69\x65\x28\x63\x68"
+"\x61\x72\x20\x2A\x3C\x55\x3E\x6B\x65\x79\x3C\x2F\x55\x3E\x29\x3B\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x44"
+"\x45\x53\x43\x52\x49\x50\x54\x49\x4F\x4E\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x54\x68\x65\x20\x77\x65\x62"
+"\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x64\x65\x6C\x65\x74\x65\x63\x6F\x6F\x6B\x69\x65\x28\x29\x20\x66\x75\x6E"
+"\x63\x74\x69\x6F\x6E\x20\x64\x65\x6C\x65\x74\x65\x20\x61\x20\x63\x6F\x6F\x6B\x69\x65\x20\x6F\x6E\x20\x63"
+"\x6C\x69\x65\x6E\x74\x20\x62\x72\x6F\x77\x73\x65\x72\x20\x77\x69\x74\x68\x20\x6B\x65\x79\x20\x3C\x55\x3E"
+"\x6B\x65\x79\x3C\x2F\x55\x3E\x3C\x42\x52\x3E\xA\xA\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x4E\x4F\x54\x45"
+"\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x20\x54\x68\x65\x20\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x64"
+"\x65\x6C\x65\x74\x65\x63\x6F\x6F\x6B\x69\x65\x28\x29\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x73\x68\x6F"
+"\x75\x6C\x64\x20\x62\x65\x20\x63\x61\x6C\x6C\x65\x64\x20\x3C\x42\x3E\x6F\x6E\x6C\x79\x3C\x2F\x42\x3E\x20"
+"\x66\x72\x6F\x6D\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x20\x63\x61\x6C\x6C\x65\x64\x20\x62\x79\x20\x67"
+"\x65\x74\x68\x61\x6E\x64\x6C\x65\x72\x73\x20\x72\x65\x67\x69\x73\x74\x65\x72\x65\x64\x20\x76\x69\x61\x20"
+"\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23"
+"\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x27\x3E\x77\x65\x62"
+"\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x28\x29\x3C\x2F\x61\x3E\x3C\x42"
+"\x52\x3E\x3C\x2F\x55\x4C\x3E\xA\x3C\x48\x52\x3E\x3C\x42\x52\x3E\xA\xA\x3C\x41\x20\x6E\x61\x6D\x65\x3D"
+"\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x73\x65\x74\x76\x61\x72\x3E\x3C\x42\x3E\x3C\x66\x6F\x6E\x74"
+"\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37\x37\x27\x3E\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74"
+"\x5F\x73\x65\x74\x76\x61\x72\x28\x29\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\x3C\x42\x52\x3E\x3C\x42"
+"\x52\x3E\xA\x3C\x42\x3E\x4E\x41\x4D\x45\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x77\x65\x62\x5F\x63\x6C\x69"
+"\x65\x6E\x74\x5F\x73\x65\x74\x76\x61\x72\x20\x2D\x20\x73\x65\x74\x73\x20\x61\x20\x76\x61\x72\x69\x61\x62"
+"\x6C\x65\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x53\x59\x4E\x4F\x50\x53\x49\x53\x3C\x2F\x42\x3E\xA\x3C\x55"
+"\x4C\x3E\x23\x69\x6E\x63\x6C\x75\x64\x65\x20\x22\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x2E\x68\x22\x3C"
+"\x42\x52\x3E\x3C\x42\x52\x3E\x69\x6E\x74\x20\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x73\x65\x74\x76"
+"\x61\x72\x28\x63\x68\x61\x72\x20\x2A\x3C\x55\x3E\x6E\x61\x6D\x65\x3C\x2F\x55\x3E\x2C\x20\x63\x68\x61\x72"
+"\x20\x2A\x3C\x55\x3E\x76\x61\x6C\x75\x65\x3C\x2F\x55\x3E\x29\x3B\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x44"
+"\x45\x53\x43\x52\x49\x50\x54\x49\x4F\x4E\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x54\x68\x65\x20\x77\x65\x62"
+"\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x73\x65\x74\x76\x61\x72\x28\x29\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20"
+"\x73\x65\x74\x73\x20\x61\x6E\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x20\x6E\x61\x6D\x65\x64\x20\x3C\x55\x3E"
+"\x6E\x61\x6D\x65\x3C\x2F\x55\x3E\x20\x77\x69\x74\x68\x20\x76\x61\x6C\x75\x65\x20\x3C\x55\x3E\x76\x61\x6C"
+"\x75\x65\x3C\x2F\x55\x3E\x20\x69\x6E\x20\x61\x20\x63\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x2C\x20\x74\x6F"
+"\x20\x62\x65\x20\x75\x73\x65\x64\x20\x69\x6E\x20\x6F\x75\x74\x70\x75\x74\x20\x28\x6F\x6E\x6C\x79\x20\x61"
+"\x76\x61\x69\x6C\x61\x62\x6C\x65\x20\x69\x66\x20\x57\x53\x5F\x44\x59\x4E\x56\x41\x52\x20\x66\x6C\x61\x67"
+"\x20\x75\x73\x65\x64\x29\x3C\x42\x52\x3E\xA\x9\x20\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x73\x65"
+"\x74\x76\x61\x72\x28\x22\x62\x67\x63\x22\x2C\x22\x23\x66\x66\x30\x30\x64\x64\x22\x29\x3B\x3C\x42\x52\x3E"
+"\xA\x20\x20\x20\x20\x20\x70\x72\x69\x6E\x74\x66\x28\x22\x26\x6C\x74\x3B\x42\x4F\x44\x59\x20\x62\x67\x63"
+"\x6F\x6C\x6F\x72\x3D\x27\x24\x62\x67\x63\x3B\x27\x26\x67\x74\x3B\x22\x29\x3B\x20\x20\x2D\x20\x77\x69\x6C"
+"\x6C\x20\x65\x78\x63\x68\x61\x6E\x67\x65\x20\x74\x68\x65\x20\x73\x74\x72\x69\x6E\x67\x20\x24\x62\x67\x63"
+"\x3B\x20\x74\x6F\x20\x23\x66\x66\x30\x30\x64\x64\x20\x6F\x6E\x20\x6F\x75\x74\x70\x75\x74\x3C\x2F\x55\x4C"
+"\x3E\xA\xA\x3C\x42\x3E\x4E\x4F\x54\x45\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x54\x68\x65\x20\x77\x65\x62"
+"\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x73\x65\x74\x76\x61\x72\x28\x29\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20"
+"\x3C\x42\x3E\x73\x68\x6F\x75\x6C\x64\x3C\x2F\x42\x3E\x20\x62\x65\x20\x63\x61\x6C\x6C\x65\x64\x20\x3C\x42"
+"\x3E\x6F\x6E\x6C\x79\x3C\x2F\x42\x3E\x20\x66\x72\x6F\x6D\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x20\x63"
+"\x61\x6C\x6C\x65\x64\x20\x62\x79\x20\x67\x65\x74\x68\x61\x6E\x64\x6C\x65\x72\x73\x20\x72\x65\x67\x69\x73"
+"\x74\x65\x72\x65\x64\x20\x76\x69\x61\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D"
+"\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61"
+"\x6E\x64\x6C\x65\x72\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C"
+"\x65\x72\x28\x29\x3C\x2F\x61\x3E\x2E\x3C\x2F\x55\x4C\x3E\xA\x3C\x48\x52\x3E\x3C\x42\x52\x3E\xA\xA\x3C"
+"\x41\x20\x6E\x61\x6D\x65\x3D\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x67\x65\x74\x76\x61\x72\x3E\x3C"
+"\x42\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37\x37\x27\x3E\x77\x65\x62"
+"\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x67\x65\x74\x76\x61\x72\x28\x29\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42"
+"\x3E\x3C\x42\x52\x3E\x3C\x42\x52\x3E\xA\x3C\x42\x3E\x4E\x41\x4D\x45\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E"
+"\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x67\x65\x74\x76\x61\x72\x20\x2D\x20\x67\x65\x74\x73\x20\x61"
+"\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x20\x76\x61\x6C\x75\x65\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x53\x59"
+"\x4E\x4F\x50\x53\x49\x53\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x23\x69\x6E\x63\x6C\x75\x64\x65\x20\x22\x77"
+"\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x2E\x68\x22\x3C\x42\x52\x3E\x3C\x42\x52\x3E\x69\x6E\x74\x20\x77\x65"
+"\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x67\x65\x74\x76\x61\x72\x28\x63\x68\x61\x72\x20\x2A\x3C\x55\x3E\x6E"
+"\x61\x6D\x65\x3C\x2F\x55\x3E\x29\x3B\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x44\x45\x53\x43\x52\x49\x50\x54"
+"\x49\x4F\x4E\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x54\x68\x65\x20\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74"
+"\x5F\x67\x65\x74\x76\x61\x72\x28\x29\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x67\x65\x74\x73\x20\x74\x68"
+"\x65\x20\x76\x61\x6C\x75\x65\x20\x6F\x66\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x20\x3C\x55\x3E\x6E\x61\x6D"
+"\x65\x3C\x2F\x55\x3E\x2C\x20\x28\x73\x65\x65\x20\x61\x6C\x73\x6F\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x2F"
+"\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74"
+"\x5F\x73\x65\x74\x76\x61\x72\x3E\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x73\x65\x74\x76\x61\x72\x28"
+"\x29\x3C\x2F\x61\x3E\x29\x3C\x42\x52\x3E\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x4E\x4F\x54\x45\x3C\x2F\x42"
+"\x3E\xA\x3C\x55\x4C\x3E\x54\x68\x65\x20\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x67\x65\x74\x76\x61"
+"\x72\x28\x29\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x3C\x42\x3E\x73\x68\x6F\x75\x6C\x64\x3C\x2F\x42\x3E"
+"\x20\x62\x65\x20\x63\x61\x6C\x6C\x65\x64\x20\x3C\x42\x3E\x6F\x6E\x6C\x79\x3C\x2F\x42\x3E\x20\x66\x72\x6F"
+"\x6D\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x20\x63\x61\x6C\x6C\x65\x64\x20\x62\x79\x20\x67\x65\x74\x68"
+"\x61\x6E\x64\x6C\x65\x72\x73\x20\x72\x65\x67\x69\x73\x74\x65\x72\x65\x64\x20\x76\x69\x61\x20\x3C\x61\x20"
+"\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62"
+"\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x27\x3E\x77\x65\x62\x5F\x73\x65"
+"\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x28\x29\x3C\x2F\x61\x3E\x2E\x3C\x2F\x55\x4C"
+"\x3E\xA\x3C\x48\x52\x3E\x3C\x42\x52\x3E\xA\xA\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x77\x65\x62\x5F\x63\x6C"
+"\x69\x65\x6E\x74\x5F\x64\x65\x6C\x76\x61\x72\x3E\x3C\x42\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72"
+"\x3D\x27\x30\x30\x30\x30\x37\x37\x27\x3E\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x64\x65\x6C\x76\x61"
+"\x72\x28\x29\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\x3C\x42\x52\x3E\x3C\x42\x52\x3E\xA\x3C\x42\x3E"
+"\x4E\x41\x4D\x45\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x64\x65"
+"\x6C\x76\x61\x72\x20\x2D\x20\x64\x65\x6C\x65\x74\x65\x20\x61\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x3C\x2F"
+"\x55\x4C\x3E\xA\x3C\x42\x3E\x53\x59\x4E\x4F\x50\x53\x49\x53\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x23\x69"
+"\x6E\x63\x6C\x75\x64\x65\x20\x22\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x2E\x68\x22\x3C\x42\x52\x3E\x3C"
+"\x42\x52\x3E\x69\x6E\x74\x20\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x64\x65\x6C\x76\x61\x72\x28\x63"
+"\x68\x61\x72\x20\x2A\x3C\x55\x3E\x6E\x61\x6D\x65\x3C\x2F\x55\x3E\x29\x3B\x3C\x2F\x55\x4C\x3E\xA\x3C\x42"
+"\x3E\x44\x45\x53\x43\x52\x49\x50\x54\x49\x4F\x4E\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x54\x68\x65\x20\x77"
+"\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x64\x65\x6C\x76\x61\x72\x28\x29\x20\x66\x75\x6E\x63\x74\x69\x6F"
+"\x6E\x20\x64\x65\x6C\x65\x74\x65\x73\x20\x61\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x20\x77\x69\x74\x68\x20"
+"\x6E\x61\x6D\x65\x20\x3C\x55\x3E\x6E\x61\x6D\x65\x3C\x2F\x55\x3E\x3C\x42\x52\x3E\x3C\x2F\x55\x4C\x3E\xA"
+"\x3C\x42\x3E\x4E\x4F\x54\x45\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x54\x68\x65\x20\x77\x65\x62\x5F\x63\x6C"
+"\x69\x65\x6E\x74\x5F\x64\x65\x6C\x76\x61\x72\x28\x29\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x3C\x42\x3E"
+"\x73\x68\x6F\x75\x6C\x64\x3C\x2F\x42\x3E\x20\x62\x65\x20\x63\x61\x6C\x6C\x65\x64\x20\x3C\x42\x3E\x6F\x6E"
+"\x6C\x79\x3C\x2F\x42\x3E\x20\x66\x72\x6F\x6D\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x20\x63\x61\x6C\x6C"
+"\x65\x64\x20\x62\x79\x20\x67\x65\x74\x68\x61\x6E\x64\x6C\x65\x72\x73\x20\x72\x65\x67\x69\x73\x74\x65\x72"
+"\x65\x64\x20\x76\x69\x61\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E"
+"\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C"
+"\x65\x72\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x28"
+"\x29\x3C\x2F\x61\x3E\x2E\x3C\x2F\x55\x4C\x3E\xA\x3C\x48\x52\x3E\x3C\x42\x52\x3E\xA\xA\xA\x3C\x41\x20"
+"\x6E\x61\x6D\x65\x3D\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x48\x54\x54\x50\x64\x69\x72\x65\x63\x74"
+"\x69\x76\x65\x3E\x3C\x42\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37\x37"
+"\x27\x3E\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x48\x54\x54\x50\x64\x69\x72\x65\x63\x74\x69\x76\x65"
+"\x28\x29\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\x3C\x42\x52\x3E\x3C\x42\x52\x3E\xA\x3C\x42\x3E\x4E"
+"\x41\x4D\x45\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x48\x54\x54"
+"\x50\x64\x69\x72\x65\x63\x74\x69\x76\x65\x20\x2D\x20\x43\x68\x61\x6E\x67\x65\x20\x74\x68\x65\x20\x48\x54"
+"\x54\x50\x20\x68\x65\x61\x64\x65\x72\x20\x73\x74\x61\x74\x75\x73\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x53"
+"\x59\x4E\x4F\x50\x53\x49\x53\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x23\x69\x6E\x63\x6C\x75\x64\x65\x20\x22"
+"\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x2E\x68\x22\x3C\x42\x52\x3E\x3C\x42\x52\x3E\x76\x6F\x69\x64\x20"
+"\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x48\x54\x54\x50\x64\x69\x72\x65\x63\x74\x69\x76\x65\x28\x63"
+"\x68\x61\x72\x20\x2A\x3C\x55\x3E\x64\x69\x72\x65\x63\x74\x69\x76\x65\x3C\x2F\x55\x3E\x29\x3B\x3C\x2F\x55"
+"\x4C\x3E\xA\x3C\x42\x3E\x44\x45\x53\x43\x52\x49\x50\x54\x49\x4F\x4E\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E"
+"\x54\x68\x65\x20\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x48\x54\x54\x50\x64\x69\x72\x65\x63\x74\x69"
+"\x76\x65\x28\x29\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x63\x68\x61\x6E\x67\x65\x73\x20\x74\x68\x65\x20"
+"\x48\x54\x54\x50\x20\x68\x65\x61\x64\x65\x72\x20\x73\x74\x61\x74\x75\x73\x20\x28\x69\x2E\x65\x2E\x20\x22"
+"\x48\x54\x54\x50\x2F\x31\x2E\x31\x20\x32\x30\x30\x20\x4F\x4B\x22\x29\x20\x74\x6F\x20\x74\x68\x65\x20\x73"
+"\x74\x72\x69\x6E\x67\x20\x3C\x55\x3E\x64\x69\x72\x65\x63\x74\x69\x76\x65\x3C\x2F\x55\x3E\x3C\x42\x52\x3E"
+"\xA\x3C\x73\x6D\x61\x6C\x6C\x3E\x3C\x69\x3E\x75\x73\x65\x66\x75\x6C\x20\x66\x6F\x72\x20\x22\x48\x54\x54"
+"\x50\x2F\x31\x2E\x31\x20\x34\x30\x31\x20\x41\x75\x74\x68\x6F\x72\x69\x7A\x61\x74\x69\x6F\x6E\x20\x52\x65"
+"\x71\x75\x69\x72\x65\x64\x22\x20\x28\x74\x6F\x20\x72\x65\x71\x75\x69\x72\x65\x20\x61\x20\x70\x61\x73\x73"
+"\x77\x6F\x72\x64\x29\x2C\x20\x72\x65\x64\x69\x72\x65\x63\x74\x69\x6F\x6E\x20\x6F\x72\x20\x73\x69\x6D\x69"
+"\x6C\x61\x72\x20\x61\x63\x74\x69\x6F\x6E\x73\x20\x6F\x6E\x20\x74\x68\x65\x20\x63\x6C\x69\x65\x6E\x74\x20"
+"\x73\x69\x64\x65\x3C\x2F\x69\x3E\x3C\x2F\x73\x6D\x61\x6C\x6C\x3E\x2E\x3C\x2F\x55\x4C\x3E\xA\x20\x3C\x42"
+"\x3E\x4E\x4F\x54\x45\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x54\x68\x65\x20\x77\x65\x62\x5F\x63\x6C\x69\x65"
+"\x6E\x74\x5F\x48\x54\x54\x50\x64\x69\x72\x65\x63\x74\x69\x76\x65\x28\x29\x20\x66\x75\x6E\x63\x74\x69\x6F"
+"\x6E\x20\x63\x61\x6E\x20\x62\x65\x20\x63\x61\x6C\x6C\x65\x64\x20\x3C\x42\x3E\x6F\x6E\x6C\x79\x3C\x2F\x42"
+"\x3E\x20\x66\x72\x6F\x6D\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x20\x63\x61\x6C\x6C\x65\x64\x20\x62\x79"
+"\x20\x67\x65\x74\x68\x61\x6E\x64\x6C\x65\x72\x73\x20\x72\x65\x67\x69\x73\x74\x65\x72\x65\x64\x20\x76\x69"
+"\x61\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E"
+"\x73\x23\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x27\x3E\x77"
+"\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x28\x29\x3C\x2F\x61\x3E"
+"\x2E\x3C\x2F\x55\x4C\x3E\xA\x3C\x48\x52\x3E\x3C\x42\x52\x3E\xA\xA\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x77"
+"\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x63\x6F\x6E\x74\x65\x6E\x74\x74\x79\x70\x65\x3E\x3C\x42\x3E\x3C"
+"\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37\x37\x27\x3E\x77\x65\x62\x5F\x63\x6C"
+"\x69\x65\x6E\x74\x5F\x63\x6F\x6E\x74\x65\x6E\x74\x74\x79\x70\x65\x28\x29\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C"
+"\x2F\x42\x3E\x3C\x42\x52\x3E\x3C\x42\x52\x3E\xA\x3C\x42\x3E\x4E\x41\x4D\x45\x3C\x2F\x42\x3E\xA\x3C\x55"
+"\x4C\x3E\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x63\x6F\x6E\x74\x65\x6E\x74\x74\x79\x70\x65\x20\x2D"
+"\x20\x70\x72\x69\x6E\x74\x73\x20\x74\x6F\x20\x73\x74\x64\x6F\x75\x74\x20\x74\x68\x65\x20\x68\x65\x61\x64"
+"\x65\x72\x20\x22\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x74\x79\x70\x65\x3A\x20\x2A\x2F\x2A\x22\x3C\x2F\x55\x4C"
+"\x3E\xA\x3C\x42\x3E\x53\x59\x4E\x4F\x50\x53\x49\x53\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x23\x69\x6E\x63"
+"\x6C\x75\x64\x65\x20\x22\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x2E\x68\x22\x3C\x42\x52\x3E\x3C\x42\x52"
+"\x3E\x76\x6F\x69\x64\x20\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x63\x6F\x6E\x74\x65\x6E\x74\x74\x79"
+"\x70\x65\x28\x63\x68\x61\x72\x20\x2A\x3C\x55\x3E\x65\x78\x74\x65\x6E\x73\x69\x6F\x6E\x3C\x2F\x55\x3E\x29"
+"\x3B\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x44\x45\x53\x43\x52\x49\x50\x54\x49\x4F\x4E\x3C\x2F\x42\x3E\xA"
+"\x3C\x55\x4C\x3E\x54\x68\x65\x20\x77\x65\x62\x5F\x63\x6C\x69\x65\x6E\x74\x5F\x63\x6F\x6E\x74\x65\x6E\x74"
+"\x74\x79\x70\x65\x28\x29\x20\x70\x72\x69\x6E\x74\x73\x20\x74\x6F\x20\x73\x74\x64\x6F\x75\x74\x20\x74\x68"
+"\x65\x20\x68\x65\x61\x64\x65\x72\x20\x22\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x74\x79\x70\x65\x3A\x20\x2A\x2F"
+"\x2A\x22\x2C\x20\x77\x68\x65\x72\x65\x20\x27\x2A\x2F\x2A\x27\x20\x69\x73\x20\x64\x65\x74\x65\x72\x6D\x69"
+"\x6E\x65\x64\x20\x62\x79\x20\x3C\x55\x3E\x65\x78\x74\x65\x6E\x73\x69\x6F\x6E\x3C\x2F\x55\x3E\x20\x28\x69"
+"\x2E\x65\x2E\x20\x22\x68\x74\x6D\x6C\x22\x20\x62\x61\x73\x65\x64\x20\x6F\x6E\x20\x6D\x69\x6D\x65\x66\x69"
+"\x6C\x65\x20\x70\x72\x6F\x64\x75\x63\x65\x73\x20\x22\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x74\x79\x70\x65\x3A"
+"\x20\x74\x65\x78\x74\x2F\x68\x74\x6D\x6C\x5C\x72\x5C\x6E\x5C\x72\x5C\x6E\x22\x20\x61\x6E\x64\x20\x22\x6A"
+"\x70\x67\x22\x20\x70\x72\x6F\x64\x75\x63\x65\x73\x20\x22\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x74\x79\x70\x65"
+"\x3A\x20\x69\x6D\x61\x67\x65\x2F\x6A\x70\x65\x67\x5C\x72\x5C\x6E\x5C\x72\x5C\x6E\x22\x29\x3C\x42\x52\x3E"
+"\xA\x3C\x73\x6D\x61\x6C\x6C\x3E\x74\x68\x69\x73\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x69\x73\x20\x75"
+"\x73\x65\x64\x20\x6F\x6E\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E"
+"\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x6C\x69\x61\x73\x64\x69\x72"
+"\x22\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x61\x6C\x69\x61\x73\x64\x69\x72\x28\x29\x3C\x2F\x61"
+"\x3E\x3C\x2F\x73\x6D\x61\x6C\x6C\x3E\x3C\x2F\x55\x4C\x3E\xA\x20\x3C\x42\x3E\x4E\x4F\x54\x45\x3C\x2F\x42"
+"\x3E\xA\x3C\x55\x4C\x3E\x54\x68\x69\x73\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x75\x73\x65\x73\x20\x6D"
+"\x69\x6D\x65\x20\x74\x79\x70\x65\x73\x20\x6C\x6F\x61\x64\x65\x64\x20\x61\x74\x20\x3C\x61\x20\x68\x72\x65"
+"\x66\x3D\x22\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x73\x65"
+"\x72\x76\x65\x72\x5F\x75\x73\x65\x4D\x49\x4D\x45\x66\x69\x6C\x65\x22\x3E\x77\x65\x62\x5F\x73\x65\x72\x76"
+"\x65\x72\x5F\x75\x73\x65\x4D\x49\x4D\x45\x66\x69\x6C\x65\x28\x29\x3C\x2F\x61\x3E\x20\x65\x6C\x73\x65\x20"
+"\x69\x74\x20\x77\x69\x6C\x6C\x20\x70\x72\x69\x6E\x74\x20\x6F\x6E\x6C\x79\x20\x22\x43\x6F\x6E\x74\x65\x6E"
+"\x74\x2D\x74\x79\x70\x65\x3A\x20\x74\x65\x78\x74\x2F\x70\x6C\x61\x69\x6E\x5C\x72\x5C\x6E\x5C\x72\x5C\x6E"
+"\x22\x3C\x2F\x55\x4C\x3E\xA\x3C\x48\x52\x3E\x3C\x42\x52\x3E\xA\xA\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x77"
+"\x65\x62\x5F\x6C\x6F\x67\x3E\x3C\x42\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30"
+"\x30\x37\x37\x27\x3E\x77\x65\x62\x5F\x6C\x6F\x67\x28\x29\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\x3C"
+"\x42\x52\x3E\x3C\x42\x52\x3E\xA\x3C\x42\x3E\x4E\x41\x4D\x45\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x77\x65"
+"\x62\x5F\x6C\x6F\x67\x20\x2D\x20\x77\x72\x69\x74\x65\x20\x74\x6F\x20\x6C\x6F\x67\x66\x69\x6C\x65\x3C\x2F"
+"\x55\x4C\x3E\xA\x3C\x42\x3E\x53\x59\x4E\x4F\x50\x53\x49\x53\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x23\x69"
+"\x6E\x63\x6C\x75\x64\x65\x20\x22\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x2E\x68\x22\x3C\x42\x52\x3E\x3C"
+"\x42\x52\x3E\x76\x6F\x69\x64\x20\x77\x65\x62\x5F\x6C\x6F\x67\x28\x63\x6F\x6E\x73\x74\x20\x63\x68\x61\x72"
+"\x20\x2A\x3C\x55\x3E\x66\x6F\x72\x6D\x61\x74\x3C\x2F\x55\x3E\x2C\x3C\x55\x3E\x2E\x2E\x2E\x3C\x2F\x55\x3E"
+"\x29\x3B\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x44\x45\x53\x43\x52\x49\x50\x54\x49\x4F\x4E\x3C\x2F\x42\x3E"
+"\xA\x3C\x55\x4C\x3E\x54\x68\x65\x20\x77\x65\x62\x5F\x6C\x6F\x67\x28\x29\x20\x69\x73\x20\x73\x69\x6D\x69"
+"\x6C\x61\x72\x20\x74\x6F\x20\x70\x72\x69\x6E\x74\x66\x2C\x20\x62\x75\x74\x20\x77\x72\x69\x74\x65\x73\x20"
+"\x74\x6F\x20\x61\x20\x6C\x6F\x67\x66\x69\x6C\x65\x20\x28\x73\x70\x65\x63\x69\x66\x69\x65\x64\x20\x69\x6E"
+"\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23"
+"\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F\x69\x6E\x69\x74\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72"
+"\x5F\x69\x6E\x69\x74\x28\x29\x3C\x2F\x61\x3E\x29\x2E\x20\x4A\x75\x73\x74\x20\x61\x73\x20\x70\x72\x69\x6E"
+"\x74\x66\x2C\x20\x69\x74\x20\x64\x6F\x65\x73\x6E\x27\x74\x20\x61\x64\x64\x20\x61\x20\x6E\x65\x77\x6C\x69"
+"\x6E\x65\x20\x61\x74\x20\x74\x68\x65\x20\x65\x6E\x64\x2E\x3C\x2F\x55\x4C\x3E\xA\x20\x3C\x42\x3E\x4E\x4F"
+"\x54\x45\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x54\x68\x65\x20\x77\x65\x62\x5F\x6C\x6F\x67\x28\x29\x20\x66"
+"\x75\x6E\x63\x74\x69\x6F\x6E\x20\x3C\x42\x3E\x73\x68\x6F\x75\x6C\x64\x3C\x2F\x42\x3E\x20\x62\x65\x20\x63"
+"\x61\x6C\x6C\x65\x64\x20\x3C\x42\x3E\x6F\x6E\x6C\x79\x3C\x2F\x42\x3E\x20\x66\x72\x6F\x6D\x20\x66\x75\x6E"
+"\x63\x74\x69\x6F\x6E\x73\x20\x63\x61\x6C\x6C\x65\x64\x20\x62\x79\x20\x67\x65\x74\x68\x61\x6E\x64\x6C\x65"
+"\x72\x73\x20\x72\x65\x67\x69\x73\x74\x65\x72\x65\x64\x20\x76\x69\x61\x20\x3C\x61\x20\x68\x72\x65\x66\x3D"
+"\x27\x2F\x3F\x68\x65\x6C\x70\x3D\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x23\x77\x65\x62\x5F\x73\x65\x72\x76"
+"\x65\x72\x5F\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x27\x3E\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x5F"
+"\x61\x64\x64\x68\x61\x6E\x64\x6C\x65\x72\x28\x29\x3C\x2F\x61\x3E\x2E\x3C\x2F\x55\x4C\x3E\xA\x3C\x48\x52"
+"\x3E\x3C\x42\x52\x3E\xA\xA\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x3E"
+"\x3C\x42\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37\x37\x27\x3E\x43\x6C"
+"\x69\x65\x6E\x74\x49\x6E\x66\x6F\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\x3C\x42\x52\x3E\x3C\x42\x52"
+"\x3E\xA\x3C\x42\x3E\x4E\x41\x4D\x45\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x43\x6C\x69\x65\x6E\x74\x49\x6E"
+"\x66\x6F\x20\x2D\x20\x61\x20\x73\x74\x72\x75\x63\x74\x20\x74\x6F\x20\x63\x6F\x6E\x74\x72\x6F\x6C\x20\x63"
+"\x6C\x69\x65\x6E\x74\x20\x48\x65\x61\x64\x65\x72\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x53\x59\x4E\x4F\x50"
+"\x53\x49\x53\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x20\x44\x65\x63\x6C\x61\x72\x65\x64\x20\x69\x6E\x20\x77"
+"\x65\x62\x5F\x73\x65\x72\x76\x65\x72\x2E\x68\x20\x3C\x42\x52\x3E\x3C\x42\x52\x3E\xA\x65\x78\x74\x65\x72"
+"\x6E\x20\x73\x74\x72\x75\x63\x74\x20\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x20\x7B\x3C\x42\x52\x3E\xA"
+"\x3C\x55\x4C\x3E\xA\x20\x20\x20\x20\x20\x20\x20\x20\x69\x6E\x74\x20\x3C\x55\x3E\x6F\x75\x74\x66\x64\x3C"
+"\x2F\x55\x3E\x3B\x3C\x42\x52\x3E\xA\x20\x20\x20\x20\x20\x20\x20\x20\x63\x68\x61\x72\x20\x2A\x3C\x55\x3E"
+"\x69\x6E\x65\x74\x6E\x61\x6D\x65\x3C\x2F\x55\x3E\x3B\x3C\x42\x52\x3E\xA\x20\x20\x20\x20\x20\x20\x20\x20"
+"\x63\x68\x61\x72\x20\x2A\x3C\x55\x3E\x72\x65\x71\x75\x65\x73\x74\x3C\x2F\x55\x3E\x3B\x3C\x42\x52\x3E\xA"
+"\x20\x20\x20\x20\x20\x20\x20\x20\x63\x68\x61\x72\x20\x2A\x3C\x55\x3E\x6D\x65\x74\x68\x6F\x64\x3C\x2F\x55"
+"\x3E\x3B\x3C\x42\x52\x3E\xA\x20\x20\x20\x20\x20\x20\x20\x20\x63\x68\x61\x72\x20\x2A\x3C\x55\x3E\x75\x73"
+"\x65\x72\x3C\x2F\x55\x3E\x3B\x3C\x42\x52\x3E\xA\x20\x20\x20\x20\x20\x20\x20\x20\x63\x68\x61\x72\x20\x2A"
+"\x3C\x55\x3E\x70\x61\x73\x73\x3C\x2F\x55\x3E\x3B\x3C\x42\x52\x3E\xA\x9\x9\x63\x68\x61\x72\x20\x2A\x28"
+"\x2A\x3C\x55\x3E\x48\x65\x61\x64\x65\x72\x3C\x2F\x55\x3E\x29\x28\x63\x68\x61\x72\x20\x2A\x68\x61\x6E\x64"
+"\x6C\x65\x29\x3B\x3C\x42\x52\x3E\xA\x20\x20\x20\x20\x20\x20\x20\x20\x63\x68\x61\x72\x20\x2A\x28\x2A\x3C"
+"\x55\x3E\x51\x75\x65\x72\x79\x3C\x2F\x55\x3E\x29\x28\x63\x68\x61\x72\x20\x2A\x68\x61\x6E\x64\x6C\x65\x29"
+"\x3B\x3C\x42\x52\x3E\xA\x20\x20\x20\x20\x20\x20\x20\x20\x63\x68\x61\x72\x20\x2A\x28\x2A\x3C\x55\x3E\x50"
+"\x6F\x73\x74\x3C\x2F\x55\x3E\x29\x28\x63\x68\x61\x72\x20\x2A\x68\x61\x6E\x64\x6C\x65\x29\x3B\x3C\x42\x52"
+"\x3E\xA\x20\x20\x20\x20\x20\x20\x20\x20\x63\x68\x61\x72\x20\x2A\x28\x2A\x3C\x55\x3E\x43\x6F\x6F\x6B\x69"
+"\x65\x3C\x2F\x55\x3E\x29\x28\x63\x68\x61\x72\x20\x2A\x68\x61\x6E\x64\x6C\x65\x29\x3B\x3C\x42\x52\x3E\xA"
+"\x9\x9\x63\x68\x61\x72\x20\x2A\x28\x2A\x3C\x55\x3E\x43\x6F\x6E\x66\x3C\x2F\x55\x3E\x29\x28\x63\x68\x61"
+"\x72\x20\x2A\x68\x61\x6E\x64\x6C\x65\x29\x3B\x3C\x42\x52\x3E\xA\x20\x20\x20\x20\x20\x20\x20\x20\x73\x74"
+"\x72\x75\x63\x74\x20\x5F\x4D\x75\x6C\x74\x69\x50\x61\x72\x74\x20\x28\x2A\x3C\x55\x3E\x4D\x75\x6C\x74\x69"
+"\x50\x61\x72\x74\x3C\x2F\x55\x3E\x29\x28\x63\x68\x61\x72\x20\x2A\x68\x61\x6E\x64\x6C\x65\x29\x3B\x3C\x42"
+"\x52\x3E\xA\x20\x20\x20\x20\x20\x20\x20\x20\x76\x6F\x69\x64\x20\x2A\x5F\x5F\x70\x61\x64\x5B\x35\x5D\x3B"
+"\x3C\x42\x52\x3E\xA\x3C\x2F\x55\x4C\x3E\xA\x7D\x20\x2A\x3C\x55\x3E\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66"
+"\x6F\x3C\x2F\x55\x3E\x3B\xA\x3C\x2F\x55\x4C\x3E\xA\x3C\x42\x3E\x44\x45\x53\x43\x52\x49\x50\x54\x49\x4F"
+"\x4E\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\xA\x3C\x42\x3E\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x26"
+"\x67\x74\x3B\x3C\x55\x3E\x6F\x75\x74\x66\x64\x3C\x2F\x55\x3E\x3C\x2F\x42\x3E\x20\x3C\x55\x4C\x3E\x69\x73"
+"\x20\x74\x68\x65\x20\x66\x69\x6C\x65\x64\x65\x73\x63\x72\x69\x70\x74\x6F\x72\x20\x6F\x66\x20\x74\x68\x65"
+"\x20\x63\x75\x72\x72\x65\x6E\x74\x20\x6F\x75\x74\x70\x75\x74\x20\x73\x74\x72\x65\x61\x6D\x20\x28\x75\x73"
+"\x65\x66\x75\x6C\x20\x66\x6F\x72\x20\x63\x67\x69\x20\x68\x61\x6E\x64\x6C\x65\x72\x73\x20\x61\x6E\x64\x20"
+"\x66\x72\x69\x65\x6E\x64\x73\x29\x2E\x3C\x2F\x55\x4C\x3E\x3C\x42\x52\x3E\xA\x3C\x42\x3E\x43\x6C\x69\x65"
+"\x6E\x74\x49\x6E\x66\x6F\x2D\x26\x67\x74\x3B\x3C\x55\x3E\x69\x6E\x65\x74\x6E\x61\x6D\x65\x3C\x2F\x55\x3E"
+"\x3C\x2F\x42\x3E\x20\x3C\x55\x4C\x3E\x61\x20\x73\x74\x72\x69\x6E\x67\x20\x74\x6F\x20\x69\x6E\x65\x74\x6E"
+"\x61\x6D\x65\x20\x28\x69\x2E\x65\x2E\x20\x22\x31\x32\x37\x2E\x30\x2E\x30\x2E\x31\x22\x29\x3C\x2F\x55\x4C"
+"\x3E\x20\x3C\x42\x52\x3E\xA\x3C\x42\x3E\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x26\x67\x74\x3B\x3C"
+"\x55\x3E\x72\x65\x71\x75\x65\x73\x74\x3C\x2F\x55\x3E\x3C\x2F\x42\x3E\x20\x3C\x55\x4C\x3E\x69\x73\x20\x74"
+"\x68\x65\x20\x72\x65\x71\x75\x65\x73\x74\x65\x64\x20\x27\x66\x69\x6C\x65\x27\x20\x28\x69\x2E\x65\x2E\x20"
+"\x66\x6F\x72\x20\x22\x47\x45\x54\x20\x2F\x69\x6E\x64\x65\x78\x2E\x68\x74\x6D\x6C\x20\x48\x54\x54\x50\x2F"
+"\x31\x2E\x30\x5C\x72\x5C\x6E\x22\x20\x74\x68\x65\x20\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x26\x67"
+"\x74\x3B\x72\x65\x71\x75\x65\x73\x74\x20\x69\x73\x20\x22\x2F\x69\x6E\x64\x65\x78\x2E\x68\x74\x6D\x6C\x22"
+"\x29\x3C\x2F\x55\x4C\x3E\x3C\x42\x52\x3E\xA\x3C\x42\x3E\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x26"
+"\x67\x74\x3B\x3C\x55\x3E\x6D\x65\x74\x68\x6F\x64\x3C\x2F\x55\x3E\x3C\x2F\x42\x3E\x20\x3C\x55\x4C\x3E\x69"
+"\x73\x20\x74\x68\x65\x20\x72\x65\x71\x75\x65\x73\x74\x20\x6D\x65\x74\x68\x6F\x64\x20\x28\x22\x47\x45\x54"
+"\x22\x20\x6F\x72\x20\x22\x50\x4F\x53\x54\x22\x20\x65\x74\x63\x2E\x2E\x29\x3C\x2F\x55\x4C\x3E\x3C\x42\x52"
+"\x3E\xA\x3C\x42\x3E\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x26\x67\x74\x3B\x3C\x55\x3E\x75\x73\x65"
+"\x72\x3C\x2F\x55\x3E\x3C\x2F\x42\x3E\x20\x3C\x55\x4C\x3E\x41\x75\x74\x68\x52\x65\x61\x6C\x6D\x20\x75\x73"
+"\x65\x72\x6E\x61\x6D\x65\x3C\x2F\x55\x4C\x3E\x3C\x42\x52\x3E\xA\x3C\x42\x3E\x43\x6C\x69\x65\x6E\x74\x49"
+"\x6E\x66\x6F\x2D\x26\x67\x74\x3B\x3C\x55\x3E\x70\x61\x73\x73\x3C\x2F\x55\x3E\x3C\x2F\x42\x3E\x20\x3C\x55"
+"\x4C\x3E\x41\x75\x74\x68\x52\x65\x61\x6C\x6D\x20\x70\x61\x73\x73\x77\x6F\x72\x64\x3C\x2F\x55\x4C\x3E\x3C"
+"\x42\x52\x3E\xA\x3C\x42\x3E\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x26\x67\x74\x3B\x3C\x55\x3E\x48"
+"\x65\x61\x64\x65\x72\x28\x3C\x2F\x55\x3E\x63\x68\x61\x72\x20\x2A\x3C\x55\x3E\x68\x61\x6E\x64\x6C\x65\x3C"
+"\x2F\x55\x3E\x29\x3C\x2F\x42\x3E\x20\x3C\x55\x4C\x3E\x46\x75\x6E\x63\x74\x69\x6F\x6E\x20\x74\x6F\x20\x70"
+"\x61\x72\x73\x65\x20\x74\x68\x65\x20\x68\x65\x61\x64\x65\x72\x2C\x20\x61\x6E\x64\x20\x72\x65\x74\x75\x72"
+"\x6E\x73\x20\x48\x65\x61\x64\x65\x72\x20\x69\x6E\x66\x6F\x72\x6D\x61\x74\x69\x6F\x6E\x20\x28\x69\x2E\x65"
+"\x2E\x20\x66\x6F\x72\x20\x22\x48\x6F\x73\x74\x3A\x20\x68\x74\x74\x70\x3A\x2F\x2F\x31\x32\x37\x2E\x30\x2E"
+"\x30\x2E\x31\x3A\x38\x31\x22\x20\x74\x68\x65\x20\x72\x65\x73\x75\x6C\x74\x20\x6F\x66\x20\x43\x6C\x69\x65"
+"\x6E\x74\x49\x6E\x66\x6F\x2D\x26\x67\x74\x3B\x48\x65\x61\x64\x65\x72\x28\x22\x48\x6F\x73\x74\x22\x29\x20"
+"\x69\x73\x20\x22\x68\x74\x74\x70\x3A\x2F\x2F\x31\x32\x37\x2E\x30\x2E\x30\x2E\x31\x3A\x38\x31\x22\x29\x20"
+"\x69\x66\x20\x61\x72\x67\x75\x6D\x65\x6E\x74\x20\x3C\x55\x3E\x68\x61\x6E\x64\x6C\x65\x3C\x2F\x55\x3E\x20"
+"\x69\x73\x20\x4E\x55\x4C\x4C\x20\x74\x68\x65\x6E\x20\x74\x68\x69\x73\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E"
+"\x20\x72\x65\x74\x75\x72\x6E\x73\x20\x77\x68\x6F\x6C\x65\x20\x48\x65\x61\x64\x65\x72\x20\x66\x72\x6F\x6D"
+"\x20\x63\x6C\x69\x65\x6E\x74\x3C\x2F\x55\x4C\x3E\x3C\x42\x52\x3E\xA\x3C\x42\x3E\x43\x6C\x69\x65\x6E\x74"
+"\x49\x6E\x66\x6F\x2D\x26\x67\x74\x3B\x3C\x55\x3E\x51\x75\x65\x72\x79\x28\x3C\x2F\x55\x3E\x63\x68\x61\x72"
+"\x20\x2A\x3C\x55\x3E\x68\x61\x6E\x64\x6C\x65\x3C\x2F\x55\x3E\x29\x3C\x2F\x42\x3E\x20\x3C\x55\x4C\x3E\x41"
+"\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x74\x68\x61\x74\x20\x72\x65\x74\x75\x72\x6E\x73\x20\x74\x68\x65"
+"\x20\x71\x75\x65\x72\x79\x20\x76\x61\x6C\x75\x65\x20\x66\x72\x6F\x6D\x20\x74\x68\x65\x20\x62\x72\x6F\x77"
+"\x73\x65\x72\x20\x28\x69\x2E\x65\x20\x66\x6F\x72\x20\x74\x68\x65\x20\x72\x65\x71\x75\x65\x73\x74\x20\x22"
+"\x68\x74\x74\x70\x3A\x2F\x2F\x73\x6F\x6D\x65\x68\x6F\x73\x74\x2E\x6E\x65\x74\x2F\x72\x65\x71\x2E\x68\x74"
+"\x6D\x6C\x3F\x69\x64\x3D\x35\x26\x66\x3D\x31\x22\x2C\x20\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x26"
+"\x67\x74\x3B\x51\x75\x65\x72\x79\x28\x22\x69\x64\x22\x29\x20\x69\x73\x20\x22\x35\x22\x2E\x69\x66\x20\x61"
+"\x72\x67\x75\x6D\x65\x6E\x74\x20\x3C\x55\x3E\x68\x61\x6E\x64\x6C\x65\x3C\x2F\x55\x3E\x20\x69\x73\x20\x4E"
+"\x55\x4C\x4C\x20\x74\x68\x65\x6E\x20\x74\x68\x69\x73\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x72\x65\x74"
+"\x75\x72\x6E\x73\x20\x77\x68\x6F\x6C\x65\x20\x51\x75\x65\x72\x79\x20\x73\x74\x72\x69\x6E\x67\x20\x66\x72"
+"\x6F\x6D\x20\x63\x6C\x69\x65\x6E\x74\x3C\x42\x52\x3E\x69\x66\x20\x74\x68\x65\x20\x68\x61\x6E\x64\x6C\x65"
+"\x20\x68\x61\x76\x65\x20\x74\x68\x65\x20\x63\x68\x61\x72\x20\x23\x20\x66\x69\x72\x73\x74\x20\x28\x6C\x69"
+"\x6B\x65\x20\x22\x23\x68\x61\x6E\x64\x6C\x65\x22\x29\x20\x69\x74\x20\x72\x65\x74\x75\x72\x6E\x73\x20\x74"
+"\x68\x65\x20\x6E\x75\x6D\x62\x65\x72\x20\x6F\x66\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x73\x20\x28\x75\x73"
+"\x65\x66\x75\x6C\x6C\x20\x66\x6F\x72\x20\x63\x68\x65\x63\x6B\x62\x6F\x78\x65\x73\x20\x61\x6E\x64\x20\x65"
+"\x74\x63\x2E\x2E\x2E\x29\x20\x43\x68\x65\x63\x6B\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F\x3F\x68\x65"
+"\x6C\x70\x3D\x65\x78\x61\x6D\x70\x6C\x65\x73\x23\x63\x68\x65\x63\x6B\x62\x6F\x78\x27\x3E\x63\x68\x65\x63"
+"\x6B\x62\x6F\x78\x20\x65\x78\x61\x6D\x70\x6C\x65\x3C\x2F\x61\x3E\x3C\x2F\x55\x4C\x3E\x3C\x42\x52\x3E\xA"
+"\x3C\x42\x3E\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x26\x67\x74\x3B\x3C\x55\x3E\x50\x6F\x73\x74\x28"
+"\x3C\x2F\x55\x3E\x63\x68\x61\x72\x20\x2A\x3C\x55\x3E\x68\x61\x6E\x64\x6C\x65\x3C\x2F\x55\x3E\x29\x3C\x2F"
+"\x42\x3E\x20\x3C\x55\x4C\x3E\x41\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x74\x68\x61\x74\x20\x72\x65\x74"
+"\x75\x72\x6E\x73\x20\x74\x68\x65\x20\x50\x6F\x73\x74\x20\x64\x61\x74\x61\x20\x66\x72\x6F\x6D\x20\x74\x68"
+"\x65\x20\x66\x6F\x72\x6D\x73\x20\x77\x69\x74\x68\x20\x6D\x65\x74\x68\x6F\x64\x20\x27\x50\x4F\x53\x54\x27"
+"\x2E\x20\x3C\x55\x3E\x68\x61\x6E\x64\x6C\x65\x3C\x2F\x55\x3E\x20\x69\x73\x20\x74\x68\x65\x20\x6E\x61\x6D"
+"\x65\x20\x6F\x66\x20\x73\x6F\x6D\x65\x20\x26\x6C\x74\x3B\x69\x6E\x70\x75\x74\x26\x67\x74\x3B\x20\x74\x61"
+"\x67\x2E\x69\x66\x20\x61\x72\x67\x75\x6D\x65\x6E\x74\x20\x3C\x55\x3E\x68\x61\x6E\x64\x6C\x65\x3C\x2F\x55"
+"\x3E\x20\x69\x73\x20\x4E\x55\x4C\x4C\x20\x74\x68\x65\x6E\x20\x74\x68\x69\x73\x20\x66\x75\x6E\x63\x74\x69"
+"\x6F\x6E\x20\x72\x65\x74\x75\x72\x6E\x73\x20\x77\x68\x6F\x6C\x65\x20\x50\x6F\x73\x74\x20\x64\x61\x74\x61"
+"\x20\x66\x72\x6F\x6D\x20\x63\x6C\x69\x65\x6E\x74\x3C\x42\x52\x3E\x69\x66\x20\x74\x68\x65\x20\x68\x61\x6E"
+"\x64\x6C\x65\x20\x68\x61\x76\x65\x20\x74\x68\x65\x20\x63\x68\x61\x72\x20\x23\x20\x66\x69\x72\x73\x74\x20"
+"\x28\x6C\x69\x6B\x65\x20\x22\x23\x68\x61\x6E\x64\x6C\x65\x22\x29\x20\x69\x74\x20\x72\x65\x74\x75\x72\x6E"
+"\x73\x20\x74\x68\x65\x20\x6E\x75\x6D\x62\x65\x72\x20\x6F\x66\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x73\x20"
+"\x28\x75\x73\x65\x66\x75\x6C\x6C\x20\x66\x6F\x72\x20\x63\x68\x65\x63\x6B\x62\x6F\x78\x65\x73\x20\x61\x6E"
+"\x64\x20\x65\x74\x63\x2E\x2E\x2E\x29\x20\x43\x68\x65\x63\x6B\x20\x3C\x61\x20\x68\x72\x65\x66\x3D\x27\x2F"
+"\x3F\x68\x65\x6C\x70\x3D\x65\x78\x61\x6D\x70\x6C\x65\x73\x23\x63\x68\x65\x63\x6B\x62\x6F\x78\x27\x3E\x63"
+"\x68\x65\x63\x6B\x62\x6F\x78\x20\x65\x78\x61\x6D\x70\x6C\x65\x3C\x2F\x61\x3E\x3C\x2F\x55\x4C\x3E\x3C\x42"
+"\x52\x3E\xA\x3C\x42\x3E\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x26\x67\x74\x3B\x3C\x55\x3E\x43\x6F"
+"\x6F\x6B\x69\x65\x28\x3C\x2F\x55\x3E\x63\x68\x61\x72\x20\x2A\x3C\x55\x3E\x68\x61\x6E\x64\x6C\x65\x3C\x2F"
+"\x55\x3E\x29\x3C\x2F\x42\x3E\x20\x3C\x55\x4C\x3E\x41\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x74\x68\x61"
+"\x74\x20\x72\x65\x74\x75\x72\x6E\x73\x20\x74\x68\x65\x20\x43\x6F\x6F\x6B\x69\x65\x20\x64\x61\x74\x61\x20"
+"\x66\x72\x6F\x6D\x20\x62\x72\x6F\x77\x73\x65\x72\x2E\x20\x69\x66\x20\x61\x72\x67\x75\x6D\x65\x6E\x74\x20"
+"\x3C\x55\x3E\x68\x61\x6E\x64\x6C\x65\x3C\x2F\x55\x3E\x20\x69\x73\x20\x4E\x55\x4C\x4C\x20\x74\x68\x65\x6E"
+"\x20\x74\x68\x69\x73\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x72\x65\x74\x75\x72\x6E\x73\x20\x77\x68\x6F"
+"\x6C\x65\x20\x43\x6F\x6F\x6B\x69\x65\x73\x74\x72\x69\x6E\x67\x20\x66\x72\x6F\x6D\x20\x63\x6C\x69\x65\x6E"
+"\x74\x3C\x2F\x55\x4C\x3E\x3C\x42\x52\x3E\xA\x3C\x42\x3E\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x26"
+"\x67\x74\x3B\x3C\x55\x3E\x43\x6F\x6E\x66\x28\x3C\x2F\x55\x3E\x63\x68\x61\x72\x20\x2A\x20\x3C\x55\x3E\x74"
+"\x6F\x70\x69\x63\x3C\x2F\x55\x3E\x2C\x63\x68\x61\x72\x20\x2A\x3C\x55\x3E\x68\x61\x6E\x64\x6C\x65\x3C\x2F"
+"\x55\x3E\x29\x3C\x2F\x42\x3E\x20\x3C\x55\x4C\x3E\x41\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x74\x68\x61"
+"\x74\x20\x72\x65\x74\x75\x72\x6E\x73\x20\x61\x6E\x20\x76\x61\x6C\x75\x65\x20\x66\x72\x6F\x6D\x20\x61\x20"
+"\x3C\x55\x3E\x6B\x65\x79\x3C\x2F\x55\x3E\x20\x69\x6E\x20\x3C\x55\x3E\x74\x6F\x70\x69\x63\x3C\x2F\x55\x3E"
+"\x20\x69\x6E\x20\x74\x68\x65\x20\x63\x6F\x6E\x66\x69\x67\x20\x66\x69\x6C\x65\x20\x69\x66\x20\x75\x73\x65"
+"\x64\x3C\x2F\x55\x4C\x3E\x3C\x42\x52\x3E\xA\x3C\x42\x3E\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x26"
+"\x67\x74\x3B\x3C\x55\x3E\x4D\x75\x6C\x74\x69\x50\x61\x72\x74\x28\x3C\x2F\x55\x3E\x63\x68\x61\x72\x20\x2A"
+"\x3C\x55\x3E\x68\x61\x6E\x64\x6C\x65\x3C\x2F\x55\x3E\x29\x3C\x2F\x42\x3E\x20\x3C\x55\x4C\x3E\x41\x20\x66"
+"\x75\x6E\x63\x74\x69\x6F\x6E\x20\x74\x68\x61\x74\x20\x72\x65\x74\x75\x72\x6E\x73\x20\x61\x20\x64\x61\x74"
+"\x61\x20\x73\x74\x72\x75\x63\x74\x75\x72\x65\x20\x66\x72\x6F\x6D\x20\x74\x68\x65\x20\x66\x6F\x72\x6D\x73"
+"\x20\x77\x69\x74\x68\x20\x6D\x65\x74\x68\x6F\x64\x20\x27\x50\x4F\x53\x54\x27\x20\x61\x6E\x64\x20\x65\x6E"
+"\x63\x74\x79\x70\x65\x3D\x27\x6D\x75\x6C\x74\x69\x70\x61\x72\x74\x2F\x66\x6F\x72\x6D\x2D\x64\x61\x74\x61"
+"\x27\x20\x28\x75\x73\x65\x66\x75\x6C\x20\x66\x6F\x72\x20\x75\x70\x6C\x6F\x61\x64\x69\x6E\x67\x20\x66\x69"
+"\x6C\x65\x73\x29\x2E\x20\x3C\x55\x3E\x68\x61\x6E\x64\x6C\x65\x3C\x2F\x55\x3E\x20\x69\x73\x20\x74\x68\x65"
+"\x20\x6E\x61\x6D\x65\x20\x6F\x66\x20\x73\x6F\x6D\x65\x20\x26\x6C\x74\x3B\x69\x6E\x70\x75\x74\x26\x67\x74"
+"\x3B\x20\x74\x61\x67\x2E\x3C\x42\x52\x3E\x3C\x42\x52\x3E\xA\x74\x68\x65\x20\x73\x74\x72\x75\x63\x74\x75"
+"\x72\x65\x20\x69\x73\x3C\x42\x52\x3E\xA\x73\x74\x72\x75\x63\x74\x20\x5F\x4D\x75\x6C\x74\x69\x50\x61\x72"
+"\x74\x20\x7B\xA\x3C\x55\x4C\x3E\xA\x63\x68\x61\x72\x20\x2A\x3C\x55\x3E\x69\x64\x3C\x2F\x75\x3E\x3B\x3C"
+"\x42\x52\x3E\xA\x63\x68\x61\x72\x20\x2A\x3C\x55\x3E\x64\x61\x74\x61\x3C\x2F\x55\x3E\x3B\x3C\x42\x52\x3E"
+"\xA\x75\x6E\x73\x69\x67\x6E\x65\x64\x20\x69\x6E\x74\x20\x3C\x55\x3E\x73\x69\x7A\x65\x3C\x2F\x55\x3E\x3B"
+"\x3C\x42\x52\x3E\xA\x63\x68\x61\x72\x20\x2A\x3C\x55\x3E\x66\x69\x6C\x65\x6E\x61\x6D\x65\x3C\x2F\x55\x3E"
+"\x3B\x3C\x42\x52\x3E\xA\x76\x6F\x69\x64\x20\x2A\x3C\x55\x3E\x70\x61\x64\x3C\x2F\x55\x3E\x3B\x3C\x42\x52"
+"\x3E\xA\x3C\x2F\x55\x4C\x3E\xA\x7D\x3B\x3C\x42\x52\x3E\xA\x74\x6F\x20\x62\x65\x20\x75\x73\x65\x64\x20"
+"\x61\x73\x20\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x26\x67\x74\x3B\x3C\x55\x3E\x4D\x75\x6C\x74\x69"
+"\x50\x61\x72\x74\x3C\x2F\x55\x3E\x28\x22\x66\x69\x6C\x65\x31\x22\x29\x2E\x3C\x55\x3E\x64\x61\x74\x61\x3C"
+"\x2F\x55\x3E\x3B\x20\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x26\x67\x74\x3B\x3C\x55\x3E\x4D\x75\x6C"
+"\x74\x69\x50\x61\x72\x74\x3C\x2F\x55\x3E\x28\x22\x66\x69\x6C\x65\x31\x22\x29\x2E\x3C\x55\x3E\x73\x69\x7A"
+"\x65\x3C\x2F\x55\x3E\x3B\x20\x43\x6C\x69\x65\x6E\x74\x49\x6E\x66\x6F\x2D\x26\x67\x74\x3B\x3C\x55\x3E\x4D"
+"\x75\x6C\x74\x69\x50\x61\x72\x74\x3C\x2F\x55\x3E\x28\x22\x66\x69\x6C\x65\x31\x22\x29\x2E\x3C\x55\x3E\x66"
+"\x69\x6C\x65\x6E\x61\x6D\x65\x3C\x2F\x55\x3E\x3B\xA\x3C\x2F\x55\x4C\x3E\xA\xA\x3C\x2F\x55\x4C\x3E\xA"
+"\x3C\x48\x52\x3E\x3C\x42\x52\x3E\xA\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x63\x6F\x6E\x66\x69\x67\x66\x69\x6C"
+"\x65\x3E\x3C\x42\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37\x37\x27\x3E"
+"\x54\x68\x65\x20\x63\x6F\x6E\x66\x69\x67\x20\x66\x69\x6C\x65\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E"
+"\x3C\x42\x52\x3E\x3C\x42\x52\x3E\xA\x3C\x55\x4C\x3E\x74\x68\x65\x20\x63\x6F\x6E\x66\x69\x67\x20\x66\x69"
+"\x6C\x65\x20\x69\x73\x20\x75\x73\x65\x64\x20\x61\x73\x3C\x42\x52\x3E\x3C\x42\x52\x3E\xA\x3C\x50\x52\x45"
+"\x3E\xA\x5B\x54\x4F\x50\x49\x43\x5D\xA\x4B\x45\x59\x3D\x56\x41\x4C\x55\x45\xA\xA\x6C\x69\x62\x77\x65"
+"\x62\x73\x65\x72\x76\x65\x72\x20\x63\x6F\x6E\x66\x69\x67\x75\x72\x61\x74\x69\x6F\x6E\x73\x20\x6D\x75\x73"
+"\x74\x20\x62\x65\x20\x69\x6E\x20\x74\x6F\x70\x69\x63\x20\x4C\x49\x42\x57\x45\x42\x53\x45\x52\x56\x45\x52"
+"\x20\x61\x73\x3A\xA\x5B\x4C\x49\x42\x57\x45\x42\x53\x45\x52\x56\x45\x52\x5D\xA\x4C\x4F\x47\x3D\x68\x65"
+"\x6C\x70\x2E\x6C\x6F\x67\x20\xA\x50\x4F\x52\x54\x3D\x38\x30\xA\x55\x53\x45\x53\x53\x4C\x3D\x31\xA\x43"
+"\x45\x52\x54\x46\x49\x4C\x45\x3D\x66\x6F\x6F\x63\x65\x72\x74\x2E\x70\x6D\xA\x4D\x49\x4D\x45\x46\x49\x4C"
+"\x45\x3D\x2F\x65\x74\x63\x2F\x6D\x69\x6D\x65\x2E\x74\x79\x70\x65\x73\xA\x4C\x4F\x43\x41\x4C\x3D\x31\xA"
+"\xA\x4C\x4F\x47\x20\x2D\x3E\x20\x74\x68\x65\x20\x6C\x6F\x67\x20\x66\x69\x6C\x65\xA\x50\x4F\x52\x54\x20"
+"\x2D\x3E\x20\x74\x68\x65\x20\x6C\x69\x73\x74\x65\x6E\x20\x70\x6F\x72\x74\x20\x74\x68\x61\x74\x20\x77\x69"
+"\x6C\x6C\x20\x62\x65\x20\x75\x73\x65\x64\x20\x66\x6F\x72\x20\x74\x63\x70\x20\x63\x6F\x6E\x6E\x65\x63\x74"
+"\x69\x6F\x6E\x73\xA\xA\x55\x53\x45\x53\x53\x4C\x20\x2D\x3E\x20\x74\x68\x65\x20\x73\x73\x6C\x20\x66\x6C"
+"\x61\x67\x20\x69\x66\x20\x79\x6F\x75\x20\x77\x61\x6E\x74\x20\x74\x6F\x20\x75\x73\x65\x20\x6F\x70\x65\x6E"
+"\x73\x73\x6C\x20\x66\x6F\x72\x20\x73\x65\x63\x75\x72\x65\x20\x73\x65\x72\x76\x65\x72\x20\x28\x68\x74\x74"
+"\x70\x73\x29\xA\x43\x45\x52\x54\x46\x49\x4C\x45\x20\x2D\x3E\x20\x74\x68\x65\x20\x66\x69\x6C\x65\x20\x74"
+"\x68\x61\x74\x20\x63\x6F\x6E\x74\x61\x69\x6E\x73\x20\x63\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x20\x66"
+"\x6F\x72\x20\x73\x73\x6C\x20\x63\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x73\xA\x4D\x49\x4D\x45\x46\x49\x4C"
+"\x45\x20\x2D\x3E\x20\x74\x68\x65\x20\x66\x69\x6C\x65\x20\x74\x68\x61\x74\x20\x63\x6F\x6E\x74\x61\x69\x6E"
+"\x73\x20\x6D\x69\x6D\x65\x2E\x74\x79\x70\x65\x73\x20\x73\x69\x6D\x69\x6C\x65\x72\x20\x74\x6F\x20\x61\x70"
+"\x61\x63\x68\x65\x20\x6D\x69\x6D\x65\x66\x69\x6C\x65\xA\x4C\x4F\x43\x41\x4C\x20\x2D\x3E\x20\x6F\x6E\x6C"
+"\x79\x20\x61\x63\x63\x65\x70\x74\x20\x63\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x73\x20\x66\x72\x6F\x6D\x20"
+"\x31\x32\x37\x2E\x30\x2E\x30\x2E\x31\xA\xA\x3C\x2F\x50\x52\x45\x3E\xA\x3C\x2F\x55\x4C\x3E\xA\xA\x3C"
+"\x2F\x66\x6F\x6E\x74\x3E\xA\xA\xA\xA";
+
+#endif

+ 421 - 0
contrib/help/help.c

@@ -0,0 +1,421 @@
+#include "web_server.h"
+
+#include <string.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include "info.h"
+#include "functions.h"
+#include "examples.h"
+#include "security.h"
+
+struct web_server server;
+
+
+#ifdef WIN32
+#include <windows.h>
+#endif
+
+
+int PORT=81;
+
+
+void teste1() {
+	printf("Content-type: text/html\r\n\r\n");
+	printf("here's location:<BR>\n");
+	printf("%s\r\n",ClientInfo->Header("Location"));
+	printf("NOTHING=%s\n<BR>",ClientInfo->Conf("[PERSONAL_CONF]","NOTHING"));
+	printf("IP=%s\n<BR>",ClientInfo->Conf("[PERSONAL_CONF]","IP"));
+	printf("MOST=%s\n<BR>",ClientInfo->Conf("[PERSONAL_CONF]","MOST"));
+	printf("IP=%s\n<BR>",ClientInfo->Conf("[LIBWEBSERVER]","IP"));
+	printf("Connection: %s\n",ClientInfo->Header("Connection"));
+};
+
+void varteste() {
+	web_client_setvar("bg",ClientInfo->Conf("PAGE_1","background"));
+	web_client_setvar("pata","#00FF00");
+	printf("Content-type: text/html\r\n\r\n");
+	printf("<HR>\n");
+	printf("$;pata;=\"$pata;\"");
+	printf("<B>&lt;$pata;BODY bgcolor=\"$pata;\"&gt;</B> $ (prototipe 0.5.1)<BR>\n");
+	printf("Luis Figueiredo$pata;coninhas\r\n");
+	
+};
+	
+void teste() {
+	int i=0;
+	
+	web_client_setcookie("caos","teste da noia",NULL,NULL,NULL,0);
+		
+	printf("content-type: text/html\r\n\r\n");
+	printf("hal is \"%s\" hallo is \"%s\"<BR>\n",ClientInfo->Post("hal"),ClientInfo->Post("hallo"));
+	printf("hal is \"%s\" hallo is \"%s\"<BR>\n",ClientInfo->Post("hal"),ClientInfo->Post("hallo"));
+	printf("<form method=post>\n");
+	printf("<input type=text name=hal value='%s'>\n",ClientInfo->Cookie("stdio"));
+	web_client_setcookie("teste",ClientInfo->Post("hallo"),"+1m",NULL,NULL,0);
+	printf("<input type=text name=hallo value='%s'>\n",ClientInfo->Cookie("teste"));
+	printf("<input type=submit name=send value='POST'>\n");
+	printf("</form>\n");
+	
+	printf("<form method=query>\n");
+	for (i=0;i<5;i++) {
+		printf("<input type=checkbox name=teste value='%d'>%d<BR>\n",i,i);
+	};
+	printf("<input type=submit name=send1 value='SEND'>\n");
+	printf("</form>\n");
+	printf("You choose: ");
+	printf("%d numbers: \n",ClientInfo->Query("#teste"));
+	for(i=0;i<(int)ClientInfo->Query("#teste");i++){
+		printf("%s,",ClientInfo->Query("teste"));
+	};
+	web_client_setcookie("quatro","ratata","+1m","/","127.0.0.1",0);
+	printf("...<BR>");
+	printf("<form method=post>\n");
+	for (i=0;i<5;i++) {
+		printf("<input type=checkbox name=teste value='%d'>post %d<BR>\n",i,i);
+	};
+	printf("<input type=submit name=send1 value='SEND'>\n");
+	printf("</form>\n");
+	printf("You choose: ");
+	web_client_setcookie("tres","ratata","+1m",NULL,NULL,0);
+	printf("%d numbers: ",ClientInfo->Post("#teste"));
+	for (i=0;i<(int)ClientInfo->Post("#teste");i++) {
+		printf("%s,",ClientInfo->Post("teste"));
+	};
+	printf("...<BR>");
+	web_client_deletecookie("cinco");
+	printf("<form method=query>\n");
+	printf("<input type=submit name=test value='pipi'><BR>\n");
+	printf("</form>\n");
+	printf("The value of test is '%s'<BR>\n",ClientInfo->Query("test"));
+	printf("The value of test is '%s'<BR>\n",ClientInfo->Query("test"));
+	printf("The value of test is '%s'<BR>\n",ClientInfo->Query("test"));
+	printf("ClientInfo->Cookie(\"teste\")='%s'<BR>\n",ClientInfo->Cookie("teste"));
+	printf("ClientInfo->Cookie(\"stdio\")='%s'<BR>\n",ClientInfo->Cookie("stdio"));
+	printf("ClientInfo->Cookie(\"merdinha\")='%s'<BR>\n",ClientInfo->Cookie("merdinha"));
+	printf("ClientInfo->Cookie(\"activo\")='%s'<BR>\n",ClientInfo->Cookie("activo"));
+	printf("ClientInfo->Cookie(\"caos\")='%s'<BR>\n",ClientInfo->Cookie("caos"));
+	printf("ClientInfo->Cookie(\"caos\")='%s'<BR>\n",ClientInfo->Cookie("caos"));
+	printf("Method is %s\n<BR>",ClientInfo->method);
+	printf("Inetaddr=%s\n<BR>",ClientInfo->inetname);
+	
+	for(i=0;i<10;i++) {
+		printf("<BR>ClientInfo->Post(\"teste\")='%s'\n",ClientInfo->Post("teste"));
+	};
+	printf("<BR>ClientInfo->Cookie(NULL)=\"%s\"<BR>",ClientInfo->Cookie(NULL));
+	printf("<BR>ClientInfo->Post(NULL)=\"%s\"<BR>",ClientInfo->Post(NULL));
+	printf("<BR>ClientInfo->Query(NULL)=\"%s\"<BR>",ClientInfo->Query(NULL));
+	printf("<BR>ClientInfo->Query(\"teste 0\")=\"%s\"<BR>",ClientInfo->Query("teste 0"));
+	printf("<PRE>ClientInfo->Header(NULL)=\"%s\"</PRE>\r\n",ClientInfo->Header(NULL));
+	
+};
+
+
+void links() {
+	printf("[<a href='/'>main</a>] [<a href='/?help=info'>info</a>] [<a href='/?help=functions'>functions</a>] [<a href='/?help=examples'>examples</a>] [<a href='/?help=security'>security</a>] [<a href='/?help=Authors'>authors</a>] ");
+};
+
+void startpage(char *topic) {
+	printf("Content-type: text/html\r\n\r\n");
+	printf("<HTML>\n<body bgcolor='EFEFFF'>\n<CENTER>\n<TABLE><TR><TD align=center>\n<a href='http://libwebserver.sourceforge.net'><img border=0 src='/libwebserver.gif'></a>\n</TD><TR><TR><TD align=center>\n<font face='Verdana'><B>HELP<BR>(%s)</B></font>\n</TD></TR></TABLE>\n</CENTER>\n",topic);
+	links();	
+	printf("<HR><BR>\n");
+};
+void endpage() {
+	printf("<HR>");
+	links();	
+	printf("<p align=right> <small> by Luis Figueiredo (<a href='mailto:[email protected]'>[email protected]</a>) (%s)</BODY></HTML>\n",_libwebserver_version);
+};
+
+
+
+
+
+
+
+
+
+//Johannes E. Schindelin // new on 0.4.0
+void hello_world() {
+	startpage("hello world example");
+	printf("Hello, World!\r\n");
+	endpage();
+}
+//
+
+
+// NEW on 0.4.1
+void checkbox() {
+	int i=0;
+	char *txt[]={"one","two","three","four","five"};
+	startpage("checkbox example");
+	printf("<form method=query>\n");
+	for(i=0;i<5;i++) {
+		printf("<input type=checkbox name=number value='%s'\n> %s<BR>",txt[i],txt[i]);
+	};
+	printf("<input type=submit name=send value=' SEND '>\n");
+	printf("</form>\n");
+	printf("You have choosen <font color='FF0000'>%d</font> numbers: \n",ClientInfo->Query("#number"));
+	for(i=0;i<(int)ClientInfo->Query("#number");i++) {
+		printf("<b>%s</b>,\n",ClientInfo->Query("number"));
+	};
+	printf("...<BR>");
+	endpage();
+};
+
+	
+
+// NEW on 0.4.0
+void cookie() {
+	if(strlen(ClientInfo->Post("user"))) 
+		web_client_setcookie("username",ClientInfo->Post("user"),"+15M",NULL,NULL,0);
+	startpage("Cookie example");
+	printf("<form method='POST'>\n");
+	printf("<input type=text name='user' value='%s'>\r\n<BR>",ClientInfo->Cookie("username"));
+	printf("<input type=submit name='send' value=' GO! '><BR>\r\n");
+	printf("</form>\n");
+	endpage();
+};
+//
+
+void logfile() {
+	startpage("logfile");
+	printf("<PRE>\n");
+	web_client_addfile(server.logfile);
+	printf("</PRE>\n");
+	endpage();
+};
+
+struct image {
+	char *data;
+	size_t size;
+} image={NULL,0};
+
+
+void imageout() {
+	if(strlen(ClientInfo->Query("img"))) {
+		if(image.data!=NULL) {
+			printf("Content-type: image/jpeg\r\n\r\n");
+			fwrite(image.data,image.size,1,stdout);
+		};
+		return;
+	};
+
+	startpage("Image example");
+	printf("<form action='/image' method='POST' enctype='multipart/form-data'>\n");
+	printf("<input type=file name=image><BR>\n");
+	printf("<input type=submit name='GOO' value='See'>\n");
+	printf("</form>\n");
+	if(strlen(ClientInfo->MultiPart("image").data)) {
+		printf("%s<BR><img src='/image?img=%s.jpg'>\n",ClientInfo->MultiPart("image").filename,ClientInfo->MultiPart("image").filename);
+		free(image.data);
+		image.data=malloc(ClientInfo->MultiPart("image").size+1);
+		memcpy(image.data,ClientInfo->MultiPart("image").data,ClientInfo->MultiPart("image").size);
+		image.size=ClientInfo->MultiPart("image").size;
+	}else {
+		free(image.data);
+		image.data=NULL;
+	};
+	endpage();
+};
+
+#define GIFSIDE 320
+char gifdata[GIFSIDE*GIFSIDE];
+void outgif() {
+	float i;
+	int x,y,xc,yc;
+	char color;
+	web_client_gifsetpalette("EGA");
+	if(*ClientInfo->Query("img")!=0) {
+		printf("Content-type: image/gif\r\n\r\n");
+		if(!strcmp(ClientInfo->Query("img"),"circle")) {
+			xc=atoi(ClientInfo->Query("x"))%GIFSIDE;
+			yc=atoi(ClientInfo->Query("y"))%GIFSIDE;
+			color=(char)(rand()%15)+1;
+			for(i=0;i<6.28;i+=(float)0.01) {
+				x=(int)((GIFSIDE+xc+cos(i)*10))%GIFSIDE; // Johannes E. Schindelin bugfix
+				y=(int)((GIFSIDE+yc+sin(i)*10))%GIFSIDE; // Johannes E. Schindelin bugfix
+				gifdata[x+(y*GIFSIDE)]=color;
+			};
+		};
+		web_client_gifoutput(gifdata,GIFSIDE,GIFSIDE,0);
+	};
+	startpage("Gif example");
+	printf("<center>Generated a circle (click inside the image)<BR>\n");
+	printf("Pressed x=%s,y=%s<BR>\n",ClientInfo->Query("x"),ClientInfo->Query("y"));
+	printf("<form><input type=image border=0 src='/gif?img=circle&x=%s&y=%s'></form></CENTER>\n",ClientInfo->Query("x"),ClientInfo->Query("y"));
+	endpage();
+};
+
+
+void urlauthenticate() {
+	if(!strlen(ClientInfo->user) || !strlen(ClientInfo->pass) &&
+		strcmp(ClientInfo->user,"username") || strcmp(ClientInfo->pass,"password")) { // you can read things from a auth file
+		web_client_HTTPdirective("HTTP/1.1 401 Authorization Required\r\n"
+			"WWW-Authenticate: Basic realm=\"This site info\"");
+		startpage("Authenticate example");
+		printf("<CENTER><font color='FF0000'>Access denied</font></CENTER>\n");
+		endpage();
+		return;
+	}
+	startpage("Authenticate example");
+	printf("You entered in your area\n");
+	endpage();
+};
+
+
+void help() {
+	// info
+	// engine  // removed (read the source)
+	// functions help
+	// functionall examples
+	// security
+	// regards
+	// authors
+	if(!strlen(ClientInfo->Query("help"))) {	
+		startpage("Table of contents");
+		printf("<B>\n");
+		printf("<ol>\n");
+		printf("<li><a href='/?help=info'>libwebserver info</a></li>\n");
+		printf("<ul><li><a href='/?help=info#what'>What's libwebserver for?</a></li></ul>\n");
+		printf("<ul><li><a href='/?help=info#who'>Who's supposed to use libwebserver?</a></li></ul>\n"); // Johannes E. Schindelin spellcheck
+		printf("<ul><li><a href='/?help=info#when'>When am i supposed to use libwebserver?</a></li></ul>\n"); // Johannes E. Schindelin spellcheck
+		printf("<ul><li><a href='/?help=info#server_scripts'>Is there support for server scripts such as .php .cgi .asp?</a></li></ul>\n"); // Johannes E. Schindelin spellcheck
+		printf("<li><a href='/?help=functions'>libwebserver functions</a></li>\n");	
+		printf("<ul><li><a href='/?help=functions#web_server_init'>web_server_init()</a></li></ul>\n");	
+		printf("<ul><li><a href='/?help=functions#web_server_addhandler'>web_server_addhandler()</a></li></ul>\n");	
+		printf("<ul><li><a href='/?help=functions#web_server_aliasdir'>web_server_aliasdir()</a><small>(new)</small></li></ul>\n");	
+		printf("<ul><li><a href='/?help=functions#web_server_run'>web_server_run()</a></li></ul>\n");	
+		printf("<ul><li><a href='/?help=functions#web_server_getconf'>web_server_getconf()</a></li></ul>\n");	
+		printf("<ul><li><a href='/?help=functions#web_server_useSSLcert'>web_server_useSSLcert()</a></li></ul>\n");	
+		printf("<ul><li><a href='/?help=functions#web_server_useMIMEfile'>web_server_useMIMEfile()</a><small>(new)</small></li></ul>\n");	
+		printf("<ul><li><a href='/?help=functions#web_client_addstream'>web_client_addstream() </a><small><small>(obsolet, no longer in use in 0.3.4) use web_client_addfile instead</small></small></li></ul>\n");	
+		printf("<ul><li><a href='/?help=functions#web_client_addfile'>web_client_addfile()</a></li></ul>\n");	
+		printf("<ul><li><a href='/?help=functions#web_client_gifoutput'>web_client_gifoutput()</a><small>(changed)</small></li></ul>\n");	
+		printf("<ul><li><a href='/?help=functions#web_client_gifsetpalette'>web_client_gifsetpalette()</a><small>(new)</small></li></ul>\n");	
+		printf("<ul><li><a href='/?help=functions#web_client_setcookie'>web_client_setcookie()</a></li></ul>\n");	
+		printf("<ul><li><a href='/?help=functions#web_client_deletecookie'>web_client_deletecookie()</a></li></ul>\n");	
+		printf("<ul><li><a href='/?help=functions#web_client_setvar'>web_client_setvar()</a></li></ul>\n");	
+		printf("<ul><li><a href='/?help=functions#web_client_getvar'>web_client_getvar()</a></li></ul>\n");	
+		printf("<ul><li><a href='/?help=functions#web_client_delvar'>web_client_delvar()</a></li></ul>\n");	
+		printf("<ul><li><a href='/?help=functions#web_client_HTTPdirective'>web_client_HTTPdirective()</a></li></ul>\n");	
+		printf("<ul><li><a href='/?help=functions#web_client_contenttype'>web_client_contenttype()</a><small>(new)</small></li></ul>\n");	
+		printf("<ul><li><a href='/?help=functions#web_log'>web_log()</a></li></ul>\n");	
+		printf("<ul><li><a href='/?help=functions#ClientInfo'>ClientInfo</a></li></ul>\n");	
+		printf("<ul><li><a href='/?help=functions#configfile'>The config file</a></li></ul>\n");	
+		printf("<li><a href='/?help=examples'>libwebserver examples</a></li>\n");
+		printf("<ul><li><a href='/?help=examples#helloworld'>Hello, World!</a></li></ul>\n");
+		printf("<ul><li><a href='/?help=examples#logfile'>Show's log file</a></li></ul>\n");
+		printf("<ul><li><a href='/?help=examples#imageup'>Image Uploader</a></li></ul>\n");
+		printf("<ul><li><a href='/?help=examples#auth'>Authentication</a></li></ul>\n");
+		printf("<ul><li><a href='/?help=examples#ssl'>Openssl for (https)</a></li></ul>\n");
+		printf("<ul><li><a href='/?help=examples#outgif'>Gif generator</a><small>Changed</small></li></ul>\n");
+		printf("<ul><li><a href='/?help=examples#cookie'>Cookies</a></li></ul>\n");
+		printf("<ul><li><a href='/?help=examples#checkbox'>checkbox</a></li></ul>\n");
+		printf("<ul><li><a href='/?help=examples#confexample'>Config example</a></li></ul>\n");
+		printf("<ul><li><a href='/brokenlink'>Broken link</a></li></ul>\n");
+		printf("<ul><li><a href='/fs/'>aliasdir</a></li></ul>\n");
+		printf("<li><a href='/?help=security'>libwebserver security</a></li>\n");
+		printf("<ul><li><a href='/?help=security#safe'>It is safe to use?</a></li></ul>\n"); // Johannes E. Schindelin spellcheck
+		printf("<ul><li><a href='/?help=security#certificate'>How do I create my own certificate?</a></li></ul>\n"); // Johannes E. Schindelin made
+		printf("<ul><li><a href='/?help=security#racecondition'>Avoid race condition problems</a></li></ul>\n"); // Johannes E. Schindelin made
+		
+		printf("<li><a href='/?help=Authors'>Authors</a></li>\n");
+		printf("</ol>\n");
+		printf("</B>\n");
+		endpage();	
+		return;	
+	};
+
+	startpage(ClientInfo->Query("help"));
+	if(!strcmp(ClientInfo->Query("help"),"info")) {
+		fwrite(info,sizeof(info),1,stdout);
+		//web_client_addfile("help.html/info.html");
+	};
+	if(!strcmp(ClientInfo->Query("help"),"security")) {
+		fwrite(security,sizeof(security),1,stdout);
+		//web_client_addfile("help.html/security.html");
+	};
+	if(!strcmp(ClientInfo->Query("help"),"functions")) {
+		fwrite(functions,sizeof(functions),1,stdout);
+		//web_client_addfile("help.html/functions.html");
+	};
+	if(!strcmp(ClientInfo->Query("help"),"examples")) {
+		fwrite(examples,sizeof(examples),1,stdout);
+		//web_client_addfile("help.html/examples.html");
+	};
+	if(!strcmp(ClientInfo->Query("help"),"Authors")) {
+		printf("Luis Figueiredo (<a href='mailto:[email protected]'>[email protected]</a>) - Main programmer, designer<BR><BR>\n");
+		printf("People who contributed:<BR>\n");
+		printf("<UL>João Luis Marques (<a href='mailto:[email protected]'>[email protected]</a>)<BR>\n");
+		printf("<UL>minor bug reported (redirectors, stdout)</UL></UL>\n");
+		printf("<UL>'oddsock' (<a href='mailto:[email protected]'>[email protected]</a>)<BR>\n");
+		printf("<UL>Licensing tip, and minor bug reported (segv in querystring)</UL></UL>\n");
+		printf("<UL>Rocco Carbone (<a href='mailto:[email protected]'>[email protected]</a>)<BR>\n");
+		printf("<UL>Return code for web_server_run tip</UL></UL>\n");
+		printf("<UL>Johannes E. Schindelin (<a href='mailto:[email protected]'>[email protected]</a>)<BR>\n");
+		printf("<UL>Spell checking, Makefile portability, and security 'How do I create my own certificate?'<BR>\n");
+		printf("bugfixes, example 'hello world!'</UL></UL>\n");
+		printf("<UL>Richard Offer (<a href='mailto:[email protected]'>[email protected]</a>)<BR>\n");
+		printf("<UL>checkboxes, (multiple variables) tip</UL></UL>\n");
+		printf("<UL>Sven Anders (<a href='mailto:[email protected]'>[email protected]</a>)<BR>\n");
+		printf("<UL>Created a new web_client_setcookie()(i made some changes)</UL></UL>\n");
+		printf("<UL>Hilobok Andrew (<a href='mailto:[email protected]'>[email protected]</a>)<BR>\n");
+		printf("<UL>FreeBSD portability</UL></UL>\n");
+	};
+	endpage();	
+};
+
+
+
+void confexample() {
+	startpage("confexample");
+	printf("<PRE>\n");
+	web_client_addfile(server.conffile);
+	printf("</PRE>\n");
+	printf("ClientInfo->Conf(\"PERSONAL_CONF\",\"PORT\")->%s<BR>\n",ClientInfo->Conf("PERSONAL_CONF","PORT"));
+	printf("ClientInfo->Conf(\"PERSONAL_CONF\",\"IP\")->%s<BR>\n",ClientInfo->Conf("PERSONAL_CONF","IP"));
+	printf("ClientInfo->Conf(\"LIBWEBSERVER\",\"PORT\")->%s<BR>\n",ClientInfo->Conf("LIBWEBSERVER","PORT"));
+	endpage();
+
+};
+
+
+
+
+
+int main() {
+	
+#ifdef DEBUG	
+	//FILE *err=freopen("debug.log","w",stderr);
+#endif // DEBUG
+	
+	memset(gifdata,0,GIFSIDE*GIFSIDE);
+	while(!web_server_init(&server,PORT,"help.cfg",WS_USEEXTCONF|WS_USELEN))PORT++;
+	web_server_useMIMEfile(&server,"mime.types");
+
+	//web_server_addhandler(&server,"* /",skip,0);
+	web_server_addhandler(&server,"* /",help,0);
+	web_server_addhandler(&server,"* /teste",teste,WS_LOCAL);
+	web_server_addhandler(&server,"* /varteste",varteste,WS_DYNVAR|WS_USELEN);
+	web_server_addhandler(&server,"* /teste1",teste1,WS_LOCAL);
+	web_server_addhandler(&server,"* /hello",hello_world,0);
+	web_server_addhandler(&server,"* /log",logfile,WS_USELEN); // turn off global flag
+	web_server_addhandler(&server,"* /image",imageout,0);
+	web_server_addhandler(&server,"* /gif",outgif,0);
+	web_server_addhandler(&server,"* /auth",urlauthenticate,0);
+	web_server_addhandler(&server,"* /cookie",cookie,0);
+	web_server_addhandler(&server,"* /checkbox",checkbox,0);
+	web_server_addhandler(&server,"* /confexample",confexample,0);
+	
+	web_server_aliasdir(&server,"fs","/",0); 
+	_tmpnameprefix="lws";
+	printf("http://localhost:%d\n",server.port);
+	//putenv("TEMP=c:\\temp");
+	for(;;) {
+		web_server_run(&server);
+	};
+
+
+};

+ 13 - 0
contrib/help/help.cfg

@@ -0,0 +1,13 @@
+[LIBWEBSERVER]
+LOG=help.log
+PORT=81
+USESSL=0
+LOCAL=0
+DYNVAR=0
+
+
+[PERSONAL_CONF]
+PORT=Portability
+MOST=general key guard
+IP=127.0.0.1
+

+ 87 - 0
contrib/help/info.h

@@ -0,0 +1,87 @@
+/*
+ * by data2header by Luis Figueiredo ([email protected])
+ */
+#ifndef _INFO_H_
+#define _INFO_H_
+
+char info[]="\x3C\x63\x65\x6E\x74\x65\x72\x3E\x3C\x48\x33\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27"
+"\x30\x30\x37\x37\x30\x30\x27\x3E\x6C\x69\x62\x77\x65\x62\x73\x65\x72\x76\x65\x72\x20\x49\x6E\x66\x6F\x3C"
+"\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x48\x33\x3E\x3C\x2F\x63\x65\x6E\x74\x65\x72\x3E\x3C\x42\x52\x3E\x3C\x42"
+"\x52\x3E\xA\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x77\x68\x61\x74\x3E\x3C\x42\x3E\x3C\x66\x6F\x6E\x74\x20\x63"
+"\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37\x37\x27\x3E\x57\x68\x61\x74\x27\x73\x20\x6C\x69\x62\x77\x65"
+"\x62\x73\x65\x72\x76\x65\x72\x20\x66\x6F\x72\x3F\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\x3C\x42\x52"
+"\x3E\xA\x3C\x55\x4C\x3E\x54\x68\x69\x73\x20\x6C\x69\x62\x20\x69\x73\x20\x69\x6E\x74\x65\x6E\x64\x65\x64"
+"\x20\x74\x6F\x20\x61\x64\x64\x20\x77\x65\x62\x73\x65\x72\x76\x65\x72\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E"
+"\x61\x6C\x69\x74\x79\x20\x74\x6F\x20\x70\x72\x6F\x67\x72\x61\x6D\x73\x20\x69\x6E\x73\x74\x65\x61\x64\x20"
+"\x6F\x66\x20\x75\x73\x69\x6E\x67\x20\x61\x6E\x20\x65\x78\x74\x65\x72\x6E\x61\x6C\x20\x77\x65\x62\x73\x65"
+"\x72\x76\x65\x72\x2E\x3C\x42\x52\x3E\xA\x9\x54\x77\x6F\x20\x65\x78\x61\x6D\x70\x6C\x65\x73\x20\x66\x6F"
+"\x72\x20\x65\x6D\x62\x65\x64\x64\x65\x64\x20\x77\x65\x62\x73\x65\x72\x76\x65\x72\x73\x20\x74\x68\x61\x74"
+"\x20\x69\x20\x6B\x6E\x6F\x77\x20\x6F\x66\x20\x61\x72\x65\x20\x73\x69\x6D\x70\x6C\x65\x20\x28\x73\x68\x6F"
+"\x75\x74\x63\x61\x73\x74\x20\x28\x69\x20\x67\x75\x65\x73\x73\x29\x2C\x20\x61\x6E\x64\x20\x77\x65\x62\x54"
+"\x56\x20\x28\x74\x65\x6C\x65\x74\x65\x78\x74\x20\x61\x73\x20\x61\x20\x77\x65\x62\x70\x61\x67\x65\x20\x28"
+"\x66\x72\x6F\x6D\x20\x70\x69\x6E\x6E\x61\x63\x6C\x65\x29\x29\x3B\x20\x61\x6E\x64\x20\x6D\x61\x6E\x79\x20"
+"\x6F\x74\x68\x65\x72\x73\x20\x70\x72\x6F\x62\x61\x62\x6C\x79\x20\x64\x6F\x20\x74\x68\x65\x20\x73\x61\x6D"
+"\x65\x2E\xA\x3C\x2F\x55\x4C\x3E\xA\x3C\x48\x52\x3E\xA\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x77\x68\x6F\x3E"
+"\x3C\x42\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37\x37\x27\x3E\x57\x68"
+"\x6F\x27\x73\x20\x73\x75\x70\x70\x6F\x73\x65\x64\x20\x74\x6F\x20\x75\x73\x65\x20\x6C\x69\x62\x77\x65\x62"
+"\x73\x65\x72\x76\x65\x72\x3F\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x54\x68\x69"
+"\x73\x20\x69\x73\x20\x6D\x61\x69\x6E\x6C\x79\x20\x64\x65\x76\x65\x6C\x6F\x70\x65\x64\x20\x66\x6F\x72\x20"
+"\x64\x65\x76\x65\x6C\x6F\x70\x65\x72\x73\x20\x74\x6F\x20\x6D\x61\x6B\x65\x20\x69\x74\x20\x65\x61\x73\x69"
+"\x65\x72\x20\x74\x6F\x20\x77\x72\x69\x74\x65\x20\x61\x20\x77\x65\x62\x20\x69\x6E\x74\x65\x72\x66\x61\x63"
+"\x65\x20\x74\x6F\x20\x74\x68\x65\x69\x72\x20\x73\x6F\x66\x74\x77\x61\x72\x65\x2C\x20\x28\x6E\x6F\x74\x65"
+"\x20\x61\x20\x77\x65\x62\x62\x72\x6F\x77\x73\x65\x72\x20\x69\x73\x20\x63\x6F\x6D\x6D\x6F\x6E\x6C\x79\x20"
+"\x61\x76\x61\x69\x6C\x61\x62\x6C\x65\x20\x69\x6E\x20\x6D\x6F\x73\x74\x20\x6F\x70\x65\x72\x61\x74\x69\x6E"
+"\x67\xA\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x73\x79\x73\x74\x65\x6D\x73\x29\x20\x73\x6F"
+"\x20\x69\x74\x20\x69\x73\x20\x6C\x69\x6B\x65\x20\x61\x20\x70\x6F\x72\x74\x61\x62\x6C\x65\x20\x22\x74\x65"
+"\x72\x6D\x69\x6E\x61\x6C\x22\x20\x74\x68\x61\x74\x20\x63\x61\x6E\x20\x62\x65\x20\x61\x63\x63\x65\x73\x73"
+"\x65\x64\x20\x66\x72\x6F\x6D\x20\x61\x6E\x79\x20\x63\x6F\x6D\x70\x75\x74\x65\x72\x20\x28\x77\x69\x74\x68"
+"\x20\x61\x20\x62\x72\x6F\x77\x73\x65\x72\x20\x6F\x66\x20\x63\x6F\x75\x72\x73\x65\x2E\x2E\x2E\x29\x2E\x3C"
+"\x2F\x55\x4C\x3E\xA\x3C\x48\x52\x3E\xA\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x77\x68\x65\x6E\x3E\x3C\x42\x3E"
+"\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37\x37\x27\x3E\x57\x68\x65\x6E\x20"
+"\x61\x6D\x20\x69\x20\x73\x75\x70\x70\x6F\x73\x65\x64\x20\x74\x6F\x20\x75\x73\x65\x20\x6C\x69\x62\x77\x65"
+"\x62\x73\x65\x72\x76\x65\x72\x3F\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x46\x6F"
+"\x72\x20\x65\x78\x61\x6D\x70\x6C\x65\x2C\x20\x69\x6D\x61\x67\x69\x6E\x65\x20\x74\x68\x61\x74\x20\x79\x6F"
+"\x75\x20\x61\x72\x65\x20\x64\x65\x76\x65\x6C\x6F\x70\x69\x6E\x67\x20\x61\x20\x64\x61\x65\x6D\x6F\x6E\x20"
+"\x61\x6E\x64\x20\x77\x61\x6E\x74\x20\x74\x6F\x20\x63\x68\x65\x63\x6B\x20\x73\x74\x61\x74\x73\x20\x6F\x72"
+"\x20\x72\x65\x2D\x63\x6F\x6E\x66\x69\x67\x75\x72\x65\x20\x61\x74\x20\x72\x75\x6E\x2D\x74\x69\x6D\x65\x3B"
+"\xA\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x77\x69\x74\x68\x20\x74\x68"
+"\x69\x73\x20\x6C\x69\x62\x72\x61\x72\x79\x20\x79\x6F\x75\x20\x63\x61\x6E\x20\x61\x64\x64\x20\x61\x20\x6C"
+"\x69\x73\x74\x65\x6E\x20\x70\x6F\x72\x74\x20\x66\x6F\x72\x20\x72\x75\x6E\x74\x69\x6D\x65\x2C\x20\x61\x6E"
+"\x64\x20\x63\x6F\x6E\x6E\x65\x63\x74\x20\x77\x69\x74\x68\x20\x77\x68\x61\x74\x65\x76\x65\x72\x20\x62\x72"
+"\x6F\x77\x73\x65\x72\x20\x28\x76\x69\x61\x20\x48\x54\x4D\x4C\x20\x69\x6E\x74\x65\x72\x66\x61\x63\x65\x29"
+"\xA\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x77\x69\x74\x68\x6F\x75\x74"
+"\x20\x64\x65\x70\x65\x6E\x64\x65\x6E\x63\x69\x65\x73\x20\x6F\x66\x20\x61\x6E\x20\x65\x78\x74\x65\x72\x6E"
+"\x61\x6C\x20\x77\x65\x62\x73\x65\x72\x76\x65\x72\x2E\x3C\x42\x52\x3E\xA\x20\x20\x20\x20\x20\x20\x20\x20"
+"\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x59\x6F\x75\x20\x63\x61\x6E\x20\x65\x76\x65\x6E\x20\x64\x6F\x20"
+"\x61\x20\x77\x65\x62\x73\x65\x72\x76\x65\x72\x20\x28\x6F\x66\x20\x63\x6F\x75\x72\x73\x65\x29\x2C\x20\x6A"
+"\x75\x73\x74\x20\x75\x73\x65\x20\x79\x6F\x75\x72\x20\x69\x6D\x61\x67\x69\x6E\x61\x74\x69\x6F\x6E\x2E\x3C"
+"\x42\x52\x3E\xA\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x41\x6E\x6F\x74"
+"\x68\x65\x72\x20\x71\x75\x69\x74\x65\x20\x73\x69\x6D\x70\x6C\x65\x20\x65\x78\x61\x6D\x70\x6C\x65\x2C\x20"
+"\x61\x20\x73\x6F\x75\x6E\x64\x20\x72\x65\x63\x6F\x72\x64\x65\x72\x20\x28\x75\x73\x69\x6E\x67\x20\x6F\x6E"
+"\x6C\x79\x20\x6C\x6F\x63\x61\x6C\x20\x63\x6F\x6E\x6E\x65\x63\x74\x69\x6F\x6E\x73\x20\x66\x6F\x72\x20\x73"
+"\x65\x63\x75\x72\x69\x74\x79\x20\x72\x65\x61\x73\x6F\x6E\x73\x29\x20\x75\x73\x65\x73\x20\x61\x20\x77\x65"
+"\x62\x20\x69\x6E\x74\x65\x72\x66\x61\x63\x65\x20\x74\x6F\x20\x63\x6F\x6E\x74\x72\x6F\x6C\xA\x20\x20\x20"
+"\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2F\x64\x65\x76\x2F\x64\x73\x70\x20\x72\x65"
+"\x61\x64\x69\x6E\x67\x2F\x77\x72\x69\x74\x69\x6E\x67\x20\x28\x76\x69\x61\x20\x48\x54\x4D\x4C\x20\x69\x6E"
+"\x74\x65\x72\x66\x61\x63\x65\x29\x2E\xA\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20"
+"\x20\x20\x74\x68\x65\x72\x65\x20\x61\x72\x65\x20\x6D\x61\x6E\x79\x20\x6F\x74\x68\x65\x72\x20\x74\x68\x69"
+"\x6E\x67\x73\x20\x79\x6F\x75\x20\x63\x61\x6E\x20\x64\x6F\x20\x2E\x2E\x2E\x3C\x2F\x55\x4C\x3E\xA\xA\x3C"
+"\x48\x52\x3E\xA\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x73\x65\x72\x76\x65\x72\x5F\x73\x63\x72\x69\x70\x74\x73"
+"\x3E\x3C\x42\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37\x37\x27\x3E\x49"
+"\x73\x20\x74\x68\x65\x72\x65\x20\x73\x75\x70\x70\x6F\x72\x74\x20\x66\x6F\x72\x20\x73\x65\x72\x76\x65\x72"
+"\x20\x73\x63\x72\x69\x70\x74\x73\x20\x73\x75\x63\x68\x20\x61\x73\x20\x2E\x70\x68\x70\x20\x2E\x63\x67\x69"
+"\x20\x2E\x61\x73\x70\x3F\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\xA\x3C\x55\x4C\x3E\x20\x57\x65\x6C"
+"\x6C\x2C\x20\x74\x68\x69\x73\x20\x6C\x69\x62\x72\x61\x72\x79\x20\x6F\x6E\x6C\x79\x20\x70\x72\x6F\x76\x69"
+"\x64\x65\x73\x20\x77\x65\x62\x20\x73\x65\x72\x76\x65\x72\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\x73\x20\x74"
+"\x68\x61\x74\x20\x6D\x61\x6B\x65\x20\x61\x20\x73\x65\x72\x76\x65\x72\x20\x72\x75\x6E\x6E\x69\x6E\x67\x2C"
+"\x20\x73\x65\x72\x76\x65\x72\x20\x73\x63\x72\x69\x70\x74\x73\x20\x63\x61\x6E\x20\x62\x65\x20\x73\x75\x70"
+"\x70\x6F\x72\x74\x65\x64\x20\x69\x66\x20\x79\x6F\x75\x20\x77\x61\x6E\x74\x20\x74\x6F\x20\x64\x6F\x20\x69"
+"\x74\x3A\xA\x20\x20\x20\x20\x20\x20\x79\x6F\x75\x20\x63\x61\x6E\x20\x64\x65\x76\x65\x6C\x6F\x70\x20\x61"
+"\x20\x68\x61\x6E\x64\x6C\x65\x72\x20\x66\x6F\x72\x20\x74\x79\x70\x65\x20\x22\x2E\x73\x6F\x6D\x65\x74\x68"
+"\x69\x6E\x67\x22\x20\x6F\x72\x20\x77\x68\x61\x74\x65\x76\x65\x72\x2C\x20\x74\x68\x69\x73\x20\x70\x61\x63"
+"\x6B\x61\x67\x65\x20\x70\x72\x6F\x76\x69\x64\x65\x73\x20\x61\x20\x2E\x63\x67\x69\x20\x68\x61\x6E\x64\x6C"
+"\x65\x72\x20\x61\x73\x20\x61\x6E\x20\x65\x78\x61\x6D\x70\x6C\x65\x2C\x20\x28\x75\x73\x65\x20\x61\x74\x20"
+"\x79\x6F\x75\x72\x20\x6F\x77\x6E\x20\x72\x69\x73\x6B\x20\x6F\x72\x20\x6D\x61\x6B\x65\x20\x69\x74\x20\x62"
+"\x65\x74\x74\x65\x72\x29\x2E\x3C\x2F\x55\x4C\x3E\xA\xA\xA";
+
+#endif

+ 4 - 0
contrib/help/makeheader.bat

@@ -0,0 +1,4 @@
+type ..\help.html\info.html |..\tools\data2header.exe info >info.h
+type ..\help.html\functions.html |..\tools\data2header.exe functions >functions.h
+type ..\help.html\examples.html |..\tools\data2header.exe examples >examples.h
+type ..\help.html\security.html |..\tools\data2header.exe security >security.h

+ 469 - 0
contrib/help/mime.types

@@ -0,0 +1,469 @@
+# This is a comment. I love comments.
+
+# This file controls what Internet media types are sent to the client for
+# given file extension(s).  Sending the correct media type to the client
+# is important so they know how to handle the content of the file.
+# Extra types can either be added here or by using an AddType directive
+# in your config files. For more information about Internet media types,
+# please read RFC 2045, 2046, 2047, 2048, and 2077.  The Internet media type
+# registry is at <ftp://ftp.iana.org/in-notes/iana/assignments/media-types/>.
+
+# MIME type			Extension
+application/EDI-Consent
+application/EDI-X12
+application/EDIFACT
+application/activemessage
+application/andrew-inset	ez
+application/applefile
+application/atomicmail
+application/batch-SMTP
+application/beep+xml
+application/cals-1840
+application/commonground
+application/cybercash
+application/dca-rft
+application/dec-dx
+application/dvcs
+application/eshop
+application/http
+application/hyperstudio
+application/iges
+application/index
+application/index.cmd
+application/index.obj
+application/index.response
+application/index.vnd
+application/iotp
+application/ipp
+application/isup
+application/font-tdpfr
+application/mac-binhex40	hqx
+application/mac-compactpro	cpt
+application/macwriteii
+application/marc
+application/mathematica
+application/mathematica-old
+application/msword		doc
+application/news-message-id
+application/news-transmission
+application/ocsp-request
+application/ocsp-response
+application/octet-stream	bin dms lha lzh exe class so dll
+application/oda			oda
+application/parityfec
+application/pdf			pdf
+application/pgp-encrypted
+application/pgp-keys
+application/pgp-signature
+application/pkcs10
+application/pkcs7-mime
+application/pkcs7-signature
+application/pkix-cert
+application/pkix-crl
+application/pkixcmp
+application/postscript		ai eps ps
+application/prs.alvestrand.titrax-sheet
+application/prs.cww
+application/prs.nprend
+application/qsig
+application/remote-printing
+application/riscos
+application/rtf
+application/sdp
+application/set-payment
+application/set-payment-initiation
+application/set-registration
+application/set-registration-initiation
+application/sgml
+application/sgml-open-catalog
+application/sieve
+application/slate
+application/smil		smi smil
+application/timestamp-query
+application/timestamp-reply
+application/vemmi
+application/vnd.3M.Post-it-Notes
+application/vnd.FloGraphIt
+application/vnd.accpac.simply.aso
+application/vnd.accpac.simply.imp
+application/vnd.acucobol
+application/vnd.aether.imp
+application/vnd.anser-web-certificate-issue-initiation
+application/vnd.anser-web-funds-transfer-initiation
+application/vnd.audiograph
+application/vnd.businessobjects
+application/vnd.bmi
+application/vnd.canon-cpdl
+application/vnd.canon-lips
+application/vnd.claymore
+application/vnd.commerce-battelle
+application/vnd.commonspace
+application/vnd.comsocaller
+application/vnd.contact.cmsg
+application/vnd.cosmocaller
+application/vnd.cups-postscript
+application/vnd.cups-raster
+application/vnd.cups-raw
+application/vnd.ctc-posml
+application/vnd.cybank
+application/vnd.dna
+application/vnd.dpgraph
+application/vnd.dxr
+application/vnd.ecdis-update
+application/vnd.ecowin.chart
+application/vnd.ecowin.filerequest
+application/vnd.ecowin.fileupdate
+application/vnd.ecowin.series
+application/vnd.ecowin.seriesrequest
+application/vnd.ecowin.seriesupdate
+application/vnd.enliven
+application/vnd.epson.esf
+application/vnd.epson.msf
+application/vnd.epson.quickanime
+application/vnd.epson.salt
+application/vnd.epson.ssf
+application/vnd.ericsson.quickcall
+application/vnd.eudora.data
+application/vnd.fdf
+application/vnd.ffsns
+application/vnd.framemaker
+application/vnd.fsc.weblaunch
+application/vnd.fujitsu.oasys
+application/vnd.fujitsu.oasys2
+application/vnd.fujitsu.oasys3
+application/vnd.fujitsu.oasysgp
+application/vnd.fujitsu.oasysprs
+application/vnd.fujixerox.ddd
+application/vnd.fujixerox.docuworks
+application/vnd.fujixerox.docuworks.binder
+application/vnd.fut-misnet
+application/vnd.grafeq
+application/vnd.groove-account
+application/vnd.groove-identity-message
+application/vnd.groove-injector
+application/vnd.groove-tool-message
+application/vnd.groove-tool-template
+application/vnd.groove-vcard
+application/vnd.hhe.lesson-player
+application/vnd.hp-HPGL
+application/vnd.hp-PCL
+application/vnd.hp-PCLXL
+application/vnd.hp-hpid
+application/vnd.hp-hps
+application/vnd.httphone
+application/vnd.hzn-3d-crossword
+application/vnd.ibm.afplinedata
+application/vnd.ibm.MiniPay
+application/vnd.ibm.modcap
+application/vnd.informix-visionary
+application/vnd.intercon.formnet
+application/vnd.intertrust.digibox
+application/vnd.intertrust.nncp
+application/vnd.intu.qbo
+application/vnd.intu.qfx
+application/vnd.irepository.package+xml
+application/vnd.is-xpr
+application/vnd.japannet-directory-service
+application/vnd.japannet-jpnstore-wakeup
+application/vnd.japannet-payment-wakeup
+application/vnd.japannet-registration
+application/vnd.japannet-registration-wakeup
+application/vnd.japannet-setstore-wakeup
+application/vnd.japannet-verification
+application/vnd.japannet-verification-wakeup
+application/vnd.koan
+application/vnd.lotus-1-2-3
+application/vnd.lotus-approach
+application/vnd.lotus-freelance
+application/vnd.lotus-notes
+application/vnd.lotus-organizer
+application/vnd.lotus-screencam
+application/vnd.lotus-wordpro
+application/vnd.mcd
+application/vnd.mediastation.cdkey
+application/vnd.meridian-slingshot
+application/vnd.mif		mif
+application/vnd.minisoft-hp3000-save
+application/vnd.mitsubishi.misty-guard.trustweb
+application/vnd.mobius.daf
+application/vnd.mobius.dis
+application/vnd.mobius.msl
+application/vnd.mobius.plc
+application/vnd.mobius.txf
+application/vnd.motorola.flexsuite
+application/vnd.motorola.flexsuite.adsi
+application/vnd.motorola.flexsuite.fis
+application/vnd.motorola.flexsuite.gotap
+application/vnd.motorola.flexsuite.kmr
+application/vnd.motorola.flexsuite.ttc
+application/vnd.motorola.flexsuite.wem
+application/vnd.mozilla.xul+xml
+application/vnd.ms-artgalry
+application/vnd.ms-asf
+application/vnd.ms-excel	xls
+application/vnd.ms-lrm
+application/vnd.ms-powerpoint	ppt
+application/vnd.ms-project
+application/vnd.ms-tnef
+application/vnd.ms-works
+application/vnd.mseq
+application/vnd.msign
+application/vnd.music-niff
+application/vnd.musician
+application/vnd.netfpx
+application/vnd.noblenet-directory
+application/vnd.noblenet-sealer
+application/vnd.noblenet-web
+application/vnd.novadigm.EDM
+application/vnd.novadigm.EDX
+application/vnd.novadigm.EXT
+application/vnd.osa.netdeploy
+application/vnd.palm
+application/vnd.pg.format
+application/vnd.pg.osasli
+application/vnd.powerbuilder6
+application/vnd.powerbuilder6-s
+application/vnd.powerbuilder7
+application/vnd.powerbuilder7-s
+application/vnd.powerbuilder75
+application/vnd.powerbuilder75-s
+application/vnd.previewsystems.box
+application/vnd.publishare-delta-tree
+application/vnd.pvi.ptid1
+application/vnd.pwg-xhtml-print+xml
+application/vnd.rapid
+application/vnd.s3sms
+application/vnd.seemail
+application/vnd.shana.informed.formdata
+application/vnd.shana.informed.formtemplate
+application/vnd.shana.informed.interchange
+application/vnd.shana.informed.package
+application/vnd.sss-cod
+application/vnd.sss-dtf
+application/vnd.sss-ntf
+application/vnd.street-stream
+application/vnd.svd
+application/vnd.swiftview-ics
+application/vnd.triscape.mxs
+application/vnd.trueapp
+application/vnd.truedoc
+application/vnd.tve-trigger
+application/vnd.ufdl
+application/vnd.uplanet.alert
+application/vnd.uplanet.alert-wbxml
+application/vnd.uplanet.bearer-choice-wbxml
+application/vnd.uplanet.bearer-choice
+application/vnd.uplanet.cacheop
+application/vnd.uplanet.cacheop-wbxml
+application/vnd.uplanet.channel
+application/vnd.uplanet.channel-wbxml
+application/vnd.uplanet.list
+application/vnd.uplanet.list-wbxml
+application/vnd.uplanet.listcmd
+application/vnd.uplanet.listcmd-wbxml
+application/vnd.uplanet.signal
+application/vnd.vcx
+application/vnd.vectorworks
+application/vnd.vidsoft.vidconference
+application/vnd.visio
+application/vnd.vividence.scriptfile
+application/vnd.wap.sic
+application/vnd.wap.slc
+application/vnd.wap.wbxml	wbxml
+application/vnd.wap.wmlc	wmlc
+application/vnd.wap.wmlscriptc	wmlsc
+application/vnd.webturbo
+application/vnd.wrq-hp3000-labelled
+application/vnd.wt.stf
+application/vnd.xara
+application/vnd.xfdl
+application/vnd.yellowriver-custom-menu
+application/whoispp-query
+application/whoispp-response
+application/wita
+application/wordperfect5.1
+application/x-bcpio		bcpio
+application/x-cdlink		vcd
+application/x-chess-pgn		pgn
+application/x-compress
+application/x-cpio		cpio
+application/x-csh		csh
+application/x-director		dcr dir dxr
+application/x-dvi		dvi
+application/x-futuresplash	spl
+application/x-gtar		gtar
+application/x-gzip
+application/x-hdf		hdf
+application/x-javascript	js
+application/x-koan		skp skd skt skm
+application/x-latex		latex
+application/x-netcdf		nc cdf
+application/x-sh		sh
+application/x-shar		shar
+application/x-shockwave-flash	swf
+application/x-stuffit		sit
+application/x-sv4cpio		sv4cpio
+application/x-sv4crc		sv4crc
+application/x-tar		tar
+application/x-tcl		tcl
+application/x-tex		tex
+application/x-texinfo		texinfo texi
+application/x-troff		t tr roff
+application/x-troff-man		man
+application/x-troff-me		me
+application/x-troff-ms		ms
+application/x-ustar		ustar
+application/x-wais-source	src
+application/x400-bp
+application/xml
+application/xml-dtd
+application/xml-external-parsed-entity
+application/zip			zip
+audio/32kadpcm
+audio/basic			au snd
+audio/g.722.1
+audio/l16
+audio/midi			mid midi kar
+audio/mp4a-latm
+audio/mpa-robust
+audio/mpeg			mpga mp2 mp3
+audio/parityfec
+audio/prs.sid
+audio/telephone-event
+audio/tone
+audio/vnd.cisco.nse
+audio/vnd.cns.anp1
+audio/vnd.cns.inf1
+audio/vnd.digital-winds
+audio/vnd.everad.plj
+audio/vnd.lucent.voice
+audio/vnd.nortel.vbk
+audio/vnd.nuera.ecelp4800
+audio/vnd.nuera.ecelp7470
+audio/vnd.nuera.ecelp9600
+audio/vnd.octel.sbc
+audio/vnd.qcelp
+audio/vnd.rhetorex.32kadpcm
+audio/vnd.vmx.cvsd
+audio/x-aiff			aif aiff aifc
+audio/x-mpegurl			m3u
+audio/x-pn-realaudio		ram rm
+audio/x-pn-realaudio-plugin	rpm
+audio/x-realaudio		ra
+audio/x-wav			wav
+chemical/x-pdb			pdb
+chemical/x-xyz			xyz
+image/bmp			bmp
+image/cgm
+image/g3fax
+image/gif			gif
+image/ief			ief
+image/jpeg			jpeg jpg jpe
+image/naplps
+image/png			png
+image/prs.btif
+image/prs.pti
+image/tiff			tiff tif
+image/vnd.cns.inf2
+image/vnd.dwg
+image/vnd.dxf
+image/vnd.fastbidsheet
+image/vnd.fpx
+image/vnd.fst
+image/vnd.fujixerox.edmics-mmr
+image/vnd.fujixerox.edmics-rlc
+image/vnd.mix
+image/vnd.net-fpx
+image/vnd.svf
+image/vnd.wap.wbmp		wbmp
+image/vnd.xiff
+image/x-cmu-raster		ras
+image/x-portable-anymap		pnm
+image/x-portable-bitmap		pbm
+image/x-portable-graymap	pgm
+image/x-portable-pixmap		ppm
+image/x-rgb			rgb
+image/x-xbitmap			xbm
+image/x-xpixmap			xpm
+image/x-xwindowdump		xwd
+message/delivery-status
+message/disposition-notification
+message/external-body
+message/http
+message/news
+message/partial
+message/rfc822
+message/s-http
+model/iges			igs iges
+model/mesh			msh mesh silo
+model/vnd.dwf
+model/vnd.flatland.3dml
+model/vnd.gdl
+model/vnd.gs-gdl
+model/vnd.gtw
+model/vnd.mts
+model/vnd.vtu
+model/vrml			wrl vrml
+multipart/alternative
+multipart/appledouble
+multipart/byteranges
+multipart/digest
+multipart/encrypted
+multipart/form-data
+multipart/header-set
+multipart/mixed
+multipart/parallel
+multipart/related
+multipart/report
+multipart/signed
+multipart/voice-message
+text/calendar
+text/css			css
+text/directory
+text/enriched
+text/html			html htm
+text/parityfec
+text/plain			asc txt
+text/prs.lines.tag
+text/rfc822-headers
+text/richtext			rtx
+text/rtf			rtf
+text/sgml			sgml sgm
+text/tab-separated-values	tsv
+text/t140
+text/uri-list
+text/vnd.DMClientScript
+text/vnd.IPTC.NITF
+text/vnd.IPTC.NewsML
+text/vnd.abc
+text/vnd.curl
+text/vnd.flatland.3dml
+text/vnd.fly
+text/vnd.fmi.flexstor
+text/vnd.in3d.3dml
+text/vnd.in3d.spot
+text/vnd.latex-z
+text/vnd.motorola.reflex
+text/vnd.ms-mediapackage
+text/vnd.wap.si
+text/vnd.wap.sl
+text/vnd.wap.wml		wml
+text/vnd.wap.wmlscript		wmls
+text/x-setext			etx
+text/xml			xml xsl
+text/xml-external-parsed-entity
+video/mp4v-es
+video/mpeg			mpeg mpg mpe
+video/parityfec
+video/pointer
+video/quicktime			qt mov
+video/vnd.fvt
+video/vnd.motorola.video
+video/vnd.motorola.videop
+video/vnd.mpegurl		mxu
+video/vnd.mts
+video/vnd.nokia.interleaved-multimedia
+video/vnd.vivo
+video/x-msvideo			avi
+video/x-sgi-movie		movie
+x-conference/x-cooltalk		ice

+ 143 - 0
contrib/help/security.h

@@ -0,0 +1,143 @@
+/*
+ * by data2header by Luis Figueiredo ([email protected])
+ */
+#ifndef _SECURITY_H_
+#define _SECURITY_H_
+
+char security[]="\x3C\x63\x65\x6E\x74\x65\x72\x3E\x3C\x48\x33\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27"
+"\x30\x30\x37\x37\x30\x30\x27\x3E\x6C\x69\x62\x77\x65\x62\x73\x65\x72\x76\x65\x72\x20\x53\x65\x63\x75\x72"
+"\x69\x74\x79\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x48\x33\x3E\x3C\x2F\x63\x65\x6E\x74\x65\x72\x3E\x3C\x42"
+"\x52\x3E\x3C\x42\x52\x3E\xA\xA\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x77\x68\x61\x74\x3E\x3C\x42\x3E\x3C\x66"
+"\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37\x37\x27\x3E\x49\x73\x20\x69\x74\x20\x73"
+"\x61\x66\x65\x20\x74\x6F\x20\x75\x73\x65\x3F\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\x3C\x42\x52\x3E"
+"\xA\x3C\x55\x4C\x3E\x57\x65\x6C\x6C\x2C\x20\x49\x20\x63\x61\x6E\x27\x74\x20\x70\x72\x6F\x6D\x69\x73\x65"
+"\x20\x74\x68\x61\x74\x20\x69\x74\x27\x73\x20\x61\x20\x73\x65\x63\x75\x72\x65\x20\x73\x6F\x66\x74\x77\x61"
+"\x72\x65\x20\x73\x69\x6E\x63\x65\x20\x74\x68\x61\x74\x20\x6E\x6F\x74\x20\x6F\x6E\x6C\x79\x20\x64\x65\x70"
+"\x65\x6E\x64\x73\x20\x6F\x6E\x20\x74\x68\x65\x20\x73\x6F\x66\x74\x77\x61\x72\x65\x2C\x20\xA\x20\x20\x20"
+"\x20\x20\x20\x20\x20\x20\x62\x75\x74\x20\x61\x6C\x6C\x20\x69\x20\x63\x61\x6E\x20\x73\x61\x79\x20\x69\x73"
+"\x20\x74\x68\x61\x74\x20\x77\x61\x73\x6E\x27\x74\x20\x66\x6F\x75\x6E\x64\x20\x61\x6E\x79\x20\x73\x65\x63"
+"\x75\x72\x69\x74\x79\x20\x62\x75\x67\x20\x79\x65\x74\x2C\x20\x74\x68\x69\x73\x20\x77\x61\x73\x20\x64\x65"
+"\x76\x65\x6C\x6F\x70\x65\x64\x20\x69\x6E\x74\x65\x6E\x64\x65\x64\x20\x74\x6F\x20\x62\x65\x20\x73\x65\x63"
+"\x75\x72\x65\x2C\x20\x20\xA\x9\x9\x20\x79\x6F\x75\x20\x63\x61\x6E\x20\x75\x73\x65\x20\x6F\x70\x65\x6E"
+"\x73\x73\x6C\x20\x28\x65\x6E\x63\x72\x79\x70\x74\x65\x64\x20\x73\x74\x72\x65\x61\x6D\x73\x29\x20\x74\x6F"
+"\x20\x70\x72\x6F\x74\x65\x63\x74\x20\x69\x6E\x66\x6F\x72\x6D\x61\x74\x69\x6F\x6E\x20\x74\x68\x61\x74\x20"
+"\x70\x61\x73\x73\x65\x73\x20\x66\x72\x6F\x6D\x20\x77\x65\x62\x73\x65\x72\x76\x65\x72\x28\x6C\x69\x62\x29"
+"\x20\x74\x6F\x20\x63\x6C\x69\x65\x6E\x74\x3C\x2F\x55\x4C\x3E\xA\x9\xA\x3C\x41\x20\x6E\x61\x6D\x65\x3D"
+"\x63\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x3E\x3C\x42\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72"
+"\x3D\x27\x30\x30\x30\x30\x37\x37\x27\x3E\x48\x6F\x77\x20\x64\x6F\x20\x49\x20\x63\x72\x65\x61\x74\x65\x20"
+"\x6D\x79\x20\x6F\x77\x6E\x20\x63\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x3F\x3C\x2F\x66\x6F\x6E\x74\x3E"
+"\x3C\x2F\x42\x3E\x3C\x42\x52\x3E\xA\x3C\x55\x4C\x3E\x59\x6F\x75\x20\x63\x61\x6E\x20\x65\x69\x74\x68\x65"
+"\x72\x20\x62\x75\x79\x20\x6F\x6E\x65\x20\x66\x72\x6F\x6D\x20\x6F\x6E\x65\x20\x6F\x66\x20\x74\x68\x65\x20"
+"\x62\x69\x67\x20\x76\x65\x6E\x64\x6F\x72\x73\x20\x28\x73\x65\x65\x20\x79\x6F\x75\x72\x20\x62\x72\x6F\x77"
+"\x73\x65\x72\x27\x73\x20\x73\x74\x6F\x72\x65\x64\x20\x63\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x73\xA"
+"\x9\x66\x6F\x72\x20\x74\x68\x65\x69\x72\x20\x61\x64\x64\x72\x65\x73\x73\x65\x73\x29\x20\x6F\x72\x20\x73"
+"\x65\x6C\x66\x2D\x73\x69\x67\x6E\x20\x61\x20\x73\x65\x6C\x66\x2D\x63\x72\x65\x61\x74\x65\x64\x20\x6F\x6E"
+"\x65\x2E\x20\x54\x68\x65\x20\x75\x70\x73\x69\x64\x65\x20\x6F\x66\x20\x74\x68\x65\x20\x62\x6F\x75\x67\x68"
+"\x74\xA\x9\x63\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x73\x20\x69\x73\x2C\x20\x74\x68\x61\x74\x20\x74"
+"\x68\x65\x20\x77\x65\x62\x62\x72\x6F\x77\x73\x65\x72\x20\x64\x6F\x65\x73\x6E\x27\x74\x20\x61\x73\x6B\x20"
+"\x69\x66\x20\x74\x68\x65\x20\x75\x73\x65\x72\x20\x77\x61\x6E\x74\x73\x20\x74\x6F\xA\x9\x61\x63\x63\x65"
+"\x70\x74\x20\x74\x68\x61\x74\x20\x63\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x2C\x20\x62\x75\x74\x20\x69"
+"\x6E\x73\x74\x65\x61\x64\x20\x63\x68\x65\x63\x6B\x73\x20\x77\x69\x74\x68\x20\x74\x68\x65\x20\x63\x65\x72"
+"\x74\x69\x66\x69\x63\x61\x74\x69\x6F\x6E\x20\x61\x75\x74\x68\x6F\x72\x69\x74\x79\xA\x9\x79\x6F\x75\x20"
+"\x62\x6F\x75\x67\x68\x74\x20\x79\x6F\x75\x72\x20\x63\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x20\x66\x72"
+"\x6F\x6D\x2E\x3C\x62\x72\x3E\xA\x9\x54\x68\x65\x20\x64\x6F\x77\x6E\x73\x69\x64\x65\x20\x69\x73\x20\x74"
+"\x68\x61\x74\x20\x69\x74\x20\x63\x6F\x73\x74\x73\x20\x71\x75\x69\x74\x65\x20\x61\x20\x6C\x6F\x74\x20\x6F"
+"\x66\x20\x6D\x6F\x6E\x65\x79\x2E\x3C\x62\x72\x3E\xA\x9\x54\x6F\x20\x63\x72\x65\x61\x74\x65\x20\x79\x6F"
+"\x75\x72\x20\x6F\x77\x6E\x20\x63\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x20\x75\x73\x65\x20\x6F\x70\x65"
+"\x6E\x73\x73\x6C\x20\x6C\x69\x6B\x65\x20\x74\x68\x61\x74\x3A\xA\x9\x3C\x75\x6C\x3E\x3C\x6C\x69\x3E\x63"
+"\x72\x65\x61\x74\x65\x20\x61\x20\x6B\x65\x79\x20\x61\x6E\x64\x20\x72\x65\x71\x75\x65\x73\x74\x3A\x3C\x62"
+"\x72\x3E\xA\x9\x9\x3C\x70\x72\x65\x3E\x3C\x62\x3E\x6F\x70\x65\x6E\x73\x73\x6C\x20\x72\x65\x71\x20\x2D"
+"\x6E\x65\x77\x20\x3E\x20\x66\x6F\x6F\x2D\x63\x65\x72\x74\x2E\x63\x73\x72\x3C\x2F\x62\x3E\x3C\x2F\x70\x72"
+"\x65\x3E\x3C\x62\x72\x3E\xA\x9\x9\x41\x73\x20\x22\x43\x6F\x6D\x6D\x6F\x6E\x20\x4E\x61\x6D\x65\x22\x20"
+"\x79\x6F\x75\x20\x68\x61\x76\x65\x20\x74\x6F\x20\x74\x79\x70\x65\x20\x69\x6E\x20\x74\x68\x65\x20\x6E\x61"
+"\x6D\x65\x20\x70\x61\x72\x74\x20\x6F\x66\xA\x9\x9\x79\x6F\x75\x72\x20\x55\x52\x4C\x2C\x20\x69\x2E\x65"
+"\x2E\x20\x69\x66\x20\x79\x6F\x75\x72\x20\x77\x65\x62\x20\x73\x69\x74\x65\x20\x77\x69\x6C\x6C\x20\x62\x65"
+"\xA\x9\x9\x22\x68\x74\x74\x70\x73\x3A\x2F\x2F\x77\x77\x77\x2E\x6C\x69\x62\x77\x65\x62\x73\x65\x72\x76"
+"\x65\x72\x2E\x72\x75\x6C\x65\x73\x3A\x34\x34\x33\x2F\x22\x20\x74\x68\x65\x20\x43\x6F\x6D\x6D\x6F\x6E\x20"
+"\x4E\x61\x6D\x65\x20\x69\x73\xA\x9\x9\x22\x77\x77\x77\x2E\x6C\x69\x62\x77\x65\x62\x73\x65\x72\x76\x65"
+"\x72\x2E\x72\x75\x6C\x65\x73\x22\x2E\xA\x9\x3C\x6C\x69\x3E\x20\x72\x65\x6D\x6F\x76\x65\x20\x74\x68\x65"
+"\x20\x70\x61\x73\x73\x70\x68\x72\x61\x73\x65\x20\x66\x72\x6F\x6D\x20\x74\x68\x65\x20\x6B\x65\x79\x3A\x3C"
+"\x62\x72\x3E\xA\x9\x9\x3C\x70\x72\x65\x3E\x3C\x62\x3E\x6F\x70\x65\x6E\x73\x73\x6C\x20\x72\x73\x61\x20"
+"\x2D\x69\x6E\x20\x70\x72\x69\x76\x6B\x65\x79\x2E\x70\x65\x6D\x20\x2D\x6F\x75\x74\x20\x66\x6F\x6F\x2D\x63"
+"\x65\x72\x74\x2E\x6B\x65\x79\x3C\x2F\x62\x3E\x3C\x2F\x70\x72\x65\x3E\x3C\x62\x72\x3E\xA\x9\x3C\x6C\x69"
+"\x3E\x63\x6F\x6E\x76\x65\x72\x74\x20\x72\x65\x71\x75\x65\x73\x74\x20\x69\x6E\x74\x6F\x20\x61\x20\x73\x69"
+"\x67\x6E\x65\x64\x20\x63\x65\x72\x74\x69\x66\x69\x63\x61\x74\x65\x3A\x3C\x62\x72\x3E\xA\x9\x9\x3C\x70"
+"\x72\x65\x3E\x3C\x62\x3E\x6F\x70\x65\x6E\x73\x73\x6C\x20\x78\x35\x30\x39\x20\x2D\x69\x6E\x20\x66\x6F\x6F"
+"\x2D\x63\x65\x72\x74\x2E\x63\x73\x72\x20\x2D\x6F\x75\x74\x20\x66\x6F\x6F\x2D\x63\x65\x72\x74\x2E\x63\x65"
+"\x72\x74\x20\x2D\x72\x65\x71\x20\x2D\x73\x69\x67\x6E\x6B\x65\x79\x20\x66\x6F\x6F\x2D\x63\x65\x72\x74\x2E"
+"\x6B\x65\x79\x20\x2D\x64\x61\x79\x73\x20\x33\x35\x36\x3C\x2F\x62\x3E\x3C\x2F\x70\x72\x65\x3E\x3C\x62\x72"
+"\x3E\xA\x9\x3C\x6C\x69\x3E\x63\x72\x65\x61\x74\x65\x20\x2E\x70\x65\x6D\x20\x66\x69\x6C\x65\x3A\x3C\x62"
+"\x72\x3E\xA\x9\x9\x3C\x70\x72\x65\x3E\x3C\x62\x3E\x63\x61\x74\x20\x66\x6F\x6F\x2D\x63\x65\x72\x74\x2E"
+"\x63\x65\x72\x74\x20\x66\x6F\x6F\x2D\x63\x65\x72\x74\x2E\x6B\x65\x79\x20\x3E\x66\x6F\x6F\x2D\x63\x65\x72"
+"\x74\x2E\x70\x65\x6D\x3C\x2F\x62\x3E\x3C\x2F\x70\x72\x65\x3E\x3C\x62\x72\x3E\xA\x9\x3C\x2F\x75\x6C\x3E"
+"\xA\x3C\x2F\x75\x6C\x3E\xA\xA\xA\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x74\x69\x70\x73\x3E\x3C\x42\x3E\x3C"
+"\x66\x6F\x6E\x74\x20\x73\x69\x7A\x65\x3D\x34\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x37\x37\x30\x30\x37\x37\x27"
+"\x3E\x53\x65\x63\x75\x72\x69\x74\x79\x20\x74\x69\x70\x73\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\x3C"
+"\x42\x52\x3E\x3C\x48\x52\x3E\xA\xA\x3C\x41\x20\x6E\x61\x6D\x65\x3D\x72\x61\x63\x65\x63\x6F\x6E\x64\x69"
+"\x74\x69\x6F\x6E\x3E\x3C\x42\x3E\x3C\x66\x6F\x6E\x74\x20\x63\x6F\x6C\x6F\x72\x3D\x27\x30\x30\x30\x30\x37"
+"\x37\x27\x3E\x41\x76\x6F\x69\x64\x20\x72\x61\x63\x65\x20\x63\x6F\x6E\x64\x69\x74\x69\x6F\x6E\x20\x70\x72"
+"\x6F\x62\x6C\x65\x6D\x73\x3C\x2F\x66\x6F\x6E\x74\x3E\x3C\x2F\x42\x3E\x3C\x42\x52\x3E\xA\x3C\x55\x4C\x3E"
+"\xA\x9\x3C\x42\x3E\x20\x57\x68\x61\x74\x20\x69\x73\x20\x72\x61\x63\x65\x20\x63\x6F\x6E\x64\x69\x74\x69"
+"\x6F\x6E\x3F\x3C\x2F\x42\x3E\xA\x9\x9\x3C\x55\x4C\x3E\x41\x20\x72\x61\x63\x65\x20\x63\x6F\x6E\x64\x69"
+"\x74\x69\x6F\x6E\x20\x6F\x63\x63\x75\x72\x73\x20\x77\x68\x65\x6E\x20\x74\x77\x6F\x20\x6F\x72\x20\x6D\x6F"
+"\x72\x65\x20\x6F\x70\x65\x72\x61\x74\x69\x6F\x6E\x73\x20\x6F\x63\x63\x75\x72\x20\x69\x6E\x20\x61\x6E\x20"
+"\xA\x20\x20\x20\x20\x20\x20\x75\x6E\x64\x65\x66\x69\x6E\x65\x64\x20\x6D\x61\x6E\x6E\x65\x72\x20\x28\x4D"
+"\x63\x4B\x75\x73\x69\x63\x6B\x20\x65\x74\x20\x61\x6C\x2E\x20\x31\x39\x39\x36\x29\x2E\x20\x53\x70\x65\x63"
+"\x69\x66\x69\x63\x61\x6C\x6C\x79\x20\x69\x6E\x20\x66\x69\x6C\x65\x20\xA\x20\x20\x20\x20\x20\x20\x73\x79"
+"\x73\x74\x65\x6D\x20\x72\x61\x63\x65\x73\x20\x74\x68\x65\x20\x61\x74\x74\x61\x63\x6B\x65\x72\x20\x61\x74"
+"\x74\x65\x6D\x70\x74\x73\x20\x74\x6F\x20\x63\x68\x61\x6E\x67\x65\x20\x74\x68\x65\x20\x73\x74\x61\x74\x65"
+"\x20\x6F\x66\x20\x74\x68\x65\x20\xA\x20\x20\x20\x20\x20\x20\x66\x69\x6C\x65\x20\x73\x79\x73\x74\x65\x6D"
+"\x20\x69\x6E\x20\x62\x65\x74\x77\x65\x65\x6E\x20\x74\x77\x6F\x20\x66\x69\x6C\x65\x20\x73\x79\x73\x74\x65"
+"\x6D\x20\x6F\x70\x65\x72\x61\x74\x69\x6F\x6E\x73\x20\x6F\x6E\x20\x74\x68\x65\x20\x70\x61\x72\x74\x20\xA"
+"\x20\x20\x20\x20\x20\x20\x6F\x66\x20\x74\x68\x65\x20\x70\x72\x6F\x67\x72\x61\x6D\x2E\x3C\x2F\x55\x4C\x3E"
+"\x3C\x42\x52\x3E\x20\xA\x9\x3C\x42\x3E\x20\x48\x6F\x77\x20\x74\x68\x65\x20\x6C\x69\x62\x20\x64\x65\x74"
+"\x65\x72\x6D\x69\x6E\x65\x20\x74\x65\x6D\x70\x6F\x72\x61\x72\x79\x20\x66\x69\x6C\x65\x20\x6E\x61\x6D\x65"
+"\x3F\x3C\x2F\x42\x3E\xA\x9\x3C\x55\x4C\x3E\x20\xA\x9\x3C\x6C\x69\x3E\x67\x65\x6E\x65\x72\x61\x74\x65"
+"\x20\x66\x69\x6C\x65\x20\x6E\x61\x6D\x65\x20\x28\x6E\x6F\x74\x65\x3A\x20\x6B\x65\x65\x70\x20\x67\x65\x6E"
+"\x65\x72\x61\x74\x69\x6E\x67\x20\x75\x6E\x74\x69\x6C\x20\x69\x74\x20\x64\x6F\x65\x73\x6E\x27\x74\x20\x65"
+"\x78\x69\x73\x74\x73\x29\x3C\x42\x52\x3E\x3C\x2F\x6C\x69\x3E\xA\x9\x3C\x6C\x69\x3E\x63\x68\x65\x63\x6B"
+"\x20\x69\x66\x20\x66\x69\x6C\x65\x20\x65\x78\x69\x73\x74\x73\x3C\x42\x52\x3E\xA\x9\x2D\x3C\x73\x6D\x61"
+"\x6C\x6C\x3E\x61\x74\x74\x61\x63\x6B\x65\x72\x20\x63\x61\x6E\x20\x63\x72\x65\x61\x74\x65\x20\x74\x68\x65"
+"\x20\x66\x69\x6C\x65\x20\x6E\x6F\x77\x2C\x20\x69\x66\x20\x68\x65\x20\x6B\x6E\x6F\x77\x73\x20\x74\x68\x65"
+"\x20\x72\x69\x67\x68\x74\x20\x66\x69\x6C\x65\x6E\x61\x6D\x65\x3C\x2F\x73\x6D\x61\x6C\x6C\x3E\x3C\x42\x52"
+"\x3E\x3C\x2F\x6C\x69\x3E\xA\x9\x3C\x6C\x69\x3E\x63\x68\x65\x63\x6B\x20\x69\x66\x20\x73\x79\x6D\x6C\x69"
+"\x6E\x6B\x20\x65\x78\x69\x73\x74\x73\x3C\x42\x52\x3E\xA\x9\x2D\x3C\x73\x6D\x61\x6C\x6C\x3E\x61\x74\x74"
+"\x61\x63\x6B\x65\x72\x20\x63\x61\x6E\x20\x63\x72\x65\x61\x74\x65\x20\x74\x68\x65\x20\x73\x79\x6D\x6C\x69"
+"\x6E\x6B\x20\x6E\x6F\x77\x2C\x20\x69\x66\x20\x68\x65\x20\x6B\x6E\x6F\x77\x73\x20\x74\x68\x65\x20\x72\x69"
+"\x67\x68\x74\x20\x66\x69\x6C\x65\x6E\x61\x6D\x65\x3C\x2F\x73\x6D\x61\x6C\x6C\x3E\x3C\x42\x52\x3E\x3C\x2F"
+"\x6C\x69\x3E\xA\x9\x3C\x6C\x69\x3E\x63\x72\x65\x61\x74\x65\x20\x74\x68\x65\x20\x66\x69\x6C\x65\x20\x61"
+"\x6E\x64\x20\x72\x65\x64\x69\x72\x65\x63\x74\x20\x73\x74\x64\x6F\x75\x74\x20\x74\x6F\x20\x69\x74\x20\x3C"
+"\x42\x52\x3E\xA\x9\x2D\x3C\x73\x6D\x61\x6C\x6C\x3E\x61\x74\x74\x61\x63\x6B\x65\x72\x20\x63\x61\x6E\x20"
+"\x6F\x70\x65\x6E\x20\x74\x68\x65\x20\x66\x69\x6C\x65\x20\x61\x6E\x64\x20\x77\x72\x69\x74\x65\x20\x74\x6F"
+"\x20\x69\x74\x3C\x2F\x73\x6D\x61\x6C\x6C\x3E\x3C\x42\x52\x3E\x3C\x2F\x6C\x69\x3E\xA\x9\x3C\x6C\x69\x3E"
+"\x70\x6C\x61\x63\x65\x73\x20\x61\x20\x6C\x6F\x63\x6B\x20\x69\x6E\x74\x6F\x20\x66\x69\x6C\x65\x20\x28\x6E"
+"\x6F\x74\x65\x3A\x20\x6E\x6F\x74\x20\x69\x6E\x20\x77\x69\x6E\x39\x38\x29\x3C\x42\x52\x3E\x20\x3C\x2F\x6C"
+"\x69\x3E\xA\x9\x3C\x6C\x69\x3E\x75\x73\x65\x72\x73\x20\x6F\x70\x65\x72\x61\x74\x69\x6F\x6E\x73\x2C\x20"
+"\x77\x72\x69\x74\x65\x2C\x20\x66\x6C\x75\x73\x68\x2C\x20\x72\x65\x61\x64\x3C\x42\x52\x3E\x3C\x2F\x6C\x69"
+"\x3E\xA\x9\x3C\x6C\x69\x3E\x75\x6E\x6C\x69\x6E\x6B\x20\x74\x68\x65\x20\x66\x69\x6C\x65\x6E\x61\x6D\x65"
+"\x20\x66\x72\x6F\x6D\x20\x74\x68\x65\x20\x4F\x53\x3C\x42\x52\x3E\x3C\x2F\x6C\x69\x3E\xA\x9\x3C\x2F\x55"
+"\x4C\x3E\x3C\x42\x52\x3E\xA\x9\xA\x9\xA\x9\x6C\x69\x62\x77\x65\x62\x73\x65\x72\x76\x65\x72\x20\x75"
+"\x73\x65\x73\x20\x74\x65\x6D\x70\x6F\x72\x61\x72\x79\x20\x66\x69\x6C\x65\x6E\x61\x6D\x65\x73\x20\x74\x6F"
+"\x20\x68\x6F\x6C\x64\x20\x61\x6E\x64\x20\x70\x72\x6F\x63\x65\x73\x73\x20\x64\x61\x74\x61\x20\x62\x65\x66"
+"\x6F\x72\x65\x20\x73\x65\x6E\x64\x20\x69\x74\x20\x74\x6F\x20\x63\x6C\x69\x65\x6E\x74\x2C\x20\x69\x74\x20"
+"\x75\x73\x65\x73\x20\x74\x68\x65\x20\x61\x6D\x62\x69\x65\x6E\x74\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x73"
+"\x20\x74\x6F\x20\xA\x9\x64\x65\x74\x65\x72\x6D\x69\x6E\x65\x20\x74\x65\x6D\x70\x6F\x72\x61\x72\x79\x20"
+"\x64\x69\x72\x65\x63\x74\x6F\x72\x79\x20\x62\x79\x20\x66\x6F\x6C\x6C\x6F\x77\x69\x6E\x67\x20\x6F\x72\x64"
+"\x65\x72\x20\x22\x24\x54\x45\x4D\x50\x2C\x24\x54\x4D\x50\x2C\x24\x54\x4D\x50\x44\x49\x52\x20\x61\x6E\x64"
+"\x20\x74\x68\x65\x20\x73\x74\x64\x69\x6F\x2E\x68\x20\x50\x5F\x74\x6D\x70\x64\x69\x72\x22\x2C\x20\x6C\x69"
+"\x62\x77\x65\x62\x73\x65\x72\x76\x65\x72\x20\x68\x61\x76\x65\x20\x73\x65\x76\x65\x72\x61\x6C\x20\x63\x68"
+"\x65\x63\x6B\x73\xA\x9\x61\x6E\x64\x20\x69\x74\x20\x6C\x6F\x63\x6B\x73\x20\x66\x69\x6C\x65\x20\x66\x6F"
+"\x72\x20\x61\x76\x6F\x69\x64\x20\x61\x74\x74\x61\x63\x6B\x65\x72\x73\x20\x66\x72\x6F\x6D\x20\x6D\x65\x73"
+"\x73\x69\x6E\x67\x20\x77\x69\x74\x68\x20\x74\x65\x6D\x70\x6F\x72\x61\x72\x79\x20\x66\x69\x6C\x65\x73\x2C"
+"\x20\x6D\x65\x61\x6E\x77\x68\x69\x6C\x65\x20\x69\x73\x20\x73\x61\x66\x65\x6C\x79\x20\x74\x6F\x20\x63\x68"
+"\x61\x6E\x67\x65\x20\x74\x68\x65\x20\x74\x65\x6D\x70\x64\x69\x72\x20\x28\x73\x65\x74\x74\x69\x6E\x67\x20"
+"\x74\x68\x65\x20\x61\x6D\x62\x69\x65\x6E\x74\x20\x76\x61\x72\x69\x61\x62\x6C\x65\x29\xA\x9\x74\x6F\x20"
+"\x61\x6E\x20\x64\x69\x72\x65\x63\x74\x6F\x72\x79\x20\x74\x68\x61\x74\x20\x69\x73\x20\x6E\x6F\x74\x20\x77"
+"\x72\x69\x74\x61\x62\x6C\x65\x20\x66\x6F\x72\x20\x65\x76\x65\x72\x79\x6F\x6E\x65\x20\x61\x6E\x64\x20\x77"
+"\x72\x69\x74\x61\x62\x6C\x65\x20\x74\x6F\x20\x6C\x69\x62\x20\x28\x73\x65\x74\x65\x6E\x76\x28\x22\x54\x45"
+"\x4D\x50\x22\x2C\x22\x2F\x73\x61\x66\x65\x64\x69\x72\x22\x29\x3B\x20\x79\x6F\x75\x20\x63\x61\x6E\x20\x64"
+"\x6F\x20\x69\x74\x20\x62\x65\x66\x6F\x72\x65\x20\x74\x68\x65\x20\x77\x65\x62\x5F\x73\x65\x72\x76\x65\x72"
+"\x5F\x72\x75\x6E\x20\x66\x75\x6E\x63\x74\x69\x6F\x6E\xA\xA\x9\xA\xA\x3C\x2F\x55\x4C\x3E\xA\xA\xA"
+"\xA";
+
+#endif

+ 4 - 0
contrib/tools/checkpid

@@ -0,0 +1,4 @@
+
+echo "checking pid $1";
+
+while true; do echo -e "\33[2J\33[0;0H";cat /proc/$1/status ;done

+ 41 - 0
contrib/tools/data2header.c

@@ -0,0 +1,41 @@
+/*
+ * by Luis Figueiredo ([email protected])
+ */
+#include <stdio.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef WIN32
+#include <io.h>
+#endif
+
+
+
+int main(int argc, char *argv[]) { // Johannes E. Schindelin
+	unsigned char ch;
+	char *vn;
+	unsigned int i=0;
+	if(argc<2) {
+		fprintf(stderr,"Need a name for VAR\n");
+		exit(1);  // Johannes E. Schindelin
+	};
+	vn=malloc(strlen(argv[1])+1);
+	for(i=0;i<strlen(argv[1]);i++)vn[i]=toupper(argv[1][i]);
+	vn[i]='\0';
+	printf("/*\n * by data2header by Luis Figueiredo ([email protected])\n */\n");
+	printf("#ifndef _%s_H_\n",vn);
+	printf("#define _%s_H_\n\n",vn);
+	free(vn);
+	i=0;
+	printf("char %s[]=\"",argv[1]);
+	while(read(0,&ch,1)) {
+		i++;if(i>25){i=0;printf("\"\n\"");};
+		printf("\\x%X",ch);
+	};
+	printf("\";\n\n");
+	printf("#endif\n");
+	return 0; // Johannes E. Schindelin
+};
+
+		 
+

+ 195 - 0
contrib/tools/httptest.pl

@@ -0,0 +1,195 @@
+#!/usr/bin/perl
+
+
+
+use Socket;
+sub newdata {
+                #my $self = shift;
+                my ($nfound,$timeout,$rin,$rout)=(0,0.2,"");
+                vec($rin,fileno(shift()),1)=1;
+                $nfound=select($rout=$rin,undef,undef,$timeout);
+                return $nfound;
+};
+
+
+my $host = shift;
+my $port = shift || 80;
+print "\n\tWARNING: If program exit before msg that's mean that the server crashed or something happened to server\n\n";
+$saddr=sockaddr_in($port,inet_aton($host));
+$SIG{PIPE}=NULL;
+
+
+socket(SOCK,AF_INET,SOCK_STREAM,6) or print "Died";
+print "a normal connection\n";
+<STDIN>;
+connect(SOCK,$saddr) or exit;
+print "Connected\n";
+$header="GET / HTTP/1.0\r\nConnection: Keep-Alive\r\nUser-Agent: Mozilla/4.73 [en] (X11; U; Linux 2.4.12 i686)\r\nHost: localhost:81\r\nAccept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*\r\nAccept-Encoding: gzip\r\nAccept-Language: en\r\nAccept-Charset: iso-8859-1,*,utf-8\r\n\r\n";
+syswrite(SOCK,"$header");
+$keep=1;
+while($keep) {
+        if(newdata(SOCK)) {
+                if(($data=<SOCK>)) {
+                        print "Read: ".$data;
+                }else {
+			$keep=0;
+                };
+        };
+};
+close(SOCK);
+
+
+
+socket(SOCK,AF_INET,SOCK_STREAM,6) or exit;
+print "Trying to send (nothing) press (enter) to continue\n";
+<STDIN>;
+connect(SOCK,$saddr) or exit;
+print "Connected\n";
+$header="";
+syswrite(SOCK,"$header");
+$keep=1;
+while($keep) {
+        if(newdata(SOCK)) {
+                if(($data=<SOCK>)) {
+                        print "Read: ".$data;
+                }else {
+			$keep=0;
+                };
+        };
+};
+close(SOCK);
+
+
+socket(SOCK,AF_INET,SOCK_STREAM,6) or print "Died";
+print "a post (foo)value with 10000000 bytes press (enter) to continue\n";
+<STDIN>;
+connect(SOCK,$saddr) or exit;
+print "Connected\n";
+$header="POST / HTTP/1.0\r\nConnection: Keep-Alive\r\nUser-Agent: Mozilla/4.73 [en] (X11; U; Linux 2.4.12 i686)\r\nHost: localhost:81\r\nAccept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*\r\nAccept-Encoding: gzip\r\nAccept-Language: en\r\nAccept-Charset: iso-8859-1,*,utf-8\r\n\r\ndev=".("a"x1000000)."&teste=1\r\n\r\n"; #big values
+syswrite(SOCK,"$header");
+$keep=1;
+while($keep) {
+        if(newdata(SOCK)) {
+                if(($data=<SOCK>)) {
+                        print "Read: ".$data;
+                }else {
+			$keep=0;
+                };
+        };
+};
+close(SOCK);
+
+socket(SOCK,AF_INET,SOCK_STREAM,6) or exit;
+print "Trying to send a big data for ClientInfo\n";
+<STDIN>;
+connect(SOCK,$saddr) or exit;
+print "Connected\n";
+$header="GET / HTTP/1.0\r\nConnection: Keep-Alive\r\nUser-Agent: Mozilla/4.73 [en] (X11; U; Linux 2.4.12 i686)\r\nHost: localhost:81\r\nAccept: ".("a"x1000000)."\r\nAccept-Encoding: gzip\r\nAccept-Language: en\r\nAccept-Charset: iso-8859-1,*,utf-8\r\n\r\n"; 
+syswrite(SOCK,"$header");
+$keep=1;
+while($keep) {
+        if(newdata(SOCK)) {
+                if(($data=<SOCK>)) {
+                        print "Read: ".$data;
+                }else {
+			$keep=0;
+                };
+        };
+};
+close(SOCK);
+
+socket(SOCK,AF_INET,SOCK_STREAM,6) or exit;
+print "Change method by a big name\n";
+<STDIN>;
+connect(SOCK,$saddr) or exit;
+print "Connected\n";
+$header=("a"x1000000)." / HTTP/1.0\r\nConnection: Keep-Alive\r\nUser-Agent: Mozilla/4.73 [en] (X11; U; Linux 2.4.12 i686)\r\nAccept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*\r\nAccept-Encoding: gzip\r\nAccept-Language: en\r\nAccept-Charset: iso-8859-1,*,utf-8\r\n\r\n"; 
+syswrite(SOCK,"$header");
+$keep=1;
+while($keep) {
+        if(newdata(SOCK)) {
+                if(($data=<SOCK>)) {
+                        print "Read: ".$data;
+                }else {
+			$keep=0;
+                };
+        };
+};
+close(SOCK);
+
+socket(SOCK,AF_INET,SOCK_STREAM,6) or exit;
+print "big query value\n";
+<STDIN>;
+connect(SOCK,$saddr) or exit;
+print "Connected\n";
+$header="GET /?teste=".("a"x1000000)." / HTTP/1.0\r\nConnection: Keep-Alive\r\nUser-Agent: Mozilla/4.73 [en] (X11; U; Linux 2.4.12 i686)\r\nAccept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*\r\nAccept-Encoding: gzip\r\nAccept-Language: en\r\nAccept-Charset: iso-8859-1,*,utf-8\r\n\r\n"; 
+syswrite(SOCK,"$header");
+$keep=1;
+while($keep) {
+        if(newdata(SOCK)) {
+                if(($data=<SOCK>)) {
+                        print "Read: ".$data;
+                }else {
+			$keep=0;
+                };
+        };
+};
+close(SOCK);
+
+socket(SOCK,AF_INET,SOCK_STREAM,6) or exit;
+print "requestname filled w 0's\n";
+<STDIN>;
+connect(SOCK,$saddr) or exit;
+print "Connected\n";
+$header="GET /".("\0"x1000000)." HTTP/1.0\r\nConnection: Keep-Alive\r\nUser-Agent: Mozilla/4.73 [en] (X11; U; Linux 2.4.12 i686)\r\nAccept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*\r\nAccept-Encoding: gzip\r\nAccept-Language: en\r\nAccept-Charset: iso-8859-1,*,utf-8\r\n\r\n"; 
+syswrite(SOCK,"$header");
+$keep=1;
+while($keep) {
+        if(newdata(SOCK)) {
+                if(($data=<SOCK>)) {
+                        print "Read: ".$data;
+                }else {
+			$keep=0;
+                };
+        };
+};
+close(SOCK);
+
+socket(SOCK,AF_INET,SOCK_STREAM,6) or exit;
+print "query filled w 0's\n";
+<STDIN>;
+connect(SOCK,$saddr) or exit;
+print "Connected\n";
+$header="GET /teste?teste=".("\0"x1000000)." HTTP/1.0\r\nConnection: Keep-Alive\r\nUser-Agent: Mozilla/4.73 [en] (X11; U; Linux 2.4.12 i686)\r\nAccept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*\r\nAccept-Encoding: gzip\r\nAccept-Language: en\r\nAccept-Charset: iso-8859-1,*,utf-8\r\n\r\n"; 
+syswrite(SOCK,"$header");
+$keep=1;
+while($keep) {
+        if(newdata(SOCK)) {
+                if(($data=<SOCK>)) {
+                        print "Read: ".$data;
+                }else {
+			$keep=0;
+                };
+        };
+};
+close(SOCK);
+
+socket(SOCK,AF_INET,SOCK_STREAM,6) or print "Died";
+print "a post (foo)value with 10000000 bytes press (enter) to continue\n";
+<STDIN>;
+connect(SOCK,$saddr) or exit;
+print "Connected\n";
+$header="POST / HTTP/1.0\r\nConnection: Keep-Alive\r\nUser-Agent: Mozilla/4.73 [en] (X11; U; Linux 2.4.12 i686)\r\nHost: localhost:81\r\nAccept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*\r\nAccept-Encoding: gzip\r\nAccept-Language: en\r\nAccept-Charset: iso-8859-1,*,utf-8\r\n\r\ndev=teste".("\0"x1000000)."&teste=1\r\n\r\n"; #big values
+syswrite(SOCK,"$header");
+$keep=1;
+while($keep) {
+        if(newdata(SOCK)) {
+                if(($data=<SOCK>)) {
+                        print "Read: ".$data;
+                }else {
+			$keep=0;
+                };
+        };
+};
+
+print "--------- END --------\n"

+ 1 - 0
contrib/tools/myvc_install.bat

@@ -0,0 +1 @@
+copy ..\bin\libwebserver.lib "C:\Programas\Microsoft Visual Studio\VC98\Lib\libwebserver.lib"

+ 2 - 0
contrib/tools/win2unix.sh

@@ -0,0 +1,2 @@
+#!/bin/sh
+for i in `find . -name "*" -xtype f`; do echo "Messing with $i";cat $i |tr -d \\r >.1; mv .1 $i ; done

+ 445 - 0
doc/examples.html

@@ -0,0 +1,445 @@
+<center><H3><font color='007700'>libwebserver examples</font></H3></center><BR><BR>
+
+<!-- Johannes E. Schindelin -->
+<center><A name=helloworld><B><font color='000077'><a href=/hello><H3>Hello World</H3></a></font></B></center>
+<small> <B>used functions:</B><BR>
+<a href='/?help=functions#web_server_init'>web_server_init</a><BR>
+<a href='/?help=functions#web_server_addhandler'>web_server_addhandler</a><BR>
+<a href='/?help=functions#web_server_run'>web_server_run</a><BR>
+</small><BR>
+
+This example starts the server with one handler for all requests pointing to hello_world()
+that prints the content-type with the end of the header "\r\n\r\n" and one simple printf with Hello world<BR><BR>
+
+<TABLE width='100%' bgcolor='CFCFCF' border=0><TR><TD>
+<CODE><PRE>
+#include "web_server.h"
+#include &lt;stdio.h&gt;
+
+
+void hello_world() {
+	printf("Content-type: text/plain\r\n\r\n");
+	printf("Hello, World!\r\n");
+}
+
+int main(int argc,char** argv) {
+        struct web_server server; // server handler
+        if(!web_server_init(&server,80,"help.log",0)) { // initialize and start the server at port 80, logging to help.log
+                fprintf(stderr,"can't open listen socket\n");
+		return 1;
+        };
+
+        web_server_addhandler(&server,"* *",hello_world,0); // add handler for all requests
+        while(1) {
+                web_server_run(&server);   // run server
+        };
+}
+</PRE></CODE>
+</TD></TR></TABLE>
+<HR><BR>
+
+<center><A name=logfile><B><font color='000077'><a href='/log'><H3>logfile</H3></a></font></B></center>
+<small> <B>used functions:</B><BR>
+<a href='/?help=functions#web_server_init'>web_server_init</a><BR>
+<a href='/?help=functions#web_server_addhandler'>web_server_addhandler</a><BR>
+<a href='/?help=functions#web_server_run'>web_server_run</a><BR>
+<a href='/?help=functions#web_client_addfile'>web_client_addfile</a><BR>
+</small><BR>
+
+This example uses the function <a href='/?help=functions#web_client_addfile'>web_client_addfile</a> to send a file to client
+<BR><BR>
+<TABLE width='100%' bgcolor='CFCFCF' border=0><TR><TD>
+<CODE><PRE>
+#include "web_server.h"
+#include &lt;stdio.h&gt;
+
+void logfile() {
+        printf("Content-type: text/plain\r\n\r\n");
+        web_client_addfile(server.logfile); // add help.log file to output
+        printf("End of log\n");
+};
+        
+
+main() {
+        struct web_server server; // server handler
+        if(!web_server_init(&server,82,"help.log",0)) { // initializate
+                fprintf(stderr,"can't open listen socket\n");
+        };
+
+        web_server_addhandler(&server,"* /log",logfile,0); // add handler for http://host/log requests
+        while(1) {
+                web_server_run(&server);   // run server
+        };
+};
+</PRE></CODE>
+</TD></TR></TABLE>
+<HR><BR>
+
+
+<center><A name=imageup><B><font color='000077'><a href='/image'><H3>Image Uploader</H3></a></font></B></center>
+<small> <B>used functions:</B><BR>
+<a href='/?help=functions#web_server_init'>web_server_init</a><BR>
+<a href='/?help=functions#web_server_addhandler'>web_server_addhandler</a><BR>
+<a href='/?help=functions#web_server_run'>web_server_run</a><BR>
+<a href='/?help=functions#clientinfo'>ClientInfo</a><BR>
+</small><BR>
+
+
+This example uses the struct <a href='/?help=functions#clientinfo'>ClientInfo</a> for fetching the input from the client
+using the Query("img") to send the image <BR>
+and multipart for fetching the uploaded file<BR>
+
+
+<BR><BR>
+<TABLE width='100%' bgcolor='CFCFCF' border=0><TR><TD>
+<CODE><PRE>
+#include "web_server.h"
+                
+#include &lt;stdlib.h&gt;
+        
+struct image {
+	char *data;
+	size_t size;
+} image={NULL,0};
+
+void imageout() {
+	if(strlen(ClientInfo->Query("img"))) {
+		if(image.data!=NULL) {
+			printf("Content-type: image/jpeg\r\n\r\n");
+			fwrite(image.data,image.size,1,stdout);
+		};
+		return;
+	};
+	printf("Content-type: text/html\r\n\r\n");
+	printf("&lt;HTML&gt;\n");
+	printf("&lt;BODY bgcolor='EFEFEF'&gt;\n");        
+	printf("&lt;form action='/' enctype='multipart/form-data'&gt;\n");
+	printf("&lt;input type=file name=image&gt;&lt;BR&gt;\n");
+	printf("&lt;/form&gt;\n");
+	if(strlen(ClientInfo->MultiPart("image").data)) {
+		printf("%s&lt;BR&gt;&lt;img src='/?img=%s.jpg'&gt;\n",ClientInfo->MultiPart("image").filename,ClientInfo->MultiPart("image").filename);
+		free(image.data);
+		image.data=malloc(ClientInfo->MultiPart("image").size+1);
+		memcpy(image.data,ClientInfo->MultiPart("image").data,ClientInfo->MultiPart("image").size);
+		image.size=ClientInfo->MultiPart("image").size;
+	}else {
+		free(image.data);
+		image.data=NULL;
+	};
+	printf("&lt;/BODY&gt;\n");
+	printf("&lt;/HTML&gt;\n");
+};
+
+
+
+main() {
+	struct web_server server;
+	if(!web_server_init(&server,80,"teste.log",0)) {
+		fprintf(stderr,"can't open listen socket\n");
+	};
+	web_server_addhandler(&server,"* /",imageout,0);
+	while(1) {
+		web_server_run(&server);
+	};
+};
+</PRE></CODE>
+</TD></TR></TABLE>
+<HR><BR>
+
+
+<center><A name=auth><B><font color='000077'><a href='/auth'><H3>Authentication</H3></a> </font></B></center>
+<small> <B>used functions:</B><BR>
+<a href='/?help=functions#web_server_init'>web_server_init</a><BR>
+<a href='/?help=functions#web_server_addhandler'>web_server_addhandler</a><BR>
+<a href='/?help=functions#web_server_run'>web_server_run</a><BR>
+<a href='/?help=functions#web_client_HTTPdirective'>web_client_HTTPdirective</a><BR>
+</small><BR>
+
+Here we're using the <a href='/?help=functions#web_client_HTTPdirective'>web_client_HTTPdirective</a> to set up the server response
+
+<BR><BR>
+user: "username", pass: "password"
+<BR>
+<TABLE width='100%' bgcolor='CFCFCF' border=0><TR><TD>
+<CODE><PRE>
+#include "web_server.h"
+#include &lt;stdio.h&gt;
+#include &lt;string.h&gt;
+
+
+void urlauthenticate() {
+        if(!strlen(ClientInfo->user) || !strlen(ClientInfo->pass) &&
+            strcmp(ClientInfo->user,"username") || strcmp(ClientInfo->pass,"password")) { // you can read things from a auth file
+                web_client_HTTPdirective("HTTP/1.1 401 Authorization Required");
+                printf("WWW-Authenticate: Basic realm=\"This site info\"\r\n");
+                printf("Content-type: text/html\r\n\r\n");
+                printf("&lt;BODY&gt;\n");
+                printf("&lt;font color='FF0000'&gt;Access denied&lt;/font&gt;\n");
+                printf("&lt;/BODY&gt;\n");
+                return;
+        }
+        printf("Content-type: text/html\r\n\r\n");         
+        printf("&lt;BODY bgcolor='EFEFEF'&gt;\n");        
+        printf("You entered in your area\n");
+        printf("&lt;/BODY&gt;&lt;/HTML&gt;\n");
+};
+
+
+main() {
+        struct web_server server; // server handler
+        if(!web_server_init(&server,83,"help.log",0)) { // initialize
+                fprintf(stderr,"can't open listen socket\n");
+        };
+
+        web_server_addhandler(&server,"* /auth",urlauthenticate,0);
+        while(1) {
+                web_server_run(&server);   // run server
+        };
+};
+</PRE></CODE>
+</TD></TR></TABLE>
+<HR><BR>
+
+
+<CENTER><A name=ssl><B><font color='000077'><H3>openssl for (https)</H3></font></B></CENTER>
+<small> <B>used functions:</B><BR>
+<a href='/?help=functions#web_server_HTTPdirective'>web_server_useSSLcert</a><BR>
+<a href='/?help=functions#web_server_init'>web_server_init</a><BR>
+<a href='/?help=functions#web_server_run'>web_server_run</a><BR>
+</small><BR>
+
+Here we setup a server and we use the <a href='/?help=functions#web_server_useSSLcert'>web_server_useSSLcert</a> to use specific certificate file
+and we start the server with the flag WS_USESSL for secure connections (libwebserver compiled w/ openssl)<BR><BR>
+
+See also the packetmounter example in the example directory. 
+<BR>
+<TABLE width='100%' bgcolor='CFCFCF' border=0><TR><TD>
+<CODE><PRE>
+
+  
+#include "web_server.h"
+
+int main()
+        struct web_server serverssl;
+        web_server_useSSLcert(&serverssl,"foo-cert.pem"); // Certificate file    
+        if(!web_server_init(&serverssl,443,"help.log",WS_USESSL)) {
+                fprintf(stderr,"Cannot open port\n");
+        };
+        while(1) {
+                web_server_run(&serverssl);
+        };
+};
+</PRE></CODE>
+</TD></TR></TABLE>
+All the rest is the same as without SSL. 
+<HR><BR>
+
+
+<center><A name=outgif><B><font color='000077'><a href='/gif'><H3>Gif generator</H3></a></font></B></center>
+<small> <B>used functions;</B><BR>
+<a href='/?help=functions#web_server_init'>web_server_init</a><BR>
+<a href='/?help=functions#web_server_addhandler'>web_server_addhandler</a><BR>
+<a href='/?help=functions#web_server_run'>web_server_run</a><BR>
+<a href='/?help=functions#web_client_gifsetpalette'>web_client_gifsetpalette</a><BR>
+<a href='/?help=functions#web_client_gifoutput'>web_client_gifoutput</a><BR>
+<a href='/?help=functions#clientinfo'>ClientInfo</a><BR>
+</small><BR>
+
+This example draws an circle at x,y requested by client, and outputs with function <a href='/?help=functions#web_client_gifoutput'>web_client_gifoutput</a>
+
+
+<BR><BR>
+<TABLE width='100%' bgcolor='CFCFCF' border=0><TR><TD>
+<CODE><PRE>
+#include "web_server.h"
+#include &lt;stdio.h&gt;
+#include &lt;math.h&gt;
+
+
+#define GIFSIDE 320
+char gifdata[GIFSIDE*GIFSIDE];
+void outgif() {
+	float i;
+	int x,y,xc,yc;
+	int color;
+	web_client_gifsetpalette("EGA");
+	if(*ClientInfo->Query("img")!=0) {
+		printf("Content-type: image/gif\r\n\r\n");
+		if(!strcmp(ClientInfo->Query("img"),"circle")) {
+			xc=atoi(ClientInfo->Query("x"))%GIFSIDE;
+			yc=atoi(ClientInfo->Query("y"))%GIFSIDE;
+			color=(rand()%15)+1;
+			for(i=0;i<6.28;i+=0.01) {
+				x=(int)(GIFSIDE+(xc+cos(i)*10))%GIFSIDE;
+				y=(int)(GIFSIDE+(yc+sin(i)*10))%GIFSIDE;
+				gifdata[x+(y*GIFSIDE)]=color;
+			};
+		};
+		web_client_gifoutput(gifdata,GIFSIDE,GIFSIDE);
+	};
+	printf("&lt;center&gt;Generated a circle (click inside the image)&lt;BR&gt;\n");
+	printf("Pressed x=%s,y=%s&lt;BR&gt;\n",ClientInfo->Query("x"),ClientInfo->Query("y"));
+	printf("&lt;form&gt;&lt;input type=image border=0 src='/gif?img=circle&x=%s&y=%s'&gt;&lt;/form&gt;&lt;/CENTER&gt;\n",ClientInfo->Query("x"),ClientInfo->Query("y"));
+};
+
+
+main() {
+	struct web_server server; // server handler
+	memset(gifdata,0,GIFSIDE*GIFSIDE);
+	if(!web_server_init(&server,83,"help.log",0)) { // initialize
+		fprintf(stderr,"can't open listen socket\n");
+	};
+
+	web_server_addhandler(&server,"* /gif",outgif,0);
+	while(1) {
+		web_server_run(&server);   // run server
+	};
+};
+</PRE></CODE>
+</TD></TR></TABLE>
+<HR><BR>
+
+
+
+<CENTER><A name=cookie><B><font color='000077'><a href=/cookie><H3>Cookies</H3></a></font></B></CENTER>
+<small> <B>used functions;</B><BR>
+<a href='/?help=functions#web_server_init'>web_server_init</a><BR>
+<a href='/?help=functions#web_server_addhandler'>web_server_addhandler</a><BR>
+<a href='/?help=functions#web_server_run'>web_server_run</a><BR>
+<a href='/?help=functions#clientinfo'>ClientInfo</a><BR>
+<a href='/?help=functions#web_client_setcookie'>web_client_setcookie</a><BR>
+</small><BR>
+
+This example fetchs an client input and set's an cookie for 15 minutes "+15M" using function <a href='/?help=functions#web_client_setcookie'>web_client_setcookie</a>
+
+<BR><BR>
+<TABLE width='100%' bgcolor='CFCFCF' border=0><TR><TD>
+<CODE><PRE>
+#include "web_server.h"
+#include &lt;stdio.h&gt;
+
+
+void cookie() {
+	if(strlen(ClientInfo->Post("user")))
+		web_client_setcookie("username",ClientInfo->Post("user"),"+15M");
+	printf("Content-type: text/html\r\n\r\n");
+	printf("&lt;form method='POST'&gt;\r\n");
+	printf("&lt;input type='text' name='user' value='%s'&gt;\r\n&lt;BR&gt;",ClientInfo->Cookie("username"));
+	printf("&lt;input type='submit' name='send' value=' GO! '&gt;\r\n&lt;BR&gt;");
+	printf("&lt;/form&gt;\r\n");
+}
+
+int main(int argc,char** argv) {
+        struct web_server server; // server handler
+        if(!web_server_init(&server,80,"help.log",0)) { // initialize
+                fprintf(stderr,"can't open listen socket\n");
+		return 1;
+        };
+
+        web_server_addhandler(&server,"* /*",cookie,0); // add handler for all requests
+        while(1) {
+                web_server_run(&server);   // run server
+        };
+}
+
+</PRE></CODE>
+</TD></TR></TABLE>
+<HR><BR>
+
+<center><A name=checkbox><B><font color='000077'><a href=/checkbox><H3>Checkbox</H3></a></font></B></center>
+<small> <B>used functions;</B><BR>
+<a href='/?help=functions#web_server_init'>web_server_init</a><BR>
+<a href='/?help=functions#web_server_addhandler'>web_server_addhandler</a><BR>
+<a href='/?help=functions#web_server_run'>web_server_run</a><BR>
+<a href='/?help=functions#clientinfo'>ClientInfo</a><BR>
+</small><BR>
+
+This example uses a especific case from <a href='/?help=functions#clientinfo'>ClientInfo</a> query and post, using the '#' as prefix of varname returning the number of occurences
+
+
+<BR><BR>
+<TABLE width='100%' bgcolor='CFCFCF' border=0><TR><TD>
+<CODE><PRE>
+
+#include "web_server.h"
+#include &lt;stdio.h&gt;
+
+
+void checkbox() {
+	int i=0;
+	char *txt[]={"one","two","three","four","five"};
+	printf("Content-type: text/html\r\n\r\n");
+	printf("&lt;form method='QUERY'&gt;\r\n");
+	
+	for(i=0;i<5;i++) {	
+		printf("&lt;input type='checkbox' name='number' value='%s'&gt;\r\n&lt;BR&gt;",txt[i]);	
+	};
+	printf("&lt;input type='submit' name='send' value=' SEND '&gt;\r\n&lt;BR&gt;");
+	printf("&lt;/form&gt;\r\n");
+	
+	printf("You have choosen &lt;font color='FF0000'&gt;%d&lt;/font&gt; numbers: \r\n",ClientInfo->Query("#number"));
+	for(i=0;i&lt;ClientInfo->Query("#number");i++) {	
+		printf("&lt;b>%s&lt;/b&gt;,\r\n\r\n",ClientInfo->Query("number"));
+	};
+	printf("...&lt;BR&gt;\r\n\r\n");
+	
+}
+int main(int argc,char** argv) {
+        struct web_server server; // server handler
+        if(!web_server_init(&server,80,"help.log",0)) { // initialize
+                fprintf(stderr,"can't open listen socket\n");
+		return 1;
+        };
+
+        web_server_addhandler(&server,"* /*",checkbox,0); // add handler for all requests
+        while(1) {
+                web_server_run(&server);   // run server
+        };
+}
+
+</PRE></CODE>
+</TD></TR></TABLE>
+<HR><BR>
+
+<center><A name=confexample><B><font color='000077'><a href=/confexample><H3>Config example</H3></a></font></B></center>
+<small> <B>used functions;</B><BR>
+<a href='/?help=functions#web_server_init'>web_server_init</a><BR>
+<a href='/?help=functions#web_server_addhandler'>web_server_addhandler</a><BR>
+<a href='/?help=functions#web_server_run'>web_server_run</a><BR>
+<a href='/?help=functions#web_client_addfile'>web_client_addfile</a><BR>
+<a href='/?help=functions#clientinfo'>ClientInfo</a><BR>
+</small><BR>
+
+
+<BR><BR>
+<TABLE width='100%' bgcolor='CFCFCF' border=0><TR><TD>
+<CODE><PRE>
+#include "web_server.h"
+#include &lt;stdio.h&gt;
+
+
+void confexample() {
+	printf("Content-type: text/html\r\n\r\n");
+	printf("&lt;PRE&gt;");
+	web_client_addfile(server.conffile); // add help.cfg file to output	
+	printf("&lt;/PRE&gt;");
+	printf("ClientInfo->Conf(\"PERSONAL_CONF\",\"PORT\")=%s&lt;BR&gt;\n",ClientInfo->Conf("PERSONAL_CONF","PORT"));
+	printf("ClientInfo->Conf(\"PERSONAL_CONF\",\"IP\")=%s&lt;BR&gt;\n",ClientInfo->Conf("PERSONAL_CONF","IP"));
+	printf("ClientInfo->Conf(\"LIBWEBSERVER\",\"PORT\")=%s&lt;BR&gt;\n",ClientInfo->Conf("LIBWEBSERVER","PORT"));
+	
+}
+
+int main(int argc,char** argv) {
+        struct web_server server; // server handler
+        if(!web_server_init(&server,80,"help.cfg",WS_USEEXTCONF)) { // initialize
+                fprintf(stderr,"can't open listen socket\n");
+		return 1;
+        };
+
+        web_server_addhandler(&server,"* *",confexample,0); // add handler for all requests
+        while(1) {
+                web_server_run(&server);   // run server
+        };
+}
+</PRE></CODE>
+</TD></TR></TABLE>

+ 24 - 0
doc/examples/SoundRecorder/include/debug.h

@@ -0,0 +1,24 @@
+/* by Luis Figueiredo ([email protected])
+ *
+ *
+ * date: Sat Mar 30 14:16:05 GMT 2002
+ *
+ * 	DEBUG macros
+ *
+ */
+
+#ifndef _DEBUG_H_
+#define _DEBUG_H_
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif         
+
+#ifdef DEBUG
+	#define IFDEBUG(x) x
+#else
+	#define IFDEBUG(x)
+#endif
+
+
+#endif

+ 39 - 0
doc/examples/SoundRecorder/include/soundbuffers.h

@@ -0,0 +1,39 @@
+/* by Luis Figueiredo ([email protected])
+ *
+ * file: sound_buffers.h
+ *
+ * description: Holds sound data structures and functions
+ *
+ * date: 13:14,29-14-2002
+ */
+
+#ifndef _SOUND_BUFFERS_H_ 
+#define _SOUND_BUFFERS_H_
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+
+struct sound_buf {
+	char *id;
+	unsigned char *data;
+	unsigned int data_i;
+	unsigned int play_i;
+	unsigned int startloop,endloop;
+	unsigned char volume;
+	unsigned char channels;
+	int mode;
+	struct sound_buf *next;
+};
+
+
+struct sound_buf *sbuf_init();
+struct sound_buf *sbuf_add(struct sound_buf *list,char *id);
+struct sound_buf *sbuf_select(struct sound_buf *list,char *id);
+int sbuf_delete(struct sound_buf *list,char *id);
+
+
+	
+
+#endif

+ 31 - 0
doc/examples/SoundRecorder/include/soundcard.h

@@ -0,0 +1,31 @@
+/* by Luis Figueiredo ([email protected])
+ *
+ * file: soundcard.h
+ *
+ * description: handlers soundcard setup
+ *
+ * date: 17:00,13-00-2002
+ */
+
+#ifndef _SOUNDCARD_H_ 
+#define _SOUNDCARD_H_
+
+#include <fcntl.h>
+#include <sys/soundcard.h>
+#include <stdio.h>
+#include <sys/ioctl.h>
+
+#include "debug.h"
+
+struct soundcard_setup {
+        int rate;
+        char channels;
+        int fmt;
+};
+
+int soundcard_init(const char *, struct soundcard_setup *);
+
+
+
+
+#endif

+ 23 - 0
doc/examples/SoundRecorder/include/soundmixer.h

@@ -0,0 +1,23 @@
+/* by Luis Figueiredo ([email protected])
+ *
+ * file: soundmixer.h
+ *
+ * description: Sound mixer using (soundbuffers.c)
+ *
+ * date: 17:13,13-13-2002
+ */
+
+#ifndef _SOUNDMIXER_H_ 
+#define _SOUNDMIXER_H_
+
+#include <stdio.h>
+#include <unistd.h>
+
+
+#include "soundbuffers.h"
+
+#define _SDMAX 44100 // quarter second *2 *2
+
+void sound_process(int soundfd,struct sound_buf *list);
+
+#endif

+ 296 - 0
doc/examples/SoundRecorder/src/main.c

@@ -0,0 +1,296 @@
+/* by Luis Figueiredo ([email protected])
+ *
+ * file: main.c
+ *
+ * description: Programa main
+ *
+ * date: 16:47,13-47-2002
+ */
+
+
+#include "soundcard.h"
+#include "soundbuffers.h"
+#include "soundmixer.h"
+#include "web_server.h"
+#include <signal.h>
+
+#define ADJUST_VOLUME(s, v)     (s = (s*v)/128)
+
+int PORT=80;
+struct sound_buf *SoundBuf;
+
+void outgif() {
+	char *nam;
+	struct sound_buf *sbuf=NULL;
+	char gif[640*40+1];
+	int x=0,y=0;
+	int i,h=20;
+	short d;
+	nam=malloc(strlen(ClientInfo->request)-3);
+	memcpy(nam,ClientInfo->request+1,strlen(ClientInfo->request)-4);
+	nam[strlen(ClientInfo->request)-5]=0;
+	sbuf=sbuf_select(SoundBuf,nam);
+	if(sbuf!=NULL) {
+		if(sbuf->data_i>_SDMAX) {
+			if(gif!=NULL) {
+				memset(gif,0,640*40);
+				for(i=0;i<1280;i++) {
+					x=i/2;
+					//y=(*((unsigned short *)sbuf->data+((i*4)%640))%20)+10;
+					d=((sbuf->data[((i*((sbuf->data_i-1280)/2560))*2)+1]<<8)|sbuf->data[((i*((sbuf->data_i-1280)/2560))*2)]);
+					y=d/(32767/20)+20;
+					//fprintf(stderr,"y=%d\n",y);
+					//gif[x+y*640]=10;
+					if(h>y) {
+						for(h=20;h>y;h--) gif[x+h*640]=10;
+					} else {
+						for(h=20;h<=y;h++) gif[x+h*640]=10;
+					};
+
+				};
+				printf("Cache-control: no-cache\r\n");
+				printf("Content-type: image/gif\r\n\r\n");
+				web_client_gifoutput(gif,640,40,0);
+			};
+		};
+	};
+	free(nam);
+	return;
+};
+void dlbuf() {
+	char *nam;
+	struct sound_buf *sbuf=NULL;
+	nam=malloc(strlen(ClientInfo->request)-3);
+	memcpy(nam,ClientInfo->request+1,strlen(ClientInfo->request)-4);
+	nam[strlen(ClientInfo->request)-5]=0;
+	sbuf=sbuf_select(SoundBuf,nam);
+	printf("Content-type: x-form/application\r\n\r\n");
+	if(sbuf!=NULL) {
+		fwrite(sbuf->data,sbuf->data_i,1,stdout);
+	};
+
+};
+
+void index_html() {
+	struct sound_buf *sbuf=NULL;
+	char *id;
+	char *tmp;
+	int i;
+	unsigned char *soundout=NULL;
+	short src1,src2;
+	int dst_sample;
+	const int max_audioval =((1<<(16-1))-1);
+	const int min_audioval =-(1<<(16-1));
+	int bigger=0;
+					
+	printf("Cache-control: no-cache\r\n");
+	printf("Content-type: text/html\r\n\r\n");
+	printf("<HTML>\n");
+	printf("<BODY>\n");
+	printf("<center>Sound Recorder (webgui)</center>\n");
+	if(*ClientInfo->Post("sbufnew")!=0) {
+		if(*ClientInfo->Post("sbufname")!=0) {
+			if(!sbuf_select(SoundBuf,ClientInfo->Post("sbufname"))) {
+				sbuf=sbuf_add(SoundBuf,ClientInfo->Post("sbufname"));
+				if(ClientInfo->MultiPart("sbufdata").size>0) {
+					sbuf->data=malloc(ClientInfo->MultiPart("sbufdata").size);
+					memcpy(sbuf->data,ClientInfo->MultiPart("sbufdata").data,ClientInfo->MultiPart("sbufdata").size);
+					sbuf->data_i=ClientInfo->MultiPart("sbufdata").size;
+				};
+			} else {
+				printf("<FONT color='FF0000'>Sound buffer exists</font>\n");
+			};
+
+		}else {
+			printf("<FONT color='FF0000'>Sound buffer name is empty</font>\n");
+		};
+	};
+	if(*ClientInfo->Post("sbufvol")!=0) {
+		sbuf=SoundBuf->next;
+		while(sbuf!=NULL) {
+			tmp=malloc(strlen(sbuf->id)+5);
+			snprintf(tmp,strlen(sbuf->id)+5,"%s.vol",sbuf->id);
+			sbuf->volume=atoi(ClientInfo->Post(tmp))%129;
+			free(tmp);
+			sbuf=sbuf->next;
+		}
+	};
+	if(*ClientInfo->Post("sbufch")!=0) {
+		sbuf=SoundBuf->next;
+		while(sbuf!=NULL) {
+			tmp=malloc(strlen(sbuf->id)+4);
+			snprintf(tmp,strlen(sbuf->id)+4,"%s.ch",sbuf->id);
+			sbuf->channels=atoi(ClientInfo->Post(tmp))%3;
+			free(tmp);
+			sbuf=sbuf->next;
+		}
+	};
+
+	printf("<form method='POST' enctype='multipart/form-data'>\n");
+
+	printf("Sound Buffer:<BR>\n");
+	printf("Name:<input type=text name='sbufname' size=5 maxlength=10><BR>\n");
+	printf("Data:<input type=file name='sbufdata'><BR>\n");
+	printf("<input type=submit name='sbufnew' value=' New '><BR>\n");
+
+	printf("<table width=100%% cellpadding=2 cellspacing=0 bgcolor='AAAAAA'>\n");
+	printf("<TR><TD colspan=7 align=center><font face='Helvetica' size=6 color='FFFFFF'> Sound Buffers </font></TD></TR>\n");
+	sbuf=SoundBuf->next;
+	i=0;
+	while(sbuf!=NULL) {
+		if(*ClientInfo->Post("sbufprocess")!=0) {
+			if(atoi(ClientInfo->Post(sbuf->id))==5) {
+				sbuf->mode=0;
+				sbuf->play_i=0;
+				if(sbuf->data_i>bigger) {
+					bigger=sbuf->data_i;
+					 soundout=realloc(soundout,bigger);
+				};
+				for(i=0;i<sbuf->data_i;i+=4) {
+					// LEFT
+					src1=((sbuf->data[i+1]<<8) | sbuf->data[i]);
+					ADJUST_VOLUME(src1,sbuf->volume);
+					src2=((soundout[i+1]<<8) | soundout[i]);
+					dst_sample=src1+src2;
+					if ( dst_sample > max_audioval ) {
+						dst_sample = max_audioval;
+					} else if ( dst_sample < min_audioval ) {
+						dst_sample = min_audioval;
+					}
+					soundout[i]=dst_sample &0xFF;
+					dst_sample>>=8;
+					soundout[i+1]=dst_sample & 0xFF;
+					// RIGHT
+					src1=((sbuf->data[i+1+2]<<8) | sbuf->data[i+2]);
+					ADJUST_VOLUME(src1,sbuf->volume);
+					if(sbuf->channels==2) {
+						src2=((soundout[i+1+2]<<8) | soundout[i+2]); // join left to right
+					} else {
+						src2=((soundout[i+1]<<8) | soundout[i]); // separate
+					};
+					dst_sample=src1+src2;
+					if ( dst_sample > max_audioval ) {
+						dst_sample = max_audioval;
+					} else if ( dst_sample < min_audioval ) {
+						dst_sample = min_audioval;
+					}
+					soundout[i+2]=dst_sample &0xFF;
+					dst_sample>>=8;
+					soundout[i+2+1]=dst_sample & 0xFF;
+				};
+
+			} else {
+				sbuf->mode=atoi(ClientInfo->Post(sbuf->id));
+				tmp=malloc(strlen(sbuf->id)+5);
+				snprintf(tmp,strlen(sbuf->id)+5,"%s.vol",sbuf->id);
+				sbuf->volume=atoi(ClientInfo->Post(tmp))%129;
+				free(tmp);
+				sbuf->play_i=0;
+			};
+		};
+		if(sbuf->mode!=4) {
+			printf("<TR><TD bgcolor='EFEFEF'><font face='Verdana'>%s</font></TD><TD>",sbuf->id);
+			printf("<select name='%s'>",sbuf->id);
+			printf("<option value='0' %s>none</option>\n",(atoi(ClientInfo->Post(sbuf->id))==0)?"selected":"");
+			printf("<option value='1' %s>play</option>\n",(atoi(ClientInfo->Post(sbuf->id))==1)?"selected":"");
+			printf("<option value='2' %s>record</option>\n",(atoi(ClientInfo->Post(sbuf->id))==2)?"selected":"");
+			printf("<option value='3'>reset</option>\n");
+			printf("<option value='4'>delete</option>\n");
+			printf("<option value='5'>mixfrom</option>\n");
+			printf("<option value='6'>mixto</option>\n");
+			printf("</select>\n");
+			printf("</TD><TD>%dm:%ds</TD>",(sbuf->data_i/44100/2/2)/60,(sbuf->data_i/44100/2/2%60));
+			printf("</TD><TD>\n");
+			printf("<select name='%s.ch'>\n",sbuf->id);
+			printf("<option value='1' %s>Mono</option>\n",(sbuf->channels==1)?"selected":"");
+			printf("<option value='2' %s>Stereo</option>\n",(sbuf->channels==2)?"selected":"");
+			printf("</select></TD>");
+			
+			printf("</TD><TD>Volume:<BR>\n");
+			printf("<input type=text name=%s.vol size=3 maxlength=3 value='%d'></TD>",sbuf->id,sbuf->volume);
+			printf("<TD width=100%%> <input type=image width=100%% height=40 src='/%s.gif' border=0></TD>\n",sbuf->id);
+			printf("<TD><a href='/%s.raw'>Download</a></TD></TR>\n",sbuf->id);
+		}
+		if(sbuf->mode==3) {
+			sbuf->data_i=0;
+			sbuf->play_i=0;
+			free(sbuf->data);
+			sbuf->data=NULL;
+			sbuf->mode=0;
+		};
+
+		id=sbuf->id;	
+		sbuf=sbuf->next;
+		if(atoi(ClientInfo->Post(id))==4) {
+			sbuf_delete(SoundBuf,id);
+		}
+		i++;
+	};
+	// mix to (6)
+	sbuf=SoundBuf->next;
+	while(sbuf!=NULL) {
+		if(atoi(ClientInfo->Post(sbuf->id))==6) {
+			free(sbuf->data); // free previous
+			sbuf->data=malloc(bigger+1);
+			memcpy(sbuf->data,soundout,bigger);
+			sbuf->data_i=bigger;
+			sbuf->mode=0;
+			sbuf->play_i=0;
+			sbuf->volume=128;
+		};
+		sbuf=sbuf->next;
+	};
+	if(i) printf("<TR><TD align=center valign=center>.</TD><TD><input type=submit name='sbufprocess' value=' Process '></TD><TD align=center valign=center>.</TD><TD><input type=submit name='sbufch' value='Set'></TD><TD><input type=submit name='sbufvol' value='Set'></TD><TD>.</TD><TD>.</TD></TR>\n");
+
+	printf("</TABLE>\n");
+	printf("</form>\n");
+
+
+
+
+
+
+};
+
+
+
+
+
+
+
+
+
+
+int main() {
+	struct web_server server;
+	int soundfd;
+	struct soundcard_setup SoundSetup;
+	signal(SIGPIPE,SIG_IGN);	
+	
+	SoundBuf=sbuf_init();	
+	
+	
+	SoundSetup.rate=44100;
+	SoundSetup.channels=2;
+	SoundSetup.fmt=16;	
+	
+	soundfd=soundcard_init("/dev/dsp",&SoundSetup);
+	if(soundfd<1) {
+		return 0;
+	};
+	
+	
+	while(!web_server_init(&server,PORT,NULL,0))PORT++;
+	printf("http://localhost:%d\n",PORT);
+
+	web_server_addhandler(&server,"* /*.gif",outgif,WS_LOCAL);
+	web_server_addhandler(&server,"* /*.raw",dlbuf,WS_LOCAL);
+	web_server_addhandler(&server,"* /*",index_html,WS_LOCAL);
+
+	while(1) {
+		sound_process(soundfd,SoundBuf);
+		web_server_run(&server);
+	};
+
+
+};

+ 86 - 0
doc/examples/SoundRecorder/src/soundbuffers.c

@@ -0,0 +1,86 @@
+/* by Luis Figueiredo ([email protected])
+ *
+ * file: sound_buffers.c
+ *
+ * description: Sounddata procedures
+ *
+ * date: 13:23,29-23-2002
+ */
+
+#include "soundbuffers.h"
+
+
+/*
+ * init list
+ */
+struct sound_buf *sbuf_init() {
+	struct sound_buf *head;
+	head=malloc(sizeof(struct sound_buf));
+	head->next=NULL;
+	head->data_i=0;
+	head->data=NULL;
+	head->id=NULL;
+	return head;
+};
+
+struct sound_buf *sbuf_select(struct sound_buf *list,char *id) {
+	struct sound_buf *temp=list;
+	while(temp->next!=NULL) {
+		if(temp->next->id!=NULL) {
+			if(!strcmp(temp->next->id,id)) {
+				return temp->next;
+			};
+		};
+		temp=temp->next;
+	};
+	return NULL;
+};
+
+
+/*
+ * next prototipe go to select_buffer
+ */
+struct sound_buf *sbuf_add(struct sound_buf *list,char *id) {
+	struct sound_buf *temp=list;
+	while(temp->next!=NULL) {
+		if(temp->next->id!=NULL) {
+			if(!strcmp(temp->next->id,id)) {
+				return NULL;
+			};
+			temp=temp->next; // Next buffer
+		};
+	};
+	// id is new lets create this buffer
+	temp->next=malloc(sizeof(struct sound_buf));
+	// lets copy the new id	
+	temp->next->id=malloc(strlen(id)+1);
+	strncpy(temp->next->id,id,strlen(id));
+	temp->next->id[strlen(id)]=0;
+	// zero the rest;
+	temp->next->data=NULL;
+	temp->next->data_i=0;
+	temp->next->play_i=0;
+	temp->next->mode=0;
+	temp->next->volume=128;
+	temp->next->next=NULL;
+	return temp->next;
+};
+
+int sbuf_delete(struct sound_buf *list,char *id) {
+	struct sound_buf *temp=list;
+	struct sound_buf *t;
+	while(temp->next!=NULL) {
+		if(temp->next->id!=NULL) {
+			if(!strcmp(temp->next->id,id)) {
+				t=temp->next;
+				temp->next=temp->next->next;
+				free(t->data);
+				free(t->id);
+				free(t);
+				return 1;
+			};
+		};
+		temp=temp->next;
+	};
+	return 0;
+};

+ 49 - 0
doc/examples/SoundRecorder/src/soundcard.c

@@ -0,0 +1,49 @@
+/* by Luis Figueiredo ([email protected])
+ *
+ * file: soundcard.c
+ *
+ * description: handlers soundcard setup
+ *
+ * date: 17:00,13-00-2002
+ */
+
+#include "soundcard.h"
+
+
+
+
+
+
+int soundcard_init(const char *dev, struct soundcard_setup *ss) {
+        int ret;
+	int soundfd;
+	soundfd=open(dev,O_RDWR|O_NONBLOCK);
+	if(soundfd <1) {
+		perror("open");
+		return -1;
+	}
+        IFDEBUG(fprintf(stderr,"soundcard.c: Setting soundcard:\n"));
+        IFDEBUG(fprintf(stderr,"soundcard.c: rate: %d\n",ss->rate));
+        ret=ioctl(soundfd,SNDCTL_DSP_SPEED,&ss->rate);
+        if(ret==-1) {
+                perror("ioctl");
+                return-1 ;
+        };
+        IFDEBUG(fprintf(stderr,"soundcard.c: channels: %d\n",ss->channels));
+        ret=ioctl(soundfd,SNDCTL_DSP_CHANNELS,&ss->channels);
+        if(ret==-1) {
+                perror("ioctl");
+                return -1;
+        };
+        IFDEBUG(fprintf(stderr,"soundcard.c: fmt %d\n",ss->fmt));
+        ret=ioctl(soundfd,SNDCTL_DSP_SETFMT,&ss->fmt);
+        if(ret==-1) {
+                perror("ioctl");
+                return -1;
+        };
+        IFDEBUG(fprintf(stderr,"Sound card setup sucessfull\n"));
+	return soundfd;
+};
+
+
+

+ 104 - 0
doc/examples/SoundRecorder/src/soundmixer.c

@@ -0,0 +1,104 @@
+/* by Luis Figueiredo ([email protected])
+ *
+ * file: soundmixer.c
+ *
+ * description: Sound mixer using (soundbuffers.c)
+ *
+ * date: 17:13,13-13-2002
+ */
+
+
+#include "soundmixer.h"
+
+
+int SDMAX=_SDMAX;
+#define ADJUST_VOLUME(s, v)     (s = (s*v)/128)
+
+int soundout_i=-1;
+void sound_process(int soundfd,struct sound_buf *list) {
+	int soundin_i;
+	struct sound_buf *sbuf;
+	unsigned char soundin[_SDMAX+1];
+	unsigned char soundout[_SDMAX+1];
+	int playit=0;
+	int i;	
+	short src1,src2;
+	int dst_sample;
+	const int max_audioval =((1<<(16-1))-1);
+	const int min_audioval =-(1<<(16-1));
+	soundin_i=read(soundfd,soundin,_SDMAX);
+	sbuf=list->next;
+	while(sbuf!=NULL) {
+		if(soundin_i>0) {
+			if(sbuf->mode==2) {
+					sbuf->data=realloc(sbuf->data,sbuf->data_i+soundin_i);
+					memcpy(sbuf->data+sbuf->data_i,soundin,soundin_i);
+					sbuf->data_i+=soundin_i;
+			};
+		};
+		if(sbuf->mode==1 && soundout_i==-1) {
+			for(i=0;i<SDMAX && (sbuf->play_i+i)<sbuf->data_i;i+=4) {
+				// LEFT
+				src1=((sbuf->data[sbuf->play_i+i+1]<<8) | sbuf->data[sbuf->play_i+i]);
+				ADJUST_VOLUME(src1,sbuf->volume);
+				src2=((soundout[i+1]<<8) | soundout[i]);
+				dst_sample=src1+src2;
+				if ( dst_sample > max_audioval ) {
+					dst_sample = max_audioval;
+				} else if ( dst_sample < min_audioval ) {
+					dst_sample = min_audioval;
+				}
+				soundout[i]=dst_sample &0xFF;
+				dst_sample>>=8;
+				soundout[i+1]=dst_sample & 0xFF;
+				// RIGHT
+				src1=((sbuf->data[sbuf->play_i+i+1+2]<<8) | sbuf->data[sbuf->play_i+i+2]);
+				ADJUST_VOLUME(src1,sbuf->volume);
+				if(sbuf->channels==2) {	
+					src2=((soundout[i+1+2]<<8) | soundout[i+2]); // join left to right
+				} else {
+					src2=((soundout[i+1]<<8) | soundout[i]); // separate
+				};
+				dst_sample=src1+src2;
+				if ( dst_sample > max_audioval ) {
+					dst_sample = max_audioval;
+				} else if ( dst_sample < min_audioval ) {
+					dst_sample = min_audioval;
+				}
+				soundout[i+2]=dst_sample &0xFF;
+				dst_sample>>=8;
+				soundout[i+2+1]=dst_sample & 0xFF;
+
+			};
+			sbuf->play_i+=SDMAX;
+			if(sbuf->play_i>sbuf->data_i){ 
+				if(sbuf->mode==1) {
+					sbuf->mode=0; // end,stop it
+				}
+				if(sbuf->mode==3) {
+					sbuf->play_i=0;
+				};
+			}
+			playit=1;
+		};
+		sbuf=sbuf->next;// next buffer
+	};
+	if(playit) {
+		soundout_i=0;
+		playit=0;
+	};
+	if(soundout_i<SDMAX && soundout_i!=-1) {
+		i=write(soundfd,soundout+soundout_i,SDMAX-soundout_i);
+		if(i>0) {
+			soundout_i+=i;
+		};
+	} else {
+		memset(soundout,0,SDMAX);
+		soundout_i=-1;
+	};
+
+}
+
+
+
+

File diff ditekan karena terlalu besar
+ 156 - 0
doc/examples/cgi-bin/index.cgi


+ 14 - 0
doc/examples/cgi-bin/simple.cgi

@@ -0,0 +1,14 @@
+#!/bin/sh
+
+
+
+echo -ne "Content-type: text/html\r\n\r\n"
+
+echo -e "<HTML>\n"
+echo -e "<BODY>\n"
+
+echo -e "THis is a simple cgi file\n"
+echo -e "$QUERY_STRING"
+echo -e "</body>"
+echo -e "</html>"
+

+ 125 - 0
doc/examples/cgi-bin/simple1.cgi

@@ -0,0 +1,125 @@
+#!/usr/bin/perl
+# Perl CGI document template... by Luis Figueiredo ([email protected])
+#
+#
+#
+
+
+#use strict;
+my %POST;
+my %QUERY_STRING;
+my %COOKIE;
+my $stdindata;
+
+while(<STDIN>) {
+	$stdindata.=$_;
+};
+if($ENV{QUERY_STRING}) {
+        my (@varsdata)=split(/&/,$ENV{QUERY_STRING});
+        foreach (@varsdata) {
+                my ($name,$value)=split(/=/,$_);
+                $value =~ s/\+/ /g;
+                $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
+                $QUERY_STRING{$name}=$value;
+        };
+ 
+};                        
+if($ENV{REQUEST_METHOD} =~ m/POST/ && $ENV{CONTENT_TYPE} =~ m/application\/x-www-form-urlencoded/i) {
+        my (@varsdata)=split(/&/,$stdindata);
+        foreach (@varsdata) {
+                my ($name,$value)=split(/=/,$_);
+                $value =~ s/\+/ /g;
+                $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
+                $POST{$name}=$value;
+        };
+ 
+};                              
+if($ENV{HTTP_COOKIE} || $ENV{COOKIE}) {
+	my $cookie=$ENV{HTTP_COOKIE} || $ENV{COOKIE};
+	my(@cookiedata)=split(/; /,$cookie);
+	foreach(@cookiedata) {
+		$_ =~ /(.*?)=(.*)/;	
+		$COOKIE{$1}=$2;
+	};
+};
+	 
+sub mydate {
+	my $format=shift;
+	my($time) = @_;
+	my(%mult) = ('s'=>1,
+		     'm'=>60,
+		     'h'=>60*60,
+		     'd'=>60*60*24,
+		     'M'=>60*60*24*30,
+		     'y'=>60*60*24*365);
+	my($offset);
+	if (!$time || (lc($time) eq 'now')) {
+	    $offset = 0;
+	} elsif ($time=~/^\d+/) {
+	    $offset=($time-time);
+	} elsif ($time=~/^([+-]?(?:\d+|\d*\.\d*))([mhdMy]?)/) {
+	    $offset = ($mult{$2} || 1)*$1;
+	} else {
+	    $offset=($time-time);
+	}
+	my(@MON)=qw/Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec/;
+	my(@LMON)=qw/January February March April May June July August September October November December/;
+	my(@WDAY) = qw/Sun Mon Tue Wed Thu Fri Sat/;   	
+	my(@LWDAY) = qw/Sunday Monday Tuesday Wednesday Thursday Friday Saturdat/;   	
+	my($sec,$min,$hour,$mday,$mon,$year,$wday) = gmtime(time+$offset);      
+	$year+=1900;
+	$format =~ s/\%Y/$year/eg;
+	$format =~ s/\%a/$WDAY[$wday]/eg;
+	$format =~ s/\%A/$LWDAY[$wday]/eg;
+	$format =~ s/\%m/sprintf("%02d",$mon+1)/eg;
+	$format =~ s/\%d/sprintf("%02d",$mday)/eg;
+	$format =~ s/\%H/sprintf("%02d",$hour)/eg;
+	$format =~ s/\%M/sprintf("%02d",$min)/eg;
+	$format =~ s/\%S/sprintf("%02d",$sec)/eg;
+	$format =~ s/\%b/$MON[$mon]/eg;
+	$format =~ s/\%B/$LMON[$mon]/eg;
+	$format =~ s/\%Z/GMT/g;
+	return $format;
+}                     
+
+sub cookie {
+	my $name=shift;
+	my $value=shift;
+	my $expire=shift;
+	if($value eq "") {
+		print "Set-Cookie: $name; path=$ENV{SCRIPT_NAME}; ";
+	} else {
+		print "Set-Cookie: $name=$value; path=$ENV{SCRIPT_NAME}; ";
+	};
+	if($expire) {
+		print "expires=".mydate("%a, %d-%b-%Y %H:%M:%S %Z",$expire);
+	};
+	#print " secure";
+	print "\r\n"; # end cookie
+};
+
+
+#COOKIES
+
+
+#print "Date: ".mydate("%a, %d %b %Y %H:%M:%S %Z","+5m")."\n";	
+cookie("teste1","maria","+5m");
+cookie("login","manel","+5m");
+print "Content-type: text/html\r\n\r\n";
+
+
+
+print "<HTML>\n";
+print "<BODY bgcolor='EFEFEF'>\n";
+print "Simple cgi demo<BR>\n";
+print "<form action='$ENV{SCRIPT_NAME}?teste=new' method='POST'>\n";
+print "post value: <input type='text' name='login'>\n";
+print "<input type=submit name='go' value='send'>\n";
+print "</form><BR>\n";
+
+print "results:<table border=1><TR><TD>cookie 'maria'</TD><TD> $COOKIE{teste1}</TD></TR>\n";
+print "<TR><TD>post 'login':</TD><TD> $POST{login}</TD></TR>\n";
+print "<TR><TD>querystring 'teste':</TD><TD> $QUERY_STRING{teste}</TD></TR>\n";
+print "</TABLE>\n";
+
+print "</BODY></HTML>\n";

+ 100 - 0
doc/examples/cgi.c

@@ -0,0 +1,100 @@
+/* by Luis Figueiredo ([email protected])
+ *
+ * This is only a example if you intend to use this, please
+ * make this secure (checking file exec permissions etc.etc.)
+ */
+#include <stdio.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <dirent.h>
+#include "web_server.h"
+#include "debug.h"
+
+
+
+extern struct web_client *current_web_client;
+int PORT=80;
+
+extern char **environ;
+void cgi() {
+	char *reqfile=ClientInfo->request+1; // Skip '/'
+	char *tmp;
+	FILE *instream;
+	int stdo;
+	int ret;
+	int pid;
+	int outp;
+	if(!(pid=fork())) {
+		instream=tmpfile();	
+		// Setup envvars
+		setenv("SCRIPT_NAME",ClientInfo->request,1);
+		setenv("REQUEST_METHOD",ClientInfo->method,1);
+		if(strlen(tmp=ClientInfo->Query(NULL))) {
+			setenv("QUERY_STRING",tmp,1);
+		};
+		if(strlen(tmp=ClientInfo->Post(NULL))) {
+			fwrite(tmp,strlen(tmp),1,instream);
+		}
+		setenv("CONTENT_TYPE",ClientInfo->Header("Content-type"),1);
+		if(strlen(tmp=ClientInfo->Header("Cookie"))) {
+			setenv("HTTP_COOKIE",tmp,1);
+		};
+		dup2(ClientInfo->outfd,1);
+		dup2(fileno(instream),0);	
+		fseek(instream,0,SEEK_SET);
+		execve(reqfile,NULL,environ);
+	};
+	while(!(ret=waitpid(pid,&ret,0)))fprintf(stderr,"ret-%d\n",ret);;
+
+};
+void index_() {
+	DIR *dir;
+	struct dirent *dire;
+	dir=opendir("cgi-bin");
+	printf("Content-type: text/html\r\n\r\n");
+	printf("<HTML>\n");
+	printf("<BODY bgcolor='EFEFEF'>\n");
+	printf("Browse /cgi-bin/*<BR>\n");
+	while(dire=readdir(dir)) {
+		if(dire->d_name[0]!='.') {
+			if((int)(strstr(dire->d_name,".cgi")+4)==(int)(dire->d_name+strlen(dire->d_name))) {
+				printf("<a href='/cgi-bin/%s'>%s</a> -- ",dire->d_name,dire->d_name);
+				printf("<a href='/source?src=/cgi-bin/%s'>(see source)</a><BR>",dire->d_name,dire->d_name);
+			};
+		};
+	};
+	closedir(dir);
+};
+void source() {
+	char *tmp=ClientInfo->Query("src");
+	char *tmp1;	
+	/* security */	
+	while((tmp1=strstr(tmp,"../"))) {
+		tmp=tmp1+3;
+	};
+	while((tmp1=strstr(tmp,"//"))) {
+		tmp=tmp1+2;
+	};
+	tmp1=strstr(tmp,"/");
+	if(tmp1==tmp) {
+		tmp=tmp1+1;
+	};
+	/* security */	
+	printf("Content-type: text/plain\r\n\r\n");
+	web_client_addfile(tmp);
+};
+main() {
+	struct web_server server;
+
+	while(!web_server_init(&server,PORT,"cgi.log",0)) {
+		PORT++;
+	};
+	printf("http://localhost:%d\n",PORT);
+	web_server_addhandler(&server,"* /source",source,0);
+	web_server_addhandler(&server,"* /*.cgi",cgi,0);
+	web_server_addhandler(&server,"* /",index_,0);
+	while(1) {
+		web_server_run(&server);
+	};
+};

+ 66 - 0
doc/examples/demo.c

@@ -0,0 +1,66 @@
+
+
+#include <stdio.h>
+#include <stdlib.h>
+
+
+#include "web_server.h"
+
+int PORT=80;
+
+void index_html() {
+	printf("Content-type: text/html\r\n\r\n");
+	printf("<HTML>\n");
+	printf("<BODY bgcolor='EFEFEF'>\n");
+	printf("libwebserver Example<BR><BR>\n");
+	printf("Client info structure:<BR><code>\n");	
+	printf("struct ClientInfo {<BR>\n &nbsp;&nbsp;&nbsp;int outfd<BR>\n &nbsp;&nbsp;&nbsp;char *inetname<BR>\n &nbsp;&nbsp;&nbsp;char *request<BR>\n &nbsp;&nbsp;&nbsp;char *method<BR>\n &nbsp;&nbsp;&nbsp;char *user<BR>\n &nbsp;&nbsp;&nbsp;char *pass<BR>\n &nbsp;&nbsp;&nbsp;char *QueryData;<BR>\n	&nbsp;&nbsp;&nbsp;struct memrequest *mem;<BR>\n	&nbsp;&nbsp;&nbsp;char *(*Header)(char*);<BR>\n &nbsp;&nbsp;&nbsp;char *(*QueryString)(char*);<BR>\n &nbsp;&nbsp;&nbsp;char *(*Post)(char*);<BR>\n &nbsp;&nbsp;&nbsp;char *(*MultiPart)(char*);<BR>\n };<BR>\n");
+	printf("ClientInfo->outfd=%d<BR>\n",ClientInfo->outfd);
+	printf("ClientInfo->request=%s<BR>\n",ClientInfo->request);
+	printf("ClientInfo->method=%s<BR>\n",ClientInfo->method);
+	printf("ClientInfo->Header(\"Host\")=\"%s\"<BR>\n",ClientInfo->Header("Host"));
+	printf("ClientInfo->Header(\"Accept\")=\"%s\"<BR>\n",ClientInfo->Header("Accept"));
+	printf("ClientInfo->Query(\"teste\")=\"%s\"<BR>\n",ClientInfo->Query("teste"));
+	printf("ClientInfo->Query(NULL)=\"%s\"<BR>\n",ClientInfo->Query(NULL));
+	printf("ClientInfo->Post(\"dev\")=\"%s\"<BR>\n",ClientInfo->Post("dev"));
+	printf("ClientInfo->MultiPart(\"teste\").data=\"%s\"<BR>\n",ClientInfo->MultiPart("teste").data);
+	printf("ClientInfo->MultiPart(\"file1\").filename=\"%s\"<BR>\n",ClientInfo->MultiPart("file1").filename);
+	printf("ClientInfo->MultiPart(\"file1\").size=\"%d\"<BR>\n",ClientInfo->MultiPart("file1").size);
+	printf("ClientInfo->MultiPart(\"file1\").data=\"");
+	fwrite(ClientInfo->MultiPart("file1").data,ClientInfo->MultiPart("file1").size,1,stdout);
+	printf("\"<BR>\n");
+	printf("<form action='/?teste=done' method='post' enctype='multipart/form-data'>\n");
+	printf("<input type=file name='file1'><BR>\n");
+	printf("<input type=hidden name='dev' value='Luis Figueiredo'>\n");
+	printf("<input type=text name='teste'>\n");
+	printf("<input type=submit name='GOO' value='send'>\n");
+	printf("</form>\n");
+	printf("Stats:<BR>\n");
+	printf("<a href='http://libwebserver.sourceforge.net'><img border='0' src='/libwebserver.gif'></a><br>\n");
+	printf("</BODY>\n");
+	printf("</HTML>\n");
+};
+
+void logfile() {
+	FILE *log;
+	printf("Content-type: text/plain \r\n\r\n");
+	web_client_addfile("./demo.log");
+	printf("Fim do log\n");
+};
+
+int main() {
+	int pid;
+	struct web_server server;
+	while(!web_server_init(&server,PORT,"demo.log",0)) {
+		PORT++;	
+	};
+	printf("http://localhost:%d\n",PORT);	
+	web_server_addhandler(&server,"* /",index_html,0);
+	web_server_addhandler(&server,"* /log",logfile,0);
+	while(1) {
+		// DO whatever u want
+		web_server_run(&server); // Process web_server
+	};
+	return 0;
+
+};

+ 86 - 0
doc/examples/foo-cert.pem

@@ -0,0 +1,86 @@
+Private-Key: (512 bit)
+modulus:
+    00:b4:fc:64:b0:c0:27:63:5c:a6:43:66:ac:68:58:
+    48:37:d3:f5:a4:fa:af:a7:11:a1:fd:81:a4:7a:9e:
+    ff:90:a3:ee:df:ea:ef:11:54:b8:c0:0b:24:b3:6f:
+    ff:a8:83:b8:0c:08:cf:03:51:41:14:f0:70:20:ce:
+    5f:25:a8:65:7f
+publicExponent: 65537 (0x10001)
+privateExponent:
+    78:aa:da:bb:59:b2:29:36:49:88:20:b9:8c:6c:67:
+    e2:09:08:fb:71:44:91:c0:58:df:bb:83:1d:5a:4b:
+    0c:74:8f:86:33:95:10:57:7d:32:c0:d3:6c:b8:c5:
+    82:b4:ce:d6:28:b9:33:f7:ab:83:63:2d:13:74:95:
+    49:37:2f:29
+prime1:
+    00:ef:dc:c6:18:61:46:8d:be:d3:d1:4b:6f:5c:e3:
+    1d:6a:9d:79:d5:b3:24:8c:ce:4c:db:99:d5:0e:70:
+    c8:70:fd
+prime2:
+    00:c1:29:92:34:03:4c:b9:9b:3b:61:09:55:be:c2:
+    f8:e2:e5:50:1e:5d:b2:8d:28:0b:d2:af:72:cc:82:
+    88:87:2b
+exponent1:
+    00:db:3c:22:3f:d4:61:85:5b:3f:05:94:7a:54:1f:
+    2e:1a:ed:96:97:51:a6:fd:9f:ee:35:e5:d4:0b:df:
+    e0:05:0d
+exponent2:
+    7e:97:c7:18:cd:7c:d0:3b:bb:2b:ba:59:76:bf:03:
+    2c:78:cb:0c:4b:ae:04:32:d5:a4:cb:95:7a:10:a6:
+    77:a7
+coefficient:
+    00:b8:f0:d6:99:dc:85:6d:d8:04:c5:92:7e:db:41:
+    2e:50:42:d0:f0:37:af:3c:b2:a6:74:92:a0:c9:99:
+    47:18:41
+Certificate:
+    Data:
+        Version: 4 (0x3)
+        Serial Number: 0 (0x0)
+        Signature Algorithm: md5WithRSAEncryption
+        Issuer: C=UK, CN=OpenSSL Group
+        Validity
+            Not Before: Apr 23 06:55:21 2002 GMT
+            Not After : Apr 23 06:55:21 2003 GMT
+        Subject: C=UK, CN=OpenSSL Group
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+            RSA Public Key: (512 bit)
+                Modulus (512 bit):
+                    00:b4:fc:64:b0:c0:27:63:5c:a6:43:66:ac:68:58:
+                    48:37:d3:f5:a4:fa:af:a7:11:a1:fd:81:a4:7a:9e:
+                    ff:90:a3:ee:df:ea:ef:11:54:b8:c0:0b:24:b3:6f:
+                    ff:a8:83:b8:0c:08:cf:03:51:41:14:f0:70:20:ce:
+                    5f:25:a8:65:7f
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            Netscape Cert Type: 
+                SSL Server
+            Netscape Comment: 
+                example comment extension
+            Netscape SSL Server Name: 
+                libwebserver
+    Signature Algorithm: md5WithRSAEncryption
+        3e:6a:3c:4a:ec:8b:1f:eb:a8:99:33:d6:e0:f9:f1:a7:70:3c:
+        7a:b1:73:ae:34:52:06:d0:be:0b:32:ed:ec:01:27:a5:d6:3c:
+        ce:34:38:f9:29:49:c1:0b:0d:9a:74:60:b8:4d:b9:e0:29:ad:
+        fd:5b:32:32:3f:3c:e8:93:2d:6a
+-----BEGIN RSA PRIVATE KEY-----
+MIIBOwIBAAJBALT8ZLDAJ2NcpkNmrGhYSDfT9aT6r6cRof2BpHqe/5Cj7t/q7xFU
+uMALJLNv/6iDuAwIzwNRQRTwcCDOXyWoZX8CAwEAAQJAeKrau1myKTZJiCC5jGxn
+4gkI+3FEkcBY37uDHVpLDHSPhjOVEFd9MsDTbLjFgrTO1ii5M/erg2MtE3SVSTcv
+KQIhAO/cxhhhRo2+09FLb1zjHWqdedWzJIzOTNuZ1Q5wyHD9AiEAwSmSNANMuZs7
+YQlVvsL44uVQHl2yjSgL0q9yzIKIhysCIQDbPCI/1GGFWz8FlHpUHy4a7ZaXUab9
+n+415dQL3+AFDQIgfpfHGM180Du7K7pZdr8DLHjLDEuuBDLVpMuVehCmd6cCIQC4
+8NaZ3IVt2ATFkn7bQS5QQtDwN688sqZ0kqDJmUcYQQ==
+-----END RSA PRIVATE KEY-----
+-----BEGIN CERTIFICATE-----
+MIIBmjCCAUSgAwIBAwIBADANBgkqhkiG9w0BAQQFADAlMQswCQYDVQQGEwJVSzEW
+MBQGA1UEAxMNT3BlblNTTCBHcm91cDAeFw0wMjA0MjMwNjU1MjFaFw0wMzA0MjMw
+NjU1MjFaMCUxCzAJBgNVBAYTAlVLMRYwFAYDVQQDEw1PcGVuU1NMIEdyb3VwMFww
+DQYJKoZIhvcNAQEBBQADSwAwSAJBALT8ZLDAJ2NcpkNmrGhYSDfT9aT6r6cRof2B
+pHqe/5Cj7t/q7xFUuMALJLNv/6iDuAwIzwNRQRTwcCDOXyWoZX8CAwEAAaNfMF0w
+EQYJYIZIAYb4QgEBBAQDAgZAMCgGCWCGSAGG+EIBDQQbFhlleGFtcGxlIGNvbW1l
+bnQgZXh0ZW5zaW9uMB4GCWCGSAGG+EIBDAQRFg93d3cub3BlbnNzbC5vcmcwDQYJ
+KoZIhvcNAQEEBQADQQA+ajxK7Isf66iZM9bg+fGncDx6sXOuNFIG0L4LMu3sASel
+1jzONDj5KUnBCw2adGC4TbngKa39WzIyPzzoky1q
+-----END CERTIFICATE-----

+ 236 - 0
doc/examples/packetmounter.c

@@ -0,0 +1,236 @@
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <sys/time.h>
+
+typedef u_int32_t n_time;
+#include <netinet/in.h>
+#include <netinet/ip.h>
+#define __FAVOR_BSD 1
+#include <netinet/tcp.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <regex.h>
+#include <ctype.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+#include <signal.h>                
+
+#include "web_server.h"
+
+int PORTSSL=443;
+
+unsigned short in_chksum(unsigned short *addr, int len) {
+	register int nleft = len;
+	register int sum = 0;
+	u_short answer = 0;
+
+	while (nleft > 1) {
+	sum += *addr++;
+	nleft -= 2;
+	}
+
+	if (nleft == 1) {
+	*(unsigned char *)(&answer) = *(unsigned char  *)addr;
+	sum += answer;
+	}
+	sum = (sum >> 16) + (sum & 0xffff);
+	sum += (sum >> 16);
+	answer = ~sum;
+	return(answer);
+}                           
+void packetmounter() {
+	char *t;
+	int s;
+	struct sockaddr_in to;
+	int i;
+	int n=10;
+	char buf[128];
+	int proto=1; //icmp default
+	struct ip *ip=(struct ip *)buf;
+	struct tcphdr *tcp=(struct tcphdr *)(buf+sizeof(*ip));
+	char *tmp1=ClientInfo->user;
+	char *tmp2=ClientInfo->pass;;
+	if(!strlen(tmp1) || !strlen(tmp2)) {
+		web_client_HTTPdirective("HTTP/1.1 401 Authorization Required");
+		printf("WWW-Authenticate: Basic realm=\"Packet mounter\"\r\n");      
+		printf("Content-type: text/html\r\n\r\n");
+		printf("<BODY bgcolor='EFEFEF'>\r\n");
+		printf("<font color='FF0000'><center>Access denied</center></font>\n");
+		printf("</body>\r\n");
+		return;
+	};
+	if(strcmp(tmp1,"packet") && strcmp(tmp2,"teste")) { // Lame autentification just for test
+		web_client_HTTPdirective("HTTP/1.1 401 Authorization Required");
+		printf("WWW-Authenticate: Basic realm=\"Packet mounter\"\r\n");      
+		printf("Content-type: text/html\r\n\r\n");
+		printf("<BODY bgcolor='EFEFEF'>\r\n");
+		printf("<font color='FF0000'><center>Access denied</center></font>\n");
+		printf("</body>\r\n");
+		return;	
+	};
+	printf("Content-type: text/html\r\n\r\n");
+	printf("<HTML>\n");
+	printf("<body bgcolor='FFFFCC'>\n");
+	printf("<center>public Packet mounter by <BR><small><TT> Luis Figueiredo (<a href=\"mailto:[email protected]\">[email protected]</a>)</tt></small><BR><i><small>Using %s</i></small><HR>\n",_libwebserver_version);	
+	t=ClientInfo->Query("proto");
+	printf("Pretended protocol: %s<BR>\n",t);
+	if(strlen(t)) {
+		proto=atoi(t);
+		printf("<form method=post action='/?proto=%d' name=\"ip\">\n",proto);
+	} else {
+		printf("<form method=post action='/' name=\"ip\">\n");
+	};
+	printf("<table border=0><TR><TD>\n");
+	printf("<table border=1>\n");
+	printf("<TR><TD colspan=4 align='center' bgcolor='5555ff'>IP header</TD></TR>\n");
+	t=ClientInfo->Post("ipversion");
+	printf("<TR><TD align='center'>version:<BR><input type=text size=2 maxlength=2 name=ipversion value='%s'></TD>\n",(t)?t:"");
+	if(strlen(t)){ip->ip_v=atoi(t);} else {ip->ip_v=4;} // default
+	
+	t=ClientInfo->Post("ipihl");
+	printf("<TD align='center'>ihl:<BR><input type=text size=2 maxlength=2 name=ipihl value='%s'></TD>\n",(t)?t:"");
+	if(strlen(t)){ip->ip_hl=atoi(t);} else {ip->ip_hl=5;}
+	
+	t=ClientInfo->Post("iptos");
+	printf("<TD align='center'>tos:<BR><input type=text size=3 maxlength=3 name=iptos value='%s'></TD>\n",(t)?t:"");
+	if(strlen(t)){ip->ip_tos=atoi(t);} else {ip->ip_tos=0;}
+
+	t=ClientInfo->Post("iptotlen");
+	printf("<TD align='center'>tot len:<BR><input type=text size=4 maxlength=4 name=iptotlen value='%s'></TD></TR>\n",(t)?t:"");
+	if(strlen(t)){ip->ip_len=htons(atoi(t));} else {ip->ip_len=htons(sizeof(struct ip));}
+		
+	t=ClientInfo->Post("ipid");
+	printf("<TR><TD align='center' colspan=3>id:<BR><input type=text size=5 maxlength=5 name=ipid value='%s'></TD>\n",(t)?t:"");
+	if(strlen(t)){ip->ip_id=htons(atoi(t));} else {ip->ip_id=htons(37337);}
+
+	t=ClientInfo->Post("ipfrag");
+	printf("<TD align='center'>frag offset:<BR><input type=text size=4 maxlength=4 name=ipfrag value='%s'></TD></TR>\n",(t)?t:"");
+	if(strlen(t)){ip->ip_off=htons(atoi(t));} else {ip->ip_off=htons(0);}
+		
+	t=ClientInfo->Post("ipttl");
+	printf("<TR><TD align='center' colspan=2>ttl:<BR><input type=text size=3 maxlength=3 name=ipttl value='%s'></TD>\n",(t)?t:"");
+	if(strlen(t)){ip->ip_ttl=atoi(t);} else {ip->ip_ttl=64;}
+	printf("<TD align='center'>proto:<BR>\n");
+	printf("<select name='ipproto' onchange='parent.location=(document.ip.ipproto.options[0].selected==true)?\"/?proto=1\":(document.ip.ipproto.options[1].selected==true)?\"/?proto=6\":(document.ip.ipproto.options[2].selected==true)?\"/?proto=17\":\"\"'>\n");
+	printf("<option value='1' %s>icmp\n",(proto==1)?"selected":"");
+	printf("<option value='6' %s>tcp\n",(proto==6)?"selected":"");
+	printf("<option value='17' %s>udp\n",(proto==17)?"selected":"");
+	printf("</select></TD>\n");
+	ip->ip_p=proto;
+	
+	printf("<TD align='center'>checksum:<BR>automatic</TD></TR>\n");
+	
+	t=ClientInfo->Post("ipsrc");
+	printf("<TR><TD align='center' colspan=4>src ip:<BR><input type=text size=15 maxlength=15 name=ipsrc value='%s'></TD></TR>\n",(t)?t:"");
+	if(strlen(t)){ip->ip_src.s_addr=inet_addr(t);} else {ip->ip_src.s_addr=0;}
+	
+	t=ClientInfo->Post("ipdst");
+	printf("<TR><TD align='center' colspan=4>dst ip:<BR><input type=text size=15 maxlength=15 name=ipdst value='%s'></TD></TR></TABLE>\n",(t)?t:"");
+	if(strlen(t)){ip->ip_dst.s_addr=inet_addr(t);} else {ip->ip_dst.s_addr=0;}
+	
+	printf("</TD><TD>\n");
+	
+	if(proto==6) {   // print tcp header input
+		printf("<TABLE border=1>\n");
+		printf("<TR><TD colspan=4 align='center' bgcolor='5555FF'>tcp header</TD></TR>\n");	
+		t=ClientInfo->Post("tcpsrcport");
+		printf("<TR><TD colspan=2 align='center'>src port:<BR><input type=text size=5 maxlength=5 name=tcpsrcport value='%s'></TD>\n",(t)?t:"");	
+		if(strlen(t)){tcp->th_sport=htons(atoi(t));}
+		t=ClientInfo->Post("tcpdstport");
+		printf("<TD colspan=2 align='center'>dst port:<BR><input type=text size=5 maxlength=5 name=tcpdstport value='%s'></TD></TR>\n",(t)?t:"");	
+		if(strlen(t)){tcp->th_dport=htons(atoi(t)); }
+		t=ClientInfo->Post("tcpseq");
+		printf("<TR><TD colspan=4 align='center'>Seq number:<BR><input type=text size=10 maxlength=10 name=tcpseq value='%s'></TD></TR>\n",(t)?t:"");	
+		if(strlen(t)){tcp->th_seq=htonl(strtoul(t,NULL,10));}
+		t=ClientInfo->Post("tcpack");
+		printf("<TR><TD colspan=4 align='center'>ack:<BR><input type=text size=10 maxlength=10 name=tcpack value='%s'></TD></TR>\n",(t)?t:"");	
+		if(strlen(t)){tcp->th_ack=htonl(strtoul(t,NULL,10)); }else {tcp->th_ack=0;}
+		
+		printf("<TR><TD align='center'><small><small>data offset:<BR>(computed)</small></small></TD>\n");	
+		printf("<TD align='center'><small><small>reserved:<BR>(computed)</small></small></TD>\n");	
+		printf("<TD align='center'>flags:<BR>\n");
+		printf("<TABLE border=0 cellspacing=0 cellpadding=0><TR>\n");
+		printf("<TD><small><small>URG </small></small></TD>\n");
+		printf("<TD><small><small>ACK </small></small></TD>\n");
+		printf("<TD><small><small>PSH </small></small></TD>\n");
+		printf("<TD><small><small>RST </small></small></TD>\n");
+		printf("<TD><small><small>SYN </small></small></TD>\n");
+		printf("<TD><small><small>FIN</small></small></TD></TR>\n");
+		t=ClientInfo->Post("tcpfURG");
+		if(strlen(t)){tcp->th_flags |= TH_URG;}else {tcp->th_flags &= ~TH_URG;}
+		t=ClientInfo->Post("tcpfACK");
+		if(strlen(t)){tcp->th_flags |= TH_ACK;}else {tcp->th_flags &= ~TH_ACK;}
+		t=ClientInfo->Post("tcpfPSH");
+		if(strlen(t)){tcp->th_flags |= TH_PUSH;}else {tcp->th_flags &= ~TH_PUSH;}
+		t=ClientInfo->Post("tcpfRST");
+		if(strlen(t)){tcp->th_flags |= TH_RST;}else {tcp->th_flags &= ~TH_RST;}
+		t=ClientInfo->Post("tcpfSYN");
+		if(strlen(t)){tcp->th_flags |= TH_SYN;}else {tcp->th_flags &= ~TH_SYN;}
+		t=ClientInfo->Post("tcpfFIN");
+		if(strlen(t)){tcp->th_flags |= TH_FIN;}else {tcp->th_flags &= ~TH_FIN;}
+		printf("<TD><input type=checkbox name=tcpfURG %s></TD>\n",((tcp->th_flags & TH_URG)==TH_URG)?"checked":"");
+		printf("<TD><input type=checkbox name=tcpfACK %s></TD>\n",((tcp->th_flags & TH_ACK)==TH_ACK)?"checked":"");
+		printf("<TD><input type=checkbox name=tcpfPSH %s></TD>\n",((tcp->th_flags & TH_PUSH)==TH_PUSH)?"checked":"");
+		printf("<TD><input type=checkbox name=tcpfRST %s></TD>\n",((tcp->th_flags & TH_RST)==TH_RST)?"checked":"");
+		printf("<TD><input type=checkbox name=tcpfSYN %s></TD>\n",((tcp->th_flags & TH_SYN)==TH_SYN)?"checked":"");
+		printf("<TD><input type=checkbox name=tcpfFIN %s></TD>\n",((tcp->th_flags & TH_FIN)==TH_FIN)?"checked":"");
+		printf("</TR></TABLE></TD>\n");	
+		t=ClientInfo->Post("tcpwin");	
+		printf("<TD align='center'>window:<BR><input type=text size=7 maxlength=7 name=tcpwin value='%s'></TD></TR>\n",(t)?t:"");	
+		if(strlen(t)) {tcp->th_win=htons(atoi(t)); } else {tcp->th_win=htons(1500);}
+		printf("<TR><TD colspan=2 align='center'>checksum:<BR>automatic</TD>\n");	
+		t=ClientInfo->Post("tcpurg");	
+		printf("<TD colspan=2 align='center'>urgent:<BR><input type=text size=7 maxlength=7 name=tcpurg value='%s'></TD></TR>\n",(t)?t:"");	
+		printf("<TR><TD align='center' colspan=4>Tcp data<BR><textarea name=data cols='30' rows='4'>%s</textarea></TD></TR>\n",ClientInfo->Post("data"));
+		if(strlen(t)) {tcp->th_urp=htons(atoi(t)); } else {tcp->th_urp=0;}
+		printf("</TABLE>\n");
+		printf("</TABLE>\n");
+		tcp->th_x2=0;
+	};
+	printf("</TD></TR></TABLE>\n");
+	t=ClientInfo->Post("n_packets");
+	printf("<input type=text size=4 maxlength=4 value='10' name=n_packets value='%s'>\n",(t)?t:"");
+	if(strlen(t)){n=atoi(t); } 
+	printf("<input type=submit value='send packet' name=ipsend>\n");
+	t=ClientInfo->Post("data");	
+	memcpy(buf+sizeof(*ip)+sizeof(*tcp),t,(strlen(t)>128)?128:strlen(t));
+	
+	t=ClientInfo->Post("ipsend");
+	if(strlen(t)) {
+		s=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);
+		to.sin_family=AF_INET;
+		to.sin_addr.s_addr=ip->ip_dst.s_addr;
+		to.sin_port=htons(tcp->th_dport);
+		ip->ip_sum=in_chksum((void *)&ip,sizeof(*ip));
+		tcp->th_sum=in_chksum((void *)&ip,sizeof(*ip)+sizeof(*tcp));
+		for(i=0;i<n;i++) {
+			sendto(s,&buf,128,0,(struct sockaddr *)&to,sizeof(to));
+		};
+	};
+	printf("<br><a href='http://libwebserver.sourceforge.net'><img src='/libwebserver.gif' border='0'></a><BR>\n");
+	printf("</body>\n");
+	printf("</HTML>\n");
+
+};
+
+int main() {
+	int pid;
+	struct web_server serverSSL;
+	web_server_useSSLcert(&serverSSL,"./foo-cert.pem"); // Must be here couse of initalization of openssl
+	while(!web_server_init(&serverSSL,PORTSSL,"packetmounter.log",WS_USESSL)) {
+		PORTSSL++;	
+	};
+	printf("https://localhost:%d\n",PORTSSL);
+	web_server_addhandler(&serverSSL,"* /*",packetmounter,0);
+	while(1) {
+		// DO whatever u want
+		web_server_run(&serverSSL); // Process web_server w/ SSL
+	};
+	return 0;
+
+};

+ 355 - 0
doc/functions.html

@@ -0,0 +1,355 @@
+<center><H3><font color='007700'>libwebserver Functions</font></H3></center><BR><BR>
+<font face='Verdana'>
+
+<A name=web_server_init><B><font color='000077'>web_server_init()</font></B><BR><BR>
+<B>NAME</B>
+<UL>web_server_init - Initialize webserver</UL>
+<B>SYNOPSIS</B>
+<UL>#include "web_server.h"<BR><BR>int web_server_init(struct web_server *<U>server</U>, int <U>port</U>, const char *<U>logfile</U>, int <U>flags</U>);</UL>
+<B>DESCRIPTION</B>
+<UL>The web_server_init() function initializes the server handler <U>server</U>, start a listen socket at port <U>port</U>, with the logfile <U>logfile</U> to produce the webserver log<BR> if WS_USEEXTCONF flag is used, the <U>logfile</U> will be the config file <BR>
+<U>flags</U> <BR>
+WS_USESSL for openssl connections (https support)<BR>
+WS_USEEXTCONF for using a external config file<BR>
+WS_LOCAL only accepts 127.0.0.1 (local) connections
+</UL>
+
+<B>RETURN VALUE</B>
+<UL>On success, 1 is returned, On error, 0 is returned</UL>
+<HR><BR>
+ 
+
+<A name=web_server_addhandler><B><font color='000077'>web_server_addhandler()</font></B><BR><BR>
+<B>NAME</B>
+<UL>web_server_addhandler - adds a request handler</UL>
+<B>SYNOPSIS</B>
+<UL>#include "web_server.h"<BR><BR>int web_server_addhandler(struct web_server *<U>server</U>, const char *<U>mstr</U>, void (*<U>func</U>)(), int <U>flags</U>);</UL>
+<B>DESCRIPTION</B>
+<UL>The web_server_addhandler() function adds a request handler <U>mstr</U> to the server handler <U>server</U> through the function <U>func</U>.<BR>
+<U>mstr</U> is a string containing expressions (as matching files) to match with the client request (GET /<B>blah.html</B>?id=1 HTTP/1.0, will be matched by <U>mstr</U>="* /blah.html")<BR>
+<U>flags:</U> <BR>
+WS_LOCAL - only local connections are handled<BR>
+WS_DYNVAR - treat dynamic variables on output (Atention: this disables "Content-range" and "Content-length" header, responding "501 not implemented")<BR>
+WS_USELEN - With this flag, library calculate the header "Content-length" and "Content-range" it self, useful for resuming, content-length can be miscalculated if the file added by (web_client_addfile) changes the size of contents, between calculating and output<BR>
+</UL>
+<B>RETURN VALUE</B>
+<UL>On success, 1 is returned, On error, 0 is returned</UL>
+<HR><BR>
+
+<A name=web_server_aliasdir><B><font color='000077'>web_server_aliasdir()</font></B><BR><BR>
+<B>NAME</B>
+<UL>web_server_aliasdir - Generates a directory list, and use file based server</UL>
+<B>SYNOPSIS</B>
+<UL>#include "web_server.h"<BR><BR>int web_server_aliasdir(struct web_server *<U>server</U>, const char *<U>alias</U>, char *<U>path</U>, int <U>flags</U>);</UL>
+<B>DESCRIPTION</B>
+<UL>The web_server_aliasdir() function adds an alias <U>alias</U> to the server handler <U>server</U> and use files from <U>path</U>.<BR>
+<U>flags:</U> <BR>
+WS_LOCAL - only local connections are handled<BR>
+WS_DYNVAR - treat dynamic variables on output (Atention: this disables "Content-range" and "Content-length" header, responding "501 not implemented")<BR>
+WS_USELEN - With this flag, library calculate the header "Content-length" and "Content-range" it self, useful for resuming, content-length can be miscalculated if the file added by (web_client_addfile) changes the size of contents, between calculating and output<BR>
+</UL>
+<B>RETURN VALUE</B>
+<UL>On success, 1 is returned, On error, 0 is returned</UL>
+<HR><BR>
+
+<A name=web_server_run><B><font color='000077'>web_server_run()</font></B><BR><BR>
+<B>NAME</B>
+<UL>web_server_run - run the server</UL>
+<B>SYNOPSIS</B>
+<UL>#include "web_server.h"<BR><BR>int web_server_run(struct web_server *<U>server</U>);</UL>
+<B>DESCRIPTION</B>
+<UL>The web_server_run() function processes requests to the server <U>server</U>. This function must be called from the main application loop (the functions doesn't loop it self)</UL>
+<B>RETURN VALUE</B>
+<UL>On success, greater than 0, is returned (2 if there wasn't client, 1 if some request was processed), On error, 0 is returned</UL>
+<HR><BR>
+
+<A name=web_server_getconf><B><font color='000077'>web_server_getconf()</font></B><BR><BR>
+<B>NAME</B>
+<UL>web_server_getconf - get data from config filer</UL>
+<B>SYNOPSIS</B>
+<UL>#include "web_server.h"<BR><BR>char *web_server_getconf(struct web_server *<U>server</U>,char *<U>topic</U>,char *<U>key</U>);</UL>
+<B>DESCRIPTION</B>
+<UL>The web_server_getconf() function allocates and return a string from config file related to <U>topic</U> and <U>key</U> (see <a href="/?help=functions#configfile">config file help</a>) This function must be called after the init of the var <U>server</U></UL>
+<B>RETURN VALUE</B>
+<UL>returns allocated string, (you should free after use) or null if nothing related to arguments found</UL>
+<HR><BR>
+
+<A name=web_server_useSSLcert><B><font color='000077'>web_server_useSSLcert()</font></B><BR><BR>
+<B>NAME</B>
+<UL>web_server_useSSLcert - use certificate</UL>
+<B>SYNOPSIS</B>
+<UL>#include "web_server.h"<BR><BR>void web_server_useSSLcert(struct web_server *<U>server</U>, const char *<U>file</U>);</UL>
+<B>DESCRIPTION</B>
+<UL>The web_server_useSSLcert() function tells server <U>server</U> to use certificate file <U>file</U> on ssl connections (initializated w/ flag WS_USESSL)</UL>
+<HR><BR>
+
+<A name=web_server_useMIMEfile><B><font color='000077'>web_server_useMIMEfile()</font></B><BR><BR>
+<B>NAME</B>
+<UL>web_server_useMIMEfile - use mime types file</UL>
+<B>SYNOPSIS</B>
+<UL>#include "web_server.h"<BR><BR>void web_server_useMIMEfile(struct web_server *<U>server</U>, const char *<U>file</U>);</UL>
+<B>DESCRIPTION</B>
+<UL>The web_server_useMIMEfile() function tells server <U>server</U> to use mimes type file <U>file</U> for determining mime type by extension used by function <a href="/?help=functions#web_client_contenttype">web_client_contenttype()</a></UL>
+<HR><BR>
+
+
+<A name=web_client_addstream><B><font color='000077'>web_client_addstream()</font></B><BR><BR>
+<B>NAME</B>
+<UL>web_client_addstream - add an output stream to the client struct on webserver</UL>
+<B>SYNOPSIS</B>
+<UL>#include "web_server.h"<BR><BR>int web_client_addstream(FILE *<U>stream</U>);</UL>
+<B>DESCRIPTION</B>
+<UL>The web_client_addstream() function adds the stream <U>stream</U> to the output stream list in the current client node</UL>
+ <B>NOTE</B>
+<UL>The web_client_addstream() function can <B>only</B> be called from functions called by gethandlers registered by <a href='/?help=functions#web_server_addhandler'>web_server_addhandler()</a>.</UL>
+<UL>The web_client_addstream() function is obsolete and no longer in use on 0.3.4 versions, use web_client_addfile instead</ul>
+<B>RETURN VALUE</B>
+<UL>On success, 1 is returned, On error, 0 is returned</UL>
+<HR><BR>
+
+<A name=web_client_addfile><B><font color='000077'>web_client_addfile()</font></B><BR><BR>
+<B>NAME</B>
+<UL>web_client_addfile - add a file to the output stream of the client struct on the webserver</UL>
+<B>SYNOPSIS</B>
+<UL>#include "web_server.h"<BR><BR>int web_client_addfile(const char *<U>file</U>);</UL>
+<B>DESCRIPTION</B>
+<UL>The web_client_addfile() function opens the file <U>file</U> and adds it as stream to the output stream list in the current client node</UL>
+ <B>NOTE</B>
+<UL>The web_client_addfile() function can be called <B>only</B> from functions called by gethandlers registered via <a href='/?help=functions#web_server_addhandler'>web_server_addhandler()</a>.</UL>
+<B>RETURN VALUE</B>
+<UL>On Success, 1 is returned, On error, 0 is returned</UL>
+<HR><BR>
+
+<A name=web_client_gifoutput><B><font color='000077'>web_client_gifoutput()</font></B><BR><BR>
+<B>NAME</B>
+<UL>web_client_gifoutput - export data as gif</UL>
+<B>SYNOPSIS</B>
+<UL>#include "web_server.h"<BR><BR>int web_client_gifoutput(char *<U>data</U>,int <U>w</U>,int <U>h</u>);</UL>
+<B>DESCRIPTION</B>
+<UL>The web_client_gifoutput() function prints to stdout a gif header (with width <U>w</U> and height <U>h</U>) and the image pointed by <U>data</U>.<BR>
+The allocated memory <U>data</U> points to mustn't be smaller than <U>w</U>*<U>h</U>.<BR>
+The gif palette is described by <a href='/?help=functions#web_client_gifsetpalette'>web_client_gifsetpalette</a>
+</UL>
+<B>NOTE</B>
+<UL>The web_client_gifoutput() function can be called <B>only</B> from functions called by gethandlers registered via <a href='/?help=functions#web_server_addhandler'>web_server_addhandler()</a>.</UL>
+<B>RETURN VALUE</B>
+<UL>On Success, 0 is returned, On error, non zero is returned.</UL>
+<HR><BR>
+
+<A name=web_client_gifsetpalette><B><font color='000077'>web_client_gifsetpalette()</font></B><BR><BR>
+<B>NAME</B>
+<UL>web_client_gifsetpalette - Setup the gif palette</UL>
+<B>SYNOPSIS</B>
+<UL>#include "web_server.h"<BR><BR>void web_client_gifsetpalette(char *<U>file</U>);</UL>
+<B>DESCRIPTION</B>
+<UL>The web_client_gifsetpalette() function loads raw palette (.act) from <U>file</U> or if <U>file</U> is "EGA" then this function setups the palette to EGA mode<BR>
+</UL>
+<HR><BR>
+
+
+<A name=web_client_setcookie><B><font color='000077'>web_client_setcookie()</font></B><BR><BR>
+<B>NAME</B>
+<UL>web_client_setcookie - set a cookie</UL>
+<B>SYNOPSIS</B>
+<UL>#include "web_server.h"<BR><BR>void web_client_setcookie(char *<U>key</U>, char *<U>value</U>, char *<U>timeoffset</U>, char *<U>path</U>,char *<U>domain</U>,int <U>secure</U>);</UL>
+<B>DESCRIPTION</B>
+<UL>The web_client_setcookie() function sets a cookie on client browser with key <U>key</U>, value <U>value</U> and expires at <U>timeoffset</U>.<BR>
+timeoffset format is one like <U>sign</U>, <U>number offset</U> and <U>directive</U> <small> (i.e +10m, 10 months)</small>
+	<UL><U>sign</U> is on like '-' or '+'</UL>
+	<UL><U>number offset</U> is like +<U>5</U>M means expires at next 5 minutes </UL>
+	<UL><U>directive</U> is:
+		<UL>S - seconds</UL>
+		<UL>M - minutes</UL>
+		<UL>H - hours</UL>
+		<UL>d - days</UL>
+		<UL>m - months</UL>
+		<UL>y - years</UL>
+	</UL>
+	path - Subset of URLs in a domain for which the cookie is valid
+           (If the path is not specified (path == NULL), it as assumed to be
+            the same path as the document being described by the header which
+            contains the cookie.)<BR>
+    domain = Domain the cookie is valid for
+             (If the domain is not set (domain == NULL), the default value of
+             domain is the host name of the server which generated the cookie
+             response.)<BR>
+	secure = If a cookie is marked secure (secure == 1), it will only be
+             transmitted if the communications channel with the host is a
+             secure one. Currently this means that secure cookies will only be
+             sent to HTTPS (HTTP over SSL) servers.
+             (If secure is not specified (secure == 0), a cookie is considered
+              safe to be sent in the clear over unsecured channels. )<BR>
+ 
+</UL>
+<B>NOTE</B>
+<UL> The web_client_setcookie() function should be called <B>only</B> from functions called by gethandlers registered via <a href='/?help=functions#web_server_addhandler'>web_server_addhandler()</a><BR></UL>
+<HR><BR>
+
+
+<A name=web_client_deletecookie><B><font color='000077'>web_client_deletecookie()</font></B><BR><BR>
+<B>NAME</B>
+<UL>web_client_deletecookie - delete a cookie</UL>
+<B>SYNOPSIS</B>
+<UL>#include "web_server.h"<BR><BR>void web_client_deletecookie(char *<U>key</U>);</UL>
+<B>DESCRIPTION</B>
+<UL>The web_client_deletecookie() function delete a cookie on client browser with key <U>key</U><BR>
+
+</UL>
+<B>NOTE</B>
+<UL> The web_client_deletecookie() function should be called <B>only</B> from functions called by gethandlers registered via <a href='/?help=functions#web_server_addhandler'>web_server_addhandler()</a><BR></UL>
+<HR><BR>
+
+<A name=web_client_setvar><B><font color='000077'>web_client_setvar()</font></B><BR><BR>
+<B>NAME</B>
+<UL>web_client_setvar - sets a variable</UL>
+<B>SYNOPSIS</B>
+<UL>#include "web_server.h"<BR><BR>int web_client_setvar(char *<U>name</U>, char *<U>value</U>);</UL>
+<B>DESCRIPTION</B>
+<UL>The web_client_setvar() function sets an variable named <U>name</U> with value <U>value</U> in a connection, to be used in output (only available if WS_DYNVAR flag used)<BR>
+	 web_client_setvar("bgc","#ff00dd");<BR>
+     printf("&lt;BODY bgcolor='$bgc;'&gt;");  - will exchange the string $bgc; to #ff00dd on output</UL>
+
+<B>NOTE</B>
+<UL>The web_client_setvar() function <B>should</B> be called <B>only</B> from functions called by gethandlers registered via <a href='/?help=functions#web_server_addhandler'>web_server_addhandler()</a>.</UL>
+<HR><BR>
+
+<A name=web_client_getvar><B><font color='000077'>web_client_getvar()</font></B><BR><BR>
+<B>NAME</B>
+<UL>web_client_getvar - gets a variable value</UL>
+<B>SYNOPSIS</B>
+<UL>#include "web_server.h"<BR><BR>int web_client_getvar(char *<U>name</U>);</UL>
+<B>DESCRIPTION</B>
+<UL>The web_client_getvar() function gets the value of variable <U>name</U>, (see also <a href=/?help=functions#web_client_setvar>web_client_setvar()</a>)<BR></UL>
+<B>NOTE</B>
+<UL>The web_client_getvar() function <B>should</B> be called <B>only</B> from functions called by gethandlers registered via <a href='/?help=functions#web_server_addhandler'>web_server_addhandler()</a>.</UL>
+<HR><BR>
+
+<A name=web_client_delvar><B><font color='000077'>web_client_delvar()</font></B><BR><BR>
+<B>NAME</B>
+<UL>web_client_delvar - delete a variable</UL>
+<B>SYNOPSIS</B>
+<UL>#include "web_server.h"<BR><BR>int web_client_delvar(char *<U>name</U>);</UL>
+<B>DESCRIPTION</B>
+<UL>The web_client_delvar() function deletes a variable with name <U>name</U><BR></UL>
+<B>NOTE</B>
+<UL>The web_client_delvar() function <B>should</B> be called <B>only</B> from functions called by gethandlers registered via <a href='/?help=functions#web_server_addhandler'>web_server_addhandler()</a>.</UL>
+<HR><BR>
+
+
+<A name=web_client_HTTPdirective><B><font color='000077'>web_client_HTTPdirective()</font></B><BR><BR>
+<B>NAME</B>
+<UL>web_client_HTTPdirective - Change the HTTP header status</UL>
+<B>SYNOPSIS</B>
+<UL>#include "web_server.h"<BR><BR>void web_client_HTTPdirective(char *<U>directive</U>);</UL>
+<B>DESCRIPTION</B>
+<UL>The web_client_HTTPdirective() function changes the HTTP header status (i.e. "HTTP/1.1 200 OK") to the string <U>directive</U><BR>
+<small><i>useful for "HTTP/1.1 401 Authorization Required" (to require a password), redirection or similar actions on the client side</i></small>.</UL>
+ <B>NOTE</B>
+<UL>The web_client_HTTPdirective() function can be called <B>only</B> from functions called by gethandlers registered via <a href='/?help=functions#web_server_addhandler'>web_server_addhandler()</a>.</UL>
+<HR><BR>
+
+<A name=web_client_contenttype><B><font color='000077'>web_client_contenttype()</font></B><BR><BR>
+<B>NAME</B>
+<UL>web_client_contenttype - prints to stdout the header "Content-type: */*"</UL>
+<B>SYNOPSIS</B>
+<UL>#include "web_server.h"<BR><BR>void web_client_contenttype(char *<U>extension</U>);</UL>
+<B>DESCRIPTION</B>
+<UL>The web_client_contenttype() prints to stdout the header "Content-type: */*", where '*/*' is determined by <U>extension</U> (i.e. "html" based on mimefile produces "Content-type: text/html\r\n\r\n" and "jpg" produces "Content-type: image/jpeg\r\n\r\n")<BR>
+<small>this function is used on <a href="/?help=functions#web_server_aliasdir">web_server_aliasdir()</a></small></UL>
+ <B>NOTE</B>
+<UL>This function uses mime types loaded at <a href="/?help=functions#web_server_useMIMEfile">web_server_useMIMEfile()</a> else it will print only "Content-type: text/plain\r\n\r\n"</UL>
+<HR><BR>
+
+<A name=web_log><B><font color='000077'>web_log()</font></B><BR><BR>
+<B>NAME</B>
+<UL>web_log - write to logfile</UL>
+<B>SYNOPSIS</B>
+<UL>#include "web_server.h"<BR><BR>void web_log(const char *<U>format</U>,<U>...</U>);</UL>
+<B>DESCRIPTION</B>
+<UL>The web_log() is similar to printf, but writes to a logfile (specified in <a href=/?help=functions#web_server_init>web_server_init()</a>). Just as printf, it doesn't add a newline at the end.</UL>
+ <B>NOTE</B>
+<UL>The web_log() function <B>should</B> be called <B>only</B> from functions called by gethandlers registered via <a href='/?help=functions#web_server_addhandler'>web_server_addhandler()</a>.</UL>
+<HR><BR>
+
+<A name=ClientInfo><B><font color='000077'>ClientInfo</font></B><BR><BR>
+<B>NAME</B>
+<UL>ClientInfo - a struct to control client Header</UL>
+<B>SYNOPSIS</B>
+<UL> Declared in web_server.h <BR><BR>
+extern struct ClientInfo {<BR>
+<UL>
+        int <U>outfd</U>;<BR>
+        char *<U>inetname</U>;<BR>
+        char *<U>request</U>;<BR>
+        char *<U>method</U>;<BR>
+        char *<U>user</U>;<BR>
+        char *<U>pass</U>;<BR>
+		char *(*<U>Header</U>)(char *handle);<BR>
+        char *(*<U>Query</U>)(char *handle);<BR>
+        char *(*<U>Post</U>)(char *handle);<BR>
+        char *(*<U>Cookie</U>)(char *handle);<BR>
+		char *(*<U>Conf</U>)(char *handle);<BR>
+        struct _MultiPart (*<U>MultiPart</U>)(char *handle);<BR>
+        void *__pad[5];<BR>
+</UL>
+} *<U>ClientInfo</U>;
+</UL>
+<B>DESCRIPTION</B>
+<UL>
+<B>ClientInfo-&gt;<U>outfd</U></B> <UL>is the filedescriptor of the current output stream (useful for cgi handlers and friends).</UL><BR>
+<B>ClientInfo-&gt;<U>inetname</U></B> <UL>a string to inetname (i.e. "127.0.0.1")</UL> <BR>
+<B>ClientInfo-&gt;<U>request</U></B> <UL>is the requested 'file' (i.e. for "GET /index.html HTTP/1.0\r\n" the ClientInfo-&gt;request is "/index.html")</UL><BR>
+<B>ClientInfo-&gt;<U>method</U></B> <UL>is the request method ("GET" or "POST" etc..)</UL><BR>
+<B>ClientInfo-&gt;<U>user</U></B> <UL>AuthRealm username</UL><BR>
+<B>ClientInfo-&gt;<U>pass</U></B> <UL>AuthRealm password</UL><BR>
+<B>ClientInfo-&gt;<U>Header(</U>char *<U>handle</U>)</B> <UL>Function to parse the header, and returns Header information (i.e. for "Host: http://127.0.0.1:81" the result of ClientInfo-&gt;Header("Host") is "http://127.0.0.1:81") if argument <U>handle</U> is NULL then this function returns whole Header from client</UL><BR>
+<B>ClientInfo-&gt;<U>Query(</U>char *<U>handle</U>)</B> <UL>A function that returns the query value from the browser (i.e for the request "http://somehost.net/req.html?id=5&f=1", ClientInfo-&gt;Query("id") is "5".if argument <U>handle</U> is NULL then this function returns whole Query string from client<BR>if the handle have the char # first (like "#handle") it returns the number of variables (usefull for checkboxes and etc...) Check <a href='/?help=examples#checkbox'>checkbox example</a></UL><BR>
+<B>ClientInfo-&gt;<U>Post(</U>char *<U>handle</U>)</B> <UL>A function that returns the Post data from the forms with method 'POST'. <U>handle</U> is the name of some &lt;input&gt; tag.if argument <U>handle</U> is NULL then this function returns whole Post data from client<BR>if the handle have the char # first (like "#handle") it returns the number of variables (usefull for checkboxes and etc...) Check <a href='/?help=examples#checkbox'>checkbox example</a></UL><BR>
+<B>ClientInfo-&gt;<U>Cookie(</U>char *<U>handle</U>)</B> <UL>A function that returns the Cookie data from browser. if argument <U>handle</U> is NULL then this function returns whole Cookiestring from client</UL><BR>
+<B>ClientInfo-&gt;<U>Conf(</U>char * <U>topic</U>,char *<U>handle</U>)</B> <UL>A function that returns an value from a <U>key</U> in <U>topic</U> in the config file if used</UL><BR>
+<B>ClientInfo-&gt;<U>MultiPart(</U>char *<U>handle</U>)</B> <UL>A function that returns a data structure from the forms with method 'POST' and enctype='multipart/form-data' (useful for uploading files). <U>handle</U> is the name of some &lt;input&gt; tag.<BR><BR>
+the structure is<BR>
+struct _MultiPart {
+<UL>
+char *<U>id</u>;<BR>
+char *<U>data</U>;<BR>
+unsigned int <U>size</U>;<BR>
+char *<U>filename</U>;<BR>
+void *<U>pad</U>;<BR>
+</UL>
+};<BR>
+to be used as ClientInfo-&gt;<U>MultiPart</U>("file1").<U>data</U>; ClientInfo-&gt;<U>MultiPart</U>("file1").<U>size</U>; ClientInfo-&gt;<U>MultiPart</U>("file1").<U>filename</U>;
+</UL>
+
+</UL>
+<HR><BR>
+<A name=configfile><B><font color='000077'>The config file</font></B><BR><BR>
+<UL>the config file is used as<BR><BR>
+<PRE>
+[TOPIC]
+KEY=VALUE
+
+libwebserver configurations must be in topic LIBWEBSERVER as:
+[LIBWEBSERVER]
+LOG=help.log 
+PORT=80
+USESSL=1
+CERTFILE=foocert.pm
+MIMEFILE=/etc/mime.types
+LOCAL=1
+
+LOG -> the log file
+PORT -> the listen port that will be used for tcp connections
+
+USESSL -> the ssl flag if you want to use openssl for secure server (https)
+CERTFILE -> the file that contains certificate for ssl connections
+MIMEFILE -> the file that contains mime.types similer to apache mimefile
+LOCAL -> only accept connections from 127.0.0.1
+
+</PRE>
+</UL>
+
+</font>
+
+
+

+ 25 - 0
doc/info.html

@@ -0,0 +1,25 @@
+<center><H3><font color='007700'>libwebserver Info</font></H3></center><BR><BR>
+<A name=what><B><font color='000077'>What's libwebserver for?</font></B><BR>
+<UL>This lib is intended to add webserver functionality to programs instead of using an external webserver.<BR>
+	Two examples for embedded webservers that i know of are simple (shoutcast (i guess), and webTV (teletext as a webpage (from pinnacle)); and many others probably do the same.
+</UL>
+<HR>
+<A name=who><B><font color='000077'>Who's supposed to use libwebserver?</font></B>
+<UL>This is mainly developed for developers to make it easier to write a web interface to their software, (note a webbrowser is commonly available in most operating
+             systems) so it is like a portable "terminal" that can be accessed from any computer (with a browser of course...).</UL>
+<HR>
+<A name=when><B><font color='000077'>When am i supposed to use libwebserver?</font></B>
+<UL>For example, imagine that you are developing a daemon and want to check stats or re-configure at run-time;
+                  with this library you can add a listen port for runtime, and connect with whatever browser (via HTML interface)
+                  without dependencies of an external webserver.<BR>
+                  You can even do a webserver (of course), just use your imagination.<BR>
+                  Another quite simple example, a sound recorder (using only local connections for security reasons) uses a web interface to control
+                  /dev/dsp reading/writing (via HTML interface).
+                  there are many other things you can do ...</UL>
+
+<HR>
+<A name=server_scripts><B><font color='000077'>Is there support for server scripts such as .php .cgi .asp?</font></B>
+<UL> Well, this library only provides web server functions that make a server running, server scripts can be supported if you want to do it:
+      you can develop a handler for type ".something" or whatever, this package provides a .cgi handler as an example, (use at your own risk or make it better).</UL>
+
+

+ 67 - 0
doc/security.html

@@ -0,0 +1,67 @@
+<center><H3><font color='007700'>libwebserver Security</font></H3></center><BR><BR>
+
+<A name=what><B><font color='000077'>Is it safe to use?</font></B><BR>
+<UL>Well, I can't promise that it's a secure software since that not only depends on the software, 
+         but all i can say is that wasn't found any security bug yet, this was developed intended to be secure,  
+		 you can use openssl (encrypted streams) to protect information that passes from webserver(lib) to client</UL>
+	
+<A name=certificate><B><font color='000077'>How do I create my own certificate?</font></B><BR>
+<UL>You can either buy one from one of the big vendors (see your browser's stored certificates
+	for their addresses) or self-sign a self-created one. The upside of the bought
+	certificates is, that the webbrowser doesn't ask if the user wants to
+	accept that certificate, but instead checks with the certification authority
+	you bought your certificate from.<br>
+	The downside is that it costs quite a lot of money.<br>
+	To create your own certificate use openssl like that:
+	<ul><li>create a key and request:<br>
+		<pre><b>openssl req -new > foo-cert.csr</b></pre><br>
+		As "Common Name" you have to type in the name part of
+		your URL, i.e. if your web site will be
+		"https://www.libwebserver.rules:443/" the Common Name is
+		"www.libwebserver.rules".
+	<li> remove the passphrase from the key:<br>
+		<pre><b>openssl rsa -in privkey.pem -out foo-cert.key</b></pre><br>
+	<li>convert request into a signed certificate:<br>
+		<pre><b>openssl x509 -in foo-cert.csr -out foo-cert.cert -req -signkey foo-cert.key -days 356</b></pre><br>
+	<li>create .pem file:<br>
+		<pre><b>cat foo-cert.cert foo-cert.key >foo-cert.pem</b></pre><br>
+	</ul>
+</ul>
+
+
+<A name=tips><B><font size=4 color='770077'>Security tips</font></B><BR><HR>
+
+<A name=racecondition><B><font color='000077'>Avoid race condition problems</font></B><BR>
+<UL>
+	<B> What is race condition?</B>
+		<UL>A race condition occurs when two or more operations occur in an 
+      undefined manner (McKusick et al. 1996). Specifically in file 
+      system races the attacker attempts to change the state of the 
+      file system in between two file system operations on the part 
+      of the program.</UL><BR> 
+	<B> How the lib determine temporary file name?</B>
+	<UL> 
+	<li>generate file name (note: keep generating until it doesn't exists)<BR></li>
+	<li>check if file exists<BR>
+	-<small>attacker can create the file now, if he knows the right filename</small><BR></li>
+	<li>check if symlink exists<BR>
+	-<small>attacker can create the symlink now, if he knows the right filename</small><BR></li>
+	<li>create the file and redirect stdout to it <BR>
+	-<small>attacker can open the file and write to it</small><BR></li>
+	<li>places a lock into file (note: not in win98)<BR> </li>
+	<li>users operations, write, flush, read<BR></li>
+	<li>unlink the filename from the OS<BR></li>
+	</UL><BR>
+	
+	
+	libwebserver uses temporary filenames to hold and process data before send it to client, it uses the ambient variables to 
+	determine temporary directory by following order "$TEMP,$TMP,$TMPDIR and the stdio.h P_tmpdir", libwebserver have several checks
+	and it locks file for avoid attackers from messing with temporary files, meanwhile is safely to change the tempdir (setting the ambient variable)
+	to an directory that is not writable for everyone and writable to lib (setenv("TEMP","/safedir"); you can do it before the web_server_run function
+
+	
+
+</UL>
+
+
+

+ 7 - 0
include/Makefile.am

@@ -0,0 +1,7 @@
+SUBDIRS = .
+
+webserverincludedir = $(includedir)/GNUnet
+
+webserverinclude_HEADERS = \
+  webserver_gnunet.h
+

+ 0 - 0
include/webserver_gnunet.h


+ 6871 - 0
ltmain.sh

@@ -0,0 +1,6871 @@
+# ltmain.sh - Provide generalized library-building support services.
+# NOTE: Changing this file will not affect anything until you rerun configure.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit <[email protected]>, 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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.
+
+basename="s,^.*/,,g"
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath="$0"
+
+# The name of this program:
+progname=`echo "$progpath" | $SED $basename`
+modename="$progname"
+
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+PROGRAM=ltmain.sh
+PACKAGE=libtool
+VERSION="1.5.22 Debian 1.5.22-4"
+TIMESTAMP=" (1.1220.2.365 2005/12/18 22:14:06)"
+
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes.
+if test -n "${ZSH_VERSION+set}" ; then
+  setopt NO_GLOB_SUBST
+fi
+
+# Check that we have a working $echo.
+if test "X$1" = X--no-reexec; then
+  # Discard the --no-reexec flag, and continue.
+  shift
+elif test "X$1" = X--fallback-echo; then
+  # Avoid inline document here, it may be left over
+  :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
+  # Yippee, $echo works!
+  :
+else
+  # Restart under the correct shell, and then maybe $echo will work.
+  exec $SHELL "$progpath" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+  # used as fallback echo
+  shift
+  cat <<EOF
+$*
+EOF
+  exit $EXIT_SUCCESS
+fi
+
+default_mode=
+help="Try \`$progname --help' for more information."
+magic="%%%MAGIC variable%%%"
+mkdir="mkdir"
+mv="mv -f"
+rm="rm -f"
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g'
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  SP2NL='tr \040 \012'
+  NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  SP2NL='tr \100 \n'
+  NL2SP='tr \r\n \100\100'
+  ;;
+esac
+
+# NLS nuisances.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+# We save the old values to restore during execute mode.
+if test "${LC_ALL+set}" = set; then
+  save_LC_ALL="$LC_ALL"; LC_ALL=C; export LC_ALL
+fi
+if test "${LANG+set}" = set; then
+  save_LANG="$LANG"; LANG=C; export LANG
+fi
+
+# Make sure IFS has a sensible default
+lt_nl='
+'
+IFS=" 	$lt_nl"
+
+if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+  $echo "$modename: not configured to build any kind of library" 1>&2
+  $echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
+  exit $EXIT_FAILURE
+fi
+
+# Global variables.
+mode=$default_mode
+nonopt=
+prev=
+prevopt=
+run=
+show="$echo"
+show_help=
+execute_dlfiles=
+duplicate_deps=no
+preserve_args=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+
+#####################################
+# Shell function definitions:
+# This seems to be the best place for them
+
+# func_mktempdir [string]
+# Make a temporary directory that won't clash with other running
+# libtool processes, and avoids race conditions if possible.  If
+# given, STRING is the basename for that directory.
+func_mktempdir ()
+{
+    my_template="${TMPDIR-/tmp}/${1-$progname}"
+
+    if test "$run" = ":"; then
+      # Return a directory name, but don't create it in dry-run mode
+      my_tmpdir="${my_template}-$$"
+    else
+
+      # If mktemp works, use that first and foremost
+      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+
+      if test ! -d "$my_tmpdir"; then
+	# Failing that, at least try and use $RANDOM to avoid a race
+	my_tmpdir="${my_template}-${RANDOM-0}$$"
+
+	save_mktempdir_umask=`umask`
+	umask 0077
+	$mkdir "$my_tmpdir"
+	umask $save_mktempdir_umask
+      fi
+
+      # If we're not in dry-run mode, bomb out on failure
+      test -d "$my_tmpdir" || {
+        $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2
+	exit $EXIT_FAILURE
+      }
+    fi
+
+    $echo "X$my_tmpdir" | $Xsed
+}
+
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+func_win32_libid ()
+{
+  win32_libid_type="unknown"
+  win32_fileres=`file -L $1 2>/dev/null`
+  case $win32_fileres in
+  *ar\ archive\ import\ library*) # definitely import
+    win32_libid_type="x86 archive import"
+    ;;
+  *ar\ archive*) # could be an import, or static
+    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \
+      $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
+      win32_nmres=`eval $NM -f posix -A $1 | \
+	$SED -n -e '1,100{/ I /{s,.*,import,;p;q;};}'`
+      case $win32_nmres in
+      import*)  win32_libid_type="x86 archive import";;
+      *)        win32_libid_type="x86 archive static";;
+      esac
+    fi
+    ;;
+  *DLL*)
+    win32_libid_type="x86 DLL"
+    ;;
+  *executable*) # but shell scripts are "executable" too...
+    case $win32_fileres in
+    *MS\ Windows\ PE\ Intel*)
+      win32_libid_type="x86 DLL"
+      ;;
+    esac
+    ;;
+  esac
+  $echo $win32_libid_type
+}
+
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+    if test -n "$available_tags" && test -z "$tagname"; then
+      CC_quoted=
+      for arg in $CC; do
+	case $arg in
+	  *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	  arg="\"$arg\""
+	  ;;
+	esac
+	CC_quoted="$CC_quoted $arg"
+      done
+      case $@ in
+      # Blanks in the command may have been stripped by the calling shell,
+      # but not from the CC environment variable when configure was run.
+      " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;;
+      # Blanks at the start of $base_compile will cause this to fail
+      # if we don't check for them as well.
+      *)
+	for z in $available_tags; do
+	  if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+	    # Evaluate the configuration.
+	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+	    CC_quoted=
+	    for arg in $CC; do
+	    # Double-quote args containing other shell metacharacters.
+	    case $arg in
+	      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	      arg="\"$arg\""
+	      ;;
+	    esac
+	    CC_quoted="$CC_quoted $arg"
+	  done
+	    case "$@ " in
+	      " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*)
+	      # The compiler in the base compile command matches
+	      # the one in the tagged configuration.
+	      # Assume this is the tagged configuration we want.
+	      tagname=$z
+	      break
+	      ;;
+	    esac
+	  fi
+	done
+	# If $tagname still isn't set, then no tagged configuration
+	# was found and let the user know that the "--tag" command
+	# line option must be used.
+	if test -z "$tagname"; then
+	  $echo "$modename: unable to infer tagged configuration"
+	  $echo "$modename: specify a tag with \`--tag'" 1>&2
+	  exit $EXIT_FAILURE
+#        else
+#          $echo "$modename: using $tagname tagged configuration"
+	fi
+	;;
+      esac
+    fi
+}
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+    f_ex_an_ar_dir="$1"; shift
+    f_ex_an_ar_oldlib="$1"
+
+    $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)"
+    $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $?
+    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+     :
+    else
+      $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2
+      exit $EXIT_FAILURE
+    fi
+}
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+    my_gentop="$1"; shift
+    my_oldlibs=${1+"$@"}
+    my_oldobjs=""
+    my_xlib=""
+    my_xabs=""
+    my_xdir=""
+    my_status=""
+
+    $show "${rm}r $my_gentop"
+    $run ${rm}r "$my_gentop"
+    $show "$mkdir $my_gentop"
+    $run $mkdir "$my_gentop"
+    my_status=$?
+    if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then
+      exit $my_status
+    fi
+
+    for my_xlib in $my_oldlibs; do
+      # Extract the objects.
+      case $my_xlib in
+	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+	*) my_xabs=`pwd`"/$my_xlib" ;;
+      esac
+      my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'`
+      my_xdir="$my_gentop/$my_xlib"
+
+      $show "${rm}r $my_xdir"
+      $run ${rm}r "$my_xdir"
+      $show "$mkdir $my_xdir"
+      $run $mkdir "$my_xdir"
+      exit_status=$?
+      if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then
+	exit $exit_status
+      fi
+      case $host in
+      *-darwin*)
+	$show "Extracting $my_xabs"
+	# Do not bother doing anything if just a dry run
+	if test -z "$run"; then
+	  darwin_orig_dir=`pwd`
+	  cd $my_xdir || exit $?
+	  darwin_archive=$my_xabs
+	  darwin_curdir=`pwd`
+	  darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'`
+	  darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null`
+	  if test -n "$darwin_arches"; then 
+	    darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'`
+	    darwin_arch=
+	    $show "$darwin_base_archive has multiple architectures $darwin_arches"
+	    for darwin_arch in  $darwin_arches ; do
+	      mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
+	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+	      cd "$darwin_curdir"
+	      $rm "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+	    done # $darwin_arches
+      ## Okay now we have a bunch of thin objects, gotta fatten them up :)
+	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP`
+	    darwin_file=
+	    darwin_files=
+	    for darwin_file in $darwin_filelist; do
+	      darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
+	      lipo -create -output "$darwin_file" $darwin_files
+	    done # $darwin_filelist
+	    ${rm}r unfat-$$
+	    cd "$darwin_orig_dir"
+	  else
+	    cd "$darwin_orig_dir"
+ 	    func_extract_an_archive "$my_xdir" "$my_xabs"
+	  fi # $darwin_arches
+	fi # $run
+	;;
+      *)
+        func_extract_an_archive "$my_xdir" "$my_xabs"
+        ;;
+      esac
+      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
+    done
+    func_extract_archives_result="$my_oldobjs"
+}
+# End of Shell function definitions
+#####################################
+
+# Darwin sucks
+eval std_shrext=\"$shrext_cmds\"
+
+disable_libs=no
+
+# Parse our command line options once, thoroughly.
+while test "$#" -gt 0
+do
+  arg="$1"
+  shift
+
+  case $arg in
+  -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;
+  *) optarg= ;;
+  esac
+
+  # If the previous option needs an argument, assign it.
+  if test -n "$prev"; then
+    case $prev in
+    execute_dlfiles)
+      execute_dlfiles="$execute_dlfiles $arg"
+      ;;
+    tag)
+      tagname="$arg"
+      preserve_args="${preserve_args}=$arg"
+
+      # Check whether tagname contains only valid characters
+      case $tagname in
+      *[!-_A-Za-z0-9,/]*)
+	$echo "$progname: invalid tag name: $tagname" 1>&2
+	exit $EXIT_FAILURE
+	;;
+      esac
+
+      case $tagname in
+      CC)
+	# Don't test for the "default" C tag, as we know, it's there, but
+	# not specially marked.
+	;;
+      *)
+	if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then
+	  taglist="$taglist $tagname"
+	  # Evaluate the configuration.
+	  eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`"
+	else
+	  $echo "$progname: ignoring unknown tag $tagname" 1>&2
+	fi
+	;;
+      esac
+      ;;
+    *)
+      eval "$prev=\$arg"
+      ;;
+    esac
+
+    prev=
+    prevopt=
+    continue
+  fi
+
+  # Have we seen a non-optional argument yet?
+  case $arg in
+  --help)
+    show_help=yes
+    ;;
+
+  --version)
+    $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP"
+    $echo
+    $echo "Copyright (C) 2005  Free Software Foundation, Inc."
+    $echo "This is free software; see the source for copying conditions.  There is NO"
+    $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+    exit $?
+    ;;
+
+  --config)
+    ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath
+    # Now print the configurations for the tags.
+    for tagname in $taglist; do
+      ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath"
+    done
+    exit $?
+    ;;
+
+  --debug)
+    $echo "$progname: enabling shell trace mode"
+    set -x
+    preserve_args="$preserve_args $arg"
+    ;;
+
+  --dry-run | -n)
+    run=:
+    ;;
+
+  --features)
+    $echo "host: $host"
+    if test "$build_libtool_libs" = yes; then
+      $echo "enable shared libraries"
+    else
+      $echo "disable shared libraries"
+    fi
+    if test "$build_old_libs" = yes; then
+      $echo "enable static libraries"
+    else
+      $echo "disable static libraries"
+    fi
+    exit $?
+    ;;
+
+  --finish) mode="finish" ;;
+
+  --mode) prevopt="--mode" prev=mode ;;
+  --mode=*) mode="$optarg" ;;
+
+  --preserve-dup-deps) duplicate_deps="yes" ;;
+
+  --quiet | --silent)
+    show=:
+    preserve_args="$preserve_args $arg"
+    ;;
+
+  --tag)
+    prevopt="--tag"
+    prev=tag
+    preserve_args="$preserve_args --tag"
+    ;;
+  --tag=*)
+    set tag "$optarg" ${1+"$@"}
+    shift
+    prev=tag
+    preserve_args="$preserve_args --tag"
+    ;;
+
+  -dlopen)
+    prevopt="-dlopen"
+    prev=execute_dlfiles
+    ;;
+
+  -*)
+    $echo "$modename: unrecognized option \`$arg'" 1>&2
+    $echo "$help" 1>&2
+    exit $EXIT_FAILURE
+    ;;
+
+  *)
+    nonopt="$arg"
+    break
+    ;;
+  esac
+done
+
+if test -n "$prevopt"; then
+  $echo "$modename: option \`$prevopt' requires an argument" 1>&2
+  $echo "$help" 1>&2
+  exit $EXIT_FAILURE
+fi
+
+case $disable_libs in
+no) 
+  ;;
+shared)
+  build_libtool_libs=no
+  build_old_libs=yes
+  ;;
+static)
+  build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+  ;;
+esac
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+if test -z "$show_help"; then
+
+  # Infer the operation mode.
+  if test -z "$mode"; then
+    $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2
+    $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2
+    case $nonopt in
+    *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*)
+      mode=link
+      for arg
+      do
+	case $arg in
+	-c)
+	   mode=compile
+	   break
+	   ;;
+	esac
+      done
+      ;;
+    *db | *dbx | *strace | *truss)
+      mode=execute
+      ;;
+    *install*|cp|mv)
+      mode=install
+      ;;
+    *rm)
+      mode=uninstall
+      ;;
+    *)
+      # If we have no mode, but dlfiles were specified, then do execute mode.
+      test -n "$execute_dlfiles" && mode=execute
+
+      # Just use the default operation mode.
+      if test -z "$mode"; then
+	if test -n "$nonopt"; then
+	  $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2
+	else
+	  $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2
+	fi
+      fi
+      ;;
+    esac
+  fi
+
+  # Only execute mode is allowed to have -dlopen flags.
+  if test -n "$execute_dlfiles" && test "$mode" != execute; then
+    $echo "$modename: unrecognized option \`-dlopen'" 1>&2
+    $echo "$help" 1>&2
+    exit $EXIT_FAILURE
+  fi
+
+  # Change the help message to a mode-specific one.
+  generic_help="$help"
+  help="Try \`$modename --help --mode=$mode' for more information."
+
+  # These modes are in order of execution frequency so that they run quickly.
+  case $mode in
+  # libtool compile mode
+  compile)
+    modename="$modename: compile"
+    # Get the compilation command and the source file.
+    base_compile=
+    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
+    suppress_opt=yes
+    suppress_output=
+    arg_mode=normal
+    libobj=
+    later=
+
+    for arg
+    do
+      case $arg_mode in
+      arg  )
+	# do not "continue".  Instead, add this to base_compile
+	lastarg="$arg"
+	arg_mode=normal
+	;;
+
+      target )
+	libobj="$arg"
+	arg_mode=normal
+	continue
+	;;
+
+      normal )
+	# Accept any command-line options.
+	case $arg in
+	-o)
+	  if test -n "$libobj" ; then
+	    $echo "$modename: you cannot specify \`-o' more than once" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	  arg_mode=target
+	  continue
+	  ;;
+
+	-static | -prefer-pic | -prefer-non-pic)
+	  later="$later $arg"
+	  continue
+	  ;;
+
+	-no-suppress)
+	  suppress_opt=no
+	  continue
+	  ;;
+
+	-Xcompiler)
+	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
+	  continue      #  The current "srcfile" will either be retained or
+	  ;;            #  replaced later.  I would guess that would be a bug.
+
+	-Wc,*)
+	  args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"`
+	  lastarg=
+	  save_ifs="$IFS"; IFS=','
+ 	  for arg in $args; do
+	    IFS="$save_ifs"
+
+	    # Double-quote args containing other shell metacharacters.
+	    # Many Bourne shells cannot handle close brackets correctly
+	    # in scan sets, so we specify it separately.
+	    case $arg in
+	      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	      arg="\"$arg\""
+	      ;;
+	    esac
+	    lastarg="$lastarg $arg"
+	  done
+	  IFS="$save_ifs"
+	  lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"`
+
+	  # Add the arguments to base_compile.
+	  base_compile="$base_compile $lastarg"
+	  continue
+	  ;;
+
+	* )
+	  # Accept the current argument as the source file.
+	  # The previous "srcfile" becomes the current argument.
+	  #
+	  lastarg="$srcfile"
+	  srcfile="$arg"
+	  ;;
+	esac  #  case $arg
+	;;
+      esac    #  case $arg_mode
+
+      # Aesthetically quote the previous argument.
+      lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"`
+
+      case $lastarg in
+      # Double-quote args containing other shell metacharacters.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, and some SunOS ksh mistreat backslash-escaping
+      # in scan sets (worked around with variable expansion),
+      # and furthermore cannot handle '|' '&' '(' ')' in scan sets 
+      # at all, so we specify them separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	lastarg="\"$lastarg\""
+	;;
+      esac
+
+      base_compile="$base_compile $lastarg"
+    done # for arg
+
+    case $arg_mode in
+    arg)
+      $echo "$modename: you must specify an argument for -Xcompile"
+      exit $EXIT_FAILURE
+      ;;
+    target)
+      $echo "$modename: you must specify a target with \`-o'" 1>&2
+      exit $EXIT_FAILURE
+      ;;
+    *)
+      # Get the name of the library object.
+      [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'`
+      ;;
+    esac
+
+    # Recognize several different file suffixes.
+    # If the user specifies -o file.o, it is replaced with file.lo
+    xform='[cCFSifmso]'
+    case $libobj in
+    *.ada) xform=ada ;;
+    *.adb) xform=adb ;;
+    *.ads) xform=ads ;;
+    *.asm) xform=asm ;;
+    *.c++) xform=c++ ;;
+    *.cc) xform=cc ;;
+    *.ii) xform=ii ;;
+    *.class) xform=class ;;
+    *.cpp) xform=cpp ;;
+    *.cxx) xform=cxx ;;
+    *.f90) xform=f90 ;;
+    *.for) xform=for ;;
+    *.java) xform=java ;;
+    esac
+
+    libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
+
+    case $libobj in
+    *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;;
+    *)
+      $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2
+      exit $EXIT_FAILURE
+      ;;
+    esac
+
+    func_infer_tag $base_compile
+
+    for arg in $later; do
+      case $arg in
+      -static)
+	build_old_libs=yes
+	continue
+	;;
+
+      -prefer-pic)
+	pic_mode=yes
+	continue
+	;;
+
+      -prefer-non-pic)
+	pic_mode=no
+	continue
+	;;
+      esac
+    done
+
+    qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"`
+    case $qlibobj in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	qlibobj="\"$qlibobj\"" ;;
+    esac
+    test "X$libobj" != "X$qlibobj" \
+	&& $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' 	&()|`$[]' \
+	&& $echo "$modename: libobj name \`$libobj' may not contain shell special characters."
+    objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
+    xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
+    if test "X$xdir" = "X$obj"; then
+      xdir=
+    else
+      xdir=$xdir/
+    fi
+    lobj=${xdir}$objdir/$objname
+
+    if test -z "$base_compile"; then
+      $echo "$modename: you must specify a compilation command" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    # Delete any leftover library objects.
+    if test "$build_old_libs" = yes; then
+      removelist="$obj $lobj $libobj ${libobj}T"
+    else
+      removelist="$lobj $libobj ${libobj}T"
+    fi
+
+    $run $rm $removelist
+    trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
+
+    # On Cygwin there's no "real" PIC flag so we must build both object types
+    case $host_os in
+    cygwin* | mingw* | pw32* | os2*)
+      pic_mode=default
+      ;;
+    esac
+    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+      # non-PIC code in shared libraries is not supported
+      pic_mode=default
+    fi
+
+    # Calculate the filename of the output object if compiler does
+    # not support -o with -c
+    if test "$compiler_c_o" = no; then
+      output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
+      lockfile="$output_obj.lock"
+      removelist="$removelist $output_obj $lockfile"
+      trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
+    else
+      output_obj=
+      need_locks=no
+      lockfile=
+    fi
+
+    # Lock this critical section if it is needed
+    # We use this script file to make the link, it avoids creating a new file
+    if test "$need_locks" = yes; then
+      until $run ln "$progpath" "$lockfile" 2>/dev/null; do
+	$show "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    elif test "$need_locks" = warn; then
+      if test -f "$lockfile"; then
+	$echo "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$run $rm $removelist
+	exit $EXIT_FAILURE
+      fi
+      $echo "$srcfile" > "$lockfile"
+    fi
+
+    if test -n "$fix_srcfile_path"; then
+      eval srcfile=\"$fix_srcfile_path\"
+    fi
+    qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"`
+    case $qsrcfile in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+      qsrcfile="\"$qsrcfile\"" ;;
+    esac
+
+    $run $rm "$libobj" "${libobj}T"
+
+    # Create a libtool object file (analogous to a ".la" file),
+    # but don't create it if we're doing a dry run.
+    test -z "$run" && cat > ${libobj}T <<EOF
+# $libobj - a libtool object file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+EOF
+
+    # Only build a PIC object if we are building libtool libraries.
+    if test "$build_libtool_libs" = yes; then
+      # Without this assignment, base_compile gets emptied.
+      fbsd_hideous_sh_bug=$base_compile
+
+      if test "$pic_mode" != no; then
+	command="$base_compile $qsrcfile $pic_flag"
+      else
+	# Don't build PIC code
+	command="$base_compile $qsrcfile"
+      fi
+
+      if test ! -d "${xdir}$objdir"; then
+	$show "$mkdir ${xdir}$objdir"
+	$run $mkdir ${xdir}$objdir
+	exit_status=$?
+	if test "$exit_status" -ne 0 && test ! -d "${xdir}$objdir"; then
+	  exit $exit_status
+	fi
+      fi
+
+      if test -z "$output_obj"; then
+	# Place PIC objects in $objdir
+	command="$command -o $lobj"
+      fi
+
+      $run $rm "$lobj" "$output_obj"
+
+      $show "$command"
+      if $run eval "$command"; then :
+      else
+	test -n "$output_obj" && $run $rm $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$run $rm $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed, then go on to compile the next one
+      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+	$show "$mv $output_obj $lobj"
+	if $run $mv $output_obj $lobj; then :
+	else
+	  error=$?
+	  $run $rm $removelist
+	  exit $error
+	fi
+      fi
+
+      # Append the name of the PIC object to the libtool object file.
+      test -z "$run" && cat >> ${libobj}T <<EOF
+pic_object='$objdir/$objname'
+
+EOF
+
+      # Allow error messages only from the first compilation.
+      if test "$suppress_opt" = yes; then
+        suppress_output=' >/dev/null 2>&1'
+      fi
+    else
+      # No PIC object so indicate it doesn't exist in the libtool
+      # object file.
+      test -z "$run" && cat >> ${libobj}T <<EOF
+pic_object=none
+
+EOF
+    fi
+
+    # Only build a position-dependent object if we build old libraries.
+    if test "$build_old_libs" = yes; then
+      if test "$pic_mode" != yes; then
+	# Don't build PIC code
+	command="$base_compile $qsrcfile"
+      else
+	command="$base_compile $qsrcfile $pic_flag"
+      fi
+      if test "$compiler_c_o" = yes; then
+	command="$command -o $obj"
+      fi
+
+      # Suppress compiler output if we already did a PIC compilation.
+      command="$command$suppress_output"
+      $run $rm "$obj" "$output_obj"
+      $show "$command"
+      if $run eval "$command"; then :
+      else
+	$run $rm $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$echo "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$run $rm $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed
+      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+	$show "$mv $output_obj $obj"
+	if $run $mv $output_obj $obj; then :
+	else
+	  error=$?
+	  $run $rm $removelist
+	  exit $error
+	fi
+      fi
+
+      # Append the name of the non-PIC object the libtool object file.
+      # Only append if the libtool object file exists.
+      test -z "$run" && cat >> ${libobj}T <<EOF
+# Name of the non-PIC object.
+non_pic_object='$objname'
+
+EOF
+    else
+      # Append the name of the non-PIC object the libtool object file.
+      # Only append if the libtool object file exists.
+      test -z "$run" && cat >> ${libobj}T <<EOF
+# Name of the non-PIC object.
+non_pic_object=none
+
+EOF
+    fi
+
+    $run $mv "${libobj}T" "${libobj}"
+
+    # Unlock the critical section if it was locked
+    if test "$need_locks" != no; then
+      $run $rm "$lockfile"
+    fi
+
+    exit $EXIT_SUCCESS
+    ;;
+
+  # libtool link mode
+  link | relink)
+    modename="$modename: link"
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # which system we are compiling for in order to pass an extra
+      # flag for every libtool invocation.
+      # allow_undefined=no
+
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll which has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    libtool_args="$nonopt"
+    base_compile="$nonopt $@"
+    compile_command="$nonopt"
+    finalize_command="$nonopt"
+
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
+    inst_prefix_dir=
+
+    avoid_version=no
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    ltlibs=
+    module=no
+    no_install=no
+    objs=
+    non_pic_objects=
+    notinst_path= # paths that contain not-installed libtool libraries
+    precious_files_regex=
+    prefer_static_libs=no
+    preload=no
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+    vinfo_number=no
+
+    func_infer_tag $base_compile
+
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case $arg in
+      -all-static | -static)
+	if test "X$arg" = "X-all-static"; then
+	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+	    $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2
+	  fi
+	  if test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	else
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=built
+	fi
+	build_libtool_libs=no
+	build_old_libs=yes
+	break
+	;;
+      esac
+    done
+
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+    # Go through the arguments, transforming them on the way.
+    while test "$#" -gt 0; do
+      arg="$1"
+      shift
+      case $arg in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test
+	;;
+      *) qarg=$arg ;;
+      esac
+      libtool_args="$libtool_args $qarg"
+
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+	case $prev in
+	output)
+	  compile_command="$compile_command @OUTPUT@"
+	  finalize_command="$finalize_command @OUTPUT@"
+	  ;;
+	esac
+
+	case $prev in
+	dlfiles|dlprefiles)
+	  if test "$preload" = no; then
+	    # Add the symbol object into the linking commands.
+	    compile_command="$compile_command @SYMFILE@"
+	    finalize_command="$finalize_command @SYMFILE@"
+	    preload=yes
+	  fi
+	  case $arg in
+	  *.la | *.lo) ;;  # We handle these cases below.
+	  force)
+	    if test "$dlself" = no; then
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  self)
+	    if test "$prev" = dlprefiles; then
+	      dlself=yes
+	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+	      dlself=yes
+	    else
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  *)
+	    if test "$prev" = dlfiles; then
+	      dlfiles="$dlfiles $arg"
+	    else
+	      dlprefiles="$dlprefiles $arg"
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  esac
+	  ;;
+	expsyms)
+	  export_symbols="$arg"
+	  if test ! -f "$arg"; then
+	    $echo "$modename: symbol file \`$arg' does not exist"
+	    exit $EXIT_FAILURE
+	  fi
+	  prev=
+	  continue
+	  ;;
+	expsyms_regex)
+	  export_symbols_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	inst_prefix)
+	  inst_prefix_dir="$arg"
+	  prev=
+	  continue
+	  ;;
+	precious_regex)
+	  precious_files_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	release)
+	  release="-$arg"
+	  prev=
+	  continue
+	  ;;
+	objectlist)
+	  if test -f "$arg"; then
+	    save_arg=$arg
+	    moreargs=
+	    for fil in `cat $save_arg`
+	    do
+#	      moreargs="$moreargs $fil"
+	      arg=$fil
+	      # A libtool-controlled object.
+
+	      # Check to see that this really is a libtool object.
+	      if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+		pic_object=
+		non_pic_object=
+
+		# Read the .lo file
+		# If there is no directory component, then add one.
+		case $arg in
+		*/* | *\\*) . $arg ;;
+		*) . ./$arg ;;
+		esac
+
+		if test -z "$pic_object" || \
+		   test -z "$non_pic_object" ||
+		   test "$pic_object" = none && \
+		   test "$non_pic_object" = none; then
+		  $echo "$modename: cannot find name of object for \`$arg'" 1>&2
+		  exit $EXIT_FAILURE
+		fi
+
+		# Extract subdirectory from the argument.
+		xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+		if test "X$xdir" = "X$arg"; then
+		  xdir=
+		else
+		  xdir="$xdir/"
+		fi
+
+		if test "$pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  pic_object="$xdir$pic_object"
+
+		  if test "$prev" = dlfiles; then
+		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		      dlfiles="$dlfiles $pic_object"
+		      prev=
+		      continue
+		    else
+		      # If libtool objects are unsupported, then we need to preload.
+		      prev=dlprefiles
+		    fi
+		  fi
+
+		  # CHECK ME:  I think I busted this.  -Ossama
+		  if test "$prev" = dlprefiles; then
+		    # Preload the old-style object.
+		    dlprefiles="$dlprefiles $pic_object"
+		    prev=
+		  fi
+
+		  # A PIC object.
+		  libobjs="$libobjs $pic_object"
+		  arg="$pic_object"
+		fi
+
+		# Non-PIC object.
+		if test "$non_pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  non_pic_object="$xdir$non_pic_object"
+
+		  # A standard non-PIC object
+		  non_pic_objects="$non_pic_objects $non_pic_object"
+		  if test -z "$pic_object" || test "$pic_object" = none ; then
+		    arg="$non_pic_object"
+		  fi
+		else
+		  # If the PIC object exists, use it instead.
+		  # $xdir was prepended to $pic_object above.
+		  non_pic_object="$pic_object"
+		  non_pic_objects="$non_pic_objects $non_pic_object"
+		fi
+	      else
+		# Only an error if not doing a dry-run.
+		if test -z "$run"; then
+		  $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
+		  exit $EXIT_FAILURE
+		else
+		  # Dry-run case.
+
+		  # Extract subdirectory from the argument.
+		  xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+		  if test "X$xdir" = "X$arg"; then
+		    xdir=
+		  else
+		    xdir="$xdir/"
+		  fi
+
+		  pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
+		  non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
+		  libobjs="$libobjs $pic_object"
+		  non_pic_objects="$non_pic_objects $non_pic_object"
+		fi
+	      fi
+	    done
+	  else
+	    $echo "$modename: link input file \`$save_arg' does not exist"
+	    exit $EXIT_FAILURE
+	  fi
+	  arg=$save_arg
+	  prev=
+	  continue
+	  ;;
+	rpath | xrpath)
+	  # We need an absolute path.
+	  case $arg in
+	  [\\/]* | [A-Za-z]:[\\/]*) ;;
+	  *)
+	    $echo "$modename: only absolute run-paths are allowed" 1>&2
+	    exit $EXIT_FAILURE
+	    ;;
+	  esac
+	  if test "$prev" = rpath; then
+	    case "$rpath " in
+	    *" $arg "*) ;;
+	    *) rpath="$rpath $arg" ;;
+	    esac
+	  else
+	    case "$xrpath " in
+	    *" $arg "*) ;;
+	    *) xrpath="$xrpath $arg" ;;
+	    esac
+	  fi
+	  prev=
+	  continue
+	  ;;
+	xcompiler)
+	  compiler_flags="$compiler_flags $qarg"
+	  prev=
+	  compile_command="$compile_command $qarg"
+	  finalize_command="$finalize_command $qarg"
+	  continue
+	  ;;
+	xlinker)
+	  linker_flags="$linker_flags $qarg"
+	  compiler_flags="$compiler_flags $wl$qarg"
+	  prev=
+	  compile_command="$compile_command $wl$qarg"
+	  finalize_command="$finalize_command $wl$qarg"
+	  continue
+	  ;;
+	xcclinker)
+	  linker_flags="$linker_flags $qarg"
+	  compiler_flags="$compiler_flags $qarg"
+	  prev=
+	  compile_command="$compile_command $qarg"
+	  finalize_command="$finalize_command $qarg"
+	  continue
+	  ;;
+	shrext)
+  	  shrext_cmds="$arg"
+	  prev=
+	  continue
+	  ;;
+	darwin_framework|darwin_framework_skip)
+	  test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg"
+	  compile_command="$compile_command $arg"
+	  finalize_command="$finalize_command $arg"
+	  prev=
+	  continue
+	  ;;
+	*)
+	  eval "$prev=\"\$arg\""
+	  prev=
+	  continue
+	  ;;
+	esac
+      fi # test -n "$prev"
+
+      prevarg="$arg"
+
+      case $arg in
+      -all-static)
+	if test -n "$link_static_flag"; then
+	  compile_command="$compile_command $link_static_flag"
+	  finalize_command="$finalize_command $link_static_flag"
+	fi
+	continue
+	;;
+
+      -allow-undefined)
+	# FIXME: remove this flag sometime in the future.
+	$echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2
+	continue
+	;;
+
+      -avoid-version)
+	avoid_version=yes
+	continue
+	;;
+
+      -dlopen)
+	prev=dlfiles
+	continue
+	;;
+
+      -dlpreopen)
+	prev=dlprefiles
+	continue
+	;;
+
+      -export-dynamic)
+	export_dynamic=yes
+	continue
+	;;
+
+      -export-symbols | -export-symbols-regex)
+	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	  $echo "$modename: more than one -exported-symbols argument is not allowed"
+	  exit $EXIT_FAILURE
+	fi
+	if test "X$arg" = "X-export-symbols"; then
+	  prev=expsyms
+	else
+	  prev=expsyms_regex
+	fi
+	continue
+	;;
+
+      -framework|-arch|-isysroot)
+	case " $CC " in
+	  *" ${arg} ${1} "* | *" ${arg}	${1} "*) 
+		prev=darwin_framework_skip ;;
+	  *) compiler_flags="$compiler_flags $arg"
+	     prev=darwin_framework ;;
+	esac
+	compile_command="$compile_command $arg"
+	finalize_command="$finalize_command $arg"
+	continue
+	;;
+
+      -inst-prefix-dir)
+	prev=inst_prefix
+	continue
+	;;
+
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+	case $with_gcc/$host in
+	no/*-*-irix* | /*-*-irix*)
+	  compile_command="$compile_command $arg"
+	  finalize_command="$finalize_command $arg"
+	  ;;
+	esac
+	continue
+	;;
+
+      -L*)
+	dir=`$echo "X$arg" | $Xsed -e 's/^-L//'`
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  absdir=`cd "$dir" && pwd`
+	  if test -z "$absdir"; then
+	    $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2
+	    absdir="$dir"
+	    notinst_path="$notinst_path $dir"
+	  fi
+	  dir="$absdir"
+	  ;;
+	esac
+	case "$deplibs " in
+	*" -L$dir "*) ;;
+	*)
+	  deplibs="$deplibs -L$dir"
+	  lib_search_path="$lib_search_path $dir"
+	  ;;
+	esac
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+	  testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$dir:"*) ;;
+	  *) dllsearchpath="$dllsearchpath:$dir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  *) dllsearchpath="$dllsearchpath:$testbindir";;
+	  esac
+	  ;;
+	esac
+	continue
+	;;
+
+      -l*)
+	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*)
+	    # These systems don't actually have a C or math library (as such)
+	    continue
+	    ;;
+	  *-*-os2*)
+	    # These systems don't actually have a C library (as such)
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C and math libraries are in the System framework
+	    deplibs="$deplibs -framework System"
+	    continue
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  esac
+	elif test "X$arg" = "X-lc_r"; then
+	 case $host in
+	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	   # Do not include libc_r directly, use -pthread flag.
+	   continue
+	   ;;
+	 esac
+	fi
+	deplibs="$deplibs $arg"
+	continue
+	;;
+
+      # Tru64 UNIX uses -model [arg] to determine the layout of C++
+      # classes, name mangling, and exception handling.
+      -model)
+	compile_command="$compile_command $arg"
+	compiler_flags="$compiler_flags $arg"
+	finalize_command="$finalize_command $arg"
+	prev=xcompiler
+	continue
+	;;
+
+     -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe)
+	compiler_flags="$compiler_flags $arg"
+	compile_command="$compile_command $arg"
+	finalize_command="$finalize_command $arg"
+	continue
+	;;
+
+      -module)
+	module=yes
+	continue
+	;;
+
+      # -64, -mips[0-9] enable 64-bit mode on the SGI compiler
+      # -r[0-9][0-9]* specifies the processor on the SGI compiler
+      # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
+      # +DA*, +DD* enable 64-bit mode on the HP compiler
+      # -q* pass through compiler args for the IBM compiler
+      # -m* pass through architecture-specific compiler args for GCC
+      # -m*, -t[45]*, -txscale* pass through architecture-specific
+      # compiler args for GCC
+      # -pg pass through profiling flag for GCC
+      # @file GCC response files
+      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*|-pg| \
+      -t[45]*|-txscale*|@*)
+
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+	case $arg in
+	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	  arg="\"$arg\""
+	  ;;
+	esac
+        compile_command="$compile_command $arg"
+        finalize_command="$finalize_command $arg"
+        compiler_flags="$compiler_flags $arg"
+        continue
+        ;;
+
+      -shrext)
+	prev=shrext
+	continue
+	;;
+
+      -no-fast-install)
+	fast_install=no
+	continue
+	;;
+
+      -no-install)
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+	  # The PATH hackery in wrapper scripts is required on Windows
+	  # in order for the loader to find any dlls it needs.
+	  $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2
+	  $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2
+	  fast_install=no
+	  ;;
+	*) no_install=yes ;;
+	esac
+	continue
+	;;
+
+      -no-undefined)
+	allow_undefined=no
+	continue
+	;;
+
+      -objectlist)
+	prev=objectlist
+	continue
+	;;
+
+      -o) prev=output ;;
+
+      -precious-files-regex)
+	prev=precious_regex
+	continue
+	;;
+
+      -release)
+	prev=release
+	continue
+	;;
+
+      -rpath)
+	prev=rpath
+	continue
+	;;
+
+      -R)
+	prev=xrpath
+	continue
+	;;
+
+      -R*)
+	dir=`$echo "X$arg" | $Xsed -e 's/^-R//'`
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  $echo "$modename: only absolute run-paths are allowed" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+	case "$xrpath " in
+	*" $dir "*) ;;
+	*) xrpath="$xrpath $dir" ;;
+	esac
+	continue
+	;;
+
+      -static)
+	# The effects of -static are defined in a previous loop.
+	# We used to do the same as -all-static on platforms that
+	# didn't have a PIC flag, but the assumption that the effects
+	# would be equivalent was wrong.  It would break on at least
+	# Digital Unix and AIX.
+	continue
+	;;
+
+      -thread-safe)
+	thread_safe=yes
+	continue
+	;;
+
+      -version-info)
+	prev=vinfo
+	continue
+	;;
+      -version-number)
+	prev=vinfo
+	vinfo_number=yes
+	continue
+	;;
+
+      -Wc,*)
+	args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'`
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+	  case $flag in
+	    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	    flag="\"$flag\""
+	    ;;
+	  esac
+	  arg="$arg $wl$flag"
+	  compiler_flags="$compiler_flags $flag"
+	done
+	IFS="$save_ifs"
+	arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+	;;
+
+      -Wl,*)
+	args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'`
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+	  case $flag in
+	    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	    flag="\"$flag\""
+	    ;;
+	  esac
+	  arg="$arg $wl$flag"
+	  compiler_flags="$compiler_flags $wl$flag"
+	  linker_flags="$linker_flags $flag"
+	done
+	IFS="$save_ifs"
+	arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+	;;
+
+      -Xcompiler)
+	prev=xcompiler
+	continue
+	;;
+
+      -Xlinker)
+	prev=xlinker
+	continue
+	;;
+
+      -XCClinker)
+	prev=xcclinker
+	continue
+	;;
+
+      # Some other compiler flag.
+      -* | +*)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+	case $arg in
+	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	  arg="\"$arg\""
+	  ;;
+	esac
+	;;
+
+      *.$objext)
+	# A standard object.
+	objs="$objs $arg"
+	;;
+
+      *.lo)
+	# A libtool-controlled object.
+
+	# Check to see that this really is a libtool object.
+	if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	  pic_object=
+	  non_pic_object=
+
+	  # Read the .lo file
+	  # If there is no directory component, then add one.
+	  case $arg in
+	  */* | *\\*) . $arg ;;
+	  *) . ./$arg ;;
+	  esac
+
+	  if test -z "$pic_object" || \
+	     test -z "$non_pic_object" ||
+	     test "$pic_object" = none && \
+	     test "$non_pic_object" = none; then
+	    $echo "$modename: cannot find name of object for \`$arg'" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+
+	  # Extract subdirectory from the argument.
+	  xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+	  if test "X$xdir" = "X$arg"; then
+	    xdir=
+ 	  else
+	    xdir="$xdir/"
+	  fi
+
+	  if test "$pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    pic_object="$xdir$pic_object"
+
+	    if test "$prev" = dlfiles; then
+	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		dlfiles="$dlfiles $pic_object"
+		prev=
+		continue
+	      else
+		# If libtool objects are unsupported, then we need to preload.
+		prev=dlprefiles
+	      fi
+	    fi
+
+	    # CHECK ME:  I think I busted this.  -Ossama
+	    if test "$prev" = dlprefiles; then
+	      # Preload the old-style object.
+	      dlprefiles="$dlprefiles $pic_object"
+	      prev=
+	    fi
+
+	    # A PIC object.
+	    libobjs="$libobjs $pic_object"
+	    arg="$pic_object"
+	  fi
+
+	  # Non-PIC object.
+	  if test "$non_pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    non_pic_object="$xdir$non_pic_object"
+
+	    # A standard non-PIC object
+	    non_pic_objects="$non_pic_objects $non_pic_object"
+	    if test -z "$pic_object" || test "$pic_object" = none ; then
+	      arg="$non_pic_object"
+	    fi
+	  else
+	    # If the PIC object exists, use it instead.
+	    # $xdir was prepended to $pic_object above.
+	    non_pic_object="$pic_object"
+	    non_pic_objects="$non_pic_objects $non_pic_object"
+	  fi
+	else
+	  # Only an error if not doing a dry-run.
+	  if test -z "$run"; then
+	    $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
+	    exit $EXIT_FAILURE
+	  else
+	    # Dry-run case.
+
+	    # Extract subdirectory from the argument.
+	    xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+	    if test "X$xdir" = "X$arg"; then
+	      xdir=
+	    else
+	      xdir="$xdir/"
+	    fi
+
+	    pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
+	    non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
+	    libobjs="$libobjs $pic_object"
+	    non_pic_objects="$non_pic_objects $non_pic_object"
+	  fi
+	fi
+	;;
+
+      *.$libext)
+	# An archive.
+	deplibs="$deplibs $arg"
+	old_deplibs="$old_deplibs $arg"
+	continue
+	;;
+
+      *.la)
+	# A libtool-controlled library.
+
+	if test "$prev" = dlfiles; then
+	  # This library was specified with -dlopen.
+	  dlfiles="$dlfiles $arg"
+	  prev=
+	elif test "$prev" = dlprefiles; then
+	  # The library was specified with -dlpreopen.
+	  dlprefiles="$dlprefiles $arg"
+	  prev=
+	else
+	  deplibs="$deplibs $arg"
+	fi
+	continue
+	;;
+
+      # Some other compiler argument.
+      *)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+	case $arg in
+	*[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	  arg="\"$arg\""
+	  ;;
+	esac
+	;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+	compile_command="$compile_command $arg"
+	finalize_command="$finalize_command $arg"
+      fi
+    done # argument parsing loop
+
+    if test -n "$prev"; then
+      $echo "$modename: the \`$prevarg' option requires an argument" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      compile_command="$compile_command $arg"
+      finalize_command="$finalize_command $arg"
+    fi
+
+    oldlibs=
+    # calculate the name of the file, without its directory
+    outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'`
+    libobjs_save="$libobjs"
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
+    else
+      shlib_search_path=
+    fi
+    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+    output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
+    if test "X$output_objdir" = "X$output"; then
+      output_objdir="$objdir"
+    else
+      output_objdir="$output_objdir/$objdir"
+    fi
+    # Create the object directory.
+    if test ! -d "$output_objdir"; then
+      $show "$mkdir $output_objdir"
+      $run $mkdir $output_objdir
+      exit_status=$?
+      if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then
+	exit $exit_status
+      fi
+    fi
+
+    # Determine the type of output
+    case $output in
+    "")
+      $echo "$modename: you must specify an output file" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    case $host in
+    *cygwin* | *mingw* | *pw32*)
+      # don't eliminate duplications in $postdeps and $predeps
+      duplicate_compiler_generated_deps=yes
+      ;;
+    *)
+      duplicate_compiler_generated_deps=$duplicate_deps
+      ;;
+    esac
+    specialdeplibs=
+
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      if test "X$duplicate_deps" = "Xyes" ; then
+	case "$libs " in
+	*" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	esac
+      fi
+      libs="$libs $deplib"
+    done
+
+    if test "$linkmode" = lib; then
+      libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+      # Compute libraries that are listed more than once in $predeps
+      # $postdeps and mark them as special (i.e., whose duplicates are
+      # not to be eliminated).
+      pre_post_deps=
+      if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then
+	for pre_post_dep in $predeps $postdeps; do
+	  case "$pre_post_deps " in
+	  *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
+	  esac
+	  pre_post_deps="$pre_post_deps $pre_post_dep"
+	done
+      fi
+      pre_post_deps=
+    fi
+
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    case $linkmode in
+    lib)
+	passes="conv link"
+	for file in $dlfiles $dlprefiles; do
+	  case $file in
+	  *.la) ;;
+	  *)
+	    $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2
+	    exit $EXIT_FAILURE
+	    ;;
+	  esac
+	done
+	;;
+    prog)
+	compile_deplibs=
+	finalize_deplibs=
+	alldeplibs=no
+	newdlfiles=
+	newdlprefiles=
+	passes="conv scan dlopen dlpreopen link"
+	;;
+    *)  passes="conv"
+	;;
+    esac
+    for pass in $passes; do
+      if test "$linkmode,$pass" = "lib,link" ||
+	 test "$linkmode,$pass" = "prog,scan"; then
+	libs="$deplibs"
+	deplibs=
+      fi
+      if test "$linkmode" = prog; then
+	case $pass in
+	dlopen) libs="$dlfiles" ;;
+	dlpreopen) libs="$dlprefiles" ;;
+	link)
+	  libs="$deplibs %DEPLIBS%"
+	  test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
+	  ;;
+	esac
+      fi
+      if test "$pass" = dlopen; then
+	# Collect dlpreopened libraries
+	save_deplibs="$deplibs"
+	deplibs=
+      fi
+      for deplib in $libs; do
+	lib=
+	found=no
+	case $deplib in
+	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    compiler_flags="$compiler_flags $deplib"
+	  fi
+	  continue
+	  ;;
+	-l*)
+	  if test "$linkmode" != lib && test "$linkmode" != prog; then
+	    $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2
+	    continue
+	  fi
+	  name=`$echo "X$deplib" | $Xsed -e 's/^-l//'`
+	  for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do
+	    for search_ext in .la $std_shrext .so .a; do
+	      # Search the libtool library
+	      lib="$searchdir/lib${name}${search_ext}"
+	      if test -f "$lib"; then
+		if test "$search_ext" = ".la"; then
+		  found=yes
+		else
+		  found=no
+		fi
+		break 2
+	      fi
+	    done
+	  done
+	  if test "$found" != yes; then
+	    # deplib doesn't seem to be a libtool library
+	    if test "$linkmode,$pass" = "prog,link"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
+	  else # deplib is a libtool library
+	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+	    # We need to do some special things here, and not later.
+	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      case " $predeps $postdeps " in
+	      *" $deplib "*)
+		if (${SED} -e '2q' $lib |
+                    grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+		  library_names=
+		  old_library=
+		  case $lib in
+		  */* | *\\*) . $lib ;;
+		  *) . ./$lib ;;
+		  esac
+		  for l in $old_library $library_names; do
+		    ll="$l"
+		  done
+		  if test "X$ll" = "X$old_library" ; then # only static version available
+		    found=no
+		    ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
+		    test "X$ladir" = "X$lib" && ladir="."
+		    lib=$ladir/$old_library
+		    if test "$linkmode,$pass" = "prog,link"; then
+		      compile_deplibs="$deplib $compile_deplibs"
+		      finalize_deplibs="$deplib $finalize_deplibs"
+		    else
+		      deplibs="$deplib $deplibs"
+		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+		    fi
+		    continue
+		  fi
+		fi
+	        ;;
+	      *) ;;
+	      esac
+	    fi
+	  fi
+	  ;; # -l
+	-L*)
+	  case $linkmode in
+	  lib)
+	    deplibs="$deplib $deplibs"
+	    test "$pass" = conv && continue
+	    newdependency_libs="$deplib $newdependency_libs"
+	    newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+	    ;;
+	  prog)
+	    if test "$pass" = conv; then
+	      deplibs="$deplib $deplibs"
+	      continue
+	    fi
+	    if test "$pass" = scan; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+	    ;;
+	  *)
+	    $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2
+	    ;;
+	  esac # linkmode
+	  continue
+	  ;; # -L
+	-R*)
+	  if test "$pass" = link; then
+	    dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'`
+	    # Make sure the xrpath contains only unique directories.
+	    case "$xrpath " in
+	    *" $dir "*) ;;
+	    *) xrpath="$xrpath $dir" ;;
+	    esac
+	  fi
+	  deplibs="$deplib $deplibs"
+	  continue
+	  ;;
+	*.la) lib="$deplib" ;;
+	*.$libext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  case $linkmode in
+	  lib)
+	    valid_a_lib=no
+	    case $deplibs_check_method in
+	      match_pattern*)
+		set dummy $deplibs_check_method
+	        match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+		if eval $echo \"$deplib\" 2>/dev/null \
+		    | $SED 10q \
+		    | $EGREP "$match_pattern_regex" > /dev/null; then
+		  valid_a_lib=yes
+		fi
+		;;
+	      pass_all)
+		valid_a_lib=yes
+		;;
+            esac
+	    if test "$valid_a_lib" != yes; then
+	      $echo
+	      $echo "*** Warning: Trying to link with static lib archive $deplib."
+	      $echo "*** I have the capability to make that library automatically link in when"
+	      $echo "*** you link to this library.  But I can only do this if you have a"
+	      $echo "*** shared version of the library, which you do not appear to have"
+	      $echo "*** because the file extensions .$libext of this argument makes me believe"
+	      $echo "*** that it is just a static archive that I should not used here."
+	    else
+	      $echo
+	      $echo "*** Warning: Linking the shared library $output against the"
+	      $echo "*** static library $deplib is not portable!"
+	      deplibs="$deplib $deplibs"
+	    fi
+	    continue
+	    ;;
+	  prog)
+	    if test "$pass" != link; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    continue
+	    ;;
+	  esac # linkmode
+	  ;; # *.$libext
+	*.lo | *.$objext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	  elif test "$linkmode" = prog; then
+	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	      # If there is no dlopen support or we're linking statically,
+	      # we need to preload.
+	      newdlprefiles="$newdlprefiles $deplib"
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      newdlfiles="$newdlfiles $deplib"
+	    fi
+	  fi
+	  continue
+	  ;;
+	%DEPLIBS%)
+	  alldeplibs=yes
+	  continue
+	  ;;
+	esac # case $deplib
+	if test "$found" = yes || test -f "$lib"; then :
+	else
+	  $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	# Check to see that this really is a libtool archive.
+	if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+	else
+	  $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
+	test "X$ladir" = "X$lib" && ladir="."
+
+	dlname=
+	dlopen=
+	dlpreopen=
+	libdir=
+	library_names=
+	old_library=
+	# If the library was installed with an old release of libtool,
+	# it will not redefine variables installed, or shouldnotlink
+	installed=yes
+	shouldnotlink=no
+	avoidtemprpath=
+
+
+	# Read the .la file
+	case $lib in
+	*/* | *\\*) . $lib ;;
+	*) . ./$lib ;;
+	esac
+
+	if test "$linkmode,$pass" = "lib,link" ||
+	   test "$linkmode,$pass" = "prog,scan" ||
+	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+	  test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
+	  test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
+	fi
+
+	if test "$pass" = conv; then
+	  # Only check for convenience libraries
+	  deplibs="$lib $deplibs"
+	  if test -z "$libdir"; then
+	    if test -z "$old_library"; then
+	      $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+	      exit $EXIT_FAILURE
+	    fi
+	    # It is a libtool convenience library, so add in its objects.
+	    convenience="$convenience $ladir/$objdir/$old_library"
+	    old_convenience="$old_convenience $ladir/$objdir/$old_library"
+	    tmp_libs=
+	    for deplib in $dependency_libs; do
+	      deplibs="$deplib $deplibs"
+              if test "X$duplicate_deps" = "Xyes" ; then
+	        case "$tmp_libs " in
+	        *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	        esac
+              fi
+	      tmp_libs="$tmp_libs $deplib"
+	    done
+	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
+	    $echo "$modename: \`$lib' is not a convenience library" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	  continue
+	fi # $pass = conv
+
+
+	# Get the name of the library we link against.
+	linklib=
+	for l in $old_library $library_names; do
+	  linklib="$l"
+	done
+	if test -z "$linklib"; then
+	  $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	# This library was specified with -dlopen.
+	if test "$pass" = dlopen; then
+	  if test -z "$libdir"; then
+	    $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	  if test -z "$dlname" ||
+	     test "$dlopen_support" != yes ||
+	     test "$build_libtool_libs" = no; then
+	    # If there is no dlname, no dlopen support or we're linking
+	    # statically, we need to preload.  We also need to preload any
+	    # dependent libraries so libltdl's deplib preloader doesn't
+	    # bomb out in the load deplibs phase.
+	    dlprefiles="$dlprefiles $lib $dependency_libs"
+	  else
+	    newdlfiles="$newdlfiles $lib"
+	  fi
+	  continue
+	fi # $pass = dlopen
+
+	# We need an absolute path.
+	case $ladir in
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+	*)
+	  abs_ladir=`cd "$ladir" && pwd`
+	  if test -z "$abs_ladir"; then
+	    $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2
+	    $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
+	    abs_ladir="$ladir"
+	  fi
+	  ;;
+	esac
+	laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+
+	# Find the relevant object directory and library name.
+	if test "X$installed" = Xyes; then
+	  if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    $echo "$modename: warning: library \`$lib' was moved." 1>&2
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    libdir="$abs_ladir"
+	  else
+	    dir="$libdir"
+	    absdir="$libdir"
+	  fi
+	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+	else
+	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    # Remove this search path later
+	    notinst_path="$notinst_path $abs_ladir"
+	  else
+	    dir="$ladir/$objdir"
+	    absdir="$abs_ladir/$objdir"
+	    # Remove this search path later
+	    notinst_path="$notinst_path $abs_ladir"
+	  fi
+	fi # $installed = yes
+	name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+
+	# This library was specified with -dlpreopen.
+	if test "$pass" = dlpreopen; then
+	  if test -z "$libdir"; then
+	    $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	  # Prefer using a static library (so that no silly _DYNAMIC symbols
+	  # are required to link).
+	  if test -n "$old_library"; then
+	    newdlprefiles="$newdlprefiles $dir/$old_library"
+	  # Otherwise, use the dlname, so that lt_dlopen finds it.
+	  elif test -n "$dlname"; then
+	    newdlprefiles="$newdlprefiles $dir/$dlname"
+	  else
+	    newdlprefiles="$newdlprefiles $dir/$linklib"
+	  fi
+	fi # $pass = dlpreopen
+
+	if test -z "$libdir"; then
+	  # Link the convenience library
+	  if test "$linkmode" = lib; then
+	    deplibs="$dir/$old_library $deplibs"
+	  elif test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$dir/$old_library $compile_deplibs"
+	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
+	  else
+	    deplibs="$lib $deplibs" # used for prog,scan pass
+	  fi
+	  continue
+	fi
+
+
+	if test "$linkmode" = prog && test "$pass" != link; then
+	  newlib_search_path="$newlib_search_path $ladir"
+	  deplibs="$lib $deplibs"
+
+	  linkalldeplibs=no
+	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
+	     test "$build_libtool_libs" = no; then
+	    linkalldeplibs=yes
+	  fi
+
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    case $deplib in
+	    -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test
+	    esac
+	    # Need to link against all dependency_libs?
+	    if test "$linkalldeplibs" = yes; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      # Need to hardcode shared library paths
+	      # or/and link against static libraries
+	      newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    if test "X$duplicate_deps" = "Xyes" ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done # for deplib
+	  continue
+	fi # $linkmode = prog...
+
+	if test "$linkmode,$pass" = "prog,link"; then
+	  if test -n "$library_names" &&
+	     { test "$prefer_static_libs" = no || test -z "$old_library"; }; then
+	    # We need to hardcode the library path
+	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+	      # Make sure the rpath contains only unique directories.
+	      case "$temp_rpath " in
+	      *" $dir "*) ;;
+	      *" $absdir "*) ;;
+	      *) temp_rpath="$temp_rpath $absdir" ;;
+	      esac
+	    fi
+
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) compile_rpath="$compile_rpath $absdir"
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) finalize_rpath="$finalize_rpath $libdir"
+	      esac
+	      ;;
+	    esac
+	  fi # $linkmode,$pass = prog,link...
+
+	  if test "$alldeplibs" = yes &&
+	     { test "$deplibs_check_method" = pass_all ||
+	       { test "$build_libtool_libs" = yes &&
+		 test -n "$library_names"; }; }; then
+	    # We only need to search for static libraries
+	    continue
+	  fi
+	fi
+
+	link_static=no # Whether the deplib will be linked statically
+	use_static_libs=$prefer_static_libs
+	if test "$use_static_libs" = built && test "$installed" = yes ; then
+	  use_static_libs=no
+	fi
+	if test -n "$library_names" &&
+	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
+	  if test "$installed" = no; then
+	    notinst_deplibs="$notinst_deplibs $lib"
+	    need_relink=yes
+	  fi
+	  # This is a shared library
+
+	  # Warn about portability, can't link against -module's on
+	  # some systems (darwin)
+	  if test "$shouldnotlink" = yes && test "$pass" = link ; then
+	    $echo
+	    if test "$linkmode" = prog; then
+	      $echo "*** Warning: Linking the executable $output against the loadable module"
+	    else
+	      $echo "*** Warning: Linking the shared library $output against the loadable module"
+	    fi
+	    $echo "*** $linklib is not portable!"
+	  fi
+	  if test "$linkmode" = lib &&
+	     test "$hardcode_into_libs" = yes; then
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) compile_rpath="$compile_rpath $absdir"
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) finalize_rpath="$finalize_rpath $libdir"
+	      esac
+	      ;;
+	    esac
+	  fi
+
+	  if test -n "$old_archive_from_expsyms_cmds"; then
+	    # figure out the soname
+	    set dummy $library_names
+	    realname="$2"
+	    shift; shift
+	    libname=`eval \\$echo \"$libname_spec\"`
+	    # use dlname if we got it. it's perfectly good, no?
+	    if test -n "$dlname"; then
+	      soname="$dlname"
+	    elif test -n "$soname_spec"; then
+	      # bleh windows
+	      case $host in
+	      *cygwin* | mingw*)
+		major=`expr $current - $age`
+		versuffix="-$major"
+		;;
+	      esac
+	      eval soname=\"$soname_spec\"
+	    else
+	      soname="$realname"
+	    fi
+
+	    # Make a new name for the extract_expsyms_cmds to use
+	    soroot="$soname"
+	    soname=`$echo $soroot | ${SED} -e 's/^.*\///'`
+	    newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a"
+
+	    # If the library has no export list, then create one now
+	    if test -f "$output_objdir/$soname-def"; then :
+	    else
+	      $show "extracting exported symbol list from \`$soname'"
+	      save_ifs="$IFS"; IFS='~'
+	      cmds=$extract_expsyms_cmds
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		eval cmd=\"$cmd\"
+		$show "$cmd"
+		$run eval "$cmd" || exit $?
+	      done
+	      IFS="$save_ifs"
+	    fi
+
+	    # Create $newlib
+	    if test -f "$output_objdir/$newlib"; then :; else
+	      $show "generating import library for \`$soname'"
+	      save_ifs="$IFS"; IFS='~'
+	      cmds=$old_archive_from_expsyms_cmds
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		eval cmd=\"$cmd\"
+		$show "$cmd"
+		$run eval "$cmd" || exit $?
+	      done
+	      IFS="$save_ifs"
+	    fi
+	    # make sure the library variables are pointing to the new library
+	    dir=$output_objdir
+	    linklib=$newlib
+	  fi # test -n "$old_archive_from_expsyms_cmds"
+
+	  if test "$linkmode" = prog || test "$mode" != relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    lib_linked=yes
+	    case $hardcode_action in
+	    immediate | unsupported)
+	      if test "$hardcode_direct" = no; then
+		add="$dir/$linklib"
+		case $host in
+		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
+		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+		    *-*-unixware7*) add_dir="-L$dir" ;;
+		  *-*-darwin* )
+		    # if the lib is a module then we can not link against
+		    # it, someone is ignoring the new warnings I added
+		    if /usr/bin/file -L $add 2> /dev/null |
+                      $EGREP ": [^:]* bundle" >/dev/null ; then
+		      $echo "** Warning, lib $linklib is a module, not a shared library"
+		      if test -z "$old_library" ; then
+		        $echo
+		        $echo "** And there doesn't seem to be a static archive available"
+		        $echo "** The link will probably fail, sorry"
+		      else
+		        add="$dir/$old_library"
+		      fi
+		    fi
+		esac
+	      elif test "$hardcode_minus_L" = no; then
+		case $host in
+		*-*-sunos*) add_shlibpath="$dir" ;;
+		esac
+		add_dir="-L$dir"
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = no; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    relink)
+	      if test "$hardcode_direct" = yes; then
+		add="$dir/$linklib"
+	      elif test "$hardcode_minus_L" = yes; then
+		add_dir="-L$dir"
+		# Try looking first in the location we're being installed to.
+		if test -n "$inst_prefix_dir"; then
+		  case $libdir in
+		    [\\/]*)
+		      add_dir="$add_dir -L$inst_prefix_dir$libdir"
+		      ;;
+		  esac
+		fi
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = yes; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    *) lib_linked=no ;;
+	    esac
+
+	    if test "$lib_linked" != yes; then
+	      $echo "$modename: configuration error: unsupported hardcode properties"
+	      exit $EXIT_FAILURE
+	    fi
+
+	    if test -n "$add_shlibpath"; then
+	      case :$compile_shlibpath: in
+	      *":$add_shlibpath:"*) ;;
+	      *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
+	      esac
+	    fi
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	      if test "$hardcode_direct" != yes && \
+		 test "$hardcode_minus_L" != yes && \
+		 test "$hardcode_shlibpath_var" = yes; then
+		case :$finalize_shlibpath: in
+		*":$libdir:"*) ;;
+		*) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+		esac
+	      fi
+	    fi
+	  fi
+
+	  if test "$linkmode" = prog || test "$mode" = relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    # Finalize command for both is simple: just hardcode it.
+	    if test "$hardcode_direct" = yes; then
+	      add="$libdir/$linklib"
+	    elif test "$hardcode_minus_L" = yes; then
+	      add_dir="-L$libdir"
+	      add="-l$name"
+	    elif test "$hardcode_shlibpath_var" = yes; then
+	      case :$finalize_shlibpath: in
+	      *":$libdir:"*) ;;
+	      *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+	      esac
+	      add="-l$name"
+	    elif test "$hardcode_automatic" = yes; then
+	      if test -n "$inst_prefix_dir" &&
+		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
+	        add="$inst_prefix_dir$libdir/$linklib"
+	      else
+	        add="$libdir/$linklib"
+	      fi
+	    else
+	      # We cannot seem to hardcode it, guess we'll fake it.
+	      add_dir="-L$libdir"
+	      # Try looking first in the location we're being installed to.
+	      if test -n "$inst_prefix_dir"; then
+		case $libdir in
+		  [\\/]*)
+		    add_dir="$add_dir -L$inst_prefix_dir$libdir"
+		    ;;
+		esac
+	      fi
+	      add="-l$name"
+	    fi
+
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	    fi
+	  fi
+	elif test "$linkmode" = prog; then
+	  # Here we assume that one of hardcode_direct or hardcode_minus_L
+	  # is not unsupported.  This is valid on all known static and
+	  # shared platforms.
+	  if test "$hardcode_direct" != unsupported; then
+	    test -n "$old_library" && linklib="$old_library"
+	    compile_deplibs="$dir/$linklib $compile_deplibs"
+	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
+	  else
+	    compile_deplibs="-l$name -L$dir $compile_deplibs"
+	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+	  fi
+	elif test "$build_libtool_libs" = yes; then
+	  # Not a shared library
+	  if test "$deplibs_check_method" != pass_all; then
+	    # We're trying link a shared library against a static one
+	    # but the system doesn't support it.
+
+	    # Just print a warning and add the library to dependency_libs so
+	    # that the program can be linked against the static library.
+	    $echo
+	    $echo "*** Warning: This system can not link to static lib archive $lib."
+	    $echo "*** I have the capability to make that library automatically link in when"
+	    $echo "*** you link to this library.  But I can only do this if you have a"
+	    $echo "*** shared version of the library, which you do not appear to have."
+	    if test "$module" = yes; then
+	      $echo "*** But as you try to build a module library, libtool will still create "
+	      $echo "*** a static module, that should work as long as the dlopening application"
+	      $echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+	      if test -z "$global_symbol_pipe"; then
+		$echo
+		$echo "*** However, this would only work if libtool was able to extract symbol"
+		$echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+		$echo "*** not find such a program.  So, this module is probably useless."
+		$echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	      fi
+	      if test "$build_old_libs" = no; then
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  else
+	    deplibs="$dir/$old_library $deplibs"
+	    link_static=yes
+	  fi
+	fi # link shared/static library?
+
+	if test "$linkmode" = lib; then
+	  if test -n "$dependency_libs" &&
+	     { test "$hardcode_into_libs" != yes ||
+	       test "$build_old_libs" = yes ||
+	       test "$link_static" = yes; }; then
+	    # Extract -R from dependency_libs
+	    temp_deplibs=
+	    for libdir in $dependency_libs; do
+	      case $libdir in
+	      -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'`
+		   case " $xrpath " in
+		   *" $temp_xrpath "*) ;;
+		   *) xrpath="$xrpath $temp_xrpath";;
+		   esac;;
+	      *) temp_deplibs="$temp_deplibs $libdir";;
+	      esac
+	    done
+	    dependency_libs="$temp_deplibs"
+	  fi
+
+	  newlib_search_path="$newlib_search_path $absdir"
+	  # Link against this library
+	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  # ... and its dependency_libs
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    newdependency_libs="$deplib $newdependency_libs"
+	    if test "X$duplicate_deps" = "Xyes" ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+	      esac
+	    fi
+	    tmp_libs="$tmp_libs $deplib"
+	  done
+
+	  if test "$link_all_deplibs" != no; then
+	    # Add the search paths of all dependency libraries
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      -L*) path="$deplib" ;;
+	      *.la)
+		dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'`
+		test "X$dir" = "X$deplib" && dir="."
+		# We need an absolute path.
+		case $dir in
+		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+		*)
+		  absdir=`cd "$dir" && pwd`
+		  if test -z "$absdir"; then
+		    $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
+		    absdir="$dir"
+		  fi
+		  ;;
+		esac
+		if grep "^installed=no" $deplib > /dev/null; then
+		  path="$absdir/$objdir"
+		else
+		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  if test -z "$libdir"; then
+		    $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+		    exit $EXIT_FAILURE
+		  fi
+		  if test "$absdir" != "$libdir"; then
+		    $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2
+		  fi
+		  path="$absdir"
+		fi
+		depdepl=
+		case $host in
+		*-*-darwin*)
+		  # we do not want to link against static libs,
+		  # but need to link against shared
+		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+		  if test -n "$deplibrary_names" ; then
+		    for tmp in $deplibrary_names ; do
+		      depdepl=$tmp
+		    done
+		    if test -f "$path/$depdepl" ; then
+		      depdepl="$path/$depdepl"
+		    fi
+		    # do not add paths which are already there
+		    case " $newlib_search_path " in
+		    *" $path "*) ;;
+		    *) newlib_search_path="$newlib_search_path $path";;
+		    esac
+		  fi
+		  path=""
+		  ;;
+		*)
+		  path="-L$path"
+		  ;;
+		esac
+		;;
+	      -l*)
+		case $host in
+		*-*-darwin*)
+		  # Again, we only want to link against shared libraries
+		  eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"`
+		  for tmp in $newlib_search_path ; do
+		    if test -f "$tmp/lib$tmp_libs.dylib" ; then
+		      eval depdepl="$tmp/lib$tmp_libs.dylib"
+		      break
+		    fi
+		  done
+		  path=""
+		  ;;
+		*) continue ;;
+		esac
+		;;
+	      *) continue ;;
+	      esac
+	      case " $deplibs " in
+	      *" $path "*) ;;
+	      *) deplibs="$path $deplibs" ;;
+	      esac
+	      case " $deplibs " in
+	      *" $depdepl "*) ;;
+	      *) deplibs="$depdepl $deplibs" ;;
+	      esac
+	    done
+	  fi # link_all_deplibs != no
+	fi # linkmode = lib
+      done # for deplib in $libs
+      dependency_libs="$newdependency_libs"
+      if test "$pass" = dlpreopen; then
+	# Link the dlpreopened libraries before other libraries
+	for deplib in $save_deplibs; do
+	  deplibs="$deplib $deplibs"
+	done
+      fi
+      if test "$pass" != dlopen; then
+	if test "$pass" != conv; then
+	  # Make sure lib_search_path contains only unique directories.
+	  lib_search_path=
+	  for dir in $newlib_search_path; do
+	    case "$lib_search_path " in
+	    *" $dir "*) ;;
+	    *) lib_search_path="$lib_search_path $dir" ;;
+	    esac
+	  done
+	  newlib_search_path=
+	fi
+
+	if test "$linkmode,$pass" != "prog,link"; then
+	  vars="deplibs"
+	else
+	  vars="compile_deplibs finalize_deplibs"
+	fi
+	for var in $vars dependency_libs; do
+	  # Add libraries to $var in reverse order
+	  eval tmp_libs=\"\$$var\"
+	  new_libs=
+	  for deplib in $tmp_libs; do
+	    # FIXME: Pedantically, this is the right thing to do, so
+	    #        that some nasty dependency loop isn't accidentally
+	    #        broken:
+	    #new_libs="$deplib $new_libs"
+	    # Pragmatically, this seems to cause very few problems in
+	    # practice:
+	    case $deplib in
+	    -L*) new_libs="$deplib $new_libs" ;;
+	    -R*) ;;
+	    *)
+	      # And here is the reason: when a library appears more
+	      # than once as an explicit dependence of a library, or
+	      # is implicitly linked in more than once by the
+	      # compiler, it is considered special, and multiple
+	      # occurrences thereof are not removed.  Compare this
+	      # with having the same library being listed as a
+	      # dependency of multiple other libraries: in this case,
+	      # we know (pedantically, we assume) the library does not
+	      # need to be listed more than once, so we keep only the
+	      # last copy.  This is not always right, but it is rare
+	      # enough that we require users that really mean to play
+	      # such unportable linking tricks to link the library
+	      # using -Wl,-lname, so that libtool does not consider it
+	      # for duplicate removal.
+	      case " $specialdeplibs " in
+	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
+	      *)
+		case " $new_libs " in
+		*" $deplib "*) ;;
+		*) new_libs="$deplib $new_libs" ;;
+		esac
+		;;
+	      esac
+	      ;;
+	    esac
+	  done
+	  tmp_libs=
+	  for deplib in $new_libs; do
+	    case $deplib in
+	    -L*)
+	      case " $tmp_libs " in
+	      *" $deplib "*) ;;
+	      *) tmp_libs="$tmp_libs $deplib" ;;
+	      esac
+	      ;;
+	    *) tmp_libs="$tmp_libs $deplib" ;;
+	    esac
+	  done
+	  eval $var=\"$tmp_libs\"
+	done # for var
+      fi
+      # Last step: remove runtime libs from dependency_libs
+      # (they stay in deplibs)
+      tmp_libs=
+      for i in $dependency_libs ; do
+	case " $predeps $postdeps $compiler_lib_search_path " in
+	*" $i "*)
+	  i=""
+	  ;;
+	esac
+	if test -n "$i" ; then
+	  tmp_libs="$tmp_libs $i"
+	fi
+      done
+      dependency_libs=$tmp_libs
+    done # for pass
+    if test "$linkmode" = prog; then
+      dlfiles="$newdlfiles"
+      dlprefiles="$newdlprefiles"
+    fi
+
+    case $linkmode in
+    oldlib)
+      if test -n "$deplibs"; then
+	$echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2
+      fi
+
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	$echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$rpath"; then
+	$echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$xrpath"; then
+	$echo "$modename: warning: \`-R' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$vinfo"; then
+	$echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$release"; then
+	$echo "$modename: warning: \`-release' is ignored for archives" 1>&2
+      fi
+
+      if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	$echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2
+      fi
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs="$output"
+      objs="$objs$old_deplibs"
+      ;;
+
+    lib)
+      # Make sure we only generate libraries of the form `libNAME.la'.
+      case $outputname in
+      lib*)
+	name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+	eval shared_ext=\"$shrext_cmds\"
+	eval libname=\"$libname_spec\"
+	;;
+      *)
+	if test "$module" = no; then
+	  $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+	if test "$need_lib_prefix" != no; then
+	  # Add the "lib" prefix for modules if required
+	  name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+	  eval shared_ext=\"$shrext_cmds\"
+	  eval libname=\"$libname_spec\"
+	else
+	  libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+	fi
+	;;
+      esac
+
+      if test -n "$objs"; then
+	if test "$deplibs_check_method" != pass_all; then
+	  $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1
+	  exit $EXIT_FAILURE
+	else
+	  $echo
+	  $echo "*** Warning: Linking the shared library $output against the non-libtool"
+	  $echo "*** objects $objs is not portable!"
+	  libobjs="$libobjs $objs"
+	fi
+      fi
+
+      if test "$dlself" != no; then
+	$echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2
+      fi
+
+      set dummy $rpath
+      if test "$#" -gt 2; then
+	$echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2
+      fi
+      install_libdir="$2"
+
+      oldlibs=
+      if test -z "$rpath"; then
+	if test "$build_libtool_libs" = yes; then
+	  # Building a libtool convenience library.
+	  # Some compilers have problems with a `.al' extension so
+	  # convenience libraries should have the same extension an
+	  # archive normally would.
+	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
+	  build_libtool_libs=convenience
+	  build_old_libs=yes
+	fi
+
+	if test -n "$vinfo"; then
+	  $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2
+	fi
+
+	if test -n "$release"; then
+	  $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2
+	fi
+      else
+
+	# Parse the version information argument.
+	save_ifs="$IFS"; IFS=':'
+	set dummy $vinfo 0 0 0
+	IFS="$save_ifs"
+
+	if test -n "$8"; then
+	  $echo "$modename: too many parameters to \`-version-info'" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	# convert absolute version numbers to libtool ages
+	# this retains compatibility with .la files and attempts
+	# to make the code below a bit more comprehensible
+
+	case $vinfo_number in
+	yes)
+	  number_major="$2"
+	  number_minor="$3"
+	  number_revision="$4"
+	  #
+	  # There are really only two kinds -- those that
+	  # use the current revision as the major version
+	  # and those that subtract age and use age as
+	  # a minor version.  But, then there is irix
+	  # which has an extra 1 added just for fun
+	  #
+	  case $version_type in
+	  darwin|linux|osf|windows)
+	    current=`expr $number_major + $number_minor`
+	    age="$number_minor"
+	    revision="$number_revision"
+	    ;;
+	  freebsd-aout|freebsd-elf|sunos)
+	    current="$number_major"
+	    revision="$number_minor"
+	    age="0"
+	    ;;
+	  irix|nonstopux)
+	    current=`expr $number_major + $number_minor - 1`
+	    age="$number_minor"
+	    revision="$number_minor"
+	    ;;
+	  *)
+	    $echo "$modename: unknown library version type \`$version_type'" 1>&2
+	    $echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
+	    exit $EXIT_FAILURE
+	    ;;
+	  esac
+	  ;;
+	no)
+	  current="$2"
+	  revision="$3"
+	  age="$4"
+	  ;;
+	esac
+
+	# Check that each of the things are valid numbers.
+	case $current in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+
+	case $revision in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+
+	case $age in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+
+	if test "$age" -gt "$current"; then
+	  $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
+	  $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	# Calculate the version variables.
+	major=
+	versuffix=
+	verstring=
+	case $version_type in
+	none) ;;
+
+	darwin)
+	  # Like Linux, but with the current version available in
+	  # verstring for coding it into the library header
+	  major=.`expr $current - $age`
+	  versuffix="$major.$age.$revision"
+	  # Darwin ld doesn't like 0 for these options...
+	  minor_current=`expr $current + 1`
+	  verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+	  ;;
+
+	freebsd-aout)
+	  major=".$current"
+	  versuffix=".$current.$revision";
+	  ;;
+
+	freebsd-elf)
+	  major=".$current"
+	  versuffix=".$current";
+	  ;;
+
+	irix | nonstopux)
+	  major=`expr $current - $age + 1`
+
+	  case $version_type in
+	    nonstopux) verstring_prefix=nonstopux ;;
+	    *)         verstring_prefix=sgi ;;
+	  esac
+	  verstring="$verstring_prefix$major.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$revision
+	  while test "$loop" -ne 0; do
+	    iface=`expr $revision - $loop`
+	    loop=`expr $loop - 1`
+	    verstring="$verstring_prefix$major.$iface:$verstring"
+	  done
+
+	  # Before this point, $major must not contain `.'.
+	  major=.$major
+	  versuffix="$major.$revision"
+	  ;;
+
+	linux)
+	  major=.`expr $current - $age`
+	  versuffix="$major.$age.$revision"
+	  ;;
+
+	osf)
+	  major=.`expr $current - $age`
+	  versuffix=".$current.$age.$revision"
+	  verstring="$current.$age.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$age
+	  while test "$loop" -ne 0; do
+	    iface=`expr $current - $loop`
+	    loop=`expr $loop - 1`
+	    verstring="$verstring:${iface}.0"
+	  done
+
+	  # Make executables depend on our current version.
+	  verstring="$verstring:${current}.0"
+	  ;;
+
+	sunos)
+	  major=".$current"
+	  versuffix=".$current.$revision"
+	  ;;
+
+	windows)
+	  # Use '-' rather than '.', since we only want one
+	  # extension on DOS 8.3 filesystems.
+	  major=`expr $current - $age`
+	  versuffix="-$major"
+	  ;;
+
+	*)
+	  $echo "$modename: unknown library version type \`$version_type'" 1>&2
+	  $echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+
+	# Clear the version info if we defaulted, and they specified a release.
+	if test -z "$vinfo" && test -n "$release"; then
+	  major=
+	  case $version_type in
+	  darwin)
+	    # we can't check for "0.0" in archive_cmds due to quoting
+	    # problems, so we reset it completely
+	    verstring=
+	    ;;
+	  *)
+	    verstring="0.0"
+	    ;;
+	  esac
+	  if test "$need_version" = no; then
+	    versuffix=
+	  else
+	    versuffix=".0.0"
+	  fi
+	fi
+
+	# Remove version info from name if versioning should be avoided
+	if test "$avoid_version" = yes && test "$need_version" = no; then
+	  major=
+	  versuffix=
+	  verstring=""
+	fi
+
+	# Check to see if the archive will have undefined symbols.
+	if test "$allow_undefined" = yes; then
+	  if test "$allow_undefined_flag" = unsupported; then
+	    $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
+	    build_libtool_libs=no
+	    build_old_libs=yes
+	  fi
+	else
+	  # Don't allow undefined symbols.
+	  allow_undefined_flag="$no_undefined_flag"
+	fi
+      fi
+
+      if test "$mode" != relink; then
+	# Remove our outputs, but don't remove object files since they
+	# may have been created when compiling PIC objects.
+	removelist=
+	tempremovelist=`$echo "$output_objdir/*"`
+	for p in $tempremovelist; do
+	  case $p in
+	    *.$objext)
+	       ;;
+	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
+	       if test "X$precious_files_regex" != "X"; then
+	         if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+	         then
+		   continue
+		 fi
+	       fi
+	       removelist="$removelist $p"
+	       ;;
+	    *) ;;
+	  esac
+	done
+	if test -n "$removelist"; then
+	  $show "${rm}r $removelist"
+	  $run ${rm}r $removelist
+	fi
+      fi
+
+      # Now set the variables for building old libraries.
+      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+	oldlibs="$oldlibs $output_objdir/$libname.$libext"
+
+	# Transform .lo files to .o files.
+	oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
+      fi
+
+      # Eliminate all temporary directories.
+      for path in $notinst_path; do
+	lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"`
+	deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"`
+	dependency_libs=`$echo "$dependency_libs " | ${SED} -e "s% -L$path % %g"`
+      done
+
+      if test -n "$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	temp_xrpath=
+	for libdir in $xrpath; do
+	  temp_xrpath="$temp_xrpath -R$libdir"
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+	  dependency_libs="$temp_xrpath $dependency_libs"
+	fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles="$dlfiles"
+      dlfiles=
+      for lib in $old_dlfiles; do
+	case " $dlprefiles $dlfiles " in
+	*" $lib "*) ;;
+	*) dlfiles="$dlfiles $lib" ;;
+	esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles="$dlprefiles"
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+	case "$dlprefiles " in
+	*" $lib "*) ;;
+	*) dlprefiles="$dlprefiles $lib" ;;
+	esac
+      done
+
+      if test "$build_libtool_libs" = yes; then
+	if test -n "$rpath"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*)
+	    # these systems don't actually have a c library (as such)!
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C library is in the System framework
+	    deplibs="$deplibs -framework System"
+	    ;;
+	  *-*-netbsd*)
+	    # Don't link with libc until the a.out ld.so is fixed.
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    ;;
+ 	  *)
+	    # Add libc to deplibs on all other systems if necessary.
+	    if test "$build_libtool_need_lc" = "yes"; then
+	      deplibs="$deplibs -lc"
+	    fi
+	    ;;
+	  esac
+	fi
+
+	# Transform deplibs into only deplibs that can be linked in shared.
+	name_save=$name
+	libname_save=$libname
+	release_save=$release
+	versuffix_save=$versuffix
+	major_save=$major
+	# I'm not sure if I'm treating the release correctly.  I think
+	# release should show up in the -l (ie -lgmp5) so we don't want to
+	# add it in twice.  Is that correct?
+	release=""
+	versuffix=""
+	major=""
+	newdeplibs=
+	droppeddeps=no
+	case $deplibs_check_method in
+	pass_all)
+	  # Don't check for shared/static.  Everything works.
+	  # This might be a little naive.  We might want to check
+	  # whether the library exists or not.  But this is on
+	  # osf3 & osf4 and I'm not really sure... Just
+	  # implementing what was already the behavior.
+	  newdeplibs=$deplibs
+	  ;;
+	test_compile)
+	  # This code stresses the "libraries are programs" paradigm to its
+	  # limits. Maybe even breaks it.  We compile a program, linking it
+	  # against the deplibs as a proxy for the library.  Then we can check
+	  # whether they linked in statically or dynamically with ldd.
+	  $rm conftest.c
+	  cat > conftest.c <<EOF
+	  int main() { return 0; }
+EOF
+	  $rm conftest
+	  $LTCC $LTCFLAGS -o conftest conftest.c $deplibs
+	  if test "$?" -eq 0 ; then
+	    ldd_output=`ldd conftest`
+	    for i in $deplibs; do
+	      name=`expr $i : '-l\(.*\)'`
+	      # If $name is empty we are operating on a -L argument.
+              if test "$name" != "" && test "$name" -ne "0"; then
+		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		  case " $predeps $postdeps " in
+		  *" $i "*)
+		    newdeplibs="$newdeplibs $i"
+		    i=""
+		    ;;
+		  esac
+	        fi
+		if test -n "$i" ; then
+		  libname=`eval \\$echo \"$libname_spec\"`
+		  deplib_matches=`eval \\$echo \"$library_names_spec\"`
+		  set dummy $deplib_matches
+		  deplib_match=$2
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		    newdeplibs="$newdeplibs $i"
+		  else
+		    droppeddeps=yes
+		    $echo
+		    $echo "*** Warning: dynamic linker does not accept needed library $i."
+		    $echo "*** I have the capability to make that library automatically link in when"
+		    $echo "*** you link to this library.  But I can only do this if you have a"
+		    $echo "*** shared version of the library, which I believe you do not have"
+		    $echo "*** because a test_compile did reveal that the linker did not use it for"
+		    $echo "*** its dynamic dependency list that programs get resolved with at runtime."
+		  fi
+		fi
+	      else
+		newdeplibs="$newdeplibs $i"
+	      fi
+	    done
+	  else
+	    # Error occurred in the first compile.  Let's try to salvage
+	    # the situation: Compile a separate program for each library.
+	    for i in $deplibs; do
+	      name=`expr $i : '-l\(.*\)'`
+	      # If $name is empty we are operating on a -L argument.
+              if test "$name" != "" && test "$name" != "0"; then
+		$rm conftest
+		$LTCC $LTCFLAGS -o conftest conftest.c $i
+		# Did it work?
+		if test "$?" -eq 0 ; then
+		  ldd_output=`ldd conftest`
+		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		    case " $predeps $postdeps " in
+		    *" $i "*)
+		      newdeplibs="$newdeplibs $i"
+		      i=""
+		      ;;
+		    esac
+		  fi
+		  if test -n "$i" ; then
+		    libname=`eval \\$echo \"$libname_spec\"`
+		    deplib_matches=`eval \\$echo \"$library_names_spec\"`
+		    set dummy $deplib_matches
+		    deplib_match=$2
+		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		      newdeplibs="$newdeplibs $i"
+		    else
+		      droppeddeps=yes
+		      $echo
+		      $echo "*** Warning: dynamic linker does not accept needed library $i."
+		      $echo "*** I have the capability to make that library automatically link in when"
+		      $echo "*** you link to this library.  But I can only do this if you have a"
+		      $echo "*** shared version of the library, which you do not appear to have"
+		      $echo "*** because a test_compile did reveal that the linker did not use this one"
+		      $echo "*** as a dynamic dependency that programs can get resolved with at runtime."
+		    fi
+		  fi
+		else
+		  droppeddeps=yes
+		  $echo
+		  $echo "*** Warning!  Library $i is needed by this library but I was not able to"
+		  $echo "***  make it link in!  You will probably need to install it or some"
+		  $echo "*** library that it depends on before this library will be fully"
+		  $echo "*** functional.  Installing it before continuing would be even better."
+		fi
+	      else
+		newdeplibs="$newdeplibs $i"
+	      fi
+	    done
+	  fi
+	  ;;
+	file_magic*)
+	  set dummy $deplibs_check_method
+	  file_magic_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    name=`expr $a_deplib : '-l\(.*\)'`
+	    # If $name is empty we are operating on a -L argument.
+            if test "$name" != "" && test  "$name" != "0"; then
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  newdeplibs="$newdeplibs $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval \\$echo \"$libname_spec\"`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		      # Follow soft links.
+		      if ls -lLd "$potent_lib" 2>/dev/null \
+			 | grep " -> " >/dev/null; then
+			continue
+		      fi
+		      # The statement above tries to avoid entering an
+		      # endless loop below, in case of cyclic links.
+		      # We might still enter an endless loop, since a link
+		      # loop can be closed while we follow links,
+		      # but so what?
+		      potlib="$potent_lib"
+		      while test -h "$potlib" 2>/dev/null; do
+			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+			case $potliblink in
+			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+			*) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
+			esac
+		      done
+		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \
+			 | ${SED} 10q \
+			 | $EGREP "$file_magic_regex" > /dev/null; then
+			newdeplibs="$newdeplibs $a_deplib"
+			a_deplib=""
+			break 2
+		      fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		$echo
+		$echo "*** Warning: linker path does not have real file for library $a_deplib."
+		$echo "*** I have the capability to make that library automatically link in when"
+		$echo "*** you link to this library.  But I can only do this if you have a"
+		$echo "*** shared version of the library, which you do not appear to have"
+		$echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $echo "*** with $libname but no candidates were found. (...for file magic test)"
+		else
+		  $echo "*** with $libname and none of the candidates passed a file format test"
+		  $echo "*** using a file magic. Last file checked: $potlib"
+		fi
+	      fi
+	    else
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	    fi
+	  done # Gone through all deplibs.
+	  ;;
+	match_pattern*)
+	  set dummy $deplibs_check_method
+	  match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    name=`expr $a_deplib : '-l\(.*\)'`
+	    # If $name is empty we are operating on a -L argument.
+	    if test -n "$name" && test "$name" != "0"; then
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  newdeplibs="$newdeplibs $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval \\$echo \"$libname_spec\"`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		    potlib="$potent_lib" # see symlink-check above in file_magic test
+		    if eval $echo \"$potent_lib\" 2>/dev/null \
+		        | ${SED} 10q \
+		        | $EGREP "$match_pattern_regex" > /dev/null; then
+		      newdeplibs="$newdeplibs $a_deplib"
+		      a_deplib=""
+		      break 2
+		    fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		$echo
+		$echo "*** Warning: linker path does not have real file for library $a_deplib."
+		$echo "*** I have the capability to make that library automatically link in when"
+		$echo "*** you link to this library.  But I can only do this if you have a"
+		$echo "*** shared version of the library, which you do not appear to have"
+		$echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $echo "*** with $libname but no candidates were found. (...for regex pattern test)"
+		else
+		  $echo "*** with $libname and none of the candidates passed a file format test"
+		  $echo "*** using a regex pattern. Last file checked: $potlib"
+		fi
+	      fi
+	    else
+	      # Add a -L argument.
+	      newdeplibs="$newdeplibs $a_deplib"
+	    fi
+	  done # Gone through all deplibs.
+	  ;;
+	none | unknown | *)
+	  newdeplibs=""
+	  tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \
+	    -e 's/ -[LR][^ ]*//g'`
+	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	    for i in $predeps $postdeps ; do
+	      # can't use Xsed below, because $i might contain '/'
+	      tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"`
+	    done
+	  fi
+	  if $echo "X $tmp_deplibs" | $Xsed -e 's/[ 	]//g' \
+	    | grep . >/dev/null; then
+	    $echo
+	    if test "X$deplibs_check_method" = "Xnone"; then
+	      $echo "*** Warning: inter-library dependencies are not supported in this platform."
+	    else
+	      $echo "*** Warning: inter-library dependencies are not known to be supported."
+	    fi
+	    $echo "*** All declared inter-library dependencies are being dropped."
+	    droppeddeps=yes
+	  fi
+	  ;;
+	esac
+	versuffix=$versuffix_save
+	major=$major_save
+	release=$release_save
+	libname=$libname_save
+	name=$name_save
+
+	case $host in
+	*-*-rhapsody* | *-*-darwin1.[012])
+	  # On Rhapsody replace the C library is the System framework
+	  newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'`
+	  ;;
+	esac
+
+	if test "$droppeddeps" = yes; then
+	  if test "$module" = yes; then
+	    $echo
+	    $echo "*** Warning: libtool could not satisfy all declared inter-library"
+	    $echo "*** dependencies of module $libname.  Therefore, libtool will create"
+	    $echo "*** a static module, that should work as long as the dlopening"
+	    $echo "*** application is linked with the -dlopen flag."
+	    if test -z "$global_symbol_pipe"; then
+	      $echo
+	      $echo "*** However, this would only work if libtool was able to extract symbol"
+	      $echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+	      $echo "*** not find such a program.  So, this module is probably useless."
+	      $echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	    fi
+	    if test "$build_old_libs" = no; then
+	      oldlibs="$output_objdir/$libname.$libext"
+	      build_libtool_libs=module
+	      build_old_libs=yes
+	    else
+	      build_libtool_libs=no
+	    fi
+	  else
+	    $echo "*** The inter-library dependencies that have been dropped here will be"
+	    $echo "*** automatically added whenever a program is linked with this library"
+	    $echo "*** or is declared to -dlopen it."
+
+	    if test "$allow_undefined" = no; then
+	      $echo
+	      $echo "*** Since this library must not contain undefined symbols,"
+	      $echo "*** because either the platform does not support them or"
+	      $echo "*** it was explicitly requested with -no-undefined,"
+	      $echo "*** libtool will only create a static version of it."
+	      if test "$build_old_libs" = no; then
+		oldlibs="$output_objdir/$libname.$libext"
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  fi
+	fi
+	# Done checking deplibs!
+	deplibs=$newdeplibs
+      fi
+
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $deplibs " in
+	  *" -L$path/$objdir "*)
+	    new_libs="$new_libs -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) new_libs="$new_libs $deplib" ;;
+	  esac
+	  ;;
+	*) new_libs="$new_libs $deplib" ;;
+	esac
+      done
+      deplibs="$new_libs"
+
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+
+      # Test again, we may have decided not to build it any more
+      if test "$build_libtool_libs" = yes; then
+	if test "$hardcode_into_libs" = yes; then
+	  # Hardcode the library paths
+	  hardcode_libdirs=
+	  dep_rpath=
+	  rpath="$finalize_rpath"
+	  test "$mode" != relink && rpath="$compile_rpath$rpath"
+	  for libdir in $rpath; do
+	    if test -n "$hardcode_libdir_flag_spec"; then
+	      if test -n "$hardcode_libdir_separator"; then
+		if test -z "$hardcode_libdirs"; then
+		  hardcode_libdirs="$libdir"
+		else
+		  # Just accumulate the unique libdirs.
+		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		    ;;
+		  *)
+		    hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		    ;;
+		  esac
+		fi
+	      else
+		eval flag=\"$hardcode_libdir_flag_spec\"
+		dep_rpath="$dep_rpath $flag"
+	      fi
+	    elif test -n "$runpath_var"; then
+	      case "$perm_rpath " in
+	      *" $libdir "*) ;;
+	      *) perm_rpath="$perm_rpath $libdir" ;;
+	      esac
+	    fi
+	  done
+	  # Substitute the hardcoded libdirs into the rpath.
+	  if test -n "$hardcode_libdir_separator" &&
+	     test -n "$hardcode_libdirs"; then
+	    libdir="$hardcode_libdirs"
+	    if test -n "$hardcode_libdir_flag_spec_ld"; then
+	      eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
+	    else
+	      eval dep_rpath=\"$hardcode_libdir_flag_spec\"
+	    fi
+	  fi
+	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
+	    # We should set the runpath_var.
+	    rpath=
+	    for dir in $perm_rpath; do
+	      rpath="$rpath$dir:"
+	    done
+	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+	  fi
+	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+	fi
+
+	shlibpath="$finalize_shlibpath"
+	test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+	if test -n "$shlibpath"; then
+	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+	fi
+
+	# Get the real and link names of the library.
+	eval shared_ext=\"$shrext_cmds\"
+	eval library_names=\"$library_names_spec\"
+	set dummy $library_names
+	realname="$2"
+	shift; shift
+
+	if test -n "$soname_spec"; then
+	  eval soname=\"$soname_spec\"
+	else
+	  soname="$realname"
+	fi
+	if test -z "$dlname"; then
+	  dlname=$soname
+	fi
+
+	lib="$output_objdir/$realname"
+	linknames=
+	for link
+	do
+	  linknames="$linknames $link"
+	done
+
+	# Use standard objects if they are pic
+	test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+
+	# Prepare the list of exported symbols
+	if test -z "$export_symbols"; then
+	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+	    $show "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $run $rm $export_symbols
+	    cmds=$export_symbols_cmds
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd in $cmds; do
+	      IFS="$save_ifs"
+	      eval cmd=\"$cmd\"
+	      if len=`expr "X$cmd" : ".*"` &&
+	       test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	        $show "$cmd"
+	        $run eval "$cmd" || exit $?
+	        skipped_export=false
+	      else
+	        # The command line is too long to execute in one step.
+	        $show "using reloadable object file for export list..."
+	        skipped_export=:
+		# Break out early, otherwise skipped_export may be
+		# set to false by a later but shorter cmd.
+		break
+	      fi
+	    done
+	    IFS="$save_ifs"
+	    if test -n "$export_symbols_regex"; then
+	      $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\""
+	      $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      $show "$mv \"${export_symbols}T\" \"$export_symbols\""
+	      $run eval '$mv "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+	fi
+
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"'
+	fi
+
+	tmp_deplibs=
+	for test_deplib in $deplibs; do
+		case " $convenience " in
+		*" $test_deplib "*) ;;
+		*)
+			tmp_deplibs="$tmp_deplibs $test_deplib"
+			;;
+		esac
+	done
+	deplibs="$tmp_deplibs"
+
+	if test -n "$convenience"; then
+	  if test -n "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	  else
+	    gentop="$output_objdir/${outputname}x"
+	    generated="$generated $gentop"
+
+	    func_extract_archives $gentop $convenience
+	    libobjs="$libobjs $func_extract_archives_result"
+	  fi
+	fi
+	
+	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+	  eval flag=\"$thread_safe_flag_spec\"
+	  linker_flags="$linker_flags $flag"
+	fi
+
+	# Make a backup of the uninstalled library when relinking
+	if test "$mode" = relink; then
+	  $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $?
+	fi
+
+	# Do each of the archive commands.
+	if test "$module" = yes && test -n "$module_cmds" ; then
+	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	    eval test_cmds=\"$module_expsym_cmds\"
+	    cmds=$module_expsym_cmds
+	  else
+	    eval test_cmds=\"$module_cmds\"
+	    cmds=$module_cmds
+	  fi
+	else
+	if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	  eval test_cmds=\"$archive_expsym_cmds\"
+	  cmds=$archive_expsym_cmds
+	else
+	  eval test_cmds=\"$archive_cmds\"
+	  cmds=$archive_cmds
+	  fi
+	fi
+
+	if test "X$skipped_export" != "X:" &&
+	   len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
+	   test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  :
+	else
+	  # The command line is too long to link in one step, link piecewise.
+	  $echo "creating reloadable object files..."
+
+	  # Save the value of $output and $libobjs because we want to
+	  # use them later.  If we have whole_archive_flag_spec, we
+	  # want to use save_libobjs as it was before
+	  # whole_archive_flag_spec was expanded, because we can't
+	  # assume the linker understands whole_archive_flag_spec.
+	  # This may have to be revisited, in case too many
+	  # convenience libraries get linked in and end up exceeding
+	  # the spec.
+	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	  fi
+	  save_output=$output
+	  output_la=`$echo "X$output" | $Xsed -e "$basename"`
+
+	  # Clear the reloadable object creation command queue and
+	  # initialize k to one.
+	  test_cmds=
+	  concat_cmds=
+	  objlist=
+	  delfiles=
+	  last_robj=
+	  k=1
+	  output=$output_objdir/$output_la-${k}.$objext
+	  # Loop over the list of objects to be linked.
+	  for obj in $save_libobjs
+	  do
+	    eval test_cmds=\"$reload_cmds $objlist $last_robj\"
+	    if test "X$objlist" = X ||
+	       { len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
+		 test "$len" -le "$max_cmd_len"; }; then
+	      objlist="$objlist $obj"
+	    else
+	      # The command $test_cmds is almost too long, add a
+	      # command to the queue.
+	      if test "$k" -eq 1 ; then
+		# The first file doesn't have a previous command to add.
+		eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
+	      else
+		# All subsequent reloadable object files will link in
+		# the last one created.
+		eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\"
+	      fi
+	      last_robj=$output_objdir/$output_la-${k}.$objext
+	      k=`expr $k + 1`
+	      output=$output_objdir/$output_la-${k}.$objext
+	      objlist=$obj
+	      len=1
+	    fi
+	  done
+	  # Handle the remaining objects by creating one last
+	  # reloadable object file.  All subsequent reloadable object
+	  # files will link in the last one created.
+	  test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	  eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
+
+	  if ${skipped_export-false}; then
+	    $show "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $run $rm $export_symbols
+	    libobjs=$output
+	    # Append the command to create the export file.
+	    eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\"
+          fi
+
+	  # Set up a command to remove the reloadable object files
+	  # after they are used.
+	  i=0
+	  while test "$i" -lt "$k"
+	  do
+	    i=`expr $i + 1`
+	    delfiles="$delfiles $output_objdir/$output_la-${i}.$objext"
+	  done
+
+	  $echo "creating a temporary reloadable object file: $output"
+
+	  # Loop through the commands generated above and execute them.
+	  save_ifs="$IFS"; IFS='~'
+	  for cmd in $concat_cmds; do
+	    IFS="$save_ifs"
+	    $show "$cmd"
+	    $run eval "$cmd" || exit $?
+	  done
+	  IFS="$save_ifs"
+
+	  libobjs=$output
+	  # Restore the value of output.
+	  output=$save_output
+
+	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	  fi
+	  # Expand the library linking commands again to reset the
+	  # value of $libobjs for piecewise linking.
+
+	  # Do each of the archive commands.
+	  if test "$module" = yes && test -n "$module_cmds" ; then
+	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	      cmds=$module_expsym_cmds
+	    else
+	      cmds=$module_cmds
+	    fi
+	  else
+	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	    cmds=$archive_expsym_cmds
+	  else
+	    cmds=$archive_cmds
+	    fi
+	  fi
+
+	  # Append the command to remove the reloadable object files
+	  # to the just-reset $cmds.
+	  eval cmds=\"\$cmds~\$rm $delfiles\"
+	fi
+	save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  eval cmd=\"$cmd\"
+	  $show "$cmd"
+	  $run eval "$cmd" || {
+	    lt_exit=$?
+
+	    # Restore the uninstalled library and exit
+	    if test "$mode" = relink; then
+	      $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)'
+	    fi
+
+	    exit $lt_exit
+	  }
+	done
+	IFS="$save_ifs"
+
+	# Restore the uninstalled library and exit
+	if test "$mode" = relink; then
+	  $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $?
+
+	  if test -n "$convenience"; then
+	    if test -z "$whole_archive_flag_spec"; then
+	      $show "${rm}r $gentop"
+	      $run ${rm}r "$gentop"
+	    fi
+	  fi
+
+	  exit $EXIT_SUCCESS
+	fi
+
+	# Create links to the real library.
+	for linkname in $linknames; do
+	  if test "$realname" != "$linkname"; then
+	    $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)"
+	    $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $?
+	  fi
+	done
+
+	# If -module or -export-dynamic was specified, set the dlname.
+	if test "$module" = yes || test "$export_dynamic" = yes; then
+	  # On all known operating systems, these are identical.
+	  dlname="$soname"
+	fi
+      fi
+      ;;
+
+    obj)
+      if test -n "$deplibs"; then
+	$echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2
+      fi
+
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	$echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$rpath"; then
+	$echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$xrpath"; then
+	$echo "$modename: warning: \`-R' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$vinfo"; then
+	$echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2
+      fi
+
+      if test -n "$release"; then
+	$echo "$modename: warning: \`-release' is ignored for objects" 1>&2
+      fi
+
+      case $output in
+      *.lo)
+	if test -n "$objs$old_deplibs"; then
+	  $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+	libobj="$output"
+	obj=`$echo "X$output" | $Xsed -e "$lo2o"`
+	;;
+      *)
+	libobj=
+	obj="$output"
+	;;
+      esac
+
+      # Delete the old objects.
+      $run $rm $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # reload_cmds runs $LD directly, so let us get rid of
+      # -Wl from whole_archive_flag_spec
+      wl=
+
+      if test -n "$convenience"; then
+	if test -n "$whole_archive_flag_spec"; then
+	  eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\"
+	else
+	  gentop="$output_objdir/${obj}x"
+	  generated="$generated $gentop"
+
+	  func_extract_archives $gentop $convenience
+	  reload_conv_objs="$reload_objs $func_extract_archives_result"
+	fi
+      fi
+
+      # Create the old-style object.
+      reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+      output="$obj"
+      cmds=$reload_cmds
+      save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+	IFS="$save_ifs"
+	eval cmd=\"$cmd\"
+	$show "$cmd"
+	$run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+	if test -n "$gentop"; then
+	  $show "${rm}r $gentop"
+	  $run ${rm}r $gentop
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$build_libtool_libs" != yes; then
+	if test -n "$gentop"; then
+	  $show "${rm}r $gentop"
+	  $run ${rm}r $gentop
+	fi
+
+	# Create an invalid libtool object if no PIC, so that we don't
+	# accidentally link it into a program.
+	# $show "echo timestamp > $libobj"
+	# $run eval "echo timestamp > $libobj" || exit $?
+	exit $EXIT_SUCCESS
+      fi
+
+      if test -n "$pic_flag" || test "$pic_mode" != default; then
+	# Only do commands if we really have different PIC objects.
+	reload_objs="$libobjs $reload_conv_objs"
+	output="$libobj"
+	cmds=$reload_cmds
+	save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  eval cmd=\"$cmd\"
+	  $show "$cmd"
+	  $run eval "$cmd" || exit $?
+	done
+	IFS="$save_ifs"
+      fi
+
+      if test -n "$gentop"; then
+	$show "${rm}r $gentop"
+	$run ${rm}r $gentop
+      fi
+
+      exit $EXIT_SUCCESS
+      ;;
+
+    prog)
+      case $host in
+	*cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;;
+      esac
+      if test -n "$vinfo"; then
+	$echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2
+      fi
+
+      if test -n "$release"; then
+	$echo "$modename: warning: \`-release' is ignored for programs" 1>&2
+      fi
+
+      if test "$preload" = yes; then
+	if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown &&
+	   test "$dlopen_self_static" = unknown; then
+	  $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support."
+	fi
+      fi
+
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+	# On Rhapsody replace the C library is the System framework
+	compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+	finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+	;;
+      esac
+
+      case $host in
+      *darwin*)
+        # Don't allow lazy linking, it breaks C++ global constructors
+        if test "$tagname" = CXX ; then
+        compile_command="$compile_command ${wl}-bind_at_load"
+        finalize_command="$finalize_command ${wl}-bind_at_load"
+        fi
+        ;;
+      esac
+
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $compile_deplibs " in
+	  *" -L$path/$objdir "*)
+	    new_libs="$new_libs -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $compile_deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) new_libs="$new_libs $deplib" ;;
+	  esac
+	  ;;
+	*) new_libs="$new_libs $deplib" ;;
+	esac
+      done
+      compile_deplibs="$new_libs"
+
+
+      compile_command="$compile_command $compile_deplibs"
+      finalize_command="$finalize_command $finalize_deplibs"
+
+      if test -n "$rpath$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	for libdir in $rpath $xrpath; do
+	  # This is the magic to use -rpath.
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_rpath="$finalize_rpath $libdir" ;;
+	  esac
+	done
+      fi
+
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) perm_rpath="$perm_rpath $libdir" ;;
+	  esac
+	fi
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+	  testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$libdir:"*) ;;
+	  *) dllsearchpath="$dllsearchpath:$libdir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  *) dllsearchpath="$dllsearchpath:$testbindir";;
+	  esac
+	  ;;
+	esac
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath="$rpath"
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    rpath="$rpath $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$finalize_perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
+	  esac
+	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath="$rpath"
+
+      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+	# Transform all the library objects into standard objects.
+	compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+      fi
+
+      dlsyms=
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	if test -n "$NM" && test -n "$global_symbol_pipe"; then
+	  dlsyms="${outputname}S.c"
+	else
+	  $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2
+	fi
+      fi
+
+      if test -n "$dlsyms"; then
+	case $dlsyms in
+	"") ;;
+	*.c)
+	  # Discover the nlist of each of the dlfiles.
+	  nlist="$output_objdir/${outputname}.nm"
+
+	  $show "$rm $nlist ${nlist}S ${nlist}T"
+	  $run $rm "$nlist" "${nlist}S" "${nlist}T"
+
+	  # Parse the name list into a source file.
+	  $show "creating $output_objdir/$dlsyms"
+
+	  test -z "$run" && $echo > "$output_objdir/$dlsyms" "\
+/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */
+/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+/* Prevent the only kind of declaration conflicts we can make. */
+#define lt_preloaded_symbols some_other_symbol
+
+/* External symbol declarations for the compiler. */\
+"
+
+	  if test "$dlself" = yes; then
+	    $show "generating symbol list for \`$output'"
+
+	    test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist"
+
+	    # Add our own program objects to the symbol list.
+	    progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+	    for arg in $progfiles; do
+	      $show "extracting global C symbols from \`$arg'"
+	      $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+	    done
+
+	    if test -n "$exclude_expsyms"; then
+	      $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+	      $run eval '$mv "$nlist"T "$nlist"'
+	    fi
+
+	    if test -n "$export_symbols_regex"; then
+	      $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+	      $run eval '$mv "$nlist"T "$nlist"'
+	    fi
+
+	    # Prepare the list of exported symbols
+	    if test -z "$export_symbols"; then
+	      export_symbols="$output_objdir/$outputname.exp"
+	      $run $rm $export_symbols
+	      $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+              case $host in
+              *cygwin* | *mingw* )
+	        $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+		$run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+                ;;
+              esac
+	    else
+	      $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+	      $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+	      $run eval 'mv "$nlist"T "$nlist"'
+              case $host in
+              *cygwin* | *mingw* )
+	        $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+		$run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+                ;;
+              esac
+	    fi
+	  fi
+
+	  for arg in $dlprefiles; do
+	    $show "extracting global C symbols from \`$arg'"
+	    name=`$echo "$arg" | ${SED} -e 's%^.*/%%'`
+	    $run eval '$echo ": $name " >> "$nlist"'
+	    $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+	  done
+
+	  if test -z "$run"; then
+	    # Make sure we have at least an empty file.
+	    test -f "$nlist" || : > "$nlist"
+
+	    if test -n "$exclude_expsyms"; then
+	      $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+	      $mv "$nlist"T "$nlist"
+	    fi
+
+	    # Try sorting and uniquifying the output.
+	    if grep -v "^: " < "$nlist" |
+		if sort -k 3 </dev/null >/dev/null 2>&1; then
+		  sort -k 3
+		else
+		  sort +2
+		fi |
+		uniq > "$nlist"S; then
+	      :
+	    else
+	      grep -v "^: " < "$nlist" > "$nlist"S
+	    fi
+
+	    if test -f "$nlist"S; then
+	      eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"'
+	    else
+	      $echo '/* NONE */' >> "$output_objdir/$dlsyms"
+	    fi
+
+	    $echo >> "$output_objdir/$dlsyms" "\
+
+#undef lt_preloaded_symbols
+
+#if defined (__STDC__) && __STDC__
+# define lt_ptr void *
+#else
+# define lt_ptr char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+"
+
+	    case $host in
+	    *cygwin* | *mingw* )
+	  $echo >> "$output_objdir/$dlsyms" "\
+/* DATA imports from DLLs on WIN32 can't be const, because
+   runtime relocations are performed -- see ld's documentation
+   on pseudo-relocs */
+struct {
+"
+	      ;;
+	    * )
+	  $echo >> "$output_objdir/$dlsyms" "\
+const struct {
+"
+	      ;;
+	    esac
+
+
+	  $echo >> "$output_objdir/$dlsyms" "\
+  const char *name;
+  lt_ptr address;
+}
+lt_preloaded_symbols[] =
+{\
+"
+
+	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms"
+
+	    $echo >> "$output_objdir/$dlsyms" "\
+  {0, (lt_ptr) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+	  fi
+
+	  pic_flag_for_symtable=
+	  case $host in
+	  # compiling the symbol table file with pic_flag works around
+	  # a FreeBSD bug that causes programs to crash when -lm is
+	  # linked before any other PIC object.  But we must not use
+	  # pic_flag when linking with -static.  The problem exists in
+	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+	  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+	    case "$compile_command " in
+	    *" -static "*) ;;
+	    *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";;
+	    esac;;
+	  *-*-hpux*)
+	    case "$compile_command " in
+	    *" -static "*) ;;
+	    *) pic_flag_for_symtable=" $pic_flag";;
+	    esac
+	  esac
+
+	  # Now compile the dynamic symbol file.
+	  $show "(cd $output_objdir && $LTCC  $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")"
+	  $run eval '(cd $output_objdir && $LTCC  $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $?
+
+	  # Clean up the generated files.
+	  $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T"
+	  $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T"
+
+	  # Transform the symbol file into the correct name.
+          case $host in
+          *cygwin* | *mingw* )
+            if test -f "$output_objdir/${outputname}.def" ; then
+              compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"`
+              finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"`
+            else
+              compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+              finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+             fi
+            ;;
+          * )
+            compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+            finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+            ;;
+          esac
+	  ;;
+	*)
+	  $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+      else
+	# We keep going just in case the user didn't refer to
+	# lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+	# really was required.
+
+	# Nullify the symbol file.
+	compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
+	finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
+      fi
+
+      if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+	# Replace the output file specification.
+	compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+	link_command="$compile_command$compile_rpath"
+
+	# We have no uninstalled library dependencies, so finalize right now.
+	$show "$link_command"
+	$run eval "$link_command"
+	exit_status=$?
+
+	# Delete the generated files.
+	if test -n "$dlsyms"; then
+	  $show "$rm $output_objdir/${outputname}S.${objext}"
+	  $run $rm "$output_objdir/${outputname}S.${objext}"
+	fi
+
+	exit $exit_status
+      fi
+
+      if test -n "$shlibpath_var"; then
+	# We should set the shlibpath_var
+	rpath=
+	for dir in $temp_rpath; do
+	  case $dir in
+	  [\\/]* | [A-Za-z]:[\\/]*)
+	    # Absolute path.
+	    rpath="$rpath$dir:"
+	    ;;
+	  *)
+	    # Relative path: add a thisdir entry.
+	    rpath="$rpath\$thisdir/$dir:"
+	    ;;
+	  esac
+	done
+	temp_rpath="$rpath"
+      fi
+
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
+
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+	if test -n "$perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $perm_rpath; do
+	    rpath="$rpath$dir:"
+	  done
+	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+	if test -n "$finalize_perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $finalize_perm_rpath; do
+	    rpath="$rpath$dir:"
+	  done
+	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+      fi
+
+      if test "$no_install" = yes; then
+	# We don't need to create a wrapper script.
+	link_command="$compile_var$compile_command$compile_rpath"
+	# Replace the output file specification.
+	link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+	# Delete the old output file.
+	$run $rm $output
+	# Link the executable and exit
+	$show "$link_command"
+	$run eval "$link_command" || exit $?
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$hardcode_action" = relink; then
+	# Fast installation is not supported
+	link_command="$compile_var$compile_command$compile_rpath"
+	relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+	$echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2
+	$echo "$modename: \`$output' will be relinked during installation" 1>&2
+      else
+	if test "$fast_install" != no; then
+	  link_command="$finalize_var$compile_command$finalize_rpath"
+	  if test "$fast_install" = yes; then
+	    relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
+	  else
+	    # fast_install is set to needless
+	    relink_command=
+	  fi
+	else
+	  link_command="$compile_var$compile_command$compile_rpath"
+	  relink_command="$finalize_var$finalize_command$finalize_rpath"
+	fi
+      fi
+
+      # Replace the output file specification.
+      link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+      # Delete the old output files.
+      $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+      $show "$link_command"
+      $run eval "$link_command" || exit $?
+
+      # Now create the wrapper script.
+      $show "creating $output"
+
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+	# Preserve any variables that may affect compiler behavior
+	for var in $variables_saved_for_relink; do
+	  if eval test -z \"\${$var+set}\"; then
+	    relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
+	  elif eval var_value=\$$var; test -z "$var_value"; then
+	    relink_command="$var=; export $var; $relink_command"
+	  else
+	    var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+	    relink_command="$var=\"$var_value\"; export $var; $relink_command"
+	  fi
+	done
+	relink_command="(cd `pwd`; $relink_command)"
+	relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+      fi
+
+      # Quote $echo for shipping.
+      if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then
+	case $progpath in
+	[\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
+	*) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
+	esac
+	qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"`
+      else
+	qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"`
+      fi
+
+      # Only actually do things if our run command is non-null.
+      if test -z "$run"; then
+	# win32 will think the script is a binary if it has
+	# a .exe suffix, so we strip it off here.
+	case $output in
+	  *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;;
+	esac
+	# test for cygwin because mv fails w/o .exe extensions
+	case $host in
+	  *cygwin*)
+	    exeext=.exe
+	    outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;;
+	  *) exeext= ;;
+	esac
+	case $host in
+	  *cygwin* | *mingw* )
+            output_name=`basename $output`
+            output_path=`dirname $output`
+            cwrappersource="$output_path/$objdir/lt-$output_name.c"
+            cwrapper="$output_path/$output_name.exe"
+            $rm $cwrappersource $cwrapper
+            trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+	    cat > $cwrappersource <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+   Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+
+   The $output program cannot be directly executed until all the libtool
+   libraries that it depends on are installed.
+
+   This wrapper executable should never be moved out of the build directory.
+   If it is, it will not operate correctly.
+
+   Currently, it simply execs the wrapper *script* "/bin/sh $output",
+   but could eventually absorb all of the scripts functionality and
+   exec $objdir/$outputname directly.
+*/
+EOF
+	    cat >> $cwrappersource<<"EOF"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <sys/stat.h>
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+  defined (__OS2__)
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# ifndef DIR_SEPARATOR_2
+#  define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+#  define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+        (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+  if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+/* -DDEBUG is fairly common in CFLAGS.  */
+#undef DEBUG
+#if defined DEBUGWRAPPER
+# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__)
+#else
+# define DEBUG(format, ...)
+#endif
+
+const char *program_name = NULL;
+
+void * xmalloc (size_t num);
+char * xstrdup (const char *string);
+const char * base_name (const char *name);
+char * find_executable(const char *wrapper);
+int    check_executable(const char *path);
+char * strendzap(char *str, const char *pat);
+void lt_fatal (const char *message, ...);
+
+int
+main (int argc, char *argv[])
+{
+  char **newargz;
+  int i;
+
+  program_name = (char *) xstrdup (base_name (argv[0]));
+  DEBUG("(main) argv[0]      : %s\n",argv[0]);
+  DEBUG("(main) program_name : %s\n",program_name);
+  newargz = XMALLOC(char *, argc+2);
+EOF
+
+            cat >> $cwrappersource <<EOF
+  newargz[0] = (char *) xstrdup("$SHELL");
+EOF
+
+            cat >> $cwrappersource <<"EOF"
+  newargz[1] = find_executable(argv[0]);
+  if (newargz[1] == NULL)
+    lt_fatal("Couldn't find %s", argv[0]);
+  DEBUG("(main) found exe at : %s\n",newargz[1]);
+  /* we know the script has the same name, without the .exe */
+  /* so make sure newargz[1] doesn't end in .exe */
+  strendzap(newargz[1],".exe");
+  for (i = 1; i < argc; i++)
+    newargz[i+1] = xstrdup(argv[i]);
+  newargz[argc+1] = NULL;
+
+  for (i=0; i<argc+1; i++)
+  {
+    DEBUG("(main) newargz[%d]   : %s\n",i,newargz[i]);
+    ;
+  }
+
+EOF
+
+            case $host_os in
+              mingw*)
+                cat >> $cwrappersource <<EOF
+  execv("$SHELL",(char const **)newargz);
+EOF
+              ;;
+              *)
+                cat >> $cwrappersource <<EOF
+  execv("$SHELL",newargz);
+EOF
+              ;;
+            esac
+
+            cat >> $cwrappersource <<"EOF"
+  return 127;
+}
+
+void *
+xmalloc (size_t num)
+{
+  void * p = (void *) malloc (num);
+  if (!p)
+    lt_fatal ("Memory exhausted");
+
+  return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+  return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL
+;
+}
+
+const char *
+base_name (const char *name)
+{
+  const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  /* Skip over the disk name in MSDOS pathnames. */
+  if (isalpha ((unsigned char)name[0]) && name[1] == ':')
+    name += 2;
+#endif
+
+  for (base = name; *name; name++)
+    if (IS_DIR_SEPARATOR (*name))
+      base = name + 1;
+  return base;
+}
+
+int
+check_executable(const char * path)
+{
+  struct stat st;
+
+  DEBUG("(check_executable)  : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!");
+  if ((!path) || (!*path))
+    return 0;
+
+  if ((stat (path, &st) >= 0) &&
+      (
+        /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */
+#if defined (S_IXOTH)
+       ((st.st_mode & S_IXOTH) == S_IXOTH) ||
+#endif
+#if defined (S_IXGRP)
+       ((st.st_mode & S_IXGRP) == S_IXGRP) ||
+#endif
+       ((st.st_mode & S_IXUSR) == S_IXUSR))
+      )
+    return 1;
+  else
+    return 0;
+}
+
+/* Searches for the full path of the wrapper.  Returns
+   newly allocated full path name if found, NULL otherwise */
+char *
+find_executable (const char* wrapper)
+{
+  int has_slash = 0;
+  const char* p;
+  const char* p_next;
+  /* static buffer for getcwd */
+  char tmp[LT_PATHMAX + 1];
+  int tmp_len;
+  char* concat_name;
+
+  DEBUG("(find_executable)  : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!");
+
+  if ((wrapper == NULL) || (*wrapper == '\0'))
+    return NULL;
+
+  /* Absolute path? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':')
+  {
+    concat_name = xstrdup (wrapper);
+    if (check_executable(concat_name))
+      return concat_name;
+    XFREE(concat_name);
+  }
+  else
+  {
+#endif
+    if (IS_DIR_SEPARATOR (wrapper[0]))
+    {
+      concat_name = xstrdup (wrapper);
+      if (check_executable(concat_name))
+        return concat_name;
+      XFREE(concat_name);
+    }
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  }
+#endif
+
+  for (p = wrapper; *p; p++)
+    if (*p == '/')
+    {
+      has_slash = 1;
+      break;
+    }
+  if (!has_slash)
+  {
+    /* no slashes; search PATH */
+    const char* path = getenv ("PATH");
+    if (path != NULL)
+    {
+      for (p = path; *p; p = p_next)
+      {
+        const char* q;
+        size_t p_len;
+        for (q = p; *q; q++)
+          if (IS_PATH_SEPARATOR(*q))
+            break;
+        p_len = q - p;
+        p_next = (*q == '\0' ? q : q + 1);
+        if (p_len == 0)
+        {
+          /* empty path: current directory */
+          if (getcwd (tmp, LT_PATHMAX) == NULL)
+            lt_fatal ("getcwd failed");
+          tmp_len = strlen(tmp);
+          concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1);
+          memcpy (concat_name, tmp, tmp_len);
+          concat_name[tmp_len] = '/';
+          strcpy (concat_name + tmp_len + 1, wrapper);
+        }
+        else
+        {
+          concat_name = XMALLOC(char, p_len + 1 + strlen(wrapper) + 1);
+          memcpy (concat_name, p, p_len);
+          concat_name[p_len] = '/';
+          strcpy (concat_name + p_len + 1, wrapper);
+        }
+        if (check_executable(concat_name))
+          return concat_name;
+        XFREE(concat_name);
+      }
+    }
+    /* not found in PATH; assume curdir */
+  }
+  /* Relative path | not found in path: prepend cwd */
+  if (getcwd (tmp, LT_PATHMAX) == NULL)
+    lt_fatal ("getcwd failed");
+  tmp_len = strlen(tmp);
+  concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1);
+  memcpy (concat_name, tmp, tmp_len);
+  concat_name[tmp_len] = '/';
+  strcpy (concat_name + tmp_len + 1, wrapper);
+
+  if (check_executable(concat_name))
+    return concat_name;
+  XFREE(concat_name);
+  return NULL;
+}
+
+char *
+strendzap(char *str, const char *pat)
+{
+  size_t len, patlen;
+
+  assert(str != NULL);
+  assert(pat != NULL);
+
+  len = strlen(str);
+  patlen = strlen(pat);
+
+  if (patlen <= len)
+  {
+    str += len - patlen;
+    if (strcmp(str, pat) == 0)
+      *str = '\0';
+  }
+  return str;
+}
+
+static void
+lt_error_core (int exit_status, const char * mode,
+          const char * message, va_list ap)
+{
+  fprintf (stderr, "%s: %s: ", program_name, mode);
+  vfprintf (stderr, message, ap);
+  fprintf (stderr, ".\n");
+
+  if (exit_status >= 0)
+    exit (exit_status);
+}
+
+void
+lt_fatal (const char *message, ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
+  va_end (ap);
+}
+EOF
+          # we should really use a build-platform specific compiler
+          # here, but OTOH, the wrappers (shell script and this C one)
+          # are only useful if you want to execute the "real" binary.
+          # Since the "real" binary is built for $host, then this
+          # wrapper might as well be built for $host, too.
+          $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource
+          ;;
+        esac
+        $rm $output
+        trap "$rm $output; exit $EXIT_FAILURE" 1 2 15
+
+	$echo > $output "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='${SED} -e 1s/^X//'
+sed_quote_subst='$sed_quote_subst'
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variable:
+  notinst_deplibs='$notinst_deplibs'
+else
+  # When we are sourced in execute mode, \$file and \$echo are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    echo=\"$qecho\"
+    file=\"\$0\"
+    # Make sure echo works.
+    if test \"X\$1\" = X--no-reexec; then
+      # Discard the --no-reexec flag, and continue.
+      shift
+    elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then
+      # Yippee, \$echo works!
+      :
+    else
+      # Restart under the correct shell, and then maybe \$echo will work.
+      exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
+    fi
+  fi\
+"
+	$echo >> $output "\
+
+  # Find the directory that this script lives in.
+  thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
+
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
+
+    file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
+  done
+
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+	if test "$fast_install" = yes; then
+	  $echo >> $output "\
+  program=lt-'$outputname'$exeext
+  progdir=\"\$thisdir/$objdir\"
+
+  if test ! -f \"\$progdir/\$program\" || \\
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+    file=\"\$\$-\$program\"
+
+    if test ! -d \"\$progdir\"; then
+      $mkdir \"\$progdir\"
+    else
+      $rm \"\$progdir/\$file\"
+    fi"
+
+	  $echo >> $output "\
+
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+      else
+	$echo \"\$relink_command_output\" >&2
+	$rm \"\$progdir/\$file\"
+	exit $EXIT_FAILURE
+      fi
+    fi
+
+    $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $rm \"\$progdir/\$program\";
+      $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $rm \"\$progdir/\$file\"
+  fi"
+	else
+	  $echo >> $output "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+	fi
+
+	$echo >> $output "\
+
+  if test -f \"\$progdir/\$program\"; then"
+
+	# Export our shlibpath_var if we have one.
+	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	  $echo >> $output "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
+
+    export $shlibpath_var
+"
+	fi
+
+	# fixup the dll searchpath if we need to.
+	if test -n "$dllsearchpath"; then
+	  $echo >> $output "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+	fi
+
+	$echo >> $output "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+"
+	case $host in
+	# Backslashes separate directories on plain windows
+	*-*-mingw | *-*-os2*)
+	  $echo >> $output "\
+      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+	  ;;
+
+	*)
+	  $echo >> $output "\
+      exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+	  ;;
+	esac
+	$echo >> $output "\
+      \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\"
+      exit $EXIT_FAILURE
+    fi
+  else
+    # The program doesn't exist.
+    \$echo \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+    \$echo \"This script is just a wrapper for \$program.\" 1>&2
+    $echo \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit $EXIT_FAILURE
+  fi
+fi\
+"
+	chmod +x $output
+      fi
+      exit $EXIT_SUCCESS
+      ;;
+    esac
+
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
+
+      if test "$build_libtool_libs" = convenience; then
+	oldobjs="$libobjs_save"
+	addlibs="$convenience"
+	build_libtool_libs=no
+      else
+	if test "$build_libtool_libs" = module; then
+	  oldobjs="$libobjs_save"
+	  build_libtool_libs=no
+	else
+	  oldobjs="$old_deplibs $non_pic_objects"
+	fi
+	addlibs="$old_convenience"
+      fi
+
+      if test -n "$addlibs"; then
+	gentop="$output_objdir/${outputname}x"
+	generated="$generated $gentop"
+
+	func_extract_archives $gentop $addlibs
+	oldobjs="$oldobjs $func_extract_archives_result"
+      fi
+
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+       cmds=$old_archive_from_new_cmds
+      else
+	# POSIX demands no paths to be encoded in archives.  We have
+	# to avoid creating archives with duplicate basenames if we
+	# might have to extract them afterwards, e.g., when creating a
+	# static archive out of a convenience library, or when linking
+	# the entirety of a libtool archive into another (currently
+	# not supported by libtool).
+	if (for obj in $oldobjs
+	    do
+	      $echo "X$obj" | $Xsed -e 's%^.*/%%'
+	    done | sort | sort -uc >/dev/null 2>&1); then
+	  :
+	else
+	  $echo "copying selected object files to avoid basename conflicts..."
+
+	  if test -z "$gentop"; then
+	    gentop="$output_objdir/${outputname}x"
+	    generated="$generated $gentop"
+
+	    $show "${rm}r $gentop"
+	    $run ${rm}r "$gentop"
+	    $show "$mkdir $gentop"
+	    $run $mkdir "$gentop"
+	    exit_status=$?
+	    if test "$exit_status" -ne 0 && test ! -d "$gentop"; then
+	      exit $exit_status
+	    fi
+	  fi
+
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  counter=1
+	  for obj in $save_oldobjs
+	  do
+	    objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
+	    case " $oldobjs " in
+	    " ") oldobjs=$obj ;;
+	    *[\ /]"$objbase "*)
+	      while :; do
+		# Make sure we don't pick an alternate name that also
+		# overlaps.
+		newobj=lt$counter-$objbase
+		counter=`expr $counter + 1`
+		case " $oldobjs " in
+		*[\ /]"$newobj "*) ;;
+		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
+		esac
+	      done
+	      $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+	      $run ln "$obj" "$gentop/$newobj" ||
+	      $run cp "$obj" "$gentop/$newobj"
+	      oldobjs="$oldobjs $gentop/$newobj"
+	      ;;
+	    *) oldobjs="$oldobjs $obj" ;;
+	    esac
+	  done
+	fi
+
+	eval cmds=\"$old_archive_cmds\"
+
+	if len=`expr "X$cmds" : ".*"` &&
+	     test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  cmds=$old_archive_cmds
+	else
+	  # the command line is too long to link in one step, link in parts
+	  $echo "using piecewise archive linking..."
+	  save_RANLIB=$RANLIB
+	  RANLIB=:
+	  objlist=
+	  concat_cmds=
+	  save_oldobjs=$oldobjs
+
+	  # Is there a better way of finding the last object in the list?
+	  for obj in $save_oldobjs
+	  do
+	    last_oldobj=$obj
+	  done
+	  for obj in $save_oldobjs
+	  do
+	    oldobjs="$objlist $obj"
+	    objlist="$objlist $obj"
+	    eval test_cmds=\"$old_archive_cmds\"
+	    if len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
+	       test "$len" -le "$max_cmd_len"; then
+	      :
+	    else
+	      # the above command should be used before it gets too long
+	      oldobjs=$objlist
+	      if test "$obj" = "$last_oldobj" ; then
+	        RANLIB=$save_RANLIB
+	      fi
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+	      objlist=
+	    fi
+	  done
+	  RANLIB=$save_RANLIB
+	  oldobjs=$objlist
+	  if test "X$oldobjs" = "X" ; then
+	    eval cmds=\"\$concat_cmds\"
+	  else
+	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+	  fi
+	fi
+      fi
+      save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+        eval cmd=\"$cmd\"
+	IFS="$save_ifs"
+	$show "$cmd"
+	$run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+    done
+
+    if test -n "$generated"; then
+      $show "${rm}r$generated"
+      $run ${rm}r$generated
+    fi
+
+    # Now create the libtool archive.
+    case $output in
+    *.la)
+      old_library=
+      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      $show "creating $output"
+
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+	if eval test -z \"\${$var+set}\"; then
+	  relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
+	elif eval var_value=\$$var; test -z "$var_value"; then
+	  relink_command="$var=; export $var; $relink_command"
+	else
+	  var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+	  relink_command="$var=\"$var_value\"; export $var; $relink_command"
+	fi
+      done
+      # Quote the link command for shipping.
+      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+      if test "$hardcode_automatic" = yes ; then
+	relink_command=
+      fi
+
+
+      # Only create the output if not a dry run.
+      if test -z "$run"; then
+	for installed in no yes; do
+	  if test "$installed" = yes; then
+	    if test -z "$install_libdir"; then
+	      break
+	    fi
+	    output="$output_objdir/$outputname"i
+	    # Replace all uninstalled libtool libraries with the installed ones
+	    newdependency_libs=
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      *.la)
+		name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'`
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		if test -z "$libdir"; then
+		  $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+		  exit $EXIT_FAILURE
+		fi
+		newdependency_libs="$newdependency_libs $libdir/$name"
+		;;
+	      *) newdependency_libs="$newdependency_libs $deplib" ;;
+	      esac
+	    done
+	    dependency_libs="$newdependency_libs"
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+	      eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+	      if test -z "$libdir"; then
+		$echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+		exit $EXIT_FAILURE
+	      fi
+	      newdlfiles="$newdlfiles $libdir/$name"
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+	      eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+	      if test -z "$libdir"; then
+		$echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+		exit $EXIT_FAILURE
+	      fi
+	      newdlprefiles="$newdlprefiles $libdir/$name"
+	    done
+	    dlprefiles="$newdlprefiles"
+	  else
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      newdlfiles="$newdlfiles $abs"
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      newdlprefiles="$newdlprefiles $abs"
+	    done
+	    dlprefiles="$newdlprefiles"
+	  fi
+	  $rm $output
+	  # place dlname in correct position for cygwin
+	  tdlname=$dlname
+	  case $host,$output,$installed,$module,$dlname in
+	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
+	  esac
+	  $echo > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+	  if test "$installed" = no && test "$need_relink" = yes; then
+	    $echo >> $output "\
+relink_command=\"$relink_command\""
+	  fi
+	done
+      fi
+
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)"
+      $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $?
+      ;;
+    esac
+    exit $EXIT_SUCCESS
+    ;;
+
+  # libtool install mode
+  install)
+    modename="$modename: install"
+
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+       # Allow the use of GNU shtool's install command.
+       $echo "X$nonopt" | grep shtool > /dev/null; then
+      # Aesthetically quote it.
+      arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"`
+      case $arg in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	arg="\"$arg\""
+	;;
+      esac
+      install_prog="$arg "
+      arg="$1"
+      shift
+    else
+      install_prog=
+      arg=$nonopt
+    fi
+
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+    case $arg in
+    *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+      arg="\"$arg\""
+      ;;
+    esac
+    install_prog="$install_prog$arg"
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=no
+    stripme=
+    for arg
+    do
+      if test -n "$dest"; then
+	files="$files $dest"
+	dest=$arg
+	continue
+      fi
+
+      case $arg in
+      -d) isdir=yes ;;
+      -f) 
+      	case " $install_prog " in
+	*[\\\ /]cp\ *) ;;
+	*) prev=$arg ;;
+	esac
+	;;
+      -g | -m | -o) prev=$arg ;;
+      -s)
+	stripme=" -s"
+	continue
+	;;
+      -*)
+	;;
+      *)
+	# If the previous option needed an argument, then skip it.
+	if test -n "$prev"; then
+	  prev=
+	else
+	  dest=$arg
+	  continue
+	fi
+	;;
+      esac
+
+      # Aesthetically quote the argument.
+      arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+      case $arg in
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+	arg="\"$arg\""
+	;;
+      esac
+      install_prog="$install_prog $arg"
+    done
+
+    if test -z "$install_prog"; then
+      $echo "$modename: you must specify an install program" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    if test -n "$prev"; then
+      $echo "$modename: the \`$prev' option requires an argument" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    if test -z "$files"; then
+      if test -z "$dest"; then
+	$echo "$modename: no file or destination specified" 1>&2
+      else
+	$echo "$modename: you must specify a destination" 1>&2
+      fi
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    # Strip any trailing slash from the destination.
+    dest=`$echo "X$dest" | $Xsed -e 's%/$%%'`
+
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=yes
+    if test "$isdir" = yes; then
+      destdir="$dest"
+      destname=
+    else
+      destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'`
+      test "X$destdir" = "X$dest" && destdir=.
+      destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'`
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files
+      if test "$#" -gt 2; then
+	$echo "$modename: \`$dest' is not a directory" 1>&2
+	$echo "$help" 1>&2
+	exit $EXIT_FAILURE
+      fi
+    fi
+    case $destdir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    *)
+      for file in $files; do
+	case $file in
+	*.lo) ;;
+	*)
+	  $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+      done
+      ;;
+    esac
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
+
+      # Do each installation.
+      case $file in
+      *.$libext)
+	# Do the static libraries later.
+	staticlibs="$staticlibs $file"
+	;;
+
+      *.la)
+	# Check to see that this really is a libtool archive.
+	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+	else
+	  $echo "$modename: \`$file' is not a valid libtool archive" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	library_names=
+	old_library=
+	relink_command=
+	# If there is no directory component, then add one.
+	case $file in
+	*/* | *\\*) . $file ;;
+	*) . ./$file ;;
+	esac
+
+	# Add the libdir to current_libdirs if it is the destination.
+	if test "X$destdir" = "X$libdir"; then
+	  case "$current_libdirs " in
+	  *" $libdir "*) ;;
+	  *) current_libdirs="$current_libdirs $libdir" ;;
+	  esac
+	else
+	  # Note the libdir as a future libdir.
+	  case "$future_libdirs " in
+	  *" $libdir "*) ;;
+	  *) future_libdirs="$future_libdirs $libdir" ;;
+	  esac
+	fi
+
+	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/
+	test "X$dir" = "X$file/" && dir=
+	dir="$dir$objdir"
+
+	if test -n "$relink_command"; then
+	  # Determine the prefix the user has applied to our future dir.
+	  inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"`
+
+	  # Don't allow the user to place us outside of our expected
+	  # location b/c this prevents finding dependent libraries that
+	  # are installed to the same prefix.
+	  # At present, this check doesn't affect windows .dll's that
+	  # are installed into $libdir/../bin (currently, that works fine)
+	  # but it's something to keep an eye on.
+	  if test "$inst_prefix_dir" = "$destdir"; then
+	    $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+
+	  if test -n "$inst_prefix_dir"; then
+	    # Stick the inst_prefix_dir data into the link command.
+	    relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+	  else
+	    relink_command=`$echo "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
+	  fi
+
+	  $echo "$modename: warning: relinking \`$file'" 1>&2
+	  $show "$relink_command"
+	  if $run eval "$relink_command"; then :
+	  else
+	    $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+	fi
+
+	# See the names of the shared library.
+	set dummy $library_names
+	if test -n "$2"; then
+	  realname="$2"
+	  shift
+	  shift
+
+	  srcname="$realname"
+	  test -n "$relink_command" && srcname="$realname"T
+
+	  # Install the shared library and build the symlinks.
+	  $show "$install_prog $dir/$srcname $destdir/$realname"
+	  $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $?
+	  if test -n "$stripme" && test -n "$striplib"; then
+	    $show "$striplib $destdir/$realname"
+	    $run eval "$striplib $destdir/$realname" || exit $?
+	  fi
+
+	  if test "$#" -gt 0; then
+	    # Delete the old symlinks, and create new ones.
+	    # Try `ln -sf' first, because the `ln' binary might depend on
+	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
+	    # so we also need to try rm && ln -s.
+	    for linkname
+	    do
+	      if test "$linkname" != "$realname"; then
+                $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })"
+                $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })"
+	      fi
+	    done
+	  fi
+
+	  # Do each command in the postinstall commands.
+	  lib="$destdir/$realname"
+	  cmds=$postinstall_cmds
+	  save_ifs="$IFS"; IFS='~'
+	  for cmd in $cmds; do
+	    IFS="$save_ifs"
+	    eval cmd=\"$cmd\"
+	    $show "$cmd"
+	    $run eval "$cmd" || {
+	      lt_exit=$?
+
+	      # Restore the uninstalled library and exit
+	      if test "$mode" = relink; then
+		$run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)'
+	      fi
+
+	      exit $lt_exit
+	    }
+	  done
+	  IFS="$save_ifs"
+	fi
+
+	# Install the pseudo-library for information purposes.
+	name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+	instname="$dir/$name"i
+	$show "$install_prog $instname $destdir/$name"
+	$run eval "$install_prog $instname $destdir/$name" || exit $?
+
+	# Maybe install the static library, too.
+	test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
+	;;
+
+      *.lo)
+	# Install (i.e. copy) a libtool object.
+
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+	  destfile="$destdir/$destfile"
+	fi
+
+	# Deduce the name of the destination old-style object file.
+	case $destfile in
+	*.lo)
+	  staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"`
+	  ;;
+	*.$objext)
+	  staticdest="$destfile"
+	  destfile=
+	  ;;
+	*)
+	  $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	  ;;
+	esac
+
+	# Install the libtool object if requested.
+	if test -n "$destfile"; then
+	  $show "$install_prog $file $destfile"
+	  $run eval "$install_prog $file $destfile" || exit $?
+	fi
+
+	# Install the old object if enabled.
+	if test "$build_old_libs" = yes; then
+	  # Deduce the name of the old-style object file.
+	  staticobj=`$echo "X$file" | $Xsed -e "$lo2o"`
+
+	  $show "$install_prog $staticobj $staticdest"
+	  $run eval "$install_prog \$staticobj \$staticdest" || exit $?
+	fi
+	exit $EXIT_SUCCESS
+	;;
+
+      *)
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+	  destfile="$destdir/$destfile"
+	fi
+
+	# If the file is missing, and there is a .exe on the end, strip it
+	# because it is most likely a libtool script we actually want to
+	# install
+	stripped_ext=""
+	case $file in
+	  *.exe)
+	    if test ! -f "$file"; then
+	      file=`$echo $file|${SED} 's,.exe$,,'`
+	      stripped_ext=".exe"
+	    fi
+	    ;;
+	esac
+
+	# Do a test to see if this is really a libtool program.
+	case $host in
+	*cygwin*|*mingw*)
+	    wrapper=`$echo $file | ${SED} -e 's,.exe$,,'`
+	    ;;
+	*)
+	    wrapper=$file
+	    ;;
+	esac
+	if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then
+	  notinst_deplibs=
+	  relink_command=
+
+	  # Note that it is not necessary on cygwin/mingw to append a dot to
+	  # foo even if both foo and FILE.exe exist: automatic-append-.exe
+	  # behavior happens only for exec(3), not for open(2)!  Also, sourcing
+	  # `FILE.' does not work on cygwin managed mounts.
+	  #
+	  # If there is no directory component, then add one.
+	  case $wrapper in
+	  */* | *\\*) . ${wrapper} ;;
+	  *) . ./${wrapper} ;;
+	  esac
+
+	  # Check the variables that should have been set.
+	  if test -z "$notinst_deplibs"; then
+	    $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2
+	    exit $EXIT_FAILURE
+	  fi
+
+	  finalize=yes
+	  for lib in $notinst_deplibs; do
+	    # Check to see that each library is installed.
+	    libdir=
+	    if test -f "$lib"; then
+	      # If there is no directory component, then add one.
+	      case $lib in
+	      */* | *\\*) . $lib ;;
+	      *) . ./$lib ;;
+	      esac
+	    fi
+	    libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
+	    if test -n "$libdir" && test ! -f "$libfile"; then
+	      $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
+	      finalize=no
+	    fi
+	  done
+
+	  relink_command=
+	  # Note that it is not necessary on cygwin/mingw to append a dot to
+	  # foo even if both foo and FILE.exe exist: automatic-append-.exe
+	  # behavior happens only for exec(3), not for open(2)!  Also, sourcing
+	  # `FILE.' does not work on cygwin managed mounts.
+	  #
+	  # If there is no directory component, then add one.
+	  case $wrapper in
+	  */* | *\\*) . ${wrapper} ;;
+	  *) . ./${wrapper} ;;
+	  esac
+
+	  outputname=
+	  if test "$fast_install" = no && test -n "$relink_command"; then
+	    if test "$finalize" = yes && test -z "$run"; then
+	      tmpdir=`func_mktempdir`
+	      file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'`
+	      outputname="$tmpdir/$file"
+	      # Replace the output file specification.
+	      relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
+
+	      $show "$relink_command"
+	      if $run eval "$relink_command"; then :
+	      else
+		$echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+		${rm}r "$tmpdir"
+		continue
+	      fi
+	      file="$outputname"
+	    else
+	      $echo "$modename: warning: cannot relink \`$file'" 1>&2
+	    fi
+	  else
+	    # Install the binary that we compiled earlier.
+	    file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
+	  fi
+	fi
+
+	# remove .exe since cygwin /usr/bin/install will append another
+	# one anyway 
+	case $install_prog,$host in
+	*/usr/bin/install*,*cygwin*)
+	  case $file:$destfile in
+	  *.exe:*.exe)
+	    # this is ok
+	    ;;
+	  *.exe:*)
+	    destfile=$destfile.exe
+	    ;;
+	  *:*.exe)
+	    destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'`
+	    ;;
+	  esac
+	  ;;
+	esac
+	$show "$install_prog$stripme $file $destfile"
+	$run eval "$install_prog\$stripme \$file \$destfile" || exit $?
+	test -n "$outputname" && ${rm}r "$tmpdir"
+	;;
+      esac
+    done
+
+    for file in $staticlibs; do
+      name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+
+      # Set up the ranlib parameters.
+      oldlib="$destdir/$name"
+
+      $show "$install_prog $file $oldlib"
+      $run eval "$install_prog \$file \$oldlib" || exit $?
+
+      if test -n "$stripme" && test -n "$old_striplib"; then
+	$show "$old_striplib $oldlib"
+	$run eval "$old_striplib $oldlib" || exit $?
+      fi
+
+      # Do each command in the postinstall commands.
+      cmds=$old_postinstall_cmds
+      save_ifs="$IFS"; IFS='~'
+      for cmd in $cmds; do
+	IFS="$save_ifs"
+	eval cmd=\"$cmd\"
+	$show "$cmd"
+	$run eval "$cmd" || exit $?
+      done
+      IFS="$save_ifs"
+    done
+
+    if test -n "$future_libdirs"; then
+      $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2
+    fi
+
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      test -n "$run" && current_libdirs=" -n$current_libdirs"
+      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+    else
+      exit $EXIT_SUCCESS
+    fi
+    ;;
+
+  # libtool finish mode
+  finish)
+    modename="$modename: finish"
+    libdirs="$nonopt"
+    admincmds=
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for dir
+      do
+	libdirs="$libdirs $dir"
+      done
+
+      for libdir in $libdirs; do
+	if test -n "$finish_cmds"; then
+	  # Do each command in the finish commands.
+	  cmds=$finish_cmds
+	  save_ifs="$IFS"; IFS='~'
+	  for cmd in $cmds; do
+	    IFS="$save_ifs"
+	    eval cmd=\"$cmd\"
+	    $show "$cmd"
+	    $run eval "$cmd" || admincmds="$admincmds
+       $cmd"
+	  done
+	  IFS="$save_ifs"
+	fi
+	if test -n "$finish_eval"; then
+	  # Do the single finish_eval.
+	  eval cmds=\"$finish_eval\"
+	  $run eval "$cmds" || admincmds="$admincmds
+       $cmds"
+	fi
+      done
+    fi
+
+    # Exit here if they wanted silent mode.
+    test "$show" = : && exit $EXIT_SUCCESS
+
+    $echo "X----------------------------------------------------------------------" | $Xsed
+    $echo "Libraries have been installed in:"
+    for libdir in $libdirs; do
+      $echo "   $libdir"
+    done
+    $echo
+    $echo "If you ever happen to want to link against installed libraries"
+    $echo "in a given directory, LIBDIR, you must either use libtool, and"
+    $echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+    $echo "flag during linking and do at least one of the following:"
+    if test -n "$shlibpath_var"; then
+      $echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+      $echo "     during execution"
+    fi
+    if test -n "$runpath_var"; then
+      $echo "   - add LIBDIR to the \`$runpath_var' environment variable"
+      $echo "     during linking"
+    fi
+    if test -n "$hardcode_libdir_flag_spec"; then
+      libdir=LIBDIR
+      eval flag=\"$hardcode_libdir_flag_spec\"
+
+      $echo "   - use the \`$flag' linker flag"
+    fi
+    if test -n "$admincmds"; then
+      $echo "   - have your system administrator run these commands:$admincmds"
+    fi
+    if test -f /etc/ld.so.conf; then
+      $echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+    fi
+    $echo
+    $echo "See any operating system documentation about shared libraries for"
+    $echo "more information, such as the ld(1) and ld.so(8) manual pages."
+    $echo "X----------------------------------------------------------------------" | $Xsed
+    exit $EXIT_SUCCESS
+    ;;
+
+  # libtool execute mode
+  execute)
+    modename="$modename: execute"
+
+    # The first argument is the command name.
+    cmd="$nonopt"
+    if test -z "$cmd"; then
+      $echo "$modename: you must specify a COMMAND" 1>&2
+      $echo "$help"
+      exit $EXIT_FAILURE
+    fi
+
+    # Handle -dlopen flags immediately.
+    for file in $execute_dlfiles; do
+      if test ! -f "$file"; then
+	$echo "$modename: \`$file' is not a file" 1>&2
+	$echo "$help" 1>&2
+	exit $EXIT_FAILURE
+      fi
+
+      dir=
+      case $file in
+      *.la)
+	# Check to see that this really is a libtool archive.
+	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+	else
+	  $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+	  $echo "$help" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+
+	# Read the libtool library.
+	dlname=
+	library_names=
+
+	# If there is no directory component, then add one.
+	case $file in
+	*/* | *\\*) . $file ;;
+	*) . ./$file ;;
+	esac
+
+	# Skip this library if it cannot be dlopened.
+	if test -z "$dlname"; then
+	  # Warn if it was a shared library.
+	  test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'"
+	  continue
+	fi
+
+	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+	test "X$dir" = "X$file" && dir=.
+
+	if test -f "$dir/$objdir/$dlname"; then
+	  dir="$dir/$objdir"
+	else
+	  $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2
+	  exit $EXIT_FAILURE
+	fi
+	;;
+
+      *.lo)
+	# Just add the directory containing the .lo file.
+	dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+	test "X$dir" = "X$file" && dir=.
+	;;
+
+      *)
+	$echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2
+	continue
+	;;
+      esac
+
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir="$absdir"
+
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+	eval "$shlibpath_var=\"\$dir\""
+      else
+	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
+
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic="$magic"
+
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case $file in
+      -*) ;;
+      *)
+	# Do a test to see if this is really a libtool program.
+	if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	  # If there is no directory component, then add one.
+	  case $file in
+	  */* | *\\*) . $file ;;
+	  *) . ./$file ;;
+	  esac
+
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	fi
+	;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"`
+      args="$args \"$file\""
+    done
+
+    if test -z "$run"; then
+      if test -n "$shlibpath_var"; then
+	# Export the shlibpath_var.
+	eval "export $shlibpath_var"
+      fi
+
+      # Restore saved environment variables
+      if test "${save_LC_ALL+set}" = set; then
+	LC_ALL="$save_LC_ALL"; export LC_ALL
+      fi
+      if test "${save_LANG+set}" = set; then
+	LANG="$save_LANG"; export LANG
+      fi
+
+      # Now prepare to actually exec the command.
+      exec_cmd="\$cmd$args"
+    else
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
+	$echo "export $shlibpath_var"
+      fi
+      $echo "$cmd$args"
+      exit $EXIT_SUCCESS
+    fi
+    ;;
+
+  # libtool clean and uninstall mode
+  clean | uninstall)
+    modename="$modename: $mode"
+    rm="$nonopt"
+    files=
+    rmforce=
+    exit_status=0
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    for arg
+    do
+      case $arg in
+      -f) rm="$rm $arg"; rmforce=yes ;;
+      -*) rm="$rm $arg" ;;
+      *) files="$files $arg" ;;
+      esac
+    done
+
+    if test -z "$rm"; then
+      $echo "$modename: you must specify an RM program" 1>&2
+      $echo "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    rmdirs=
+
+    origobjdir="$objdir"
+    for file in $files; do
+      dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+      if test "X$dir" = "X$file"; then
+	dir=.
+	objdir="$origobjdir"
+      else
+	objdir="$dir/$origobjdir"
+      fi
+      name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+      test "$mode" = uninstall && objdir="$dir"
+
+      # Remember objdir for removal later, being careful to avoid duplicates
+      if test "$mode" = clean; then
+	case " $rmdirs " in
+	  *" $objdir "*) ;;
+	  *) rmdirs="$rmdirs $objdir" ;;
+	esac
+      fi
+
+      # Don't error if the file doesn't exist and rm -f was used.
+      if (test -L "$file") >/dev/null 2>&1 \
+	|| (test -h "$file") >/dev/null 2>&1 \
+	|| test -f "$file"; then
+	:
+      elif test -d "$file"; then
+	exit_status=1
+	continue
+      elif test "$rmforce" = yes; then
+	continue
+      fi
+
+      rmfiles="$file"
+
+      case $name in
+      *.la)
+	# Possibly a libtool archive, so verify it.
+	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	  . $dir/$name
+
+	  # Delete the libtool libraries and symlinks.
+	  for n in $library_names; do
+	    rmfiles="$rmfiles $objdir/$n"
+	  done
+	  test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
+
+	  case "$mode" in
+	  clean)
+	    case "  $library_names " in
+	    # "  " in the beginning catches empty $dlname
+	    *" $dlname "*) ;;
+	    *) rmfiles="$rmfiles $objdir/$dlname" ;;
+	    esac
+	     test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
+	    ;;
+	  uninstall)
+	    if test -n "$library_names"; then
+	      # Do each command in the postuninstall commands.
+	      cmds=$postuninstall_cmds
+	      save_ifs="$IFS"; IFS='~'
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		eval cmd=\"$cmd\"
+		$show "$cmd"
+		$run eval "$cmd"
+		if test "$?" -ne 0 && test "$rmforce" != yes; then
+		  exit_status=1
+		fi
+	      done
+	      IFS="$save_ifs"
+	    fi
+
+	    if test -n "$old_library"; then
+	      # Do each command in the old_postuninstall commands.
+	      cmds=$old_postuninstall_cmds
+	      save_ifs="$IFS"; IFS='~'
+	      for cmd in $cmds; do
+		IFS="$save_ifs"
+		eval cmd=\"$cmd\"
+		$show "$cmd"
+		$run eval "$cmd"
+		if test "$?" -ne 0 && test "$rmforce" != yes; then
+		  exit_status=1
+		fi
+	      done
+	      IFS="$save_ifs"
+	    fi
+	    # FIXME: should reinstall the best remaining shared library.
+	    ;;
+	  esac
+	fi
+	;;
+
+      *.lo)
+	# Possibly a libtool object, so verify it.
+	if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+
+	  # Read the .lo file
+	  . $dir/$name
+
+	  # Add PIC object to the list of files to remove.
+	  if test -n "$pic_object" \
+	     && test "$pic_object" != none; then
+	    rmfiles="$rmfiles $dir/$pic_object"
+	  fi
+
+	  # Add non-PIC object to the list of files to remove.
+	  if test -n "$non_pic_object" \
+	     && test "$non_pic_object" != none; then
+	    rmfiles="$rmfiles $dir/$non_pic_object"
+	  fi
+	fi
+	;;
+
+      *)
+	if test "$mode" = clean ; then
+	  noexename=$name
+	  case $file in
+	  *.exe)
+	    file=`$echo $file|${SED} 's,.exe$,,'`
+	    noexename=`$echo $name|${SED} 's,.exe$,,'`
+	    # $file with .exe has already been added to rmfiles,
+	    # add $file without .exe
+	    rmfiles="$rmfiles $file"
+	    ;;
+	  esac
+	  # Do a test to see if this is a libtool program.
+	  if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+	    relink_command=
+	    . $dir/$noexename
+
+	    # note $name still contains .exe if it was in $file originally
+	    # as does the version of $file that was added into $rmfiles
+	    rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
+	    if test "$fast_install" = yes && test -n "$relink_command"; then
+	      rmfiles="$rmfiles $objdir/lt-$name"
+	    fi
+	    if test "X$noexename" != "X$name" ; then
+	      rmfiles="$rmfiles $objdir/lt-${noexename}.c"
+	    fi
+	  fi
+	fi
+	;;
+      esac
+      $show "$rm $rmfiles"
+      $run $rm $rmfiles || exit_status=1
+    done
+    objdir="$origobjdir"
+
+    # Try to remove the ${objdir}s in the directories where we deleted files
+    for dir in $rmdirs; do
+      if test -d "$dir"; then
+	$show "rmdir $dir"
+	$run rmdir $dir >/dev/null 2>&1
+      fi
+    done
+
+    exit $exit_status
+    ;;
+
+  "")
+    $echo "$modename: you must specify a MODE" 1>&2
+    $echo "$generic_help" 1>&2
+    exit $EXIT_FAILURE
+    ;;
+  esac
+
+  if test -z "$exec_cmd"; then
+    $echo "$modename: invalid operation mode \`$mode'" 1>&2
+    $echo "$generic_help" 1>&2
+    exit $EXIT_FAILURE
+  fi
+fi # test -z "$show_help"
+
+if test -n "$exec_cmd"; then
+  eval exec $exec_cmd
+  exit $EXIT_FAILURE
+fi
+
+# We need to display help for each of the modes.
+case $mode in
+"") $echo \
+"Usage: $modename [OPTION]... [MODE-ARG]...
+
+Provide generalized library-building support services.
+
+    --config          show all configuration variables
+    --debug           enable verbose shell tracing
+-n, --dry-run         display commands without modifying any files
+    --features        display basic configuration information and exit
+    --finish          same as \`--mode=finish'
+    --help            display this help message and exit
+    --mode=MODE       use operation mode MODE [default=inferred from MODE-ARGS]
+    --quiet           same as \`--silent'
+    --silent          don't print informational messages
+    --tag=TAG         use configuration variables from tag TAG
+    --version         print version information
+
+MODE must be one of the following:
+
+      clean           remove files from the build directory
+      compile         compile a source file into a libtool object
+      execute         automatically set library path, then run a program
+      finish          complete the installation of libtool libraries
+      install         install libraries or executables
+      link            create a library or an executable
+      uninstall       remove libraries from an installed directory
+
+MODE-ARGS vary depending on the MODE.  Try \`$modename --help --mode=MODE' for
+a more detailed description of MODE.
+
+Report bugs to <[email protected]>."
+  exit $EXIT_SUCCESS
+  ;;
+
+clean)
+  $echo \
+"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+  ;;
+
+compile)
+  $echo \
+"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -prefer-pic       try to building PIC objects only
+  -prefer-non-pic   try to building non-PIC objects only
+  -static           always build a \`.o' file suitable for static linking
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+  ;;
+
+execute)
+  $echo \
+"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+  -dlopen FILE      add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+  ;;
+
+finish)
+  $echo \
+"Usage: $modename [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges.  Use
+the \`--dry-run' option if you just want to see what would be executed."
+  ;;
+
+install)
+  $echo \
+"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command.  The first component should be
+either the \`install' or \`cp' program.
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+  ;;
+
+link)
+  $echo \
+"Usage: $modename [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+		    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+		    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -objectlist FILE  Use a list of object files found in FILE to specify objects
+  -precious-files-regex REGEX
+                    don't remove output files matching REGEX
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -static           do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+		    specify library version info [each variable defaults to 0]
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename.  Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+  ;;
+
+uninstall)
+  $echo \
+"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+  ;;
+
+*)
+  $echo "$modename: invalid operation mode \`$mode'" 1>&2
+  $echo "$help" 1>&2
+  exit $EXIT_FAILURE
+  ;;
+esac
+
+$echo
+$echo "Try \`$modename --help' for more information about other modes."
+
+exit $?
+
+# The TAGs below are defined such that we never get into a situation
+# in which we disable both kinds of libraries.  Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them.  This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration.  But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+disable_libs=shared
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+disable_libs=static
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:

+ 26 - 0
src/Makefile.am

@@ -0,0 +1,26 @@
+SUBDIRS = .
+
+INCLUDES = -I$(top_srcdir)/src/include
+
+lib_LTLIBRARIES = libwebserver_gnunet.la
+
+AM_CFLAGS = \
+  -D_SERVER_VERSION="\"0.6.3-GNUnet\""
+
+libwebserver_gnunet_la_SOURCES = \
+ clientinfo.c \
+ server.c \
+ client.c \
+ gethandler.c \
+ socket.c \
+ memory.c \
+ outstream.c \
+ weblog.c \
+ utils.c \
+ fnmatch.c \
+ outgif.c \
+ error.c
+
+libwebserver_gnunet_la_LDFLAGS = \
+ -version-info 0:0:0
+

+ 1190 - 0
src/client.c

@@ -0,0 +1,1190 @@
+/* Copyrights 2002 Luis Figueiredo ([email protected]) All rights reserved. 
+ *
+ * See the LICENSE file
+ *
+ * The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission.  Since few users ever read sources,
+ * credits must appear in the documentation.
+ * 
+ * date: Sat Mar 30 14:44:42 GMT 2002
+ * 
+ * -- client handler functions
+ *
+ */
+
+
+#include "client.h"
+
+
+extern char *_libwebserver_version; // Defined in server.c
+
+
+struct web_client *current_web_client;
+int WEBTIMEOUT=10000;
+
+/*********************************************************************************************************/
+/*
+ * initializate (allocate) client list
+ */
+struct web_client *__ILWS_init_client_list() {
+	struct web_client *ret;
+	ret=__ILWS_malloc(sizeof(struct web_client));
+	if(ret==NULL) {
+		LWSERR(LE_MEMORY);
+		return NULL;
+	};
+#ifdef HAVE_OPENSSL
+	ret->ssl=NULL; // ssl handler for this client
+#endif
+	ret->next=NULL;
+	return ret;
+}
+
+
+/*********************************************************************************************************/
+/*
+ * Add a client node to client list
+ */
+int __ILWS_add_client(struct web_client *list, struct web_client *node) {
+	struct web_client *temp=list;
+
+#ifdef WIN32
+	unsigned long t=IOC_INOUT;
+#endif
+	while(temp->next!=NULL)temp=temp->next; // run to last client
+	temp->next=node;
+	temp->next->rbuf=NULL;
+	temp->next->rbufsize=0;
+
+	if(!(temp->next->outstream=__ILWS_init_outstream_list())) {
+		return 0;
+	};
+	if(!(temp->next->varlist=__ILWS_init_var_list())) {
+		return 0;
+	};
+	
+	temp->next->contentlength=0;
+	temp->next->headersize=0;
+
+	temp->next->wheadersize=0;
+	temp->next->writelength=0;
+	temp->next->readsize=0;
+	temp->next->range=0;
+	temp->next->skipped=0;
+	temp->next->cookies=NULL;
+	//temp->next->oldcl=clock();
+	
+
+	temp->next->newdata_try=0;
+#ifdef WIN32
+	// should be optional
+	ioctlsocket(temp->next->socket,FIONBIO,&t);  //non blocking sockets for win32
+#else
+	fcntl(temp->next->socket,F_SETFL,O_NONBLOCK);
+#endif
+	temp->next->next=NULL;
+	temp->next->HTTPdirective=NULL;
+	temp->next->stat=1; // Add a connected client
+	
+	return 1;
+}
+/*********************************************************************************************************/
+
+
+
+/*********************************************************************************************************/
+/*
+ * Delete client node 
+ */
+void __ILWS_delete_client(struct web_client *node) {
+	int rt;
+	rt=shutdown(node->socket,SHUT_RDWR);
+#ifdef WIN32
+	rt=closesocket(node->socket); 
+#else
+	rt=close(node->socket); 
+#endif
+	__ILWS_free(node->cookies); // (0.5.1)
+	__ILWS_delete_outstream_list(node->outstream);
+	__ILWS_delete_var_list(node->varlist);
+#ifdef HAVE_OPENSSL
+	SSL_free (node->ssl);
+#endif
+	__ILWS_free(node->rbuf); // free's
+	__ILWS_free(node);       // free's
+	
+}
+
+
+/*********************************************************************************************************/
+/*
+ * Delete next client node 
+ */
+void __ILWS_delete_next_client(struct web_client *node) {
+	struct web_client *temp=node->next;
+	node->next=node->next->next;
+	__ILWS_delete_client(temp);
+}
+
+/*********************************************************************************************************/
+/*
+ * Delete entire client list
+ */
+void __ILWS_delete_client_list(struct web_client *node) {
+	struct web_client *next;
+	
+	while(node) {
+		next = node->next;
+		__ILWS_free(node);
+		node = next;
+	}
+}
+
+/*********************************************************************************************************/
+/* 
+ * Read what client have to say
+ */
+void __ILWS_read_client(struct web_client *node) {
+	int tmp,tmp1;
+	char *tmp2,*tmp3=NULL;
+	char readtemp[READMAX+1];
+	unsigned long datasize=0;	
+
+#ifdef HAVE_OPENSSL
+	if(node->ssl!=NULL) {	
+		tmp=SSL_read(node->ssl,readtemp,READMAX);		
+	} else {
+		tmp=__ILWS_read(node->socket,readtemp,READMAX);
+	};
+#else
+	tmp=__ILWS_read(node->socket,readtemp,READMAX);
+#endif
+	//fprintf(stderr,"readed %d bytes\n",tmp);
+	if(tmp<1) {
+	
+#ifdef WIN32
+		if(WSAGetLastError()!=WSAEWOULDBLOCK) { 
+#else			
+		if(errno!=EAGAIN) { 
+#endif
+			node->stat=5;return;
+		
+		};
+		//fprintf(stderr,"try: %d (%s)\n",node->newdata_try,node->rbuf);
+		// check if it is over
+		node->newdata_try++;
+		//fprintf(stderr,"node->newdata_try:%d\n",node->newdata_try);
+		if(node->rbufsize >0) {  //&& node->newdata_try>5) { 
+			if(node->headersize==0) { // always reachs "\r\n\r\n"
+				if((tmp3=strstr(node->rbuf,"\r\n\r\n"))) {
+					node->headersize=(tmp3-node->rbuf);
+				};
+			} else {
+				datasize=node->rbufsize-node->headersize;
+				if(node->contentlength==0) { // well if it 0 read all at once
+					__ILWS_init_clientinfo(); // always call this?
+					node->contentlength=atol(ClientInfo->Header("Content-Length"));
+					// range for resuming
+					if((tmp3=strstr(ClientInfo->Header("Range"),"bytes="))) { // if it is in bytes (i hope, always)
+						tmp3+=6; // go to end of "bytes="
+						node->range=atol(tmp3);
+						//printf("Range is %d - %s - %s\n",node->range,ClientInfo->Header("Range"),tmp3);
+					};
+					// end range
+					__ILWS_free_clientinfo();
+				};
+				if(node->contentlength==datasize-4) {
+					//fprintf(stderr,"client (%d) all readed (%d) (try's)-%d\n",node->socket,node->curcl-node->oldcl,node->newdata_try); 
+					node->newdata_try=WEBTIMEOUT; // assume done reading
+					//fprintf(stderr,"Ended naturaly\n");
+					
+				}
+			};
+			if((node->newdata_try>=WEBTIMEOUT)) { // All readed
+				node->rbuf[node->rbufsize]='\0';
+				node->stat=2; // Next state
+				//fprintf(stderr,"%s\n",node->rbuf);
+				//fprintf(stderr,"%d\n",node->rbufsize);
+			}
+		};	
+	}else {
+		tmp1=node->rbufsize;
+		node->rbufsize+=tmp;
+		tmp2=__ILWS_realloc(node->rbuf,node->rbufsize+1);
+		if(tmp2==NULL) {
+			LWSERR(LE_MEMORY);
+			node->stat=5;
+			
+			return;
+		}else {
+			node->rbuf=tmp2;
+		};
+		memcpy(node->rbuf+tmp1,readtemp,tmp);
+		node->newdata_try=0;
+	};
+}
+
+
+/*********************************************************************************************************/
+/*
+ * Process headers w/ get handlers
+ */
+void __ILWS_process_client(struct web_client *node,struct gethandler *list) {
+	struct gethandler *gettemp=list;
+	long secs=time(NULL);
+// for determining content length
+#define RTMPMAX 400	
+	struct outstream *tmpstream; // new on 0.5.1
+	char rtmp[RTMPMAX+1];
+	int rtmps=0;
+	char *thead=NULL;
+	char *tmpl;
+///
+	int tmp=0;
+	int oumask=0; // old usermask
+	char *tmp1=__ILWS_web_client_getreq();
+	char matchbuf[MATCHMAX];	
+	FILE *nfile;  // new file
+	char *fname;  // new file name
+	
+	
+	while(gettemp->next!=NULL && tmp==0) {
+		gettemp=gettemp->next;
+		snprintf(matchbuf,MATCHMAX,"%s",gettemp->str);
+		if(!tmp1) {
+			__ILWS_web_client_writef(node,"HTTP/1.1 400 Invalid request\r\n");
+			__ILWS_web_client_writef(node,"Server: %s\r\n",_libwebserver_version);
+			__ILWS_web_client_writef(node,"Date: %s\r\n",__ILWS_date(mktime(gmtime(&secs)),"%a, %d %b %Y %H:%M:%S GMT")); // Date header
+			__ILWS_web_client_writef(node,"Content-type: text/html\r\n\r\n<HTML><title>Invalid request</title><body bgcolor=FFFFFF><font size=6>400 Invalid  request</font><BR><BR><small>Yout request doesn't match the requesits to be processed</small><BR><HR><small><i>%s</i></small></body></html>\n\r",_libwebserver_version);                                    
+			tmpl=__ILWS_web_client_getreqline();
+			web_log("%s - - [%s] \"%s\" 400 (invalid request)\n",inet_ntoa(node->sa.sin_addr),__ILWS_date(time(NULL),"%d/%b/%Y:%H:%M:%S %z"),tmpl); 
+			__ILWS_free(tmpl);
+			node->stat=5;
+			return;
+		};
+		if(strlen(tmp1)>MAXURLSIZE) {
+			__ILWS_web_client_writef(node,"HTTP/1.1 414 URL to large\r\n");
+			__ILWS_web_client_writef(node,"Server: %s\r\n",_libwebserver_version);
+			__ILWS_web_client_writef(node,"Date: %s\r\n",__ILWS_date(mktime(gmtime(&secs)),"%a, %d %b %Y %H:%M:%S GMT")); // Date header
+			__ILWS_web_client_writef(node,"Content-type: text/html\r\n\r\n<HTML><title>URL to large</title><body bgcolor=FFFFFF><font size=6>414 Requested url to large</font><BR><BR><small>Wonder this... why is that so large?</small><BR><HR><small><i>%s</i></small></body></html>\n\r",_libwebserver_version);                                    
+			tmpl=__ILWS_web_client_getreqline();
+			web_log("%s - - [%s] \"%s\" 414 (url to large)\n",inet_ntoa(node->sa.sin_addr),__ILWS_date(time(NULL),"%d/%b/%Y:%H:%M:%S %z"),tmpl); 
+			__ILWS_free(tmpl);
+			node->stat=5;
+			__ILWS_free(tmp1);
+			return;
+		};
+		if(!fnmatch(matchbuf,tmp1,5)) {
+			if((gettemp->flag & WS_LOCAL) == WS_LOCAL) {
+				if(node->sa.sin_addr.s_addr!=0x0100007F) {
+					__ILWS_web_client_writef(node,"HTTP/1.1 403 Forbidden\r\n");
+					__ILWS_web_client_writef(node,"Server: %s\r\n",_libwebserver_version);
+					__ILWS_web_client_writef(node,"Date: %s\r\n",__ILWS_date(mktime(gmtime(&secs)),"%a, %d %b %Y %H:%M:%S GMT")); // Date header
+					__ILWS_web_client_writef(node,"Content-type: text/html\r\n\r\n<HTML><title>Forbidden</title><body bgcolor=FFFFFF><font size=6>403 Forbidden</font><BR><BR><small>only local host accepted</small><BR><HR><small><i>%s</i></small></body></html>\n\r",_libwebserver_version);
+					tmpl=__ILWS_web_client_getreqline();
+					web_log("%s - - [%s] \"%s\" 403 (Forbidden)\n",inet_ntoa(node->sa.sin_addr),__ILWS_date(time(NULL),"%d/%b/%Y:%H:%M:%S %z"),tmpl); 
+					__ILWS_free(tmpl);
+					node->stat=5;
+					__ILWS_free(tmp1);
+					return;
+				};
+			};                        
+			tmp=1; // Was found
+			node->outstream->flags=(gettemp->flag & WS_DYNVAR); // pass to outstreams
+		};	
+	};	
+	__ILWS_free(tmp1);
+	if(!tmp) { // Nothing found
+		__ILWS_web_client_writef(node,"HTTP/1.1 404 Not Found\r\n");
+		__ILWS_web_client_writef(node,"Server: %s\r\n",_libwebserver_version);
+		__ILWS_web_client_writef(node,"Date: %s\r\n",__ILWS_date(mktime(gmtime(&secs)),"%a, %d %b %Y %H:%M:%S GMT")); // Date header
+		__ILWS_web_client_writef(node,"Content-type: text/html\r\n\r\n<HTML><title>not found</title><body bgcolor=FFFFFF><font size=6>404 NOT FOUND</font><BR><BR><small>The requested content wasn't found</small><BR><HR><small><i>%s</i></small></body></html>\n\r",_libwebserver_version);                                    
+		tmpl=__ILWS_web_client_getreqline();
+		web_log("%s - - [%s] \"%s\" 404 (Not Found)\n",inet_ntoa(node->sa.sin_addr),__ILWS_date(time(NULL),"%d/%b/%Y:%H:%M:%S %z"),tmpl); 
+		__ILWS_free(tmpl);
+		node->stat=5;
+	}else {
+		
+		// if cgi do something else, present headers
+		oumask=umask(077);
+		if(!(fname=__ILWS_tmpfname())) {
+			libws_error(LE_FILESYS,": Error giving a temp filename\n");
+			node->stat=5;
+			return;
+		};
+		if((nfile=freopen(fname,"wb+",stdout))!=NULL) {
+			flock(fileno(stdout),LOCK_EX);
+			tmp=dup(fileno(stdout));
+			nfile=fdopen(tmp,"wb+");
+			if(!__ILWS_add_outstream(node->outstream,fname,nfile,1)) {
+				node->stat=5; // (delete client)
+				return; // ERROR reported by add_outstream
+				
+			};
+// THE PROCESS
+			
+			// Setup Clientinfo before running function
+			if(gettemp->type==GH_FUNCTION) {
+				__ILWS_init_clientinfo();	 
+				gettemp->hdl.func(); // changed (0.5.3) Access by named union (Hilobok Andrew ([email protected]) said that wasn't compile on freeBSD)
+				__ILWS_free_clientinfo();        
+			};
+			// new on 0.5.2
+			if(gettemp->type==GH_DIRECTORY) { // as builtin function for directory listing
+				__ILWS_init_clientinfo();
+				if(strcmp(gettemp->str,"* /*"))ClientInfo->request+=1;  // skip '/' if not equal to "* /*" (used by default)
+				__ILWS_lws_list(gettemp->hdl.path); // changed (0.5.3) Access by named union (Hilobok Andrew ([email protected]) said that wasn't compile on freeBSD)
+				__ILWS_free_clientinfo();
+			};
+			
+			fflush(stdout);
+			fclose(stdout); // it is a tempfile freopened 
+			__ILWS_free(fname); // doesn't need anymore
+#ifdef WIN32			
+			freopen("con","w",stdout);
+#else
+			freopen("/dev/tty","w",stdout);
+#endif
+			if((gettemp->flag & WS_USELEN) == WS_USELEN) {
+// determine writelength (for content-length: header) (new on 0.5.1)
+				tmpstream=node->outstream;
+				tmp=0;
+				while(tmpstream->next!=NULL) { // end of header probably in the firsts outstream nodes check for that
+					if(tmpstream->next->fname!=NULL) {
+						if(tmpstream->next->fstream==NULL) {
+							nfile=fopen(tmpstream->next->fname,"rb");
+							tmpstream->next->fstream=nfile; // here (corrected on 0.5.3);
+						} else {
+							fflush(tmpstream->next->fstream); // <- flush tha thing
+							nfile=tmpstream->next->fstream;
+							fseek(nfile,0,SEEK_SET);
+						};
+						if(nfile!=NULL) {
+							rtmps=0;
+							while((!node->wheadersize) && (!feof(nfile))) { // wheadersize is 0, suposed to be fast, at least if is not malformed
+								if(rtmps>0)	{tmp-=4;fseek(nfile,rtmps-4,SEEK_SET);}
+								if((rtmps=fread(rtmp,1,RTMPMAX,nfile))>0) {
+									rtmp[rtmps]=0;
+									if((tmp1=strstr(rtmp,"\r\n\r\n"))) {
+										node->wheadersize=(tmp+((tmp1+4)-rtmp));
+										rtmps=((tmp1+4)-rtmp);
+										
+									}; 
+									if(node->range>0) {
+										tmp1=realloc(thead,tmp+rtmps+1);
+										thead=tmp1;
+										memcpy(thead+tmp,rtmp,rtmps);
+										thead[tmp+rtmps]=0;
+									};
+									tmp+=rtmps;
+								};
+							};
+							fseek(nfile,SEEK_END,SEEK_END);
+							node->writelength+=(ftell(nfile)-2);
+							//fclose(nfile); // <- don't worry they close the file later
+						};
+					};
+					tmpstream=tmpstream->next;
+					
+				};
+// end writelength
+			} else {
+				node->range=0; // no content-range
+			};
+			
+			if(node->range>node->writelength-node->wheadersize && node->range>0) {
+				__ILWS_web_client_writef(node,"HTTP/1.1 416 Requested Range Not Satisfiable\r\n");
+				__ILWS_web_client_writef(node,"Server: %s\r\n",_libwebserver_version);
+				__ILWS_web_client_writef(node,"Date: %s\r\n",__ILWS_date(mktime(gmtime(&secs)),"%a, %d %b %Y %H:%M:%S GMT")); // Date header
+				__ILWS_web_client_writef(node,"Content-range: bytes */%d\r\n",node->writelength-node->wheadersize);
+				__ILWS_web_client_writef(node,"Content-type: text/html\r\n\r\n<HTML><title>Requested Range Not Satisfiable</title><body bgcolor=FFFFFF><font size=6>416 Requested Range Not Satisfiable</font><BR><BR><small>You're trying to resume an content that is smaller than the requested range</small><BR><HR><small><i>%s</i></small></body></html>\n\r",_libwebserver_version);                                    
+				tmpl=__ILWS_web_client_getreqline();
+				web_log("%s - - [%s] \"%s\" 416 (Requested Range Not Satisfiable)\n",inet_ntoa(node->sa.sin_addr),__ILWS_date(time(NULL),"%d/%b/%Y:%H:%M:%S %z"),tmpl); 
+				__ILWS_free(tmpl);
+				node->stat=5;
+				__ILWS_free(thead);
+				umask(oumask);
+				return;
+			};
+			if(node->range>0 && ((node->outstream->flags & WS_DYNVAR)==WS_DYNVAR)) { // if request range interval and dynvar on than produces not implemented
+				__ILWS_web_client_writef(node,"HTTP/1.1 501 Not Implemented\r\n");
+				__ILWS_web_client_writef(node,"Server: %s\r\n",_libwebserver_version);
+				__ILWS_web_client_writef(node,"Date: %s\r\n",__ILWS_date(mktime(gmtime(&secs)),"%a, %d %b %Y %H:%M:%S GMT")); // Date header
+				__ILWS_web_client_writef(node,"Content-type: text/html\r\n\r\n<HTML><title>Not implemented</title><body bgcolor=FFFFFF><font size=6>501 Not implemented</font><BR><BR><small>Your trying to resume an content that is not possible to resume(WS_DYNVAR fault)</small><BR><HR><small><i>%s</i></small></body></html>\n\r",_libwebserver_version);                                    
+				tmpl=__ILWS_web_client_getreqline();
+				web_log("%s - - [%s] \"%s\" 501 (Not Implemented)\n",inet_ntoa(node->sa.sin_addr),__ILWS_date(time(NULL),"%d/%b/%Y:%H:%M:%S %z"),tmpl); 
+				__ILWS_free(tmpl);
+				node->stat=5;
+				__ILWS_free(thead);
+				umask(oumask);
+				return;
+			};
+
+		}else {
+			LWSERR(LE_FILESYS);
+			
+		}; 
+		node->stat=4;   
+		if(node->HTTPdirective==NULL) {
+			if(node->range>0) {
+				__ILWS_web_client_writef(node,"HTTP/1.1 206 Partial Content\r\n");
+				tmpl=__ILWS_web_client_getreqline();
+				web_log("%s - - [%s] \"%s\" 206 (Partial Content)\n",inet_ntoa(node->sa.sin_addr),__ILWS_date(time(NULL),"%d/%b/%Y:%H:%M:%S %z"),tmpl); 
+				__ILWS_free(tmpl);
+			} else {
+				__ILWS_web_client_writef(node,"HTTP/1.1 200 OK\r\n");
+				tmpl=__ILWS_web_client_getreqline();
+				web_log("%s - - [%s] \"%s\" 200 (OK)\n",inet_ntoa(node->sa.sin_addr),__ILWS_date(time(NULL),"%d/%b/%Y:%H:%M:%S %z"),tmpl); 
+				__ILWS_free(tmpl);
+			};
+
+		} else {
+			__ILWS_web_client_writef(node,"%s\r\n",node->HTTPdirective);
+			tmpl=__ILWS_web_client_getreqline();
+			web_log("%s - - [%s] \"%s\" XXX (User defined)\n",inet_ntoa(node->sa.sin_addr),__ILWS_date(time(NULL),"%d/%b/%Y:%H:%M:%S %z"),tmpl); 
+			__ILWS_free(tmpl);
+		};
+		__ILWS_web_client_writef(node,"Server: %s\r\n",_libwebserver_version);
+		__ILWS_web_client_writef(node,"Date: %s\r\n",__ILWS_date(mktime(gmtime(&secs)),"%a, %d %b %Y %H:%M:%S GMT")); // Date header
+		__ILWS_web_client_writef(node,"Accept-Ranges: bytes\r\n");
+		if((((node->writelength-node->wheadersize)-node->range)>0) && !((node->outstream->flags & WS_DYNVAR)==WS_DYNVAR))__ILWS_web_client_writef(node,"Content-length: %d\r\n",(node->writelength-node->wheadersize)-node->range);
+		if(node->cookies!=NULL)__ILWS_web_client_writef(node,"%s",node->cookies); // new (0.5.1)
+		if(node->range>0) {
+			__ILWS_web_client_writef(node,"Content-range: bytes %d-%d/%d\r\n",node->range,(node->writelength-node->wheadersize)-1,node->writelength-node->wheadersize);
+			__ILWS_web_client_writef(node,"%s",thead); // the rest of header
+			__ILWS_free(thead);
+		};
+		umask(oumask);
+		
+	};
+
+}
+/*********************************************************************************************************/
+/*
+ * Process stream output
+ */
+void __ILWS_output_client(struct web_client *node) {
+	struct outstream *tstream=node->outstream;
+	char *tmp1,*tmp2,*tmp3;
+	char writetemp[WRITEMAX+1];
+	int beginsize=0;
+	int endsize=0;
+	int varsize=0;
+	int namesize=0;
+	if(tstream->next!=NULL) {
+		if(tstream->next->fname!=NULL) {
+			if(tstream->next->fstream==NULL) {
+				if((tstream->next->fstream=fopen(tstream->next->fname,"rb"))==NULL) {
+					LWSERR(LE_FILESYS);
+					__ILWS_delete_next_outstream(tstream);
+					//node->outstream->next=tstream->next;
+					return;
+				} 
+			};
+
+			// read part (must always read)
+			if(tstream->next->rsize==0) {  // start from 0
+				fseek(tstream->next->fstream,0,SEEK_SET); 
+			};
+			memset(writetemp,0,WRITEMAX);
+			tstream->next->rsize=fread(writetemp,1,WRITEMAX,tstream->next->fstream);
+			writetemp[tstream->next->rsize]=0;
+			// if read make var changes on writetemp;
+			// new on 0.5.1  -- UNDERDEV                               // FIX -
+			if((node->outstream->flags & WS_DYNVAR) == WS_DYNVAR) {
+				
+				tmp1=writetemp;
+				while(((tmp1=strstr(tmp1,"$")+1)!=(char*)1) && beginsize==0) {   // check var found
+					for(namesize=0;namesize<50;namesize++) {
+						if(tmp1[namesize]==';') {namesize++;break;}
+						if((tmp1[namesize]<'a' || tmp1[namesize]>'z') && 
+						   (tmp1[namesize]<'A' || tmp1[namesize]>'Z') &&
+						   (tmp1[namesize]<'1' || tmp1[namesize]>'0') &&
+						   tmp1[namesize]!='_') {namesize=0;break;};
+						
+					};
+					if(namesize>0) {
+						if(namesize==1) { // this is $; for sure
+							if(!(tmp3=__ILWS_malloc(2))) {
+								LWSERR(LE_MEMORY);
+								node->stat=5;
+								return;
+							};
+							memcpy(tmp3,"$",namesize);
+							tmp3[namesize]=0;
+						} else {
+							if(!(tmp3=__ILWS_malloc(namesize))) {
+								LWSERR(LE_MEMORY);
+								node->stat=5;
+								return;
+							};
+							memcpy(tmp3,tmp1,namesize-1);
+							tmp3[namesize-1]=0;
+						};
+						
+						tmp1-=1;
+						
+						beginsize=tmp1-writetemp;
+						tmp1+=namesize;  // get var from whateverwhere (client node probably)
+												
+						endsize=strlen(tmp1);	
+						
+						//varsize=2;
+												
+						if((tmp2=__ILWS_malloc(beginsize+1))) {
+							memcpy(tmp2,writetemp,beginsize);
+							tmp2[beginsize]=0;
+							if(namesize==1) {
+								varsize=strlen(tmp3);
+								snprintf(writetemp,WRITEMAX,"%s%s",tmp2,tmp3);
+							} else {
+								varsize=strlen(__ILWS_get_var(node->varlist,tmp3));
+								snprintf(writetemp,WRITEMAX,"%s%s",tmp2,__ILWS_get_var(node->varlist,tmp3));
+							};
+							writetemp[strlen(tmp2)+varsize]=0;
+							__ILWS_free(tmp2);
+							__ILWS_free(tmp3);
+							tstream->next->rsize=(beginsize+varsize);
+							tstream->next->varsize+=(varsize-namesize)-1;
+						} else {
+							LWSERR(LE_MEMORY);
+							__ILWS_free(tmp3);
+							node->stat=5;
+							return;
+						};
+					};
+				};
+			}; // dynvar 
+
+			/* there is nothing more to read here */
+			if(tstream->next->rsize<1){ // i guess rsize < 1 is eof (make sure that server writed last time)
+				//only change if everything written
+				if(feof(tstream->next->fstream) && (ftell(tstream->next->fstream)==tstream->next->wrotesize)) {
+					//fclose(tstream->next->fstream);
+					
+					__ILWS_delete_next_outstream(tstream);
+					//node->outstream->next=tstream->next; 
+				}
+				return;
+			}
+			node->readsize+=tstream->next->rsize;						
+			if(!node->skipped && node->range>0) {
+				tstream->next->wsize=tstream->next->rsize;
+				tstream->next->wrotesize+=tstream->next->wsize;	
+				if((node->readsize-node->wheadersize)<node->range) { // skip range bytes
+					return; // do nothing
+				}else {
+					node->skipped=1;
+					tstream->next->wrotesize-=(node->readsize-node->wheadersize)-node->range; // the right offset
+					fseek(tstream->next->fstream,tstream->next->wrotesize,SEEK_SET);
+					tstream->next->wsize=tstream->next->rsize;
+					return;
+				};
+			};
+			// write part
+
+#ifdef HAVE_OPENSSL
+			if(node->ssl!=NULL) {
+				tstream->next->wsize=SSL_write(node->ssl,writetemp,tstream->next->rsize);
+			} else {
+				tstream->next->wsize=send(node->socket,writetemp,tstream->next->rsize,0);
+			};
+#else		
+			tstream->next->wsize=send(node->socket,writetemp,tstream->next->rsize,0);
+#endif
+			if(tstream->next->wsize>0) {
+				tstream->next->wrotesize+=tstream->next->wsize;	
+				if(tstream->next->rsize!=tstream->next->wsize || beginsize>0) {	                     // FIX
+					fseek(tstream->next->fstream,tstream->next->wrotesize-(tstream->next->varsize),SEEK_SET);       // FIX
+				};
+			};
+#ifdef WIN32
+			if((tstream->next->wsize<=0) && (WSAGetLastError()!=WSAEWOULDBLOCK)) {  // WIN32 only 
+#else
+			if(tstream->next->wsize<=0 && errno!=EAGAIN) {  // linux only // *nix i guess
+#endif			
+				//fclose(tstream->next->fstream);
+				
+				__ILWS_delete_next_outstream(tstream);
+				//node->outstream->next=tstream->next; 
+				return;
+			}else { // broken pipe
+				if(tstream->next->wsize<0) {
+					fseek(tstream->next->fstream,tstream->next->wrotesize-(tstream->next->varsize),SEEK_SET);       //didn't read must back to where it was
+				 };
+			};
+			
+		}else { // filename is null
+			
+			__ILWS_delete_next_outstream(tstream);
+			return;
+		};
+	}else { // End of streams
+		
+		current_web_client->stat=5; // done
+
+	};
+}
+
+/*********************************************************************************************************/
+/*
+ * Set http directive
+ */
+void web_client_HTTPdirective(char *str) { 
+	current_web_client->HTTPdirective=str;
+}
+
+
+/*********************************************************************************************************/
+/*
+ * GET request name
+ */
+char *__ILWS_web_client_getreq() {
+	char *ret;
+	char *tmp1=strstr(current_web_client->rbuf,"?");
+	char *tmp2=strstr(current_web_client->rbuf," HTTP");
+	char *tmp3=strstr(current_web_client->rbuf,"\r\n");
+	int size;
+	if(tmp1==NULL || tmp1>tmp2) {
+		tmp1=tmp2;
+	};
+	if(tmp2>tmp3) {
+		return NULL;
+	};
+	size=tmp1-current_web_client->rbuf;
+	if(size<1) return NULL;
+	
+	if(!(ret=__ILWS_malloc(size+1))) {
+		LWSERR(LE_MEMORY);
+		return NULL;
+	};
+	memcpy(ret,current_web_client->rbuf,size);
+	ret[size]=0;
+	return ret;
+
+};
+
+/*********************************************************************************************************/
+/*
+ * GET request line
+ */
+char *__ILWS_web_client_getreqline() {
+	char *ret;
+	char *tmp1=strstr(current_web_client->rbuf,"\r\n");
+	int size=0;
+	if(tmp1==NULL) return NULL;
+	size=tmp1-current_web_client->rbuf;
+	if(size<1) return NULL;
+	
+	if(!(ret=__ILWS_malloc(size+1))) {
+		LWSERR(LE_MEMORY);
+		return NULL;
+	};
+	memcpy(ret,current_web_client->rbuf,size);
+	ret[size]=0;
+	return ret;
+}
+
+
+/*********************************************************************************************************/
+/*
+ * Add a FILE stream type to client output
+ */
+int web_client_addfile(char *in) {  
+	int ret=__ILWS_add_outstream(current_web_client->outstream,in,NULL,0);
+	int nfd=0;
+	char *fname;
+	FILE *nfile=NULL;
+	fname=__ILWS_tmpfname();
+	fflush(stdout);
+	fclose(stdout); // oldstdout close it?
+
+	if((nfile=freopen(fname,"w+b",stdout))!=NULL){ // redirect
+		flock(fileno(stdout),LOCK_EX); // <- yah
+		nfd=dup(fileno(stdout));
+		nfile=fdopen(nfd,"wb+");
+		if(!__ILWS_add_outstream(current_web_client->outstream,fname,nfile,1)) {
+			LWSERR(LE_MEMORY);
+			return 0;
+		};
+	};
+	__ILWS_free(fname);
+	ClientInfo->outfd=fileno(nfile); 
+	return ret;
+}
+
+
+/*********************************************************************************************************/
+/*
+ * Output data as gif (with width w and height h)
+ */
+unsigned char __ILWS_GLOBALGIFPAL[256][3];
+
+
+void web_client_gifsetpalette(const char *fname) {
+	int j;
+	FILE *palfile;
+	if(strcmp(fname,"EGA")==0) {
+		static int EGApalette[16][3] = {
+				{0,0,0},       {0,0,128},     {0,128,0},     {0,128,128}, 
+				{128,0,0},     {128,0,128},   {128,128,0},   {200,200,200},
+				{100,100,100}, {100,100,255}, {100,255,100}, {100,255,255},
+				{255,100,100}, {255,100,255}, {255,255,100}, {255,255,255} };
+		for (j=0; j<256; j++) {
+			__ILWS_GLOBALGIFPAL[j][0] = (unsigned char)EGApalette[j&15][0];
+			__ILWS_GLOBALGIFPAL[j][1] = (unsigned char)EGApalette[j&15][1];
+			__ILWS_GLOBALGIFPAL[j][2] = (unsigned char)EGApalette[j&15][2];
+		}
+	} else {
+		if(!(palfile=fopen(fname,"rb"))) {
+			return;
+		};
+		fread(__ILWS_GLOBALGIFPAL,sizeof(__ILWS_GLOBALGIFPAL),1,palfile);
+		fclose(palfile);
+	};
+};
+
+int web_client_gifoutput(char *data,int w,int h,int transparencyindex) {
+	int i;
+	unsigned char rm[256],gm[256],bm[256];
+	for(i=0;i<256;i++) {
+		rm[i]=__ILWS_GLOBALGIFPAL[i][0];
+		gm[i]=__ILWS_GLOBALGIFPAL[i][1];
+		bm[i]=__ILWS_GLOBALGIFPAL[i][2];
+	};
+	
+	i=__ILWS_WriteGIF(stdout,data,w,h,rm,gm,bm,256,0,transparencyindex,"libwebserver export gif (xvgifwr.c)");
+	
+	return i;
+};            
+
+
+/*********************************************************************************************************/
+/*
+ * an util to write with format on client_nodes
+ */
+void __ILWS_web_client_writef(struct web_client *node,const char *fmt,...) {
+	va_list args;
+	char buf[WRITEMAX];
+	va_start(args,fmt);
+	vsnprintf(buf,512,fmt,args);
+	va_end(args);
+	
+#ifdef HAVE_OPENSSL        
+	if(node->ssl!=NULL) {
+		SSL_write(node->ssl,buf,strlen(buf));
+	} else {
+		send(node->socket,buf,strlen(buf),0);   
+	};
+#else
+	send(node->socket,buf,strlen(buf),0);
+#endif
+}
+
+
+/*********************************************************************************************************/
+/* 
+ * function "web_client_setcookie"  (improved on 0.5.1) to be called what ever were over handler function
+ *
+ *  name = Name of the cookie
+ *  value = Value of the cookie
+ *  timeout = Timeout in second from current time on
+ *            (0 = Until end of session)
+ *            (-1 = Delete cookie)
+ *  path = Subset of URLs in a domain for which the cookie is valid
+ *         (If the path is not specified (path == NULL), it as assumed to be
+ *          the same path as the document being described by the header which
+ *          contains the cookie.)
+ *  domain = Domain the cookie is valid for
+ *           (If the domain is not set (domain == NULL), the default value of
+ *            domain is the host name of the server which generated the cookie
+ *            response.)
+ *  secure = If a cookie is marked secure (secure == 1), it will only be
+ *           transmitted if the communications channel with the host is a
+ *           secure one. Currently this means that secure cookies will only be
+ *           sent to HTTPS (HTTP over SSL) servers.
+ *           (If secure is not specified (secure == 0), a cookie is considered
+ *            safe to be sent in the clear over unsecured channels. )
+ */
+void web_client_setcookie(char *name, char *value, char *timeoutf, char *path, char *domain, int secure) {
+	char *tmp1=timeoutf;
+	long toffset=0;
+	time_t secs; // to time offset
+	int timeout;
+	int offset=(current_web_client->cookies!=NULL)?strlen(current_web_client->cookies):0;
+	if(timeoutf==NULL) {
+		timeout=0;
+	} else if (!strcmp(timeoutf,"DEL")){
+		timeout=-1;
+	} else {
+		while(*tmp1) {
+			if(*tmp1=='S')toffset=1;             // seconds        
+			if(*tmp1=='M')toffset=60;            // minutes
+			if(*tmp1=='H')toffset=60*60;         // hours
+			if(*tmp1=='d')toffset=60*60*24;      // days
+			if(*tmp1=='m')toffset=60*60*24*30;   // Month
+			if(*tmp1=='y')toffset=60*60*24*365;  // years
+			tmp1++;
+		};
+		timeout=atoi(timeoutf)*toffset;
+	};
+	
+	if (timeout < 0){
+		current_web_client->cookies=__ILWS_realloc(current_web_client->cookies,offset+59+strlen(name));
+		snprintf(current_web_client->cookies+offset,59+strlen(name),"Set-Cookie: %s=deleted; expires=%s", name,	__ILWS_date(time(NULL)-31536001,"%a, %d-%b-%Y %H:%M:%S GMT"));
+		offset+=59+strlen(name);
+	}else{
+		current_web_client->cookies=__ILWS_realloc(current_web_client->cookies,offset+14+strlen(name)+strlen(value));
+		snprintf(current_web_client->cookies+offset,14+strlen(name)+strlen(value),"Set-Cookie: %s=%s", name, value);
+		offset+=13+strlen(name)+strlen(value);
+		
+		if (timeout != 0){
+			//timeout += timezone; Hilobok Andrew ([email protected]) removed this and use gmtime (thanks)
+			// exchanged by mktime(gmtime(&secs))
+			current_web_client->cookies=__ILWS_realloc(current_web_client->cookies,offset+40);
+			secs=time(NULL);
+			snprintf(current_web_client->cookies+offset,40,"; expires=%s", __ILWS_date(mktime(gmtime(&secs))+timeout,"%a, %d-%b-%Y %H:%M:%S GMT"));
+			offset+=39;
+		}
+		if (path != NULL && *path!=0) {
+			current_web_client->cookies=__ILWS_realloc(current_web_client->cookies,offset+8+strlen(path));
+			snprintf(current_web_client->cookies+offset,8+strlen(path),"; path=%s", path);	
+			offset+=7+strlen(path);
+		}
+		if (domain != NULL && *domain!=0){
+			current_web_client->cookies=__ILWS_realloc(current_web_client->cookies,offset+10+strlen(domain));
+			snprintf(current_web_client->cookies+offset,10+strlen(domain),"; domain=%s", domain);
+			offset+=9+strlen(domain);
+		};
+		if (secure == 1) {
+			current_web_client->cookies=__ILWS_realloc(current_web_client->cookies,offset+9);
+			snprintf(current_web_client->cookies+offset,9,"; secure");
+			offset+=8;
+		};
+	}
+	
+	current_web_client->cookies=__ILWS_realloc(current_web_client->cookies,offset+3);
+	snprintf(current_web_client->cookies+offset,3,"\r\n"); // '\0' included
+	offset+=2;
+	// fprintf(stderr,"current_web_client->cookies=\"%s\"\n",current_web_client->cookies); // DEBUG TO REMOVE
+	
+	
+}
+
+
+
+
+/* 
+ * function "web_client_deletecookie"
+ *
+ *  name = Name of the cookie to delete
+ */
+ 
+void web_client_deletecookie(char *name){
+	web_client_setcookie(name, NULL, "DEL", NULL, NULL, 0);
+}
+
+
+
+
+
+
+
+
+int web_client_setvar(char *name,char *value) {
+	return __ILWS_add_var(current_web_client->varlist,name,value);
+};
+char *web_client_getvar(char *name) {
+	return __ILWS_get_var(current_web_client->varlist,name);
+	
+};
+int web_client_delvar(char *name) {
+	return __ILWS_del_var(current_web_client->varlist,name);
+	
+};
+
+
+/***************
+ * variables
+ ***************/
+
+
+// prepare this to work in another file var.c
+struct web_var *__ILWS_init_var_list() {
+	struct web_var *ret;
+	if(!(ret=__ILWS_malloc(sizeof(struct web_var)))) {
+		LWSERR(LE_MEMORY);
+		return NULL;
+	};
+	ret->name=NULL;
+	ret->value=NULL;
+	ret->next=NULL;
+	return ret;
+};
+
+int __ILWS_add_var(struct web_var *list, char *name, char *value) {
+	struct web_var *node=list;
+	int namesize=strlen(name);
+	int valuesize=strlen(value);
+	while(node->next!=NULL) {
+		if(!strcmp(node->next->name,name)) {
+			return 0;
+		};
+		node=node->next;
+	};
+	
+	if(!(node->next=__ILWS_malloc(sizeof(struct web_var)))) {
+		LWSERR(LE_MEMORY);
+		return 0;
+	};
+	
+	if(!(node->next->name=__ILWS_malloc(namesize+1))) {
+		LWSERR(LE_MEMORY);
+		return 0;
+	};
+	memcpy(node->next->name,name,namesize);
+	node->next->name[namesize]=0;
+
+	if(!(node->next->value=__ILWS_malloc(valuesize+1))) {
+		LWSERR(LE_MEMORY);
+		return 0;
+	};
+	memcpy(node->next->value,value,valuesize);
+	node->next->value[valuesize]=0;
+	node->next->next=NULL;  
+	return 1;
+};
+
+int __ILWS_del_var(struct web_var *list, char *name) {
+	struct web_var *node=list;
+	struct web_var *tmp;
+	while(node->next!=NULL) {
+		if(!strcmp(node->next->name,name)) {
+			tmp=node->next;
+			node->next=node->next->next;
+			__ILWS_free(tmp->name);
+			__ILWS_free(tmp->value);
+			__ILWS_free(tmp);
+			return 1;
+		};
+	};
+	return 0;
+};			
+void __ILWS_delete_var_list(struct web_var *list) {
+	struct web_var *node=list;
+	struct web_var *tmp;
+	
+	while(node->next!=NULL) {
+		tmp=node->next;
+		node->next=node->next->next;
+		__ILWS_free(tmp->name);
+		__ILWS_free(tmp->value);
+		
+		__ILWS_free(tmp);
+	};
+	__ILWS_free(node);
+};
+
+
+char *__ILWS_get_var(struct web_var *list , char *name) {
+	struct web_var *node=list;
+	while(node->next!=NULL) {
+		if(!strcmp(node->next->name,name)) {
+			return node->next->value;
+		};
+		node=node->next;
+	};
+	return "";
+};
+
+
+/****************************
+ *  give mime by ext (mime file declared on server)
+ */
+
+void web_client_contenttype(char *ext) {
+	FILE *mimefileh;
+	char *mimedata;
+	char *mimeline;
+	size_t extsize;
+	size_t mimesize;
+	char *tmp;
+    /* -- mime */
+	int isok=0;
+	size_t i;
+	
+	if(ext==NULL || current_web_server->mimefile==NULL) {
+		printf("Content-type: text/plain\r\n\r\n"); // <- mime type, change this calculating mime with extension		
+	} else {
+		extsize=strlen(ext);
+		if((mimefileh=fopen(current_web_server->mimefile,"r"))) {
+			// retrieve file size
+			fseek(mimefileh,SEEK_END,SEEK_END);
+			mimesize=ftell(mimefileh);
+			fseek(mimefileh,0,SEEK_SET);
+			//
+			// malloc and read data
+			mimedata=__ILWS_malloc(mimesize+1);
+			fread(mimedata,1,mimesize,mimefileh);
+			fclose(mimefileh); // close file 
+			//
+			for(i=0;i<mimesize;i++)if(mimedata[i]=='\t')mimedata[i]=' '; // translate \t to 1 space
+			mimedata[mimesize]=0;
+
+			isok=0;
+			mimeline=strtok(mimedata,"\n");
+			while((mimeline=strtok(NULL,"\n")) && !isok) {
+				if(mimeline[0]!='#') { // is not a comment
+					tmp=mimeline;
+					while((tmp=strstr(tmp,ext)) && !isok) {
+						//fprintf(stderr,"extsize(%d),found in %s (%s) %x\n",extsize,mimeline,tmp,tmp[extsize]);
+						if(tmp[-1]==' ' && (tmp[extsize]==' ' || tmp[extsize]=='\0') ) { 
+							if((tmp=strchr(mimeline,' '))) { // the first space?
+								tmp[0]='\0';
+								//fprintf(stderr,"content is: %s\n",mimeline);
+								printf("Content-type: %s\r\n\r\n",mimeline);
+								isok=1;
+							};
+						};
+						tmp+=extsize;
+					};
+					
+				};
+			};
+			if(!isok) {
+				printf("Content-type: text/plain\r\n\r\n");
+			};
+			//printf("%s\n",tmp);
+			__ILWS_free(mimedata);
+			
+		};
+	};
+};
+
+
+/**********************************
+ * internal directory generator
+ */
+
+int __ILWS_lws_list(char *inpath) {
+	/* for type directory */
+	/* mime*/
+	char *ext;
+	struct dirent *dire;
+	DIR *cd;
+	struct stat cfstat;
+	char *dirpath=NULL;
+	char *filepath;
+	char *tmp;
+	char *readfile;
+	float filesize;
+	char filesizeu;
+	////
+	
+	
+	//printf("ClientInfo->request=<B>%s</B><BR>\n",ClientInfo->request);
+	//readfile=__ILWS_malloc(strlen(ClientInfo->request)+1);
+	readfile=ClientInfo->request;
+	while((tmp=strstr(readfile,"./"))) { // this skip ../ also
+		readfile=tmp+1;
+	};
+	while((tmp=strstr(readfile,"//"))) {
+		readfile=tmp+1;
+	};
+	
+	tmp=strstr(readfile,"/"); 
+	if(tmp!=NULL) {
+		readfile=tmp+1; // must be in the first
+	};
+	// skip beind dir
+	if(strlen(readfile)) {
+		filepath=__ILWS_malloc(strlen(inpath)+strlen(readfile)+3);
+		snprintf(filepath,strlen(inpath)+strlen(readfile)+2,"%s%s%s",inpath,(inpath[strlen(inpath)-1]=='/')?"":"/",readfile);
+		//printf("pum ->%s<BR>\n",filepath);
+		if(readfile[strlen(readfile)-1]=='/') {
+			dirpath=__ILWS_malloc(strlen(filepath)+1);
+			memcpy(dirpath,filepath,strlen(filepath)+1); // the 0 included
+		} else {
+			if(!stat(filepath,&cfstat)) { // file must exist
+				if((cfstat.st_mode & S_IFDIR) != S_IFDIR) {
+				// search for mime
+					ext=strrchr(filepath,'.');
+					tmp=strrchr(filepath,'/');
+					ext+=1;
+					if(ext<=tmp) { // is not a extension
+						ext=NULL;
+					};
+					
+					//Wed, 22 Oct 2003 16:04:04 GMT
+					printf("Last-Modified: %s\r\n",__ILWS_date(mktime(gmtime(&cfstat.st_mtime)),"%a, %d %b %Y %H:%M:%S GMT")); // new on 0.5.3
+					web_client_contenttype(ext);
+					web_client_addfile(filepath); // fopen and write, maybe?
+					__ILWS_free(filepath);
+					return 1;
+				} else {
+					web_client_HTTPdirective("HTTP/1.1 404 File Not Found");
+					printf("Content-type: text/html\r\n\r\n<HTML><title>file not found</title><body bgcolor=FFFFFF><font size=6>404 FILE NOT FOUND</font><BR><BR><small>The request \"%s\" wasn't found, try this <a href='%s/'>link</a></small><BR><HR><small><i>%s</i></small></body></html>\n\r",filepath,ClientInfo->request,_libwebserver_version); 
+					__ILWS_free(filepath);
+					return 0;
+				};
+			}else {
+				web_client_HTTPdirective("HTTP/1.1 404 File Not Found");
+				printf("Content-type: text/html\r\n\r\n<HTML><title>file not found</title><body bgcolor=FFFFFF><font size=6>404 FILE NOT FOUND</font><BR><BR><small>The request \"%s\" wasn't found</small><BR><HR><small><i>%s</i></small></body></html>\n\r",filepath,_libwebserver_version); 
+				__ILWS_free(filepath);
+				return 0;
+			};
+		};
+		__ILWS_free(filepath);
+	};
+	//printf("Content-type: text/html\r\n\r\n");
+	//fprintf(stderr,"dirpath=%s inpath=%s\n",dirpath,inpath);
+	if(dirpath==NULL) {
+		dirpath=__ILWS_malloc(strlen(inpath)+1);
+		memcpy(dirpath,inpath,strlen(inpath)+1);
+	};
+	cd=opendir(dirpath);
+	if(cd!=NULL) {
+		printf("Content-type: text/html\r\n\r\n");
+		printf("<HTML><HEAD><TITLE>Contents of %s</TITLE></HEAD><BODY>\n",dirpath);
+		printf("<h1>Contents of directory %s</h1><HR>\n",dirpath);
+		printf("<form><input type=text name=match value=\"%s\"><input type=submit name='send' value='wildcard'></form>\n",strlen(ClientInfo->Query("match"))?ClientInfo->Query("match"):"*");
+		printf("<PRE>\n");
+		while((dire=readdir(cd))) {
+			if( ((dire->d_name[0]!='.') || (strcmp(dirpath,inpath) && !strcmp(dire->d_name,".."))) && (!fnmatch(ClientInfo->Query("match"),dire->d_name,0) || !strlen(ClientInfo->Query("match"))) ) {
+				filepath=__ILWS_malloc(strlen(dirpath)+strlen(dire->d_name)+2);
+				snprintf(filepath,strlen(dirpath)+strlen(dire->d_name)+2,"%s%s%s",dirpath,(dirpath[strlen(dirpath)-1]=='/')?"":"/",dire->d_name);
+				//fprintf(stderr,"filename=%s\n",filepath);
+				if(!stat(filepath,&cfstat)) {
+						if((cfstat.st_mode & S_IFDIR) == S_IFDIR) {
+						printf("%s	&lt;DIR&gt;	<a href=\"%s/\">%s</a>\n",__ILWS_date(cfstat.st_mtime,"%a, %d %b %Y %H:%M"),dire->d_name,dire->d_name);
+					}else {
+						filesize=(float)cfstat.st_size;
+						filesizeu=0;
+						while(filesize>1024) {
+							filesize/=1024;
+							filesizeu++;
+						};
+						printf("%s	%.1f%c	<a href=\"%s\">%s</a>\n",__ILWS_date(cfstat.st_mtime,"%a, %d %b %Y %H:%M"),filesize,(filesizeu==2)?'M':(filesizeu==1)?'K':'b',dire->d_name,dire->d_name);
+					};
+				};
+				__ILWS_free(filepath);
+			};
+		
+		};
+		printf("</PRE>\n");				
+		printf("<HR>\n");
+		printf("<address>%s</address>\n",_libwebserver_version);
+		printf("</BODY></HTML>\r\n");
+		__ILWS_free(dirpath);
+		closedir(cd);
+	} else {
+		web_client_HTTPdirective("HTTP/1.1 404 File Not Found");
+		printf("Content-type: text/html\r\n\r\n<HTML><title>file not found</title><body bgcolor=FFFFFF><font size=6>404 FILE NOT FOUND</font><BR><BR><small>The request \"%s\" wasn't found</small><BR><HR><small><i>%s</i></small></body></html>\n\r",dirpath,_libwebserver_version); 
+		return 0;
+	};
+	return 1;
+};
+
+
+
+

+ 159 - 0
src/client.h

@@ -0,0 +1,159 @@
+/* Copyrights 2002 Luis Figueiredo ([email protected]) All rights reserved. 
+ *
+ * See the LICENSE file
+ *
+ * The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission.  Since few users ever read sources,
+ * credits must appear in the documentation.
+ *
+ * date: Sat Mar 30 14:44:42 GMT 2002
+ *
+ *
+ * --
+ *
+ */
+
+#ifndef _CLIENT_H_
+#define _CLIENT_H_
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <string.h>
+#include <errno.h>
+
+
+
+#ifdef HAVE_OPENSSL
+
+#include <openssl/rsa.h>       /* SSLeay stuff */
+#include <openssl/crypto.h>
+#include <openssl/x509.h>
+#include <openssl/pem.h>
+#include <openssl/ssl.h>
+#include <openssl/err.h>              
+
+#endif
+
+
+#include "socket.h"
+
+#include "memory.h"
+#include "outstream.h"
+
+
+#include "gethandler.h"
+
+
+
+#include "weblog.h"
+#include "utils.h"
+#include "fnmatch.h"
+#include "outgif.h"
+#include "error.h"
+#include "debug.h"
+
+
+#include "clientinfo.h"
+
+
+#ifdef WIN32
+#include "flock.h"     // my flock
+#include "dirent.h"
+#else
+#include <sys/file.h>  // for flock
+#include <dirent.h>
+#endif
+
+#define READMAX 100000  // 1Mb upload 
+#define WRITEMAX 100000 // 1Mb download 1mb per client? // smaller is better for multi read bigger is better for big downloads
+#define MAXURLSIZE 2000 // 
+
+extern int WEBTIMEOUT;    //to be changed externaly
+//#define WEBTIMEOUT 10000 // TIMEOUT WITHOUT RECEIVING DATA (not in seconds but in read tries)
+
+
+struct web_var {
+	char *name;
+	char *value;
+	struct web_var *next;
+};
+
+struct web_client {
+	
+	int socket;
+	struct sockaddr_in sa;
+	unsigned int salen;
+    char *HTTPdirective;
+	unsigned char stat;  /* 0001b idle,0010b down streaming, 0011 done down streaming, 0100b out streaming,0101 done out streaming */
+	// Read control	
+	char *rbuf;
+	unsigned long rbufsize;
+	int newdata_try;
+	unsigned long contentlength; // for read propose (optimize speed 0.5.1)
+	unsigned long headersize;
+	
+	// Write control
+	struct outstream *outstream;
+	struct web_var *varlist;
+	char *cookies; // cookie header (0.5.1)		 
+	long writelength;
+	long readsize;
+	long range;
+	int skipped;
+	long wheadersize; 
+//	clock_t oldcl,curcl;
+
+#ifdef HAVE_OPENSSL
+	SSL *ssl;
+	X509*    cert;
+#else
+	void *pad[2];
+#endif
+	struct web_client *next;
+};                      
+extern struct web_client *current_web_client;
+
+struct web_client *__ILWS_init_client_list();
+int __ILWS_add_client(struct web_client *,struct web_client *);
+void __ILWS_delete_next_client(struct web_client *);
+void __ILWS_delete_client_list(struct web_client *);
+
+void __ILWS_read_client(struct web_client *);
+void __ILWS_process_client(struct web_client *,struct gethandler *);
+void __ILWS_output_client(struct web_client *);
+
+void __ILWS_web_client_writef(struct web_client *,const char *,...);
+
+int web_client_addfile(char *);
+void web_client_contenttype(char *); // new on 0.5.2
+
+void web_client_gifsetpalette(const char *);
+
+extern unsigned char __ILWS_GLOBALGIFPAL[256][3];
+
+int web_client_gifoutput(char *,int,int,int);
+
+void web_client_HTTPdirective(char *);
+
+char *__ILWS_web_client_getreqline();
+char *__ILWS_web_client_getreq();
+// new (0.5.1)
+int web_client_setvar(char *,char *);
+char *web_client_getvar(char *);
+int web_client_delvar(char *);
+
+// put in var.h
+struct web_var *__ILWS_init_var_list();
+int __ILWS_add_var(struct web_var *, char *, char *);
+int __ILWS_del_var(struct web_var *, char *);
+void __ILWS_delete_var_list(struct web_var *);
+char *__ILWS_get_var(struct web_var *list , char *name);
+
+int __ILWS_lws_list(char *); // new on 0.5.2
+
+#endif
+

+ 1124 - 0
src/clientinfo.c

@@ -0,0 +1,1124 @@
+/* Copyrights 2002 Luis Figueiredo ([email protected]) All rights reserved. 
+ *
+ * See the LICENSE file
+ *
+ * The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission.  Since few users ever read sources,
+ * credits must appear in the documentation.
+ *
+ * date: Wed Oct  9 19:56:22 GMT 2002
+ *
+ * -- parse http header into "ClientInfo"
+ *
+ */
+
+#include "clientinfo.h"
+
+
+struct ClientInfo *ClientInfo; // tochange
+
+/*********************************************************************************************************/
+/*
+ * Initialize ClientInfo structure
+ */
+void __ILWS_init_clientinfo() { 
+	char *t;
+	struct outstream *tstream=current_web_client->outstream;
+	
+	ClientInfo=__ILWS_malloc(sizeof(struct ClientInfo));
+	if(ClientInfo==NULL) {
+		LWSERR(LE_MEMORY);
+		return;
+	};
+	
+	while(tstream->next!=NULL) {
+		tstream=tstream->next;
+	};
+	
+	if(tstream->fstream!=NULL) ClientInfo->outfd=fileno(tstream->fstream); //take it off?
+		
+	ClientInfo->mem=__ILWS_init_buffer_list(); // First thing, other fuctions use this to allocate
+	
+        
+	ClientInfo->request=__ILWS_clientinfo_getreqname();
+	
+	ClientInfo->inetname=NULL;
+	t=inet_ntoa(current_web_client->sa.sin_addr);
+	if((ClientInfo->inetname=__ILWS_add_buffer(ClientInfo->mem,strlen(t)+1))) {
+		memcpy(ClientInfo->inetname,t,strlen(t));
+		ClientInfo->inetname[strlen(t)]='\0';
+	};
+	
+	ClientInfo->method=__ILWS_clientinfo_getmethod();
+	ClientInfo->user=__ILWS_clientinfo_getauthuser();
+	ClientInfo->pass=__ILWS_clientinfo_getauthpass();
+	
+	
+	
+	/* Initialize List's */
+	ClientInfo->HeaderList=NULL;
+	ClientInfo->QueryList=NULL;
+	ClientInfo->PostList=NULL;
+	ClientInfo->MultiPartList=NULL;
+	ClientInfo->CookieList=NULL;
+
+	ClientInfo->Header=__ILWS_Header;
+	ClientInfo->Query=__ILWS_Query;
+	ClientInfo->QueryString=__ILWS_clientinfo_getquerystring();	
+	ClientInfo->Post=__ILWS_Post;
+	ClientInfo->PostData=__ILWS_clientinfo_getpostdata();	
+	ClientInfo->MultiPart=__ILWS_MultiPart;
+	ClientInfo->Cookie=__ILWS_Cookie;
+	ClientInfo->Conf=__ILWS_Conf;
+	ClientInfo->CookieString=__ILWS_Header("Cookie");
+	
+}                      
+
+/*********************************************************************************************************/
+/*
+ * Free ClientInfo structure
+ */
+void __ILWS_free_clientinfo() {
+	if(ClientInfo==NULL) {	
+		return;
+	};
+	__ILWS_delete_buffer_list(ClientInfo->mem); 
+	
+	__ILWS_free(ClientInfo);
+	ClientInfo=NULL;
+}
+
+
+/*********************************************************************************************************/
+/*
+ * Header function for ClientInfo->Header("x")
+ */
+char *__ILWS_Header(char *str) {
+	char *tmp1,*tmp2,*tmp3,*ret;
+	struct _Header *hl=ClientInfo->HeaderList;
+	char *defret="";
+	size_t size;
+	size_t strsize;
+	if(str==NULL) { // request is null return whole header
+		return current_web_client->rbuf;
+	};
+	if(ClientInfo->HeaderList==NULL) {
+		
+		ClientInfo->HeaderList=__ILWS_add_buffer(ClientInfo->mem,sizeof(struct _Header));
+		if(ClientInfo->HeaderList==NULL) {
+			LWSERR(LE_MEMORY);
+			return defret;
+		};
+		ClientInfo->HeaderList->next=NULL;
+		ClientInfo->HeaderList->data=NULL;
+		ClientInfo->HeaderList->id=NULL;
+		hl=ClientInfo->HeaderList;
+	};
+	// First search if exists
+	
+	while(hl->next!=NULL) {
+		if(hl->next->id!=NULL) {
+			if(!strcmp(hl->next->id,str)) {
+				
+				return hl->next->data;
+			};
+		};
+		hl=hl->next;	
+	};
+	
+	/* Doesn't exists	 */
+	strsize=strlen(str);
+	if(!(hl->next=__ILWS_add_buffer(ClientInfo->mem,sizeof(struct _Header)))) {
+		LWSERR(LE_MEMORY);
+		return defret;
+	};
+	if(!(hl->next->id=__ILWS_add_buffer(ClientInfo->mem,strsize+1))) {
+		LWSERR(LE_MEMORY);
+		return defret;
+	};
+	
+	memcpy(hl->next->id,str,strsize);
+	hl->next->id[strsize]=0;	
+	hl->next->data=defret;
+	hl->next->next=NULL;
+
+	if(!(tmp3=__ILWS_malloc(strsize+3))) {
+		LWSERR(LE_MEMORY);
+		return defret;
+	};
+	snprintf(tmp3,strsize+3,"%s: ",str);
+	tmp1=__ILWS_stristr(current_web_client->rbuf,tmp3);
+	__ILWS_free(tmp3);
+	if(tmp1==NULL) {
+		return defret;
+	};
+	
+	tmp1+=strsize+2;
+	if(!(tmp2=strstr(tmp1,"\r\n"))) { // Unexpected (security anyway)
+		return defret;
+	};
+	if((size=(unsigned int)(tmp2-tmp1))<0) {
+		return defret;
+	};
+	if(!(ret=__ILWS_add_buffer(ClientInfo->mem,size+1))) { //malloc & register
+		return defret;
+	};
+	memcpy(ret,tmp1,size);
+	ret[size]=0;
+	hl->next->data=ret;
+	return ret;
+}                                
+
+
+
+/*********************************************************************************************************/
+/*
+ * Function for Querydata
+ */
+char *__ILWS_Query(char *handle) {
+    char *tmp1,*tmp2,*tmp3,*tmp4,*ret;
+	char *defret="";
+	size_t strsize;
+    size_t size;
+	int j=0,ch;
+	int seek=1;
+	unsigned int i;
+	unsigned int *iddb=NULL;
+	unsigned int *iddb2=NULL;
+	unsigned int idf=0;
+	int rw=0; // 0 data 1 number of vars; (return what?)
+	struct _Query *ql=ClientInfo->QueryList;
+	
+	
+	if(handle==NULL) {
+		return ClientInfo->QueryString;
+	};
+	if(handle[0]=='#') rw=1;
+	// allocate first node from the list 
+	if(ClientInfo->QueryList==NULL) {                                                              
+		ClientInfo->QueryList=__ILWS_add_buffer(ClientInfo->mem,sizeof(struct _Query));                   
+		if(ClientInfo->QueryList==NULL) {                                                          
+			LWSERR(LE_MEMORY);
+			if(rw) return 0;
+			return defret;
+		};
+		ClientInfo->QueryList->next=NULL;
+		ClientInfo->QueryList->data=NULL;
+		ClientInfo->QueryList->id=NULL;
+		ql=ClientInfo->QueryList;
+	};
+	// done allocating
+
+
+	// First search if exists and fetch values;
+	
+	idf=1;
+	iddb=&idf;
+	seek=1;
+	
+	while(ql->next!=NULL) {
+		if(ql->next->id!=NULL) {
+			if(!strcmp(ql->next->id,handle+rw) && *iddb >= 0) {
+				if(seek==1) {
+					iddb=&ql->next->index; // atribute iddb to first node
+					iddb2=&ql->next->idf; // atribute iddb2 to counting
+					if(rw) return (char *)*iddb2;
+					if(ql->next->idf==1) {
+						return ql->next->data;
+					};
+					j=*iddb;
+					seek++;			
+				};
+				*iddb=*iddb-1;
+				
+				if(*iddb<=0) {
+					*iddb=j-1;
+					if(j<=1) {
+						*iddb=*iddb2; // go to start if any
+						//return defret; // to be null
+					};
+					return ql->next->data; // Return existent
+				};
+				
+			};
+		};
+		ql=ql->next;	
+	};
+	
+	
+	
+	/* Doesn't exists	 */
+	strsize=strlen(handle+rw);
+	tmp1=strstr(current_web_client->rbuf,"?"); 
+	tmp3=strstr(current_web_client->rbuf," HTTP"); // End of GET header
+	if(tmp1!=NULL && tmp1<tmp3) {
+		tmp1+=1;
+	} else {
+		if(rw)return 0;
+		return defret;
+	}
+	
+	// Working here
+	idf=0;
+	ret=defret;
+	seek=1;
+	tmp4=tmp1;
+	while(seek==1) {
+		tmp1=tmp4;
+		do {
+			tmp2=strstr(tmp1,handle+rw);
+			if(tmp2==NULL) { // must be nonnull
+				if(iddb!=NULL && iddb2!=NULL) { // if iddb2 is null then is just one value;
+					*iddb2=*iddb;
+					if(!rw)*iddb=*iddb-1;
+				};
+				if(rw) {
+					if(ret==defret) return 0;
+					return (char *)*iddb2;
+				} 
+				return ret; // if first null return defret (ret=defret);
+				
+			};
+			tmp1=tmp2+strsize;
+		} while ((tmp2[-1]!='?' && tmp2[-1]!='&') || tmp2[strsize]!='='); // Johannes E. Schindelin Fix
+
+		if(tmp3<tmp2) { 
+			if(iddb!=NULL && iddb2!=NULL) {
+				*iddb2=*iddb;
+				if(!rw)*iddb=*iddb-1;
+			};
+			if(rw) {
+				if(ret==defret) return 0;
+				return (char *)*iddb2;
+			}
+			
+			return ret;
+		};
+	
+		tmp4=tmp1;
+			// if not null, so add an node;
+	
+		// Working here ^
+		ql->next=__ILWS_add_buffer(ClientInfo->mem,sizeof(struct _Query));
+		if(ql->next==NULL) {
+			LWSERR(LE_MEMORY);
+			if(handle[0]=='#') rw=1;
+			return defret;
+		};
+		ql->next->id=__ILWS_add_buffer(ClientInfo->mem,strsize+1);
+		if(ql->next->id==NULL) {
+			LWSERR(LE_MEMORY);
+			if(handle[0]=='#') rw=1;
+			return defret;
+		};
+		memcpy(ql->next->id,handle+rw,strsize);
+		ql->next->id[strsize]=0;	
+		if(idf==0) {
+			ql->next->index=0;
+			iddb=&ql->next->index;
+			iddb2=&ql->next->idf; // second holds information about number of fetchs;
+			
+		};
+		ql->next->data=defret;
+		ql->next->next=NULL;
+
+		
+		tmp1=strstr(tmp2,"&"); // tmp1 goes to next '&'
+		tmp2+=strsize+1;           // tmp2 goes to start of data
+		tmp3=strstr(tmp2," HTTP"); // tmp3 goes to the end of Get header
+		if(tmp1==NULL || ((unsigned int)tmp1>(unsigned int)tmp3)) {
+			size=tmp3-tmp2; // MUST HAVE (" HTTP") else, server don't let in
+		} else {
+			size=tmp1-tmp2;
+		};
+		if(size<1) {
+			if(handle[0]=='#') rw=1;
+			return defret;
+		};
+		
+		
+		ql->next->data=__ILWS_add_buffer(ClientInfo->mem,size+1);
+		if(ql->next->data==NULL) {
+			LWSERR(LE_MEMORY);
+			if(handle[0]=='#') rw=1;
+			return defret;
+		};
+		j=0;
+		for(i=0;i<size;i++) { // Hex translation here
+			switch (ch=tmp2[j]) {
+			case '+':
+				ch=' ';
+				break;
+			case '%':
+				
+				tmp1=__ILWS_malloc(3);
+				if(tmp1==NULL) {
+					LWSERR(LE_MEMORY);
+					if(rw) return 0;
+					return defret;
+				};
+				strncpy(tmp1,&tmp2[j+1],2);
+				tmp1[2]=0;
+				ch=strtol(tmp1,NULL,16);
+				j+=2;
+				size-=2;
+				
+				__ILWS_free(tmp1);
+				break;
+			};
+			ql->next->data[i]=ch;
+			j++;
+		};
+		ql->next->data[size]='\0';
+		ret=ql->next->data; // to the last
+		ql=ql->next;
+		*iddb=*iddb+1;
+		idf++;
+ 	};
+	return ret;
+}                                                                                          
+
+
+
+/*********************************************************************************************************/
+/*
+ * Function for Postdata
+ */
+char *__ILWS_Post(char *handle) {
+	char *tmp1,*tmp2,*tmp3,*ret;
+	struct _Post *pl=ClientInfo->PostList;
+	char *defret="";
+	int *iddb=NULL,*iddb2=NULL;
+	int idf;
+	int seek=1;
+	size_t strsize;
+	size_t size;
+	int j=0,ch;
+	unsigned int i;
+	int rw=0; //return what;
+	
+	tmp1=strstr(current_web_client->rbuf,"Content-type: multipart/form-data"); // multipart this post doesn't work
+	if(tmp1!=NULL) {
+		return ClientInfo->MultiPart(handle).data;
+	};
+	if(handle==NULL) {
+		return ClientInfo->PostData;
+	};
+	if(handle[0]=='#')rw=1;
+	/* Allocate the list */
+	if(ClientInfo->PostList==NULL) {
+		if(!(ClientInfo->PostList=__ILWS_add_buffer(ClientInfo->mem,sizeof(struct _Post)))) {
+			LWSERR(LE_MEMORY);
+			if(rw) return 0;
+			return defret;
+		};
+		ClientInfo->PostList->next=NULL;
+		ClientInfo->PostList->data=NULL;
+		ClientInfo->PostList->id=NULL;
+		pl=ClientInfo->PostList;
+	};
+	
+	// First search if exists
+	idf=1;
+	iddb=&idf;
+	seek=1;
+	while(pl->next!=NULL) {
+		if(pl->next->id!=NULL) {
+			if(!strcmp(pl->next->id,handle+rw) && iddb>=0) {
+				if(seek==1) {
+					iddb=&pl->next->index;
+					iddb2=&pl->next->idf;
+					if(rw) return (char *)(*iddb2);
+					if(pl->next->idf==1) {
+						return pl->next->data;
+					};
+					j=*iddb;
+					seek++;
+				};
+				*iddb=*iddb-1;
+				
+				if(*iddb<=0) {
+					*iddb=j-1;
+					if(j<=1) {
+						*iddb=*iddb2;
+
+						//return defret;
+					};
+					return pl->next->data;
+				};
+			};
+		};
+		pl=pl->next;	
+	};
+	
+	
+	
+	
+	
+	/* Doesn't exists	 */
+	strsize=strlen(handle+rw);
+	tmp1=strstr(current_web_client->rbuf,"\r\n\r\n"); 
+	if(tmp1!=NULL)
+		tmp1+=4;
+	else {
+		if(rw) return 0;
+		return defret;
+	};
+	idf=0;
+	ret=defret;
+	seek=1;
+	tmp3=tmp1;
+	while(seek==1) {
+		tmp1=tmp3;
+		do {
+			tmp2=strstr(tmp1,handle+rw);
+			if(tmp2==NULL) { // mustn't be null
+				if(iddb!=NULL && iddb2!=NULL) { // if iddb2 is null then is just one value;
+					*iddb2=*iddb;
+					if(!rw)*iddb=*iddb-1;
+				};
+				if(rw) {
+					if(ret==defret) return 0;
+					return (char *)*iddb2;
+				}
+				return ret; // if first null return defret (ret=defret);
+				
+			};
+			tmp1=tmp2+strsize;
+		} while ((tmp2[-1]!='\n' && tmp2[-1]!='&') || tmp2[strsize]!='='); // Johannes E. Schindelin Fix
+		tmp3=tmp1;
+
+		
+		pl->next=__ILWS_add_buffer(ClientInfo->mem,sizeof(struct _Post));
+		if(pl->next==NULL) {
+			LWSERR(LE_MEMORY);
+			if(rw) return 0;
+			return defret;
+		};
+		pl->next->id=__ILWS_add_buffer(ClientInfo->mem,strsize+1);
+		if(pl->next->id==NULL) {
+			LWSERR(LE_MEMORY);
+			if(rw) return 0;
+			return defret;
+		};
+		memcpy(pl->next->id,handle+rw,strsize);
+		pl->next->id[strsize]=0;	
+		if(idf==0) {
+			pl->next->index=0;
+			iddb=&pl->next->index;
+			iddb2=&pl->next->idf;
+		};
+
+		pl->next->data=defret;
+		pl->next->next=NULL;
+							
+		tmp1=strstr(tmp2,"&"); // goes to the next & (end of data)
+		tmp2+=strsize+1;       // tmp2 goes to start of data
+		if(tmp1==NULL) {
+			size=strlen(tmp2);
+		} else {
+			size=tmp1-tmp2;
+		};
+		if(size==0) {
+			if(rw) return 0;
+			return defret;
+		};
+		
+		pl->next->data=__ILWS_add_buffer(ClientInfo->mem,size+1);
+		if(pl->next->data==NULL) {
+			LWSERR(LE_MEMORY);
+			return defret;
+		};
+		j=0;
+		for(i=0;i<size;i++) { // hex translation here
+			switch (ch=tmp2[j]) {
+				case '+':
+					ch=' ';
+					break;
+				case '%':
+					
+					tmp1=__ILWS_malloc(3);             
+					if(tmp1==NULL) {
+						LWSERR(LE_MEMORY);
+						if(rw) return 0;
+						return defret;
+					};
+					strncpy(tmp1,&tmp2[j+1],2);
+					tmp1[2]=0;
+					
+					ch=strtol(tmp1,NULL,16);
+					j+=2;
+					size-=2;
+					
+					__ILWS_free(tmp1);
+					break;
+			};
+			pl->next->data[i]=ch;
+			j++;
+		};
+		pl->next->data[size]='\0';
+		ret=pl->next->data; // to the last
+		*iddb=*iddb+1;
+		idf++;
+		pl=pl->next;
+		//pl->next->data=ret;
+	};
+	return ret;
+}                                                        
+
+
+
+/*********************************************************************************************************/
+/*
+ * Function for MultiPart formdata
+ */
+struct _MultiPart __ILWS_MultiPart(char *handle) {
+	char *tmp1,*tmp2,*tmp3;	
+	int i;
+	char *name;
+	size_t namesize;
+	struct _MultiPart *ml=ClientInfo->MultiPartList;
+	struct _MultiPart defret={"","",0,""};
+	size_t strsize;
+	char *boundary; size_t boundarysize;
+	// IE C43o6Fn6Et74e65n6Et74-2DT54y79p70e65:3A 20m6Du75l6Ct74i69p70a61r72t74/2Ff66o6Fr72m6D-2Dd64a61t74a61
+	// NS C43o6Fn6Et74e65n6Et74-2Dt74y79p70e65:3A 20m6Du75l6Ct74i69p70a61r72t74/2Ff66o6Fr72m6D-2Dd64a61t74a61
+	tmp1=__ILWS_stristr(current_web_client->rbuf,"Content-type: multipart/form-data");	
+	if(tmp1==NULL) return defret;
+	if(ClientInfo->MultiPartList==NULL) {
+		ClientInfo->MultiPartList=__ILWS_add_buffer(ClientInfo->mem,sizeof(struct _MultiPart));
+		if(ClientInfo->MultiPartList==NULL) {
+			LWSERR(LE_MEMORY);
+			return defret;
+		};
+		ClientInfo->MultiPartList->next=NULL;
+		ClientInfo->MultiPartList->id=NULL;
+		ClientInfo->MultiPartList->data=NULL;
+		ClientInfo->MultiPartList->filename=NULL;
+		ClientInfo->MultiPartList->size=0;
+		ml=ClientInfo->MultiPartList;
+	};
+	// Check if handle exists
+	while(ml->next!=NULL) {
+		if(ml->next->id!=NULL) {
+			if(!strcmp(ml->next->id,handle)) {
+				
+				return *ml->next;
+			};
+		};
+		ml=ml->next;
+	};	
+	
+	
+	strsize=strlen(handle);
+	ml->next=__ILWS_add_buffer(ClientInfo->mem,sizeof(struct _MultiPart));
+	if(ml->next==NULL) {
+		LWSERR(LE_MEMORY);
+		return defret;
+	};
+	ml->next->id=__ILWS_add_buffer(ClientInfo->mem,strsize+1);
+	if(ml->next->id==NULL) {
+		LWSERR(LE_MEMORY);
+		return defret;
+	};
+	memcpy(ml->next->id,handle,strsize);
+	ml->next->id[strsize]=0;
+	ml->next->data="";
+	ml->next->filename="";
+	ml->next->size=0;
+	ml->next->next=NULL;
+	
+	tmp1=strstr(tmp1,"boundary=");
+	if(tmp1==NULL) return defret;
+	tmp1+=9;
+	tmp2=strstr(tmp1,"\r\n");
+	if(tmp2<tmp1 || tmp2==NULL) return defret;
+	/* boundary */
+	boundarysize=tmp2-tmp1;
+	boundary=__ILWS_add_buffer(ClientInfo->mem,boundarysize+3);
+	if(boundary==NULL) {
+		LWSERR(LE_MEMORY);
+		return defret;
+	};
+	memcpy(boundary,tmp1,boundarysize);
+	boundary[boundarysize]=0;
+	
+	
+	/* handle */	
+	namesize=boundarysize+41+strlen(handle);
+	name=__ILWS_add_buffer(ClientInfo->mem,namesize+1);
+	if(name==NULL) {
+		LWSERR(LE_MEMORY);
+		return defret;
+	};
+	snprintf(name,namesize,"%s\r\nContent-Disposition: form-data; name=",boundary);	
+	namesize=strlen(name);
+	
+	tmp1=strstr(tmp1,"\r\n\r\n"); // go to data
+	if(tmp1==NULL) return defret;
+	
+	do {
+		i=memcmp(tmp1,name,namesize);	
+		if(i==0) {
+			tmp1+=namesize;
+			if(tmp1[0]=='\"')tmp1+=1;
+			if(strncmp(tmp1,handle,strlen(handle))){
+				i=1;
+			}else {
+				if((tmp1[strsize]!=' ') && (tmp1[strsize]!='\"') && (tmp1[strsize]!='\r') && (tmp1[strsize]!=';') ) i=1;
+			};
+
+		}else { 
+			tmp1+=1;
+		};
+	} while(i!=0 && (tmp1+namesize<current_web_client->rbuf+current_web_client->rbufsize)); // Search init of data
+	if(i!=0) return defret;
+	//tmp1+=namesize;
+	tmp2=strstr(tmp1,"filename="); // get filename
+	if(tmp2!=NULL) {
+		tmp2+=9;
+		if(tmp2[0]=='\"')tmp2+=1;
+		tmp3=strstr(tmp2,"\r\n");
+		ml->next->filename=__ILWS_add_buffer(ClientInfo->mem,(tmp3-tmp2)+1);
+		if(ml->next->filename==NULL) {
+			LWSERR(LE_MEMORY);
+			return defret;
+		};
+		memcpy(ml->next->filename,tmp2,tmp3-tmp2);
+		ml->next->filename[tmp3-tmp2]='\0';
+		if(ml->next->filename[tmp3-tmp2-1]=='\"')
+			ml->next->filename[tmp3-tmp2-1]='\0';
+		
+	};
+	tmp2=strstr(tmp1,"\r\n\r\n"); // data init
+	if(tmp2==NULL)return defret;
+	tmp2+=4;
+	tmp3=tmp2;
+	do {	
+		
+		i=memcmp(tmp3,boundary,boundarysize);  
+		if(i!=0)tmp3+=1;
+	} while(i!=0 && (tmp3+boundarysize<current_web_client->rbuf+current_web_client->rbufsize)); // End of data
+	if(i!=0) return defret;
+	tmp3-=4; // back "\r\n\r\n"
+
+	// copy data to node	
+	if(!(ml->next->data=__ILWS_add_buffer(ClientInfo->mem,(tmp3-tmp2)+1))) {
+		LWSERR(LE_MEMORY);
+		return defret;
+	};
+	memcpy(ml->next->data,tmp2,tmp3-tmp2);
+	ml->next->data[tmp3-tmp2]='\0';
+	ml->next->size=tmp3-tmp2;
+	
+	
+	
+	
+	return *ml->next;
+
+};
+
+/*********************************************************************************************************/
+/*
+ * Function for CookieData
+ */
+char *__ILWS_Cookie(char *handle) {
+	char *defret="";
+	char *tmp1,*tmp2,*ret;
+	int size;
+	int strsize;
+	struct _Cookie *cl=ClientInfo->CookieList;
+	
+	
+	tmp1=strstr(current_web_client->rbuf,"\nCookie: "); // start of cookie string
+	if(tmp1==NULL) { // no cookies
+		return defret;
+	};
+	tmp1+=8;
+	if(handle==NULL) {
+		return ClientInfo->CookieString;
+	};
+	
+	if(ClientInfo->CookieList==NULL) {
+		
+		ClientInfo->CookieList=__ILWS_add_buffer(ClientInfo->mem,sizeof(struct _Cookie));
+		if(ClientInfo->CookieList==NULL) {
+			LWSERR(LE_MEMORY);
+			return defret;
+		};
+		ClientInfo->CookieList->next=NULL;
+		ClientInfo->CookieList->data=NULL;
+		ClientInfo->CookieList->id=NULL;
+		cl=ClientInfo->CookieList;
+	}
+	// First search if exists
+	while(cl->next!=NULL) {
+		if(cl->next->id!=NULL) {
+			if(!strcmp(cl->next->id,handle)) {
+				
+				return cl->next->data;
+			};
+		};
+		cl=cl->next;	
+	};
+	
+	strsize=strlen(handle);
+	if(!(cl->next=__ILWS_add_buffer(ClientInfo->mem,sizeof(struct _Cookie)))) {
+		LWSERR(LE_MEMORY);
+		return defret;
+	};
+	if(!(cl->next->id=__ILWS_add_buffer(ClientInfo->mem,strsize+1))) {
+		LWSERR(LE_MEMORY);
+		return defret;
+	};
+	memcpy(cl->next->id,handle,strsize);
+	cl->next->id[strsize]=0;
+	cl->next->data=defret;
+	cl->next->next=NULL;
+	do {
+		tmp2=strstr(tmp1,handle);
+		if(tmp2==NULL) {
+			return defret;
+		}else if(tmp2[strsize]==';' && tmp2[-1]==' ') {
+			cl->next->data=__ILWS_add_buffer(ClientInfo->mem,6);
+			snprintf(cl->next->data,5,"True");
+			return cl->next->data;
+		};
+		tmp1=tmp2+strsize;
+	}while(tmp2[-1]!=' ' || tmp2[strsize]!='=');
+	
+	tmp1=strstr(tmp2,";"); // end of data
+	tmp2+=strsize+1;     // start of data
+	if(tmp1==NULL) {
+		size=strstr(tmp2,"\r")-tmp2;
+		
+	} else {
+		size=tmp1-tmp2;
+	};
+	if(size<1) {
+		return defret;
+	};
+	
+	ret=__ILWS_add_buffer(ClientInfo->mem,size+1);
+	if(ret==NULL) {
+		LWSERR(LE_MEMORY);
+		return defret;
+	};
+	
+	memcpy(ret,tmp2,size);
+	ret[size]='\0';
+	cl->next->data=ret;
+	return cl->next->data;	
+};
+
+
+
+/*********************************************************************************************************/
+/*
+ * get whole query string
+ */
+char *__ILWS_clientinfo_getquerystring() {
+	char *tmp1,*tmp2,*ret;
+	char *defret="";
+	size_t size;
+        tmp1=strstr(current_web_client->rbuf,"?"); 
+        tmp2=strstr(current_web_client->rbuf,"HTTP");
+        if(tmp1!=NULL && tmp1<tmp2)
+                tmp1+=1;
+        else
+                return defret;
+	size=(tmp2-tmp1)-1;
+	ret=__ILWS_add_buffer(ClientInfo->mem,size+1);
+	if(ret==NULL) {
+		LWSERR(LE_MEMORY);
+		return defret;
+	};
+	memcpy(ret,tmp1,size);
+	ret[size]=0;
+	return ret;
+};
+
+
+/*********************************************************************************************************/
+/*
+ * get whole post data
+ */ 
+char *__ILWS_clientinfo_getpostdata() {
+	char *tmp1,*ret;
+	char *defret="";
+	size_t size;
+	tmp1=strstr(current_web_client->rbuf,"\r\n\r\n"); 
+	if(tmp1!=NULL && (tmp1+4)<(char*)(current_web_client->rbuf+current_web_client->rbufsize))
+		tmp1+=4;
+	else
+		return defret;
+	size=(current_web_client->rbuf+current_web_client->rbufsize)-tmp1;
+	ret=__ILWS_add_buffer(ClientInfo->mem,size+1);
+	if(ret==NULL) {
+		LWSERR(LE_MEMORY);
+		return defret;
+	};
+	memcpy(ret,tmp1,size);
+	ret[size]='\0';
+	return ret;
+}
+
+
+/*********************************************************************************************************/
+/* 
+ * Get authorization username
+ */
+char *__ILWS_clientinfo_getauthuser() {
+	char *tmp1,*tmp2,*ret, *out=NULL;
+	char *defret="";
+	size_t size;
+	
+	tmp1=strstr(current_web_client->rbuf,"Authorization: Basic");
+	if(tmp1==NULL) {
+		
+		return defret;
+	};
+	
+	tmp1+=21;
+	tmp2=strstr(tmp1,"\r\n");
+	if(tmp2==NULL) return defret;
+	size=(int)(tmp2-tmp1);
+	
+	ret=__ILWS_malloc(size+1);
+	if(ret==NULL) {
+		LWSERR(LE_MEMORY);
+		return defret;
+	};
+	memcpy(ret,tmp1,size);
+	ret[size]=0;
+	
+	out=__ILWS_malloc(size+1);
+	if(out==NULL) {
+		LWSERR(LE_MEMORY);
+		__ILWS_free(ret);
+		return defret;
+	};
+	
+	size=__ILWS_base64decode(out,ret);
+	out[size]='\0';
+	
+	
+	__ILWS_free(ret);
+	tmp2=strstr(out,":");
+	if(tmp2==NULL) return defret;
+	
+	ret=__ILWS_add_buffer(ClientInfo->mem,(tmp2-out)+1);
+	if(ret==NULL) {
+		LWSERR(LE_MEMORY);
+		__ILWS_free(out);
+		return defret;
+	};
+	memcpy(ret,out,tmp2-out);
+	ret[tmp2-out]=0;
+	
+	__ILWS_free(out);
+	return ret;
+}
+
+
+/*********************************************************************************************************/
+/*
+ * get authorization password
+ */
+char *__ILWS_clientinfo_getauthpass() {
+	char *tmp1,*tmp2,*ret, *out=NULL;
+	char *defret="";
+	size_t size;
+	
+	tmp1=strstr(current_web_client->rbuf,"Authorization: Basic");
+	if(tmp1==NULL) {
+		
+		return defret;
+	};
+	
+	tmp1+=21;
+	tmp2=strstr(tmp1,"\r\n");
+	if(tmp2==NULL) return defret;
+	size=(int)(tmp2-tmp1);
+	
+	ret=__ILWS_malloc(size+1);
+	if(ret==NULL) {
+		LWSERR(LE_MEMORY);
+		return defret;
+	};
+	memcpy(ret,tmp1,size);
+	ret[size]=0;
+	
+	out=__ILWS_malloc(size+1);
+	if(out==NULL) {
+		LWSERR(LE_MEMORY);
+		__ILWS_free(ret);
+		return defret;
+	};
+	
+	size=__ILWS_base64decode(out,ret);
+	out[size]='\0';
+	
+	
+	__ILWS_free(ret);
+	tmp1=strstr(out,":")+1;
+	tmp2=out+strlen(out);
+	
+	ret=__ILWS_add_buffer(ClientInfo->mem,(tmp2-tmp1)+1);
+	if(ret==NULL) {
+		LWSERR(LE_MEMORY);
+		__ILWS_free(out);
+		return defret;
+	};
+	memcpy(ret,tmp1,tmp2-tmp1);
+	ret[tmp2-tmp1]=0;
+	
+	__ILWS_free(out);
+	return ret;
+}
+
+
+/*********************************************************************************************************/
+/*
+ * get method (GET POST HEAD etc)
+ */
+char *__ILWS_clientinfo_getmethod() {
+	char *tmp1,*ret;
+	char *defret="";
+	size_t size;
+	tmp1=strstr(current_web_client->rbuf," "); // first space
+	if(tmp1==NULL) {
+		return defret;
+	};
+	size=tmp1-current_web_client->rbuf;
+	ret=__ILWS_add_buffer(ClientInfo->mem,size+1);
+	if(ret==NULL) {
+		LWSERR(LE_MEMORY);
+		return defret;
+	};
+	memcpy(ret,current_web_client->rbuf,size);
+	ret[size]=0;
+	return ret;
+}
+
+
+/*********************************************************************************************************/
+/*
+ * get request name (GET /taltal HTTP/1.0) returning /taltal
+ */
+char *__ILWS_clientinfo_getreqname() {
+	char *ret;
+	char *tmp1=strstr(current_web_client->rbuf,"/"); // Must have /
+	char *tmp2=strstr(tmp1,"?");
+	char *tmp3=strstr(tmp1," HTTP");
+	char *defret="";
+	size_t i,j;
+	int ch;
+	size_t size=0;
+	if(tmp1==NULL || tmp3==NULL) return defret;
+	if(tmp2==NULL || tmp2>tmp3) {
+		tmp2=tmp3;
+	};
+	//tmp1+=1;
+	size=tmp2-tmp1;
+	if(size<1) 
+		return defret;
+	ret=__ILWS_add_buffer(ClientInfo->mem,size+1);
+	if(ret==NULL) {
+		LWSERR(LE_MEMORY);
+		return defret;
+	};
+	j=0;
+	for(i=0;i<size;i++) { // hex translation here
+		switch (ch=tmp1[j]) {
+			case '+':
+				ch=' ';
+				break;
+			case '%':
+				
+				tmp2=__ILWS_malloc(3);             
+				if(tmp2==NULL) {
+					LWSERR(LE_MEMORY);
+					return defret;
+				};
+				strncpy(tmp2,&tmp1[j+1],2);
+				tmp2[2]=0;
+				
+				ch=strtol(tmp2,NULL,16);
+				j+=2;
+				size-=2;
+				__ILWS_free(tmp2);
+				break;
+		};
+		ret[i]=ch;
+		j++;
+	};
+	//pl->next->data[size]='\0';
+	//memcpy(ret,tmp1,size);
+	ret[size]=0;
+	return ret;
+}         
+/*********************************************************************************************************/
+/*
+ *	Get config entry (new on 0.5.0)
+ */
+char *__ILWS_Conf(const char *topic,const char *key) {
+	struct web_server *server=current_web_server;
+	FILE *tmpf;
+	struct stat statf; // tested only on WIN
+	char *defret="";
+	char *dataconf;
+	char *tmp1,*tmp2,*tmp3;
+	long tmpsize=0;
+	int sizec;
+	// Config revive tested only on WIN
+	if(server->conffile!=NULL) {
+		stat(server->conffile,&statf);	
+		if(statf.st_mtime>server->conffiletime) {
+			tmpf=fopen(server->conffile,"r");
+			if(tmpf!=NULL) {
+				free(server->dataconf);
+				fseek(tmpf,SEEK_SET,SEEK_END);
+				sizec=ftell(tmpf);
+				fseek(tmpf,0,SEEK_SET);
+				server->dataconf=malloc(sizec+1);
+				fread(server->dataconf,sizec,1,tmpf);
+				server->dataconf[sizec-9]=0; // 9 is temporary
+				server->conffiletime=statf.st_mtime;
+				fclose(tmpf);
+			};
+		};
+	};
+	
+	dataconf=__ILWS_stristr(server->dataconf,topic);
+	if(dataconf==NULL) {
+		return defret;
+	};
+	dataconf+=strlen(topic);
+	
+	do {
+		tmp1=__ILWS_stristr(dataconf,key);
+		dataconf+=1;
+		if(dataconf[0]==0) { 
+			return defret;
+		};
+		if(dataconf[0]=='[' && dataconf[-1]=='\n') { 
+			return defret;
+		};
+	}while(!(tmp1!=NULL && tmp1[-1]=='\n' && tmp1[strlen(key)]=='='));
+	
+	
+	tmp1+=strlen(key)+1;
+	tmp2=__ILWS_stristr(tmp1,"\n");
+	if(tmp2==NULL) {
+		tmp2=tmp1+strlen(tmp1);
+	};
+	tmpsize=tmp2-tmp1;
+	tmp3=__ILWS_add_buffer(ClientInfo->mem,tmpsize+1);
+	memcpy(tmp3,tmp1,tmpsize);
+	tmp3[tmpsize]=0;
+	return tmp3;
+	
+		
+		
+};    

+ 118 - 0
src/clientinfo.h

@@ -0,0 +1,118 @@
+/* Copyrights 2002 Luis Figueiredo ([email protected]) All rights reserved. 
+ *
+ * See the LICENSE file
+ *
+ * The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission.  Since few users ever read sources,
+ * credits must appear in the documentation.
+ *
+ * date: Wed Oct  9 19:05:48 GMT 2002
+ *
+ *
+ * --
+ *
+ */
+
+#ifndef _CLIENTINFO_H_
+#define _CLIENTINFO_H_
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <string.h>
+
+#include "outstream.h"
+#include "client.h"
+#include "utils.h"
+#include "memory.h"
+#include "server.h"
+#include "error.h"
+
+
+ 
+/*
+ * Next's structs are redudant but it is an case of logic (spell)
+ */
+struct _Header {
+	char *id;
+	char *data;
+	struct _Header *next;
+};
+struct _Query {
+	unsigned int index;
+	unsigned int idf;
+	char *id;
+	char *data;
+	struct _Query *next;
+};
+struct _Post {
+	unsigned int index;
+	unsigned int idf;
+	char *id;
+	char *data;
+	struct _Post *next;
+};
+
+struct _MultiPart {
+	char *id;
+	char *data;
+	unsigned int size;
+	char *filename;
+	struct _MultiPart *next;
+};
+
+struct _Cookie {
+	char *id;
+	char *data;
+	struct _Cookie *next;
+};
+
+
+extern struct ClientInfo {
+	int outfd;
+	char *inetname;
+	char *request;
+	char *method;
+	char *user;
+	char *pass;
+	
+	char *(*Header)(char *);
+	char *(*Query)(char *);
+	char *(*Post)(char *);
+	char *(*Cookie)(char *); // TODO
+	char *(*Conf)(const char *,const char *); // new on 0.5.0
+	struct _MultiPart (*MultiPart)(char *); 
+	// not necessary for web_server.h
+	char *QueryString;
+	char *CookieString;
+	char *PostData;
+	struct memrequest *mem;
+	struct _Header *HeaderList; // Not necessary for web_server.h
+	struct _Query *QueryList; // Not necessary for web_server.h
+	struct _Post *PostList; // Not necessary for web_server.h
+	struct _MultiPart *MultiPartList; // Not necessary for web_server.h
+	struct _Cookie *CookieList; // Not necessary for web_server.h
+} *ClientInfo;      //tochange
+
+
+void __ILWS_init_clientinfo();
+void __ILWS_free_clientinfo();
+char *__ILWS_clientinfo_getauthuser();
+char *__ILWS_clientinfo_getauthpass();
+char *__ILWS_clientinfo_getquerystring();
+char *__ILWS_clientinfo_getpostdata();
+char *__ILWS_clientinfo_getcookiestring();
+char *__ILWS_clientinfo_getmethod();
+char *__ILWS_clientinfo_getreqname();
+char *__ILWS_Header(char *);
+char *__ILWS_Query(char *);
+char *__ILWS_Post(char *);
+struct _MultiPart __ILWS_MultiPart(char *);
+char *__ILWS_Cookie(char *);
+char *__ILWS_Conf(const char *,const char *);
+
+#endif
+

+ 133 - 0
src/config.h

@@ -0,0 +1,133 @@
+/* include/config.h.  Generated from config.h.in by configure.  */
+/* include/config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define to 1 if you have the <arpa/inet.h> header file. */
+#define HAVE_ARPA_INET_H 1
+
+/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
+/* #undef HAVE_DOPRNT */
+
+/* Define to 1 if you have the <fcntl.h> header file. */
+#define HAVE_FCNTL_H 1
+
+/* Define to 1 if you have the `inet_ntoa' function. */
+#define HAVE_INET_NTOA 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the <limits.h> header file. */
+#define HAVE_LIMITS_H 1
+
+/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
+   to 0 otherwise. */
+#define HAVE_MALLOC 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the `memset' function. */
+#define HAVE_MEMSET 1
+
+/* Define to 1 if you have the <netinet/in.h> header file. */
+#define HAVE_NETINET_IN_H 1
+
+/* Define to 1 if your system has a GNU libc compatible `realloc' function,
+   and to 0 otherwise. */
+#define HAVE_REALLOC 1
+
+/* Define to 1 if you have the `select' function. */
+#define HAVE_SELECT 1
+
+/* Define to 1 if you have the `socket' function. */
+#define HAVE_SOCKET 1
+
+/* Define to 1 if you have the <stddef.h> header file. */
+#define HAVE_STDDEF_H 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the `strchr' function. */
+#define HAVE_STRCHR 1
+
+/* Define to 1 if you have the `strerror' function. */
+#define HAVE_STRERROR 1
+
+/* Define to 1 if you have the `strftime' function. */
+#define HAVE_STRFTIME 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the `strncasecmp' function. */
+#define HAVE_STRNCASECMP 1
+
+/* Define to 1 if you have the `strstr' function. */
+#define HAVE_STRSTR 1
+
+/* Define to 1 if you have the `strtol' function. */
+#define HAVE_STRTOL 1
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#define HAVE_SYS_SOCKET_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the `vprintf' function. */
+#define HAVE_VPRINTF 1
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "[email protected]"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "libwebserver"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "libwebserver 0.5.3-GNUnet"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "libwebserver"
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "0.5.3-GNUnet"
+
+/* Define as the return type of signal handlers (`int' or `void'). */
+#define RETSIGTYPE void
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#define TIME_WITH_SYS_TIME 1
+
+/* Define to 1 if your <sys/time.h> declares `struct tm'. */
+/* #undef TM_IN_SYS_TIME */
+
+/* Define to empty if `const' does not conform to ANSI C. */
+/* #undef const */
+
+/* Define to rpl_malloc if the replacement function should be used. */
+/* #undef malloc */
+
+/* Define to rpl_realloc if the replacement function should be used. */
+/* #undef realloc */
+
+/* Define to `unsigned int' if <sys/types.h> does not define. */
+/* #undef size_t */

+ 29 - 0
src/debug.h

@@ -0,0 +1,29 @@
+/* Copyrights 2002 Luis Figueiredo ([email protected]) All rights reserved. 
+ *
+ * See the LICENSE file
+ *
+ * The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission.  Since few users ever read sources,
+ * credits must appear in the documentation.
+ *
+ * date: Sat Mar 30 14:16:05 GMT 2002
+ *
+ * 	DEBUG macros
+ *
+ */
+
+#ifndef _DEBUG_H_
+#define _DEBUG_H_
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif         
+
+#ifdef DEBUG
+	#define IFDEBUG(x) x
+#else
+	#define IFDEBUG(x)
+#endif
+
+
+#endif

+ 34 - 0
src/error.c

@@ -0,0 +1,34 @@
+/* Copyrights 2002 Luis Figueiredo ([email protected]) All rights reserved. 
+ *
+ * See the LICENSE file
+ *
+ * The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission.  Since few users ever read sources,
+ * credits must appear in the documentation.
+ *
+ * date: Wed Oct  9 19:56:22 GMT 2002
+ *
+ * -- Error functions
+ *
+ */
+
+
+#include "error.h"
+
+
+const char *libws_error_table[]={
+	"Memory error",
+	"Filesystem error",
+	"Network error"
+};
+
+
+void libws_error(unsigned int code, const char *fmt, ...) {
+	va_list args;
+	
+	va_start(args,fmt);
+	fprintf(stderr,"%s: ",libws_error_table[code]); 
+	vfprintf(stderr,fmt,args);
+	va_end(args);
+	fflush(stderr);
+};

+ 33 - 0
src/error.h

@@ -0,0 +1,33 @@
+/* Copyrights 2002 Luis Figueiredo ([email protected]) All rights reserved. 
+ *
+ * See the LICENSE file
+ *
+ * The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission.  Since few users ever read sources,
+ * credits must appear in the documentation.
+ *
+ * date: Tue 9 Sep 06:45:13 2003 GMT
+ *
+ * 	libwebserver error codes
+ *
+ */
+
+
+#ifndef _ERROR_H_
+#define _ERROR_H_
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+
+#define LE_MEMORY  0   // memory error
+#define LE_FILESYS 1   // file error 
+#define LE_NET     2   // net error
+
+#define LWSERR(x) libws_error(x,"file: %s - line: %d\n",__FILE__, __LINE__);
+
+void libws_error(unsigned int, const char *,...);
+
+
+#endif

+ 195 - 0
src/fnmatch.c

@@ -0,0 +1,195 @@
+/*
+ * Luis Figueiredo - why remake the wheel, this functions feets perfectly
+ * and the credits still here :)
+ */
+
+/*
+ * Copyright (c) 1989, 1993, 1994
+ *      The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Guido van Rossum.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed by the University of
+ *      California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)fnmatch.c	8.2 (Berkeley) 4/16/94";
+#endif /* LIBC_SCCS and not lint */
+
+/*
+ * Function fnmatch() as specified in POSIX 1003.2-1992, section B.6.
+ * Compares a filename or pathname to a pattern.
+ */
+
+#include "fnmatch.h"
+#include <string.h>
+
+#define	EOS	'\0'
+
+static const char *rangematch(const char *, int, int);
+
+int fnmatch(const char *pattern, const char *string, int flags) {
+    const char *stringstart;
+    char c, test;
+
+    for (stringstart = string;;) {
+	switch (c = *pattern++) {
+	case EOS:
+	    return (*string == EOS ? 0 : FNM_NOMATCH);
+	case '?':
+	    if (*string == EOS) {
+		return (FNM_NOMATCH);
+	    }
+	    if (*string == '/' && (flags & FNM_PATHNAME)) {
+		return (FNM_NOMATCH);
+	    }
+	    if (*string == '.' && (flags & FNM_PERIOD) &&
+		(string == stringstart ||
+		 ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) {
+		return (FNM_NOMATCH);
+	    }
+	    ++string;
+	    break;
+	case '*':
+	    c = *pattern;
+	    /* Collapse multiple stars. */
+	    while (c == '*') {
+		c = *++pattern;
+	    }
+
+	    if (*string == '.' && (flags & FNM_PERIOD) &&
+		(string == stringstart ||
+		 ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) {
+		return (FNM_NOMATCH);
+	    }
+
+	    /* Optimize for pattern with * at end or before /. */
+	    if (c == EOS) {
+		if (flags & FNM_PATHNAME) {
+		    return (strchr(string, '/') == NULL ? 0 : FNM_NOMATCH);
+		}
+		else {
+		    return (0);
+		}
+	    }
+	    else if (c == '/' && flags & FNM_PATHNAME) {
+	        if ((string = strchr(string, '/')) == NULL) {
+		    return (FNM_NOMATCH);
+		}
+		break;
+	    }
+
+	    /* General case, use recursion. */
+	    while ((test = *string) != EOS) {
+	        if (!fnmatch(pattern, string, flags & ~FNM_PERIOD)) {
+		    return (0);
+		}
+		if (test == '/' && flags & FNM_PATHNAME) {
+		    break;
+		}
+		++string;
+	    }
+	    return (FNM_NOMATCH);
+	case '[':
+	    if (*string == EOS) {
+		return (FNM_NOMATCH);
+	    }
+	    if (*string == '/' && flags & FNM_PATHNAME) {
+		return (FNM_NOMATCH);
+	    }
+	    if (*string == '.' && (flags & FNM_PERIOD) &&
+		(string == stringstart ||
+		 ((flags & FNM_PATHNAME) && *(string - 1) == '/'))) {
+	        return (FNM_NOMATCH);
+	    }
+	    if ((pattern = rangematch(pattern, *string, flags)) == NULL) {
+		return (FNM_NOMATCH);
+	    }
+	    ++string;
+	    break;
+	case '\\':
+	    if (!(flags & FNM_NOESCAPE)) {
+		if ((c = *pattern++) == EOS) {
+		    c = '\\';
+		    --pattern;
+		}
+	    }
+	    /* FALLTHROUGH */
+	default:
+	    if (c != *string) {
+	        return (FNM_NOMATCH);
+	    }
+	    string++;
+	    break;
+	}
+    /* NOTREACHED */
+    }
+}
+
+static const char *rangematch(const char *pattern, int test, int flags) {
+    int negate, ok;
+    char c, c2;
+
+    /*
+     * A bracket expression starting with an unquoted circumflex
+     * character produces unspecified results (IEEE 1003.2-1992,
+     * 3.13.2).  This implementation treats it like '!', for
+     * consistency with the regular expression syntax.
+     * J.T. Conklin ([email protected])
+     */
+    if ((negate = (*pattern == '!' || *pattern == '^'))) {
+	++pattern;
+    }
+
+    for (ok = 0; (c = *pattern++) != ']';) {
+        if (c == '\\' && !(flags & FNM_NOESCAPE)) {
+	    c = *pattern++;
+	}
+	if (c == EOS) {
+	    return (NULL);
+	}
+	if (*pattern == '-' && (c2 = *(pattern + 1)) != EOS && c2 != ']') {
+	    pattern += 2;
+	    if (c2 == '\\' && !(flags & FNM_NOESCAPE)) {
+		c2 = *pattern++;
+	    }
+	    if (c2 == EOS) {
+		return (NULL);
+	    }
+	    if ((c <= test && test <= c2)) {
+		ok = 1;
+	    }
+	}
+	else if ((c == test)) {
+	    ok = 1;
+	}
+    }
+    return (ok == negate ? NULL : pattern);
+}

+ 59 - 0
src/fnmatch.h

@@ -0,0 +1,59 @@
+/*-
+ * Copyright (c) 1992, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the University of
+ *	California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *	@(#)fnmatch.h	8.1 (Berkeley) 6/2/93
+ */
+
+/* This file has been modified by the Apache Group. */
+
+#ifndef	_FNMATCH_H_
+#define	_FNMATCH_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define	FNM_NOMATCH	1	/* Match failed. */
+
+#define	FNM_NOESCAPE	0x01	/* Disable backslash escaping. */
+#define	FNM_PATHNAME	0x02	/* Slash must be matched by slash. */
+#define	FNM_PERIOD	0x04	/* Period must be matched by period. */
+/* This flag is an Apache addition */
+#define FNM_CASE_BLIND  0x08    /* Compare characters case-insensitively. */
+
+int fnmatch(const char *, const char *, int);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !_FNMATCH_H_ */

+ 96 - 0
src/gethandler.c

@@ -0,0 +1,96 @@
+/* Copyrights 2002 Luis Figueiredo ([email protected]) All rights reserved. 
+ *
+ * See the LICENSE file
+ *
+ * The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission.  Since few users ever read sources,
+ * credits must appear in the documentation.
+ *
+ * date: Sat Mar 30 14:44:42 GMT 2002
+ *
+ * -- handlers functions
+ *
+ */
+
+
+
+#include "gethandler.h"
+
+
+/*********************************************************************************************************/
+/*
+ * initializate (allocate) handler list
+ */
+struct gethandler *__ILWS_init_handler_list() {
+	struct gethandler *ret;
+	
+	ret=__ILWS_malloc(sizeof(struct gethandler));
+	if(ret==NULL) {
+		LWSERR(LE_MEMORY);
+		return NULL;
+	};
+	ret->next=NULL;
+	ret->hdl.func=NULL; // or path
+	ret->flag=0;
+	ret->str=NULL;
+	return ret;
+}
+
+/*********************************************************************************************************/
+/* 
+ * add an handler to list
+ */
+int __ILWS_add_handler(struct gethandler *handler, const char *mstr, void (*func)(), char *path, int flag, int type) {
+	struct gethandler *temp=handler;
+	while(temp->next!=NULL)temp=temp->next;
+	
+	temp->next=__ILWS_malloc(sizeof(struct gethandler));
+	if(temp->next==NULL) {
+		LWSERR(LE_MEMORY);
+		return 0;
+	};
+	
+	temp->next->str=__ILWS_malloc(strlen(mstr)+1);
+	if(temp->next->str==NULL) {
+		__ILWS_free(temp->next); // free last malloced
+		LWSERR(LE_MEMORY);
+		return 0;
+	};
+	memcpy(temp->next->str,mstr,strlen(mstr));
+	temp->next->str[strlen(mstr)]='\0';
+	
+	temp->next->type=type;
+	switch (temp->next->type) {
+		case 0:
+			temp->next->hdl.func=func;         // for function
+			break;
+		case 1: // new on 0.5.2            // directory or cgi
+		case 2:
+			if(!(temp->next->hdl.path=strdup(path))) {
+				__ILWS_free(temp->next->str);
+				__ILWS_free(temp->next);
+				LWSERR(LE_MEMORY);
+				return 0;
+			};
+			
+			break;
+	};
+	
+	temp->next->flag=flag;
+    temp->next->next=NULL;
+    return 1;
+}                         
+
+/*********************************************************************************************************/
+/* 
+ * Deletes the entire handler list
+ */
+void __ILWS_delete_handler_list(struct gethandler *handler) {
+	struct gethandler *next;
+	
+	while(handler) {
+		next = handler->next;
+		__ILWS_free(handler);
+		handler = next;
+	}
+}

+ 60 - 0
src/gethandler.h

@@ -0,0 +1,60 @@
+/* Copyrights 2002 Luis Figueiredo ([email protected]) All rights reserved. 
+ *
+ * See the LICENSE file
+ *
+ * The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission.  Since few users ever read sources,
+ * credits must appear in the documentation.
+ *
+ * date: Sat Mar 30 14:44:42 GMT 2002
+ *
+ *
+ * --
+ *
+ */
+
+
+#ifndef _GETHANDLER_H_
+#define _GETHANDLER_H_
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif         
+#include <stdio.h>
+
+
+#include "memory.h"
+#include "error.h"
+
+
+#define MATCHMAX 200
+
+//#define WS_LOCAL 0x1
+#define WS_DYNVAR 0x8
+#define WS_USELEN 0x10
+
+
+/*********************
+ * get handler types *
+ *********************/
+#define GH_FUNCTION 0   // new on 0.5.2
+#define GH_DIRECTORY 1  // new on 0.5.2
+#define GH_CGI 2        // new on 0.5.2 (just the flag)
+
+
+struct gethandler {
+	char *str;
+	int type;           // new on 0.5.2  types
+	union hdl_u{        // changed on 0.5.3 named union (Hilobok Andrew ([email protected]) said that wasn't compiling on FreeBSD)
+		void (*func)();   // it is a function
+		char *path;       // it is a path (dir or cgi)
+	}hdl;
+	int flag; 
+	struct gethandler *next;
+};      
+
+struct gethandler *__ILWS_init_handler_list();
+int __ILWS_add_handler(struct gethandler *,const char *,void (*func)(),char *, int,int);
+void __ILWS_delete_handler_list(struct gethandler *);
+
+#endif

+ 396 - 0
src/logo.h

@@ -0,0 +1,396 @@
+/*
+ * by data2header by Luis Figueiredo ([email protected])
+ */
+#ifndef __LOGO_H_
+#define __LOGO_H_
+
+char _logo[]="\x47\x49\x46\x38\x39\x61\x5\x1\x45\x0\xE7\x0\x0\x2\x2\x2\xFE\xFE\xFD\xF0\xF2\xF5\xE8\xED\xF0"
+"\xDC\xE8\xEE\xBD\xC1\xC6\x68\x71\x7C\x60\x16\x7\x7A\x1C\xA\xA9\xC8\xDD\x9E\xC3\xDA\x94\xBD\xD8\x8C\xBB"
+"\xD6\x86\xB6\xD6\x15\x26\x3F\x1B\x2C\x49\x1F\x32\x4D\x24\x38\x54\x30\x4A\x66\x4E\x5C\x68\x6E\x7E\x85\xAB"
+"\xAE\xB2\xF6\xF6\xF7\xD6\xE1\xE8\xC8\xDA\xE6\xC5\xC7\xC0\xB0\xBC\xC6\x97\xAA\xB5\x8E\x96\x9B\x5F\x60\x62"
+"\x39\x45\x48\x1F\x26\x23\x7\xA\xD\x4A\x10\x6\x34\xB\x3\x3D\xE\x6\x70\x1C\xB\x9F\x24\xE\xE7\x5C"
+"\x45\x3B\x5C\x78\xD3\xD4\xD4\x7C\x89\x90\xF\x12\x10\x54\x13\x6\xCA\x36\x1C\xB0\xD1\xE5\x5D\x94\xB3\x3D"
+"\x62\x7F\x1F\x22\x19\xD6\x4C\x35\x70\xB0\xD0\xA\x22\x43\x2C\x44\x60\x2E\x2F\x1F\xE9\x69\x4F\xBB\xD4\xE6"
+"\x80\xCA\xEB\x7D\xC6\xE8\x79\xC0\xE1\x73\xB8\xDA\x69\xAA\xCA\x66\xA4\xC6\x58\x9B\xC4\x4D\x8D\xB5\x51\x82"
+"\xA1\x4A\x76\x94\x33\x4E\x68\x28\x3E\x5A\x4D\x4D\x4F\x78\x80\x87\x3D\x3E\x3D\xF\x16\x1B\x8C\x20\xC\xFC"
+"\x7F\x64\x83\xD0\xF1\x41\x68\x85\x2A\x38\x3E\x3F\x45\x2F\x13\x1A\x23\x35\x54\x71\x62\x9C\xBD\x12\x1E\x2B"
+"\x49\x72\x8F\x4E\x7C\x9B\xD0\x41\x27\x58\x88\xA6\x28\x68\x93\x38\x53\x5E\x17\x22\x26\xDA\x56\x3B\x5B\x8E"
+"\xAB\xF6\x72\x5C\x6F\x6F\x42\xFC\xFC\xD1\xFD\xFE\xC6\x66\x4A\xC\x99\xEE\xFE\x45\x6E\x8C\xE0\xE1\x8C\xEE"
+"\xE9\x8B\x21\x6\x2\xA3\xFC\xFE\xC8\xFE\xFD\xFD\xFE\xDF\xFA\xFB\xB8\xFD\xFC\xA4\x86\xA6\x7A\xB0\xA8\x2E"
+"\xF4\xF0\x88\x9A\xA4\x72\x58\x3B\x1E\x18\x16\x2\xB3\xB0\x5D\xD0\xCF\x64\xFD\xFD\x71\xFE\xFD\x89\xFE\xFC"
+"\x5C\xFE\xFD\x49\xFE\xFD\x20\x70\x6B\x15\x3C\x39\x13\x89\x81\x1E\x4B\x4A\x2B\xB9\x2B\x10\xBC\xC0\x7E\x28"
+"\x26\xB\x9C\x98\x40\xF2\xEC\x69\xC7\xB8\x3E\x90\x8C\x3F\x7B\x7B\x32\x31\x2F\xB\x1A\x6\x2\x1C\x1A\x7"
+"\x7D\x98\x9F\xEC\xE2\x6A\x1F\x2E\x35\x90\xDD\xF9\x46\x56\x60\x88\xDF\xFE\x61\x5A\x13\x7C\x7E\x3E\x50\x49"
+"\xF\xFE\xFB\x32\xCC\xC5\x49\x7E\x71\x2E\xBC\xB5\x2C\x9A\x91\x17\xD2\xC5\x21\x97\xA8\x84\xFD\xEE\x1D\x6E"
+"\x7E\x4A\xDF\xD6\x3D\xF3\xE7\x41\x71\x6E\x2C\xB4\xD4\xAE\xFE\xD0\x5E\x82\x5C\x28\x20\x1E\x5\x51\x54\x2A"
+"\xD0\x98\x34\xFB\xF0\x4B\xD5\xA7\x2F\xFA\xC6\x5E\xB9\x9A\x1F\xFE\xBD\x3F\xFE\xD9\x37\x92\x91\x78\xF6\xAA"
+"\x3D\x8E\x5A\x1D\x38\x82\xB0\x5A\x6B\x69\xB5\x5E\x23\x42\x26\x1A\x51\x55\x44\xCE\xB7\x21\x25\x22\x7\xE5"
+"\xD9\x18\x7C\x32\x19\xAA\x5B\x2A\x8A\x38\x1C\x9E\x4A\x20\xA8\x3E\x26\xB6\x72\x26\xDC\x91\x26\xAE\x5A\x22"
+"\xCE\xC3\x67\xB7\x80\x28\x98\x6E\x22\x68\x30\x17\x56\x2A\xE\x4E\x26\xE\x96\x56\x1C\xAE\x70\x20\x2B\xB"
+"\x3\x36\x39\x2B\x16\x22\x3D\x17\x22\x2A\x9\xE\x11\x7E\xB0\xCF\x7A\xAF\xD1\x71\xA9\xCA\x31\x7B\xAB\x2E"
+"\x75\xA6\x1A\x48\x68\xD\x2E\x47\x42\x89\xB6\x84\xAF\xCA\x80\xB7\xD6\x73\x98\xB0\x4E\x98\xC5\x86\xA7\xAE"
+"\x63\x7E\x8C\x50\x6A\x7B\x65\x86\x7E\x75\x8B\x9A\xAA\xAA\x78\xCD\xD3\xC8\x5D\xB0\xE4\x8A\xA2\x66\xFE\xFE"
+"\xE6\xD9\xFE\xEF\xEA\xEA\xA8\xD8\xE2\xA4\x8A\xAA\x62\xD5\xD4\x87\x82\x80\x50\xCC\xC5\x84\x6C\x6F\x5E\xDC"
+"\xDB\x9F\x5B\x5B\x34\x28\x74\xA4\x23\x6E\xA0\x1B\x68\x9B\x19\x60\x8F\xF\x5F\x94\x1B\x54\x79\x22\x5F\x87"
+"\x9C\xD4\xF3\xC2\xE8\xF4\xC4\xF6\xFE\xA8\xE2\xFE\xA8\xE6\xF8\x54\xA8\xDD\xE2\xFC\xFE\x5E\x5E\x4B\xDE\xDD"
+"\xB6\xB8\xBF\xA8\xBB\xBF\x95\xFE\x42\x1E\xD9\xDA\xC0\x13\x39\x53\x34\x8C\xC5\xFE\xAE\x9A\xFF\xFF\xFF\xFF"
+"\xFF\xFF\x21\xFE\x12\x62\x79\x20\x4C\x75\x69\x73\x20\x46\x69\x67\x75\x65\x69\x72\x65\x64\x6F\x0\x21\xF9"
+"\x4\x1\xA\x0\xFF\x0\x2C\x0\x0\x0\x0\x5\x1\x45\x0\x0\x8\xFE\x0\xFF\x9\x1C\xF8\xF\x0\x80"
+"\x0\x6\x1\x8\x48\x38\x20\x21\x81\x84\x5\x12\x1A\x48\x78\x20\x21\x82\x84\x9\x12\x2A\xD0\x98\x70\x41"
+"\x42\x6\x9\x1B\x24\x3C\x96\x10\x59\x42\x19\x9\x93\x25\xEC\xB1\x32\xA1\x8B\x84\x53\x12\x3E\x49\x58\x2C"
+"\x61\x88\x84\x24\x12\xDA\x48\xA8\x8C\xA7\x4F\x83\x3D\xD\x2E\x4B\x38\x54\x28\xD1\x84\xE7\x90\x2A\x35\x98"
+"\xD4\x20\xBA\x84\x4F\x9D\x26\x4C\x37\x35\xA1\xBA\x84\xCC\x12\xEE\x4B\x38\x23\xA1\x57\x11\x38\x75\x26\x5C"
+"\x37\xB6\xAC\x41\xB2\x67\xCD\x2\x40\xBB\x36\x21\xC1\xB7\x70\x5\x3A\x78\x0\x21\x82\x84\x9\x14\x2A\x4"
+"\xB0\x20\xA0\xEF\x80\xBF\x4\x8\x5C\xC0\x90\x41\xC3\x6\xE\x14\x3A\x78\xF8\x0\x22\x84\x88\x11\x24\x4A"
+"\x98\x30\x91\xA0\xB2\x82\x4\xA\x32\x6B\x5E\xA0\x60\x81\xE7\x5\xC\x42\x33\x68\x40\x9A\xC1\xB1\xD3\xA7"
+"\x91\x21\x3B\x86\x2C\x99\xEB\xD7\xC9\x7A\xC8\x9E\xD\x5\x8A\xF\x17\x3F\x7E\x4C\x59\xB6\xE4\xC5\x13\x66"
+"\x11\x9A\x45\x1\x71\x60\xC5\x88\xC7\x2B\x10\xEC\x89\x91\x24\x8B\xB2\xE7\xD0\xA3\x3F\x5F\xA6\x6C\x99\x75"
+"\xEA\xD7\xAB\x5F\xB7\x7E\x6E\xD9\xB9\xEF\xE0\xC1\xFE\xA3\x3B\x37\x1E\x9D\xF9\xF3\xE4\xCF\xAB\x4F\x87\x8E"
+"\x7D\xBA\xF7\xEF\xD5\xC9\x5F\xC7\xAE\x3E\xB3\xFB\xFB\xF6\x35\x6B\x36\x63\xC6\x11\x63\x6\xAD\x10\xC2\x71"
+"\x8F\x85\x40\x2\x12\x7B\x50\x61\xC3\x16\x59\xB0\xB0\xCE\x83\x10\x46\x28\xE1\x84\x12\xB2\x33\x61\x5C\x70"
+"\x19\x74\x42\x42\xE\x24\xE4\x41\x42\x8\x19\xB4\x90\x41\x28\x24\x94\x42\x42\x2A\x24\xB4\x42\x42\x2C\x24"
+"\xD4\x2\x47\x6\x6D\x64\x90\x47\x33\x76\x14\xD2\x48\x25\xE5\x68\x90\x4A\x6\xB1\x64\x90\x16\x9\x2D\x91"
+"\x10\x4\x2A\xDA\x94\x90\x9\x9\xA9\xF2\x13\x0\x41\x31\xB9\x64\x93\x45\x1\x10\x65\x53\x0\x50\x69\xE5"
+"\x52\x0\x44\x55\x25\x96\x54\x19\xD4\x8E\x5A\x59\x19\xD4\x4C\x42\x0\x1A\x74\x93\x99\x9\xED\x91\x50\x16"
+"\x56\xA9\xC5\xD6\x9B\x6E\xAA\x85\xA1\x40\x2E\x25\xF4\x2\x87\x9\x49\x90\x90\x5\x9\x5D\x90\x10\x7\x9"
+"\xC1\x60\xA4\x41\x31\xB8\x68\xA8\x41\x19\xC5\x8\x23\x0\x34\x2\x0\x92\x41\x22\x19\x44\x92\x41\x26\xED"
+"\xD8\x92\x41\x2F\x19\x14\x44\x42\x34\x78\x95\x10\x58\x84\x26\xE4\x4C\x92\x4F\x96\xA\xD4\x51\x46\x31\x85"
+"\xE5\x95\xAA\x4A\xE5\x6A\x96\xFE\x55\x19\xC4\xE\x56\x9\x8D\x69\xD0\x11\x45\x1A\x4\x2A\x0\x48\x24\xB4"
+"\x45\xAC\x0\x5C\x95\xD6\xB0\x6D\x11\xB\xE7\x59\x73\x9E\x54\xA7\x41\x77\x1A\xD4\x95\x41\x9D\x1A\xD4\x90"
+"\x41\x15\x24\x54\xC3\xA7\x62\x19\x74\xC3\xA1\x0\x24\xDA\xED\xA2\x8D\x36\xFA\x28\x0\x91\x2\x30\x29\x0"
+"\x95\x2\xC0\x23\x0\x50\xC0\x94\x67\x42\x20\x60\x6B\x90\x9A\x6\xFD\x20\x2A\xA9\xA7\xE6\xEB\xA4\xBE\x51"
+"\xF6\xBB\xEA\xBF\xAF\x6A\xA9\x65\x97\xC1\xD2\x6A\xD0\x56\xCE\x52\x24\x2F\x0\x39\x19\xB4\x93\xB1\x71\x42"
+"\x2C\xF1\x5A\x18\xE2\x90\xC3\xC5\x3A\xE8\xB0\xC3\xE\x32\xF0\xD0\xC3\x6D\x3F\x0\x11\xC4\xB\x42\xF4\x37"
+"\xC3\x5C\x11\xC\x41\xC4\x4\x6\x54\xC0\x41\x11\x1D\x18\x71\xC4\x1\xC7\x85\x80\x4\xB\x49\xB0\x70\xC1"
+"\xCE\x18\xF4\x7C\xC3\xCF\x2D\x4\x9D\x40\xB\x95\x61\x86\x99\x66\x9D\x75\xF6\x19\x68\xA2\x91\xD6\x0\x3"
+"\xCF\x40\x83\x1A\x6B\xAC\xB9\x16\xD\x14\x2E\x54\x1\xC4\x14\x61\xF8\x46\x3\x13\xE\xE0\x2A\xA0\x8\x22"
+"\x18\x58\x2\xB\x5B\x98\xC0\x42\x6E\xB9\x39\xE3\xB6\xDB\xAA\x38\xA3\x8A\x2A\xD2\xD5\x4D\xDD\x74\xD6\x69"
+"\xB7\xDD\xFE\x75\xDD\x85\x27\x9E\xDF\xE9\xA5\xA7\x1E\x3A\x56\x58\xF1\x5E\x3B\xF2\xD5\xC7\xE\x7E\xFA\xF1"
+"\xE7\x1F\x80\xC5\xD\x48\xF6\x8\x2B\x1C\xB8\xDC\x82\xD\xA6\xB3\x8E\x3A\x9A\x6F\xDE\xF9\xE6\x14\x86\x7E"
+"\x21\x5C\x4A\x24\x84\x43\x42\x3A\x28\x6B\x90\xF\x41\x72\x95\x10\x13\x9\x35\xB1\xF0\xC3\x0\x3C\x64\x90"
+"\x9F\x6\x61\xC0\xED\x8B\x88\x2E\x2A\x23\xA3\x36\x42\x8A\xA3\xA5\x6\x55\x61\x27\x4D\x9\x8D\x60\xD1\x9A"
+"\x9\x49\x93\x90\xBD\x6\x8D\x6A\x90\x92\xFA\x36\x69\xFD\x92\xFE\xB6\xBA\xA5\xF6\xAC\xC2\x6A\x10\xC1\xC2"
+"\x2\x10\x26\x0\xB6\x2\x50\x26\x0\x67\xA2\x9F\x26\xF3\xDF\x3\x1B\xFE\xB1\xC5\xC6\x4F\x56\x86\xA5\x1B"
+"\x54\x3F\x0\xA7\x1B\x94\xBA\x41\x28\xAD\xDE\xBA\x41\x4E\x48\x8\xAE\xC\xA2\xBC\x50\x49\xCB\x21\x7D\x4A"
+"\x88\xEE\xC\xC2\xBB\x6F\xF5\x4E\x51\x10\x4\x9E\x41\xC6\x35\xAE\x73\x45\xE3\x7F\x0\x40\xC4\xA0\x18\x96"
+"\x2D\x0\x64\xA\x0\xD0\x3\xE1\xBD\xA2\x87\xAF\x7D\x99\xF0\x7A\xA9\x92\x12\xC0\xB6\xC7\x42\x2D\x59\xA1"
+"\x4D\x6\x19\x5F\xF9\x6\x8\x80\x15\xE9\x2A\x21\xBD\x32\xC8\xAF\xDA\x67\x90\xF0\x11\xC\x7C\xFE\x11\x2B"
+"\xD6\x5B\x0\x90\x83\x84\xDC\xEF\x7E\xF9\x3\xC0\xFE\x0\xD0\x3F\xF\xCA\x4\x5E\x1B\x6C\x91\x88\x18\x92"
+"\xC0\xDC\x25\x64\x5B\xC\xC4\x88\x16\x23\x18\xAE\x8F\x24\xE4\x19\x9\x69\x97\x41\xA4\x90\x90\x8\xE4\xAA"
+"\x86\xBE\x4A\x8\xEB\xFC\x57\xAF\xE7\x8D\x10\x0\xD4\x3B\xA1\xA9\x54\x98\xC2\x29\xAD\x90\x4A\x2F\xF4\x52"
+"\x42\x66\x75\x30\xD7\x19\xA4\x22\x37\x34\xC8\x45\x1C\x6\x2C\x82\xC1\xEF\x90\x72\x1A\x48\xC6\x32\x76\x31"
+"\x1C\x38\x12\x7\x4A\x88\xA4\x24\x1F\x99\x83\x45\x6E\x4C\x6\x3D\x80\x42\xC8\x96\x70\x2\x1A\x40\x60\x38"
+"\xE8\x7B\xCC\x1\x24\x63\x82\xBC\x58\x80\x2F\x7E\x1\x4C\x60\x4\xB3\xB3\xC1\xF4\xC\x3\x40\xBB\x81\xD0"
+"\x8A\x66\x19\xA4\x25\x6D\x69\xC\x58\xC0\xD3\x9E\xF1\x8C\x64\x4C\x23\x1A\x2E\xA0\x6\x35\xAA\x71\x2\x21"
+"\xD0\x0\x11\xC3\x39\x80\x63\x44\x89\x20\x13\x6C\x81\xA\xB3\xF1\xC1\xC7\x7C\x40\x4D\x1F\x48\x43\x1A\x3F"
+"\xC0\x26\xDB\xDE\x6\x37\xB8\xD1\xAD\x6E\xE0\xCC\xCE\xDE\xC6\x9\x38\xF2\xFC\xAD\x70\xE9\xB0\x82\x3A\xDA"
+"\xA1\xB8\xFB\x30\xA3\x71\xFD\xF9\xF\x0\x22\x47\x36\xE4\x44\xE6\x72\x5B\xFE\x88\xC1\x1E\xE0\xC3\xCF\x74"
+"\x70\x8E\x73\x9A\x8B\x8F\xE7\x20\xA4\x8E\x9\x19\x64\x20\x4A\x44\x5D\x42\x8A\x68\x3F\x23\x9A\x6E\xA1\x61"
+"\x7C\xD7\x1F\x71\x98\x90\x21\x24\x64\x3\x7B\xA2\xA2\x41\x6C\x7\x0\xDC\x1\x60\x81\x0\x68\x60\x3\xBD"
+"\xF5\xBB\xDF\x35\x6A\x1A\x9\xB1\x46\x42\x84\xE0\xA9\x40\x2\x80\xA\x97\x2\x80\x8F\xD8\xA5\xC6\xE6\xB9"
+"\x91\x84\x38\x95\x63\xF5\xB0\x87\x2A\x16\x76\x2F\x8F\x0\xE0\xA3\xF8\x6A\x45\xA6\xD\xA6\x8F\x5E\x0\x28"
+"\x14\xF\x1\xF0\xC3\x42\xBA\xCF\x53\x74\xDA\x81\x42\xF5\x7\xD1\x86\x5A\x15\x7F\x9\xE1\xC1\xF1\x26\x2A"
+"\x48\x3F\x2\xC0\x8C\x6\xC1\xA8\x41\xF8\x74\xC0\x8D\x56\xF1\xA3\xBB\xDB\x22\x0\x4A\xFA\xC5\x84\x5C\x23"
+"\x21\x8A\x40\xD1\xC2\x90\xBA\xAE\x99\xCE\x74\x8D\x0\xC0\xAB\xF3\xDA\x98\x53\xE9\xE9\xF4\xAF\x28\xA4\xA3"
+"\x4F\x13\x2\xD4\x2F\xC5\x90\xA8\xB7\x3A\xE3\xAE\x4A\x90\xC6\xA5\x36\x75\xA9\xE1\xF3\x21\x54\xB\xD2\xC4"
+"\x26\x4A\x95\xAA\x6\x61\x28\x56\xAF\x7A\x59\x0\x90\xB1\xA5\x80\xF4\xAC\x57\xC1\xA\x0\x40\x4D\xB1\xAC"
+"\xB5\x3B\x2B\x48\x47\xAA\xD6\xDF\x95\xEB\x82\x6\x99\xFE\x40\x42\x2\xE8\x52\xC6\x1A\x44\x8A\xEA\x8A\xE9"
+"\x4C\xC5\x8\x80\xBD\x8A\x90\xAF\x0\xF0\x6B\x1C\x3\x1B\xD8\xEC\x9\x96\x4A\x5A\x32\x6C\x50\xB5\xE2\xD5"
+"\xD0\xEE\x6A\x90\x0\xD8\x21\x53\x9D\xEA\x58\x18\xC6\xCF\x2D\x3D\xE0\x81\x76\x65\xC0\x5D\x19\x6C\xEC\xBB"
+"\x1A\x5B\x24\x23\x2D\xF6\x48\x25\x58\x4C\x7\x98\x74\xC1\x14\x96\x20\x4\x8\xCC\xAC\x66\x8\xC0\x19\x15"
+"\xB2\x6\x4\x29\x58\xA1\x64\xFD\x41\x19\xD\xAE\x60\x0\xE\x9C\x12\x95\x7F\x51\x25\x2B\x79\xF6\xCA\x9F"
+"\x1\x8D\x68\xB4\xB4\xCC\x2\x34\x0\xB5\x69\x18\x22\x1A\xD6\x18\xE6\x4\x3C\xC0\x4\x44\xA4\xC8\x38\x5"
+"\x42\x40\x9\x98\x93\x5\xD5\xB4\x6\x36\x3D\x88\xCD\x6C\x68\x53\x9B\x6A\xDE\xE6\x9A\xDA\xDC\x26\x37\xBD"
+"\xF9\x4D\x70\x56\x7\x3A\x77\x13\xE7\x76\xBE\xB3\xC\xC2\x11\xAE\x1D\x38\xB6\xF\x7E\xF6\x13\x4F\xC8\x85"
+"\x60\x99\x65\x4B\x4E\x9\xF0\xA9\xCF\x7E\x1A\xF9\xC8\xEF\x59\x87\x3F\xE3\xE3\x95\x82\xCC\x54\xAB\xFC\x4B"
+"\x48\x67\x97\xB8\x44\xCD\x2E\xD1\x78\x6\xC1\xC2\x6\xD9\x64\x10\xDE\x6E\x2A\x61\x6\x21\x6D\xA\xE2\xA5"
+"\x90\x84\x8C\x28\xB5\xB7\x53\xE0\xFE\x15\x5B\x9B\x10\x94\x1A\x84\x1A\xAF\xDB\x60\x68\xA5\x7B\xAE\x74\xD5"
+"\x55\xB7\x35\x35\x88\x6F\x43\xE8\x57\xBF\x12\x77\x8E\xC6\x4D\xAE\xC1\xC8\x57\x54\x34\x19\x1A\x0\x48\x55"
+"\xAA\xF7\xA6\x5B\xDD\x46\x37\x59\xA6\x31\x85\x32\x13\xA5\x3C\xD5\x84\x62\x16\x0\x40\x32\x88\x45\x9\xD8"
+"\x58\x22\x56\xFA\xCB\x0\x78\xD6\x57\x4D\x64\x66\x8D\xA2\xB9\xA3\x6A\xD6\x96\x5A\xC5\xA\x0\xA\x24\xE4"
+"\xA\xA\xB\x50\xA7\xA1\x31\x3C\x74\xA5\x4\xCF\x3D\xCA\x73\x6F\x6F\x1A\xDC\x37\xFE\x79\xA7\x29\x14\xF4"
+"\x61\xC5\x24\x40\xC5\x26\xC4\xB6\xD1\x5\xD6\xC0\xA8\xCB\xE8\x47\x7F\x90\xB7\x4F\x56\x1D\x0\x3A\x4B\xED"
+"\x84\x64\x1A\x0\x12\xE0\x42\x17\xBC\xF0\x85\x4E\x83\x21\x21\xDF\xCE\xB5\x41\x62\x2\x66\x0\x10\xC9\x20"
+"\x45\x28\x35\x6A\x39\xEA\xD1\xD5\x6\xF\x0\x6F\x35\x48\x35\x62\xD\x80\x2\x2\x80\xCB\xE4\xAA\xB5\x9D"
+"\x6F\x2D\x6E\x48\x77\x59\xD7\x21\xE4\x73\x9\x7F\x6D\x42\x3B\x1A\x4\xA8\x42\x45\x58\xA8\xE9\xFD\xDC\x4E"
+"\x2F\xDB\xD1\x8F\xF5\x94\x16\x5C\x40\x71\x17\x60\xAD\x36\x50\xE8\xC1\xE\x1A\xE9\x48\x49\x46\x12\xBD\xDE"
+"\xFD\x2E\x77\xFE\x33\xE9\x2\x20\x74\x4D\x8\x62\xF0\xC2\x18\xB8\x40\x86\x15\x90\x32\x92\x65\x30\xC3\x19"
+"\xBC\x80\x86\x34\xA8\x1\xA\xDC\xF5\x58\xF\x28\xBE\xB5\x30\xFC\xC6\x64\xCD\x88\x80\x5D\x26\x50\x84\xA"
+"\xFC\x37\x95\x3\x58\xE5\x80\x5D\x9\x4B\xA2\x69\x60\x1\x1B\x70\xF0\x35\xAE\x81\x8D\x33\x58\xDD\xB\x83"
+"\xF8\x31\xD9\x42\x30\x4A\x16\xD8\xC0\x6\x2C\x0\xCD\xD3\x46\xD3\x80\x63\x48\xD\x35\x1E\xFE\xB0\x6B\x42"
+"\x3C\x62\xD9\x64\xBC\xC4\xD4\x84\x2\x8A\x53\xDC\xB6\x1F\xAC\x78\x6E\xCA\x68\xB1\x8B\xF1\x66\x1D\xF3\x14"
+"\xE\xC7\xEC\x74\x67\x7E\x1C\x27\x4F\x65\x2\x99\xEB\x1A\xDE\x43\x16\xB6\x60\x83\x18\xA8\x87\x3C\xEC\x39"
+"\x7\x7C\xDA\xE3\x1E\x23\xB7\x14\xCB\x4E\xFC\xF7\x55\x8F\x28\xED\x26\x7E\x50\x8\x6B\x60\x43\x1B\xDC\x90"
+"\x10\x98\xDA\xEF\xD\x70\x10\x43\x1A\xE2\xF0\x81\x49\x1B\xA4\xB3\x33\x25\xF7\xC2\xC3\x9C\x10\x57\x9F\x16"
+"\x0\xD3\x3A\xB5\x47\x33\xF0\x27\x83\xA0\x5E\xF5\x71\xB8\x96\x4B\x91\x2A\x2E\x2F\x4A\xAA\xD6\xE7\x5A\x97"
+"\xA4\x77\xAB\xEB\x3D\xBF\xD1\xCF\x80\x86\x4A\x42\x94\x2B\x43\x28\x1E\xFA\xA8\x9\x51\xB4\xC0\xA4\xFE\xFF"
+"\x2A\x82\x79\xA\xF3\xD7\xCE\x94\x1C\xE6\x20\x87\xF2\xD3\xA1\xE\x76\x48\xFF\x1D\xC\x22\x69\xCF\xE7\x9"
+"\xF\x79\xD0\xC3\x1B\xD6\x77\xE9\x34\xF0\xA1\xF\xD3\x7E\xE8\xEB\x63\xA\x4\xAF\x3E\xA0\xF6\x19\xB5\x6E"
+"\xA9\x6\x0\xD5\x62\x10\x44\x0\x0\x73\xC0\x7\xC2\x57\x6F\x14\x65\x10\xA6\x27\x41\x8E\x62\x7C\x0\x40"
+"\x6B\xC7\x47\x29\xFC\x6\x0\xCB\x17\x53\x7A\xC5\x6B\x7D\x36\x70\x3C\xA5\x47\xB2\xC2\x5C\x89\x25\x6B\xB5"
+"\xD5\x41\x5A\x82\x5C\xCA\xD6\x52\xE3\x96\x10\x98\x87\x65\x70\xE0\x7\x6B\xF0\x7\x74\x0\x8\x81\x90\x7"
+"\x82\x70\x7\x83\xD0\x6F\x33\xF5\x79\x9\x41\x8\xC7\x56\x69\xAB\x57\x8\xF9\x67\x10\x49\xA4\x59\xB0\xE7"
+"\x2E\xE5\xF6\x7F\x6\x31\x11\x63\x5\x22\x67\xA5\x1\x0\x38\x7\xBA\x80\x7F\x9C\xD6\x55\x6\x81\x24\x11"
+"\xE4\xE\xE0\xA2\x6F\x55\x35\x81\xB8\x46\x53\x6C\x94\x57\x36\xD5\x57\xD1\x77\x70\x7B\x34\x68\xA2\x66\x43"
+"\x0\xD0\x70\x3A\xB4\x24\xDB\xD7\x7D\x2A\x38\x5\x72\x38\x87\x40\x50\x87\x5A\x23\x5\x12\x0\x1\x42\x60"
+"\x8\x87\x20\x8\x58\x10\x5\x51\x80\x5\x88\xF0\x4\x55\x80\x71\x24\x56\x1B\xFE\x25\x27\x5\x57\x0\x1"
+"\x2A\x20\x39\x36\x23\x5F\x19\x93\x8\x89\xB0\x7A\x8A\x0\x4\x8B\x50\x6\x98\x58\x6\x60\x90\x8\x91\x84"
+"\x3\x8B\x0\x6\xA0\x8\x6\x8B\xB0\x8\x4A\xB0\x3\x1E\x83\x35\x2E\xE0\x3\x5A\xA0\xC\x2F\xC0\x1F\xE"
+"\xD0\xC\xF\x10\x1\x34\x70\x2\x45\xA0\x1\x1\x70\x8B\xB8\x18\x0\x3\x80\x1\xD9\x50\x0\x1A\xE0\x32"
+"\x1C\x90\x2\x72\x0\x9\x78\xE0\x4\x2A\x40\x2\xCA\x34\x2\x5C\x87\x20\x8B\x17\x3\x97\xA1\x0\x2D\xF0"
+"\xE\xF0\xD0\xD\xF0\x50\x8D\xF1\x10\xF\xF2\xF0\xE\xF1\xC0\x34\x64\xD7\x0\xD0\xC0\x0\xEE\x80\x8D\xD7"
+"\x98\x8\xEE\x80\x3\x1A\xF3\x61\xB3\xB1\x71\xE7\xA5\x3\x3C\x0\x5\xDA\xB0\x71\x17\xB3\x3\xDA\x80\x4D"
+"\x3E\x30\xF\xF3\xA0\xD\xF6\x38\xF\xD8\xE4\xC\xFC\x30\x77\xD7\xC4\xF\x74\x53\x63\x85\x53\x38\x37\xD6"
+"\xE\xF7\xC1\x63\x47\x10\x2F\x86\x37\x2\xCA\x78\x0\x1A\x76\x36\x36\x90\x4\x49\x60\x3\xFC\x0\x90\xDF"
+"\x61\x1E\x82\x23\x38\xE5\xA1\x25\x9\x1\x6A\xB2\xD7\x7F\x6\x21\x24\x8C\x20\x7\x82\xB0\x55\x60\x78\x92"
+"\x4D\x24\x7B\x5E\xD1\x30\x43\x88\x80\x71\x90\x83\x65\x90\xFE\x10\x31\x79\x55\x33\x9\x0\x35\xB9\x44\x8B"
+"\x90\x10\xDA\xE0\x55\x16\x5\xB\x77\xC0\x7\x77\xC0\x8\x9E\x10\x22\x0\x90\xD\x9\x51\x2D\x74\x0\x9"
+"\x7A\xB0\x3C\x24\x8\x0\xB4\x13\xF\x9\x41\xF\x5C\x40\xE\x77\x80\x6\x9\xD1\xD\xEF\xA6\x85\x6\x61"
+"\x6\x77\xD0\x95\xF0\x0\xB\x16\x48\x3C\x0\x90\x93\xFB\x67\x10\x8B\xD0\x4\x9A\x50\xF\x5A\x9\x0\xF7"
+"\xD3\x59\x7E\xB5\x93\x6\x31\xF\x3D\xA5\x24\x3E\x9\xE\x41\x9\xB\xE5\x43\x66\xF3\x44\x6F\xF9\x60\x80"
+"\xFD\x60\x0\x1F\xD2\x3D\x6F\xD8\x52\x9F\x5\x0\x1E\x69\x6D\x0\x30\x92\x8D\xC0\x82\xCB\x92\x79\x4C\xE4"
+"\x8\xE9\xF7\x8\x75\x30\x99\x39\xD8\x94\x48\x35\x7\x7F\xB0\x94\x67\x30\x7E\x69\x30\x7\x90\xC0\x8\x0"
+"\x90\x8\x6\x1\x99\x93\x39\x7E\x73\x20\x3B\x4B\x64\x6\xE4\x37\x99\x76\x60\x9\x7D\x0\x6A\xDB\x50\x7"
+"\x74\x70\x7E\x93\x59\x7\xA1\x80\x7\x69\x66\x10\x11\x61\x7\x99\x50\x92\x93\x10\xA\xA6\x9\x9\xA9\xC0"
+"\x3E\x0\x40\xF\x0\xE0\x8\x73\xB0\x9A\x73\xC0\xD\x69\x10\xA\x75\x90\x6\xB8\x9\x81\x66\x0\x0\x77"
+"\x50\x7\x68\x10\x0\x69\x80\x7E\x69\xFE\x50\xE\xC3\x50\x67\x6\x61\xF\xB9\xB8\x9\x6\xA1\x9\x68\x20"
+"\x7\x76\x50\x7\x72\xE0\x7\x6\x1\x6\x5E\x90\x6\x72\x40\x7\x76\x40\x7\x9A\x10\x6\x6\x91\x8B\xB7"
+"\x78\x1\xD7\xD2\x24\xEE\x70\x6\x1\xC0\xD\xED\x39\x7\x75\x90\x9\xD1\x49\x43\x7\x80\x9\x5E\x80\x8B"
+"\xA7\x0\x0\x2C\x40\x1\xF6\xC9\x1\xCA\x25\x98\x2A\x8\x0\xF4\x39\x46\x1D\xC9\x98\x8C\x30\x7\x91\xC0"
+"\x98\xC5\xD3\x98\x5A\x30\x8\x92\x30\x9\x93\x40\x9\x76\x40\x9\x95\xA9\x3E\xE\x98\x10\xE5\x77\x7\xE5"
+"\xC7\x7\x7E\xE0\x7\x80\xC0\x6\x9E\xC9\x50\x78\x90\x9\xE9\x47\x9\x7E\xA0\x9\xF8\xB7\x44\xB\xA0\xB"
+"\xBA\x40\x7\xA1\xB0\x6\x77\xF0\x6\x58\x16\xB\x72\x90\x9\x7E\xF0\x9\x4D\x80\x7\x8C\x0\x8\xCE\x59"
+"\x92\x71\x65\x10\x46\x99\x7E\x6B\x60\x9\x8F\x0\x8\x20\xA\x8\x74\x30\x8C\xF3\x87\x5B\x1\xD0\x4\xED"
+"\xE9\x7\x7A\x80\x7\x4D\x90\x7\x90\x90\x6\x69\x0\x8\x54\xF8\x3B\x66\x30\x6\x5E\xC0\x6\x93\xF0\x9"
+"\x62\xCA\x5\x80\x60\x9\x73\xC0\x7B\x15\x58\x0\x15\x90\x1\xDC\x10\x0\xBA\x23\x6\xFE\x19\x7\x7C\x10"
+"\x7\x94\xB0\x6\xFE\x39\x38\xD\xE5\xE0\xD\x6D\xBA\x6\x82\x30\x8\x61\x32\xE\xF6\xC0\xD\xDC\x50\x0"
+"\xA7\x40\xE\x29\x22\x3D\x3\x10\x0\x2\xC0\x1\xE6\x40\x4\x4D\x50\xF\x7C\xD0\x99\x25\x19\x5\x14\x1"
+"\x8\x6B\xF0\xA\x72\x90\x6\x6D\x0\x0\xDE\x70\x8B\x28\x50\x0\x28\x80\x2\x15\xF0\xA4\x83\xA5\x3D\x5E"
+"\xB1\x4\x61\x60\xAB\x61\x90\xAB\x61\x20\x5\xBC\xCA\xAB\x53\xA0\x5\x95\x30\x7\x82\xF0\x0\x27\x20\x87"
+"\x75\x8\x4\x55\x90\xAC\xC9\xAA\x5\xC9\x1A\x4\x27\xE0\x5E\xE\xC0\x4\x96\x20\x9\xD7\xE2\x18\x23\x30"
+"\x4A\x93\xC1\x3\x19\xF3\x9E\x7C\x30\x9\x7A\xF0\x1\x51\x0\x1\x57\x70\x9\x98\x40\x7\x87\x90\x5D\x1F"
+"\x3\x9\x99\xA0\x9\x4D\x20\xAE\x3C\x80\x89\xA4\xE8\x3\x41\xA0\x5\x9\x0\x9\x9F\x80\x8\x42\x80\x3"
+"\x60\x0\xA0\x4A\x9\x88\x58\x80\x5\xD1\xEA\x7\x1\xEA\xA\xC4\x40\x17\x43\xA0\x8\xAB\x80\x7E\x1F\xEA"
+"\x8\xB4\xE5\x9\x5F\x10\x7\x74\x80\x9\x7\x42\x5\x8C\x17\x0\x5E\xE0\x5\xE2\x50\x3\x35\xC0\x4\xC3"
+"\x20\x4\x97\xB0\x6\x71\x10\x8\x13\xB0\xA\xCF\x0\x8D\xD3\x78\x8B\xE1\x40\x4\x1F\x0\x3\x4C\xC0\xFE"
+"\x4\x34\x50\xD\x70\x40\x7\x96\xB0\xD\xD1\x60\x76\xC7\x10\xD\x2F\xE0\x1\x52\x80\x1\xDC\x80\x1\x3"
+"\x20\x0\xA7\x40\x4\x1A\xDB\x4\x70\x8A\x8\x27\xD0\x1B\xD6\x20\x6\xE1\x70\x5\xE\x30\x88\x40\xA0\xA"
+"\x61\x60\xD\x1B\x30\xE\xF5\x50\xC\xE1\xFA\x2\xF7\x78\x8B\xD9\x40\x4\x4E\x60\xC\x47\xE0\x4\xE1\xDA"
+"\x6\x69\x80\x6\x9F\x30\x3\x51\x20\x4F\xC2\x40\x6\x64\xB0\x6\x75\x40\xA\xAF\xC0\x6\xA7\xE0\x6\xB0"
+"\xD0\xA\x6E\x40\x4\x46\xE0\x0\xCC\x60\x5\xE5\x64\x4E\xE3\xD1\x52\x42\x62\x10\x13\x2A\xA1\xEE\x72\xA1"
+"\x19\xBA\x82\x86\xB\x0\x98\x7\x92\x0\xB0\x21\x8F\x40\x9\x54\xB8\x86\x9D\x46\x7\xEB\x3A\x8\x1D\x12"
+"\x92\x0\x80\x7\x6C\x10\xA\x85\xAB\x3\x77\x10\xA\x7E\x0\x6B\x5B\xA9\x9\x42\xB8\x3F\x7C\x0\x9\xC2"
+"\x57\x6\x90\xF9\x8\x25\x89\x29\x30\x71\x8\x75\x0\x8\x9B\x6\x0\x1D\x12\xA0\x77\x0\x96\x0\x40\x43"
+"\x5F\x90\x9\xBD\x19\x5A\x26\x20\x7\x7F\xD0\x7\x4C\x8\x0\x50\xA8\x2\x6B\x10\x9\x9E\x90\x45\xC7\xB9"
+"\x6D\x1D\x0\x0\xF3\x66\x10\x6E\xE6\xD\x68\x0\x8\xB8\xF2\x5A\x0\x70\xF\x1\xFE\x70\xF\xA7\xE0\xA"
+"\x20\x50\xB9\xA3\xB6\xA1\x0\x0\x9\x87\xC0\x5\xC0\xA5\xD\xA1\x0\x7\xB0\xA0\x84\x0\xA0\xD\x44\x70"
+"\x8B\xC1\x4B\x7D\x3\x70\x6\xF8\xA0\x41\x6\xA1\x97\xBA\x70\x6\x34\xF8\x9\x64\xA6\x86\x6A\x68\x70\x82"
+"\xE5\x29\x7F\xB\x0\xFF\x1B\xB8\x31\xC1\x8\x6C\x50\xB8\x86\xA9\xA1\x0\xA0\xB8\x8A\x4B\x46\xAF\xFB\xB8"
+"\xBB\x22\x5D\x76\x10\x7\x8E\x80\x6D\x11\x5\x0\x70\x10\xA\x92\x0\x20\x3A\x30\x8\x75\x40\x9\xAB\x90"
+"\x10\xE4\x17\x7\x9E\x6\x0\xDC\x0\x7\x65\x52\x6\x22\x1A\xB\x2A\xB5\x9E\x9\xB1\x8\x8C\x90\x94\x1F"
+"\xC\x2D\x0\xD0\xC1\x13\x3C\x82\xF5\x36\xA5\x92\xF0\xB\xBE\xE2\xBB\x8E\x80\x45\x7\xE1\x7B\x5C\x40\x66"
+"\xBC\x13\x7\x76\x80\x9\x60\xE9\xC3\xD3\x99\x98\x72\x30\xE\xB2\xE3\x66\x0\xA0\x85\xF8\xC0\xD\xE4\x20"
+"\x7C\xCD\xB\x0\xB2\xD7\x3F\x8C\x10\xA\x80\x20\x28\x33\x25\xF\x75\x90\x7\x14\xFC\x7A\xD9\x10\x0\xF6"
+"\xF0\xBF\x21\x14\x6\x1D\x10\x0\x19\x20\x5B\x36\xFC\xA\x73\xC0\x5\xAD\xE0\x15\xD0\x95\xB\x3D\x65\x5C"
+"\x9E\xD2\x2C\x0\x80\xC7\xFF\x4B\x46\x8C\xF0\x7\x6\x5C\x98\xFE\x1F\x24\x7B\xB2\x47\x46\x33\xB8\x80\xBB"
+"\x82\x6F\x8D\x9B\x83\x81\xEB\x23\x78\x10\xB1\xB8\x29\x55\x87\x90\x9\x97\x90\x10\x92\x49\x8C\xA9\xC3\x5"
+"\xDC\x90\xA0\x6\x51\x6\x72\xD0\xC1\xA\xC0\x8\x5D\xD9\xD\x5D\x79\x7\xDD\xA0\x9\x72\x20\x9\xE2\x6B"
+"\x10\xFD\x97\x94\xD1\x9\x0\x7A\x19\x2\x83\x30\xA2\xDD\x66\x10\x49\xF0\x9B\x74\x30\x7\x79\x0\xCA\xDC"
+"\xB0\x7E\x4\xB8\x66\x8\x18\x0\x12\xCC\x8\x5D\xD0\x95\x1D\x70\x6\x9A\xA0\x9\x2A\x2A\x9\x13\xC\x5B"
+"\x4F\xC\x0\xF8\x60\x1\xF5\x70\x81\xDE\x69\x10\x45\xFA\x9\x98\x96\x10\xDC\xC0\x6\xD6\xFC\xBF\x3B\xD0"
+"\x5\x1\x80\x2\xD3\x50\xF\x1D\x40\xE\xEE\x40\xE\xE4\x60\x0\xE5\x7C\xBD\xD1\x6C\x10\xA2\x6A\x10\xA3"
+"\xC0\x6\x13\xEC\x83\x6\x91\x43\x0\x90\x4\x75\xDC\x53\x5E\x71\x2\xFA\xAC\xCF\x2F\xD0\xCF\x2F\xD0\x1B"
+"\x4B\xB0\x4\xBC\xDA\x6\x87\x10\x9\xE\x20\x4\xBA\x1A\x6\x40\xE0\x2\x9B\xF0\x7\x29\xF0\x2\x52\x10"
+"\x4\x12\xCD\xAB\x2\xBD\x4\x33\xD8\x7\x2A\x40\x1C\x8E\xF1\x88\x49\x10\x3\x3C\x30\xA2\x4D\x20\x1\x40"
+"\x50\x1B\x6E\xC7\x3\x32\x20\xB9\x5C\x70\xFE\x2\x1A\xB7\x9\x9E\x5B\x5\x60\xD0\xD\x35\x5A\x9\x39\x50"
+"\x6\x5D\x90\x6\xAE\x40\x3\x2E\x30\x8A\x73\x40\x7\x94\x80\x9\xE9\x77\x9E\x59\x5A\x7E\x72\xA0\xB\x82"
+"\x10\xD2\x55\x90\x5D\x50\x30\x8C\x35\x80\x5\x10\xF0\x0\x4E\x40\x66\xC5\xC1\x9B\x5F\x20\x2\xF1\x95\x5"
+"\xAC\xF0\xA\xB1\x20\x9B\x41\x6D\x9A\xDF\xA0\x1\x9\x30\x18\xF4\x40\xF\xE6\x9\x9\xE5\xE0\x9E\x76\x70"
+"\xAA\x17\xDB\x9E\xE3\x20\x8\x7A\xA0\x8\x86\xC0\x19\xB\x10\x34\x73\x80\x6\x37\x4D\xD\xD3\xD0\x8D\x65"
+"\x37\x35\x52\x83\xF\x73\x0\x7\xD5\xA0\x5\x3A\x90\x8\xF2\xE0\x5\xD8\x80\x8\x43\x0\x4\xB2\xB1\x31"
+"\x73\x90\x6\x8E\xBA\xA7\xF6\xC9\xAA\x6\x60\x4\x51\xF0\x0\xFB\xE0\x0\xFE\x1\x2\xF8\x80\x6\x6E\x40"
+"\x8\x64\x80\x1C\x7\x80\x4\x67\x63\x2\x49\x60\x2\x54\xA0\x37\x7A\x73\x1D\x2D\xB5\x21\x1A\x62\x92\xF4"
+"\xF9\x5\x9C\xD0\x9\x9\x11\xB8\x55\x0\x8\x72\xC0\x8\xD1\x72\xC0\x14\x3A\x83\xAD\x77\x68\x48\x35\xA2"
+"\xC7\xAB\xB8\xBC\x55\x7\x98\x30\xC1\xC6\x83\x7\xC2\x3D\x7F\x98\x50\x7\x77\x10\xB\x94\x50\x44\x72\xC0"
+"\x7\xC3\xD0\xC2\x69\xFE\x30\x6\x77\xF0\x9\x83\x80\x7\x83\xD0\x4\xD7\x2D\xA6\x83\x50\x3\x7D\x20\xBF"
+"\x9\x25\x7\x71\xF0\x21\xB4\xE7\x15\x8F\x10\xB\x35\x9C\x54\x0\xF0\x6\x9F\x10\x9\x79\x10\x8\x93\xE0"
+"\x7\x92\x10\x7\xA1\xF0\x7\xBC\x8C\x3B\x98\x79\x7\x78\x80\x7\x7A\x30\xC\xD8\x1D\xA6\xC3\x50\x3\x4D"
+"\xC0\x18\x0\xC0\x6A\x50\x29\x9\x96\x60\xE\xEF\x36\x2E\x14\x8\x0\xCF\x90\x6\x62\xA0\x7\x70\x6\x0"
+"\x6C\xAB\xE0\x8E\xB9\x3\x1\xAA\x9\x44\x80\x7\xC3\x30\xC\x46\x10\xE0\x1E\x5E\x3\xC3\xF0\x1\xB4\x65"
+"\x6E\x10\xC1\xD\x46\x0\xB9\x87\x86\x5B\xF\x18\x58\x9E\xA2\xDA\x8B\x9B\x10\x30\x4E\x9F\x9F\xF0\xDA\x18"
+"\x34\x5\xA0\xC0\x9\x8E\x70\x6E\xA2\x45\xA1\xA1\x20\xA\xB\xA8\x86\xC8\x36\xA2\xF8\x27\x7B\x62\x4\xB"
+"\x75\x20\x9\xB8\x9\x92\x93\x69\xCD\x75\x10\xB\x0\x40\x9\x96\x80\x3\x9E\x50\x7\x81\x0\x3B\xF6\xE3"
+"\xD\xDA\x4C\x5A\x58\xE\x0\xB1\xFB\xBF\xA5\x33\x7\x98\x20\xAB\xA0\xEB\xCA\x55\xAE\xE4\x9\xD1\x97\x0"
+"\xA4\x2\x6F\xF0\x6\x4D\xF0\x6\x78\xE0\x7\x99\x20\x9\x29\x62\x3B\x87\x70\x8\x4B\x9\x0\x29\x6E\x10"
+"\xFE\xD1\x6D\x10\xB2\xFA\x3B\xBA\x83\xF\x6C\x60\xE1\x6B\xF5\x6E\xE5\xF2\xC\x6D\x80\x6\x6D\x80\x65\x73"
+"\x0\x8\x42\x68\x6B\xAF\x17\xC9\x3B\x9E\x10\xE8\xCB\xBD\x3C\x1E\xBB\x19\xD0\xA5\xC\x58\x85\x88\x76\x24"
+"\x1F\xD8\x52\x33\x61\x10\xA1\x1E\xE3\x96\xFB\x5\xA3\x0\xDB\xCC\x2\x13\xA4\x50\xA\x78\x0\xDE\x81\x4B"
+"\x9F\x7F\x20\xA\xBB\xBD\x97\x56\x38\xC3\xA6\xB0\x7E\xA0\x26\x46\x93\x60\x7\x81\x90\x22\xE4\xB6\x6\x76"
+"\xA0\xE4\xA1\xB0\x98\x77\xF0\x8\xDF\x10\x9\xB1\xF0\x9\x5D\xAE\x3\x6D\x20\x0\xD8\x80\xC7\xD7\x46\x65"
+"\x9\x21\x9A\x9D\x19\x8\x32\x4E\x13\x81\x40\x7\x81\x30\x7F\xB7\xF5\x8\x93\x0\x0\xC8\xD6\xCE\x6F\xF0"
+"\x8\x6B\x80\x7F\xFA\x60\x10\x7E\x10\xA\xA9\x5A\xE0\xBD\x67\x10\xC6\x89\xBC\x0\xF0\xE\x0\x40\xDB\xEB"
+"\x5C\xE8\x35\x72\xEF\xE\xDE\xA\x68\x10\xE\x28\xE5\x7\x69\xB0\xBA\x90\x3E\x6D\x6D\x20\x7A\x65\x5E\x98"
+"\x8A\x8B\xC7\x7A\x62\x10\x99\x9E\xE2\xE9\xC3\x86\xF5\x3C\x47\x5E\x21\x4\x42\xF0\x4\x13\xFF\x4\x16\x7F"
+"\xF1\xFF\xBC\xAB\xA7\x80\xA\xA9\x40\xAC\x11\xED\xAB\xAA\x80\xA\xA8\xE0\x6\xF\xF0\xFE\x4\x2\x3D\x87"
+"\x53\x50\x5F\x99\x0\xA\x78\xE0\x0\xE\x10\x40\x2B\x20\x4A\x7B\xB0\x5\x5B\x10\xA0\xA2\xB0\xA\x41\x60"
+"\x71\x3D\xE0\x5D\x4A\x60\x7\xB1\xC0\x8\xF\x70\x5\x55\x40\x71\xE0\xF0\x8\x8F\xC0\x7\x6B\xA0\x7\x27"
+"\xA0\x6\x76\xF0\x7\x98\x30\x9\x46\xDD\x5D\xCF\x80\x6\x62\x60\x8\x3D\x10\x49\x8B\x90\x8\x97\x88\x89"
+"\x66\xD0\xD\x39\xB0\x3\x3A\xF0\x89\x60\xD0\x99\x7C\x60\xD\xC8\x6A\x72\x24\x73\x5\xD5\xCC\xD9\x90\x91"
+"\x4\x3E\x7A\xB\x31\xC0\xC\xFD\xD1\xC\x10\x30\x4\x34\x60\x7\x50\xDF\x1\x28\x60\x1\x3\x60\xF\x99"
+"\x80\x9\xD8\x30\xC6\x8F\x8D\x8B\xD9\xA0\x1\x37\xF0\xE\x4\x0\xF\xF4\xD0\xD\x73\x10\xA\x5C\x60\x0"
+"\x9\xF0\xE\x92\xDF\x2\x9B\xA1\x34\xA0\xA1\x4B\x4\xC0\xD\xDF\x20\xF\xDC\x10\xE\x4C\x60\x4\x55\x30"
+"\x35\xAD\xB1\x1\x54\x6F\x8\x2E\x0\xD\x3B\x80\xFA\x60\x5F\x49\x39\x90\x0\x40\xE0\xCF\x2F\x70\x2\xBF"
+"\xB1\xF7\xDA\x3B\x4F\x2\x72\x1C\xCA\x78\x20\x25\x40\x5\xA2\xAD\x36\xE0\xD4\x52\x9\xF\x0\xA3\x3E\xEA"
+"\x9B\xE2\x6\x49\xC0\xA\x48\x88\xB8\xA0\x80\xA\xAD\xC0\xBD\x1F\xFE\xD4\x7F\x99\x80\xA\xAE\x60\x7D\xB4"
+"\x6E\xEB\xAF\x20\xA\xD7\xB6\x3\xB0\x10\xB\x76\x90\x7\xDC\x7E\x6D\x46\x2F\x9\x9A\x80\xE5\x8F\x30\xA2"
+"\x77\x60\xC\x65\xCE\x12\xD8\x80\x6\xDE\x30\xFD\x0\x10\x6E\x0\x0\xD3\x76\xF0\x8\xEA\xB9\xC9\x0\xD0"
+"\x9E\xE1\xA0\xB\xC7\x2B\x46\x7D\xC0\x6\x72\xD0\xEB\x0\x41\x6\xC0\xC0\x60\x75\xEA\x40\x4A\x32\x10\xC0"
+"\x94\x81\xB1\xEC\x44\x2\x1\xC0\x88\x42\x4C\x7F\x32\x39\xA\xA0\x30\xA3\xA3\x47\x76\xE8\x70\x1\x70\x43"
+"\x23\x80\x38\x73\xB6\x29\xEC\xA6\x30\x81\x42\x5\xA\x17\x0\xD0\xD3\x85\x5B\x3D\x34\xE2\x10\x29\x6C\xA0"
+"\x30\x19\x80\x35\x6C\xD8\xB8\x1A\xE8\x4E\xE1\x3B\x39\x5E\xD2\x9C\x52\x8\x44\xE1\x80\x0\xE4\x0\x18\x53"
+"\x18\x22\xAA\x42\x2A\xA\x59\x28\x54\xA6\x50\x2B\x0\x9\xA\xBB\xE\x7C\x32\x50\xD6\x2C\x5A\xB5\xA8\xD8"
+"\x92\x55\xAB\xD6\xAD\x59\x6D\x71\x6D\xC9\xD5\xEA\xE6\x40\x5D\xB8\xEC\x8E\x42\x65\xAA\x14\x28\xBE\xA0\x44"
+"\xED\x7A\x3\xE0\x0\x0\x52\xA8\x32\x89\xE2\xF5\xCA\x94\x28\x46\x8C\xE\x59\x32\x95\x67\x90\xC2\x2A\xA"
+"\x21\xC5\x92\xC4\x68\xAE\xA4\x4C\x7E\x1C\x1\xFE\x78\xA1\xB0\x7\x80\x37\xD8\xC4\x74\xF1\x26\xCE\x8C\xA6"
+"\x40\x74\xE8\xD8\x59\xC3\x88\x89\xC2\x33\x62\xD2\x84\x6B\x63\x7B\xDC\x26\x4D\x70\xD2\xCC\xF1\xD3\x7\x80"
+"\x30\x85\xBC\x5C\x87\xA2\x13\x2B\xF\xA3\x77\x81\x3A\x92\xF2\x34\x70\x86\x42\xF\xA4\x30\xD5\x91\xB3\xFC"
+"\xCE\x99\x50\x72\xE8\xC4\x56\x1\xE0\x2\x80\x3E\xB1\xD2\x60\x9A\x33\x27\x9C\x24\x48\x25\x21\x89\x3\xD0"
+"\x72\xE0\xCA\x81\xF2\xC3\x75\xF9\xC6\xE1\x83\x7\x85\xC\x70\x2\x50\x61\x8D\x43\xE6\x18\x23\x5\x33\xC8"
+"\x9\xC4\x20\xD8\x34\xD3\xC9\x1E\x7D\xEC\x9\x20\x80\xC\x34\xB0\x27\x1B\x14\x32\x40\x6A\x20\xA9\x6\xDA"
+"\x43\x21\x13\x14\x52\x65\x2B\x85\x68\xF0\xAA\x44\x0\x7A\x71\xA3\x17\x5F\x7E\xF9\xC5\x97\x5E\x64\x81\x31"
+"\xC6\x5E\x56\x50\xE1\x3\x85\x58\x61\x25\x97\x5C\xDA\x2\xA6\x96\x54\x82\xB9\x65\x97\x5D\x6E\xF9\x2\x80"
+"\x11\xBE\x28\xE5\xAF\x2F\x3C\xF1\x65\x17\x51\x4C\xE1\xA4\x94\x5D\x1C\x51\xE1\x88\xA4\x14\xDA\xE6\x95\x49"
+"\x6\x99\x8B\x11\x4A\xF2\x10\x2E\x8\x85\xA0\x18\x48\x5\x72\xB0\x29\xA7\x8B\x2E\xBC\x98\x23\x8E\x40\x3E"
+"\x29\x4\x80\x21\x6\x62\xFE\x44\xE\x31\xE0\xE0\x62\x98\x26\xE0\xB0\x2D\xD\x36\xB0\x31\x27\x3C\x0\x36"
+"\x4\xC0\xD\x5D\x26\x69\x64\x8D\x38\xE8\xA8\xE3\x11\x4B\x0\x11\xA4\x6\x85\x42\x1B\xC8\x9\x63\x1C\x21"
+"\x85\x12\x4B\x1E\xA9\x23\x13\x48\x2\x71\x64\x98\xA5\x0\x0\xC4\xB\x31\x28\x91\xC4\xF\x3F\xE0\x88\x3"
+"\x12\x48\x0\xC9\x3\x80\x69\x54\xA2\x15\x0\x57\xF0\x69\xC3\x15\x10\x14\x71\xE9\xBF\xA7\x4\xF1\x3\x13"
+"\x3A\xD2\xF0\x2\x8D\x70\xDE\xF4\x4\x84\xB9\x0\xF8\x6\x8D\x6F\xB2\xC1\xF5\x94\x7B\xB2\xA1\x16\x9F\xC"
+"\x1\x10\x41\x21\x24\x14\x4A\x68\x20\x67\x44\x4\x80\x6\x71\xC7\x1D\x57\x2\x9\x68\x80\x0\x86\x23\xD6"
+"\x3D\xA2\xCA\x76\xDF\x3D\xE2\xD\x27\x9C\x78\x40\x82\x13\x84\x30\xE2\x3\x27\xDE\x88\x37\xDE\x37\xFE\x15"
+"\x46\x5\x15\xC8\x20\x78\x84\x15\x5B\x19\x21\xA\x44\x86\xC1\xA3\xE1\x3E\xA\x39\x2\xB\x1A\x5E\x98\xA2"
+"\x62\x8B\x97\xC8\xC3\x11\x2C\x86\x90\x2\x8\x29\x4\xD1\x98\x86\x29\x5C\x20\x19\xA\x17\xB4\xA8\xE6\x4"
+"\x9\x5C\x71\x85\x88\x26\x8C\x40\xE4\x3\x2C\x98\xB8\x22\x8\x28\x7A\xD0\x62\x95\x26\x10\xA9\x1\x91\x21"
+"\x3C\xFE\xB8\xC2\xE5\x1A\x9C\x10\xD8\x9\x2B\x57\x8\x41\x4\x11\x18\x19\x44\x98\x56\x7C\x71\xC4\x8D\x26"
+"\xF0\x60\x2\xB\x44\xAE\xA8\xC2\x7\x17\x7E\x0\x22\x8C\x13\xF6\x31\xC6\x9\x3C\xA6\xC6\x63\x10\x4F\xDE"
+"\x80\x81\x8\x3\x2A\x40\x61\x80\xB\x2A\x21\x47\xF\x23\x86\xA1\xBB\x6E\x3D\x87\x71\x65\x83\x1B\xF6\x6E"
+"\xA1\x85\x4\xFE\x56\xA0\x81\x14\x8A\x70\xA5\xF\x26\x28\x60\x60\x1\x5\x16\x60\x9C\xF1\x6\xA6\xB1\xA6"
+"\x1A\x45\x3E\xF9\x44\x8F\x97\x63\xB6\x5A\x82\x6A\x80\xA8\x62\x8A\x17\xF4\xA8\x1\x6\xD1\x61\x28\xA4\xF4"
+"\x7D\x7\x16\x61\x4\xA5\x47\x8\x81\x4\x4\xF6\xA0\xC2\x84\x2D\x4C\x60\xE1\x7\x67\xBE\xDD\x6A\xCE\x81"
+"\x48\xDC\x5D\x21\x62\x14\x2A\xC6\x77\x85\x1C\x50\x48\x77\x39\x87\x57\xC8\x9\x85\x22\x1A\x28\xDB\x81\x7A"
+"\x19\x51\x21\x2C\x14\x5A\x42\x21\x86\x6\xAA\x7E\xA0\x2B\x8A\xA7\x4C\x21\x17\xAC\x57\x68\x59\xDE\x1\x18"
+"\x6D\x20\x29\x14\xA\x6B\xA0\x65\x21\x50\x8\xAA\x81\x88\x1B\x68\xB0\x81\x8C\xBF\x1E\x0\x19\xBC\x57\x88"
+"\xFD\x81\x98\x7\x40\x7F\x0\x50\x50\x88\x53\x6\xD2\x1\x85\x10\x70\x20\x5\x50\x8\x6\xFE\x14\xD2\x2"
+"\x85\x18\x40\x21\x1B\x60\x49\x4\x7\x12\xD\x85\xCC\x66\x20\x42\x50\x8\x5\x7\x52\xD\xE4\xD\xC4\x4A"
+"\xFB\x53\xC8\x8\x14\xB2\x2\xAA\x58\x5\x5C\xC7\xEB\x5D\xA\x51\x8\x80\x8\x70\x4F\x85\x18\x4\x4B\xF4"
+"\xE6\xA7\x90\x28\x84\x50\x21\xB6\x98\x14\xFA\x14\x72\x3E\xF3\x29\x24\xC\x3B\xA4\x5E\xF7\x6\xF2\xBD\x21"
+"\x2\x71\x20\x95\x19\x48\xF9\x0\x40\xA6\x22\xE\xE4\x87\x3\x39\x1\xD\x15\xE2\x3C\x0\x6C\x6B\x20\x56"
+"\x4\x80\xE\x14\xA2\xC5\x81\xDC\x6F\x20\xF5\x83\x21\x0\xA6\x33\xC3\x81\x40\x70\x20\x19\x50\x8\x2\x7"
+"\x42\x0\x85\x8C\x67\x20\xA\x1C\xC8\x4B\x6\xC2\xC0\xF9\x48\x10\x0\x72\x4\xC0\x35\x14\x62\x8\x9D\x8"
+"\x11\x34\x2E\x4\xC0\x7\x7\x35\x15\xE\x79\xE8\x84\x2D\x1C\x8\x22\x57\x38\x3E\x46\x9A\x8\x0\x61\x4C"
+"\x1F\x0\x22\x39\x3E\xE2\x69\xC8\x84\xD8\xB\xA2\x13\x7D\x68\x44\x0\x88\xE9\x8B\x57\x3A\xA2\x42\xB4\x80"
+"\xBF\x81\x30\x71\x89\xA2\x41\xE5\x40\x46\x89\xC9\x81\x54\xD2\x48\xA\x41\x80\x42\xB2\xA0\x10\x25\x28\x4"
+"\x7\x5B\x54\x88\x17\x1\x40\x44\x0\x64\x4F\x8C\x80\xD4\x80\x42\x4\xFE\x30\xAA\x81\xB8\x51\x3C\xA\x11"
+"\xC9\x1C\x6B\x5\x0\xFA\xC4\xA7\x57\x71\x54\xC8\x33\x32\xA8\x10\x6A\x28\x64\x7B\x3\xB1\xD1\x40\x48\xD8"
+"\x3C\x6D\x29\x64\xB\xE0\x82\x40\x4\xC2\x19\x1\x72\x92\x73\x8\x11\x18\x42\x3A\xD3\x49\x2E\x1A\x9C\x4B"
+"\x5C\xE6\x32\x97\x10\x24\x20\x4\x7A\xD2\xF3\x9\x4F\xA0\xA7\xB9\xCE\x9\x1\x7\x58\x6A\x50\xA9\x3B\x40"
+"\x9\x4C\x60\x82\x17\x14\xF4\x5\x4B\x40\x68\x42\x11\x1A\x6\x86\x32\x54\xA\xF\x95\x42\x10\x22\x1A\x4"
+"\x8A\x5A\xAC\x62\x40\xC0\x28\xE7\xAA\xB0\xD1\x2A\x68\xC1\xA3\x24\x3\x29\x14\x44\x2A\xD2\x1E\xDC\x6C\xA4"
+"\x24\xEB\x5C\x10\x96\x70\x82\x2B\xC\x1\x11\x35\x3C\x40\xD2\x44\x10\x82\x3\x20\x81\x5\x26\xB0\x1\x15"
+"\x70\xB0\x53\x25\xF4\xB4\xA7\x38\x50\xC2\x4E\x73\x90\x3\x1D\xE8\x60\x7\x47\x95\x41\x49\xB5\x6\x84\x29"
+"\x78\x6D\x8\x33\x80\xEA\x3\x20\x30\x4\x9\x4C\x80\x2\x15\xB0\x80\x5\x4\xB0\xD5\x1\x74\x95\x0\x5F"
+"\x25\xC0\x5\xC4\x7A\x1\xC\x94\x15\x3\x7C\xBB\x41\xDF\xFE\xB6\xD6\x4\x28\xC0\xAD\x6F\x5D\x1C\xE3\x18"
+"\xC0\x80\x67\x3C\x63\x1A\xD3\x88\x46\x34\xAE\x51\xFE\x5\x6A\x48\xA1\x1A\x2F\x50\x84\x4\x86\x0\x1\x7D"
+"\x81\xE0\x0\x48\x53\x5D\xEA\x56\x40\x2\x24\xC0\xCE\x6\x5B\x98\xE5\x56\xFC\xA7\x48\x45\x1A\xCF\x78\x8D"
+"\x1C\xC8\x57\x1E\xA9\xC3\xCC\x86\x4F\x21\xF2\xAB\x62\xE\x7\x42\xA9\x5E\x66\x12\x0\x4F\x4\x0\xF\x3B"
+"\x9\xBE\x4F\x86\xD2\xB5\x0\x58\xE5\x2E\xC7\x34\x5B\x55\x6E\x32\x91\x23\xC4\xED\x40\xBE\x39\x90\x1C\xD0"
+"\xD2\xB7\x3\xB9\xE5\x40\xB8\x68\x3F\x85\xF8\x80\x93\x63\x5C\xA1\x19\x1\x60\x1\x62\x2\x80\x8D\xC5\x4C"
+"\xE0\x2\xA5\x5B\xC7\xFA\x3C\x13\x0\xC8\x50\x88\x1E\x37\x28\x43\x0\xF0\x4F\x84\xDA\x54\x48\xC\x4E\xF8"
+"\x80\xFC\x29\x84\xB2\xE6\x5\x24\x66\xB9\xE2\xC8\xF1\x91\x37\x7E\xB0\x54\x48\x14\x47\x6B\x5A\x5F\xFA\x12"
+"\xB5\xA8\x55\x6D\xFD\xEA\x87\x44\x0\xF0\x37\xB6\xBC\xE4\x65\x6C\x55\x6B\x3C\xD0\x12\xEA\x43\xC2\x55\x48"
+"\x6F\x7\x52\xCB\x5\xFF\x16\x0\xA\x26\x6E\x29\x8F\x8B\xDE\x32\x2A\x84\xB9\x3\x19\x80\x42\x9E\x7B\xCC"
+"\x37\x4E\x17\x0\x74\x64\xA6\x1D\x73\x32\x41\x6A\x52\x27\x79\x84\x1C\x64\x21\xC1\xE5\x5E\x0\xB0\xD8\x7F"
+"\x93\xA5\xF0\x22\xB9\xAB\x5E\xFE\x16\x6B\x5\xB4\xF2\x5\x0\x8E\x71\x4C\xDA\xFA\xDA\xF6\xB4\x9C\xF4\xE4"
+"\x42\x40\xD9\x5F\x51\x92\x92\xC8\x3D\x54\xA1\x56\xA8\x58\x95\x81\xEC\x0\x97\xBC\xB5\xA5\x83\x83\x9B\xC5"
+"\x5C\xD2\x36\xB5\xA\x41\xAE\x22\x39\x20\xCC\xE6\x6E\xD8\x98\x70\xFC\xF0\x32\xE5\x73\x47\x85\xCC\x6A\x20"
+"\xD5\x84\xA2\x42\xB2\x9\x80\x6D\x62\xAB\x9B\x22\x72\x40\x9C\x1D\xF0\x0\x3A\xD7\xB9\xCE\x10\xC0\xB3\x38"
+"\xF5\x5C\x4E\x3E\xAB\x73\x9D\xEC\x1C\xD7\x3E\x11\xE1\x80\x28\x84\xE7\x0\xAA\xB\x81\x4D\x93\xC0\x82\x7B"
+"\x3E\xE1\x4\x8E\x3E\x41\xA4\x23\xFD\x82\x13\x18\xB4\xA0\xA\xC5\x74\x43\xC3\x0\x51\x88\x52\xD4\xD3\x16"
+"\x9D\x42\x46\x39\xDA\x51\x8F\x72\x94\xA9\x53\x90\xC2\x12\x28\x2D\x4\x97\x16\x3A\xA6\xAA\x1B\xC1\xA\x5E"
+"\x17\x83\x24\x64\xE1\xA8\x47\x35\x6A\x51\x75\x9D\x3\x1C\xF0\x9A\xA7\x3E\x5\x76\xAF\x87\x5A\x54\xA4\xF2"
+"\xA0\xA4\x2E\xA8\x82\xC7\xAC\x20\x4\xA8\xCE\x60\xCE\x11\xA0\xC1\x15\xC\xC0\x81\xAC\x6A\x55\x0\x5D\xF5"
+"\xEA\x57\xC7\x4A\x56\xB3\xEE\x8D\x6F\x7E\xF3\x9B\x5B\x35\xB0\x0\x6\x6C\xC0\xAE\x86\xC8\x2B\x35\xA8\xB1"
+"\xA\xC9\xFE\x9\xC1\x3\x4C\x28\xEC\x61\x43\x90\xD8\x10\xC8\xBA\xB1\x70\xEE\x60\x8B\x15\xC2\x62\x16\x9F"
+"\xF7\xB6\x64\xC\x17\x20\x97\xE5\x5D\x43\xA6\xD9\xE0\x39\x16\xED\x1F\x59\x59\xDA\x85\xAB\x36\xC8\x41\xAE"
+"\x9F\x52\x5E\xCB\xDF\x20\x5F\x33\x90\x53\x54\x48\x9\x2E\x9\x0\x27\x23\xD8\xE3\xF\x8E\x72\x83\x81\xFB"
+"\x64\x8E\x5B\x39\xC8\x59\x56\x48\xA\x98\x37\xCC\x81\xB0\xDC\xB9\x6D\x8C\xEE\x40\x92\x19\xE2\x81\x8C\x18"
+"\x0\x7C\x1C\x88\x3\x55\x48\xF0\xF7\x82\xEB\x77\x3\xF9\xB9\xBE\x7\xE2\xE2\x7D\xC7\xD8\xDF\x2B\x34\x9E"
+"\xFF\xDC\xE7\x66\xDD\x72\x56\x92\xF1\x85\xFA\xC1\x7B\xAC\x49\xAA\xFF\x78\x20\xF\x67\x2D\x0\x24\xAE\x75"
+"\x4E\x46\x32\x78\x96\x1C\x48\x2C\x7\x72\xE0\x8\x97\xFC\xE3\xC3\x9D\x32\x83\x1\xA0\x76\xB5\x43\xB8\xE3"
+"\xE4\x53\xC8\xC9\x63\x9C\x2\x2E\x63\x58\xC3\x30\xEF\xB0\x32\x7\x12\xCC\x81\x98\x19\x0\x68\x6\x0\x11"
+"\x4E\xC\xF6\x14\x8B\x28\xE8\x87\xCF\x37\xBF\x8B\x3E\x10\x18\xFF\x9B\x85\x8B\x7\x10\xC6\x9B\x7E\x41\xA7"
+"\x47\x32\x92\x3A\x4E\xF8\xD4\x19\x6E\xF5\x2B\x5F\x3D\xEB\xF5\x53\x6D\x24\x5D\x49\x28\xD0\xEE\xFE\x16\x0"
+"\x3C\xA8\x72\x93\x15\xF2\xF6\xE1\x42\x38\xED\x21\xA7\xB2\xEA\x25\xDC\xDA\x5F\x32\x5E\x21\x45\xA8\x3B\x0"
+"\x32\xBC\x46\xBC\x87\x64\x99\x7E\xD7\x2E\x0\x78\x85\xCD\xDC\x32\x7D\x2B\x51\x20\x46\xF2\x95\xBF\x7C\xE6"
+"\xCB\x79\xCE\x76\x86\x0\x9D\xF1\x9C\xE7\xE9\xF3\x99\xCF\x10\x40\xC4\x3\x88\x51\xE8\x88\x24\x6D\x4\x1"
+"\x1D\x28\x3C\xE1\x59\x4F\x21\x34\xDA\xD1\x8D\x7E\xB4\xA4\x25\x4D\x69\xF6\x1B\x54\xA1\x61\x48\xA8\xA6\xA5"
+"\xB0\x69\x4E\x7B\xBA\xA2\x14\x7D\x28\x42\x23\x2D\x4\x1A\x30\x1\x2\xC5\x8\xF\xA4\x51\x9A\xD6\x29\x1"
+"\x2A\x98\x9D\x3D\xE8\x81\x4\x4C\x40\x1E\x60\x40\x1E\x90\x81\x7\x94\x81\x5B\xC3\xB5\x1D\xD0\xB5\xA2\xEA"
+"\xB5\x9D\xFA\x35\x60\xB\xAA\x5E\xD3\xB5\x62\x4B\x40\x92\x61\xAA\x30\x78\x2\x66\x68\xB6\x66\x20\xA7\xAA"
+"\x2A\x2\xAC\xCA\x2A\xAE\xCA\x36\x6D\x13\xAB\xB2\xBA\x81\x6C\xF8\x1B\xD\xD0\x80\xD\xD8\x0\x43\x30\x84"
+"\x6B\xA0\x6\x3\x58\x85\x9\x50\x84\x77\x8B\x37\x1\x1C\x40\xC3\x13\x1E\xA0\x2B\x42\x0\x70\x25\x57\x52"
+"\x3C\xDB\x63\xC2\xC7\x1B\x3A\x85\x10\x24\x42\x61\xB2\xF5\xA2\xBC\x2A\x7C\xFE\xBA\x18\x3A\xB8\x1D\xCB\x3C"
+"\xD3\xC2\xAF\xB8\xF3\xC2\xAA\xC3\x31\xFF\x1\xAD\xEF\x2\x80\xC8\x3A\xA5\x24\x52\x8\xD4\xEB\xA2\xD4\x8B"
+"\xBD\x36\x74\x3D\x7\x6B\xBB\xD5\x4B\x25\x21\x93\x8E\x18\xA3\x80\xDC\xDB\xBD\x97\xCB\x3B\x9A\x93\x95\x12"
+"\x1B\x8\xFE\x0\xA1\x81\x20\xC3\xAD\x40\x3C\x23\x34\x44\x0\x28\x44\x24\x84\x3C\xA2\x6B\x42\x16\x53\x1E"
+"\xC2\xEB\x10\x15\x1A\x1F\xCD\x82\x24\xA7\xC3\xBC\x83\xE3\x31\xFA\xF2\x31\xD5\x42\xAD\x48\x52\x24\x25\xDB"
+"\x38\x53\x32\x25\x25\x52\xC3\xB2\xD3\xA5\xE1\x6A\x3D\xD8\x63\x3B\xD8\x7B\x3B\x25\xDA\x3A\xE4\x62\xB1\x3B"
+"\x1C\x88\xB\xD3\xBD\xDE\xCB\x6\x85\xA8\x80\x94\x53\x88\xE1\x3\x80\x47\x2C\x3C\x42\x3C\xC2\x44\x14\xC6"
+"\xC4\x5B\x44\xC8\x13\xA4\x36\xD3\x38\x80\x53\x2F\x4A\xAC\x3C\x4B\x8C\x3A\x85\xDB\x3C\xCD\x43\x2D\x5F\xC2"
+"\x31\xB\x7A\xA\xC9\x3\x80\x48\x94\xAD\x26\x3A\x43\xB8\x43\xC3\x35\x4\x47\xB3\x73\x43\x55\x84\x3D\xB7"
+"\x9B\xC3\xFA\x81\xC5\x6\xB2\xB0\xE6\x2\x33\xBE\xBB\xB9\x2\x52\xB3\xE2\xD3\xA\xE4\x4B\x3E\x7A\xDC\x3E"
+"\xE5\xB3\x47\x7B\x64\xBE\x7D\x24\x6\xE7\x7B\x3E\x3B\xFE\xAB\x33\x7\xD8\x3E\xA2\x89\x88\x43\x9B\x29\x45"
+"\x63\x1\x3F\xA3\x81\x21\x0\xB4\x73\x11\xBF\x78\xAA\x27\xF3\x43\xBF\xF3\x53\x3F\xF5\xB3\x34\x4C\x7B\x3F"
+"\x4C\xA3\xB4\x47\x93\xA7\x73\x72\x80\x62\xB0\x92\x98\x5A\x9D\x9A\xDA\x3\xD9\xA1\x82\x8F\x2\x29\x17\x30"
+"\x99\x91\x22\x29\x5\x34\x36\x6\x4C\x6\x8\x8C\x40\x9\xC4\xB5\xA\x1C\x2A\x5F\x3\x2A\xD\xDC\xC0\x61"
+"\x23\xB6\x1D\x90\x1\x63\x33\x19\xAE\x91\x82\x65\x6B\xB6\x67\xA3\x1\x45\x98\xB6\x6A\xBB\xB6\x1\x20\x0"
+"\x7D\xC0\x80\x6C\xC8\x80\x2\xA8\x0\x1B\xE4\x80\xC1\x31\x80\xE\xF8\xC1\x61\x88\xB7\x10\x20\x94\x60\xF4"
+"\xCA\x43\x1C\xC6\x43\x54\xC2\x7C\xF3\x45\xAD\x20\x81\x18\xBB\x2C\xEE\xD2\x2C\x66\xC4\xC2\x2B\x44\xB8\x2C"
+"\x7C\x46\xCD\xA3\x46\x40\xAA\x21\xC2\x13\x3B\x0\x20\x3B\xFE\xE2\x25\x51\x9C\x43\x25\xD2\xA5\xB7\x63\xBD"
+"\x4\x23\x47\x91\x3\x39\xD9\xF3\x46\xAE\xAB\xC3\x27\x1C\x88\x55\xC8\x3D\x30\xCB\xC5\x81\xA0\xBB\x81\x10"
+"\xBC\x40\x24\x42\xB0\xFC\x4A\x44\xBC\xCC\x44\x4C\xC2\xC1\xDB\x8A\x36\xD3\xC6\xCA\x9A\x31\x47\x62\x4B\xB7"
+"\xBC\xBC\x67\x24\xAD\x4C\x5C\x38\xFE\x1C\xD3\xAC\xAF\x2B\x3C\xD0\xEA\x96\x23\x83\xCD\xBD\xB4\x32\x25\xF2"
+"\x4B\x39\x34\xCC\x54\x1C\x39\xC2\x54\xBB\x29\x1B\x2E\x57\x2C\x2F\xC5\x4\x0\xE\xE2\xBD\x3\x52\x88\x2D"
+"\x1B\x88\x9\x50\x88\x38\xF1\xB9\xCC\x64\x4E\xCB\x1C\x88\xBA\xC4\xCC\x43\x2C\x4B\x14\x9B\xC2\xA3\xB3\xAC"
+"\xD0\xEC\x2C\x2B\xB4\x3C\x67\xC4\xC4\x84\xC3\x31\x4A\x2A\x3E\x42\xB1\x81\xAC\xE3\x2F\xFF\x32\xB2\x51\x9C"
+"\x43\x5D\xFA\x4B\x92\x43\x3B\x38\x14\x4C\xC3\x54\x22\xDC\x1\x80\x7D\x80\x3C\xE4\x1C\x88\x5B\x1C\x88\x36"
+"\x50\x8\xC6\x54\x1F\x70\xF9\x7\x7C\x4\xD0\x7A\xC\xD0\x7B\x14\xD0\x2\x25\xD0\xE5\xCB\x47\x7C\x8C\x82"
+"\x75\x31\x6\x10\xE8\x3E\x80\x12\x28\x13\x90\xAA\xE9\x1B\x27\xEB\x33\x27\x3F\x63\x48\x76\x72\xA7\x87\x24"
+"\x3F\x7C\x92\xC8\x7B\x4A\xBF\x8A\xAC\xB4\x11\x95\xB4\x7B\x92\x27\x1A\x88\x80\xEC\x5B\x50\xC3\x9A\x37\xC5"
+"\x9A\xB5\x5A\xB\x2\x50\x13\x35\x8E\xD2\x2\x52\x4B\xC9\x92\x61\xC9\x9B\x51\xC0\x1E\x60\x40\x99\x8C\xC0"
+"\x99\xBC\xB5\xA\xD4\x81\x9B\xC4\xC0\x9C\xC\x36\xC\xAC\x40\x9F\x4C\x6\xA5\xD2\x82\x1F\x68\xAA\xAF\x29"
+"\x4A\xA9\x1A\xFE\x2\x45\x58\x85\x14\x90\xCA\xA\xA8\xCA\x22\x20\x87\xE\x20\x2\x23\x90\x94\xAD\xF8\x7"
+"\xE8\xC\xCB\xE8\x24\xD3\x31\x4D\x44\xE8\xF4\x45\xFE\xA1\xA2\xD7\x7C\x31\xA3\x4B\x2F\xEC\xA4\xC2\xCD\x6A"
+"\xCB\xED\xEC\xCE\x83\xD3\xAC\x81\xC3\xC6\xAB\xF0\x3C\xDA\xDB\x2F\x3F\x92\xCD\xD9\x3B\xCC\xDA\x34\xCC\xC0"
+"\x84\xB2\xDC\x5C\x3B\x7\x83\xB0\xDE\xF4\xA3\xF1\x9\x3A\x40\x4\x80\x6B\x99\x4C\xAD\xF8\x87\x49\x6D\xCE"
+"\x32\xAD\xD4\x31\x15\x24\x35\xF5\xA6\x62\x74\xBC\xA3\x53\x24\xF5\x1A\x9F\x30\xAA\xC4\xB6\xBC\x44\xB7\xD4"
+"\x2C\x45\xD2\xD4\x81\x48\xC6\x6C\xFC\x42\x3A\x44\x4C\xD8\x34\x4F\x6E\x44\xCF\x6F\x2C\x3B\xC0\x24\x39\x8"
+"\x5B\x45\xC2\x4C\xD4\x34\x1C\x32\x46\xAD\x20\x78\x4\x53\x4A\x75\x4E\x4B\x1D\x56\x33\x3D\xC2\x34\xC5\x46"
+"\x33\x1C\x4B\xE0\x6C\x3C\x27\x74\xD6\xB4\x54\xA1\xB5\x54\x88\x51\x25\x4D\x47\xF2\x1F\x41\x79\xA5\x2B\xA"
+"\x2F\x20\xFB\xBC\x21\x8B\xD5\x6D\xEC\x46\xDA\x64\xC3\xF5\x3C\xBB\xC1\x3C\xD4\x42\x15\x47\xDF\x4\x38\x5F"
+"\x5C\x16\x85\x98\xD4\x49\x3D\xD0\x4\x35\x50\x79\x8D\xD7\x1\xCD\xC7\x19\x88\x82\x19\x98\x17\x6\xFE\x75"
+"\x50\x36\x4B\x9A\x44\x63\x81\x45\xEB\x47\x39\x7B\x80\x7F\x84\xBE\x9\xCD\xB3\x3E\xBB\xD0\x75\x52\x27\x40"
+"\x7B\xA7\xF1\xEB\xD0\xF2\xFB\x50\x7C\x3A\xD1\x74\x4A\x51\x81\x3C\x2\xA8\x10\x42\x9A\x2A\x1\x16\x98\x1D"
+"\x16\x58\x2\xF9\xAB\xBF\x4F\xB3\x18\xA6\xC2\xA8\x51\xAB\x51\x94\xBC\xD1\x1C\xDD\xD1\x5\x74\x40\x1F\xA5"
+"\x49\xA\xB4\xC9\xA1\xC2\x40\x9D\xDC\x40\xE\x24\xB6\x9F\x14\x29\xAE\x51\x29\x95\xD9\x87\x8C\x5D\x3A\x49"
+"\x7D\x57\x78\xBD\xD4\xA2\x1D\x56\x64\x85\xC4\x23\x5C\x56\xA1\xEB\x9F\xDF\x74\x56\xD0\x54\x46\xB5\x9C\xD6"
+"\x66\xB4\x42\x45\xF2\xC5\x36\x6B\xB3\xD7\xBC\x2F\x6E\xE5\x53\x3F\xD2\xCB\xF3\xEC\x4B\x36\xB4\xD5\x8F\x7B"
+"\x43\xDD\x7C\x4F\x71\x34\xAE\x85\x13\x91\xA1\x65\xDB\x62\x35\x5A\x62\x25\x53\xE8\x5C\x3A\x64\xBC\xCC\xCD"
+"\x4\x4E\x46\x7C\xDA\x37\x95\x44\x47\x12\x55\x47\x32\x1E\xD6\x6C\x33\x3\xE3\xC2\x4D\x6C\x55\xFD\xF2\x5A"
+"\x23\xFB\xD3\x40\xED\xA3\x70\x24\xD4\x36\x7C\x3D\xC2\x1C\x2E\x5D\x3A\xA1\x81\x60\xDB\xB6\x9D\xDC\xCB\xC5"
+"\xDC\xCC\xD5\xDC\xCD\xE5\xDC\xCE\xF5\xDC\xCF\x5\xDD\xD0\x15\xDD\xD1\x25\xDD\x3E\xC9\xAD\xDC\xCA\x2D\xDD"
+"\xD4\x55\xDD\xD5\x65\xDD\xD6\x75\xDD\xD7\x65\xDD\xD3\x3D\x5D\xD8\xA5\xDD\xDA\xB5\xDD\xDB\xC5\xDD\xDC\x5"
+"\x0\xD9\xE5\x5D\xDD\xF5\xDD\xDF\x5\xDE\xE0\xC5\x5D\xDE\x25\xDE\xA1\x15\xDE\xE3\x45\xDE\xE4\x55\x5E\xA1"
+"\xE5\xDD\x80\x0\x0\x3B";
+
+#endif

+ 155 - 0
src/memory.c

@@ -0,0 +1,155 @@
+/* Copyrights 2002 Luis Figueiredo ([email protected]) All rights reserved. 
+ *
+ * See the LICENSE file
+ *
+ * The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission.  Since few users ever read sources,
+ * credits must appear in the documentation.
+ *
+ * date: Sat Mar 30 14:25:25 GMT 2002 
+ *
+ * -- memory functions
+ */
+#include "memory.h"
+
+IFDEBUG(int _t=0;)
+
+/*********************************************************************************************************/
+/*
+ * same as malloc with error reporting and libwebserver debug
+ */
+void * __ILWS_malloc(size_t s) {
+	void *ret;
+
+	ret=malloc(s);
+	if(ret==NULL) {
+		IFDEBUG(fprintf(stderr,"memory.c: malloc: %s (size %d)\n",strerror(errno),s);fflush(stderr));
+		return NULL;
+	};
+	IFDEBUG(_t++;);
+	
+	IFDEBUG(fprintf(stderr,"memory.c (%d): Allocated %d bytes to %p\n",_t,s,ret);fflush(stderr));
+	return ret;
+}
+
+/*********************************************************************************************************/
+/*
+ * same as calloc with error reporting and libwebserver debug
+ */
+void * __ILWS_calloc(size_t nmemb,size_t s) {
+	void *ret;
+	ret=calloc(nmemb,s);
+	if(ret==NULL) {
+		IFDEBUG(fprintf(stderr,"memory.c: calloc %s\n",strerror(errno));fflush(stderr));
+		return NULL;
+	};
+	IFDEBUG(_t++;);
+	IFDEBUG(fprintf(stderr,"memory.c (%d): Allocated %d bytes to %p\n",_t,s*nmemb,ret);fflush(stderr));
+	return ret;
+}
+
+/*********************************************************************************************************/
+/* 
+ * same as realloc with error reporting and libwebserver debug
+ */
+void * __ILWS_realloc(void *buf,size_t s) {
+	void *ret;
+	ret=realloc(buf,s);
+#ifdef DEBUG
+	if(buf==NULL) {
+		_t++;
+		IFDEBUG(fprintf(stderr,"memory.c (%d): Allocated %d bytes to %p\n",_t,s,ret);fflush(stderr));
+	};
+#endif
+	if(ret==NULL) {
+		IFDEBUG(fprintf(stderr,"memory.c: realloc: %s\n",strerror(errno));fflush(stderr));
+		return NULL;
+	};
+	IFDEBUG(fprintf(stderr,"memory.c: Realloc buffer %p to %d\n",buf,s);fflush(stderr));
+	return ret;
+}
+
+
+/*********************************************************************************************************/
+/*
+ * same as free with error report and libwebserver debug
+ */ 
+void __ILWS_free(void *ptr) {
+	if(ptr!=NULL) {
+		free(ptr);
+		IFDEBUG(fprintf(stderr,"memory.c (%d): Buffer %p freed\n",_t,ptr);fflush(stderr));
+		IFDEBUG(_t--;);
+	};
+}
+
+
+/*********************************************************************************************************/
+/*
+ *  Add a buffer to memrequest list
+ */
+void *__ILWS_add_buffer(struct memrequest *list,unsigned int size) {
+	struct memrequest *tmem;
+	if(size==0) {
+		return NULL;
+	};
+	if(list!=NULL) {
+		tmem=list;
+	}else {
+		return NULL;
+	};
+	while(tmem->next!=NULL)tmem=tmem->next;
+	tmem->next=__ILWS_malloc(sizeof(struct memrequest));
+	if(tmem->next==NULL) return NULL;           // ERROR
+	tmem->next->ptr=__ILWS_malloc(size);
+	tmem->next->next=NULL;
+	return tmem->next->ptr;
+}
+
+/*********************************************************************************************************/
+/*
+ * Initialize memrequest list of buffers
+ */
+struct memrequest *__ILWS_init_buffer_list() {
+	struct memrequest *newlist;
+	newlist=__ILWS_malloc(sizeof(struct memrequest));
+	if(newlist==NULL) return NULL;
+	
+	newlist->next=NULL;
+	newlist->ptr=NULL;
+	return newlist;
+}
+
+/*********************************************************************************************************/
+/*
+ * Delete memrequest buffer node (free)
+ */
+void __ILWS_delete_buffer(struct memrequest *mem) {
+	__ILWS_free(mem->ptr);
+	__ILWS_free(mem);
+}
+
+/*********************************************************************************************************/
+/*
+ * Delete memrequest next buffer
+ */
+void __ILWS_delete_next_buffer(struct memrequest *mem) {
+	struct memrequest *tmem;
+	tmem=mem->next;
+	mem->next=mem->next->next;
+	__ILWS_delete_buffer(tmem);
+}
+
+/*********************************************************************************************************/
+/*
+ * Delete whole memrequest buffer list
+ */
+void __ILWS_delete_buffer_list(struct memrequest *list) {
+	struct memrequest *tmem=list;
+	if(tmem==NULL) return;
+
+	while(tmem->next!=NULL) {
+		__ILWS_delete_next_buffer(tmem);
+	};
+	__ILWS_delete_buffer(tmem);
+}
+

+ 46 - 0
src/memory.h

@@ -0,0 +1,46 @@
+/* Copyrights 2002 Luis Figueiredo ([email protected]) All rights reserved. 
+ *
+ * See the LICENSE file
+ *
+ * The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission.  Since few users ever read sources,
+ * credits must appear in the documentation.
+ *
+ * date: Sat Mar 30 14:25:25 GMT 2002 
+ *
+ *  memory functions
+ */
+
+#ifndef _MEMORY_H_
+#define _MEMORY_H_
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif         
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h> // Johannes E. Schindelin
+
+#include "debug.h"
+
+extern int errno;
+
+void *__ILWS_malloc(size_t);
+void *__ILWS_calloc(size_t,size_t);
+void *__ILWS_realloc(void *,size_t);
+void __ILWS_free(void *);
+
+struct memrequest {
+	char *ptr;
+	struct memrequest *next;
+};
+struct memrequest *__ILWS_init_buffer_list();
+void *__ILWS_add_buffer(struct memrequest *,unsigned int);
+void __ILWS_delete_buffer(struct memrequest *);
+void __ILWS_delete_next_buffer(struct memrequest *);
+void __ILWS_delete_buffer_list(struct memrequest *);
+
+#endif

+ 22 - 0
src/module.c

@@ -0,0 +1,22 @@
+/* Copyrights 2002 Luis Figueiredo ([email protected]) All rights reserved. 
+ *
+ * See the LICENSE file
+ *
+ * The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission.  Since few users ever read sources,
+ * credits must appear in the documentation.
+ * 
+ * date: Wen Jul 30 06:57:42 GMT 2003
+ * 
+ * -- module function
+ *
+ *   Tested on WIN32 only
+ */
+#include "module.h"
+
+
+
+
+
+
+

+ 25 - 0
src/module.h

@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+#ifndef _MODULE_H_
+#define _MODULE_H_
+
+struct module {
+	const char *handle;
+	void (func)();
+
+};
+
+
+
+
+#endif

+ 587 - 0
src/outgif.c

@@ -0,0 +1,587 @@
+/*
+ * Luis Figueiredo - why remake the wheel, this functions feets perfectly
+ * and the credits still here :)
+ */
+
+
+/*
+ * xvgifwr.c  -  handles writing of GIF files.  based on flgife.c and
+ *               flgifc.c from the FBM Library, by Michael Maudlin
+ *
+ * Contains: 
+ *   WriteGIF(fp, pic, ptype, w, h, rmap, gmap, bmap, numcols, colorstyle,
+ *            comment)
+ *
+ * Note: slightly brain-damaged, in that it'll only write non-interlaced 
+ *       GIF files (in the interests of speed, or something)
+ *
+ */
+
+
+
+/*****************************************************************
+ * Portions of this code Copyright (C) 1989 by Michael Mauldin.
+ * Permission is granted to use this file in whole or in
+ * part for any purpose, educational, recreational or commercial,
+ * provided that this copyright notice is retained unchanged.
+ * This software is available to all free of charge by anonymous
+ * FTP and in the UUNET archives.
+ *
+ *
+ * Authors:  Michael Mauldin ([email protected])
+ *           David Rowley ([email protected])
+ *
+ * Based on: compress.c - File compression ala IEEE Computer, June 1984.
+ *
+ *	Spencer W. Thomas       (decvax!harpo!utah-cs!utah-gr!thomas)
+ *	Jim McKie               (decvax!mcvax!jim)
+ *	Steve Davies            (decvax!vax135!petsd!peora!srd)
+ *	Ken Turkowski           (decvax!decwrl!turtlevax!ken)
+ *	James A. Woods          (decvax!ihnp4!ames!jaw)
+ *	Joe Orost               (decvax!vax135!petsd!joe)
+ *****************************************************************/
+ 
+
+#include "outgif.h"
+
+static int  __ILWS_Width, __ILWS_Height;
+static int  __ILWS_curx, __ILWS_cury;
+static long __ILWS_CountDown;
+static int  __ILWS_Interlace;
+//static unsigned char bw[2] = {0, 0xff};
+
+static void __ILWS_putword     PARM((int, FILE *));
+static void __ILWS_compress    PARM((int, FILE *, unsigned char *, int));
+static void __ILWS_output      PARM((int));
+static void __ILWS_cl_block    PARM((void));
+static void __ILWS_cl_hash     PARM((count_int));
+static void __ILWS_char_init   PARM((void));
+static void __ILWS_char_out    PARM((int));
+static void __ILWS_flush_char  PARM((void));
+
+
+static unsigned char pc2nc[256],r1[256],g1[256],b1[256];
+
+
+/*************************************************************/
+int __ILWS_WriteGIF(FILE *fp, unsigned char *pic, int w, int h, unsigned char *rmap, unsigned char *gmap, unsigned char *bmap, int numcols, int colorstyle,int transparency,
+	     char *comment)
+{
+  int   RWidth, RHeight;
+  int   LeftOfs, TopOfs;
+  int   ColorMapSize, InitCodeSize, Background, BitsPerPixel;
+  int   i,j,nc;
+  unsigned char *pic8;
+  //unsigned char  rtemp[256],gtemp[256],btemp[256];
+
+  pic8 = pic;
+
+
+
+  __ILWS_Interlace = 0;
+  Background = 0;
+
+
+  for (i=0; i<256; i++) { pc2nc[i] = r1[i] = g1[i] = b1[i] = 0; }
+
+  /* compute number of unique colors */
+  nc = 0;
+
+  for (i=0; i<numcols; i++) {
+    /* see if color #i is already used */
+    for (j=0; j<i; j++) {
+      if (rmap[i] == rmap[j] && gmap[i] == gmap[j] && 
+	  bmap[i] == bmap[j]) break;
+    }
+
+    if (j==i) {  /* wasn't found */
+      pc2nc[i] = nc;
+      r1[nc] = rmap[i];
+      g1[nc] = gmap[i];
+      b1[nc] = bmap[i];
+      nc++;
+    }
+    else pc2nc[i] = pc2nc[j];
+  }
+
+
+  /* figure out 'BitsPerPixel' */
+  for (i=1; i<8; i++)
+    if ( (1<<i) >= nc) break;
+  
+  BitsPerPixel = i;
+
+  ColorMapSize = 1 << BitsPerPixel;
+	
+  RWidth  = __ILWS_Width  = w;
+  RHeight = __ILWS_Height = h;
+  LeftOfs = TopOfs = 0;
+	
+  __ILWS_CountDown = w * h;    /* # of pixels we'll be doing */
+
+  if (BitsPerPixel <= 1) InitCodeSize = 2;
+                    else InitCodeSize = BitsPerPixel;
+
+  __ILWS_curx = __ILWS_cury = 0;
+
+  if (!fp) {
+    fprintf(stderr,  "WriteGIF: file not open for writing\n" );
+    return (1);
+  }
+
+  
+  if (comment && strlen(comment) > (size_t) 0)
+    fwrite("GIF89a", (size_t) 1, (size_t) 6, fp);    /* the GIF magic number */
+  else
+    fwrite("GIF87a", (size_t) 1, (size_t) 6, fp);    /* the GIF magic number */
+
+  __ILWS_putword(RWidth, fp);           /* screen descriptor */
+  __ILWS_putword(RHeight, fp);
+
+  i = 0x80;	                 /* Yes, there is a color map */
+  i |= (8-1)<<4;                 /* OR in the color resolution (hardwired 8) */
+  i |= (BitsPerPixel - 1);       /* OR in the # of bits per pixel */
+  fputc(i,fp);          
+
+  fputc(Background, fp);         /* background color */
+
+  fputc(0, fp);                  /* future expansion unsigned char */
+
+
+  if (colorstyle == 1) {         /* greyscale */
+    for (i=0; i<ColorMapSize; i++) {
+      j = MONO(r1[i], g1[i], b1[i]);
+      fputc(j, fp);
+      fputc(j, fp);
+      fputc(j, fp);
+    }
+  }
+  else {
+    for (i=0; i<ColorMapSize; i++) {       /* write out Global colormap */
+      fputc(r1[i], fp);
+      fputc(g1[i], fp);
+      fputc(b1[i], fp);
+    }
+  }
+
+  if (comment && strlen(comment) > (size_t) 0) {   /* write comment blocks */
+    char *sp;
+    int   i, blen;
+
+    fputc(0x21, fp);     /* EXTENSION block */
+	fputc(0xF9,fp);   // graphic control extension// Luis Figueiredo
+	fputc(4,fp);    // blocksize
+	fputc(0x1,fp); // transparency flag
+	fputc(100,fp);// delay (unsigned?)
+	fputc(100,fp);// delay (unsigned?)
+	fputc(transparency,fp); // Luis figueiredo
+	fputc(0, fp);    /* zero-length data subblock to end extension */
+    fputc(0x21, fp);     /* EXTENSION block */
+	fputc(0xFE, fp);     /* comment extension */
+    sp = comment;
+    while ( (blen=strlen(sp)) > 0) {
+      if (blen>255) blen = 255;
+      fputc(blen, fp);
+      for (i=0; i<blen; i++, sp++) fputc(*sp, fp);
+    }
+    fputc(0, fp);    /* zero-length data subblock to end extension */
+  }
+
+
+  fputc( ',', fp );              /* image separator */
+
+  /* Write the Image header */
+  __ILWS_putword(LeftOfs, fp);
+  __ILWS_putword(TopOfs,  fp);
+  __ILWS_putword(__ILWS_Width,   fp);
+  __ILWS_putword(__ILWS_Height,  fp);
+  if (__ILWS_Interlace) fputc(0x40, fp);   /* Use Global Colormap, maybe Interlace */
+            else fputc(0x00, fp);
+
+  fputc(InitCodeSize, fp);
+  __ILWS_compress(InitCodeSize+1, fp, pic8, w*h);
+
+  fputc(0,fp);                      /* Write out a Zero-length packet (EOF) */
+  fputc(';',fp);                    /* Write GIF file terminator */
+
+
+  if (ferror(fp)) return -1;
+  return (0);
+}
+
+
+
+
+/******************************/
+static void __ILWS_putword(int w, FILE *fp)
+{
+  /* writes a 16-bit integer in GIF order (LSB first) */
+  fputc(w & 0xff, fp);
+  fputc((w>>8)&0xff, fp);
+}
+
+
+
+
+/***********************************************************************/
+
+
+static unsigned long __ILWS_cur_accum = 0;
+static int           __ILWS_cur_bits = 0;
+
+
+
+
+#define min(a,b)        ((a>b) ? b : a)
+
+#define XV_BITS	12    /* BITS was already defined on some systems */
+#define MSDOS	1
+
+#define HSIZE  5003            /* 80% occupancy */
+
+typedef unsigned char   char_type;
+
+
+static int __ILWS_n_bits;                    /* number of bits/code */
+static int __ILWS_maxbits = XV_BITS;         /* user settable max # bits/code */
+static int __ILWS_maxcode;                   /* maximum code, given n_bits */
+static int __ILWS_maxmaxcode = 1 << XV_BITS; /* NEVER generate this */
+
+#define MAXCODE(n_bits)     ( (1 << (n_bits)) - 1)
+
+static  count_int      __ILWS_htab [HSIZE];
+static  unsigned short __ILWS_codetab [HSIZE];
+#define HashTabOf(i)   __ILWS_htab[i]
+#define CodeTabOf(i)   __ILWS_codetab[i]
+
+static int __ILWS_hsize = HSIZE;            /* for dynamic table sizing */
+
+/*
+ * To save much memory, we overlay the table used by compress() with those
+ * used by decompress().  The tab_prefix table is the same size and type
+ * as the codetab.  The tab_suffix table needs 2**BITS characters.  We
+ * get this from the beginning of htab.  The output stack uses the rest
+ * of htab, and contains characters.  There is plenty of room for any
+ * possible stack (stack used to be 8000 characters).
+ */
+
+#define tab_prefixof(i) CodeTabOf(i)
+#define tab_suffixof(i)        ((char_type *)(htab))[i]
+#define de_stack               ((char_type *)&tab_suffixof(1<<XV_BITS))
+
+static int __ILWS_free_ent = 0;                  /* first unused entry */
+
+/*
+ * block compression parameters -- after all codes are used up,
+ * and compression rate changes, start over.
+ */
+static int __ILWS_clear_flg = 0;
+
+static long int __ILWS_in_count = 1;            /* length of input */
+static long int __ILWS_out_count = 0;           /* # of codes output (for debugging) */
+
+/*
+ * compress stdin to stdout
+ *
+ * Algorithm:  use open addressing double hashing (no chaining) on the 
+ * prefix code / next character combination.  We do a variant of Knuth's
+ * algorithm D (vol. 3, sec. 6.4) along with G. Knott's relatively-prime
+ * secondary probe.  Here, the modular division first probe is gives way
+ * to a faster exclusive-or manipulation.  Also do block compression with
+ * an adaptive reset, whereby the code table is cleared when the compression
+ * ratio decreases, but after the table fills.  The variable-length output
+ * codes are re-sized at this point, and a special CLEAR code is generated
+ * for the decompressor.  Late addition:  construct the table according to
+ * file size for noticeable speed improvement on small files.  Please direct
+ * questions about this implementation to ames!jaw.
+ */
+
+static int __ILWS_g_init_bits;
+static FILE *__ILWS_g_outfile;
+
+static int __ILWS_ClearCode;
+static int __ILWS_EOFCode;
+
+
+/********************************************************/
+static void __ILWS_compress(int init_bits, FILE *outfile, unsigned char *data, int len)
+
+{
+  register long fcode;
+  register int i = 0;
+  register int c;
+  register int ent;
+  register int disp;
+  register int hsize_reg;
+  register int hshift;
+
+  /*
+   * Set up the globals:  g_init_bits - initial number of bits
+   *                      g_outfile   - pointer to output file
+   */
+  __ILWS_g_init_bits = init_bits;
+  __ILWS_g_outfile   = outfile;
+
+  /* initialize 'compress' globals */
+  __ILWS_maxbits = XV_BITS;
+  __ILWS_maxmaxcode = 1<<XV_BITS;
+  memset((char *) __ILWS_htab,0,    sizeof(__ILWS_htab));
+  memset((char *) __ILWS_codetab,0, sizeof(__ILWS_codetab));
+  __ILWS_hsize = HSIZE;
+  __ILWS_free_ent = 0;
+  __ILWS_clear_flg = 0;
+  __ILWS_in_count = 1;
+  __ILWS_out_count = 0;
+  __ILWS_cur_accum = 0;
+  __ILWS_cur_bits = 0;
+
+
+  /*
+   * Set up the necessary values
+   */
+  __ILWS_out_count = 0;
+  __ILWS_clear_flg = 0;
+  __ILWS_in_count = 1;
+  __ILWS_maxcode = MAXCODE(__ILWS_n_bits = __ILWS_g_init_bits);
+
+  __ILWS_ClearCode = (1 << (init_bits - 1));
+  __ILWS_EOFCode = __ILWS_ClearCode + 1;
+  __ILWS_free_ent = __ILWS_ClearCode + 2;
+
+  __ILWS_char_init();
+  ent = pc2nc[*data++];  
+  len--;
+
+  hshift = 0;
+  for ( fcode = (long) __ILWS_hsize;  fcode < 65536L; fcode *= 2L )
+    hshift++;
+  hshift = 8 - hshift;                /* set hash code range bound */
+
+  hsize_reg = __ILWS_hsize;
+  __ILWS_cl_hash( (count_int) hsize_reg);            /* clear hash table */
+
+  __ILWS_output(__ILWS_ClearCode);
+    
+  while (len) {
+    c = pc2nc[*data++];  len--;
+    __ILWS_in_count++;
+
+    fcode = (long) ( ( (long) c << __ILWS_maxbits) + ent);
+    i = (((int) c << hshift) ^ ent);    /* xor hashing */
+
+    if ( HashTabOf (i) == fcode ) {
+      ent = CodeTabOf (i);
+      continue;
+    }
+
+    else if ( (long)HashTabOf (i) < 0 )      /* empty slot */
+      goto nomatch;
+
+    disp = hsize_reg - i;           /* secondary hash (after G. Knott) */
+    if ( i == 0 )
+      disp = 1;
+
+probe:
+    if ( (i -= disp) < 0 )
+      i += hsize_reg;
+
+    if ( HashTabOf (i) == fcode ) {
+      ent = CodeTabOf (i);
+      continue;
+    }
+
+    if ( (long)HashTabOf (i) >= 0 ) 
+      goto probe;
+
+nomatch:
+    __ILWS_output(ent);
+    __ILWS_out_count++;
+    ent = c;
+
+    if ( __ILWS_free_ent < __ILWS_maxmaxcode ) {
+      CodeTabOf (i) = __ILWS_free_ent++; /* code -> hashtable */
+      HashTabOf (i) = fcode;
+    }
+    else
+      __ILWS_cl_block();
+  }
+
+  /* Put out the final code */
+  __ILWS_output(ent);
+  __ILWS_out_count++;
+  __ILWS_output(__ILWS_EOFCode);
+}
+
+
+/*****************************************************************
+ * TAG( output )
+ *
+ * Output the given code.
+ * Inputs:
+ *      code:   A n_bits-bit integer.  If == -1, then EOF.  This assumes
+ *              that n_bits =< (long)wordsize - 1.
+ * Outputs:
+ *      Outputs code to the file.
+ * Assumptions:
+ *      Chars are 8 bits long.
+ * Algorithm:
+ *      Maintain a BITS character long buffer (so that 8 codes will
+ * fit in it exactly).  Use the VAX insv instruction to insert each
+ * code in turn.  When the buffer fills up empty it and start over.
+ */
+
+static
+unsigned long __ILWS_masks[] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F,
+                                  0x001F, 0x003F, 0x007F, 0x00FF,
+                                  0x01FF, 0x03FF, 0x07FF, 0x0FFF,
+                                  0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF };
+
+static void __ILWS_output(int code)
+{
+  __ILWS_cur_accum &= __ILWS_masks[__ILWS_cur_bits];
+
+  if (__ILWS_cur_bits > 0)
+    __ILWS_cur_accum |= ((long)code << __ILWS_cur_bits);
+  else
+    __ILWS_cur_accum = code;
+	
+  __ILWS_cur_bits += __ILWS_n_bits;
+
+  while( __ILWS_cur_bits >= 8 ) {
+    __ILWS_char_out( (int) (__ILWS_cur_accum & 0xff) );
+    __ILWS_cur_accum >>= 8;
+    __ILWS_cur_bits -= 8;
+  }
+
+  /*
+   * If the next entry is going to be too big for the code size,
+   * then increase it, if possible.
+   */
+
+  if (__ILWS_free_ent > __ILWS_maxcode || __ILWS_clear_flg) {
+
+    if( __ILWS_clear_flg ) {
+      __ILWS_maxcode = MAXCODE (__ILWS_n_bits = __ILWS_g_init_bits);
+      __ILWS_clear_flg = 0;
+    }
+    else {
+      __ILWS_n_bits++;
+      if ( __ILWS_n_bits == __ILWS_maxbits )
+	__ILWS_maxcode = __ILWS_maxmaxcode;
+      else
+	__ILWS_maxcode = MAXCODE(__ILWS_n_bits);
+    }
+  }
+	
+  if( code == __ILWS_EOFCode ) {
+    /* At EOF, write the rest of the buffer */
+    while( __ILWS_cur_bits > 0 ) {
+      __ILWS_char_out( (int)(__ILWS_cur_accum & 0xff) );
+      __ILWS_cur_accum >>= 8;
+      __ILWS_cur_bits -= 8;
+    }
+
+    __ILWS_flush_char();
+	
+    fflush( __ILWS_g_outfile );
+
+#ifdef FOO
+    if( ferror( g_outfile ) ) 
+      FatalError("unable to write GIF file");
+#endif
+  }
+}
+
+
+/********************************/
+static void __ILWS_cl_block ()             /* table clear for block compress */
+{
+  /* Clear out the hash table */
+
+  __ILWS_cl_hash ( (count_int) __ILWS_hsize );
+  __ILWS_free_ent = __ILWS_ClearCode + 2;
+  __ILWS_clear_flg = 1;
+
+  __ILWS_output(__ILWS_ClearCode);
+}
+
+
+/********************************/
+static void __ILWS_cl_hash(register count_int hsize)          /* reset code table */
+{
+  register count_int *htab_p = __ILWS_htab+hsize;
+  register long i;
+  register long m1 = -1;
+
+  i = hsize - 16;
+  do {                            /* might use Sys V memset(3) here */
+    *(htab_p-16) = m1;
+    *(htab_p-15) = m1;
+    *(htab_p-14) = m1;
+    *(htab_p-13) = m1;
+    *(htab_p-12) = m1;
+    *(htab_p-11) = m1;
+    *(htab_p-10) = m1;
+    *(htab_p-9) = m1;
+    *(htab_p-8) = m1;
+    *(htab_p-7) = m1;
+    *(htab_p-6) = m1;
+    *(htab_p-5) = m1;
+    *(htab_p-4) = m1;
+    *(htab_p-3) = m1;
+    *(htab_p-2) = m1;
+    *(htab_p-1) = m1;
+    htab_p -= 16;
+  } while ((i -= 16) >= 0);
+
+  for ( i += 16; i > 0; i-- )
+    *--htab_p = m1;
+}
+
+
+/******************************************************************************
+ *
+ * GIF Specific routines
+ *
+ ******************************************************************************/
+
+/*
+ * Number of characters so far in this 'packet'
+ */
+static int __ILWS_a_count;
+
+/*
+ * Set up the 'unsigned char output' routine
+ */
+static void __ILWS_char_init()
+{
+	__ILWS_a_count = 0;
+}
+
+/*
+ * Define the storage for the packet accumulator
+ */
+static char __ILWS_accum[ 256 ];
+
+/*
+ * Add a character to the end of the current packet, and if it is 254
+ * characters, flush the packet to disk.
+ */
+static void __ILWS_char_out(int c)
+{
+  __ILWS_accum[ __ILWS_a_count++ ] = c;
+  if( __ILWS_a_count >= 254 ) 
+    __ILWS_flush_char();
+}
+
+/*
+ * Flush the packet to disk, and reset the accumulator
+ */
+static void __ILWS_flush_char()
+{
+  if( __ILWS_a_count > 0 ) {
+    fputc(__ILWS_a_count, __ILWS_g_outfile );
+    fwrite(__ILWS_accum, (size_t) 1, (size_t) __ILWS_a_count, __ILWS_g_outfile );
+    __ILWS_a_count = 0;
+  }
+}	

+ 63 - 0
src/outgif.h

@@ -0,0 +1,63 @@
+/* Copyrights 2002 Luis Figueiredo ([email protected]) All rights reserved. 
+ *
+ * See the LICENSE file
+ *
+ * The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission.  Since few users ever read sources,
+ * credits must appear in the documentation.
+ *
+ * file: web_outgif.h
+ *
+ * description: output gif outgif.c is copyrighted by 
+ */
+ /*****************************************************************
+ * Portions of this code Copyright (C) 1989 by Michael Mauldin.
+ * Permission is granted to use this file in whole or in
+ * part for any purpose, educational, recreational or commercial,
+ * provided that this copyright notice is retained unchanged.
+ * This software is available to all free of charge by anonymous
+ * FTP and in the UUNET archives.
+ *
+ *
+ * Authors:  Michael Mauldin ([email protected])
+ *           David Rowley ([email protected])
+ *
+ * Based on: compress.c - File compression ala IEEE Computer, June 1984.
+ *
+ *	Spencer W. Thomas       (decvax!harpo!utah-cs!utah-gr!thomas)
+ *	Jim McKie               (decvax!mcvax!jim)
+ *	Steve Davies            (decvax!vax135!petsd!peora!srd)
+ *	Ken Turkowski           (decvax!decwrl!turtlevax!ken)
+ *	James A. Woods          (decvax!ihnp4!ames!jaw)
+ *	Joe Orost               (decvax!vax135!petsd!joe)
+ *****************************************************************/
+/*
+ *
+ * date: 20:57,13-57-2002
+ */
+
+#ifndef _WEB_OUTGIF_H_ 
+#define _WEB_OUTGIF_H_
+
+#include <stdio.h>
+#include <string.h>
+
+#include "debug.h"
+
+#undef PARM
+#ifdef __STDC__
+#  define PARM(a) a
+#else
+#  define PARM(a) ()
+#  define const
+#endif
+
+/* MONO returns total intensity of r,g,b triple (i = .33R + .5G + .17B) */
+#define MONO(rd,gn,bl) ( ((int)(rd)*11 + (int)(gn)*16 + (int)(bl)*5) >> 5)
+
+typedef long int        count_int;
+
+
+int __ILWS_WriteGIF(FILE *, unsigned char *, int, int, unsigned char *, unsigned char *, unsigned char *, int, int, int, char *);
+
+#endif

+ 122 - 0
src/outstream.c

@@ -0,0 +1,122 @@
+/* Copyrights 2002 Luis Figueiredo ([email protected]) All rights reserved. 
+ *
+ * See the LICENSE file
+ *
+ * The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission.  Since few users ever read sources,
+ * credits must appear in the documentation.
+ *
+ * date: Sat Mar 30 14:25:25 GMT 2002 
+ *
+ * -- stream list functions
+ */
+
+
+#include "outstream.h"
+
+/*********************************************************************************************************/ 
+/*
+ *	add_outstream, add a file to output (client) stream
+ */
+int __ILWS_add_outstream(struct outstream *list,char *fname,FILE* stream,int istmp){
+	struct outstream *temp=list;
+	FILE *tmp;
+	while(temp->next!=NULL)temp=temp->next;
+	
+	if(!(temp->next=__ILWS_malloc(sizeof(struct outstream)))) {
+		LWSERR(LE_MEMORY);
+		return 0;
+	};
+	// file check (0.5.3);
+	tmp=fopen(fname,"rb");
+	if(tmp==NULL) {
+		__ILWS_free(temp->next);
+		temp->next=NULL;
+		return 0;
+	};
+	fclose(tmp);
+	// -- 
+	temp->next->fname=NULL;
+	if(fname!=NULL) {
+		if(!(temp->next->fname=__ILWS_malloc(strlen(fname)+1))) {
+			__ILWS_free(temp->next);
+			temp->next=NULL;
+			LWSERR(LE_MEMORY);
+			return 0;
+		};
+		memcpy(temp->next->fname,fname,strlen(fname));
+		temp->next->fname[strlen(fname)]='\0'; 
+	};
+	temp->next->todelete=istmp;
+	temp->next->fstream=stream;
+	temp->next->wsize=1;
+	temp->next->rsize=0;
+	temp->next->wrotesize=0;
+	temp->next->varsize=0;
+	temp->next->next=NULL;	
+	return 1;	
+}
+
+/*********************************************************************************************************/
+/*
+ * Initializate (allocate) outstream list
+ */
+struct outstream *__ILWS_init_outstream_list() {
+	struct outstream *ret;
+	
+	
+	if(!(ret=__ILWS_malloc(sizeof(struct outstream)))) {
+		LWSERR(LE_MEMORY);
+		return NULL;
+	};
+	ret->todelete=0;
+	ret->fname=NULL;
+	ret->flags=0;
+	ret->fstream=NULL;
+	ret->next=NULL;
+	return ret;
+}
+
+/*********************************************************************************************************/
+/*
+ * Delete a especific node
+ */
+void __ILWS_delete_outstream(struct outstream *node) { // Changed
+	int rt;
+	if(node->fstream!=NULL)fclose(node->fstream); // better here;
+	if(node->todelete) { // is temporary file
+		rt=unlink(node->fname);
+		if(rt==-1) {
+			LWSERR(LE_FILESYS);
+		};
+		
+	};
+	if(node->fname!=NULL)__ILWS_free(node->fname);
+	__ILWS_free(node);
+}
+
+/*********************************************************************************************************/
+/*
+ * delete next node 
+ */
+void __ILWS_delete_next_outstream(struct outstream *node) {
+	struct outstream *temp=node->next;
+	node->next=node->next->next;
+	__ILWS_delete_outstream(temp);
+}
+
+/*********************************************************************************************************/
+/*
+ * delete all nodes on the list (reset list)
+ */
+void __ILWS_delete_outstream_list(struct outstream *list) {
+	struct outstream *temp=list;
+	while(temp->next!=NULL) {
+		
+		__ILWS_delete_next_outstream(temp);
+	};
+	
+	__ILWS_delete_outstream(temp);
+	
+}
+

+ 53 - 0
src/outstream.h

@@ -0,0 +1,53 @@
+/* Copyrights 2002 Luis Figueiredo ([email protected]) All rights reserved. 
+ *
+ * See the LICENSE file
+ *
+ * The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission.  Since few users ever read sources,
+ * credits must appear in the documentation.
+ *
+ * date: Sat Mar 30 14:25:25 GMT 2002 
+ *
+ *  stream functions
+ */
+
+#ifndef _OUTSTREAM_H_
+#define _OUTSTREAM_H_
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef WIN32
+#include <unistd.h>
+#endif
+
+#include "debug.h"
+#include "memory.h"
+#include "error.h"
+
+
+
+
+
+struct outstream {
+	FILE *fstream;
+	char *fname;
+	int todelete;
+	int wsize,rsize; 
+	long wrotesize;
+	long varsize;
+	int flags;
+	struct outstream *next;
+};
+
+int __ILWS_add_outstream(struct outstream *, char *,FILE *,int);
+struct outstream *__ILWS_init_outstream_list();
+void __ILWS_delete_next_outstream(struct outstream *);
+void __ILWS_delete_outstream_list(struct outstream *);
+void __ILWS_delete_outstream(struct outstream *);
+#endif

+ 448 - 0
src/server.c

@@ -0,0 +1,448 @@
+/* Copyrights 2002 Luis Figueiredo ([email protected]) All rights reserved. 
+ *
+ * See the LICENSE file
+ *
+ * The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission.  Since few users ever read sources,
+ * credits must appear in the documentation.
+ * 
+ * date: Sat Mar 30 14:44:42 GMT 2002
+ *
+ * -- core server functions
+ *
+ */
+
+#include "server.h"
+#include "logo.h"
+
+#ifdef WIN32
+	#define _SERVER_VERSION "libwebserver/0.5.3(win32)" // update allways when changing version (damn win)
+#endif
+
+#ifndef _SERVER_VERSION
+	#define _SERVER_VERSION "libwebserver/(unknow)"
+#endif
+
+#ifdef DEBUG
+	char *_libwebserver_version= _SERVER_VERSION "(debug)";
+#else
+	char *_libwebserver_version= _SERVER_VERSION;
+#endif
+
+struct web_server *current_web_server;
+
+
+/*********************************************************************************************************/
+/*
+ *	Define certificate file (open_ssl)
+ */
+void web_server_useSSLcert(struct web_server *server,const char *file) {
+#ifdef HAVE_OPENSSL
+	if(!(server->cert_file=__ILWS_malloc(strlen(file)+1))) {
+		LWSERR(LE_MEMORY);
+		return;
+	};
+	memcpy(server->cert_file,file,strlen(file));
+	server->cert_file[strlen(file)]=0;
+#else
+	printf("OpenSSL not supported in this compilation\n");
+#endif
+}
+
+void web_server_useMIMEfile(struct web_server *server,const char *file) {
+	if(!(server->mimefile=__ILWS_malloc(strlen(file)+1))) {
+		LWSERR(LE_MEMORY);
+		return;
+	};
+	memcpy(server->mimefile,file,strlen(file));
+	server->mimefile[strlen(file)]=0;
+};
+/*********************************************************************************************************/
+/*
+ *  Handler for libwebserver logotipe
+ */
+void _web_server_logo() {
+	printf("Content-type: image/gif\r\n\r\n");
+	fwrite((char *)_logo,sizeof(_logo),1,stdout);
+}        
+
+
+/*********************************************************************************************************/
+/*
+ * Add an handler to request data
+ */
+int web_server_addhandler(struct web_server *server,const char *mstr,void (*func)(),int flag) {
+	_logfile=server->weblog;
+	// xor?
+	flag ^= (server->flags & WS_LOCAL); // global flag to handler flag
+	flag ^= (server->flags & WS_DYNVAR); // global flag to handler flag
+	flag ^= (server->flags & WS_USELEN); // global flag to handler flag
+	web_log("[%s] Adding handler %s <--%s%s%s\n",__ILWS_date(time(NULL),"%d/%b/%Y:%H:%M:%S %z"),mstr, ((flag & WS_LOCAL) == WS_LOCAL && !((server->flags & WS_LOCAL) == WS_LOCAL))?"[LOCAL] ":"", ((flag & WS_DYNVAR) == WS_DYNVAR)?"[DYNVAR]":"", ((flag & WS_USELEN) == WS_USELEN)?"[USELEN]":"");
+	return __ILWS_add_handler((struct gethandler *)server->gethandler,mstr,func,NULL,flag,GH_FUNCTION);
+}
+
+/*********************************************************************************************************/
+/*
+ * Add an alias dir (new on 0.5.2)
+ */
+int web_server_aliasdir(struct web_server *server, const char *str, char *path,int flag) {
+	char *mstr;
+	int ret;
+	mstr=__ILWS_malloc(strlen(str)+7);
+	if(!strlen(str)) {
+		snprintf(mstr,strlen(str)+7,"* /*");
+	} else {
+		snprintf(mstr,strlen(str)+7,"* /%s/*",str);
+	};
+	_logfile=server->weblog;
+	flag ^= (server->flags & WS_LOCAL); // global flag to handler flag
+	flag ^= (server->flags & WS_DYNVAR); // global flag to handler flag
+	flag ^= (server->flags & WS_USELEN); // global flag to handler flag
+	web_log("[%s] Adding directory %s <--%s%s%s\n",__ILWS_date(time(NULL),"%d/%b/%Y:%H:%M:%S %z"),mstr, ((flag & WS_LOCAL) == WS_LOCAL && !((server->flags & WS_LOCAL) == WS_LOCAL))?"[LOCAL] ":"", ((flag & WS_DYNVAR) == WS_DYNVAR)?"[DYNVAR]":"", ((flag & WS_USELEN) == WS_USELEN)?"[USELEN]":"");
+	ret=__ILWS_add_handler((struct gethandler *)server->gethandler,mstr,NULL,path,flag,GH_DIRECTORY);
+	__ILWS_free(mstr);
+	return ret;
+};
+
+
+/*********************************************************************************************************/
+/*
+ *	Personal config (new on 0.5.0)
+ */
+char *web_server_getconf(struct web_server *server, const char *topic,const char *key) {
+	char *dataconf;
+	char *tmp1,*tmp2,*tmp3;
+	long tmpsize=0;
+
+	dataconf=__ILWS_stristr(server->dataconf,topic);
+	if(dataconf==NULL) {
+		return NULL;
+	};
+	dataconf+=strlen(topic);
+	tmp1=__ILWS_stristr(dataconf,key);
+	do {
+		tmp1=__ILWS_stristr(dataconf,key);
+		dataconf+=1;
+		if(dataconf[0]==0) { 
+			return NULL;
+		};
+		if(dataconf[0]=='[' && dataconf[-1]=='\n') { 
+			return NULL;
+		};
+	}while(!(tmp1!=NULL && tmp1[-1]=='\n' && tmp1[strlen(key)]=='='));
+	
+	tmp1+=strlen(key)+1;
+	tmp2=__ILWS_stristr(tmp1,"\n");
+	if(tmp2==NULL) {
+		tmp2=tmp1+strlen(tmp1);
+	};
+	tmpsize=tmp2-tmp1;
+	if(!(tmp3=__ILWS_malloc(tmpsize+1))) {
+		LWSERR(LE_MEMORY);
+		return NULL;
+	};
+	memcpy(tmp3,tmp1,tmpsize);
+	tmp3[tmpsize]=0;
+	return tmp3;
+};
+
+/*********************************************************************************************************/
+/*
+ *	Define config file to setup server (new on 0.5.0)
+ */
+int web_server_setup(struct web_server *server,const char *conffile) {
+	FILE *tmpf;
+	char *tmp3;
+	//long tmpsize=0;
+	long sizec;
+	struct stat statf; // tested only on win
+
+	if(!(server->conffile=__ILWS_malloc(strlen(conffile)+1))) {
+		LWSERR(LE_MEMORY);
+		return 0;
+	};
+
+	memcpy(server->conffile,conffile,strlen(conffile));
+	server->conffile[strlen(conffile)]=0;
+	
+	tmpf=fopen(server->conffile,"r");
+	if(tmpf==NULL) {
+		printf("no config file found\r\n");
+		server->dataconf="";
+		return(0);
+	};
+	fseek(tmpf,SEEK_SET,SEEK_END);
+	sizec=ftell(tmpf);
+	fseek(tmpf,0,SEEK_SET);
+	if(!(server->dataconf=__ILWS_malloc(sizec+1))) {
+		LWSERR(LE_MEMORY);
+		return 0;
+	};
+	fread(server->dataconf,sizec,1,tmpf);
+	server->dataconf[sizec]=0; // Hilobok Andrew ([email protected]) said to remove the -9 :)
+	fclose(tmpf);
+	
+	stat(server->conffile,&statf); // tested only on win
+	server->conffiletime=statf.st_mtime; // tested only on win
+
+	if((server->logfile=web_server_getconf(server,"LIBWEBSERVER","LOG"))) {
+		web_log("\nUsing logfile [%s]\n",server->logfile);
+		server->weblog=open_weblog(server->logfile);
+	} else {
+		web_log("\nLOG entry not found\r\n");
+		server->weblog=NULL;
+	};
+	if((tmp3=web_server_getconf(server,"LIBWEBSERVER","PORT"))) {
+		web_log("\nListen port [%s]\n",tmp3);
+		server->port=atoi(tmp3);
+		__ILWS_free(tmp3);
+	} else {
+		web_log("PORT entry not found\r\n");
+		server->port=0;
+	};
+#ifdef HAVE_OPENSSL
+	// Fetch SSL
+	if((tmp3=web_server_getconf(server,"LIBWEBSERVER","USESSL"))) {
+		if(tmp3[0]=='1') {
+			server->flags = server->flags | WS_USESSL;
+		}else if(tmp3[0]=='0') {
+			server->flags = server->flags & ~WS_USESSL;
+		} else {
+			fprintf(stderr,"[USESSL=] argument invalid\n");
+		};
+		__ILWS_free(tmp3);
+	} 
+	// Fetch CERTFILE
+	server->cert_file=web_server_getconf(server,"LIBWEBSERVER","CERTFILE");
+	server->mimefile=web_server_getconf(server,"LIBWEBSERVER","MIMEFILE");
+#endif
+	// Fetch LOCAL
+	if((tmp3=web_server_getconf(server,"LIBWEBSERVER","LOCAL"))) {
+		if(tmp3[0]=='1') {
+			server->flags = server->flags | WS_LOCAL;
+		} else if(tmp3[0]=='0') {
+			server->flags=server->flags & ~WS_LOCAL;
+		}else {
+			fprintf(stderr,"[LOCAL=] argument invalid\n");
+		};
+		__ILWS_free(tmp3);
+	} 
+	
+	return 1;
+};
+
+/*********************************************************************************************************/
+/*
+ * This function initialize one web_server handler
+ */
+int web_server_init(struct web_server *server,int port,const char *logfile,int flags) {
+#ifdef WIN32	
+	unsigned long t=IOC_INOUT;
+	WSADATA WSAinfo;
+	WSAStartup(2,&WSAinfo); // Damn w32 sockets
+#endif
+
+	current_web_server=server;
+	server->port=port;
+	server->conffile=NULL;
+	server->mimefile=NULL;
+	server->weblog=NULL;
+	server->usessl=0;
+	server->flags=flags;
+	server->dataconf="";
+	if((flags & WS_USEEXTCONF) == WS_USEEXTCONF) {
+		if(!(web_server_setup(server,logfile))) {
+#ifdef WIN32		
+			WSACleanup();
+#endif
+			return 0;
+		};
+		_logfile=server->weblog; // Set current log stream
+		web_log("%s using config file %s\n",_libwebserver_version,logfile);
+	};
+	// Create a listen socket port 'port' and listen addr (0) (all interfaces)
+	server->socket=__ILWS_listensocket((short)server->port,0);	
+	if(server->socket==-1) {
+		LWSERR(LE_NET);
+#ifdef WIN32		
+		WSACleanup();
+#endif
+		return 0;
+	};
+#ifdef WIN32
+	ioctlsocket(server->socket,FIONBIO,&t);  //non blocking sockets for win32
+#else
+	fcntl(server->socket,F_SETFL,O_NONBLOCK);
+#endif
+	// Setup FILE structure of logfile
+	if(logfile!=NULL && !((flags & WS_USEEXTCONF) == WS_USEEXTCONF)) {
+		server->logfile=__ILWS_malloc(strlen(logfile)+1);
+		memcpy(server->logfile,logfile,strlen(logfile));
+		server->logfile[strlen(logfile)]=0;
+		server->weblog=open_weblog(logfile); // Create File stream for log
+	};
+	
+	web_log("\n[%s] Server started at port %d (%s)\n",__ILWS_date(time(NULL),"%d/%b/%Y:%H:%M:%S %z"),server->port,_libwebserver_version);
+	
+	// Setup Flags
+	
+	// openssl
+#ifdef HAVE_OPENSSL	
+	if((server->flags & WS_USESSL) == WS_USESSL) {
+		web_log("[%s] (FLAG) Using SSL in connections\n",__ILWS_date(time(NULL),"%d/%b/%Y:%H:%M:%S %z"));	
+		web_log("                       +-- %s certificate file\n",server->cert_file);
+		SSL_load_error_strings();
+		SSLeay_add_ssl_algorithms(); 	
+		server->ctx=SSL_CTX_new (SSLv23_server_method());
+		if (SSL_CTX_use_certificate_file(server->ctx, server->cert_file, SSL_FILETYPE_PEM) <= 0) {
+			ERR_print_errors_fp(stderr);
+			exit(3);
+		}
+		if (SSL_CTX_use_PrivateKey_file(server->ctx, server->cert_file, SSL_FILETYPE_PEM) <= 0) {
+			ERR_print_errors_fp(stderr);
+			exit(4);
+		}                      
+	 	if (SSL_CTX_check_private_key(server->ctx)<= 0)  	 {
+			ERR_print_errors_fp(stderr);
+			exit(4);
+		};
+		server->usessl=1;
+	};
+#endif
+	if((server->flags & WS_LOCAL) == WS_LOCAL) {
+		web_log("[%s] (FLAG) Accepting only local connections\n",__ILWS_date(time(NULL),"%d/%b/%Y:%H:%M:%S %z"));	
+	};
+	server->client=__ILWS_init_client_list();										// Initializate client list
+	server->gethandler=__ILWS_init_handler_list();									// Initializate handlers list
+	web_server_addhandler(server,"* /libwebserver.gif",_web_server_logo,0);	// Add logo default handler
+
+#ifndef WIN32	
+	signal(SIGPIPE,SIG_IGN);
+#endif
+	return 1;
+}                            
+
+
+/*********************************************************************************************************/
+/*
+ * This function shuts down a running web server, frees its allocated memory,
+ * and closes its socket. If called on a struct web_server that has already
+ * been shut down, this is a noop.
+ */
+void web_server_shutdown(struct web_server *server) {
+	// free and close things in opposite order of web_server_init
+	
+	__ILWS_delete_handler_list(server->gethandler);
+	server->gethandler = NULL;
+	__ILWS_delete_client_list(server->client);
+	server->client = NULL;
+	
+	if(server->socket > 0) {
+#ifdef WIN32
+		closesocket(server->socket);
+#else
+		close(server->socket);
+#endif
+		server->socket = -1;
+	}
+	
+	if(server->weblog) {
+		fclose(server->weblog);
+		server->weblog = NULL;
+		__ILWS_free(server->logfile);
+		server->logfile = NULL;
+	}
+	
+#ifdef WIN32
+	WSACleanup();
+#endif
+}
+
+/*********************************************************************************************************/
+/*
+ * Core function, return 2 if no client to process, 1 if some client processed, 0 if error
+ */
+int web_server_run(struct web_server *server) {
+	struct web_client *client;
+	int rt;
+	int tsalen=0;
+	int tsocket=0;
+	struct sockaddr_in tsa;
+	_logfile=server->weblog;
+	current_web_server=server;
+	if(server->client->next==NULL) {
+		//if(__ILWS_newdata(server->socket)); // does nothing but act like usleep 
+	};
+// search for client		
+	tsalen=sizeof(client->sa);
+	tsocket=accept(server->socket,(struct sockaddr *)&tsa,&tsalen);
+	if(tsocket==-1) {
+#ifdef WIN32
+		if(WSAGetLastError()!=WSAEWOULDBLOCK) { 
+#else			
+		if(errno!=EAGAIN) { 
+#endif
+			fprintf(stderr,"What kind of error is this?\n"); // REMOVE
+			// client fucked up? warn somebody? (error or log or something?)
+			return 0; // don't process nothing
+		};
+	} else {
+		client=__ILWS_malloc(sizeof(struct web_client));
+		if(client==NULL) {
+			rt=shutdown(tsocket,SHUT_RDWR);
+#ifdef WIN32
+			rt=closesocket(tsocket); 
+#else
+			rt=close(tsocket); 
+#endif
+			LWSERR(LE_MEMORY);
+			return 0;
+		};
+		client->salen=tsalen;
+		client->socket=tsocket;
+		client->sa=tsa;
+#ifdef HAVE_OPENSSL
+		if((server->flags & WS_USESSL) == WS_USESSL) {
+			client->ssl = SSL_new(server->ctx);
+			SSL_set_fd(client->ssl,client->socket);
+			SSL_accept(client->ssl);
+		//client->cert = SSL_get_peer_certificate (client->ssl);
+		} else {
+			client->ssl=NULL;
+		};
+#endif
+		if(!__ILWS_add_client(server->client,client)) {
+			fprintf(stderr,"No client?\n"); // REMOVE
+			return 0;
+		}else {
+			web_log("%s - - [%s] Connected\n",inet_ntoa(client->sa.sin_addr),__ILWS_date(time(NULL),"%d/%b/%Y:%H:%M:%S %z")); //REMOBE			
+		};
+	};
+	// end search for client
+	client=server->client; // init list
+	if(!client->next) { // think of Rocco Carbone ([email protected])
+		return 2; // i don't need to process the list (nothing next) returns 2 if there is no client to process
+	};
+	while(client->next!=NULL) { // Process the client and swap to next;
+		current_web_client=client->next;
+		switch(client->next->stat) {
+			case 1: {
+				__ILWS_read_client(current_web_client);
+			};break;
+            case 2: {
+				__ILWS_process_client(current_web_client,server->gethandler);
+			};break;
+			case 4: {
+				__ILWS_output_client(current_web_client);	
+			};break;
+			case 5: {
+				__ILWS_delete_next_client(client); 
+				continue;
+			};break;
+		};
+		client=client->next;
+	
+	};   
+	return 1;  // return 1 if something processed
+}
+

+ 86 - 0
src/server.h

@@ -0,0 +1,86 @@
+/* Copyrights 2002 Luis Figueiredo ([email protected]) All rights reserved. 
+ *
+ * See the LICENSE file
+ *
+ * The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission.  Since few users ever read sources,
+ * credits must appear in the documentation.
+ *
+ * date: Sat Mar 30 14:44:42 GMT 2002
+ *
+ *
+ * --
+ *
+ */
+
+#ifndef _SERVER_H_
+#define _SERVER_H_
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif         
+
+#include <stdio.h>
+#include <signal.h>
+#include <time.h>
+
+
+#include "memory.h"
+#include "client.h"
+#include "gethandler.h"
+#include "socket.h"
+#include "error.h"
+
+#include "debug.h"
+
+#ifdef WIN32
+
+#define SHUT_RDWR SD_BOTH
+#endif
+
+
+
+
+extern char *_libwebserver_version;
+extern struct web_server *current_web_server; 
+struct web_server {
+	int socket;
+	unsigned int port;
+	char *logfile;
+	char *conffile;
+	time_t conffiletime; // tested only on win
+	char *mimefile;
+	char *dataconf;
+	FILE *weblog;
+	int flags;
+	struct gethandler *gethandler;
+	struct web_client *client;
+	int usessl;
+#ifdef HAVE_OPENSSL
+	char *cert_file;
+	SSL_CTX *ctx;
+#else
+	void *pad[2];
+#endif 
+
+};                                                                                                                             
+#define WS_LOCAL 1 // Can be only accessed by localhost
+#define WS_USESSL 2 // Use ssl conections (openssl lib required)      
+#define WS_USEEXTCONF 4 // Use external config file (new 0.5.0)
+
+
+void web_server_useSSLcert(struct web_server *,const char *); // Mandatory if WS_USESSL set
+void web_server_useMIMEfile(struct web_server*,const char *); // new on 0.5.2
+int web_server_init(struct web_server *,int,const char *,int);
+void web_server_shutdown(struct web_server *);
+int web_server_addhandler(struct web_server *,const char *,void (*)(),int);
+int web_server_aliasdir(struct web_server *, const char *, char *,int );
+int web_server_run(struct web_server *);
+int web_server_setup(struct web_server *server,const char *conffile); // (new on 0.5.0)
+char *web_server_getconf(struct web_server *, const char *,const char *); // (new on 0.5.0)
+
+
+#include "weblog.h"
+
+#endif
+

+ 74 - 0
src/socket.c

@@ -0,0 +1,74 @@
+/* Copyrights 2002 Luis Figueiredo ([email protected]) All rights reserved. 
+ *
+ * See the LICENSE file
+ *
+ * The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission.  Since few users ever read sources,
+ * credits must appear in the documentation.
+ *
+ * date: Sat Mar 30 14:44:42 GMT 2002
+ *
+ * -- Basic socket operations
+ *
+ */
+
+
+#include "socket.h"
+
+
+/*********************************************************************************************************/
+/*
+ * socket operations
+ */
+int __ILWS_newdata(int sock) {
+	int ret;
+	struct timeval tv;
+	fd_set rfds;
+	FD_ZERO(&rfds);
+	FD_SET((unsigned)sock,&rfds);
+	tv.tv_usec=2;
+	tv.tv_sec=0;
+	ret=select(sock+1,&rfds,NULL,NULL,&tv);
+	FD_CLR((unsigned)sock,&rfds);
+	return ret;
+}                                                                                                                             
+
+/*********************************************************************************************************/
+/*
+ * to add a listen socket
+ */
+int __ILWS_listensocket(short port, int saddr) {
+	struct sockaddr_in sa;
+	int ret;
+	int sockopt=1; /* Rocco Was Here */
+	sa.sin_addr.s_addr=saddr;
+	sa.sin_port=htons((short)port);
+	sa.sin_family=AF_INET;
+	ret=socket(AF_INET,SOCK_STREAM,6); // tcp
+	if(ret==-1) {
+		return -1;
+	};
+	/* Rocco Was Here */
+	setsockopt(ret,SOL_SOCKET,SO_REUSEADDR,(char *)&sockopt,sizeof(sockopt));  // why? Rocco
+
+	if(bind(ret,(struct sockaddr *)&sa,sizeof(sa))==-1) {
+		close(ret); /* Rocco Was Here */
+		return -1;
+	};
+
+	if(listen(ret,512)==-1) { // 512 backlog 
+		close(ret); /* Rocco Was Here */
+		return -1;
+	};
+	IFDEBUG(fprintf(stderr,"socket.c: Listen on port %d\n",port));
+	return ret;
+}
+
+/*********************************************************************************************************/
+/*
+ * as the read function
+ */
+int __ILWS_read(int sock,void *buf,size_t s) {
+	return recv(sock,buf,s,0); 
+}
+

+ 51 - 0
src/socket.h

@@ -0,0 +1,51 @@
+/* Copyrights 2002 Luis Figueiredo ([email protected]) All rights reserved. 
+ *
+ * See the LICENSE file
+ *
+ * The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission.  Since few users ever read sources,
+ * credits must appear in the documentation.
+ *
+ * date: Sat Mar 30 14:44:42 GMT 2002
+ *
+ *
+ * --
+ *
+ */
+
+#ifndef _SOCKET_H_
+#define _SOCKET_H_
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif         
+
+#include <stdio.h>
+#include <stdarg.h>
+
+#ifdef WIN32
+#include <winsock2.h>
+#include <io.h>
+#else
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <sys/time.h> // struct tv
+#include <sys/types.h>  // freebsd need it i gues that is no problem if other system includes it
+#endif
+
+
+
+
+
+#include "debug.h"
+
+extern int errno;
+
+int __ILWS_newdata(int);
+int __ILWS_listensocket(short, int);
+int __ILWS_read(int,void *,size_t);
+
+#endif
+

+ 155 - 0
src/utils.c

@@ -0,0 +1,155 @@
+/* Copyrights 2002 Luis Figueiredo ([email protected]) All rights reserved. 
+ *
+ * See the LICENSE file
+ *
+ * The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission.  Since few users ever read sources,
+ * credits must appear in the documentation.
+ *
+ * date: 19:49,07-49-2002
+ *
+ * -- description: utilitys
+ *
+ */
+
+#include "utils.h"
+
+/*********************************************************************************************************/
+/* 
+ * search a string in a string ignoring case
+ */
+char *__ILWS_stristr(char *str, const char *nedle) {
+	char *tmp1=str;
+	int ret=1;
+	int snedle=strlen(nedle),sstr=strlen(str);
+	if(strlen(str)<strlen(nedle))return NULL;
+	while((ret=strncasecmp(tmp1,nedle,snedle) && (unsigned int)(tmp1+snedle)<=(unsigned int) (str+sstr))) {
+		tmp1++;
+	};
+	if(strncasecmp(tmp1,nedle,snedle))
+		return NULL;
+	return tmp1;
+};
+
+/*********************************************************************************************************/
+/* 
+ * gives a new temporary path(file) name that doesn't exists
+ */
+char *_tmpnameprefix="";
+
+char *__ILWS_tmpfname() {
+	char *ret=NULL;
+	char *tmpdir=NULL;
+	char nam[TMPNAMESIZE+1];
+	int i;
+	struct stat foostat;
+	if(tmpdir==NULL) {
+		tmpdir=getenv("TEMP");
+	};
+	if(tmpdir==NULL) {
+		tmpdir=getenv("TMP");
+	};
+	if(tmpdir==NULL) {
+		tmpdir=getenv("TMPDIR");
+	};
+	if(tmpdir==NULL) {
+		tmpdir=P_tmpdir;  // defined in stdio.h
+	};
+	IFDEBUG(fprintf(stderr,"utils.c: Allocating temporary file name: "));
+	if(!(ret=__ILWS_malloc(strlen(tmpdir)+strlen(_tmpnameprefix)+TMPNAMESIZE+2))) {
+		LWSERR(LE_MEMORY);
+		return NULL;
+	};
+	srand(time(NULL)); // seed
+	do {
+		for(i=0;i<TMPNAMESIZE;i++) {
+			
+			nam[i]=(rand()%2)?(rand()%26)+'A':(rand()%26)+'a';
+		}
+		nam[i]=0;
+		snprintf(ret,strlen(tmpdir)+strlen(_tmpnameprefix)+TMPNAMESIZE+2,"%s/%s%s",tmpdir,_tmpnameprefix,nam); // include '0'
+		IFDEBUG(fprintf(stderr,"Temporary filename is: %s, stat:%d\n",ret,stat(ret,&foostat)));
+	}while((stat(ret,&foostat)!=-1) && (lstat(ret,&foostat)!=-1)); // redundancy if win32 // <- race condition?
+	return ret;
+};
+
+
+
+/*********************************************************************************************************/
+/*
+ * an date function
+ */
+#define DATE_MAX 100
+char __ILWS_datem[DATE_MAX];
+
+char *__ILWS_date(time_t t,const char *format) {
+	struct tm *tm;
+	tm=localtime(&t);
+	strftime(__ILWS_datem,DATE_MAX,format,tm);
+	return __ILWS_datem;
+}                    
+
+/*********************************************************************************************************/
+/* 
+ * wasn't me, base64decode
+ */
+static const unsigned char __ILWS_chtb[256] = {
+    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
+    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,
+    64,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
+    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64,
+    64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
+    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,
+    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64};          
+
+
+int __ILWS_base64decode(char *bufplain, const char *bufcoded){
+    int nb;
+    const unsigned char *in;
+    unsigned char *out;
+    int nprbytes;
+ 
+    in = (const unsigned char *) bufcoded;
+    while (__ILWS_chtb[*(in++)] <= 63);
+    nprbytes = (in - (const unsigned char *) bufcoded) - 1;
+    nb = ((nprbytes + 3) / 4) * 3;
+ 
+    out = (unsigned char *) bufplain;
+    in = (const unsigned char *) bufcoded;
+ 
+    while (nprbytes > 4) {
+        *(out++) =
+            (unsigned char) (__ILWS_chtb[*in] << 2 | __ILWS_chtb[in[1]] >> 4);
+        *(out++) =
+            (unsigned char) (__ILWS_chtb[in[1]] << 4 | __ILWS_chtb[in[2]] >> 2);
+        *(out++) =
+            (unsigned char) (__ILWS_chtb[in[2]] << 6 | __ILWS_chtb[in[3]]);
+        in += 4;
+        nprbytes -= 4;
+    }
+    if (nprbytes > 1) {
+        *(out++) =
+            (unsigned char) (__ILWS_chtb[*in] << 2 | __ILWS_chtb[in[1]] >> 4);
+    }
+    if (nprbytes > 2) {
+        *(out++) =
+            (unsigned char) (__ILWS_chtb[in[1]] << 4 | __ILWS_chtb[in[2]] >> 2);
+    }
+    if (nprbytes > 3) {
+        *(out++) =
+            (unsigned char) (__ILWS_chtb[in[2]] << 6 | __ILWS_chtb[in[3]]);
+    }
+ 
+    nb -= (4 - nprbytes) & 3;
+    return nb;
+}                                        
+

+ 59 - 0
src/utils.h

@@ -0,0 +1,59 @@
+/* Copyrights 2002 Luis Figueiredo ([email protected]) All rights reserved. 
+ *
+ * See the LICENSE file
+ *
+ * The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission.  Since few users ever read sources,
+ * credits must appear in the documentation.
+ *
+ * file: utils.h
+ *
+ * description: Header
+ *
+ * date: 19:50,07-50-2002
+ */
+
+#ifndef _UTILS_H_ 
+#define _UTILS_H_
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif         
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <ctype.h>
+
+#ifdef TM_IN_SYS_TIME
+#include <sys/time.h>
+#else
+#include <time.h>
+#endif
+
+#include "debug.h"
+#include "error.h"
+#include "memory.h"
+
+#ifdef WIN32
+
+#define strncasecmp strnicmp
+#define snprintf _snprintf
+#define lstat stat
+#define vsnprintf _vsnprintf
+
+#endif
+
+
+#define TMPNAMESIZE 8
+extern char *_tmpnameprefix;
+
+
+char *__ILWS_stristr(char *, const char *);
+char *__ILWS_tmpfname();
+int __ILWS_base64decode(char *, const char *);
+char *__ILWS_date(time_t,const char *);
+
+
+#endif

+ 129 - 0
src/web_server.h

@@ -0,0 +1,129 @@
+/* Copyrights 2002 Luis Figueiredo ([email protected]) All rights reserved. 
+ *
+ * See the LICENSE file
+ *
+ * The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission.  Since few users ever read sources,
+ * credits must appear in the documentation.
+ *
+ * Fri Dec 28 12:51:11 GMT 2001
+ *      Luis Figueiredo -- I Corrected the input to handle only data when \n\r(twice) is arrived
+ *
+ * Mon Feb 25 06:27:58 GMT 2002
+ *      Luis Figueiredo -- Many corrections and new functions were added, until today
+ *
+ * Mon Mar 25 14:46:13 GMT 2002
+ *      Luis Figueiredo -- wow, one month later..., discard web_server_addstr, and now process the stdout to server
+ *                         using a tmpfile for streaming (not so good, but :o))
+ * Wed Mar 27 18:59:10 GMT 2002
+ *      Luis Figueiredo -- using regex instead of fnmatch(fnmatch only appears becouse of apache, i didn't knew it)
+ * Mon Apr  8 15:04:31 GMT 2002
+ *	Luis Figueiredo -- Oh my.. kurt cobain is dead :o), restructured the code, separated into various files                                                                 
+ * Wed Apr 10 20:02:55 GMT 2002
+ *	Luis Figueiredo -- Make use of autoconf , removed open_memstream (doesn't work well w/ stdout structure on netbsd portability)
+ *                         linux slack 7.1 uses "extern FILE *stdout", netbsd uses "extern FILE __sF[]" so i cannot make use of pointers
+ * Mon Oct  7 16:56:15 GMT 2002
+ *      Luis Figueiredo -- Repaired some safe bugs, Added vars to stats proposes, inserted an liblogo, added debug instructions
+ *
+ *  VERSION 0.5.3
+ */
+
+#ifndef _WEB_SERVER_H_
+#define _WEB_SERVER_H_
+
+#include <stdio.h> // for struct FILE
+#include <time.h> // for time_t
+
+#ifdef __cplusplus
+extern "C"{
+#endif 
+
+extern char *_libwebserver_version;
+extern char *_tmpnameprefix;
+extern int WEBTIMEOUT;
+
+struct _MultiPart {
+	char *id;
+	char *data;
+	unsigned int size;
+	char *filename;
+	void *pad;
+};
+char *__Header(char *);
+char *__Query(char *);
+char *__Post(char *);
+struct _MultiPart __MultiPart(char *);
+char *__Cookie(char *);
+
+extern struct ClientInfo {
+	int outfd;
+	char *inetname;
+	char *request;
+	char *method;
+	char *user;
+	char *pass;
+	char *(*Header)(char *);
+	char *(*Query)(char *);
+	char *(*Post)(char *);
+	char *(*Cookie)(char *);
+	char *(*Conf)(char *,char *); // new on 0.5.0
+	struct _MultiPart (*MultiPart)(char *); 
+	void *__pad[9];
+
+} *ClientInfo;      // PROTOTYPE    
+
+struct web_server {
+	int socket;
+	unsigned int port;
+	char *logfile;
+	char *conffile;
+	time_t conffiletime; // tested only on win
+	char *mimefile;
+	char *dataconf;
+	FILE *weblog;
+	int flags;
+	struct gethandler *gethandler;
+	struct web_client *client;
+	int usessl;
+	void *pad[2];    // SSL pad
+};                                                                                                                             
+
+#define WS_LOCAL 1 	    // Can be only accessed by localhost (usefull for local programs gui's)
+#define WS_USESSL 2     // Use ssl conections (openssl lib required) (security transation) (there is no sense using WS_LOCAL & WS_USESSL together)
+#define WS_USEEXTCONF 4 // Use external config file (new 0.5.0)
+#define WS_DYNVAR 8     // Use dynamic variables on output (new 0.5.1)
+#define WS_USELEN 16     //Use Content-length calculator(new 0.5.1)
+
+
+void web_server_useSSLcert(struct web_server *,const char *);  // useless if not using openssl
+void web_server_useMIMEfile(struct web_server *,const char *); // new on 0.5.2
+int web_server_init(struct web_server *,int,const char *,int);
+void web_server_shutdown(struct web_server *);
+char *web_server_getconf(struct web_server *,char *,char *);
+int web_server_addhandler(struct web_server *,const char *,void (*)(),int);
+int web_server_aliasdir(struct web_server *, const char *,char *,int); // new on 0.5.2
+int web_server_run(struct web_server *);
+
+
+int web_client_addfile(char *);
+extern unsigned char GLOBALGIFPAL[256][3];
+void web_client_gifsetpalette(const char *);
+int web_client_gifoutput(char *,int,int,int);
+
+void web_client_setcookie(char *,char *,char *,char *, char *,int); // improved on 0.5.1
+void web_client_deletecookie(char *);                // improved on 0.5.1
+int web_client_setvar(char *,char *); //(new (0.5.1)
+char *web_client_getvar(char *);        //(new (0.5.1)
+int web_client_delvar(char *);        //(new (0.5.1)
+
+void web_client_HTTPdirective(char *);   
+void web_client_contenttype(char *); // 0.5.2
+void web_log(const char *,...);           
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+

+ 43 - 0
src/weblog.c

@@ -0,0 +1,43 @@
+/* Copyrights 2002 Luis Figueiredo ([email protected]) All rights reserved. 
+ *
+ * See the LICENSE file
+ *
+ * The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission.  Since few users ever read sources,
+ * credits must appear in the documentation.
+ *
+ * date: Sat Mar 30 14:44:42 GMT 2002
+ *
+ * -- web_log operations
+ *
+ */
+
+
+
+#include "weblog.h"
+
+FILE *_logfile=NULL;
+/*********************************************************************************************************/
+/*
+ * Open weblog file
+ */
+FILE *open_weblog(const char *logfile) {
+	FILE *ret;
+	ret=fopen(logfile,"a+");
+	_logfile=ret;
+	return ret;
+}
+
+/*********************************************************************************************************/
+/*
+ * Log to _logfile;
+ */
+void web_log(const char *fmt,...) {
+	va_list args;
+	if(_logfile) {
+		va_start(args,fmt);
+		vfprintf(_logfile,fmt,args);
+		va_end(args);
+		fflush(_logfile);
+	}
+}                 

+ 40 - 0
src/weblog.h

@@ -0,0 +1,40 @@
+/* Copyrights 2002 Luis Figueiredo ([email protected]) All rights reserved. 
+ *
+ * See the LICENSE file
+ *
+ * The origin of this software must not be misrepresented, either by
+ * explicit claim or by omission.  Since few users ever read sources,
+ * credits must appear in the documentation.
+ *
+ * date: Sat Mar 30 14:25:25 GMT 2002 
+ *
+ *  memory functions
+ */
+
+#ifndef _WEBLOG_H_
+#define _WEBLOG_H_
+
+
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#ifdef WIN32
+#define snprintf _snprintf
+#endif
+
+
+
+#include "debug.h"
+
+extern FILE *_logfile;
+
+void web_log(const char *,...);           
+FILE *open_weblog(const char *);
+char *mydate();
+#endif

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini