pygopherd-2.0.18.3+nmu4ubuntu1/0000775000000000000000000000000011047204732013037 5ustar pygopherd-2.0.18.3+nmu4ubuntu1/runtests.py0000664000000000000000000000335010762620505015304 0ustar #!/usr/bin/python # Python-based gopher server # Module: main test runner # COPYRIGHT # # Copyright (C) 2002 John Goerzen # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # END OF COPYRIGHT # import sys, profile # sys.path.insert("-1", "..") import unittest from pygopherd import * import pygopherd.protocols import pygopherd.protocols.ProtocolMultiplexerTest import pygopherd.protocols.baseTest import pygopherd.protocols.rfc1436Test import pygopherd.protocols import pygopherd.handlers.ZIP def suite(): tests = [initializationTest, GopherExceptionsTest, fileextTest, gopherentryTest, loggerTest, pipeTest, pygopherd.protocols.ProtocolMultiplexerTest, pygopherd.protocols.baseTest, pygopherd.protocols.rfc1436Test, pygopherd.handlers.ZIP ] suite = unittest.TestSuite() for module in tests: suite.addTest(unittest.findTestCases(module)) return suite if __name__ == '__main__': profile.run("unittest.main(defaultTest='suite')", 'profile.out') # unittest.main(defaultTest='suite') pygopherd-2.0.18.3+nmu4ubuntu1/COPYING0000664000000000000000000004311010762620505014074 0ustar GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 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. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. pygopherd-2.0.18.3+nmu4ubuntu1/TODO0000664000000000000000000000004110762620505013525 0ustar * Document new .gophermap files pygopherd-2.0.18.3+nmu4ubuntu1/README.windows0000664000000000000000000000166710762620505015425 0ustar Submitted by Grant D. Watson: ---------------------------------------------------------- Windows Installation: Download the tar.gz version of the package from the website. Make sure you have Python 2.2 or above installed; if not, download and install it from http://www.python.org/. Unzip the package in "C:\Program Files" (or another suitable directory). In WordPad (_not_ Notepad) open "C:\Program Files\pygopherd\conf\pygopherd.conf". Modify the file as follows: - Set detach = no - Comment out the pidfile line - Set servertype = ThreadingTCPServer - Set usechroot = no - Comment out the setuid and setgid lines - Set root to something appropriate - Set mimetypes = conf/mime.types - Set logmethod = none To run the server, open a DOS prompt and type the following commands: c: cd "\Program Files\pygopherd" python bin\pygopherd conf\pygopherd.conf To end the server you must press Ctrl-Alt-Del and tell Windows to end the task. pygopherd-2.0.18.3+nmu4ubuntu1/runtestsgui.py0000664000000000000000000000147210762620505016014 0ustar #!/usr/bin/python # COPYRIGHT # # Copyright (C) 2002 John Goerzen # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # END OF COPYRIGHT # import unittestgui unittestgui.main('runtests.suite') pygopherd-2.0.18.3+nmu4ubuntu1/Makefile0000664000000000000000000000413411047204436014502 0ustar # Copyright (C) 2002, 2003 John Goerzen # # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA clean: -python2.3 setup.py clean --all -rm -f `find . -name "*~"` -rm -f `find . -name "*.pyc"` -rm -f `find . -name "*.pygc"` -rm -f `find . -name "*.class"` -rm -f `find . -name "*.bak"` -rm -f `find . -name ".cache*"` -rm -f *.log *.aux *.dvi *.out *.jtex jadetex.cfg -find . -name auth -exec rm -vf {}/password {}/username \; -rm -rf build changelog: git log -M -C --find-copies-harder --name-status > ChangeLog docs: doc/pygopherd.8 doc/pygopherd.html doc/pygopherd.ps \ doc/pygopherd.pdf doc/pygopherd.txt doc/pygopherd.8: doc/pygopherd.sgml docbook2man doc/pygopherd.sgml docbook2man doc/pygopherd.sgml -rm manpage.links manpage.refs mv pygopherd.8 doc #doc/pygopherd.html: doc/pygopherd.sgml # docbook2html -u doc/pygopherd.sgml # mv pygopherd.html doc doc/pygopherd.html: doc/pygopherd.sgml docbook-2-html -s local doc/pygopherd.sgml mv doc/pygopherd-html/pygopherd.html doc/pygopherd.html rm -r doc/pygopherd-html #doc/pygopherd.ps: doc/pygopherd.8 # man -t -l doc/pygopherd.8 > doc/pygopherd.ps doc/pygopherd.ps: doc/pygopherd.sgml doc/book.sgml doc/manpage.sgml docbook-2-ps -q -O -V -O paper-size=Letter -s local=printlocal \ doc/book.sgml mv book.ps doc/pygopherd.ps doc/pygopherd.pdf: doc/pygopherd.ps ps2pdf doc/pygopherd.ps mv pygopherd.pdf doc doc/pygopherd.txt: groff -Tascii -man doc/pygopherd.8 | sed $$'s/.\b//g' > doc/pygopherd.txt pygopherd-2.0.18.3+nmu4ubuntu1/debian/0000775000000000000000000000000012701637640014267 5ustar pygopherd-2.0.18.3+nmu4ubuntu1/debian/dirs0000664000000000000000000000004512441621434015145 0ustar usr/bin usr/sbin usr/share/pygopherd pygopherd-2.0.18.3+nmu4ubuntu1/debian/rules0000775000000000000000000000447512701634643015361 0ustar #!/usr/bin/make -f # Sample debian/rules that uses debhelper. # GNU copyright 1997 to 1999 by Joey Hess. # Modified by John Goerzen # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 PYTHON=python PACKAGE=pygopherd ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS))) CFLAGS += -g endif ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS))) INSTALL_PROGRAM += -s endif configure: configure-stamp configure-stamp: dh_testdir # Add here commands to configure the package. #$(PYTHON) setup.py configure touch configure-stamp build: build-arch build-indep build-arch: build-stamp build-indep: build-stamp build-stamp: configure-stamp dh_testdir # Add here commands to compile the package. $(PYTHON) setup.py build #/usr/bin/docbook-to-man debian/pygopherd.sgml > pygopherd.1 touch build-stamp clean: dh_testdir dh_testroot rm -f build-stamp configure-stamp -rm -f doc/standards/rfc* # Add here commands to clean up after the build process. $(MAKE) clean dh_clean install: build dh_testdir dh_testroot dh_prep dh_installdirs # Add here commands to install the package into debian/pygopherd. #$(MAKE) install DESTDIR=$(CURDIR)/debian/pygopherd $(PYTHON) setup.py install --root=`pwd`/debian/$(PACKAGE) --no-compile --install-layout=deb # Build architecture-dependent files here. binary-arch: build install # We have nothing to do by default. # Build architecture-independent files here. binary-indep: build install dh_testdir dh_testroot # dh_installdebconf dh_installdocs mv debian/pygopherd/usr/bin/pygopherd \ debian/pygopherd/usr/sbin/pygopherd rm debian/pygopherd/etc/pygopherd/mime.types cp examples/gophermap debian/pygopherd/usr/share/pygopherd/gophermap cp pygfarm/*.pyg debian/pygfarm/usr/share/pygfarm chown root.root debian/pygfarm/usr/share/pygfarm/* chmod 0755 debian/pygfarm/usr/share/pygfarm/* dh_installexamples examples/* dh_installmenu # dh_installlogrotate # dh_installemacsen # dh_installpam # dh_installmime dh_installinit dh_installcron dh_installman doc/pygopherd.8 dh_installinfo # dh_undocumented dh_installchangelogs dh_python2 dh_link dh_strip dh_compress dh_fixperms # dh_makeshlibs dh_installdeb # dh_perl dh_shlibdeps dh_gencontrol dh_md5sums dh_builddeb binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install configure pygopherd-2.0.18.3+nmu4ubuntu1/debian/postinst0000664000000000000000000000402612441621434016072 0ustar #! /bin/sh # postinst script for pygopherd # # see: dh_installdeb(1) set -e # summary of how this script can be called: # * `configure' # * `abort-upgrade' # * `abort-remove' `in-favour' # # * `abort-deconfigure' `in-favour' # `removing' # # for details, see /usr/share/doc/packaging-manual/ # # quoting from the policy: # Any necessary prompting should almost always be confined to the # post-installation script, and should be protected with a conditional # so that unnecessary prompting doesn't happen if a package's # installation fails and the `postinst' is called with `abort-upgrade', # `abort-remove' or `abort-deconfigure'. case "$1" in configure) # Allow this part to fail. set +e UNAME=gopher HOMEDIR=/var/gopher if test -d $HOMEDIR; then HOMEDIREXISTS=yes; else HOMEDIREXISTS=no; fi if ! grep -q "^${UNAME}:.*${HOMEDIR}" /etc/passwd then adduser --system --home $HOMEDIR --group $UNAME else echo "Gopher account already in place; not modifying." fi if ! grep -q "^${UNAME}:" /etc/passwd then echo Failed to create user $UNAME exit 1 fi if ! grep -q \^${UNAME}: /etc/group then echo Failed to create group $UNAME exit 1 fi # Restore normal error checking set -e if [ `grep ^gopher: /etc/passwd | cut -d: -f7` = '/bin/false' ] ; then chsh -s /bin/sh gopher fi if [ "$HOMEDIREXISTS" = "no" ]; then if ! test -d $HOMEDIR; then mkdir $HOMEDIR fi cp /usr/share/pygopherd/gophermap $HOMEDIR/gophermap chown -R gopher.gopher $HOMEDIR fi ;; abort-upgrade|abort-remove|abort-deconfigure) ;; *) echo "postinst called with unknown argument \`$1'" >&2 exit 0 ;; esac # dh_installdeb will replace this with shell code automatically # generated by other debhelper scripts. #DEBHELPER# exit 0 pygopherd-2.0.18.3+nmu4ubuntu1/debian/postrm0000664000000000000000000000212010762620505015526 0ustar #! /bin/sh # postrm script for pygopherd # # see: dh_installdeb(1) set -e # summary of how this script can be called: # * `remove' # * `purge' # * `upgrade' # * `failed-upgrade' # * `abort-install' # * `abort-install' # * `abort-upgrade' # * `disappear' overwrit>r> # for details, see http://www.debian.org/doc/debian-policy/ or # the debian-policy package case "$1" in purge|remove) echo "Removing old .pyc files." # Clean up .pyc and .class files left around. rm -fr /usr/lib/python2.2/site-packages/pygopherd || true ;; upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) true ;; *) echo "postrm called with unknown argument \`$1'" >&2 exit 1 esac # dh_installdeb will replace this with shell code automatically # generated by other debhelper scripts. #DEBHELPER# exit 0 pygopherd-2.0.18.3+nmu4ubuntu1/debian/changelog0000664000000000000000000002644712701637640016156 0ustar pygopherd (2.0.18.3+nmu4ubuntu1) xenial; urgency=medium * debian/rules: - Remove legacy DH_COMPAT export. - Use dh_prep instead of dh_clean -k. - Add recommended build-arch and build-indep targets. - Remove example doc-base file. - Don't allow $(MAKE) clean to ignore errors. * debian/compat: Indicate compatibility level of 9. * debian/control: - Build-depend on debhelper (>= 9) and dh-python. - Move python to Build-Depends since clean needs it. - Depend on ${misc:Depends}. * debian/conffiles: Remove, since debhelper automatically adds conffiles in /etc. * debian/copyright: - Remove "(s)" from "Upstream Author(s)" to satisfy Lintian. - Replace old FSF address with new one. -- Logan Rosen Fri, 08 Apr 2016 04:40:46 +0000 pygopherd (2.0.18.3+nmu4) unstable; urgency=medium * Non-maintainer upload. * Copy gophermap from /usr/share, not /usr/share/doc (Closes: #771501) -- Cameron Norman Mon, 08 Dec 2014 17:25:38 -0800 pygopherd (2.0.18.3+nmu3) unstable; urgency=low * Non-maintainer upload. * Convert to dh_python2. (Closes: #616966) -- Andrea Colangelo Fri, 28 Jun 2013 18:08:31 +0200 pygopherd (2.0.18.3+nmu2) unstable; urgency=low * Non-maintainer upload. * Build-Depend on python >= 2.5.4 for install-layout=deb. -- Kumar Appaiah Mon, 19 Oct 2009 18:00:54 -0500 pygopherd (2.0.18.3+nmu1) unstable; urgency=low * Non-maintainer upload. * Fix "manipulates site-packages/ directly, failing with Python 2.6" Applied and uploaded Kumar's patch, thanks dude! (Closes: #547835) -- Bastian Venthur Sat, 17 Oct 2009 15:41:30 +0200 pygopherd (2.0.18.3) unstable; urgency=low * Now remove build directory in clean target. -- John Goerzen Fri, 08 Aug 2008 22:02:16 -0500 pygopherd (2.0.18.2) unstable; urgency=medium * Correct typo in debian/rules. Really get RFC out of Debian source package this time. Closes: #475376. -- John Goerzen Tue, 05 Aug 2008 08:40:10 -0500 pygopherd (2.0.18.1) unstable; urgency=low * Remove RFC from Debian source package. Closes: #475376. -- John Goerzen Thu, 01 May 2008 01:31:59 -0500 pygopherd (2.0.18) unstable; urgency=low * Move #DEBHELPER# section to end of postinst so that adduser gets run first. Fixes a bug introduced in 2.0.17. Closes: #475247. * Removed weird stuff from source tree * Acknowledge NMU. Closes: #469619. -- John Goerzen Thu, 10 Apr 2008 00:23:56 -0500 pygopherd (2.0.17-0.1) unstable; urgency=low * Non-maintainer upload to solve release goal. * Add LSB dependency header to init.d scripts (Closes: #469619). -- Petter Reinholdtsen Fri, 4 Apr 2008 20:18:22 +0200 pygopherd (2.0.17) unstable; urgency=high * Make sure python-central does its thing before the init script tries to start Python. Closes: #387663. -- John Goerzen Fri, 15 Sep 2006 14:01:50 -0500 pygopherd (2.0.16) unstable; urgency=medium * New config file option: timeout * Updated to latest Debian python policy (Closes: #380906) -- John Goerzen Mon, 11 Sep 2006 08:54:50 -0500 pygopherd (2.0.15) unstable; urgency=low * Fixed handling of interface config option. Closes: #357315, #361435. -- John Goerzen Tue, 9 May 2006 10:43:42 -0500 pygopherd (2.0.14) unstable; urgency=low * Fixed a bug where no subject line would crash the mailbox handler. * Updated ChangeLog. -- John Goerzen Thu, 22 Sep 2005 05:46:29 -0500 pygopherd (2.0.13) unstable; urgency=low * Applied patch from Tim to clean up some typos in the docs. * Manpage was missing from .deb. Fixed. -- John Goerzen Sat, 19 Feb 2005 12:05:48 -0600 pygopherd (2.0.12) unstable; urgency=low * Cleaner handling of connection reset by peer -- John Goerzen Sat, 15 Jan 2005 15:23:38 -0600 pygopherd (2.0.11) unstable; urgency=medium * Work around a bug that occurs when a type is missing. -- John Goerzen Fri, 14 Jan 2005 09:35:25 -0600 pygopherd (2.0.10) unstable; urgency=low * Some modifications to make more Windows friendly, based on patch from Grant D. Watson. -- John Goerzen Mon, 30 Aug 2004 14:49:15 -0500 pygopherd (2.0.9) unstable; urgency=low * Don't crash if simpletal is unavailable. -- John Goerzen Wed, 17 Dec 2003 11:26:14 -0600 pygopherd (2.0.8) unstable; urgency=low * Fixed a logic error in the Numb handling fix. -- John Goerzen Wed, 17 Dec 2003 08:43:38 -0600 pygopherd (2.0.7) unstable; urgency=low * Fixed UMN.py to properly handle Numb=. -- John Goerzen Wed, 17 Dec 2003 08:25:49 -0600 pygopherd (2.0.6) unstable; urgency=low * Updated debian/docs. -- John Goerzen Thu, 9 Oct 2003 16:46:37 -0500 pygopherd (2.0.5) unstable; urgency=low * Added build-dep on python2.3-dev. Closes: #213938. -- John Goerzen Thu, 9 Oct 2003 11:09:41 -0500 pygopherd (2.0.4) unstable; urgency=low * Eliminated outdated import of xreadlines, clearing up a warning with Python 2.3. -- John Goerzen Sun, 24 Aug 2003 17:23:41 -0500 pygopherd (2.0.3) unstable; urgency=low * Fixed a silly typo in wap.py. -- John Goerzen Sat, 23 Aug 2003 20:59:12 -0500 pygopherd (2.0.2) unstable; urgency=low * Can now autodetect many WAP browsers. -- John Goerzen Sat, 23 Aug 2003 17:29:20 -0500 pygopherd (2.0.1) unstable; urgency=low * Oops, a stray print was left over. -- John Goerzen Sat, 23 Aug 2003 15:04:19 -0500 pygopherd (2.0.0) unstable; urgency=low * New feature: WAP/WMP support! * HTTP bugfix: use \r\n line endings. * Debian: Updated for Python 2.3. * Virtual: now use | for selector sep (keep ? for legacy) for WAP compatibility. -- John Goerzen Sat, 23 Aug 2003 12:00:48 -0500 pygopherd (1.99.5) unstable; urgency=low * Introduced new "inode-like" caching system for ZIP files. Now, the first time a ZIP file is accessed, it will be scanned. Links will be resolved immediately. A dictionary tree is built up; values being either file offsets in the ZIP file or dictionaries (for subdirectories). This dictionary is then cached on-disk using a binary database and marshal algorithm derived from Python's shelve module. We do not need to use pickle for this task since we are saving only simple structures. The performance gain for large ZIP files using this method is tremendous. The only time a ZIP file's central directory structure must be scanned now is the very first time it is ever accessed. -- John Goerzen Thu, 13 Mar 2003 09:49:39 -0600 pygopherd (1.99.4) unstable; urgency=low * Wrote my own ZIP file reader and heavily optimized it. This reduced run times for certain torture cases from over 100 seconds to somewhere around 20, and others from over 200 seconds to around 80. -- John Goerzen Fri, 7 Mar 2003 16:03:35 -0600 pygopherd (1.99.3) unstable; urgency=low * Backed out ZIP content cache. Was slower than the ZIP file itself. -- John Goerzen Thu, 6 Mar 2003 15:43:03 -0600 pygopherd (1.99.2) unstable; urgency=low * Made some aggressive optimizations in the ZIP handler. -- John Goerzen Thu, 6 Mar 2003 15:34:08 -0600 pygopherd (1.99.1) unstable; urgency=low * Fixed a bug in html handler. -- John Goerzen Thu, 6 Mar 2003 11:26:14 -0600 pygopherd (1.99.0) unstable; urgency=low * Implemented virtual file system support. * Implemented VFS_Real, the VFS module for the on-disk filesystem (as was the only option in the past) * Implemented VFS_ZIP, the VFS module for ZIP archives. * New handler ZIP to work with VFS_ZIP. * Implemented symlink capabilities for VFS_ZIP. * Implemented directory symlink capabilities for VFS_ZIP. * Wrote extensive test battery for VFS_ZIP and VFS_ZIP's symlink handling. All tests pass. -- John Goerzen Wed, 5 Mar 2003 22:24:43 -0600 pygopherd (1.1.1) unstable; urgency=low * Added ability to serve up files ending in ".gophermap" as Gophermap files. -- John Goerzen Fri, 21 Feb 2003 15:14:03 -0600 pygopherd (1.1.0) unstable; urgency=low * Added new configuration option: advertisedport. * Removed TODO file (now contained in bug-tracking system) * Moved pygopherd.py to bin/pygopherd to make installation clearer and testing smoother. * Extensive new manual that thoroughly documents the system. * UMN Compatibility: type - will also hide things in the fashion of X. -- John Goerzen Thu, 08 Aug 2002 20:17:17 -0500 pygopherd (1.0.0) unstable; urgency=low * First release. Welcome, pygopherd. * Added URL type rewriting handler. * Fixed gophermap info-only lines that have no tabs. * UMN dir handler now keeps directories beginning with a . out of the directory list. * Shored up tests to work with Subversion. -- John Goerzen Wed, 17 Jul 2002 19:32:32 -0500 pygopherd (0.9.14) unstable; urgency=low * Fixed some more bugs -- HTMLParser. * Detect failure to allocate a socket and log it. And still scream about it. -- John Goerzen Tue, 2 Jul 2002 11:45:20 -0500 pygopherd (0.9.13) unstable; urgency=low * Added signal handlers so shutdowns work properly. -- John Goerzen Tue, 2 Jul 2002 11:03:18 -0500 pygopherd (0.9.12) unstable; urgency=low * Minor bugfixes. * Added support for detached operation and pidfile writing. -- John Goerzen Wed, 1 May 2002 11:46:19 -0500 pygopherd (0.9.11) unstable; urgency=low * Added support for searches in HTTP handler. * Added pygfarm package and a PYG. * Many bugfixes. -- John Goerzen Thu, 18 Apr 2002 12:23:09 -0500 pygopherd (0.9.10) unstable; urgency=low * Added handling of abstracts and other extended attributes. * More test cases. -- John Goerzen Mon, 15 Apr 2002 19:20:04 -0500 pygopherd (0.9.4) unstable; urgency=low * Moved security handling to the handler base. * Fixed bug in URL handling -- it works now. -- John Goerzen Fri, 12 Apr 2002 11:46:14 -0500 pygopherd (0.9.3) unstable; urgency=low * Fixed a bug that prevented proper startup. Fixed a lot of bugs with new HTTP code. -- John Goerzen Thu, 11 Apr 2002 16:41:02 -0500 pygopherd (0.9.2) unstable; urgency=low * More bugfixes and new testing code. -- John Goerzen Thu, 11 Apr 2002 14:34:43 -0500 pygopherd (0.9.1) unstable; urgency=low * Many routine bugfixes. -- John Goerzen Wed, 10 Apr 2002 19:31:13 -0500 pygopherd (0.9.0) unstable; urgency=low * Initial Release. Closes: #142221. -- John Goerzen Wed, 10 Apr 2002 08:58:31 -0500 pygopherd-2.0.18.3+nmu4ubuntu1/debian/init.d0000664000000000000000000000401110777416247015404 0ustar #! /bin/sh ### BEGIN INIT INFO # Provides: pygopherd # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 ### END INIT INFO # # skeleton example file to build /etc/init.d/ scripts. # This file should be used to construct scripts for /etc/init.d. # # Written by Miquel van Smoorenburg . # Modified for Debian GNU/Linux # by Ian Murdock . # # Version: @(#)skeleton 1.8 03-Mar-1998 miquels@cistron.nl # # This file was automatically customized by dh-make on Wed, 10 Apr 2002 08:58:31 -0500 PATH=/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/usr/sbin/pygopherd NAME=pygopherd DESC="Python Gopher Server" CONF=/etc/pygopherd/pygopherd.conf test -f $DAEMON || exit 0 set -e case "$1" in start) echo -n "Starting $DESC: " start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \ --exec $DAEMON -- $CONF echo "$NAME." ;; stop) echo -n "Stopping $DESC: " start-stop-daemon --oknodo --stop --quiet --pidfile /var/run/$NAME.pid echo "$NAME." ;; #reload) # # If the daemon can reload its config files on the fly # for example by sending it SIGHUP, do it here. # # If the daemon responds to changes in its config file # directly anyway, make this a do-nothing entry. # # echo "Reloading $DESC configuration files." # start-stop-daemon --stop --signal 1 --quiet --pidfile \ # /var/run/$NAME.pid --exec $DAEMON #;; restart|force-reload) # # If the "reload" option is implemented, move the "force-reload" # option to the "reload" entry above. If not, "force-reload" is # just the same as "restart". # echo -n "Restarting $DESC: " start-stop-daemon --stop --quiet --pidfile \ /var/run/$NAME.pid sleep 1 start-stop-daemon --start --quiet --pidfile \ /var/run/$NAME.pid --exec $DAEMON -- $CONF echo "$NAME." ;; *) N=/etc/init.d/$NAME # echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2 echo "Usage: $N {start|stop|restart|force-reload}" >&2 exit 1 ;; esac exit 0 pygopherd-2.0.18.3+nmu4ubuntu1/debian/copyright0000664000000000000000000000200412701637617016222 0ustar This package was debianized by John Goerzen on Wed, 10 Apr 2002 08:58:31 -0500. It was downloaded from http://quux.org/give-me-gopher/ Upstream Author: John Goerzen Copyright: Copyright (C) 2002-2008 John Goerzen 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; version 2 of the License. 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 St, Fifth Floor, Boston, MA 02110-1301, USA. Debian GNU/Linux may find the GNU General Public License, version 2, in /usr/share/common-licenses/GPL-2. pygopherd-2.0.18.3+nmu4ubuntu1/debian/compat0000664000000000000000000000000212701632626015464 0ustar 9 pygopherd-2.0.18.3+nmu4ubuntu1/debian/pygfarm.dirs0000664000000000000000000000002310762620505016607 0ustar /usr/share/pygfarm pygopherd-2.0.18.3+nmu4ubuntu1/debian/examples0000664000000000000000000000001310762620505016017 0ustar examples/* pygopherd-2.0.18.3+nmu4ubuntu1/debian/control0000664000000000000000000000327312701635657015705 0ustar Source: pygopherd Section: net Priority: optional Maintainer: Ubuntu Developers XSBC-Original-Maintainer: John Goerzen Build-Depends: debhelper (>= 9), python (>= 2.6.6-3~), dh-python Standards-Version: 3.5.2 Homepage: gopher://gopher.quux.org/1/devel/gopher/pygopherd Vcs-Git: git://git.complete.org/pygopherd Vcs-Browser: http://git.complete.org/pygopherd Package: pygopherd Architecture: all Depends: ${misc:Depends}, python, mime-support, logrotate, python-simpletal, ${python:Depends} Provides: gopher-server Description: Modular Multiprotocol Gopher/HTTP/WAP Server in Python This is an all-new, modern Gopher server. It can serve documents with Gopher+, standard Gopher (RFC1436), HTTP, and WAP -- all on the same port. Pygopherd features a modular extension system as well as loadable scripts and much more. It contains full support for UMN gopherd systems -- including .Links, .names, .cap, searches, etc. Pygopherd also supports Bucktooth features such as gophermap files and executables. In addition to all this, there are Pygopherd's own extra features. All features are fully customizable and can be enabled or disabled by editing /etc/pygopherd/pygopherd.conf. . This version of PyGopherd introduces WAP support. Package: pygfarm Architecture: all Depends: ${misc:Depends}, pygopherd (>= ${Source-Version}), python-dictclient (>= 1.0.1) Description: Collection of add-on modules for Pygopherd These add-on modules provide additional functionality for your Pygopherd server. . Included modules are: . dict.pyg: Interface to a dictd database . These are installed into /usr/share/pygfarm for you to link to as you like. pygopherd-2.0.18.3+nmu4ubuntu1/debian/docs0000664000000000000000000000013110762620505015132 0ustar ChangeLog doc/pygopherd.txt doc/pygopherd.ps doc/pygopherd.pdf doc/pygopherd.html README pygopherd-2.0.18.3+nmu4ubuntu1/debian/pygfarm.README.Debian0000664000000000000000000000052510762620505017773 0ustar pygfarm for Debian ------------------ This package installs its files into /usr/share/pygfarm. To actually make them visible to your server, you'll need to either symlink (if not running chroot) or copy (if running chroot) them into a path under your server root. -- John Goerzen , Wed, 10 Apr 2002 08:58:31 -0500 pygopherd-2.0.18.3+nmu4ubuntu1/testdata/0000775000000000000000000000000010762620505014653 5ustar pygopherd-2.0.18.3+nmu4ubuntu1/testdata/testdata.zip0000664000000000000000000000443510762620505017216 0ustar PKiU.kREADMEUT IyV>IyV>Ux%0 5@HЀd!H[>CP} 0 ̘K)W@CŘ,ptM`{DWTez~Bxk.{~PKiU.-0 .abstractUT IyV>IyV>Ux ,VTĤ⒢"@IjqIJbIBJfQjrI~QPKiU.9pygopherd/pipetest.shUT JyV>JyV>UxUͻ @F~wbyAX w̆@^/`9ժv,% 3fD2L*#X,@QYdhͥ9ϭE B6xwhN?V2zPKiU.pygopherd/pipetestdataUT JyV>JyV>Ux /J1 F`Ҙ PKiU.!&Ht(testarchive.tarUT IyV>IyV>Ux1 ADю=Ŝ@j؞xqQDaN``"F QAUі8mQFwk}) ޓ~[mki_]kPKiU.mtestarchive.tar.gzUT IyV>IyV>Ux`xze ۋ\L.lqȺ1onwcsaKv֏_ܸ^p vq\O}wWKyM]':z߃L,{OƯ ̢vÃAPKiU.mtestarchive.tgzUT IyV>IyV>Ux`xze ۋ\L.lqȺ1onwcsaKv֏_ܸ^p vq\O}wWKyM]':z߃L,{OƯ ̢vÃAPK iU.x testfile.txtUT IyV>IyV>UxTest PK iU.hwtestfile.txt.gzUT IyV>IyV>UxԵ< I-.xPK iU.gY))testfile.txt.gz.abstractUT IyV>IyV>UxThis is the abstract for testfile.txt.gz PK tf>UxZIPonly PKiU.k READMEUTIyV>UxPKiU.-0 .abstractUTIyV>UxPKiU.9  pygopherd/pipetest.shUTJyV>UxPKiU. pygopherd/pipetestdataUTJyV>UxPKiU.!&Ht( .testarchive.tarUTIyV>UxPKiU.m testarchive.tar.gzUTIyV>UxPKiU.m testarchive.tgzUTIyV>UxPK iU.x qtestfile.txtUTIyV>UxPK iU.hw testfile.txt.gzUTIyV>UxPK iU.gY)) testfile.txt.gz.abstractUTIyV>UxPK UxPK 7pygopherd-2.0.18.3+nmu4ubuntu1/testdata/testfile.txt0000664000000000000000000000000510762620505017226 0ustar Test pygopherd-2.0.18.3+nmu4ubuntu1/testdata/testdata2.zip0000664000000000000000000000440710762620505017277 0ustar PKiU.-0 .abstractUT IyV>IyV>Ux ,VTĤ⒢"@IjqIJbIBJfQjrI~QPKiU.kREADMEUT IyV>IyV>Ux%0 5@HЀd!H[>CP} 0 ̘K)W@CŘ,ptM`{DWTez~Bxk.{~PK xe. pygopherd/UT jff>eff>UxPKxe.pygopherd/pipetestdataUT eff>eff>Ux /J1 F`Ҙ PKxe.9pygopherd/pipetest.shUT eff>eff>UxUͻ @F~wbyAX w̆@^/`9ժv,% 3fD2L*#X,@QYdhͥ9ϭE B6xwhN?V2zPKiU.!&Ht(testarchive.tarUT IyV>IyV>Ux1 ADю=Ŝ@j؞xqQDaN``"F QAUі8mQFwk}) ޓ~[mki_]kPKiU.mtestarchive.tar.gzUT IyV>IyV>Ux`xze ۋ\L.lqȺ1onwcsaKv֏_ܸ^p vq\O}wWKyM]':z߃L,{OƯ ̢vÃAPKiU.mtestarchive.tgzUT IyV>IyV>Ux`xze ۋ\L.lqȺ1onwcsaKv֏_ܸ^p vq\O}wWKyM]':z߃L,{OƯ ̢vÃAPK iU.x testfile.txtUT IyV>IyV>UxTest PK iU.hwtestfile.txt.gzUT IyV>IyV>UxԵ< I-.xPK iU.gY))testfile.txt.gz.abstractUT IyV>IyV>UxThis is the abstract for testfile.txt.gz PKiU.-0 .abstractUTIyV>UxPKiU.k iREADMEUTIyV>UxPK xe. A pygopherd/UTjff>UxPKxe. Jpygopherd/pipetestdataUTeff>UxPKxe.9 큢pygopherd/pipetest.shUTeff>UxPKiU.!&Ht( ktestarchive.tarUTIyV>UxPKiU.m !testarchive.tar.gzUTIyV>UxPKiU.m testarchive.tgzUTIyV>UxPK iU.x testfile.txtUTIyV>UxPK iU.hw testfile.txt.gzUTIyV>UxPK iU.gY)) Mtestfile.txt.gz.abstractUTIyV>UxPK 0pygopherd-2.0.18.3+nmu4ubuntu1/testdata/testarchive.tar.gz0000664000000000000000000000020610762620505020321 0ustar Ե<1 ADю=Ŝ@j؞xqQDaN``"F QAUі8mQFwk}) ޓ~[mki_]k!&H(pygopherd-2.0.18.3+nmu4ubuntu1/testdata/testfile.txt.gz.abstract0000664000000000000000000000005110762620505021450 0ustar This is the abstract for testfile.txt.gz pygopherd-2.0.18.3+nmu4ubuntu1/testdata/ziptorture.zip0000664000000000000000000000273510762620505017635 0ustar PK 1e.UMN/UT f>f>UxPK e.^ UMN/test.txtUT f>f>UxThis is a test file. PK e. UMN/.cap/UT f>f>UxPK e.} HUMN/.cap/test.txtUT f>f>UxName=Test File PKe.r+78 UMN/.LinksUT "f>"f>Ux H,ɰ/.-,-/JKM |2Jl B* Rm PK e.buck/UT cf>'f>UxPK Ѱe. buck/test.txtUT If>If>UxFoo PKe.i03buck/gophermapUT cf>cf>Ux3I-.QpI,J*J KK+99 2R A"@s.PK ʰe.&h,&test.gophermapUT ;f>;f>Ux0Test File test.txt PK ˰e.test.txtUT >f>>f>UxFoo PK 1e. AUMN/UTf>UxPK e.^ 7UMN/test.txtUTf>UxPK e. AUMN/.cap/UTf>UxPK e.} H UMN/.cap/test.txtUTf>UxPKe.r+78 UMN/.LinksUT"f>UxPK e. Abuck/UTcf>UxPK Ѱe. buck/test.txtUTIf>UxPKe.i03  buck/gophermapUTcf>UxPK ʰe.&h,& {test.gophermapUT;f>UxPK ˰e. test.txtUT>f>UxPK pygopherd-2.0.18.3+nmu4ubuntu1/testdata/.abstract0000664000000000000000000000006010762620505016453 0ustar This is the abstract for the testdata directory.pygopherd-2.0.18.3+nmu4ubuntu1/testdata/testarchive.tgz0000664000000000000000000000020610762620505017720 0ustar Ե<1 ADю=Ŝ@j؞xqQDaN``"F QAUі8mQFwk}) ޓ~[mki_]k!&H(pygopherd-2.0.18.3+nmu4ubuntu1/testdata/symlinktest.zip0000664000000000000000000000312610762620505017767 0ustar PK xf./2(n linked.txtUT Sg>Sg>Uxreal.txtPK xf.- linktosubdirUT Sg>Sg>UxsubdirPK »e.<real.txtUT f>f>UxTest. PK xf.subdir/UT hg>f>UxPK xf.K subdir/linkedabs.txtUT hg>hg>Ux/real.txtPK xf.j subdir/linkedrel.txtUT Sg>Sg>Ux../real.txtPK xf.]subdir/linked2.txtUT Sg>Sg>Ux../subdir2/real2.txtPK xf.8z subdir/linktosubdir2UT Sg>Sg>Ux../subdir2PK xf.Bsubdir/linktoselfUT Sg>Sg>Ux.PK ֻe.subdir2/UT f>f>UxPK ֻe.QVsubdir2/real2.txtUT f>f>Uxasdf PK xf./2(n linked.txtUTSg>UxPK xf.- ElinktosubdirUTSg>UxPK »e.< real.txtUTf>UxPK xf. Asubdir/UThg>UxPK xf.K  subdir/linkedabs.txtUThg>UxPK xf.j  Usubdir/linkedrel.txtUTSg>UxPK xf.] subdir/linked2.txtUTSg>UxPK xf.8z  subdir/linktosubdir2UTSg>UxPK xf.B Qsubdir/linktoselfUTSg>UxPK ֻe. Asubdir2/UTf>UxPK ֻe.QV subdir2/real2.txtUTf>UxPK &pygopherd-2.0.18.3+nmu4ubuntu1/testdata/testfile.txt.gz0000664000000000000000000000003110762620505017644 0ustar Ե< I-.xpygopherd-2.0.18.3+nmu4ubuntu1/testdata/testarchive.tar0000664000000000000000000002400010762620505017700 0ustar testfile.txt0100644000175000017500000000000507455345341013674 0ustar jgoerzenjgoerzenTest pygopherd-2.0.18.3+nmu4ubuntu1/testdata/README0000664000000000000000000000021610762620505015532 0ustar This directory contains data for the unit tests. Some tests are dependant upon the precise length of files; those files are added with -kb. pygopherd-2.0.18.3+nmu4ubuntu1/testdata/pygopherd/0000775000000000000000000000000010762620505016654 5ustar pygopherd-2.0.18.3+nmu4ubuntu1/testdata/pygopherd/pipetest.sh0000664000000000000000000000026110762620505021044 0ustar #!/bin/bash # Simple script to echo back what came in. echo "Starting" read DATALINE while test -n "$DATALINE" ; do echo "Got [$DATALINE]" read DATALINE done echo "Ending" pygopherd-2.0.18.3+nmu4ubuntu1/testdata/pygopherd/pipetestdata0000664000000000000000000000002210762620505021260 0ustar Word1 Word2 Word3 pygopherd-2.0.18.3+nmu4ubuntu1/setup.py0000664000000000000000000000272210762620505014557 0ustar #!/usr/bin/env python2.3 # $Id: setup.py,v 1.6 2002/04/11 21:12:12 jgoerzen Exp $ # Python-based gopher server # Module: installer # COPYRIGHT # # Copyright (C) 2002 John Goerzen # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # END OF COPYRIGHT # from distutils.core import setup import pygopherd.version setup(name = "pygopherd", version = pygopherd.version.versionstr, description = pygopherd.version.description, author = pygopherd.version.author, author_email = pygopherd.version.author_email, url = pygopherd.version.homepage, packages = ['pygopherd', 'pygopherd.handlers', 'pygopherd.protocols'], scripts = ['bin/pygopherd'], data_files = [ ('/etc/pygopherd', ['conf/pygopherd.conf', 'conf/mime.types'] ) ], license = pygopherd.version.license ) pygopherd-2.0.18.3+nmu4ubuntu1/bin/0000775000000000000000000000000010762620505013612 5ustar pygopherd-2.0.18.3+nmu4ubuntu1/bin/pygopherd0000664000000000000000000000175010762620505015541 0ustar #!/usr/bin/python2.3 # Python-based gopher server # COPYRIGHT # # Copyright (C) 2002 John Goerzen # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # END OF COPYRIGHT # # from pygopherd import * import sys conffile = '/etc/pygopherd/pygopherd.conf' if len(sys.argv) > 1: conffile = sys.argv[1] s = initialization.initeverything(conffile) s.serve_forever() pygopherd-2.0.18.3+nmu4ubuntu1/ChangeLog0000664000000000000000000045221410777416247014640 0ustar commit 7e72d16dddc03f87c224e385531252836caf73ce Author: John Goerzen Date: Thu Apr 10 08:55:27 2008 -0500 Added Homepage and VCS lines M debian/control commit 8d47815ee9c090a402dbc28c17f5073ada561293 Author: John Goerzen Date: Thu Apr 10 08:53:09 2008 -0500 Prepping 2.0.18 M debian/changelog M debian/copyright M pygopherd/version.py commit 94f54dcd30bc5dec43c2403d725dc766b6f8a241 Author: John Goerzen Date: Thu Apr 10 08:52:27 2008 -0500 Now generate ChangeLog from Git M Makefile commit e023605125acc6533aea01cf23a05c6432d6931c Author: John Goerzen Date: Thu Apr 10 00:23:26 2008 -0500 Move #DEBHELPER# section to end of postinst so that adduser gets run first. Fixes a bug introduced in 2.0.17. Closes: #475247. M debian/postinst commit 5697f2243c1bbdbeb10a6c09e690d30fe00f3cda Author: John Goerzen Date: Thu Apr 10 00:20:48 2008 -0500 Removed weird stuff from source tree D _darcs/current/COPYING D _darcs/current/ChangeLog D _darcs/current/Makefile D _darcs/current/README D _darcs/current/README.windows D _darcs/current/TODO D _darcs/current/bin/pygopherd D _darcs/current/conf/mime.types D _darcs/current/conf/pygopherd.conf D _darcs/current/debian/changelog D _darcs/current/debian/conffiles D _darcs/current/debian/control D _darcs/current/debian/copyright D _darcs/current/debian/dirs D _darcs/current/debian/docs D _darcs/current/debian/ex.package.doc-base D _darcs/current/debian/examples D _darcs/current/debian/init.d D _darcs/current/debian/postinst D _darcs/current/debian/postrm D _darcs/current/debian/pycompat D _darcs/current/debian/pygfarm.README.Debian D _darcs/current/debian/pygfarm.dirs D _darcs/current/debian/rules D _darcs/current/doc/book.sgml D _darcs/current/doc/manpage.sgml D _darcs/current/doc/pygopherd.8 D _darcs/current/doc/pygopherd.html D _darcs/current/doc/pygopherd.pdf D _darcs/current/doc/pygopherd.ps D _darcs/current/doc/pygopherd.sgml D _darcs/current/doc/pygopherd.txt D _darcs/current/doc/quickstart.sgml D _darcs/current/doc/standards/Gopher+.txt D _darcs/current/doc/standards/gophermap.txt D _darcs/current/doc/standards/rfc1436.txt D _darcs/current/doc/standards/url.txt D _darcs/current/examples/gophermap D _darcs/current/examples/talsample.html.tal D _darcs/current/local.dsl D _darcs/current/printlocal.dsl D _darcs/current/pygfarm/dict.pyg D _darcs/current/pygopherd/GopherExceptions.py D _darcs/current/pygopherd/GopherExceptionsTest.py D _darcs/current/pygopherd/__init__.py D _darcs/current/pygopherd/fileext.py D _darcs/current/pygopherd/fileextTest.py D _darcs/current/pygopherd/gopherentry.py D _darcs/current/pygopherd/gopherentryTest.py D _darcs/current/pygopherd/handlers/HandlerMultiplexer.py D _darcs/current/pygopherd/handlers/UMN.py D _darcs/current/pygopherd/handlers/ZIP.py D _darcs/current/pygopherd/handlers/__init__.py D _darcs/current/pygopherd/handlers/base.py D _darcs/current/pygopherd/handlers/dir.py D _darcs/current/pygopherd/handlers/file.py D _darcs/current/pygopherd/handlers/gophermap.py D _darcs/current/pygopherd/handlers/html.py D _darcs/current/pygopherd/handlers/mbox.py D _darcs/current/pygopherd/handlers/pyg.py D _darcs/current/pygopherd/handlers/scriptexec.py D _darcs/current/pygopherd/handlers/tal.py D _darcs/current/pygopherd/handlers/url.py D _darcs/current/pygopherd/handlers/virtual.py D _darcs/current/pygopherd/initialization.py D _darcs/current/pygopherd/initializationTest.py D _darcs/current/pygopherd/logger.py D _darcs/current/pygopherd/loggerTest.py D _darcs/current/pygopherd/pipe.py D _darcs/current/pygopherd/pipeTest.py D _darcs/current/pygopherd/protocols/ProtocolMultiplexer.py D _darcs/current/pygopherd/protocols/ProtocolMultiplexerTest.py D _darcs/current/pygopherd/protocols/__init__.py D _darcs/current/pygopherd/protocols/base.py D _darcs/current/pygopherd/protocols/baseTest.py D _darcs/current/pygopherd/protocols/enhanced.py D _darcs/current/pygopherd/protocols/gopherp.py D _darcs/current/pygopherd/protocols/http.py D _darcs/current/pygopherd/protocols/rfc1436.py D _darcs/current/pygopherd/protocols/rfc1436Test.py D _darcs/current/pygopherd/protocols/wap.py D _darcs/current/pygopherd/sighandlers.py D _darcs/current/pygopherd/testutil.py D _darcs/current/pygopherd/version.py D _darcs/current/pygopherd/zipfile.py D _darcs/current/runtests.py D _darcs/current/runtestsgui.py D _darcs/current/setup.py D _darcs/current/testdata/.abstract D _darcs/current/testdata/README D _darcs/current/testdata/pygopherd/pipetest.sh D _darcs/current/testdata/pygopherd/pipetestdata D _darcs/current/testdata/symlinktest.zip D _darcs/current/testdata/testarchive.tar D _darcs/current/testdata/testarchive.tar.gz D _darcs/current/testdata/testarchive.tgz D _darcs/current/testdata/testdata.zip D _darcs/current/testdata/testdata2.zip D _darcs/current/testdata/testfile.txt D _darcs/current/testdata/testfile.txt.gz D _darcs/current/testdata/testfile.txt.gz.abstract D _darcs/current/testdata/ziptorture.zip D _darcs/inventories/20050416164836-c2a52-faaa46e043b957fa7c33db1a90c3f43df219aa78.gz D _darcs/inventory D _darcs/patches/20020325202914-a5eff-469b21deb5260890fde51aa8f7a85233ce1e0a2c.gz D _darcs/patches/20020325205511-a5eff-d2458f249f2a1300835074aa6bd597965bc1fb95.gz D _darcs/patches/20020325210811-a5eff-d201e4421abe1803abe746eda719db7567b268da.gz D _darcs/patches/20020325212953-a5eff-95dc54d7be5cb5160a9a54bcb46d9c66d8f4e79f.gz D _darcs/patches/20020325221758-a5eff-180e17ea4e4f6fbd90239fc9bd81fcbc9113ddbd.gz D _darcs/patches/20020325232109-a5eff-c135432007cf15c3dd1518dae92c383dffc4e857.gz D _darcs/patches/20020325232741-a5eff-b61771df7f56e413a0d1dd7109e54d5f57a48dc1.gz D _darcs/patches/20020326022726-a5eff-01f7c7497719d2afafc454fab7c45a8c837d7b9a.gz D _darcs/patches/20020326024707-a5eff-16fec0d96b3f96c53a33e2ba4d36310dc08c2a1b.gz D _darcs/patches/20020326050158-a5eff-1a7123df197f25a05f25c393889f8a831769ed21.gz D _darcs/patches/20020326053202-a5eff-74e09c227715f89a42e1b81688f57ba87be80b36.gz D _darcs/patches/20020326192415-a5eff-0bf3a1d864fe8ff70084c10614eafe255478e3cb.gz D _darcs/patches/20020326200939-a5eff-c713741dbaf918f83611dea3aa4cd010f30bd011.gz D _darcs/patches/20020326202920-a5eff-ecad96bef17db83ecd6695f0fffd19caf4dc98e7.gz D _darcs/patches/20020326203450-a5eff-b1be3ff1de77f0247c2acb04bee21c1bdd74f099.gz D _darcs/patches/20020326210905-a5eff-51463402eac0e91f169ded8ea3257ef99d9eed08.gz D _darcs/patches/20020326211756-a5eff-d2de10a539680344e148d89fa2c77bd46dc79b75.gz D _darcs/patches/20020326212556-a5eff-90d215033625fad3f6550dd94412542f1d0f89b6.gz D _darcs/patches/20020326213422-a5eff-a5b9205dd3ef3d9c5562d69a33f63ac10aca0463.gz D _darcs/patches/20020326214636-a5eff-dec84991cc2d3f025c79cdd91c5bc29184d986a7.gz D _darcs/patches/20020326221231-a5eff-8f6b65cb5dfead50da838d0ac4e349e50eb1c10c.gz D _darcs/patches/20020326221932-a5eff-dcbd08557f5a8a8e8f38d936f5a22de1fe765b11.gz D _darcs/patches/20020326222458-a5eff-4c24bdfb9beb0be7c0cfc5a56ebf3a56ce274c9c.gz D _darcs/patches/20020326224542-a5eff-e39b65a5550447254f554660fd2c7eb83a481091.gz D _darcs/patches/20020326235911-a5eff-f1070972b8ef7cc13410d279308071ecafbc8bff.gz D _darcs/patches/20020327001727-a5eff-62a29c13ecd4b744a0a57046e0b1eaeb9ef299b7.gz D _darcs/patches/20020327003014-a5eff-c403c16b158475f088ab641e71452b4def4c9023.gz D _darcs/patches/20020327005258-a5eff-12a2c875852c01bba497e5d4e102016202e15306.gz D _darcs/patches/20020327012727-a5eff-77d1113b2a9be98b5934b56966ccfe6173bbab7a.gz D _darcs/patches/20020327021001-a5eff-bf7515e1c6938bf2c4e70e03fe27385f55860502.gz D _darcs/patches/20020327021714-a5eff-db912f25f3270d64f5608f8b1835ae51de2bf9be.gz D _darcs/patches/20020327024416-a5eff-c7410d98e4969dc185754391fdc926b753367b72.gz D _darcs/patches/20020327054147-a5eff-268d18315b3a596fa656bde29ef4c04f5211c07c.gz D _darcs/patches/20020327181900-a5eff-be4fda24666184846acfb094437ff6b63475e196.gz D _darcs/patches/20020327191617-a5eff-286e984ed14c5d1bf5638db5332ed91f668c110c.gz D _darcs/patches/20020327212458-a5eff-a23cc6eed1df086b2308481ab6bad6362f594f45.gz D _darcs/patches/20020327214053-a5eff-517521ec150f3729a4cdd87bdc5bf339ab47b6b6.gz D _darcs/patches/20020404204103-a5eff-3b2e93caf3e6351a12605b5ab015949ea69af5da.gz D _darcs/patches/20020404225112-a5eff-f12a228d86b1f3d7014b2d4d4b8ce18586bbeb65.gz D _darcs/patches/20020404231239-a5eff-f630dffa16818eec1f4ff518669e7282e5b12327.gz D _darcs/patches/20020404232956-a5eff-969ee772649fb14c71e67cd0f7d677eb1bc5eaa2.gz D _darcs/patches/20020404233902-a5eff-7ccd50bacaa7007b09a03faf1cdff19e50700e47.gz D _darcs/patches/20020405002757-a5eff-45af4edb9447aba3f6d43ef134e95bdc8ad38f86.gz D _darcs/patches/20020405003737-a5eff-8a2d403efa9f483de21676114bd929616afbbe5b.gz D _darcs/patches/20020405005148-a5eff-548766135b69ddd9a276d6e1312addb448ddd51c.gz D _darcs/patches/20020405012027-a5eff-172bc1f33a515516dec6980f82f847434c4ba3c4.gz D _darcs/patches/20020405013658-a5eff-42796131b4ec90d54900ede52976a12e48b6d5a2.gz D _darcs/patches/20020405014951-a5eff-322191bd68465724c1a03affc342bcc12e74e523.gz D _darcs/patches/20020405015557-a5eff-60f1a192439e7eba117913273f9cafa0862b7d89.gz D _darcs/patches/20020405020522-a5eff-2a36bb811f7c7e35138a3f4dcd99ab807e4bb5b2.gz D _darcs/patches/20020405202733-a5eff-0da872724d34110d0598f665b9d6f89a16b0c69a.gz D _darcs/patches/20020405203239-a5eff-ab70f912dbf4073da928c23f2e69731347b573e7.gz D _darcs/patches/20020405211249-a5eff-f48c67fcf106fd12d08891ac1563434bdde09908.gz D _darcs/patches/20020405215159-a5eff-c57b0f35b90f55cb4932247ab46db5ed390214bf.gz D _darcs/patches/20020405215830-a5eff-fc51a78e1fcfee797a664710c1e6d80a2bb1c7c7.gz D _darcs/patches/20020405224300-a5eff-fb72449173e807a0b77d51142c0bf227e60a490f.gz D _darcs/patches/20020406001352-a5eff-88fe9e25b997740a213924599f58a86be545b441.gz D _darcs/patches/20020406002411-a5eff-6975ebde7182126cb4d1c8c2542923d38850fe1c.gz D _darcs/patches/20020406003906-a5eff-ab9a32f5a69b1af53fe64d89915c046264efe391.gz D _darcs/patches/20020406005130-a5eff-0eb500d5029cdc779b383e46534f478b1471adba.gz D _darcs/patches/20020406010958-a5eff-2be2466b2fd50b91bb8ff005bc7db09850543950.gz D _darcs/patches/20020406015956-a5eff-406ac734fa7db46aa3e547318a5df16dbb674ff9.gz D _darcs/patches/20020406022355-a5eff-2450fffbe97cb812f188698f94534898cbec8a20.gz D _darcs/patches/20020406045550-a5eff-2cf3255fe3170b7d5c176a5075f19cb7c1b26349.gz D _darcs/patches/20020406082526-a5eff-5b9466830c142eddf737eef61bebc83a2c80ff06.gz D _darcs/patches/20020407013106-a5eff-9bddb324cad47698ef8e100a978f842e406647c8.gz D _darcs/patches/20020407020821-a5eff-6578e20bf3b1532d74e20a46a6ab7fb94dd80f49.gz D _darcs/patches/20020409002212-a5eff-dee1d9715754831f03217ca6a2e91cef8eed6448.gz D _darcs/patches/20020409013627-a5eff-094871358e209d420412327ef842fa85b7e17efd.gz D _darcs/patches/20020410004552-a5eff-a2b2da5253ed26e38a5664b7838fb075f2a0c243.gz D _darcs/patches/20020410011855-a5eff-065eeed224b3bccbed1eeb7c1fd5589a30f54ac7.gz D _darcs/patches/20020410014231-a5eff-4e7438c48e4640be33c27a67c722dd0dd6eeed93.gz D _darcs/patches/20020410020948-a5eff-ac66fb95408570d306a6e69cca68a5809a5fabb1.gz D _darcs/patches/20020410022641-a5eff-8e095e7ef65a1404088d4ac977b5009d84e0de50.gz D _darcs/patches/20020410074434-a5eff-7fa62126adc35d5e8a512f694c029135d8b3d318.gz D _darcs/patches/20020410083115-a5eff-b95fbd84f61b0632d0c0fe864eb99e8a17d1100b.gz D _darcs/patches/20020410185714-a5eff-fa47451a29079766703ae1e146d282465369445f.gz D _darcs/patches/20020410191058-a5eff-f8db157a65a91d0ab5f41571372aa02540da7618.gz D _darcs/patches/20020410201316-a5eff-c387879fbc7be8c6dff173477292bab672bd5d87.gz D _darcs/patches/20020410202043-a5eff-88e802d73b423e149360200474f6c0028f3ce8b5.gz D _darcs/patches/20020410202703-a5eff-e67959ed5de56a69b126bde412b83596980a7ec5.gz D _darcs/patches/20020410204153-a5eff-56e47055b4889537f7f2b1e34b3471e5294e8399.gz D _darcs/patches/20020410210715-a5eff-64607913769a8a6f9113ed159814c7a57a337607.gz D _darcs/patches/20020410212739-a5eff-b6a69e3dcb68b05ff347b2a688fba5272581fa17.gz D _darcs/patches/20020410220336-a5eff-2d8790f6b8835722941a08e6d4bed92da36dcc9e.gz D _darcs/patches/20020410221522-a5eff-f21935e6266ff13528d62448ff4b7aeda195fbdf.gz D _darcs/patches/20020410233824-a5eff-6ad551a5f9abf472dc2a2abb54cdf4ae39b1dddf.gz D _darcs/patches/20020411001916-a5eff-b44c1e9573d4955ac328b44f7e0f016cb2445a55.gz D _darcs/patches/20020411002650-a5eff-01e88f9713e63459645fde825e6bb9f439424937.gz D _darcs/patches/20020411004309-a5eff-a69170bfbd7fbd9824670ac534eed34b11763d0b.gz D _darcs/patches/20020411010513-a5eff-930432050ce7b66791da6a3d54d8614142efcdef.gz D _darcs/patches/20020411011316-a5eff-877ebbafd872ce74c2f8aa1d59a6135d6ec8d712.gz D _darcs/patches/20020411012228-a5eff-dd92c87b0d122f40704c654ed8fac6af2ce42774.gz D _darcs/patches/20020411013953-a5eff-b82eb4f0db3dc0191ad7c8a589d0d6221057a596.gz D _darcs/patches/20020411015645-a5eff-ee029e0036d85d2e43429e65d5c9332960ce1cfc.gz D _darcs/patches/20020411020231-a5eff-1b141f77eedf6df96361ad7d15767fa4a73842f8.gz D _darcs/patches/20020411023011-a5eff-272691bd954f9f0d53bb0ea232b2981de0ac1272.gz D _darcs/patches/20020411052339-a5eff-e79c116de04e8317bb683f47cfbddb6736780682.gz D _darcs/patches/20020411052958-a5eff-06b499e5c09da4ea6bb785e97288a523ac2beaef.gz D _darcs/patches/20020411072324-a5eff-794ca8cbcc0bad1c0a5b25dca3754d7e2de0d43a.gz D _darcs/patches/20020411081229-a5eff-f5e496043c13246cd6df405452c4b7602d7c1b5d.gz D _darcs/patches/20020411083144-a5eff-32e014788eee412bccedb14cc4177db4cd090f9e.gz D _darcs/patches/20020411090505-a5eff-6d41bfafd1721e09a4646ef3df2424d9b31baa64.gz D _darcs/patches/20020411190728-a5eff-7903c3c88136ecaea8b1169bdc30eed064513e35.gz D _darcs/patches/20020411194956-a5eff-81538c514c3b7cb035bd9bc7527114c972252c62.gz D _darcs/patches/20020411195806-a5eff-95b390b24eb06fd6b85f94c1436fe19594b84566.gz D _darcs/patches/20020411204714-a5eff-55842016cab41f63d02c203591ece5677f15f976.gz D _darcs/patches/20020411213345-a5eff-96db56de785a284d66fa8fd5d5ece83fcba43e4a.gz D _darcs/patches/20020411214105-a5eff-e71a3784e2dbf2cdebd83b9fd05c41647f600d30.gz D _darcs/patches/20020411224236-a5eff-7a68ee2595c3f8f6002cf44dad91d2c1ab9b6d70.gz D _darcs/patches/20020411230104-a5eff-58048126e4aa9d482717db04a5a15fdc718c18e2.gz D _darcs/patches/20020411232524-a5eff-41dabf1cb3fb0ee664666b4dd4cd7936d93401e9.gz D _darcs/patches/20020412002259-a5eff-4013c763fb694648c82d7b1e34752ecaf2f97eb5.gz D _darcs/patches/20020412003237-a5eff-9eeb2e43f655901c66bc5c1ee829303c18403a6a.gz D _darcs/patches/20020412021659-a5eff-b68c308623977cabe1f8402df825174f5928a94a.gz D _darcs/patches/20020412022421-a5eff-2eda36f8c6d1b6378ad24d9dd47e5f6f1c52a640.gz D _darcs/patches/20020412024140-a5eff-3e9ebf9b49429b0bdf5c3063b67fe9a06977d30f.gz D _darcs/patches/20020412080752-a5eff-827507b8f83a4035eb4f507c70a8fa0faf846577.gz D _darcs/patches/20020412081333-a5eff-b2405669dd2aa13ca43e80414f5982a27c74059c.gz D _darcs/patches/20020412213956-a5eff-0566e2d20798193ac634ba75f165ea5901c091b4.gz D _darcs/patches/20020412214654-a5eff-852f00deabfc8ecd0df9cadbc0a115a64d440163.gz D _darcs/patches/20020413012646-a5eff-9cc7a42a9c4587eddef30b5feb7b6a75b137c2ae.gz D _darcs/patches/20020415083453-a5eff-fab325147afcc81b5350e719597952ae8478ed6e.gz D _darcs/patches/20020415085913-a5eff-0ef54548d42c273ad9013cb5bb8b8bc3cc32f614.gz D _darcs/patches/20020415193722-a5eff-7852b9e89e8be0bf36f150432bb79d6e3620269e.gz D _darcs/patches/20020415202109-a5eff-b2c4b42d4299ca8d9afe2e279cbf219284b83ea4.gz D _darcs/patches/20020415225519-a5eff-08d61f019ab46c74e725eddd3284869ad934c7a4.gz D _darcs/patches/20020416000301-a5eff-ab57df7baa36d26bda00cd719c38c5b0526ffc67.gz D _darcs/patches/20020416000948-a5eff-3121eee68890b812629328a2af9a97e97db02178.gz D _darcs/patches/20020416004453-a5eff-ece4ddcbb05048e6118861d62e119ad6138a4b11.gz D _darcs/patches/20020416005816-a5eff-4d642d716799ca7c6771a7823dbaad5e0e8b6c2a.gz D _darcs/patches/20020416012057-a5eff-19f95f4f30146073fac974f2b19b3b30d1ad8f14.gz D _darcs/patches/20020416013708-a5eff-f57c9844396315102c60aa0c30d8808a7bbce0a2.gz D _darcs/patches/20020416020835-a5eff-be68edf596d8fe9abf773dababee16c1f9772ace.gz D _darcs/patches/20020416052101-a5eff-275519ffb304b63a25dcebe920da7aa270328b6e.gz D _darcs/patches/20020416194520-a5eff-249c263b9ee93d9520c7bd121a75ca0fb1e51dc1.gz D _darcs/patches/20020416200642-a5eff-adbc7e4a59dc53d78cbdebd5dc732734c367d11c.gz D _darcs/patches/20020416201159-a5eff-aadf9c3fbec44c5633a91610f4b4df46a62a6cd6.gz D _darcs/patches/20020416233241-a5eff-447c91a2618e7b826be981052adb09c966feaa37.gz D _darcs/patches/20020416233743-a5eff-2d17b0fe10cfd36fc38ca55dd2255c43efb6de5f.gz D _darcs/patches/20020417192657-a5eff-2802455b9d9573effd6dbdd1f3d3c6906ae43bbf.gz D _darcs/patches/20020418002035-a5eff-fdf051cd4a4679e3e8e909899682e04c93b131a4.gz D _darcs/patches/20020418003125-a5eff-78ca09dad11749c492d0938c081cdc6583d4cf43.gz D _darcs/patches/20020418030811-a5eff-d186e36665a1cc2253a5b437851a0ae0c82f6ee8.gz D _darcs/patches/20020418072229-a5eff-216aa34e9cca278fec294576314fe04aefd87c4e.gz D _darcs/patches/20020418073121-a5eff-1b6bde4c5c785272bbfe2ac3e7d07206dbfb0f96.gz D _darcs/patches/20020418204249-a5eff-d4aca4ff4c9862a4f8c7878f91a6c8e8a738be20.gz D _darcs/patches/20020418205102-a5eff-f0f0b0e0bc65a1f90a08316aa24030ccdc69cc17.gz D _darcs/patches/20020418210020-a5eff-ea1a65db83d736f3d03c3011ffd5ca9a52b006ca.gz D _darcs/patches/20020418211230-a5eff-363faa2cf4650aaa30f89c70e8e687d041036643.gz D _darcs/patches/20020418214952-a5eff-57e8440b773724f73a55b0dc59f4af5dc94e7f7a.gz D _darcs/patches/20020418215733-a5eff-b6bb482db8434a8ffc9694e5b8864b67069c7801.gz D _darcs/patches/20020418221329-a5eff-712a0183e642f6589c61b754748189ee38336e9f.gz D _darcs/patches/20020418222238-a5eff-36364b141208d562e0af0bbab58a8ec1de88e865.gz D _darcs/patches/20020418230131-a5eff-1ce2822fb7838f50cddca9336ea4b5d4b661b036.gz D _darcs/patches/20020419043929-a5eff-014c395bd1ee597453688453e042be6dcf2ec9cc.gz D _darcs/patches/20020426201810-a5eff-257f04b77b8872eb449ef90b4056e6080779d017.gz D _darcs/patches/20020501214547-a5eff-48f6a984bb38e9a88270be8c91fc5c5d6b0642b6.gz D _darcs/patches/20020502201345-a5eff-aea6cfe42605ad39ea12a305e0cc41da119dc9ef.gz D _darcs/patches/20020502202441-a5eff-d440081729785fc9b349bf3058b37574a15227ad.gz D _darcs/patches/20020702210406-a5eff-374d24c5aee0addabd572b373669dd89fe5a3756.gz D _darcs/patches/20020702213402-a5eff-83fadd364ebf39d3843bbd7ac2280bcd54a39d6d.gz D _darcs/patches/20020702234305-a5eff-476a2b383dc18201ab52e5330cc2b1e8a0b6e449.gz D _darcs/patches/20020718002816-a5eff-a107973a643098bf9bba7c07aa13743c5b22f29e.gz D _darcs/patches/20020718003307-a5eff-fd9b8a0ad6e38cf15296327ecb4a82799001b91c.gz D _darcs/patches/20020718010505-a5eff-7d07ac27fe667359df58e87162a68c9db51e8057.gz D _darcs/patches/20020718160550-a5eff-ff78dd172ec1c922855fc044878441410e727f03.gz D _darcs/patches/20020718161420-a5eff-130a9f40dba94a7e5548f9ed958168094cff43e3.gz D _darcs/patches/20020718161513-a5eff-6dbfff7e0fc50dba18a8cb159685d30fc1b5d16b.gz D _darcs/patches/20020718161635-a5eff-6cc31c95b3a61df8507cc0ebc02fbe858811b43c.gz D _darcs/patches/20020718162609-a5eff-b15c52c4d68d5699b728567681e58d0f883adc7a.gz D _darcs/patches/20020722131722-a5eff-6ec3eff44dfa7de990babfd60d800af13675f313.gz D _darcs/patches/20020723130437-a5eff-bbf31fd492c908dfb43e26626093faced9c0aab2.gz D _darcs/patches/20020808042425-a5eff-b0984c61b26974e929964f631b557b64efb9ede3.gz D _darcs/patches/20020808164615-a5eff-3378ed39b317ca98840ae136bc78c3e6c6f4aa69.gz D _darcs/patches/20020808175754-a5eff-a172baf78aaa410e355d5ff6bd182cc1bbd3936b.gz D _darcs/patches/20020808180953-a5eff-4510c9e22527b099ec7796a4093a56cf1ffa7f3d.gz D _darcs/patches/20020808181350-a5eff-9b133b4fbb2976a085efdb2ee8ba03d93e24c741.gz D _darcs/patches/20020808183205-a5eff-d361fea5a57c9b3052db22f6bccdd94f0e432067.gz D _darcs/patches/20020808193257-a5eff-1ee4a438b53f19e0730a6137aeba5ab2e7150713.gz D _darcs/patches/20020808213910-a5eff-a8d28c644cef7d408575a2f31751016a06fb9f26.gz D _darcs/patches/20020808214508-a5eff-f235307a0978c468d840cdc64833544b67ed2b0a.gz D _darcs/patches/20030221211446-a5eff-0d2e7b89cc1038254686dcfe8e92967ac63d10ff.gz D _darcs/patches/20030221211509-a5eff-07881765d7044a110ac464ae4fcba3dadf3fc085.gz D _darcs/patches/20030221230552-a5eff-c836d15002151de0cbab9ebc070007a533069017.gz D _darcs/patches/20030304204627-a5eff-d0903d10b71a042164de95784563a39eebe8cd9a.gz D _darcs/patches/20030305225106-a5eff-df4049b954666ca5b359828204955078cbc90d50.gz D _darcs/patches/20030306040214-a5eff-a6c89071648ffa3d229c61b227fefb1b9bb9d49a.gz D _darcs/patches/20030306040537-a5eff-6f7949b3cf89287ba9c4744de0e7377349811597.gz D _darcs/patches/20030306042519-a5eff-92a3061758e43e16824954cf687ab9f119a06304.gz D _darcs/patches/20030306042631-a5eff-460dc3af3cbf8f7dad0718adc1a5fd1f80308378.gz D _darcs/patches/20030306043414-a5eff-366bfac9d3b55ac57d4a9bb16853f9e9ab4c6b5d.gz D _darcs/patches/20030306055548-a5eff-b0ae7f6ecece45ebe4ac23261fd575f819036f51.gz D _darcs/patches/20030306055621-a5eff-d82dd33142e887cd05a06fbb67c2abe858c0bbaa.gz D _darcs/patches/20030306055843-a5eff-66d1567437a2f3085cf296d3a53037b5f03c9093.gz D _darcs/patches/20030306160414-a5eff-6c928740b3d5d4d108f5c2efa48e309b91086c16.gz D _darcs/patches/20030306164316-a5eff-2128979318056d46975aa58c0952e6bf04623210.gz D _darcs/patches/20030306170801-a5eff-8ba7e3cc86eb6195627bda1153ea750354265420.gz D _darcs/patches/20030306171013-a5eff-04b09ec76fd8c488113af101a680d5fb7503894e.gz D _darcs/patches/20030306200340-a5eff-10436feaf07416ec4f4e3e45dbbf052ef8faa1fa.gz D _darcs/patches/20030306210816-a5eff-90d19a6568ff583ef2fea79c9bafbcc13a736238.gz D _darcs/patches/20030306210959-a5eff-fc885ff8847d06e07c49734be9f46171c4cb2443.gz D _darcs/patches/20030306230304-a5eff-b9205ad7ddd816b3fe83faf334569f7c106127d7.gz D _darcs/patches/20030307013221-a5eff-5d910d6f8c95024777657acc978c1353892f0645.gz D _darcs/patches/20030307014915-a5eff-02458fd7df3fe192742df6a8e4a9029f4614a3b3.gz D _darcs/patches/20030307032511-a5eff-5a9106342f0555e6db52d41d4daecc2af1fc4b5a.gz D _darcs/patches/20030307035413-a5eff-37f15a3f2e64c11f73d24bfe47e89f98e2f01662.gz D _darcs/patches/20030307035442-a5eff-00f480dd4899bf32c81a8cb901355d520e9185ee.gz D _darcs/patches/20030307041336-a5eff-e0efdbc12004db0be19f9611bcb28f0bf2e51ef1.gz D _darcs/patches/20030307044436-a5eff-507cdeff4db0fe522cbc4c58f6e4665b2081dbfb.gz D _darcs/patches/20030307045759-a5eff-fba70f9bc9242322eec457f2f2304375efe48667.gz D _darcs/patches/20030307050511-a5eff-3c01b434da0da39f13ec522a7e72c8496d594f56.gz D _darcs/patches/20030307051240-a5eff-70ab69eee97c3117420a75ac5955da2985221e0a.gz D _darcs/patches/20030307055339-a5eff-b7913f6ded9149d5e7fe20de9f8e1f7590877a15.gz D _darcs/patches/20030307162902-a5eff-a40428bab400c5d8e600b65c2e8fb188cce61d31.gz D _darcs/patches/20030307172316-a5eff-ddc2758392c9d6319625a17e1474b4041794d44a.gz D _darcs/patches/20030307220139-a5eff-ca969df71187113dde3e9a87c21502f5272d656d.gz D _darcs/patches/20030312213307-a5eff-18bba9a0bb4ce6762761ae2187f23f83f5e26392.gz D _darcs/patches/20030312213727-a5eff-604147c028da91352c0d35d3a639160079df6d40.gz D _darcs/patches/20030312222019-a5eff-8b746be6656eca1d5250d15763355373dda61d09.gz D _darcs/patches/20030312225549-a5eff-75e0e2391f38067f047ae20d536fd972fbb23be9.gz D _darcs/patches/20030313002835-a5eff-28cdb7698191ef7b97d57ce8cc7785735bd5f360.gz D _darcs/patches/20030313003248-a5eff-2b91a942a04f7761ba96b88bd9ea7fed7f81faeb.gz D _darcs/patches/20030313005626-a5eff-b40042071be7786ac8fb83bba22bc22fbdd9a9aa.gz D _darcs/patches/20030313010249-a5eff-d1399caf7a5e3dc5f92889a87ef12e6553c0f7ff.gz D _darcs/patches/20030313012001-a5eff-b69bf58734985b49e79c01e92084b23a4b26ce87.gz D _darcs/patches/20030313012033-a5eff-b2f9e77e063c7c7b3e8c83cb6423825fabf2ce8b.gz D _darcs/patches/20030313145854-a5eff-189c9701752f59d33efc5582acee3b5db09eb64f.gz D _darcs/patches/20030313154856-a5eff-add85aabb2539130cbfa075672c090e89576d4fc.gz D _darcs/patches/20030313155247-a5eff-9431d6df041a2724c42c9ab978dd40cd8c848057.gz D _darcs/patches/20030313155311-a5eff-4c2af7d2f62d1e3ff02193bf49ef439022096a9d.gz D _darcs/patches/20030823170149-a5eff-483e1782531b68d4d0fb767ff29fc98ea2693b98.gz D _darcs/patches/20030823181322-a5eff-c10e1e7eef7222b8e8853c5362c9916e6e197a57.gz D _darcs/patches/20030823181737-a5eff-51e2840392e79f038ca0cbdc2959f78a729e0684.gz D _darcs/patches/20030823181823-a5eff-9c9aebefed0050da3944cb8c9a7462a54fc12c13.gz D _darcs/patches/20030823181902-a5eff-404bb4edf6dda6b7d7966a25fcfe0f0d1daa559f.gz D _darcs/patches/20030823182610-a5eff-63dcfb6aaddad0efb4aedb896bf9142acc0fcaeb.gz D _darcs/patches/20030823182650-a5eff-b0889aa78a4f588dd36b27a9c8772f3a68e94d12.gz D _darcs/patches/20030823184929-a5eff-af75a5ede358815bb36b4fb69084ed57eacb5d6a.gz D _darcs/patches/20030823185118-a5eff-f8c5a5a5cff16655837d6c6aecfe1fde25ce5f85.gz D _darcs/patches/20030823185431-a5eff-e39a03f173931cda9985c3c99ba83614a1fe4e3d.gz D _darcs/patches/20030823194113-a5eff-42f0151333bf1af5e2ae2ef78d534b0cec982b8d.gz D _darcs/patches/20030823194312-a5eff-f2afee3713af9a5880f2c868b5972d9a51d6aea2.gz D _darcs/patches/20030823195318-a5eff-6a7cf50a194233e8cc7293e8056b661703179967.gz D _darcs/patches/20030823195650-a5eff-0ceeedf4fd8798af31e87b55f2ec6ca57610765d.gz D _darcs/patches/20030823221319-a5eff-e12699a0a11f0c82970ec759842c2a8f149c7e2f.gz D _darcs/patches/20030823222016-a5eff-beb5c444c9793f6d92672e403e8078fe436516fe.gz D _darcs/patches/20030823222215-a5eff-a0afa8a04804f5a3b1f21ff179cd62569331b1f3.gz D _darcs/patches/20030823222338-a5eff-ec7e41de792ece83aabd13fe3e8912175b41ce25.gz D _darcs/patches/20030823222556-a5eff-096f4ff408108366195109e48793aff642669a6c.gz D _darcs/patches/20030823223440-a5eff-f151c6fcd3d05a7b20477fda6051d731279bd2f6.gz D _darcs/patches/20030823223947-a5eff-8b25bb61eba34b65ee9349a055fddebd9f05ca8e.gz D _darcs/patches/20030824223010-a5eff-d3a2fd3dd07e29ad016ba0e5c859aecd242caa65.gz D _darcs/patches/20030824223416-a5eff-3fa2c4fa4423415c00dfd2d87b55425474ff4af0.gz D _darcs/patches/20030824231720-a5eff-695ff3d338954c46636ca4e99d5beec102f34a5e.gz D _darcs/patches/20030825013833-a5eff-df1709e55b40b975523ad9df172644372ffb2247.gz D _darcs/patches/20030825153158-a5eff-e61917e656b41e72b7d2ffbf2bf0a59d81359652.gz D _darcs/patches/20030825184740-a5eff-fff174dbb0a2ec4942f95d1d03c70cfbc9671310.gz D _darcs/patches/20030825201558-a5eff-7a26b663499c0349a92d50e884e1900de4433423.gz D _darcs/patches/20030825201736-a5eff-6d36a9cf6358ca7a42fe0aa8572e8f2dd738fce7.gz D _darcs/patches/20030825211038-a5eff-05ca5457d8aa667f33acf3d963e39f1d32e8e3c6.gz D _darcs/patches/20030825211452-a5eff-477c31c309f787d124b65470c73b2b4e2e70e7b3.gz D _darcs/patches/20030825211723-a5eff-270d94d7754949fd34aa9c0d6704551082b60371.gz D _darcs/patches/20030825211738-a5eff-7e2e57ca57f9b799b0a84feb03ed8cd75ee0c85d.gz D _darcs/patches/20030825220138-a5eff-570a77a8da4e8eec616514e6d239e82e1be3b280.gz D _darcs/patches/20030825235615-a5eff-a1316387f00ed294afcb8305880568aa2f4ae654.gz D _darcs/patches/20030826014214-a5eff-9bda55c73d42545bdd7bd221330624a2ddf7dd32.gz D _darcs/patches/20030826032952-a5eff-3994986f7625529e6020e7f6459fe06d8777236a.gz D _darcs/patches/20031009161133-a5eff-2aef155954b3bf44adb20c33c1017cb2e6cb5ebf.gz D _darcs/patches/20031009214813-a5eff-ecd9106d0de8ea16195b1f385edacdc9db36383b.gz D _darcs/patches/20031217142030-a5eff-43801f5b608cedc0380f4cb1bf16c24279f2b88e.gz D _darcs/patches/20031217142733-a5eff-96b00afb2de192464493a108379c5ebfcb87eb70.gz D _darcs/patches/20031217144411-a5eff-df8b4ef99665e145b6f0ee1344aca79b81486a26.gz D _darcs/patches/20031217152032-a5eff-8d634550d0e315a803eeeeef2c4b9dbe33bc9126.gz D _darcs/patches/20031217152042-a5eff-ab3e5d849fa64591a809829e55247911bc025d8d.gz D _darcs/patches/20031217172643-a5eff-405a63088b9aa82801df513677c8f7e7b5f6b6f5.gz D _darcs/patches/20031217172906-a5eff-8a0fbe5341ffc660764b57d22e0563dea5605ac0.gz D _darcs/patches/20040827154312-a5eff-cacdbe01b5b47a3a16aadb0c00f024a169f381f9.gz D _darcs/patches/20040830195017-a5eff-9892df0950e8ab70d4eb54f05efdba0b84534582.gz D _darcs/patches/20040830195147-a5eff-ab9eaad868659c9f54654db7d472326d1cd79f0b.gz D _darcs/patches/20050114153553-c2a52-7e2dd54a7331be14f9d2b4a311a0c7eb3fd27ea7.gz D _darcs/patches/20050115212415-c2a52-b2b1af62d6829cc9420ad803bfd252f1ed134153.gz D _darcs/patches/20050115212935-c2a52-c14780d8355ff1cb44937be7e583ea694c31d8cd.gz D _darcs/patches/20050115213152-c2a52-51d99e2c5ffa098a71179ee3ae559ff7e491a471.gz D _darcs/patches/20050219180649-c2a52-d186e639339d83b04203f8a066e24ec21eb89ac6.gz D _darcs/patches/20050219180920-c2a52-d4e17ca6e3077803d442e36a65eb6a1993b5b2bc.gz D _darcs/patches/20050416103354-6793f-6a6e76509681d8556bfbae8015a5df0689aac271.gz D _darcs/patches/20050416154059-c2a52-a0a5feef0ee2dab3e1e3770d804d32ed2eafefc9.gz D _darcs/patches/20050416154132-c2a52-6a0f9f2b060ebb04911e79a6cffdc6320b295090.gz D _darcs/patches/20050416154211-c2a52-16192abc7c016b043a1cacb1dbe3158925cc6ccd.gz D _darcs/patches/20050416164256-c2a52-dc017162179bcc0ec299bf1d33618ddb830f3fd4.gz D _darcs/patches/20050416164809-c2a52-59ac9a6837e24de663ff3a8e44ce3bd5018a64a5.gz D _darcs/patches/20050416164836-c2a52-faaa46e043b957fa7c33db1a90c3f43df219aa78.gz D _darcs/patches/20050913191948-c2a52-1cbd6f03c05dbf487c405494e1f25eb5ee3470e6.gz D _darcs/patches/20050922123724-c2a52-2b6100be48abd345d402473d1fca263177f1e608.gz D _darcs/patches/20050922124716-c2a52-4025c3a1e2c23d1b63ae3abf79c1df5c7f702b3f.gz D _darcs/patches/20050922124809-c2a52-072ef7ecbc14dc5c2732954bbe4040dcb1d8bb3e.gz D _darcs/patches/20050922124819-c2a52-27c76e9af547fbb4876dbeffb9e32fd7119d91c6.gz D _darcs/patches/20050922124952-c2a52-24b58a0d85beda836e3faba9585d822cc36c7eec.gz D _darcs/patches/20050922130235-c2a52-910657f419cac65e7358c9b021aeeba0b4703175.gz D _darcs/patches/20060509154502-c2a52-4570f27e588fa890c6a642f6b2670a5e8b36b853.gz D _darcs/patches/20060509154524-c2a52-76af4b03a81b2f593159130b7406b4b9a79ed94d.gz D _darcs/patches/20060509154643-c2a52-e9c0e0019212038a3d957011da50e3e2654466e5.gz D _darcs/patches/20060911135005-c2a52-82ab81db3e567d758e50a42cb5106e4e729e07a6.gz D _darcs/patches/20060911135017-c2a52-7f665cdb36c7f963d43870aaa9d3d8b17e79ee65.gz D _darcs/patches/20060911135413-c2a52-23bdd6be0421b90c0b7834c6cd1937a1928b48ab.gz D _darcs/patches/20060911135510-c2a52-5469317c0b6e35028b79cf4ef6644a49069a3367.gz D _darcs/patches/20060911135518-c2a52-212ed02e3b6a5376b389ed7520e6451959ab04fd.gz D _darcs/patches/20060911140109-c2a52-7d49457c5f34b22d4dc3c09c0f9860a42f143072.gz D _darcs/patches/20060911140826-c2a52-65e0d9a82dc0ba72ed360eac594599922fc647b0.gz D _darcs/patches/20060911141036-c2a52-2ecda3bfa57b30b7d5b8c9c8bd272ce82c0edf77.gz D _darcs/patches/20060911141137-c2a52-84672717218a955c9ea320d1ad90ed09f9d56a65.gz D _darcs/patches/20060915190102-c2a52-75273e4724ca8c46a4d9334692e4fd32c6c7155a.gz D _darcs/patches/20060915190214-c2a52-92a9c9f45285d44363ff1e7b99de9d253abfba9a.gz D _darcs/patches/20060915190246-c2a52-26dd5e4724f439f1dab6d095ab1cb60a9c7ab05c.gz D _darcs/patches/pending D _darcs/prefs/binaries D _darcs/prefs/boring D _darcs/prefs/defaultrepo D _darcs/prefs/motd D _darcs/prefs/repos D build/scripts-2.4/pygopherd commit 0d02f465202ce3173257441ff2b7fdd6a6e46dbd Author: John Goerzen Date: Thu Apr 10 00:19:41 2008 -0500 Imported pygopherd-2.0.17 Summary: Imported pygopherd-2.0.17 Keywords: Imported pygopherd-2.0.17 into Git repository M debian/changelog M debian/init.d commit 0935e653664ac802236e522799afc24b5425fe92 Author: John Goerzen Date: Thu Apr 10 00:18:45 2008 -0500 Imported Debian version 2.0.17 C100 COPYING _darcs/current/COPYING C100 ChangeLog _darcs/current/ChangeLog C100 Makefile _darcs/current/Makefile C100 README _darcs/current/README C100 README.windows _darcs/current/README.windows C100 TODO _darcs/current/TODO C100 bin/pygopherd _darcs/current/bin/pygopherd C100 conf/mime.types _darcs/current/conf/mime.types C100 conf/pygopherd.conf _darcs/current/conf/pygopherd.conf C100 debian/changelog _darcs/current/debian/changelog C100 debian/conffiles _darcs/current/debian/conffiles C100 debian/control _darcs/current/debian/control C100 debian/copyright _darcs/current/debian/copyright C100 debian/dirs _darcs/current/debian/dirs C100 debian/docs _darcs/current/debian/docs C100 debian/ex.package.doc-base _darcs/current/debian/ex.package.doc-base C100 debian/examples _darcs/current/debian/examples C100 debian/init.d _darcs/current/debian/init.d C100 debian/postinst _darcs/current/debian/postinst C100 debian/postrm _darcs/current/debian/postrm C100 debian/pycompat _darcs/current/debian/pycompat C100 debian/pygfarm.README.Debian _darcs/current/debian/pygfarm.README.Debian C100 debian/pygfarm.dirs _darcs/current/debian/pygfarm.dirs C100 debian/rules _darcs/current/debian/rules C100 doc/book.sgml _darcs/current/doc/book.sgml C100 doc/manpage.sgml _darcs/current/doc/manpage.sgml C100 doc/pygopherd.8 _darcs/current/doc/pygopherd.8 C100 doc/pygopherd.html _darcs/current/doc/pygopherd.html C100 doc/pygopherd.pdf _darcs/current/doc/pygopherd.pdf C100 doc/pygopherd.ps _darcs/current/doc/pygopherd.ps C100 doc/pygopherd.sgml _darcs/current/doc/pygopherd.sgml C100 doc/pygopherd.txt _darcs/current/doc/pygopherd.txt C100 doc/quickstart.sgml _darcs/current/doc/quickstart.sgml C100 doc/standards/Gopher+.txt _darcs/current/doc/standards/Gopher+.txt C100 doc/standards/gophermap.txt _darcs/current/doc/standards/gophermap.txt C100 doc/standards/rfc1436.txt _darcs/current/doc/standards/rfc1436.txt C100 doc/standards/url.txt _darcs/current/doc/standards/url.txt C100 examples/gophermap _darcs/current/examples/gophermap C100 examples/talsample.html.tal _darcs/current/examples/talsample.html.tal C100 local.dsl _darcs/current/local.dsl C100 printlocal.dsl _darcs/current/printlocal.dsl C100 pygfarm/dict.pyg _darcs/current/pygfarm/dict.pyg C100 pygopherd/GopherExceptions.py _darcs/current/pygopherd/GopherExceptions.py C100 pygopherd/GopherExceptionsTest.py _darcs/current/pygopherd/GopherExceptionsTest.py C100 pygopherd/__init__.py _darcs/current/pygopherd/__init__.py C100 pygopherd/fileext.py _darcs/current/pygopherd/fileext.py C100 pygopherd/fileextTest.py _darcs/current/pygopherd/fileextTest.py C100 pygopherd/gopherentry.py _darcs/current/pygopherd/gopherentry.py C100 pygopherd/gopherentryTest.py _darcs/current/pygopherd/gopherentryTest.py C100 pygopherd/handlers/HandlerMultiplexer.py _darcs/current/pygopherd/handlers/HandlerMultiplexer.py C100 pygopherd/handlers/UMN.py _darcs/current/pygopherd/handlers/UMN.py C100 pygopherd/handlers/ZIP.py _darcs/current/pygopherd/handlers/ZIP.py C100 pygopherd/handlers/__init__.py _darcs/current/pygopherd/handlers/__init__.py C100 pygopherd/handlers/base.py _darcs/current/pygopherd/handlers/base.py C100 pygopherd/handlers/dir.py _darcs/current/pygopherd/handlers/dir.py C100 pygopherd/handlers/file.py _darcs/current/pygopherd/handlers/file.py C100 pygopherd/handlers/gophermap.py _darcs/current/pygopherd/handlers/gophermap.py C100 pygopherd/handlers/html.py _darcs/current/pygopherd/handlers/html.py C100 pygopherd/handlers/mbox.py _darcs/current/pygopherd/handlers/mbox.py C100 pygopherd/handlers/pyg.py _darcs/current/pygopherd/handlers/pyg.py C100 pygopherd/handlers/scriptexec.py _darcs/current/pygopherd/handlers/scriptexec.py C100 pygopherd/handlers/tal.py _darcs/current/pygopherd/handlers/tal.py C100 pygopherd/handlers/url.py _darcs/current/pygopherd/handlers/url.py C100 pygopherd/handlers/virtual.py _darcs/current/pygopherd/handlers/virtual.py C100 pygopherd/initialization.py _darcs/current/pygopherd/initialization.py C100 pygopherd/initializationTest.py _darcs/current/pygopherd/initializationTest.py C100 pygopherd/logger.py _darcs/current/pygopherd/logger.py C100 pygopherd/loggerTest.py _darcs/current/pygopherd/loggerTest.py C100 pygopherd/pipe.py _darcs/current/pygopherd/pipe.py C100 pygopherd/pipeTest.py _darcs/current/pygopherd/pipeTest.py C100 pygopherd/protocols/ProtocolMultiplexer.py _darcs/current/pygopherd/protocols/ProtocolMultiplexer.py C100 pygopherd/protocols/ProtocolMultiplexerTest.py _darcs/current/pygopherd/protocols/ProtocolMultiplexerTest.py C100 pygopherd/protocols/__init__.py _darcs/current/pygopherd/protocols/__init__.py C100 pygopherd/protocols/base.py _darcs/current/pygopherd/protocols/base.py C100 pygopherd/protocols/baseTest.py _darcs/current/pygopherd/protocols/baseTest.py C100 pygopherd/protocols/enhanced.py _darcs/current/pygopherd/protocols/enhanced.py C100 pygopherd/protocols/gopherp.py _darcs/current/pygopherd/protocols/gopherp.py C100 pygopherd/protocols/http.py _darcs/current/pygopherd/protocols/http.py C100 pygopherd/protocols/rfc1436.py _darcs/current/pygopherd/protocols/rfc1436.py C100 pygopherd/protocols/rfc1436Test.py _darcs/current/pygopherd/protocols/rfc1436Test.py C100 pygopherd/protocols/wap.py _darcs/current/pygopherd/protocols/wap.py C100 pygopherd/sighandlers.py _darcs/current/pygopherd/sighandlers.py C100 pygopherd/testutil.py _darcs/current/pygopherd/testutil.py C100 pygopherd/version.py _darcs/current/pygopherd/version.py C100 pygopherd/zipfile.py _darcs/current/pygopherd/zipfile.py C100 runtests.py _darcs/current/runtests.py C100 runtestsgui.py _darcs/current/runtestsgui.py C100 setup.py _darcs/current/setup.py C100 testdata/.abstract _darcs/current/testdata/.abstract C100 testdata/README _darcs/current/testdata/README C100 testdata/pygopherd/pipetest.sh _darcs/current/testdata/pygopherd/pipetest.sh C100 testdata/pygopherd/pipetestdata _darcs/current/testdata/pygopherd/pipetestdata C100 testdata/symlinktest.zip _darcs/current/testdata/symlinktest.zip C100 testdata/testarchive.tar _darcs/current/testdata/testarchive.tar C100 testdata/testarchive.tar.gz _darcs/current/testdata/testarchive.tar.gz C100 testdata/testarchive.tgz _darcs/current/testdata/testarchive.tgz C100 testdata/testdata.zip _darcs/current/testdata/testdata.zip C100 testdata/testdata2.zip _darcs/current/testdata/testdata2.zip C100 testdata/testfile.txt _darcs/current/testdata/testfile.txt C100 testdata/testfile.txt.gz _darcs/current/testdata/testfile.txt.gz C100 testdata/testfile.txt.gz.abstract _darcs/current/testdata/testfile.txt.gz.abstract C100 testdata/ziptorture.zip _darcs/current/testdata/ziptorture.zip A _darcs/inventories/20050416164836-c2a52-faaa46e043b957fa7c33db1a90c3f43df219aa78.gz A _darcs/inventory A _darcs/patches/20020325202914-a5eff-469b21deb5260890fde51aa8f7a85233ce1e0a2c.gz A _darcs/patches/20020325205511-a5eff-d2458f249f2a1300835074aa6bd597965bc1fb95.gz A _darcs/patches/20020325210811-a5eff-d201e4421abe1803abe746eda719db7567b268da.gz A _darcs/patches/20020325212953-a5eff-95dc54d7be5cb5160a9a54bcb46d9c66d8f4e79f.gz A _darcs/patches/20020325221758-a5eff-180e17ea4e4f6fbd90239fc9bd81fcbc9113ddbd.gz A _darcs/patches/20020325232109-a5eff-c135432007cf15c3dd1518dae92c383dffc4e857.gz A _darcs/patches/20020325232741-a5eff-b61771df7f56e413a0d1dd7109e54d5f57a48dc1.gz A _darcs/patches/20020326022726-a5eff-01f7c7497719d2afafc454fab7c45a8c837d7b9a.gz A _darcs/patches/20020326024707-a5eff-16fec0d96b3f96c53a33e2ba4d36310dc08c2a1b.gz A _darcs/patches/20020326050158-a5eff-1a7123df197f25a05f25c393889f8a831769ed21.gz A _darcs/patches/20020326053202-a5eff-74e09c227715f89a42e1b81688f57ba87be80b36.gz A _darcs/patches/20020326192415-a5eff-0bf3a1d864fe8ff70084c10614eafe255478e3cb.gz A _darcs/patches/20020326200939-a5eff-c713741dbaf918f83611dea3aa4cd010f30bd011.gz A _darcs/patches/20020326202920-a5eff-ecad96bef17db83ecd6695f0fffd19caf4dc98e7.gz A _darcs/patches/20020326203450-a5eff-b1be3ff1de77f0247c2acb04bee21c1bdd74f099.gz A _darcs/patches/20020326210905-a5eff-51463402eac0e91f169ded8ea3257ef99d9eed08.gz A _darcs/patches/20020326211756-a5eff-d2de10a539680344e148d89fa2c77bd46dc79b75.gz A _darcs/patches/20020326212556-a5eff-90d215033625fad3f6550dd94412542f1d0f89b6.gz A _darcs/patches/20020326213422-a5eff-a5b9205dd3ef3d9c5562d69a33f63ac10aca0463.gz A _darcs/patches/20020326214636-a5eff-dec84991cc2d3f025c79cdd91c5bc29184d986a7.gz A _darcs/patches/20020326221231-a5eff-8f6b65cb5dfead50da838d0ac4e349e50eb1c10c.gz A _darcs/patches/20020326221932-a5eff-dcbd08557f5a8a8e8f38d936f5a22de1fe765b11.gz A _darcs/patches/20020326222458-a5eff-4c24bdfb9beb0be7c0cfc5a56ebf3a56ce274c9c.gz A _darcs/patches/20020326224542-a5eff-e39b65a5550447254f554660fd2c7eb83a481091.gz A _darcs/patches/20020326235911-a5eff-f1070972b8ef7cc13410d279308071ecafbc8bff.gz A _darcs/patches/20020327001727-a5eff-62a29c13ecd4b744a0a57046e0b1eaeb9ef299b7.gz A _darcs/patches/20020327003014-a5eff-c403c16b158475f088ab641e71452b4def4c9023.gz A _darcs/patches/20020327005258-a5eff-12a2c875852c01bba497e5d4e102016202e15306.gz A _darcs/patches/20020327012727-a5eff-77d1113b2a9be98b5934b56966ccfe6173bbab7a.gz A _darcs/patches/20020327021001-a5eff-bf7515e1c6938bf2c4e70e03fe27385f55860502.gz A _darcs/patches/20020327021714-a5eff-db912f25f3270d64f5608f8b1835ae51de2bf9be.gz A _darcs/patches/20020327024416-a5eff-c7410d98e4969dc185754391fdc926b753367b72.gz A _darcs/patches/20020327054147-a5eff-268d18315b3a596fa656bde29ef4c04f5211c07c.gz A _darcs/patches/20020327181900-a5eff-be4fda24666184846acfb094437ff6b63475e196.gz A _darcs/patches/20020327191617-a5eff-286e984ed14c5d1bf5638db5332ed91f668c110c.gz A _darcs/patches/20020327212458-a5eff-a23cc6eed1df086b2308481ab6bad6362f594f45.gz A _darcs/patches/20020327214053-a5eff-517521ec150f3729a4cdd87bdc5bf339ab47b6b6.gz A _darcs/patches/20020404204103-a5eff-3b2e93caf3e6351a12605b5ab015949ea69af5da.gz A _darcs/patches/20020404225112-a5eff-f12a228d86b1f3d7014b2d4d4b8ce18586bbeb65.gz A _darcs/patches/20020404231239-a5eff-f630dffa16818eec1f4ff518669e7282e5b12327.gz A _darcs/patches/20020404232956-a5eff-969ee772649fb14c71e67cd0f7d677eb1bc5eaa2.gz A _darcs/patches/20020404233902-a5eff-7ccd50bacaa7007b09a03faf1cdff19e50700e47.gz A _darcs/patches/20020405002757-a5eff-45af4edb9447aba3f6d43ef134e95bdc8ad38f86.gz A _darcs/patches/20020405003737-a5eff-8a2d403efa9f483de21676114bd929616afbbe5b.gz A _darcs/patches/20020405005148-a5eff-548766135b69ddd9a276d6e1312addb448ddd51c.gz A _darcs/patches/20020405012027-a5eff-172bc1f33a515516dec6980f82f847434c4ba3c4.gz A _darcs/patches/20020405013658-a5eff-42796131b4ec90d54900ede52976a12e48b6d5a2.gz A _darcs/patches/20020405014951-a5eff-322191bd68465724c1a03affc342bcc12e74e523.gz A _darcs/patches/20020405015557-a5eff-60f1a192439e7eba117913273f9cafa0862b7d89.gz A _darcs/patches/20020405020522-a5eff-2a36bb811f7c7e35138a3f4dcd99ab807e4bb5b2.gz A _darcs/patches/20020405202733-a5eff-0da872724d34110d0598f665b9d6f89a16b0c69a.gz A _darcs/patches/20020405203239-a5eff-ab70f912dbf4073da928c23f2e69731347b573e7.gz A _darcs/patches/20020405211249-a5eff-f48c67fcf106fd12d08891ac1563434bdde09908.gz A _darcs/patches/20020405215159-a5eff-c57b0f35b90f55cb4932247ab46db5ed390214bf.gz A _darcs/patches/20020405215830-a5eff-fc51a78e1fcfee797a664710c1e6d80a2bb1c7c7.gz A _darcs/patches/20020405224300-a5eff-fb72449173e807a0b77d51142c0bf227e60a490f.gz A _darcs/patches/20020406001352-a5eff-88fe9e25b997740a213924599f58a86be545b441.gz A _darcs/patches/20020406002411-a5eff-6975ebde7182126cb4d1c8c2542923d38850fe1c.gz A _darcs/patches/20020406003906-a5eff-ab9a32f5a69b1af53fe64d89915c046264efe391.gz A _darcs/patches/20020406005130-a5eff-0eb500d5029cdc779b383e46534f478b1471adba.gz A _darcs/patches/20020406010958-a5eff-2be2466b2fd50b91bb8ff005bc7db09850543950.gz A _darcs/patches/20020406015956-a5eff-406ac734fa7db46aa3e547318a5df16dbb674ff9.gz A _darcs/patches/20020406022355-a5eff-2450fffbe97cb812f188698f94534898cbec8a20.gz A _darcs/patches/20020406045550-a5eff-2cf3255fe3170b7d5c176a5075f19cb7c1b26349.gz A _darcs/patches/20020406082526-a5eff-5b9466830c142eddf737eef61bebc83a2c80ff06.gz A _darcs/patches/20020407013106-a5eff-9bddb324cad47698ef8e100a978f842e406647c8.gz A _darcs/patches/20020407020821-a5eff-6578e20bf3b1532d74e20a46a6ab7fb94dd80f49.gz A _darcs/patches/20020409002212-a5eff-dee1d9715754831f03217ca6a2e91cef8eed6448.gz A _darcs/patches/20020409013627-a5eff-094871358e209d420412327ef842fa85b7e17efd.gz A _darcs/patches/20020410004552-a5eff-a2b2da5253ed26e38a5664b7838fb075f2a0c243.gz A _darcs/patches/20020410011855-a5eff-065eeed224b3bccbed1eeb7c1fd5589a30f54ac7.gz A _darcs/patches/20020410014231-a5eff-4e7438c48e4640be33c27a67c722dd0dd6eeed93.gz A _darcs/patches/20020410020948-a5eff-ac66fb95408570d306a6e69cca68a5809a5fabb1.gz A _darcs/patches/20020410022641-a5eff-8e095e7ef65a1404088d4ac977b5009d84e0de50.gz A _darcs/patches/20020410074434-a5eff-7fa62126adc35d5e8a512f694c029135d8b3d318.gz A _darcs/patches/20020410083115-a5eff-b95fbd84f61b0632d0c0fe864eb99e8a17d1100b.gz A _darcs/patches/20020410185714-a5eff-fa47451a29079766703ae1e146d282465369445f.gz A _darcs/patches/20020410191058-a5eff-f8db157a65a91d0ab5f41571372aa02540da7618.gz A _darcs/patches/20020410201316-a5eff-c387879fbc7be8c6dff173477292bab672bd5d87.gz A _darcs/patches/20020410202043-a5eff-88e802d73b423e149360200474f6c0028f3ce8b5.gz A _darcs/patches/20020410202703-a5eff-e67959ed5de56a69b126bde412b83596980a7ec5.gz A _darcs/patches/20020410204153-a5eff-56e47055b4889537f7f2b1e34b3471e5294e8399.gz A _darcs/patches/20020410210715-a5eff-64607913769a8a6f9113ed159814c7a57a337607.gz A _darcs/patches/20020410212739-a5eff-b6a69e3dcb68b05ff347b2a688fba5272581fa17.gz A _darcs/patches/20020410220336-a5eff-2d8790f6b8835722941a08e6d4bed92da36dcc9e.gz A _darcs/patches/20020410221522-a5eff-f21935e6266ff13528d62448ff4b7aeda195fbdf.gz A _darcs/patches/20020410233824-a5eff-6ad551a5f9abf472dc2a2abb54cdf4ae39b1dddf.gz A _darcs/patches/20020411001916-a5eff-b44c1e9573d4955ac328b44f7e0f016cb2445a55.gz A _darcs/patches/20020411002650-a5eff-01e88f9713e63459645fde825e6bb9f439424937.gz A _darcs/patches/20020411004309-a5eff-a69170bfbd7fbd9824670ac534eed34b11763d0b.gz A _darcs/patches/20020411010513-a5eff-930432050ce7b66791da6a3d54d8614142efcdef.gz A _darcs/patches/20020411011316-a5eff-877ebbafd872ce74c2f8aa1d59a6135d6ec8d712.gz A _darcs/patches/20020411012228-a5eff-dd92c87b0d122f40704c654ed8fac6af2ce42774.gz A _darcs/patches/20020411013953-a5eff-b82eb4f0db3dc0191ad7c8a589d0d6221057a596.gz A _darcs/patches/20020411015645-a5eff-ee029e0036d85d2e43429e65d5c9332960ce1cfc.gz A _darcs/patches/20020411020231-a5eff-1b141f77eedf6df96361ad7d15767fa4a73842f8.gz A _darcs/patches/20020411023011-a5eff-272691bd954f9f0d53bb0ea232b2981de0ac1272.gz A _darcs/patches/20020411052339-a5eff-e79c116de04e8317bb683f47cfbddb6736780682.gz A _darcs/patches/20020411052958-a5eff-06b499e5c09da4ea6bb785e97288a523ac2beaef.gz A _darcs/patches/20020411072324-a5eff-794ca8cbcc0bad1c0a5b25dca3754d7e2de0d43a.gz A _darcs/patches/20020411081229-a5eff-f5e496043c13246cd6df405452c4b7602d7c1b5d.gz A _darcs/patches/20020411083144-a5eff-32e014788eee412bccedb14cc4177db4cd090f9e.gz A _darcs/patches/20020411090505-a5eff-6d41bfafd1721e09a4646ef3df2424d9b31baa64.gz A _darcs/patches/20020411190728-a5eff-7903c3c88136ecaea8b1169bdc30eed064513e35.gz A _darcs/patches/20020411194956-a5eff-81538c514c3b7cb035bd9bc7527114c972252c62.gz A _darcs/patches/20020411195806-a5eff-95b390b24eb06fd6b85f94c1436fe19594b84566.gz A _darcs/patches/20020411204714-a5eff-55842016cab41f63d02c203591ece5677f15f976.gz A _darcs/patches/20020411213345-a5eff-96db56de785a284d66fa8fd5d5ece83fcba43e4a.gz A _darcs/patches/20020411214105-a5eff-e71a3784e2dbf2cdebd83b9fd05c41647f600d30.gz A _darcs/patches/20020411224236-a5eff-7a68ee2595c3f8f6002cf44dad91d2c1ab9b6d70.gz A _darcs/patches/20020411230104-a5eff-58048126e4aa9d482717db04a5a15fdc718c18e2.gz A _darcs/patches/20020411232524-a5eff-41dabf1cb3fb0ee664666b4dd4cd7936d93401e9.gz A _darcs/patches/20020412002259-a5eff-4013c763fb694648c82d7b1e34752ecaf2f97eb5.gz A _darcs/patches/20020412003237-a5eff-9eeb2e43f655901c66bc5c1ee829303c18403a6a.gz A _darcs/patches/20020412021659-a5eff-b68c308623977cabe1f8402df825174f5928a94a.gz A _darcs/patches/20020412022421-a5eff-2eda36f8c6d1b6378ad24d9dd47e5f6f1c52a640.gz A _darcs/patches/20020412024140-a5eff-3e9ebf9b49429b0bdf5c3063b67fe9a06977d30f.gz A _darcs/patches/20020412080752-a5eff-827507b8f83a4035eb4f507c70a8fa0faf846577.gz A _darcs/patches/20020412081333-a5eff-b2405669dd2aa13ca43e80414f5982a27c74059c.gz A _darcs/patches/20020412213956-a5eff-0566e2d20798193ac634ba75f165ea5901c091b4.gz A _darcs/patches/20020412214654-a5eff-852f00deabfc8ecd0df9cadbc0a115a64d440163.gz A _darcs/patches/20020413012646-a5eff-9cc7a42a9c4587eddef30b5feb7b6a75b137c2ae.gz A _darcs/patches/20020415083453-a5eff-fab325147afcc81b5350e719597952ae8478ed6e.gz A _darcs/patches/20020415085913-a5eff-0ef54548d42c273ad9013cb5bb8b8bc3cc32f614.gz A _darcs/patches/20020415193722-a5eff-7852b9e89e8be0bf36f150432bb79d6e3620269e.gz A _darcs/patches/20020415202109-a5eff-b2c4b42d4299ca8d9afe2e279cbf219284b83ea4.gz A _darcs/patches/20020415225519-a5eff-08d61f019ab46c74e725eddd3284869ad934c7a4.gz A _darcs/patches/20020416000301-a5eff-ab57df7baa36d26bda00cd719c38c5b0526ffc67.gz A _darcs/patches/20020416000948-a5eff-3121eee68890b812629328a2af9a97e97db02178.gz A _darcs/patches/20020416004453-a5eff-ece4ddcbb05048e6118861d62e119ad6138a4b11.gz A _darcs/patches/20020416005816-a5eff-4d642d716799ca7c6771a7823dbaad5e0e8b6c2a.gz A _darcs/patches/20020416012057-a5eff-19f95f4f30146073fac974f2b19b3b30d1ad8f14.gz A _darcs/patches/20020416013708-a5eff-f57c9844396315102c60aa0c30d8808a7bbce0a2.gz A _darcs/patches/20020416020835-a5eff-be68edf596d8fe9abf773dababee16c1f9772ace.gz A _darcs/patches/20020416052101-a5eff-275519ffb304b63a25dcebe920da7aa270328b6e.gz A _darcs/patches/20020416194520-a5eff-249c263b9ee93d9520c7bd121a75ca0fb1e51dc1.gz A _darcs/patches/20020416200642-a5eff-adbc7e4a59dc53d78cbdebd5dc732734c367d11c.gz A _darcs/patches/20020416201159-a5eff-aadf9c3fbec44c5633a91610f4b4df46a62a6cd6.gz A _darcs/patches/20020416233241-a5eff-447c91a2618e7b826be981052adb09c966feaa37.gz A _darcs/patches/20020416233743-a5eff-2d17b0fe10cfd36fc38ca55dd2255c43efb6de5f.gz A _darcs/patches/20020417192657-a5eff-2802455b9d9573effd6dbdd1f3d3c6906ae43bbf.gz A _darcs/patches/20020418002035-a5eff-fdf051cd4a4679e3e8e909899682e04c93b131a4.gz A _darcs/patches/20020418003125-a5eff-78ca09dad11749c492d0938c081cdc6583d4cf43.gz A _darcs/patches/20020418030811-a5eff-d186e36665a1cc2253a5b437851a0ae0c82f6ee8.gz A _darcs/patches/20020418072229-a5eff-216aa34e9cca278fec294576314fe04aefd87c4e.gz A _darcs/patches/20020418073121-a5eff-1b6bde4c5c785272bbfe2ac3e7d07206dbfb0f96.gz A _darcs/patches/20020418204249-a5eff-d4aca4ff4c9862a4f8c7878f91a6c8e8a738be20.gz A _darcs/patches/20020418205102-a5eff-f0f0b0e0bc65a1f90a08316aa24030ccdc69cc17.gz A _darcs/patches/20020418210020-a5eff-ea1a65db83d736f3d03c3011ffd5ca9a52b006ca.gz A _darcs/patches/20020418211230-a5eff-363faa2cf4650aaa30f89c70e8e687d041036643.gz A _darcs/patches/20020418214952-a5eff-57e8440b773724f73a55b0dc59f4af5dc94e7f7a.gz A _darcs/patches/20020418215733-a5eff-b6bb482db8434a8ffc9694e5b8864b67069c7801.gz A _darcs/patches/20020418221329-a5eff-712a0183e642f6589c61b754748189ee38336e9f.gz A _darcs/patches/20020418222238-a5eff-36364b141208d562e0af0bbab58a8ec1de88e865.gz A _darcs/patches/20020418230131-a5eff-1ce2822fb7838f50cddca9336ea4b5d4b661b036.gz A _darcs/patches/20020419043929-a5eff-014c395bd1ee597453688453e042be6dcf2ec9cc.gz A _darcs/patches/20020426201810-a5eff-257f04b77b8872eb449ef90b4056e6080779d017.gz A _darcs/patches/20020501214547-a5eff-48f6a984bb38e9a88270be8c91fc5c5d6b0642b6.gz A _darcs/patches/20020502201345-a5eff-aea6cfe42605ad39ea12a305e0cc41da119dc9ef.gz A _darcs/patches/20020502202441-a5eff-d440081729785fc9b349bf3058b37574a15227ad.gz A _darcs/patches/20020702210406-a5eff-374d24c5aee0addabd572b373669dd89fe5a3756.gz A _darcs/patches/20020702213402-a5eff-83fadd364ebf39d3843bbd7ac2280bcd54a39d6d.gz A _darcs/patches/20020702234305-a5eff-476a2b383dc18201ab52e5330cc2b1e8a0b6e449.gz A _darcs/patches/20020718002816-a5eff-a107973a643098bf9bba7c07aa13743c5b22f29e.gz A _darcs/patches/20020718003307-a5eff-fd9b8a0ad6e38cf15296327ecb4a82799001b91c.gz A _darcs/patches/20020718010505-a5eff-7d07ac27fe667359df58e87162a68c9db51e8057.gz A _darcs/patches/20020718160550-a5eff-ff78dd172ec1c922855fc044878441410e727f03.gz A _darcs/patches/20020718161420-a5eff-130a9f40dba94a7e5548f9ed958168094cff43e3.gz A _darcs/patches/20020718161513-a5eff-6dbfff7e0fc50dba18a8cb159685d30fc1b5d16b.gz A _darcs/patches/20020718161635-a5eff-6cc31c95b3a61df8507cc0ebc02fbe858811b43c.gz A _darcs/patches/20020718162609-a5eff-b15c52c4d68d5699b728567681e58d0f883adc7a.gz A _darcs/patches/20020722131722-a5eff-6ec3eff44dfa7de990babfd60d800af13675f313.gz A _darcs/patches/20020723130437-a5eff-bbf31fd492c908dfb43e26626093faced9c0aab2.gz A _darcs/patches/20020808042425-a5eff-b0984c61b26974e929964f631b557b64efb9ede3.gz A _darcs/patches/20020808164615-a5eff-3378ed39b317ca98840ae136bc78c3e6c6f4aa69.gz A _darcs/patches/20020808175754-a5eff-a172baf78aaa410e355d5ff6bd182cc1bbd3936b.gz A _darcs/patches/20020808180953-a5eff-4510c9e22527b099ec7796a4093a56cf1ffa7f3d.gz A _darcs/patches/20020808181350-a5eff-9b133b4fbb2976a085efdb2ee8ba03d93e24c741.gz A _darcs/patches/20020808183205-a5eff-d361fea5a57c9b3052db22f6bccdd94f0e432067.gz A _darcs/patches/20020808193257-a5eff-1ee4a438b53f19e0730a6137aeba5ab2e7150713.gz A _darcs/patches/20020808213910-a5eff-a8d28c644cef7d408575a2f31751016a06fb9f26.gz A _darcs/patches/20020808214508-a5eff-f235307a0978c468d840cdc64833544b67ed2b0a.gz A _darcs/patches/20030221211446-a5eff-0d2e7b89cc1038254686dcfe8e92967ac63d10ff.gz A _darcs/patches/20030221211509-a5eff-07881765d7044a110ac464ae4fcba3dadf3fc085.gz A _darcs/patches/20030221230552-a5eff-c836d15002151de0cbab9ebc070007a533069017.gz A _darcs/patches/20030304204627-a5eff-d0903d10b71a042164de95784563a39eebe8cd9a.gz A _darcs/patches/20030305225106-a5eff-df4049b954666ca5b359828204955078cbc90d50.gz A _darcs/patches/20030306040214-a5eff-a6c89071648ffa3d229c61b227fefb1b9bb9d49a.gz A _darcs/patches/20030306040537-a5eff-6f7949b3cf89287ba9c4744de0e7377349811597.gz A _darcs/patches/20030306042519-a5eff-92a3061758e43e16824954cf687ab9f119a06304.gz A _darcs/patches/20030306042631-a5eff-460dc3af3cbf8f7dad0718adc1a5fd1f80308378.gz A _darcs/patches/20030306043414-a5eff-366bfac9d3b55ac57d4a9bb16853f9e9ab4c6b5d.gz A _darcs/patches/20030306055548-a5eff-b0ae7f6ecece45ebe4ac23261fd575f819036f51.gz A _darcs/patches/20030306055621-a5eff-d82dd33142e887cd05a06fbb67c2abe858c0bbaa.gz A _darcs/patches/20030306055843-a5eff-66d1567437a2f3085cf296d3a53037b5f03c9093.gz A _darcs/patches/20030306160414-a5eff-6c928740b3d5d4d108f5c2efa48e309b91086c16.gz A _darcs/patches/20030306164316-a5eff-2128979318056d46975aa58c0952e6bf04623210.gz A _darcs/patches/20030306170801-a5eff-8ba7e3cc86eb6195627bda1153ea750354265420.gz A _darcs/patches/20030306171013-a5eff-04b09ec76fd8c488113af101a680d5fb7503894e.gz A _darcs/patches/20030306200340-a5eff-10436feaf07416ec4f4e3e45dbbf052ef8faa1fa.gz A _darcs/patches/20030306210816-a5eff-90d19a6568ff583ef2fea79c9bafbcc13a736238.gz A _darcs/patches/20030306210959-a5eff-fc885ff8847d06e07c49734be9f46171c4cb2443.gz A _darcs/patches/20030306230304-a5eff-b9205ad7ddd816b3fe83faf334569f7c106127d7.gz A _darcs/patches/20030307013221-a5eff-5d910d6f8c95024777657acc978c1353892f0645.gz A _darcs/patches/20030307014915-a5eff-02458fd7df3fe192742df6a8e4a9029f4614a3b3.gz A _darcs/patches/20030307032511-a5eff-5a9106342f0555e6db52d41d4daecc2af1fc4b5a.gz A _darcs/patches/20030307035413-a5eff-37f15a3f2e64c11f73d24bfe47e89f98e2f01662.gz A _darcs/patches/20030307035442-a5eff-00f480dd4899bf32c81a8cb901355d520e9185ee.gz A _darcs/patches/20030307041336-a5eff-e0efdbc12004db0be19f9611bcb28f0bf2e51ef1.gz A _darcs/patches/20030307044436-a5eff-507cdeff4db0fe522cbc4c58f6e4665b2081dbfb.gz A _darcs/patches/20030307045759-a5eff-fba70f9bc9242322eec457f2f2304375efe48667.gz A _darcs/patches/20030307050511-a5eff-3c01b434da0da39f13ec522a7e72c8496d594f56.gz A _darcs/patches/20030307051240-a5eff-70ab69eee97c3117420a75ac5955da2985221e0a.gz A _darcs/patches/20030307055339-a5eff-b7913f6ded9149d5e7fe20de9f8e1f7590877a15.gz A _darcs/patches/20030307162902-a5eff-a40428bab400c5d8e600b65c2e8fb188cce61d31.gz A _darcs/patches/20030307172316-a5eff-ddc2758392c9d6319625a17e1474b4041794d44a.gz A _darcs/patches/20030307220139-a5eff-ca969df71187113dde3e9a87c21502f5272d656d.gz A _darcs/patches/20030312213307-a5eff-18bba9a0bb4ce6762761ae2187f23f83f5e26392.gz A _darcs/patches/20030312213727-a5eff-604147c028da91352c0d35d3a639160079df6d40.gz A _darcs/patches/20030312222019-a5eff-8b746be6656eca1d5250d15763355373dda61d09.gz A _darcs/patches/20030312225549-a5eff-75e0e2391f38067f047ae20d536fd972fbb23be9.gz A _darcs/patches/20030313002835-a5eff-28cdb7698191ef7b97d57ce8cc7785735bd5f360.gz A _darcs/patches/20030313003248-a5eff-2b91a942a04f7761ba96b88bd9ea7fed7f81faeb.gz A _darcs/patches/20030313005626-a5eff-b40042071be7786ac8fb83bba22bc22fbdd9a9aa.gz A _darcs/patches/20030313010249-a5eff-d1399caf7a5e3dc5f92889a87ef12e6553c0f7ff.gz A _darcs/patches/20030313012001-a5eff-b69bf58734985b49e79c01e92084b23a4b26ce87.gz A _darcs/patches/20030313012033-a5eff-b2f9e77e063c7c7b3e8c83cb6423825fabf2ce8b.gz A _darcs/patches/20030313145854-a5eff-189c9701752f59d33efc5582acee3b5db09eb64f.gz A _darcs/patches/20030313154856-a5eff-add85aabb2539130cbfa075672c090e89576d4fc.gz A _darcs/patches/20030313155247-a5eff-9431d6df041a2724c42c9ab978dd40cd8c848057.gz A _darcs/patches/20030313155311-a5eff-4c2af7d2f62d1e3ff02193bf49ef439022096a9d.gz A _darcs/patches/20030823170149-a5eff-483e1782531b68d4d0fb767ff29fc98ea2693b98.gz A _darcs/patches/20030823181322-a5eff-c10e1e7eef7222b8e8853c5362c9916e6e197a57.gz A _darcs/patches/20030823181737-a5eff-51e2840392e79f038ca0cbdc2959f78a729e0684.gz A _darcs/patches/20030823181823-a5eff-9c9aebefed0050da3944cb8c9a7462a54fc12c13.gz A _darcs/patches/20030823181902-a5eff-404bb4edf6dda6b7d7966a25fcfe0f0d1daa559f.gz A _darcs/patches/20030823182610-a5eff-63dcfb6aaddad0efb4aedb896bf9142acc0fcaeb.gz A _darcs/patches/20030823182650-a5eff-b0889aa78a4f588dd36b27a9c8772f3a68e94d12.gz A _darcs/patches/20030823184929-a5eff-af75a5ede358815bb36b4fb69084ed57eacb5d6a.gz A _darcs/patches/20030823185118-a5eff-f8c5a5a5cff16655837d6c6aecfe1fde25ce5f85.gz A _darcs/patches/20030823185431-a5eff-e39a03f173931cda9985c3c99ba83614a1fe4e3d.gz A _darcs/patches/20030823194113-a5eff-42f0151333bf1af5e2ae2ef78d534b0cec982b8d.gz A _darcs/patches/20030823194312-a5eff-f2afee3713af9a5880f2c868b5972d9a51d6aea2.gz A _darcs/patches/20030823195318-a5eff-6a7cf50a194233e8cc7293e8056b661703179967.gz A _darcs/patches/20030823195650-a5eff-0ceeedf4fd8798af31e87b55f2ec6ca57610765d.gz A _darcs/patches/20030823221319-a5eff-e12699a0a11f0c82970ec759842c2a8f149c7e2f.gz A _darcs/patches/20030823222016-a5eff-beb5c444c9793f6d92672e403e8078fe436516fe.gz A _darcs/patches/20030823222215-a5eff-a0afa8a04804f5a3b1f21ff179cd62569331b1f3.gz A _darcs/patches/20030823222338-a5eff-ec7e41de792ece83aabd13fe3e8912175b41ce25.gz A _darcs/patches/20030823222556-a5eff-096f4ff408108366195109e48793aff642669a6c.gz A _darcs/patches/20030823223440-a5eff-f151c6fcd3d05a7b20477fda6051d731279bd2f6.gz A _darcs/patches/20030823223947-a5eff-8b25bb61eba34b65ee9349a055fddebd9f05ca8e.gz A _darcs/patches/20030824223010-a5eff-d3a2fd3dd07e29ad016ba0e5c859aecd242caa65.gz A _darcs/patches/20030824223416-a5eff-3fa2c4fa4423415c00dfd2d87b55425474ff4af0.gz A _darcs/patches/20030824231720-a5eff-695ff3d338954c46636ca4e99d5beec102f34a5e.gz A _darcs/patches/20030825013833-a5eff-df1709e55b40b975523ad9df172644372ffb2247.gz A _darcs/patches/20030825153158-a5eff-e61917e656b41e72b7d2ffbf2bf0a59d81359652.gz A _darcs/patches/20030825184740-a5eff-fff174dbb0a2ec4942f95d1d03c70cfbc9671310.gz A _darcs/patches/20030825201558-a5eff-7a26b663499c0349a92d50e884e1900de4433423.gz A _darcs/patches/20030825201736-a5eff-6d36a9cf6358ca7a42fe0aa8572e8f2dd738fce7.gz A _darcs/patches/20030825211038-a5eff-05ca5457d8aa667f33acf3d963e39f1d32e8e3c6.gz A _darcs/patches/20030825211452-a5eff-477c31c309f787d124b65470c73b2b4e2e70e7b3.gz A _darcs/patches/20030825211723-a5eff-270d94d7754949fd34aa9c0d6704551082b60371.gz A _darcs/patches/20030825211738-a5eff-7e2e57ca57f9b799b0a84feb03ed8cd75ee0c85d.gz A _darcs/patches/20030825220138-a5eff-570a77a8da4e8eec616514e6d239e82e1be3b280.gz A _darcs/patches/20030825235615-a5eff-a1316387f00ed294afcb8305880568aa2f4ae654.gz A _darcs/patches/20030826014214-a5eff-9bda55c73d42545bdd7bd221330624a2ddf7dd32.gz A _darcs/patches/20030826032952-a5eff-3994986f7625529e6020e7f6459fe06d8777236a.gz A _darcs/patches/20031009161133-a5eff-2aef155954b3bf44adb20c33c1017cb2e6cb5ebf.gz A _darcs/patches/20031009214813-a5eff-ecd9106d0de8ea16195b1f385edacdc9db36383b.gz A _darcs/patches/20031217142030-a5eff-43801f5b608cedc0380f4cb1bf16c24279f2b88e.gz A _darcs/patches/20031217142733-a5eff-96b00afb2de192464493a108379c5ebfcb87eb70.gz A _darcs/patches/20031217144411-a5eff-df8b4ef99665e145b6f0ee1344aca79b81486a26.gz A _darcs/patches/20031217152032-a5eff-8d634550d0e315a803eeeeef2c4b9dbe33bc9126.gz A _darcs/patches/20031217152042-a5eff-ab3e5d849fa64591a809829e55247911bc025d8d.gz A _darcs/patches/20031217172643-a5eff-405a63088b9aa82801df513677c8f7e7b5f6b6f5.gz A _darcs/patches/20031217172906-a5eff-8a0fbe5341ffc660764b57d22e0563dea5605ac0.gz A _darcs/patches/20040827154312-a5eff-cacdbe01b5b47a3a16aadb0c00f024a169f381f9.gz A _darcs/patches/20040830195017-a5eff-9892df0950e8ab70d4eb54f05efdba0b84534582.gz A _darcs/patches/20040830195147-a5eff-ab9eaad868659c9f54654db7d472326d1cd79f0b.gz A _darcs/patches/20050114153553-c2a52-7e2dd54a7331be14f9d2b4a311a0c7eb3fd27ea7.gz A _darcs/patches/20050115212415-c2a52-b2b1af62d6829cc9420ad803bfd252f1ed134153.gz A _darcs/patches/20050115212935-c2a52-c14780d8355ff1cb44937be7e583ea694c31d8cd.gz A _darcs/patches/20050115213152-c2a52-51d99e2c5ffa098a71179ee3ae559ff7e491a471.gz A _darcs/patches/20050219180649-c2a52-d186e639339d83b04203f8a066e24ec21eb89ac6.gz A _darcs/patches/20050219180920-c2a52-d4e17ca6e3077803d442e36a65eb6a1993b5b2bc.gz A _darcs/patches/20050416103354-6793f-6a6e76509681d8556bfbae8015a5df0689aac271.gz A _darcs/patches/20050416154059-c2a52-a0a5feef0ee2dab3e1e3770d804d32ed2eafefc9.gz A _darcs/patches/20050416154132-c2a52-6a0f9f2b060ebb04911e79a6cffdc6320b295090.gz A _darcs/patches/20050416154211-c2a52-16192abc7c016b043a1cacb1dbe3158925cc6ccd.gz A _darcs/patches/20050416164256-c2a52-dc017162179bcc0ec299bf1d33618ddb830f3fd4.gz A _darcs/patches/20050416164809-c2a52-59ac9a6837e24de663ff3a8e44ce3bd5018a64a5.gz A _darcs/patches/20050416164836-c2a52-faaa46e043b957fa7c33db1a90c3f43df219aa78.gz A _darcs/patches/20050913191948-c2a52-1cbd6f03c05dbf487c405494e1f25eb5ee3470e6.gz A _darcs/patches/20050922123724-c2a52-2b6100be48abd345d402473d1fca263177f1e608.gz A _darcs/patches/20050922124716-c2a52-4025c3a1e2c23d1b63ae3abf79c1df5c7f702b3f.gz A _darcs/patches/20050922124809-c2a52-072ef7ecbc14dc5c2732954bbe4040dcb1d8bb3e.gz A _darcs/patches/20050922124819-c2a52-27c76e9af547fbb4876dbeffb9e32fd7119d91c6.gz A _darcs/patches/20050922124952-c2a52-24b58a0d85beda836e3faba9585d822cc36c7eec.gz A _darcs/patches/20050922130235-c2a52-910657f419cac65e7358c9b021aeeba0b4703175.gz A _darcs/patches/20060509154502-c2a52-4570f27e588fa890c6a642f6b2670a5e8b36b853.gz A _darcs/patches/20060509154524-c2a52-76af4b03a81b2f593159130b7406b4b9a79ed94d.gz A _darcs/patches/20060509154643-c2a52-e9c0e0019212038a3d957011da50e3e2654466e5.gz A _darcs/patches/20060911135005-c2a52-82ab81db3e567d758e50a42cb5106e4e729e07a6.gz A _darcs/patches/20060911135017-c2a52-7f665cdb36c7f963d43870aaa9d3d8b17e79ee65.gz A _darcs/patches/20060911135413-c2a52-23bdd6be0421b90c0b7834c6cd1937a1928b48ab.gz A _darcs/patches/20060911135510-c2a52-5469317c0b6e35028b79cf4ef6644a49069a3367.gz A _darcs/patches/20060911135518-c2a52-212ed02e3b6a5376b389ed7520e6451959ab04fd.gz A _darcs/patches/20060911140109-c2a52-7d49457c5f34b22d4dc3c09c0f9860a42f143072.gz A _darcs/patches/20060911140826-c2a52-65e0d9a82dc0ba72ed360eac594599922fc647b0.gz A _darcs/patches/20060911141036-c2a52-2ecda3bfa57b30b7d5b8c9c8bd272ce82c0edf77.gz A _darcs/patches/20060911141137-c2a52-84672717218a955c9ea320d1ad90ed09f9d56a65.gz A _darcs/patches/20060915190102-c2a52-75273e4724ca8c46a4d9334692e4fd32c6c7155a.gz A _darcs/patches/20060915190214-c2a52-92a9c9f45285d44363ff1e7b99de9d253abfba9a.gz A _darcs/patches/20060915190246-c2a52-26dd5e4724f439f1dab6d095ab1cb60a9c7ab05c.gz A _darcs/patches/pending A _darcs/prefs/binaries A _darcs/prefs/boring A _darcs/prefs/defaultrepo A _darcs/prefs/motd A _darcs/prefs/repos A build/scripts-2.4/pygopherd M debian/rules commit 4131d410033e1d63742ea3f60e16e9227ba3a80e Author: John Goerzen Date: Sat Sep 16 01:02:46 2006 +0100 Update urgency M debian/changelog commit 31bc95f4d6a6ecabc6d53dad3abb61edeb88308a Author: John Goerzen Date: Sat Sep 16 01:02:14 2006 +0100 Update changelog M debian/changelog commit 0e28bf27cdc276eea3065bb559d3678b53653c37 Author: John Goerzen Date: Sat Sep 16 01:01:02 2006 +0100 Move around python stuff to fix install The system was trying to start pygopherd before python-central had a chance to do its thing. debian #387663 M debian/postinst M debian/postrm M debian/rules commit 4c22cb21947e9ee0f5d90d216508e83668662067 Author: John Goerzen Date: Mon Sep 11 20:11:37 2006 +0100 TAG DEBIAN_pygopherd_2.0.16 commit e89598794a22799ad343787fb3e92b53e95f9b6d Author: John Goerzen Date: Mon Sep 11 20:10:36 2006 +0100 Note closure of python transition bug in changelog M debian/changelog commit 0ac4aade6bdc3e7724b4d704ded05d46da2a92f9 Author: John Goerzen Date: Mon Sep 11 20:08:26 2006 +0100 Fix timeout code M pygopherd/initialization.py commit 9937e6b42336923d05cdf2b2309863047cc2332d Author: John Goerzen Date: Mon Sep 11 20:01:09 2006 +0100 Removed python2.2 in bang paths M pygopherd/GopherExceptionsTest.py M pygopherd/fileextTest.py M pygopherd/gopherentryTest.py M pygopherd/initializationTest.py M pygopherd/testutil.py M runtests.py M runtestsgui.py commit f12b9f25a2cb3dfd8784c3d26723042986a886bd Author: John Goerzen Date: Mon Sep 11 19:55:18 2006 +0100 Update control M debian/control commit 4f7929fe9d69dcb0ba6191f77f19df0de7bbe2bc Author: John Goerzen Date: Mon Sep 11 19:55:10 2006 +0100 Update changelog M debian/changelog commit d5d637888abb81461aa7afc2bdb41f36db0b7cc5 Author: John Goerzen Date: Mon Sep 11 19:54:13 2006 +0100 Changes for Debian python migration M debian/control A debian/pycompat M debian/rules commit b84510b6cea3b70266626877d8f944d678ecd5c6 Author: John Goerzen Date: Mon Sep 11 19:50:17 2006 +0100 Document timeouts in example config file M conf/pygopherd.conf commit 30552ee9941a29d33a1987ef53f8e921ace71ddb Author: John Goerzen Date: Mon Sep 11 19:50:05 2006 +0100 First attempt at setting socket timeouts M pygopherd/initialization.py commit 6d50bd2642db0af0013b31c9faa5314d73f7afc4 Author: John Goerzen Date: Tue May 9 21:46:43 2006 +0100 TAG DEBIAN_pygopherd_2.0.15 commit f8262fc5e752e23c82869944b14e15b7642b9d78 Author: John Goerzen Date: Tue May 9 21:45:24 2006 +0100 Prepping for 2.0.15 M debian/changelog M pygopherd/version.py commit b243236880fde21f51ecdb346b16dc55451deaa4 Author: John Goerzen Date: Tue May 9 21:45:02 2006 +0100 Fix handling of interface config option Debian #357315, #361435 M pygopherd/initialization.py commit ad03579cf56779f6698c3532e7121708fdd60eec Author: John Goerzen Date: Thu Sep 22 19:02:35 2005 +0100 TAG DEBIAN_pygopherd_2.0.14 commit 4f1ac16745726ea559411a2e679dd5eb4112eb7e Author: John Goerzen Date: Thu Sep 22 18:49:52 2005 +0100 More ChangeLog updates M ChangeLog commit a11ecd887ad5c3d386c0dc6b545dc8d8ca5129dc Author: John Goerzen Date: Thu Sep 22 18:48:19 2005 +0100 ChangeLog is now generated from Darcs. M Makefile commit 026d722fdc206cdbbc5ba60edb794750e213c15d Author: John Goerzen Date: Thu Sep 22 18:48:09 2005 +0100 Updated metadata for 2.0.14 M debian/changelog M pygopherd/version.py commit ced6711b133c891524191d433fb6f6bf54132fab Author: John Goerzen Date: Thu Sep 22 18:47:16 2005 +0100 Updated ChangeLog (it hadn't been updated since 2003, eep.) M ChangeLog commit 01ac0d289ab66f499c3f882c8ac915a0ecfeb729 Author: John Goerzen Date: Thu Sep 22 18:37:24 2005 +0100 Fixed a bug where no subject line would crash the handler M pygopherd/handlers/mbox.py commit c0c5b6433e4376f0b8ca6f800cc5709c5535b00a Author: John Goerzen Date: Wed Sep 14 01:19:48 2005 +0100 Don't strip leading whitespace from abstract files M pygopherd/gopherentry.py commit 01139580eeace48a67f26d732534c0ad4a07f1db Author: John Goerzen Date: Sat Apr 16 22:48:36 2005 +0100 TAG Last Arch revision commit 370007e7e0d7c45733975874b624a227b088e8c6 Author: John Goerzen Date: Sat Apr 16 22:48:09 2005 +0100 TAG Last Subversion revision commit 2f2a4f04ec400647b89b78e279df68818108ac13 Author: John Goerzen Date: Sun Feb 20 01:09:20 2005 +0100 Minor touchups for 2.0.13 Keywords: (jgoerzen@complete.org--projects/pygopherd--head--1.0--patch-6) M README M TODO M pygopherd/version.py commit 96d53f15b391e7f5d6291835e62fed93d49a89be Author: John Goerzen Date: Sun Feb 20 01:06:49 2005 +0100 Minor updates Keywords: (jgoerzen@complete.org--projects/pygopherd--head--1.0--patch-5) M debian/changelog M debian/rules M doc/pygopherd.sgml commit 829a24d556d2f41f7b6eb44982fc5c587d059067 Author: John Goerzen Date: Sun Jan 16 04:31:52 2005 +0100 Another silly fix Keywords: (jgoerzen@complete.org--projects/pygopherd--head--1.0--patch-4) M pygopherd/initialization.py commit 736f171ff8ffa8571a57a8d21340ba49ae50e922 Author: John Goerzen Date: Sun Jan 16 04:29:35 2005 +0100 Syntax error fix Keywords: (jgoerzen@complete.org--projects/pygopherd--head--1.0--patch-3) M pygopherd/initialization.py commit 59d3a4f73cfb69dfa58a70f1d968fa5b721b8b5d Author: John Goerzen Date: Sun Jan 16 04:24:15 2005 +0100 Cleaner handling of connection reset by peer Keywords: (jgoerzen@complete.org--projects/pygopherd--head--1.0--patch-2) M debian/changelog M pygopherd/initialization.py commit d23e003ddd37a0d1b17ffafc4bed21680f5646e3 Author: John Goerzen Date: Fri Jan 14 22:35:53 2005 +0100 Add small bugfix Keywords: (jgoerzen@complete.org--projects/pygopherd--head--1.0--patch-1) M debian/changelog M pygopherd/protocols/rfc1436.py commit 7e2e96514836ef225eb7637ddeabe23b3d31cbcf Author: John Goerzen Date: Sat Apr 16 22:42:56 2005 +0100 Noted removal of pygopherd.py from r204 D pygopherd.py commit 8e81becf9b5fbea75c3e640900e0f623500db55a Author: John Goerzen Date: Sat Apr 16 21:42:11 2005 +0100 TAG REL1.99.5 commit f0d7bddc12c5f3047d3f55005af203a655ad3e3a Author: John Goerzen Date: Sat Apr 16 21:41:32 2005 +0100 TAG SVN tag BEFORE-ZIPFILE-REWRITE commit f01a55f5173cad4248d11d5ba6721d4141bb2564 Author: John Goerzen Date: Sat Apr 16 21:40:59 2005 +0100 TAG REL1.0.0 commit defa6ff630c9e351351a57bbc1403aa0d2d9824c Author: jgoerzen Date: Tue Aug 31 01:51:47 2004 +0100 /pygopherd/head: changeset 309 A README.windows commit c6dea769fcb609fa8f6a56521b80a628e2ca5e71 Author: jgoerzen Date: Tue Aug 31 01:50:17 2004 +0100 /pygopherd/head: changeset 308 Make more Windows-friendly M debian/changelog M pygopherd/handlers/tal.py M pygopherd/initialization.py M pygopherd/sighandlers.py commit f11284050e285467a737fc135082713ee3e811cb Author: jgoerzen Date: Fri Aug 27 21:43:12 2004 +0100 /pygopherd/head: changeset 307 Removed extra reference to ZIP.py M pygopherd/handlers/ZIP.py commit 234fa58d0250b65e4b23b5151d41ae4175d7fcdd Author: jgoerzen Date: Thu Dec 18 00:29:06 2003 +0100 /pygopherd/head: changeset 306 Fixed indentation M pygopherd/handlers/tal.py commit 8a9f7bebd9855abf81ec0f54a4fee7635d0678ad Author: jgoerzen Date: Thu Dec 18 00:26:43 2003 +0100 /pygopherd/head: changeset 305 Don't crash if tal is unavailable. M debian/changelog M pygopherd/handlers/tal.py commit 164d308d363a3665f9b8aee8c4d5d39464dedc73 Author: jgoerzen Date: Wed Dec 17 22:20:42 2003 +0100 /pygopherd/head: changeset 304 Updated the ChangeLog M ChangeLog commit d401c56b3d1637d44dcc8f45e067e41a8fe393f0 Author: jgoerzen Date: Wed Dec 17 22:20:32 2003 +0100 /pygopherd/head: changeset 303 Fixed the earlier fix... M pygopherd/handlers/UMN.py commit 6e80c54b203fef4cdb7db0ccfbce17940def3c5d Author: jgoerzen Date: Wed Dec 17 21:44:11 2003 +0100 /pygopherd/head: changeset 302 Fixed a logic error in the Numb handling fix. M debian/changelog M pygopherd/handlers/UMN.py commit d0c8d4fa6c83204d2bc312f60422371a37a529c5 Author: jgoerzen Date: Wed Dec 17 21:27:33 2003 +0100 /pygopherd/head: changeset 301 Fixed UMN.py to properly handle Numb=. M debian/changelog M pygopherd/handlers/UMN.py commit ba34c2c24775cae52f6459a20a3f906a47b44b61 Author: jgoerzen Date: Wed Dec 17 21:20:30 2003 +0100 /pygopherd/head: changeset 300 Generic TAL support M pygopherd/handlers/tal.py commit dbf102e7280651e2c7caf47e5ad37902275b1ec3 Author: jgoerzen Date: Fri Oct 10 03:48:13 2003 +0100 /pygopherd/head: changeset 299 Updated debian/docs M debian/changelog M debian/docs commit 1bd83e4b2f10c500ddf05a55b1f0763333798426 Author: jgoerzen Date: Thu Oct 9 22:11:33 2003 +0100 /pygopherd/head: changeset 298 Added build-dep on python2.3-dev M debian/changelog commit 17cc71cbcccb69efdd7f51c1e69ee6c4842ccb65 Author: jgoerzen Date: Tue Aug 26 09:29:52 2003 +0100 /pygopherd/head: changeset 297 Added missing docs Misc. tal stuff A doc/book.sgml A doc/manpage.sgml A doc/quickstart.sgml M pygopherd/handlers/tal.py commit 85c15b4f5a585fcb95d0cddf9934c23d01c0c6f5 Author: jgoerzen Date: Tue Aug 26 07:42:14 2003 +0100 /pygopherd/head: changeset 296 Added dir, macro capability to tal.py Some work on the manual -- splitting up into sections M Makefile M doc/pygopherd.ps M doc/pygopherd.sgml M local.dsl M pygopherd/handlers/tal.py commit 44ec1cdd1cd0dc48a2958839e83f9d1d1e109eeb Author: jgoerzen Date: Tue Aug 26 05:56:15 2003 +0100 /pygopherd/head: changeset 295 Make is a little more aggressive about cleaning... ... added stylesheets. M Makefile A local.dsl A printlocal.dsl commit d8bc256c16e3313fe1b8cf06e6d0971f7f109d74 Author: jgoerzen Date: Tue Aug 26 04:01:38 2003 +0100 /pygopherd/head: changeset 294 Doc updates M Makefile M doc/pygopherd.8 M doc/pygopherd.html M doc/pygopherd.pdf M doc/pygopherd.ps commit f06ac4aeb77fe0a464b9129a765c851dad7411fc Author: jgoerzen Date: Tue Aug 26 03:17:38 2003 +0100 /pygopherd/head: changeset 293 Finalizing the document renaming R100 doc/manual.ps doc/pygopherd.ps commit 172e5acf3fed657a10b08ebe014de2b15e805a4c Author: jgoerzen Date: Tue Aug 26 03:17:23 2003 +0100 /pygopherd/head: changeset 292 More document renaming R100 doc/manual.html doc/pygopherd.html R100 doc/manual.pdf doc/pygopherd.pdf R100 doc/manual.txt doc/pygopherd.txt commit 3be9fa66deba868b8711c8a08ba6008a6731c95d Author: jgoerzen Date: Tue Aug 26 03:14:52 2003 +0100 /pygopherd/head: changeset 291 M Makefile R100 manual.html doc/manual.html R100 manual.pdf doc/manual.pdf R100 manual.ps doc/manual.ps R100 manual.txt doc/manual.txt R100 pygopherd.8 doc/pygopherd.8 R099 pygopherd.sgml doc/pygopherd.sgml commit ffa7616d004ffeb21dc43e7897b88df883b26d58 Author: jgoerzen Date: Tue Aug 26 03:10:38 2003 +0100 /pygopherd/head: changeset 290 Fixed up Python2.3 support -- and added dep on simpletal M debian/control commit d274afdd22aae4e3709404db376add2a76f307b4 Author: jgoerzen Date: Tue Aug 26 02:17:36 2003 +0100 /pygopherd/head: changeset 289 Added a TAL example A examples/talsample.html.tal commit a8c75ad67c28a2ce82831d8b9f2df67c93541e8b Author: jgoerzen Date: Tue Aug 26 02:15:58 2003 +0100 /pygopherd/head: changeset 288 Added beginnings of TAL support. More to come. M bin/pygopherd M conf/pygopherd.conf M pygopherd/handlers/__init__.py A pygopherd/handlers/tal.py M setup.py commit 9e203dee34b48176c5206ecf1cf654983975f85b Author: jgoerzen Date: Tue Aug 26 00:47:40 2003 +0100 /pygopherd/head: changeset 287 Documented the ZIP handler M manual.html M manual.pdf M manual.ps M manual.txt M pygopherd.8 M pygopherd.sgml M pygopherd/handlers/ZIP.py commit b016e47e9ab677f23603fa076eddc0405cd4cbae Author: jgoerzen Date: Mon Aug 25 21:31:58 2003 +0100 /pygopherd/head: changeset 286 Work on documenting the handlers M pygopherd.sgml commit 577bb5e0527fc6c3d35f10293fe7e6226a1a18f6 Author: jgoerzen Date: Mon Aug 25 07:38:33 2003 +0100 /pygopherd/head: changeset 285 Some work on the docs M manual.html M manual.pdf M manual.ps M manual.txt M pygopherd.8 M pygopherd.sgml commit 3a302de42a50d5d63d7baf9c5c532f6da828450f Author: jgoerzen Date: Mon Aug 25 05:17:20 2003 +0100 /pygopherd/head: changeset 284 Updated M manual.html M manual.pdf M manual.ps M manual.txt M pygopherd.8 M pygopherd.sgml commit 932ddd97cc235f29668a373def0dc3854d8755cd Author: jgoerzen Date: Mon Aug 25 04:34:16 2003 +0100 /pygopherd/head: changeset 283 Added SGML docs. M Makefile A pygopherd.sgml commit 145ae50b79fc3265e2c288c4750489baeac8e789 Author: jgoerzen Date: Mon Aug 25 04:30:10 2003 +0100 /pygopherd/head: changeset 282 M debian/changelog M pygopherd/initialization.py M pygopherd/protocols/wap.py commit 78a74e57c499abb9bb15e7843be4e1adeb8692cb Author: jgoerzen Date: Sun Aug 24 04:39:47 2003 +0100 /pygopherd/head: changeset 281 Updated WAP error handling M pygopherd/protocols/wap.py commit 234d01a697839b4b74a8ad0aa9bd4bcd983c7fa9 Author: jgoerzen Date: Sun Aug 24 04:34:40 2003 +0100 /pygopherd/head: changeset 280 Fixed File Not Found code. M debian/changelog M pygopherd/protocols/http.py M pygopherd/protocols/wap.py commit f53b8777b3667d33c621ca5b8c0f3ab8211bed9f Author: jgoerzen Date: Sun Aug 24 04:25:56 2003 +0100 /pygopherd/head: changeset 279 Store slurp data elsewhere M pygopherd/protocols/http.py commit 391b8923acb6154cfc535431abb5721bd57db5b3 Author: jgoerzen Date: Sun Aug 24 04:23:38 2003 +0100 /pygopherd/head: changeset 278 Fixed another bug in headerslurp M pygopherd/protocols/http.py commit 479635052dfcbfc18e2b1bd5ac9d04664305db67 Author: jgoerzen Date: Sun Aug 24 04:22:15 2003 +0100 /pygopherd/head: changeset 277 Replaced a missing return M pygopherd/protocols/http.py commit 14f068a8b17e5df30a8d06980b12e76b7592c5f1 Author: jgoerzen Date: Sun Aug 24 04:20:16 2003 +0100 /pygopherd/head: changeset 276 Experimental new header slurping mechanism M pygopherd/protocols/http.py M pygopherd/protocols/wap.py commit 34bbf7f0245620dc6742ef48ac21ea6252873d30 Author: jgoerzen Date: Sun Aug 24 04:13:19 2003 +0100 /pygopherd/head: changeset 275 Added wap auto-detection. M conf/pygopherd.conf M debian/changelog M pygopherd/protocols/http.py M pygopherd/protocols/wap.py commit a8737d418429a1514b6ac049fae81315187a4d72 Author: jgoerzen Date: Sun Aug 24 01:56:50 2003 +0100 /pygopherd/head: changeset 274 Fixed a tyop M pygopherd/protocols/wap.py commit a790046c9dc3d6097a0c0eb7209516c0e73fc940 Author: jgoerzen Date: Sun Aug 24 01:53:18 2003 +0100 /pygopherd/head: changeset 273 Added text file conversion to WAP M pygopherd/protocols/http.py M pygopherd/protocols/wap.py commit 6b151d14f94ae9d600877ddcf0d3b6543aacee2c Author: jgoerzen Date: Sun Aug 24 01:43:12 2003 +0100 /pygopherd/head: changeset 272 Virtual: now use | for selector sep (keep ? for legacy) for WAP compatibility. M debian/changelog M pygopherd/handlers/virtual.py commit 9022f8c29143aef6346bf50102229122df123f07 Author: jgoerzen Date: Sun Aug 24 01:41:13 2003 +0100 /pygopherd/head: changeset 271 Some updates M pygopherd/protocols/http.py M pygopherd/protocols/wap.py commit 408f6456e6f28bdfe4386bc5db304e93a04c6f48 Author: jgoerzen Date: Sun Aug 24 00:54:31 2003 +0100 /pygopherd/head: changeset 270 Add the waptop in front of generated URLs M pygopherd/protocols/wap.py commit e3485ab2e6f68b9197580517562fcfa9200af190 Author: jgoerzen Date: Sun Aug 24 00:51:18 2003 +0100 /pygopherd/head: changeset 269 Minor WAP bugfixes M pygopherd/protocols/wap.py commit 88eb735f888fb6e2907a27d1475a8188bdefe7f1 Author: jgoerzen Date: Sun Aug 24 00:49:29 2003 +0100 /pygopherd/head: changeset 268 Updated for Python 2.3 -- and added some more WAP code (for searches) M debian/changelog M debian/control M debian/rules M pygopherd/protocols/wap.py commit c5273c08c371aa8377f2d7b036d8ee9ed2342c7e Author: jgoerzen Date: Sun Aug 24 00:26:50 2003 +0100 /pygopherd/head: changeset 267 Braino M pygopherd/protocols/wap.py commit acd68ab71d324ec13233c446ec943820f4c300a6 Author: jgoerzen Date: Sun Aug 24 00:26:10 2003 +0100 /pygopherd/head: changeset 266 More updates M pygopherd/protocols/wap.py commit 9bc514db6dfbe320ca823acb805e339572dae9ff Author: jgoerzen Date: Sun Aug 24 00:19:02 2003 +0100 /pygopherd/head: changeset 265 Another braino M pygopherd/protocols/wap.py commit c4107c400aed2aa87295464f3e315e60d7c27a70 Author: jgoerzen Date: Sun Aug 24 00:18:23 2003 +0100 /pygopherd/head: changeset 264 Oops, little braino here M pygopherd/protocols/wap.py commit 8c7b89b5da9e42599e23265ea7c8c0393505a604 Author: jgoerzen Date: Sun Aug 24 00:17:37 2003 +0100 /pygopherd/head: changeset 263 Removed debugging code and added accesskey support M pygopherd/protocols/wap.py commit af0794cb1fd7d697f95e86746b993c18e4b99407 Author: jgoerzen Date: Sun Aug 24 00:13:22 2003 +0100 /pygopherd/head: changeset 262 Wap now works! M debian/changelog M pygopherd/protocols/http.py M pygopherd/protocols/wap.py commit abeec36b6ec6ac2769387a9c2fab534e5ee31167 Author: jgoerzen Date: Sat Aug 23 23:01:49 2003 +0100 /pygopherd/head: changeset 261 First attempt at new feature: WAP support! M conf/pygopherd.conf M debian/changelog M pygopherd/protocols/__init__.py M pygopherd/protocols/http.py A pygopherd/protocols/wap.py commit 1aa2486d7eb5ee73682b0fd5a019919d4567a8f8 Author: jgoerzen Date: Thu Mar 13 22:53:11 2003 +0100 /pygopherd/head: changeset 259 Updated for 1.99.5 M ChangeLog commit 8f29f3b8a3981de519f68ad6421e09529bc63b1e Author: jgoerzen Date: Thu Mar 13 22:52:47 2003 +0100 /pygopherd/head: changeset 258 Introduced new "inode-like" caching system for ZIP files. Now, the first time a ZIP file is accessed, it will be scanned. Links will be resolved immediately. A dictionary tree is built up; values being either file offsets in the ZIP file or dictionaries (for subdirectories). This dictionary is then cached on-disk using a binary database and marshal algorithm derived from Python's shelve module. We do not need to use pickle for this task since we are saving only simple structures. The performance gain for large ZIP files using this method is tremendous. The only time a ZIP file's central directory structure must be scanned now is the very first time it is ever accessed. M debian/changelog commit 19e6dc712dca463873a6c9d8d9a861fb93036810 Author: jgoerzen Date: Thu Mar 13 22:48:56 2003 +0100 /pygopherd/head: changeset 257 Removed the needschain tests Optimized the gophermap isrequestforme handler M pygopherd/handlers/ZIP.py M pygopherd/handlers/gophermap.py commit 77c51e1e39e03d4937b4c85d2adac9ae1460c1ac Author: jgoerzen Date: Thu Mar 13 21:58:54 2003 +0100 /pygopherd/head: changeset 256 Converted to using marshal for a performance gain M pygopherd/handlers/ZIP.py commit 56c594e7dd3ecb10b616392bc909d911716f324c Author: jgoerzen Date: Thu Mar 13 08:20:33 2003 +0100 /pygopherd/head: changeset 255 Removed debug code M pygopherd/handlers/ZIP.py commit 780f4f741763a700abfcc43e9a3ad8d24fbe18de Author: jgoerzen Date: Thu Mar 13 08:20:01 2003 +0100 /pygopherd/head: changeset 254 Passes all ZIP tests. M pygopherd/handlers/ZIP.py M pygopherd/zipfile.py commit 09e91cddbbe736e0e14578c408ec890e4761bf33 Author: jgoerzen Date: Thu Mar 13 08:02:49 2003 +0100 /pygopherd/head: changeset 253 Removed debug code M pygopherd/handlers/ZIP.py commit 29713893818b0ca657cec8b6fdf1c9e0c0f01f2b Author: jgoerzen Date: Thu Mar 13 07:56:26 2003 +0100 /pygopherd/head: changeset 252 Think I've nailed the caching problem M pygopherd/handlers/ZIP.py commit 6ccbc2d686f629f769409fb0474b30c432de2c49 Author: jgoerzen Date: Thu Mar 13 07:32:48 2003 +0100 /pygopherd/head: changeset 251 All tests are passing, but caching doesn't seem to be working. M pygopherd/handlers/ZIP.py M pygopherd/zipfile.py commit 2528294324ba357903c22321706db02bb6e13f78 Author: jgoerzen Date: Thu Mar 13 07:28:35 2003 +0100 /pygopherd/head: changeset 250 Strating to fix errors as part of testing M pygopherd/handlers/ZIP.py M pygopherd/zipfile.py commit 926305ee47959817bfca455dba00946613ce78e3 Author: jgoerzen Date: Thu Mar 13 05:55:49 2003 +0100 /pygopherd/head: changeset 249 Making more progress -- we now have this to the point of being ready for testing, I believe. M ChangeLog M debian/changelog M pygopherd/handlers/ZIP.py commit edc6de8cd175970ac2fb24f8b4a44e38e917261f Author: jgoerzen Date: Thu Mar 13 05:20:19 2003 +0100 /pygopherd/head: changeset 248 Checkpointing my progress -- initial efforts to rewrite the caching to use an inode system complete. M pygopherd/handlers/ZIP.py M pygopherd/zipfile.py commit d067f006964c1e8e1f6c5f98519c5a145e11c5c6 Author: jgoerzen Date: Thu Mar 13 04:37:27 2003 +0100 /pygopherd/head: changeset 247 Merged back in bugfix to islinkattr from ZIP.py prior to this rev. M pygopherd/handlers/ZIP.py commit c100afe7a874a384b95dd2ede9ac73826f46d727 Author: jgoerzen Date: Thu Mar 13 04:33:07 2003 +0100 /pygopherd/head: changeset 246 Reverted to ZIP.py from revision 229 when pickling was present. Will try to re-do this more efficiently with the new zipfile and anydbm. M pygopherd/handlers/ZIP.py commit 931ac1b6b8030bb30669a12ff05d9b54b60f16e9 Author: jgoerzen Date: Sat Mar 8 05:01:39 2003 +0100 /pygopherd/head: changeset 245 Added additional optimizations, tested working. M pygopherd/handlers/ZIP.py M pygopherd/handlers/dir.py commit f8d8a818b2c365ef96c6ff096874f8daee6d7531 Author: jgoerzen Date: Fri Mar 7 12:53:39 2003 +0100 /pygopherd/head: changeset 244 Fixed an excessive stating problem. M pygopherd/handlers/HandlerMultiplexer.py M pygopherd/handlers/ZIP.py M pygopherd/handlers/dir.py M pygopherd/zipfile.py commit 56c18a4059d18773fb59692a76ac736d3bed0281 Author: jgoerzen Date: Fri Mar 7 12:12:40 2003 +0100 /pygopherd/head: changeset 243 Significant optimizations noted in output from zip stuff. M pygopherd/handlers/ZIP.py commit 0b390e39f724d342b161048662116475fcabcbd7 Author: jgoerzen Date: Fri Mar 7 12:05:11 2003 +0100 /pygopherd/head: changeset 242 Tests now pass. Time to see how this optimization fares. M pygopherd/handlers/ZIP.py M pygopherd/zipfile.py commit 399bacc58a4e38c8a2d4a16b661e77c291c360ee Author: jgoerzen Date: Fri Mar 7 11:57:59 2003 +0100 /pygopherd/head: changeset 241 In the middle of some optimizing. M pygopherd/handlers/ZIP.py M pygopherd/zipfile.py commit 88ad0bd5d3b9d755cbb1ba30275b2b5fd31f8586 Author: jgoerzen Date: Fri Mar 7 11:44:36 2003 +0100 /pygopherd/head: changeset 240 Some feeble optimization attempts. M pygopherd/handlers/ZIP.py M pygopherd/zipfile.py commit 642135246b7cc9f4dbbc26ce520ac8961c1d0062 Author: jgoerzen Date: Fri Mar 7 11:13:36 2003 +0100 /pygopherd/head: changeset 239 Tests are all passing! M pygopherd/handlers/ZIP.py M pygopherd/zipfile.py commit 07352ca1964aeb1586fa9ee84c954c2eb4dcd5fe Author: jgoerzen Date: Fri Mar 7 10:54:42 2003 +0100 /pygopherd/head: changeset 238 Removed _resolvelink debug code M pygopherd/handlers/ZIP.py commit 7c5a3c724a2b2770dad7991cbfbcef63462bd555 Author: jgoerzen Date: Fri Mar 7 10:54:13 2003 +0100 /pygopherd/head: changeset 237 Fixed _resolvelink M pygopherd/handlers/ZIP.py M pygopherd/zipfile.py commit 85caec588203111e871012e344185ae26c96c902 Author: jgoerzen Date: Sat Mar 8 00:23:16 2003 +0100 /pygopherd/head: changeset 236 Ready to test. M pygopherd/handlers/ZIP.py M pygopherd/handlers/base.py M pygopherd/handlers/file.py M pygopherd/zipfile.py commit 6e356bbd34a0495bc8c1c7cd1fc4e0df2e3d7506 Author: jgoerzen Date: Fri Mar 7 23:29:02 2003 +0100 /pygopherd/head: changeset 235 Completed initial work on the new zipfile.py. M pygopherd/handlers/ZIP.py M pygopherd/zipfile.py M runtests.py commit 52051ac9b25ef66652661fff89469b6182e34e04 Author: jgoerzen Date: Fri Mar 7 10:25:11 2003 +0100 /pygopherd/head: changeset 233 Added from upstream CVS A pygopherd/zipfile.py commit 9ce927dacb175bed1159b79eb3e27400b7cb921e Author: jgoerzen Date: Fri Mar 7 08:49:15 2003 +0100 /pygopherd/head: changeset 232 Made great strides here. M pygopherd/handlers/ZIP.py commit b9647e3d3ca723c7297e63a18f1174b89b5dab9b Author: jgoerzen Date: Fri Mar 7 08:32:21 2003 +0100 /pygopherd/head: changeset 231 Reworking the symlink stuff. M pygopherd/handlers/ZIP.py commit fa120e2d42a6ef7b763ea5f1344771b6e9134ba8 Author: jgoerzen Date: Fri Mar 7 06:03:04 2003 +0100 /pygopherd/head: changeset 230 M debian/changelog M pygopherd/handlers/ZIP.py commit b1af614fc4c157cd57c49a3c683163530f02cb74 Author: jgoerzen Date: Fri Mar 7 04:09:59 2003 +0100 /pygopherd/head: changeset 229 All tests now pass! M pygopherd/handlers/ZIP.py commit f0349d4d5a6b92e0a0ea9acb720820ce4f86dabb Author: jgoerzen Date: Fri Mar 7 04:08:16 2003 +0100 /pygopherd/head: changeset 228 Making progress on ironing out bugs. M pygopherd/handlers/ZIP.py M pygopherd/handlers/base.py M testdata/symlinktest.zip commit 0d0d1585f3fc2f4b49103da54f4b7f2429eb460b Author: jgoerzen Date: Fri Mar 7 03:03:40 2003 +0100 /pygopherd/head: changeset 227 Checkpointing M debian/changelog M pygopherd/handlers/ZIP.py M pygopherd/handlers/html.py M runtests.py commit d1518fcf1f6590591c80b4c34771932c71eb9048 Author: jgoerzen Date: Fri Mar 7 00:10:13 2003 +0100 /pygopherd/head: changeset 226 Updated the changelog M debian/changelog commit 43c015d5f09e32ec823b2bc01de6e2237d827b6f Author: jgoerzen Date: Fri Mar 7 00:08:01 2003 +0100 /pygopherd/head: changeset 225 Refined directory handling. Greatly expanded tests. Added a full symlink test battery. listdir() now raises OSError when called on an invalid directory. open() now raises IOError when called on a directory. M pygopherd/handlers/ZIP.py commit 2e20670cb205ecc190164df5818b027069dbe05a Author: jgoerzen Date: Thu Mar 6 23:43:16 2003 +0100 /pygopherd/head: changeset 224 Directory symlinking now seems to work. M pygopherd/handlers/ZIP.py M testdata/symlinktest.zip commit 8a40c1eed4f3339ab4ba74ccb588d5f6ef3afbf8 Author: jgoerzen Date: Thu Mar 6 23:04:14 2003 +0100 /pygopherd/head: changeset 223 M testdata/symlinktest.zip commit ec5d102c7f121c54eac880cf365872c4b15ad4e6 Author: jgoerzen Date: Thu Mar 6 12:58:43 2003 +0100 /pygopherd/head: changeset 222 Fixed up tests to take note of new file symlinktest.zip M pygopherd/protocols/rfc1436Test.py A testdata/symlinktest.zip commit f36757f7722f57b1fbaa87ef5188a5f06e0f6376 Author: jgoerzen Date: Thu Mar 6 12:56:21 2003 +0100 /pygopherd/head: changeset 221 Removed debug code M pygopherd/handlers/ZIP.py M pygopherd/handlers/dir.py commit 8c289bd71404291e984d2188ccd5837149b1e1f7 Author: jgoerzen Date: Thu Mar 6 12:55:48 2003 +0100 /pygopherd/head: changeset 220 Added symlink capabilities to ZIP.py M pygopherd/handlers/ZIP.py M pygopherd/handlers/dir.py commit 9a02cba410953502abf591efb5dab52aa33a1188 Author: jgoerzen Date: Thu Mar 6 11:34:14 2003 +0100 /pygopherd/head: changeset 219 Added this. A testdata/ziptorture.zip commit 0f31a3a67498623cab629d94944a6414d60ddbaa Author: jgoerzen Date: Thu Mar 6 11:26:31 2003 +0100 /pygopherd/head: changeset 218 Noted recent changes M debian/changelog commit 0a43331d410b66a298c0db6344848cf5e4034f8b Author: jgoerzen Date: Thu Mar 6 11:25:19 2003 +0100 /pygopherd/head: changeset 217 All tests pass! M pygopherd/gopherentry.py M pygopherd/gopherentryTest.py M pygopherd/handlers/gophermap.py M pygopherd/protocols/rfc1436Test.py commit 4a04cd50c8eb6014b355f0810eea71be697bb26c Author: jgoerzen Date: Thu Mar 6 11:05:37 2003 +0100 /pygopherd/head: changeset 216 Removed some debug code M pygopherd/gopherentry.py commit d04e4895d7de65b2d6bc716d42cc432985394294 Author: jgoerzen Date: Thu Mar 6 11:02:14 2003 +0100 /pygopherd/head: changeset 215 More progress -- basic ZIP file now working! M conf/pygopherd.conf M pygopherd/gopherentry.py M pygopherd/handlers/ZIP.py M pygopherd/handlers/__init__.py M pygopherd/handlers/base.py M pygopherd/handlers/dir.py M pygopherd/handlers/file.py M pygopherd/handlers/gophermap.py M pygopherd/protocols/rfc1436Test.py M testdata/testdata.zip commit 5f5ca2d2254139a0e14c9b5db71e049c6973e436 Author: jgoerzen Date: Thu Mar 6 05:51:06 2003 +0100 /pygopherd/head: changeset 214 - This is the beginning of work to add a VFS system to PyGopherd. Changes: - Added runtestsgui, updated runtests - Modified all handlers to be VFS-aware - Implemented VFS_Real in base.py - Implemented VFS_ZIP in ZIP.py - Added ZIPHandler in ZIP.py - Updated HandlerMultiplexer to use VFS TODO: - Make ZIPHandler re-run handlermultiplexer and call it with all subsequent calls - Genericize ZIPHandler M pygopherd/handlers/HandlerMultiplexer.py M pygopherd/handlers/UMN.py A pygopherd/handlers/ZIP.py M pygopherd/handlers/base.py M pygopherd/handlers/dir.py M pygopherd/handlers/file.py M pygopherd/handlers/gophermap.py M pygopherd/handlers/html.py M pygopherd/handlers/mbox.py M pygopherd/handlers/pyg.py M pygopherd/handlers/scriptexec.py M pygopherd/handlers/virtual.py M pygopherd/protocols/rfc1436Test.py M runtests.py C080 pygopherd/protocols/__init__.py runtestsgui.py A testdata/testdata.zip A testdata/testdata2.zip commit 6c4854e65da3875c477e8925ceb063ee6404836b Author: jgoerzen Date: Wed Mar 5 03:46:27 2003 +0100 /pygopherd/head: changeset 213 Clarified license terms M Makefile M bin/pygopherd M debian/copyright M pygopherd.8 M pygopherd/GopherExceptions.py M pygopherd/GopherExceptionsTest.py M pygopherd/__init__.py M pygopherd/fileext.py M pygopherd/fileextTest.py M pygopherd/gopherentry.py M pygopherd/gopherentryTest.py M pygopherd/handlers/HandlerMultiplexer.py M pygopherd/handlers/UMN.py M pygopherd/handlers/__init__.py M pygopherd/handlers/base.py M pygopherd/handlers/dir.py M pygopherd/handlers/file.py M pygopherd/handlers/gophermap.py M pygopherd/handlers/html.py M pygopherd/handlers/mbox.py M pygopherd/handlers/scriptexec.py M pygopherd/handlers/url.py M pygopherd/initialization.py M pygopherd/initializationTest.py M pygopherd/pipe.py M pygopherd/protocols/ProtocolMultiplexer.py M pygopherd/protocols/__init__.py M pygopherd/protocols/base.py M pygopherd/protocols/enhanced.py M pygopherd/protocols/gopherp.py M pygopherd/protocols/http.py M pygopherd/protocols/rfc1436.py M pygopherd/sighandlers.py M pygopherd/testutil.py M pygopherd/version.py M runtests.py M setup.py commit 73c7b37e33d962f3be49d5e4ae713d563090fd93 Author: jgoerzen Date: Sat Feb 22 06:05:52 2003 +0100 /pygopherd/head: changeset 212 Fixed gopherentry object for .gophermap files M pygopherd/handlers/gophermap.py commit ab6e6cb14196b3a1d1301da37e75f17de4c666bd Author: jgoerzen Date: Sat Feb 22 04:15:09 2003 +0100 /pygopherd/head: changeset 211 Added A TODO commit 1e2d37c0b9a540fc4b96665ac9319e5f01ebe166 Author: jgoerzen Date: Sat Feb 22 04:14:46 2003 +0100 /pygopherd/head: changeset 210 Added ability to serve up files ending in .gophermap as Gophermap files. M debian/changelog M pygopherd/handlers/gophermap.py commit d081b5f3b45593ad7ed29318c15b6075cf0617a8 Author: jgoerzen Date: Fri Aug 9 03:45:08 2002 +0100 /pygopherd/head: changeset 209 Preparing for 1.1.0 M debian/changelog M pygopherd/handlers/UMN.py M pygopherd/version.py commit 94ac1662359e3ae2d803c9d2ece527b14ea76f7d Author: jgoerzen Date: Fri Aug 9 03:39:10 2002 +0100 /pygopherd/head: changeset 208 Committed initial draft of the manual. A manual.html A manual.pdf A manual.ps A manual.txt M pygopherd.8 commit 93ceb617d7777dbbb64f2c5c9f210afd535a5f6d Author: jgoerzen Date: Fri Aug 9 01:32:57 2002 +0100 /pygopherd/head: changeset 207 Initial draft of manual. M pygopherd.8 commit d3e262ff42bd9474a403bf6dc8195ec1c616f70b Author: jgoerzen Date: Fri Aug 9 00:32:05 2002 +0100 /pygopherd/head: changeset 206 Began new manual that already incorporates the entire content of the old LyX one, so removed it. D doc/manual.lyx M pygopherd.8 commit 15bc6dad4726d4e7bf677f6d7b07010c5adb93cf Author: jgoerzen Date: Fri Aug 9 00:13:50 2002 +0100 /pygopherd/head: changeset 205 First stab at a manpage/manual -- initially imported from OfflineIMAP. M Makefile M debian/changelog M debian/docs A pygopherd.8 commit 7f5783955d4b08ee078eb477bb80ab113bd4783d Author: jgoerzen Date: Fri Aug 9 00:09:53 2002 +0100 /pygopherd/head: changeset 204 Moved pygopherd.py to bin and adjusted other files to reflect this C100 pygopherd.py bin/pygopherd M debian/rules M setup.py commit bb623c6d9e8ad013b5fb66cdfba75d1cb8e43b4a Author: jgoerzen Date: Thu Aug 8 23:57:54 2002 +0100 /pygopherd/head: changeset 203 Removed TODO file (now kept in bug-tracking system) D TODO M debian/changelog commit f73796c81d6aea17ca7f4408f8b27cc054b65f7c Author: jgoerzen Date: Thu Aug 8 22:46:15 2002 +0100 /pygopherd/head: changeset 202 Clarified relationship between ignorepatt and UMNDirHandler M conf/pygopherd.conf commit f2bd4c0edb19cae72154a0c20524e321d51d01cb Author: jgoerzen Date: Thu Aug 8 10:24:25 2002 +0100 /pygopherd/head: changeset 201 Commiting old changes M debian/changelog commit 3ac917054d9db54d7e3336ccc1c59d9151ad45f0 Author: jgoerzen Date: Tue Jul 23 19:04:37 2002 +0100 /pygopherd/head: changeset 200 Paranoia: chdir to our root. M pygopherd/initialization.py commit 83e43d3b904a1ce158319cf7f700cacf177b8076 Author: jgoerzen Date: Mon Jul 22 19:17:22 2002 +0100 /pygopherd/head: changeset 199 Added "advertisedport" feature. M conf/pygopherd.conf M pygopherd/initialization.py commit 13c1fa7cb16d4b3f800e68f28268a38f1c9598b3 Author: jgoerzen Date: Thu Jul 18 22:26:09 2002 +0100 /pygopherd/head: changeset 197 Updated for 1.0.0 release. M ChangeLog commit 13a2c1dbbd43d24c0e711c51ebb3766ad00e58f2 Author: jgoerzen Date: Thu Jul 18 22:16:35 2002 +0100 /pygopherd/head: changeset 196 Removed old .ex files. Set rules to install examples/* into Debian package. D debian/cron.d.ex D debian/emacsen-install.ex D debian/emacsen-remove.ex D debian/emacsen-startup.ex D debian/manpage.1.ex D debian/manpage.sgml.ex D debian/menu.ex D debian/preinst.ex D debian/prerm.ex M debian/rules D debian/watch.ex commit f9a4fb235e27d9b2e89c8aa577c3c6fc823f90dd Author: jgoerzen Date: Thu Jul 18 22:15:13 2002 +0100 /pygopherd/head: changeset 195 Fixed tests to work with Subversion, and made sure things that need to be set executable, are. M debian/changelog M pygopherd/GopherExceptionsTest.py M pygopherd/protocols/baseTest.py M pygopherd/protocols/rfc1436Test.py commit 99759f8fc643a380781b5ac188acafb18ad8ba03 Author: jgoerzen Date: Thu Jul 18 22:14:20 2002 +0100 /pygopherd/head: changeset 194 Fixed to keep dot directories out of the list. M pygopherd/handlers/UMN.py commit 6dbd396f414efc555dbbe05aeb9a37a209a1daa5 Author: jgoerzen Date: Thu Jul 18 22:05:50 2002 +0100 /pygopherd/head: changeset 193 A few last-minute tweaks M ChangeLog M Makefile M debian/changelog commit 745c3c3c1056fe61cd7b8da464c0279fb00b007b Author: jgoerzen Date: Thu Jul 18 07:05:05 2002 +0100 /pygopherd/head: changeset 192 Added URL type rewriter. Modified handler importing scheme to work nicer. Preparing for 1.0.0 release. M conf/pygopherd.conf M debian/changelog M pygopherd/gopherentry.py M pygopherd/handlers/HandlerMultiplexer.py M pygopherd/handlers/UMN.py M pygopherd/handlers/__init__.py M pygopherd/handlers/base.py M pygopherd/handlers/dir.py M pygopherd/handlers/file.py M pygopherd/handlers/gophermap.py M pygopherd/handlers/html.py M pygopherd/handlers/mbox.py M pygopherd/handlers/pyg.py M pygopherd/handlers/scriptexec.py M pygopherd/handlers/url.py M pygopherd/version.py commit 61dc2d3e08e91eb17cce31ee6d792e58d2e86ad0 Author: jgoerzen Date: Thu Jul 18 06:33:07 2002 +0100 /pygopherd/head: changeset 191 Fixed gophermap info-only lines that have no tabs M debian/changelog M pygopherd/handlers/gophermap.py commit c705f5396f17360d66d81781e9cb5e4333ff63e1 Author: jgoerzen Date: Thu Jul 18 06:28:16 2002 +0100 /pygopherd/head: changeset 190 Initial move over to Subversion: mark appropriate files executable, new way of generating the ChangeLog. M ChangeLog M Makefile commit 4a9a82c2032693e5860cab526e8a7cc6a9403504 Author: jgoerzen Date: Wed Jul 3 05:43:05 2002 +0100 /pygopherd/head: changeset 188 Version 0.9.14 M ChangeLog M debian/changelog M pygopherd/initialization.py M pygopherd/version.py commit bfe20acb3277518f07480365c9e7cb61a79259f0 Author: jgoerzen Date: Wed Jul 3 03:34:02 2002 +0100 /pygopherd/head: changeset 187 Fixed a bug with HTML processing M debian/changelog M debian/rules M pygopherd/GopherExceptions.py M pygopherd/handlers/html.py M pygopherd/version.py commit 921bb2a2cff968753538da3f80b4701b4cd77b5a Author: jgoerzen Date: Wed Jul 3 03:04:06 2002 +0100 /pygopherd/head: changeset 186 Added signal handler mechanisms to foster orderly shutdowns. M ChangeLog M pygopherd/initialization.py A pygopherd/sighandlers.py commit bb0b4286dc9e41d117532807252403e7b850d0b7 Author: jgoerzen Date: Fri May 3 02:24:41 2002 +0100 /pygopherd/head: changeset 185 Amplified the exitfunc. M ChangeLog M pygopherd/initialization.py commit 8bf5f9667e660a4e3fbe237dade41c09482c1500 Author: jgoerzen Date: Fri May 3 02:13:45 2002 +0100 /pygopherd/head: changeset 184 Added support for detached operation and pidfile writing. M README M conf/pygopherd.conf M debian/changelog M debian/init.d M pygopherd/initialization.py M pygopherd/version.py commit cbe9fb538ee5960bda30a90669da00ee88e3c063 Author: jgoerzen Date: Thu May 2 03:45:47 2002 +0100 /pygopherd/head: changeset 183 Added a dep on a non-buggy python2.2 M ChangeLog M debian/control commit 6fe03454a778c83296111d75ce8431abfbb414b7 Author: jgoerzen Date: Sat Apr 27 02:18:10 2002 +0100 /pygopherd/head: changeset 182 HTTP protocol wasn't normalizing incoming selectors. Fixed. M pygopherd/protocols/base.py M pygopherd/protocols/http.py commit 70421fc9fa13ec53ba6299650fa4edcc6ada6b06 Author: jgoerzen Date: Fri Apr 19 10:39:29 2002 +0100 /pygopherd/head: changeset 181 Nicer display, sorted M pygfarm/dict.pyg commit 6f0b78ad0403767dfabad908435beed8c7d82193 Author: jgoerzen Date: Fri Apr 19 05:01:31 2002 +0100 /pygopherd/head: changeset 180 *** empty log message *** M debian/changelog M debian/control M pygfarm/dict.pyg M pygopherd/version.py commit a6f2d651c7c1effcd7c3d23fad7d762403fb529c Author: jgoerzen Date: Fri Apr 19 04:22:38 2002 +0100 /pygopherd/head: changeset 179 Added pygfarm package for Debian. M Makefile D debian/README.Debian M debian/control A debian/pygfarm.README.Debian A debian/pygfarm.dirs M debian/rules D pygfarm/foo.py commit 396b0196eccf875d0dce58cadb5013dd87b28433 Author: jgoerzen Date: Fri Apr 19 04:13:29 2002 +0100 /pygopherd/head: changeset 178 Added support to HTTP for search requests. M conf/pygopherd.conf M pygopherd/protocols/http.py commit f503004d8f0f748189a4b909bc4f815acf67b6f0 Author: jgoerzen Date: Fri Apr 19 03:57:33 2002 +0100 /pygopherd/head: changeset 177 Fixed gopher-dir to gopher-menu M pygfarm/dict.pyg M pygopherd/protocols/http.py commit 09335ca91c880df0d44b2b9f922c7ecc2c47da3e Author: jgoerzen Date: Fri Apr 19 03:49:52 2002 +0100 /pygopherd/head: changeset 176 Updated. M pygfarm/dict.pyg commit 3d09219c8511208698ff716fdec8dc71b8ca545f Author: jgoerzen Date: Fri Apr 19 03:12:30 2002 +0100 /pygopherd/head: changeset 175 All except DBINFO working now. M pygfarm/dict.pyg commit 1bf57c4157a8c7cc4a0426b3da873302bfc370fa Author: jgoerzen Date: Fri Apr 19 03:00:20 2002 +0100 /pygopherd/head: changeset 174 Updated -- more features and bugfixes M pygfarm/dict.pyg commit f8cee63225dc1d851df27a39aaf472a864683183 Author: jgoerzen Date: Fri Apr 19 02:51:02 2002 +0100 /pygopherd/head: changeset 173 All except Match is now working. M pygfarm/dict.pyg commit ed87ca140c9fc1ac54b7e92f4951e0765bd845ae Author: jgoerzen Date: Fri Apr 19 02:42:49 2002 +0100 /pygopherd/head: changeset 172 Some various bugfixes M pygfarm/dict.pyg commit 3d7a07fa02cd90f39179257fb4c1ba7a53438e51 Author: jgoerzen Date: Thu Apr 18 13:31:21 2002 +0100 /pygopherd/head: changeset 171 *** empty log message *** M pygfarm/dict.pyg commit 039d820eaa01cbbd235ea302ed88410209d1b697 Author: jgoerzen Date: Thu Apr 18 13:22:29 2002 +0100 /pygopherd/head: changeset 170 Updated, working better. M pygfarm/dict.pyg commit e7d1f2920597c2507e5e018c4be2aad968da3ce0 Author: jgoerzen Date: Thu Apr 18 09:08:11 2002 +0100 /pygopherd/head: changeset 169 Updated. M pygfarm/dict.pyg A pygfarm/foo.py commit 19d28a4119c90d89047d793e8ad10eac6a70fedf Author: jgoerzen Date: Thu Apr 18 06:31:25 2002 +0100 /pygopherd/head: changeset 168 *** empty log message *** M pygfarm/dict.pyg commit db1d3778d807ef85c932fe5a75bebfeeeb4f0f42 Author: jgoerzen Date: Thu Apr 18 06:20:35 2002 +0100 /pygopherd/head: changeset 167 *** empty log message *** A pygfarm/dict.pyg commit eecfa67abb6ddffa3d82036bc770614c013de28d Author: jgoerzen Date: Thu Apr 18 01:26:57 2002 +0100 /pygopherd/head: changeset 166 Updated -- use normpath for relative links. M pygopherd/handlers/UMN.py commit a1b03bc72a5792bf571f2e5bfc12775fa4ee3a66 Author: jgoerzen Date: Wed Apr 17 05:37:43 2002 +0100 /pygopherd/head: changeset 165 Made sure noabstract stuff works. M pygopherd/protocols/rfc1436Test.py commit 5ebfe213bbb3616a17a37b8f5454adde89ccf257 Author: jgoerzen Date: Wed Apr 17 05:32:41 2002 +0100 /pygopherd/head: changeset 164 Enhanced. M pygopherd/protocols/rfc1436Test.py commit 56334912d5d73d634718555f8b875715d554ed30 Author: jgoerzen Date: Wed Apr 17 02:11:59 2002 +0100 /pygopherd/head: changeset 163 Fixed entries handling after new prepare. M pygopherd/handlers/gophermap.py commit 03b852be6ad20c0a325a22f8c623680faf6afe4d Author: jgoerzen Date: Wed Apr 17 02:06:42 2002 +0100 /pygopherd/head: changeset 162 A test fix. M pygopherd/protocols/rfc1436Test.py commit 427a9b7813fef330e2f8ced30baa26fa060b6a23 Author: jgoerzen Date: Wed Apr 17 01:45:20 2002 +0100 /pygopherd/head: changeset 161 Fixed a bug in HTTP handler that was adding an extra (reported by Robert Hahn) Fixed a bug in mbox.py affecting both mailbox handlers -- after the new directory architecture, the prepare in the child classes was not properly updated. M pygopherd/handlers/UMN.py M pygopherd/handlers/mbox.py M pygopherd/protocols/http.py commit 8d094d3c8b82dfe3e35aa7d29018dfb598edeb0a Author: jgoerzen Date: Tue Apr 16 11:21:01 2002 +0100 /pygopherd/head: changeset 160 Updated. M ChangeLog M debian/changelog A pygopherd/protocols/rfc1436Test.py M pygopherd/version.py M runtests.py commit b87048525a968741bd74d288e6df3bd06123ef95 Author: jgoerzen Date: Tue Apr 16 08:08:35 2002 +0100 /pygopherd/head: changeset 159 Finished baseTest and passes all tests. M pygopherd/GopherExceptionsTest.py M pygopherd/protocols/base.py M pygopherd/protocols/baseTest.py M pygopherd/testutil.py commit 886bf95df37a01fd26d5d6cf9184e6d045145ef4 Author: jgoerzen Date: Tue Apr 16 07:37:08 2002 +0100 /pygopherd/head: changeset 158 Beginnings of baseTest. M pygopherd/protocols/__init__.py M pygopherd/protocols/base.py A pygopherd/protocols/baseTest.py M runtests.py commit 52b7e81071ec8fa48baf41931d13ef0d8f8e303a Author: jgoerzen Date: Tue Apr 16 07:20:57 2002 +0100 /pygopherd/head: changeset 157 Added ProtocolMultiplexerTest M Makefile M pygopherd/protocols/ProtocolMultiplexerTest.py M pygopherd/testutil.py commit f7084528c83e04bdb031f76ef7f567418a61361b Author: jgoerzen Date: Tue Apr 16 06:58:16 2002 +0100 /pygopherd/head: changeset 156 Added ProtocolMultiplexerTest A pygopherd/protocols/ProtocolMultiplexerTest.py M pygopherd/protocols/__init__.py M runtests.py commit 5880e0591344159e3220723ac3d8c23d444b3138 Author: jgoerzen Date: Tue Apr 16 06:44:53 2002 +0100 /pygopherd/head: changeset 155 Added pipeTest. M pygopherd/__init__.py M pygopherd/gopherentryTest.py M pygopherd/pipe.py A pygopherd/pipeTest.py M runtests.py A testdata/pygopherd/pipetest.sh A testdata/pygopherd/pipetestdata commit be2e1d6455d3fcb7abe8afde4a51499214d9b5a7 Author: jgoerzen Date: Tue Apr 16 06:09:48 2002 +0100 /pygopherd/head: changeset 154 Updated for new abstract tests A testdata/.abstract A testdata/testfile.txt.gz.abstract commit 7e7c6e4b66db635d10ea4fd210b635278548378f Author: jgoerzen Date: Tue Apr 16 06:03:01 2002 +0100 /pygopherd/head: changeset 153 Many updates to abstract support M conf/pygopherd.conf M pygopherd/GopherExceptionsTest.py M pygopherd/gopherentry.py M pygopherd/handlers/gophermap.py M pygopherd/protocols/base.py M pygopherd/protocols/gopherp.py M pygopherd/protocols/http.py commit de40dedcfd26782bb6cce4fd445603ee0d6a8438 Author: jgoerzen Date: Tue Apr 16 04:55:19 2002 +0100 /pygopherd/head: changeset 152 Added the ability to read block contents from the filesystem. M conf/pygopherd.conf M pygopherd/gopherentry.py commit 6af0ab9a492a73de4f8d6287b19fe107405ba143 Author: jgoerzen Date: Tue Apr 16 02:21:09 2002 +0100 /pygopherd/head: changeset 151 Added beginnings of support for Abstract and other info. M pygopherd/handlers/UMN.py M pygopherd/protocols/gopherp.py commit 376ea5d394b5d2f1522d00a31b74d7c952ee4242 Author: jgoerzen Date: Tue Apr 16 01:37:22 2002 +0100 /pygopherd/head: changeset 150 Redid the directory handling mechanism. Now, handlers define isdir() and getdirlist(). Protocols ask for a list of all entries in the directory, rather than having the handler do a callback for each entry. M pygopherd/gopherentry.py M pygopherd/handlers/base.py M pygopherd/handlers/dir.py M pygopherd/handlers/gophermap.py M pygopherd/handlers/mbox.py M pygopherd/handlers/pyg.py M pygopherd/protocols/base.py M pygopherd/protocols/gopherp.py M pygopherd/protocols/http.py commit 48ad427df6a2a3f2f55a98bd3e73996a331bef5a Author: jgoerzen Date: Mon Apr 15 14:59:13 2002 +0100 /pygopherd/head: changeset 149 Updated. M ChangeLog commit 876843f75893ab9a820dba3499c2a2388d132a8b Author: jgoerzen Date: Mon Apr 15 14:34:53 2002 +0100 /pygopherd/head: changeset 148 Fixed a bug with handling empty Path= lines. Thanks to David Allen for identifying this one. M pygopherd/handlers/UMN.py commit 7cc8033071c465629bf20b2ba46899cf637f6959 Author: jgoerzen Date: Sat Apr 13 07:26:46 2002 +0100 /pygopherd/head: changeset 147 Miscellany comments and stuff M pygopherd/handlers/base.py commit 1c8d8f0d382e98db4b8c981e284b73f5908a714e Author: jgoerzen Date: Sat Apr 13 03:46:54 2002 +0100 /pygopherd/head: changeset 146 Updated for 0.9.4 M debian/changelog M pygopherd/version.py commit f7db78da7a0dbc43c899de58eb9fc037abb51a2d Author: jgoerzen Date: Sat Apr 13 03:39:56 2002 +0100 /pygopherd/head: changeset 145 Updated. M ChangeLog M pygopherd/handlers/HandlerMultiplexer.py M pygopherd/handlers/base.py M pygopherd/handlers/file.py M pygopherd/handlers/pyg.py M pygopherd/handlers/url.py M pygopherd/protocols/ProtocolMultiplexer.py M pygopherd/protocols/http.py commit 18f5205023c7e1ceaf17e6237d1ac2ad558deec1 Author: jgoerzen Date: Fri Apr 12 14:13:33 2002 +0100 /pygopherd/head: changeset 144 Fixed bug with rendering URLs. M pygopherd/protocols/http.py commit d6fe569b24b8504e1c606f80074c6dd1b99c7af1 Author: jgoerzen Date: Fri Apr 12 14:07:52 2002 +0100 /pygopherd/head: changeset 143 Forgot to call renderdirstart and renderdirend. M pygopherd/handlers/gophermap.py commit f70aeb995c742f11684a137315c92e5669ea6e69 Author: jgoerzen Date: Fri Apr 12 08:41:40 2002 +0100 /pygopherd/head: changeset 142 More bugfixes. M ChangeLog M debian/changelog M pygopherd/protocols/http.py M pygopherd/version.py commit d652cf49e8b52b51c0f3d017f796ebc82476f6ee Author: jgoerzen Date: Fri Apr 12 08:24:21 2002 +0100 /pygopherd/head: changeset 141 Fixed an initialization problem in testutil that could prevent the system from starting up properly. Fixed URL to gopher downloads in pygopherd.conf. M conf/pygopherd.conf M pygopherd/testutil.py commit 85e9d4b953d7f093d60472e428484da671543f4d Author: jgoerzen Date: Fri Apr 12 08:16:59 2002 +0100 /pygopherd/head: changeset 140 Added the ability to http to put a configurable spiel at the top of each page. Added version.py for stuff to find info about the software. M ChangeLog M Makefile M conf/pygopherd.conf M debian/changelog M debian/control M pygopherd/__init__.py A pygopherd/loggerTest.py M pygopherd/protocols/http.py C055 debian/copyright pygopherd/version.py M runtests.py M setup.py commit 6465d3963b04a1ba0721b403276f63294415e128 Author: jgoerzen Date: Fri Apr 12 06:32:37 2002 +0100 /pygopherd/head: changeset 139 Geturl now handles URL: patterns M pygopherd/gopherentry.py M pygopherd/gopherentryTest.py M pygopherd/handlers/url.py commit b0b2e582d6a92a56a9d593fd85c02549a6f931c8 Author: jgoerzen Date: Fri Apr 12 06:22:59 2002 +0100 /pygopherd/head: changeset 138 Gopherentrytest almost finished. Fixed some bugs that test illuminated. Updated testutil. M pygopherd/gopherentry.py M pygopherd/gopherentryTest.py commit 0f76fd71df5aa423b77d65758fe9154b009a99ed Author: jgoerzen Date: Fri Apr 12 05:25:24 2002 +0100 /pygopherd/head: changeset 137 Added an encoded file. A testdata/README A testdata/testarchive.tar A testdata/testarchive.tar.gz A testdata/testarchive.tgz A testdata/testfile.txt.gz commit fb0df0f1ef32a6ad9ed5aadadfd19eab7579c748 Author: jgoerzen Date: Fri Apr 12 05:01:04 2002 +0100 /pygopherd/head: changeset 136 Initial add of the gopherentryTest M pygopherd/__init__.py A pygopherd/gopherentryTest.py M pygopherd/testutil.py M runtests.py commit 4b0715190513bbd9b3ac4786252dda2fda53c39a Author: jgoerzen Date: Fri Apr 12 04:42:36 2002 +0100 /pygopherd/head: changeset 135 Always set the root to testroot M Makefile M pygopherd/testutil.py A testdata/testfile.txt commit e4dbb3b57c5353f46750add2771cfedcf5d37754 Author: jgoerzen Date: Fri Apr 12 03:41:05 2002 +0100 /pygopherd/head: changeset 134 Added the fileext test. M conf/pygopherd.conf M pygopherd/GopherExceptionsTest.py M pygopherd/__init__.py C061 runtests.py pygopherd/fileextTest.py M pygopherd/initializationTest.py M pygopherd/testutil.py M runtests.py commit 3ea39205e7a49085bb7518b9a6b5d74b1db515ff Author: jgoerzen Date: Fri Apr 12 03:33:45 2002 +0100 /pygopherd/head: changeset 133 Added more tests, test utilities, etc. M pygopherd/GopherExceptionsTest.py M pygopherd/__init__.py M pygopherd/initialization.py M pygopherd/initializationTest.py A pygopherd/testutil.py commit bed2ecf42e696fd2d1330c7baffb8e110ad03807 Author: jgoerzen Date: Fri Apr 12 02:47:14 2002 +0100 /pygopherd/head: changeset 132 Added more tests. Made logger capable of logging to non-stdout sources. M conf/pygopherd.conf M pygopherd/GopherExceptions.py A pygopherd/GopherExceptionsTest.py M pygopherd/__init__.py M pygopherd/logger.py M runtests.py commit a9eb4966c5212e2fba39f23491653d88aaf0f8ec Author: jgoerzen Date: Fri Apr 12 01:58:06 2002 +0100 /pygopherd/head: changeset 131 Added a sanity check to HandlerMultiplexer. Handle a special interface bind request in initialization.py and conf/pygopherd.conf. M conf/pygopherd.conf M pygopherd/handlers/HandlerMultiplexer.py M pygopherd/initialization.py commit 2a187f13854509e34adabe5a76de51bec662c376 Author: jgoerzen Date: Fri Apr 12 01:49:56 2002 +0100 /pygopherd/head: changeset 130 Security: block ./ and ../ M pygopherd/protocols/ProtocolMultiplexer.py M pygopherd/protocols/base.py commit adcffb1bef981ffc50f43c3dbe21666fa3e5d0d6 Author: jgoerzen Date: Fri Apr 12 01:07:28 2002 +0100 /pygopherd/head: changeset 129 Added. A pygopherd/initializationTest.py commit 5fefac21744fb50e577d438e5ab12f0223a055f2 Author: jgoerzen Date: Thu Apr 11 15:05:05 2002 +0100 /pygopherd/head: changeset 128 Added real tests. M pygopherd/initialization.py commit c2e4b3203b5fd4a7f223270925b5bda225c5e9db Author: jgoerzen Date: Thu Apr 11 14:31:44 2002 +0100 /pygopherd/head: changeset 127 Added initial testing infrastructure. M pygopherd.py M pygopherd/__init__.py C073 pygopherd.py runtests.py commit 08ffd9920a7bef034e11da4ca475e0af4b9c8126 Author: jgoerzen Date: Thu Apr 11 14:12:29 2002 +0100 /pygopherd/head: changeset 126 Redid initialization system -- makes it easier for tests. M conf/pygopherd.conf M pygopherd.py M pygopherd/__init__.py A pygopherd/initialization.py commit ecd353721c15e98514bc59f7f261119007a70c8b Author: jgoerzen Date: Thu Apr 11 13:23:24 2002 +0100 /pygopherd/head: changeset 125 Updated M ChangeLog M debian/changelog commit 7c8424b43ef85cc10adfc9ae6f64a4bc70a45cb7 Author: jgoerzen Date: Thu Apr 11 11:29:58 2002 +0100 /pygopherd/head: changeset 124 Added the ability to log backtraces in more situations. Fixed a bug in mbox preventing folders from working. M conf/pygopherd.conf M pygopherd.py M pygopherd/GopherExceptions.py M pygopherd/handlers/mbox.py commit 25375c05e872baa2a5f1f66a1b8b17982e5125f7 Author: jgoerzen Date: Thu Apr 11 11:23:39 2002 +0100 /pygopherd/head: changeset 123 Fixed a software bug. M pygopherd/handlers/UMN.py commit 41d7d6092552e860c84c073c7be2da5720ce49a9 Author: jgoerzen Date: Thu Apr 11 08:30:11 2002 +0100 /pygopherd/head: changeset 122 VERSION 0.9.0 RELEASED M ChangeLog commit a91a974330516993ea41219e458319df030d9007 Author: jgoerzen Date: Thu Apr 11 08:02:31 2002 +0100 /pygopherd/head: changeset 121 Fixed some more bugs: don't crash if we have no perms to create a cache file, handle relative Path= lines correctly. M pygopherd/handlers/UMN.py M pygopherd/handlers/dir.py commit 06c505cf16d48dc731449d915308b0025a10daa5 Author: jgoerzen Date: Thu Apr 11 07:56:45 2002 +0100 /pygopherd/head: changeset 120 Fixed a bug with type=X M pygopherd/handlers/UMN.py commit 66530b99ce64e77e15095470c8e0e5d8fbe385c0 Author: jgoerzen Date: Thu Apr 11 07:39:53 2002 +0100 /pygopherd/head: changeset 119 Additional bugfixes and enhancements M pygopherd.py M pygopherd/gopherentry.py M pygopherd/handlers/file.py commit 2d420ff8f6d95e36e07f9218f081be9fa281a895 Author: jgoerzen Date: Thu Apr 11 07:22:28 2002 +0100 /pygopherd/head: changeset 118 Added decompresspatt support. M conf/pygopherd.conf M pygopherd/handlers/file.py commit 7da23d3b2c3fd4420c964f0e38e8ee8e34182a84 Author: jgoerzen Date: Thu Apr 11 07:13:16 2002 +0100 /pygopherd/head: changeset 117 Additional fixes for extension and encoding support. M conf/pygopherd.conf M pygopherd/gopherentry.py M pygopherd/handlers/file.py commit 62b0069a7a93f87ec2b8c2309a012dcc3f4b4447 Author: jgoerzen Date: Thu Apr 11 07:05:13 2002 +0100 /pygopherd/head: changeset 116 More updates and features with extensions and stuff. M conf/pygopherd.conf M pygopherd/fileext.py M pygopherd/handlers/UMN.py M pygopherd/handlers/file.py M pygopherd/protocols/rfc1436.py commit 689f4e9622b40cea7cababa059f800edd34e1f2b Author: jgoerzen Date: Thu Apr 11 06:43:09 2002 +0100 /pygopherd/head: changeset 115 Modified encoding handling: default is to now set application/octet- stream of there is any encoding UNLESS the CompressedFileHandler is used. M pygopherd/gopherentry.py M pygopherd/handlers/file.py commit 27bba8e6d685f5beec3020bd7b38a91c1d3431ca Author: jgoerzen Date: Thu Apr 11 06:26:50 2002 +0100 /pygopherd/head: changeset 114 Renamed changelog target M Makefile commit 966c35203f7220d06e54cba1eb06d1bfea1a9503 Author: jgoerzen Date: Thu Apr 11 06:19:16 2002 +0100 /pygopherd/head: changeset 113 Added many features: The CompressedFileHandler Pipe support etc M ChangeLog M conf/pygopherd.conf M pygopherd/__init__.py M pygopherd/handlers/file.py M pygopherd/handlers/scriptexec.py C052 pygopherd/protocols/ProtocolMultiplexer.py pygopherd/pipe.py commit 621b251f5f7a228d74771e949e2a6acc18afc826 Author: jgoerzen Date: Thu Apr 11 05:38:24 2002 +0100 /pygopherd/head: changeset 112 Added smart file extension stripping for UMN dir. M conf/pygopherd.conf M pygopherd.py M pygopherd/__init__.py A pygopherd/fileext.py M pygopherd/handlers/UMN.py M pygopherd/handlers/dir.py commit 4d8748e8e9eaf009740e8b67a7fe6d8219500631 Author: jgoerzen Date: Thu Apr 11 04:15:22 2002 +0100 /pygopherd/head: changeset 111 Added code to strip off an extension in UMN Dirhandler. Other Debian enhancements. M debian/changelog A debian/examples M debian/postinst R075 debian/postrm.ex debian/postrm M pygopherd/handlers/UMN.py commit 86690f0e62e58f9720acfa84a5ebf7b038230c59 Author: jgoerzen Date: Thu Apr 11 04:03:36 2002 +0100 /pygopherd/head: changeset 110 Updated pygopher'd path. A examples/gophermap commit edcec50f296d88b8f4c5c4d1040b5a442edd25a0 Author: jgoerzen Date: Thu Apr 11 03:27:39 2002 +0100 /pygopherd/head: changeset 109 Miscellaneous other fixes. M debian/control M debian/init.d M pygopherd.py M pygopherd/handlers/gophermap.py commit fec771028cfc79461e53753ad11e4f98d099897f Author: jgoerzen Date: Thu Apr 11 03:07:15 2002 +0100 /pygopherd/head: changeset 108 Modified to do some more checking, to permit colon-separated MIME types, etc. M ChangeLog M conf/pygopherd.conf M debian/init.d M debian/postinst M debian/rules M pygopherd.py commit 22e316ff1638a53d8904bba47550cd09c81940c1 Author: jgoerzen Date: Thu Apr 11 02:41:53 2002 +0100 /pygopherd/head: changeset 107 Made setup.py include handlers and protocols too. Updated debian code. M ChangeLog M Makefile M debian/copyright M debian/docs M debian/rules M setup.py commit 1c0f8d50af3b57f7f4ee255373b919d8689fb2b9 Author: jgoerzen Date: Thu Apr 11 02:27:03 2002 +0100 /pygopherd/head: changeset 106 Updated. M README M debian/control M debian/rules M setup.py commit a04cba99b1685b7d67fdf30fa888b3a7ba75d8cc Author: jgoerzen Date: Thu Apr 11 02:20:43 2002 +0100 /pygopherd/head: changeset 105 Added ability to specify aliased server name. M conf/pygopherd.conf M pygopherd.py commit 423c46296d0ea40a09673b6ea57f07321598f4b9 Author: jgoerzen Date: Thu Apr 11 02:13:16 2002 +0100 /pygopherd/head: changeset 104 Many modifications to permit system-wide installations, Debian package support, etc. A ChangeLog M Makefile A README M TODO M conf/pygopherd.conf M debian/changelog A debian/conffiles D debian/conffiles.ex M debian/control M debian/copyright R088 debian/init.d.ex debian/init.d A debian/postinst D debian/postinst.ex M debian/rules M setup.py commit 0b0b921a4a8728e9189814bf14a19ea7b1a862f4 Author: jgoerzen Date: Thu Apr 11 01:10:58 2002 +0100 /pygopherd/head: changeset 103 Imported debian/ directory. A debian/README.Debian A debian/changelog A debian/conffiles.ex A debian/control A debian/copyright A debian/cron.d.ex A debian/dirs A debian/docs A debian/emacsen-install.ex A debian/emacsen-remove.ex A debian/emacsen-startup.ex A debian/ex.package.doc-base A debian/init.d.ex A debian/manpage.1.ex A debian/manpage.sgml.ex A debian/menu.ex A debian/postinst.ex A debian/postrm.ex A debian/preinst.ex A debian/prerm.ex A debian/rules A debian/watch.ex C062 pygopherd/__init__.py setup.py commit f6cb2b1a28b128c9a19be31987f21e56d90b0101 Author: jgoerzen Date: Thu Apr 11 00:57:14 2002 +0100 /pygopherd/head: changeset 102 Now cleans up jython .class files M Makefile commit 6ecaeb5a3ef188231ed424078dabbec1cbb7f7fe Author: jgoerzen Date: Wed Apr 10 14:31:15 2002 +0100 /pygopherd/head: changeset 101 More security enhancements and stuff. M conf/pygopherd.conf M pygopherd.py M pygopherd/handlers/scriptexec.py commit 44bceb83aaca69e6a0c7d275d14fe5f474866a4d Author: jgoerzen Date: Wed Apr 10 13:44:34 2002 +0100 /pygopherd/head: changeset 100 Added logging support M conf/pygopherd.conf M pygopherd.py M pygopherd/GopherExceptions.py M pygopherd/__init__.py M pygopherd/handlers/HandlerMultiplexer.py M pygopherd/handlers/mbox.py A pygopherd/logger.py M pygopherd/protocols/base.py M pygopherd/protocols/gopherp.py M pygopherd/protocols/http.py commit 50ff42109585edc361a9b658455bc694803a92ca Author: jgoerzen Date: Wed Apr 10 08:26:41 2002 +0100 /pygopherd/head: changeset 99 Fixed an error with searchrequest support. M conf/pygopherd.conf M pygopherd/handlers/pyg.py commit 56714a0b090edf421d44bd472fb596e79008c001 Author: jgoerzen Date: Wed Apr 10 08:09:48 2002 +0100 /pygopherd/head: changeset 98 Removed outdated import of "signal" M pygopherd.py commit 4502b7f99693c97eb6d1a97f1de15ef0136f6c0d Author: jgoerzen Date: Wed Apr 10 07:42:31 2002 +0100 /pygopherd/head: changeset 97 Added searchrequest capabilities. M conf/pygopherd.conf M pygopherd/handlers/HandlerMultiplexer.py M pygopherd/handlers/base.py M pygopherd/handlers/dir.py M pygopherd/handlers/scriptexec.py M pygopherd/handlers/virtual.py M pygopherd/protocols/base.py M pygopherd/protocols/gopherp.py M pygopherd/protocols/rfc1436.py commit c8ae7d8fd69e745a5f7b6343f9d414f48a85e96d Author: jgoerzen Date: Wed Apr 10 07:18:55 2002 +0100 /pygopherd/head: changeset 96 More updates for vfolder rename. Added scriptexec capability. M conf/pygopherd.conf M pygopherd.py M pygopherd/handlers/__init__.py M pygopherd/handlers/mbox.py M pygopherd/handlers/pyg.py A pygopherd/handlers/scriptexec.py M pygopherd/protocols/ProtocolMultiplexer.py M pygopherd/protocols/base.py commit a497992c8c00bd81b14e87ca2e8fcd3fd537516f Author: jgoerzen Date: Wed Apr 10 06:45:52 2002 +0100 /pygopherd/head: changeset 95 Renamed vfolder to virtual M pygopherd/handlers/__init__.py M pygopherd/handlers/mbox.py M pygopherd/handlers/pyg.py R097 pygopherd/handlers/vfolder.py pygopherd/handlers/virtual.py commit 3e7986e6294b8f5d4c151c465ebf522f406a59cd Author: jgoerzen Date: Tue Apr 9 07:36:27 2002 +0100 /pygopherd/head: changeset 94 Updates. M conf/pygopherd.conf M pygopherd/handlers/__init__.py M pygopherd/handlers/mbox.py A pygopherd/handlers/pyg.py M pygopherd/handlers/vfolder.py commit d503a0b27b5b7e20184c1b945db9ee81f0fbf871 Author: jgoerzen Date: Tue Apr 9 06:22:12 2002 +0100 /pygopherd/head: changeset 93 Updates with the vfolder. M pygopherd/handlers/__init__.py M pygopherd/handlers/base.py M pygopherd/handlers/mbox.py A pygopherd/handlers/vfolder.py commit 552489ea9aab2bba5b9941cf901c5289981b768f Author: jgoerzen Date: Sun Apr 7 09:08:21 2002 +0100 /pygopherd/head: changeset 92 Updated for module moving. M pygopherd.py C089 pygopherd/protocols/__init__.py pygopherd/__init__.py M pygopherd/gopherentry.py M pygopherd/handlers/HandlerMultiplexer.py M pygopherd/handlers/UMN.py M pygopherd/handlers/__init__.py M pygopherd/handlers/base.py M pygopherd/handlers/dir.py M pygopherd/handlers/file.py M pygopherd/handlers/gophermap.py M pygopherd/handlers/html.py M pygopherd/handlers/mbox.py M pygopherd/handlers/url.py M pygopherd/protocols/ProtocolMultiplexer.py M pygopherd/protocols/base.py M pygopherd/protocols/enhanced.py M pygopherd/protocols/gopherp.py M pygopherd/protocols/http.py M pygopherd/protocols/rfc1436.py commit a770ca62ac2f98e087ebe47643efa7bbb48610f6 Author: jgoerzen Date: Sun Apr 7 08:31:06 2002 +0100 /pygopherd/head: changeset 91 Added. A Makefile commit 9a97c2dd8e0095fbc41825a5a1b54039021344e5 Author: jgoerzen Date: Sat Apr 6 15:25:26 2002 +0100 /pygopherd/head: changeset 90 *** empty log message *** M doc/manual.lyx commit be201ffdf1badc37b65fbc6f14a141b215571000 Author: jgoerzen Date: Sat Apr 6 11:55:50 2002 +0100 /pygopherd/head: changeset 89 Added. A doc/manual.lyx commit 05c63a51abdaff1532d1d9568afdb53d0b0f2c45 Author: jgoerzen Date: Sat Apr 6 09:23:55 2002 +0100 /pygopherd/head: changeset 88 Added directory caching ability. M conf/pygopherd.conf M pygopherd/gopherentry.py M pygopherd/handlers/HandlerMultiplexer.py M pygopherd/handlers/UMN.py M pygopherd/handlers/base.py M pygopherd/handlers/dir.py commit 077327ebd6fac0f7c4348eaf14a7fb73a75a2efa Author: jgoerzen Date: Sat Apr 6 08:59:56 2002 +0100 /pygopherd/head: changeset 87 Performance enhancements after profiling M conf/pygopherd.conf M pygopherd/gopherentry.py M pygopherd/handlers/HandlerMultiplexer.py M pygopherd/handlers/UMN.py M pygopherd/handlers/base.py M pygopherd/handlers/dir.py M pygopherd/handlers/file.py M pygopherd/handlers/gophermap.py M pygopherd/handlers/html.py M pygopherd/handlers/mbox.py commit bcb2b1db8223460aa7238746f2a23e0bed1e5e7c Author: jgoerzen Date: Sat Apr 6 08:09:58 2002 +0100 /pygopherd/head: changeset 86 Performance: made mapping a module instead of a class variable. M pygopherd/gopherentry.py commit f971e2458f7e782ec3671169f6b7f3ed69da2944 Author: jgoerzen Date: Sat Apr 6 07:51:30 2002 +0100 /pygopherd/head: changeset 85 Typo fix M pygopherd/handlers/base.py commit f8aea11dec632a789109eee21f5a7341c2b73979 Author: jgoerzen Date: Sat Apr 6 07:39:06 2002 +0100 /pygopherd/head: changeset 84 *** empty log message *** M pygopherd/handlers/base.py M pygopherd/handlers/mbox.py commit 15a20750a5c18fba5a9f6a2ad3fd6182ba7bff1f Author: jgoerzen Date: Sat Apr 6 07:24:11 2002 +0100 /pygopherd/head: changeset 83 More work on the mbox handler. Say that we don't support gopher+ because UMN hates size-less stuff. Bah. Reverted gopherp : behavior. It was right before, UMN is fussy. M conf/pygopherd.conf M pygopherd/gopherentry.py M pygopherd/handlers/HandlerMultiplexer.py M pygopherd/handlers/__init__.py M pygopherd/handlers/html.py A pygopherd/handlers/mbox.py M pygopherd/protocols/gopherp.py commit d1fa31a0619d62d3a11ce77b1c826959c2ce71f8 Author: jgoerzen Date: Sat Apr 6 07:13:52 2002 +0100 /pygopherd/head: changeset 82 Only put colon on a VIEWS line if there is size information coming. M pygopherd/protocols/gopherp.py commit 3ff687792e48d0f915419597bd108f58ed9024d5 Author: jgoerzen Date: Sat Apr 6 05:43:00 2002 +0100 /pygopherd/head: changeset 81 Split HTML title handler out of UMN.py into html.py M conf/pygopherd.conf M pygopherd/handlers/HandlerMultiplexer.py M pygopherd/handlers/UMN.py M pygopherd/handlers/__init__.py A pygopherd/handlers/html.py commit f850185e72a8b2ac7b3c8cbb98cf07c47b9fc35a Author: jgoerzen Date: Sat Apr 6 04:58:30 2002 +0100 /pygopherd/head: changeset 80 Added copyright notices to all files. M pygopherd/GopherExceptions.py M pygopherd/gopherentry.py M pygopherd/handlers/HandlerMultiplexer.py M pygopherd/handlers/UMN.py M pygopherd/handlers/__init__.py M pygopherd/handlers/base.py M pygopherd/handlers/dir.py M pygopherd/handlers/file.py M pygopherd/handlers/gophermap.py M pygopherd/handlers/url.py M pygopherd/protocols/ProtocolMultiplexer.py M pygopherd/protocols/__init__.py M pygopherd/protocols/base.py M pygopherd/protocols/enhanced.py M pygopherd/protocols/gopherp.py M pygopherd/protocols/http.py M pygopherd/protocols/rfc1436.py commit aec6b4997a404b26c4558fb76fccbef6d1e7e38f Author: jgoerzen Date: Sat Apr 6 04:51:59 2002 +0100 /pygopherd/head: changeset 79 Added HTML handler support. M conf/pygopherd.conf M pygopherd/handlers/UMN.py commit db2fbc3805db43622dfdcd2e03d02a5e0ba60955 Author: jgoerzen Date: Sat Apr 6 04:12:49 2002 +0100 /pygopherd/head: changeset 78 Added some comments and moved miscellaneous functions into the UMNDirHandler. M pygopherd/handlers/UMN.py commit a96aa81b468a70fd663cf68de4e6a7580f1ee721 Author: jgoerzen Date: Sat Apr 6 03:32:39 2002 +0100 /pygopherd/head: changeset 77 Removed \t+ adding to gopher0 dirstrings. This is done in the rfc module already. M pygopherd/protocols/gopherp.py commit 140f35ef33990ee15921be6c33be5c74499c8b2c Author: jgoerzen Date: Sat Apr 6 03:27:33 2002 +0100 /pygopherd/head: changeset 76 Modified to use the getentry() from each handler in the dirhandler. Modified to indicate in each entry whether gopher+ is supported by that entry. Modified rfc1436 to only indicate + for those entries where this is true. M conf/pygopherd.conf M pygopherd/gopherentry.py M pygopherd/handlers/dir.py M pygopherd/protocols/rfc1436.py commit 509c114b3fd6cee518d0bf748cffc4b14cdbb3e8 Author: jgoerzen Date: Fri Apr 5 09:05:22 2002 +0100 /pygopherd/head: changeset 75 Added code to strip off trailing slashes in links. M pygopherd/handlers/UMN.py commit f560110b1588aef53b7bf27993e53fb12754d606 Author: jgoerzen Date: Fri Apr 5 08:55:57 2002 +0100 /pygopherd/head: changeset 74 Added handling of UMN type X M pygopherd/handlers/UMN.py M pygopherd/handlers/dir.py commit 0540391f946abe36ca6f265ba4cd24860f90fb47 Author: jgoerzen Date: Fri Apr 5 08:49:51 2002 +0100 /pygopherd/head: changeset 73 More HTTP updates. M conf/pygopherd.conf M pygopherd/protocols/http.py commit 453aa2103912c47053d73160c48a7adafec4ff0b Author: jgoerzen Date: Fri Apr 5 08:36:58 2002 +0100 /pygopherd/head: changeset 72 Added icon support to HTTP protocol. M conf/pygopherd.conf M pygopherd/handlers/__init__.py M pygopherd/protocols/http.py commit 9dd2ddbcd16a2668c6fc03678768dc67ace464a2 Author: jgoerzen Date: Fri Apr 5 08:20:27 2002 +0100 /pygopherd/head: changeset 71 Updated. M conf/pygopherd.conf M pygopherd/handlers/__init__.py M pygopherd/protocols/http.py commit 5e878746e47a8d6ef58fb85fe59790e23775e15a Author: jgoerzen Date: Fri Apr 5 07:51:48 2002 +0100 /pygopherd/head: changeset 70 Added .cap file handling. M pygopherd/handlers/UMN.py M pygopherd/handlers/dir.py commit e75fdd4173e20b13d3626bef585f1a9eb4c3d2b3 Author: jgoerzen Date: Fri Apr 5 07:37:37 2002 +0100 /pygopherd/head: changeset 69 UMN seems to be working now! M pygopherd/handlers/UMN.py M pygopherd/handlers/dir.py commit 704e6b1c0257e93e65794a81eab12481d2718151 Author: jgoerzen Date: Fri Apr 5 07:27:57 2002 +0100 /pygopherd/head: changeset 68 Various runtime fixes! M conf/pygopherd.conf M pygopherd/handlers/HandlerMultiplexer.py M pygopherd/handlers/UMN.py M pygopherd/handlers/base.py M pygopherd/handlers/dir.py commit 0ad4be40b0a4ca93830532d4a254e6c973c82345 Author: jgoerzen Date: Fri Apr 5 06:39:02 2002 +0100 /pygopherd/head: changeset 67 Updated. M pygopherd/handlers/UMN.py M pygopherd/handlers/dir.py commit c393aaedb5a57b72e56751790f465da3916ddd1e Author: jgoerzen Date: Fri Apr 5 06:29:56 2002 +0100 /pygopherd/head: changeset 66 More updates. M pygopherd/handlers/UMN.py commit bdfbc40a23342984e3a9b2ba5d6d893a067a3375 Author: jgoerzen Date: Fri Apr 5 06:12:39 2002 +0100 /pygopherd/head: changeset 65 Updates -- safer populatefromfs(), etc. M pygopherd/gopherentry.py commit 04e0a83078aacca532564edadfec9d75afa94851 Author: jgoerzen Date: Fri Apr 5 05:51:12 2002 +0100 /pygopherd/head: changeset 64 Initial writing. M pygopherd/handlers/UMN.py commit e6d39b91670cfb64354dc39bf5f92982f7767dc0 Author: jgoerzen Date: Fri Apr 5 03:41:03 2002 +0100 /pygopherd/head: changeset 63 Added from dir.py C100 pygopherd/handlers/dir.py pygopherd/handlers/UMN.py commit 7cf46da4f162539cc6d6e0b1574da80039a516e5 Author: jgoerzen Date: Thu Mar 28 04:40:53 2002 +0100 /pygopherd/head: changeset 62 Added experimental URLGopherPlus protocol. M pygopherd/gopherentry.py M pygopherd/protocols/gopherp.py commit 4ff8548d3c942e4bc96d6d42acf9464a39992208 Author: jgoerzen Date: Thu Mar 28 04:24:58 2002 +0100 /pygopherd/head: changeset 61 Modified to make more extensible. M pygopherd/protocols/base.py M pygopherd/protocols/gopherp.py commit d6b9f4718db6cb6d224f17dc3f2accb4b8e31cab Author: jgoerzen Date: Thu Mar 28 02:16:17 2002 +0100 /pygopherd/head: changeset 60 Moved to and fixes in prepare() M pygopherd/handlers/gophermap.py commit b125e3fc88e28c7d9a5af5514fbf9e8f0fe3c5ab Author: jgoerzen Date: Thu Mar 28 01:19:00 2002 +0100 /pygopherd/head: changeset 59 Added error handling M pygopherd/protocols/http.py commit 3a922005db7ecb25c9ba2f4be98c2b66b1668d39 Author: jgoerzen Date: Wed Mar 27 12:41:47 2002 +0100 /pygopherd/head: changeset 58 HTTP support now nominally working. M conf/pygopherd.conf M pygopherd/handlers/dir.py M pygopherd/protocols/base.py M pygopherd/protocols/http.py commit daed65af2e8b59d507bee36a9686e655dc5849be Author: jgoerzen Date: Wed Mar 27 09:44:16 2002 +0100 /pygopherd/head: changeset 57 More work on http M pygopherd/protocols/http.py commit b514b10182266712649f137a109a399c7a727d26 Author: jgoerzen Date: Wed Mar 27 09:17:14 2002 +0100 /pygopherd/head: changeset 56 Added some bugfixes for time handling. M pygopherd/protocols/gopherp.py commit ae6667c8013c76641b3cf4b485ce6d0ae4e17187 Author: jgoerzen Date: Wed Mar 27 09:10:01 2002 +0100 /pygopherd/head: changeset 55 Added error handling. M conf/pygopherd.conf A pygopherd/GopherExceptions.py M pygopherd/handlers/HandlerMultiplexer.py M pygopherd/handlers/base.py M pygopherd/handlers/dir.py M pygopherd/handlers/file.py M pygopherd/handlers/gophermap.py M pygopherd/handlers/url.py M pygopherd/protocols/__init__.py M pygopherd/protocols/base.py M pygopherd/protocols/gopherp.py C100 pygopherd/protocols/rfc1436.py pygopherd/protocols/http.py commit 8b49696bb5438d61b7240059200ff4ff3acdb20a Author: jgoerzen Date: Wed Mar 27 08:27:27 2002 +0100 /pygopherd/head: changeset 54 Added gophermap capabilities. M conf/pygopherd.conf A doc/standards/Gopher+.txt M pygopherd/handlers/HandlerMultiplexer.py M pygopherd/handlers/__init__.py M pygopherd/handlers/base.py M pygopherd/handlers/dir.py A pygopherd/handlers/gophermap.py M pygopherd/handlers/url.py M pygopherd/protocols/base.py M pygopherd/protocols/gopherp.py commit e50dbee7fd3f70f6336541bb2ac2c3f806b01b64 Author: jgoerzen Date: Wed Mar 27 07:52:58 2002 +0100 /pygopherd/head: changeset 53 Added from gopher://gopher.floodgap.com:70/0/buck/dbrowse%3Ffaquse%201 A doc/standards/gophermap.txt commit 2137bb9e700c36774a9077b8db9c5d475ae7e23f Author: jgoerzen Date: Wed Mar 27 07:30:14 2002 +0100 /pygopherd/head: changeset 52 Added from http://www.complete.org/mailinglists/archives/gopher- 200202/msg00033.html A doc/standards/url.txt commit 843d8576246dfbc6f5b98065c07d07603c8ea700 Author: jgoerzen Date: Wed Mar 27 07:17:27 2002 +0100 /pygopherd/head: changeset 51 Added url.py -- a URL: handler. M conf/pygopherd.conf M pygopherd/handlers/HandlerMultiplexer.py M pygopherd/handlers/__init__.py A pygopherd/handlers/url.py commit 600dbecbb9a371b4ee9edf5c3713d100d892e7df Author: jgoerzen Date: Wed Mar 27 06:59:11 2002 +0100 /pygopherd/head: changeset 50 Updated to use new multiplexers, more configurability, some renaming M conf/pygopherd.conf M pygopherd.py M pygopherd/gopherentry.py M pygopherd/handlers/HandlerMultiplexer.py M pygopherd/handlers/base.py M pygopherd/handlers/dir.py A pygopherd/protocols/ProtocolMultiplexer.py M pygopherd/protocols/enhanced.py commit 9d1fa06aa0345281011862242b4b3e407eb71dd9 Author: jgoerzen Date: Wed Mar 27 05:45:42 2002 +0100 /pygopherd/head: changeset 49 Updated. M TODO M conf/pygopherd.conf M pygopherd.py M pygopherd/gopherentry.py commit 3136e6df79464f1a969c11fd2ae98d95560bf644 Author: jgoerzen Date: Wed Mar 27 05:24:58 2002 +0100 /pygopherd/head: changeset 48 More bugfixes M pygopherd/protocols/gopherp.py M pygopherd/protocols/rfc1436.py commit 21c18a724d5bb458b2680bc323924a1c9d66de87 Author: jgoerzen Date: Wed Mar 27 05:19:32 2002 +0100 /pygopherd/head: changeset 47 renamed entry to gopherentry R100 entry.py pygopherd/gopherentry.py M pygopherd/handlers/base.py M pygopherd/handlers/dir.py M pygopherd/handlers/file.py M pygopherd/protocols/gopherp.py commit eec2bf3c19bba4262b758a3a0485ead9e4fec00b Author: jgoerzen Date: Wed Mar 27 05:12:31 2002 +0100 /pygopherd/head: changeset 46 Basic execution fixes. M entry.py M pygopherd/handlers/dir.py M pygopherd/handlers/file.py M pygopherd/protocols/base.py commit d4d6670dcfe93711f926f0732ef6beb0ab216afa Author: jgoerzen Date: Wed Mar 27 04:46:36 2002 +0100 /pygopherd/head: changeset 45 Bugfixes M pygopherd.py M pygopherd/handlers/HandlerMultiplexer.py M pygopherd/handlers/base.py M pygopherd/handlers/dir.py M pygopherd/handlers/file.py M pygopherd/protocols/base.py M pygopherd/protocols/gopherp.py M pygopherd/protocols/rfc1436.py commit 61ceb8cc85e18e6e2ebb2a3b4f50e37b4757f6e0 Author: jgoerzen Date: Wed Mar 27 04:34:22 2002 +0100 /pygopherd/head: changeset 44 *** empty log message *** M pygopherd.py A pygopherd/handlers/HandlerMultiplexer.py A pygopherd/handlers/__init__.py M pygopherd/protocols/__init__.py commit f0ef60b5a2a034bf46e40853fa05e93668009671 Author: jgoerzen Date: Wed Mar 27 04:25:56 2002 +0100 /pygopherd/head: changeset 43 *** empty log message *** A conf/mime.types A entry.py M pygopherd/protocols/gopherp.py commit 9715adb7d04397b556bfa187f13a38e630c25522 Author: jgoerzen Date: Wed Mar 27 04:17:56 2002 +0100 /pygopherd/head: changeset 42 *** empty log message *** D handlers.py M pygopherd.py M pygopherd/handlers/base.py A pygopherd/handlers/dir.py M pygopherd/protocols/base.py commit 0c3900805943a5bdaac25099a17e7bd572ff8479 Author: jgoerzen Date: Wed Mar 27 04:09:05 2002 +0100 /pygopherd/head: changeset 41 Updated M conf/pygopherd.conf M handlers.py M pygopherd/handlers/base.py M pygopherd/handlers/file.py M pygopherd/protocols/base.py commit 2ca399a6f2457100667dd925aaad18223541f80f Author: jgoerzen Date: Wed Mar 27 03:34:50 2002 +0100 /pygopherd/head: changeset 40 Updated. A TODO A pygopherd/handlers/base.py A pygopherd/handlers/file.py M pygopherd/protocols/base.py commit 83856edc1d326c93902e2673b6b589c58da6e9b8 Author: jgoerzen Date: Wed Mar 27 03:29:20 2002 +0100 /pygopherd/head: changeset 39 Removed some code moved to the base protocol. M handlers.py commit b56019672cf462aab4220c6c1e747be2edd59059 Author: jgoerzen Date: Wed Mar 27 03:09:39 2002 +0100 /pygopherd/head: changeset 38 First stab at protocols.py -> protocols/* conversion. D protocols.py A pygopherd/protocols/__init__.py A pygopherd/protocols/base.py A pygopherd/protocols/enhanced.py A pygopherd/protocols/gopherp.py A pygopherd/protocols/rfc1436.py commit ec2c0f975dff8eae5bcca3ba012bba14d52c84f1 Author: jgoerzen Date: Wed Mar 27 02:24:15 2002 +0100 /pygopherd/head: changeset 37 Added. A doc/standards/rfc1436.txt commit fc5b9dd470ea63446e94c417dfc5ca5556c5dd6c Author: jgoerzen Date: Tue Mar 26 12:32:02 2002 +0100 /pygopherd/head: changeset 36 Updates for pre-http redir support. M handlers.py M protocols.py commit f8cd0056eee395d961be2dd704910d7be203b539 Author: jgoerzen Date: Tue Mar 26 12:01:58 2002 +0100 /pygopherd/head: changeset 35 Rearranged code -- split rhandler.py into handlers.py and protocols.py A handlers.py A protocols.py M pygopherd.py D rhandler.py commit 908854158fce68fbecbbf200a4f41abed9e03212 Author: jgoerzen Date: Tue Mar 26 09:47:07 2002 +0100 /pygopherd/head: changeset 34 bug fixes M rhandler.py commit a54ee417764f77618a2c6b8cad1d0ceab8e696fa Author: jgoerzen Date: Tue Mar 26 09:27:26 2002 +0100 /pygopherd/head: changeset 33 Rewrite in progress. M conf/pygopherd.conf M rhandler.py commit 90a55a0c097406dffe8367b022f1aa0572e38394 Author: jgoerzen Date: Tue Mar 26 06:27:41 2002 +0100 /pygopherd/head: changeset 32 More updates. M rhandler.py commit a74cc88ac2007f828bd0dbca706b14cf3060a5f1 Author: jgoerzen Date: Tue Mar 26 06:21:09 2002 +0100 /pygopherd/head: changeset 31 Basic functionality is working. M conf/pygopherd.conf M pygopherd.py M rhandler.py commit a6bb3b6b6c6aeb7a09cb73cbca686bfa16e73fa4 Author: jgoerzen Date: Tue Mar 26 05:17:58 2002 +0100 /pygopherd/head: changeset 30 Updated. A conf/pygopherd.conf M pygopherd.py A rhandler.py commit f3d4fe0deadb12cb9b708ee9131cd3dad1454628 Author: jgoerzen Date: Tue Mar 26 04:29:53 2002 +0100 /pygopherd/head: changeset 29 Updated. M pygopherd.py commit e244f6dfe404254b0104e5511102223dbd3bbd85 Author: jgoerzen Date: Tue Mar 26 04:08:11 2002 +0100 /pygopherd/head: changeset 28 This version. M pygopherd.py commit 9eb409f3ed072797a640058e6313dd057aab8a1a Author: jgoerzen Date: Tue Mar 26 03:55:11 2002 +0100 /pygopherd/head: changeset 27 Working prototype. M pygopherd.py commit 1b320ecafa7c705232e042b1a5cc6bc555637ba5 Author: jgoerzen Date: Tue Mar 26 03:29:14 2002 +0100 /pygopherd/head: changeset 26 Skeletal work A pygopherd.py commit f1028498801c1a8e404dad0d022102d2adc931b8 Author: tailor Date: Sat Apr 16 16:33:54 2005 +0100 Tailorization of /pygopherd/head Import of the upstream sources from the repository file:///tmp/darcsconv/t/gopher-py as of revision 25 A COPYING pygopherd-2.0.18.3+nmu4ubuntu1/examples/0000775000000000000000000000000010762620505014660 5ustar pygopherd-2.0.18.3+nmu4ubuntu1/examples/talsample.html.tal0000664000000000000000000000116410762620505020311 0ustar TAL Test My selector is: selector
My MIME type is: foo/bar
Another way of getting that is: foo/bar
Gopher type is: X
My handler is: handlername
My protocol is: protocol
Python path enabling status: 123
My vfs is: vfs
Math: 5 pygopherd-2.0.18.3+nmu4ubuntu1/examples/gophermap0000664000000000000000000000107610762620505016571 0ustar Welcome to Pygopherd! You can place your documents in /var/gopher for future use. You can remove the gophermap file there to get rid of this message, or you can edit it to use other things. (You'll need to do at least one of these two things in order to get your own data to show up!) Some links to get you started: 1Pygopherd Home /devel/gopher/pygopherd gopher.quux.org 70 1Quux.Org Mega Server / gopher.quux.org 70 1The Gopher Project /Software/Gopher gopher.quux.org 70 1Traditional UMN Home Gopher / gopher.tc.umn.edu 70 Welcome to the world of Gopher and enjoy! pygopherd-2.0.18.3+nmu4ubuntu1/local.dsl0000664000000000000000000000204110762620505014635 0ustar ]> (define (toc-depth nd) (if (string=? (gi nd) (normalize "book")) 1 1)) (define %generate-article-toc% #t) ;; Don't split up the doc as much. (define (chunk-element-list) (list (normalize "preface") (normalize "chapter") (normalize "appendix") (normalize "article") (normalize "glossary") (normalize "bibliography") (normalize "index") (normalize "colophon") (normalize "setindex") (normalize "reference") (normalize "refentry") (normalize "part") (normalize "book") ;; just in case nothing else matches... (normalize "set") ;; sets are definitely chunks... )) pygopherd-2.0.18.3+nmu4ubuntu1/README0000664000000000000000000000213510762620505013723 0ustar README for Pygopherd =========================================================================== QUICKSTART (Debian) ------------------- Use the .deb: dpkg -i pygopherd.deb or apt-get install pygopherd QUICKSTART (non-Debian) ----------------------- 1. Download and install Python 2.2 or above from www.python.org, if not already present on your system. You can run pygopherd either in-place (as a regular user account) or as a system-wide daemon. For running in-place, do this: 1. Modify conf/pygopherd.conf: * Set usechroot = no * Comment out (add a # sign to the start of the line) the pidfile, setuid, and setgid lines * Set mimetypes = ./conf/mime.types * Set root = to something appropriate. * Set port to a number greater than 1024. 2. Modify the first line of executables/pygopherd to reflect the location of your Python installation. 3. Invoke pygopherd by running: ./executables/pygopherd For installing: 1. Run pytohn2.2 setup.py install 2. Make sure that the /etc/pygopherd/pygopherd.conf names valid users (setuid, setgid) and valid document root (root). pygopherd-2.0.18.3+nmu4ubuntu1/printlocal.dsl0000664000000000000000000000073710762620505015724 0ustar ]> (define tex-backend #t) (define bop-footnotes #t) (define %two-side% #t) (define %footnote-ulinks% #t) pygopherd-2.0.18.3+nmu4ubuntu1/pygfarm/0000775000000000000000000000000010762620505014507 5ustar pygopherd-2.0.18.3+nmu4ubuntu1/pygfarm/dict.pyg0000664000000000000000000003102610762620505016155 0ustar # -*-Python-*- import sys, string from pygopherd.handlers.pyg import PYGBase from pygopherd.gopherentry import GopherEntry, getinfoentry import dictclient def matchsort(x, y): return cmp(x.lower(), y.lower()) class PYGMain(PYGBase): def canhandlerequest(self): arglist = [] if self.selectorargs: arglist = self.selectorargs.split("/") self.dbname = None self.dbcommand = None self.commandargs = [] if len(arglist) >= 2: self.dbname = arglist[1] if len(arglist) >= 3: self.dbcommand = arglist[2] if len(arglist) >= 4: self.commandargs = arglist[3:] if self.searchrequest: self.commandargs.append(self.searchrequest) if self.dbcommand == 'DEFINE': self.__class__ = DefineMenu elif self.dbcommand == 'DEFINITION': self.__class__ = Definition elif self.dbcommand == 'MATCH': self.__class__ = Match elif self.dbcommand == 'MATCHMENU': self.__class__ = MatchMenu elif self.dbcommand == 'DBINFO': self.__class__ = DBInfo elif self.dbname: self.__class__ = Browse else: self.__class__ = TopMenu return 1 class TopMenu(PYGMain): def prepare(self): self.db = dictclient.Connection() self.entries = [] intro = ["Welcome to the dictionary server!", " ", "To do a quick lookup, use the following search:", " "] for item in intro: self.entries.append(getinfoentry(item, self.config)) selector = self.genargsselector("/*/DEFINE") entry = GopherEntry(selector, self.config) entry.type = '7' entry.mimetype = 'application/gopher-menu' entry.name = 'Definition Lookup -- All Databases' self.entries.append(entry) selector = self.genargsselector("/*/MATCHMENU") entry = GopherEntry(selector, self.config) entry.type = '1' entry.mimetype = 'application/gopher-menu' entry.name = 'Advanced Search -- All Databases' self.entries.append(entry) intro = [" ", "Use the following links to search a particular", "database or to browse ALL the definitions", "in a database!", " "] for item in intro: self.entries.append(getinfoentry(item, self.config)) items = self.db.getdbdescs().items() items.sort(lambda x, y: cmp(x[1], y[1])) for name, desc in items: selector = self.genargsselector("/%s" % name) entry = GopherEntry(selector, self.config) entry.type = '1' entry.mimetype = 'application/gopher-menu' entry.name = desc self.entries.append(entry) def getentry(self): entry = GopherEntry(self.selector, self.config) entry.type = '1' entry.mimetype = 'application/gopher-menu' entry.name = 'Dictionary Search' return entry def isdir(self): return 1 def getdirlist(self): return self.entries class Browse(PYGMain): def prepare(self): self.entries = [] intro = ["You can browse the entries in the database by", "selecting the first letter of the item you want.", " "] for item in intro: self.entries.append(getinfoentry(item, self.config)) selector = self.genargsselector("/%s/DEFINE" % self.dbname) entry = GopherEntry(selector, self.config) entry.type = '7' entry.mimetype = 'application/gopher-menu' entry.name = 'Search This Database' self.entries.append(entry) selector = self.genargsselector("/%s/MATCHMENU" % self.dbname) entry = GopherEntry(selector, self.config) entry.type = '1' entry.mimetype = 'application/gopher-menu' entry.name = 'Advanced Search for This Database' self.entries.append(entry) if self.dbname != '*': selector = self.genargsselector("/%s/DBINFO" % self.dbname) entry = GopherEntry(selector, self.config) entry.type = '0' entry.mimetype = 'text/plain' dictconn = dictclient.Connection() entry.name = 'About ' + \ dictclient.Database(dictconn, self.dbname).getdescription() self.entries.append(entry) selector = self.genargsselector("/%s/MATCH/re/^[^a-zA-Z]" % \ self.dbname) entry = GopherEntry(selector, self.config) entry.type = '1' entry.mimetype = 'application/gopher-menu' entry.name = "Items that do not begin with a letter" self.entries.append(entry) for letter in string.ascii_uppercase: selector = self.genargsselector("/%s/MATCH/re/^[%s%s]" % \ (self.dbname, letter, letter.lower())) entry = GopherEntry(selector, self.config) entry.type = '1' entry.mimetype = 'application/gopher-menu' entry.name = letter self.entries.append(entry) def getentry(self): entry = GopherEntry(self.selector, self.config) entry.type = '1' entry.mimetype = 'application/gopher-menu' entry.name = 'Dictionary Database Browse' return entry def isdir(self): return 1 def getdirlist(self): return self.entries class DefineMenu(PYGMain): def getentry(self): entry = GopherEntry(self.selector, self.config) entry.type = '1' entry.mimetype = 'application/gopher-menu' entry.name = 'Definition Menu for %s' % self.commandargs[0] return entry def prepare(self): self.db = dictclient.Connection() self.entries = [] entry = getinfoentry("Definitions for '%s' in database '%s'" % \ (self.commandargs[0], self.dbname), self.config) self.entries.append(entry) defs = self.db.define(self.dbname, self.commandargs[0]) if len(defs): selector = self.genargsselector("/%s/DEFINITION/%s" % (self.dbname, self.commandargs[0])) entry = GopherEntry(selector, self.config) entry.type = '0' entry.mimetype = 'text/plain' entry.name = 'All %d definitions on a single page' % len(defs) self.entries.append(entry) else: entry = getinfoentry("No definitions found.", self.config) self.entries.append(entry) for i in range(len(defs)): selector = self.genargsselector("/%s/DEFINITION/%s" % \ (defs[i].getdb().getname(), defs[i].getword())) entry = GopherEntry(selector, self.config) entry.type = '0' entry.mimetype = 'text/plain' entry.name = "'%s' in %s" % (defs[i].getword(), defs[i].getdb().getdescription()) self.entries.append(entry) self.entries.append(getinfoentry(" ", self.config)) self.entries.append(getinfoentry("Definitions for similar words:", self.config)) matches = self.db.match(self.dbname, 'lev', self.commandargs[0]) matchlist = unique([x.getword() for x in matches]) matchlist.sort(matchsort) if not len(matchlist): self.entries.append(getinfoentry("No similar definitions found.", self.config)) for matchword in matchlist: selector = self.genargsselector("/%s/DEFINE/%s" % \ (self.dbname, matchword)) entry = GopherEntry(selector, self.config) entry.type = '1' entry.mimetype = 'application/gopher-menu' entry.name = matchword self.entries.append(entry) def isdir(self): return 1 def getdirlist(self): return self.entries class Definition(PYGMain): def prepare(self): self.db = dictclient.Connection() self.definition = "" defs = self.db.define(self.dbname, self.commandargs[0]) if not len(defs): self.definition = "No definition found." return for d in defs: self.definition += "DEFINITION of '%s'\nFrom %s\n\n" % \ (d.getword(), d.getdb().getdescription()) self.definition += d.getdefstr() self.definition += "\n" + ('-' * 60) + "\n" self.definition += "Generated by dict.pyg for Pygopherd by John Goerzen \n" self.definition += "dict.pyg and Pygopherd licensed under the GPL.\n" def write(self, wfile): wfile.write(self.definition) def getentry(self): entry = GopherEntry(self.selector, self.config) entry.type = '0' entry.mimetype = 'text/plain' entry.name = 'Definition for %s' % self.commandargs[0] return entry class Match(PYGMain): def getentry(self): entry = GopherEntry(self.selector, self.config) entry.type = '1' entry.mimetype = 'application/gopher-menu' entry.name = 'Match menu for %s' % self.commandargs[1] return entry def prepare(self): self.conn = dictclient.Connection() self.entries = [] matches = self.conn.match(self.dbname, self.commandargs[0], self.commandargs[1]) if not len(matches): self.entries.append(getinfoentry("No matches.", self.config)) return matchlist = unique([x.getword() for x in matches]) matchlist.sort(matchsort) self.entries.append(getinfoentry("%d matches for '%s' (%s)" % \ (len(matchlist), self.commandargs[1], self.commandargs[0]), self.config)) for matchword in matchlist: selector = self.genargsselector("/%s/DEFINE/%s" % \ (self.dbname, matchword)) entry = GopherEntry(selector, self.config) entry.type = '1' entry.mimetype = 'application/gopher-menu' entry.name = matchword self.entries.append(entry) def isdir(self): return 1 def getdirlist(self): return self.entries class MatchMenu(PYGMain): def getentry(self): entry = GopherEntry(self.selector, self.config) entry.type = '1' entry.mimetype = 'application/gopher-menu' entry.name = 'Advanced Search Options for %s' % self.dbname return entry def prepare(self): self.conn = dictclient.Connection() self.entries = [] self.entries.append(getinfoentry("Advanced Search: " + self.dbname, self.config)) for name, desc in self.conn.getstratdescs().items(): selector = self.genargsselector("/%s/MATCH/%s" % \ (self.dbname, name)) entry = GopherEntry(selector, self.config) entry.type = '7' entry.mimetype = 'application/gopher-menu' entry.name = 'Search with %s (%s)' % (name, desc) self.entries.append(entry) def isdir(self): return 1 def getdirlist(self): return self.entries class DBInfo(PYGMain): def prepare(self): self.conn = dictclient.Connection() self.conn.getdbdescs() self.db = self.conn.getdbobj(self.dbname) self.infotext = self.db.getinfo() def write(self, wfile): wfile.write("About %s (%s):\n\n" % (self.dbname, self.db.getdescription())) wfile.write(self.infotext) def getentry(self): entry = GopherEntry(self.selector, self.config) entry.type = '0' entry.mimetype = 'text/plain' entry.name = 'Information for %s' % self.dbname return entry def unique(input): """Return a list of the elements in input, but without duplicates. Performs a case-insensitive check.""" retval = [] check = {} for item in input: if not check.has_key(item.lower()): retval.append(item) check[item.lower()] = 1 return retval pygopherd-2.0.18.3+nmu4ubuntu1/doc/0000775000000000000000000000000010762620505013607 5ustar pygopherd-2.0.18.3+nmu4ubuntu1/doc/pygopherd.sgml0000664000000000000000000011331610762620505016501 0ustar Introduction to PyGopherd Welcome to &PyGopherd;. In a nutshell, &PyGopherd; is a modern dynamic multi-protocol hierarchical information server with a pluggable modularized extension system, full flexible caching, virtual files and folders, and autodetection of file types -- all with support for standardized yet extensible per-document metadata. Whew! Read on for information on what all these buzzwords mean. Features Here are some of &PyGopherd;'s features: Provides built-in support for multiple protocols: HTTP (Web), Gopher+, Gopher (RFC1436), Enhanced Gopher0, and WAP (mobile phones). Protocols can be enabled or disabled as desired. Provides protocol autodetection. That is, &PyGopherd; can listen for all the above protocols on a single port and will automatically respond using the protocol it detects the client is using. Practical effects of this are that you can, for instance, give out a single URL and have it viewable normally on desktop Web browsers and in WAP mode on mobile phones -- and appropriately in various Gopher browsers. Metadata and site links can be entered in a variety of formats, including full UMN dotfile metadata formats as well as Bucktooth gophermap files. Moreover, gophermap files are not limited to Gopher protocols, and can be used for all protocols. Support for inter-protocol linking (linking from Gopher sites to web sites) Virtual folder system lets you serve up anything as if it were regular files and directories. PyGopherd comes with the following virtual folder systems built in: Can present any Unix MBOX, MMDF box, MH directory, Maildir directory, or Babyl mailbox as a virtual folder, the contents of which are the messages in the mailbox. Can use a configurable separator to split a file into multiple parts, the first line of each becoming the name for the virtual folder. Can peek inside a ZIP file and serve it up as first-class site citizens -- metadata can even be stored in the ZIP files. Can serve up the contents of a dictd server as a filesystem. Modular, extensible design: you can use PyGopherd's own PYG extension format, or UMN- or Bucktooth-style executables. Runs on any platform supported by Python 2.2, 2.3, or 2.4. This includes virtually every past and current flavor of Unix (Linux, *BSD, Solaris, SunOS), Windows, MacOS 9.x and X, and more. Some features may not be available on non-Unix platforms. Runs on any platform supported by Java 1.1 via the Jython Python implementation. Tunable server types via configuration directive -- forking or threading. Secure design with support for chrooted execution. Feature-complete, full implementations of: Gopher0 (RFC1435), Gopher+, HTTP, and WAP. Support for automatically finding the titles of HTML documents for presentation in a directory. Versatile configuration file format is both extensible and nicely complementary of the module system. Protocol-independent, handler-dependent caching. This increases performance by letting handlers cache dynamically-generated information -- currently used by the directory handlers. This can improve performance of directories by several orders of magnitude. Because this is a handler cache only, all protocols share the single cache. Since the processing time for the protocols is negligible, this works out very well. Autosensing of MIME types and gopher0 item types. Both are completely configurable. MIME type detection is done using a standard mime.types file, and gopher0 types are calculated by using a configurable regexp-based MIME-to-gophertype map. Heavy support of regular expressions in configuration. ProtocolMultiplexer and HandlerMultiplexer let you choose only those protocols and handlers that you wish your server to support and the order in which they are tried when a request comes in. Full logging via syslog. About Gopher &PyGopherd; started life as a server for the Gopher Internet protocol. With Gopher, you can mount a filesystem (viewing files and folders as if they were local), browse Gopherspace with a web browser, download files, and be interactive with searching. But this is only part of the story. The world of Gopher is more expansive than this. There are two major gopher protocols: Gopher0 (also known as RFC1436) and Gopher+. Gopher0 is a small, simple, lightweight protocol that is very functional yet also extremely easy to implement. Gopher0 clients can be easily placed in small embedded devices or in massive environments like a modern web browser. Gopher+ is based on Gopher0 but extends it by providing document metadata such as file size and MIME type. Gopher+ allows all sorts of neat features, such as configurable metadata (serving up a bunch of photos? Add a Subject field to your metadata to let a customized photo browser display who is pictured) and multiple views of a file (let the user select to view your photos as PNG or JPEG). Quick Start &quickstart; Installation If you are reading this document via the "man" command, it is likely that you have no installation tasks to perform; your system administrator has already installed &PyGopherd;. If you need to install it yourself, you have three options: a system-wide installation with Debian, system-wide installation with other systems, and a single-user installation. You can download the latest version of PyGopherd from Debian System-Wide Installation If you are tracking Debian unstable, you may install &PyGopherd; by simply running this command as root: apt-get install pygopherd If you are not tracking Debian unstable, download the .deb package from the &PyGopherd; website and then run dpkg -i to install the downloaded package. Then, skip to the configuration section below. You will use /etc/init.d/pygopherd start to start the program. Other System-Wide Installation Download the tar.gz version of the package from the website. Make sure you have Python 2.2 or above installed; if not, download and install it from . Then run these commands: tar -zxvf pygopherd-x.y.z.tar.gz cd pygopherd-x.y.z python2.2 setup.py Some systems will use python or python2.3 in place of python2.2. Next, proceed to configuration. Make sure that the /etc/pygopherd/pygopherd.conf file names valid users (setuid and setgid options) and a valid document root (root option). You will type pygopherd to invoke the program. Single-Account Installation Download the tar.gz version of the package from the website. Make sure you have Python 2.2 or above installed; if now, download and install it from . Then run these commands: tar -zxvf pygopherd-z.y.z.tar.gz cd pygopherd-x.y.z Modify conf/pygopherd.conf as follows: Set usechroot = no Comment out (add a # sign to the start of the line) the pidfile, setuid, and setgid lines. Set root to something appropriate. Set port to a number greater than 1024. When you want to run &PyGopherd;, you will issue the cd command as above and then type PYTHONPATH=. bin/pygopherd. There is no installation step necessary. Configuration &PyGopherd; is regulated by a configuration file normally stored in /etc/pygopherd/pygopherd.conf. You can specify an alternate configuration file on the command line. The &PyGopherd; distribution ships with a sample pygopherd.conf file that thoroughly documents the configuration file options and settings. Handlers &PyGopherd; defines several handlers which are responsible for finding data on your server and presenting it to the user. The handlers are used to generate things like links to other documents and directory listings. They are also responsible for serving up regular files and even virtual folders. Handlers are specified with the handlers option in pygopherd.conf. This option is a list of handlers to use. For each request that arrives, &PyGopherd; will ask each handler in turn whether or not it can handle the request, and will handle the request according to the first handler that is capable of doing so. If no handlers can handle the request, a file not found error is generated. See the example configuration file for an example. The remaining parts of this section describe the different handlers that ship with &PyGopherd;. dir.DirHandler This handler is a basic one that generates menus based on the contents of a directory. It is used for directories that contain neither a gophermap file nor UMN-style links files, or situations where you have no need for either of those. This handler simply reads the contents of your on-disk directory, determines the appropriate types of each file, and sends the result to the client. The descriptions of each item are usually set to the filename, but the html.HTMLFileTitleHandler may override that. gophermap.BuckGophermapHandler This handler is used to generate directory listings based on gophermap files. It will not read the directory on-disk, instead serving content from the gophermap file only. Gophermaps are useful if you want to present a directory in which the files do not frequently change and there is general information to present. Overall, if you only wish to present information particular to certain files, you should consider using the abstract feature of UMN.UMNDirHandler. The gophermap files contain two types of lines, which are described here using the same convention normally used for command line arguments. In this section, the symbol \t will be used to indicate a tab character, Control-I. full line of informational text gophertypeDESCRIPTION\tselector\thost\tport Note: spaces shown above are for clarity only and should not actually be present in your file. The informational text must not contain any tab characters, but may contain spaces. Informational text will be rendered with gopher type i, which will cause it to be displayed on a client's screen at its particular position in the file. The second type of line represents a link to a file or directory. It begins with a single-character Gopher type (see Gopher Item Types below) followed immediately by a description and a tab character. There is no space or other separator between the gopher type and the description. The description may contain spaces but not tabs. The remaining arguments are optional, but only to the extent that arguments may be omitted only if all arguments after them are also omitted. These arguments are: selector The selector is the name of the file on the server. If it begins with a slash, it is an absolute path; otherwise, it is interpreted relative to the directory that the gophermap file is in. If no selector is specified, the description is also used as the selector. host The host specifies the host on which this resource is located. If not specified, defaults to the current server. port The port specifies the port on which the resource is located. If not specified, defaults to the port the current server is listening on. An example of a gophermap to help illustrate the concept is included with the &PyGopherd; distribution in the file examples/gophermap. file.CompressedFileHandler In order to save space, you might want to store documents on-disk in a compressed format. But then clients would ordinarily have to decompress the files themselves. It would be nice to have the server automatically decompress the files on the fly, sending that result to the client. That's where file.CompressedFileHandler comes in. This handler will take compressed files, pipe them through your chosen decompression program, and send the result directly to clients -- completely transparently. To use this handler, set the decompressors option in the configuration file. This option defines a mapping from MIME encodings (as defined with the encoding option) to decompression programs. Files that are not encoded, or which have an encoding that does not occur in the decompressors map, will not be decompressed by this handler. Please see the sample configuration file for more examples and details about the configuration of this handler. file.FileHandler The file.FileHandler is just that -- its duty is to serve up regular files to clients. html.HTMLFileTitleHandler This handler is used when generating directories and will set the description of HTML files to the HTML title defined in them rather than let it be the default filename. Other than that, it has no effect. UMN gopherd implements a similar policy. mbox handlers There are four mailbox handlers: mbox.MaildirFolderHandler mbox.MaildirMessageHandler mbox.MBoxMessageHandler mbox.MBoxFolderHandler These four handlers provide a unique "virtual folder" service. They allow you to present mailboxes as if they were folders, the items of the folders being the messages in the mailbox, organized by subject. This is useful for presenting mail archives or just making e-mail accessible in a nice and easy fashion. To use these handlers, all you have to do is enable them in your handlers section. They will automatically detect requests for mailboxes and handle them appropriately. The different handlers are for traditional Unix mbox mailboxes (all messages in a single file) and new qmail-stype Maildir mailboxes. You can enable only the two handlers for the specific mailbox type that you use, if desired. pyg.PYGHandler PYG (short for PYGopherd) is a mechanism that provides a tremendous amount of flexibility. Rather than just letting you execute a script like other Gopher or HTTP servers, PYGs are actually loaded up into PyGopherd and become fully-capable first-class virtual handlers. Yet they need not be known ahead of time, and are loaded dynamically. With a PYG handler, you can generate gopher directories, handle searches, generate files, and more on the fly. You can create entire virtual directory trees (for instance, to interface with NNTP servers or with DICT servers), and access them all using the standard Gopher protocol. All of this without having to modify even one line of &PyGopherd; code. If enabled, the pyg.PYGHandler will look for files with the extension .pyg that are marked executable. If found, they will be loaded and run as PYGs. Please note: this module provides the capability to execute arbitrary code. Please consider the security ramifications of that before enabling it. See the virtual.Virtual handler for more information about passing data to your scripts at runtime. At present, documentation on writing PYGs is not provided, but you may find examples in the pygfarm directory included with the &PyGopherd; distribution. scriptexec.ExecHandler</> <para> This handler implements "old-style" script execution; that is, executing arbitrary programs and piping the result to the client. It is, for the most part, compatible with both scripts written for UMN gopherd and the Bucktooth gopher server. If enabled, it will execute any file that is marked executable in the filesystem. It will normally list scripts as returning plain text, but you may create a custom link to the script that defines it as returning whatever kind of file you desire. Unlike PYGs, this type must be known in advance. </para> <para> The <property>scriptexec.ExecHandler</property> will set environment variables for your scripts to use. They are as follows: </para> <variablelist> <varlistentry> <term>SERVER_NAME</term> <listitem><para>The name of this server as defined in the configuration file or detected from the operating system.</para> </listitem> </varlistentry> <varlistentry> <term>SERVER_PORT</term> <listitem><para>The port this server is listening on.</para> </listitem> </varlistentry> <varlistentry> <term>REMOTE_ADDR</term> <listitem><para>The IP address of the client.</para> </listitem> </varlistentry> <varlistentry> <term>REMOTE_PORT</term> <listitem><para>The port number of the client.</para> </listitem> </varlistentry> <varlistentry> <term>REMOTE_HOST</term> <listitem><para>The same value as <property>REMOTE_ADDR</property></para> </listitem> </varlistentry> <varlistentry> <term>SELECTOR</term> <listitem><para>The file that was requested; that is, the relative path to this script. If the selector included additional parameters after a |, they will be included in this string as well. </para> </listitem> </varlistentry> <varlistentry> <term>REQUEST</term> <listitem><para>The "base" part of the selector; that is, the part leading up to the |.</para> </listitem> </varlistentry> <varlistentry> <term>SEARCHREQUEST</term> <listitem><para>Included only if the client specified search data, this is used if the client is searching for something. </para> </listitem> </varlistentry> </variablelist> <para> See the <property>virtual.Virtual</property> handler for more information about passing data to your scripts at runtime. </para> <para> Please note: this module provides the capability to execute arbitrary code. Please consider the security ramifications of that before enabling it. </para> </sect1> <sect1 id="handlers.umn"> <title>UMN.UMNDirHandler This is one of the most powerful workhorse handlers in &PyGopherd;. It is designed to emulate most of the ways in which the UMN gopherd distribution generates directories, even going so far as to be bug-compatible in some cases. Generating directories with this handler is often the best general-purpose way to make nice directories in gopherspace. The remainder of the description of the UMN.UMNDirHandler, except for the Abstracts and Info section, is lifted directly from the original UMN gopherd documentation, with light editing, because this handler implements it so exactly that there was no point in rewriting all that documentation :-) Links You can override the default view of a directory as generated by dir.DirHandler by creating what are known as Links in the data tree. The ability to make links to other hosts is how gopher distributes itself among multiple hosts. There are two different ways to make a link. The first and simplest is to create a link file that contains the data needed by the server. By default all files in the gopher data directory starting with a period are taken to be link files. A link file can contain multiple links. To define a link you need to put five lines in a link file that define the needed characteristics for the document. Here is an example of a link. Name=Cheese Ball Recipes Numb=1 Type=1 Port=150 Path=1/Moo/Cheesy Host=zippy.micro.umn.edu The Name= line is what the user will see when cruising through the database. In this case the name is "Cheese Ball Recipes". The "Type=" defines what kind of document this object is. For a list of all defined types, see Gopher Item Types below. For Gopher+ and HTTP, a MIME type is also used, which is determined automatically based on the type you specify. The "Path=" line contains the selector string that the client will use to retrieve the actual document. The Numb= specifies that this entry should be presented first in the directory list (instead of being alphabetized). The "Numb=" line is optional. If it is present it cannot be the last line of the link. The "Host=" and "Port=" lines specify a fully qualified domain name (FQDN) and a port respectively. You may substitute a plus '+' for these two parameters if you wish. The server will insert the current hostname and the current port when it sees a plus in either of these two fields. An easy way to retrieve links is to use the Curses Gopher Client. By pressing '=' You can get information suitable for inclusion in a link file. Overriding Defaults The server looks for a directory called .cap when parsing a directory. The server then checks to see if the .cap directory contains a file with the same name as the file it's parsing. If this file exists then the server will open it for reading. The server parses this file just like a link file. However, instead of making a new object, the parameters inside the .cap/ file are used to override any of the server supplied default values. For instance, say you wanted to change the Title of a text file for gopher, but don't want to change the filename. You also don't want it alphabetized, instead you want it second in the directory listing. You could make a set-aside file in the .cap directory with the same filename that contained the following lines: Name=New Long Cool Name Numb=2 An alternative to .cap files are extended link files. They work just the same as the files described in Links above, but have a somewhat abbreviated format. As an example, if the name of the file was file-to-change, then you could create a file called .names with the following contents: Path=./file-to-change Name=New Long Cool Name Numb=2 Adding Cool Links One cool thing you can do with .Links is to add neato services to your gopher server. Adding a link like this: Name=Cool ftp directory Type=h Path=/URL:ftp://hostname/path/ Host=+ Port=+ Name=Cool web site Type=h Path=/URL:http://hostname/ Host=+ Port=+ Will allow you to link in any FTP or Web site to your gopher. (See url.URLHandler for more details.) You can easily add a finger site to your gopher server thusly: Name=Finger information Type=0 Path=lindner Host=mudhoney.micro.umn.edu Port=79 Hiding an Entry This kind of trick may be necessary in some cases, and thus for object "fred", the overriding .names file entry would be: Type=X Path=./fred by overriding default type to be "X". This may be useful, when for some reason there are symlinks (or whatever) in the directory at which &PyGopherd; looks, and those entries are not desired to be shown at all. Abstracts and Info Many modern gopher server maintainers like to intersperse gopher directory listings with other information -- often, additional information about the contents of files in the directory. The gophermap system provides one way to do that, and abstracts used with UMN gopher directories provides another. Subject to the abstract_headers and abstract_entries configuration file options, this feature allows you to define that extra information. You can do that by simply creating a file named filename.abstract right alongside the regular file in your directory. The file will be interpreted as the abstract. For a directory, create a file named .abstract in the directory. Simple as that! url.HTMLURLHandler &PyGopherd; provides ways for you to link to pages outside Gopherspace -- that is, web pages, FTP sites, and the like. This is accomplished according to the Links to URL specification (see Conforming To below for details). In order to link to a URL (EXCEPT gopher URLs) from a menu, you create a link of type h (regardless of the actual type of the resource that you are linking to) in your gophermap or .Links file that looks like this: /URL:http://www.complete.org/ Modern Gopher clients that follow the Links to URL specification will automatically follow that link when you select it. The rest need some help, and that's where this handler comes in. For Gopher clients that do not follow the Links to URL specification, the url.HTMLURLHandler will automatically generate an HTML document for them on the fly. This document includes a refresh code that will send them to the proper page. You should not disable this handler. url.URLTypeRewriter Some people wish to serve HTML documents from their Gopher server. One problem with that is that links in Gopherspace include an extra type character at the beginning, whereas links in HTTP do not. This handler will remove the extra type character from HTTP requests that come in, allowing a single relative-to-root link to work for both. virtual.Virtual This handler is not intended to ever be used directly, but is used by many other handlers such as the mbox support, PYG handlers, and others. It is used to generate virtual entries in the directory hierarchy -- that is, entries that look normal to a client, but do not actually correspond to a file on disk. One special feature of the virtual.Virtual handler is that you can send information to it at runtime in a manner similar to a CGI script on the web. You do this by adding a question mark after the regular selector, followed by any arbitrary data that you wish to have sent to the virtual request handler. ZIP.ZIPHandler Using zip.ZIPHandler, you can save space on your server by converting part or all of your site into a ZIP file. &PyGopherd; can use the contents of that ZIP file as the contents of your site -- completely transparently. The ZIP file handler must be enabled in the configuration file for this to work. Gopher Item Types When you construct links to files via .Links or gophermap files, or modify the mapping in the configuration file, you will need to know these. Items bearing the "not implemented" text are not served up by &PyGopherd; as it ships, generally due to requirements of customized per-site software, but may be served up via PYG extension modules or other gopher servers. This list was prepared based on RFC1436, the UMN gopherd(1) manpage, and best current practices. 0 Plain text file 1 Directory 2 CSO phone book server (not implemented by &PyGopherd;) 3 Error condition; text that follows is plain text 4 Macintosh file, BinHex format 5 DOS binary archive (not implemented by &PyGopherd;; use type 9 instead) 6 uuencoded file; not directly generated by &PyGopherd; automatically, but can be linked to manually. Most gopher clients will handle this better as type 1. 7 Search 8 Telnet link 9 Binary file + Redundant server (not implemented by &PyGopherd;) c Calendar (not implemented by &PyGopherd;) e Event (not implemented by &PyGopherd;) g GIF-format graphic h HTML file I Any kind of graphic file other than GIF i Informational text included in a directory that is displayed but does not link to any actual file. M MIME multipart/mixed file s Any kind of sound file T tn3270 link X- UMN-specific -- signifies that this entry should not be displayed in a directory entry, but may be accessed via a direct link. This value is never transmitted in any Gopher protocol. pygopherd-2.0.18.3+nmu4ubuntu1/doc/manpage.sgml0000664000000000000000000001733310762620505016112 0ustar PyGopherd Manpage
jgoerzen@complete.org
JohnGoerzen $Date: 2003-08-25 16:14:52 -0500 (Mon, 25 Aug 2003) $
pygopherd 8 John Goerzen PyGopherd Multiprotocol Information Server pygopherd configfile Description Welcome to &PyGopherd;. In a nutshell, &PyGopherd; is a modern dynamic multi-protocol hierarchical information server with a pluggable modularized extension system, full flexible caching, virtual files and folders, and autodetection of file types -- all with support for standardized yet extensible per-document metadata. Whew! Read on for information on this what all these buzzwords mean. Quick Start &quickstart; Options All &PyGopherd; configuratoin is done via the configuration file. Therefore, the program has only one command-line option: configfile This option argument specifies the location of the configuration file that &PyGopherd; is to use. Conforming To The Internet Gopher Protocol as specified in RFC1436 The Gopher+ upward-compatible enhancements to the Internet Gopher Protocol from the University of Minnesota as laid out at . The gophermap file format as originally implemented in the Bucktooth gopher server and described at . The Links to URL specification as laid out by John Goerzen at . The UMN format for specifying object attributes and links with .cap, .Links, .abstract, and similar files as specified elsewhere in this document and implemented by UMN gopherd. The PYG format for extensible Python gopher objects as created for &PyGopherd;. Hypertext Transfer Protocol HTTP/1.0 as specified in RFC1945 Hypertext Markup Language (HTML) 3.2 and 4.0 Transitional as specified in RFC1866 and RFC2854. Maildir as specified in and . The mbox mail storage format as specified in . Registered MIME media types as specified in RFC2048. Script execution conforming to both UMN standards as laid out in UMN gopherd(1) and Bucktooth standards as specified at , so far as each can be implemented consistent with secure design principles. Standard Python 2.2.1 or above as implemented on POSIX-compliant systems. WAP/WML as defined by the WAP Forum. Bugs Reports of bugs should be sent via e-mail to the &PyGopherd; bug-tracking system (BTS) at pygopherd@bugs.complete.org or submitted online using the Web interface at . The Web site also lists all current bugs, where you can check their status or contribute to fixing them. Copyright &PyGopherd; is Copyright (C) 2002, 2003 John Goerzen. 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; version 2 of the License. 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: Free Software Foundation, Inc. 59 Temple Place Suite 330 Boston, MA 02111-1307 USA Author &PyGopherd;, its libraries, documentation, and all included files (except where noted) was written by John Goerzen jgoerzen@complete.org and copyright is held as stated in the Copyright section. Portions of this manual (specifically relating to certian UMN gopherd features and characteristics that PyGopherd emulates) are modified versions of the original gopherd(1) manpage accompanying the UMN gopher distribution. That document is distributed under the same terms as this, and bears the following copyright notices: Copyright (C) 1991-2000 University of Minnesota Copyright (C) 2000-2002 John Goerzen and other developers &PyGopherd; may be downloaded, and information found, from its homepage via either Gopher or HTTP: &PyGopherd; may also be downloaded using Subversion. Additionally, the distributed tar.gz may be updated with a simple "svn update" command; it is ready to go. For information on getting &PyGopherd; with Subversion, please visit . See Also python (1).
pygopherd-2.0.18.3+nmu4ubuntu1/doc/pygopherd.html0000664000000000000000000014173110762620505016505 0ustar PyGopherd Manual

I. PyGopherd Manual

Table of Contents
pygopherd -- Multiprotocol Information Server

pygopherd

Name

PyGopherd -- Multiprotocol Information Server

Synopsis

pygopherd [configfile]

Description

Welcome to PyGopherd. In a nutshell, PyGopherd is a modern dynamic multi-protocol hierarchical information server with a pluggable modularized extension system, full flexible caching, virtual files and folders, and autodetection of file types -- all with support for standardized yet extensible per-document metadata. Whew! Read on for information on this what all these buzzwords mean.

Features

Here are some of PyGopherd's features:

  • Provides built-in support for multiple protocols: HTTP (Web), Gopher+, Gopher (RFC1436), Enhanced Gopher0, and WAP (mobile phones). Protocols can be enabled or disabled as desired.

  • Provides protocol autodetection. That is, PyGopherd can listen for all the above protocols on a single port and will automatically respond using the protocol it detects the client is using. Practical effects of this are that you can, for instance, give out a single URL and have it viewable normally on desktop Web browsers and in WAP mode on mobile phones -- and appropriately in various Gopher browsers.

  • Metadata and site links can be entered in a variety of formats, including full UMN dotfile metadata formats as well as Bucktooth gophermap files. Moreover, gophermap files are not limited to Gopher protocols, and can be used for all protocols.

  • Support for inter-protocol linking (linking from Gopher sites to web sites)

  • Virtual folder system lets you serve up anything as if it were regular files and directories. PyGopherd comes with the following virtual folder systems built in:

    • Can present any Unix MBOX, MMDF box, MH directory, Maildir directory, or Babyl mailbox as a virtual folder, the contents of which are the messages in the mailbox.

    • Can use a configurable separator to split a file into multiple parts, the first line of each becoming the name for the virtual folder.

    • Can peek inside a ZIP file and serve it up as first-class site citizens -- metadata can even be stored in the ZIP files.

    • Can serve up the contents of a dictd server as a filesystem.

  • Modular, extensible design: you can use PyGopherd's own PYG extension format, or UMN- or Bucktooth-style executables.

  • Runs on any platform supported by Python 2.2 or 2.3. This includes virtually every past and current flavor of Unix (Linux, *BSD, Solaris, SunOS), Windows, MacOS 9.x and X, and more. Some features may not be available on non-Unix platforms.

  • Runs on any platform supported by Java 1.1 via the Jython Python implementation.

  • Tunable server types via configuration directive -- forking or threading.

  • Secure design with support for chrooted execution.

  • Feature-complete, full implementations of: Gopher0 (RFC1435), Gopher+, HTTP, and WAP.

  • Support for automatically finding the titles of HTML documents for presentation in a directory.

  • Versatile configuration file format is both extensible and nicely complementary of the module system.

  • Protocol-independant, handler-dependant caching. This increases performance by letting handlers cache dynamically-generated information -- currently used by the directory handlers. This can improve performance of directories by several orders of magnitude. Because this is a handler cache only, all protococls share the single cache. Since the processing time for the protocols is negligable, this works out very well.

  • Autosensing of MIME types and gopher0 item types. Both are completely configurable. MIME type detection is done using a standard mime.types file, and gopher0 types are calculated by using a configurable regexp-based MIME-to-gophertype map.

  • Heavy support of regular expressions in configuration.

  • ProtocolMultiplexer and HandlerMultiplexer let you choose only those protocols and handlers that you wish your server to support and the order in which they are tried when a request comes in.

  • Full logging via syslog.


About Gopher

PyGopherd started life as a server for the Gopher Internet protocol. With Gopher, you can mount a filesystem (viewing files and folders as if they were local), browse Gopherspace with a web browser, download files, and be interactive with searching.

But this is only part of the story. The world of Gopher is more expansive than this. There are two major gopher protocols: Gopher0 (also known as RFC1436) and Gopher+. Gopher0 is a small, simple, lightweight protocol that is very functional yet also extremely easy to implement. Gopher0 clients can be easily places in small embedded devices or in massive environments like a modern web browser.

Gopher+ is based on Gopher0 but extends it by providing document metadata such as file size and MIME type. Gopher+ allows all sorts of neat features, such as configurable metadata (serving up a bunch of photos? Add a Subject field to your metadata to let a customized photo browser display who is pictured) and multiple views of a file (let the user select to view your photos as PNG or JPEG).

Quick Start

If you have already installed PyGopherd system-wide, or your administrator has done that for you, your task for setting up PyGopherd for the first time is quite simple. You just need to set up your configuration file, make your folder directory, and run it!

You can quickly set up your configuration file. The distribution includes two files of interest: conf/pygopherd.conf and conf/mime.types. Debian users will find the configuration file pre-installed in /etc/pygopherd/pygopherd.conf and the mime.types file provided by the system already.

Open up pygopherd.conf in your editor and adjust to suit. The file is heavily commented and you can refer to it for detailed information. Some settings to take a look at include: detach, pidfile, port, usechroot, setuid, setgid, and root. These may or may not work at their defaults for you. The remaining ones should be fine for a basic setup.

Invoke PyGopherd with pygopherd path/to/configfile (or /etc/init.d/pygopherd start on Debian). Place some files in the location specified by the root directive in the config file and you're ready to run!

Installation

If you are reading this document via the "man" command, it is likely that you have no installation tasks to perform; your system administra- tor has already installed PyGopherd. If you need to install it yourself, you have three options: a system-wide installation with Debian, system-wide installation with other systems, and a single-user installation. You can download the latest version of PyGopherd from http://quux.org/devel/gopher/pygopherd/

Debian System-Wide Installation

If you are tracking Debian unstable, you may install PyGopherd by simply running this command as root:

apt-get install pygopherd

If you are not tracking Debian unstable, download the .deb package from the PyGopherd website and then run dpkg -i to install the downloaded package. Then, skip to the configuration section below. You will use /etc/init.d/pygopherd start to start the program.


Other System-Wide Installation

Download the tar.gz version of the package from the website. Make sure you have Python 2.2 or above installed; if now, download and install it from http://www.python.org/. Then run these commands:

	  tar -zxvf pygopherd-x.y.z.tar.gz
	  cd pygopherd-x.y.z
	  python2.2 setup.py
	

Some systems will use python or python2.3 in place of python2.2.

Next, proceed to configuration. Make sure that the /etc/pygopherd/pygopherd.conf file names valid users (setuid and setgid options) and a valid document root (root option).

You will type pygopherd to invoke the program.


Single-Account Installation

Download the tar.gz version of the package from the website. Make sure you have Python 2.2 or above installed; if now, download and install it from http://www.python.org/. Then run these commands:

	  tar -zxvf pygopherd-z.y.z.tar.gz
	  cd pygopherd-x.y.z
	

Modify conf/pygopherd.conf as follows:

  • Set usechroot = no

  • Comment out (add a # sign to the start of the line) the pidfile, setuid, and setgid lines.

  • Set root to osomething appropriate.

  • Set port to a number greater than 1024.

When you want to run PyGopherd, you will issue the cd command as above and then type PYTHONPATH=. bin/pygopherd. There is no installation step necessary.

Configuration

PyGopherd is regulated by a configuratoin file normally stored in /etc/pygopherd/pygopherd.conf. You can specify an alternate configuration file on the command line. The PyGopherd distribution ships with a sample pygopherd.conf file that thoroughly documents the configuration file options and settings.

Options

All PyGopherd configuratoin is done via the configuration file. Therefore, the program has only one command-line option:

configfile

This option argument specifies the location of the configuration file that PyGopherd is to use.

Handlers

PyGopherd defines several handlers which are responsible for finding data on your server and presenting it to the user. The handlers are used to generate things like links to other documents and directory listings. They are also responsible for serving up regular files and even virtual folders.

Handlers are specified with the handlers option in pygopherd.conf. This option is a list of handlers to use. For each request that arrives, PyGopherd will ask each handler in turn whether or not it can handle the request, and will handle the request according to the first handler that is capable of doing so. If no handlers can handle the request, a file not found error is generated. See the example configuration file for an example.

The remaining parts of this section describe the different handlers that ship with PyGopherd. Please note that some versions of this manual may show the handlers in all caps; however, their names are not all caps and are case-sensitive.

dir.DirHandler

This handler is a basic one that generates menus based on the contents of a directory. It is used for directories that contain neither a gophermap file nor UMN-style links files, or situations where you have no need for either of those.

This handler simply reads the contents of your on-disk directory, determines the appropriate types of each file, and sends the result to the client. The descriptions of each item are usually set to the filename, but the html.HTMLFileTitleHandler may override that.


gophermap.BuckGophermapHandler

This handler is used to generate directory listings based on gophermap files. It will not read the directory on-disk, instead serving content from the gophermap file only. Gophermaps are useful if you want to present a directory in which the files do not frequently change and there is general information to present. Overall, if you only wish to present information particular to certain files, you should consider using the abstract feature of UMN.UMNDirHandler.

The gophermap files contain two types of lines, which are described here using the same convention normally used for command line arguments. In this section, the symbol \t will be used to indicate a tab character, Control-I.

full line of informational text

gophertypeDESCRIPTION [\tselector [\thost [\tport]]]

Note: spaces shown above are for clarity only and should not actually be present in your file.

The informational text must not contain any tab characters, but may contain spaces. Informational text will be rendered with gopher type i, which will cause it to be displayed on a client's screen at its particular position in the file.

The second type of line represents a link to a file or directory. It begins with a single-character Gopher type (see Gopher Item Types below) followed immediately by a description and a tab character. There is no space or other separator between the gopher type and the description. The description may contain spaces but not tabs.

The remaining arguments are optional, but only to the extent that arguments may be omitted only if all arguments after them are also omitted. These arguments are:

selector

The selector is the name of the file on the server. If it begins with a slash, it is an absolute path; otherwise, it is interpreted relative to the directory that the gophermap file is in. If no selector is specified, the description is also used as the selector.

host

The host specifies the host on which this resource is located. If not specified, defaults to the current server.

port

The port specifies the port on which the resource is located. If not specified, defaults to the port the current server is listening on.

An example of a gophermap to help illustrate the concept is included with the PyGopherd distribution in the file examples/gophermap.


file.CompressedFileHandler

In order to save space, you might want to store documents on-disk in a compressed format. But then clients would ordinarily have to decompress the files themselves. It would be nice to have the server automatically decompress the files on the fly, sending that result to the client. That's where file.CompressedFileHandler comes in.

This handler will take compressed files, pipe them through your chosen decompression program, and send the result directly to clients -- completely transparently.

To use this handler, set the decompressors option in the configuration file. This option defines a mapping from MIME encodings (as defined with the encoding option) to decompression programs. Files that are not encoded, or which have an encoding that does not occur in the decompressors map, will not be decompressed by this handler.

Please see the sample configuration file for more examples and details about the configuration of this handler.


file.FileHandler

The file.FileHandler is just that -- its duty is to serve up regular files to clients.


html.HTMLFileTitleHandler

This handler is used when generating directories and will set the description of HTML files to the HTML title defined in them rather than let it be the default filename. Other than that, it has no effect. UMN gopherd implements a similar policy.


mbox handlers

There are four mailbox handlers:

  • mbox.MaildirFolderHandler

  • mbox.MaildirMessageHandler

  • mbox.MBoxMessageHandler

  • mbox.MBoxFolderHandler

These four handlers provide a unique "virtual folder" service. They allow you to present mailboxes as if they were folders, the items of the folders being the messages in the mailbox, organized by subject. This is useful for presenting mail archives or just making e-mail accessible in a nice and easy fashion.

To use these handlers, all you have to do is enable them in your handlers section. They will automatically detect requests for mailboxes and handle them appropriately.

The different handlers are for traditional Unix mbox mailboxes (all messages in a single file) and new qmail-stype Maildir mailboxes. You can enable only the two handlers for the specific mailbox type that you use, if desired.


pyg.PYGHandler

PYG (short for PYGopherd) is a mechanism that provides a tremendous amount of flexibility. Rather than just letting you execute a script like other Gopher or HTTP servers, PYGs are actually loaded up into PyGopherd and become fully-capable first-class virtual handlers. Yet they need not be known ahead of time, and are loaded dynamically.

With a PYG handler, you can generate gopher directories, handle searches, generate files, and more on the fly. You can create entire virtual directory trees (for instance, to interface with NNTP servers or with DICT servers), and access them all using the standard Gopher protocol. All of this without having to modify even one line of PyGopherd code.

If enabled, the pyg.PYGHandler will look for files with the extension .pyg that are marked executable. If found, they will be loaded and run as PYGs.

Please note: this module provides the capability to execute arbitrary code. Please consider the security ramifications of that before enabling it.

See the virtual.Virtual handler for more information about passing data to your scripts at runtime.

At present, documentation on writing PYGs is not provides, but you may find examples in the pygfarm directory included with the PyGopherd distribution.


scriptexec.ExecHandler

This handler implements "old-style" script execution; that is, executing arbitrary programs and piping the result to the client. It is, for the most part, compatible with both scripts written for UMN gopherd and the Bucktooth gopher server. If enabled, it will execute any file that is marked executable in the filesystem. It will normally list scripts as returning plain text, but you may create a custom link to the script that defines it as returning whatever kind of file you desire. Unlike PYGs, this type must be known in advance.

The scriptexec.ExecHandler will set environment variables for your scripts to use. They are as follows:

SERVER_NAME

The name of this server as defined in the configuration file or detected from the operating system.

SERVER_PORT

The port this server is listening on.

REMOTE_ADDR

The IP address of the client.

REMOTE_PORT

The port number of the client.

REMOTE_HOST

The same value as REMOTE_ADDR

SELECTOR

The file that was requested; that is, the relative path to this script. If the selector included additional parameters after a |, they will be included in this string as well.

REQUEST

The "base" part of the selector; that is, the part leading up to the |.

SEARCHREQUEST

Included only if the client specified search data, this is used if the client is searching for something.

See the virtual.Virtual handler for more information about passing data to your scripts at runtime.

Please note: this module provides the capability to execute arbitrary code. Please consider the security ramifications of that before enabling it.


UMN.UMNDirHandler

This is one of the most powerful workhorse handlers in PyGopherd. It is designed to emulate most of the ways in which the UMN gopherd distribution generates directories, even going so far as to be bug-compatible in some cases. Generating directories with this handler is often the best general-purpose way to make nice directories in gopherspace.

The remainder of the description of the UMN.UMNDirHandler, except for the Abstracts and Info section, is lifted directly from the original UMN gopherd documentation, with light editing, because this handler implements it so exactly that there was no point in rewriting all that documentation :-)

Links

You can override the default view of a directory as generated by dir.DirHandler by creating what are known as Links in the data tree.

The ability to make links to other hosts is how gopher distributes itself among multiple hosts. There are two different ways to make a link. The first and simplest is to create a link file that contains the data needed by the server. By default all files in the gopher data directory starting with a period are taken to be link files. A link file can contain multiple links. To define a link you need to put five lines in a link file that define the needed characteristics for the document. Here is an example of a link.

Name=Cheese Ball Recipes
Numb=1
Type=1
Port=150
Path=1/Moo/Cheesy
Host=zippy.micro.umn.edu
	  

The Name= line is what the user will see when cruising through the database. In this case the name is "Cheese Ball Recipes". The "Type=" defines what kind of document this object is. For a list of all defined types, see Gopher Item Types below. For Gopher+ and HTTP, a MIME type is also used, which is determined automatically based on the type you specify.

The "Path=" line contains the selector string that the client will use to retrieve the actual document. The Numb= specifies that this entry should be presented first in the directory list (instead of being alphabetized). The "Numb=" line is optional. If it is present it cannot be the last line of the link. The "Port=" and "Host=" lines specify a fully qualified domain name (FQDN) and a port respectively. You may substitute a plus '+' for these two parameters if you wish. The server will insert the current hostname and the current port when it sees a plus in either of these two fields.

An easy way to retrieve links is to use the Curses Gopher Client. By pressing '=' You can get information suitable for inclusion in a link file.

Overriding Defaults

The server looks for a directory called .cap when parsing a directory. The server then checks to see if the .cap directory contains a file with the same name as the file it's parsing. If this file exists then the server will open it for reading. The server parses this file just like a link file. However, instead of making a new object, the parameters inside the .cap/ file are used to override any of the server supplied default values.

For instance, say you wanted to change the Title of a text file for gopher, but don't want to change the filename. You also don't want it alphabetized, instead you want it second in the directory listing. You could make a set-aside file in the .cap directory with the same filename that contained the following lines:

Name=New Long Cool Name
Numb=2
	  

An alternative to .cap files are extended link files. They work just the same as the files described in Links above, but have a somewhat abbreviated format. As an example, if the name of the file was file-to-change, then you could create a file called .names with the following contents:

Path=./file-to-change
Name=New Long Cool Name
Numb=2
	  

Adding Cool Links

One cool thing you can do with .Links is to add neato services to your gopher server. Adding a link like this:

Name=Cool ftp directory
Type=h
Path=/URL:ftp://hostname/path/
Host=+
Port=+
 
Name=Cool web site
Type=h
Path=/URL:http://hostname/
Host=+
Port=+
	  

Will allow you to link in any FTP or Web site to your gopher. (See url.URLHandler for more details.)

You can easily add a finger site to your gopher server thusly:

Name=Finger information
Type=0
Path=lindner
Host=mudhoney.micro.umn.edu
Port=79
	  

Hiding an Entry

This kind of trick may be necessary in some cases, and thus for object "fred", the overriding .names file entry would be:

 Type=X
 Path=./fred
	  

by overriding default type to be "X". This kind of hideouts may be usefull, when for some reason there are symlinks (or whatever) in the directory at which PyGopherd looks at, and those entries are not desired to be shown at all.

Abstracts and Info

Many modern gopher server maintainers like to intersperse gopher directory listings with other information -- often, additional information about the contents of files in the directory. The gophermap system provides one way to do that, and abstracts used with UMN gopher directories provides another.

Subject to the abstract_headers and abstract_entries configuration file options, this feature allows you to define that extra information. You can do that by simply creating a file named filename.abstract right alongside the regular file in your directory. The file will be interpreted as the abstract. For a directory, create a file named .abstract in the directory. Simple as that!


url.HTMLURLHandler

PyGopherd provides ways for you to link to pages outside Gopherspace -- that is, web pages, FTP sites, and the like. This is accomplished according to the Links to URL specification (see Conforming To below for details). In order to link to a URL (EXCEPT gopher URLs) from a menu, you create a link of type h (regardless of the actual type of the resource that you are linking to) in your gophermap or .Links file that looks like this:

/URL:http://www.complete.org/
	

Modern Gopher clients that follow the Links to URL specification will automatically follow that link when you select it. The rest need some help, and that's where this handler comes in.

For Gopher clients that do not follow the Links to URL specification, the url.HTMLURLHandler will automatically generate an HTML document for them on the fly. This document includes a refresh code that will send them to the proper page. You should not disable this handler.


url.URLTypeRewriter

Some people wish to serve HTML documents from their Gopher server. One problem with that is that links in Gopherspace include an extra type character at the beginning, whereas links in HTTP do not. This handler will remove the extra type character from HTTP requests that come in, allowing a single relative-to-root link to work for both.


virtual.Virtual

This handler is not intended to ever be used directly, but is used by many other handlers such as the mbox support, PYG handlers, and others. It is used to generate virtual entries in the directory hierarchy -- that is, entries that look normal to a client, but do not actually correspond to a file on disk.

One special feature of the virtual.Virtual handler is that you can send information to it at runtime in a manner similar to a CGI script on the web. You do this by adding a question mark after the regular selector, followed by any arbitrary data that you wish to have sent to the virtual request handler.


ZIP.ZIPHandler

Using zip.ZIPHandler, you can save space on your server by converting part or all of your site into a ZIP file. PyGopherd can use the contents of that ZIP file as the contents of your site -- completely transparently.

The ZIP file handler must be enabled in the configuration file for this to work.

Gopher Item Types

When you construct links to files via .Links or gophermap files, or modify the mapping in the configuration file, you will need to know these. Items bearing the "not implemented" text are not served up by PyGopherd as it ships, generally due to requirements of customized per-site software, but may be served up via PYG extension modules or other gopher servers.

This list was prepared based on RFC1436, the UMN gopherd(1) manpage, and best current practices.

0

Plain text file

1

Directory

2

CSO phone book server (not implemented by PyGopherd)

3

Error condition; text that follows is plain text

4

Macintosh file, BinHex format

5

DOS binary archive (not implemented by PyGopherd; use type 9 instead)

6

uuencoded file; not directly generated by PyGopherd automatically, but can be linked to manually. Most gopher clients will handle this better as type 1.

7

Search

8

Telnet link

9

Binary file

+

Redundant server (not implemented by PyGopherd)

c

Calendar (not implemented by PyGopherd)

e

Event (not implemented by PyGopherd)

g

GIF-format graphic

h

HTML file

I

Any kind of graphic file other than GIF

i

Informational text included in a directory that is displayed but does not link to any actual file.

M

MIME multipart/mixed file

s

Any kind of sound file

T

tn3270 link

X, -

UMN-specific -- signifies that this entry should not be displayed in a directory entry, but may be accessed via a direct link. This value is never transmitted in any Gopher protocol.

Conforming To

Bugs

Reports of bugs should be sent via e-mail to the PyGopherd bug-tracking system (BTS) at or submitted online using the Web interface at http://bugs.complete.org/.

The Web site also lists all current bugs, where you can check their status or contribute to fixing them.

Copyright

PyGopherd is Copyright (C) 2002, 2003 John Goerzen.

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; version 2 of the License.

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:

Free Software Foundation, Inc.
59 Temple Place
Suite 330
Boston, MA  02111-1307
USA
      

Author

PyGopherd, its libraries, documentation, and all included files (except where noted) was written by John Goerzen and copyright is held as stated in the Copyright section.

Portions of this manual (specifically relating to certian UMN gopherd features and characteristics that PyGopherd emulates) are modified versions of the original gopherd(1) manpage accompanying the UMN gopher distribution. That document is distributed under the same terms as this, and bears the following copyright notices:

Copyright (C) 1991-2000  University of Minnesota
Copyright (C) 2000-2002  John Goerzen and other developers
      

PyGopherd may be downloaded, and information found, from its homepage via either Gopher or HTTP:

gopher://quux.org/1/devel/gopher/pygopherd

http://quux.org/devel/gopher/pygopherd

PyGopherd may also be downloaded using Subversion. Additionally, the distributed tar.gz may be updated with a simple "svn update" command; it is ready to go. For information on getting PyGopherd with Subversion, please visit http://svn.complete.org/.

See Also

python (1).

pygopherd-2.0.18.3+nmu4ubuntu1/doc/pygopherd.80000664000000000000000000010140310762620505015700 0ustar .\" This manpage has been automatically generated by docbook2man .\" from a DocBook document. This tool can be found at: .\" .\" Please send any bug reports, improvements, comments, patches, .\" etc. to Steve Cheng . .TH "PYGOPHERD" "8" "25 August 2003" "John Goerzen" "PyGopherd Manual" .SH NAME PyGopherd \- Multiprotocol Information Server .SH SYNOPSIS \fBpygopherd\fR [ \fB\fIconfigfile\fB\fR ] .SH "DESCRIPTION" .PP Welcome to \fBPyGopherd\fR. In a nutshell, \fBPyGopherd\fR is a modern dynamic multi-protocol hierarchical information server with a pluggable modularized extension system, full flexible caching, virtual files and folders, and autodetection of file types -- all with support for standardized yet extensible per-document metadata. Whew! Read on for information on this what all these buzzwords mean. .SS "FEATURES" .PP Here are some of \fBPyGopherd\fR's features: .TP 0.2i \(bu Provides built-in support for multiple protocols: HTTP (Web), Gopher+, Gopher (RFC1436), Enhanced Gopher0, and WAP (mobile phones). Protocols can be enabled or disabled as desired. .TP 0.2i \(bu Provides protocol autodetection. That is, \fBPyGopherd\fR can listen for all the above protocols \fBon a single port\fR and will automatically respond using the protocol it detects the client is using. Practical effects of this are that you can, for instance, give out a single URL and have it viewable normally on desktop Web browsers and in WAP mode on mobile phones -- and appropriately in various Gopher browsers. .TP 0.2i \(bu Metadata and site links can be entered in a variety of formats, including full UMN dotfile metadata formats as well as Bucktooth gophermap files. Moreover, gophermap files are not limited to Gopher protocols, and can be used for all protocols. .TP 0.2i \(bu Support for inter-protocol linking (linking from Gopher sites to web sites) .TP 0.2i \(bu Virtual folder system lets you serve up anything as if it were regular files and directories. PyGopherd comes with the following virtual folder systems built in: .RS .TP 0.2i \(bu Can present any Unix MBOX, MMDF box, MH directory, Maildir directory, or Babyl mailbox as a virtual folder, the contents of which are the messages in the mailbox. .TP 0.2i \(bu Can use a configurable separator to split a file into multiple parts, the first line of each becoming the name for the virtual folder. .TP 0.2i \(bu Can peek inside a ZIP file and serve it up as first-class site citizens -- metadata can even be stored in the ZIP files. .TP 0.2i \(bu Can serve up the contents of a dictd server as a filesystem. .RE .TP 0.2i \(bu Modular, extensible design: you can use PyGopherd's own PYG extension format, or UMN- or Bucktooth-style executables. .TP 0.2i \(bu Runs on any platform supported by Python 2.2 or 2.3. This includes virtually every past and current flavor of Unix (Linux, *BSD, Solaris, SunOS), Windows, MacOS 9.x and X, and more. Some features may not be available on non-Unix platforms. .TP 0.2i \(bu Runs on any platform supported by Java 1.1 via the Jython Python implementation. .TP 0.2i \(bu Tunable server types via configuration directive -- forking or threading. .TP 0.2i \(bu Secure design with support for chrooted execution. .TP 0.2i \(bu Feature-complete, full implementations of: Gopher0 (RFC1435), Gopher+, HTTP, and WAP. .TP 0.2i \(bu Support for automatically finding the titles of HTML documents for presentation in a directory. .TP 0.2i \(bu Versatile configuration file format is both extensible and nicely complementary of the module system. .TP 0.2i \(bu Protocol-independant, handler-dependant caching. This increases performance by letting handlers cache dynamically-generated information -- currently used by the directory handlers. This can improve performance of directories by several orders of magnitude. Because this is a handler cache only, all protococls share the single cache. Since the processing time for the protocols is negligable, this works out very well. .TP 0.2i \(bu Autosensing of MIME types and gopher0 item types. Both are completely configurable. MIME type detection is done using a standard mime.types file, and gopher0 types are calculated by using a configurable regexp-based MIME-to-gophertype map. .TP 0.2i \(bu Heavy support of regular expressions in configuration. .TP 0.2i \(bu ProtocolMultiplexer and HandlerMultiplexer let you choose only those protocols and handlers that you wish your server to support and the order in which they are tried when a request comes in. .TP 0.2i \(bu Full logging via syslog. .SS "ABOUT GOPHER" .PP \fBPyGopherd\fR started life as a server for the Gopher Internet protocol. With Gopher, you can mount a filesystem (viewing files and folders as if they were local), browse Gopherspace with a web browser, download files, and be interactive with searching. .PP But this is only part of the story. The world of Gopher is more expansive than this. There are two major gopher protocols: Gopher0 (also known as RFC1436) and Gopher+. Gopher0 is a small, simple, lightweight protocol that is very functional yet also extremely easy to implement. Gopher0 clients can be easily places in small embedded devices or in massive environments like a modern web browser. .PP Gopher+ is based on Gopher0 but extends it by providing document metadata such as file size and MIME type. Gopher+ allows all sorts of neat features, such as configurable metadata (serving up a bunch of photos? Add a Subject field to your metadata to let a customized photo browser display who is pictured) and multiple views of a file (let the user select to view your photos as PNG or JPEG). .SH "QUICK START" .PP If you have already installed \fBPyGopherd\fR system-wide, or your administrator has done that for you, your task for setting up \fBPyGopherd\fR for the first time is quite simple. You just need to set up your configuration file, make your folder directory, and run it! .PP You can quickly set up your configuration file. The distribution includes two files of interest: \fIconf/pygopherd.conf\fR and \fIconf/mime.types\fR. Debian users will find the configuration file pre-installed in \fI/etc/pygopherd/pygopherd.conf\fR and the \fImime.types\fR file provided by the system already. .PP Open up \fIpygopherd.conf\fR in your editor and adjust to suit. The file is heavily commented and you can refer to it for detailed information. Some settings to take a look at include: \fIdetach\fR, \fIpidfile\fR, \fIport\fR, \fIusechroot\fR, \fIsetuid\fR, \fIsetgid\fR, and \fIroot\fR. These may or may not work at their defaults for you. The remaining ones should be fine for a basic setup. .PP Invoke \fBPyGopherd\fR with \fBpygopherd path/to/configfile\fR (or \fB/etc/init.d/pygopherd start\fR on Debian). Place some files in the location specified by the \fIroot\fR directive in the config file and you're ready to run! .SH "INSTALLATION" .PP If you are reading this document via the "man" command, it is likely that you have no installation tasks to perform; your system administra- tor has already installed \fBPyGopherd\fR. If you need to install it yourself, you have three options: a system-wide installation with Debian, system-wide installation with other systems, and a single-user installation. You can download the latest version of PyGopherd from .SS "DEBIAN SYSTEM-WIDE INSTALLATION" .PP If you are tracking Debian unstable, you may install \fBPyGopherd\fR by simply running this command as root: .PP \fBapt-get install pygopherd\fR .PP If you are not tracking Debian unstable, download the .deb package from the \fBPyGopherd\fR website and then run \fBdpkg -i\fR to install the downloaded package. Then, skip to the configuration section below. You will use \fB/etc/init.d/pygopherd start\fR to start the program. .SS "OTHER SYSTEM-WIDE INSTALLATION" .PP Download the tar.gz version of the package from the website. Make sure you have Python 2.2 or above installed; if now, download and install it from . Then run these commands: .nf \fBtar -zxvf pygopherd-x.y.z.tar.gz\fR \fBcd pygopherd-x.y.z\fR \fBpython2.2 setup.py\fR .fi .PP Some systems will use \fBpython\fR or \fBpython2.3\fR in place of \fBpython2.2\fR. .PP Next, proceed to configuration. Make sure that the \fI/etc/pygopherd/pygopherd.conf\fR file names valid users (\fIsetuid\fR and \fIsetgid\fR options) and a valid document root (\fIroot\fR option). .PP You will type \fIpygopherd\fR to invoke the program. .SS "SINGLE-ACCOUNT INSTALLATION" .PP Download the tar.gz version of the package from the website. Make sure you have Python 2.2 or above installed; if now, download and install it from . Then run these commands: .nf \fBtar -zxvf pygopherd-z.y.z.tar.gz\fR \fBcd pygopherd-x.y.z\fR .fi .PP Modify \fIconf/pygopherd.conf\fR as follows: .TP 0.2i \(bu Set \fIusechroot = no\fR .TP 0.2i \(bu Comment out (add a # sign to the start of the line) the \fIpidfile\fR, \fIsetuid\fR, and \fIsetgid\fR lines. .TP 0.2i \(bu Set \fIroot\fR to osomething appropriate. .TP 0.2i \(bu Set \fIport\fR to a number greater than 1024. .PP When you want to run \fBPyGopherd\fR, you will issue the \fBcd\fR command as above and then type \fBPYTHONPATH=. bin/pygopherd\fR. There is no installation step necessary. .SH "CONFIGURATION" .PP \fBPyGopherd\fR is regulated by a configuratoin file normally stored in \fI/etc/pygopherd/pygopherd.conf\fR. You can specify an alternate configuration file on the command line. The \fBPyGopherd\fR distribution ships with a sample \fIpygopherd.conf\fR file that thoroughly documents the configuration file options and settings. .SH "OPTIONS" .PP All \fBPyGopherd\fR configuratoin is done via the configuration file. Therefore, the program has only one command-line option: .TP \fB\fIconfigfile\fB\fR This option argument specifies the location of the configuration file that \fBPyGopherd\fR is to use. .SH "HANDLERS" .PP \fBPyGopherd\fR defines several handlers which are responsible for finding data on your server and presenting it to the user. The handlers are used to generate things like links to other documents and directory listings. They are also responsible for serving up regular files and even virtual folders. .PP Handlers are specified with the \fIhandlers\fR option in \fIpygopherd.conf\fR. This option is a list of handlers to use. For each request that arrives, \fBPyGopherd\fR will ask each handler in turn whether or not it can handle the request, and will handle the request according to the first handler that is capable of doing so. If no handlers can handle the request, a file not found error is generated. See the example configuration file for an example. .PP The remaining parts of this section describe the different handlers that ship with \fBPyGopherd\fR. Please note that some versions of this manual may show the handlers in all caps; however, their names are not all caps and are case-sensitive. .SS "DIR.DIRHANDLER" .PP This handler is a basic one that generates menus based on the contents of a directory. It is used for directories that contain neither a \fIgophermap\fR file nor UMN-style links files, or situations where you have no need for either of those. .PP This handler simply reads the contents of your on-disk directory, determines the appropriate types of each file, and sends the result to the client. The descriptions of each item are usually set to the filename, but the \fIhtml.HTMLFileTitleHandler\fR may override that. .SS "GOPHERMAP.BUCKGOPHERMAPHANDLER" .PP This handler is used to generate directory listings based on \fIgophermap\fR files. It will not read the directory on-disk, instead serving content from the \fIgophermap\fR file only. Gophermaps are useful if you want to present a directory in which the files do not frequently change and there is general information to present. Overall, if you only wish to present information particular to certain files, you should consider using the abstract feature of UMN.UMNDirHandler. .PP The \fIgophermap\fR files contain two types of lines, which are described here using the same convention normally used for command line arguments. In this section, the symbol \\t will be used to indicate a tab character, Control-I. \fB\fIfull line of informational text\fB\fR \fB\fIgophertypeDESCRIPTION\fB\fR [ \fB\\t\fIselector\fB [ \\t\fIhost\fB [ \\t\fIport\fB ] ]\fR ] .PP Note: spaces shown above are for clarity only and should not actually be present in your file. .PP The informational text must not contain any tab characters, but may contain spaces. Informational text will be rendered with gopher type \fIi\fR, which will cause it to be displayed on a client's screen at its particular position in the file. .PP The second type of line represents a link to a file or directory. It begins with a single-character Gopher type (see Gopher Item Types below) followed immediately by a description and a tab character. There is no space or other separator between the gopher type and the description. The description may contain spaces but not tabs. .PP The remaining arguments are optional, but only to the extent that arguments may be omitted only if all arguments after them are also omitted. These arguments are: .TP \fB\fIselector\fB\fR The \fIselector\fR is the name of the file on the server. If it begins with a slash, it is an absolute path; otherwise, it is interpreted relative to the directory that the gophermap file is in. If no selector is specified, the description is also used as the selector. .TP \fB\fIhost\fB\fR The \fIhost\fR specifies the host on which this resource is located. If not specified, defaults to the current server. .TP \fB\fIport\fB\fR The \fIport\fR specifies the port on which the resource is located. If not specified, defaults to the port the current server is listening on. .PP An example of a gophermap to help illustrate the concept is included with the \fBPyGopherd\fR distribution in the file \fIexamples/gophermap\fR. .SS "FILE.COMPRESSEDFILEHANDLER" .PP In order to save space, you might want to store documents on-disk in a compressed format. But then clients would ordinarily have to decompress the files themselves. It would be nice to have the server automatically decompress the files on the fly, sending that result to the client. That's where \fIfile.CompressedFileHandler\fR comes in. .PP This handler will take compressed files, pipe them through your chosen decompression program, and send the result directly to clients -- completely transparently. .PP To use this handler, set the \fIdecompressors\fR option in the configuration file. This option defines a mapping from MIME encodings (as defined with the \fIencoding\fR option) to decompression programs. Files that are not encoded, or which have an encoding that does not occur in the \fIdecompressors\fR map, will not be decompressed by this handler. .PP Please see the sample configuration file for more examples and details about the configuration of this handler. .SS "FILE.FILEHANDLER" .PP The \fIfile.FileHandler\fR is just that -- its duty is to serve up regular files to clients. .SS "HTML.HTMLFILETITLEHANDLER" .PP This handler is used when generating directories and will set the description of HTML files to the HTML title defined in them rather than let it be the default filename. Other than that, it has no effect. UMN gopherd implements a similar policy. .SS "MBOX HANDLERS" .PP There are four mailbox handlers: .TP 0.2i \(bu mbox.MaildirFolderHandler .TP 0.2i \(bu mbox.MaildirMessageHandler .TP 0.2i \(bu mbox.MBoxMessageHandler .TP 0.2i \(bu mbox.MBoxFolderHandler .PP These four handlers provide a unique "virtual folder" service. They allow you to present mailboxes as if they were folders, the items of the folders being the messages in the mailbox, organized by subject. This is useful for presenting mail archives or just making e-mail accessible in a nice and easy fashion. .PP To use these handlers, all you have to do is enable them in your \fIhandlers\fR section. They will automatically detect requests for mailboxes and handle them appropriately. .PP The different handlers are for traditional Unix mbox mailboxes (all messages in a single file) and new qmail-stype Maildir mailboxes. You can enable only the two handlers for the specific mailbox type that you use, if desired. .SS "PYG.PYGHANDLER" .PP PYG (short for PYGopherd) is a mechanism that provides a tremendous amount of flexibility. Rather than just letting you execute a script like other Gopher or HTTP servers, PYGs are actually loaded up into PyGopherd and become fully-capable first-class virtual handlers. Yet they need not be known ahead of time, and are loaded dynamically. .PP With a PYG handler, you can generate gopher directories, handle searches, generate files, and more on the fly. You can create entire virtual directory trees (for instance, to interface with NNTP servers or with DICT servers), and access them all using the standard Gopher protocol. All of this without having to modify even one line of \fBPyGopherd\fR code. .PP If enabled, the \fIpyg.PYGHandler\fR will look for files with the extension .pyg that are marked executable. If found, they will be loaded and run as PYGs. .PP Please note: this module provides the capability to execute arbitrary code. Please consider the security ramifications of that before enabling it. .PP See the \fIvirtual.Virtual\fR handler for more information about passing data to your scripts at runtime. .PP At present, documentation on writing PYGs is not provides, but you may find examples in the \fIpygfarm\fR directory included with the \fBPyGopherd\fR distribution. .SS "SCRIPTEXEC.EXECHANDLER" .PP This handler implements "old-style" script execution; that is, executing arbitrary programs and piping the result to the client. It is, for the most part, compatible with both scripts written for UMN gopherd and the Bucktooth gopher server. If enabled, it will execute any file that is marked executable in the filesystem. It will normally list scripts as returning plain text, but you may create a custom link to the script that defines it as returning whatever kind of file you desire. Unlike PYGs, this type must be known in advance. .PP The \fIscriptexec.ExecHandler\fR will set environment variables for your scripts to use. They are as follows: .TP \fBSERVER_NAME\fR The name of this server as defined in the configuration file or detected from the operating system. .TP \fBSERVER_PORT\fR The port this server is listening on. .TP \fBREMOTE_ADDR\fR The IP address of the client. .TP \fBREMOTE_PORT\fR The port number of the client. .TP \fBREMOTE_HOST\fR The same value as \fIREMOTE_ADDR\fR .TP \fBSELECTOR\fR The file that was requested; that is, the relative path to this script. If the selector included additional parameters after a |, they will be included in this string as well. .TP \fBREQUEST\fR The "base" part of the selector; that is, the part leading up to the |. .TP \fBSEARCHREQUEST\fR Included only if the client specified search data, this is used if the client is searching for something. .PP See the \fIvirtual.Virtual\fR handler for more information about passing data to your scripts at runtime. .PP Please note: this module provides the capability to execute arbitrary code. Please consider the security ramifications of that before enabling it. .SS "UMN.UMNDIRHANDLER" .PP This is one of the most powerful workhorse handlers in \fBPyGopherd\fR. It is designed to emulate most of the ways in which the UMN gopherd distribution generates directories, even going so far as to be bug-compatible in some cases. Generating directories with this handler is often the best general-purpose way to make nice directories in gopherspace. .PP The remainder of the description of the \fIUMN.UMNDirHandler\fR, except for the Abstracts and Info section, is lifted directly from the original UMN gopherd documentation, with light editing, because this handler implements it so exactly that there was no point in rewriting all that documentation :-) .SS "LINKS" .PP You can override the default view of a directory as generated by \fIdir.DirHandler\fR by creating what are known as \fBLinks\fR in the data tree. .PP The ability to make links to other hosts is how gopher distributes itself among multiple hosts. There are two different ways to make a link. The first and simplest is to create a link file that contains the data needed by the server. By default all files in the gopher data directory starting with a period are taken to be link files. A link file can contain multiple links. To define a link you need to put five lines in a link file that define the needed characteristics for the document. Here is an example of a link. .nf Name=Cheese Ball Recipes Numb=1 Type=1 Port=150 Path=1/Moo/Cheesy Host=zippy.micro.umn.edu .fi .PP The Name= line is what the user will see when cruising through the database. In this case the name is "Cheese Ball Recipes". The "Type=" defines what kind of document this object is. For a list of all defined types, see Gopher Item Types below. For Gopher+ and HTTP, a MIME type is also used, which is determined automatically based on the type you specify. .PP The "Path=" line contains the selector string that the client will use to retrieve the actual document. The Numb= specifies that this entry should be presented first in the directory list (instead of being alphabetized). The "Numb=" line is optional. If it is present it cannot be the last line of the link. The "Port=" and "Host=" lines specify a fully qualified domain name (FQDN) and a port respectively. You may substitute a plus '+' for these two parameters if you wish. The server will insert the current hostname and the current port when it sees a plus in either of these two fields. .PP An easy way to retrieve links is to use the Curses Gopher Client. By pressing '=' You can get information suitable for inclusion in a link file. .SS "OVERRIDING DEFAULTS" .PP The server looks for a directory called \fI.cap\fR when parsing a directory. The server then checks to see if the \fI.cap\fR directory contains a file with the same name as the file it's parsing. If this file exists then the server will open it for reading. The server parses this file just like a link file. However, instead of making a new object, the parameters inside the \fI.cap/\fR file are used to override any of the server supplied default values. .PP For instance, say you wanted to change the Title of a text file for gopher, but don't want to change the filename. You also don't want it alphabetized, instead you want it second in the directory listing. You could make a set-aside file in the \fI.cap\fR directory with the same filename that contained the following lines: .nf Name=New Long Cool Name Numb=2 .fi .PP An alternative to \fI.cap\fR files are extended link files. They work just the same as the files described in Links above, but have a somewhat abbreviated format. As an example, if the name of the file was \fIfile-to-change\fR, then you could create a file called \fI.names\fR with the following contents: .nf Path=./file-to-change Name=New Long Cool Name Numb=2 .fi .SS "ADDING COOL LINKS" .PP One cool thing you can do with .Links is to add neato services to your gopher server. Adding a link like this: .nf Name=Cool ftp directory Type=h Path=/URL:ftp://hostname/path/ Host=+ Port=+ Name=Cool web site Type=h Path=/URL:http://hostname/ Host=+ Port=+ .fi .PP Will allow you to link in any FTP or Web site to your gopher. (See url.URLHandler for more details.) .PP You can easily add a finger site to your gopher server thusly: .nf Name=Finger information Type=0 Path=lindner Host=mudhoney.micro.umn.edu Port=79 .fi .SS "HIDING AN ENTRY" .PP This kind of trick may be necessary in some cases, and thus for object "fred", the overriding .names file entry would be: .nf Type=X Path=./fred .fi .PP by overriding default type to be "X". This kind of hideouts may be usefull, when for some reason there are symlinks (or whatever) in the directory at which \fBPyGopherd\fR looks at, and those entries are not desired to be shown at all. .SS "ABSTRACTS AND INFO" .PP Many modern gopher server maintainers like to intersperse gopher directory listings with other information -- often, additional information about the contents of files in the directory. The gophermap system provides one way to do that, and abstracts used with UMN gopher directories provides another. .PP Subject to the \fIabstract_headers\fR and \fIabstract_entries\fR configuration file options, this feature allows you to define that extra information. You can do that by simply creating a file named \fIfilename.abstract\fR right alongside the regular file in your directory. The file will be interpreted as the abstract. For a directory, create a file named \fI.abstract\fR in the directory. Simple as that! .SS "URL.HTMLURLHANDLER" .PP \fBPyGopherd\fR provides ways for you to link to pages outside Gopherspace -- that is, web pages, FTP sites, and the like. This is accomplished according to the Links to URL specification (see Conforming To below for details). In order to link to a URL (EXCEPT gopher URLs) from a menu, you create a link of type h (regardless of the actual type of the resource that you are linking to) in your \fIgophermap\fR or \fI.Links\fR file that looks like this: .nf /URL:http://www.complete.org/ .fi .PP Modern Gopher clients that follow the Links to URL specification will automatically follow that link when you select it. The rest need some help, and that's where this handler comes in. .PP For Gopher clients that do not follow the Links to URL specification, the \fIurl.HTMLURLHandler\fR will automatically generate an HTML document for them on the fly. This document includes a refresh code that will send them to the proper page. You should not disable this handler. .SS "URL.URLTYPEREWRITER" .PP Some people wish to serve HTML documents from their Gopher server. One problem with that is that links in Gopherspace include an extra type character at the beginning, whereas links in HTTP do not. This handler will remove the extra type character from HTTP requests that come in, allowing a single relative-to-root link to work for both. .SS "VIRTUAL.VIRTUAL" .PP This handler is not intended to ever be used directly, but is used by many other handlers such as the mbox support, PYG handlers, and others. It is used to generate virtual entries in the directory hierarchy -- that is, entries that look normal to a client, but do not actually correspond to a file on disk. .PP One special feature of the \fIvirtual.Virtual\fR handler is that you can send information to it at runtime in a manner similar to a CGI script on the web. You do this by adding a question mark after the regular selector, followed by any arbitrary data that you wish to have sent to the virtual request handler. .SS "ZIP.ZIPHANDLER" .PP Using zip.ZIPHandler, you can save space on your server by converting part or all of your site into a ZIP file. \fBPyGopherd\fR can use the contents of that ZIP file as the contents of your site -- completely transparently. .PP The ZIP file handler must be enabled in the configuration file for this to work. .SH "GOPHER ITEM TYPES" .PP When you construct links to files via \fI.Links\fR or \fIgophermap\fR files, or modify the \fImapping\fR in the configuration file, you will need to know these. Items bearing the "not implemented" text are not served up by \fBPyGopherd\fR as it ships, generally due to requirements of customized per-site software, but may be served up via PYG extension modules or other gopher servers. .PP This list was prepared based on RFC1436, the UMN gopherd(1) manpage, and best current practices. .TP \fB0\fR Plain text file .TP \fB1\fR Directory .TP \fB2\fR CSO phone book server (not implemented by \fBPyGopherd\fR) .TP \fB3\fR Error condition; text that follows is plain text .TP \fB4\fR Macintosh file, BinHex format .TP \fB5\fR DOS binary archive (not implemented by \fBPyGopherd\fR; use type 9 instead) .TP \fB6\fR uuencoded file; not directly generated by \fBPyGopherd\fR automatically, but can be linked to manually. Most gopher clients will handle this better as type 1. .TP \fB7\fR Search .TP \fB8\fR Telnet link .TP \fB9\fR Binary file .TP \fB+\fR Redundant server (not implemented by \fBPyGopherd\fR) .TP \fBc\fR Calendar (not implemented by \fBPyGopherd\fR) .TP \fBe\fR Event (not implemented by \fBPyGopherd\fR) .TP \fBg\fR GIF-format graphic .TP \fBh\fR HTML file .TP \fBI\fR Any kind of graphic file other than GIF .TP \fBi\fR Informational text included in a directory that is displayed but does not link to any actual file. .TP \fBM\fR MIME multipart/mixed file .TP \fBs\fR Any kind of sound file .TP \fBT\fR tn3270 link .TP \fBX\fR .TP \fB-\fR UMN-specific -- signifies that this entry should not be displayed in a directory entry, but may be accessed via a direct link. This value is never transmitted in any Gopher protocol. .SH "CONFORMING TO" .TP 0.2i \(bu The Internet Gopher Protocol as specified in RFC1436 .TP 0.2i \(bu The Gopher+ upward-compatible enhancements to the Internet Gopher Protocol from the University of Minnesota as laid out at . .TP 0.2i \(bu The gophermap file format as originally implemented in the Bucktooth gopher server and described at . .TP 0.2i \(bu The Links to URL specification as laid out by John Goerzen at . .TP 0.2i \(bu The UMN format for specifying object attributes and links with .cap, .Links, .abstract, and similar files as specified elsewhere in this document and implemented by UMN gopherd. .TP 0.2i \(bu The PYG format for extensible Python gopher objects as created for \fBPyGopherd\fR. .TP 0.2i \(bu Hypertext Transfer Protocol HTTP/1.0 as specified in RFC1945 .TP 0.2i \(bu Hypertext Markup Language (HTML) 3.2 and 4.0 Transitional as specified in RFC1866 and RFC2854. .TP 0.2i \(bu Maildir as specified in and . .TP 0.2i \(bu The mbox mail storage format as specified in . .TP 0.2i \(bu Registered MIME media types as specified in RFC2048. .TP 0.2i \(bu Script execution conforming to both UMN standards as laid out in UMN gopherd(1) and Bucktooth standards as specified at , so far as each can be implemented consistent with secure design principles. .TP 0.2i \(bu Standard Python 2.2.1 or above as implemented on POSIX-compliant systems. .TP 0.2i \(bu WAP/WML as defined by the WAP Forum. .SH "BUGS" .PP Reports of bugs should be sent via e-mail to the \fBPyGopherd\fR bug-tracking system (BTS) at or submitted online using the Web interface at . .PP The Web site also lists all current bugs, where you can check their status or contribute to fixing them. .SH "COPYRIGHT" .PP \fBPyGopherd\fR is Copyright (C) 2002, 2003 John Goerzen. .PP 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; version 2 of the License. .PP 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. .PP You should have received a copy of the GNU General Public License along with this program; if not, write to: .nf Free Software Foundation, Inc. 59 Temple Place Suite 330 Boston, MA 02111-1307 USA .fi .SH "AUTHOR" .PP \fBPyGopherd\fR, its libraries, documentation, and all included files (except where noted) was written by John Goerzen and copyright is held as stated in the Copyright section. .PP Portions of this manual (specifically relating to certian UMN gopherd features and characteristics that PyGopherd emulates) are modified versions of the original gopherd(1) manpage accompanying the UMN gopher distribution. That document is distributed under the same terms as this, and bears the following copyright notices: .nf Copyright (C) 1991-2000 University of Minnesota Copyright (C) 2000-2002 John Goerzen and other developers .fi .PP \fBPyGopherd\fR may be downloaded, and information found, from its homepage via either Gopher or HTTP: .PP .PP .PP \fBPyGopherd\fR may also be downloaded using Subversion. Additionally, the distributed tar.gz may be updated with a simple "svn update" command; it is ready to go. For information on getting \fBPyGopherd\fR with Subversion, please visit . .SH "SEE ALSO" .PP python (1). pygopherd-2.0.18.3+nmu4ubuntu1/doc/quickstart.sgml0000664000000000000000000000303610762620505016667 0ustar If you have already installed &PyGopherd; system-wide, or your administrator has done that for you, your task for setting up &PyGopherd; for the first time is quite simple. You just need to set up your configuration file, make your folder directory, and run it! You can quickly set up your configuration file. The distribution includes two files of interest: conf/pygopherd.conf and conf/mime.types. Debian users will find the configuration file pre-installed in /etc/pygopherd/pygopherd.conf and the mime.types file provided by the system already. Open up pygopherd.conf in your editor and adjust to suit. The file is heavily commented and you can refer to it for detailed information. Some settings to take a look at include: detach, pidfile, port, usechroot, setuid, setgid, and root. These may or may not work at their defaults for you. The remaining ones should be fine for a basic setup. Invoke &PyGopherd; with pygopherd path/to/configfile (or /etc/init.d/pygopherd start on Debian). Place some files in the location specified by the root directive in the config file and you're ready to run! pygopherd-2.0.18.3+nmu4ubuntu1/doc/standards/0000775000000000000000000000000011047204732015567 5ustar pygopherd-2.0.18.3+nmu4ubuntu1/doc/standards/Gopher+.txt0000664000000000000000000010516510762620505017642 0ustar Gopher+ upward compatible enhancements to the Internet Gopher protocol Farhad Anklesaria, Paul Lindner, Mark P. McCahill, Daniel Torrey, David Johnson, Bob Alberti Microcomputer and Workstation Networks Center / Computer and Information Systems University of Minnesota July 30, 1993 gopher+ n. 1. Hardier strains of mammals of the family Geomyidae. 2. (Amer. colloq.) Native or inhabitant of Minnesota, the Gopher state, in full winter regalia (see PARKA). 3. (Amer. colloq.) Executive secretary. 4. (computer tech.) Software following a simple protocol for burrowing through a TCP/IP internet, made more powerful by simple enhancements (see CREEPING FEATURISM). Abstract The internet Gopher protocol was designed for distributed document search and retrieval. The documents "The internet Gopher protocol: a distributed document search and retrieval protocol" and internet RFC 1436 describe the basic protocol and has an overview of how to implement new client and server applications. This document describes a set of enhancements to the syntax, semantics and functionality of the original Gopher protocol. Distribution of this document is unlimited. Please send comments to the Gopher development team: . Implementation of the mechanisms described here is encouraged. 1. Introduction The Internet Gopher protocol was designed primarily to act as a distributed document delivery system. It has enjoyed increasing popularity, and is being used for purposes that were not visualized when the protocol was first outlined. The rest of this document describes the Gopher+ enhancements in a non- rigorous but easily read and understood way. There is a short BNF-like section at the end for exact syntax descriptions. Throughout the document, "F" stands for the ASCII TAB character. There is an implicit carriage return and linefeed at the ends of lines; these will only be explicitly mentioned where necessary to avoid confusion. To understand this document, you really must be familiar with the basic Gopher protocol. Servers and clients understanding the Gopher+ extensions will transmit extra information at the ends of list and request lines. Old, basic gopher clients ignore such information. New Gopher+ aware servers continue to work at their old level with unenhanced clients. The extra information that can be communicated by Gopher+ clients may be used to summon new capabilities to bridge the most keenly felt shortcomings of the venerable old Gopher. 2. How does Gopher+ work? Gopher+ enhancements rely on transmitting an "extra" tab delimited fields beyond what regular (old) Gopher servers and clients now use. If most existing (old) clients were to encounter extra stuff beyond the "port" field in a list (directory), most would ignore it. Gopher+ servers will return item descriptions in this form: 1Display stringFselector stringFhostFportFextra stuff If an existing (old) client has problems with additional information beyond the port, it should not take much more than a simple tweak to have it discard unneeded stuff. 2.1 Advisory issued to client maintainers. If it does not do this already, your existing client should be modified as soon as possible to ignore extra fields beyond what it expects to find. This will ensure thatyour clients does not break when it encounters Gopher+ servers in gopherspace. All the regular Gopher protocol info remains intact except for: (1) Instead of just a CRLF after the port field in any item of a list (directory) there may be an optional TAB followed by extra stuff as noted above (explanation to follow). (2) In the original Gopher protocol, there was provision for a date-time descriptor (sec 3.6) to be sent after the selector (for use by autoindexer beasts). As far as we know, while the descriptor is implemented in the Mac server, it is not in any other server and no clients or daemons use it. This is a good time to withdraw this feature. The basic gopher protocol has been revised for the final time and will be frozen. 2.2 Gopher+ item lists. Gopher servers that can utilize the Gopher+ enhancements will send some additional stuff (frequently the character "+") after the port field describing any list item. eg: 1Some old directoryFfoo selectorFhost1Fport1 1Some new directoryFbar selectorFhost1Fport1F+ 0Some file or otherFmoo selectorFhost2Fport2F+ The first line is the regular old gopher item description. The second line is new Gopher+ item description. The third line is a Gopher+ description of a document. Old gopher clients can request the latter two items using old format gopher selector strings and retrieve the items. New, Gopher+ savvy clients will notice the trailing + and know that they can do extra things with these kinds of items. 2.3 Gopher+ data transfer. If a client sends out a Gopher+ type request to a server (by tagging on a tab and a "+" to the request): bar selectorF+ The server may return the response in one of three ways; examples below: +5340 +-1. +-2 The first response means: I am going to send exactly 5340 bytes at you and they will begin right after this line. The second response means: I have no idea how many bytes I have to send (or I am lazy), but I will send a period on a line by itself when I am done. The third means: I really have no idea how many bytes I have to send, and what's more, they COULD contain the . pattern, so just read until I close the connection. The first character of a response to a Gopher+ query denotes success (+) or failure (-). Following that is a token to be interpreted as a decimal number. If the number is >= 0, it describes the length of the dataBlock. If = -1, it means the data is period terminated. If = -2, it means the data ends when the connection closes. The server may return an error also, as in: --1. The (short!) error message will be in ASCII text in the data part. The first token on the first line of the error text (data) contains an error-code (an integer). It is recommended that the first line also contain the e-mail address of the administrator of the server (in angle brackets). Both the error-code and the email address may easily be extracted by the client. Subsequent lines contain a short error message that may be displayed to the user. Basic error codes are: 1 Item is not available. 2 Try again later ("eg. My load is too high right now.") 3 Item has moved. Following the error-code is the gopher descriptor of where it now lives. More error codes may be defined as the need arises. This should be obvious: if the client sends out an "old" Gopher kind of request: bar selector the server will know that it is talking to an old client and will respond in the old way. This means that old gopher clients can still access information on Gopher+ servers. 2.4 Gopher+ client requests. Clients can send requests to retrieve the contents of an item in this form: selectorstringF+[representation][FdataFlag][dat ablock] If dataFlag is '0', or nonexistent, then the client will not send any data besides the selector string. If the dataFlag is '1' then a block of data will follow in the same format as Section 2.3. The client can send a large amount of data to the server in the dataBlock. Representations or alternative views of an item's contents may be discovered by interrogating the server about the item's attribute information; this is explained below. Note that in the original Gopher protocol, a query submitted to an index server might have a selector string followed by a TAB and the words for which the index server was being asked to search. In Gopher+, the extra TAB and Gopher+ information follow the words for which the server is being asked to search. Gopher+ client have to be smart enough to know that in the case of a type 7 item (an index server) they append the Gopher+ information after the words being searched for. 2.5 Gopher+ Item Attribute Information. The most basic enhancement of Gopher+ items is the ability to associate information about an item such as size, alternative views, the administrator, an abstract, etc. with the item. To get Attribute Information, a client can send out a request to the gopher server that looks like this: selector stringF! (think of "!" as an upside-down i for "information"). To the server this means "Instead of returning the contents of the item, return the item's Attribute Information". The Attribute Information is returned as an ASCII text stream containing blocks of information.For example, a server might return: +INFO: 0Some file or otherFmoo selectorFhost2Fport2F+ +ADMIN: Admin: Frodo Gophermeister Mod-Date: Wed Jul 28 17:02:01 1993 <19930728170201> +VIEWS: Text/plain: <10k> application/postscript: <100k> Text/plain De_DE: <15k> application/MacWriteII: <45K> +ABSTRACT: This is a short (but multi-line) abstract about the item. Two or three lines ought to be enough The beginning of a block of information is denoted by a "+" in column 1 of a line. Another way to think of it is: the name of each block begins with a + and the rest of the name cannot contain a +. Each line of information within a block begins with a space so that it is easy to locate the beginning of a block. There can be multiple blocks of information about an item, but the first block must be the one-line +INFO block containing the keyword +INFO followed by the gopher item description. This is done to make it easy to associate informational attributes with the gopher items to which they refer (see section 2.7 for some good reasons for doing this). The very first line of Attribute Information for an item contains a one-line +INFO block containing the gopher descriptor for the item. All Gopher+ servers must return an "+INFO" block for all items listed by the server. Also present may be an +ADMIN block that can be many lines long. The server must also send an +ADMIN block when asked to send all the item's attributes (as in the example above). The +ADMIN block must contain at least an Admin attribute and Mod-Date attributes, though there may be many other administrative items also present in the +ADMIN block. The Admin (the administrator of the item) and Date (the date of the item's last modification) attributes are required to be returned by the server, and other optional attributes may be returned as well. In this example, there are two pieces of information within the +ADMIN block (Admin and Mod-Date). The Admin attribute must contain the e-mail address of an administrator inside angle brackets. The Admin line might also contain the administrator's name and phone number. The Date line must contain the modification date in angle brackets. The format of the date is where YYYY is year, MM is month, DD is day, hh is hours, mm is minutes, and ss is seconds. The third block in the example is the +VIEWS block. This block lists different formats in which the document can be retrieved. The first format listed is what the server believes to be the preferred format. A gopher client might display the list of possible view labels of the item to the user and let the user select the view they prefer. Alternatively, a smart client might look at the content of the labels and preferentially retrieve Postscript views of items. Note that the view labels are structured. View labels specify a Content-Type (application/Postscript, Text/plain, etc.), an optional language (En_US, De_DE, etc.) and an optional size. Note that the View labels for content type use the MIME content types to specify names of the variious views. The optional language descriptors use the ISO-639 codes for representing languages to name the language. Smart clients might want to translate these rather cryptic codes into something mere mortals can read and understand. The client software can pick off the size of each view IF there are any angle brackets on the line. There might not be a size that the server cares to tell you about. Also this might NOT be the exact size that the server will wind up delivering to you if you ask for it... but it should be reasonably close. This information makes it possible for clever clients to select views based on size, data representation, or language. See section 2.6 for how alternate representations (views) are retrieved. The next block in the example is an (optional) +ABSTRACT. Here the block consists of lines of text that might be displayed to the user. Other blocks of information can defined and added as the need arises. For instance, a Neuromancer-esque 3-D cyberspace attribute might be accommodated by including a 3D-ICON block (with an image to display in 3-space) and a 3D-COORDINATE block (with y,x, and z coordinates). More immediate needs can also addressed by defining other information blocks. For instance, a SCRIPT block would be a natural place to put information for scripting telnet sessions. Information blocks give us an extensible way of adding attributes (or what Macintosh programmers call resources) to gopher items. Some of the really cool ideas we have for information attributes may require sending large amounts of data, some of which may not be easily represented as ASCII text, but the idea of the attributes information is that it is a relatively compact list of attributes. These somewhat conflicting desires can be reconciled by allowing references to gopher items in an attribute. For example, an +ABSTRACT block might be returned this way: +ABSTRACT: 0long abstractFselectorFhost2Fport2F+ In this example, the abstract is a document that resides on a gopher server. By allowing references to to gopher items, we can also accommodate data that must be sent in an 8-bit clear stream by using the Gopher+ methods for retrieving binary data. If both a reference to an attribute and an explicit value for the attribute are present in an attribute list, the preferred version is the explicit value. In the example below, the preferred version is "the short abstract goes here". +ABSTRACT: 0long abstractFselectorFhost2Fport2F+ the short abstract goes here Note that if you want to have several views of (for example) an +ABSTRACT this is possible by using a reference to a item residing on a gopher server because the item can have its own attributes. Attributes names are case sensitive (easier to match and more of them). There is no need to "preregister" all possible attributes since we cannot anticipate all possible future needs. However it would be reasonable to maintain a registry for implementors and administrators so duplication can be avoided. Server implementors or administrators can request that new attributes be included in the attribute registry. Dream on: What gets us excited are alternate representations for directory lists. Sure, the standard representation for a gopher directory list is known to us all. But isn't hypertext (in a WWW sense) an alternate kind of directory list? We also envisioned a "geographical view" (GView?) mapping servers onto a map of the world (throw up a gif picture and then overlay dots based on latitude and longitude or xy coordinates). OK. Dream off. Note that interested parties outside gopherspace have long and complex wish-lists for "attributes" that all well-dressed Internet citizens should have. We don't want to comment on the use or value of these laundry- lists. Suffice it to say that nothing precludes server administrators from including whatever attributes they see fit to include. Certainly IAFA blocks are desirable, bearing UDIs, URL's or whatever else is desired. The gopher community will probably arrive at a list of "recommended" attributes that server administrators should try to support. Because not every server administrator sees advantage to cluttering Attribute Info files with information their primary users will never need, it does not seem fair to "force" folks to include them; most will just ignore the harsh protocol guideline and the value of the protocol will be diminished. We want to mandate as little as we possibly can. 2.6 Using Attribute Info: Alternate representations (+VIEWS). The user may locate a document and wonder if there are representations of it besides, say, the standard Text. Using the appropriate client incantation (Option Double-Click? or whatever) the user indicates a wish to see what's available. The client retrieves the Attribute Information, displays the list of views to the user in some kind of scrolling list dialog. User selects a line and client now requests the document in say, Postscript representation: the selectorF+application/Postscript Smart clients are not precluded from doing things like "Always get Postscript if you can" or "Always get Postscript if that is less than 700K in size." etc. And the "smarter" you make it, the hairier your client will become - unless you are a user interface wizard of awesome proportions. While the example above is of fetching a document's postscript view, there is nothing precluding having different views for directories. In the dream sequence earlier, we imagined a geographic view of a directory. For a client to fetch that view, it would say this: the selectorF+GView 2.7 Getting attributes for all items in a directory in one transaction. Heavyweight/clever/special-purpose clients may want to know all the attributes of items in a given directory in one transaction. The "$" command is used to request all the attributes of a directory at once. For instance, a client might sent the request: selector stringF$ and the server might return this: +INFO: 0Salmon dogsFsome selectorFhost2Fport2F+ +ADMIN: Admin: Frodo Gophermeister Mod-Date: August 15, 1992 <19920815185503> +VIEWS: Text/plain: <10k> application/Postscript De_DE: <100k> +ABSTRACT: A great recipe for making salmon +INFO: 0Hot pupsFother selectorFhost3Fport3F+ +ADMIN: Admin: Bilbo Gophernovice Date: <19910101080003> In this example, the server returned the attribute lists for two items because there were only two items in the directory.. The client software can easily separate the attributes for the items since each attribute list starts with "+INFO". It is also easy for the client to use the "$" command to get directory listings since the gopher item descriptor is on the +INFO line for each item. Note that the $ command is the only way to find the administrator of a remote link. To get the full attribute information for a link on another machine may require asking the master machine for the item information. It is possible to append which attributes you are interested in retrieving after the $, eg: some directory selectorF$+VIEWS or other directory selectorF$+VIEWS+ABSTRACT The $ command makes it possible for a client that does not mind burning bandwidth to get attribute information for all items as the user navigates gopherspace. Clients using 2400 bps SLIP links will probably not use this method... but clients on Ethernet may not mind. This command may also be useful for building smart indexes of items in gopherspace. Note that the specific requested attributes are only suggestions to the server that the client would like less than a full set of attributes. The server may choose to ignore the request (if it is not capable of extracting the required attributes) and return the client the full set anyway. Other caveats: even if the attributes requested are not available, the server WILL NOT return an error, but will send whatever IS available. It is the client's responsibility inspect the returned attributes. Analogous to use of the $ command, the ! command can also be used to request certain attribute blocks. 2.8 Gopher+ Interactive Query items. The principle here is based on Roland Schemer's "Q/q" type ideas. We're calling it the Interactive Query enhancements... The server may list items that have a "?" following the port field: 0A fileFfile selectorFhostFportF? 1A directoryFdir selectorFhostFportF? Now the fact that there's something after the port field means that these are Gopher+ items. Old clients will still be able to show such items in lists, but if they simply send the old style plain selector string to retrieve them, the server will respond with an old style error telling them to get an updated client. New clients will know that before getting one of these items, it will be necessary to retrieve questions from the server, have the user answer them, and then feed the answers back to the server along with the selector. The questions to be asked of the user are retrieved from the server by looking at the +ASK attribute in the item's attribute information. When the user selects a query item, the client quickly connects to the server and requests the Attribute Information for the item. Then the client extracts the information in the +ASK attribute block. Here's an example: +INFO: 0inquisitiveFmoo moo selectorFhost2Fport2F+ +ADMIN Admin: Frank Gophermeister Mod-Date: August 15, 1992 <19920815185503> +ASK: Ask: How many volts? Choose: Deliver electric shock to administrator now?FYesFNot! The client will use all lines in the order they appear in the +ASK attribute block. The content will be presented to the user as questions or prompts or dialogs or something like that. The "Ask" presents the user with a question, supplies a default text answer if it exists and allows the user to enter a one-line responce. The "AskP" presents the user with a question, and bullets out the responce typed in by the user so that someone watching over the user's sholder cannot read the responce. The "AskL" presents the user with a question, and ideally should allo the user to enter several lines of responce. The "AskF" requests the user for a new local filename, presumably for stashing the response returned by the server. It may supply a default filename. The "Select" presents the user with a set of options from which the use can select one or many. This is equivalent to Macintosh check boxes. The "Choose" presents the user with a few short choices only one of which may be selected at a time. This is equivalent to Macintosh radio buttons. The "ChooseF" requests that the user select an existing local file, presumably for sending to the server. On some systems, the client writer or administrator might want to restrict the selection of such files to the current directory (ie. not allow paths in the filename to prevent sending things like password files). The n responses harvested from the user are sent on to the server as the first n lines in the dataBlock. There can only be one file sent, and it will be the remainder of the dataBlock if any. If there is an AskL the responce is returned with a count of the number of lines entered by the user on a line by itself, followed by the lines entered by the user. Gopher was originally designed as an essentially anonymous document retrieval protocol to facilitate easy access to information rather than limited access. Various kinds of restrictive mechanisms have been implemented at the server end (for example, access restriction by source IP address); however if you have sensitive information, we emphasize that putting it under a Gopher's nose is not a good idea. The folks with a hirsute tendency will have noticed that all these interactions are static rather than truly dynamic and interactive. In other words, the server cannot ask different questions in response to different answers. +ASK does not constitute a scripting language by any means. To do "true" scripting, we have to do one of two things 1. Write a full language parser/interpreter into clients. The server loads a whole script into the client's brain, and the client "runs" it. This rather grossly violates the spirit of simplicity in cross-platform gopher implementation. However, when and if a standard scripting language is adopted, there will be room for it in a SCRIPT attribute block. 2. Client enters a complex back-and-forth transaction with the server. This requires the server, client, or both to save rather a lot of state. NOPE! Server saving state means holding open a connection or (worse) the server retaining tokens between connections. Client saving state means the server has an even worse job to do. As Opus the Penguin would say: a Hairball. 2.9 Gopher+ Pictures, Sounds, Movies. A lot of folks need ability to retrieve and display pictures, but there is no real consensus on ONE format for these pictures. We don't want to define a type character for every oddball picture type. Gopher+ handles Pictures, Movies, and Sounds by defining three item types: ":" for bitmap images, ";" for movies, and "<" for sounds (originally I, M, and S were suggested, but they were informally in use in other ways; the only thing magic about ":", ";", and "<", is that they are the first characters after '9') Note that there is NO default format for Pictures, Movies and Sounds; the specific format of the image, movie, or sound must be gleaned from the +VIEWS information for the item (eg. Gif, PICT, TIFF, etc.). Appendix I Required attributes and suggested attributes. A1.0 The +INFO attribute block The +INFO atttribute block is sent whenever an item's attributes are requested. It is required that the Attribute Information list for an item must contain a one-line +INFO attribute, and the +INFO attribute must contain the gopher+ descriptor for the item. +INFO: 1Nice stuffF/selectorFhostFportF+ A2.0 The +ADMIN attribute A Gopher+ server is required to have an +ADMIN block for every item and the +ADMIN block must contain Admin and a Mod-Date lines: +ADMIN: Admin: [comments] Mod-Date: [comments] In addition to the required lines, we recommend that the +ADMIN attribute of items returned by a full-text search engine contain a SCORE attribute. The SCORE attribute should contain the relevance ranking (an integer) of the item. Score: relevance-ranking We recommend that the +ADMIN attribute of a full-text search engine contain a Score-Range attribute. This attribute is used to specify the range of values taken on by the relevance ranking scores of items returned by the search engine. The Score-Range makes it possible to normalize scores from different search engine technologies. The first number is the lower bound, the second number is the upper bound. Score-range: lower-bound upper-bound We also recommend that the +ADMIN attribute for the root of the server (i.e. what you get back when you ask for the attributes of the item with the empty selector string) also contain these fields: Site: the name of the site Org: organization or group owning the site Loc: city, state, country Geog: latitude longitude TZ: timezone as gmt-offset Other useful attributes might include: Provider: who provided this item Author: who wrote this item Creation-Date: when it was born Expiration-Date: when it expires A3.0 The +VIEWS attribute The +VIEWS attribute is used to specify alternative representations of an item. The form of the +VIEWS attribute is: +VIEWS: [gopher descriptor] Content-Type[ viewLanguage]: [<56K>] Content-Type[ viewLanguage]: [<93K>] Content-Type[ viewLanguage]: [<77K>] Some values for Content-Type are Text/plain, application/Postscript, image/Gif, image/jpeg, Content Types are defined by the Internet Assigned Numbers Authority (IANA). To register a new content type send e-mail to IANA@isi.edu. For a comprehensive list, consult the most up-to-date MIME Request for Comments (RFC). A list of currently defined views may be retrieved by anonymous ftp from isi.edu in the directory /pub/in-notes/MIME/mime-types All gopher servers must support the Text/plain view for readable documents and the application/gopher- menu view (the basic Gopher+ directory list) for directories. These are the views that must be returned by default. If all a server supports is the default views, then it may omit the +VIEWS attribute block (although we suggest that it not do so). The viewLanguage is defined as a concatanation of two ISO standard values, the ISO 639 language code and the ISO-3166 country code. Some values for viewLanguage are: En_US, De_DE, Es_ES, Se_SE A4.0 The +ABSTRACT attribute The +ABSTRACT attribute is used to specify a short abstract for the item. The form of the +ABSTRACT attribute is: +ABSTRACT: [gopher reference] A line of text another line of text still another line of text. We recommend that a description of the sorts of information at the site, a postal address, a phone number, and the administrator name for the site be included in the +ABSTRACT attribute for the server root (i.e. what you get when you ask for the attribute list of the server with no selector string). Appendix II Paul's NQBNF (Not Quite BNF) for the Gopher+ Enhancements. Note: This is modified BNF (as used by the Pascal people) with a few English modifiers thrown in. Stuff enclosed in '{}' can be repeated zero or more times. Stuff in '[]' denotes a set of items. The '- ' operator denotes set subtraction. This section is not quite solid yet. Please send us information on any errors you might notice. Directory Entity CR-LF ::= Carriage Return Character followed by Line Feed character. Tab ::= ASCII Tab character NUL ::= ASCII NUL character PLUS ::= ASCII '+' character LEFT ::= ASCII '<' character RIGHT ::= ASCII '>' character OCTET ::= $00 -> $ff UNASCII ::= OCTET - [Tab CR-LF NUL] UNASCIINOPLUS ::= UNASCII - [PLUS] UNASCIINOANGLE ::= UNASCII - [LEFT, RIGHT] Lastline ::= '.'CR-LF TextBlock ::= Block of ASCII text not containing Lastline pattern. Type ::= UNASCII DisplayString ::= {UNASCII} Selector ::= {UNASCII} Otherflds ::= {UNASCII + TAB} Host ::= {{UNASCII - ['.']} '.'} {UNASCII - ['.']} Note: This is a Fully Qualified Domain Name as defined in RFC 830. (e.g. gopher.micro.umn.edu) Hosts that have a CR-LF TAB or NUL in their name get what they deserve. Digit ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' DigitSeq ::= digit {digit}. Port ::= DigitSeq. Note: Port corresponds the the TCP Port Number, its value should be in the range [0..65535]; port 70 is officially assigned to gopher. Bool ::= '0' | '1' G+Field ::= '+' | '?' Success ::= '+' | '-'. Transfer ::= DigitSeq | '-1' | '-2' DataHead ::= Success Transfer CR-LF DataBlock ::= DataHead {OCTET} G1DirEntity ::= Type DisplayString Tab Selector Tab Host Tab Port Tab Otherflds CR-LF G+DirEntity ::= Type DisplayString Tab Selector Tab Host Tab Port Tab G+Field CR-LF Notes: It is *highly* recommended that the DisplayString field contain only printable characters, since many different clients will be using it. However if eight bit characters are used, the characters should conform with the ISO-Latin1 Character Set. The length of the User displayable line should be less than 70 Characters; longer lines may not fit across some screens. Warning! The Selector string can be longer than 255 characters. Menu Entity Menu ::= DataHead {G+DirEntity}. Continues ::= Bool Representation ::= 'Text' | 'List' | 'Postscript' | 'MacWriteII' | 'RTF' |{UNASCII} Retrieving a document/menu/etc.: C: Opens Connection S: Accepts Connection C: Sends Selector String Tab '+' Representation [Tab DataFlag] C: [Optional] Client sends a DataBlock depending on value of DataFlag. S: Sends DataBlock Connection is closed by either client or server (typically server). Spaceline ::= ' ' {UNASCII} CR-LF Blockname ::= '+' {UNASCIINOPLUS} Attrblock ::= Blockname ' ' [G+Direntry] CR-LF {Spaceline} Attrval ::= SPACE {UNASCII} CR-LF E-Mail ::= {UNASCII} s.t. it conforms to RFC 822 Adminval ::= ' Admin:' {UNASCII} '<' E-Mailaddr '>' CR-LF Dateval ::= ' Mod-Date:' {UNASCII} '<' YYYYMMDDhhmmss '>' CR-LF AdminReq ::= AdminVal Dateval Infoblock ::= '+INFO: ' G+Direntry CR-LF AdminBlock ::= '+ADMIN: ' {G+Direntry} CR-LF AdminReq {Attrval} Language ::= 'English' | 'French' | 'German' | {UNASCII} ViewVal ::= ' ' Representation [' ' Language] ":" ASCIINOANGLE '<' Size 'k>' CR-LF ViewBlock ::= '+VIEWS: ' {G+Direntry} CR-LF {ViewVal} AttrBlocks ::= InfoBlock ViewBlock {AttrBlock} Retrieving item Information. For non-index server (non-type 7 items) C: Opens Connection S: Accepts Connection C: Sends Selector String Tab '!' {BlockName}CR-LF S: Sends DataBlock with data in AttrrBlocks format. Connection is closed by either client or server (typically server). For index server (type 7 items) the client asks the search engine to so a search for nothing (i.e. the client does not provide any words to search for) and appends a TAB and a "!" after the null- search: C: Opens Connection S: Accepts Connection C: Sends Selector String Tab Tab '!' {BlockName}CR-LF S: Sends DataBlock with data in AttrrBlocks format. Connection is closed by either client or server (typically server). Attributes ::= {AttrBlocks} Retrieving all Item Information entries for a directory. C: Opens Connection S: Accepts Connection C: Sends Selector String Tab '$'{BlockName} CR-LF S: Sends DataBlock with data in Attributes format. Connection is closed by either client or server (typically server). pygopherd-2.0.18.3+nmu4ubuntu1/doc/standards/url.txt0000664000000000000000000001571410762620505017145 0ustar John Goerzen on Tue, 12 Feb 2002 14:19:47 -0500 (EST) [[1]Date Prev] [[2]Date Next] [[3]Thread Prev] [[4]Thread Next] [[5]Date Index] [[6]Thread Index] [gopher] Links to URL * To: [7]gopher AT complete SEP org * Subject: [gopher] Links to URL * From: John Goerzen <[8]jgoerzen AT complete SEP org> * Date: 12 Feb 2002 14:19:46 -0500 * In-reply-to: <[9]200202120132.RAA11190@stockholm.ptloma.edu> * List-archive: <[10]http://www.complete.org/mailinglists/archives/> * List-help: <[11]mailto:listar@complete.org?Subject=help> * List-owner: <[12]mailto:jgoerzen@complete.org> * List-post: <[13]mailto:gopher@complete.org> * List-software: Listar version 1.0.0 * List-subscribe: <[14]mailto:gopher-request@complete.org?Subject=subscribe> * List-unsubscribe: <[15]mailto:gopher-request@complete.org?Subject=unsubscribe> * References: <[16]200202120132.RAA11190@stockholm.ptloma.edu> * Reply-to: [17]gopher AT complete SEP org * Sender: [18]gopher-bounce AT complete SEP org * User-agent: Gnus/5.0808 (Gnus v5.8.8) XEmacs/21.4 (Common Lisp) _________________________________________________________________ I think it is best to start small with modifications to the protocol. Therefore, I propose the following: Method to link to URLs from Gopherspace --------------------------------------- 1. Protocol issues Links to URLs from a gopher directory shall be defined as follows: Type -- the appropriate character corresponding to the type of the document on the remote end; h if HTML. Path -- the full URL, preceeded by "URL:". For instance: URL:[19]http://www.complete.org/ Host, Port -- pointing back to the gopher server that provided the directory for compatibility reasons. Name -- as usual for a Gopher directory entry. 2. Conforming client requirements A client adhering to this specification will, when it sees a Gopher selector with a path starting with URL:, interpret the path as a URL. It will ignore the host and port components of the Gopher selector, using those components from the URL instead (if applicable). 3. Conforming server requirements A server with Gopher URL support will not, in most cases, need to take extra steps to provide this support beyond those outlined in Compatibility below. Servers not implementing those steps outlined in Compatibility will be deemed to be not in compliance. 4. Authoring compliance The use of URL: selectors should be avoided wherever possible. In particular, it should be avoided when pre-existing gopher facilities exist for the type of content linked. The following URL types are explicitly prohibited by this specification: gopher telnet tn3270 Authors should avoid links to any document not of HTML type whenever possible. Linking to non-HTML documents will break compatibility with Gopher browsers that do not implement this specification. The ranks of these browsers include most Web browsers, so that is a significant audience. 5. Compatibility Links to HTML pages may be accomodated even for non-comforming browsers by providing additional capabilities in the server. When a non-conforming browser is instructed to follow a link to a URL, it will contact the Gopher server that provided the menu (since these are specified per section 1). When a conforming Gopher server receives a request whose path begins with URL:, it will write out a HTML document that will send the non-compliant browser to the appropriate place. One such conforming document is: You are following a link from gopher to a web site. You will be automatically taken to the web site shortly. If you do not get sent there, please click here to go to the web site.

The URL linked is:

[23]http://www.acm.org/classics/< /A>

Thanks for using gopher! This document may be any desired by the server authors, but must adhere to these requirements: * It must provide a refresh of a duration of 10 seconds or less * It must not use IMG tags, frames, or have any reference whatsoever to content outside that particular file -- other than the link to the real destination. * It must not use JavaScript. * It must adhere to the W3C HTML 3.2 standard. When a non-conforming Gopher client finds a reference to a HTML file (type h), it will open up the file via Gopher (getting the redirect document) but using a web browser. The web browser will then be redirected to the actual link destination. Conforming clients will follow the link directly. END Comments? _________________________________________________________________ * References: + [24][gopher] Re: Gopher wishlist o From: Cameron Kaiser * Prev by Date: [25][gopher] Re: UMN Gopher on Mac OSX * Next by Date: [26][gopher] Re: Gopher wishlist * Previous by thread: [27][gopher] Re: Gopher wishlist * Next by thread: [28][gopher] Bug * Index(es): + [29]Date + [30]Thread References 1. http://www.complete.org/mailinglists/archives/gopher-200202/msg00032.html 2. http://www.complete.org/mailinglists/archives/gopher-200202/msg00034.html 3. http://www.complete.org/mailinglists/archives/gopher-200202/msg00076.html 4. http://www.complete.org/mailinglists/archives/gopher-200202/msg00021.html 5. http://www.complete.org/mailinglists/archives/gopher-200202/maillist.html#00033 6. http://www.complete.org/mailinglists/archives/gopher-200202/threads.html#00033 7. mailto:gopher@DOMAIN.HIDDEN 8. mailto:jgoerzen@DOMAIN.HIDDEN 9. http://www.complete.org/mailinglists/archives/gopher-200202/msg00026.html 10. http://www.complete.org/mailinglists/archives/ 11. mailto:listar@complete.org?Subject=help 12. mailto:jgoerzen@complete.org 13. mailto:gopher@complete.org 14. mailto:gopher-request@complete.org?Subject=subscribe 15. mailto:gopher-request@complete.org?Subject=unsubscribe 16. http://www.complete.org/mailinglists/archives/gopher-200202/msg00026.html 17. mailto:gopher@DOMAIN.HIDDEN 18. mailto:gopher-bounce@DOMAIN.HIDDEN 19. http://www.complete.org/ 20. http://www.acm.org/classics/" 21. http://www.acm.org/classics/" 22. http://www.acm.org/classics/" 23. http://www.acm.org/classics/ 24. http://www.complete.org/mailinglists/archives/gopher-200202/msg00026.html 25. http://www.complete.org/mailinglists/archives/gopher-200202/msg00032.html 26. http://www.complete.org/mailinglists/archives/gopher-200202/msg00034.html 27. http://www.complete.org/mailinglists/archives/gopher-200202/msg00076.html 28. http://www.complete.org/mailinglists/archives/gopher-200202/msg00021.html 29. http://www.complete.org/mailinglists/archives/gopher-200202/maillist.html#00033 30. http://www.complete.org/mailinglists/archives/gopher-200202/threads.html#00033 pygopherd-2.0.18.3+nmu4ubuntu1/doc/standards/gophermap.txt0000664000000000000000000000611110762620505020314 0ustar Serving files and the gophermap file ------------------------------------ The gophermap file is responsible for the look of a gopher menu. Unlike the UMN gopherd-style map files, which are somewhat cumbersome and can get rather large, Bucktooth encourages a slimline approach, or you can have none at all. This is not too secure since it will happily serve any and every file in its mountpoint to a greedy user, but if that's really what you want, congratulations. You can stop reading this now, since that's exactly what it will do when you install it with no gophermap files. Only gophermap, ., and .. are not served to the user. Assuming you want to do a little more customisation than that, you can edit the gophermap file (one per directory) with any text editor and follow a few simple rules to gopher goodness. (A sample file is in stuff/ for your enjoyment.) Bucktooth sends any RFC-1436 compliant line to the client. In other words, 1gopher.ptloma.edu homegopher.ptloma.edu70 where , is of course, the tab (CTRL-I, 0x09) character, generates a link to "null" selector on gopher.ptloma.edu 70 with an itemtype of 1 and a display string of "gopher.ptloma.edu home". You don't even have to enter valid selectors, although this will not endear you much to your users. If you are not well-versed in RFC-1436, it breaks down to the first character being the itemtype (0 = text, 1 = gopher menu, 5 = zip file, 9 = generic binary, 7 = search server, I = generic image, g = gif image; others are also supported by some clients), then the string shown by the client up to the first tab ("display string"); then the full path to the resource ("selector"); the hostname of the server; and the port. Since this would be a drag to always have to type things out in full, Bucktooth allows the following shortcuts: * If you don't specify a port, Bucktooth provides the one your server is using (almost always 70). * If you don't specify a host, Bucktooth provides your server's hostname. * If you only specify a relative selector and not an absolute path, Bucktooth sticks on the path they're browsing. So, if your server is gopher.somenetwork.com and your server's port is 7070, and this gophermap is inside of /lotsa, then 1Lots of stuffstuff is expanded out to 1Lots of stuff/lotsa/stuffgopher.somenetwork.com7070 If you don't specify a selector, two things can happen. Putting a at the end, like 1src explicitly tells Bucktooth you aren't specifying a selector, so Bucktooth uses your display string as the selector, adds on the host and port, and gives the client that. Otherwise, Bucktooth sees it as a description, and has the client display it as text. This allows you to add text descriptions to your menus. However, don't use the character anywhere in your text description or Bucktooth will try to interpret it as an RFC-1436 resource, which will yield possibly hilarious and definitely erroneous results. One last warning: keep display strings at 67 characters or less -- some clients may abnormally wrap them or display them in a way you didn't intend. . pygopherd-2.0.18.3+nmu4ubuntu1/doc/pygopherd.ps0000664000000000000000000103262010762620505016160 0ustar %!PS-Adobe-2.0 %%Creator: dvips(k) 5.92b Copyright 2002 Radical Eye Software %%Title: book.dvi %%Pages: 23 %%PageOrder: Ascend %%BoundingBox: 0 0 612 792 %%DocumentFonts: Times-Bold Times-Roman Times-Italic Courier %%+ Courier-Bold Courier-Oblique %%EndComments %DVIPSWebPage: (www.radicaleye.com) %DVIPSCommandLine: dvips book -o %DVIPSParameters: dpi=600, compressed %DVIPSSource: TeX output 2003.08.25:1935 %%BeginProcSet: texc.pro %! /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin /FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array /BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get }B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr 1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3 1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{ rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B /chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{ /cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{ A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse} ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17 {2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{ 1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop} forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put }if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X 1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N /p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ /Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) (LaserWriter 16/600)]{A length product length le{A length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end %%EndProcSet %%BeginProcSet: 8r.enc % File 8r.enc as of 2002-03-12 for PSNFSS 9 % % This is the encoding vector for Type1 and TrueType fonts to be used % with TeX. This file is part of the PSNFSS bundle, version 9 % % Authors: S. Rahtz, P. MacKay, Alan Jeffrey, B. Horn, K. Berry, W. Schmidt % % Idea is to have all the characters normally included in Type 1 fonts % available for typesetting. This is effectively the characters in Adobe % Standard Encoding + ISO Latin 1 + extra characters from Lucida + Euro. % % Character code assignments were made as follows: % % (1) the Windows ANSI characters are almost all in their Windows ANSI % positions, because some Windows users cannot easily reencode the % fonts, and it makes no difference on other systems. The only Windows % ANSI characters not available are those that make no sense for % typesetting -- rubout (127 decimal), nobreakspace (160), softhyphen % (173). quotesingle and grave are moved just because it's such an % irritation not having them in TeX positions. % % (2) Remaining characters are assigned arbitrarily to the lower part % of the range, avoiding 0, 10 and 13 in case we meet dumb software. % % (3) Y&Y Lucida Bright includes some extra text characters; in the % hopes that other PostScript fonts, perhaps created for public % consumption, will include them, they are included starting at 0x12. % % (4) Remaining positions left undefined are for use in (hopefully) % upward-compatible revisions, if someday more characters are generally % available. % % (5) hyphen appears twice for compatibility with both ASCII and Windows. % % (6) /Euro is assigned to 128, as in Windows ANSI % /TeXBase1Encoding [ % 0x00 (encoded characters from Adobe Standard not in Windows 3.1) /.notdef /dotaccent /fi /fl /fraction /hungarumlaut /Lslash /lslash /ogonek /ring /.notdef /breve /minus /.notdef % These are the only two remaining unencoded characters, so may as % well include them. /Zcaron /zcaron % 0x10 /caron /dotlessi % (unusual TeX characters available in, e.g., Lucida Bright) /dotlessj /ff /ffi /ffl /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef % very contentious; it's so painful not having quoteleft and quoteright % at 96 and 145 that we move the things normally found there down to here. /grave /quotesingle % 0x20 (ASCII begins) /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright /parenleft /parenright /asterisk /plus /comma /hyphen /period /slash % 0x30 /zero /one /two /three /four /five /six /seven /eight /nine /colon /semicolon /less /equal /greater /question % 0x40 /at /A /B /C /D /E /F /G /H /I /J /K /L /M /N /O % 0x50 /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore % 0x60 /quoteleft /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o % 0x70 /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar /braceright /asciitilde /.notdef % rubout; ASCII ends % 0x80 /Euro /.notdef /quotesinglbase /florin /quotedblbase /ellipsis /dagger /daggerdbl /circumflex /perthousand /Scaron /guilsinglleft /OE /.notdef /.notdef /.notdef % 0x90 /.notdef /.notdef /.notdef /quotedblleft /quotedblright /bullet /endash /emdash /tilde /trademark /scaron /guilsinglright /oe /.notdef /.notdef /Ydieresis % 0xA0 /.notdef % nobreakspace /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen % Y&Y (also at 45); Windows' softhyphen /registered /macron % 0xD0 /degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown % 0xC0 /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis % 0xD0 /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls % 0xE0 /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis % 0xF0 /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis ] def %%EndProcSet %%BeginProcSet: texps.pro %! TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0 ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{ pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type /nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[ exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if} forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def end %%EndProcSet %%BeginProcSet: special.pro %! TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N /vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N /rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N /@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{ /hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B /@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{ /urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known {userdict/md get type/dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup length 20 add dict copy def}if end md begin /letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{ itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack} if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{ noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{ Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale }if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState save N userdict maxlength dict begin/magscale true def normalscale currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts /psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR/showpage{}N/erasepage{}N/setpagedevice{pop}N/copypage{}N/p 3 def @MacSetUp}N/doclip{psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath moveto}N/endTexFig{end psf$SavedState restore}N /@beginspecial{SDict begin/SpecialSave save N gsave normalscale currentpoint TR @SpecialDefaults count/ocount X/dcount countdictstack N} N/@setspecial{CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury lineto closepath clip}if/showpage{}N/erasepage{}N /setpagedevice{pop}N/copypage{}N newpath}N/@endspecial{count ocount sub{ pop}repeat countdictstack dcount sub{end}repeat grestore SpecialSave restore end}N/@defspecial{SDict begin}N/@fedspecial{end}B/li{lineto}B /rl{rlineto}B/rc{rcurveto}B/np{/SaveX currentpoint/SaveY X N 1 setlinecap newpath}N/st{stroke SaveX SaveY moveto}N/fil{fill SaveX SaveY moveto}N/ellipse{/endangle X/startangle X/yrad X/xrad X/savematrix matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end %%EndProcSet %%BeginProcSet: color.pro %! TeXDict begin/setcmykcolor where{pop}{/setcmykcolor{dup 10 eq{pop setrgbcolor}{1 sub 4 1 roll 3{3 index add neg dup 0 lt{pop 0}if 3 1 roll }repeat setrgbcolor pop}ifelse}B}ifelse/TeXcolorcmyk{setcmykcolor}def /TeXcolorrgb{setrgbcolor}def/TeXcolorgrey{setgray}def/TeXcolorgray{ setgray}def/TeXcolorhsb{sethsbcolor}def/currentcmykcolor where{pop}{ /currentcmykcolor{currentrgbcolor 10}B}ifelse/DC{exch dup userdict exch known{pop pop}{X}ifelse}B/GreenYellow{0.15 0 0.69 0 setcmykcolor}DC /Yellow{0 0 1 0 setcmykcolor}DC/Goldenrod{0 0.10 0.84 0 setcmykcolor}DC /Dandelion{0 0.29 0.84 0 setcmykcolor}DC/Apricot{0 0.32 0.52 0 setcmykcolor}DC/Peach{0 0.50 0.70 0 setcmykcolor}DC/Melon{0 0.46 0.50 0 setcmykcolor}DC/YellowOrange{0 0.42 1 0 setcmykcolor}DC/Orange{0 0.61 0.87 0 setcmykcolor}DC/BurntOrange{0 0.51 1 0 setcmykcolor}DC /Bittersweet{0 0.75 1 0.24 setcmykcolor}DC/RedOrange{0 0.77 0.87 0 setcmykcolor}DC/Mahogany{0 0.85 0.87 0.35 setcmykcolor}DC/Maroon{0 0.87 0.68 0.32 setcmykcolor}DC/BrickRed{0 0.89 0.94 0.28 setcmykcolor}DC/Red{ 0 1 1 0 setcmykcolor}DC/OrangeRed{0 1 0.50 0 setcmykcolor}DC/RubineRed{ 0 1 0.13 0 setcmykcolor}DC/WildStrawberry{0 0.96 0.39 0 setcmykcolor}DC /Salmon{0 0.53 0.38 0 setcmykcolor}DC/CarnationPink{0 0.63 0 0 setcmykcolor}DC/Magenta{0 1 0 0 setcmykcolor}DC/VioletRed{0 0.81 0 0 setcmykcolor}DC/Rhodamine{0 0.82 0 0 setcmykcolor}DC/Mulberry{0.34 0.90 0 0.02 setcmykcolor}DC/RedViolet{0.07 0.90 0 0.34 setcmykcolor}DC /Fuchsia{0.47 0.91 0 0.08 setcmykcolor}DC/Lavender{0 0.48 0 0 setcmykcolor}DC/Thistle{0.12 0.59 0 0 setcmykcolor}DC/Orchid{0.32 0.64 0 0 setcmykcolor}DC/DarkOrchid{0.40 0.80 0.20 0 setcmykcolor}DC/Purple{ 0.45 0.86 0 0 setcmykcolor}DC/Plum{0.50 1 0 0 setcmykcolor}DC/Violet{ 0.79 0.88 0 0 setcmykcolor}DC/RoyalPurple{0.75 0.90 0 0 setcmykcolor}DC /BlueViolet{0.86 0.91 0 0.04 setcmykcolor}DC/Periwinkle{0.57 0.55 0 0 setcmykcolor}DC/CadetBlue{0.62 0.57 0.23 0 setcmykcolor}DC /CornflowerBlue{0.65 0.13 0 0 setcmykcolor}DC/MidnightBlue{0.98 0.13 0 0.43 setcmykcolor}DC/NavyBlue{0.94 0.54 0 0 setcmykcolor}DC/RoyalBlue{1 0.50 0 0 setcmykcolor}DC/Blue{1 1 0 0 setcmykcolor}DC/Cerulean{0.94 0.11 0 0 setcmykcolor}DC/Cyan{1 0 0 0 setcmykcolor}DC/ProcessBlue{0.96 0 0 0 setcmykcolor}DC/SkyBlue{0.62 0 0.12 0 setcmykcolor}DC/Turquoise{0.85 0 0.20 0 setcmykcolor}DC/TealBlue{0.86 0 0.34 0.02 setcmykcolor}DC /Aquamarine{0.82 0 0.30 0 setcmykcolor}DC/BlueGreen{0.85 0 0.33 0 setcmykcolor}DC/Emerald{1 0 0.50 0 setcmykcolor}DC/JungleGreen{0.99 0 0.52 0 setcmykcolor}DC/SeaGreen{0.69 0 0.50 0 setcmykcolor}DC/Green{1 0 1 0 setcmykcolor}DC/ForestGreen{0.91 0 0.88 0.12 setcmykcolor}DC /PineGreen{0.92 0 0.59 0.25 setcmykcolor}DC/LimeGreen{0.50 0 1 0 setcmykcolor}DC/YellowGreen{0.44 0 0.74 0 setcmykcolor}DC/SpringGreen{ 0.26 0 0.76 0 setcmykcolor}DC/OliveGreen{0.64 0 0.95 0.40 setcmykcolor} DC/RawSienna{0 0.72 1 0.45 setcmykcolor}DC/Sepia{0 0.83 1 0.70 setcmykcolor}DC/Brown{0 0.81 1 0.60 setcmykcolor}DC/Tan{0.14 0.42 0.56 0 setcmykcolor}DC/Gray{0 0 0 0.50 setcmykcolor}DC/Black{0 0 0 1 setcmykcolor}DC/White{0 0 0 0 setcmykcolor}DC end %%EndProcSet TeXDict begin @defspecial /DvipsToPDF { 72.27 mul Resolution div } def /PDFToDvips { 72.27 div Resolution mul } def /HyperBorder { 1 PDFToDvips } def /H.V {pdf@hoff pdf@voff null} def /H.B {/Rect[pdf@llx pdf@lly pdf@urx pdf@ury]} def /H.S { currentpoint HyperBorder add /pdf@lly exch def dup DvipsToPDF /pdf@hoff exch def HyperBorder sub /pdf@llx exch def } def /H.L { 2 sub dup /HyperBasePt exch def PDFToDvips /HyperBaseDvips exch def currentpoint HyperBaseDvips sub /pdf@ury exch def /pdf@urx exch def } def /H.A { H.L currentpoint exch pop vsize 72 sub exch DvipsToPDF HyperBasePt sub sub /pdf@voff exch def } def /H.R { currentpoint HyperBorder sub /pdf@ury exch def HyperBorder add /pdf@urx exch def currentpoint exch pop vsize 72 sub exch DvipsToPDF sub /pdf@voff exch def } def systemdict /pdfmark known not {userdict /pdfmark systemdict /cleartomark get put} if @fedspecial end TeXDict begin 40258431 52099146 1000 600 600 (book.dvi) @start /Fa 134[50 6[50 1[50 50 6[50 2[50 50 19[50 8[50 71[{ TeXBase1Encoding ReEncodeFont }9 83.022 /Courier rf /Fb 133[33 5[21 29 25 1[37 37 1[58 21 2[21 37 37 1[33 1[33 34[69 5[21 6[37 37 37 37 21 19 46[{ TeXBase1Encoding ReEncodeFont } 21 74.7198 /Times-Roman rf /Fc 206[25 49[{ TeXBase1Encoding ReEncodeFont }1 49.8132 /Times-Roman rf /Fd 134[60 2[60 66 40 47 53 1[66 60 66 100 33 66 1[33 66 60 40 53 66 53 66 60 12[80 66 1[93 1[93 86 1[80 2[47 93 2[80 86 86 80 86 65[{ TeXBase1Encoding ReEncodeFont }34 119.552 /Times-Bold rf /Fe 134[50 50 2[50 50 50 50 1[50 50 50 50 50 2[50 50 50 50 50 1[50 1[50 12[50 50 50 1[50 50 50 4[50 3[50 50 50 67[{ TeXBase1Encoding ReEncodeFont }28 83.022 /Courier-Oblique rf /Ff 133[45 45 45 1[45 45 45 45 45 1[45 45 45 5[45 45 45 45 45 45 1[45 46[45 3[45 45 45[{ TeXBase1Encoding ReEncodeFont }21 74.7198 /Courier-Bold rf /Fg 133[45 45 45 45 45 45 45 45 45 1[45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 45 8[45 2[45 45 45 45 1[45 1[45 45 45 1[45 45 45 45 45 2[45 45 45 45 2[45 2[45 45 1[45 1[45 1[45 45 45 45 45 45 45 45 45 1[45 45 40[{ TeXBase1Encoding ReEncodeFont }59 74.7198 /Courier rf /Fh 106[21 149[{ TeXBase1Encoding ReEncodeFont }1 59.7758 /Times-Roman rf /Fi 106[23 149[{ TeXBase1Encoding ReEncodeFont }1 66.4176 /Times-Roman rf /Fj 134[72 72 104 72 80 48 56 64 1[80 72 80 120 40 80 1[40 80 72 1[64 80 64 80 72 6[96 104 1[143 104 104 96 80 104 1[88 112 104 135 96 2[56 112 112 88 96 104 104 96 104 18[36 48 42[80 2[{ TeXBase1Encoding ReEncodeFont }47 143.462 /Times-Bold rf /Fk 134[37 3[42 23 32 32 1[42 42 42 60 23 37 1[23 42 42 1[37 42 37 1[42 12[46 3[51 2[69 46 2[28 60 60 3[55 9[42 42 42 42 42 42 42 42 42 42 1[21 46[{ TeXBase1Encoding ReEncodeFont }37 83.022 /Times-Italic rf /Fl 134[86 3[96 57 67 76 1[96 86 96 143 48 96 1[48 96 86 57 76 96 76 96 86 12[115 96 1[134 105 6[67 134 134 3[124 12[86 86 86 86 86 86 2[43 43[96 2[{ TeXBase1Encoding ReEncodeFont }36 172.154 /Times-Bold rf /Fm 104[83 26[17 1[37 42 42 60 42 42 23 32 28 42 42 42 42 65 23 42 23 23 42 42 28 37 42 37 42 37 1[42 1[28 23 28 51 60 60 78 60 60 51 46 55 60 46 60 60 74 51 1[32 28 60 60 46 51 60 55 55 60 1[37 47 47 47 23 23 42 42 42 42 42 42 42 42 42 42 23 21 28 21 47 42 28 28 28 1[69 42 42 34 28 29[46 46 2[{ TeXBase1Encoding ReEncodeFont }89 83.022 /Times-Roman rf /Fn 134[42 3[46 28 32 37 1[46 42 46 69 23 46 1[23 46 42 1[37 46 37 46 42 7[60 4[55 46 1[65 51 65 60 78 3[32 65 65 3[60 1[60 3[47 5[42 42 42 42 42 42 42 1[23 21 28 42[46 2[{ TeXBase1Encoding ReEncodeFont }44 83.022 /Times-Bold rf /Fo 134[103 3[115 2[92 1[115 103 115 1[57 3[115 103 1[92 115 2[103 16[126 2[195 3[80 1[161 24[52 46[{ TeXBase1Encoding ReEncodeFont }17 206.584 /Times-Bold rf end %%EndProlog %%BeginSetup %%Feature: *Resolution 600dpi TeXDict begin end %%EndSetup %%Page: 1 1 TeXDict begin 1 0 bop -600 -600 a SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end -600 -600 a -600 -600 a SDict begin [ /Title () /Subject () /Creator (LaTeX with hyperref package) /Author () /Producer (sgml2x converter) /Keywords () /DOCINFO pdfmark end -600 -600 a Black 0 TeXcolorgray -2 -102 a SDict begin H.S end -2 -102 a 0 TeXcolorgray 0 TeXcolorgray -2 -102 a SDict begin H.R end -2 -102 a -2 -102 a SDict begin [ /View [/XYZ H.V] /Dest (page.1) cvn H.B /DEST pdfmark end -2 -102 a Black Black -2 -11 a SDict begin [ /Page 1 /View [ /FitH ] /PageMode /UseOutlines /DOCVIEW pdfmark end -2 -11 a -2 -11 a SDict begin [ {Catalog} << /ViewerPreferences << >> >> /PUT pdfmark end -2 -11 a -2 -11 a SDict begin H.S end -2 -11 a -2 -11 a SDict begin 12 H.A end -2 -11 a -2 -11 a SDict begin [ /View [/XYZ H.V] /Dest (Doc-Start) cvn H.B /DEST pdfmark end -2 -11 a -2 -11 a SDict begin H.S end -2 -11 a -2 -11 a SDict begin 12 H.A end -2 -11 a -2 -11 a SDict begin [ /View [/XYZ H.V] /Dest (PYGOPHERD) cvn H.B /DEST pdfmark end -2 -11 a 1060 132 a Fo(PyGopherd)51 b(Manual)p Black Black eop end %%Page: 2 2 TeXDict begin 2 1 bop -600 -600 a SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end -600 -600 a Black 0 TeXcolorgray -2 -102 a SDict begin H.S end -2 -102 a 0 TeXcolorgray 0 TeXcolorgray -2 -102 a SDict begin H.R end -2 -102 a -2 -102 a SDict begin [ /View [/XYZ H.V] /Dest (page.2) cvn H.B /DEST pdfmark end -2 -102 a Black Black 174 x Fn(PyGopherd)19 b(Manual)-2 180 y Fm($Re)n(v$)g(Edition)-2 288 y(Published)g($Date$)p Black Black eop end %%Page: 3 3 TeXDict begin 3 2 bop -600 -600 a SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end -600 -600 a Black 0 TeXcolorgray -2 -102 a SDict begin H.S end -2 -102 a 0 TeXcolorgray 0 TeXcolorgray -2 -102 a SDict begin H.R end -2 -102 a -2 -102 a SDict begin [ /View [/XYZ H.V] /Dest (page.3) cvn H.B /DEST pdfmark end -2 -102 a Black Black 210 x Fl(T)-16 b(able)43 b(of)g(Contents)p 0 TeXcolorgray -2 302 a SDict begin H.S end -2 302 a Fn(1.)20 b(Intr)o(oduction)f(to)h(PyGopherd)1054 302 y SDict begin 13 H.L end 1054 302 a 1054 302 a SDict begin [ /Subtype /Link /Dest (PYGOPHERD.INTRO) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 1054 302 a Black Black 2 w Fn(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black 0 TeXcolorgray 3842 302 a SDict begin H.S end 3842 302 a Fn(1)3884 302 y SDict begin 13 H.L end 3884 302 a 3884 302 a SDict begin [ /Subtype /Link /Dest (PYGOPHERD.INTRO) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 302 a Black 0 TeXcolorgray 197 430 a SDict begin H.S end 197 430 a Fm(Features)479 430 y SDict begin 13 H.L end 479 430 a 479 430 a SDict begin [ /Subtype /Link /Dest (FEATURES) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 479 430 a Black Black 17 w Fm(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black 0 TeXcolorgray 3842 430 a SDict begin H.S end 3842 430 a Fm(1)3884 430 y SDict begin 13 H.L end 3884 430 a 3884 430 a SDict begin [ /Subtype /Link /Dest (FEATURES) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 430 a Black 0 TeXcolorgray 197 538 a SDict begin H.S end 197 538 a Fm(About)f(Gopher)676 538 y SDict begin 13 H.L end 676 538 a 676 538 a SDict begin [ /Subtype /Link /Dest (ABOUTGOPHER) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 676 538 a Black Black 7 w Fm(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black 0 TeXcolorgray 3842 538 a SDict begin H.S end 3842 538 a Fm(2)3884 538 y SDict begin 13 H.L end 3884 538 a 3884 538 a SDict begin [ /Subtype /Link /Dest (ABOUTGOPHER) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 538 a Black 0 TeXcolorgray -2 666 a SDict begin H.S end -2 666 a Fn(2.)h(Quick)g(Start)499 666 y SDict begin 13 H.L end 499 666 a 499 666 a SDict begin [ /Subtype /Link /Dest (QUICKSTART) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 499 666 a Black Black 18 w Fn(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black 0 TeXcolorgray 3842 666 a SDict begin H.S end 3842 666 a Fn(3)3884 666 y SDict begin 13 H.L end 3884 666 a 3884 666 a SDict begin [ /Subtype /Link /Dest (QUICKSTART) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 666 a Black 0 TeXcolorgray -2 794 a SDict begin H.S end -2 794 a Fn(3.)g(Installation)488 794 y SDict begin 13 H.L end 488 794 a 488 794 a SDict begin [ /Subtype /Link /Dest (INSTALLATION) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 488 794 a Black Black 8 w Fn(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black 0 TeXcolorgray 3842 794 a SDict begin H.S end 3842 794 a Fn(4)3884 794 y SDict begin 13 H.L end 3884 794 a 3884 794 a SDict begin [ /Subtype /Link /Dest (INSTALLATION) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 794 a Black 0 TeXcolorgray 197 921 a SDict begin H.S end 197 921 a Fm(Debian)g(System-W)m(ide)f (Installation)1302 921 y SDict begin 13 H.L end 1302 921 a 1302 921 a SDict begin [ /Subtype /Link /Dest (INSTALLATION.DEBIAN) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 1302 921 a Black Black 3 w Fm(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black 0 TeXcolorgray 3842 921 a SDict begin H.S end 3842 921 a Fm(4)3884 921 y SDict begin 13 H.L end 3884 921 a 3884 921 a SDict begin [ /Subtype /Link /Dest (INSTALLATION.DEBIAN) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 921 a Black 0 TeXcolorgray 197 1029 a SDict begin H.S end 197 1029 a Fm(Other)h(System-W)m(ide)f (Installation)1251 1029 y SDict begin 13 H.L end 1251 1029 a 1251 1029 a SDict begin [ /Subtype /Link /Dest (INSTALLATION.OTHER) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 1251 1029 a Black Black 13 w Fm(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black 0 TeXcolorgray 3842 1029 a SDict begin H.S end 3842 1029 a Fm(4)3884 1029 y SDict begin 13 H.L end 3884 1029 a 3884 1029 a SDict begin [ /Subtype /Link /Dest (INSTALLATION.OTHER) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 1029 a Black 0 TeXcolorgray 197 1137 a SDict begin H.S end 197 1137 a Fm(Single-Account)f(Installation)1114 1137 y SDict begin 13 H.L end 1114 1137 a 1114 1137 a SDict begin [ /Subtype /Link /Dest (INSTALLATION.SINGLE) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 1114 1137 a Black Black 5 w Fm(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black 0 TeXcolorgray 3842 1137 a SDict begin H.S end 3842 1137 a Fm(4)3884 1137 y SDict begin 13 H.L end 3884 1137 a 3884 1137 a SDict begin [ /Subtype /Link /Dest (INSTALLATION.SINGLE) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 1137 a Black 0 TeXcolorgray -2 1265 a SDict begin H.S end -2 1265 a Fn(4.)i(Con\002guration)581 1265 y SDict begin 13 H.L end 581 1265 a 581 1265 a SDict begin [ /Subtype /Link /Dest (CONFIGURATION) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 581 1265 a Black Black 19 w Fn(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black 0 TeXcolorgray 3842 1265 a SDict begin H.S end 3842 1265 a Fn(6)3884 1265 y SDict begin 13 H.L end 3884 1265 a 3884 1265 a SDict begin [ /Subtype /Link /Dest (CONFIGURATION) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 1265 a Black 0 TeXcolorgray -2 1393 a SDict begin H.S end -2 1393 a Fn(5.)g(Handlers)409 1393 y SDict begin 13 H.L end 409 1393 a 409 1393 a SDict begin [ /Subtype /Link /Dest (HANDLERS) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 409 1393 a Black Black 4 w Fn(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black 0 TeXcolorgray 3842 1393 a SDict begin H.S end 3842 1393 a Fn(7)3884 1393 y SDict begin 13 H.L end 3884 1393 a 3884 1393 a SDict begin [ /Subtype /Link /Dest (HANDLERS) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 1393 a Black 0 TeXcolorgray 197 1521 a SDict begin H.S end 197 1521 a Fm(dir)-5 b(.DirHandler)686 1521 y SDict begin 13 H.L end 686 1521 a 686 1521 a SDict begin [ /Subtype /Link /Dest (HANDLERS.DIRHANDLER) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 686 1521 a Black Black 17 w Fm(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black 0 TeXcolorgray 3842 1521 a SDict begin H.S end 3842 1521 a Fm(7)3884 1521 y SDict begin 13 H.L end 3884 1521 a 3884 1521 a SDict begin [ /Subtype /Link /Dest (HANDLERS.DIRHANDLER) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 1521 a Black 0 TeXcolorgray 197 1629 a SDict begin H.S end 197 1629 a Fm(gophermap.BuckGopherm)o(ap)o(Hand)o(ler)1432 1629 y SDict begin 13 H.L end 1432 1629 a 1432 1629 a SDict begin [ /Subtype /Link /Dest (HANDLERS.BUCKGOPHERMAP) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 1432 1629 a Black Black -2 w Fm(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black 0 TeXcolorgray 3842 1629 a SDict begin H.S end 3842 1629 a Fm(7)3884 1629 y SDict begin 13 H.L end 3884 1629 a 3884 1629 a SDict begin [ /Subtype /Link /Dest (HANDLERS.BUCKGOPHERMAP) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 1629 a Black 0 TeXcolorgray 197 1737 a SDict begin H.S end 197 1737 a Fm(\002le.CompressedFileHandler)1134 1737 y SDict begin 13 H.L end 1134 1737 a 1134 1737 a SDict begin [ /Subtype /Link /Dest (HANDLERS.COMPRESSEDFILEHANDLER) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 1134 1737 a Black Black 5 w Fm(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black 0 TeXcolorgray 3842 1737 a SDict begin H.S end 3842 1737 a Fm(8)3884 1737 y SDict begin 13 H.L end 3884 1737 a 3884 1737 a SDict begin [ /Subtype /Link /Dest (HANDLERS.COMPRESSEDFILEHANDLER) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 1737 a Black 0 TeXcolorgray 197 1845 a SDict begin H.S end 197 1845 a Fm(\002le.FileHandler)722 1845 y SDict begin 13 H.L end 722 1845 a 722 1845 a SDict begin [ /Subtype /Link /Dest (HANDLERS.FILEHANDLER) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 722 1845 a Black Black 2 w Fm(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black 0 TeXcolorgray 3842 1845 a SDict begin H.S end 3842 1845 a Fm(8)3884 1845 y SDict begin 13 H.L end 3884 1845 a 3884 1845 a SDict begin [ /Subtype /Link /Dest (HANDLERS.FILEHANDLER) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 1845 a Black 0 TeXcolorgray 197 1953 a SDict begin H.S end 197 1953 a Fm(html.HTMLFileT)m (itleHandler)1159 1953 y SDict begin 13 H.L end 1159 1953 a 1159 1953 a SDict begin [ /Subtype /Link /Dest (HANDLERS.HTMLFILETITLEHANDLER) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 1159 1953 a Black Black 1 w Fm(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black 0 TeXcolorgray 3842 1953 a SDict begin H.S end 3842 1953 a Fm(8)3884 1953 y SDict begin 13 H.L end 3884 1953 a 3884 1953 a SDict begin [ /Subtype /Link /Dest (HANDLERS.HTMLFILETITLEHANDLER) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 1953 a Black 0 TeXcolorgray 197 2060 a SDict begin H.S end 197 2060 a Fm(mbox)19 b(handlers)690 2060 y SDict begin 13 H.L end 690 2060 a 690 2060 a SDict begin [ /Subtype /Link /Dest (HANDLERS.MAILBOXES) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 690 2060 a Black Black 13 w Fm(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black 0 TeXcolorgray 3842 2060 a SDict begin H.S end 3842 2060 a Fm(8)3884 2060 y SDict begin 13 H.L end 3884 2060 a 3884 2060 a SDict begin [ /Subtype /Link /Dest (HANDLERS.MAILBOXES) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 2060 a Black 0 TeXcolorgray 197 2168 a SDict begin H.S end 197 2168 a Fm(p)o(yg.PYGHandler)778 2168 y SDict begin 13 H.L end 778 2168 a 778 2168 a SDict begin [ /Subtype /Link /Dest (HANDLERS.PYGHANDLER) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 778 2168 a Black Black 8 w Fm(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black 0 TeXcolorgray 3842 2168 a SDict begin H.S end 3842 2168 a Fm(9)3884 2168 y SDict begin 13 H.L end 3884 2168 a 3884 2168 a SDict begin [ /Subtype /Link /Dest (HANDLERS.PYGHANDLER) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 2168 a Black 0 TeXcolorgray 197 2276 a SDict begin H.S end 197 2276 a Fm(scripte)o(x)o(ec.Ex)o(ecHandler)989 2276 y SDict begin 13 H.L end 989 2276 a 989 2276 a SDict begin [ /Subtype /Link /Dest (HANDLERS.EXECHANDLER) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 989 2276 a Black Black 5 w Fm(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black 0 TeXcolorgray 3842 2276 a SDict begin H.S end 3842 2276 a Fm(9)3884 2276 y SDict begin 13 H.L end 3884 2276 a 3884 2276 a SDict begin [ /Subtype /Link /Dest (HANDLERS.EXECHANDLER) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 2276 a Black 0 TeXcolorgray 197 2384 a SDict begin H.S end 197 2384 a Fm(UMN.UMNDirHandler)986 2384 y SDict begin 13 H.L end 986 2384 a 986 2384 a SDict begin [ /Subtype /Link /Dest (HANDLERS.UMN) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 986 2384 a Black Black 8 w Fm(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black 0 TeXcolorgray 3800 2384 a SDict begin H.S end 3800 2384 a Fm(10)3884 2384 y SDict begin 13 H.L end 3884 2384 a 3884 2384 a SDict begin [ /Subtype /Link /Dest (HANDLERS.UMN) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 2384 a Black 0 TeXcolorgray 396 2492 a SDict begin H.S end 396 2492 a Fm(Links)586 2492 y SDict begin 13 H.L end 586 2492 a 586 2492 a SDict begin [ /Subtype /Link /Dest (HANDLERS.UMN.LINKS) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 586 2492 a Black Black 14 w Fm(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black 0 TeXcolorgray 3800 2492 a SDict begin H.S end 3800 2492 a Fm(10)3884 2492 y SDict begin 13 H.L end 3884 2492 a 3884 2492 a SDict begin [ /Subtype /Link /Dest (HANDLERS.UMN.LINKS) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 2492 a Black 0 TeXcolorgray 396 2600 a SDict begin H.S end 396 2600 a Fm(Ov)o(erriding)f(Def)o(aults)1061 2600 y SDict begin 13 H.L end 1061 2600 a 1061 2600 a SDict begin [ /Subtype /Link /Dest (HANDLERS.UMN.OVERRIDING) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 1061 2600 a Black Black 16 w Fm(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black 0 TeXcolorgray 3800 2600 a SDict begin H.S end 3800 2600 a Fm(11)3884 2600 y SDict begin 13 H.L end 3884 2600 a 3884 2600 a SDict begin [ /Subtype /Link /Dest (HANDLERS.UMN.OVERRIDING) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 2600 a Black 0 TeXcolorgray 396 2708 a SDict begin H.S end 396 2708 a Fm(Adding)h(Cool)h(Links)1038 2708 y SDict begin 13 H.L end 1038 2708 a 1038 2708 a SDict begin [ /Subtype /Link /Dest (HANDLERS.UMN.COOL) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 1038 2708 a Black Black 18 w Fm(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black 0 TeXcolorgray 3800 2708 a SDict begin H.S end 3800 2708 a Fm(12)3884 2708 y SDict begin 13 H.L end 3884 2708 a 3884 2708 a SDict begin [ /Subtype /Link /Dest (HANDLERS.UMN.COOL) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 2708 a Black 0 TeXcolorgray 396 2816 a SDict begin H.S end 396 2816 a Fm(Hiding)g(an)g(Entry)933 2816 y SDict begin 13 H.L end 933 2816 a 933 2816 a SDict begin [ /Subtype /Link /Dest (HANDLERS.UMN.HIDING) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 933 2816 a Black Black -1 w Fm(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black 0 TeXcolorgray 3800 2816 a SDict begin H.S end 3800 2816 a Fm(12)3884 2816 y SDict begin 13 H.L end 3884 2816 a 3884 2816 a SDict begin [ /Subtype /Link /Dest (HANDLERS.UMN.HIDING) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 2816 a Black 0 TeXcolorgray 396 2924 a SDict begin H.S end 396 2924 a Fm(Abstracts)h(and)e(Info)1011 2924 y SDict begin 13 H.L end 1011 2924 a 1011 2924 a SDict begin [ /Subtype /Link /Dest (HANDLERS.UMN.ABSTRACTS) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 1011 2924 a Black Black 4 w Fm(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black 0 TeXcolorgray 3800 2924 a SDict begin H.S end 3800 2924 a Fm(12)3884 2924 y SDict begin 13 H.L end 3884 2924 a 3884 2924 a SDict begin [ /Subtype /Link /Dest (HANDLERS.UMN.ABSTRACTS) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 2924 a Black 0 TeXcolorgray 197 3032 a SDict begin H.S end 197 3032 a Fm(url.HTMLURLHandler)982 3032 y SDict begin 13 H.L end 982 3032 a 982 3032 a SDict begin [ /Subtype /Link /Dest (HANDLERS.HTMLURLHANDLER) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 982 3032 a Black Black 12 w Fm(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black 0 TeXcolorgray 3800 3032 a SDict begin H.S end 3800 3032 a Fm(13)3884 3032 y SDict begin 13 H.L end 3884 3032 a 3884 3032 a SDict begin [ /Subtype /Link /Dest (HANDLERS.HTMLURLHANDLER) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 3032 a Black 0 TeXcolorgray 197 3140 a SDict begin H.S end 197 3140 a Fm(url.URL)-8 b(T)h(ypeRe)n(writer)923 3140 y SDict begin 13 H.L end 923 3140 a 923 3140 a SDict begin [ /Subtype /Link /Dest (HANDLERS.URLTYPEREWRITER) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 923 3140 a Black Black 9 w Fm(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black 0 TeXcolorgray 3800 3140 a SDict begin H.S end 3800 3140 a Fm(13)3884 3140 y SDict begin 13 H.L end 3884 3140 a 3884 3140 a SDict begin [ /Subtype /Link /Dest (HANDLERS.URLTYPEREWRITER) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 3140 a Black 0 TeXcolorgray 197 3248 a SDict begin H.S end 197 3248 a Fm(virtual.V)i(irtual)667 3248 y SDict begin 13 H.L end 667 3248 a 667 3248 a SDict begin [ /Subtype /Link /Dest (HANDLERS.VIRTUAL) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 667 3248 a Black Black 16 w Fm(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black 0 TeXcolorgray 3800 3248 a SDict begin H.S end 3800 3248 a Fm(13)3884 3248 y SDict begin 13 H.L end 3884 3248 a 3884 3248 a SDict begin [ /Subtype /Link /Dest (HANDLERS.VIRTUAL) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 3248 a Black 0 TeXcolorgray 197 3356 a SDict begin H.S end 197 3356 a Fm(ZIP)c(.ZIPHandler)728 3356 y SDict begin 13 H.L end 728 3356 a 728 3356 a SDict begin [ /Subtype /Link /Dest (HANDLERS.ZIP) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 728 3356 a Black Black 17 w Fm(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black 0 TeXcolorgray 3800 3356 a SDict begin H.S end 3800 3356 a Fm(14)3884 3356 y SDict begin 13 H.L end 3884 3356 a 3884 3356 a SDict begin [ /Subtype /Link /Dest (HANDLERS.ZIP) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 3356 a Black 0 TeXcolorgray -2 3483 a SDict begin H.S end -2 3483 a Fn(6.)20 b(Gopher)g(Item)g(T)-6 b(ypes)766 3483 y SDict begin 13 H.L end 766 3483 a 766 3483 a SDict begin [ /Subtype /Link /Dest (TYPES) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 766 3483 a Black Black 20 w Fn(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black 0 TeXcolorgray 3800 3483 a SDict begin H.S end 3800 3483 a Fn(15)3884 3483 y SDict begin 13 H.L end 3884 3483 a 3884 3483 a SDict begin [ /Subtype /Link /Dest (TYPES) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 3483 a Black 0 TeXcolorgray -2 3611 a SDict begin H.S end -2 3611 a Fn(I.)21 b(PyGopherd)e(Manpage)836 3611 y SDict begin 13 H.L end 836 3611 a 836 3611 a SDict begin [ /Subtype /Link /Dest (PYGOPHERD.MAN) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 836 3611 a Black Black 13 w Fn(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black 0 TeXcolorgray 3800 3611 a SDict begin H.S end 3800 3611 a Fn(17)3884 3611 y SDict begin 13 H.L end 3884 3611 a 3884 3611 a SDict begin [ /Subtype /Link /Dest (PYGOPHERD.MAN) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 3611 a Black 0 TeXcolorgray 197 3739 a SDict begin H.S end 197 3739 a Fm(p)o(ygopherd)555 3739 y SDict begin 13 H.L end 555 3739 a 555 3739 a SDict begin [ /Subtype /Link /Dest (488) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 555 3739 a Black Black 3 w Fm(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black(.)p Black Black -1 w(.)p Black 0 TeXcolorgray 3800 3739 a SDict begin H.S end 3800 3739 a Fm(18)3884 3739 y SDict begin 13 H.L end 3884 3739 a 3884 3739 a SDict begin [ /Subtype /Link /Dest (488) cvn /H /I /Border [0 0 0] /Color [1 0 0] H.B /ANN pdfmark end 3884 3739 a Black Black 3814 5569 a Fk(iii)p Black eop end %%Page: 1 4 TeXDict begin 1 3 bop -600 -600 a SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end -600 -600 a Black 0 TeXcolorgray -2 -102 a SDict begin H.S end -2 -102 a 0 TeXcolorgray 0 TeXcolorgray -2 -102 a SDict begin H.R end -2 -102 a -2 -102 a SDict begin [ /View [/XYZ H.V] /Dest (page.1) cvn H.B /DEST pdfmark end -2 -102 a Black Black -2 -11 a SDict begin H.S end -2 -11 a -2 -11 a SDict begin 13 H.A end -2 -11 a -2 -11 a SDict begin [ /View [/XYZ H.V] /Dest (PYGOPHERD.INTRO) cvn H.B /DEST pdfmark end -2 -11 a 119 x Fl(Chapter)44 b(1.)f(Intr)m(oduction)g(to)h(PyGopherd)-2 283 y SDict begin H.S end -2 283 a -2 283 a SDict begin 13 H.A end -2 283 a -2 283 a SDict begin [ /View [/XYZ H.V] /Dest (7) cvn H.B /DEST pdfmark end -2 283 a 73 x Fm(W)-7 b(elcome)20 b(to)415 356 y SDict begin H.S end 415 356 a 415 356 a SDict begin 13 H.A end 415 356 a 415 356 a SDict begin [ /View [/XYZ H.V] /Dest (8) cvn H.B /DEST pdfmark end 415 356 a Fm(PyGopherd.)e(In)i(a)h(nutshell,)1287 356 y SDict begin H.S end 1287 356 a 1287 356 a SDict begin 13 H.A end 1287 356 a 1287 356 a SDict begin [ /View [/XYZ H.V] /Dest (9) cvn H.B /DEST pdfmark end 1287 356 a Fm(PyGopherd)d(is)j(a)g(modern)d(dynamic)h(multi-protocol)e (hierarchical)i(information)-2 464 y(serv)o(er)g(with)h(a)h(pluggable)d (modularized)g(e)o(xtension)g(system,)j(full)f(\003e)o(xible)f (caching,)g(virtual)g(\002les)j(and)d(folders,)g(and)-2 572 y(autodetection)e(of)j(\002le)g(types)f(--)h(all)g(with)g(support)e (for)h(standardized)f(yet)i(e)o(xtensible)f(per)n(-document)d (metadata.)j(Whe)n(w!)g(Read)h(on)-2 680 y(for)f(information)f(on)i (this)h(what)f(all)h(these)f(b)n(uzzw)o(ords)f(mean.)-2 681 y SDict begin H.S end -2 681 a -2 681 a SDict begin 13 H.A end -2 681 a -2 681 a SDict begin [ /View [/XYZ H.V] /Dest (FEATURES) cvn H.B /DEST pdfmark end -2 681 a 376 x Fj(F)l(eatur)m(es)-2 1130 y SDict begin H.S end -2 1130 a -2 1130 a SDict begin 13 H.A end -2 1130 a -2 1130 a SDict begin [ /View [/XYZ H.V] /Dest (12) cvn H.B /DEST pdfmark end -2 1130 a 106 x Fm(Here)h(are)g(some)g(of)588 1236 y SDict begin H.S end 588 1236 a 588 1236 a SDict begin 13 H.A end 588 1236 a 588 1236 a SDict begin [ /View [/XYZ H.V] /Dest (13) cvn H.B /DEST pdfmark end 588 1236 a Fm(PyGopherd')-5 b(s)18 b(features:)-2 1254 y SDict begin H.S end -2 1254 a -2 1254 a SDict begin 13 H.A end -2 1254 a -2 1254 a SDict begin [ /View [/XYZ H.V] /Dest (14) cvn H.B /DEST pdfmark end -2 1254 a -2 1296 a SDict begin H.S end -2 1296 a -2 1296 a SDict begin 13 H.A end -2 1296 a -2 1296 a SDict begin [ /View [/XYZ H.V] /Dest (15) cvn H.B /DEST pdfmark end -2 1296 a Black 173 x Fi(\225)p Black 81 1469 a SDict begin H.S end 81 1469 a 81 1469 a SDict begin 13 H.A end 81 1469 a 81 1469 a SDict begin [ /View [/XYZ H.V] /Dest (16) cvn H.B /DEST pdfmark end 81 1469 a Fm(Pro)o(vides)h(b)n(uilt-in)g (support)g(for)h(multiple)f(protocols:)g(HTTP)i(\(W)-7 b(eb\),)19 b(Gopher+,)g(Gopher)f(\(RFC1436\),)h(Enhanced)f(Gopher0,)81 1577 y(and)h(W)-10 b(AP)22 b(\(mobile)d(phones\).)f(Protocols)h(can)h (be)h(enabled)e(or)g(disabled)h(as)h(desired.)-2 1595 y SDict begin H.S end -2 1595 a -2 1595 a SDict begin 13 H.A end -2 1595 a -2 1595 a SDict begin [ /View [/XYZ H.V] /Dest (17) cvn H.B /DEST pdfmark end -2 1595 a Black 131 x Fi(\225)p Black 81 1726 a SDict begin H.S end 81 1726 a 81 1726 a SDict begin 13 H.A end 81 1726 a 81 1726 a SDict begin [ /View [/XYZ H.V] /Dest (18) cvn H.B /DEST pdfmark end 81 1726 a Fm(Pro)o(vides)e(protocol)f(autodetection.)f (That)j(is,)1446 1726 y SDict begin H.S end 1446 1726 a 1446 1726 a SDict begin 13 H.A end 1446 1726 a 1446 1726 a SDict begin [ /View [/XYZ H.V] /Dest (19) cvn H.B /DEST pdfmark end 1446 1726 a Fm(PyGopherd)d(can)j(listen)g(for)g(all) g(the)g(abo)o(v)o(e)e(protocols)3069 1726 y SDict begin H.S end 3069 1726 a 3069 1726 a SDict begin 13 H.A end 3069 1726 a 3069 1726 a SDict begin [ /View [/XYZ H.V] /Dest (20) cvn H.B /DEST pdfmark end 3069 1726 a Fk(on)h(a)h(single)g (port)i Fm(and)d(will)81 1834 y(automatically)g(respond)f(using)i(the)g (protocol)e(it)j(detects)g(the)f(client)g(is)h(using.)f(Practical)g(ef) n(fects)g(of)g(this)g(are)h(that)f(you)f(can,)h(for)81 1942 y(instance,)f(gi)n(v)o(e)h(out)g(a)g(single)g(URL)h(and)f(ha)n(v)o (e)f(it)i(vie)n(w)o(able)f(normally)e(on)i(desktop)f(W)-7 b(eb)21 b(bro)n(wsers)e(and)h(in)g(W)-10 b(AP)22 b(mode)d(on)81 2050 y(mobile)g(phones)g(--)h(and)g(appropriately)d(in)k(v)n(arious)e (Gopher)f(bro)n(wsers.)-2 2068 y SDict begin H.S end -2 2068 a -2 2068 a SDict begin 13 H.A end -2 2068 a -2 2068 a SDict begin [ /View [/XYZ H.V] /Dest (21) cvn H.B /DEST pdfmark end -2 2068 a Black 131 x Fi(\225)p Black 81 2199 a SDict begin H.S end 81 2199 a 81 2199 a SDict begin 13 H.A end 81 2199 a 81 2199 a SDict begin [ /View [/XYZ H.V] /Dest (22) cvn H.B /DEST pdfmark end 81 2199 a Fm(Metadata)h(and)g(site)i(links)e(can)h(be)g(entered)e(in)i(a)g (v)n(ariety)f(of)g(formats,)g(including)f(full)i(UMN)f(dot\002le)h (metadata)f(formats)g(as)h(well)81 2307 y(as)h(Bucktooth)d(gophermap)f (\002les.)k(Moreo)o(v)o(er)m(,)c(gophermap)h(\002les)j(are)f(not)g (limited)f(to)i(Gopher)d(protocols,)h(and)h(can)f(be)i(used)e(for)81 2415 y(all)i(protocols.)-2 2433 y SDict begin H.S end -2 2433 a -2 2433 a SDict begin 13 H.A end -2 2433 a -2 2433 a SDict begin [ /View [/XYZ H.V] /Dest (23) cvn H.B /DEST pdfmark end -2 2433 a Black 132 x Fi(\225)p Black 81 2565 a SDict begin H.S end 81 2565 a 81 2565 a SDict begin 13 H.A end 81 2565 a 81 2565 a SDict begin [ /View [/XYZ H.V] /Dest (24) cvn H.B /DEST pdfmark end 81 2565 a Fm(Support)d(for)i(inter)n(-protocol)e(linking)h(\(linking)f (from)i(Gopher)e(sites)k(to)e(web)g(sites\))-2 2583 y SDict begin H.S end -2 2583 a -2 2583 a SDict begin 13 H.A end -2 2583 a -2 2583 a SDict begin [ /View [/XYZ H.V] /Dest (25) cvn H.B /DEST pdfmark end -2 2583 a Black 131 x Fi(\225)p Black 81 2714 a SDict begin H.S end 81 2714 a 81 2714 a SDict begin 13 H.A end 81 2714 a 81 2714 a SDict begin [ /View [/XYZ H.V] /Dest (26) cvn H.B /DEST pdfmark end 81 2714 a Fm(V)-5 b(irtual)20 b(folder)f(system)h (lets)h(you)f(serv)o(e)f(up)h(an)o(ything)e(as)j(if)f(it)h(were)f(re)o (gular)f(\002les)i(and)f(directories.)f(PyGopherd)f(comes)i(with)81 2822 y(the)g(follo)n(wing)f(virtual)g(folder)g(systems)i(b)n(uilt)f (in:)-2 2840 y SDict begin H.S end -2 2840 a -2 2840 a SDict begin 13 H.A end -2 2840 a -2 2840 a SDict begin [ /View [/XYZ H.V] /Dest (27) cvn H.B /DEST pdfmark end -2 2840 a -2 2840 a SDict begin H.S end -2 2840 a -2 2840 a SDict begin 13 H.A end -2 2840 a -2 2840 a SDict begin [ /View [/XYZ H.V] /Dest (28) cvn H.B /DEST pdfmark end -2 2840 a Black 81 2972 a Fh(\225)p Black 164 2972 a SDict begin H.S end 164 2972 a 164 2972 a SDict begin 13 H.A end 164 2972 a 164 2972 a SDict begin [ /View [/XYZ H.V] /Dest (29) cvn H.B /DEST pdfmark end 164 2972 a Fm(Can)g(present)g(an)o(y)f(Unix)h(MBO)m(X,)g(MMDF)h(box,)e(MH)h (directory)-5 b(,)18 b(Maildir)i(directory)-5 b(,)18 b(or)i(Babyl)g(mailbox)f(as)i(a)f(virtual)164 3080 y(folder)m(,)e(the)i (contents)g(of)g(which)f(are)i(the)f(messages)g(in)g(the)h(mailbox.)-2 3098 y SDict begin H.S end -2 3098 a -2 3098 a SDict begin 13 H.A end -2 3098 a -2 3098 a SDict begin [ /View [/XYZ H.V] /Dest (30) cvn H.B /DEST pdfmark end -2 3098 a Black 81 3229 a Fh(\225)p Black 164 3229 a SDict begin H.S end 164 3229 a 164 3229 a SDict begin 13 H.A end 164 3229 a 164 3229 a SDict begin [ /View [/XYZ H.V] /Dest (31) cvn H.B /DEST pdfmark end 164 3229 a Fm(Can)f(use)h(a)f (con\002gurable)e(separator)h(to)h(split)h(a)g(\002le)g(into)f (multiple)f(parts,)h(the)g(\002rst)h(line)g(of)e(each)h(becoming)f(the) h(name)f(for)164 3337 y(the)h(virtual)g(folder)-5 b(.)-2 3338 y SDict begin H.S end -2 3338 a -2 3338 a SDict begin 13 H.A end -2 3338 a -2 3338 a SDict begin [ /View [/XYZ H.V] /Dest (32) cvn H.B /DEST pdfmark end -2 3338 a Black 81 3486 a Fh(\225)p Black 164 3486 a SDict begin H.S end 164 3486 a 164 3486 a SDict begin 13 H.A end 164 3486 a 164 3486 a SDict begin [ /View [/XYZ H.V] /Dest (33) cvn H.B /DEST pdfmark end 164 3486 a Fm(Can)20 b(peek)g(inside)g(a)h(ZIP)f(\002le)h(and)e(serv)o(e)h(it)h(up)f(as)h (\002rst-class)g(site)g(citizens)f(--)g(metadata)g(can)g(e)n(v)o(en)f (be)h(stored)f(in)i(the)f(ZIP)164 3594 y(\002les.)-2 3595 y SDict begin H.S end -2 3595 a -2 3595 a SDict begin 13 H.A end -2 3595 a -2 3595 a SDict begin [ /View [/XYZ H.V] /Dest (34) cvn H.B /DEST pdfmark end -2 3595 a Black 81 3744 a Fh(\225)p Black 164 3744 a SDict begin H.S end 164 3744 a 164 3744 a SDict begin 13 H.A end 164 3744 a 164 3744 a SDict begin [ /View [/XYZ H.V] /Dest (35) cvn H.B /DEST pdfmark end 164 3744 a Fm(Can)g(serv)o(e)g(up)g (the)g(contents)f(of)h(a)h(dictd)f(serv)o(er)f(as)i(a)g(\002lesystem.) 39 3893 y SDict begin H.S end 39 3893 a 39 3893 a SDict begin 13 H.A end 39 3893 a 39 3893 a SDict begin [ /View [/XYZ H.V] /Dest (36) cvn H.B /DEST pdfmark end 39 3893 a Black -2 4043 a Fi(\225)p Black 81 4043 a SDict begin H.S end 81 4043 a 81 4043 a SDict begin 13 H.A end 81 4043 a 81 4043 a SDict begin [ /View [/XYZ H.V] /Dest (37) cvn H.B /DEST pdfmark end 81 4043 a Fm(Modular)m(,)d(e)o (xtensible)h(design:)h(you)f(can)h(use)g(PyGopherd')-5 b(s)19 b(o)n(wn)g(PYG)i(e)o(xtension)e(format,)g(or)h(UMN-)g(or)g (Bucktooth-style)81 4151 y(e)o(x)o(ecutables.)-2 4152 y SDict begin H.S end -2 4152 a -2 4152 a SDict begin 13 H.A end -2 4152 a -2 4152 a SDict begin [ /View [/XYZ H.V] /Dest (38) cvn H.B /DEST pdfmark end -2 4152 a Black 148 x Fi(\225)p Black 81 4300 a SDict begin H.S end 81 4300 a 81 4300 a SDict begin 13 H.A end 81 4300 a 81 4300 a SDict begin [ /View [/XYZ H.V] /Dest (39) cvn H.B /DEST pdfmark end 81 4300 a Fm(Runs)g(on)g(an)o(y)f(platform)g (supported)f(by)i(Python)f(2.2)h(or)g(2.3.)f(This)h(includes)g (virtually)f(e)n(v)o(ery)g(past)h(and)g(current)f(\003a)n(v)n(or)h(of)g (Unix)81 4408 y(\(Linux,)e(*BSD,)j(Solaris,)f(SunOS\),)f(W)m(indo)n (ws,)h(MacOS)g(9.x)g(and)f(X,)i(and)e(more.)g(Some)h(features)g(may)g (not)f(be)i(a)n(v)n(ailable)e(on)81 4516 y(non-Unix)f(platforms.)-2 4534 y SDict begin H.S end -2 4534 a -2 4534 a SDict begin 13 H.A end -2 4534 a -2 4534 a SDict begin [ /View [/XYZ H.V] /Dest (40) cvn H.B /DEST pdfmark end -2 4534 a Black 131 x Fi(\225)p Black 81 4665 a SDict begin H.S end 81 4665 a 81 4665 a SDict begin 13 H.A end 81 4665 a 81 4665 a SDict begin [ /View [/XYZ H.V] /Dest (41) cvn H.B /DEST pdfmark end 81 4665 a Fm(Runs)i(on)g(an)o(y)f(platform)g (supported)f(by)i(Ja)n(v)n(a)h(1.1)e(via)h(the)h(Jython)e(Python)g (implementation.)-2 4683 y SDict begin H.S end -2 4683 a -2 4683 a SDict begin 13 H.A end -2 4683 a -2 4683 a SDict begin [ /View [/XYZ H.V] /Dest (42) cvn H.B /DEST pdfmark end -2 4683 a Black 132 x Fi(\225)p Black 81 4815 a SDict begin H.S end 81 4815 a 81 4815 a SDict begin 13 H.A end 81 4815 a 81 4815 a SDict begin [ /View [/XYZ H.V] /Dest (43) cvn H.B /DEST pdfmark end 81 4815 a Fm(T)l(unable)g(serv)o(er)g(types)h(via)g(con\002guration)e(directi)n (v)o(e)h(--)h(forking)e(or)i(threading.)-2 4833 y SDict begin H.S end -2 4833 a -2 4833 a SDict begin 13 H.A end -2 4833 a -2 4833 a SDict begin [ /View [/XYZ H.V] /Dest (44) cvn H.B /DEST pdfmark end -2 4833 a Black 131 x Fi(\225)p Black 81 4964 a SDict begin H.S end 81 4964 a 81 4964 a SDict begin 13 H.A end 81 4964 a 81 4964 a SDict begin [ /View [/XYZ H.V] /Dest (45) cvn H.B /DEST pdfmark end 81 4964 a Fm(Secure)f(design)h(with)g(support)f(for)h (chrooted)e(e)o(x)o(ecution.)-2 4982 y SDict begin H.S end -2 4982 a -2 4982 a SDict begin 13 H.A end -2 4982 a -2 4982 a SDict begin [ /View [/XYZ H.V] /Dest (46) cvn H.B /DEST pdfmark end -2 4982 a Black 132 x Fi(\225)p Black 81 5114 a SDict begin H.S end 81 5114 a 81 5114 a SDict begin 13 H.A end 81 5114 a 81 5114 a SDict begin [ /View [/XYZ H.V] /Dest (47) cvn H.B /DEST pdfmark end 81 5114 a Fm(Feature-complete,)f(full)j(implementations)f(of:)h (Gopher0)e(\(RFC1435\),)h(Gopher+,)f(HTTP)-9 b(,)20 b(and)f(W)-10 b(AP)h(.)-2 5132 y SDict begin H.S end -2 5132 a -2 5132 a SDict begin 13 H.A end -2 5132 a -2 5132 a SDict begin [ /View [/XYZ H.V] /Dest (48) cvn H.B /DEST pdfmark end -2 5132 a Black 3842 5569 a Fk(1)p Black eop end %%Page: 2 5 TeXDict begin 2 4 bop -600 -600 a SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end -600 -600 a Black 0 TeXcolorgray -2 -102 a SDict begin H.S end -2 -102 a 0 TeXcolorgray 0 TeXcolorgray -2 -102 a SDict begin H.R end -2 -102 a -2 -102 a SDict begin [ /View [/XYZ H.V] /Dest (page.2) cvn H.B /DEST pdfmark end -2 -102 a Black 2608 -132 a Fk(Chapter)20 b(1.)g(Intr)l(oduction)e(to)i(PyGopher)m(d)p Black Black -2 72 a Fi(\225)p Black 81 72 a SDict begin H.S end 81 72 a 81 72 a SDict begin 13 H.A end 81 72 a 81 72 a SDict begin [ /View [/XYZ H.V] /Dest (49) cvn H.B /DEST pdfmark end 81 72 a Fm(Support)e(for)i(automatically)f (\002nding)g(the)h(titles)h(of)f(HTML)g(documents)f(for)g(presentation) g(in)h(a)h(directory)-5 b(.)-2 90 y SDict begin H.S end -2 90 a -2 90 a SDict begin 13 H.A end -2 90 a -2 90 a SDict begin [ /View [/XYZ H.V] /Dest (50) cvn H.B /DEST pdfmark end -2 90 a Black 132 x Fi(\225)p Black 81 222 a SDict begin H.S end 81 222 a 81 222 a SDict begin 13 H.A end 81 222 a 81 222 a SDict begin [ /View [/XYZ H.V] /Dest (51) cvn H.B /DEST pdfmark end 81 222 a Fm(V)c(ersatile)20 b(con\002guration)e(\002le)i(format)f(is)j(both)d(e)o(xtensible)g(and)h (nicely)f(complementary)f(of)i(the)g(module)f(system.)-2 240 y SDict begin H.S end -2 240 a -2 240 a SDict begin 13 H.A end -2 240 a -2 240 a SDict begin [ /View [/XYZ H.V] /Dest (52) cvn H.B /DEST pdfmark end -2 240 a Black 131 x Fi(\225)p Black 81 371 a SDict begin H.S end 81 371 a 81 371 a SDict begin 13 H.A end 81 371 a 81 371 a SDict begin [ /View [/XYZ H.V] /Dest (53) cvn H.B /DEST pdfmark end 81 371 a Fm(Protocol-independant,)c(handler)n(-dependant)h (caching.)j(This)h(increases)g(performance)d(by)j(letting)g(handlers)f (cache)81 479 y(dynamically-generated)c(information)j(--)i(currently)f (used)h(by)f(the)i(directory)d(handlers.)h(This)h(can)g(impro)o(v)o(e)e (performance)f(of)81 587 y(directories)i(by)h(se)n(v)o(eral)f(orders)h (of)f(magnitude.)f(Because)j(this)g(is)g(a)f(handler)f(cache)h(only)-5 b(,)18 b(all)j(protococls)e(share)h(the)g(single)81 695 y(cache.)f(Since)h(the)h(processing)e(time)h(for)f(the)i(protocols)d (is)k(ne)o(gligable,)17 b(this)k(w)o(orks)f(out)g(v)o(ery)f(well.)-2 713 y SDict begin H.S end -2 713 a -2 713 a SDict begin 13 H.A end -2 713 a -2 713 a SDict begin [ /View [/XYZ H.V] /Dest (54) cvn H.B /DEST pdfmark end -2 713 a Black 132 x Fi(\225)p Black 81 845 a SDict begin H.S end 81 845 a 81 845 a SDict begin 13 H.A end 81 845 a 81 845 a SDict begin [ /View [/XYZ H.V] /Dest (55) cvn H.B /DEST pdfmark end 81 845 a Fm(Autosensing)g(of)h(MIME)f(types)h(and)g(gopher0) e(item)i(types.)g(Both)g(are)g(completely)f(con\002gurable.)e(MIME)j (type)g(detection)f(is)81 953 y(done)g(using)h(a)g(standard)f (mime.types)g(\002le,)i(and)e(gopher0)f(types)i(are)g(calculated)g(by)f (using)h(a)h(con\002gurable)c(re)o(ge)o(xp-based)81 1060 y(MIME-to-gophertype)e(map.)-2 1078 y SDict begin H.S end -2 1078 a -2 1078 a SDict begin 13 H.A end -2 1078 a -2 1078 a SDict begin [ /View [/XYZ H.V] /Dest (56) cvn H.B /DEST pdfmark end -2 1078 a Black 132 x Fi(\225)p Black 81 1210 a SDict begin H.S end 81 1210 a 81 1210 a SDict begin 13 H.A end 81 1210 a 81 1210 a SDict begin [ /View [/XYZ H.V] /Dest (57) cvn H.B /DEST pdfmark end 81 1210 a Fm(Hea)n(vy)20 b(support)e(of)i(re)o(gular)f(e)o (xpressions)g(in)h(con\002guration.)-2 1228 y SDict begin H.S end -2 1228 a -2 1228 a SDict begin 13 H.A end -2 1228 a -2 1228 a SDict begin [ /View [/XYZ H.V] /Dest (58) cvn H.B /DEST pdfmark end -2 1228 a Black 131 x Fi(\225)p Black 81 1359 a SDict begin H.S end 81 1359 a 81 1359 a SDict begin 13 H.A end 81 1359 a 81 1359 a SDict begin [ /View [/XYZ H.V] /Dest (59) cvn H.B /DEST pdfmark end 81 1359 a Fm(ProtocolMultiple)o(x)o(er)c(and)k (HandlerMultiple)o(x)o(er)d(let)k(you)e(choose)g(only)h(those)g (protocols)e(and)i(handlers)f(that)h(you)g(wish)g(your)81 1467 y(serv)o(er)f(to)h(support)f(and)h(the)g(order)f(in)h(which)g(the) o(y)g(are)g(tried)g(when)f(a)i(request)e(comes)h(in.)-2 1485 y SDict begin H.S end -2 1485 a -2 1485 a SDict begin 13 H.A end -2 1485 a -2 1485 a SDict begin [ /View [/XYZ H.V] /Dest (60) cvn H.B /DEST pdfmark end -2 1485 a Black 132 x Fi(\225)p Black 81 1617 a SDict begin H.S end 81 1617 a 81 1617 a SDict begin 13 H.A end 81 1617 a 81 1617 a SDict begin [ /View [/XYZ H.V] /Dest (61) cvn H.B /DEST pdfmark end 81 1617 a Fm(Full)g(logging)f(via)h(syslog.) -2 1676 y SDict begin H.S end -2 1676 a -2 1676 a SDict begin 13 H.A end -2 1676 a -2 1676 a SDict begin [ /View [/XYZ H.V] /Dest (ABOUTGOPHER) cvn H.B /DEST pdfmark end -2 1676 a 359 x Fj(About)34 b(Gopher)-2 2136 y SDict begin H.S end -2 2136 a -2 2136 a SDict begin 13 H.A end -2 2136 a -2 2136 a SDict begin [ /View [/XYZ H.V] /Dest (64) cvn H.B /DEST pdfmark end -2 2136 a -2 2136 a SDict begin H.S end -2 2136 a -2 2136 a SDict begin 13 H.A end -2 2136 a -2 2136 a SDict begin [ /View [/XYZ H.V] /Dest (65) cvn H.B /DEST pdfmark end -2 2136 a 79 x Fm(PyGopherd)18 b(started)i(life)g(as)h(a)g(serv)o(er)e(for)h(the)g(Gopher)f(Internet)f (protocol.)h(W)m(ith)h(Gopher)m(,)e(you)i(can)g(mount)f(a)h (\002lesystem)-2 2323 y(\(vie)n(wing)f(\002les)i(and)e(folders)h(as)h (if)f(the)o(y)g(were)g(local\),)f(bro)n(wse)h(Gopherspace)e(with)i(a)h (web)f(bro)n(wser)m(,)e(do)n(wnload)g(\002les,)j(and)f(be)-2 2431 y(interacti)n(v)o(e)f(with)h(searching.)-2 2490 y SDict begin H.S end -2 2490 a -2 2490 a SDict begin 13 H.A end -2 2490 a -2 2490 a SDict begin [ /View [/XYZ H.V] /Dest (66) cvn H.B /DEST pdfmark end -2 2490 a 90 x Fm(But)g(this)h(is)g(only)f(part)g(of)f(the)i(story)-5 b(.)19 b(The)h(w)o(orld)f(of)h(Gopher)f(is)i(more)e(e)o(xpansi)n(v)o(e) g(than)g(this.)i(There)e(are)h(tw)o(o)h(major)e(gopher)-2 2688 y(protocols:)g(Gopher0)f(\(also)i(kno)n(wn)f(as)i(RFC1436\))e(and) h(Gopher+.)e(Gopher0)g(is)j(a)g(small,)f(simple,)g(lightweight)f (protocol)g(that)h(is)-2 2796 y(v)o(ery)f(functional)f(yet)i(also)h(e)o (xtremely)d(easy)j(to)f(implement.)f(Gopher0)f(clients)i(can)g(be)h (easily)f(places)g(in)h(small)f(embedded)-2 2904 y(de)n(vices)f(or)h (in)h(massi)n(v)o(e)f(en)m(vironments)d(lik)o(e)j(a)h(modern)d(web)j (bro)n(wser)-5 b(.)-2 2946 y SDict begin H.S end -2 2946 a -2 2946 a SDict begin 13 H.A end -2 2946 a -2 2946 a SDict begin [ /View [/XYZ H.V] /Dest (67) cvn H.B /DEST pdfmark end -2 2946 a 107 x Fm(Gopher+)18 b(is)j(based)f(on)g(Gopher0)e (b)n(ut)i(e)o(xtends)g(it)h(by)e(pro)o(viding)f(document)g(metadata)h (such)h(as)h(\002le)g(size)g(and)f(MIME)f(type.)-2 3161 y(Gopher+)f(allo)n(ws)j(all)g(sorts)f(of)g(neat)g(features,)f(such)h (as)h(con\002gurable)d(metadata)h(\(serving)g(up)h(a)h(b)n(unch)e(of)h (photos?)f(Add)g(a)-2 3269 y(Subject)h(\002eld)g(to)g(your)f(metadata)h (to)g(let)h(a)f(customized)f(photo)g(bro)n(wser)g(display)h(who)g(is)h (pictured\))d(and)i(multiple)f(vie)n(ws)i(of)f(a)g(\002le)-2 3377 y(\(let)g(the)g(user)g(select)h(to)g(vie)n(w)f(your)f(photos)g(as) i(PNG)f(or)g(JPEG\).)p Black 3842 5569 a Fk(2)p Black eop end %%Page: 3 6 TeXDict begin 3 5 bop -600 -600 a SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end -600 -600 a Black 0 TeXcolorgray -2 -102 a SDict begin H.S end -2 -102 a 0 TeXcolorgray 0 TeXcolorgray -2 -102 a SDict begin H.R end -2 -102 a -2 -102 a SDict begin [ /View [/XYZ H.V] /Dest (page.3) cvn H.B /DEST pdfmark end -2 -102 a Black Black -2 -11 a SDict begin H.S end -2 -11 a -2 -11 a SDict begin 13 H.A end -2 -11 a -2 -11 a SDict begin [ /View [/XYZ H.V] /Dest (QUICKSTART) cvn H.B /DEST pdfmark end -2 -11 a 119 x Fl(Chapter)44 b(2.)f(Quick)g(Start)-2 283 y SDict begin H.S end -2 283 a -2 283 a SDict begin 13 H.A end -2 283 a -2 283 a SDict begin [ /View [/XYZ H.V] /Dest (70) cvn H.B /DEST pdfmark end -2 283 a 73 x Fm(If)20 b(you)f(ha)n(v)o(e) h(already)f(installed)961 356 y SDict begin H.S end 961 356 a 961 356 a SDict begin 13 H.A end 961 356 a 961 356 a SDict begin [ /View [/XYZ H.V] /Dest (71) cvn H.B /DEST pdfmark end 961 356 a Fm(PyGopherd)f(system-wide,)h(or)h(your)f (administrator)f(has)j(done)e(that)h(for)g(you,)f(your)g(task)h(for)-2 464 y(setting)g(up)344 464 y SDict begin H.S end 344 464 a 344 464 a SDict begin 13 H.A end 344 464 a 344 464 a SDict begin [ /View [/XYZ H.V] /Dest (72) cvn H.B /DEST pdfmark end 344 464 a Fm(PyGopherd)e(for)h(the)h(\002rst)h(time)g (is)g(quite)f(simple.)g(Y)-9 b(ou)19 b(just)i(need)e(to)i(set)g(up)e (your)g(con\002guration)f(\002le,)j(mak)o(e)e(your)-2 572 y(folder)g(directory)-5 b(,)18 b(and)h(run)h(it!)-2 631 y SDict begin H.S end -2 631 a -2 631 a SDict begin 13 H.A end -2 631 a -2 631 a SDict begin [ /View [/XYZ H.V] /Dest (73) cvn H.B /DEST pdfmark end -2 631 a 90 x Fm(Y)-9 b(ou)19 b(can)h(quickly)f(set)i(up)f(your)f(con\002guration)e (\002le.)k(The)f(distrib)n(ution)f(includes)g(tw)o(o)i(\002les)g(of)f (interest:)-2 829 y SDict begin H.S end -2 829 a -2 829 a SDict begin 13 H.A end -2 829 a -2 829 a SDict begin [ /View [/XYZ H.V] /Dest (74) cvn H.B /DEST pdfmark end -2 829 a Fg(conf/pygopherd.conf)d Fm(and)1011 829 y SDict begin H.S end 1011 829 a 1011 829 a SDict begin 13 H.A end 1011 829 a 1011 829 a SDict begin [ /View [/XYZ H.V] /Dest (75) cvn H.B /DEST pdfmark end 1011 829 a Fg(conf/mime.types)p Fm(.)h(Debian)h(users)i(will)g(\002nd)f(the)g (con\002guration)d(\002le)k(pre-installed)e(in)-2 937 y SDict begin H.S end -2 937 a -2 937 a SDict begin 13 H.A end -2 937 a -2 937 a SDict begin [ /View [/XYZ H.V] /Dest (76) cvn H.B /DEST pdfmark end -2 937 a Fg (/etc/pygopherd/pygopherd.conf)d Fm(and)j(the)1581 937 y SDict begin H.S end 1581 937 a 1581 937 a SDict begin 13 H.A end 1581 937 a 1581 937 a SDict begin [ /View [/XYZ H.V] /Dest (77) cvn H.B /DEST pdfmark end 1581 937 a Fg(mime.types)h Fm(\002le)g(pro)o(vided)e(by)i(the)g(system)g (already)-5 b(.)-2 997 y SDict begin H.S end -2 997 a -2 997 a SDict begin 13 H.A end -2 997 a -2 997 a SDict begin [ /View [/XYZ H.V] /Dest (78) cvn H.B /DEST pdfmark end -2 997 a 89 x Fm(Open)19 b(up)302 1086 y SDict begin H.S end 302 1086 a 302 1086 a SDict begin 13 H.A end 302 1086 a 302 1086 a SDict begin [ /View [/XYZ H.V] /Dest (79) cvn H.B /DEST pdfmark end 302 1086 a Fg(pygopherd.conf)g Fm(in)h(your)f(editor)g(and)h(adjust)g(to)g(suit.)h(The)f(\002le)h(is)g (hea)n(vily)e(commented)f(and)i(you)f(can)h(refer)g(to)g(it)-2 1194 y(for)f(detailed)h(information.)d(Some)j(settings)h(to)f(tak)o(e)g (a)h(look)e(at)i(include:)2155 1194 y SDict begin H.S end 2155 1194 a 2155 1194 a SDict begin 13 H.A end 2155 1194 a 2155 1194 a SDict begin [ /View [/XYZ H.V] /Dest (80) cvn H.B /DEST pdfmark end 2155 1194 a Fm(detach,)2414 1194 y SDict begin H.S end 2414 1194 a 2414 1194 a SDict begin 13 H.A end 2414 1194 a 2414 1194 a SDict begin [ /View [/XYZ H.V] /Dest (81) cvn H.B /DEST pdfmark end 2414 1194 a Fm(pid\002le,)2667 1194 y SDict begin H.S end 2667 1194 a 2667 1194 a SDict begin 13 H.A end 2667 1194 a 2667 1194 a SDict begin [ /View [/XYZ H.V] /Dest (82) cvn H.B /DEST pdfmark end 2667 1194 a Fm(port,)2842 1194 y SDict begin H.S end 2842 1194 a 2842 1194 a SDict begin 13 H.A end 2842 1194 a 2842 1194 a SDict begin [ /View [/XYZ H.V] /Dest (83) cvn H.B /DEST pdfmark end 2842 1194 a Fm(usechroot,)3207 1194 y SDict begin H.S end 3207 1194 a 3207 1194 a SDict begin 13 H.A end 3207 1194 a 3207 1194 a SDict begin [ /View [/XYZ H.V] /Dest (84) cvn H.B /DEST pdfmark end 3207 1194 a Fm(setuid,)3447 1194 y SDict begin H.S end 3447 1194 a 3447 1194 a SDict begin 13 H.A end 3447 1194 a 3447 1194 a SDict begin [ /View [/XYZ H.V] /Dest (85) cvn H.B /DEST pdfmark end 3447 1194 a Fm(setgid,)e(and)-2 1302 y SDict begin H.S end -2 1302 a -2 1302 a SDict begin 13 H.A end -2 1302 a -2 1302 a SDict begin [ /View [/XYZ H.V] /Dest (86) cvn H.B /DEST pdfmark end -2 1302 a Fm(root.)g(These)h(may)g(or)g(may) f(not)h(w)o(ork)g(at)g(their)g(def)o(aults)g(for)g(you.)f(The)h (remaining)e(ones)i(should)f(be)h(\002ne)h(for)e(a)i(basic)f(setup.)-2 1362 y SDict begin H.S end -2 1362 a -2 1362 a SDict begin 13 H.A end -2 1362 a -2 1362 a SDict begin [ /View [/XYZ H.V] /Dest (87) cvn H.B /DEST pdfmark end -2 1362 a 90 x Fm(In)m(v)n(ok)o(e)243 1452 y SDict begin H.S end 243 1452 a 243 1452 a SDict begin 13 H.A end 243 1452 a 243 1452 a SDict begin [ /View [/XYZ H.V] /Dest (88) cvn H.B /DEST pdfmark end 243 1452 a Fm(PyGopherd)e(with)811 1452 y SDict begin H.S end 811 1452 a 811 1452 a SDict begin 13 H.A end 811 1452 a 811 1452 a SDict begin [ /View [/XYZ H.V] /Dest (89) cvn H.B /DEST pdfmark end 811 1452 a Fn(pygopherd)h(path/to/con\002g\002le)g Fm(\(or)1948 1452 y SDict begin H.S end 1948 1452 a 1948 1452 a SDict begin 13 H.A end 1948 1452 a 1948 1452 a SDict begin [ /View [/XYZ H.V] /Dest (90) cvn H.B /DEST pdfmark end 1948 1452 a Fn(/etc/init.d/pygopherd)g(start)g Fm(on)h(Debian\).)f (Place)i(some)f(\002les)-2 1560 y(in)g(the)g(location)g(speci\002ed)f (by)h(the)1035 1560 y SDict begin H.S end 1035 1560 a 1035 1560 a SDict begin 13 H.A end 1035 1560 a 1035 1560 a SDict begin [ /View [/XYZ H.V] /Dest (91) cvn H.B /DEST pdfmark end 1035 1560 a Fm(root)g(directi)n(v)o(e)f(in)h(the)g (con\002g)g(\002le)h(and)e(you')l(re)g(ready)g(to)h(run!)p Black 3842 5569 a Fk(3)p Black eop end %%Page: 4 7 TeXDict begin 4 6 bop -600 -600 a SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end -600 -600 a Black 0 TeXcolorgray -2 -102 a SDict begin H.S end -2 -102 a 0 TeXcolorgray 0 TeXcolorgray -2 -102 a SDict begin H.R end -2 -102 a -2 -102 a SDict begin [ /View [/XYZ H.V] /Dest (page.4) cvn H.B /DEST pdfmark end -2 -102 a Black Black -2 -11 a SDict begin H.S end -2 -11 a -2 -11 a SDict begin 13 H.A end -2 -11 a -2 -11 a SDict begin [ /View [/XYZ H.V] /Dest (INSTALLATION) cvn H.B /DEST pdfmark end -2 -11 a 119 x Fl(Chapter)44 b(3.)f(Installation)-2 283 y SDict begin H.S end -2 283 a -2 283 a SDict begin 13 H.A end -2 283 a -2 283 a SDict begin [ /View [/XYZ H.V] /Dest (94) cvn H.B /DEST pdfmark end -2 283 a 73 x Fm(If)20 b(you)f(are)h (reading)f(this)i(document)d(via)i(the)g("man")g(command,)e(it)j(is)g (lik)o(ely)f(that)g(you)f(ha)n(v)o(e)h(no)g(installation)g(tasks)g(to)h (perform;)-2 464 y(your)e(system)h(administra-)f(tor)h(has)g(already)f (installed)1633 464 y SDict begin H.S end 1633 464 a 1633 464 a SDict begin 13 H.A end 1633 464 a 1633 464 a SDict begin [ /View [/XYZ H.V] /Dest (95) cvn H.B /DEST pdfmark end 1633 464 a Fm(PyGopherd.)e(If)j(you)g(need)f(to)h(install) h(it)g(yourself,)e(you)g(ha)n(v)o(e)h(three)-2 572 y(options:)f(a)i (system-wide)e(installation)h(with)g(Debian,)g(system-wide)f (installation)h(with)g(other)f(systems,)i(and)f(a)g(single-user)-2 680 y(installation.)f(Y)-9 b(ou)20 b(can)g(do)n(wnload)e(the)i(latest)h (v)o(ersion)e(of)h(PyGopherd)e(from)2298 680 y SDict begin H.S end 2298 680 a 2298 680 a SDict begin 13 H.A end 2298 680 a 2298 680 a SDict begin [ /View [/XYZ H.V] /Dest (96) cvn H.B /DEST pdfmark end 2298 680 a Fm(http://quux.or)o(g/de) n(v)o(el/go)o(ph)o(er/p)n(yg)o(oph)o(erd)o(/)-2 698 y SDict begin H.S end -2 698 a -2 698 a SDict begin 13 H.A end -2 698 a -2 698 a SDict begin [ /View [/XYZ H.V] /Dest (INSTALLATION.DEBIAN) cvn H.B /DEST pdfmark end -2 698 a 359 x Fj(Debian)34 b(System-W)m(ide)g(Installation)-2 1158 y SDict begin H.S end -2 1158 a -2 1158 a SDict begin 13 H.A end -2 1158 a -2 1158 a SDict begin [ /View [/XYZ H.V] /Dest (99) cvn H.B /DEST pdfmark end -2 1158 a 78 x Fm(If)20 b(you)f(are)h (tracking)f(Debian)h(unstable,)f(you)g(may)h(install)1746 1236 y SDict begin H.S end 1746 1236 a 1746 1236 a SDict begin 13 H.A end 1746 1236 a 1746 1236 a SDict begin [ /View [/XYZ H.V] /Dest (100) cvn H.B /DEST pdfmark end 1746 1236 a Fm(PyGopherd)d(by)j(simply)g(running)e(this)j(command)d (as)j(root:)-2 1296 y SDict begin H.S end -2 1296 a -2 1296 a SDict begin 13 H.A end -2 1296 a -2 1296 a SDict begin [ /View [/XYZ H.V] /Dest (101) cvn H.B /DEST pdfmark end -2 1296 a -2 1296 a SDict begin H.S end -2 1296 a -2 1296 a SDict begin 13 H.A end -2 1296 a -2 1296 a SDict begin [ /View [/XYZ H.V] /Dest (102) cvn H.B /DEST pdfmark end -2 1296 a 90 x Fn(apt-get)d(install)j(pygopherd)-2 1444 y SDict begin H.S end -2 1444 a -2 1444 a SDict begin 13 H.A end -2 1444 a -2 1444 a SDict begin [ /View [/XYZ H.V] /Dest (103) cvn H.B /DEST pdfmark end -2 1444 a 91 x Fm(If)f(you)f(are)h(not)g(tracking)f(Debian)g(unstable,)h(do)n (wnload)e(the)i(.deb)f(package)g(from)g(the)2566 1535 y SDict begin H.S end 2566 1535 a 2566 1535 a SDict begin 13 H.A end 2566 1535 a 2566 1535 a SDict begin [ /View [/XYZ H.V] /Dest (104) cvn H.B /DEST pdfmark end 2566 1535 a Fm(PyGopherd)f(website)j(and)e(then)h(run)3676 1535 y SDict begin H.S end 3676 1535 a 3676 1535 a SDict begin 13 H.A end 3676 1535 a 3676 1535 a SDict begin [ /View [/XYZ H.V] /Dest (105) cvn H.B /DEST pdfmark end 3676 1535 a Fn(dpkg)-2 1643 y(-i)g Fm(to)h(install)f(the)h(do)n (wnloaded)c(package.)i(Then,)g(skip)h(to)g(the)g(con\002guration)e (section)i(belo)n(w)-5 b(.)19 b(Y)-9 b(ou)19 b(will)i(use)-2 1751 y SDict begin H.S end -2 1751 a -2 1751 a SDict begin 13 H.A end -2 1751 a -2 1751 a SDict begin [ /View [/XYZ H.V] /Dest (106) cvn H.B /DEST pdfmark end -2 1751 a Fn(/etc/init.d/pygopherd)e(start)h Fm(to)g(start)h(the)f(program.)-2 1811 y SDict begin H.S end -2 1811 a -2 1811 a SDict begin 13 H.A end -2 1811 a -2 1811 a SDict begin [ /View [/XYZ H.V] /Dest (INSTALLATION.OTHER) cvn H.B /DEST pdfmark end -2 1811 a 359 x Fj(Other)34 b(System-W)m(ide)g(Installation)-2 2271 y SDict begin H.S end -2 2271 a -2 2271 a SDict begin 13 H.A end -2 2271 a -2 2271 a SDict begin [ /View [/XYZ H.V] /Dest (109) cvn H.B /DEST pdfmark end -2 2271 a 78 x Fm(Do)n(wnload)18 b(the)j(tar)-5 b(.gz)19 b(v)o(ersion)g(of)h (the)g(package)f(from)g(the)i(website.)f(Mak)o(e)g(sure)g(you)f(ha)n(v) o(e)h(Python)f(2.2)g(or)h(abo)o(v)o(e)f(installed;)h(if)-2 2457 y(no)n(w)-5 b(,)19 b(do)n(wnload)f(and)i(install)g(it)h(from)1134 2457 y SDict begin H.S end 1134 2457 a 1134 2457 a SDict begin 13 H.A end 1134 2457 a 1134 2457 a SDict begin [ /View [/XYZ H.V] /Dest (110) cvn H.B /DEST pdfmark end 1134 2457 a Fm(http://www)-5 b(.p)o(ython.or)o(g/.)15 b(Then)20 b(run)f(these)h(commands:)-2 2558 y SDict begin H.S end -2 2558 a -2 2558 a SDict begin 11.7 H.A end -2 2558 a -2 2558 a SDict begin [ /View [/XYZ H.V] /Dest (111) cvn H.B /DEST pdfmark end -2 2558 a 267 2638 a SDict begin H.S end 267 2638 a 267 2638 a SDict begin 11.7 H.A end 267 2638 a 267 2638 a SDict begin [ /View [/XYZ H.V] /Dest (112) cvn H.B /DEST pdfmark end 267 2638 a Ff(tar)44 b(-zxvf)g(pygopherd-x.y.z.tar.gz)267 2735 y SDict begin H.S end 267 2735 a 267 2735 a SDict begin 11.7 H.A end 267 2735 a 267 2735 a SDict begin [ /View [/XYZ H.V] /Dest (113) cvn H.B /DEST pdfmark end 267 2735 a Ff(cd)g(pygopherd-x.y.z)267 2832 y SDict begin H.S end 267 2832 a 267 2832 a SDict begin 11.7 H.A end 267 2832 a 267 2832 a SDict begin [ /View [/XYZ H.V] /Dest (114) cvn H.B /DEST pdfmark end 267 2832 a Ff(python2.2)f(setup.py)-2 3012 y SDict begin H.S end -2 3012 a -2 3012 a SDict begin 13 H.A end -2 3012 a -2 3012 a SDict begin [ /View [/XYZ H.V] /Dest (115) cvn H.B /DEST pdfmark end -2 3012 a 108 x Fm(Some)20 b(systems)g(will)h(use)773 3120 y SDict begin H.S end 773 3120 a 773 3120 a SDict begin 13 H.A end 773 3120 a 773 3120 a SDict begin [ /View [/XYZ H.V] /Dest (116) cvn H.B /DEST pdfmark end 773 3120 a Fn(python)f Fm(or)1132 3120 y SDict begin H.S end 1132 3120 a 1132 3120 a SDict begin 13 H.A end 1132 3120 a 1132 3120 a SDict begin [ /View [/XYZ H.V] /Dest (117) cvn H.B /DEST pdfmark end 1132 3120 a Fn(python2.3)f Fm(in)i(place)e(of)1877 3120 y SDict begin H.S end 1877 3120 a 1877 3120 a SDict begin 13 H.A end 1877 3120 a 1877 3120 a SDict begin [ /View [/XYZ H.V] /Dest (118) cvn H.B /DEST pdfmark end 1877 3120 a Fn(python2.2)p Fm(.)-2 3179 y SDict begin H.S end -2 3179 a -2 3179 a SDict begin 13 H.A end -2 3179 a -2 3179 a SDict begin [ /View [/XYZ H.V] /Dest (119) cvn H.B /DEST pdfmark end -2 3179 a 90 x Fm(Ne)o(xt,)g(proceed)g(to)h(con\002guration.)e(Mak)o (e)i(sure)g(that)g(the)1688 3269 y SDict begin H.S end 1688 3269 a 1688 3269 a SDict begin 13 H.A end 1688 3269 a 1688 3269 a SDict begin [ /View [/XYZ H.V] /Dest (120) cvn H.B /DEST pdfmark end 1688 3269 a Fg(/etc/pygopherd/pygopherd.conf) c Fm(\002le)21 b(names)f(v)n(alid)f(users)-2 3377 y(\()26 3377 y SDict begin H.S end 26 3377 a 26 3377 a SDict begin 13 H.A end 26 3377 a 26 3377 a SDict begin [ /View [/XYZ H.V] /Dest (121) cvn H.B /DEST pdfmark end 26 3377 a Fm(setuid)g(and)385 3377 y SDict begin H.S end 385 3377 a 385 3377 a SDict begin 13 H.A end 385 3377 a 385 3377 a SDict begin [ /View [/XYZ H.V] /Dest (122) cvn H.B /DEST pdfmark end 385 3377 a Fm(setgid)h(options\))f(and)h(a)g(v)n (alid)g(document)e(root)i(\()1811 3377 y SDict begin H.S end 1811 3377 a 1811 3377 a SDict begin 13 H.A end 1811 3377 a 1811 3377 a SDict begin [ /View [/XYZ H.V] /Dest (123) cvn H.B /DEST pdfmark end 1811 3377 a Fm(root)f(option\).)-2 3437 y SDict begin H.S end -2 3437 a -2 3437 a SDict begin 13 H.A end -2 3437 a -2 3437 a SDict begin [ /View [/XYZ H.V] /Dest (124) cvn H.B /DEST pdfmark end -2 3437 a 90 x Fm(Y)-9 b(ou)19 b(will)i(type)466 3527 y SDict begin H.S end 466 3527 a 466 3527 a SDict begin 13 H.A end 466 3527 a 466 3527 a SDict begin [ /View [/XYZ H.V] /Dest (125) cvn H.B /DEST pdfmark end 466 3527 a Fg(pygopherd)e Fm(to)i(in)m(v)n(ok)o(e)e(the)h(program.)-2 3586 y SDict begin H.S end -2 3586 a -2 3586 a SDict begin 13 H.A end -2 3586 a -2 3586 a SDict begin [ /View [/XYZ H.V] /Dest (INSTALLATION.SINGLE) cvn H.B /DEST pdfmark end -2 3586 a 359 x Fj(Single-Account)32 b(Installation)-2 4046 y SDict begin H.S end -2 4046 a -2 4046 a SDict begin 13 H.A end -2 4046 a -2 4046 a SDict begin [ /View [/XYZ H.V] /Dest (128) cvn H.B /DEST pdfmark end -2 4046 a 79 x Fm(Do)n(wnload)18 b(the)j(tar)-5 b(.gz)19 b(v)o(ersion)g(of)h(the)g(package)f(from)g(the) i(website.)f(Mak)o(e)g(sure)g(you)f(ha)n(v)o(e)h(Python)f(2.2)g(or)h (abo)o(v)o(e)f(installed;)h(if)-2 4233 y(no)n(w)-5 b(,)19 b(do)n(wnload)f(and)i(install)g(it)h(from)1134 4233 y SDict begin H.S end 1134 4233 a 1134 4233 a SDict begin 13 H.A end 1134 4233 a 1134 4233 a SDict begin [ /View [/XYZ H.V] /Dest (129) cvn H.B /DEST pdfmark end 1134 4233 a Fm(http://www)-5 b(.p)o(ython.or)o(g/.)15 b(Then)20 b(run)f(these)h(commands:)-2 4334 y SDict begin H.S end -2 4334 a -2 4334 a SDict begin 11.7 H.A end -2 4334 a -2 4334 a SDict begin [ /View [/XYZ H.V] /Dest (130) cvn H.B /DEST pdfmark end -2 4334 a 267 4413 a SDict begin H.S end 267 4413 a 267 4413 a SDict begin 11.7 H.A end 267 4413 a 267 4413 a SDict begin [ /View [/XYZ H.V] /Dest (131) cvn H.B /DEST pdfmark end 267 4413 a Ff(tar)44 b(-zxvf)g(pygopherd-z.y.z.tar.gz)267 4510 y SDict begin H.S end 267 4510 a 267 4510 a SDict begin 11.7 H.A end 267 4510 a 267 4510 a SDict begin [ /View [/XYZ H.V] /Dest (132) cvn H.B /DEST pdfmark end 267 4510 a Ff(cd)g(pygopherd-x.y.z) -2 4690 y SDict begin H.S end -2 4690 a -2 4690 a SDict begin 13 H.A end -2 4690 a -2 4690 a SDict begin [ /View [/XYZ H.V] /Dest (133) cvn H.B /DEST pdfmark end -2 4690 a 108 x Fm(Modify)268 4798 y SDict begin H.S end 268 4798 a 268 4798 a SDict begin 13 H.A end 268 4798 a 268 4798 a SDict begin [ /View [/XYZ H.V] /Dest (134) cvn H.B /DEST pdfmark end 268 4798 a Fg(conf/pygopherd.conf)17 b Fm(as)k(follo)n(ws:)-2 4816 y SDict begin H.S end -2 4816 a -2 4816 a SDict begin 13 H.A end -2 4816 a -2 4816 a SDict begin [ /View [/XYZ H.V] /Dest (135) cvn H.B /DEST pdfmark end -2 4816 a -2 4858 a SDict begin H.S end -2 4858 a -2 4858 a SDict begin 13 H.A end -2 4858 a -2 4858 a SDict begin [ /View [/XYZ H.V] /Dest (136) cvn H.B /DEST pdfmark end -2 4858 a Black 173 x Fi(\225)p Black 81 5031 a SDict begin H.S end 81 5031 a 81 5031 a SDict begin 13 H.A end 81 5031 a 81 5031 a SDict begin [ /View [/XYZ H.V] /Dest (137) cvn H.B /DEST pdfmark end 81 5031 a Fm(Set)208 5031 y SDict begin H.S end 208 5031 a 208 5031 a SDict begin 13 H.A end 208 5031 a 208 5031 a SDict begin [ /View [/XYZ H.V] /Dest (138) cvn H.B /DEST pdfmark end 208 5031 a Fm(usechroot)d(=)j(no)-2 5032 y SDict begin H.S end -2 5032 a -2 5032 a SDict begin 13 H.A end -2 5032 a -2 5032 a SDict begin [ /View [/XYZ H.V] /Dest (139) cvn H.B /DEST pdfmark end -2 5032 a Black 3842 5569 a Fk(4)p Black eop end %%Page: 5 8 TeXDict begin 5 7 bop -600 -600 a SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end -600 -600 a Black 0 TeXcolorgray -2 -102 a SDict begin H.S end -2 -102 a 0 TeXcolorgray 0 TeXcolorgray -2 -102 a SDict begin H.R end -2 -102 a -2 -102 a SDict begin [ /View [/XYZ H.V] /Dest (page.5) cvn H.B /DEST pdfmark end -2 -102 a Black 3124 -132 a Fk(Chapter)20 b(3.)g(Installation)p Black Black -2 72 a Fi(\225)p Black 81 72 a SDict begin H.S end 81 72 a 81 72 a SDict begin 13 H.A end 81 72 a 81 72 a SDict begin [ /View [/XYZ H.V] /Dest (140) cvn H.B /DEST pdfmark end 81 72 a Fm(Comment)f(out)h(\(add)f(a)i(#)f(sign)g(to)h(the)f (start)g(of)g(the)h(line\))f(the)1882 72 y SDict begin H.S end 1882 72 a 1882 72 a SDict begin 13 H.A end 1882 72 a 1882 72 a SDict begin [ /View [/XYZ H.V] /Dest (141) cvn H.B /DEST pdfmark end 1882 72 a Fm(pid\002le,)2135 72 y SDict begin H.S end 2135 72 a 2135 72 a SDict begin 13 H.A end 2135 72 a 2135 72 a SDict begin [ /View [/XYZ H.V] /Dest (142) cvn H.B /DEST pdfmark end 2135 72 a Fm(setuid,)g(and)2516 72 y SDict begin H.S end 2516 72 a 2516 72 a SDict begin 13 H.A end 2516 72 a 2516 72 a SDict begin [ /View [/XYZ H.V] /Dest (143) cvn H.B /DEST pdfmark end 2516 72 a Fm(setgid)g(lines.)-2 90 y SDict begin H.S end -2 90 a -2 90 a SDict begin 13 H.A end -2 90 a -2 90 a SDict begin [ /View [/XYZ H.V] /Dest (144) cvn H.B /DEST pdfmark end -2 90 a Black 132 x Fi(\225)p Black 81 222 a SDict begin H.S end 81 222 a 81 222 a SDict begin 13 H.A end 81 222 a 81 222 a SDict begin [ /View [/XYZ H.V] /Dest (145) cvn H.B /DEST pdfmark end 81 222 a Fm(Set)208 222 y SDict begin H.S end 208 222 a 208 222 a SDict begin 13 H.A end 208 222 a 208 222 a SDict begin [ /View [/XYZ H.V] /Dest (146) cvn H.B /DEST pdfmark end 208 222 a Fm(root)f(to)h(osomething)f(appropriate.)-2 240 y SDict begin H.S end -2 240 a -2 240 a SDict begin 13 H.A end -2 240 a -2 240 a SDict begin [ /View [/XYZ H.V] /Dest (147) cvn H.B /DEST pdfmark end -2 240 a Black 131 x Fi(\225)p Black 81 371 a SDict begin H.S end 81 371 a 81 371 a SDict begin 13 H.A end 81 371 a 81 371 a SDict begin [ /View [/XYZ H.V] /Dest (148) cvn H.B /DEST pdfmark end 81 371 a Fm(Set)208 371 y SDict begin H.S end 208 371 a 208 371 a SDict begin 13 H.A end 208 371 a 208 371 a SDict begin [ /View [/XYZ H.V] /Dest (149) cvn H.B /DEST pdfmark end 208 371 a Fm(port)g(to)h(a)h(number)d(greater)i (than)f(1024.)-2 431 y SDict begin H.S end -2 431 a -2 431 a SDict begin 13 H.A end -2 431 a -2 431 a SDict begin [ /View [/XYZ H.V] /Dest (150) cvn H.B /DEST pdfmark end -2 431 a 90 x Fm(When)h(you)f(w)o(ant)h(to)h(run)760 521 y SDict begin H.S end 760 521 a 760 521 a SDict begin 13 H.A end 760 521 a 760 521 a SDict begin [ /View [/XYZ H.V] /Dest (151) cvn H.B /DEST pdfmark end 760 521 a Fm(PyGopherd,)d(you)h(will)i(issue)g(the)1784 521 y SDict begin H.S end 1784 521 a 1784 521 a SDict begin 13 H.A end 1784 521 a 1784 521 a SDict begin [ /View [/XYZ H.V] /Dest (152) cvn H.B /DEST pdfmark end 1784 521 a Fn(cd)g Fm(command)d(as)j(abo)o(v)o(e)d(and)i(then)g(type)3011 521 y SDict begin H.S end 3011 521 a 3011 521 a SDict begin 13 H.A end 3011 521 a 3011 521 a SDict begin [ /View [/XYZ H.V] /Dest (153) cvn H.B /DEST pdfmark end 3011 521 a Fn(PYTHONP)-6 b(A)e(TH=.)-2 629 y(bin/pygopherd)p Fm(.)20 b(There)f(is)i(no)f(installation)g(step)g(necessary)-5 b(.)p Black 3842 5569 a Fk(5)p Black eop end %%Page: 6 9 TeXDict begin 6 8 bop -600 -600 a SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end -600 -600 a Black 0 TeXcolorgray -2 -102 a SDict begin H.S end -2 -102 a 0 TeXcolorgray 0 TeXcolorgray -2 -102 a SDict begin H.R end -2 -102 a -2 -102 a SDict begin [ /View [/XYZ H.V] /Dest (page.6) cvn H.B /DEST pdfmark end -2 -102 a Black Black -2 -11 a SDict begin H.S end -2 -11 a -2 -11 a SDict begin 13 H.A end -2 -11 a -2 -11 a SDict begin [ /View [/XYZ H.V] /Dest (CONFIGURATION) cvn H.B /DEST pdfmark end -2 -11 a 119 x Fl(Chapter)44 b(4.)f(Con\002guration)-2 283 y SDict begin H.S end -2 283 a -2 283 a SDict begin 13 H.A end -2 283 a -2 283 a SDict begin [ /View [/XYZ H.V] /Dest (156) cvn H.B /DEST pdfmark end -2 283 a -2 283 a SDict begin H.S end -2 283 a -2 283 a SDict begin 13 H.A end -2 283 a -2 283 a SDict begin [ /View [/XYZ H.V] /Dest (157) cvn H.B /DEST pdfmark end -2 283 a 73 x Fm(PyGopherd)18 b(is)j(re)o(gulated)d(by)i(a)h(con\002guratoin)c(\002le)k(normally)e (stored)g(in)2183 356 y SDict begin H.S end 2183 356 a 2183 356 a SDict begin 13 H.A end 2183 356 a 2183 356 a SDict begin [ /View [/XYZ H.V] /Dest (158) cvn H.B /DEST pdfmark end 2183 356 a Fg(/etc/pygopherd/pygopherd.conf)p Fm(.)c(Y)-9 b(ou)20 b(can)-2 464 y(specify)f(an)h(alternate)g (con\002guration)e(\002le)i(on)g(the)g(command)f(line.)h(The)2144 464 y SDict begin H.S end 2144 464 a 2144 464 a SDict begin 13 H.A end 2144 464 a 2144 464 a SDict begin [ /View [/XYZ H.V] /Dest (159) cvn H.B /DEST pdfmark end 2144 464 a Fm(PyGopherd)e(distrib)n(ution)h(ships)i(with)f(a)h(sample)-2 572 y SDict begin H.S end -2 572 a -2 572 a SDict begin 13 H.A end -2 572 a -2 572 a SDict begin [ /View [/XYZ H.V] /Dest (160) cvn H.B /DEST pdfmark end -2 572 a Fg(pygopherd.conf)d Fm(\002le)j(that)f(thoroughly)d(documents)i(the)h(con\002guration)e (\002le)i(options)g(and)f(settings.)p Black 3840 5569 a Fk(6)p Black eop end %%Page: 7 10 TeXDict begin 7 9 bop -600 -600 a SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end -600 -600 a Black 0 TeXcolorgray -2 -102 a SDict begin H.S end -2 -102 a 0 TeXcolorgray 0 TeXcolorgray -2 -102 a SDict begin H.R end -2 -102 a -2 -102 a SDict begin [ /View [/XYZ H.V] /Dest (page.7) cvn H.B /DEST pdfmark end -2 -102 a Black Black -2 -11 a SDict begin H.S end -2 -11 a -2 -11 a SDict begin 13 H.A end -2 -11 a -2 -11 a SDict begin [ /View [/XYZ H.V] /Dest (HANDLERS) cvn H.B /DEST pdfmark end -2 -11 a 119 x Fl(Chapter)44 b(5.)f(Handlers)-2 283 y SDict begin H.S end -2 283 a -2 283 a SDict begin 13 H.A end -2 283 a -2 283 a SDict begin [ /View [/XYZ H.V] /Dest (163) cvn H.B /DEST pdfmark end -2 283 a -2 283 a SDict begin H.S end -2 283 a -2 283 a SDict begin 13 H.A end -2 283 a -2 283 a SDict begin [ /View [/XYZ H.V] /Dest (164) cvn H.B /DEST pdfmark end -2 283 a 73 x Fm(PyGopherd)18 b(de\002nes)i(se)n(v)o(eral)f(handlers)g(which)h(are)g(responsible)f (for)g(\002nding)h(data)g(on)f(your)g(serv)o(er)h(and)f(presenting)g (it)i(to)f(the)-2 464 y(user)-5 b(.)20 b(The)g(handlers)f(are)h(used)g (to)g(generate)f(things)h(lik)o(e)g(links)h(to)f(other)f(documents)g (and)h(directory)e(listings.)i(The)o(y)g(are)g(also)-2 572 y(responsible)f(for)g(serving)g(up)h(re)o(gular)f(\002les)i(and)f (e)n(v)o(en)f(virtual)g(folders.)-2 631 y SDict begin H.S end -2 631 a -2 631 a SDict begin 13 H.A end -2 631 a -2 631 a SDict begin [ /View [/XYZ H.V] /Dest (165) cvn H.B /DEST pdfmark end -2 631 a 90 x Fm(Handlers)g(are)h(speci\002ed)g (with)h(the)1047 721 y SDict begin H.S end 1047 721 a 1047 721 a SDict begin 13 H.A end 1047 721 a 1047 721 a SDict begin [ /View [/XYZ H.V] /Dest (166) cvn H.B /DEST pdfmark end 1047 721 a Fm(handlers)e(option)g(in)1667 721 y SDict begin H.S end 1667 721 a 1667 721 a SDict begin 13 H.A end 1667 721 a 1667 721 a SDict begin [ /View [/XYZ H.V] /Dest (167) cvn H.B /DEST pdfmark end 1667 721 a Fg(pygopherd.conf)p Fm(.)f(This)j(option)e(is)i(a)f(list)i(of)e (handlers)f(to)h(use.)g(F)o(or)-2 829 y(each)g(request)f(that)h(arri)n (v)o(es,)841 829 y SDict begin H.S end 841 829 a 841 829 a SDict begin 13 H.A end 841 829 a 841 829 a SDict begin [ /View [/XYZ H.V] /Dest (168) cvn H.B /DEST pdfmark end 841 829 a Fm(PyGopherd)d(will)k(ask)g(each)f(handler)e(in)j(turn) e(whether)g(or)h(not)g(it)h(can)f(handle)f(the)h(request,)g(and)f(will) -2 937 y(handle)g(the)h(request)g(according)e(to)i(the)g(\002rst)h (handler)e(that)h(is)h(capable)f(of)g(doing)e(so.)j(If)f(no)g(handlers) f(can)h(handle)f(the)h(request,)f(a)-2 1045 y(\002le)i(not)e(found)g (error)g(is)i(generated.)d(See)j(the)f(e)o(xample)f(con\002guration)e (\002le)k(for)f(an)g(e)o(xample.)-2 1104 y SDict begin H.S end -2 1104 a -2 1104 a SDict begin 13 H.A end -2 1104 a -2 1104 a SDict begin [ /View [/XYZ H.V] /Dest (169) cvn H.B /DEST pdfmark end -2 1104 a 90 x Fm(The)g(remaining)e (parts)i(of)g(this)h(section)f(describe)f(the)h(dif)n(ferent)f (handlers)g(that)h(ship)g(with)2673 1194 y SDict begin H.S end 2673 1194 a 2673 1194 a SDict begin 13 H.A end 2673 1194 a 2673 1194 a SDict begin [ /View [/XYZ H.V] /Dest (170) cvn H.B /DEST pdfmark end 2673 1194 a Fm(PyGopherd.)-2 1212 y SDict begin H.S end -2 1212 a -2 1212 a SDict begin 13 H.A end -2 1212 a -2 1212 a SDict begin [ /View [/XYZ H.V] /Dest (HANDLERS.DIRHANDLER) cvn H.B /DEST pdfmark end -2 1212 a 360 x Fj(dir)-14 b(.DirHandler)-2 1645 y SDict begin H.S end -2 1645 a -2 1645 a SDict begin 13 H.A end -2 1645 a -2 1645 a SDict begin [ /View [/XYZ H.V] /Dest (173) cvn H.B /DEST pdfmark end -2 1645 a 106 x Fm(This)20 b(handler)f(is)i(a)g(basic)f(one)g(that)g(generates)f(menus)h(based)f (on)h(the)g(contents)g(of)g(a)g(directory)-5 b(.)18 b(It)j(is)g(used)f (for)f(directories)h(that)-2 1859 y(contain)f(neither)g(a)572 1859 y SDict begin H.S end 572 1859 a 572 1859 a SDict begin 13 H.A end 572 1859 a 572 1859 a SDict begin [ /View [/XYZ H.V] /Dest (174) cvn H.B /DEST pdfmark end 572 1859 a Fg(gophermap)g Fm(\002le)i(nor)e(UMN-style)h(links)h(\002les,)f (or)g(situations)g(where)g(you)f(ha)n(v)o(e)h(no)g(need)f(for)h(either) f(of)h(those.)-2 1919 y SDict begin H.S end -2 1919 a -2 1919 a SDict begin 13 H.A end -2 1919 a -2 1919 a SDict begin [ /View [/XYZ H.V] /Dest (175) cvn H.B /DEST pdfmark end -2 1919 a 90 x Fm(This)g(handler)f(simply)h(reads)g(the)g (contents)f(of)h(your)f(on-disk)g(directory)-5 b(,)18 b(determines)h(the)h(appropriate)e(types)i(of)g(each)g(\002le,)g(and)-2 2116 y(sends)g(the)g(result)g(to)h(the)f(client.)g(The)g(descriptions)f (of)h(each)g(item)g(are)g(usually)g(set)h(to)f(the)g(\002lename,)g(b)n (ut)g(the)-2 2224 y SDict begin H.S end -2 2224 a -2 2224 a SDict begin 13 H.A end -2 2224 a -2 2224 a SDict begin [ /View [/XYZ H.V] /Dest (176) cvn H.B /DEST pdfmark end -2 2224 a Fm(html.HTMLFileT)m(itleHandler)d(may)j(o)o(v)o (erride)e(that.)-2 2284 y SDict begin H.S end -2 2284 a -2 2284 a SDict begin 13 H.A end -2 2284 a -2 2284 a SDict begin [ /View [/XYZ H.V] /Dest (HANDLERS.BUCKGOPHERMAP) cvn H.B /DEST pdfmark end -2 2284 a 359 x Fj(gophermap.BuckGopherma)o(pHan)o(dler)-2 2744 y SDict begin H.S end -2 2744 a -2 2744 a SDict begin 13 H.A end -2 2744 a -2 2744 a SDict begin [ /View [/XYZ H.V] /Dest (179) cvn H.B /DEST pdfmark end -2 2744 a 79 x Fm(This)i(handler)f(is)i(used)f(to)g(generate)f(directory)g (listings)h(based)g(on)1967 2823 y SDict begin H.S end 1967 2823 a 1967 2823 a SDict begin 13 H.A end 1967 2823 a 1967 2823 a SDict begin [ /View [/XYZ H.V] /Dest (180) cvn H.B /DEST pdfmark end 1967 2823 a Fg(gophermap)f Fm(\002les.)i(It)g(will)f(not)g(read)g(the)g(directory)f(on-disk,)-2 2931 y(instead)h(serving)f(content)g(from)g(the)1088 2931 y SDict begin H.S end 1088 2931 a 1088 2931 a SDict begin 13 H.A end 1088 2931 a 1088 2931 a SDict begin [ /View [/XYZ H.V] /Dest (181) cvn H.B /DEST pdfmark end 1088 2931 a Fg(gophermap)h Fm(\002le)h(only)-5 b(.)18 b(Gophermaps)g(are)i(useful)g(if)g(you)g(w)o(ant)g(to)g(present)g(a)h (directory)d(in)-2 3039 y(which)h(the)i(\002les)g(do)f(not)f (frequently)f(change)h(and)h(there)g(is)h(general)e(information)f(to)i (present.)f(Ov)o(erall,)g(if)i(you)e(only)h(wish)g(to)-2 3146 y(present)f(information)f(particular)h(to)h(certain)g(\002les,)h (you)e(should)g(consider)g(using)h(the)g(abstract)g(feature)f(of)-2 3254 y(UMN.UMNDirHandler)-5 b(.)-2 3297 y SDict begin H.S end -2 3297 a -2 3297 a SDict begin 13 H.A end -2 3297 a -2 3297 a SDict begin [ /View [/XYZ H.V] /Dest (182) cvn H.B /DEST pdfmark end -2 3297 a 107 x Fm(The)148 3404 y SDict begin H.S end 148 3404 a 148 3404 a SDict begin 13 H.A end 148 3404 a 148 3404 a SDict begin [ /View [/XYZ H.V] /Dest (183) cvn H.B /DEST pdfmark end 148 3404 a Fg(gophermap)19 b Fm(\002les)i(contain)e(tw)o(o)i(types)f(of)g (lines,)g(which)g(are)g(described)f(here)g(using)h(the)g(same)g(con)m (v)o(ention)e(normally)g(used)-2 3512 y(for)h(command)g(line)h(ar)o (guments.)e(In)i(this)g(section,)g(the)g(symbol)f(\\t)i(will)g(be)f (used)g(to)h(indicate)e(a)i(tab)f(character)m(,)f(Control-I.)-2 3530 y SDict begin H.S end -2 3530 a -2 3530 a SDict begin 13 H.A end -2 3530 a -2 3530 a SDict begin [ /View [/XYZ H.V] /Dest (184) cvn H.B /DEST pdfmark end -2 3530 a -2 3654 a SDict begin H.S end -2 3654 a -2 3654 a SDict begin 13 H.A end -2 3654 a -2 3654 a SDict begin [ /View [/XYZ H.V] /Dest (185) cvn H.B /DEST pdfmark end -2 3654 a -2 3654 a SDict begin H.S end -2 3654 a -2 3654 a SDict begin 13 H.A end -2 3654 a -2 3654 a SDict begin [ /View [/XYZ H.V] /Dest (186) cvn H.B /DEST pdfmark end -2 3654 a 90 x Fe(full)49 b(line)g(of)g(informational)f(text)-2 3746 y SDict begin H.S end -2 3746 a -2 3746 a SDict begin 13 H.A end -2 3746 a -2 3746 a SDict begin [ /View [/XYZ H.V] /Dest (187) cvn H.B /DEST pdfmark end -2 3746 a -2 3912 a SDict begin H.S end -2 3912 a -2 3912 a SDict begin 13 H.A end -2 3912 a -2 3912 a SDict begin [ /View [/XYZ H.V] /Dest (188) cvn H.B /DEST pdfmark end -2 3912 a -2 3912 a SDict begin H.S end -2 3912 a -2 3912 a SDict begin 13 H.A end -2 3912 a -2 3912 a SDict begin [ /View [/XYZ H.V] /Dest (189) cvn H.B /DEST pdfmark end -2 3912 a 106 x Fe(gophertypeDESCRIPTION)1074 4018 y SDict begin H.S end 1074 4018 a 1074 4018 a SDict begin 13 H.A end 1074 4018 a 1074 4018 a SDict begin [ /View [/XYZ H.V] /Dest (190) cvn H.B /DEST pdfmark end 1074 4018 a 21 w Fm([\\t)1169 4018 y SDict begin H.S end 1169 4018 a 1169 4018 a SDict begin 13 H.A end 1169 4018 a 1169 4018 a SDict begin [ /View [/XYZ H.V] /Dest (191) cvn H.B /DEST pdfmark end 1169 4018 a Fe(selector)1572 4018 y SDict begin H.S end 1572 4018 a 1572 4018 a SDict begin 13 H.A end 1572 4018 a 1572 4018 a SDict begin [ /View [/XYZ H.V] /Dest (192) cvn H.B /DEST pdfmark end 1572 4018 a 19 w Fm([\\t)1665 4018 y SDict begin H.S end 1665 4018 a 1665 4018 a SDict begin 13 H.A end 1665 4018 a 1665 4018 a SDict begin [ /View [/XYZ H.V] /Dest (193) cvn H.B /DEST pdfmark end 1665 4018 a Fe(host)1865 4018 y SDict begin H.S end 1865 4018 a 1865 4018 a SDict begin 13 H.A end 1865 4018 a 1865 4018 a SDict begin [ /View [/XYZ H.V] /Dest (194) cvn H.B /DEST pdfmark end 1865 4018 a 20 w Fm([\\t)1959 4018 y SDict begin H.S end 1959 4018 a 1959 4018 a SDict begin 13 H.A end 1959 4018 a 1959 4018 a SDict begin [ /View [/XYZ H.V] /Dest (195) cvn H.B /DEST pdfmark end 1959 4018 a Fe(port)p Fm(]]])-2 4115 y SDict begin H.S end -2 4115 a -2 4115 a SDict begin 13 H.A end -2 4115 a -2 4115 a SDict begin [ /View [/XYZ H.V] /Dest (196) cvn H.B /DEST pdfmark end -2 4115 a 94 x Fm(Note:)20 b(spaces)g(sho)n(wn)g(abo)o(v)o(e)e(are)j (for)e(clarity)h(only)f(and)h(should)f(not)h(actually)g(be)g(present)f (in)i(your)e(\002le.)-2 4269 y SDict begin H.S end -2 4269 a -2 4269 a SDict begin 13 H.A end -2 4269 a -2 4269 a SDict begin [ /View [/XYZ H.V] /Dest (197) cvn H.B /DEST pdfmark end -2 4269 a 90 x Fm(The)h(informational)d(te)o(xt)j (must)h(not)e(contain)h(an)o(y)f(tab)h(characters,)f(b)n(ut)h(may)g (contain)f(spaces.)i(Informational)c(te)o(xt)j(will)h(be)-2 4467 y(rendered)d(with)i(gopher)f(type)892 4467 y SDict begin H.S end 892 4467 a 892 4467 a SDict begin 13 H.A end 892 4467 a 892 4467 a SDict begin [ /View [/XYZ H.V] /Dest (198) cvn H.B /DEST pdfmark end 892 4467 a Fm(i,)i(which)f (will)g(cause)h(it)g(to)f(be)g(displayed)f(on)h(a)g(client')-5 b(s)21 b(screen)f(at)g(its)i(particular)d(position)g(in)h(the)-2 4574 y(\002le.)-2 4617 y SDict begin H.S end -2 4617 a -2 4617 a SDict begin 13 H.A end -2 4617 a -2 4617 a SDict begin [ /View [/XYZ H.V] /Dest (199) cvn H.B /DEST pdfmark end -2 4617 a 107 x Fm(The)g(second)f(type)h(of)g(line)g (represents)f(a)i(link)f(to)g(a)h(\002le)g(or)e(directory)-5 b(.)18 b(It)j(be)o(gins)e(with)h(a)h(single-character)d(Gopher)h(type)g (\(see)-2 4832 y(Gopher)f(Item)i(T)-7 b(ypes)20 b(belo)n(w\))g(follo)n (wed)e(immediately)h(by)h(a)h(description)d(and)i(a)h(tab)f(character) -5 b(.)19 b(There)g(is)j(no)d(space)h(or)g(other)-2 4940 y(separator)f(between)g(the)h(gopher)f(type)g(and)h(the)g(description.) f(The)h(description)e(may)i(contain)f(spaces)i(b)n(ut)f(not)g(tabs.)p Black 3839 5569 a Fk(7)p Black eop end %%Page: 8 11 TeXDict begin 8 10 bop -600 -600 a SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end -600 -600 a Black 0 TeXcolorgray -2 -102 a SDict begin H.S end -2 -102 a 0 TeXcolorgray 0 TeXcolorgray -2 -102 a SDict begin H.R end -2 -102 a -2 -102 a SDict begin [ /View [/XYZ H.V] /Dest (page.8) cvn H.B /DEST pdfmark end -2 -102 a Black 3199 -132 a Fk(Chapter)20 b(5.)g(Handler)o(s)p Black -2 -11 a SDict begin H.S end -2 -11 a -2 -11 a SDict begin 13 H.A end -2 -11 a -2 -11 a SDict begin [ /View [/XYZ H.V] /Dest (200) cvn H.B /DEST pdfmark end -2 -11 a 83 x Fm(The)g(remaining)e(ar) o(guments)g(are)i(optional,)f(b)n(ut)h(only)f(to)i(the)f(e)o(xtent)f (that)i(ar)o(guments)d(may)i(be)g(omitted)f(only)h(if)g(all)h(ar)o (guments)-2 180 y(after)f(them)f(are)i(also)f(omitted.)f(These)h(ar)o (guments)e(are:)-2 198 y SDict begin H.S end -2 198 a -2 198 a SDict begin 13 H.A end -2 198 a -2 198 a SDict begin [ /View [/XYZ H.V] /Dest (201) cvn H.B /DEST pdfmark end -2 198 a -2 323 a SDict begin H.S end -2 323 a -2 323 a SDict begin 13 H.A end -2 323 a -2 323 a SDict begin [ /View [/XYZ H.V] /Dest (203) cvn H.B /DEST pdfmark end -2 323 a -2 323 a SDict begin H.S end -2 323 a -2 323 a SDict begin 13 H.A end -2 323 a -2 323 a SDict begin [ /View [/XYZ H.V] /Dest (204) cvn H.B /DEST pdfmark end -2 323 a 90 x Fe(selector)-2 415 y SDict begin H.S end -2 415 a -2 415 a SDict begin 13 H.A end -2 415 a -2 415 a SDict begin [ /View [/XYZ H.V] /Dest (205) cvn H.B /DEST pdfmark end -2 415 a Black Black 164 562 a SDict begin H.S end 164 562 a 164 562 a SDict begin 13 H.A end 164 562 a 164 562 a SDict begin [ /View [/XYZ H.V] /Dest (206) cvn H.B /DEST pdfmark end 164 562 a Fm(The)314 562 y SDict begin H.S end 314 562 a 314 562 a SDict begin 13 H.A end 314 562 a 314 562 a SDict begin [ /View [/XYZ H.V] /Dest (207) cvn H.B /DEST pdfmark end 314 562 a Fm(selector)i(is)h(the)f(name)g(of)f(the)i(\002le)f(on)g(the)g(serv)o (er)-5 b(.)20 b(If)g(it)h(be)o(gins)e(with)i(a)f(slash,)h(it)g(is)g(an) f(absolute)f(path;)h(otherwise,)g(it)g(is)164 670 y(interpreted)e (relati)n(v)o(e)i(to)g(the)g(directory)f(that)h(the)g(gophermap)d (\002le)k(is)g(in.)f(If)h(no)e(selector)h(is)h(speci\002ed,)f(the)g (description)f(is)164 778 y(also)h(used)g(as)h(the)f(selector)-5 b(.)-2 862 y SDict begin H.S end -2 862 a -2 862 a SDict begin 13 H.A end -2 862 a -2 862 a SDict begin [ /View [/XYZ H.V] /Dest (209) cvn H.B /DEST pdfmark end -2 862 a -2 862 a SDict begin H.S end -2 862 a -2 862 a SDict begin 13 H.A end -2 862 a -2 862 a SDict begin [ /View [/XYZ H.V] /Dest (210) cvn H.B /DEST pdfmark end -2 862 a 107 x Fe(host)-2 971 y SDict begin H.S end -2 971 a -2 971 a SDict begin 13 H.A end -2 971 a -2 971 a SDict begin [ /View [/XYZ H.V] /Dest (211) cvn H.B /DEST pdfmark end -2 971 a Black Black 164 1119 a SDict begin H.S end 164 1119 a 164 1119 a SDict begin 13 H.A end 164 1119 a 164 1119 a SDict begin [ /View [/XYZ H.V] /Dest (212) cvn H.B /DEST pdfmark end 164 1119 a Fm(The)314 1119 y SDict begin H.S end 314 1119 a 314 1119 a SDict begin 13 H.A end 314 1119 a 314 1119 a SDict begin [ /View [/XYZ H.V] /Dest (213) cvn H.B /DEST pdfmark end 314 1119 a Fm(host)20 b(speci\002es)g(the)h(host)f(on)g(which)f(this)i(resource) e(is)i(located.)e(If)h(not)g(speci\002ed,)g(def)o(aults)g(to)g(the)g (current)f(serv)o(er)-5 b(.)-2 1220 y SDict begin H.S end -2 1220 a -2 1220 a SDict begin 13 H.A end -2 1220 a -2 1220 a SDict begin [ /View [/XYZ H.V] /Dest (215) cvn H.B /DEST pdfmark end -2 1220 a -2 1220 a SDict begin H.S end -2 1220 a -2 1220 a SDict begin 13 H.A end -2 1220 a -2 1220 a SDict begin [ /View [/XYZ H.V] /Dest (216) cvn H.B /DEST pdfmark end -2 1220 a 90 x Fe(port)-2 1323 y SDict begin H.S end -2 1323 a -2 1323 a SDict begin 13 H.A end -2 1323 a -2 1323 a SDict begin [ /View [/XYZ H.V] /Dest (217) cvn H.B /DEST pdfmark end -2 1323 a Black Black 164 1459 a SDict begin H.S end 164 1459 a 164 1459 a SDict begin 13 H.A end 164 1459 a 164 1459 a SDict begin [ /View [/XYZ H.V] /Dest (218) cvn H.B /DEST pdfmark end 164 1459 a Fm(The)314 1459 y SDict begin H.S end 314 1459 a 314 1459 a SDict begin 13 H.A end 314 1459 a 314 1459 a SDict begin [ /View [/XYZ H.V] /Dest (219) cvn H.B /DEST pdfmark end 314 1459 a Fm(port)19 b(speci\002es)i(the)f(port)g(on)f(which)h(the)g(resource)f(is)i (located.)f(If)g(not)f(speci\002ed,)h(def)o(aults)g(to)g(the)g(port)g (the)g(current)164 1567 y(serv)o(er)f(is)i(listening)f(on.)-2 1626 y SDict begin H.S end -2 1626 a -2 1626 a SDict begin 13 H.A end -2 1626 a -2 1626 a SDict begin [ /View [/XYZ H.V] /Dest (220) cvn H.B /DEST pdfmark end -2 1626 a 90 x Fm(An)g(e)o(xample)f(of)h(a)g(gophermap)e(to)i(help)g (illustrate)g(the)g(concept)f(is)i(included)e(with)h(the)2597 1716 y SDict begin H.S end 2597 1716 a 2597 1716 a SDict begin 13 H.A end 2597 1716 a 2597 1716 a SDict begin [ /View [/XYZ H.V] /Dest (221) cvn H.B /DEST pdfmark end 2597 1716 a Fm(PyGopherd)e(distrib)n(ution)h(in)i(the)f(\002le)-2 1824 y SDict begin H.S end -2 1824 a -2 1824 a SDict begin 13 H.A end -2 1824 a -2 1824 a SDict begin [ /View [/XYZ H.V] /Dest (222) cvn H.B /DEST pdfmark end -2 1824 a Fg(examples/gophermap)p Fm(.)-2 1877 y SDict begin H.S end -2 1877 a -2 1877 a SDict begin 13 H.A end -2 1877 a -2 1877 a SDict begin [ /View [/XYZ H.V] /Dest (HANDLERS.COMPRESSEDFILEHANDLER) cvn H.B /DEST pdfmark end -2 1877 a 366 x Fj(\002le.Compr)m (essedFileHandler)-2 2344 y SDict begin H.S end -2 2344 a -2 2344 a SDict begin 13 H.A end -2 2344 a -2 2344 a SDict begin [ /View [/XYZ H.V] /Dest (225) cvn H.B /DEST pdfmark end -2 2344 a 79 x Fm(In)g(order)f(to)h(sa)n(v)o(e)g(space,)g (you)g(might)f(w)o(ant)h(to)h(store)f(documents)e(on-disk)h(in)i(a)f (compressed)f(format.)g(But)h(then)g(clients)h(w)o(ould)-2 2530 y(ordinarily)d(ha)n(v)o(e)i(to)g(decompress)f(the)h(\002les)h (themselv)o(es.)e(It)i(w)o(ould)e(be)h(nice)g(to)h(ha)n(v)o(e)e(the)h (serv)o(er)g(automatically)f(decompress)f(the)-2 2638 y(\002les)j(on)f(the)g(\003y)-5 b(,)20 b(sending)f(that)h(result)g(to)h (the)f(client.)g(That')-5 b(s)20 b(where)2022 2638 y SDict begin H.S end 2022 2638 a 2022 2638 a SDict begin 13 H.A end 2022 2638 a 2022 2638 a SDict begin [ /View [/XYZ H.V] /Dest (226) cvn H.B /DEST pdfmark end 2022 2638 a Fm(\002le.CompressedFileHandler)d(comes)j(in.)-2 2698 y SDict begin H.S end -2 2698 a -2 2698 a SDict begin 13 H.A end -2 2698 a -2 2698 a SDict begin [ /View [/XYZ H.V] /Dest (227) cvn H.B /DEST pdfmark end -2 2698 a 90 x Fm(This)g(handler)f(will)i(tak)o(e)f(compressed)f(\002les,)i (pipe)e(them)h(through)e(your)h(chosen)g(decompression)f(program,)g (and)i(send)g(the)g(result)-2 2896 y(directly)f(to)h(clients)h(--)f (completely)f(transparently)-5 b(.)-2 2955 y SDict begin H.S end -2 2955 a -2 2955 a SDict begin 13 H.A end -2 2955 a -2 2955 a SDict begin [ /View [/XYZ H.V] /Dest (228) cvn H.B /DEST pdfmark end -2 2955 a 90 x Fm(T)e(o)20 b(use)h(this)f(handler)m(,)e(set)j(the)899 3045 y SDict begin H.S end 899 3045 a 899 3045 a SDict begin 13 H.A end 899 3045 a 899 3045 a SDict begin [ /View [/XYZ H.V] /Dest (229) cvn H.B /DEST pdfmark end 899 3045 a Fm(decompressors)d (option)h(in)h(the)g(con\002guration)e(\002le.)i(This)h(option)e (de\002nes)h(a)g(mapping)f(from)-2 3153 y(MIME)g(encodings)g(\(as)h (de\002ned)g(with)g(the)1275 3153 y SDict begin H.S end 1275 3153 a 1275 3153 a SDict begin 13 H.A end 1275 3153 a 1275 3153 a SDict begin [ /View [/XYZ H.V] /Dest (230) cvn H.B /DEST pdfmark end 1275 3153 a Fm(encoding)e(option\))h(to) h(decompression)e(programs.)g(Files)j(that)g(are)f(not)g(encoded,)e(or) -2 3261 y(which)h(ha)n(v)o(e)h(an)g(encoding)e(that)j(does)e(not)h (occur)f(in)i(the)1678 3261 y SDict begin H.S end 1678 3261 a 1678 3261 a SDict begin 13 H.A end 1678 3261 a 1678 3261 a SDict begin [ /View [/XYZ H.V] /Dest (231) cvn H.B /DEST pdfmark end 1678 3261 a Fm(decompressors)d(map,)i(will)h (not)e(be)i(decompressed)d(by)h(this)i(handler)-5 b(.)-2 3321 y SDict begin H.S end -2 3321 a -2 3321 a SDict begin 13 H.A end -2 3321 a -2 3321 a SDict begin [ /View [/XYZ H.V] /Dest (232) cvn H.B /DEST pdfmark end -2 3321 a 89 x Fm(Please)21 b(see)f(the)h(sample)f(con\002guration)d(\002le)k (for)e(more)h(e)o(xamples)f(and)h(details)g(about)f(the)i (con\002guration)c(of)j(this)h(handler)-5 b(.)-2 3470 y SDict begin H.S end -2 3470 a -2 3470 a SDict begin 13 H.A end -2 3470 a -2 3470 a SDict begin [ /View [/XYZ H.V] /Dest (HANDLERS.FILEHANDLER) cvn H.B /DEST pdfmark end -2 3470 a 359 x Fj(\002le.FileHandler)-2 3903 y SDict begin H.S end -2 3903 a -2 3903 a SDict begin 13 H.A end -2 3903 a -2 3903 a SDict begin [ /View [/XYZ H.V] /Dest (235) cvn H.B /DEST pdfmark end -2 3903 a 106 x Fm(The)148 4009 y SDict begin H.S end 148 4009 a 148 4009 a SDict begin 13 H.A end 148 4009 a 148 4009 a SDict begin [ /View [/XYZ H.V] /Dest (236) cvn H.B /DEST pdfmark end 148 4009 a Fm(\002le.FileHandler)19 b(is)i(just)g(that)f(--)g(its)h(duty)f(is)h (to)f(serv)o(e)g(up)g(re)o(gular)e(\002les)j(to)g(clients.)-2 4068 y SDict begin H.S end -2 4068 a -2 4068 a SDict begin 13 H.A end -2 4068 a -2 4068 a SDict begin [ /View [/XYZ H.V] /Dest (HANDLERS.HTMLFILETITLEHANDLER) cvn H.B /DEST pdfmark end -2 4068 a 359 x Fj(html.HTMLFileT)m(itleHandler)-2 4501 y SDict begin H.S end -2 4501 a -2 4501 a SDict begin 13 H.A end -2 4501 a -2 4501 a SDict begin [ /View [/XYZ H.V] /Dest (239) cvn H.B /DEST pdfmark end -2 4501 a 106 x Fm(This)f(handler)f(is)i(used)f(when)g(generating)e(directories)h(and)h (will)g(set)h(the)g(description)d(of)i(HTML)g(\002les)h(to)g(the)f (HTML)g(title)-2 4715 y(de\002ned)f(in)h(them)g(rather)f(than)h(let)h (it)g(be)f(the)g(def)o(ault)g(\002lename.)f(Other)h(than)g(that,)g(it)h (has)f(no)g(ef)n(fect.)f(UMN)i(gopherd)c(implements)-2 4823 y(a)j(similar)h(polic)o(y)-5 b(.)-2 4882 y SDict begin H.S end -2 4882 a -2 4882 a SDict begin 13 H.A end -2 4882 a -2 4882 a SDict begin [ /View [/XYZ H.V] /Dest (HANDLERS.MAILBOXES) cvn H.B /DEST pdfmark end -2 4882 a Black 3842 5569 a Fk(8)p Black eop end %%Page: 9 12 TeXDict begin 9 11 bop -600 -600 a SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end -600 -600 a Black 0 TeXcolorgray -2 -102 a SDict begin H.S end -2 -102 a 0 TeXcolorgray 0 TeXcolorgray -2 -102 a SDict begin H.R end -2 -102 a -2 -102 a SDict begin [ /View [/XYZ H.V] /Dest (page.9) cvn H.B /DEST pdfmark end -2 -102 a Black 3199 -132 a Fk(Chapter)20 b(5.)g(Handler)o(s)p Black -2 88 a Fj(mbox)34 b(handlers)-2 162 y SDict begin H.S end -2 162 a -2 162 a SDict begin 13 H.A end -2 162 a -2 162 a SDict begin [ /View [/XYZ H.V] /Dest (242) cvn H.B /DEST pdfmark end -2 162 a 106 x Fm(There)19 b(are)h(four)f(mailbox)g(handlers:)-2 269 y SDict begin H.S end -2 269 a -2 269 a SDict begin 13 H.A end -2 269 a -2 269 a SDict begin [ /View [/XYZ H.V] /Dest (243) cvn H.B /DEST pdfmark end -2 269 a -2 310 a SDict begin H.S end -2 310 a -2 310 a SDict begin 13 H.A end -2 310 a -2 310 a SDict begin [ /View [/XYZ H.V] /Dest (244) cvn H.B /DEST pdfmark end -2 310 a Black 190 x Fi(\225)p Black 81 500 a SDict begin H.S end 81 500 a 81 500 a SDict begin 13 H.A end 81 500 a 81 500 a SDict begin [ /View [/XYZ H.V] /Dest (245) cvn H.B /DEST pdfmark end 81 500 a Fm(mbox.MaildirF)o(olderHandler)-2 501 y SDict begin H.S end -2 501 a -2 501 a SDict begin 13 H.A end -2 501 a -2 501 a SDict begin [ /View [/XYZ H.V] /Dest (246) cvn H.B /DEST pdfmark end -2 501 a Black 149 x Fi(\225)p Black 81 650 a SDict begin H.S end 81 650 a 81 650 a SDict begin 13 H.A end 81 650 a 81 650 a SDict begin [ /View [/XYZ H.V] /Dest (247) cvn H.B /DEST pdfmark end 81 650 a Fm(mbox.MaildirMessageHandler)-2 668 y SDict begin H.S end -2 668 a -2 668 a SDict begin 13 H.A end -2 668 a -2 668 a SDict begin [ /View [/XYZ H.V] /Dest (248) cvn H.B /DEST pdfmark end -2 668 a Black 131 x Fi(\225)p Black 81 799 a SDict begin H.S end 81 799 a 81 799 a SDict begin 13 H.A end 81 799 a 81 799 a SDict begin [ /View [/XYZ H.V] /Dest (249) cvn H.B /DEST pdfmark end 81 799 a Fm(mbox.MBoxMessageHandler)-2 817 y SDict begin H.S end -2 817 a -2 817 a SDict begin 13 H.A end -2 817 a -2 817 a SDict begin [ /View [/XYZ H.V] /Dest (250) cvn H.B /DEST pdfmark end -2 817 a Black 132 x Fi(\225)p Black 81 949 a SDict begin H.S end 81 949 a 81 949 a SDict begin 13 H.A end 81 949 a 81 949 a SDict begin [ /View [/XYZ H.V] /Dest (251) cvn H.B /DEST pdfmark end 81 949 a Fm(mbox.MBoxF)o(olderHandler)-2 991 y SDict begin H.S end -2 991 a -2 991 a SDict begin 13 H.A end -2 991 a -2 991 a SDict begin [ /View [/XYZ H.V] /Dest (252) cvn H.B /DEST pdfmark end -2 991 a 107 x Fm(These)h(four)f(handlers)g(pro)o(vide)f(a)j(unique)d("virtual)i (folder")f(service.)g(The)o(y)g(allo)n(w)i(you)e(to)h(present)g (mailbox)o(es)f(as)h(if)h(the)o(y)e(were)-2 1206 y(folders,)f(the)i (items)f(of)h(the)f(folders)g(being)f(the)i(messages)f(in)h(the)f (mailbox,)f(or)o(ganized)f(by)i(subject.)g(This)g(is)i(useful)e(for)f (presenting)-2 1314 y(mail)i(archi)n(v)o(es)f(or)h(just)h(making)e (e-mail)h(accessible)g(in)g(a)h(nice)f(and)f(easy)i(f)o(ashion.)-2 1374 y SDict begin H.S end -2 1374 a -2 1374 a SDict begin 13 H.A end -2 1374 a -2 1374 a SDict begin [ /View [/XYZ H.V] /Dest (253) cvn H.B /DEST pdfmark end -2 1374 a 89 x Fm(T)-7 b(o)20 b(use)h(these)f(handlers,)f(all)h(you)g(ha)n(v)o (e)f(to)i(do)e(is)j(enable)d(them)h(in)g(your)2121 1463 y SDict begin H.S end 2121 1463 a 2121 1463 a SDict begin 13 H.A end 2121 1463 a 2121 1463 a SDict begin [ /View [/XYZ H.V] /Dest (254) cvn H.B /DEST pdfmark end 2121 1463 a Fm(handlers)f(section.)h(The)o(y)f(will)i(automatically)e (detect)-2 1571 y(requests)h(for)f(mailbox)o(es)g(and)h(handle)f(them)g (appropriately)-5 b(.)-2 1631 y SDict begin H.S end -2 1631 a -2 1631 a SDict begin 13 H.A end -2 1631 a -2 1631 a SDict begin [ /View [/XYZ H.V] /Dest (255) cvn H.B /DEST pdfmark end -2 1631 a 90 x Fm(The)20 b(dif)n(ferent)e(handlers)h (are)h(for)g(traditional)f(Unix)h(mbox)f(mailbox)o(es)f(\(all)j (messages)f(in)g(a)h(single)f(\002le\))h(and)e(ne)n(w)h(qmail-stype)-2 1829 y(Maildir)g(mailbox)o(es.)e(Y)-9 b(ou)20 b(can)g(enable)f(only)h (the)g(tw)o(o)g(handlers)f(for)h(the)g(speci\002c)g(mailbox)f(type)h (that)g(you)g(use,)g(if)g(desired.)-2 1888 y SDict begin H.S end -2 1888 a -2 1888 a SDict begin 13 H.A end -2 1888 a -2 1888 a SDict begin [ /View [/XYZ H.V] /Dest (HANDLERS.PYGHANDLER) cvn H.B /DEST pdfmark end -2 1888 a 359 x Fj(pyg)n(.PYGHandler)-2 2348 y SDict begin H.S end -2 2348 a -2 2348 a SDict begin 13 H.A end -2 2348 a -2 2348 a SDict begin [ /View [/XYZ H.V] /Dest (258) cvn H.B /DEST pdfmark end -2 2348 a 79 x Fm(PYG)g(\(short)g(for)f(PYGopherd\))f(is)j(a)f(mechanism)f (that)h(pro)o(vides)e(a)i(tremendous)e(amount)h(of)h(\003e)o(xibility) -5 b(.)18 b(Rather)i(than)f(just)i(letting)-2 2535 y(you)e(e)o(x)o (ecute)g(a)h(script)h(lik)o(e)f(other)g(Gopher)e(or)i(HTTP)g(serv)o (ers,)g(PYGs)h(are)f(actually)g(loaded)f(up)h(into)f(PyGopherd)f(and)i (become)-2 2643 y(fully-capable)e(\002rst-class)j(virtual)e(handlers.)g (Y)-8 b(et)20 b(the)o(y)g(need)f(not)h(be)g(kno)n(wn)f(ahead)g(of)h (time,)g(and)g(are)g(loaded)f(dynamically)-5 b(.)-2 2702 y SDict begin H.S end -2 2702 a -2 2702 a SDict begin 13 H.A end -2 2702 a -2 2702 a SDict begin [ /View [/XYZ H.V] /Dest (259) cvn H.B /DEST pdfmark end -2 2702 a 90 x Fm(W)m(ith)20 b(a)h(PYG)g(handler)m(,)d(you)h(can)h(generate)f (gopher)f(directories,)h(handle)g(searches,)h(generate)f(\002les,)i (and)f(more)f(on)h(the)g(\003y)-5 b(.)20 b(Y)-9 b(ou)-2 2900 y(can)20 b(create)g(entire)f(virtual)h(directory)e(trees)j(\(for)e (instance,)h(to)g(interf)o(ace)f(with)i(NNTP)f(serv)o(ers)g(or)g(with)g (DICT)h(serv)o(ers\),)e(and)-2 3008 y(access)h(them)g(all)h(using)e (the)h(standard)f(Gopher)g(protocol.)f(All)j(of)f(this)g(without)g(ha)n (ving)f(to)h(modify)e(e)n(v)o(en)h(one)h(line)g(of)3505 3008 y SDict begin H.S end 3505 3008 a 3505 3008 a SDict begin 13 H.A end 3505 3008 a 3505 3008 a SDict begin [ /View [/XYZ H.V] /Dest (260) cvn H.B /DEST pdfmark end 3505 3008 a Fm(PyGopherd)-2 3116 y(code.)-2 3158 y SDict begin H.S end -2 3158 a -2 3158 a SDict begin 13 H.A end -2 3158 a -2 3158 a SDict begin [ /View [/XYZ H.V] /Dest (261) cvn H.B /DEST pdfmark end -2 3158 a 108 x Fm(If)g(enabled,)f(the)496 3266 y SDict begin H.S end 496 3266 a 496 3266 a SDict begin 13 H.A end 496 3266 a 496 3266 a SDict begin [ /View [/XYZ H.V] /Dest (262) cvn H.B /DEST pdfmark end 496 3266 a Fm(p)o(yg.PYGHandler)e(will)k(look)f (for)f(\002les)i(with)g(the)f(e)o(xtension)f(.p)o(yg)g(that)h(are)g (mark)o(ed)f(e)o(x)o(ecutable.)f(If)i(found,)f(the)o(y)-2 3374 y(will)i(be)f(loaded)f(and)h(run)f(as)i(PYGs.)-2 3416 y SDict begin H.S end -2 3416 a -2 3416 a SDict begin 13 H.A end -2 3416 a -2 3416 a SDict begin [ /View [/XYZ H.V] /Dest (263) cvn H.B /DEST pdfmark end -2 3416 a 107 x Fm(Please)g(note:)e(this)i(module)e(pro)o(vides)f(the)j (capability)e(to)h(e)o(x)o(ecute)f(arbitrary)g(code.)g(Please)i (consider)e(the)h(security)g(rami\002cations)-2 3631 y(of)g(that)g(before)f(enabling)f(it.)-2 3690 y SDict begin H.S end -2 3690 a -2 3690 a SDict begin 13 H.A end -2 3690 a -2 3690 a SDict begin [ /View [/XYZ H.V] /Dest (264) cvn H.B /DEST pdfmark end -2 3690 a 90 x Fm(See)i(the)261 3780 y SDict begin H.S end 261 3780 a 261 3780 a SDict begin 13 H.A end 261 3780 a 261 3780 a SDict begin [ /View [/XYZ H.V] /Dest (265) cvn H.B /DEST pdfmark end 261 3780 a Fm(virtual.V)-5 b(irtual)18 b(handler)h(for)g(more)h (information)e(about)h(passing)h(data)g(to)g(your)f(scripts)h(at)h (runtime.)-2 3840 y SDict begin H.S end -2 3840 a -2 3840 a SDict begin 13 H.A end -2 3840 a -2 3840 a SDict begin [ /View [/XYZ H.V] /Dest (266) cvn H.B /DEST pdfmark end -2 3840 a 90 x Fm(At)g(present,)e(documentation)e(on)j(writing)f (PYGs)j(is)f(not)f(pro)o(vides,)e(b)n(ut)i(you)f(may)h(\002nd)g(e)o (xamples)f(in)h(the)3134 3930 y SDict begin H.S end 3134 3930 a 3134 3930 a SDict begin 13 H.A end 3134 3930 a 3134 3930 a SDict begin [ /View [/XYZ H.V] /Dest (267) cvn H.B /DEST pdfmark end 3134 3930 a Fm(p)o(ygf)o(arm)f(directory)-2 4038 y(included)f(with)j(the)595 4038 y SDict begin H.S end 595 4038 a 595 4038 a SDict begin 13 H.A end 595 4038 a 595 4038 a SDict begin [ /View [/XYZ H.V] /Dest (268) cvn H.B /DEST pdfmark end 595 4038 a Fm(PyGopherd)d(distrib)n (ution.)-2 4097 y SDict begin H.S end -2 4097 a -2 4097 a SDict begin 13 H.A end -2 4097 a -2 4097 a SDict begin [ /View [/XYZ H.V] /Dest (HANDLERS.EXECHANDLER) cvn H.B /DEST pdfmark end -2 4097 a 359 x Fj(scriptexec.ExecHandler)-2 4557 y SDict begin H.S end -2 4557 a -2 4557 a SDict begin 13 H.A end -2 4557 a -2 4557 a SDict begin [ /View [/XYZ H.V] /Dest (271) cvn H.B /DEST pdfmark end -2 4557 a 79 x Fm(This)i(handler)f(implements)g("old-style")g(script)h(e)o(x)o (ecution;)f(that)h(is,)h(e)o(x)o(ecuting)d(arbitrary)g(programs)h(and)g (piping)g(the)h(result)h(to)-2 4744 y(the)f(client.)g(It)g(is,)h(for)f (the)g(most)g(part,)g(compatible)f(with)h(both)f(scripts)i(written)f (for)f(UMN)i(gopherd)d(and)h(the)h(Bucktooth)f(gopher)-2 4852 y(serv)o(er)-5 b(.)19 b(If)h(enabled,)f(it)i(will)g(e)o(x)o(ecute) e(an)o(y)g(\002le)i(that)f(is)h(mark)o(ed)e(e)o(x)o(ecutable)g(in)h (the)g(\002lesystem.)g(It)h(will)g(normally)d(list)k(scripts)e(as)-2 4960 y(returning)e(plain)i(te)o(xt,)f(b)n(ut)i(you)e(may)h(create)g(a)g (custom)g(link)g(to)g(the)g(script)h(that)f(de\002nes)g(it)h(as)g (returning)d(whate)n(v)o(er)g(kind)i(of)g(\002le)-2 5068 y(you)f(desire.)h(Unlik)o(e)g(PYGs,)h(this)f(type)g(must)g(be)g(kno)n (wn)f(in)h(adv)n(ance.)p Black 3842 5569 a Fk(9)p Black eop end %%Page: 10 13 TeXDict begin 10 12 bop -600 -600 a SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end -600 -600 a Black 0 TeXcolorgray -2 -102 a SDict begin H.S end -2 -102 a 0 TeXcolorgray 0 TeXcolorgray -2 -102 a SDict begin H.R end -2 -102 a -2 -102 a SDict begin [ /View [/XYZ H.V] /Dest (page.10) cvn H.B /DEST pdfmark end -2 -102 a Black -2 -201 a SDict begin H.S end -2 -201 a -2 -201 a SDict begin 13 H.A end -2 -201 a -2 -201 a SDict begin [ /View [/XYZ H.V] /Dest (322) cvn H.B /DEST pdfmark end -2 -201 a 3199 -132 a Fk(Chapter)20 b(5.)g(Handler)o(s)p Black -2 -11 a SDict begin H.S end -2 -11 a -2 -11 a SDict begin 13 H.A end -2 -11 a -2 -11 a SDict begin [ /View [/XYZ H.V] /Dest (272) cvn H.B /DEST pdfmark end -2 -11 a 83 x Fm(The)148 72 y SDict begin H.S end 148 72 a 148 72 a SDict begin 13 H.A end 148 72 a 148 72 a SDict begin [ /View [/XYZ H.V] /Dest (273) cvn H.B /DEST pdfmark end 148 72 a Fm(scripte)o(x)o (ec.Ex)o(ecHandler)15 b(will)21 b(set)g(en)m(vironment)c(v)n(ariables)j (for)f(your)g(scripts)i(to)f(use.)g(The)o(y)f(are)i(as)f(follo)n(ws:)-2 90 y SDict begin H.S end -2 90 a -2 90 a SDict begin 13 H.A end -2 90 a -2 90 a SDict begin [ /View [/XYZ H.V] /Dest (274) cvn H.B /DEST pdfmark end -2 90 a -2 215 a SDict begin H.S end -2 215 a -2 215 a SDict begin 13 H.A end -2 215 a -2 215 a SDict begin [ /View [/XYZ H.V] /Dest (276) cvn H.B /DEST pdfmark end -2 215 a 90 x Fm(SER)-7 b(VER_N)m(AME)-2 315 y SDict begin H.S end -2 315 a -2 315 a SDict begin 13 H.A end -2 315 a -2 315 a SDict begin [ /View [/XYZ H.V] /Dest (277) cvn H.B /DEST pdfmark end -2 315 a Black Black 164 454 a SDict begin H.S end 164 454 a 164 454 a SDict begin 13 H.A end 164 454 a 164 454 a SDict begin [ /View [/XYZ H.V] /Dest (278) cvn H.B /DEST pdfmark end 164 454 a Fm(The)20 b(name)f(of)h(this)h(serv)o (er)e(as)i(de\002ned)e(in)i(the)f(con\002guration)d(\002le)k(or)f (detected)f(from)h(the)g(operating)e(system.)-2 555 y SDict begin H.S end -2 555 a -2 555 a SDict begin 13 H.A end -2 555 a -2 555 a SDict begin [ /View [/XYZ H.V] /Dest (280) cvn H.B /DEST pdfmark end -2 555 a 90 x Fm(SER)-7 b(VER_POR)i(T)-2 655 y SDict begin H.S end -2 655 a -2 655 a SDict begin 13 H.A end -2 655 a -2 655 a SDict begin [ /View [/XYZ H.V] /Dest (281) cvn H.B /DEST pdfmark end -2 655 a Black Black 164 795 a SDict begin H.S end 164 795 a 164 795 a SDict begin 13 H.A end 164 795 a 164 795 a SDict begin [ /View [/XYZ H.V] /Dest (282) cvn H.B /DEST pdfmark end 164 795 a Fm(The)20 b(port)f(this)i(serv)o(er)e (is)i(listening)f(on.)-2 896 y SDict begin H.S end -2 896 a -2 896 a SDict begin 13 H.A end -2 896 a -2 896 a SDict begin [ /View [/XYZ H.V] /Dest (284) cvn H.B /DEST pdfmark end -2 896 a 90 x Fm(REMO)m(TE_ADDR)-2 996 y SDict begin H.S end -2 996 a -2 996 a SDict begin 13 H.A end -2 996 a -2 996 a SDict begin [ /View [/XYZ H.V] /Dest (285) cvn H.B /DEST pdfmark end -2 996 a Black Black 164 1135 a SDict begin H.S end 164 1135 a 164 1135 a SDict begin 13 H.A end 164 1135 a 164 1135 a SDict begin [ /View [/XYZ H.V] /Dest (286) cvn H.B /DEST pdfmark end 164 1135 a Fm(The)g(IP)g(address)g(of)g(the)g(client.)-2 1219 y SDict begin H.S end -2 1219 a -2 1219 a SDict begin 13 H.A end -2 1219 a -2 1219 a SDict begin [ /View [/XYZ H.V] /Dest (288) cvn H.B /DEST pdfmark end -2 1219 a 107 x Fm(REMO)m(TE_POR)-5 b(T)-2 1336 y SDict begin H.S end -2 1336 a -2 1336 a SDict begin 13 H.A end -2 1336 a -2 1336 a SDict begin [ /View [/XYZ H.V] /Dest (289) cvn H.B /DEST pdfmark end -2 1336 a Black Black 164 1476 a SDict begin H.S end 164 1476 a 164 1476 a SDict begin 13 H.A end 164 1476 a 164 1476 a SDict begin [ /View [/XYZ H.V] /Dest (290) cvn H.B /DEST pdfmark end 164 1476 a Fm(The)20 b(port)f(number)g(of)g(the)i(client.)-2 1577 y SDict begin H.S end -2 1577 a -2 1577 a SDict begin 13 H.A end -2 1577 a -2 1577 a SDict begin [ /View [/XYZ H.V] /Dest (292) cvn H.B /DEST pdfmark end -2 1577 a 90 x Fm(REMO)m(TE_HOST)-2 1677 y SDict begin H.S end -2 1677 a -2 1677 a SDict begin 13 H.A end -2 1677 a -2 1677 a SDict begin [ /View [/XYZ H.V] /Dest (293) cvn H.B /DEST pdfmark end -2 1677 a Black Black 164 1816 a SDict begin H.S end 164 1816 a 164 1816 a SDict begin 13 H.A end 164 1816 a 164 1816 a SDict begin [ /View [/XYZ H.V] /Dest (294) cvn H.B /DEST pdfmark end 164 1816 a Fm(The)f(same)g(v)n(alue)g(as)793 1816 y SDict begin H.S end 793 1816 a 793 1816 a SDict begin 13 H.A end 793 1816 a 793 1816 a SDict begin [ /View [/XYZ H.V] /Dest (295) cvn H.B /DEST pdfmark end 793 1816 a Fm(REMO)m(TE_ADDR)-2 1909 y SDict begin H.S end -2 1909 a -2 1909 a SDict begin 13 H.A end -2 1909 a -2 1909 a SDict begin [ /View [/XYZ H.V] /Dest (297) cvn H.B /DEST pdfmark end -2 1909 a 98 x Fm(SELECT)o(OR)-2 2008 y SDict begin H.S end -2 2008 a -2 2008 a SDict begin 13 H.A end -2 2008 a -2 2008 a SDict begin [ /View [/XYZ H.V] /Dest (298) cvn H.B /DEST pdfmark end -2 2008 a Black Black 164 2156 a SDict begin H.S end 164 2156 a 164 2156 a SDict begin 13 H.A end 164 2156 a 164 2156 a SDict begin [ /View [/XYZ H.V] /Dest (299) cvn H.B /DEST pdfmark end 164 2156 a Fm(The)g(\002le)h (that)f(w)o(as)h(requested;)e(that)h(is,)h(the)f(relati)n(v)o(e)g(path) f(to)i(this)f(script.)g(If)g(the)h(selector)f(included)e(additional)h (parameters)164 2264 y(after)h(a)g(|,)g(the)o(y)g(will)h(be)f(included) f(in)h(this)h(string)f(as)g(well.)-2 2365 y SDict begin H.S end -2 2365 a -2 2365 a SDict begin 13 H.A end -2 2365 a -2 2365 a SDict begin [ /View [/XYZ H.V] /Dest (301) cvn H.B /DEST pdfmark end -2 2365 a 90 x Fm(REQ)o(UEST)-2 2470 y SDict begin H.S end -2 2470 a -2 2470 a SDict begin 13 H.A end -2 2470 a -2 2470 a SDict begin [ /View [/XYZ H.V] /Dest (302) cvn H.B /DEST pdfmark end -2 2470 a Black Black 164 2605 a SDict begin H.S end 164 2605 a 164 2605 a SDict begin 13 H.A end 164 2605 a 164 2605 a SDict begin [ /View [/XYZ H.V] /Dest (303) cvn H.B /DEST pdfmark end 164 2605 a Fm(The)g("base")g(part)g(of)f(the)i(selector;)f (that)g(is,)h(the)f(part)g(leading)f(up)h(to)g(the)g(|.)-2 2706 y SDict begin H.S end -2 2706 a -2 2706 a SDict begin 13 H.A end -2 2706 a -2 2706 a SDict begin [ /View [/XYZ H.V] /Dest (305) cvn H.B /DEST pdfmark end -2 2706 a 90 x Fm(SEARCHREQ)o(UEST)-2 2811 y SDict begin H.S end -2 2811 a -2 2811 a SDict begin 13 H.A end -2 2811 a -2 2811 a SDict begin [ /View [/XYZ H.V] /Dest (306) cvn H.B /DEST pdfmark end -2 2811 a Black Black 164 2945 a SDict begin H.S end 164 2945 a 164 2945 a SDict begin 13 H.A end 164 2945 a 164 2945 a SDict begin [ /View [/XYZ H.V] /Dest (307) cvn H.B /DEST pdfmark end 164 2945 a Fm(Included)e(only)h(if)i(the)f(client)g(speci\002ed)g(search)g (data,)g(this)h(is)g(used)f(if)g(the)g(client)h(is)g(searching)e(for)g (something.)-2 3005 y SDict begin H.S end -2 3005 a -2 3005 a SDict begin 13 H.A end -2 3005 a -2 3005 a SDict begin [ /View [/XYZ H.V] /Dest (308) cvn H.B /DEST pdfmark end -2 3005 a 89 x Fm(See)h(the)261 3094 y SDict begin H.S end 261 3094 a 261 3094 a SDict begin 13 H.A end 261 3094 a 261 3094 a SDict begin [ /View [/XYZ H.V] /Dest (309) cvn H.B /DEST pdfmark end 261 3094 a Fm(virtual.V)-5 b(irtual)18 b(handler)h(for)g(more)h(information)e(about)h(passing)h (data)g(to)g(your)f(scripts)h(at)h(runtime.)-2 3154 y SDict begin H.S end -2 3154 a -2 3154 a SDict begin 13 H.A end -2 3154 a -2 3154 a SDict begin [ /View [/XYZ H.V] /Dest (310) cvn H.B /DEST pdfmark end -2 3154 a 90 x Fm(Please)g(note:)e(this)i(module)e(pro)o(vides)f(the)j(capability)e (to)h(e)o(x)o(ecute)f(arbitrary)g(code.)g(Please)i(consider)e(the)h (security)g(rami\002cations)-2 3352 y(of)g(that)g(before)f(enabling)f (it.)-2 3411 y SDict begin H.S end -2 3411 a -2 3411 a SDict begin 13 H.A end -2 3411 a -2 3411 a SDict begin [ /View [/XYZ H.V] /Dest (HANDLERS.UMN) cvn H.B /DEST pdfmark end -2 3411 a 359 x Fj(UMN.UMNDirHandler)-2 3844 y SDict begin H.S end -2 3844 a -2 3844 a SDict begin 13 H.A end -2 3844 a -2 3844 a SDict begin [ /View [/XYZ H.V] /Dest (313) cvn H.B /DEST pdfmark end -2 3844 a 106 x Fm(This)i(is)h(one)f (of)g(the)g(most)g(po)n(werful)f(w)o(orkhorse)f(handlers)h(in)1853 3950 y SDict begin H.S end 1853 3950 a 1853 3950 a SDict begin 13 H.A end 1853 3950 a 1853 3950 a SDict begin [ /View [/XYZ H.V] /Dest (314) cvn H.B /DEST pdfmark end 1853 3950 a Fm(PyGopherd.)f(It)j(is)g(designed)e(to)h(emulate)f(most) i(of)f(the)g(w)o(ays)g(in)-2 4058 y(which)f(the)i(UMN)f(gopherd)e (distrib)n(ution)h(generates)g(directories,)g(e)n(v)o(en)g(going)g(so)i (f)o(ar)f(as)h(to)f(be)g(b)n(ug-compatible)d(in)k(some)f(cases.)-2 4166 y(Generating)e(directories)i(with)g(this)h(handler)d(is)k(often)d (the)h(best)h(general-purpose)16 b(w)o(ay)k(to)h(mak)o(e)e(nice)i (directories)e(in)-2 4274 y(gopherspace.)-2 4333 y SDict begin H.S end -2 4333 a -2 4333 a SDict begin 13 H.A end -2 4333 a -2 4333 a SDict begin [ /View [/XYZ H.V] /Dest (315) cvn H.B /DEST pdfmark end -2 4333 a 90 x Fm(The)h(remainder) e(of)i(the)g(description)f(of)h(the)1319 4423 y SDict begin H.S end 1319 4423 a 1319 4423 a SDict begin 13 H.A end 1319 4423 a 1319 4423 a SDict begin [ /View [/XYZ H.V] /Dest (316) cvn H.B /DEST pdfmark end 1319 4423 a Fm(UMN.UMNDirHandler,)e(e)o(xcept)h(for)g(the)i(Abstracts)f(and)g (Info)f(section,)g(is)i(lifted)-2 4531 y(directly)e(from)g(the)h (original)g(UMN)g(gopherd)e(documentation,)f(with)j(light)g(editing,)f (because)h(this)h(handler)d(implements)h(it)i(so)-2 4639 y(e)o(xactly)e(that)h(there)g(w)o(as)h(no)f(point)f(in)i(re)n(writing)e (all)h(that)h(documentation)c(:-\))-2 4657 y SDict begin H.S end -2 4657 a -2 4657 a SDict begin 13 H.A end -2 4657 a -2 4657 a SDict begin [ /View [/XYZ H.V] /Dest (HANDLERS.UMN.LINKS) cvn H.B /DEST pdfmark end -2 4657 a Black 3800 5569 a Fk(10)p Black eop end %%Page: 11 14 TeXDict begin 11 13 bop -600 -600 a SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end -600 -600 a Black 0 TeXcolorgray -2 -102 a SDict begin H.S end -2 -102 a 0 TeXcolorgray 0 TeXcolorgray -2 -102 a SDict begin H.R end -2 -102 a -2 -102 a SDict begin [ /View [/XYZ H.V] /Dest (page.11) cvn H.B /DEST pdfmark end -2 -102 a Black 3199 -132 a Fk(Chapter)20 b(5.)g(Handler)o(s)p Black -2 72 a Fd(Links)-2 134 y SDict begin H.S end -2 134 a -2 134 a SDict begin 13 H.A end -2 134 a -2 134 a SDict begin [ /View [/XYZ H.V] /Dest (319) cvn H.B /DEST pdfmark end -2 134 a 106 x Fm(Y)-9 b(ou)19 b(can)h(o)o(v)o(erride)e(the)i(def)o(ault)g(vie)n(w)g (of)g(a)h(directory)d(as)j(generated)d(by)2141 240 y SDict begin H.S end 2141 240 a 2141 240 a SDict begin 13 H.A end 2141 240 a 2141 240 a SDict begin [ /View [/XYZ H.V] /Dest (320) cvn H.B /DEST pdfmark end 2141 240 a Fm(dir)-5 b(.DirHandler)18 b(by)i(creating)f(what)h(are)h(kno)n(wn)d (as)3679 240 y SDict begin H.S end 3679 240 a 3679 240 a SDict begin 13 H.A end 3679 240 a 3679 240 a SDict begin [ /View [/XYZ H.V] /Dest (321) cvn H.B /DEST pdfmark end 3679 240 a Fk(Links)-2 348 y Fm(in)i(the)g(data)g(tree.)-2 498 y(The)g(ability)g(to)g(mak)o(e)g(links)g(to)g(other)g(hosts)g(is)h (ho)n(w)f(gopher)e(distrib)n(utes)i(itself)h(among)e(multiple)g(hosts.) h(There)g(are)g(tw)o(o)g(dif)n(ferent)-2 605 y(w)o(ays)g(to)h(mak)o(e)e (a)i(link.)f(The)g(\002rst)g(and)g(simplest)h(is)g(to)f(create)g(a)h (link)f(\002le)g(that)h(contains)e(the)h(data)h(needed)d(by)i(the)g (serv)o(er)-5 b(.)20 b(By)-2 713 y(def)o(ault)f(all)i(\002les)g(in)g (the)f(gopher)e(data)i(directory)f(starting)g(with)i(a)f(period)f(are)h (tak)o(en)g(to)g(be)h(link)f(\002les.)g(A)h(link)f(\002le)h(can)f (contain)-2 821 y(multiple)f(links.)h(T)-7 b(o)21 b(de\002ne)e(a)i (link)f(you)f(need)h(to)g(put)g(\002)n(v)o(e)g(lines)g(in)h(a)f(link)g (\002le)h(that)f(de\002ne)g(the)g(needed)f(characteristics)h(for)f(the) -2 929 y(document.)f(Here)i(is)h(an)f(e)o(xample)f(of)h(a)g(link.)-2 1030 y SDict begin H.S end -2 1030 a -2 1030 a SDict begin 11.7 H.A end -2 1030 a -2 1030 a SDict begin [ /View [/XYZ H.V] /Dest (323) cvn H.B /DEST pdfmark end -2 1030 a 79 x Fg(Name=Cheese)43 b(Ball)h(Recipes)-2 1207 y(Numb=1)-2 1304 y(Type=1)-2 1401 y(Port=150)-2 1498 y(Path=1/Moo/Cheesy)-2 1595 y(Host=zippy.micro.umn.edu)-2 1775 y SDict begin H.S end -2 1775 a -2 1775 a SDict begin 13 H.A end -2 1775 a -2 1775 a SDict begin [ /View [/XYZ H.V] /Dest (324) cvn H.B /DEST pdfmark end -2 1775 a 108 x Fm(The)20 b(Name=)f(line)i(is)g(what)f(the)g(user)g(will)h(see)g(when)f(cruising) f(through)f(the)i(database.)f(In)h(this)h(case)g(the)f(name)f(is)j ("Cheese)e(Ball)-2 1991 y(Recipes".)g(The)g("T)-7 b(ype=")19 b(de\002nes)h(what)g(kind)g(of)g(document)e(this)i(object)g(is.)h(F)o (or)f(a)g(list)i(of)e(all)g(de\002ned)g(types,)f(see)i(Gopher)e(Item)-2 2099 y(T)-7 b(ypes)20 b(belo)n(w)-5 b(.)19 b(F)o(or)h(Gopher+)e(and)i (HTTP)-9 b(,)20 b(a)g(MIME)g(type)g(is)h(also)f(used,)g(which)g(is)h (determined)d(automatically)h(based)h(on)f(the)-2 2207 y(type)g(you)h(specify)-5 b(.)-2 2266 y SDict begin H.S end -2 2266 a -2 2266 a SDict begin 13 H.A end -2 2266 a -2 2266 a SDict begin [ /View [/XYZ H.V] /Dest (325) cvn H.B /DEST pdfmark end -2 2266 a 90 x Fm(The)20 b("P)o(ath=")f (line)i(contains)e(the)h(selector)g(string)g(that)g(the)h(client)f (will)h(use)f(to)h(retrie)n(v)o(e)d(the)j(actual)f(document.)e(The)i (Numb=)-2 2464 y(speci\002es)g(that)h(this)f(entry)g(should)f(be)h (presented)f(\002rst)i(in)f(the)g(directory)f(list)i(\(instead)f(of)g (being)f(alphabetized\).)f(The)i("Numb=")-2 2572 y(line)g(is)h (optional.)e(If)h(it)h(is)g(present)e(it)i(cannot)e(be)i(the)f(last)h (line)f(of)g(the)g(link.)g(The)g("Port=")g(and)f("Host=")h(lines)h (specify)e(a)i(fully)-2 2680 y(quali\002ed)d(domain)g(name)h(\(FQDN\))g (and)g(a)h(port)e(respecti)n(v)o(ely)-5 b(.)17 b(Y)-9 b(ou)19 b(may)g(substitute)g(a)h(plus)f('+')g(for)g(these)g(tw)o(o)h (parameters)e(if)i(you)-2 2788 y(wish.)g(The)g(serv)o(er)f(will)i (insert)f(the)h(current)e(hostname)f(and)i(the)g(current)f(port)h(when) f(it)i(sees)g(a)g(plus)f(in)g(either)g(of)g(these)g(tw)o(o)h(\002elds.) -2 2848 y SDict begin H.S end -2 2848 a -2 2848 a SDict begin 13 H.A end -2 2848 a -2 2848 a SDict begin [ /View [/XYZ H.V] /Dest (326) cvn H.B /DEST pdfmark end -2 2848 a 90 x Fm(An)e(easy)h(w)o(ay)f(to)h(retrie)n(v)o(e)e(links)h(is)h (to)g(use)g(the)f(Curses)h(Gopher)e(Client.)h(By)h(pressing)f('=')g(Y) -9 b(ou)19 b(can)g(get)g(information)e(suitable)i(for)-2 3045 y(inclusion)g(in)h(a)h(link)f(\002le.)-2 3088 y SDict begin H.S end -2 3088 a -2 3088 a SDict begin 13 H.A end -2 3088 a -2 3088 a SDict begin [ /View [/XYZ H.V] /Dest (HANDLERS.UMN.OVERRIDING) cvn H.B /DEST pdfmark end -2 3088 a 327 x Fd(Ov)o(erriding)31 b(Defaults)-2 3499 y SDict begin H.S end -2 3499 a -2 3499 a SDict begin 13 H.A end -2 3499 a -2 3499 a SDict begin [ /View [/XYZ H.V] /Dest (329) cvn H.B /DEST pdfmark end -2 3499 a 84 x Fm(The)20 b(serv)o(er)f(looks)h(for)f(a)i(directory)d(called)1285 3583 y SDict begin H.S end 1285 3583 a 1285 3583 a SDict begin 13 H.A end 1285 3583 a 1285 3583 a SDict begin [ /View [/XYZ H.V] /Dest (330) cvn H.B /DEST pdfmark end 1285 3583 a Fg(.cap)i Fm(when)g(parsing)f(a)i(directory)-5 b(.)18 b(The)h(serv)o(er)h(then)f(checks)h(to)g(see)h(if)g(the)3533 3583 y SDict begin H.S end 3533 3583 a 3533 3583 a SDict begin 13 H.A end 3533 3583 a 3533 3583 a SDict begin [ /View [/XYZ H.V] /Dest (331) cvn H.B /DEST pdfmark end 3533 3583 a Fg(.cap)-2 3691 y Fm(directory)d(contains)i(a)g(\002le)h (with)g(the)f(same)g(name)g(as)h(the)f(\002le)h(it')-5 b(s)21 b(parsing.)e(If)h(this)h(\002le)f(e)o(xists)h(then)f(the)g(serv) o(er)f(will)i(open)e(it)i(for)-2 3799 y(reading.)d(The)i(serv)o(er)f (parses)i(this)f(\002le)h(just)g(lik)o(e)f(a)h(link)f(\002le.)h(Ho)n (we)n(v)o(er)m(,)d(instead)i(of)g(making)e(a)j(ne)n(w)f(object,)f(the)i (parameters)-2 3907 y(inside)f(the)339 3907 y SDict begin H.S end 339 3907 a 339 3907 a SDict begin 13 H.A end 339 3907 a 339 3907 a SDict begin [ /View [/XYZ H.V] /Dest (332) cvn H.B /DEST pdfmark end 339 3907 a Fg(.cap/)g Fm(\002le)h(are)f(used)g(to)g(o)o(v)o(erride)e(an)o(y)i(of)f(the)i (serv)o(er)e(supplied)g(def)o(ault)h(v)n(alues.)-2 3966 y SDict begin H.S end -2 3966 a -2 3966 a SDict begin 13 H.A end -2 3966 a -2 3966 a SDict begin [ /View [/XYZ H.V] /Dest (333) cvn H.B /DEST pdfmark end -2 3966 a 90 x Fm(F)o(or)g(instance,)f(say)i(you)e(w)o(anted)h(to)g(change)f(the)h (T)m(itle)h(of)f(a)g(te)o(xt)g(\002le)h(for)f(gopher)m(,)d(b)n(ut)k (don')o(t)d(w)o(ant)i(to)h(change)e(the)h(\002lename.)f(Y)-9 b(ou)-2 4164 y(also)20 b(don')o(t)f(w)o(ant)h(it)h(alphabetized,)d (instead)i(you)f(w)o(ant)i(it)g(second)e(in)h(the)g(directory)f (listing.)h(Y)-9 b(ou)20 b(could)f(mak)o(e)h(a)g(set-aside)g(\002le)h (in)-2 4272 y(the)120 4272 y SDict begin H.S end 120 4272 a 120 4272 a SDict begin 13 H.A end 120 4272 a 120 4272 a SDict begin [ /View [/XYZ H.V] /Dest (334) cvn H.B /DEST pdfmark end 120 4272 a Fg(.cap)f Fm(directory)f(with)h(the)g (same)g(\002lename)g(that)g(contained)f(the)h(follo)n(wing)f(lines:)-2 4373 y SDict begin H.S end -2 4373 a -2 4373 a SDict begin 11.7 H.A end -2 4373 a -2 4373 a SDict begin [ /View [/XYZ H.V] /Dest (335) cvn H.B /DEST pdfmark end -2 4373 a 79 x Fg(Name=New)43 b(Long)h(Cool)h(Name)-2 4549 y(Numb=2)-2 4729 y SDict begin H.S end -2 4729 a -2 4729 a SDict begin 13 H.A end -2 4729 a -2 4729 a SDict begin [ /View [/XYZ H.V] /Dest (336) cvn H.B /DEST pdfmark end -2 4729 a 108 x Fm(An)20 b(alternati)n(v)o(e)f(to)573 4837 y SDict begin H.S end 573 4837 a 573 4837 a SDict begin 13 H.A end 573 4837 a 573 4837 a SDict begin [ /View [/XYZ H.V] /Dest (337) cvn H.B /DEST pdfmark end 573 4837 a Fg(.cap)h Fm(\002les)h(are)f(e)o(xtended)e(link)i(\002les.)h(The)o(y) e(w)o(ork)g(just)i(the)f(same)g(as)h(the)f(\002les)h(described)e(in)h (Links)g(abo)o(v)o(e,)e(b)n(ut)-2 4945 y(ha)n(v)o(e)h(a)i(some)n(what)e (abbre)n(viated)f(format.)h(As)i(an)f(e)o(xample,)f(if)h(the)g(name)g (of)g(the)g(\002le)h(w)o(as)2670 4945 y SDict begin H.S end 2670 4945 a 2670 4945 a SDict begin 13 H.A end 2670 4945 a 2670 4945 a SDict begin [ /View [/XYZ H.V] /Dest (338) cvn H.B /DEST pdfmark end 2670 4945 a Fg(file-to-change)p Fm(,)d(then)i(you)f(could)-2 5053 y(create)h(a)g(\002le)h(called)620 5053 y SDict begin H.S end 620 5053 a 620 5053 a SDict begin 13 H.A end 620 5053 a 620 5053 a SDict begin [ /View [/XYZ H.V] /Dest (339) cvn H.B /DEST pdfmark end 620 5053 a Fg(.names)f Fm(with)g(the)g(follo)n(wing)f(contents:)p Black 3800 5569 a Fk(11)p Black eop end %%Page: 12 15 TeXDict begin 12 14 bop -600 -600 a SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end -600 -600 a Black 0 TeXcolorgray -2 -102 a SDict begin H.S end -2 -102 a 0 TeXcolorgray 0 TeXcolorgray -2 -102 a SDict begin H.R end -2 -102 a -2 -102 a SDict begin [ /View [/XYZ H.V] /Dest (page.12) cvn H.B /DEST pdfmark end -2 -102 a Black 3199 -132 a Fk(Chapter)20 b(5.)g(Handler)o(s)p Black -2 -11 a SDict begin H.S end -2 -11 a -2 -11 a SDict begin 11.7 H.A end -2 -11 a -2 -11 a SDict begin [ /View [/XYZ H.V] /Dest (340) cvn H.B /DEST pdfmark end -2 -11 a 83 x Fg (Path=./file-to-change)-2 170 y(Name=New)43 b(Long)h(Cool)h(Name)-2 267 y(Numb=2)-2 447 y SDict begin H.S end -2 447 a -2 447 a SDict begin 13 H.A end -2 447 a -2 447 a SDict begin [ /View [/XYZ H.V] /Dest (HANDLERS.UMN.COOL) cvn H.B /DEST pdfmark end -2 447 a 328 x Fd(Adding)31 b(Cool)f(Links)-2 859 y SDict begin H.S end -2 859 a -2 859 a SDict begin 13 H.A end -2 859 a -2 859 a SDict begin [ /View [/XYZ H.V] /Dest (343) cvn H.B /DEST pdfmark end -2 859 a 84 x Fm(One)20 b(cool)g(thing)f(you)g(can)h(do)g(with)g(.Links)g(is)h(to)g(add)e (neato)h(services)g(to)g(your)f(gopher)f(serv)o(er)-5 b(.)20 b(Adding)f(a)h(link)g(lik)o(e)h(this:)-2 1044 y SDict begin H.S end -2 1044 a -2 1044 a SDict begin 11.7 H.A end -2 1044 a -2 1044 a SDict begin [ /View [/XYZ H.V] /Dest (344) cvn H.B /DEST pdfmark end -2 1044 a 79 x Fg(Name=Cool)43 b(ftp)h(directory)-2 1220 y(Type=h)-2 1317 y(Path=/URL:ftp://hostname/path/)-2 1414 y(Host=+)-2 1511 y(Port=+)-2 1706 y(Name=Cool)f(web)h(site)-2 1803 y(Type=h)-2 1900 y(Path=/URL:http://hostname/)-2 1997 y(Host=+)-2 2094 y(Port=+)-2 2274 y SDict begin H.S end -2 2274 a -2 2274 a SDict begin 13 H.A end -2 2274 a -2 2274 a SDict begin [ /View [/XYZ H.V] /Dest (345) cvn H.B /DEST pdfmark end -2 2274 a 108 x Fm(W)m(ill)21 b(allo)n(w)f(you)f (to)i(link)f(in)g(an)o(y)f(FTP)i(or)f(W)-7 b(eb)21 b(site)g(to)f(your)f (gopher)-5 b(.)19 b(\(See)h(url.URLHandler)e(for)i(more)f(details.\))-2 2442 y SDict begin H.S end -2 2442 a -2 2442 a SDict begin 13 H.A end -2 2442 a -2 2442 a SDict begin [ /View [/XYZ H.V] /Dest (346) cvn H.B /DEST pdfmark end -2 2442 a 90 x Fm(Y)-9 b(ou)19 b(can)h(easily)h(add)e(a)i(\002nger)e(site)j(to) e(your)f(gopher)f(serv)o(er)h(thusly:)-2 2633 y SDict begin H.S end -2 2633 a -2 2633 a SDict begin 11.7 H.A end -2 2633 a -2 2633 a SDict begin [ /View [/XYZ H.V] /Dest (347) cvn H.B /DEST pdfmark end -2 2633 a 79 x Fg(Name=Finger)43 b(information)-2 2809 y(Type=0)-2 2906 y(Path=lindner)-2 3003 y(Host=mudhoney.micro.umn.edu)-2 3100 y(Port=79)-2 3281 y SDict begin H.S end -2 3281 a -2 3281 a SDict begin 13 H.A end -2 3281 a -2 3281 a SDict begin [ /View [/XYZ H.V] /Dest (HANDLERS.UMN.HIDING) cvn H.B /DEST pdfmark end -2 3281 a 328 x Fd(Hiding)31 b(an)f(Entry)-2 3693 y SDict begin H.S end -2 3693 a -2 3693 a SDict begin 13 H.A end -2 3693 a -2 3693 a SDict begin [ /View [/XYZ H.V] /Dest (350) cvn H.B /DEST pdfmark end -2 3693 a 83 x Fm(This)20 b(kind)f(of)h(trick)g(may)g(be)g(necessary)g(in)g(some)g(cases,)h(and)e (thus)h(for)g(object)g("fred",)f(the)h(o)o(v)o(erriding)d(.names)j (\002le)g(entry)g(w)o(ould)-2 3884 y(be:)-2 3968 y SDict begin H.S end -2 3968 a -2 3968 a SDict begin 11.7 H.A end -2 3968 a -2 3968 a SDict begin [ /View [/XYZ H.V] /Dest (351) cvn H.B /DEST pdfmark end -2 3968 a 97 x Fg(Type=X)-2 4162 y(Path=./fred)-2 4342 y SDict begin H.S end -2 4342 a -2 4342 a SDict begin 13 H.A end -2 4342 a -2 4342 a SDict begin [ /View [/XYZ H.V] /Dest (352) cvn H.B /DEST pdfmark end -2 4342 a 108 x Fm(by)g(o)o(v)o(erriding)d(def)o(ault)i (type)h(to)g(be)g("X".)h(This)f(kind)f(of)h(hideouts)f(may)h(be)g (usefull,)g(when)f(for)h(some)g(reason)f(there)h(are)g(symlinks)-2 4558 y(\(or)f(whate)n(v)o(er\))g(in)h(the)g(directory)f(at)h(which)1297 4558 y SDict begin H.S end 1297 4558 a 1297 4558 a SDict begin 13 H.A end 1297 4558 a 1297 4558 a SDict begin [ /View [/XYZ H.V] /Dest (353) cvn H.B /DEST pdfmark end 1297 4558 a Fm(PyGopherd)e(looks)i(at,)g(and)g(those)g(entries)g(are) g(not)g(desired)f(to)i(be)f(sho)n(wn)f(at)i(all.)-2 4617 y SDict begin H.S end -2 4617 a -2 4617 a SDict begin 13 H.A end -2 4617 a -2 4617 a SDict begin [ /View [/XYZ H.V] /Dest (HANDLERS.UMN.ABSTRACTS) cvn H.B /DEST pdfmark end -2 4617 a Black 3800 5569 a Fk(12)p Black eop end %%Page: 13 16 TeXDict begin 13 15 bop -600 -600 a SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end -600 -600 a Black 0 TeXcolorgray -2 -102 a SDict begin H.S end -2 -102 a 0 TeXcolorgray 0 TeXcolorgray -2 -102 a SDict begin H.R end -2 -102 a -2 -102 a SDict begin [ /View [/XYZ H.V] /Dest (page.13) cvn H.B /DEST pdfmark end -2 -102 a Black 3199 -132 a Fk(Chapter)20 b(5.)g(Handler)o(s)p Black -2 72 a Fd(Abstracts)29 b(and)i(Inf)m(o)-2 134 y SDict begin H.S end -2 134 a -2 134 a SDict begin 13 H.A end -2 134 a -2 134 a SDict begin [ /View [/XYZ H.V] /Dest (356) cvn H.B /DEST pdfmark end -2 134 a 106 x Fm(Man)o(y)19 b(modern)f(gopher)h(serv)o(er)g (maintainers)g(lik)o(e)i(to)f(intersperse)f(gopher)g(directory)f (listings)j(with)f(other)f(information)f(--)i(often,)-2 348 y(additional)f(information)e(about)j(the)g(contents)f(of)h(\002les) h(in)g(the)f(directory)-5 b(.)18 b(The)i(gophermap)d(system)j(pro)o (vides)f(one)g(w)o(ay)i(to)f(do)-2 456 y(that,)g(and)f(abstracts)i (used)f(with)g(UMN)g(gopher)f(directories)g(pro)o(vides)f(another)-5 b(.)-2 516 y SDict begin H.S end -2 516 a -2 516 a SDict begin 13 H.A end -2 516 a -2 516 a SDict begin [ /View [/XYZ H.V] /Dest (357) cvn H.B /DEST pdfmark end -2 516 a 89 x Fm(Subject)20 b(to)g(the)475 605 y SDict begin H.S end 475 605 a 475 605 a SDict begin 13 H.A end 475 605 a 475 605 a SDict begin [ /View [/XYZ H.V] /Dest (358) cvn H.B /DEST pdfmark end 475 605 a Fm(abstract_headers)e(and)1190 605 y SDict begin H.S end 1190 605 a 1190 605 a SDict begin 13 H.A end 1190 605 a 1190 605 a SDict begin [ /View [/XYZ H.V] /Dest (359) cvn H.B /DEST pdfmark end 1190 605 a Fm(abstract_entries)h(con\002guration)e(\002le)k(options,)e(this) i(feature)e(allo)n(ws)h(you)g(to)g(de\002ne)g(that)-2 713 y(e)o(xtra)f(information.)f(Y)-9 b(ou)19 b(can)h(do)g(that)g(by)g (simply)g(creating)f(a)i(\002le)g(named)2222 713 y SDict begin H.S end 2222 713 a 2222 713 a SDict begin 13 H.A end 2222 713 a 2222 713 a SDict begin [ /View [/XYZ H.V] /Dest (360) cvn H.B /DEST pdfmark end 2222 713 a Fg(filename.abstract) d Fm(right)h(alongside)g(the)h(re)o(gular)-2 821 y(\002le)h(in)f(your)f (directory)-5 b(.)18 b(The)i(\002le)g(will)h(be)f(interpreted)f(as)i (the)f(abstract.)g(F)o(or)g(a)g(directory)-5 b(,)18 b(create)i(a)h (\002le)f(named)3310 821 y SDict begin H.S end 3310 821 a 3310 821 a SDict begin 13 H.A end 3310 821 a 3310 821 a SDict begin [ /View [/XYZ H.V] /Dest (361) cvn H.B /DEST pdfmark end 3310 821 a Fg(.abstract)g Fm(in)-2 929 y(the)g(directory)-5 b(.)18 b(Simple)i(as)h(that!)-2 1072 y SDict begin H.S end -2 1072 a -2 1072 a SDict begin 13 H.A end -2 1072 a -2 1072 a SDict begin [ /View [/XYZ H.V] /Dest (HANDLERS.HTMLURLHANDLER) cvn H.B /DEST pdfmark end -2 1072 a 359 x Fj(url.HTMLURLHandler)-2 1504 y SDict begin H.S end -2 1504 a -2 1504 a SDict begin 13 H.A end -2 1504 a -2 1504 a SDict begin [ /View [/XYZ H.V] /Dest (364) cvn H.B /DEST pdfmark end -2 1504 a -2 1504 a SDict begin H.S end -2 1504 a -2 1504 a SDict begin 13 H.A end -2 1504 a -2 1504 a SDict begin [ /View [/XYZ H.V] /Dest (365) cvn H.B /DEST pdfmark end -2 1504 a 107 x Fm(PyGopherd)d(pro)o (vides)g(w)o(ays)j(for)e(you)g(to)i(link)f(to)g(pages)g(outside)g (Gopherspace)e(--)i(that)g(is,)h(web)f(pages,)f(FTP)i(sites,)g(and)f (the)g(lik)o(e.)-2 1719 y(This)g(is)h(accomplished)d(according)g(to)i (the)1274 1719 y SDict begin H.S end 1274 1719 a 1274 1719 a SDict begin 13 H.A end 1274 1719 a 1274 1719 a SDict begin [ /View [/XYZ H.V] /Dest (366) cvn H.B /DEST pdfmark end 1274 1719 a Fm(Links)g(to)g(URL)1735 1685 y Fc(1)1781 1719 y Fm(speci\002cation)f(\(see)i(Conforming)c(T)-7 b(o)20 b(belo)n(w)g(for)f(details\).)h(In)g(order)f(to)-2 1826 y(link)h(to)g(a)h(URL)f(\(EXCEPT)h(gopher)d(URLs\))j(from)e(a)h (menu,)f(you)h(create)g(a)g(link)g(of)g(type)g(h)g(\(re)o(gardless)e (of)i(the)g(actual)g(type)g(of)g(the)-2 1934 y(resource)f(that)h(you)f (are)h(linking)f(to\))h(in)h(your)1340 1934 y SDict begin H.S end 1340 1934 a 1340 1934 a SDict begin 13 H.A end 1340 1934 a 1340 1934 a SDict begin [ /View [/XYZ H.V] /Dest (367) cvn H.B /DEST pdfmark end 1340 1934 a Fg(gophermap)e Fm(or)1854 1934 y SDict begin H.S end 1854 1934 a 1854 1934 a SDict begin 13 H.A end 1854 1934 a 1854 1934 a SDict begin [ /View [/XYZ H.V] /Dest (368) cvn H.B /DEST pdfmark end 1854 1934 a Fg(.Links)h Fm(\002le)g(that)h(looks)e(lik)o(e) i(this:)-2 2035 y SDict begin H.S end -2 2035 a -2 2035 a SDict begin 11.7 H.A end -2 2035 a -2 2035 a SDict begin [ /View [/XYZ H.V] /Dest (369) cvn H.B /DEST pdfmark end -2 2035 a 80 x Fg(/URL:http://www.complete.org/)-2 2295 y SDict begin H.S end -2 2295 a -2 2295 a SDict begin 13 H.A end -2 2295 a -2 2295 a SDict begin [ /View [/XYZ H.V] /Dest (370) cvn H.B /DEST pdfmark end -2 2295 a 108 x Fm(Modern)d(Gopher)h(clients)i(that)f(follo)n(w)f(the)i(Links)e (to)i(URL)g(speci\002cation)e(will)i(automatically)e(follo)n(w)g(that)h (link)g(when)g(you)-2 2511 y(select)h(it.)f(The)g(rest)h(need)e(some)h (help,)g(and)f(that')-5 b(s)21 b(where)f(this)g(handler)f(comes)h(in.) -2 2570 y SDict begin H.S end -2 2570 a -2 2570 a SDict begin 13 H.A end -2 2570 a -2 2570 a SDict begin [ /View [/XYZ H.V] /Dest (371) cvn H.B /DEST pdfmark end -2 2570 a 90 x Fm(F)o(or)g(Gopher)e(clients)j(that)f(do)g(not)g(follo)n(w) f(the)h(Links)g(to)h(URL)f(speci\002cation,)g(the)2439 2660 y SDict begin H.S end 2439 2660 a 2439 2660 a SDict begin 13 H.A end 2439 2660 a 2439 2660 a SDict begin [ /View [/XYZ H.V] /Dest (372) cvn H.B /DEST pdfmark end 2439 2660 a Fm(url.HTMLURLHandler)d(will)k(automatically)-2 2768 y(generate)e(an)h(HTML)g(document)e(for)i(them)f(on)h(the)g(\003y) -5 b(.)20 b(This)g(document)f(includes)g(a)i(refresh)e(code)g(that)i (will)g(send)f(them)f(to)i(the)-2 2876 y(proper)d(page.)h(Y)-9 b(ou)20 b(should)f(not)h(disable)g(this)h(handler)-5 b(.)-2 2935 y SDict begin H.S end -2 2935 a -2 2935 a SDict begin 13 H.A end -2 2935 a -2 2935 a SDict begin [ /View [/XYZ H.V] /Dest (HANDLERS.URLTYPEREWRITER) cvn H.B /DEST pdfmark end -2 2935 a 359 x Fj(url.URL)-13 b(T)i(ypeRewriter)-2 3395 y SDict begin H.S end -2 3395 a -2 3395 a SDict begin 13 H.A end -2 3395 a -2 3395 a SDict begin [ /View [/XYZ H.V] /Dest (375) cvn H.B /DEST pdfmark end -2 3395 a 79 x Fm(Some)20 b(people)f(wish)h(to)h(serv)o(e)e(HTML)h(documents)f(from) g(their)h(Gopher)f(serv)o(er)-5 b(.)19 b(One)h(problem)f(with)h(that)g (is)h(that)g(links)f(in)-2 3582 y(Gopherspace)e(include)h(an)h(e)o (xtra)g(type)f(character)g(at)i(the)f(be)o(ginning,)e(whereas)h(links)i (in)f(HTTP)g(do)g(not.)g(This)g(handler)f(will)-2 3690 y(remo)o(v)o(e)f(the)i(e)o(xtra)g(type)f(character)g(from)g(HTTP)i (requests)f(that)g(come)f(in,)i(allo)n(wing)e(a)h(single)h(relati)n(v)o (e-to-root)c(link)j(to)g(w)o(ork)f(for)-2 3798 y(both.)-2 3840 y SDict begin H.S end -2 3840 a -2 3840 a SDict begin 13 H.A end -2 3840 a -2 3840 a SDict begin [ /View [/XYZ H.V] /Dest (HANDLERS.VIRTUAL) cvn H.B /DEST pdfmark end -2 3840 a 377 x Fj(virtual.V)-5 b(irtual)-2 4290 y SDict begin H.S end -2 4290 a -2 4290 a SDict begin 13 H.A end -2 4290 a -2 4290 a SDict begin [ /View [/XYZ H.V] /Dest (378) cvn H.B /DEST pdfmark end -2 4290 a 106 x Fm(This)20 b(handler)f(is)i(not)f(intended)f(to)h(e)n(v)o(er)f(be)h(used)g (directly)-5 b(,)19 b(b)n(ut)h(is)h(used)f(by)g(man)o(y)f(other)g (handlers)g(such)h(as)h(the)f(mbox)f(support,)-2 4504 y(PYG)i(handlers,)d(and)i(others.)f(It)i(is)g(used)f(to)g(generate)f (virtual)h(entries)g(in)g(the)g(directory)f(hierarchy)f(--)i(that)g (is,)h(entries)f(that)g(look)-2 4612 y(normal)f(to)h(a)h(client,)f(b)n (ut)g(do)g(not)f(actually)h(correspond)e(to)i(a)h(\002le)g(on)e(disk.) -2 4672 y SDict begin H.S end -2 4672 a -2 4672 a SDict begin 13 H.A end -2 4672 a -2 4672 a SDict begin [ /View [/XYZ H.V] /Dest (379) cvn H.B /DEST pdfmark end -2 4672 a 89 x Fm(One)h(special)g(feature)f(of)h(the)871 4761 y SDict begin H.S end 871 4761 a 871 4761 a SDict begin 13 H.A end 871 4761 a 871 4761 a SDict begin [ /View [/XYZ H.V] /Dest (380) cvn H.B /DEST pdfmark end 871 4761 a Fm(virtual.V)-5 b(irtual)19 b(handler)g(is)i(that)f(you)f(can)h (send)g(information)e(to)i(it)h(at)g(runtime)e(in)h(a)h(manner)e (similar)-2 4869 y(to)g(a)h(CGI)g(script)f(on)g(the)h(web)m(.)e(Y)-9 b(ou)19 b(do)g(this)h(by)f(adding)f(a)h(question)g(mark)f(after)h(the)h (re)o(gular)d(selector)m(,)i(follo)n(wed)f(by)h(an)o(y)f(arbitrary)-2 4977 y(data)i(that)g(you)f(wish)i(to)f(ha)n(v)o(e)g(sent)g(to)h(the)f (virtual)g(request)f(handler)-5 b(.)p Black -2 5073 1200 4 v Black -2 5146 a Fb(1.)p Black 77 w(http://lists.complete.or)o (g/gopher@complete.or)o(g/2002/02/msg00033.html.gz)p Black Black 3800 5569 a Fk(13)p Black eop end %%Page: 14 17 TeXDict begin 14 16 bop -600 -600 a SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end -600 -600 a Black 0 TeXcolorgray -2 -102 a SDict begin H.S end -2 -102 a 0 TeXcolorgray 0 TeXcolorgray -2 -102 a SDict begin H.R end -2 -102 a -2 -102 a SDict begin [ /View [/XYZ H.V] /Dest (page.14) cvn H.B /DEST pdfmark end -2 -102 a Black 3199 -132 a Fk(Chapter)20 b(5.)g(Handler)o(s)p Black -2 -11 a SDict begin H.S end -2 -11 a -2 -11 a SDict begin 13 H.A end -2 -11 a -2 -11 a SDict begin [ /View [/XYZ H.V] /Dest (HANDLERS.ZIP) cvn H.B /DEST pdfmark end -2 -11 a 99 x Fj(ZIP)-16 b(.ZIPHandler)-2 162 y SDict begin H.S end -2 162 a -2 162 a SDict begin 13 H.A end -2 162 a -2 162 a SDict begin [ /View [/XYZ H.V] /Dest (383) cvn H.B /DEST pdfmark end -2 162 a 106 x Fm(Using)20 b(zip.ZIPHandler)m(,)d(you)i(can)h(sa) n(v)o(e)h(space)f(on)g(your)f(serv)o(er)g(by)h(con)m(v)o(erting)d(part) j(or)g(all)h(of)f(your)e(site)k(into)d(a)i(ZIP)f(\002le.)-2 376 y SDict begin H.S end -2 376 a -2 376 a SDict begin 13 H.A end -2 376 a -2 376 a SDict begin [ /View [/XYZ H.V] /Dest (384) cvn H.B /DEST pdfmark end -2 376 a Fm(PyGopherd)e(can)i (use)g(the)g(contents)g(of)g(that)g(ZIP)g(\002le)h(as)g(the)f(contents) g(of)g(your)f(site)i(--)f(completely)e(transparently)-5 b(.)-2 435 y SDict begin H.S end -2 435 a -2 435 a SDict begin 13 H.A end -2 435 a -2 435 a SDict begin [ /View [/XYZ H.V] /Dest (385) cvn H.B /DEST pdfmark end -2 435 a 90 x Fm(The)20 b(ZIP)g(\002le)h(handler)d(must)j(be)f(enabled)f(in)h (the)g(con\002guration)e(\002le)j(for)e(this)i(to)f(w)o(ork.)p Black 3800 5569 a Fk(14)p Black eop end %%Page: 15 18 TeXDict begin 15 17 bop -600 -600 a SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end -600 -600 a Black 0 TeXcolorgray -2 -102 a SDict begin H.S end -2 -102 a 0 TeXcolorgray 0 TeXcolorgray -2 -102 a SDict begin H.R end -2 -102 a -2 -102 a SDict begin [ /View [/XYZ H.V] /Dest (page.15) cvn H.B /DEST pdfmark end -2 -102 a Black Black -2 -11 a SDict begin H.S end -2 -11 a -2 -11 a SDict begin 13 H.A end -2 -11 a -2 -11 a SDict begin [ /View [/XYZ H.V] /Dest (TYPES) cvn H.B /DEST pdfmark end -2 -11 a 119 x Fl(Chapter)44 b(6.)f(Gopher)g(Item)h(T)-13 b(ypes)-2 283 y SDict begin H.S end -2 283 a -2 283 a SDict begin 13 H.A end -2 283 a -2 283 a SDict begin [ /View [/XYZ H.V] /Dest (388) cvn H.B /DEST pdfmark end -2 283 a 73 x Fm(When)20 b(you)f(construct)g(links)h(to)h(\002les)g(via)1236 356 y SDict begin H.S end 1236 356 a 1236 356 a SDict begin 13 H.A end 1236 356 a 1236 356 a SDict begin [ /View [/XYZ H.V] /Dest (389) cvn H.B /DEST pdfmark end 1236 356 a Fg(.Links)f Fm(or)1616 356 y SDict begin H.S end 1616 356 a 1616 356 a SDict begin 13 H.A end 1616 356 a 1616 356 a SDict begin [ /View [/XYZ H.V] /Dest (390) cvn H.B /DEST pdfmark end 1616 356 a Fg(gophermap)f Fm(\002les,)i(or)f (modify)e(the)2693 356 y SDict begin H.S end 2693 356 a 2693 356 a SDict begin 13 H.A end 2693 356 a 2693 356 a SDict begin [ /View [/XYZ H.V] /Dest (391) cvn H.B /DEST pdfmark end 2693 356 a Fm(mapping)g(in)i(the)h(con\002guration)c (\002le,)-2 464 y(you)i(will)i(need)e(to)i(kno)n(w)e(these.)h(Items)g (bearing)f(the)h("not)g(implemented")e(te)o(xt)i(are)g(not)g(serv)o(ed) f(up)h(by)3054 464 y SDict begin H.S end 3054 464 a 3054 464 a SDict begin 13 H.A end 3054 464 a 3054 464 a SDict begin [ /View [/XYZ H.V] /Dest (392) cvn H.B /DEST pdfmark end 3054 464 a Fm(PyGopherd)e(as)j(it)g(ships,)-2 572 y(generally)d(due)i(to)g(requirements)f(of)h(customized)e(per)n (-site)j(softw)o(are,)e(b)n(ut)h(may)g(be)g(serv)o(ed)f(up)h(via)g(PYG) h(e)o(xtension)e(modules)g(or)-2 680 y(other)g(gopher)f(serv)o(ers.)-2 739 y SDict begin H.S end -2 739 a -2 739 a SDict begin 13 H.A end -2 739 a -2 739 a SDict begin [ /View [/XYZ H.V] /Dest (393) cvn H.B /DEST pdfmark end -2 739 a 90 x Fm(This)i(list)h(w)o(as)g(prepared)e(based)g(on)h(RFC1436,)g(the)g (UMN)g(gopherd\(1\))d(manpage,)h(and)i(best)g(current)f(practices.)-2 847 y SDict begin H.S end -2 847 a -2 847 a SDict begin 13 H.A end -2 847 a -2 847 a SDict begin [ /View [/XYZ H.V] /Dest (394) cvn H.B /DEST pdfmark end -2 847 a -2 972 a SDict begin H.S end -2 972 a -2 972 a SDict begin 13 H.A end -2 972 a -2 972 a SDict begin [ /View [/XYZ H.V] /Dest (396) cvn H.B /DEST pdfmark end -2 972 a 90 x Fm(0)-2 1063 y SDict begin H.S end -2 1063 a -2 1063 a SDict begin 13 H.A end -2 1063 a -2 1063 a SDict begin [ /View [/XYZ H.V] /Dest (397) cvn H.B /DEST pdfmark end -2 1063 a Black Black 164 1211 a SDict begin H.S end 164 1211 a 164 1211 a SDict begin 13 H.A end 164 1211 a 164 1211 a SDict begin [ /View [/XYZ H.V] /Dest (398) cvn H.B /DEST pdfmark end 164 1211 a Fm(Plain)h(te)o(xt)g(\002le)-2 1295 y SDict begin H.S end -2 1295 a -2 1295 a SDict begin 13 H.A end -2 1295 a -2 1295 a SDict begin [ /View [/XYZ H.V] /Dest (400) cvn H.B /DEST pdfmark end -2 1295 a 107 x Fm(1)-2 1402 y SDict begin H.S end -2 1402 a -2 1402 a SDict begin 13 H.A end -2 1402 a -2 1402 a SDict begin [ /View [/XYZ H.V] /Dest (401) cvn H.B /DEST pdfmark end -2 1402 a Black Black 164 1551 a SDict begin H.S end 164 1551 a 164 1551 a SDict begin 13 H.A end 164 1551 a 164 1551 a SDict begin [ /View [/XYZ H.V] /Dest (402) cvn H.B /DEST pdfmark end 164 1551 a Fm(Directory)-2 1652 y SDict begin H.S end -2 1652 a -2 1652 a SDict begin 13 H.A end -2 1652 a -2 1652 a SDict begin [ /View [/XYZ H.V] /Dest (404) cvn H.B /DEST pdfmark end -2 1652 a 90 x Fm(2)-2 1742 y SDict begin H.S end -2 1742 a -2 1742 a SDict begin 13 H.A end -2 1742 a -2 1742 a SDict begin [ /View [/XYZ H.V] /Dest (405) cvn H.B /DEST pdfmark end -2 1742 a Black Black 164 1892 a SDict begin H.S end 164 1892 a 164 1892 a SDict begin 13 H.A end 164 1892 a 164 1892 a SDict begin [ /View [/XYZ H.V] /Dest (406) cvn H.B /DEST pdfmark end 164 1892 a Fm(CSO)h(phone)e(book)f(serv)o (er)i(\(not)f(implemented)g(by)1691 1892 y SDict begin H.S end 1691 1892 a 1691 1892 a SDict begin 13 H.A end 1691 1892 a 1691 1892 a SDict begin [ /View [/XYZ H.V] /Dest (407) cvn H.B /DEST pdfmark end 1691 1892 a Fm(PyGopherd\))-2 1993 y SDict begin H.S end -2 1993 a -2 1993 a SDict begin 13 H.A end -2 1993 a -2 1993 a SDict begin [ /View [/XYZ H.V] /Dest (409) cvn H.B /DEST pdfmark end -2 1993 a 90 x Fm(3)-2 2084 y SDict begin H.S end -2 2084 a -2 2084 a SDict begin 13 H.A end -2 2084 a -2 2084 a SDict begin [ /View [/XYZ H.V] /Dest (410) cvn H.B /DEST pdfmark end -2 2084 a Black Black 164 2232 a SDict begin H.S end 164 2232 a 164 2232 a SDict begin 13 H.A end 164 2232 a 164 2232 a SDict begin [ /View [/XYZ H.V] /Dest (411) cvn H.B /DEST pdfmark end 164 2232 a Fm(Error)g(condition;)f(te)o (xt)i(that)h(follo)n(ws)e(is)i(plain)f(te)o(xt)-2 2333 y SDict begin H.S end -2 2333 a -2 2333 a SDict begin 13 H.A end -2 2333 a -2 2333 a SDict begin [ /View [/XYZ H.V] /Dest (413) cvn H.B /DEST pdfmark end -2 2333 a 90 x Fm(4)-2 2423 y SDict begin H.S end -2 2423 a -2 2423 a SDict begin 13 H.A end -2 2423 a -2 2423 a SDict begin [ /View [/XYZ H.V] /Dest (414) cvn H.B /DEST pdfmark end -2 2423 a Black Black 164 2573 a SDict begin H.S end 164 2573 a 164 2573 a SDict begin 13 H.A end 164 2573 a 164 2573 a SDict begin [ /View [/XYZ H.V] /Dest (415) cvn H.B /DEST pdfmark end 164 2573 a Fm(Macintosh)f(\002le,)i(BinHe)o(x)e (format)-2 2668 y SDict begin H.S end -2 2668 a -2 2668 a SDict begin 13 H.A end -2 2668 a -2 2668 a SDict begin [ /View [/XYZ H.V] /Dest (417) cvn H.B /DEST pdfmark end -2 2668 a 96 x Fm(5)-2 2765 y SDict begin H.S end -2 2765 a -2 2765 a SDict begin 13 H.A end -2 2765 a -2 2765 a SDict begin [ /View [/XYZ H.V] /Dest (418) cvn H.B /DEST pdfmark end -2 2765 a Black Black 164 2913 a SDict begin H.S end 164 2913 a 164 2913 a SDict begin 13 H.A end 164 2913 a 164 2913 a SDict begin [ /View [/XYZ H.V] /Dest (419) cvn H.B /DEST pdfmark end 164 2913 a Fm(DOS)i(binary)d (archi)n(v)o(e)h(\(not)h(implemented)e(by)1558 2913 y SDict begin H.S end 1558 2913 a 1558 2913 a SDict begin 13 H.A end 1558 2913 a 1558 2913 a SDict begin [ /View [/XYZ H.V] /Dest (420) cvn H.B /DEST pdfmark end 1558 2913 a Fm(PyGopherd;)g(use)i(type)g(9)g(instead\))-2 3014 y SDict begin H.S end -2 3014 a -2 3014 a SDict begin 13 H.A end -2 3014 a -2 3014 a SDict begin [ /View [/XYZ H.V] /Dest (422) cvn H.B /DEST pdfmark end -2 3014 a 90 x Fm(6)-2 3105 y SDict begin H.S end -2 3105 a -2 3105 a SDict begin 13 H.A end -2 3105 a -2 3105 a SDict begin [ /View [/XYZ H.V] /Dest (423) cvn H.B /DEST pdfmark end -2 3105 a Black Black 164 3253 a SDict begin H.S end 164 3253 a 164 3253 a SDict begin 13 H.A end 164 3253 a 164 3253 a SDict begin [ /View [/XYZ H.V] /Dest (424) cvn H.B /DEST pdfmark end 164 3253 a Fm(uuencoded)d(\002le;)k(not)f (directly)f(generated)g(by)1543 3253 y SDict begin H.S end 1543 3253 a 1543 3253 a SDict begin 13 H.A end 1543 3253 a 1543 3253 a SDict begin [ /View [/XYZ H.V] /Dest (425) cvn H.B /DEST pdfmark end 1543 3253 a Fm(PyGopherd)f (automatically)-5 b(,)18 b(b)n(ut)i(can)g(be)g(link)o(ed)f(to)i (manually)-5 b(.)18 b(Most)i(gopher)164 3361 y(clients)g(will)h(handle) e(this)i(better)f(as)h(type)e(1.)-2 3462 y SDict begin H.S end -2 3462 a -2 3462 a SDict begin 13 H.A end -2 3462 a -2 3462 a SDict begin [ /View [/XYZ H.V] /Dest (427) cvn H.B /DEST pdfmark end -2 3462 a 90 x Fm(7)-2 3553 y SDict begin H.S end -2 3553 a -2 3553 a SDict begin 13 H.A end -2 3553 a -2 3553 a SDict begin [ /View [/XYZ H.V] /Dest (428) cvn H.B /DEST pdfmark end -2 3553 a Black Black 164 3702 a SDict begin H.S end 164 3702 a 164 3702 a SDict begin 13 H.A end 164 3702 a 164 3702 a SDict begin [ /View [/XYZ H.V] /Dest (429) cvn H.B /DEST pdfmark end 164 3702 a Fm(Search)-2 3786 y SDict begin H.S end -2 3786 a -2 3786 a SDict begin 13 H.A end -2 3786 a -2 3786 a SDict begin [ /View [/XYZ H.V] /Dest (431) cvn H.B /DEST pdfmark end -2 3786 a 107 x Fm(8)-2 3894 y SDict begin H.S end -2 3894 a -2 3894 a SDict begin 13 H.A end -2 3894 a -2 3894 a SDict begin [ /View [/XYZ H.V] /Dest (432) cvn H.B /DEST pdfmark end -2 3894 a Black Black 164 4042 a SDict begin H.S end 164 4042 a 164 4042 a SDict begin 13 H.A end 164 4042 a 164 4042 a SDict begin [ /View [/XYZ H.V] /Dest (433) cvn H.B /DEST pdfmark end 164 4042 a Fm(T)-6 b(elnet)20 b(link)-2 4126 y SDict begin H.S end -2 4126 a -2 4126 a SDict begin 13 H.A end -2 4126 a -2 4126 a SDict begin [ /View [/XYZ H.V] /Dest (435) cvn H.B /DEST pdfmark end -2 4126 a 107 x Fm(9)-2 4235 y SDict begin H.S end -2 4235 a -2 4235 a SDict begin 13 H.A end -2 4235 a -2 4235 a SDict begin [ /View [/XYZ H.V] /Dest (436) cvn H.B /DEST pdfmark end -2 4235 a Black Black 164 4382 a SDict begin H.S end 164 4382 a 164 4382 a SDict begin 13 H.A end 164 4382 a 164 4382 a SDict begin [ /View [/XYZ H.V] /Dest (437) cvn H.B /DEST pdfmark end 164 4382 a Fm(Binary)g(\002le)-2 4483 y SDict begin H.S end -2 4483 a -2 4483 a SDict begin 13 H.A end -2 4483 a -2 4483 a SDict begin [ /View [/XYZ H.V] /Dest (439) cvn H.B /DEST pdfmark end -2 4483 a 90 x Fm(+)-2 4573 y SDict begin H.S end -2 4573 a -2 4573 a SDict begin 13 H.A end -2 4573 a -2 4573 a SDict begin [ /View [/XYZ H.V] /Dest (440) cvn H.B /DEST pdfmark end -2 4573 a Black Black 164 4723 a SDict begin H.S end 164 4723 a 164 4723 a SDict begin 13 H.A end 164 4723 a 164 4723 a SDict begin [ /View [/XYZ H.V] /Dest (441) cvn H.B /DEST pdfmark end 164 4723 a Fm(Redundant)e(serv)o(er)i (\(not)f(implemented)f(by)1479 4723 y SDict begin H.S end 1479 4723 a 1479 4723 a SDict begin 13 H.A end 1479 4723 a 1479 4723 a SDict begin [ /View [/XYZ H.V] /Dest (442) cvn H.B /DEST pdfmark end 1479 4723 a Fm(PyGopherd\))-2 4824 y SDict begin H.S end -2 4824 a -2 4824 a SDict begin 13 H.A end -2 4824 a -2 4824 a SDict begin [ /View [/XYZ H.V] /Dest (444) cvn H.B /DEST pdfmark end -2 4824 a 90 x Fm(c)-2 4915 y SDict begin H.S end -2 4915 a -2 4915 a SDict begin 13 H.A end -2 4915 a -2 4915 a SDict begin [ /View [/XYZ H.V] /Dest (445) cvn H.B /DEST pdfmark end -2 4915 a Black Black 164 5063 a SDict begin H.S end 164 5063 a 164 5063 a SDict begin 13 H.A end 164 5063 a 164 5063 a SDict begin [ /View [/XYZ H.V] /Dest (446) cvn H.B /DEST pdfmark end 164 5063 a Fm(Calendar)h(\(not)h (implemented)e(by)1197 5063 y SDict begin H.S end 1197 5063 a 1197 5063 a SDict begin 13 H.A end 1197 5063 a 1197 5063 a SDict begin [ /View [/XYZ H.V] /Dest (447) cvn H.B /DEST pdfmark end 1197 5063 a Fm(PyGopherd\))p Black -2 5569 a SDict begin H.S end -2 5569 a -2 5569 a SDict begin 13 H.A end -2 5569 a -2 5569 a SDict begin [ /View [/XYZ H.V] /Dest (454) cvn H.B /DEST pdfmark end -2 5569 a 3800 5638 a Fk(15)p Black eop end %%Page: 16 19 TeXDict begin 16 18 bop -600 -600 a SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end -600 -600 a Black 0 TeXcolorgray -2 -102 a SDict begin H.S end -2 -102 a 0 TeXcolorgray 0 TeXcolorgray -2 -102 a SDict begin H.R end -2 -102 a -2 -102 a SDict begin [ /View [/XYZ H.V] /Dest (page.16) cvn H.B /DEST pdfmark end -2 -102 a Black 2877 -132 a Fk(Chapter)20 b(6.)g(Gopher)f(Item)i(T)-6 b(ypes)p Black -2 -11 a SDict begin H.S end -2 -11 a -2 -11 a SDict begin 13 H.A end -2 -11 a -2 -11 a SDict begin [ /View [/XYZ H.V] /Dest (449) cvn H.B /DEST pdfmark end -2 -11 a 83 x Fm(e)-2 73 y SDict begin H.S end -2 73 a -2 73 a SDict begin 13 H.A end -2 73 a -2 73 a SDict begin [ /View [/XYZ H.V] /Dest (450) cvn H.B /DEST pdfmark end -2 73 a Black Black 164 222 a SDict begin H.S end 164 222 a 164 222 a SDict begin 13 H.A end 164 222 a 164 222 a SDict begin [ /View [/XYZ H.V] /Dest (451) cvn H.B /DEST pdfmark end 164 222 a Fm(Ev)o(ent)19 b(\(not)h(implemented)e(by) 1090 222 y SDict begin H.S end 1090 222 a 1090 222 a SDict begin 13 H.A end 1090 222 a 1090 222 a SDict begin [ /View [/XYZ H.V] /Dest (452) cvn H.B /DEST pdfmark end 1090 222 a Fm(PyGopherd\))-2 413 y(g)-2 431 y SDict begin H.S end -2 431 a -2 431 a SDict begin 13 H.A end -2 431 a -2 431 a SDict begin [ /View [/XYZ H.V] /Dest (455) cvn H.B /DEST pdfmark end -2 431 a Black Black 164 562 a SDict begin H.S end 164 562 a 164 562 a SDict begin 13 H.A end 164 562 a 164 562 a SDict begin [ /View [/XYZ H.V] /Dest (456) cvn H.B /DEST pdfmark end 164 562 a Fm(GIF-format)g(graphic)-2 663 y SDict begin H.S end -2 663 a -2 663 a SDict begin 13 H.A end -2 663 a -2 663 a SDict begin [ /View [/XYZ H.V] /Dest (458) cvn H.B /DEST pdfmark end -2 663 a 90 x Fm(h)-2 753 y SDict begin H.S end -2 753 a -2 753 a SDict begin 13 H.A end -2 753 a -2 753 a SDict begin [ /View [/XYZ H.V] /Dest (459) cvn H.B /DEST pdfmark end -2 753 a Black Black 164 903 a SDict begin H.S end 164 903 a 164 903 a SDict begin 13 H.A end 164 903 a 164 903 a SDict begin [ /View [/XYZ H.V] /Dest (460) cvn H.B /DEST pdfmark end 164 903 a Fm(HTML)i(\002le)-2 987 y SDict begin H.S end -2 987 a -2 987 a SDict begin 13 H.A end -2 987 a -2 987 a SDict begin [ /View [/XYZ H.V] /Dest (462) cvn H.B /DEST pdfmark end -2 987 a 107 x Fm(I)-2 1094 y SDict begin H.S end -2 1094 a -2 1094 a SDict begin 13 H.A end -2 1094 a -2 1094 a SDict begin [ /View [/XYZ H.V] /Dest (463) cvn H.B /DEST pdfmark end -2 1094 a Black Black 164 1243 a SDict begin H.S end 164 1243 a 164 1243 a SDict begin 13 H.A end 164 1243 a 164 1243 a SDict begin [ /View [/XYZ H.V] /Dest (464) cvn H.B /DEST pdfmark end 164 1243 a Fm(An)o(y)f(kind)h(of)g(graphic)e(\002le)j(other)f(than)f(GIF)-2 1344 y SDict begin H.S end -2 1344 a -2 1344 a SDict begin 13 H.A end -2 1344 a -2 1344 a SDict begin [ /View [/XYZ H.V] /Dest (466) cvn H.B /DEST pdfmark end -2 1344 a 90 x Fm(i)-2 1434 y SDict begin H.S end -2 1434 a -2 1434 a SDict begin 13 H.A end -2 1434 a -2 1434 a SDict begin [ /View [/XYZ H.V] /Dest (467) cvn H.B /DEST pdfmark end -2 1434 a Black Black 164 1583 a SDict begin H.S end 164 1583 a 164 1583 a SDict begin 13 H.A end 164 1583 a 164 1583 a SDict begin [ /View [/XYZ H.V] /Dest (468) cvn H.B /DEST pdfmark end 164 1583 a Fm(Informational)e(te)o(xt)j (included)f(in)h(a)h(directory)d(that)j(is)g(displayed)e(b)n(ut)h(does) g(not)g(link)g(to)g(an)o(y)f(actual)h(\002le.)-2 1684 y SDict begin H.S end -2 1684 a -2 1684 a SDict begin 13 H.A end -2 1684 a -2 1684 a SDict begin [ /View [/XYZ H.V] /Dest (470) cvn H.B /DEST pdfmark end -2 1684 a 90 x Fm(M)-2 1774 y SDict begin H.S end -2 1774 a -2 1774 a SDict begin 13 H.A end -2 1774 a -2 1774 a SDict begin [ /View [/XYZ H.V] /Dest (471) cvn H.B /DEST pdfmark end -2 1774 a Black Black 164 1924 a SDict begin H.S end 164 1924 a 164 1924 a SDict begin 13 H.A end 164 1924 a 164 1924 a SDict begin [ /View [/XYZ H.V] /Dest (472) cvn H.B /DEST pdfmark end 164 1924 a Fm(MIME)g(multipart/mix)o(ed)d (\002le)-2 2025 y SDict begin H.S end -2 2025 a -2 2025 a SDict begin 13 H.A end -2 2025 a -2 2025 a SDict begin [ /View [/XYZ H.V] /Dest (474) cvn H.B /DEST pdfmark end -2 2025 a 90 x Fm(s)-2 2116 y SDict begin H.S end -2 2116 a -2 2116 a SDict begin 13 H.A end -2 2116 a -2 2116 a SDict begin [ /View [/XYZ H.V] /Dest (475) cvn H.B /DEST pdfmark end -2 2116 a Black Black 164 2264 a SDict begin H.S end 164 2264 a 164 2264 a SDict begin 13 H.A end 164 2264 a 164 2264 a SDict begin [ /View [/XYZ H.V] /Dest (476) cvn H.B /DEST pdfmark end 164 2264 a Fm(An)o(y)i(kind)h (of)g(sound)f(\002le)-2 2365 y SDict begin H.S end -2 2365 a -2 2365 a SDict begin 13 H.A end -2 2365 a -2 2365 a SDict begin [ /View [/XYZ H.V] /Dest (478) cvn H.B /DEST pdfmark end -2 2365 a 90 x Fm(T)-2 2455 y SDict begin H.S end -2 2455 a -2 2455 a SDict begin 13 H.A end -2 2455 a -2 2455 a SDict begin [ /View [/XYZ H.V] /Dest (479) cvn H.B /DEST pdfmark end -2 2455 a Black Black 164 2605 a SDict begin H.S end 164 2605 a 164 2605 a SDict begin 13 H.A end 164 2605 a 164 2605 a SDict begin [ /View [/XYZ H.V] /Dest (480) cvn H.B /DEST pdfmark end 164 2605 a Fm(tn3270)f(link)-2 2689 y SDict begin H.S end -2 2689 a -2 2689 a SDict begin 13 H.A end -2 2689 a -2 2689 a SDict begin [ /View [/XYZ H.V] /Dest (482) cvn H.B /DEST pdfmark end -2 2689 a 107 x Fm(X)-2 2796 y SDict begin H.S end -2 2796 a -2 2796 a SDict begin 13 H.A end -2 2796 a -2 2796 a SDict begin [ /View [/XYZ H.V] /Dest (483) cvn H.B /DEST pdfmark end -2 2796 a 108 x Fm(-)-2 2904 y SDict begin H.S end -2 2904 a -2 2904 a SDict begin 13 H.A end -2 2904 a -2 2904 a SDict begin [ /View [/XYZ H.V] /Dest (484) cvn H.B /DEST pdfmark end -2 2904 a Black Black 164 3053 a SDict begin H.S end 164 3053 a 164 3053 a SDict begin 13 H.A end 164 3053 a 164 3053 a SDict begin [ /View [/XYZ H.V] /Dest (485) cvn H.B /DEST pdfmark end 164 3053 a Fm(UMN-speci\002c)i(--)g (signi\002es)g(that)g(this)h(entry)e(should)h(not)g(be)g(displayed)f (in)h(a)h(directory)d(entry)-5 b(,)19 b(b)n(ut)h(may)g(be)g(accessed)g (via)g(a)164 3161 y(direct)g(link.)f(This)i(v)n(alue)e(is)i(ne)n(v)o (er)e(transmitted)g(in)i(an)o(y)e(Gopher)g(protocol.)p Black 3798 5569 a Fk(16)p Black eop end %%Page: 17 20 TeXDict begin 17 19 bop -600 -600 a SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end -600 -600 a Black 0 TeXcolorgray -2 -102 a SDict begin H.S end -2 -102 a 0 TeXcolorgray 0 TeXcolorgray -2 -102 a SDict begin H.R end -2 -102 a -2 -102 a SDict begin [ /View [/XYZ H.V] /Dest (page.17) cvn H.B /DEST pdfmark end -2 -102 a Black Black -2 -11 a SDict begin H.S end -2 -11 a -2 -11 a SDict begin 13 H.A end -2 -11 a -2 -11 a SDict begin [ /View [/XYZ H.V] /Dest (PYGOPHERD.MAN) cvn H.B /DEST pdfmark end -2 -11 a 899 132 a Fo(I.)52 b(PyGopherd)f(Manpage)p Black Black eop end %%Page: 18 21 TeXDict begin 18 20 bop -600 -600 a SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end -600 -600 a Black 0 TeXcolorgray -2 -102 a SDict begin H.S end -2 -102 a 0 TeXcolorgray 0 TeXcolorgray -2 -102 a SDict begin H.R end -2 -102 a -2 -102 a SDict begin [ /View [/XYZ H.V] /Dest (page.18) cvn H.B /DEST pdfmark end -2 -102 a Black Black -2 -11 a SDict begin H.S end -2 -11 a -2 -11 a SDict begin 13 H.A end -2 -11 a -2 -11 a SDict begin [ /View [/XYZ H.V] /Dest (488) cvn H.B /DEST pdfmark end -2 -11 a 99 x Fj(pygopherd)p 1 0 0 TeXcolorrgb -2 200 a SDict begin H.S end -2 200 a -2 200 a SDict begin 13 H.A end -2 200 a -2 200 a SDict begin [ /View [/XYZ H.V] /Dest (489) cvn H.B /DEST pdfmark end -2 200 a 1 0 0 TeXcolorrgb -2 283 a SDict begin H.S end -2 283 a -2 283 a SDict begin 13 H.A end -2 283 a -2 283 a SDict begin [ /View [/XYZ H.V] /Dest (490) cvn H.B /DEST pdfmark end -2 283 a 1 0 0 TeXcolorrgb -2 283 a SDict begin H.S end -2 283 a -2 283 a SDict begin 13 H.A end -2 283 a -2 283 a SDict begin [ /View [/XYZ H.V] /Dest (491) cvn H.B /DEST pdfmark end -2 283 a 79 x Fm(<)p 1 0 0 TeXcolorrgb Fg (jgoerzen@complete.org)p 1 0 0 TeXcolorrgb Fm(>)p 1 0 0 TeXcolorrgb 1 0 0 TeXcolorrgb 1 0 0 TeXcolorrgb -2 374 a SDict begin H.S end -2 374 a -2 374 a SDict begin 13 H.A end -2 374 a -2 374 a SDict begin [ /View [/XYZ H.V] /Dest (492) cvn H.B /DEST pdfmark end -2 374 a 179 x Fm(John)19 b(Goerzen)p 1 0 0 TeXcolorrgb 1 0 0 TeXcolorrgb 458 553 a SDict begin H.S end 458 553 a 458 553 a SDict begin 13 H.A end 458 553 a 458 553 a SDict begin [ /View [/XYZ H.V] /Dest (495) cvn H.B /DEST pdfmark end 458 553 a 19 w Fm($Date:)h(2003-08-25)d(16:14:52)g(-0500)i (\(Mon,)g(25)h(Aug)f(2003\))g($)p 1 0 0 TeXcolorrgb Black -2 654 a SDict begin H.S end -2 654 a -2 654 a SDict begin 13 H.A end -2 654 a -2 654 a SDict begin [ /View [/XYZ H.V] /Dest (500) cvn H.B /DEST pdfmark end -2 654 a -2 654 a SDict begin H.S end -2 654 a -2 654 a SDict begin 13 H.A end -2 654 a -2 654 a SDict begin [ /View [/XYZ H.V] /Dest (501) cvn H.B /DEST pdfmark end -2 654 a 227 x Fd(Name)-2 1049 y Fa(PyGopherd)448 1049 y SDict begin H.S end 448 1049 a 448 1049 a SDict begin 13 H.A end 448 1049 a 448 1049 a SDict begin [ /View [/XYZ H.V] /Dest (502) cvn H.B /DEST pdfmark end 448 1049 a 19 w Fm(\227)i(Multiprotocol)d(Information)f(Serv)o(er)-2 1067 y SDict begin H.S end -2 1067 a -2 1067 a SDict begin 13 H.A end -2 1067 a -2 1067 a SDict begin [ /View [/XYZ H.V] /Dest (503) cvn H.B /DEST pdfmark end -2 1067 a 310 x Fd(Synopsis)-2 1401 y SDict begin H.S end -2 1401 a -2 1401 a SDict begin 13 H.A end -2 1401 a -2 1401 a SDict begin [ /View [/XYZ H.V] /Dest (504) cvn H.B /DEST pdfmark end -2 1401 a -2 1544 a SDict begin H.S end -2 1544 a -2 1544 a SDict begin 13 H.A end -2 1544 a -2 1544 a SDict begin [ /View [/XYZ H.V] /Dest (505) cvn H.B /DEST pdfmark end -2 1544 a 84 x Fn(pygopherd)401 1628 y SDict begin H.S end 401 1628 a 401 1628 a SDict begin 13 H.A end 401 1628 a 401 1628 a SDict begin [ /View [/XYZ H.V] /Dest (506) cvn H.B /DEST pdfmark end 401 1628 a 21 w Fm([)450 1628 y SDict begin H.S end 450 1628 a 450 1628 a SDict begin 13 H.A end 450 1628 a 450 1628 a SDict begin [ /View [/XYZ H.V] /Dest (507) cvn H.B /DEST pdfmark end 450 1628 a Fe(configfile)p Fm(])-2 1728 y SDict begin H.S end -2 1728 a -2 1728 a SDict begin 13 H.A end -2 1728 a -2 1728 a SDict begin [ /View [/XYZ H.V] /Dest (MAN.DESCRIPTION) cvn H.B /DEST pdfmark end -2 1728 a 311 x Fd(Description)-2 2123 y SDict begin H.S end -2 2123 a -2 2123 a SDict begin 13 H.A end -2 2123 a -2 2123 a SDict begin [ /View [/XYZ H.V] /Dest (510) cvn H.B /DEST pdfmark end -2 2123 a 84 x Fm(W)-7 b(elcome)20 b(to)415 2207 y SDict begin H.S end 415 2207 a 415 2207 a SDict begin 13 H.A end 415 2207 a 415 2207 a SDict begin [ /View [/XYZ H.V] /Dest (511) cvn H.B /DEST pdfmark end 415 2207 a Fm(PyGopherd.)e(In)i(a)h(nutshell,)1287 2207 y SDict begin H.S end 1287 2207 a 1287 2207 a SDict begin 13 H.A end 1287 2207 a 1287 2207 a SDict begin [ /View [/XYZ H.V] /Dest (512) cvn H.B /DEST pdfmark end 1287 2207 a Fm(PyGopherd)d(is)j(a)g(modern)d(dynamic)h (multi-protocol)e(hierarchical)i(information)-2 2315 y(serv)o(er)g(with)h(a)h(pluggable)d(modularized)g(e)o(xtension)g (system,)j(full)f(\003e)o(xible)f(caching,)g(virtual)g(\002les)j(and)d (folders,)g(and)-2 2423 y(autodetection)e(of)j(\002le)g(types)f(--)h (all)g(with)g(support)e(for)h(standardized)f(yet)i(e)o(xtensible)f(per) n(-document)d(metadata.)j(Whe)n(w!)g(Read)h(on)-2 2530 y(for)f(information)f(on)i(this)h(what)f(all)h(these)f(b)n(uzzw)o(ords) f(mean.)-2 2573 y SDict begin H.S end -2 2573 a -2 2573 a SDict begin 13 H.A end -2 2573 a -2 2573 a SDict begin [ /View [/XYZ H.V] /Dest (MANPAGE.QUICKSTART) cvn H.B /DEST pdfmark end -2 2573 a 327 x Fd(Quick)31 b(Start)-2 2981 y SDict begin H.S end -2 2981 a -2 2981 a SDict begin 13 H.A end -2 2981 a -2 2981 a SDict begin [ /View [/XYZ H.V] /Dest (515) cvn H.B /DEST pdfmark end -2 2981 a 87 x Fm(If)20 b(you)f(ha)n(v)o(e)h(already)f(installed)961 3068 y SDict begin H.S end 961 3068 a 961 3068 a SDict begin 13 H.A end 961 3068 a 961 3068 a SDict begin [ /View [/XYZ H.V] /Dest (516) cvn H.B /DEST pdfmark end 961 3068 a Fm(PyGopherd)f (system-wide,)h(or)h(your)f(administrator)f(has)j(done)e(that)h(for)g (you,)f(your)g(task)h(for)-2 3176 y(setting)g(up)344 3176 y SDict begin H.S end 344 3176 a 344 3176 a SDict begin 13 H.A end 344 3176 a 344 3176 a SDict begin [ /View [/XYZ H.V] /Dest (517) cvn H.B /DEST pdfmark end 344 3176 a Fm(PyGopherd)e(for)h(the)h(\002rst)h(time)g(is)g(quite)f (simple.)g(Y)-9 b(ou)19 b(just)i(need)e(to)i(set)g(up)e(your)g (con\002guration)f(\002le,)j(mak)o(e)e(your)-2 3284 y(folder)g (directory)-5 b(,)18 b(and)h(run)h(it!)-2 3343 y SDict begin H.S end -2 3343 a -2 3343 a SDict begin 13 H.A end -2 3343 a -2 3343 a SDict begin [ /View [/XYZ H.V] /Dest (518) cvn H.B /DEST pdfmark end -2 3343 a 90 x Fm(Y)-9 b(ou)19 b(can)h(quickly)f(set)i(up)f(your)f(con\002guration)e(\002le.)k (The)f(distrib)n(ution)f(includes)g(tw)o(o)i(\002les)g(of)f(interest:) -2 3541 y SDict begin H.S end -2 3541 a -2 3541 a SDict begin 13 H.A end -2 3541 a -2 3541 a SDict begin [ /View [/XYZ H.V] /Dest (519) cvn H.B /DEST pdfmark end -2 3541 a Fg(conf/pygopherd.conf)d Fm(and)1011 3541 y SDict begin H.S end 1011 3541 a 1011 3541 a SDict begin 13 H.A end 1011 3541 a 1011 3541 a SDict begin [ /View [/XYZ H.V] /Dest (520) cvn H.B /DEST pdfmark end 1011 3541 a Fg(conf/mime.types)p Fm(.)h(Debian)h(users)i(will)g(\002nd)f(the)g (con\002guration)d(\002le)k(pre-installed)e(in)-2 3649 y SDict begin H.S end -2 3649 a -2 3649 a SDict begin 13 H.A end -2 3649 a -2 3649 a SDict begin [ /View [/XYZ H.V] /Dest (521) cvn H.B /DEST pdfmark end -2 3649 a Fg (/etc/pygopherd/pygopherd.conf)d Fm(and)j(the)1581 3649 y SDict begin H.S end 1581 3649 a 1581 3649 a SDict begin 13 H.A end 1581 3649 a 1581 3649 a SDict begin [ /View [/XYZ H.V] /Dest (522) cvn H.B /DEST pdfmark end 1581 3649 a Fg(mime.types)h Fm(\002le)g(pro)o(vided)e(by)i(the)g(system)g (already)-5 b(.)-2 3708 y SDict begin H.S end -2 3708 a -2 3708 a SDict begin 13 H.A end -2 3708 a -2 3708 a SDict begin [ /View [/XYZ H.V] /Dest (523) cvn H.B /DEST pdfmark end -2 3708 a 90 x Fm(Open)19 b(up)302 3798 y SDict begin H.S end 302 3798 a 302 3798 a SDict begin 13 H.A end 302 3798 a 302 3798 a SDict begin [ /View [/XYZ H.V] /Dest (524) cvn H.B /DEST pdfmark end 302 3798 a Fg(pygopherd.conf)g Fm(in)h(your)f(editor)g(and)h(adjust)g(to)g (suit.)h(The)f(\002le)h(is)g(hea)n(vily)e(commented)f(and)i(you)f(can)h (refer)g(to)g(it)-2 3906 y(for)f(detailed)h(information.)d(Some)j (settings)h(to)f(tak)o(e)g(a)h(look)e(at)i(include:)2155 3906 y SDict begin H.S end 2155 3906 a 2155 3906 a SDict begin 13 H.A end 2155 3906 a 2155 3906 a SDict begin [ /View [/XYZ H.V] /Dest (525) cvn H.B /DEST pdfmark end 2155 3906 a Fm(detach,)2414 3906 y SDict begin H.S end 2414 3906 a 2414 3906 a SDict begin 13 H.A end 2414 3906 a 2414 3906 a SDict begin [ /View [/XYZ H.V] /Dest (526) cvn H.B /DEST pdfmark end 2414 3906 a Fm(pid\002le,)2667 3906 y SDict begin H.S end 2667 3906 a 2667 3906 a SDict begin 13 H.A end 2667 3906 a 2667 3906 a SDict begin [ /View [/XYZ H.V] /Dest (527) cvn H.B /DEST pdfmark end 2667 3906 a Fm(port,)2842 3906 y SDict begin H.S end 2842 3906 a 2842 3906 a SDict begin 13 H.A end 2842 3906 a 2842 3906 a SDict begin [ /View [/XYZ H.V] /Dest (528) cvn H.B /DEST pdfmark end 2842 3906 a Fm(usechroot,)3207 3906 y SDict begin H.S end 3207 3906 a 3207 3906 a SDict begin 13 H.A end 3207 3906 a 3207 3906 a SDict begin [ /View [/XYZ H.V] /Dest (529) cvn H.B /DEST pdfmark end 3207 3906 a Fm(setuid,)3447 3906 y SDict begin H.S end 3447 3906 a 3447 3906 a SDict begin 13 H.A end 3447 3906 a 3447 3906 a SDict begin [ /View [/XYZ H.V] /Dest (530) cvn H.B /DEST pdfmark end 3447 3906 a Fm(setgid,)e(and)-2 4014 y SDict begin H.S end -2 4014 a -2 4014 a SDict begin 13 H.A end -2 4014 a -2 4014 a SDict begin [ /View [/XYZ H.V] /Dest (531) cvn H.B /DEST pdfmark end -2 4014 a Fm(root.)g(These)h(may)g(or)g(may)f(not)h(w)o(ork)g(at)g(their)g(def) o(aults)g(for)g(you.)f(The)h(remaining)e(ones)i(should)f(be)h(\002ne)h (for)e(a)i(basic)f(setup.)-2 4074 y SDict begin H.S end -2 4074 a -2 4074 a SDict begin 13 H.A end -2 4074 a -2 4074 a SDict begin [ /View [/XYZ H.V] /Dest (532) cvn H.B /DEST pdfmark end -2 4074 a 90 x Fm(In)m(v)n(ok)o(e)243 4164 y SDict begin H.S end 243 4164 a 243 4164 a SDict begin 13 H.A end 243 4164 a 243 4164 a SDict begin [ /View [/XYZ H.V] /Dest (533) cvn H.B /DEST pdfmark end 243 4164 a Fm(PyGopherd)e(with)811 4164 y SDict begin H.S end 811 4164 a 811 4164 a SDict begin 13 H.A end 811 4164 a 811 4164 a SDict begin [ /View [/XYZ H.V] /Dest (534) cvn H.B /DEST pdfmark end 811 4164 a Fn(pygopherd)h (path/to/con\002g\002le)g Fm(\(or)1948 4164 y SDict begin H.S end 1948 4164 a 1948 4164 a SDict begin 13 H.A end 1948 4164 a 1948 4164 a SDict begin [ /View [/XYZ H.V] /Dest (535) cvn H.B /DEST pdfmark end 1948 4164 a Fn (/etc/init.d/pygopherd)g(start)g Fm(on)h(Debian\).)f(Place)i(some)f (\002les)-2 4272 y(in)g(the)g(location)g(speci\002ed)f(by)h(the)1035 4272 y SDict begin H.S end 1035 4272 a 1035 4272 a SDict begin 13 H.A end 1035 4272 a 1035 4272 a SDict begin [ /View [/XYZ H.V] /Dest (536) cvn H.B /DEST pdfmark end 1035 4272 a Fm(root)g(directi)n(v)o(e)f(in)h(the)g(con\002g)g(\002le) h(and)e(you')l(re)g(ready)g(to)h(run!)-2 4331 y SDict begin H.S end -2 4331 a -2 4331 a SDict begin 13 H.A end -2 4331 a -2 4331 a SDict begin [ /View [/XYZ H.V] /Dest (OPTIONS) cvn H.B /DEST pdfmark end -2 4331 a 310 x Fd(Options)-2 4725 y SDict begin H.S end -2 4725 a -2 4725 a SDict begin 13 H.A end -2 4725 a -2 4725 a SDict begin [ /View [/XYZ H.V] /Dest (539) cvn H.B /DEST pdfmark end -2 4725 a 84 x Fm(All)125 4809 y SDict begin H.S end 125 4809 a 125 4809 a SDict begin 13 H.A end 125 4809 a 125 4809 a SDict begin [ /View [/XYZ H.V] /Dest (540) cvn H.B /DEST pdfmark end 125 4809 a Fm(PyGopherd)e(con\002guratoin)f(is)k(done)e (via)i(the)f(con\002guration)d(\002le.)k(Therefore,)d(the)i(program)e (has)i(only)g(one)f(command-line)-2 4917 y(option:)-2 4935 y SDict begin H.S end -2 4935 a -2 4935 a SDict begin 13 H.A end -2 4935 a -2 4935 a SDict begin [ /View [/XYZ H.V] /Dest (541) cvn H.B /DEST pdfmark end -2 4935 a Black -2 5569 a SDict begin H.S end -2 5569 a -2 5569 a SDict begin 13 H.A end -2 5569 a -2 5569 a SDict begin [ /View [/XYZ H.V] /Dest (CONFORMING) cvn H.B /DEST pdfmark end -2 5569 a 3800 5638 a Fk(18)p Black eop end %%Page: 19 22 TeXDict begin 19 21 bop -600 -600 a SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end -600 -600 a Black 0 TeXcolorgray -2 -102 a SDict begin H.S end -2 -102 a 0 TeXcolorgray 0 TeXcolorgray -2 -102 a SDict begin H.R end -2 -102 a -2 -102 a SDict begin [ /View [/XYZ H.V] /Dest (page.19) cvn H.B /DEST pdfmark end -2 -102 a Black -2 -201 a SDict begin H.S end -2 -201 a -2 -201 a SDict begin 13 H.A end -2 -201 a -2 -201 a SDict begin [ /View [/XYZ H.V] /Dest (599) cvn H.B /DEST pdfmark end -2 -201 a 3171 -132 a Fk(PyGopher)m(d)18 b(Manpa)o(g)o(e)p Black -2 -11 a SDict begin H.S end -2 -11 a -2 -11 a SDict begin 13 H.A end -2 -11 a -2 -11 a SDict begin [ /View [/XYZ H.V] /Dest (543) cvn H.B /DEST pdfmark end -2 -11 a -2 -11 a SDict begin H.S end -2 -11 a -2 -11 a SDict begin 13 H.A end -2 -11 a -2 -11 a SDict begin [ /View [/XYZ H.V] /Dest (544) cvn H.B /DEST pdfmark end -2 -11 a 83 x Fe(configfile)-2 85 y SDict begin H.S end -2 85 a -2 85 a SDict begin 13 H.A end -2 85 a -2 85 a SDict begin [ /View [/XYZ H.V] /Dest (545) cvn H.B /DEST pdfmark end -2 85 a Black Black 164 222 a SDict begin H.S end 164 222 a 164 222 a SDict begin 13 H.A end 164 222 a 164 222 a SDict begin [ /View [/XYZ H.V] /Dest (546) cvn H.B /DEST pdfmark end 164 222 a Fm(This)i(option)f(ar)o(gument)f(speci\002es) j(the)f(location)f(of)h(the)g(con\002guration)e(\002le)j(that)2563 222 y SDict begin H.S end 2563 222 a 2563 222 a SDict begin 13 H.A end 2563 222 a 2563 222 a SDict begin [ /View [/XYZ H.V] /Dest (547) cvn H.B /DEST pdfmark end 2563 222 a Fm(PyGopherd)d(is)j(to)f(use.)-2 281 y SDict begin H.S end -2 281 a -2 281 a SDict begin 13 H.A end -2 281 a -2 281 a SDict begin [ /View [/XYZ H.V] /Dest (CONFORMING) cvn H.B /DEST pdfmark end -2 281 a 311 x Fd(Conf)m(orming)30 b(T)-11 b(o)-2 616 y SDict begin H.S end -2 616 a -2 616 a SDict begin 13 H.A end -2 616 a -2 616 a SDict begin [ /View [/XYZ H.V] /Dest (550) cvn H.B /DEST pdfmark end -2 616 a -2 676 a SDict begin H.S end -2 676 a -2 676 a SDict begin 13 H.A end -2 676 a -2 676 a SDict begin [ /View [/XYZ H.V] /Dest (551) cvn H.B /DEST pdfmark end -2 676 a Black 203 x Fi(\225)p Black 81 879 a SDict begin H.S end 81 879 a 81 879 a SDict begin 13 H.A end 81 879 a 81 879 a SDict begin [ /View [/XYZ H.V] /Dest (552) cvn H.B /DEST pdfmark end 81 879 a Fm(The)20 b(Internet)f(Gopher)f (Protocol)h(as)i(speci\002ed)f(in)h(RFC1436)-2 897 y SDict begin H.S end -2 897 a -2 897 a SDict begin 13 H.A end -2 897 a -2 897 a SDict begin [ /View [/XYZ H.V] /Dest (553) cvn H.B /DEST pdfmark end -2 897 a Black 131 x Fi(\225)p Black 81 1028 a SDict begin H.S end 81 1028 a 81 1028 a SDict begin 13 H.A end 81 1028 a 81 1028 a SDict begin [ /View [/XYZ H.V] /Dest (554) cvn H.B /DEST pdfmark end 81 1028 a Fm(The)f(Gopher+)e(upw)o(ard-compatible)f (enhancements)h(to)i(the)g(Internet)f(Gopher)g(Protocol)g(from)g(the)h (Uni)n(v)o(ersity)f(of)h(Minnesota)81 1136 y(as)h(laid)f(out)g(at)524 1136 y SDict begin H.S end 524 1136 a 524 1136 a SDict begin 13 H.A end 524 1136 a 524 1136 a SDict begin [ /View [/XYZ H.V] /Dest (555) cvn H.B /DEST pdfmark end 524 1136 a Fm(go-)81 1244 y(pher://gopher)-5 b(.quux.or)n(g)o(/0/Arc)o(hi)n (v)n(es/mirr)o(ors/b)o(oo)o(mbo)o(x.)o(micr)o(o.u)o(mn)o(.ed)o(u/pu)o (b/g)o(op)o(her)o(/go)o(ph)o(er_)o(pro)o(toc)o(ol/Gop)o(her)o(+/Gop)o (he)o(r+.tx)o(t.)-2 1262 y SDict begin H.S end -2 1262 a -2 1262 a SDict begin 13 H.A end -2 1262 a -2 1262 a SDict begin [ /View [/XYZ H.V] /Dest (556) cvn H.B /DEST pdfmark end -2 1262 a Black 132 x Fi(\225)p Black 81 1394 a SDict begin H.S end 81 1394 a 81 1394 a SDict begin 13 H.A end 81 1394 a 81 1394 a SDict begin [ /View [/XYZ H.V] /Dest (557) cvn H.B /DEST pdfmark end 81 1394 a Fm(The)20 b(gophermap)d(\002le)k(format)e(as)i(originally)d (implemented)h(in)h(the)g(Bucktooth)f(gopher)f(serv)o(er)i(and)f (described)g(at)81 1501 y SDict begin H.S end 81 1501 a 81 1501 a SDict begin 13 H.A end 81 1501 a 81 1501 a SDict begin [ /View [/XYZ H.V] /Dest (558) cvn H.B /DEST pdfmark end 81 1501 a Fm(gopher://gopher)-5 b(.\003oodg)o(ap)o(.com)o (/0/b)m(uck/d)o(br)o(o)n(wse\0453Ff)n(aqu)o(se\045201)o(.)-2 1519 y SDict begin H.S end -2 1519 a -2 1519 a SDict begin 13 H.A end -2 1519 a -2 1519 a SDict begin [ /View [/XYZ H.V] /Dest (559) cvn H.B /DEST pdfmark end -2 1519 a Black 132 x Fi(\225)p Black 81 1651 a SDict begin H.S end 81 1651 a 81 1651 a SDict begin 13 H.A end 81 1651 a 81 1651 a SDict begin [ /View [/XYZ H.V] /Dest (560) cvn H.B /DEST pdfmark end 81 1651 a Fm(The)20 b(Links)g(to)g(URL)h (speci\002cation)e(as)i(laid)f(out)g(by)g(John)f(Goerzen)g(at)81 1759 y SDict begin H.S end 81 1759 a 81 1759 a SDict begin 13 H.A end 81 1759 a 81 1759 a SDict begin [ /View [/XYZ H.V] /Dest (561) cvn H.B /DEST pdfmark end 81 1759 a Fm(gopher://gopher)-5 b(.quux)o(.or)n(g)o(/0/Arc)o(hi)n(v)n (es/Mailing)o(\04520L)o(ists/goph)o(er/g)o(op)o(her)f(.20)o(02)o(-02)o (\0453f)o(/MBO)m(X-ME)o(SSA)m(GE/34)o(.)-2 1777 y SDict begin H.S end -2 1777 a -2 1777 a SDict begin 13 H.A end -2 1777 a -2 1777 a SDict begin [ /View [/XYZ H.V] /Dest (562) cvn H.B /DEST pdfmark end -2 1777 a Black 131 x Fi(\225)p Black 81 1908 a SDict begin H.S end 81 1908 a 81 1908 a SDict begin 13 H.A end 81 1908 a 81 1908 a SDict begin [ /View [/XYZ H.V] /Dest (563) cvn H.B /DEST pdfmark end 81 1908 a Fm(The)20 b(UMN)g(format)f(for)h(specifying) e(object)i(attrib)n(utes)g(and)g(links)g(with)g(.cap,)g(.Links,)f (.abstract,)h(and)f(similar)i(\002les)g(as)81 2016 y(speci\002ed)f (else)n(where)f(in)i(this)f(document)f(and)g(implemented)f(by)i(UMN)h (gopherd.)-2 2034 y SDict begin H.S end -2 2034 a -2 2034 a SDict begin 13 H.A end -2 2034 a -2 2034 a SDict begin [ /View [/XYZ H.V] /Dest (564) cvn H.B /DEST pdfmark end -2 2034 a Black 132 x Fi(\225)p Black 81 2166 a SDict begin H.S end 81 2166 a 81 2166 a SDict begin 13 H.A end 81 2166 a 81 2166 a SDict begin [ /View [/XYZ H.V] /Dest (565) cvn H.B /DEST pdfmark end 81 2166 a Fm(The)f(PYG)g (format)g(for)f(e)o(xtensible)g(Python)g(gopher)g(objects)h(as)g (created)g(for)2364 2166 y SDict begin H.S end 2364 2166 a 2364 2166 a SDict begin 13 H.A end 2364 2166 a 2364 2166 a SDict begin [ /View [/XYZ H.V] /Dest (566) cvn H.B /DEST pdfmark end 2364 2166 a Fm(PyGopherd.)-2 2184 y SDict begin H.S end -2 2184 a -2 2184 a SDict begin 13 H.A end -2 2184 a -2 2184 a SDict begin [ /View [/XYZ H.V] /Dest (567) cvn H.B /DEST pdfmark end -2 2184 a Black 131 x Fi(\225)p Black 81 2315 a SDict begin H.S end 81 2315 a 81 2315 a SDict begin 13 H.A end 81 2315 a 81 2315 a SDict begin [ /View [/XYZ H.V] /Dest (568) cvn H.B /DEST pdfmark end 81 2315 a Fm(Hyperte)o(xt)e(T)m(ransfer)h(Protocol)g (HTTP/1.0)h(as)h(speci\002ed)e(in)i(RFC1945)-2 2333 y SDict begin H.S end -2 2333 a -2 2333 a SDict begin 13 H.A end -2 2333 a -2 2333 a SDict begin [ /View [/XYZ H.V] /Dest (569) cvn H.B /DEST pdfmark end -2 2333 a Black 132 x Fi(\225)p Black 81 2465 a SDict begin H.S end 81 2465 a 81 2465 a SDict begin 13 H.A end 81 2465 a 81 2465 a SDict begin [ /View [/XYZ H.V] /Dest (570) cvn H.B /DEST pdfmark end 81 2465 a Fm(Hyperte)o(xt)d(Markup)h(Language)f (\(HTML\))h(3.2)h(and)f(4.0)h(T)m(ransitional)f(as)i(speci\002ed)f(in)g (RFC1866)g(and)g(RFC2854.)-2 2482 y SDict begin H.S end -2 2482 a -2 2482 a SDict begin 13 H.A end -2 2482 a -2 2482 a SDict begin [ /View [/XYZ H.V] /Dest (571) cvn H.B /DEST pdfmark end -2 2482 a Black 132 x Fi(\225)p Black 81 2614 a SDict begin H.S end 81 2614 a 81 2614 a SDict begin 13 H.A end 81 2614 a 81 2614 a SDict begin [ /View [/XYZ H.V] /Dest (572) cvn H.B /DEST pdfmark end 81 2614 a Fm(Maildir)g(as)h(speci\002ed)e(in)842 2614 y SDict begin H.S end 842 2614 a 842 2614 a SDict begin 13 H.A end 842 2614 a 842 2614 a SDict begin [ /View [/XYZ H.V] /Dest (573) cvn H.B /DEST pdfmark end 842 2614 a Fm(http://www)-5 b(.qmail.or)o(g/qmail-man)o(ual-)o(htm)o(l/man5)o (/maild)o(ir)g(.htm)o(l)15 b(and)81 2722 y SDict begin H.S end 81 2722 a 81 2722 a SDict begin 13 H.A end 81 2722 a 81 2722 a SDict begin [ /View [/XYZ H.V] /Dest (574) cvn H.B /DEST pdfmark end 81 2722 a Fm(http://cr)-5 b(.yp.to/proto/maildir)g(.html.)-2 2740 y SDict begin H.S end -2 2740 a -2 2740 a SDict begin 13 H.A end -2 2740 a -2 2740 a SDict begin [ /View [/XYZ H.V] /Dest (575) cvn H.B /DEST pdfmark end -2 2740 a Black 131 x Fi(\225)p Black 81 2871 a SDict begin H.S end 81 2871 a 81 2871 a SDict begin 13 H.A end 81 2871 a 81 2871 a SDict begin [ /View [/XYZ H.V] /Dest (576) cvn H.B /DEST pdfmark end 81 2871 a Fm(The)20 b(mbox)f(mail)h(storage)f(format)g(as)i (speci\002ed)f(in)1603 2871 y SDict begin H.S end 1603 2871 a 1603 2871 a SDict begin 13 H.A end 1603 2871 a 1603 2871 a SDict begin [ /View [/XYZ H.V] /Dest (577) cvn H.B /DEST pdfmark end 1603 2871 a Fm(http://www)-5 b(.qmail.or)o(g/qmail-man)o(ua)o(l-htm)o(l/man5)o(/mb)o(ox)o(.h)o(tml.) -2 2889 y SDict begin H.S end -2 2889 a -2 2889 a SDict begin 13 H.A end -2 2889 a -2 2889 a SDict begin [ /View [/XYZ H.V] /Dest (578) cvn H.B /DEST pdfmark end -2 2889 a Black 132 x Fi(\225)p Black 81 3021 a SDict begin H.S end 81 3021 a 81 3021 a SDict begin 13 H.A end 81 3021 a 81 3021 a SDict begin [ /View [/XYZ H.V] /Dest (579) cvn H.B /DEST pdfmark end 81 3021 a Fm(Re)o(gistered)19 b(MIME)h(media)g(types)g(as)h(speci\002ed)f(in)g(RFC2048.)-2 3039 y SDict begin H.S end -2 3039 a -2 3039 a SDict begin 13 H.A end -2 3039 a -2 3039 a SDict begin [ /View [/XYZ H.V] /Dest (580) cvn H.B /DEST pdfmark end -2 3039 a Black 131 x Fi(\225)p Black 81 3170 a SDict begin H.S end 81 3170 a 81 3170 a SDict begin 13 H.A end 81 3170 a 81 3170 a SDict begin [ /View [/XYZ H.V] /Dest (581) cvn H.B /DEST pdfmark end 81 3170 a Fm(Script)g(e)o(x)o(ecution)e (conforming)f(to)j(both)g(UMN)g(standards)g(as)g(laid)h(out)f(in)g(UMN) g(gopherd\(1\))d(and)j(Bucktooth)e(standards)i(as)81 3278 y(speci\002ed)g(at)477 3278 y SDict begin H.S end 477 3278 a 477 3278 a SDict begin 13 H.A end 477 3278 a 477 3278 a SDict begin [ /View [/XYZ H.V] /Dest (582) cvn H.B /DEST pdfmark end 477 3278 a Fm(gopher://gopher)-5 b(.\003oodgap)o(.co)o(m:7)o(0/0)o(/b)n(uck)o(/db)o(ro)m(wse\0453f)n(f)n (aquse\0452)o(02)o(,)15 b(so)20 b(f)o(ar)h(as)f(each)g(can)g(be)g (implemented)81 3386 y(consistent)g(with)g(secure)g(design)f (principles.)-2 3404 y SDict begin H.S end -2 3404 a -2 3404 a SDict begin 13 H.A end -2 3404 a -2 3404 a SDict begin [ /View [/XYZ H.V] /Dest (583) cvn H.B /DEST pdfmark end -2 3404 a Black 131 x Fi(\225)p Black 81 3535 a SDict begin H.S end 81 3535 a 81 3535 a SDict begin 13 H.A end 81 3535 a 81 3535 a SDict begin [ /View [/XYZ H.V] /Dest (584) cvn H.B /DEST pdfmark end 81 3535 a Fm(Standard)g (Python)g(2.2.1)g(or)g(abo)o(v)o(e)g(as)i(implemented)d(on)i (POSIX-compliant)e(systems.)-2 3553 y SDict begin H.S end -2 3553 a -2 3553 a SDict begin 13 H.A end -2 3553 a -2 3553 a SDict begin [ /View [/XYZ H.V] /Dest (585) cvn H.B /DEST pdfmark end -2 3553 a Black 132 x Fi(\225)p Black 81 3685 a SDict begin H.S end 81 3685 a 81 3685 a SDict begin 13 H.A end 81 3685 a 81 3685 a SDict begin [ /View [/XYZ H.V] /Dest (586) cvn H.B /DEST pdfmark end 81 3685 a Fm(W)-10 b(AP/WML)21 b(as)g(de\002ned)e(by)h(the)g(W)-10 b(AP)21 b(F)o(orum.)-2 3744 y SDict begin H.S end -2 3744 a -2 3744 a SDict begin 13 H.A end -2 3744 a -2 3744 a SDict begin [ /View [/XYZ H.V] /Dest (BUGS) cvn H.B /DEST pdfmark end -2 3744 a 311 x Fd(Bugs)-2 4139 y SDict begin H.S end -2 4139 a -2 4139 a SDict begin 13 H.A end -2 4139 a -2 4139 a SDict begin [ /View [/XYZ H.V] /Dest (589) cvn H.B /DEST pdfmark end -2 4139 a 83 x Fm(Reports)f(of)g (b)n(ugs)g(should)f(be)h(sent)g(via)h(e-mail)f(to)g(the)1601 4222 y SDict begin H.S end 1601 4222 a 1601 4222 a SDict begin 13 H.A end 1601 4222 a 1601 4222 a SDict begin [ /View [/XYZ H.V] /Dest (590) cvn H.B /DEST pdfmark end 1601 4222 a Fm(PyGopherd)e(b)n(ug-tracking)f(system)k(\(BTS\))f(at)-2 4330 y SDict begin H.S end -2 4330 a -2 4330 a SDict begin 13 H.A end -2 4330 a -2 4330 a SDict begin [ /View [/XYZ H.V] /Dest (591) cvn H.B /DEST pdfmark end -2 4330 a Fm(<)p Fg(pygopherd@bugs.complete.org)p Fm(>)c(or)k(submitted)f (online)g(using)h(the)g(W)-7 b(eb)21 b(interf)o(ace)e(at)2874 4330 y SDict begin H.S end 2874 4330 a 2874 4330 a SDict begin 13 H.A end 2874 4330 a 2874 4330 a SDict begin [ /View [/XYZ H.V] /Dest (592) cvn H.B /DEST pdfmark end 2874 4330 a Fm(http://b)n(ugs.complete.or)o(g/.)-2 4390 y SDict begin H.S end -2 4390 a -2 4390 a SDict begin 13 H.A end -2 4390 a -2 4390 a SDict begin [ /View [/XYZ H.V] /Dest (593) cvn H.B /DEST pdfmark end -2 4390 a 90 x Fm(The)h(W)-7 b(eb)20 b(site)i(also)e(lists)i(all)e(current)f(b) n(ugs,)h(where)g(you)f(can)h(check)f(their)h(status)h(or)f(contrib)n (ute)f(to)h(\002xing)g(them.)-2 4539 y SDict begin H.S end -2 4539 a -2 4539 a SDict begin 13 H.A end -2 4539 a -2 4539 a SDict begin [ /View [/XYZ H.V] /Dest (COPYRIGHT) cvn H.B /DEST pdfmark end -2 4539 a 310 x Fd(Copyright)-2 4933 y SDict begin H.S end -2 4933 a -2 4933 a SDict begin 13 H.A end -2 4933 a -2 4933 a SDict begin [ /View [/XYZ H.V] /Dest (596) cvn H.B /DEST pdfmark end -2 4933 a -2 4933 a SDict begin H.S end -2 4933 a -2 4933 a SDict begin 13 H.A end -2 4933 a -2 4933 a SDict begin [ /View [/XYZ H.V] /Dest (597) cvn H.B /DEST pdfmark end -2 4933 a 84 x Fm(PyGopherd)e(is)j(Cop)o(yright)d(\(C\))j(2002,)d(2003)h (John)h(Goerzen.)p Black 3800 5569 a Fk(19)p Black eop end %%Page: 20 23 TeXDict begin 20 22 bop -600 -600 a SDict begin /product where{pop product(Distiller)search{pop pop pop version(.)search{exch pop exch pop(3011)eq{gsave newpath 0 0 moveto closepath clip/Courier findfont 10 scalefont setfont 72 72 moveto(.)show grestore}if}{pop}ifelse}{pop}ifelse}if end -600 -600 a Black 0 TeXcolorgray -2 -102 a SDict begin H.S end -2 -102 a 0 TeXcolorgray 0 TeXcolorgray -2 -102 a SDict begin H.R end -2 -102 a -2 -102 a SDict begin [ /View [/XYZ H.V] /Dest (page.20) cvn H.B /DEST pdfmark end -2 -102 a Black 3171 -132 a Fk(PyGopher)m(d)18 b(Manpa)o(g)o(e)p Black -2 -11 a SDict begin H.S end -2 -11 a -2 -11 a SDict begin 13 H.A end -2 -11 a -2 -11 a SDict begin [ /View [/XYZ H.V] /Dest (598) cvn H.B /DEST pdfmark end -2 -11 a 83 x Fm(This)i(program)e (is)j(free)f(softw)o(are;)g(you)f(can)h(redistrib)n(ute)f(it)i(and/or)e (modify)g(it)i(under)e(the)h(terms)g(of)g(the)g(GNU)h(General)e(Public) -2 180 y(License)h(as)h(published)d(by)i(the)g(Free)h(Softw)o(are)e(F)o (oundation;)f(v)o(ersion)h(2)h(of)g(the)g(License.)-2 330 y(This)g(program)e(is)j(distrib)n(uted)f(in)g(the)g(hope)f(that)i (it)f(will)h(be)g(useful,)e(b)n(ut)h(WITHOUT)g(ANY)h(W)-10 b(ARRANTY)i(;)22 b(without)d(e)n(v)o(en)g(the)-2 438 y(implied)g(w)o(arranty)g(of)h(MERCHANT)-8 b(ABILITY)20 b(or)g(FITNESS)g(FOR)h(A)g(P)-8 b(AR)j(TICULAR)21 b(PURPOSE.)g(See)g (the)f(GNU)h(General)-2 546 y(Public)f(License)g(for)f(more)h(details.) -2 588 y SDict begin H.S end -2 588 a -2 588 a SDict begin 13 H.A end -2 588 a -2 588 a SDict begin [ /View [/XYZ H.V] /Dest (600) cvn H.B /DEST pdfmark end -2 588 a 107 x Fm(Y)-9 b(ou)19 b(should)h(ha)n(v)o(e)f(recei)n(v)o(ed)g(a)h(cop) o(y)g(of)g(the)g(GNU)g(General)g(Public)g(License)g(along)f(with)h (this)h(program;)d(if)j(not,)e(write)i(to:)-2 796 y SDict begin H.S end -2 796 a -2 796 a SDict begin 11.7 H.A end -2 796 a -2 796 a SDict begin [ /View [/XYZ H.V] /Dest (601) cvn H.B /DEST pdfmark end -2 796 a 79 x Fg(Free)44 b(Software)f(Foundation,)g(Inc.)-2 972 y(59)h(Temple)g(Place)-2 1070 y(Suite)g(330)-2 1167 y(Boston,)f(MA)90 b(02111-1307)-2 1264 y(USA)-2 1444 y SDict begin H.S end -2 1444 a -2 1444 a SDict begin 13 H.A end -2 1444 a -2 1444 a SDict begin [ /View [/XYZ H.V] /Dest (AUTHOR) cvn H.B /DEST pdfmark end -2 1444 a 328 x Fd(A)-6 b(uthor)-2 1833 y SDict begin H.S end -2 1833 a -2 1833 a SDict begin 13 H.A end -2 1833 a -2 1833 a SDict begin [ /View [/XYZ H.V] /Dest (604) cvn H.B /DEST pdfmark end -2 1833 a -2 1833 a SDict begin H.S end -2 1833 a -2 1833 a SDict begin 13 H.A end -2 1833 a -2 1833 a SDict begin [ /View [/XYZ H.V] /Dest (605) cvn H.B /DEST pdfmark end -2 1833 a 107 x Fm(PyGopherd,)17 b(its)22 b(libraries,)d(documentation,)e(and)j(all)h (included)d(\002les)j(\(e)o(xcept)e(where)h(noted\))f(w)o(as)i(written) f(by)f(John)h(Goerzen)-2 2048 y SDict begin H.S end -2 2048 a -2 2048 a SDict begin 13 H.A end -2 2048 a -2 2048 a SDict begin [ /View [/XYZ H.V] /Dest (606) cvn H.B /DEST pdfmark end -2 2048 a Fm(<)p Fg(jgoerzen@complete.org)p Fm(>)d(and)i(cop)o(yright)f(is)k(held)d(as)i(stated)g(in)f(the)g(Cop)o (yright)f(section.)-2 2107 y SDict begin H.S end -2 2107 a -2 2107 a SDict begin 13 H.A end -2 2107 a -2 2107 a SDict begin [ /View [/XYZ H.V] /Dest (607) cvn H.B /DEST pdfmark end -2 2107 a 90 x Fm(Portions)g(of)h(this)h(manual)e (\(speci\002cally)h(relating)f(to)h(certian)g(UMN)g(gopherd)e(features) i(and)f(characteristics)h(that)g(PyGopherd)-2 2305 y(emulates\))f(are)h (modi\002ed)f(v)o(ersions)h(of)g(the)g(original)f(gopherd\(1\))d (manpage)j(accompan)o(ying)e(the)j(UMN)g(gopher)f(distrib)n(ution.)-2 2413 y(That)h(document)e(is)j(distrib)n(uted)e(under)g(the)h(same)h (terms)f(as)h(this,)f(and)g(bears)g(the)g(follo)n(wing)f(cop)o(yright)f (notices:)-2 2514 y SDict begin H.S end -2 2514 a -2 2514 a SDict begin 11.7 H.A end -2 2514 a -2 2514 a SDict begin [ /View [/XYZ H.V] /Dest (608) cvn H.B /DEST pdfmark end -2 2514 a 79 x Fg(Copyright)43 b(\(C\))h(1991-2000)89 b(University)43 b(of)h(Minnesota)-2 2690 y(Copyright)f(\(C\))h (2000-2002)89 b(John)44 b(Goerzen)f(and)i(other)f(developers)-2 2870 y SDict begin H.S end -2 2870 a -2 2870 a SDict begin 13 H.A end -2 2870 a -2 2870 a SDict begin [ /View [/XYZ H.V] /Dest (609) cvn H.B /DEST pdfmark end -2 2870 a -2 2870 a SDict begin H.S end -2 2870 a -2 2870 a SDict begin 13 H.A end -2 2870 a -2 2870 a SDict begin [ /View [/XYZ H.V] /Dest (610) cvn H.B /DEST pdfmark end -2 2870 a 108 x Fm(PyGopherd)18 b(may)h(be)i(do)n(wnloaded,)c(and)i (information)f(found,)g(from)i(its)h(homepage)d(via)i(either)g(Gopher)e (or)i(HTTP:)-2 3038 y SDict begin H.S end -2 3038 a -2 3038 a SDict begin 13 H.A end -2 3038 a -2 3038 a SDict begin [ /View [/XYZ H.V] /Dest (611) cvn H.B /DEST pdfmark end -2 3038 a -2 3038 a SDict begin H.S end -2 3038 a -2 3038 a SDict begin 13 H.A end -2 3038 a -2 3038 a SDict begin [ /View [/XYZ H.V] /Dest (612) cvn H.B /DEST pdfmark end -2 3038 a 90 x Fm(gopher://quux.or)o(g/1)o(/de)m(v)o(el/g)o (op)o(her)o(/p)o(yg)o(op)o(her)o(d)-2 3187 y SDict begin H.S end -2 3187 a -2 3187 a SDict begin 13 H.A end -2 3187 a -2 3187 a SDict begin [ /View [/XYZ H.V] /Dest (613) cvn H.B /DEST pdfmark end -2 3187 a -2 3187 a SDict begin H.S end -2 3187 a -2 3187 a SDict begin 13 H.A end -2 3187 a -2 3187 a SDict begin [ /View [/XYZ H.V] /Dest (614) cvn H.B /DEST pdfmark end -2 3187 a 90 x Fm(http://quux.or)o (g/de)n(v)o(el/g)o(op)o(her)o(/p)o(yg)o(op)o(her)o(d)-2 3337 y SDict begin H.S end -2 3337 a -2 3337 a SDict begin 13 H.A end -2 3337 a -2 3337 a SDict begin [ /View [/XYZ H.V] /Dest (615) cvn H.B /DEST pdfmark end -2 3337 a -2 3337 a SDict begin H.S end -2 3337 a -2 3337 a SDict begin 13 H.A end -2 3337 a -2 3337 a SDict begin [ /View [/XYZ H.V] /Dest (616) cvn H.B /DEST pdfmark end -2 3337 a 90 x Fm(PyGopherd)e(may)h(also)i(be)f(do)n(wnloaded)e(using)h (Sub)o(v)o(ersion.)f(Additionally)-5 b(,)18 b(the)i(distrib)n(uted)f (tar)-5 b(.gz)20 b(may)g(be)g(updated)e(with)j(a)-2 3535 y(simple)f("svn)g(update")f(command;)f(it)j(is)g(ready)e(to)i(go.)e(F)o (or)h(information)e(on)i(getting)2518 3535 y SDict begin H.S end 2518 3535 a 2518 3535 a SDict begin 13 H.A end 2518 3535 a 2518 3535 a SDict begin [ /View [/XYZ H.V] /Dest (617) cvn H.B /DEST pdfmark end 2518 3535 a Fm(PyGopherd)e(with)i (Sub)o(v)o(ersion,)e(please)i(visit)-2 3643 y SDict begin H.S end -2 3643 a -2 3643 a SDict begin 13 H.A end -2 3643 a -2 3643 a SDict begin [ /View [/XYZ H.V] /Dest (618) cvn H.B /DEST pdfmark end -2 3643 a Fm(http://svn.complete.or)o (g/.)-2 3702 y SDict begin H.S end -2 3702 a -2 3702 a SDict begin 13 H.A end -2 3702 a -2 3702 a SDict begin [ /View [/XYZ H.V] /Dest (619) cvn H.B /DEST pdfmark end -2 3702 a 310 x Fd(See)30 b(Also)-2 4073 y SDict begin H.S end -2 4073 a -2 4073 a SDict begin 13 H.A end -2 4073 a -2 4073 a SDict begin [ /View [/XYZ H.V] /Dest (621) cvn H.B /DEST pdfmark end -2 4073 a 107 x Fm(p)o(ython)18 b(\(1\).)p Black 3800 5569 a Fk(20)p Black eop end %%Trailer userdict /end-hook known{end-hook}if %%EOF pygopherd-2.0.18.3+nmu4ubuntu1/doc/pygopherd.txt0000664000000000000000000010631610762620505016360 0ustar PYGOPHERD(8) PyGopherd Manual PYGOPHERD(8) NAME PyGopherd - Multiprotocol Information Server SYNOPSIS pygopherd [ configfile ] DESCRIPTION Welcome to PyGopherd. In a nutshell, PyGopherd is a modern dynamic multi-protocol hierarchical information server with a pluggable modu- larized extension system, full flexible caching, virtual files and folders, and autodetection of file types -- all with support for stan- dardized yet extensible per-document metadata. Whew! Read on for infor- mation on this what all these buzzwords mean. FEATURES Here are some of PyGopherd's features: o Provides built-in support for multiple protocols: HTTP (Web), Gopher+, Gopher (RFC1436), Enhanced Gopher0, and WAP (mobile phones). Protocols can be enabled or disabled as desired. o Provides protocol autodetection. That is, PyGopherd can listen for all the above protocols on a single port and will automatically respond using the protocol it detects the client is using. Practical effects of this are that you can, for instance, give out a single URL and have it viewable normally on desktop Web browsers and in WAP mode on mobile phones -- and appropriately in various Gopher browsers. o Metadata and site links can be entered in a variety of formats, including full UMN dotfile metadata formats as well as Bucktooth gophermap files. Moreover, gophermap files are not limited to Gopher protocols, and can be used for all protocols. o Support for inter-protocol linking (linking from Gopher sites to web sites) o Virtual folder system lets you serve up anything as if it were regu- lar files and directories. PyGopherd comes with the following vir- tual folder systems built in: o Can present any Unix MBOX, MMDF box, MH directory, Maildir direc- tory, or Babyl mailbox as a virtual folder, the contents of which are the messages in the mailbox. o Can use a configurable separator to split a file into multiple parts, the first line of each becoming the name for the virtual folder. o Can peek inside a ZIP file and serve it up as first-class site cit- izens -- metadata can even be stored in the ZIP files. o Can serve up the contents of a dictd server as a filesystem. o Modular, extensible design: you can use PyGopherd's own PYG extension format, or UMN- or Bucktooth-style executables. o Runs on any platform supported by Python 2.2 or 2.3. This includes virtually every past and current flavor of Unix (Linux, *BSD, Solaris, SunOS), Windows, MacOS 9.x and X, and more. Some features may not be available on non-Unix platforms. o Runs on any platform supported by Java 1.1 via the Jython Python implementation. o Tunable server types via configuration directive -- forking or threading. o Secure design with support for chrooted execution. o Feature-complete, full implementations of: Gopher0 (RFC1435), Gopher+, HTTP, and WAP. o Support for automatically finding the titles of HTML documents for presentation in a directory. o Versatile configuration file format is both extensible and nicely complementary of the module system. o Protocol-independant, handler-dependant caching. This increases per- formance by letting handlers cache dynamically-generated information -- currently used by the directory handlers. This can improve per- formance of directories by several orders of magnitude. Because this is a handler cache only, all protococls share the single cache. Since the processing time for the protocols is negligable, this works out very well. o Autosensing of MIME types and gopher0 item types. Both are com- pletely configurable. MIME type detection is done using a standard mime.types file, and gopher0 types are calculated by using a config- urable regexp-based MIME-to-gophertype map. o Heavy support of regular expressions in configuration. o ProtocolMultiplexer and HandlerMultiplexer let you choose only those protocols and handlers that you wish your server to support and the order in which they are tried when a request comes in. o Full logging via syslog. ABOUT GOPHER PyGopherd started life as a server for the Gopher Internet protocol. With Gopher, you can mount a filesystem (viewing files and folders as if they were local), browse Gopherspace with a web browser, download files, and be interactive with searching. But this is only part of the story. The world of Gopher is more expan- sive than this. There are two major gopher protocols: Gopher0 (also known as RFC1436) and Gopher+. Gopher0 is a small, simple, lightweight protocol that is very functional yet also extremely easy to implement. Gopher0 clients can be easily places in small embedded devices or in massive environments like a modern web browser. Gopher+ is based on Gopher0 but extends it by providing document meta- data such as file size and MIME type. Gopher+ allows all sorts of neat features, such as configurable metadata (serving up a bunch of photos? Add a Subject field to your metadata to let a customized photo browser display who is pictured) and multiple views of a file (let the user select to view your photos as PNG or JPEG). QUICK START If you have already installed PyGopherd system-wide, or your adminis- trator has done that for you, your task for setting up PyGopherd for the first time is quite simple. You just need to set up your configu- ration file, make your folder directory, and run it! You can quickly set up your configuration file. The distribution includes two files of interest: conf/pygopherd.conf and conf/mime.types. Debian users will find the configuration file pre- installed in /etc/pygopherd/pygopherd.conf and the mime.types file pro- vided by the system already. Open up pygopherd.conf in your editor and adjust to suit. The file is heavily commented and you can refer to it for detailed information. Some settings to take a look at include: detach, pidfile, port, usech- root, setuid, setgid, and root. These may or may not work at their defaults for you. The remaining ones should be fine for a basic setup. Invoke PyGopherd with pygopherd path/to/configfile (or /etc/init.d/pygopherd start on Debian). Place some files in the loca- tion specified by the root directive in the config file and you're ready to run! INSTALLATION If you are reading this document via the "man" command, it is likely that you have no installation tasks to perform; your system administra- tor has already installed PyGopherd. If you need to install it your- self, you have three options: a system-wide installation with Debian, system-wide installation with other systems, and a single-user installation. You can download the latest version of PyGopherd from DEBIAN SYSTEM-WIDE INSTALLATION If you are tracking Debian unstable, you may install PyGopherd by sim- ply running this command as root: apt-get install pygopherd If you are not tracking Debian unstable, download the .deb package from the PyGopherd website and then run dpkg -i to install the downloaded package. Then, skip to the configuration section below. You will use /etc/init.d/pygopherd start to start the program. OTHER SYSTEM-WIDE INSTALLATION Download the tar.gz version of the package from the website. Make sure you have Python 2.2 or above installed; if now, download and install it from . Then run these commands: tar -zxvf pygopherd-x.y.z.tar.gz cd pygopherd-x.y.z python2.2 setup.py Some systems will use python or python2.3 in place of python2.2. Next, proceed to configuration. Make sure that the /etc/pygo- pherd/pygopherd.conf file names valid users (setuid and setgid options) and a valid document root (root option). You will type pygopherd to invoke the program. SINGLE-ACCOUNT INSTALLATION Download the tar.gz version of the package from the website. Make sure you have Python 2.2 or above installed; if now, download and install it from . Then run these commands: tar -zxvf pygopherd-z.y.z.tar.gz cd pygopherd-x.y.z Modify conf/pygopherd.conf as follows: o Set usechroot = no o Comment out (add a # sign to the start of the line) the pidfile, setuid, and setgid lines. o Set root to osomething appropriate. o Set port to a number greater than 1024. When you want to run PyGopherd, you will issue the cd command as above and then type PYTHONPATH=. bin/pygopherd. There is no installation step necessary. CONFIGURATION PyGopherd is regulated by a configuratoin file normally stored in /etc/pygopherd/pygopherd.conf. You can specify an alternate configura- tion file on the command line. The PyGopherd distribution ships with a sample pygopherd.conf file that thoroughly documents the configuration file options and settings. OPTIONS All PyGopherd configuratoin is done via the configuration file. There- fore, the program has only one command-line option: configfile This option argument specifies the location of the configuration file that PyGopherd is to use. HANDLERS PyGopherd defines several handlers which are responsible for finding data on your server and presenting it to the user. The handlers are used to generate things like links to other documents and directory listings. They are also responsible for serving up regular files and even virtual folders. Handlers are specified with the handlers option in pygopherd.conf. This option is a list of handlers to use. For each request that arrives, PyGopherd will ask each handler in turn whether or not it can handle the request, and will handle the request according to the first handler that is capable of doing so. If no handlers can handle the request, a file not found error is generated. See the example configu- ration file for an example. The remaining parts of this section describe the different handlers that ship with PyGopherd. Please note that some versions of this man- ual may show the handlers in all caps; however, their names are not all caps and are case-sensitive. DIR.DIRHANDLER This handler is a basic one that generates menus based on the contents of a directory. It is used for directories that contain neither a gophermap file nor UMN-style links files, or situations where you have no need for either of those. This handler simply reads the contents of your on-disk directory, determines the appropriate types of each file, and sends the result to the client. The descriptions of each item are usually set to the file- name, but the html.HTMLFileTitleHandler may override that. GOPHERMAP.BUCKGOPHERMAPHANDLER This handler is used to generate directory listings based on gophermap files. It will not read the directory on-disk, instead serving content from the gophermap file only. Gophermaps are useful if you want to present a directory in which the files do not frequently change and there is general information to present. Overall, if you only wish to present information particular to certain files, you should consider using the abstract feature of UMN.UMNDirHandler. The gophermap files contain two types of lines, which are described here using the same convention normally used for command line argu- ments. In this section, the symbol \t will be used to indicate a tab character, Control-I. full line of informational text gophertypeDESCRIPTION [ \tselector [ \thost [ \tport ] ] ] Note: spaces shown above are for clarity only and should not actually be present in your file. The informational text must not contain any tab characters, but may contain spaces. Informational text will be rendered with gopher type i, which will cause it to be displayed on a client's screen at its par- ticular position in the file. The second type of line represents a link to a file or directory. It begins with a single-character Gopher type (see Gopher Item Types below) followed immediately by a description and a tab character. There is no space or other separator between the gopher type and the description. The description may contain spaces but not tabs. The remaining arguments are optional, but only to the extent that argu- ments may be omitted only if all arguments after them are also omitted. These arguments are: selector The selector is the name of the file on the server. If it begins with a slash, it is an absolute path; otherwise, it is interpreted relative to the directory that the gophermap file is in. If no selector is specified, the description is also used as the selector. host The host specifies the host on which this resource is located. If not specified, defaults to the current server. port The port specifies the port on which the resource is located. If not specified, defaults to the port the current server is listening on. An example of a gophermap to help illustrate the concept is included with the PyGopherd distribution in the file examples/gophermap. FILE.COMPRESSEDFILEHANDLER In order to save space, you might want to store documents on-disk in a compressed format. But then clients would ordinarily have to decom- press the files themselves. It would be nice to have the server auto- matically decompress the files on the fly, sending that result to the client. That's where file.CompressedFileHandler comes in. This handler will take compressed files, pipe them through your chosen decompression program, and send the result directly to clients -- com- pletely transparently. To use this handler, set the decompressors option in the configuration file. This option defines a mapping from MIME encodings (as defined with the encoding option) to decompression programs. Files that are not encoded, or which have an encoding that does not occur in the decompressors map, will not be decompressed by this handler. Please see the sample configuration file for more examples and details about the configuration of this handler. FILE.FILEHANDLER The file.FileHandler is just that -- its duty is to serve up regular files to clients. HTML.HTMLFILETITLEHANDLER This handler is used when generating directories and will set the description of HTML files to the HTML title defined in them rather than let it be the default filename. Other than that, it has no effect. UMN gopherd implements a similar policy. MBOX HANDLERS There are four mailbox handlers: o mbox.MaildirFolderHandler o mbox.MaildirMessageHandler o mbox.MBoxMessageHandler o mbox.MBoxFolderHandler These four handlers provide a unique "virtual folder" service. They allow you to present mailboxes as if they were folders, the items of the folders being the messages in the mailbox, organized by subject. This is useful for presenting mail archives or just making e-mail accessible in a nice and easy fashion. To use these handlers, all you have to do is enable them in your han- dlers section. They will automatically detect requests for mailboxes and handle them appropriately. The different handlers are for traditional Unix mbox mailboxes (all messages in a single file) and new qmail-stype Maildir mailboxes. You can enable only the two handlers for the specific mailbox type that you use, if desired. PYG.PYGHANDLER PYG (short for PYGopherd) is a mechanism that provides a tremendous amount of flexibility. Rather than just letting you execute a script like other Gopher or HTTP servers, PYGs are actually loaded up into PyGopherd and become fully-capable first-class virtual handlers. Yet they need not be known ahead of time, and are loaded dynamically. With a PYG handler, you can generate gopher directories, handle searches, generate files, and more on the fly. You can create entire virtual directory trees (for instance, to interface with NNTP servers or with DICT servers), and access them all using the standard Gopher protocol. All of this without having to modify even one line of PyGo- pherd code. If enabled, the pyg.PYGHandler will look for files with the extension .pyg that are marked executable. If found, they will be loaded and run as PYGs. Please note: this module provides the capability to execute arbitrary code. Please consider the security ramifications of that before enabling it. See the virtual.Virtual handler for more information about passing data to your scripts at runtime. At present, documentation on writing PYGs is not provides, but you may find examples in the pygfarm directory included with the PyGopherd dis- tribution. SCRIPTEXEC.EXECHANDLER This handler implements "old-style" script execution; that is, execut- ing arbitrary programs and piping the result to the client. It is, for the most part, compatible with both scripts written for UMN gopherd and the Bucktooth gopher server. If enabled, it will execute any file that is marked executable in the filesystem. It will normally list scripts as returning plain text, but you may create a custom link to the script that defines it as returning whatever kind of file you desire. Unlike PYGs, this type must be known in advance. The scriptexec.ExecHandler will set environment variables for your scripts to use. They are as follows: SERVER_NAME The name of this server as defined in the configuration file or detected from the operating system. SERVER_PORT The port this server is listening on. REMOTE_ADDR The IP address of the client. REMOTE_PORT The port number of the client. REMOTE_HOST The same value as REMOTE_ADDR SELECTOR The file that was requested; that is, the relative path to this script. If the selector included additional parameters after a |, they will be included in this string as well. REQUEST The "base" part of the selector; that is, the part leading up to the |. SEARCHREQUEST Included only if the client specified search data, this is used if the client is searching for something. See the virtual.Virtual handler for more information about passing data to your scripts at runtime. Please note: this module provides the capability to execute arbitrary code. Please consider the security ramifications of that before enabling it. UMN.UMNDIRHANDLER This is one of the most powerful workhorse handlers in PyGopherd. It is designed to emulate most of the ways in which the UMN gopherd dis- tribution generates directories, even going so far as to be bug-compat- ible in some cases. Generating directories with this handler is often the best general-purpose way to make nice directories in gopherspace. The remainder of the description of the UMN.UMNDirHandler, except for the Abstracts and Info section, is lifted directly from the original UMN gopherd documentation, with light editing, because this handler implements it so exactly that there was no point in rewriting all that documentation :-) LINKS You can override the default view of a directory as generated by dir.DirHandler by creating what are known as Links in the data tree. The ability to make links to other hosts is how gopher distributes itself among multiple hosts. There are two different ways to make a link. The first and simplest is to create a link file that contains the data needed by the server. By default all files in the gopher data directory starting with a period are taken to be link files. A link file can contain multiple links. To define a link you need to put five lines in a link file that define the needed characteristics for the document. Here is an example of a link. Name=Cheese Ball Recipes Numb=1 Type=1 Port=150 Path=1/Moo/Cheesy Host=zippy.micro.umn.edu The Name= line is what the user will see when cruising through the database. In this case the name is "Cheese Ball Recipes". The "Type=" defines what kind of document this object is. For a list of all defined types, see Gopher Item Types below. For Gopher+ and HTTP, a MIME type is also used, which is determined automatically based on the type you specify. The "Path=" line contains the selector string that the client will use to retrieve the actual document. The Numb= specifies that this entry should be presented first in the directory list (instead of being alphabetized). The "Numb=" line is optional. If it is present it can- not be the last line of the link. The "Port=" and "Host=" lines spec- ify a fully qualified domain name (FQDN) and a port respectively. You may substitute a plus '+' for these two parameters if you wish. The server will insert the current hostname and the current port when it sees a plus in either of these two fields. An easy way to retrieve links is to use the Curses Gopher Client. By pressing '=' You can get information suitable for inclusion in a link file. OVERRIDING DEFAULTS The server looks for a directory called .cap when parsing a directory. The server then checks to see if the .cap directory contains a file with the same name as the file it's parsing. If this file exists then the server will open it for reading. The server parses this file just like a link file. However, instead of making a new object, the parame- ters inside the .cap/ file are used to override any of the server sup- plied default values. For instance, say you wanted to change the Title of a text file for gopher, but don't want to change the filename. You also don't want it alphabetized, instead you want it second in the directory listing. You could make a set-aside file in the .cap directory with the same file- name that contained the following lines: Name=New Long Cool Name Numb=2 An alternative to .cap files are extended link files. They work just the same as the files described in Links above, but have a somewhat abbreviated format. As an example, if the name of the file was file- to-change, then you could create a file called .names with the follow- ing contents: Path=./file-to-change Name=New Long Cool Name Numb=2 ADDING COOL LINKS One cool thing you can do with .Links is to add neato services to your gopher server. Adding a link like this: Name=Cool ftp directory Type=h Path=/URL:ftp://hostname/path/ Host=+ Port=+ Name=Cool web site Type=h Path=/URL:http://hostname/ Host=+ Port=+ Will allow you to link in any FTP or Web site to your gopher. (See url.URLHandler for more details.) You can easily add a finger site to your gopher server thusly: Name=Finger information Type=0 Path=lindner Host=mudhoney.micro.umn.edu Port=79 HIDING AN ENTRY This kind of trick may be necessary in some cases, and thus for object "fred", the overriding .names file entry would be: Type=X Path=./fred by overriding default type to be "X". This kind of hideouts may be usefull, when for some reason there are symlinks (or whatever) in the directory at which PyGopherd looks at, and those entries are not desired to be shown at all. ABSTRACTS AND INFO Many modern gopher server maintainers like to intersperse gopher direc- tory listings with other information -- often, additional information about the contents of files in the directory. The gophermap system provides one way to do that, and abstracts used with UMN gopher direc- tories provides another. Subject to the abstract_headers and abstract_entries configuration file options, this feature allows you to define that extra information. You can do that by simply creating a file named filename.abstract right alongside the regular file in your directory. The file will be inter- preted as the abstract. For a directory, create a file named .abstract in the directory. Simple as that! URL.HTMLURLHANDLER PyGopherd provides ways for you to link to pages outside Gopherspace -- that is, web pages, FTP sites, and the like. This is accomplished according to the Links to URL specification (see Conforming To below for details). In order to link to a URL (EXCEPT gopher URLs) from a menu, you create a link of type h (regard- less of the actual type of the resource that you are linking to) in your gophermap or .Links file that looks like this: /URL:http://www.complete.org/ Modern Gopher clients that follow the Links to URL specification will automatically follow that link when you select it. The rest need some help, and that's where this handler comes in. For Gopher clients that do not follow the Links to URL specification, the url.HTMLURLHandler will automatically generate an HTML document for them on the fly. This document includes a refresh code that will send them to the proper page. You should not disable this handler. URL.URLTYPEREWRITER Some people wish to serve HTML documents from their Gopher server. One problem with that is that links in Gopherspace include an extra type character at the beginning, whereas links in HTTP do not. This handler will remove the extra type character from HTTP requests that come in, allowing a single relative-to-root link to work for both. VIRTUAL.VIRTUAL This handler is not intended to ever be used directly, but is used by many other handlers such as the mbox support, PYG handlers, and others. It is used to generate virtual entries in the directory hierarchy -- that is, entries that look normal to a client, but do not actually cor- respond to a file on disk. One special feature of the virtual.Virtual handler is that you can send information to it at runtime in a manner similar to a CGI script on the web. You do this by adding a question mark after the regular selector, followed by any arbitrary data that you wish to have sent to the vir- tual request handler. GOPHER ITEM TYPES When you construct links to files via .Links or gophermap files, or modify the mapping in the configuration file, you will need to know these. Items bearing the "not implemented" text are not served up by PyGopherd as it ships, generally due to requirements of customized per- site software, but may be served up via PYG extension modules or other gopher servers. This list was prepared based on RFC1436, the UMN gopherd(1) manpage, and best current practices. 0 Plain text file 1 Directory 2 CSO phone book server (not implemented by PyGopherd) 3 Error condition; text that follows is plain text 4 Macintosh file, BinHex format 5 DOS binary archive (not implemented by PyGopherd; use type 9 instead) 6 uuencoded file; not directly generated by PyGopherd automati- cally, but can be linked to manually. Most gopher clients will handle this better as type 1. 7 Search 8 Telnet link 9 Binary file + Redundant server (not implemented by PyGopherd) c Calendar (not implemented by PyGopherd) e Event (not implemented by PyGopherd) g GIF-format graphic h HTML file I Any kind of graphic file other than GIF i Informational text included in a directory that is displayed but does not link to any actual file. M MIME multipart/mixed file s Any kind of sound file T tn3270 link X - UMN-specific -- signifies that this entry should not be dis- played in a directory entry, but may be accessed via a direct link. This value is never transmitted in any Gopher protocol. CONFORMING TO o The Internet Gopher Protocol as specified in RFC1436 o The Gopher+ upward-compatible enhancements to the Internet Gopher Protocol from the University of Minnesota as laid out at . o The gophermap file format as originally implemented in the Bucktooth gopher server and described at . o The Links to URL specification as laid out by John Goerzen at . o The UMN format for specifying object attributes and links with .cap, .Links, .abstract, and similar files as specified elsewhere in this document and implemented by UMN gopherd. o The PYG format for extensible Python gopher objects as created for PyGopherd. o Hypertext Transfer Protocol HTTP/1.0 as specified in RFC1945 o Hypertext Markup Language (HTML) 3.2 and 4.0 Transitional as speci- fied in RFC1866 and RFC2854. o Maildir as specified in and . o The mbox mail storage format as specified in . o Registered MIME media types as specified in RFC2048. o Script execution conforming to both UMN standards as laid out in UMN gopherd(1) and Bucktooth standards as specified at , so far as each can be implemented consistent with secure design prin- ciples. o Standard Python 2.2.1 or above as implemented on POSIX-compliant sys- tems. o WAP/WML as defined by the WAP Forum. BUGS Reports of bugs should be sent via e-mail to the PyGopherd bug-tracking system (BTS) at or submitted online using the Web interface at . The Web site also lists all current bugs, where you can check their status or contribute to fixing them. COPYRIGHT PyGopherd is Copyright (C) 2002, 2003 John Goerzen. 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; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MER- CHANTABILITY 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: Free Software Foundation, Inc. 59 Temple Place Suite 330 Boston, MA 02111-1307 USA AUTHOR PyGopherd, its libraries, documentation, and all included files (except where noted) was written by John Goerzen and copyright is held as stated in the Copyright section. Portions of this manual (specifically relating to certian UMN gopherd features and characteristics that PyGopherd emulates) are modified ver- sions of the original gopherd(1) manpage accompanying the UMN gopher distribution. That document is distributed under the same terms as this, and bears the following copyright notices: Copyright (C) 1991-2000 University of Minnesota Copyright (C) 2000-2002 John Goerzen and other developers PyGopherd may be downloaded, and information found, from its homepage via either Gopher or HTTP: PyGopherd may also be downloaded using Subversion. Additionally, the distributed tar.gz may be updated with a simple "svn update" command; it is ready to go. For information on getting PyGopherd with Subver- sion, please visit . SEE ALSO python (1). John Goerzen 25 August 2003 PYGOPHERD(8) pygopherd-2.0.18.3+nmu4ubuntu1/doc/book.sgml0000664000000000000000000000063510762620505015431 0ustar PyGopherd"> ]> PyGopherd Manual</> <pubdate>$Date$</> <edition>$Rev$</> </bookinfo> &maindoc; &manpage; </book> ���������������������������������������������������������������������������������������������������pygopherd-2.0.18.3+nmu4ubuntu1/doc/pygopherd.pdf����������������������������������������������������0000664�0000000�0000000�00000215303�10762620505�016307� 0����������������������������������������������������������������������������������������������������ustar ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%PDF-1.2 %쏢 6 0 obj <</Length 7 0 R/Filter /FlateDecode>> stream xYvF+zVgXcF 0xHfu>eqnUw�əcH&Un*,\ /C~??xÌ>Xޟ7<" Cܞy+#xWo._.gjuۨvl3?elqC^zZ$Etc^r^s\{Xgw/h(S./6^0|촆ˡ]MTm}ߴۼ/ZܨOIa1\R,pXwnL:\X S,e残??Uj~I/6+uPd O.n~{|NpzʞNK7ةUl蛣[ lg\;Yp|2̳PFY @F4CmTU;>lBzvMى\ljk,Ėp@ٔbSyE;9>T6O~~)' DQ6bJ<Ga \RdPmZ D>}׫J T Vlǒ6-r\^)!(\f8�7B_o*;"z8W_=Da#9un״/Dż]e XFn<9! }Ϊ){mhI[竼ϥ~GP`VJb2h"7�&~:%pn(G_~y=AӮ:Uy-OFaLs7sLz2 )Ɩ5ިV:ʴSd:lPa_tޤ\4M*Cj7!nU2-A*d+H<ćrhς웋zgLvśJ.'  n 틿_민0EBiJqo|ZFdö+ɸMS# MѽV#jq)VNw)[٠?d_5ZYJZA4mU$KևXtm.|V%Kw~< 񎮌LE~e w֑V-DsLj"^ !v  ?jtm َ?/<g�'m #Xmtw{&2]-}3 \Kv'6CαpЏ^P_Z؝ژ KS-.z|Ck&H|4*GMNfsA7%r Ћ_t "E5l* ؀9.T.w�ʮ-^0k;^d* *cFV-#=Kl?ո6Ցm^!Q&ԣ sm@FD -PE5(X{||'VMObVbZm|O]GڜQQvP V|ǪEsXakὸlZžw#0G,YP{)5HSxuÛ[8u9l^y!R`ͱToNօI-)0@]fko@0FNGlN ŧNcRx$"ԈN-'tBĬV�w^&Y2ęͽ]~!^;i/'~$20@c&=c  @CijF$(:0;[.Tt{TLe\d$SɄF5:l@Y@±hPWÊ&%댖a|{4(._ G͐%ތ[痦X쌼| (6١%edM`ݾ[l ]=MyDLcbk9)g>E"`U=FYlL&| `6Hg|B'Be ),fS>nWTӉADj-1;jj;Ba c'{$;+&<4Tck hu8OyuqKqGj2) ;kl?X1O٧t*:]oG[0+$Q<XM͊ ;K"ՙ;dY0FW|7es2, sv bț\X^H,K )wd&Jcw]H =hG`Q|?s8fn]?q_hA OpԒxcMS t<i]vN%C?I:1e**0\ӵ�?>UMk$IEp} ,4ҾԶ10C@FQQ0ttg;4�v-or�ZSiߒ(b3}) i=ȳ뵜vTw.~ ;>!h8i ߷s8d) `|߿yu.n%o MAt_%h^5ƹ^̋7"v?hͺh߆rAս i@xI|4z!''g_y.+.jsΠgrxP2^:g/9I�~ o:c=6ȅgZx֪Steer M|8EEvR-y_P54P\gt<Ka:;V&s9&<M˝kV+;4q|(O= gIش`<;MbOO'z}, 앙Iq\f4$(@Mv ,Ҳxqe8e-NgSS쩋B)V1~oCG3O:e)X}aJ!M"QKp"Yⴲ=Yot9l-CXPbAH '4b`s\v^5JTF?{ b+qfOqkqju�ǞeLE2dצ ~;Fav֪V( )_<I1yz6NjK Kanq\yxcӤ's:eOxt2MK_ю|]=.rruD*r</ՅfSW'zla6,9 $xEST>64S\>|#D7% t夳StZ{3; U6`cR97_qA6QA˦Ae"i65Pt10u~N౭ȂREendstream endobj 7 0 obj 3312 endobj 18 0 obj <</Length 19 0 R/Filter /FlateDecode>> stream xZےƵ}Te؃E9Srʑ,EWUz=$4 @oȷ^ݸp$9),wZk'I_xstI3f/z'?4ix2.Vo_{a}x"ޞ~h;ՕO?^Q ^Es,j1Zy XÄ\øX\o.VeyΫx7NAյKLrc's?vx2 "ǡUWV/p:^M)$fzX*K};QtJlVOky{슛ZW(5eGSOyCp% Uۈe(q`fѕb_d?rf9Vԛc] 7'qƯwhѩ']]mc)zJZ횷ž8p y$@?>*L&igf菇C N2 :?RFκN=׋q!aޣV;%y25kv֯P!ڊ@&!?3f >Jyb��(֪n2lqNAڣZh밣 vlE/ ;-CN$KVmCN8f:1.þ]/]G1q*ɇ<|Gh(1trads>U?P* �Q>=c]nB+ک굮u{nճ|-)V3\`k 2KמDawTuuDS"r?l oN;/Au bl)?ٳ3@ _fp]L)o I/ #e,H?+dqh>tܶuIT.;PqLMʐ>mΙDG-ÓKqӵ:1S$&䫇޺?%-> 8Lڜ[qYwсltj`S~keE`HQhĵ�h|١'ُ8-5鄽*68EۺlFLl_ !ҭڎ$ ㍈,9^қF;h̹vuIDƦ{.@ԭe,u`S#m gzGBt9hsh<ϑ3P->d6D\̍#>5PEݷK|D.E*w de'4P싺}E"#k1nxP_g<\{=6Z@ʝ�/dPrړRE"vU3vo k8a1D+ KT~5T>PU@˒s$ZWhf_-IBbe\h3=Sir^N]NK* 2C k`ls -rYH|RqjcL^P YA9ZWp\ -A5%|<R<]I4Ve9^ EY H#Ђ9K A$Lemj USs\[CPB?ǎ Z0QyVDdю ne-}Gv NlN#FH4+%y.>+]!)>h+%-MSe#Z JyiV,{#aۈ.Ks6@i^d>,2QJ#~$Ӆ"4߾ÓtҼrK,D>Q-2gSuo'kJAKԳw&4BhCeEE3;-0C$:< x`Q]TQ�8quʅhL&_QwZ jPhZ[E]aZDХ~ A&S)_+I?wZTOGӆVkZHQd*Fa q.G@qN3u 0NE ?=ڇ,VQJȢ4upoW,Fp>֠;B瓞˾qz1z+K;BaI3g  =FLpI)~'vT~@Vh㞚m@Iaᴵ Dse6%KI/-6I-PlJ2 vޓ-<~Y> XJY?#>?@:B{" ϦY^ ̬h൅AL۪+5lfʤ?ϻ !#UMĬp@+X^䣷L~ %“-ݗh<hdSd\&oY:EzGpJl`KN5(?`H5H3:F%G'xx.KcAOKLoީ[QKsHC#]HR)w?NPpZv[!*ыL40͒=I.NPqV�`'2YvK2_.WŽ+CU~y>&Xw}zwޘ:sQDMp {# :VKrY^8{?Q.^~ut7Y>#<XPDPfj *DΞ(ͧHz~{DzhځgDU63{� t)' JRtR->XJy JjV,[6T[G32Bm|4S;?~{gAίHf2M렔3ׇq [4D/S  k)l~Xdjc$A$T =] o \9bһVLg<.lzX5Bhf?Mq2St>E8-Hky0QT&mne3ml!L M|'t< ;*\^MY@#zŗo9ڲ囟)j-L8pWMgVPUک>Ȧe/f?揚qKbʍh,g=pVDy ̎Bc409w)me".Z̲3/"S8a<v%2 ꈙlXq cם#,ѓfí' Qb6iE"BJγ;3Q`Lo/8CcO,萬:tՈy8 M:D{�OE!&5U.((vFv*z1u wgl1FfZ!t_wl/AϚEJ#f%}k僾`T,_QD Y!_y%@9z!0^]}:Y.JV۫egb:v^7,\eQ zDN-_|O/_^žO]v5̣yPɛ;MH=AƄID|}wI1̉^K -iA>]'H@8 \1;^ pؗOLž, $BB!&$EHmnzQޕ'EaB.8lj7pj]j&(Hgڃx^|4)JCNg̖#FTOi:N;]N!R�-F=�.-%fQ0DQ9zI?τxl7o\0' ~> ڧ͐}-Z{LK2`I+ k[]'FxX$0Ik&wׅQ;nzA?�,d?# sdZ -u<d?؝^?: ;e>S<{dn|huNGN~;3P@atrckyGNj`W,?ܔxNn4 "Cv�]$f_tcx])#3 P Q('vG �Uayv8* ŵoU/endstream endobj 19 0 obj 4000 endobj 25 0 obj <</Length 26 0 R/Filter /FlateDecode>> stream xY[o}U�kLrxv I6"XA /cr,H(?*{=\HJ"M@ g9~fGgg|8xz?3k}, C؜#k6w/>ҏOU]xY<8NzZ{܏#zc.bz'tao_ܳai6zI`8s}=x(q^Zn2KCUn˷k<<HyC۩Mzvx .B{~x|۾Sqvd0۠v-sNaS0id gpُW?܋Nm:W`]5+Jo!I?Ly`<j!if]XœZ#IjP]~O w6Obdi0h_F ],\d1⬯( ˜Txe15""sWd$' חn:RVZ3vc8 JȇwUu뎝؝߬sNQSӪ"˒qnbJ;pN{>>E'z(4=>Զ.$^Ma(`|&udwNkE�Z.&*-'<{}m`Ƈh'54jR>Fn)j o/^y9K8+ϯ_-Bk0{^b!eqy}5E8t(..h4u- jFfq92 Z�),ppIogmrleI.o~Wwm)CA#)r[IM?ʑ."fcn o3Q w v']0mTMֹ(*~a=nQS?w}et" Tz?I@8}{4+;zù(�yUm^\{ˢoot\1!>ק1N^^JU6Aƙ%ͮ h(di?*<‡e7CY6tc*I_!F"m]NG#ҷ[~H \zdZWL5l18�Quk+<}Y3PZ=[5C D*G$?2 06{Q,rY @6ÏuY)٩0gz/ 0i<SU ) #:申xg[kQBB�wZ2wmRZȞTHmĎ`dnsl hH$VX lIA~0�" "JA5TH.ih3 %80˗#YKT)vF%NL3C|zO]Lm:�SƅwJz}'mw(<"=gK*gbqi7`ӈ�r F<> ݕUSӄg6; YV#:=�:ԖU*Wm+zyGz$HΞ__v;G{W#Y5,1*'iDODF!Q!r0mUcIl֍*lC^L .EQ4\VO >Xo*B0FWphZ78ՠ)[ 8uq_@#ߋhx^(ۮ)תu@BVZ \<\5L5_~:<~8crԻ 5fֆh:3jI>�폺#vz1l;a?h>ne4ߢڨE])?tޣ!62�Cp87Ç0("DE,;v S=&S5Dǟ M"=ZLun$I 8lQ?hAeՋ7/NNP_N+q7UC0sÒ`ALV#dU1aчF[xy�!{Up)d' 9ט5f`FH [v1&i:VزBOB$]"w/лC`;}Tjkwf.|^|+v෬>LװZA 69rz zJD$/ n()"7qkYU TH[G1P$mqFlwOg;Rdjhv1UHqp:;%sw֣dOTV_RP_#,e9qh͋_yΐlR/`(Q=`UƳ$a W`q1 3ՠl?1E` G50HBqWˎ]e'1h<@칮w}f ubO!:NW. +jZܔH fK/.O:Rd=bVvh5l šWa%}e *iv0*7PG�KL%žϾ:!b‰�ȉؿeE!h$BYjs@c]Qރ/ល /n"(�&h`%+<8V7U&2T -{{Aؘ}beZ9#tJ; 1$T/A�;Dp``sӭz֜Kwd 9WlsVgZ�5V-;CIACgFV`MEEz"mkM:TծA]Tul9�"x`̥fĈmT%CoH6g)AI0wMlwYF[9%a/. =nvd)rZkLzjvnl"rN酪a�k"賮p.sgxD|-̓Q)U0 zYr\=ݲ#dnzUWjx h> "l܁D0A/A h\џ({;endstream endobj 26 0 obj 3074 endobj 32 0 obj <</Length 33 0 R/Filter /FlateDecode>> stream xYMsFWt�ɱ[uVHDl@@+zzfAaKDfz_~$|/>7OWD?mC"""_bt?~?NN_HzigW۫]QJLӪZ Z\oڕR:VN;%6MݫD NͱMܖb[j7I^lCjq ,Oo>Zݗ⣊ámmYJgbcS0?l~z/^t66;VAU$<?OVrM[q^;:vquǑk}845{ZB# 2 BO|fugZKmQVjfz%ܓľ8ƦONX|ֆ|Eۖ[8|WpBlM�剗ikTw/>dd[_n^8PytGzԖj6DUv}Y?vb]Т^FG2pQ찛W'n{Z&d'/x*JMEccP^%ϙehϸM56 @<?2IG Se] {x$z8V\ #!AOQSG~@`I,F,k+z&:moZH 0tc60~h`%1A9^-~ ;>Ǒ6Kv}&/7ǪhiF}kAkՖ!Zbk¹d Kźb?^_ylG$E6x;hH9l:"UbHJaZ*2fjitpiOh>ZȒyE\mBMxb]#wuDDwYT7{Y_2.47h^ { cKNbqO%lQJ:u;;\Vz[n k>iPNzkWߗ&,I:ojỳ r/b)H荲�)+>6s.B 9*n~yIo2ơ kfxS&&a?"!|ggC~~A/8SΌwG 2Ts9b}EfK3iʅ E"EU 4fFu++`~ Y`Cn K9pȌ@PI/bz}eBgg{B-P4T}d`H$!ҭ3/=ڏ==IIhp{pj^4R`\&[.~'8ɴl?iFR#%1speqG[&M΂b&ZUqb pT:0ԦU ;�=F5t˲lZL5Sbf ) 8V&`b>.U-ڑ{R2w$nUl~m/˘zJ:b4o( k*_d6U>Db+1h>4ForW[(OVJt"%%�H=eA81f^2}g F YGjH!"�N~`1J+&Ƕk,EDfD(Y[9ٔڀBfg ւ?иsdx0@8j3H6DIkk&Zj5C^9)jdXLӵivmRGN+b0ٗ}y�A\dQ5X c|:[u"Yg)ee(i虂\VN0XdSI,yfAC""C\DZ#7. %BIi(AIQPES4LĔ{ӞU�S{(85*fdE˥%TLiUbiM?ffRZQқ鉴#(~:Qp,\&54YaAѶ1Ќ'uIذc!0֧6ӎa[�Eg?�IBU;veѷG"u`y|I4rt|6!&A%hU 53&v\/lՃP]S+d355 snY ,fΑ*>w£gf 0(G驱G7:/=4v[k(seޟ ؍xXG9ˑ<5#$Ij b4܃;U瑆%4 F el֪ax?_NGqa lߖfuIj*%+MӡAa yEX ?MzAMm9# 01}{|/ܼ?/fx626ok*g!]ay8/pƝac7KH9l_>z'd(:P Ȳ٘*n_AhfoR7'G ='h|$׸|jLȉl4uDYN]MR( (㚴5'%RbLDJ 5mGOy5:d�^ ./mZ~7.2IǾwC % ,/"nrS%|ھ&}F̃Ƣ"Е>c`88Cˌ�CGDF^\x/f;G�/d깡CwC(FN ypM}_&B=MnHmiZSŐ<?ߵqc 42rc[z\B4:gW:mܵ˥&J%F Ѱ_:̼VfF)=! 1�'D؜һC772Rƕ)8`x ̝N9%_-pʾc -&NeQQ NFzlKdlhl>:bL9""ϟKW*Ph2*ahgƄBڨC4%Vf*�)lQVzp@ R"~-Ov*Gj a}:1wZppz{ͮG dŤŋ#z{tlDݬ?endstream endobj 33 0 obj 3277 endobj 39 0 obj <</Length 40 0 R/Filter /FlateDecode>> stream xYrG}Wd&B}<-@͌TR'Ԃ(q~oͭZ0-̛w9۟}?l>}bf {;Mҕ͙~gi(b<㷻w7?dǿw諧gA4ƻlsUSQ6zl& Vʵ(!ظϢ9Ԃ]p;(=M׳jK/Soy^XVc!k~MZpRwkr`B[?PKUoDqY?_٫^^;[xf;TF<I?ӕ暬 ظ(y<T4mLpc͎ٮ<ۈIym%c2ҭY�ܘꢧZv2H<F ]A>]X':΄CQh٭heE9v4r'ЉR N@v۽<yjQ5bGҳ Æ(jl Gv-67OC#dXJꑶlF(g%H_(X1,"<qOxrJ0x<e$PCQbd#)~NL':GsչpU!uBx;:俞|9((A2LTuwo3`A-xIӐ}gUtqs[r]]~Qt.3WbeobϻJQƣΛ9pMd N w REϲBO`O>~$Q;=QP$K:`~MWBY-Uם?}hVK;tP=Վ6*BIUr x.)Gcr= �V|g >>=epB4e;@2, XY"1h=]rFؑ);Z;Ȇ�``\! U�7S8&Q^j'ŠSB,3X4G&) m@j`-rNQ�Ǒi�#6Űp QNm(:uvӬ ÕW#ȠXY9":! Hg,`3(krwI<`JYZH={iƅAe+ۂ< nqjIs%3N>w2e8AnhA`<Rrf =4꩹lb[Dq&e‹iP| u̒yNKCz$tJSu{�hQH}D�|;nS%bqyhC%ZglHPuOTS(/*Ihm=kfe7YKx Jooq w:XS!08!}+e5PG-Dnxp}qL`V;,yFl"٬H?AQʇie8'Y3uuCzrzZ"_DB}׏P%"I|5DȡPj@iKcO&tI츗ײ�`e|C`L}Q$ 9GX: x7 ?X7+$㬖F[ JЬ*: qdՍ2W{|{=w=Ϟ+bDAW\Q:A]QgtƤ"owh^Xյ(;amYTZ?ø-b?Uzi2k_0$6G(>~tα5^Z pSVI�{QT$'( |g\VѿPLf+4Sv *�Z.J5PcAtl -t ]pOS+Ϫ]8y@MՀSWs\;4Yz`²!&ldƚybW(O!a,QvE^E+aC ?ҙZ@IxիE9d ޥjzQOtΐ)DD#B4X;jB.Ciڕ )Qؕ]z˩gxNm*hA[ ;${ԨGis"%>t-, j(VUU٢I ecaܦBD[׮?Ql!R"dSu 19GX6}[0N(ځ&$ZGEdCuՔEXF *6xgt*J/]H=(xIHsgGF>,]b({VAG,F)"y&T3i8F yy?S8[&S㣛uE_aZB%\vf1Jm$ʩ1<wA>iC "5 ?O[&+K_c_JSة~*WvFůAԪ|X/s1>R,L=4hsVuD037nE[( ŜV8wsvΉj9`')8֔B exuS,O-뉲V 7G[kM8ܡ4y%E7w]:/z哮=5d>VR0o:%ďu5EI3(R5˃<F4-I<OARh 8\wO T=D&)bÖ%6P]]Ykg8vSVP,$ ”_ځD88s)t ˍr{Uߌi3vՋ(.ΔyDqIIE^8;#b>hm}Q-9t\܋tlsZJϠVgDX/Ʃo)uAy@FcS 3J`%ھ!f@-pM[C ӬLKŒf:" ƨt+BQmkZ`ݷb|mM\-4ˊpjhSsDw3gLrfFȿP;XDD/eNu/d{t"%Te(ѽ%ex3GU9>;)f|U jiy3͇/vQ5з?}fBz|1{6Rt }4ydtbyF  ~endstream endobj 40 0 obj 3199 endobj 46 0 obj <</Length 47 0 R/Filter /FlateDecode>> stream xXnF}W41d[+Ɋ<  @!{4x7I'7.pdgXȆ-]uԩ$ ̿y}p' 'uE3sd۟-~o/vUx <8[d͐UbWI9i9~#=p]~t}ldM^t|t=\MV+nD-;)K"iTZd(S Q6Nmeۈ װWyk6iUSyݡU-O]s=AÒ= `gN}R 0[Vsb79ojynzG_| ֐߿?1'^8̞;V]`UٹzO~ `C=5xp_CzA(kmV heOFޞҏ)sg<x2yi> !9o^ȓ6ΥuZ}p'.WVK``(V+=g et\rtN}krC٩ rlj( s/8�hiSt'M/"O4 -`M6/ʪk5Nrf ۫zjiƸ( mx68=g\{:--"'% 4k1Jݥ.߶<WNB_Ylڦ:8 ESy:|+^1gn@ܻVKX]C||Glrwed\ R)/mm[\0u;CIX =4}Y+2tzA절b E1IF 1.[Ul! dby>f H61 י>@I,ēAl4Ahm(32qyjO9e VR5ٺB=on%}uy~T<w??H1Fh:!dEsfX"}h."ՏV߆csbiJ7tuHG tl!.8ҍGQJ;\+'N^+̇΄lr� n|g(R:7 a4FH!*]E긦CGF6ʕ`-JMJV*0#!pB (wk~DzVl( dFN<<,I~sd(yLuOiשvlxZ.ؗXVXP]C 6HUݠw-piēJguH@n9 Il\LO8r.99IܱЪʦz-R7 w)c3[Kv$7@lKEaO]0/_rIќ5.QlB\>2u�]%h|$XpHr>eljuPbG1cx57`Vö(1֯ ym㩌Aw} ==ڦKFƐV1p .ܴ f%bDm^E"N6/_~e@=̽IwnZtfZ!8ܼJC'.(dpk UȐqc9NmʆKZ OڷLm-LPAb}87DˀP\fF]of@Io4c X+V=-?6d/E}ù$Ө2"6`q]6i@#y/ғL#.ǍKNqԁU# Ccʠ'#B虳I[BѢ"eQqK#ɕ -g<qM s졩ވnk} yɇ|ZQfڔ Lt(LǤ" 91T7"6pTcF64}莕wDܗIz1.5Ryœ2bڑTuԟùDL�Ah Mah(!   >&Rۡ:2F)ϘW45vR!4a C)`R HpWB9G1~àE9e[Pr (U2E95i*`VNǢ vcΖb=mhc`=541a7۬ZQK؋g՘.L1FcSgC1?sd>#vN:oW蚎\6"w}wceM $]%&l]wA,G!{aX㼐h26՛w[ETS$ۡ^qq 5H/V ~,v VQ"+w@Lzwx;7뛶}Mx5vKP7Ih-a[E޻.sʡn*' dz <p6LG'@/uo5�$s=4[QbIQ8fK㭛'ӬT+Az!MŌVYY8 6N=Bܰb `Lrq"/!5ƱEETP7LfY; <|MnG 6z- ]y0A!<u^bxt 8z؁Ud wKHϝl`<>T$.W;ghnh;oGB/x? eGMAҌ: 53K~o&<wU*:.6vؓ`c|WOo^(·9O##|t?�P+endstream endobj 47 0 obj 2785 endobj 53 0 obj <</Length 54 0 R/Filter /FlateDecode>> stream xXn9+_TFKTg4]= *)WY\(m`:Hdx񂟅'}яݟ}>,|~~mا'3i (x2_gw/ܾzU=l;ς(io_T%ie%2Lh' ;-Fn*k-MݫDoZmY3mUeUӢoDF#z{ H؈/XOXFyby4Kp\l=ΒEI/̬}Y?0zϛ c;g| lEk-LkǢl#WJU!;|DPa6/l!pM6Dp67ljUɇXw }}'ʞX迭'3ɨJV'^$S/,M�U0DS LB3Hkon�S\NӾdr:;0@/sdy "~yyR2W )6]_Cɔj/UWe"w6HuQ*Cll}0ysT {vG_v;C j0I2fN55h֖ж_pwf|D6wj: UM4i9!Ĵ&5Ǩ(L %s7L3^-" e$'db(*&͉wT0ؖyqz:7)2SL:^Zz*먐 VHo\M�խSD, e6"XOW\k46b$u;'۷y)=aM1x'2~u@3Ƹt)tND2b8A>5ϭ*]2&%pb *+»85ۛ]<LdYmlA. j'Fʻ7ff;aDzULsYP\U @3=jiMdMCЦsg* 8nR}w;#e*%/E/FcL3Q^q߃-(Yd1 '()9}nΏOfD|hKH': 3GW .}'5521}>e"2Id0]Y=L0!TN|.8Y/NzuVW2$t'xے2$B_6cc B;h^Pn8P#Q2 ^HU],yK/iޘv4ȔY[#jfэeU[}">Uu}:։bnw`:UN^S7K_=79>ѩ덿蟫mX4; t0xri{b @ a:)MEI.]@kFbTIHYEĈVe\_da*Jvtd\|_,Cx64=杣 ?8w:]a(En,c\@V7i:wtRqsSiL}e5G؛[Psi#KjL2ٓ8LjGqFn]lu<\{m5h."-6M%k5N51+YTUcoxծMX$E=oA?nNA<;XW݁9[baیf'_x%fw}vVM41@ݶ-7k4EX,McU3&pɛ閠59M@`}mx Eco &讅OlfӚpgKP'4 MXHCDjPM$'5rQh\2i]"qK pJ8F}uauXp[0Kc;9b%ocdPش90YNDp„[e-~X^(qMx�[Z9 J\͛kq柧ۉeG;m^y=mUQ@*I/VS|Xi�v]Q0xđHT3fSf"+P-x?Y#308 G?Ʒs{caL\?{O@ꏷ׏p䣫+wruP[/|e{] Q1|/-Ims3Ojy>⦭BKt[fI-קR A,X(_oD럖Fn1=4deQ}h+RuQ$HBCTtw㠥sX)7N ӅWY>{g놡 @zQ'O?;R[vi5fPEnv@1EKa/m#}-u1 Osnsn(8eۿ}g k9 Hě&UJogk-endstream endobj 54 0 obj 2602 endobj 60 0 obj <</Length 61 0 R/Filter /FlateDecode>> stream xZے}߯%tr]q*6fE9VJU)]" �EbNOK\+3}?O£܏^Rdu"Q" C_ʓ~;],n>}uww>tn *DX^,^1/}z.VR XFJ3g<S~5i(c[ޤ7wp+zKOfծhڊ^tMy/YFmޜEQk[^/wc+FM'7zkQA؏ٚ%\bQL4B~MSlA*V|*͋ en:Xu2`^>[YʼnXОSVgz{2LJU6X}i4^~Wto^d�HYb]#~t$rH%l=D]M{fXv;j٣_I4»bc׺ [},KqDy[WFX_},dl޷O3'oǯ4)̉b[4T+6YBuIrk#ߝ!83Ɩu Kn <�.*[5C ;'ڝy"Dr,<ØZ1c׫&\^#7/~5O`?DTo\yޛ' zJ<V7M {t)}^Te޼J93Pq`oS6lnUCˢ�Vn'jB p`+b/&# 2x;]!mA[GE 65H MLhHf%reD{}A{qh8@#5W ,B4 gX ]F:k ,޲޼x9)!ZPhl62>Q =P2 ȼߑAڂ=P!\NVÁ Xη|pes;}"eqY`4Y6g{t5ed|z86 @C&yw$V,KKt0XZq8'PPtq՟c0B٦7u Z ҿ%[6�O݌!z8c WʁI@PO'rsq*ş;Mex}%Sax1 �pnxu6)29e b�jMrQ"U8yc G.# 4}].ӞTN)WZA(K*Qס-o. %8yvD8M<\LƦC|7Y)Kv##K)8#q2Բ?&٧_"x0!_[{$jji^?,c|z?d>6X  Ń/LR L,3HRά9 yTahF 'qyu [0F608# :5 ,q+ljhw`1"i\<72S_w]wꊪr+X Ӳn,R=ۇ+D3GdJz}d/;Jy¿ n_ʇ*6ŧ 3ExR$W\ٔaWKz^#Q+-Úӽ]Ǔ5l<*} 3KO[ TモBwP\T1\rw_\߮\gJ7ouu483M)lSF(=݂9 B$|-M0P#CsUs-Hvc GbH'" ā KyuNe|.c4ȝmPEEGs0=pʐ!, �1o4QɄvx"Lh(NNj/,5¬/QWR+y&) gM0kN j=7wp$L̏]MdsQ2u86�SZ)A{BAjuIBE}Fck0؉JLߺuvyg@,pۓ%؟޾,vآ${V^<.4 jԞx$ϔ}!|PfԇQ/vf΍f% xj4/:Hlʾ;fu.=8gF6 y* U7G]gj* Ar3P8g6+Xv,My4sڭe.2&}&ZUwJ$:WSYauawl`vfteFE) yI1n&BʹFAH]͊xh8K14_SNt}0N3>R wUt2w~{BbE]٨$- \.Yj < DE`TMak*b `z7S#7,ڮSÌ*J3|EE YQa8.(Q҄+a0DF2* ( >wntOحnO\Hkk_ O?A6DeH� ' m$/ g V?V̼ .BM]w ;YQ au>˸$κ|XbRN<~.{{*{H35 ]¯ ԢV[3%U_u �e7kS.hML+ MCR /׶@lh̯gf⣰-ε5 naF hk7I@NCtK3k9p7pu_>QnP{Wņ*D44<9/󽨟m,MbBѴٷUI/K&>h[jփeǥ}R2 aO㡺A<ՖXE5= $h^$F~`7A6bAѝ#><Gߧl@㦲gøR[7Ǫ+ 9Qh֏!"/Hmih~Vɸn9^yCa_S0Q:eY$ѶFæd>UĶdeht톽IKʈN4gq<Y]7؂Ԫ‡'hNp@:~ .PC%ۼˇ9Up<""6lpJ%-K2OFctſnnQXj<~ J,B'~/f`IګL=&5 m%0>}L|>SY蛢OP nMP?WLy4iH!QEgFLַKP'>�3 O5%:?&!@`VR^L W<⡩YqDLAKޑ:<+HqVp f>^\?+ٓendstream endobj 61 0 obj 3383 endobj 67 0 obj <</Length 68 0 R/Filter /FlateDecode>> stream xXko_1X`Qk8(g +vm-[((r,C#GzA颅3{(#1q>z=>✜GϕFz-#>'y>bܢ.z;~vqޜ땨Wéy2Ϣ2^p˓&'ZjJ_\ϙ H2QD" I `Y\m5iYweiM<lQQVT~ CHCW8m_0jI.g32ּyh'+ĔyB(Ȧl%ڸ!YZ+$@VOiι.oKz DvУӥ}pʙY$ DtB଼Lһt6gbz^@HTmקs YD912RD/J/lGlu2GF=R[/y W\4"Wnt uݙ U0C(LhDiߣVgSCJ'oH]5YlR~ UfD9M0Se:߁vlM&)_kl) QEY!I+*Ц2&*elkQ\d:m˻Fe 0,˜:Nuې<DxwOС6S: `NE-3dle%BTM0"aUyr{s)�Y cvgWM֕Xü,qͻ̱E_f̱1Qpc׸*x;EqƢ{#bؑE2o-Nnˎm7eỎRu~Wd* Aey߻?i;|%<=ipNHNuMzl|VU` 'I6>m|ڬ5"˔8uy7>Cft9liє(;MjeT/CӝV>H@ yx鵇TpR,"6Px* aL$' :ޢOF� ՘%1ly0mւ(u#El9OxG<"yʆE\&@V➨jy=hB5@R^ e6daCCtB)Fw(VWE+;9=tF TUuGh<(g:VHr~Q#fNiehzȴKa: ;8H"mc  },Q?BЂ0q ')a/AiY1CpgpN6YVz_d>˯roT8]ܛ0IRt7 `5L 5 0Ynã�Hz E!PWϡnu9-M\1F5&Ik捌6&%FR #e{PٮZSh 9g f#-3̩Ylyd0VDS C0u 9Mp~ܦ9C C_M5/^p.'ZL&NETAW ԫ_->կKmq*ro~1jHYN-Q&_ m3?n7Cw5<(t^K/aJiUTy4I-ܔЍuu_WeSevf$|{9Qt hza|ǠcM:e5 _Jk-ڠM&lz�T r `10Q [e8I\kH"wPP K2se!.|a &'&0WCrҢuDE_8叺q:C>MM>v9oG^`@ %Y=,/'qU6/(]0 ncʡS6O_=�@2eŎCD'XM:mDmܿy@{uA"JxY u7_e,l/hDX9N/(c&JM6d?wwF~n1D6orew cLFvHņ\I]C8Л}G,E)} W\uSrRn{[QnY|bTvH~5sXR+m޾Lv[m.vRφSP6M�.F8Jzطj9�%Kendstream endobj 68 0 obj 2260 endobj 74 0 obj <</Length 75 0 R/Filter /FlateDecode>> stream xYnH|Wbjygd;2BQ- E*~Tqo4Y/�c9էp1 ?3ۜ};Ƅzfdzv6F.=-X }6ۜ ~{<;|0~;36]U۵f_\Q]ZviӨ4l4P8<a_3z+C{jdwٲ7iK?XYU/2kYڶu>WDcj K+kvxn/'ΛNBkM^5YF.bG  DUFS.,IÐAH] [TYe7B_:ߩWOnB?+x1R.whe#w*~AӰ)4ʈC~P>~}"LZJrn+VGt!w:-%U[eUgXp O߽pBA0wi۲۴\uJ׳[ p}#B6J\Aa&w7| Oxs cNbG˫%#l|>_xHc"{=ou!xOXm-M1xVi { 8 yE{0259HqݖxK< .p zյ̫fM[tb`qC.SLM:^s+W w$9iAG vwsm"OYoN){'W< { ք$XCAYGweUIAVl^$ u Vu-E=`.VrQy8zVbpz}E% YU hyYy9cg*-7^}ȿxKP�t e �6GF[ٮ㾺`M*`!1ZO4[,-\jvc*4T+LC!S2Ȭ-dJ211ssn* 9CҹH਒p*F%\$ -1 1l8pk[)lvHtcS pBT2ՙ d.'wB,η`5Z#FwV,UuġP}.j݀;HquR׶}+1۪LWυ= i/MYW]$8}ȑbQ\V$ylBY!#|wg~鳋)Fdվ9#ӭo˭W'%ܭ�HpsVqE\l!p`bx +ΦoVd]h?jbOI@X[CLˬXg%(`<<F *}7f60x_.`D�, 'P^0wU&[+n`&>AawwÀzZx@||\]ώJQu(zh7r%:_[8cU]U,5p*X]d06:0%.Sl%/z @�Jqvh>c \7=,3%n9q]Ri.eOzI7/I'zOl(>&}=%[!ʺ!;Ɣ}1D5<�*$Xv!1l]m̑t+.L=q 6(73v)P,OgQ�Xq {Ҡ|]k x ?XXRdS .jR8@&"iiwtwoo2B|}s{3D7{Ô] A\y6yp{9e)-7RLeGeTI uJnէ/ 24Ӌt8Pa-ke;<oI$7:{fWf27/ccY}d43дjJ6PӱT8>ڟšXٿvp^|ʪ׹na�jR,sQ#/g>z科)3W;i,$I9Vzggwhh(Alrwșv\!HxNjʮpyR6% ZTG"oo˟ nZ"'Լ;2 /yֹXUfjHanob>ܡ߲Lb: ȣb'Th!H9H3 RJ+#~J}fPa@ AC8Czi>9cUl{ऻ  P=m&1#=\R [eN郤!by(((&7V Y`OOw"6P{\iM@ls4uD#-}I3=-G'푵Vih"Bsh8P VM%柳IV7e/G=(Tw;M'm語˴nԈeUN{DnFz7T[o=傲I6mA#b;ffFR$@("ly(se$5ʝl6!/{bp(&8U`V:^GP 81./Gk}ӶQY\vi6=PXѿ 1endstream endobj 75 0 obj 2687 endobj 80 0 obj <</Length 81 0 R/Filter /FlateDecode>> stream xT]o0}W\)cG7U괬ԩY& 0i]L0{% yt=ۿ%|JwF$Y:].Cꌦ?(_tw6N/_9 &3&V4dƜb�`$R;x U&ggjdW jRBUTmZPV62ॐB7T I261%Q�cNcpkݶoj ¢F27ͺV2F$ gbC1Q^X]gw{b.XP,{VZoN1ESkgPT&�ܻn'u;Sڦrxj-р++A~Xݠ7ܦia\"m{OvWA#".]8Zx1mkI^/9$nRiZcABSuK],P4Pg2݁V+bޡ<>Փw(64e3Q3WX!,kڶ ]Zu�7$sћ*z\\"a Ĕn 2$ wdOg`@�7 j-Gl~i}@OvU~*+(vܶyhz6.3f& |w endstream endobj 81 0 obj 709 endobj 5 0 obj <</Type/Page/MediaBox [0 0 612 792] /Rotate 0/Parent 3 0 R /Resources<</ProcSet[/PDF /Text] /ExtGState 14 0 R /Font 15 0 R >> /Contents 6 0 R >> endobj 17 0 obj <</Type/Page/MediaBox [0 0 612 792] /Rotate 0/Parent 3 0 R /Resources<</ProcSet[/PDF /Text] /Font 22 0 R >> /Contents 18 0 R >> endobj 24 0 obj <</Type/Page/MediaBox [0 0 612 792] /Rotate 0/Parent 3 0 R /Resources<</ProcSet[/PDF /Text] /Font 29 0 R >> /Contents 25 0 R >> endobj 31 0 obj <</Type/Page/MediaBox [0 0 612 792] /Rotate 0/Parent 3 0 R /Resources<</ProcSet[/PDF /Text] /Font 36 0 R >> /Contents 32 0 R >> endobj 38 0 obj <</Type/Page/MediaBox [0 0 612 792] /Rotate 0/Parent 3 0 R /Resources<</ProcSet[/PDF /Text] /Font 43 0 R >> /Contents 39 0 R >> endobj 45 0 obj <</Type/Page/MediaBox [0 0 612 792] /Rotate 0/Parent 3 0 R /Resources<</ProcSet[/PDF /Text] /Font 50 0 R >> /Contents 46 0 R >> endobj 52 0 obj <</Type/Page/MediaBox [0 0 612 792] /Rotate 0/Parent 3 0 R /Resources<</ProcSet[/PDF /Text] /Font 57 0 R >> /Contents 53 0 R >> endobj 59 0 obj <</Type/Page/MediaBox [0 0 612 792] /Rotate 0/Parent 3 0 R /Resources<</ProcSet[/PDF /Text] /Font 64 0 R >> /Contents 60 0 R >> endobj 66 0 obj <</Type/Page/MediaBox [0 0 612 792] /Rotate 0/Parent 3 0 R /Resources<</ProcSet[/PDF /Text] /Font 71 0 R >> /Contents 67 0 R >> endobj 73 0 obj <</Type/Page/MediaBox [0 0 612 792] /Rotate 0/Parent 3 0 R /Resources<</ProcSet[/PDF /Text] /Font 77 0 R >> /Contents 74 0 R >> endobj 79 0 obj <</Type/Page/MediaBox [0 0 612 792] /Rotate 0/Parent 3 0 R /Resources<</ProcSet[/PDF /Text] /Font 83 0 R >> /Contents 80 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 5 0 R 17 0 R 24 0 R 31 0 R 38 0 R 45 0 R 52 0 R 59 0 R 66 0 R 73 0 R 79 0 R ] /Count 11 /Rotate 0>> endobj 1 0 obj <</Type /Catalog /Pages 3 0 R >> endobj 4 0 obj <</Type/ExtGState/Name/R4/TR/Identity>> endobj 14 0 obj <</R4 4 0 R>> endobj 15 0 obj <</R13 13 0 R/R11 11 0 R/R9 9 0 R>> endobj 22 0 obj <</R21 21 0 R/R20 20 0 R/R16 16 0 R>> endobj 29 0 obj <</R28 28 0 R/R27 27 0 R/R23 23 0 R>> endobj 36 0 obj <</R34 34 0 R/R35 35 0 R/R30 30 0 R>> endobj 43 0 obj <</R42 42 0 R/R41 41 0 R/R37 37 0 R>> endobj 50 0 obj <</R49 49 0 R/R48 48 0 R/R44 44 0 R>> endobj 57 0 obj <</R56 56 0 R/R55 55 0 R/R51 51 0 R>> endobj 64 0 obj <</R63 63 0 R/R62 62 0 R/R58 58 0 R>> endobj 71 0 obj <</R70 70 0 R/R69 69 0 R/R65 65 0 R>> endobj 77 0 obj <</R76 76 0 R/R72 72 0 R>> endobj 83 0 obj <</R82 82 0 R/R78 78 0 R>> endobj 12 0 obj <</Type/FontDescriptor/FontName/Times-Italic>> endobj 70 0 obj <</Subtype/Type1/BaseFont/Times-Italic/Type/Font/Name/R70/FirstChar 0/LastChar 255/Widths[ 422 541 500 556 389 389 556 980 214 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 420 500 500 833 778 333 333 333 500 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 333 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389 400 275 400 333 250 333 500 500 350 500 167 1000 500 500 500 889 250 500 500 250 250 278 250 333 333 333 333 333 333 333 556 556 667 278 556 944 556 250 389 500 500 500 500 275 500 333 760 276 333 675 675 760 333 400 675 300 300 333 500 523 250 333 300 310 333 750 750 750 500 611 611 611 611 611 611 889 667 611 611 611 611 333 333 333 333 722 667 722 722 722 722 722 675 722 722 722 722 722 556 611 500 500 500 500 500 500 500 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 675 500 500 500 500 500 444 500 444] >> endobj 63 0 obj <</Subtype/Type1/BaseFont/Times-Italic/Type/Font/Name/R63/FirstChar 0/LastChar 255/Widths[ 422 541 500 556 389 389 556 980 214 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 420 500 500 833 778 333 333 333 500 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 333 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389 400 275 400 333 250 333 500 500 350 500 167 1000 500 500 500 889 250 500 500 250 250 278 250 333 333 333 333 333 333 333 556 556 667 278 556 944 556 250 389 500 500 500 500 275 500 333 760 276 333 675 675 760 333 400 675 300 300 333 500 523 250 333 300 310 333 750 750 750 500 611 611 611 611 611 611 889 667 611 611 611 611 333 333 333 333 722 667 722 722 722 722 722 675 722 722 722 722 722 556 611 500 500 500 500 500 500 500 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 675 500 500 500 500 500 444 500 444] >> endobj 56 0 obj <</Subtype/Type1/BaseFont/Times-Italic/Type/Font/Name/R56/FirstChar 0/LastChar 255/Widths[ 422 541 500 556 389 389 556 980 214 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 420 500 500 833 778 333 333 333 500 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 333 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389 400 275 400 333 250 333 500 500 350 500 167 1000 500 500 500 889 250 500 500 250 250 278 250 333 333 333 333 333 333 333 556 556 667 278 556 944 556 250 389 500 500 500 500 275 500 333 760 276 333 675 675 760 333 400 675 300 300 333 500 523 250 333 300 310 333 750 750 750 500 611 611 611 611 611 611 889 667 611 611 611 611 333 333 333 333 722 667 722 722 722 722 722 675 722 722 722 722 722 556 611 500 500 500 500 500 500 500 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 675 500 500 500 500 500 444 500 444] >> endobj 49 0 obj <</Subtype/Type1/BaseFont/Times-Italic/Type/Font/Name/R49/FirstChar 0/LastChar 255/Widths[ 422 541 500 556 389 389 556 980 214 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 420 500 500 833 778 333 333 333 500 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 333 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389 400 275 400 333 250 333 500 500 350 500 167 1000 500 500 500 889 250 500 500 250 250 278 250 333 333 333 333 333 333 333 556 556 667 278 556 944 556 250 389 500 500 500 500 275 500 333 760 276 333 675 675 760 333 400 675 300 300 333 500 523 250 333 300 310 333 750 750 750 500 611 611 611 611 611 611 889 667 611 611 611 611 333 333 333 333 722 667 722 722 722 722 722 675 722 722 722 722 722 556 611 500 500 500 500 500 500 500 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 675 500 500 500 500 500 444 500 444] >> endobj 42 0 obj <</Subtype/Type1/BaseFont/Times-Italic/Type/Font/Name/R42/FirstChar 0/LastChar 255/Widths[ 422 541 500 556 389 389 556 980 214 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 420 500 500 833 778 333 333 333 500 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 333 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389 400 275 400 333 250 333 500 500 350 500 167 1000 500 500 500 889 250 500 500 250 250 278 250 333 333 333 333 333 333 333 556 556 667 278 556 944 556 250 389 500 500 500 500 275 500 333 760 276 333 675 675 760 333 400 675 300 300 333 500 523 250 333 300 310 333 750 750 750 500 611 611 611 611 611 611 889 667 611 611 611 611 333 333 333 333 722 667 722 722 722 722 722 675 722 722 722 722 722 556 611 500 500 500 500 500 500 500 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 675 500 500 500 500 500 444 500 444] >> endobj 34 0 obj <</Subtype/Type1/BaseFont/Times-Italic/Type/Font/Name/R34/FirstChar 0/LastChar 255/Widths[ 422 541 500 556 389 389 556 980 214 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 420 500 500 833 778 333 333 333 500 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 333 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389 400 275 400 333 250 333 500 500 350 500 167 1000 500 500 500 889 250 500 500 250 250 278 250 333 333 333 333 333 333 333 556 556 667 278 556 944 556 250 389 500 500 500 500 275 500 333 760 276 333 675 675 760 333 400 675 300 300 333 500 523 250 333 300 310 333 750 750 750 500 611 611 611 611 611 611 889 667 611 611 611 611 333 333 333 333 722 667 722 722 722 722 722 675 722 722 722 722 722 556 611 500 500 500 500 500 500 500 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 675 500 500 500 500 500 444 500 444] >> endobj 28 0 obj <</Subtype/Type1/BaseFont/Times-Italic/Type/Font/Name/R28/FirstChar 0/LastChar 255/Widths[ 422 541 500 556 389 389 556 980 214 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 420 500 500 833 778 333 333 333 500 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 333 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389 400 275 400 333 250 333 500 500 350 500 167 1000 500 500 500 889 250 500 500 250 250 278 250 333 333 333 333 333 333 333 556 556 667 278 556 944 556 250 389 500 500 500 500 275 500 333 760 276 333 675 675 760 333 400 675 300 300 333 500 523 250 333 300 310 333 750 750 750 500 611 611 611 611 611 611 889 667 611 611 611 611 333 333 333 333 722 667 722 722 722 722 722 675 722 722 722 722 722 556 611 500 500 500 500 500 500 500 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 675 500 500 500 500 500 444 500 444] >> endobj 21 0 obj <</Subtype/Type1/BaseFont/Times-Italic/Type/Font/Name/R21/FirstChar 0/LastChar 255/Widths[ 422 541 500 556 389 389 556 980 214 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 420 500 500 833 778 333 333 333 500 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 333 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389 400 275 400 333 250 333 500 500 350 500 167 1000 500 500 500 889 250 500 500 250 250 278 250 333 333 333 333 333 333 333 556 556 667 278 556 944 556 250 389 500 500 500 500 275 500 333 760 276 333 675 675 760 333 400 675 300 300 333 500 523 250 333 300 310 333 750 750 750 500 611 611 611 611 611 611 889 667 611 611 611 611 333 333 333 333 722 667 722 722 722 722 722 675 722 722 722 722 722 556 611 500 500 500 500 500 500 500 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 675 500 500 500 500 500 444 500 444] >> endobj 13 0 obj <</Subtype/Type1/BaseFont/Times-Italic/Type/Font/Name/R13/FirstChar 0/LastChar 255/Widths[ 422 541 500 556 389 389 556 980 214 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 420 500 500 833 778 333 333 333 500 675 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 675 675 675 500 920 611 611 667 722 611 611 722 722 333 444 667 556 833 667 722 611 722 611 500 556 722 611 833 611 556 556 389 278 389 333 500 333 500 500 444 500 444 278 500 500 278 278 444 278 722 500 500 500 500 389 389 278 500 444 667 444 444 389 400 275 400 333 250 333 500 500 350 500 167 1000 500 500 500 889 250 500 500 250 250 278 250 333 333 333 333 333 333 333 556 556 667 278 556 944 556 250 389 500 500 500 500 275 500 333 760 276 333 675 675 760 333 400 675 300 300 333 500 523 250 333 300 310 333 750 750 750 500 611 611 611 611 611 611 889 667 611 611 611 611 333 333 333 333 722 667 722 722 722 722 722 675 722 722 722 722 722 556 611 500 500 500 500 500 500 500 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 675 500 500 500 500 500 444 500 444] /Encoding 84 0 R>> endobj 84 0 obj <</Type/Encoding/Differences[ 140/fi]>> endobj 10 0 obj <</Type/FontDescriptor/FontName/Times-Bold>> endobj 82 0 obj <</Subtype/Type1/BaseFont/Times-Bold/Type/Font/Name/R82/FirstChar 0/LastChar 255/Widths[ 581 520 556 667 389 444 722 1000 278 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 555 500 500 1000 833 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 333 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444 394 220 394 333 250 333 500 500 350 500 167 1000 500 500 500 1000 250 556 556 250 250 278 250 333 333 333 333 333 333 333 500 500 722 278 500 1000 667 250 333 500 500 500 500 220 500 333 747 300 333 570 570 747 333 400 570 300 300 333 556 540 250 333 300 330 333 750 750 750 500 722 722 722 722 722 722 1000 722 667 667 667 667 389 389 389 389 722 722 778 778 778 778 778 570 778 722 722 722 722 722 611 556 500 500 500 500 500 500 722 444 444 444 444 444 278 278 278 278 500 556 500 500 500 500 500 570 500 556 556 556 556 500 556 500] >> endobj 76 0 obj <</Subtype/Type1/BaseFont/Times-Bold/Type/Font/Name/R76/FirstChar 0/LastChar 255/Widths[ 581 520 556 667 389 444 722 1000 278 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 555 500 500 1000 833 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 333 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444 394 220 394 333 250 333 500 500 350 500 167 1000 500 500 500 1000 250 556 556 250 250 278 250 333 333 333 333 333 333 333 500 500 722 278 500 1000 667 250 333 500 500 500 500 220 500 333 747 300 333 570 570 747 333 400 570 300 300 333 556 540 250 333 300 330 333 750 750 750 500 722 722 722 722 722 722 1000 722 667 667 667 667 389 389 389 389 722 722 778 778 778 778 778 570 778 722 722 722 722 722 611 556 500 500 500 500 500 500 722 444 444 444 444 444 278 278 278 278 500 556 500 500 500 500 500 570 500 556 556 556 556 500 556 500] >> endobj 69 0 obj <</Subtype/Type1/BaseFont/Times-Bold/Type/Font/Name/R69/FirstChar 0/LastChar 255/Widths[ 581 520 556 667 389 444 722 1000 278 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 555 500 500 1000 833 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 333 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444 394 220 394 333 250 333 500 500 350 500 167 1000 500 500 500 1000 250 556 556 250 250 278 250 333 333 333 333 333 333 333 500 500 722 278 500 1000 667 250 333 500 500 500 500 220 500 333 747 300 333 570 570 747 333 400 570 300 300 333 556 540 250 333 300 330 333 750 750 750 500 722 722 722 722 722 722 1000 722 667 667 667 667 389 389 389 389 722 722 778 778 778 778 778 570 778 722 722 722 722 722 611 556 500 500 500 500 500 500 722 444 444 444 444 444 278 278 278 278 500 556 500 500 500 500 500 570 500 556 556 556 556 500 556 500] >> endobj 62 0 obj <</Subtype/Type1/BaseFont/Times-Bold/Type/Font/Name/R62/FirstChar 0/LastChar 255/Widths[ 581 520 556 667 389 444 722 1000 278 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 555 500 500 1000 833 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 333 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444 394 220 394 333 250 333 500 500 350 500 167 1000 500 500 500 1000 250 556 556 250 250 278 250 333 333 333 333 333 333 333 500 500 722 278 500 1000 667 250 333 500 500 500 500 220 500 333 747 300 333 570 570 747 333 400 570 300 300 333 556 540 250 333 300 330 333 750 750 750 500 722 722 722 722 722 722 1000 722 667 667 667 667 389 389 389 389 722 722 778 778 778 778 778 570 778 722 722 722 722 722 611 556 500 500 500 500 500 500 722 444 444 444 444 444 278 278 278 278 500 556 500 500 500 500 500 570 500 556 556 556 556 500 556 500] >> endobj 55 0 obj <</Subtype/Type1/BaseFont/Times-Bold/Type/Font/Name/R55/FirstChar 0/LastChar 255/Widths[ 581 520 556 667 389 444 722 1000 278 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 555 500 500 1000 833 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 333 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444 394 220 394 333 250 333 500 500 350 500 167 1000 500 500 500 1000 250 556 556 250 250 278 250 333 333 333 333 333 333 333 500 500 722 278 500 1000 667 250 333 500 500 500 500 220 500 333 747 300 333 570 570 747 333 400 570 300 300 333 556 540 250 333 300 330 333 750 750 750 500 722 722 722 722 722 722 1000 722 667 667 667 667 389 389 389 389 722 722 778 778 778 778 778 570 778 722 722 722 722 722 611 556 500 500 500 500 500 500 722 444 444 444 444 444 278 278 278 278 500 556 500 500 500 500 500 570 500 556 556 556 556 500 556 500] >> endobj 48 0 obj <</Subtype/Type1/BaseFont/Times-Bold/Type/Font/Name/R48/FirstChar 0/LastChar 255/Widths[ 581 520 556 667 389 444 722 1000 278 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 555 500 500 1000 833 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 333 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444 394 220 394 333 250 333 500 500 350 500 167 1000 500 500 500 1000 250 556 556 250 250 278 250 333 333 333 333 333 333 333 500 500 722 278 500 1000 667 250 333 500 500 500 500 220 500 333 747 300 333 570 570 747 333 400 570 300 300 333 556 540 250 333 300 330 333 750 750 750 500 722 722 722 722 722 722 1000 722 667 667 667 667 389 389 389 389 722 722 778 778 778 778 778 570 778 722 722 722 722 722 611 556 500 500 500 500 500 500 722 444 444 444 444 444 278 278 278 278 500 556 500 500 500 500 500 570 500 556 556 556 556 500 556 500] >> endobj 41 0 obj <</Subtype/Type1/BaseFont/Times-Bold/Type/Font/Name/R41/FirstChar 0/LastChar 255/Widths[ 581 520 556 667 389 444 722 1000 278 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 555 500 500 1000 833 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 333 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444 394 220 394 333 250 333 500 500 350 500 167 1000 500 500 500 1000 250 556 556 250 250 278 250 333 333 333 333 333 333 333 500 500 722 278 500 1000 667 250 333 500 500 500 500 220 500 333 747 300 333 570 570 747 333 400 570 300 300 333 556 540 250 333 300 330 333 750 750 750 500 722 722 722 722 722 722 1000 722 667 667 667 667 389 389 389 389 722 722 778 778 778 778 778 570 778 722 722 722 722 722 611 556 500 500 500 500 500 500 722 444 444 444 444 444 278 278 278 278 500 556 500 500 500 500 500 570 500 556 556 556 556 500 556 500] >> endobj 35 0 obj <</Subtype/Type1/BaseFont/Times-Bold/Type/Font/Name/R35/FirstChar 0/LastChar 255/Widths[ 581 520 556 667 389 444 722 1000 278 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 555 500 500 1000 833 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 333 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444 394 220 394 333 250 333 500 500 350 500 167 1000 500 500 500 1000 250 556 556 250 250 278 250 333 333 333 333 333 333 333 500 500 722 278 500 1000 667 250 333 500 500 500 500 220 500 333 747 300 333 570 570 747 333 400 570 300 300 333 556 540 250 333 300 330 333 750 750 750 500 722 722 722 722 722 722 1000 722 667 667 667 667 389 389 389 389 722 722 778 778 778 778 778 570 778 722 722 722 722 722 611 556 500 500 500 500 500 500 722 444 444 444 444 444 278 278 278 278 500 556 500 500 500 500 500 570 500 556 556 556 556 500 556 500] >> endobj 27 0 obj <</Subtype/Type1/BaseFont/Times-Bold/Type/Font/Name/R27/FirstChar 0/LastChar 255/Widths[ 581 520 556 667 389 444 722 1000 278 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 555 500 500 1000 833 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 333 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444 394 220 394 333 250 333 500 500 350 500 167 1000 500 500 500 1000 250 556 556 250 250 278 250 333 333 333 333 333 333 333 500 500 722 278 500 1000 667 250 333 500 500 500 500 220 500 333 747 300 333 570 570 747 333 400 570 300 300 333 556 540 250 333 300 330 333 750 750 750 500 722 722 722 722 722 722 1000 722 667 667 667 667 389 389 389 389 722 722 778 778 778 778 778 570 778 722 722 722 722 722 611 556 500 500 500 500 500 500 722 444 444 444 444 444 278 278 278 278 500 556 500 500 500 500 500 570 500 556 556 556 556 500 556 500] >> endobj 20 0 obj <</Subtype/Type1/BaseFont/Times-Bold/Type/Font/Name/R20/FirstChar 0/LastChar 255/Widths[ 581 520 556 667 389 444 722 1000 278 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 555 500 500 1000 833 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 333 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444 394 220 394 333 250 333 500 500 350 500 167 1000 500 500 500 1000 250 556 556 250 250 278 250 333 333 333 333 333 333 333 500 500 722 278 500 1000 667 250 333 500 500 500 500 220 500 333 747 300 333 570 570 747 333 400 570 300 300 333 556 540 250 333 300 330 333 750 750 750 500 722 722 722 722 722 722 1000 722 667 667 667 667 389 389 389 389 722 722 778 778 778 778 778 570 778 722 722 722 722 722 611 556 500 500 500 500 500 500 722 444 444 444 444 444 278 278 278 278 500 556 500 500 500 500 500 570 500 556 556 556 556 500 556 500] /Encoding 85 0 R>> endobj 85 0 obj <</Type/Encoding/Differences[ 140/fi]>> endobj 11 0 obj <</Subtype/Type1/BaseFont/Times-Bold/Type/Font/Name/R11/FirstChar 0/LastChar 255/Widths[ 581 520 556 667 389 444 722 1000 278 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 555 500 500 1000 833 333 333 333 500 570 250 333 250 278 500 500 500 500 500 500 500 500 500 500 333 333 570 570 570 500 930 722 667 722 722 667 611 778 778 389 500 778 667 944 722 778 611 778 722 556 667 722 722 1000 722 722 667 333 278 333 333 500 333 500 556 444 556 444 333 500 556 278 333 556 278 833 556 500 556 556 444 389 333 556 500 722 500 500 444 394 220 394 333 250 333 500 500 350 500 167 1000 500 500 500 1000 250 556 556 250 250 278 250 333 333 333 333 333 333 333 500 500 722 278 500 1000 667 250 333 500 500 500 500 220 500 333 747 300 333 570 570 747 333 400 570 300 300 333 556 540 250 333 300 330 333 750 750 750 500 722 722 722 722 722 722 1000 722 667 667 667 667 389 389 389 389 722 722 778 778 778 778 778 570 778 722 722 722 722 722 611 556 500 500 500 500 500 500 722 444 444 444 444 444 278 278 278 278 500 556 500 500 500 500 500 570 500 556 556 556 556 500 556 500] >> endobj 8 0 obj <</Type/FontDescriptor/FontName/Times-Roman>> endobj 78 0 obj <</Subtype/Type1/BaseFont/Times-Roman/Type/Font/Name/R78/FirstChar 0/LastChar 255/Widths[ 469 541 556 611 389 444 722 980 180 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 333 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 333 250 333 500 500 350 500 167 1000 500 500 500 1000 250 556 556 250 250 278 250 333 333 333 333 333 333 333 444 444 722 278 444 889 611 250 333 500 500 500 500 200 500 333 760 276 333 564 564 760 333 400 564 300 300 333 500 453 250 333 300 310 333 750 750 750 444 722 722 722 722 722 722 889 667 611 611 611 611 333 333 333 333 722 722 722 722 722 722 722 564 722 722 722 722 722 722 556 500 444 444 444 444 444 444 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 564 500 500 500 500 500 500 500 500] >> endobj 72 0 obj <</Subtype/Type1/BaseFont/Times-Roman/Type/Font/Name/R72/FirstChar 0/LastChar 255/Widths[ 469 541 556 611 389 444 722 980 180 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 333 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 333 250 333 500 500 350 500 167 1000 500 500 500 1000 250 556 556 250 250 278 250 333 333 333 333 333 333 333 444 444 722 278 444 889 611 250 333 500 500 500 500 200 500 333 760 276 333 564 564 760 333 400 564 300 300 333 500 453 250 333 300 310 333 750 750 750 444 722 722 722 722 722 722 889 667 611 611 611 611 333 333 333 333 722 722 722 722 722 722 722 564 722 722 722 722 722 722 556 500 444 444 444 444 444 444 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 564 500 500 500 500 500 500 500 500] >> endobj 65 0 obj <</Subtype/Type1/BaseFont/Times-Roman/Type/Font/Name/R65/FirstChar 0/LastChar 255/Widths[ 469 541 556 611 389 444 722 980 180 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 333 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 333 250 333 500 500 350 500 167 1000 500 500 500 1000 250 556 556 250 250 278 250 333 333 333 333 333 333 333 444 444 722 278 444 889 611 250 333 500 500 500 500 200 500 333 760 276 333 564 564 760 333 400 564 300 300 333 500 453 250 333 300 310 333 750 750 750 444 722 722 722 722 722 722 889 667 611 611 611 611 333 333 333 333 722 722 722 722 722 722 722 564 722 722 722 722 722 722 556 500 444 444 444 444 444 444 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 564 500 500 500 500 500 500 500 500] >> endobj 58 0 obj <</Subtype/Type1/BaseFont/Times-Roman/Type/Font/Name/R58/FirstChar 0/LastChar 255/Widths[ 469 541 556 611 389 444 722 980 180 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 333 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 333 250 333 500 500 350 500 167 1000 500 500 500 1000 250 556 556 250 250 278 250 333 333 333 333 333 333 333 444 444 722 278 444 889 611 250 333 500 500 500 500 200 500 333 760 276 333 564 564 760 333 400 564 300 300 333 500 453 250 333 300 310 333 750 750 750 444 722 722 722 722 722 722 889 667 611 611 611 611 333 333 333 333 722 722 722 722 722 722 722 564 722 722 722 722 722 722 556 500 444 444 444 444 444 444 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 564 500 500 500 500 500 500 500 500] >> endobj 51 0 obj <</Subtype/Type1/BaseFont/Times-Roman/Type/Font/Name/R51/FirstChar 0/LastChar 255/Widths[ 469 541 556 611 389 444 722 980 180 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 333 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 333 250 333 500 500 350 500 167 1000 500 500 500 1000 250 556 556 250 250 278 250 333 333 333 333 333 333 333 444 444 722 278 444 889 611 250 333 500 500 500 500 200 500 333 760 276 333 564 564 760 333 400 564 300 300 333 500 453 250 333 300 310 333 750 750 750 444 722 722 722 722 722 722 889 667 611 611 611 611 333 333 333 333 722 722 722 722 722 722 722 564 722 722 722 722 722 722 556 500 444 444 444 444 444 444 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 564 500 500 500 500 500 500 500 500] >> endobj 44 0 obj <</Subtype/Type1/BaseFont/Times-Roman/Type/Font/Name/R44/FirstChar 0/LastChar 255/Widths[ 469 541 556 611 389 444 722 980 180 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 333 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 333 250 333 500 500 350 500 167 1000 500 500 500 1000 250 556 556 250 250 278 250 333 333 333 333 333 333 333 444 444 722 278 444 889 611 250 333 500 500 500 500 200 500 333 760 276 333 564 564 760 333 400 564 300 300 333 500 453 250 333 300 310 333 750 750 750 444 722 722 722 722 722 722 889 667 611 611 611 611 333 333 333 333 722 722 722 722 722 722 722 564 722 722 722 722 722 722 556 500 444 444 444 444 444 444 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 564 500 500 500 500 500 500 500 500] >> endobj 37 0 obj <</Subtype/Type1/BaseFont/Times-Roman/Type/Font/Name/R37/FirstChar 0/LastChar 255/Widths[ 469 541 556 611 389 444 722 980 180 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 333 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 333 250 333 500 500 350 500 167 1000 500 500 500 1000 250 556 556 250 250 278 250 333 333 333 333 333 333 333 444 444 722 278 444 889 611 250 333 500 500 500 500 200 500 333 760 276 333 564 564 760 333 400 564 300 300 333 500 453 250 333 300 310 333 750 750 750 444 722 722 722 722 722 722 889 667 611 611 611 611 333 333 333 333 722 722 722 722 722 722 722 564 722 722 722 722 722 722 556 500 444 444 444 444 444 444 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 564 500 500 500 500 500 500 500 500] >> endobj 30 0 obj <</Subtype/Type1/BaseFont/Times-Roman/Type/Font/Name/R30/FirstChar 0/LastChar 255/Widths[ 469 541 556 611 389 444 722 980 180 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 333 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 333 250 333 500 500 350 500 167 1000 500 500 500 1000 250 556 556 250 250 278 250 333 333 333 333 333 333 333 444 444 722 278 444 889 611 250 333 500 500 500 500 200 500 333 760 276 333 564 564 760 333 400 564 300 300 333 500 453 250 333 300 310 333 750 750 750 444 722 722 722 722 722 722 889 667 611 611 611 611 333 333 333 333 722 722 722 722 722 722 722 564 722 722 722 722 722 722 556 500 444 444 444 444 444 444 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 564 500 500 500 500 500 500 500 500] >> endobj 23 0 obj <</Subtype/Type1/BaseFont/Times-Roman/Type/Font/Name/R23/FirstChar 0/LastChar 255/Widths[ 469 541 556 611 389 444 722 980 180 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 333 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 333 250 333 500 500 350 500 167 1000 500 500 500 1000 250 556 556 250 250 278 250 333 333 333 333 333 333 333 444 444 722 278 444 889 611 250 333 500 500 500 500 200 500 333 760 276 333 564 564 760 333 400 564 300 300 333 500 453 250 333 300 310 333 750 750 750 444 722 722 722 722 722 722 889 667 611 611 611 611 333 333 333 333 722 722 722 722 722 722 722 564 722 722 722 722 722 722 556 500 444 444 444 444 444 444 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 564 500 500 500 500 500 500 500 500] >> endobj 16 0 obj <</Subtype/Type1/BaseFont/Times-Roman/Type/Font/Name/R16/FirstChar 0/LastChar 255/Widths[ 469 541 556 611 389 444 722 980 180 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 333 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 333 250 333 500 500 350 500 167 1000 500 500 500 1000 250 556 556 250 250 278 250 333 333 333 333 333 333 333 444 444 722 278 444 889 611 250 333 500 500 500 500 200 500 333 760 276 333 564 564 760 333 400 564 300 300 333 500 453 250 333 300 310 333 750 750 750 444 722 722 722 722 722 722 889 667 611 611 611 611 333 333 333 333 722 722 722 722 722 722 722 564 722 722 722 722 722 722 556 500 444 444 444 444 444 444 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 564 500 500 500 500 500 500 500 500] >> endobj 9 0 obj <</Subtype/Type1/BaseFont/Times-Roman/Type/Font/Name/R9/FirstChar 0/LastChar 255/Widths[ 469 541 556 611 389 444 722 980 180 500 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 250 333 408 500 500 833 778 333 333 333 500 564 250 333 250 278 500 500 500 500 500 500 500 500 500 500 278 278 564 564 564 444 921 722 667 667 722 611 556 722 722 333 389 722 611 889 722 722 556 722 667 556 611 722 722 944 722 722 611 333 278 333 333 500 333 444 500 444 500 444 333 500 500 278 278 500 278 778 500 500 500 500 333 389 278 500 500 722 500 500 444 480 200 480 333 250 333 500 500 350 500 167 1000 500 500 500 1000 250 556 556 250 250 278 250 333 333 333 333 333 333 333 444 444 722 278 444 889 611 250 333 500 500 500 500 200 500 333 760 276 333 564 564 760 333 400 564 300 300 333 500 453 250 333 300 310 333 750 750 750 444 722 722 722 722 722 722 889 667 611 611 611 611 333 333 333 333 722 722 722 722 722 722 722 564 722 722 722 722 722 722 556 500 444 444 444 444 444 444 667 444 444 444 444 444 278 278 278 278 500 500 500 500 500 500 500 564 500 500 500 500 500 500 500 500] /Encoding 86 0 R>> endobj 86 0 obj <</Type/Encoding/Differences[ 131/bullet 140/fi/fl 173/minus]>> endobj 2 0 obj <</Producer(GNU Ghostscript 7.07) /Creator(groff version 1.18.1) /CreationDate(Mon Aug 25 16:19:34 2003)>>endobj xref 0 87 0000000000 65535 f 0000034061 00000 n 0000070447 00000 n 0000033922 00000 n 0000034109 00000 n 0000032322 00000 n 0000000015 00000 n 0000003397 00000 n 0000057796 00000 n 0000069217 00000 n 0000045123 00000 n 0000056656 00000 n 0000034764 00000 n 0000043915 00000 n 0000034164 00000 n 0000034194 00000 n 0000068081 00000 n 0000032482 00000 n 0000003417 00000 n 0000007489 00000 n 0000055444 00000 n 0000042779 00000 n 0000034246 00000 n 0000066945 00000 n 0000032626 00000 n 0000007510 00000 n 0000010656 00000 n 0000054304 00000 n 0000041643 00000 n 0000034300 00000 n 0000065809 00000 n 0000032770 00000 n 0000010677 00000 n 0000014026 00000 n 0000040507 00000 n 0000053164 00000 n 0000034354 00000 n 0000064673 00000 n 0000032914 00000 n 0000014047 00000 n 0000017318 00000 n 0000052024 00000 n 0000039371 00000 n 0000034408 00000 n 0000063537 00000 n 0000033058 00000 n 0000017339 00000 n 0000020196 00000 n 0000050884 00000 n 0000038235 00000 n 0000034462 00000 n 0000062401 00000 n 0000033202 00000 n 0000020217 00000 n 0000022891 00000 n 0000049744 00000 n 0000037099 00000 n 0000034516 00000 n 0000061265 00000 n 0000033346 00000 n 0000022912 00000 n 0000026367 00000 n 0000048604 00000 n 0000035963 00000 n 0000034570 00000 n 0000060129 00000 n 0000033490 00000 n 0000026388 00000 n 0000028720 00000 n 0000047464 00000 n 0000034827 00000 n 0000034624 00000 n 0000058993 00000 n 0000033634 00000 n 0000028741 00000 n 0000031500 00000 n 0000046324 00000 n 0000034678 00000 n 0000057857 00000 n 0000033778 00000 n 0000031521 00000 n 0000032302 00000 n 0000045184 00000 n 0000034721 00000 n 0000045067 00000 n 0000056600 00000 n 0000070367 00000 n trailer << /Size 87 /Root 1 0 R /Info 2 0 R >> startxref 70568 %%EOF �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/�����������������������������������������������������������0000775�0000000�0000000�00000000000�11047204732�015040� 5����������������������������������������������������������������������������������������������������ustar ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/sighandlers.py���������������������������������������������0000664�0000000�0000000�00000004127�10762620505�017724� 0����������������������������������������������������������������������������������������������������ustar ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# Python-based gopher server # Module: signal handlers # COPYRIGHT # # Copyright (C) 2002 John Goerzen # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # END OF COPYRIGHT # import signal, sys, os from pygopherd import logger pgrp = None pid = None def huphandler(signum, frame): logger.log("SIGHUP (%d) received; terminating process" % signum) os._exit(5) # So we don't raise SystemExit def termhandler(signum, frame): if os.getpid() == pid: # Master killed; kill children. logger.log("SIGTERM (%d) received in master; doing orderly shutdown" \ % signum) logger.log("Terminating all of process group %d with SIGHUP" % \ (pgrp)) # Ignore this signal so that our own process won't get it again. signal.signal(signal.SIGHUP, signal.SIG_IGN) os.kill(0, signal.SIGHUP) logger.log("Master application process now exiting. Goodbye.") sys.exit(6) else: # Shouldn't need this -- just in case. logger.log("SIGTERM (%d) received in child; terminating this process" \ % signum) os._exit(7) # So we don't raise SystemExit def setsighuphandler(): if 'SIGHUP' in signal.__dict__: signal.signal(signal.SIGHUP, huphandler) def setsigtermhandler(newpgrp): global pgrp, pid pgrp = newpgrp pid = os.getpid() signal.signal(signal.SIGTERM, termhandler) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/pipeTest.py������������������������������������������������0000664�0000000�0000000�00000002010�10762620505�017203� 0����������������������������������������������������������������������������������������������������ustar ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������import unittest, os from pygopherd import pipe, testutil class PipeTestCase(unittest.TestCase): def setUp(self): self.config = testutil.getconfig() self.root = self.config.get("pygopherd", "root") self.testdata = self.root + "/pygopherd/pipetestdata" self.testprog = self.root + "/pygopherd/pipetest.sh" def testWorkingPipe(self): outputfd = os.tmpfile() inputfd = open(self.testdata, "rt") retval = pipe.pipedata(self.testprog, [self.testprog], childstdin = inputfd, childstdout = outputfd) outputfd.seek(0) self.assertEquals(outputfd.read(), "Starting\nGot [Word1]\nGot [Word2]\nGot [Word3]\nEnding\n") self.assert_(os.WIFEXITED(retval), "WIFEXITED was not true") self.assertEquals(os.WEXITSTATUS(retval), 0) self.assertEquals(retval, 0) outputfd.close() def testFailingPipe(self): outputfd = os.tmpfile() ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/initializationTest.py��������������������������������������0000664�0000000�0000000�00000005575�10762620505�021320� 0����������������������������������������������������������������������������������������������������ustar ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#!/usr/bin/python # Python-based gopher server # Module: test of initialization code # COPYRIGHT # # Copyright (C) 2002 John Goerzen # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # END OF COPYRIGHT # import unittest, SocketServer, mimetypes from pygopherd import initialization from pygopherd import logger, fileext class initializationConfigTestCase(unittest.TestCase): def testinitconffile(self): self.assertRaises(Exception, initialization.initconffile, '/foo') # Load the standard config file. It should be OK at least. config = initialization.initconffile('conf/pygopherd.conf') assert not config.has_option("pygopherd", "servername"), \ "servername should be disabled by default" self.assertEqual(config.getint("pygopherd", "port"), 70, "Port should be 70") self.assertEqual(config.get("pygopherd", "servertype"), "ForkingTCPServer", "Servertype should be ForkingTCPServer") assert config.getboolean("pygopherd", "tracebacks"), \ "Tracebacks should be enabled." class initializationGeneralTestCase(unittest.TestCase): def setUp(self): self.config = initialization.initconffile('conf/pygopherd.conf') def testinitlogger(self): # FIXME Can't really test this. pass def testinitmimetypes_except(self): self.config.set("pygopherd", "mimetypes", "/foo:/bar") self.assertRaises(Exception, initialization.initmimetypes, self.config) def testinitmimetypes(self): # Logger is required for this test. self.config.set("logger", "logmethod", "none") initialization.initlogger(self.config, 'TESTING') initialization.initmimetypes(self.config) self.assertEqual(mimetypes.types_map['.txt'], 'text/plain') self.assertEqual(mimetypes.encodings_map['.bz2'], 'bzip2') assert '.txt' in fileext.typemap['text/plain'] def testgetserverobject(self): self.config.set("pygopherd", "port", "22270") s = initialization.getserverobject(self.config) assert isinstance(s, SocketServer.ForkingTCPServer) def testinitsecurity(self): #FIXME pass �����������������������������������������������������������������������������������������������������������������������������������pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/pipe.py����������������������������������������������������0000664�0000000�0000000�00000003054�10762620505�016354� 0����������������������������������������������������������������������������������������������������ustar ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# pygopherd -- Gopher-based protocol server in Python # module: Execute children in a pipe. # Copyright (C) 2002 John Goerzen # <jgoerzen@complete.org> # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import os, sys # Later we will check sys.platform def pipedata_unix(file, args, environ = os.environ, childstdin = None, childstdout = None, childstderr = None, pathsearch = 0): pid = os.fork() if pid: # Parent. return os.waitpid(pid, 0)[1] else: # Child. if childstdin: os.dup2(childstdin.fileno(), 0) if childstdout: os.dup2(childstdout.fileno(), 1) if childstderr: os.dup2(childstderr.fileno(), 2) if pathsearch: os.execvpe(file, args, environ) else: os.execve(file, args, environ) sys.exit(255) pipedata = pipedata_unix ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/fileext.py�������������������������������������������������0000664�0000000�0000000�00000004207�10762620505�017060� 0����������������������������������������������������������������������������������������������������ustar ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# pygopherd -- Gopher-based protocol server in Python # module: File extension utility # Copyright (C) 2002 John Goerzen # <jgoerzen@complete.org> # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import mimetypes typemap = {} def extcmp(x, y): if x.count('.') > y.count('.'): return 1 if x.count('.') < y.count('.'): return -1 if len(x) > len(y): return 1 if len(x) < len(y): return -1 return cmp(x, y) def extstrip(file, filetype): """Strips off the extension from file given type and returns the result. Returns file unmodified if no action is possible.""" if not (filetype and typemap.has_key(filetype)): return file for possible in typemap[filetype]: if file.endswith(possible): extindex = file.rfind(possible) return file[0:extindex] return file def init(): for fileext, filetype in mimetypes.types_map.items(): extlist = [] if typemap.has_key(filetype): extlist = typemap[filetype] baselist = [] # Add the basic extension. baselist.append(fileext) # Add it in all encoding flavors. baselist.extend( [fileext + enc for enc in mimetypes.encodings_map.keys()]) for shortsuff, longsuff in mimetypes.suffix_map.items(): if longsuff in baselist: baselist.append(shortsuff) extlist.extend(baselist) extlist.sort(extcmp) extlist.reverse() typemap[filetype] = extlist �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/gopherentry.py���������������������������������������������0000664�0000000�0000000�00000027106�10762620505�017771� 0����������������������������������������������������������������������������������������������������ustar ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# pygopherd -- Gopher-based protocol server in Python # module: Generic gopher entry object # Copyright (C) 2002 John Goerzen # <jgoerzen@complete.org> # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import SocketServer import re import os, stat, os.path, mimetypes, urllib mapping = None eaexts = None class GopherEntry: """The entry object for Gopher. It holds information about each Gopher object.""" def __init__(self, selector, config): """Initialize object based on a selector and config.""" self.selector = selector # Gopher path to file self.config = config # Our config object self.fspath = None # Path to the obj in filesystem self.type = None # Gopher0 type char self.name = None # Menu name self.host = None # Hostname self.port = None # Port number (an int) self.mimetype = None # MIME type self.encodedmimetype = None # Real MIME type if encoded. self.size = None # Size self.encoding = None # Encoding type self.populated = 0 # Whether or not it's been populated self.language = None # Language self.ctime = None # Creation date self.mtime = None # Modification date self.num = 0 # Number in menu self.gopherpsupport = 0 # Supports gopher+ self.ea = {} # Extended attributes -- Gopher+ # Abstract, etc. def populatefromvfs(self, vfs, selector): self.populatefromfs(selector, statval = vfs.stat(selector), vfs = vfs) def populatefromfs(self, fspath, statval = None, vfs = None): """Fills in self with data gleaned from the filesystem. The argument fspath specifies where in the filesystem it will search. statval, if present, will be used instead of calling stat() itself so as to cut down on the number of system calls. The overall idea of this function is to set only those values that are not already set and to do so only if a definitive answer for them can be obtained from the operating system. The rest of this information describes the details of how it does this. If populatefromfs has already been called or self.populated is true, this function will note the fspath and the return without modifying anything else. If either gethost() or getport() return anything other than None, the same thing will happen. If there is no statval and os.stat returns an error, again, the same thing will happen. Assuming these tests pass, then: self.gopherpsupport will be set to true for any file or directory. The remaining values will be set only if they are not set already: For both files and directories, the creation and modification times will be noted, the name will be set to the filename (as returned by os.path.basename on the selector). For directories only, the type will be set to 1 and the mimetype to application/gopher-menu. Gopher+ protocols may wish to indicate application/gopher+-menu is available as well, but that is outside the scope of this function. For files only, the size will be noted. An attempt will be made to ascertain a mimetype and an encoding. If only a mimetype is found, it will be noted in self.mimetype. If both a mimetype and an encoding is found, self.mimetype will be application/octet-stream, self.encoding will note the encoding, and self.encodedmimetype will note the type of the encoded data. If no mimetype can be found, it will be set to the default from the config file. If no gopher0 type character is already present, self.guesstype() will be called to set it.""" self.fspath = fspath if vfs == None: from pygopherd.handlers.base import VFS_Real vfs = VFS_Real(self.config) if self.populated: return # Just let the stat catch the OSError rather than testing # for existance here. Help cut down on the number of syscalls. if not (self.gethost() == None and self.getport() == None): return if not statval: try: statval = vfs.stat(self.fspath) except OSError: return self.populated = 1 self.gopherpsupport = 1 # Indicate gopher+ support for locals. # All this "or" stuff means that we only modify it if it's not already # set. self.ctime = self.ctime or statval[9] self.mtime = self.mtime or statval[8] self.name = self.name or os.path.basename(self.selector) if stat.S_ISDIR(statval[0]): self.type = self.type or '1' self.mimetype = self.mimetype or 'application/gopher-menu' self.handleeaext(self.fspath + '/', vfs) # Add the / so we get /.abs return self.handleeaext(self.fspath, vfs) self.size = self.size or statval[6] mimetype, encoding = mimetypes.guess_type(self.selector, strict = 0) if encoding: self.mimetype = self.mimetype or 'application/octet-stream' self.encoding = self.encoding or encoding self.encodedmimetype = self.encodedmimetype or mimetype else: self.mimetype = self.mimetype or mimetype # Did we get no mime type at all? Fall back to a default. if not self.mimetype: self.mimetype = self.config.get("GopherEntry", "defaultmimetype") self.type = self.type or self.guesstype() def guesstype(self): global mapping if not mapping: mapping = eval(self.config.get("GopherEntry", "mapping")) for maprule in mapping: if re.match(maprule[0], self.mimetype): return maprule[1] return '0' def handleeaext(self, selector, vfs): """Handle getting extended attributes from the filesystem.""" global eaexts if eaexts == None: eaexts = eval(self.config.get("GopherEntry", "eaexts")) if vfs == None: from pygopherd.handlers.base import VFS_Real vfs = VFS_Real(self.config) for extension, blockname in eaexts.items(): if self.ea.has_key(blockname): continue try: rfile = vfs.open(selector + extension, "rt") self.setea(blockname, "\n".join( [x.rstrip() for x in rfile.readlines(20480)])) except IOError: pass def getselector(self, default = None): if self.selector == None: return default return self.selector def setselector(self, arg): self.selector = arg def getconfig(self, default = None): return self.config or default def setconfig(self, arg): self.config = arg def getfspath(self, default = None): if self.fspath == None: return default return self.fspath def setfspath(self, arg): self.fspath = arg def gettype(self, default = None): if self.type == None: return default return self.type def settype(self, arg): self.type = arg def getname(self, default = None): if self.name == None: return default return self.name def setname(self, arg): self.name = arg def gethost(self, default = None): if self.host == None: return default return self.host def sethost(self, arg): self.host = arg def getport(self, default = None): if self.port == None: return default return self.port def setport(self, arg): self.port = arg def getmimetype(self, default = None): if self.mimetype == None: return default return self.mimetype def getencodedmimetype(self, default = None): if self.encodedmimetype == None: return default return self.encodedmimetype def setencodedmimetype(self, arg): self.encodedmimetype = arg def setmimetype(self, arg): self.mimetype = arg def getsize(self, default = None): if self.size == None: return default return self.size def setsize(self, arg): self.size = arg def getencoding(self, default = None): if self.encoding == None: return default return self.encoding def setencoding(self, arg): self.encoding = arg def getlanguage(self, default = None): if self.language == None: return default return self.language def setlanguage(self, arg): self.language = arg def getctime(self, default = None): if self.ctime == None: return default return self.ctime def setctime(self, arg): self.ctime = arg def getmtime(self, default = None): if self.mtime == None: return default return self.mtime def setmtime(self, arg): self.mtime = arg def getpopulated(self, default = None): if self.populated != None: return self.populated return default def setpopulated(self, arg): self.populated = arg def geturl(self, defaulthost = 'MISSINGHOST', defaultport = 70): """If this selector is a URL: one, then we just return the rest of it. Otherwise, generate a gopher:// URL and quote it.""" if re.search("^(/|)URL:.+://", self.selector): if self.selector[0] == '/': return self.selector[5:] else: return self.selector[4:] retval = 'gopher://%s:%d/' % (self.gethost(defaulthost), self.getport(defaultport)) retval += urllib.quote('%s%s' % (self.gettype(), self.getselector())) return retval def getnum(self, default = None): if self.num != None: return self.num return default def setnum(self, arg): self.num = arg def getgopherpsupport(self, default = None): if self.gopherpsupport != None: return self.gopherpsupport return default def setgopherpsupport(self, arg): self.gopherpsupport = arg def getea(self, name, default = None): if self.ea.has_key(name): return self.ea[name] return default def geteadict(self): return self.ea def setea(self, name, value): self.ea[name] = value def getinfoentry(text, config): entry = GopherEntry('fake', config) entry.name = text entry.host = '(NULL)' entry.port = 0 entry.type = 'i' return entry ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/protocols/�������������������������������������������������0000775�0000000�0000000�00000000000�10762620505�017067� 5����������������������������������������������������������������������������������������������������ustar ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/protocols/gopherp.py���������������������������������������0000664�0000000�0000000�00000014347�10762620505�021116� 0����������������������������������������������������������������������������������������������������ustar ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# pygopherd -- Gopher-based protocol server in Python # module: server entry point # Copyright (C) 2002 John Goerzen # <jgoerzen@complete.org> # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import SocketServer import re import os, stat, os.path, mimetypes, time from pygopherd import handlers, protocols, GopherExceptions from pygopherd.protocols.rfc1436 import GopherProtocol class GopherPlusProtocol(GopherProtocol): """Implementation of Gopher+ protocol. Will handle Gopher+ queries ONLY.""" def canhandlerequest(self): """We can handle the request IF: * It has more than one parameter in the request list * The second parameter is ! or starts with + or $""" if len(self.requestlist) < 2: return 0 if len(self.requestlist) == 2: self.gopherpstring = self.requestlist[1] elif len(self.requestlist) == 3: self.gopherpstring = self.requestlist[2] self.searchrequest = self.requestlist[1] else: return 0 # Too many params. return self.gopherpstring[0] == '+' or \ self.gopherpstring == '!' or \ self.gopherpstring[0] == '$' def handle(self): """Handle Gopher+ request.""" self.handlemethod = None if self.gopherpstring[0] == '+': self.handlemethod = 'documentonly' elif self.gopherpstring == '!': self.handlemethod = 'infoonly' elif self.gopherpstring[0] == '$': self.handlemethod = 'gopherplusdir' try: handler = self.gethandler() self.log(handler) self.entry = handler.getentry() if self.handlemethod == 'infoonly': self.wfile.write("+-2\r\n") self.wfile.write(self.renderobjinfo(self.entry)) else: handler.prepare() self.wfile.write("+" + str(self.entry.getsize(-2)) + "\r\n") if handler.isdir(): self.writedir(self.entry, handler.getdirlist()) else: handler.write(self.wfile) except GopherExceptions.FileNotFound, e: self.filenotfound(str(e)) except IOError, e: GopherExceptions.log(e, self, None) self.filenotfound(e[1]) def getsupportedblocknames(self, entry): # Return the always-supported values PLUS any extra ones for # this particular entry. return ['+INFO', '+ADMIN', '+VIEWS'] + \ ['+' + x for x in entry.geteadict().keys()] def getallblocks(self, entry): retstr = '' for block in self.getsupportedblocknames(entry): retstr += self.getblock(block, entry) return retstr def getblock(self, block, entry): # If the entry has the block in its eadict, return that. # Otherwise, do our own thing. # Incoming block: +VIEWS blockname = block[1:].lower() if entry.geteadict().has_key(blockname.upper()): return "+" + blockname.upper() + ":\r\n" + \ ''.join( [" " + x + "\r\n" for x in \ entry.getea(blockname.upper()).splitlines()] ) # Not in there -- look up a custom function. # Name: views funcname = "get" + blockname + "block" # Funcname: getviewsblock func = getattr(self, funcname) return func(entry) def getinfoblock(self, entry): return "+INFO: " + \ GopherProtocol.renderobjinfo(self, entry) def getadminblock(self, entry): retstr = "+ADMIN:\r\n" retstr += " Admin: " retstr += self.config.get("protocols.gopherp.GopherPlusProtocol", "admin") retstr += "\r\n" if entry.getmtime(): retstr += " Mod-Date: " retstr += time.ctime(entry.getmtime()) m = time.localtime(entry.getmtime()) retstr += " <%04d%02d%02d%02d%02d%02d>\r\n" % \ (m[0], m[1], m[2], m[3], m[4], m[5]) return retstr def getviewsblock(self, entry): retstr = '' if entry.getmimetype(): retstr += "+VIEWS:\r\n " + entry.getmimetype() if (entry.getlanguage()): retstr += " " + entry.getlanguage() retstr += ":" if (entry.getsize() != None): retstr += " <%dk>" % (entry.getsize() / 1024) retstr += "\r\n" return retstr def renderobjinfo(self, entry): if entry.getmimetype('FAKE') == 'application/gopher-menu' and \ entry.getgopherpsupport(): entry.mimetype = 'application/gopher+-menu' if self.handlemethod == 'documentonly': # It's a Gopher+ request for a gopher0 menu entry. retstr = GopherProtocol.renderobjinfo(self, entry) return retstr else: return self.getallblocks(entry) def filenotfound(self, msg): self.wfile.write("--2\r\n") self.wfile.write("1 ") self.wfile.write(self.config.get("protocols.gopherp.GopherPlusProtocol", "admin")) self.wfile.write("\r\n" + msg + "\r\n") def groksabstract(self): return 1 class URLGopherPlus(GopherPlusProtocol): def getsupportedblocknames(self): return GopherPlusProtocol.getsupportedblocknames(self) + \ ['+URL'] def geturlblock(self, entry): return "+URL: %s\r\n" % entry.geturl(self.server.server_name, self.server.server_port) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/protocols/rfc1436.py���������������������������������������0000664�0000000�0000000�00000003516�10762620505�020536� 0����������������������������������������������������������������������������������������������������ustar ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# pygopherd -- Gopher-based protocol server in Python # module: implementation of standard gopher (RFC 1436) protocol # Copyright (C) 2002 John Goerzen # <jgoerzen@complete.org> # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import SocketServer import re import os, stat, os.path, mimetypes from pygopherd import handlers, protocols from pygopherd.protocols.base import BaseGopherProtocol class GopherProtocol(BaseGopherProtocol): """Implementation of basic protocol. Will handle every query.""" def canhandlerequest(self): if len(self.requestlist) > 1: self.searchrequest = self.requestlist[1] return 1 def renderobjinfo(self, entry): #print entry.gettype(), entry.getname(), entry.getselector(), \ # entry.gethost(), entry.getport(), entry.getgopherpsupport() retval = entry.gettype('0') + \ entry.getname() + "\t" + \ entry.getselector() + "\t" + \ entry.gethost(default = self.server.server_name) + "\t" + \ str(entry.getport(default = self.server.server_port)) if entry.getgopherpsupport(): return retval + "\t+\r\n" else: return retval + "\r\n" ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/protocols/http.py������������������������������������������0000664�0000000�0000000�00000030611�10762620505�020421� 0����������������������������������������������������������������������������������������������������ustar ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# pygopherd -- Gopher-based protocol server in Python # module: serve up gopherspace via http # $Id: http.py,v 1.21 2002/04/26 15:18:10 jgoerzen Exp $ # Copyright (C) 2002 John Goerzen # <jgoerzen@complete.org> # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import SocketServer import re, binascii import os, stat, os.path, mimetypes, urllib, time from pygopherd import handlers, protocols, GopherExceptions from pygopherd.protocols.base import BaseGopherProtocol import pygopherd.version import cgi class HTTPProtocol(BaseGopherProtocol): def canhandlerequest(self): self.requestparts = map(lambda arg: arg.strip(), self.request.split(" ")) return len(self.requestparts) == 3 and \ (self.requestparts[0] == 'GET' or self.requestparts[0] == 'HEAD') and \ self.requestparts[2][0:5] == 'HTTP/' def headerslurp(self): if hasattr(self.requesthandler, 'pygopherd_http_slurped'): # Already slurped. self.httpheaders = self.requesthandler.pygopherd_http_slurped return # Slurp up remaining lines. self.httpheaders = {} while 1: line = self.rfile.readline() if not len(line): break line = line.strip() if not len(line): break splitline = line.split(':', 1) if len(splitline) == 2: self.httpheaders[splitline[0].lower()] = splitline[1] self.requesthandler.pygopherd_http_slurped = self.httpheaders def handle(self): self.canhandlerequest() # To get self.requestparts self.iconmapping = eval(self.config.get("protocols.http.HTTPProtocol", "iconmapping")) self.headerslurp() splitted = self.requestparts[1].split('?') self.selector = splitted[0] self.selector = urllib.unquote(self.selector) self.selector = self.slashnormalize(self.selector) self.formvals = {} if len(splitted) >= 2: self.formvals = cgi.parse_qs(splitted[1]) if self.formvals.has_key('searchrequest'): self.searchrequest = self.formvals['searchrequest'][0] icon = re.match('/PYGOPHERD-HTTPPROTO-ICONS/(.+)$', self.selector) if icon: iconname = icon.group(1) if icons.has_key(iconname): self.wfile.write("HTTP/1.0 200 OK\r\n") self.wfile.write("Last-Modified: Fri, 14 Dec 2001 21:19:47 GMT\r\n") self.wfile.write("Content-Type: image/gif\r\n\r\n") if self.requestparts[0] == 'HEAD': return self.wfile.write(binascii.unhexlify(icons[iconname])) return try: handler = self.gethandler() self.log(handler) self.entry = handler.getentry() handler.prepare() self.wfile.write("HTTP/1.0 200 OK\r\n") if self.entry.getmtime() != None: gmtime = time.gmtime(self.entry.getmtime()) mtime = time.strftime("%a, %d %b %Y %H:%M:%S GMT", gmtime) self.wfile.write("Last-Modified: " + mtime + "\r\n") mimetype = self.entry.getmimetype() mimetype = self.adjustmimetype(mimetype) self.wfile.write("Content-Type: " + mimetype + "\r\n\r\n") if self.requestparts[0] == 'GET': if handler.isdir(): self.writedir(self.entry, handler.getdirlist()) else: self.handlerwrite(self.wfile) except GopherExceptions.FileNotFound, e: self.filenotfound(str(e)) except IOError, e: GopherExceptions.log(e, self, None) self.filenotfound(e[1]) def handlerwrite(self, wfile): self.handler.write(wfile) def adjustmimetype(self, mimetype): if mimetype == None: return 'text/plain' if mimetype == 'application/gopher-menu': return 'text/html' return mimetype def renderobjinfo(self, entry): url = None # Decision time.... if re.match('(/|)URL:', entry.getselector()): # It's a plain URL. Make it that. url = re.match('(/|)URL:(.+)$', entry.getselector()).group(2) elif (not entry.gethost()) and (not entry.getport()): # It's a link to our own server. Make it as such. (relative) url = urllib.quote(entry.getselector()) else: # Link to a different server. Make it a gopher URL. url = entry.geturl(self.server.server_name, 70) # OK. Render. return self.getrenderstr(entry, url) def getrenderstr(self, entry, url): retstr = '<TR><TD>' retstr += self.getimgtag(entry) retstr += "</TD>\n<TD> " if entry.gettype() != 'i' and entry.gettype() != '7': retstr += '<A HREF="%s">' % url retstr += "<TT>" if entry.getname() != None: retstr += cgi.escape(entry.getname()) else: retstr += cgi.escape(entry.getselector()) retstr += "</TT>" if entry.gettype() != 'i' and entry.gettype() != '7': retstr += '</A>' if (entry.gettype() == '7'): retstr += '<BR><FORM METHOD="GET" ACTION="%s">' % url retstr += '<INPUT TYPE="text" NAME="searchrequest" SIZE="30">' retstr += '<INPUT TYPE="submit" NAME="Submit" VALUE="Submit">' retstr += '</FORM>' retstr += '</TD><TD><FONT SIZE="-2">' if entry.getmimetype(): subtype = re.search('/.+$', entry.getmimetype()) if subtype: retstr += cgi.escape(subtype.group()[1:]) retstr += '</FONT></TD></TR>\n' return retstr def renderdirstart(self, entry): retstr ='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">' retstr += "\n<HTML><HEAD><TITLE>Gopher" if self.entry.getname(): retstr += ": " + cgi.escape(self.entry.getname()) retstr += "" if self.config.has_option("protocols.http.HTTPProtocol", "pagetopper"): retstr += re.sub('GOPHERURL', self.entry.geturl(self.server.server_name, self.server.server_port), self.config.get("protocols.http.HTTPProtocol", "pagetopper")) retstr += "

Gopher" if self.entry.getname(): retstr += ": " + cgi.escape(self.entry.getname()) retstr += '

' return retstr def renderdirend(self, entry): retstr = "

\n[server top]" retstr += " [view with gopher]" % \ entry.geturl(self.server.server_name, self.server.server_port) retstr += '
Generated by %s' % ( pygopherd.version.homepage, pygopherd.version.productname) return retstr + "\n\n" def filenotfound(self, msg): self.wfile.write("HTTP/1.0 404 Not Found\r\n") self.wfile.write("Content-Type: text/html\r\n\r\n") self.wfile.write('') self.wfile.write("""\nSelector Not Found

Selector Not Found

""") self.wfile.write(cgi.escape(msg)) self.wfile.write("
Pygopherd\n") def getimgtag(self, entry): name = 'generic.gif' if self.iconmapping.has_key(entry.gettype()): name = self.iconmapping[entry.gettype()] return ' * ' % \ ('/PYGOPHERD-HTTPPROTO-ICONS/' + name) icons = { 'binary.gif': '47494638396114001600c20000ffffffccffffcccccc99999933333300000000000000000021fe4e546869732061727420697320696e20746865207075626c696320646f6d61696e2e204b6576696e204875676865732c206b6576696e68406569742e636f6d2c2053657074656d62657220313939350021f90401000001002c000000001400160000036948babcf1301040ab9d24be590a105d210013a9715e07a8a509a16beab5ae14df6a41e8fc76839d5168e8b3182983e4a0e0038a6e1525d396931d97be2ad482a55a55c6eec429f484a7b4e339eb215fd138ebda1b7fb3eb73983bafee8b094a8182493b114387885309003b', 'binhex.gif': '47494638396114001600c20000ffffffccffff99999966666633333300000000000000000021fe4e546869732061727420697320696e20746865207075626c696320646f6d61696e2e204b6576696e204875676865732c206b6576696e68406569742e636f6d2c2053657074656d62657220313939350021f90401000001002c000000001400160000036948babcf1301040ab9d24be59baefc0146adce78555068914985e2b609e0551df9b3c17ba995b408a602828e48a2681856894f44cc1628e07a42e9b985d14ab1b7c9440a9131c0c733b229bb5222ecdb6bfd6da3cd5d29d688a1aee2c97db044482834336113b884d09003b', 'folder.gif': '47494638396114001600c20000ffffffffcc99ccffff99663333333300000000000000000021fe4e546869732061727420697320696e20746865207075626c696320646f6d61696e2e204b6576696e204875676865732c206b6576696e68406569742e636f6d2c2053657074656d62657220313939350021f90401000002002c000000001400160000035428badcfe30ca4959b9f8ce12baef45c47d64a629c5407a6a8906432cc72b1c8ef51a13579e0f3c9c8f05ec0d4945e171673cb2824e2234da495261569856c5ddc27882d46c3c2680c3e6b47acd232c4cf08c3b01003b', 'image3.gif': '47494638396114001600e30000ffffffff3333ccffff9999996600003333330099cc00993300336600000000000000000000000000000000000000000021fe4e546869732061727420697320696e20746865207075626c696320646f6d61696e2e204b6576696e204875676865732c206b6576696e68406569742e636f6d2c2053657074656d62657220313939350021f90401000002002c0000000014001600000479b0c849a7b85814c0bbdf45766d5e49861959762a3a76442c132ae0aa44a0ef49d1ff2f4e6ea74b188f892020c70c3007d04152b3aa46a7adcaa42355160ee0f041d5a572bee23017cb1abbbf6476d52a0720ee78fc5a8930f8ff06087b66768080832a7d8a81818873744a8f8805519596503e19489b9c5311003b', 'sound1.gif': '47494638396114001600c20000ffffffff3333ccffffcccccc99999966000033333300000021fe4e546869732061727420697320696e20746865207075626c696320646f6d61696e2e204b6576696e204875676865732c206b6576696e68406569742e636f6d2c2053657074656d62657220313939350021f90401000002002c000000001400160000036b28badcfe3036c34290ea1c61558f07b171170985c0687e0d9a729e77693401dc5bd7154148fcb6db6b77e1b984c20d4fb03406913866717a842aa7d22af22acd120cdf6fd2d49cd10e034354871518de06b43a17334de42a36243e187d4a7b1a762c7b140b8418898a0b09003b', 'text.gif': '47494638396114001600c20000ffffffccffff99999933333300000000000000000000000021fe4e546869732061727420697320696e20746865207075626c696320646f6d61696e2e204b6576696e204875676865732c206b6576696e68406569742e636f6d2c2053657074656d62657220313939350021f90401000001002c000000001400160000035838babcf1300c40ab9d23be693bcf11d75522b88dd7057144eb52c410cf270abb6e8db796e00b849aadf20b4a6ebb1705281c128daca412c03c3a7b50a4f4d9bc5645dae9f78aed6e975932baebfc0e7ef0b84f1691da8d09003b', 'generic.gif': '47494638396114001600c20000ffffffccffff99999933333300000000000000000000000021fe4e546869732061727420697320696e20746865207075626c696320646f6d61696e2e204b6576696e204875676865732c206b6576696e68406569742e636f6d2c2053657074656d62657220313939350021f90401000001002c000000001400160000035038babcf1300c40ab9d23be693bcf11d75522b88dd705892831b8f08952446d13f24c09bc804b3a4befc70a027c39e391a8ac2081cd65d2f82c06ab5129b4898d76b94c2f71d02b9b79afc86dcdfe2500003b', 'blank.gif': '47494638396114001600a10000ffffffccffff00000000000021fe4e546869732061727420697320696e20746865207075626c696320646f6d61696e2e204b6576696e204875676865732c206b6576696e68406569742e636f6d2c2053657074656d62657220313939350021f90401000001002c00000000140016000002138c8fa9cbed0fa39cb4da8bb3debcfb0f864901003b'} pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/protocols/baseTest.py0000664000000000000000000001123310762620505021213 0ustar import unittest import pygopherd.handlers.file from pygopherd import testutil from StringIO import StringIO from pygopherd.protocols.base import BaseGopherProtocol class BaseProtocolTestCase(unittest.TestCase): def setUp(self): self.config = testutil.getconfig() self.rfile = StringIO("/testfile.txt\n") self.wfile = StringIO() self.logfile = testutil.getstringlogger() self.logstr = "10.77.77.77 [BaseGopherProtocol/FileHandler]: /testfile.txt\n" self.handler = testutil.gettestinghandler(self.rfile, self.wfile, self.config) self.server = self.handler.server self.proto = BaseGopherProtocol("/testfile.txt\n", self.server, self.handler, self.rfile, self.wfile, self.config) def testInitBasic(self): proto = BaseGopherProtocol("/foo.txt\n", self.server, self.handler, self.rfile, self.wfile, self.config) assert proto.rfile == self.rfile assert proto.wfile == self.wfile assert proto.config == self.config assert proto.requesthandler == self.handler assert proto.requestlist == ['/foo.txt'] assert proto.searchrequest == None assert proto.handler == None assert proto.selector == '/foo.txt' def testInitEmpty(self): proto = BaseGopherProtocol("\n", self.server, self.handler, self.rfile, self.wfile, self.config) # It should be rewritten to / assert proto.selector == '/' assert proto.requestlist == [''] def testInitMissingLeadingSlash(self): proto = BaseGopherProtocol("foo.txt\n", self.server, self.handler, self.rfile, self.wfile, self.config) assert proto.selector == '/foo.txt' assert proto.requestlist == ['foo.txt'] def testInitAddedTrailingSlash(self): proto = BaseGopherProtocol("/dir/\n", self.server, self.handler, self.rfile, self.wfile, self.config) assert proto.selector == '/dir' assert proto.requestlist == ['/dir/'] def testInitBothSlashProblems(self): proto = BaseGopherProtocol("dir/\n", self.server, self.handler, self.rfile, self.wfile, self.config) assert proto.selector == '/dir' assert proto.requestlist == ['dir/'] def testInitSplit(self): proto = BaseGopherProtocol("foo.txt\t+\n", self.server, self.handler, self.rfile, self.wfile, self.config) assert proto.selector == '/foo.txt' assert proto.requestlist == ['foo.txt', '+'] def testcanhandlerequest(self): assert not self.proto.canhandlerequest() def testlog(self): # This is a file handler, not a request handler! handler = self.proto.gethandler() self.proto.log(handler) self.assertEquals(self.logfile.getvalue(), self.logstr) def testhandle_file(self): self.proto.handle() self.assertEquals(self.logfile.getvalue(), self.logstr) self.assertEquals(self.wfile.getvalue(), "Test\n") def testhandle_notfound(self): proto = BaseGopherProtocol("/NONEXISTANT.txt\n", self.server, self.handler, self.rfile, self.wfile, self.config) proto.handle() self.assertEquals(self.logfile.getvalue(), "10.77.77.77 [BaseGopherProtocol/None] EXCEPTION FileNotFound: '/NONEXISTANT.txt' does not exist (no handler found)\n") self.assertEquals(self.wfile.getvalue(), "3'/NONEXISTANT.txt' does not exist (no handler found)\t\terror.host\t1\r\n") # We cannot test handle_dir here because we don't have enough info. def testfilenotfound(self): self.proto.filenotfound("FOO") self.assertEquals(self.wfile.getvalue(), "3FOO\t\terror.host\t1\r\n") def testgethandler(self): handler = self.proto.gethandler() assert isinstance(handler, pygopherd.handlers.file.FileHandler) # Make sure caching works. assert handler == self.proto.gethandler() ## CANNOT TEST: writedir, renderabstract def testrenderdirstart(self): assert self.proto.renderdirstart('foo') == None def testrenderdirend(self): assert self.proto.renderdirend('foo') == None def testrenderobjinfo(self): assert self.proto.renderobjinfo('foo') == None def testgroksabstract(self): assert not self.proto.groksabstract() pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/protocols/enhanced.py0000664000000000000000000000300210762620505021201 0ustar # pygopherd -- Gopher-based protocol server in Python # module: experimental enhanced gopher protocol # Copyright (C) 2002 John Goerzen # # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import SocketServer import re import os, stat, os.path, mimetypes from pygopherd import handlers, protocols from pygopherd.protocols import rfc1436 class EnhancedGopherProtocol(rfc1436.GopherProtocol): def renderobjinfo(self, entry): return entry.gettype() + \ entry.getname() + "\t" + \ entry.getselector() + "\t" + \ entry.gethost(default = self.server.server_name) + "\t" + \ str(entry.getport(default = self.server.server_port)) + "\t" + \ str(entry.getsize()) + "\t" + \ entry.getmimetype() + "\t" + \ entry.getencoding() + "\t" + \ entry.getlanguage() pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/protocols/base.py0000664000000000000000000001354210762620505020360 0ustar # pygopherd -- Gopher-based protocol server in Python # module: base protocol implementation # Copyright (C) 2002 John Goerzen # # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import SocketServer import re import os, stat, os.path, mimetypes from pygopherd import handlers, GopherExceptions, logger, gopherentry from pygopherd.handlers import HandlerMultiplexer class BaseGopherProtocol: """Skeleton protocol -- includes commonly-used routines.""" def __init__(self, request, server, requesthandler, rfile, wfile, config): """Parameters are: request -- the raw request string. server -- a SocketServer object. rfile -- input file. The first line will already have been read. wfile -- output file. Where the output should be sent. config -- a ConfigParser object.""" self.request = request requestparts = map(lambda arg: arg.strip(), request.split("\t")) self.rfile = rfile self.wfile = wfile self.config = config self.server = server self.requesthandler = requesthandler self.requestlist = requestparts self.searchrequest = None self.handler = None selector = requestparts[0] selector = self.slashnormalize(selector) self.selector = selector def slashnormalize(self, selector): """Normalize slashes in the selector. Make sure it starts with a slash and does not end with one. If it is a root directory request, make sure it is exactly '/'. Returns result.""" if len(selector) and selector[-1] == '/': selector = selector[0:-1] if len(selector) == 0 or selector[0] != '/': selector = '/' + selector return selector def canhandlerequest(self): """Decides whether or not a given request is valid for this protocol. Should be overridden by all subclasses.""" return 0 def log(self, handler): """Log a handled request.""" logger.log("%s [%s/%s]: %s" % \ (self.requesthandler.client_address[0], re.search("[^.]+$", str(self.__class__)).group(0), re.search("[^.]+$", str(handler.__class__)).group(0), self.selector)) def handle(self): """Handles the request.""" try: handler = self.gethandler() self.log(handler) self.entry = handler.getentry() handler.prepare() if handler.isdir(): self.writedir(self.entry, handler.getdirlist()) else: handler.write(self.wfile) except GopherExceptions.FileNotFound, e: self.filenotfound(str(e)) except IOError, e: GopherExceptions.log(e, self, None) self.filenotfound(e[1]) def filenotfound(self, msg): self.wfile.write("3%s\t\terror.host\t1\r\n" % msg) def gethandler(self): """Gets the handler for this object's selector.""" if not self.handler: self.handler = HandlerMultiplexer.getHandler(self.selector, self.searchrequest, self, self.config) return self.handler def writedir(self, entry, dirlist): """Called to render a directory. Generally called by self.handle()""" startstr = self.renderdirstart(entry) if startstr != None: self.wfile.write(startstr) abstractopt = self.config.get("pygopherd", "abstract_entries") doabstracts = abstractopt == 'always' or \ (abstractopt == 'unsupported' and not self.groksabstract()) if self.config.getboolean("pygopherd", "abstract_headers"): self.wfile.write(self.renderabstract(entry.getea('ABSTRACT', ''))) for direntry in dirlist: self.wfile.write(self.renderobjinfo(direntry)) if doabstracts: abstract = self.renderabstract(direntry.getea('ABSTRACT')) if abstract: self.wfile.write(abstract) endstr = self.renderdirend(entry) if endstr != None: self.wfile.write(endstr) def renderabstract(self, abstractstring): if not abstractstring: return '' retval = '' for line in abstractstring.splitlines(): absentry = gopherentry.getinfoentry(line, self.config) retval += self.renderobjinfo(absentry) return retval def renderdirstart(self, entry): """Renders the start of a directory. Most protocols will not need this. Exception might be HTML. Returns None if not needed. Argument should be the entry corresponding to the dir itself.""" return None def renderdirend(self, entry): """Likewise for the end of a directory.""" return None def renderobjinfo(self, entry): """Renders an object's info according to the protocol. Returns a string. A gopher0 server, for instance, would return a dir line. MUST BE OVERRIDDEN.""" return None def groksabstract(self): """Returns true if this protocol understands abstracts natively; false otherwise.""" return 0 pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/protocols/__init__.py0000664000000000000000000000160610762620505021203 0ustar # pygopherd -- Gopher-based protocol server in Python # module: protocol directory index # Copyright (C) 2002 John Goerzen # # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA __all__ = ['base', 'enhanced', 'gopherp', 'rfc1436', 'http', 'wap'] pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/protocols/ProtocolMultiplexerTest.py0000664000000000000000000000273310762620505024342 0ustar import unittest from StringIO import StringIO from pygopherd.protocols import ProtocolMultiplexer from pygopherd import testutil import pygopherd.protocols class ProtocolMultiplexerTestCase(unittest.TestCase): def setUp(self): self.config = testutil.getconfig() # Just a bunch of test cases for each different protocol -- make # sure we find the right one. def getproto(self, request): rfile = StringIO(request) wfile = StringIO() handler = testutil.gettestinghandler(rfile, wfile, self.config) return ProtocolMultiplexer.getProtocol(file.readline(), handler.server, handler, handler.rfile, handler.wfile, self.config) def testGoToGopher(self): assert isinstance(testutil.gettestingprotocol("/gopher0-request.txt\n"), pygopherd.protocols.rfc1436.GopherProtocol) def testGoToHTTP(self): assert isinstance(testutil.gettestingprotocol("GET /http-request.txt HTTP/1.0\n\n"), pygopherd.protocols.http.HTTPProtocol) def testGoToGopherPlus(self): assert isinstance(testutil.gettestingprotocol("/gopher+-request.txt\t+\n"), pygopherd.protocols.gopherp.GopherPlusProtocol) pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/protocols/wap.py0000664000000000000000000001317110762620505020233 0ustar # pygopherd -- Gopher-based protocol server in Python # module: serve up gopherspace via wap # $Id: http.py,v 1.21 2002/04/26 15:18:10 jgoerzen Exp $ # Copyright (C) 2003 John Goerzen # # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA from http import HTTPProtocol from StringIO import StringIO import cgi, re accesskeys = '1234567890#*' wmlheader = """ """ class WAPProtocol(HTTPProtocol): # canhandlerequest inherited def canhandlerequest(self): ishttp = HTTPProtocol.canhandlerequest(self) if not ishttp: return 0 waptop = self.config.get("protocols.wap.WAPProtocol", "waptop") self.waptop = waptop if self.requestparts[1].startswith(waptop): # If it starts with waptop, *guaranteed* to be wap. self.requestparts[1] = self.requestparts[1][len(waptop):] return 1 self.headerslurp() # See if we can auto-detect a WAP browser. if not self.httpheaders.has_key('accept'): return 0 if not re.search('[, ]text/vnd.wap.wml', self.httpheaders['accept']): return 0 # By now, we know that it lists WML in accept. Let's try a few # more things. for tryitem in ['x-wap-profile', 'x-up-devcap-max-pdu']: if self.httpheaders.has_key(tryitem): return 1 return 0 def adjustmimetype(self, mimetype): self.needsconversion = 0 if mimetype == None or mimetype == 'text/plain': self.needsconversion = 1 return 'text/vnd.wap.wml' if mimetype == 'application/gopher-menu': return 'text/vnd.wap.wml' return mimetype def getrenderstr(self, entry, url): global accesskeys if url.startswith('/'): url = self.waptop + url retstr = '' if not entry.gettype() in ['i', '7']: if self.accesskeyidx < len(accesskeys): retstr += '%s ' % \ (accesskeys[self.accesskeyidx], accesskeys[self.accesskeyidx], url) self.accesskeyidx += 1 else: retstr += '' % url if entry.getname() != None: thisname = cgi.escape(entry.getname()) else: thisname = cgi.escape(entry.getselector()) retstr += thisname if not entry.gettype() in ['i', '7']: retstr += '' if entry.gettype() == '7': retstr += '
\n' retstr += ' \n' % \ self.postfieldidx retstr += 'Go\n' #retstr += '\n' retstr += ' \n' % url#.replace('%', '%25') retstr += ' \n' % \ self.postfieldidx #retstr += ' \n' retstr += ' \n' #retstr += '\n' retstr += '\n' retstr += "
\n" self.postfieldidx += 1 return retstr def renderdirstart(self, entry): global wmlheader self.accesskeyidx = 0 self.postfieldidx = 0 retval = wmlheader title = 'Gopher' if self.entry.getname(): title = cgi.escape(self.entry.getname()) retval += '' % \ cgi.escape(title) retval += "\n

\n" retval += "%s
\n" % cgi.escape(title) return retval def renderdirend(self, entry): return "

\n
\n
\n" def handlerwrite(self, wfile): global wmlheader if not self.needsconversion: self.handler.write(wfile) return fakefile = StringIO() self.handler.write(fakefile) fakefile.seek(0) wfile.write(wmlheader) wfile.write('\n') wfile.write('

\n') while 1: line = fakefile.readline() if not len(line): break line = line.rstrip() if len(line): wfile.write(cgi.escape(line) + "\n") else: wfile.write("

\n

") wfile.write('

\n
\n\n') def filenotfound(self, msg): wfile = self.wfile wfile.write("HTTP/1.0 200 Not Found\r\n") wfile.write("Content-Type: text/vnd.wap.wml\r\n\r\n") wfile.write(wmlheader) wfile.write('\n') wfile.write('

Gopher Error

\n') wfile.write(cgi.escape(msg)+ "\n") wfile.write('

\n
\n\n') pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/protocols/rfc1436Test.py0000664000000000000000000001304310762620505021372 0ustar import unittest, re from pygopherd.protocols.rfc1436 import GopherProtocol from pygopherd import testutil from StringIO import StringIO class RFC1436TestCase(unittest.TestCase): def setUp(self): self.config = testutil.getconfig() self.rfile = StringIO("/testfile.txt\n") self.wfile = StringIO() self.logfile = testutil.getstringlogger() self.handler = testutil.gettestinghandler(self.rfile, self.wfile, self.config) self.server = self.handler.server self.proto = GopherProtocol("/testfile.txt\n", self.server, self.handler, self.rfile, self.wfile, self.config) def testcanhandlerequest(self): assert self.proto.canhandlerequest() proto = GopherProtocol("/testfile.txt\tsearch\n", self.server, self.handler, self.rfile, self.wfile, self.config) assert proto.canhandlerequest() self.assertEquals(proto.selector, '/testfile.txt') self.assertEquals(proto.searchrequest, "search") def testrenderobjinfo(self): expected = "0testfile.txt\t/testfile.txt\t%s\t%d\t+\r\n" % \ (self.server.server_name, self.server.server_port) self.assertEquals(self.proto.renderobjinfo(self.proto.gethandler().getentry()), expected) def testhandle_file(self): self.proto.handle() self.assertEquals(self.logfile.getvalue(), "10.77.77.77 [GopherProtocol/FileHandler]: /testfile.txt\n") self.assertEquals(self.wfile.getvalue(), "Test\n") def testhandle_file_zipped(self): self.config.set("handlers.ZIP.ZIPHandler", "enabled", 'true') from pygopherd.handlers import HandlerMultiplexer HandlerMultiplexer.handlers = None handlerlist = self.config.get("handlers.HandlerMultiplexer", "handlers") handlerlist = handlerlist.strip() handlerlist = handlerlist[0] + 'ZIP.ZIPHandler, ' + handlerlist[1:] self.config.set("handlers.HandlerMultiplexer", "handlers", handlerlist) self.proto = GopherProtocol("/testdata.zip/pygopherd/ziponly\n", self.server, self.handler, self.rfile, self.wfile, self.config) self.proto.handle() self.assertEquals(self.wfile.getvalue(), "ZIPonly\n") self.config.set("handlers.ZIP.ZIPHandler", "enabled", "false") def testhandle_dir_abstracts(self): proto = GopherProtocol("", self.server, self.handler, self.rfile, self.wfile, self.config) proto.handle() self.assertEquals(proto.selector, '/') self.assertEquals(self.logfile.getvalue(), "10.77.77.77 [GopherProtocol/UMNDirHandler]: /\n") # Try to make this easy on us to fix. actualarr = self.wfile.getvalue().splitlines() expectedarr = [ 'iThis is the abstract for the testdata directory.\tfake\t(NULL)\t0', '0README\t/README\tHOSTNAME\t64777\t+', '1pygopherd\t/pygopherd\tHOSTNAME\t64777\t+', '9symlinktest\t/symlinktest.zip\tHOSTNAME\t64777\t+', '9testarchive\t/testarchive.tar\tHOSTNAME\t64777\t+', '9testarchive.tar.gz\t/testarchive.tar.gz\tHOSTNAME\t64777\t+', '9testarchive.tgz\t/testarchive.tgz\tHOSTNAME\t64777\t+', '9testdata\t/testdata.zip\tHOSTNAME\t64777\t+', '9testdata2\t/testdata2.zip\tHOSTNAME\t64777\t+', '0testfile\t/testfile.txt\tHOSTNAME\t64777\t+', '9testfile.txt.gz\t/testfile.txt.gz\tHOSTNAME\t64777\t+', 'iThis is the abstract\tfake\t(NULL)\t0', 'ifor testfile.txt.gz\tfake\t(NULL)\t0', '9ziptorture\t/ziptorture.zip\tHOSTNAME\t64777\t+'] expectedarr = [re.sub('HOSTNAME', self.server.server_name, x) for \ x in expectedarr] self.assertEquals(len(actualarr), len(expectedarr), str(actualarr)) for i in range(len(actualarr)): self.assertEquals(actualarr[i], expectedarr[i]) # Make sure proper line endings are present. self.assertEquals("\r\n".join(actualarr) + "\r\n", self.wfile.getvalue()) def testhandle_dir_noabstract(self): self.config.set("pygopherd", "abstract_headers", "off") self.config.set("pygopherd", "abstract_entries", "off") proto = GopherProtocol("", self.server, self.handler, self.rfile, self.wfile, self.config) proto.handle() actualarr = self.wfile.getvalue().splitlines() expectedarr = \ ['0README\t/README\tHOSTNAME\t64777\t+', '1pygopherd\t/pygopherd\tHOSTNAME\t64777\t+', '9symlinktest\t/symlinktest.zip\tHOSTNAME\t64777\t+', '9testarchive\t/testarchive.tar\tHOSTNAME\t64777\t+', '9testarchive.tar.gz\t/testarchive.tar.gz\tHOSTNAME\t64777\t+', '9testarchive.tgz\t/testarchive.tgz\tHOSTNAME\t64777\t+', '9testdata\t/testdata.zip\tHOSTNAME\t64777\t+', '9testdata2\t/testdata2.zip\tHOSTNAME\t64777\t+', '0testfile\t/testfile.txt\tHOSTNAME\t64777\t+', '9testfile.txt.gz\t/testfile.txt.gz\tHOSTNAME\t64777\t+', '9ziptorture\t/ziptorture.zip\tHOSTNAME\t64777\t+'] expectedarr = [re.sub('HOSTNAME', self.server.server_name, x) for \ x in expectedarr] self.assertEquals(len(actualarr), len(expectedarr)) for i in range(len(actualarr)): self.assertEquals(actualarr[i], expectedarr[i]) pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/protocols/ProtocolMultiplexer.py0000664000000000000000000000242210762620505023475 0ustar # pygopherd -- Gopher-based protocol server in Python # module: find the right protocol to handle a request # Copyright (C) 2002 John Goerzen # # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA from pygopherd import handlers, protocols from pygopherd.protocols import * from pygopherd.GopherExceptions import FileNotFound import re def getProtocol(request, server, requesthandler, rfile, wfile, config): p = eval(config.get("protocols.ProtocolMultiplexer", "protocols")) for protocol in p: ptry = protocol(request, server, requesthandler, rfile, wfile, config) if ptry.canhandlerequest(): return ptry pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/zipfile.py0000664000000000000000000011075510762620505017070 0ustar "Read and write ZIP files." # Written by James C. Ahlstrom jim@interet.com # All rights transferred to CNRI pursuant to the Python contribution agreement import struct, os, time, types import binascii from StringIO import StringIO from socket import _fileobject as BaseFileSimulator _STRING_TYPES = (types.StringType,) if hasattr(types, "UnicodeType"): _STRING_TYPES = _STRING_TYPES + (types.UnicodeType,) try: import zlib # We may need its compression method except ImportError: zlib = None __all__ = ["BadZipfile", "error", "ZIP_STORED", "ZIP_DEFLATED", "is_zipfile", "ZipInfo", "ZipFile", "PyZipFile"] class BadZipfile(Exception): pass error = BadZipfile # The exception raised by this module # constants for Zip file compression methods ZIP_STORED = 0 ZIP_DEFLATED = 8 # Other ZIP compression methods not supported # Here are some struct module formats for reading headers structEndArchive = "<4s4H2lH" # 9 items, end of archive, 22 bytes stringEndArchive = "PK\005\006" # magic number for end of archive record structCentralDir = "<4s4B4H3l5HLl"# 19 items, central directory, 46 bytes stringCentralDir = "PK\001\002" # magic number for central directory structFileHeader = "<4s2B4H3l2H" # 12 items, file header record, 30 bytes stringFileHeader = "PK\003\004" # magic number for file header # indexes of entries in the central directory structure _CD_SIGNATURE = 0 _CD_CREATE_VERSION = 1 _CD_CREATE_SYSTEM = 2 _CD_EXTRACT_VERSION = 3 _CD_EXTRACT_SYSTEM = 4 # is this meaningful? _CD_FLAG_BITS = 5 _CD_COMPRESS_TYPE = 6 _CD_TIME = 7 _CD_DATE = 8 _CD_CRC = 9 _CD_COMPRESSED_SIZE = 10 _CD_UNCOMPRESSED_SIZE = 11 _CD_FILENAME_LENGTH = 12 _CD_EXTRA_FIELD_LENGTH = 13 _CD_COMMENT_LENGTH = 14 _CD_DISK_NUMBER_START = 15 _CD_INTERNAL_FILE_ATTRIBUTES = 16 _CD_EXTERNAL_FILE_ATTRIBUTES = 17 _CD_LOCAL_HEADER_OFFSET = 18 # indexes of entries in the local file header structure _FH_SIGNATURE = 0 _FH_EXTRACT_VERSION = 1 _FH_EXTRACT_SYSTEM = 2 # is this meaningful? _FH_GENERAL_PURPOSE_FLAG_BITS = 3 _FH_COMPRESSION_METHOD = 4 _FH_LAST_MOD_TIME = 5 _FH_LAST_MOD_DATE = 6 _FH_CRC = 7 _FH_COMPRESSED_SIZE = 8 _FH_UNCOMPRESSED_SIZE = 9 _FH_FILENAME_LENGTH = 10 _FH_EXTRA_FIELD_LENGTH = 11 def is_zipfile(filename): """Quickly see if file is a ZIP file by checking the magic number.""" try: fpin = open(filename, "rb") endrec = _EndRecData(fpin) fpin.close() if endrec: return True # file has correct magic number except IOError: pass return False def _EndRecData(fpin): """Return data from the "End of Central Directory" record, or None. The data is a list of the nine items in the ZIP "End of central dir" record followed by a tenth item, the file seek offset of this record.""" fpin.seek(-22, 2) # Assume no archive comment. filesize = fpin.tell() + 22 # Get file size data = fpin.read() if data[0:4] == stringEndArchive and data[-2:] == "\000\000": endrec = struct.unpack(structEndArchive, data) endrec = list(endrec) endrec.append("") # Append the archive comment endrec.append(filesize - 22) # Append the record start offset return endrec # Search the last END_BLOCK bytes of the file for the record signature. # The comment is appended to the ZIP file and has a 16 bit length. # So the comment may be up to 64K long. We limit the search for the # signature to a few Kbytes at the end of the file for efficiency. # also, the signature must not appear in the comment. END_BLOCK = min(filesize, 1024 * 4) fpin.seek(filesize - END_BLOCK, 0) data = fpin.read() start = data.rfind(stringEndArchive) if start >= 0: # Correct signature string was found endrec = struct.unpack(structEndArchive, data[start:start+22]) endrec = list(endrec) comment = data[start+22:] if endrec[7] == len(comment): # Comment length checks out # Append the archive comment and start offset endrec.append(comment) endrec.append(filesize - END_BLOCK + start) return endrec return # Error, return None class ZipInfo: """Class with attributes describing each file in the ZIP archive.""" def __init__(self, filename="NoName", date_time=(1980,1,1,0,0,0)): self.filename = _normpath(filename) # Name of the file in the archive self.date_time = date_time # year, month, day, hour, min, sec # Standard values: self.compress_type = ZIP_STORED # Type of compression for the file self.comment = "" # Comment for each file self.extra = "" # ZIP extra data self.create_system = 0 # System which created ZIP archive self.create_version = 20 # Version which created ZIP archive self.extract_version = 20 # Version needed to extract archive self.reserved = 0 # Must be zero self.flag_bits = 0 # ZIP flag bits self.volume = 0 # Volume number of file header self.internal_attr = 0 # Internal attributes self.external_attr = 0 # External file attributes # Other attributes are set by class ZipFile: # header_offset Byte offset to the file header # file_offset Byte offset to the start of the file data # CRC CRC-32 of the uncompressed file # compress_size Size of the compressed file # file_size Size of the uncompressed file def FileHeader(self): """Return the per-file header as a string.""" dt = self.date_time dosdate = (dt[0] - 1980) << 9 | dt[1] << 5 | dt[2] dostime = dt[3] << 11 | dt[4] << 5 | (dt[5] // 2) if self.flag_bits & 0x08: # Set these to zero because we write them after the file data CRC = compress_size = file_size = 0 else: CRC = self.CRC compress_size = self.compress_size file_size = self.file_size header = struct.pack(structFileHeader, stringFileHeader, self.extract_version, self.reserved, self.flag_bits, self.compress_type, dostime, dosdate, CRC, compress_size, file_size, len(self.filename), len(self.extra)) return header + self.filename + self.extra # This is used to ensure paths in generated ZIP files always use # forward slashes as the directory separator, as required by the # ZIP format specification. if os.sep != "/": def _normpath(path): return path.replace(os.sep, "/") else: def _normpath(path): return path class FileSimulator(BaseFileSimulator): def close(self): pass class ZipDecompressor: def __init__(self, fd, zinfo): self.fp = fd self.zinfo = zinfo self.buffer = '' self.bytesread = 0 self.byteswritten = 0 # Used for deflation only self.crc = binascii.crc32("") self.filepos = self.fp.tell() if zinfo.compress_type == ZIP_STORED: self.read = self.read_stored elif zinfo.compress_type == ZIP_DEFLATED: self.read = self.read_deflated self.dc = zlib.decompressobj(-15) self.recv = self.read def copyto(self, destfd, size = -1): copied = 0 if size < 1: size = self.zinfo.file_size while copied < size: data = self.read(min(4096, size - copied)) destfd.write(data) copied += len(data) def _finalize(self): if self.crc != self.zinfo.CRC: raise BadZipfile, "Bad CRC-32 for file %s" % self.zinfo.filename def flush(self): while self.byteswritten < self.zinfo.file_size: self.read(min(4096, self.zinfo.file_size - self.byteswritten)) self._finalize() def close(self): pass def read_stored(self, count = -1): if count < 1 or count > self.zinfo.compress_size - self.bytesread: count = self.zinfo.compress_size - self.bytesread if count < 1: return '' count = count + self.bytesread self.fp.seek(self.zinfo.file_offset + self.bytesread) retval = '' while self.bytesread < count: data = self.fp.read(min(4096, count - self.bytesread)) retval += data self.bytesread += len(data) self.byteswritten = self.bytesread self.crc = binascii.crc32(retval, self.crc) if self.bytesread == self.zinfo.compress_size: self._finalize() return retval def read_deflated(self, count = -1): if count < 1 or count > self.zinfo.file_size - self.byteswritten: count = self.zinfo.file_size - self.byteswritten if count < 1: return '' count = count self.fp.seek(self.zinfo.file_offset + self.bytesread) # First, fill up the buffer. while len(self.buffer) < count: bytes = self.fp.read(min(self.zinfo.compress_size - self.bytesread, 4096)) self.bytesread += len(bytes) result = self.dc.decompress(bytes) if len(result): self.buffer += result self.crc = binascii.crc32(result, self.crc) if self.bytesread == self.zinfo.compress_size: bytes = self.dc.decompress('Z') + self.dc.flush() if len(bytes): self.buffer += bytes self.crc = binascii.crc32(bytes, self.crc) self._finalize() retval = self.buffer[:count] self.byteswritten += len(retval) self.buffer = self.buffer[count:] return retval ########################################################################### ########################################################################### ########################################################################### # New ZipReader class class ZipReader: """ Class with methods to open, read, close, list zip files. z = ZipFile(file) file: Either the path to the file, or a file-like object. If it is a path, the file will be opened and closed by ZipFile. """ fp = None # Set here since __del__ checks it def __init__(self, file): """Open the ZIP file with mode read "r", write "w" or append "a".""" self.debug = 0 # Level of printing: 0 through 3 self.locationmap = {} # Check if we were passed a file-like object if type(file) in _STRING_TYPES: self._filePassed = 0 self.filename = file self.fp = open(file, 'rb') else: self._filePassed = 1 self.fp = file self.filename = getattr(file, 'name', None) try: self._InitZip() except BadZipfile: if not self._filePassed: self.fp.close() self.fp = None raise def GetContents(self): """Read the directory, making sure we close the file if the format is bad. Must use before trying to access any included files by name! """ self._RealGetContents() def _InitZip(self): fp = self.fp endrec = _EndRecData(fp) if not endrec: raise BadZipfile, "File is not a zip file" if self.debug > 1: print endrec self.size_cd = endrec[5] # bytes in central directory self.offset_cd = endrec[6] # offset of central directory self.comment = endrec[8] # archive comment # endrec[9] is the offset of the "End of Central Dir" record x = endrec[9] - self.size_cd # "concat" is zero, unless zip was concatenated to another file concat = x - self.offset_cd self.concat = concat if self.debug > 2: print "given, inferred, offset", offset_cd, x, concat # self.start_dir: Position of start of central directory self.start_dir = self.offset_cd + concat def _RealGetContents(self): """Read in the table of contents for the ZIP file.""" fp = self.fp fp.seek(self.start_dir, 0) total = 0 while total < self.size_cd: centdir = self._getcentdir() # Reads 46 bytes filename = fp.read(centdir[_CD_FILENAME_LENGTH]) self.locationmap[filename] = self.start_dir + total # Skip past the other stuff. total = (total + 46 + centdir[_CD_FILENAME_LENGTH] + centdir[_CD_EXTRA_FIELD_LENGTH] + centdir[_CD_COMMENT_LENGTH]) fp.seek(self.start_dir + total, 0) def namelist(self): """Return a list of file names in the archive.""" return self.locationmap.keys() def namelistiter(self): return self.locationmap.iterkeys() def hasfile(self, name): return self.locationmap.has_key(name) def infolist(self): """Return a list of class ZipInfo instances for files in the archive.""" return [self.getinfo(x) for x in self.locationmap.iterkeys()] def printdir(self): """Print a table of contents for the zip file.""" print "%-46s %19s %12s" % ("File Name", "Modified ", "Size") for name in self.locationmap.iterkeys(): zinfo = self.getinfo(name) date = "%d-%02d-%02d %02d:%02d:%02d" % zinfo.date_time print "%-46s %s %12d" % (zinfo.filename, date, zinfo.file_size) def testzip(self): """Read all the files and check the CRC.""" for name in self.locationmap.iterkeys(): try: self.read(name) # Check CRC-32 except: return name def getinfo(self, name): """Return the instance of ZipInfo given 'name'.""" return self.getinfofrompos(self.locationmap[name]) def _getcentdir(self): """Read central directory info from an ALREADY-SEEKED fp!""" centdir = self.fp.read(46) if centdir[0:4] != stringCentralDir: raise BadZipfile, "Bad magic number for central directory" centdir = struct.unpack(structCentralDir, centdir) if self.debug > 2: print centdir return centdir def getinfofrompos(self, location): if location < 0: raise KeyError, "Attempt to get information from non-file" fp = self.fp fp.seek(location, 0) centdir = self._getcentdir() filename = fp.read(centdir[_CD_FILENAME_LENGTH]) # Create ZipInfo instance to store file information x = ZipInfo(filename) x.extra = fp.read(centdir[_CD_EXTRA_FIELD_LENGTH]) x.comment = fp.read(centdir[_CD_COMMENT_LENGTH]) x.header_offset = centdir[_CD_LOCAL_HEADER_OFFSET] + self.concat # file_offset must be computed below... (x.create_version, x.create_system, x.extract_version, x.reserved, x.flag_bits, x.compress_type, t, d, x.CRC, x.compress_size, x.file_size) = centdir[1:12] x.volume, x.internal_attr, x.external_attr = centdir[15:18] # Convert date/time code to (year, month, day, hour, min, sec) x.date_time = ( (d>>9)+1980, (d>>5)&0xF, d&0x1F, t>>11, (t>>5)&0x3F, (t&0x1F) * 2 ) # And now, read the info from the file's header. data = x fp.seek(data.header_offset, 0) fheader = fp.read(30) if fheader[0:4] != stringFileHeader: raise BadZipfile, "Bad magic number for file header" fheader = struct.unpack(structFileHeader, fheader) # file_offset is computed here, since the extra field for # the central directory and for the local file header # refer to different fields, and they can have different # lengths data.file_offset = (data.header_offset + 30 + fheader[_FH_FILENAME_LENGTH] + fheader[_FH_EXTRA_FIELD_LENGTH]) fname = fp.read(fheader[_FH_FILENAME_LENGTH]) if fname != data.filename: raise RuntimeError, \ 'File name in directory "%s" and header "%s" differ.' % ( data.filename, fname) return data def read(self, name): fd = StringIO() self.copyto(name, fd) return fd.getvalue() def open_zinfo(self, zi): if not self.fp: raise RuntimeError, \ "Attempt to read ZIP archive that was already closed" return FileSimulator(ZipDecompressor(self.fp, zi), None, -1) def open(self, name): return self.open_zinfo(self.getinfo(name)) def open_pos(self, location): return self.open_zinfo(self.getinfofrompos(location)) def copyto(self, name, fd): """Copy the contents of the named file to the given descriptor.""" self.open(name)._sock.copyto(fd) def __del__(self): """Call the "close()" method in case the user forgot.""" self.close() def close(self): """Close the file, and for mode "w" and "a" write the ending records.""" if self.fp is None: return if not self._filePassed: self.fp.close() self.fp = None ########################################################################### ########################################################################### ########################################################################### # Old ZipFile class class ZipFile: """ Class with methods to open, read, write, close, list zip files. z = ZipFile(file, mode="r", compression=ZIP_STORED) file: Either the path to the file, or a file-like object. If it is a path, the file will be opened and closed by ZipFile. mode: The mode can be either read "r", write "w" or append "a". compression: ZIP_STORED (no compression) or ZIP_DEFLATED (requires zlib). """ fp = None # Set here since __del__ checks it def __init__(self, file, mode="r", compression=ZIP_STORED): """Open the ZIP file with mode read "r", write "w" or append "a".""" if compression == ZIP_STORED: pass elif compression == ZIP_DEFLATED: if not zlib: raise RuntimeError,\ "Compression requires the (missing) zlib module" else: raise RuntimeError, "That compression method is not supported" self.debug = 0 # Level of printing: 0 through 3 self.NameToInfo = {} # Find file info given name self.filelist = [] # List of ZipInfo instances for archive self.compression = compression # Method of compression self.mode = key = mode[0] # Check if we were passed a file-like object if isinstance(file, basestring): self._filePassed = 0 self.filename = file modeDict = {'r' : 'rb', 'w': 'wb', 'a' : 'r+b'} self.fp = open(file, modeDict[mode]) else: self._filePassed = 1 self.fp = file self.filename = getattr(file, 'name', None) if key == 'r': self._GetContents() elif key == 'w': pass elif key == 'a': try: # See if file is a zip file self._RealGetContents() # seek to start of directory and overwrite self.fp.seek(self.start_dir, 0) except BadZipfile: # file is not a zip file, just append self.fp.seek(0, 2) else: if not self._filePassed: self.fp.close() self.fp = None raise RuntimeError, 'Mode must be "r", "w" or "a"' def _GetContents(self): """Read the directory, making sure we close the file if the format is bad.""" try: self._RealGetContents() except BadZipfile: if not self._filePassed: self.fp.close() self.fp = None raise def _RealGetContents(self): """Read in the table of contents for the ZIP file.""" fp = self.fp endrec = _EndRecData(fp) if not endrec: raise BadZipfile, "File is not a zip file" if self.debug > 1: print endrec size_cd = endrec[5] # bytes in central directory offset_cd = endrec[6] # offset of central directory self.comment = endrec[8] # archive comment # endrec[9] is the offset of the "End of Central Dir" record x = endrec[9] - size_cd # "concat" is zero, unless zip was concatenated to another file concat = x - offset_cd if self.debug > 2: print "given, inferred, offset", offset_cd, x, concat # self.start_dir: Position of start of central directory self.start_dir = offset_cd + concat fp.seek(self.start_dir, 0) total = 0 while total < size_cd: centdir = fp.read(46) total = total + 46 if centdir[0:4] != stringCentralDir: raise BadZipfile, "Bad magic number for central directory" centdir = struct.unpack(structCentralDir, centdir) if self.debug > 2: print centdir filename = fp.read(centdir[_CD_FILENAME_LENGTH]) # Create ZipInfo instance to store file information x = ZipInfo(filename) x.extra = fp.read(centdir[_CD_EXTRA_FIELD_LENGTH]) x.comment = fp.read(centdir[_CD_COMMENT_LENGTH]) total = (total + centdir[_CD_FILENAME_LENGTH] + centdir[_CD_EXTRA_FIELD_LENGTH] + centdir[_CD_COMMENT_LENGTH]) x.header_offset = centdir[_CD_LOCAL_HEADER_OFFSET] + concat # file_offset must be computed below... (x.create_version, x.create_system, x.extract_version, x.reserved, x.flag_bits, x.compress_type, t, d, x.CRC, x.compress_size, x.file_size) = centdir[1:12] x.volume, x.internal_attr, x.external_attr = centdir[15:18] # Convert date/time code to (year, month, day, hour, min, sec) x.date_time = ( (d>>9)+1980, (d>>5)&0xF, d&0x1F, t>>11, (t>>5)&0x3F, (t&0x1F) * 2 ) self.filelist.append(x) self.NameToInfo[x.filename] = x if self.debug > 2: print "total", total for data in self.filelist: fp.seek(data.header_offset, 0) fheader = fp.read(30) if fheader[0:4] != stringFileHeader: raise BadZipfile, "Bad magic number for file header" fheader = struct.unpack(structFileHeader, fheader) # file_offset is computed here, since the extra field for # the central directory and for the local file header # refer to different fields, and they can have different # lengths data.file_offset = (data.header_offset + 30 + fheader[_FH_FILENAME_LENGTH] + fheader[_FH_EXTRA_FIELD_LENGTH]) fname = fp.read(fheader[_FH_FILENAME_LENGTH]) if fname != data.filename: raise RuntimeError, \ 'File name in directory "%s" and header "%s" differ.' % ( data.filename, fname) def namelist(self): """Return a list of file names in the archive.""" l = [] for data in self.filelist: l.append(data.filename) return l def infolist(self): """Return a list of class ZipInfo instances for files in the archive.""" return self.filelist def printdir(self): """Print a table of contents for the zip file.""" print "%-46s %19s %12s" % ("File Name", "Modified ", "Size") for zinfo in self.filelist: date = "%d-%02d-%02d %02d:%02d:%02d" % zinfo.date_time print "%-46s %s %12d" % (zinfo.filename, date, zinfo.file_size) def testzip(self): """Read all the files and check the CRC.""" for zinfo in self.filelist: try: self.read(zinfo.filename) # Check CRC-32 except: return zinfo.filename def getinfo(self, name): """Return the instance of ZipInfo given 'name'.""" return self.NameToInfo[name] def read(self, name): """Return file bytes (as a string) for name.""" if self.mode not in ("r", "a"): raise RuntimeError, 'read() requires mode "r" or "a"' if not self.fp: raise RuntimeError, \ "Attempt to read ZIP archive that was already closed" zinfo = self.getinfo(name) filepos = self.fp.tell() self.fp.seek(zinfo.file_offset, 0) bytes = self.fp.read(zinfo.compress_size) self.fp.seek(filepos, 0) if zinfo.compress_type == ZIP_STORED: pass elif zinfo.compress_type == ZIP_DEFLATED: if not zlib: raise RuntimeError, \ "De-compression requires the (missing) zlib module" # zlib compress/decompress code by Jeremy Hylton of CNRI dc = zlib.decompressobj(-15) bytes = dc.decompress(bytes) # need to feed in unused pad byte so that zlib won't choke ex = dc.decompress('Z') + dc.flush() if ex: bytes = bytes + ex else: raise BadZipfile, \ "Unsupported compression method %d for file %s" % \ (zinfo.compress_type, name) crc = binascii.crc32(bytes) if crc != zinfo.CRC: raise BadZipfile, "Bad CRC-32 for file %s" % name return bytes def _writecheck(self, zinfo): """Check for errors before writing a file to the archive.""" if zinfo.filename in self.NameToInfo: if self.debug: # Warning for duplicate names print "Duplicate name:", zinfo.filename if self.mode not in ("w", "a"): raise RuntimeError, 'write() requires mode "w" or "a"' if not self.fp: raise RuntimeError, \ "Attempt to write ZIP archive that was already closed" if zinfo.compress_type == ZIP_DEFLATED and not zlib: raise RuntimeError, \ "Compression requires the (missing) zlib module" if zinfo.compress_type not in (ZIP_STORED, ZIP_DEFLATED): raise RuntimeError, \ "That compression method is not supported" def write(self, filename, arcname=None, compress_type=None): """Put the bytes from filename into the archive under the name arcname.""" st = os.stat(filename) mtime = time.localtime(st.st_mtime) date_time = mtime[0:6] # Create ZipInfo instance to store file information if arcname is None: zinfo = ZipInfo(filename, date_time) else: zinfo = ZipInfo(arcname, date_time) zinfo.external_attr = st[0] << 16L # Unix attributes if compress_type is None: zinfo.compress_type = self.compression else: zinfo.compress_type = compress_type self._writecheck(zinfo) fp = open(filename, "rb") zinfo.flag_bits = 0x00 zinfo.header_offset = self.fp.tell() # Start of header bytes # Must overwrite CRC and sizes with correct data later zinfo.CRC = CRC = 0 zinfo.compress_size = compress_size = 0 zinfo.file_size = file_size = 0 self.fp.write(zinfo.FileHeader()) zinfo.file_offset = self.fp.tell() # Start of file bytes if zinfo.compress_type == ZIP_DEFLATED: cmpr = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION, zlib.DEFLATED, -15) else: cmpr = None while 1: buf = fp.read(1024 * 8) if not buf: break file_size = file_size + len(buf) CRC = binascii.crc32(buf, CRC) if cmpr: buf = cmpr.compress(buf) compress_size = compress_size + len(buf) self.fp.write(buf) fp.close() if cmpr: buf = cmpr.flush() compress_size = compress_size + len(buf) self.fp.write(buf) zinfo.compress_size = compress_size else: zinfo.compress_size = file_size zinfo.CRC = CRC zinfo.file_size = file_size # Seek backwards and write CRC and file sizes position = self.fp.tell() # Preserve current position in file self.fp.seek(zinfo.header_offset + 14, 0) self.fp.write(struct.pack("= os.stat(file_py).st_mtime: fname = file_pyo # Use .pyo file elif not os.path.isfile(file_pyc) or \ os.stat(file_pyc).st_mtime < os.stat(file_py).st_mtime: import py_compile if self.debug: print "Compiling", file_py try: py_compile.compile(file_py, file_pyc, None, True) except py_compile.PyCompileError,err: print err.msg fname = file_pyc else: fname = file_pyc archivename = os.path.split(fname)[1] if basename: archivename = "%s/%s" % (basename, archivename) return (fname, archivename) pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/logger.py0000664000000000000000000000151310762620505016674 0ustar import sys log = None logfile = sys.stdout priority = None facility = None syslogfunc = None def log_file(message): global logfile logfile.write(message + "\n") def setlogfile(file): global logfile logfile = file def log_syslog(message): syslogfunc(priority, message) def log_none(message): pass def init(config): global log, priority, facility, syslogfunc logmethod = config.get("logger", "logmethod") if logmethod == "syslog": import syslog priority = eval("syslog." + config.get("logger", "priority")) facility = eval("syslog." + config.get("logger", "facility")) syslog.openlog('pygopherd', syslog.LOG_PID, facility) syslogfunc = syslog.syslog log = log_syslog elif logmethod == 'file': log = log_file else: log = log_none pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/gopherentryTest.py0000664000000000000000000002610510762620505020627 0ustar #!/usr/bin/python # Python-based gopher server # Module: test of gopherentry # COPYRIGHT # # Copyright (C) 2002 John Goerzen # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # END OF COPYRIGHT # import unittest, os, stat, re from pygopherd import testutil from pygopherd.gopherentry import GopherEntry fields = ['selector', 'config', 'fspath', 'type', 'name', 'host', 'port', 'mimetype', 'encodedmimetype', 'size', 'encoding', 'populated', 'language', 'ctime', 'mtime', 'num', 'gopherpsupport'] class GopherEntryTestCase(unittest.TestCase): def setUp(self): self.config = testutil.getconfig() self.root = self.config.get("pygopherd", "root") def assertEntryMatches(self, conditions, entry, testname): for field, value in conditions.items(): self.assertEquals(value, getattr(entry, field), "%s: Field '%s' expected '%s' but was '%s'" % \ (testname, field, value, getattr(entry, field))) def testinit(self): entry = GopherEntry('/NONEXISTANT', self.config) conditions = {'selector' : '/NONEXISTANT', 'config' : self.config, 'populated' : 0, 'gopherpsupport' : 0 } for x in ['fspath', 'type', 'name', 'host', 'port', 'mimetype', 'encodedmimetype', 'size', 'encoding', 'language', 'ctime', 'mtime']: conditions[x] = None self.assertEntryMatches(conditions, entry, 'testinit') def testpopulate_basic(self): fspath = '/testfile.txt' statval = os.stat(self.root + fspath) conditions = {'selector' : '/testfile.txt', 'config' : self.config, 'fspath' : fspath, 'type' : '0', 'name' : 'testfile.txt', 'host' : None, 'port' : None, 'mimetype' : 'text/plain', 'encodedmimetype' : None, 'encoding' : None, 'populated' : 1, 'language' : None, 'gopherpsupport' : 1, 'ctime' : statval[9], 'mtime' : statval[8], 'size' : 5, 'num' : 0} entry = GopherEntry('/testfile.txt', self.config) entry.populatefromfs(fspath) self.assertEntryMatches(conditions, entry, 'testpopulate_basic') # Also try it with passed statval. entry = GopherEntry('/testfile.txt', self.config) entry.populatefromfs(fspath, statval) self.assertEntryMatches(conditions, entry, 'testpopulate_basic with cached stat') # Make sure it's a no-op if it's already populated. entry = GopherEntry('/NONEXISTANT', self.config) entry.populated = 1 entry.populatefromfs(fspath) assert entry.gettype() == None def testpopulate_encoded(self): fspath = '/testfile.txt.gz' entry = GopherEntry('/testfile.txt.gz', self.config) entry.populatefromfs(fspath) self.assertEquals(entry.gettype(), '9') self.assertEquals(entry.getmimetype(), 'application/octet-stream') self.assertEquals(entry.getencoding(), 'gzip') self.assertEquals(entry.getencodedmimetype(), 'text/plain') self.assertEquals(entry.geteadict(), {'ABSTRACT': "This is the abstract\nfor testfile.txt.gz"}) def testpopulate_dir(self): fspath = self.root + '/' entry = GopherEntry('/', self.config) entry.populatefromfs('/') conditions = { 'selector' : '/', 'config' : self.config, 'fspath' : '/', 'type' : '1', 'name' : '', 'host' : None, 'port' : None, 'mimetype' : 'application/gopher-menu', 'encodedmimetype' : None, 'encoding' : None, 'populated' : 1, 'language' : None, 'gopherpsupport' : 1} self.assertEntryMatches(conditions, entry, "testpopulate_dir") self.assertEqual(entry.geteadict(), {'ABSTRACT': 'This is the abstract for the testdata directory.'}) def testpopulate_remote(self): """Asserts that population is not done on remote objects.""" selector = '/testfile.txt' fspath = self.root + selector entry = GopherEntry(selector, self.config) entry.host = 'gopher.nowhere' entry.populatefromfs(fspath) assert entry.gettype() == None entry.populated = 0 entry.host = None entry.port = 70 entry.populatefromfs(fspath) assert entry.gettype() == None entry.populated = 0 entry.host = 'gopher.nowhere' entry.populatefromfs(fspath) assert entry.gettype() == None def testpopulate_untouched(self): """Asserts that populatefromfs does not touch data that has already been set.""" selector = '/testfile.txt' fspath = selector entry = GopherEntry(selector, self.config) entry.name = 'FAKE NAME' entry.ctime = 1 entry.mtime = 2 entry.populatefromfs(fspath) self.assertEntryMatches({'name' : 'FAKE NAME', 'ctime':1, 'mtime':2}, entry, 'testpopulate_untouched') # Reset for the next batch. entry = GopherEntry('/', self.config) # Test type for a dir. entry.type = '2' entry.mimetype = 'FAKEMIMETYPE' entry.populatefromfs(self.root) self.assertEquals(entry.gettype(), '2') self.assertEquals(entry.getmimetype(), 'FAKEMIMETYPE') # Test mime type handling. First, regular file. entry = GopherEntry(selector, self.config) entry.mimetype = 'fakemimetype' entry.populatefromfs(fspath) self.assertEquals(entry.getmimetype(), 'fakemimetype') # The guesstype will not find fakemimetype and so it'll set it to 0 self.assertEquals(entry.gettype(), '0') # Now, an encoded file. entry = GopherEntry(selector + '.gz', self.config) entry.mimetype = 'fakemime' entry.populatefromfs(fspath + '.gz') self.assertEquals(entry.getmimetype(), 'fakemime') self.assertEquals(entry.getencoding(), 'gzip') self.assertEquals(entry.getencodedmimetype(), 'text/plain') self.assertEquals(entry.gettype(), '0') # again from fakemime # More details. selector = '/testarchive.tgz' fspath = selector entry = GopherEntry(selector, self.config) entry.mimetype = 'foo1234' entry.encoding = 'bar' entry.populatefromfs(fspath) self.assertEquals(entry.getmimetype(), 'foo1234') self.assertEquals(entry.getencoding(), 'bar') self.assertEquals(entry.getencodedmimetype(), 'application/x-tar') self.assertEquals(entry.gettype(), '0') # And overriding only the encoding. entry = GopherEntry(selector, self.config) entry.encoding = 'fakeencoding' entry.populatefromfs(fspath) self.assertEquals(entry.getencoding(), 'fakeencoding') self.assertEquals(entry.gettype(), '9') self.assertEquals(entry.getmimetype(), 'application/octet-stream') # And finally -- overriding the encoded mime type. entry = GopherEntry(selector, self.config) entry.encodedmimetype = 'fakeencoded' entry.populatefromfs(fspath) self.assertEquals(entry.getencodedmimetype(), 'fakeencoded') self.assertEquals(entry.getmimetype(), 'application/octet-stream') def test_guesstype(self): entry = GopherEntry('/NONEXISTANT', self.config) expected = {'text/plain': '0', 'application/gopher-menu': '1', 'application/gopher+-menu' : '1', 'text/html' : 'h', 'image/gif' : 'g', 'image/jpeg' : 'I', 'application/pdf' : '9', 'application/msword' : '9', 'audio/aiff' : 's'} for mimetype, type in expected.items(): entry.mimetype = mimetype self.assertEquals(entry.guesstype(), type, "Failure for %s: got %s, expected %s" % \ (mimetype, entry.guesstype(), type)) def test_gets_sets(self): """Tests a bunch of gets that operate on values that are None to start with, and take a default.""" entry = GopherEntry('/NONEXISTANT', self.config) # Initialize the rest of them to None. entry.selector = None entry.config = None entry.populated = None entry.num = None entry.gopherpsupport = None for field in fields: getfunc = getattr(entry, 'get' + field) setfunc = getattr(entry, 'set' + field) self.assertEquals(getfunc(), None) self.assertEquals(getfunc('DEFAULT' + field), 'DEFAULT' + field) setfunc('NewValue' + field) self.assertEquals(getfunc(), 'NewValue' + field) self.assertEquals(getfunc('DEFAULT'), 'NewValue' + field) def testgeturl(self): expected = { '/URL:http://www.complete.org/%20/': 'http://www.complete.org/%20/', 'URL:telnet://foo.com/%20&foo=bar': 'telnet://foo.com/%20&foo=bar', '/foo' : 'gopher://MISSINGHOST:70/0/foo', '/About Me.txt' : 'gopher://MISSINGHOST:70/0/About%20Me.txt', '/' : 'gopher://MISSINGHOST:70/0/'} for selector, url in expected.items(): entry = GopherEntry(selector, self.config) entry.settype('0') self.assertEquals(url, entry.geturl()) self.assertEquals(re.sub('MISSINGHOST', 'NEWHOST', url), entry.geturl('NEWHOST')) self.assertEquals(re.sub('70', '10101', url), entry.geturl(defaultport = 10101)) entry.sethost('newhost') self.assertEquals(re.sub('MISSINGHOST', 'newhost', url), entry.geturl()) entry.setport(80) self.assertEquals(re.sub('MISSINGHOST:70', 'newhost:80', url), entry.geturl()) pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/__init__.py0000664000000000000000000000210710762620505017154 0ustar # pygopherd -- Gopher-based protocol server in Python # module: directory marker # Copyright (C) 2002 John Goerzen # # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA __all__ = ['handlers', 'protocols', 'GopherExceptions', 'GopherExceptionsTest', 'gopherentry', 'gopherentryTest', 'logger', 'loggerTest', 'fileext', 'fileextTest', 'pipe', 'pipeTest', 'initialization', 'initializationTest', 'testutil', 'version'] pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/loggerTest.py0000664000000000000000000000024710762620505017537 0ustar import unittest from pygopherd import logger, testutil class LoggerTestCase(unittest.TestCase): def setUp(self): self.config = testutil.getconfig() pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/GopherExceptionsTest.py0000664000000000000000000000422710762620505021550 0ustar #!/usr/bin/python # Python-based gopher server # Module: test of Gopher Exceptions # COPYRIGHT # # Copyright (C) 2002 John Goerzen # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # END OF COPYRIGHT # import unittest from StringIO import StringIO from pygopherd import logger, initialization, GopherExceptions, testutil from pygopherd.GopherExceptions import FileNotFound from pygopherd.protocols import rfc1436 class GopherExceptionsTestCase(unittest.TestCase): def setUp(self): self.stringfile = StringIO() self.config = testutil.getconfig() self.stringfile = testutil.getstringlogger() GopherExceptions.tracebacks = 0 def testlog_basic(self): try: raise IOError, "foo" except IOError, e: GopherExceptions.log(e) self.assertEqual(self.stringfile.getvalue(), "unknown-address [None/None] EXCEPTION IOError: foo\n") def testlog_proto_ip(self): rfile = StringIO("/NONEXISTANT\n") wfile = StringIO() handler = testutil.gettestinghandler(rfile, wfile, self.config) handler.handle() # handler.handle() self.assertEquals(self.stringfile.getvalue(), "10.77.77.77 [GopherProtocol/None] EXCEPTION FileNotFound: '/NONEXISTANT' does not exist (no handler found)\n") def testFileNotFound(self): try: raise FileNotFound, "TEST STRING" except FileNotFound, e: self.assertEquals(str(e), "'TEST STRING' does not exist") pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/initialization.py0000664000000000000000000001672710762620505020461 0ustar # Python-based gopher server # Module: initialization # COPYRIGHT # # Copyright (C) 2002 John Goerzen # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # END OF COPYRIGHT # from ConfigParser import ConfigParser # Import lots of stuff so it's here before chrooting. import socket, os, sys, SocketServer, re, stat, os.path, UserDict, tempfile import time, atexit, errno, struct from pygopherd import handlers, protocols, GopherExceptions, logger, sighandlers from pygopherd.protocols import * from pygopherd.protocols import ProtocolMultiplexer from pygopherd.handlers import * from pygopherd.handlers import HandlerMultiplexer import pygopherd.fileext import mimetypes import traceback def initconffile(conffile): if not (os.path.isfile(conffile) and os.access(conffile, os.R_OK)): raise Exception, "Could NOT access config file %s\nPlease specify config file as a command-line argument\n" % conffile config = ConfigParser() config.read(conffile) return config def initlogger(config, conffile): logger.init(config) logger.log("Pygopherd starting, using configuration file %s" % conffile) def initexceptions(config): GopherExceptions.init(config.getboolean("pygopherd", "tracebacks")) def initmimetypes(config): mimetypesfiles = config.get("pygopherd", "mimetypes").split(":") mimetypesfiles = filter(lambda x: os.path.isfile(x) and os.access(x, os.R_OK), mimetypesfiles) if not mimetypesfiles: errmsg = "Could not find any mimetypes files; check mimetypes option in config." logger.log(errmsg) raise Exception, errmsg configencoding = eval(config.get("pygopherd", "encoding")) mimetypes.encodings_map.clear() for key, value in configencoding: mimetypes.encodings_map[key] = value mimetypes.init(mimetypesfiles) logger.log("mimetypes initialized with files: " + str(mimetypesfiles)) # Set up the inverse mapping file. pygopherd.fileext.init() class GopherRequestHandler(SocketServer.StreamRequestHandler): def handle(self): request = self.rfile.readline() protohandler = \ ProtocolMultiplexer.getProtocol(request, \ self.server, self, self.rfile, self.wfile, self.server.config) try: protohandler.handle() except socket.error, e: if not (e[0] in [errno.ECONNRESET, errno.EPIPE]): traceback.print_exc() GopherExceptions.log(sys.exc_info()[1], protohandler, None) except: if GopherExceptions.tracebacks: # Yes, this may be invalid. Not much else we can do. #traceback.print_exc(file = self.wfile) traceback.print_exc() GopherExceptions.log(sys.exc_info()[1], protohandler, None) def getserverobject(config): # Pick up the server type from the config. servertype = eval("SocketServer." + config.get("pygopherd", "servertype")) class MyServer(servertype): allow_reuse_address = 1 def server_bind(self): """Override server_bind to store server name.""" servertype.server_bind(self) # Set a timeout. if config.has_option('pygopherd', 'timeout'): mytimeout = struct.pack("ll", long(config.get('pygopherd', 'timeout')), 0) self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, mytimeout) self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_SNDTIMEO, mytimeout) #self.socket.settimeout(int(config.get('pygopherd', 'timeout'))) host, port = self.socket.getsockname() if config.has_option("pygopherd", "servername"): self.server_name = config.get("pygopherd", "servername") else: self.server_name = socket.getfqdn(host) if config.has_option("pygopherd", "advertisedport"): self.server_port = config.getint("pygopherd", "advertisedport") else: self.server_port = port # Instantiate a server. Has to be done before the security so we can # get a privileged port if necessary. interface = '' if config.has_option('pygopherd', 'interface'): servername = config.get('pygopherd', 'interface') interface = config.get('pygopherd', 'interface') try: s = MyServer((interface, config.getint('pygopherd', 'port')), GopherRequestHandler) except: GopherExceptions.log(sys.exc_info()[1], None, None) logger.log("Application startup NOT successful!") raise s.config = config return s def initsecurity(config): idsetuid = None idsetgid = None if config.has_option("pygopherd", "setuid"): import pwd idsetuid = pwd.getpwnam(config.get("pygopherd", "setuid"))[2] if config.has_option("pygopherd", "setgid"): import grp idsetgid = grp.getgrnam(config.get("pygopherd", "setgid"))[2] if config.getboolean("pygopherd", "usechroot"): os.chroot(config.get("pygopherd", "root")) logger.log("Chrooted to " + config.get("pygopherd", "root")) config.set("pygopherd", "root", "/") if idsetuid != None or idsetgid != None: os.setgroups( () ) logger.log("Supplemental group list cleared.") if idsetgid != None: os.setregid(idsetgid, idsetgid) logger.log("Switched to group %d" % idsetgid) if idsetuid != None: os.setreuid(idsetuid, idsetuid) logger.log("Switched to uid %d" % idsetuid) def initconditionaldetach(config): if config.getboolean("pygopherd", "detach"): pid = os.fork() if pid: logger.log("Parent process detaching; child is %d" % pid) sys.exit(0) def initpidfile(config): if config.has_option("pygopherd", "pidfile"): pidfile = config.get("pygopherd", "pidfile") fd = open(pidfile, "wt") fd.write("%d\n" % os.getpid()) fd.close() def initpgrp(config): if 'setpgrp' in os.__dict__: os.setpgrp() pgrp = os.getpgrp() logger.log("Process group is %d" % pgrp) return pgrp else: logger.log("setpgrp() unavailable; not initializing process group") return None def initsighandlers(config, pgrp): sighandlers.setsighuphandler() sighandlers.setsigtermhandler(pgrp) def initeverything(conffile): config = initconffile(conffile) initlogger(config, conffile) initexceptions(config) initmimetypes(config) s = getserverobject(config) initconditionaldetach(config) initpidfile(config) pgrp = initpgrp(config) initsighandlers(config, pgrp) initsecurity(config) os.chdir(config.get("pygopherd", "root")) logger.log("Running. Root is '%s'" % config.get("pygopherd", "root")) return s pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/GopherExceptions.py0000664000000000000000000000426410762620505020711 0ustar # pygopherd -- Gopher-based protocol server in Python # module: exception declarations # Copyright (C) 2002 John Goerzen # # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import types, re from pygopherd import logger tracebacks = 0 def log(exception, protocol = None, handler = None): """Logs an exception. It will try to generate a nice-looking string based on the arguments passed in.""" protostr = 'None' handlerstr = 'None' ipaddr = 'unknown-address' exceptionclass = re.search("[^.]+$", str(exception.__class__)).group(0) if protocol: protostr = re.search("[^.]+$", str(protocol.__class__)).group(0) ipaddr = protocol.requesthandler.client_address[0] if handler: handlerstr = re.search("[^.]+$", str(handler.__class__)).group(0) logger.log("%s [%s/%s] EXCEPTION %s: %s" % \ (ipaddr, protostr, handlerstr, exceptionclass, str(exception))) def init(backtraceenabled): global tracebacks tracebacks = backtraceenabled class FileNotFound: def __init__(self, arg): self.selector = arg self.comments = '' self.protocol = '' if type(arg) != types.StringType: self.selector = arg[0] self.comments = arg[1] if len(arg) > 2 and arg[2]: self.protocol = arg[2] log(self, self.protocol, None) def __str__(self): retval = "'%s' does not exist" % (self.selector) if self.comments: retval += " (%s)" % self.comments return retval pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/version.py0000664000000000000000000000223210777416247017115 0ustar productname = 'PyGopherd' versionstr = "2.0.18" versionlist = versionstr.split(".") major = versionlist[0] minor = versionlist[1] patch = versionlist[2] copyright = "Copyright (C) 2002-2008 John Goerzen. All rights reserved." author = "John Goerzen" author_email = "jgoerzen@complete.org" description = "Multiprotocol Internet Gopher Information Server" homepage = "http://www.quux.org/devel/gopher/pygopherd" homegopher = "gopher://quux.org/1/devel/gopher/pygopherd" license = """Copyright (C) 2002-2008 John Goerzen 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; version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA""" pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/testutil.py0000664000000000000000000000622510762620505017277 0ustar #!/usr/bin/python # Python-based gopher server # Module: test utilities # COPYRIGHT # # Copyright (C) 2002 John Goerzen # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # END OF COPYRIGHT # from pygopherd import initialization, logger from pygopherd.protocols import ProtocolMultiplexer from StringIO import StringIO import os def getconfig(): config = initialization.initconffile('conf/pygopherd.conf') config.set("pygopherd", "root", os.path.abspath('./testdata')) return config def getstringlogger(): config = getconfig() config.set('logger', 'logmethod', 'file') logger.init(config) stringfile = StringIO() logger.setlogfile(stringfile) return stringfile def gettestingserver(config = None): config = config or getconfig() config.set('pygopherd', 'port', '64777') s = initialization.getserverobject(config) s.server_close() return s def gettestinghandler(rfile, wfile, config = None): """Creates a testing handler with input from rfile. Fills in other stuff with fake values.""" config = config or getconfig() # Kludge to pass to the handler init. class requestClass: def __init__(self, rfile, wfile): self.rfile = rfile self.wfile = wfile def makefile(self, mode, bufsize): if mode[0] == 'r': return self.rfile return self.wfile class handlerClass(initialization.GopherRequestHandler): def __init__(self, request, client_address, server): self.request = request self.client_address = client_address self.server = server self.setup() s = gettestingserver(config) rhandler = handlerClass(requestClass(rfile, wfile), ('10.77.77.77', '7777'), s) return rhandler def gettestingprotocol(request, config = None): config = config or getconfig() rfile = StringIO(request) # Pass fake rfile, wfile to gettestinghandler -- they'll be closed before # we can get the info, and some protocols need to read more from them. handler = gettestinghandler(StringIO(), StringIO(), config) # Now override. handler.rfile = rfile return ProtocolMultiplexer.getProtocol(rfile.readline(), handler.server, handler, handler.rfile, handler.wfile, config) pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/fileextTest.py0000664000000000000000000000253510762620505017722 0ustar #!/usr/bin/python # Python-based gopher server # Module: test of fileext # COPYRIGHT # # Copyright (C) 2002 John Goerzen # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # END OF COPYRIGHT # import unittest from pygopherd import fileext, testutil, initialization class FileExtTestCase(unittest.TestCase): def setUp(self): config = testutil.getconfig() initialization.initmimetypes(config) def testinit(self): # Was already inited in the initmimetypes, so just do a sanity # check. self.assert_('.txt' in fileext.typemap['text/plain']) self.assert_('.txt.gz' in fileext.typemap['text/plain']) self.assert_(not ('.html' in fileext.typemap['text/plain'])) pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/handlers/0000775000000000000000000000000010762620505016643 5ustar pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/handlers/HandlerMultiplexer.py0000664000000000000000000000441610762620505023032 0ustar # pygopherd -- Gopher-based protocol server in Python # module: find the right handler for a request # Copyright (C) 2002 John Goerzen # # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA from pygopherd import GopherExceptions, logger from pygopherd.handlers import * import os, re handlers = None rootpath = None def getHandler(selector, searchrequest, protocol, config, handlerlist = None, vfs = None): """Called without handlerlist specified, uses the default as listed in config.""" global handlers, rootpath if vfs == None: from pygopherd.handlers.base import VFS_Real vfs = VFS_Real(config) if not handlers: handlers = eval(config.get("handlers.HandlerMultiplexer", "handlers")) rootpath = config.get("pygopherd", "root") if handlerlist == None: handlerlist = handlers # SECURITY: assert that our absolute path is within the absolute # path of the site root. #if not os.path.abspath(rootpath + '/' + selector). \ # startswith(os.path.abspath(rootpath)): # raise GopherExceptions.FileNotFound, \ # [selector, "Requested document is outside the server root", # protocol] statresult = None try: statresult = vfs.stat(selector) except OSError: pass for handler in handlerlist: htry = handler(selector, searchrequest, protocol, config, statresult, vfs) if htry.isrequestforme(): return htry.gethandler() raise GopherExceptions.FileNotFound, \ [selector, "no handler found", protocol] pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/handlers/pyg.py0000664000000000000000000000267610762620505020027 0ustar from pygopherd import protocols, gopherentry from pygopherd.handlers.base import BaseHandler, VFS_Real from pygopherd.handlers.virtual import Virtual from stat import * import imp, re class PYGHandler(Virtual): def canhandlerequest(self): if not isinstance(self.vfs, VFS_Real): return 0 if not (self.statresult and S_ISREG(self.statresult[ST_MODE]) and \ (S_IMODE(self.statresult[ST_MODE]) & S_IXOTH) and \ re.search("\.pyg$", self.getselector())): return 0 self.modfd = self.vfs.open(self.getselector(), "rt") self.module = imp.load_module('PYGHandler', self.modfd, self.getfspath(), ('', '', imp.PY_SOURCE)) self.pygclass = self.module.PYGMain self.pygobject = self.pygclass(self.selector, self.searchrequest, self.protocol, self.config, self.statresult) return self.pygobject.isrequestforme() def prepare(self): return self.pygobject.prepare() def getentry(self): return self.pygobject.getentry() def isdir(self): return self.pygobject.isdir() def getdirlist(self): return self.pygobject.getdirlist() def write(self, wfile): self.pygobject.write(wfile) class PYGBase(Virtual): pass pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/handlers/UMN.py0000664000000000000000000002563110762620505017663 0ustar # pygopherd -- Gopher-based protocol server in Python # module: Implementation of features first found in UMN gopherd # Copyright (C) 2002 John Goerzen # # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import SocketServer import re import os, stat, os.path, mimetypes from pygopherd import protocols, gopherentry from pygopherd.gopherentry import GopherEntry from pygopherd.handlers.dir import DirHandler from pygopherd.handlers.file import FileHandler from stat import * import pygopherd.fileext extstrip = None ########################################################################### # UMN Directory handler # Handles .Links, .names, and .cap/* files ########################################################################### class LinkEntry(GopherEntry): def __init__(self, selector, config): GopherEntry.__init__(self, selector, config) self.needsmerge = 0 self.needsabspath = 0 def getneedsmerge(self): return self.needsmerge def getneedsabspath(self): return self.needsabspath def setneedsmerge(self, arg): self.needsmerge = arg def setneedsabspath(self, arg): self.needsabspath = arg class UMNDirHandler(DirHandler): """This module strives to be bug-compatible with UMN gopherd.""" def prepare(self): """Override parent to do a few more things and override sort order.""" # Initialize. self.linkentries = [] # Let the parent do the directory walking for us. Will call # prep_initfiles_canaddfile and prep_entriesappend. if DirHandler.prepare(self): # Returns 1 if it didn't load from the cache. # Merge and sort. self.MergeLinkFiles() self.fileentries.sort(self.entrycmp) def prep_initfiles_canaddfile(self, ignorepatt, pattern, file): """Override the parent to process dotfiles and keep them out of the list.""" if DirHandler.prep_initfiles_canaddfile(self, ignorepatt, pattern, file): # If the parent says it's OK, then let's see if it's # a link file. If yes, process it and return false. if file[0] == '.': if not self.vfs.isdir(self.selectorbase + '/' + file): self.linkentries.extend(self.processLinkFile(self.selectorbase + '/' + file)) return 0 else: return 0 # A "dot dir" -- ignore. return 1 # Not a dot file -- return true else: return 0 # Parent returned 0, do the same. def prep_entriesappend(self, file, handler, fileentry): """Overridden to process .cap files and modify extensions. This is called by the parent's prepare to append an entry to the list. Here, we check to see if there's a .cap file right before adding it.""" global extstrip if extstrip == None: extstrip = self.config.get("handlers.UMN.UMNDirHandler", "extstrip") if extstrip != 'none' and \ isinstance(handler, FileHandler): if extstrip == 'full' or \ (extstrip == 'nonencoded' and not fileentry.getencoding()): # If it's a file, has a MIME type, and we know about it.. fileentry.setname( pygopherd.fileext.extstrip(file, fileentry.getencodedmimetype() or fileentry.getmimetype())) capfilename = self.selectorbase + '/.cap/' + file try: capinfo = self.processLinkFile(capfilename, fileentry.getselector()) if len(capinfo) >= 1: # We handle one and only one entry. if capinfo[0].gettype() == 'X' or capinfo[0].gettype() == '-': return # Type X -- don't append. else: self.mergeentries(fileentry, capinfo[0]) except IOError: # Ignore no capfile situation pass DirHandler.prep_entriesappend(self, file, handler, fileentry) def MergeLinkFiles(self): """Called to merge the files from .Links and .names into the objects obtained by walking the directory. According to UMN code, we ONLY merge if the Path starts with ./ or ~/ in the file. This is set in the getneedsmerge() attribute. If that attribute is not set, don't even bother with it -- just add.""" # For faster matching, make a dictionary out of the list. fileentriesdict = {} for entry in self.fileentries: fileentriesdict[entry.selector] = entry for linkentry in self.linkentries: if not linkentry.getneedsmerge(): self.fileentries.append(linkentry) continue if fileentriesdict.has_key(linkentry.selector): if linkentry.gettype() == 'X': # It's special code to hide something. self.fileentries.remove(fileentriesdict[linkentry.selector]) else: self.mergeentries(fileentriesdict[linkentry.selector], linkentry) else: self.fileentries.append(linkentry) def mergeentries(self, old, new): """Takes the set fields from new and modifies old to have their value.""" for field in ['selector', 'type', 'name', 'host', 'port']: if getattr(new, field): setattr(old, field, getattr(new, field)) for field in new.geteadict().keys(): old.setea(field, new.getea(field)) def processLinkFile(self, filename, capfilepath = None): """Processes a link file. If capfilepath is set, it should be the equivolent of the Path= in a .names file.""" linkentries = [] fd = self.vfs.open(filename, "rt") while 1: nextstep, entry = self.getLinkItem(fd, capfilepath) if entry: linkentries.append(entry) if nextstep == 'stop': break return linkentries def getLinkItem(self, fd, capfilepath = None): """This is an almost exact clone of UMN's GSfromLink function.""" entry = LinkEntry(self.entry.selector, self.config) nextstep = 'continue' done = {'path' : 0, 'type' : 0, 'name' : 0, 'host' : 0, 'port' : 0} if capfilepath != None: entry.setselector(capfilepath) done['path'] = 1 while 1: line = fd.readline() if not line: nextstep = 'stop' break line = line.strip() # Empty. if len(line) == 0: break # Comment. if line[0] == '#': if done['path']: break else: continue # Type. if line[0:5] == "Type=": entry.settype(line[5]) # FIXME: handle if line[6] is + or ? done['type'] = 1 elif line[0:5] == "Name=": entry.setname(line[5:]) done['name'] = 1 elif line[0:5] == "Path=": pathname = line[5:] if len(pathname) and pathname[-1] == '/': pathname = pathname[0:-1] if len(line) >= 7 and (line[5:7] == './' or line[5:7] == '~/'): # Handle ./: make full path. entry.setselector(self.selectorbase + "/" + pathname[2:]) entry.setneedsmerge(1) elif len(pathname) and pathname[0] != '/': entry.setselector(pathname) entry.setneedsabspath(1) else: entry.setselector(pathname) done['path'] = 1 elif line[0:5] == 'Host=': if line[5:] != '+': entry.sethost(line[5:]) done['host'] = 1 elif line[0:5] == 'Port=': if line[5:] != '+': entry.setport(int(line[5:])) done['port'] = 1 elif line[0:5] == 'Numb=': entry.setnum(int(line[5:])) elif line[0:9] == 'Abstract=': abstractstr = "" abstractline = line[9:] while len(abstractline) and abstractline[-1] == "\\": abstractstr += abstractline[0:-1] + "\n" abstractline = fd.readline().strip() abstractstr += abstractline if abstractstr: entry.setea('ABSTRACT', abstractstr) elif line[0:6] == 'Admin=' or \ line[0:4] == 'URL=' or \ line[0:4] == 'TTL=': pass else: break ### FIXME: Handle Admin, URL, TTL if done['path']: if entry.getneedsabspath() and \ entry.gethost() == None and entry.getport() == None: entry.setselector(os.path.normpath(self.selectorbase + "/" + entry.getselector())) return (nextstep, entry) return (nextstep, None) def sgn(self, a): """Returns -1 if less than 0, 1 if greater than 0, and 0 if equal to zero.""" if a == 0: return 0 if a < 0: return -1 return 1 def entrycmp(self, entry1, entry2): """This function implements an exact replica of UMN behavior GSqsortcmp() behavior.""" if entry1.name == None: return 1 if entry2.name == None: return -1 e1num = entry1.getnum(0) e2num = entry2.getnum(0) # Equal numbers or no numbers: sort by title. if e1num == e2num: return cmp(entry1.name, entry2.name) # Same signs: use plain numeric comparison. if (self.sgn(e1num) == self.sgn(e2num)): return cmp(e1num, e2num) # Different signs: other comparison. if e1num > e2num: return -1 else: return 1 pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/handlers/ZIP.py0000664000000000000000000006253510762620505017672 0ustar # pygopherd -- Gopher-based protocol server in Python # module: ZIP transparent handling # Copyright (C) 2003 John Goerzen # # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import re, time, stat, unittest, os.path, struct, types, shelve, marshal from StringIO import StringIO from pygopherd import zipfile class MarshalingShelf(shelve.Shelf): def __getitem__(self, key): return marshal.loads(self.dict[key]) def __setitem__(self, key, value): self.dict[key] = marshal.dumps(value) class DbfilenameShelf(MarshalingShelf): def __init__(self, filename, flag='c'): import anydbm MarshalingShelf.__init__(self, anydbm.open(filename, flag)) def shelveopen(filename, flag='c'): return DbfilenameShelf(filename, flag) UNX_IFMT = 0170000L UNX_IFLNK = 0120000L from pygopherd.handlers import base class VFS_Zip(base.VFS_Real): def __init__(self, config, chain, zipfilename): self.config = config self.chain = chain self.zipfilename = zipfilename self.entrycache = {} self.badcache = {} self._initzip() def _getcachefilename(self): (dir, file) = os.path.split(self.zipfilename) return os.path.join(dir, '.cache.pygopherd.zip.' + file) def _initcache(self): """Returns 1 if a cache was found existing; 0 if not.""" filename = self._getcachefilename() if isinstance(self.chain, base.VFS_Real) and \ self.chain.iswritable(filename): fspath = self.chain.getfspath(filename) zipfilemtime = self.chain.stat(self.zipfilename)[stat.ST_MTIME] try: cachemtime = self.chain.stat(filename)[stat.ST_MTIME] except OSError: self._createcache(fspath) return 0 if zipfilemtime > cachemtime: self._createcache(fspath) return 0 try: self.dircache = shelveopen(fspath, 'r') except: self._createcache(fspath) return 0 return 1 def _createcache(self, fspath): self.dircache = {} try: self.dbdircache = shelveopen(fspath, 'n') except e: GopherExceptions.log(e, handler = self) return 0 def _savecache(self): if not hasattr(self, 'dbdircache'): # createcache was somehow unsuccessful return for (key, value) in self.dircache.iteritems(): self.dbdircache[key] = value def _initzip(self): zipfd = self.chain.open(self.zipfilename) self.zip = zipfile.ZipReader(zipfd) if not self._initcache(): # For reloading an existing one. Must be called before _cachedir. self._cachedir() self._savecache() self.dbdircache.close() # Flush it out def _isentryincache(self, fspath): try: self._getcacheentry(fspath) return 1 except KeyError: return 0 def _getcacheentry(self, fspath): return self.dircache[self._getcacheinode(fspath)] def _getcacheinode(self, fspath): inode = '0' if fspath == '': return inode (dir, file) = os.path.split(fspath) if dir in self.entrycache: return self.entrycache[dir][file] elif dir in self.badcache: raise KeyError, "Call for %s: directory %s non-existant" % (fspath, dir) workingdir = '' for item in fspath.split('/'): # right now, directory holds the directory from the *last* iteration. directory = self.dircache[inode] if type(directory) != types.DictType: raise KeyError, "Call for %s: couldn't find %s" % (fspath, item) self.entrycache[workingdir] = directory workingdir = os.path.join(workingdir, item) try: # Now, inode holds the inode number. inode = directory[item] except KeyError: self.badcache[workingdir] = 1 raise KeyError, "Call for %s: Couldn't find %s" % (fspath, item) return inode def _cachedir(self): symlinkinodes = [] nextinode = 1 self.zip.GetContents() self.dircache = {'0': {}} for (file, location) in self.zip.locationmap.iteritems(): info = self.zip.getinfo(file) (dir, filename) = os.path.split(file) if dir == '/': dir == '' dirlevel = self.dircache['0'] for level in dir.split('/'): if level == '': continue if not dirlevel.has_key(level): self.dircache[str(nextinode)] = {} dirlevel[level] = str(nextinode) nextinode += 1 dirlevel = self.dircache[dirlevel[level]] if len(filename): if self._islinkinfo(info): symlinkinodes.append({'dirlevel': dirlevel, 'filename': filename, 'pathname': file, 'dest': self._readlinkfspath(file)}) else: dirlevel[filename] = str(nextinode) self.dircache[str(nextinode)] = location nextinode += 1 lastsymlinklen = 0 while len(symlinkinodes) and len(symlinkinodes) != lastsymlinklen: lastsymlinklen = len(symlinkinodes) newsymlinkinodes = [] for item in symlinkinodes: if item['dest'][0] == '/': dest = item['dest'][1:] else: dest = os.path.join(os.path.dirname(item['pathname']), item['dest']) dest = os.path.normpath(dest) if self._isentryincache(dest): item['dirlevel'][item['filename']] = \ self._getcacheinode(dest) else: newsymlinkinodes.append(item) symlinkinodes = newsymlinkinodes def _islinkattr(self, attr): str = struct.pack('L', attr) str2 = str[2:5] + str[0:2] result = struct.unpack('L', str2)[0] return (result & UNX_IFMT) == UNX_IFLNK def _islinkinfo(self, info): if type(info) == types.DictType: return 0 return self._islinkattr(info.external_attr) def _readlinkfspath(self, fspath): # Since only called from the cache thing, this isn't needed. #if not self._islinkfspath(fspath): # raise ValueError, "Readlinkfspath called on %s which is not a link" % fspath return self.zip.read(fspath) def _readlink(self, selector): return self._readlinkfspath(self, self._getfspathfinal(selector)) def iswritable(self, selector): return 0 def unlink(self, selector): raise NotImplementedError, "VFS_ZIP cannot unlink files." def _getfspathfinal(self, selector): # Strip off the filename part. selector = selector[len(self.zipfilename):] if selector.startswith('/'): selector = selector[1:] if selector.endswith('/'): selector = selector[:-1] return selector def _transformlink(self, fspath): while self._islinkfspath(fspath): linkdest = self._readlinkfspath(fspath) if linkdest.startswith('/'): fspath = os.path.normpath(linkdest)[1:] else: fspath = os.path.join(os.path.dirname(fspath), linkdest) fspath = os.path.normpath(fspath) return fspath def getfspath(self, selector): # We can skip the initial part -- it just contains the start of # the path. return self._getfspathfinal(selector) def stat(self, selector): fspath = self.getfspath(selector) try: zi = self._getcacheentry(fspath) except KeyError: raise OSError, "Entry %s does not exist in %s" %\ (selector, self.zipfilename) if type(zi) == types.DictType: # It's a directory. return (16877, # mode 0, # inode 0, # device 3, # links 0, # uid 0, # gid 0, # size 0, # access time 0, # modification time 0) # change time zi = self.zip.getinfofrompos(zi) zt = zi.date_time modtime = time.mktime(zt + (0, 0, -1)) return (33188, # mode 0, # inode 0, # device 1, # links 0, # uid 0, # gid zi.file_size, # size modtime, # access time modtime, # modification time modtime) # change time def isdir(self, selector): fspath = self.getfspath(selector) try: item = self._getcacheentry(fspath) except KeyError: return 0 return type(item) == types.DictType def isfile(self, selector): fspath = self.getfspath(selector) try: item = self._getcacheentry(fspath) except KeyError: return 0 return type(item) != types.DictType def exists(self, selector): fspath = self.getfspath(selector) return self._isentryincache(fspath) def _open(self, fspath): return self.zip.open_pos(self._getcacheentry(fspath)) def open(self, selector, *args, **kwargs): fspath = self.getfspath(selector) try: item = self._getcacheentry(fspath) except KeyError: raise IOError, "Request to open %s, which does not exist" % selector if type(item) == types.DictType: raise IOError, "Request to open %s, which is a directory (%s)" % (selector, str(item)) return self.zip.open_pos(item) def listdir(self, selector): fspath = self.getfspath(selector) try: retobj = self._getcacheentry(fspath) except KeyError: raise OSError, "listdir on %s (%s) failed: no such file or directory" % (selector, fspath) if type(retobj) != types.DictType: raise OSError, "listdir on %s failed: that is a file, not a directory. Got %s" % (selector, str(retobj)) return retobj.keys() #class TestVFS_Zip_huge(unittest.TestCase): class DISABLED_TestVFS_Zip_huge: def setUp(self): from pygopherd import testutil from pygopherd.protocols.rfc1436 import GopherProtocol self.config = testutil.getconfig() self.rfile = StringIO("/testfile.txt\n") self.wfile = StringIO() self.logfile = testutil.getstringlogger() self.handler = testutil.gettestinghandler(self.rfile, self.wfile, self.config) self.server = self.handler.server self.proto = GopherProtocol("/testfile.txt\n", self.server, self.handler, self.rfile, self.wfile, self.config) self.config.set("handlers.ZIP.ZIPHandler", "enabled", 'true') from pygopherd.handlers import HandlerMultiplexer HandlerMultiplexer.handlers = None handlerlist = self.config.get("handlers.HandlerMultiplexer", "handlers") handlerlist = handlerlist.strip() handlerlist = handlerlist[0] + 'ZIP.ZIPHandler, ' + handlerlist[1:] self.config.set("handlers.HandlerMultiplexer", "handlers", handlerlist) def testlistdir1(self): from pygopherd.protocols.rfc1436 import GopherProtocol self.proto = GopherProtocol("/foo.zip\n", self.server, self.handler, self.rfile, self.wfile, self.config) self.proto.handle() def testlistdir2(self): from pygopherd.protocols.rfc1436 import GopherProtocol self.proto = GopherProtocol("/foo.zip/lib\n", self.server, self.handler, self.rfile, self.wfile, self.config) self.proto.handle() def testlistdir3(self): from pygopherd.protocols.rfc1436 import GopherProtocol self.proto = GopherProtocol("/foo.zip/lib/dpkg/info\n", self.server, self.handler, self.rfile, self.wfile, self.config) self.proto.handle() def testopen1(self): from pygopherd.protocols.rfc1436 import GopherProtocol self.proto = GopherProtocol("/foo.zip/lib/dpkg/info/dpkg.list\n", self.server, self.handler, self.rfile, self.wfile, self.config) self.proto.handle() def testopen2(self): from pygopherd.protocols.rfc1436 import GopherProtocol self.proto = GopherProtocol("/foo.zip/games/bsdgames/snake.log\n", self.server, self.handler, self.rfile, self.wfile, self.config) self.proto.handle() def testopen3(self): from pygopherd.protocols.rfc1436 import GopherProtocol self.proto = GopherProtocol("/foo.zip/www/apache2-default/manual/platforms/index.html\n", self.server, self.handler, self.rfile, self.wfile, self.config) self.proto.handle() class TestVFS_Zip(unittest.TestCase): def setUp(s): from ConfigParser import ConfigParser s.config = ConfigParser() s.config.add_section('pygopherd') s.config.set("pygopherd", "root", os.path.abspath('testdata')) s.real = base.VFS_Real(s.config) s.z = VFS_Zip(s.config, s.real, '/testdata.zip') s.z2 = VFS_Zip(s.config, s.real, '/testdata2.zip') s.zs = VFS_Zip(s.config, s.real, '/symlinktest.zip') def test_listdir(s): m1 = s.z.listdir('/testdata.zip') m2 = s.z2.listdir('/testdata2.zip') m1.sort() m2.sort() assert 'pygopherd' in m1 s.assertEquals(m1, m2) s.assertEquals(m1, ['.abstract', 'README', 'pygopherd', 'testarchive.tar', 'testarchive.tar.gz', 'testarchive.tgz', 'testfile.txt', 'testfile.txt.gz', 'testfile.txt.gz.abstract']) m1 = s.z.listdir('/testdata.zip/pygopherd') m2 = s.z2.listdir('/testdata2.zip/pygopherd') m1.sort() m2.sort() s.assertEquals(m1, m2 + ['ziponly']) s.assertEquals(m1, ['pipetest.sh', 'pipetestdata', 'ziponly']) def test_needschain(s): return assert s.z._needschain('/testfile.txt') assert s.z._needschain('/foo/testdata.zip') assert not s.z._needschain('/testdata.zip') assert not s.z._needschain('/testdata.zip/foo') assert not s.z._needschain('/testdata.zip/foo/bar') def test_iswritable(s): assert not s.z.iswritable('/testdata.zip') assert not s.z.iswritable('/testdata.zip/README') assert not s.z.iswritable('/testdata.zip/pygopherd') #assert s.z.iswritable('/README') #assert s.z.iswritable('/.foo') def test_getfspath(s): s.assertEquals(s.z.getfspath('/testdata.zip/foo'), 'foo') s.assertEquals(s.z.getfspath('/testdata.zip'), '') s.assertEquals(s.z.getfspath('/testdata.zip/foo/bar'), 'foo/bar') def test_stat(s): s.assertRaises(OSError, s.z.stat, '/testdata.zip/nonexistant') #s.assertRaises(OSError, s.z.stat, '/nonexistant') #assert stat.S_ISREG(s.z.stat('/testfile.txt')[0]) assert stat.S_ISDIR(s.z.stat('/testdata.zip')[0]) assert stat.S_ISREG(s.z.stat('/testdata.zip/README')[0]) assert stat.S_ISDIR(s.z.stat('/testdata.zip/pygopherd')[0]) assert stat.S_ISDIR(s.z2.stat('/testdata2.zip/pygopherd')[0]) assert stat.S_ISREG(s.z.stat('/testdata.zip/pygopherd/pipetest.sh')[0]) assert stat.S_ISREG(s.z2.stat('/testdata2.zip/pygopherd/pipetest.sh')[0]) def test_isdir(s): assert not s.z.isdir('/testdata.zip/README') assert not s.z2.isdir('/testdata.zip/README') assert s.z.isdir('/pygopherd') assert s.z.isdir('/testdata.zip/pygopherd') assert s.z2.isdir('/testdata2.zip/pygopherd') assert s.z.isdir('/testdata.zip') def test_isfile(s): assert s.z.isfile('/testdata.zip/README') assert not s.z.isfile('/testdata.zip') assert not s.z.isfile('/testdata.zip/pygopherd') assert not s.z2.isfile('/testdata2.zip/pygopherd') assert s.z.isfile('/testdata.zip/.abstract') def test_exists(s): assert s.z.exists('/README') assert not s.z.exists('/READMEnonexistant') assert s.z.exists('/testdata.zip') assert s.z.exists('/testdata.zip/README') assert s.z.exists('/testdata.zip/pygopherd') assert s.z2.exists('/testdata2.zip/pygopherd') #assert not s.z2.exists('/testdata.zip/pygopherd') def test_symlinkexists(s): assert s.zs.exists('/symlinktest.zip/real.txt') assert s.zs.exists('/symlinktest.zip/linked.txt') assert s.zs.exists('/symlinktest.zip/subdir/linktosubdir2') def test_symlinkgetfspath(s): s.assertEquals(s.zs.getfspath('/symlinktest.zip'), '') s.assertEquals(s.zs.getfspath('/symlinktest.zip/real.txt'), 'real.txt') s.assertEquals(s.zs.getfspath('/symlinktest.zip/subdir'), 'subdir') s.assertEquals(s.zs.getfspath('/symlinktest.zip/subdir2/real2.txt'), 'subdir2/real2.txt') def test_symlink_listdir(s): m1 = s.zs.listdir('/symlinktest.zip') m1.sort() s.assertEquals(m1, ['linked.txt', 'linktosubdir', 'real.txt', 'subdir', 'subdir2']) tm2 = ['linked2.txt', 'linkedabs.txt', 'linkedrel.txt', 'linktoself', 'linktosubdir2'] m2 = s.zs.listdir('/symlinktest.zip/subdir') m2.sort() s.assertEquals(m2, tm2) m2 = s.zs.listdir('/symlinktest.zip/linktosubdir') m2.sort() s.assertEquals(m2, tm2) s.assertRaises(OSError, s.zs.listdir, '/symlinktest.zip/nonexistant') s.assertRaises(OSError, s.zs.listdir, '/symlinktest.zip/real.txt') s.assertRaises(OSError, s.zs.listdir, '/symlinktest.zip/linktosubdir/linkedrel.txt') m2 = s.zs.listdir('/symlinktest.zip/linktosubdir/linktoself/linktoself') m2.sort() s.assertEquals(m2, tm2) m3 = s.zs.listdir('/symlinktest.zip/linktosubdir/linktoself/linktosubdir2') s.assertEquals(m3, ['real2.txt']) def test_symlink_open(s): realtxt = "Test.\n" real2txt = "asdf\n" # Establish basis for tests is correct. s.assertEquals(s.zs.open('/symlinktest.zip/real.txt').read(), realtxt) s.assertEquals(s.zs.open('/symlinktest.zip/subdir2/real2.txt').read(), real2txt) # Now, run the tests. s.assertEquals(s.zs.open('/symlinktest.zip/subdir/linked2.txt').read(), real2txt) s.assertEquals(s.zs.open('/symlinktest.zip/linktosubdir/linked2.txt').read(), real2txt) s.assertEquals(s.zs.open('/symlinktest.zip/linktosubdir/linkedabs.txt').read(), realtxt) s.assertEquals(s.zs.open('/symlinktest.zip/linktosubdir/linktoself/linktoself/linktoself/linkedrel.txt').read(), realtxt) s.assertEquals(s.zs.open('/symlinktest.zip/subdir/linktosubdir2/real2.txt').read(), real2txt) s.assertRaises(IOError, s.zs.open, '/symlinktest.zip') s.assertRaises(IOError, s.zs.open, '/symlinktest.zip/subdir') s.assertRaises(IOError, s.zs.open, '/symlinktest.zip/linktosubdir') s.assertRaises(IOError, s.zs.open, '/symlinktest.zip/subdir/linktoself') s.assertRaises(IOError, s.zs.open, '/symlinktest.zip/linktosubdir/linktoself/linktosubdir2') def test_symlink_isdir(s): assert s.zs.isdir('/symlinktest.zip/subdir') assert s.zs.isdir('/symlinktest.zip/linktosubdir') assert not s.zs.isdir('/symlinktest.zip/linked.txt') assert not s.zs.isdir('/symlinktest.zip/real.txt') assert s.zs.isdir('/symlinktest.zip/subdir/linktoself') assert s.zs.isdir('/symlinktest.zip/subdir/linktosubdir2') assert s.zs.isdir('/symlinktest.zip/linktosubdir/linktoself/linktosubdir2') assert not s.zs.isdir('/symlinktest.zip/nonexistant') assert not s.zs.isdir('/symlinktest.zip/subdir/linkedrel.txt') assert s.zs.isdir('/symlinktest.zip') def test_symlink_isfile(s): assert s.zs.isfile('/symlinktest.zip/real.txt') assert not s.zs.isfile('/symlinktest.zip') assert not s.zs.isfile('/symlinktest.zip/subdir') assert not s.zs.isfile('/symlinktest.zip/linktosubdir') assert s.zs.isfile('/symlinktest.zip/linktosubdir/linkedrel.txt') assert s.zs.isfile('/symlinktest.zip/linktosubdir/linked2.txt') assert s.zs.isfile('/symlinktest.zip/subdir/linktoself/linktosubdir2/real2.txt') assert not s.zs.isfile('/symlinktest.zip/subdir/linktoself/linktosubdir2/real.txt') def test_open(s): s.assertRaises(IOError, s.z.open, '/testdata.zip/pygopherd') s.assertRaises(IOError, s.z2.open, '/testdata2.zip/pygopherd') s.assertRaises(IOError, s.z2.open, '/testdata.zip/pygopherd') assert s.z.open("/testdata.zip/.abstract") s.assertEquals(s.z.open('/testdata.zip/testfile.txt').read(), 'Test\n') shouldbe = "Word1\nWord2\nWord3\n" s.assertEquals(s.z.open('/testdata.zip/pygopherd/pipetestdata').read(), shouldbe) s.assertEquals(s.z2.open('/testdata2.zip/pygopherd/pipetestdata').read(), shouldbe) class ZIPHandler(base.BaseHandler): def canhandlerequest(self): """We can handle the request if it's a ZIP file, in our pattern, etc. """ if not self.config.getboolean("handlers.ZIP.ZIPHandler", "enabled"): return 0 pattern = re.compile(self.config.get("handlers.ZIP.ZIPHandler", "pattern")) basename = self.selector appendage = None while 1: if pattern.search(basename) and \ self.vfs.isfile(basename) and \ zipfile.is_zipfile(self.vfs.getfspath(basename)): self.basename = basename self.appendage = appendage return 1 if len(basename) == 0 or basename == '/' or basename == '.' or \ basename == './': return 0 (head, tail) = os.path.split(basename) if appendage != None: appendage = os.path.join(tail, appendage) else: appendage = tail basename = head def _makehandler(self): if hasattr(self, 'handler'): return vfs = VFS_Zip(self.config, self.vfs, self.basename) from pygopherd.handlers import HandlerMultiplexer self.handler = HandlerMultiplexer.getHandler(self.getselector(), self.searchrequest, self.protocol, self.config, vfs = vfs) def prepare(self): self._makehandler() self.handler.prepare() def isdir(self): return self.handler.isdir() def getdirlist(self): return self.handler.getdirlist() def write(self, wfile): self.handler.write(wfile) def getentry(self): self._makehandler() return self.handler.getentry() pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/handlers/gophermap.py0000664000000000000000000001001610762620505021175 0ustar # pygopherd -- Gopher-based protocol server in Python # module: Handling of gophermap directory files # Copyright (C) 2002 John Goerzen # # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import SocketServer import re import os, stat, os.path, mimetypes from pygopherd import protocols, gopherentry from pygopherd.handlers import base from stat import * class BuckGophermapHandler(base.BaseHandler): """Bucktooth selector handler. Adheres to the specification at gopher://gopher.floodgap.com:70/0/buck/dbrowse%3Ffaquse%201""" def canhandlerequest(self): """We can handle the request if it's for a directory AND the directory has a gophermap file.""" return self.statresult and ((S_ISDIR(self.statresult[ST_MODE]) and \ self.vfs.isfile(self.getselector() + '/gophermap')) or \ (S_ISREG(self.statresult[ST_MODE]) and \ self.getselector().endswith(".gophermap"))) def getentry(self): if not self.entry: self.entry = gopherentry.GopherEntry(self.selector, self.config) if (self.statresult and S_ISREG(self.statresult[ST_MODE]) and \ self.getselector().endswith(".gophermap")): self.entry.populatefromvfs(self.vfs, self.getselector()) else: self.entry.populatefromfs(self.getselector(), self.statresult, vfs = self.vfs) return self.entry def prepare(self): self.selectorbase = self.selector if self.selectorbase == '/': self.selectorbase = '' # Avoid dup slashes if self.getselector().endswith(".gophermap") and \ self.statresult and S_ISREG(self.statresult[ST_MODE]): self.rfile = self.vfs.open(self.getselector(), 'rb') else: self.rfile = self.vfs.open(self.selectorbase + '/gophermap', 'rb') self.entries = [] selectorbase = self.selectorbase while 1: line = self.rfile.readline() if not line: break if re.search("\t", line): # gophermap link args = map(lambda arg: arg.strip(), line.split("\t")) if len(args) < 2 or not len(args[1]): args[1] = args[0][1:] # Copy display string to selector selector = args[1] if selector[0] != '/': # Relative link selector = selectorbase + '/' + selector entry = gopherentry.GopherEntry(selector, self.config) entry.type = args[0][0] entry.name = args[0][1:] if len(args) >= 3 and len(args[2]): entry.host = args[2] if len(args) >= 4 and len(args[3]): entry.port = int(args[3]) if entry.gethost() == None and entry.getport() == None: # If we're using links on THIS server, try to fill # it in for gopher+. if self.vfs.exists(selector): entry.populatefromvfs(self.vfs, selector) self.entries.append(entry) else: # Info line line = line.strip() self.entries.append(gopherentry.getinfoentry(line, self.config)) def isdir(self): return 1 def getdirlist(self): return self.entries pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/handlers/virtual.py0000664000000000000000000000336210762620505020707 0ustar from pygopherd import gopherentry from stat import * from pygopherd.handlers.base import BaseHandler import os class Virtual(BaseHandler): """Implementation of virtual folder support. This class will probably not be instantiated itself but it is designed to be instantiated by its children.""" def __init__(self, selector, searchrequest, protocol, config, statresult, vfs = None): BaseHandler.__init__(self, selector, searchrequest, protocol, config, statresult, vfs) # These hold the "real" and the "argument" portion of the selector, # respectively. self.selectorreal = None self.selectorargs = None if self.selector.find("?") != -1 or self.selector.find("|") != -1: try: i = self.selector.index("?") except: i = self.selector.index("|") self.selectorreal = self.selector[0:i] self.selectorargs = self.selector[i+1:] # Now, retry the stat with the real selector. self.statresult = None try: self.statresult = self.vfs.stat(self.selectorreal) except OSError: pass else: # Best guess. self.selectorreal = self.selector def genargsselector(self, args): """Returns a string representing a full selector to this resource, with the given string of args. This is a selector that can be passed back to clients.""" return self.getselector() + "|" + args def getselector(self): """Overridden to return the 'real' portion of the selector.""" return self.selectorreal pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/handlers/file.py0000664000000000000000000000717710762620505020150 0ustar # pygopherd -- Gopher-based protocol server in Python # module: regular file handling # Copyright (C) 2002 John Goerzen # # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import SocketServer import re import os, stat, os.path, mimetypes from pygopherd import protocols, gopherentry from pygopherd.handlers import base import pygopherd.pipe from stat import * class FileHandler(base.BaseHandler): def canhandlerequest(self): """We can handle the request if it's for a file.""" return self.statresult and S_ISREG(self.statresult[ST_MODE]) def getentry(self): if not self.entry: self.entry = gopherentry.GopherEntry(self.selector, self.config) self.entry.populatefromfs(self.getselector(), self.statresult, vfs = self.vfs) return self.entry def write(self, wfile): self.vfs.copyto(self.getselector(), wfile) decompressors = None decompresspatt = None class CompressedFileHandler(FileHandler): def canhandlerequest(self): self.initdecompressors() # It's OK to call just canhandlerequest() since we're not # overriding the security or isrequestforme functions. return FileHandler.canhandlerequest(self) and \ self.getentry().realencoding and \ decompressors.has_key(self.getentry().realencoding) and \ re.search(decompresspatt, self.selector) def getentry(self): if not self.entry: self.entry = FileHandler.getentry(self) self.entry.realencoding = None if self.entry.getencoding() and \ decompressors.has_key(self.entry.getencoding()) and \ self.entry.getencodedmimetype(): # When the client gets it, there will not be # encoding. Therefore, we remove the encoding and switch # to the real MIME type. self.entry.mimetype = self.entry.getencodedmimetype() self.entry.encodedmimetype = None self.entry.realencoding = self.entry.encoding self.entry.encoding = None self.entry.type = self.entry.guesstype() return self.entry def initdecompressors(self): global decompressors, decompresspatt if decompressors == None: decompressors = \ eval(self.config.get("handlers.file.CompressedFileHandler", "decompressors")) decompresspatt = \ self.config.get("handlers.file.CompressedFileHandler", "decompresspatt") def write(self, wfile): global decompressors decompprog = decompressors[self.getentry().realencoding] pygopherd.pipe.pipedata_unix(decompprog, [decompprog], childstdin = self.rfile, childstdout = wfile, pathsearch = 1) self.rfile.close() self.rfile = None pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/handlers/dir.py0000664000000000000000000001152010762620505017772 0ustar # pygopherd -- Gopher-based protocol server in Python # module: regular directory handling # Copyright (C) 2002 John Goerzen # # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import SocketServer import re import os, stat, os.path, mimetypes, time from pygopherd import protocols, gopherentry, handlers from pygopherd.handlers import base from stat import * import cPickle cachetime = None cachefile = None class DirHandler(base.BaseHandler): def canhandlerequest(self): """We can handle the request if it's for a directory.""" return self.statresult and S_ISDIR(self.statresult[ST_MODE]) def getentry(self): if not self.entry: self.entry = gopherentry.GopherEntry(self.selector, self.config) self.entry.populatefromfs(self.getselector(), self.statresult, vfs = self.vfs) return self.entry def prep_initfiles(self): "Initialize the list of files. Ignore the files we're suppoed to." self.files = [] dirfiles = self.vfs.listdir(self.getselector()) ignorepatt = self.config.get("handlers.dir.DirHandler", "ignorepatt") for file in dirfiles: if self.prep_initfiles_canaddfile(ignorepatt, self.selectorbase + '/' + file, file): self.files.append(file) def prep_initfiles_canaddfile(self, ignorepatt, pattern, file): return not re.search(ignorepatt, pattern) def prep_entries(self): "Generate entries from the list." self.fileentries = [] for file in self.files: # We look up the appropriate handler for this object, and ask # it to give us an entry object. handler = handlers.HandlerMultiplexer.\ getHandler(self.selectorbase + '/' \ + file, self.searchrequest, self.protocol, self.config, vfs = self.vfs) fileentry = handler.getentry() self.prep_entriesappend(file, handler, fileentry) def prep_entriesappend(self, file, handler, fileentry): """Subclasses can override to do post-processing on the entry while we still have the filename around. IE, for .cap files.""" self.fileentries.append(fileentry) def prepare(self): # Initialize some variables. self.selectorbase = self.selector if self.selectorbase == '/': self.selectorbase = '' # Avoid dup slashes if self.loadcache(): # No need to do anything else. return 0 # Did nothing. self.prep_initfiles() # Sort the list. self.files.sort() self.prep_entries() return 1 # Did something. def isdir(self): return 1 def getdirlist(self): self.savecache() return self.fileentries def loadcache(self): global cachetime, cachefile self.fromcache = 0 if cachetime == None: cachetime = self.config.getint("handlers.dir.DirHandler", "cachetime") cachefile = self.config.get("handlers.dir.DirHandler", "cachefile") cachename = self.selector + "/" + cachefile if not self.vfs.iswritable(cachename): return 0 try: statval = self.vfs.stat(cachename) except OSError: return 0 if (time.time() - statval[stat.ST_MTIME] < cachetime): fp = self.vfs.open(cachename, "rb") self.fileentries = cPickle.load(fp) fp.close() self.fromcache = 1 return 1 return 0 def savecache(self): global cachefile if self.fromcache: # Don't resave the cache. return if not self.vfs.iswritable(self.selector + "/" + cachefile): return try: fp = self.vfs.open(self.selector + "/" + cachefile, "wb") cPickle.dump(self.fileentries, fp, 1) fp.close() except IOError: pass pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/handlers/base.py0000664000000000000000000001470410762620505020135 0ustar # pygopherd -- Gopher-based protocol server in Python # module: base handler code # Copyright (C) 2002 John Goerzen # # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import SocketServer import re import os, stat, os.path, mimetypes from pygopherd import protocols, gopherentry rootpath = None class VFS_Real: def __init__(self, config, chain = None): """This implementation does not chain.""" self.config = config def iswritable(self, selector): return 1 def unlink(self, selector): os.unlink(self.getfspath(selector)) def stat(self, selector): return os.stat(self.getfspath(selector)) def isdir(self, selector): return os.path.isdir(self.getfspath(selector)) def isfile(self, selector): return os.path.isfile(self.getfspath(selector)) def exists(self, selector): return os.path.exists(self.getfspath(selector)) def open(self, selector, *args, **kwargs): return apply(open, (self.getfspath(selector),) + args, kwargs) def listdir(self, selector): return os.listdir(self.getfspath(selector)) def getrootpath(self): global rootpath if not rootpath: rootpath = self.config.get("pygopherd", "root") return rootpath def getfspath(self, selector): """Gets the filesystem path corresponding to the selector.""" fspath = self.getrootpath() + selector # Strip off trailing slash. if fspath[-1] == '/': fspath = fspath[0:-1] return fspath def copyto(self, name, fd): rfile = self.open(name, 'rb') while 1: data = rfile.read(4096) if not len(data): break fd.write(data) rfile.close class BaseHandler: """Skeleton handler -- includes commonly-used routines.""" def __init__(self, selector, searchrequest, protocol, config, statresult, vfs = None): """Parameters are: selector -- requested selector. The selector must always start with a slash and never end with a slash UNLESS it is a one-char selector that contains only a slash. This should be handled by the default protocol. config -- config object.""" self.selector = selector self.searchrequest = searchrequest self.protocol = protocol self.config = config self.statresult = statresult self.fspath = None self.entry = None self.searchrequest = searchrequest if not vfs: self.vfs = VFS_Real(self.config) else: self.vfs = vfs def isrequestforme(self): """Called by multiplexers or other handlers. The default implementation is just: return self.isrequestsecure() and self.canhandlerequest() """ return self.isrequestsecure() and self.canhandlerequest() def isrequestsecure(self): """An auxiliary to canhandlerequest. In order for this handler to be selected for handling a given request, both the securitycheck and the canhandlerequest should be invoked. The securitycheck is intended to be a short, small, quick check -- usually not even looking at the filesystem. Here is a default. Returns true if the request is secure, false if not. By default, we eliminate ./, ../, and // This is split out from canhandlerequest becase it could be too easy to forget about it there.""" return (self.selector.find("./") == -1) and \ (self.selector.find("..") == -1) and \ (self.selector.find("//") == -1) and \ (self.selector.find(".\\") == -1) and \ (self.selector.find("\\\\") == -1) and \ (self.selector.find("\0") == -1) def canhandlerequest(self): """Decides whether or not a given request is valid for this handler. Should be overridden by all subclasses.""" return 0 def getentry(self): """Returns an entry object for this request.""" if not self.entry: self.entry = gopherentry.GopherEntry(self.selector, self.config) return self.entry def getfspath(self): if not self.fspath: self.fspath = self.vfs.getfspath(self.getselector()) return self.fspath def getselector(self): """Returns the selector we are handling.""" return self.selector def gethandler(self): """Returns the handler to use to process this request. For all but special cases (rewriting handleres, for instance), this should return self.""" return self ## The next three are the publically-exposed interface -- the ones ## called by things other than handlers. def prepare(self): """Prepares for a write. Ie, opens a file. This is used so that the protocols can try to detect an error before transmitting a result. Must always be called before write.""" pass def isdir(self): """Returns true if this handler is handling a directory; false otherwise. Not valid unless prepare has been called.""" return 0 def write(self, wfile): """Writes out the request if isdir() returns false. You should NOT call write if isdir() returns true! Should be overridden by files.""" if self.isdir(): raise Exception, "Attempt to use write for a directory" def getdirlist(self): """Returns a list-like object (list, iterator, tuple, generator, etc) that contains as its elements the gopherentry objects corresponding to each item in the directory. Valid only if self.isdir() returns true.""" if not self.isdir(): raise Exception, "Attempt to use getdir for a file." return [] pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/handlers/__init__.py0000664000000000000000000000205310762620505020754 0ustar # pygopherd -- Gopher-based protocol server in Python # module: directory marker # Copyright (C) 2002, 2003 John Goerzen # # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA __all__ = ['base', 'dir', 'file', 'url', 'gophermap', 'UMN', 'ZIP', 'html', 'mbox', 'virtual', 'pyg', 'scriptexec', 'tal'] #import base, dir, file, gophermap, UMN, html, mbox, virtual, pyg #import scriptexec, url pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/handlers/url.py0000664000000000000000000000751510762620505020027 0ustar # pygopherd -- Gopher-based protocol server in Python # module: Special handling for URLs # Copyright (C) 2002 John Goerzen # # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import SocketServer import re import os, stat, os.path, mimetypes from pygopherd import protocols, gopherentry, handlers from pygopherd.handlers.base import BaseHandler class HTMLURLHandler(BaseHandler): """Will take requests for a URL-like selector and generate a HTML page redirecting people to the actual URL. This implementation adheres to the proposal as specified at http://www.complete.org/mailinglists/archives/gopher-200202/msg00033.html """ def isrequestsecure(self): """For URLs, it is valid to have .., //, etc in the URLs.""" return self.canhandlerequest() and \ self.selector.find("\0") == -1 and \ self.selector.find("\n") == -1 and \ self.selector.find("\t") == -1 and \ self.selector.find('"') == -1 and \ self.selector.find("\r") == -1 def canhandlerequest(self): """We can handle the request if it's for something that starts with http or https.""" return re.search("^(/|)URL:.+://", self.selector) def getentry(self): if not self.entry: self.entry = gopherentry.GopherEntry(self.selector, self.config) self.entry.name = self.selector self.entry.mimetype = 'text/html' self.entry.type = 'h' return self.entry # We have nothing to prepare. def write(self, wfile): url = self.selector[4:] # Strip off URL: if self.selector[0] == '/': url = self.selector[5:] outdoc = "\n" outdoc += '' % url outdoc += "\n" outdoc += """ You are following a link from gopher to a website. You will be automatically taken to the web site shortly. If you do not get sent there, plesae click """ outdoc += 'here ' % url outdoc += """to go to the web site.

The URL linked is:

""" outdoc += '%s' % (url, url) outdoc += """

Thanks for using gopher!

Document generated by pygopherd handlers.url.HTMLURLHandler """ wfile.write(outdoc) class URLTypeRewriter(BaseHandler): """Will take URLs that start with a file type (ie, /1/devel/offlineimap) and remove the type (/devel/offlineimap). Useful if you want to make relative links in both gopher and http space in a single document.""" def canhandlerequest(self): return len(self.selector) >= 3 and \ self.selector[0] == '/' and \ self.selector[2] == '/' def gethandler(self): handlerlist = [x for x in handlers.HandlerMultiplexer.handlers if x != URLTypeRewriter] return handlers.HandlerMultiplexer.getHandler(self.selector[2:], self.searchrequest, self.protocol, self.config, handlerlist) pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/handlers/html.py0000664000000000000000000000715210762620505020166 0ustar # pygopherd -- Gopher-based protocol server in Python # module: Special handling of HTML files # Copyright (C) 2002 John Goerzen # # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA from pygopherd.handlers.file import FileHandler import HTMLParser import SocketServer import re import os, stat, os.path, mimetypes from pygopherd import protocols, gopherentry from pygopherd.gopherentry import GopherEntry import htmlentitydefs from stat import * ########################################################################### # HTML File Handler # Sets the name of a file if it's HTML. ########################################################################### class HTMLTitleParser(HTMLParser.HTMLParser): def __init__(self): HTMLParser.HTMLParser.__init__(self) self.titlestr = "" self.readingtitle = 0 self.gotcompletetitle = 0 def handle_starttag(self, tag, attrs): if tag == 'title': self.readingtitle = 1 def handle_endtag(self, tag): if tag == 'title': self.gotcompletetitle = 1 self.readingtitle = 0 def handle_data(self, data): if self.readingtitle: self.titlestr += data def handle_entityref(self, name): """Handle things like & or > or <. If it's not in the dictionary, ignore it.""" if self.readingtitle and htmlentitydefs.entitydefs.has_key(name): self.titlestr += htmlentitydefs.entitydefs[name] class HTMLFileTitleHandler(FileHandler): """This class will set the title of a HTML document based on the HTML title. It is a clone of the UMN gsfindhtmltitle function.""" def canhandlerequest(self): if FileHandler.canhandlerequest(self): mimetype, encoding = mimetypes.guess_type(self.selector) return mimetype == 'text/html' else: return 0 def getentry(self): # Start with the entry from the parent. entry = FileHandler.getentry(self) parser = HTMLTitleParser() file = self.vfs.open(self.getselector(), "rt") try: while not parser.gotcompletetitle: line = file.readline() if not line: break parser.feed(line) parser.close() except HTMLParser.HTMLParseError: # Parse error? Stop parsing, go to here. We can still # return a title if the parse error happened after we got # the title. pass file.close() # OK, we've parsed the file and exited because of either an EOF # or a complete title (or error). Now, figure out what happened. if parser.gotcompletetitle: # Convert all whitespace sequences to a single space. # Removes newlines, tabs, etc. Good for presentation # and for security. title = re.sub('[\s]+', ' ', parser.titlestr) entry.setname(title) return entry pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/handlers/tal.py0000664000000000000000000001174110762620505020001 0ustar # pygopherd -- Gopher-based protocol server in Python # module: TAL file handling. # Copyright (C) 2002, 2003 John Goerzen # # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA try: from simpletal import simpleTAL, simpleTALES talavailable = 1 except: talavailable = 0 try: import logging haslogging = 1 except: haslogging = 0 if haslogging: import os try: hdlrFilename = os.path.join(os.environ['TEMP'], 'mylog.log') except: hdlrFilename = '/tmp/mylog.log' logger = logging.getLogger('simpleTAL.HTMLTemplateCompiler') hdlr = logging.FileHandler(hdlrFilename) formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') hdlr.setFormatter(formatter) logger.addHandler(hdlr) logger.setLevel(logging.INFO) from pygopherd.handlers.file import FileHandler from pygopherd import gopherentry import re, os.path class TALLoader: def __init__(self, vfs, path): self.vfs = vfs self.path = path def getpath(self): return self.path def getparent(self): if self.path == '/': return self else: return self.__class__(self.vfs, os.path.dirname(self.path)) def getchildrennames(self): return self.vfs.listdir(self.path) #def getchildren(self): # return [self.__class__(self.vfs, os.path.join(self.path, item)) \ # for item in self.getchildrennames()] def __getattr__(self, key): fq = os.path.join(self.path, key) if self.vfs.isfile(fq + ".html.tal"): templateFile = self.vfs.open(fq + ".html.tal") compiled = simpleTAL.compileHTMLTemplate(templateFile) templateFile.close() return compiled elif self.vfs.isdir(fq): return self.__class__(self.vfs, fq) else: raise AttributeError, "Key %s not found in %s" % (key, self.path) class RecursiveTALLoader(TALLoader): def __getattr__(self, key): if self.path == '/': # Already at the top -- can't recurse. return TALLoader.__getattr__(self, key) try: return TALLoader.__getattr__(self, key) except AttributeError: return self.getparent().__getattr__(self, key) class TALFileHandler(FileHandler): def canhandlerequest(self): """We can handle the request if it's for a file ending with .thtml.""" canhandle = FileHandler.canhandlerequest(self) and self.getselector().endswith(".tal") if not canhandle: return 0 self.talbasename = self.getselector()[:-4] self.allowpythonpath = 1 if self.config.has_option('handlers.tal.TALFileHandler', 'allowpythonpath'): self.allowpythonpath = self.config.getboolean('handlers.tal.TALFileHandler', 'allowpythonpath') return 1 def getentry(self): if not self.entry: self.entry = gopherentry.GopherEntry(self.selector, self.config) self.entry.populatefromfs(self.getselector(), self.statresult, vfs = self.vfs) assert self.entry.getencoding() == 'tal.TALFileHandler' # Remove the TAL encoding and revert to default. self.entry.mimetype = self.entry.getencodedmimetype() self.entry.encodedmimetype = None self.entry.realencoding = self.entry.encoding self.entry.encoding = None self.entry.type = self.entry.guesstype() return self.entry def write(self, wfile): rfile = self.vfs.open(self.getselector()) context = simpleTALES.Context(allowPythonPath = self.allowpythonpath) context.addGlobal("selector", self.getselector()) context.addGlobal('handler', self) context.addGlobal('entry', self.getentry()) context.addGlobal('talbasename', self.talbasename) context.addGlobal('allowpythonpath', self.allowpythonpath) context.addGlobal('protocol', self.protocol) context.addGlobal('root', TALLoader(self.vfs, '/')) context.addGlobal('rroot', RecursiveTALLoader(self.vfs, '/')) dirname = os.path.dirname(self.getselector()) context.addGlobal('dir', TALLoader(self.vfs, dirname)) context.addGlobal('rdir', RecursiveTALLoader(self.vfs, dirname)) template = simpleTAL.compileHTMLTemplate(rfile) rfile.close() template.expand(context, wfile) pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/handlers/scriptexec.py0000664000000000000000000000522410762620505021371 0ustar # pygopherd -- Gopher-based protocol server in Python # module: Script execution # Copyright (C) 2002 John Goerzen # # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA from pygopherd import protocols, gopherentry from pygopherd.handlers.base import BaseHandler, VFS_Real from pygopherd.handlers.virtual import Virtual import pygopherd.pipe from stat import * import imp, re, os class ExecHandler(Virtual): def canhandlerequest(self): # We ONLY handle requests from the real filesystem. return isinstance(self.vfs, VFS_Real) and \ self.statresult and S_ISREG(self.statresult[ST_MODE]) and \ (S_IMODE(self.statresult[ST_MODE]) & S_IXOTH) def getentry(self): entry = gopherentry.GopherEntry(self.getselector(), self.config) entry.settype('0') entry.setname(os.path.basename(self.getselector())) entry.setmimetype('text/plain') entry.setgopherpsupport(0) return entry def write(self, wfile): # We work on a separate thing to avoid contaminating our own # environment. Just saying newenv = os.environ would still # do that. newenv = {} for key in os.environ.keys(): newenv[key] = os.environ[key] newenv['SERVER_NAME'] = self.protocol.server.server_name newenv['SERVER_PORT'] = str(self.protocol.server.server_port) newenv['REMOTE_ADDR'] = self.protocol.requesthandler.client_address[0] newenv['REMOTE_PORT'] = str(self.protocol.requesthandler.client_address[1]) newenv['REMOTE_HOST'] = newenv['REMOTE_ADDR'] newenv['SELECTOR'] = self.selector newenv['REQUEST'] = self.getselector() if self.searchrequest: newenv['SEARCHREQUEST'] = self.searchrequest wfile.flush() args = [self.getfspath()] if self.selectorargs: args.extend(self.selectorags.split(' ')) pygopherd.pipe.pipedata(self.getfspath(), args, newenv, childstdout = wfile) pygopherd-2.0.18.3+nmu4ubuntu1/pygopherd/handlers/mbox.py0000664000000000000000000001462710762620505020174 0ustar # pygopherd -- Gopher-based protocol server in Python # module: Present a mbox file as if it were a folder. # Copyright (C) 2002, 2005 John Goerzen # # # 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; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import SocketServer import re import os, stat, os.path, mimetypes from pygopherd import protocols, gopherentry from pygopherd.handlers.virtual import Virtual from pygopherd.handlers.base import VFS_Real from mailbox import UnixMailbox, Maildir from stat import * ########################################################################### # Basic mailbox support ########################################################################### class FolderHandler(Virtual): def getentry(self): ## Return my own entry. if not self.entry: self.entry = gopherentry.GopherEntry(self.getselector(), self.config) self.entry.settype('1') self.entry.setname(os.path.basename(self.getselector())) self.entry.setmimetype('application/gopher-menu') self.entry.setgopherpsupport(0) return self.entry def prepare(self): self.entries = [] count = 1 while 1: message = self.mbox.next() if not message: break handler = MessageHandler(self.genargsselector(self.getargflag() + \ str(count)), self.searchrequest, self.protocol, self.config, None) self.entries.append(handler.getentry(message)) count += 1 def isdir(self): return 1 def getdirlist(self): return self.entries class MessageHandler(Virtual): def canhandlerequest(self): """We put MBOX-MESSAGE in here so we don't have to re-check the first line of the mbox file before returning a true or false result.""" if not self.selectorargs: return 0 msgnum = re.search('^' + self.getargflag() + '(\d+)$', self.selectorargs) if not msgnum: return 0 self.msgnum = int(msgnum.group(1)) self.message = None return 1 def getentry(self, message = None): """Set the message if called from, eg, the dir handler. Saves having to rescan the file. If not set, will figure it out.""" if not message: message = self.getmessage() if not self.entry: self.entry = gopherentry.GopherEntry(self.selector, self.config) self.entry.settype('0') self.entry.setmimetype('text/plain') self.entry.setgopherpsupport(0) subject = message.getheader('Subject', '') # Sanitize, esp. for continuations. subject = re.sub('\s+', ' ', subject) if subject: self.entry.setname(subject) else: self.entry.setname('') return self.entry def getmessage(self): if self.message: return self.message mbox = self.openmailbox() message = None for x in range(self.msgnum): message = mbox.next() self.message = message return self.message def prepare(self): self.canhandlerequest() # Init the vars def write(self, wfile): # Print out the headers first. for header in self.getmessage().headers: wfile.write(header) # Now the message body. self.rfile = self.getmessage().fp while 1: string = self.rfile.read(4096) if not len(string): break wfile.write(string) self.rfile.close() self.rfile = None ########################################################################### # Unix MBOX support ########################################################################### class MBoxFolderHandler(FolderHandler): def canhandlerequest(self): """Figure out if this is a handleable request.""" if self.selectorargs: return 0 if not (self.statresult and S_ISREG(self.statresult[ST_MODE])): return 0 try: fd = self.vfs.open(self.getselector(), "rt") startline = fd.readline() fd.close() return re.match(UnixMailbox._fromlinepattern, startline) except IOError: return 0 def prepare(self): self.rfile = self.vfs.open(self.getselector(), "rt") self.mbox = UnixMailbox(self.rfile) FolderHandler.prepare(self) def getargflag(self): return "/MBOX-MESSAGE/" class MBoxMessageHandler(MessageHandler): def getargflag(self): return "/MBOX-MESSAGE/" def openmailbox(self): fd = self.vfs.open(self.getselector(), "rt") return UnixMailbox(fd) ########################################################################### # Maildir support ########################################################################### class MaildirFolderHandler(FolderHandler): def canhandlerequest(self): if not isinstance(self.vfs, VFS_Real): return 0 if self.selectorargs: return 0 if not (self.statresult and S_ISDIR(self.statresult[ST_MODE])): return 0 return self.vfs.isdir(self.getselector() + "/new") and \ self.vfs.isdir(self.getselector() + "/cur") def prepare(self): self.mbox = Maildir(self.getfspath()) FolderHandler.prepare(self) def getargflag(self): return "/MAILDIR-MESSAGE/" class MaildirMessageHandler(MessageHandler): def getargflag(self): return "/MAILDIR-MESSAGE/" def openmailbox(self): return Maildir(self.getfspath()) pygopherd-2.0.18.3+nmu4ubuntu1/conf/0000775000000000000000000000000010762620505013767 5ustar pygopherd-2.0.18.3+nmu4ubuntu1/conf/pygopherd.conf0000664000000000000000000003656710762620505016660 0ustar ###################################################################### # OVERALL SETTINGS FOR PYGOPHERD ###################################################################### [pygopherd] ################################################## # Operating System / Overall Behavior ################################################## # Set this to true if you want the server to "detach" itself; that is, # to go into the background after it starts. detach = yes # If you want gopherd to write a PID file, set this to the location # where you want it. Otherwise, comment out this line. pidfile = /var/run/pygopherd.pid ################################################## # Network ################################################## # The server name to present to the world. If you do not specify it # here, Pygopherd will attempt to figure it out automatically. # This is used only to present to clients. It does not control # where the server listens. # # servername = gopher.example.com # The interface on which to listen. It should be an IP address or # a domain name. If specified, pygopherd will attempt to listen to # the specified port on only this interface -- useful if you are doing # virtual hosting. If not specified, pygopherd will listen on all # interfaces the OS provides. If in doubt, do not specify this. # # interface = gopher.example.com # What port to listen on. If not running as root, this must be # greater than 1024. port = 70 # Type of server to run. Valid options are ForkingTCPServer # and ThreadingTCPServer. ForkingTCPServer is highly recommended # for now. servertype = ForkingTCPServer # What port to *say* we're listening on. Most people should NOT # specify this. You might want to if you are using firewalling or # port forwarding and the port number is different to the world than # it is locally. # advertisedport = 70 # Do we timeout on client conections? HIGHLY RECOMMENDED! # Value is given in seconds. If given, any read or write that makes # no progress in this number of seconds will time out. timeout = 60 ################################################## # Data Handling ################################################## # You can add a header to every directory by creating a # .abstract file in that directory and filling it with the # information you like. This will then be rendered as a header # for the directory. This option controls this feature. Note: # for this to work, you must define a mapping to ABSTRACT in eaexts # below. abstract_headers = on # Individual files and folders can also have abstracts. You can # choose to have pygopherd render these abstracts in the directory # listing itself -- they'll appear beneath the menu name for the file. # You can set this option to any of three values: # # always -- always render these abstracts. # unsupported -- render them only for protocols that do not natively # support abstracts. Gopher+ is the only protocol that natively # supports them currently. # never -- never render these abstracts. abstract_entries = always ################################################## # Error handling ################################################## # If there is an error, you can decide whether or not to log a full # backtrace. A full backtrace will usually be needed to find the # problem. tracebacks = yes ################################################## # Security ################################################## ## Whether or not to use chroot. # This option is only valid if you are running pygopherd as root! usechroot = yes ## Username and groupname to setreuid/setregid to. Valid only if ## starting pygopherd as root. Comment out if you don't want this ## functionality. NOTE: DO NOT RUN AS ROOT UNLESS YOU USE THESE! BAD BAD BAD! setuid = gopher setgid = gopher ################################################## # Filesystem and MIME ################################################## # Where the documents are stored. root = /var/gopher # Location of a file to use to figure out MIME types. You can # specify multiple files here -- just separate them with a colon. # ALL of them that are found will be read. mimetypes = ./conf/mime.types:/etc/pygopherd/mime.types:/etc/mime.types # Encodings. You can use the default with the following syntax. The # mimetypex.encodings_map is {'.Z': 'compress', '.gz': 'gzip'}. # # For ease of use in the config file, we specify this as a list of # tuples. You can convert any hash to a list of tuples by using .items() # encoding = mimetypes.encodings_map.items() # You can override the default entirely (ie, to remove those) like this: # encoding = {'.bz2' : 'bzip2', '.gz' : 'gzip'}.items() # Or the same thing: # encoding = [('.bz2', 'bzip2'), ('.gz', 'gzip')] # Or, you can extend the default like so: encoding = mimetypes.encodings_map.items() + \ {'.bz2' : 'bzip2', '.tal': 'tal.TALFileHandler' }.items() ###################################################################### # Logging ###################################################################### [logger] # Log method to use. One of: # syslog -- use Unix syslog facility # file -- log to standard output (future capability for logging to other # files) # none -- no logging logmethod = syslog # If you enable syslog, you will need to define these as well: # priority -- one of the following (listed in order of high to low): # LOG_EMERG, LOG_ALERT, LOG_CRIT, LOG_ERR, LOG_WARNING, LOG_NOTICE, # LOG_INFO, LOG_DEBUG priority = LOG_INFO # Facility -- one of the following: # LOG_KERN, LOG_USER, LOG_MAIL, LOG_DAEMON, LOG_AUTH, LOG_LPR, LOG_NEWS, # LOG_UUCP, LOG_CRON, LOG_LOCAL0 - LOG_LOCAL7 facility = LOG_LOCAL3 ###################################################################### # GOPHER OBJECTS ###################################################################### # Settings for gopher objects [GopherEntry] # Use this MIME type if no other type is found. defaultmimetype = text/plain # Mapping from MIME types to gopher0 single-character types. # This is a list of lists. The first entry in each list is a # regexp to match and the second is the result. # # Please have a .* at the end to map all unknown types to a certain # character. For best results, that character should be nicely # corresponding to the defaultmimetype. mapping = [['text/html', 'h'], ['text/.+', '0'], ['application/mac-binhex40', '4'], ['audio/.+', 's'], ['image/gif', 'g'], ['image/.+', 'I'], ['application/gopher-menu', '1'], ['application/gopher\+-menu', '1'], ['multipart/mixed', 'M'], ['application/.+', '9'], ['.*', '0'] ] # This is used by the system to generate Extended Attribute (EA), aka # Gopher+ blocks for a file. Basically, with the setup shown below, # you can create "filename.txt.abstract" to define the abstract # property for filename.txt. If you do that, you will probably want # to add these properties to ignorepatt below. The list is a mapping # from an extension to a block name. # # Sample for UMN compatibility: # eaexts = {'.abstract' : 'ABSTRACT', '.keywords' : 'KEYWORDS', '.ask' : 'ASK', '.3d' : '3D'} # # If you want to disable this capability, use this: # # eaexts = {} ###################################################################### # HANDLERS ###################################################################### ################################################## # Handler multiplexer ################################################## [handlers.HandlerMultiplexer] # A list of the handlers to consider. The handlers # are tried in the order listed. # # ### Suggested settings: # Note: the UMNDirHandler will handle all directories, even if they # do not have UMN-specific files, so you do not need to list the # dirhandler in this case. # # Warning: scriptexec and pyg can execute arbitrary code stored in # your path. Don't enable unless you know what you're doing! # # For UMN emulation: (full UMN featureset excluding scriptexec, no others) # # handlers = [url.HTMLURLHandler, UMN.UMNDirHandler, # html.HTMLFileTitleHandler, # mbox.MBoxMessageHandler, mbox.MBoxFolderHandler, # file.CompressedFileHandler, file.FileHandler] # # For Bucktooth emulation: (full Buck featureset excluding scriptexec) # #handlers = [gophermap.BuckGophermapHandler, url.HTMLURLHandler, # file.FileHandler, dir.DirHandler] # # For full Pygopherd featureset excluding scripts, compression, and PYG. # Supports both UMN and Bucktooth featuresets. This is the default # configuration for Pygopherd because it is secure yet versatile. # handlers = [url.HTMLURLHandler, gophermap.BuckGophermapHandler, mbox.MaildirFolderHandler, mbox.MaildirMessageHandler, UMN.UMNDirHandler, html.HTMLFileTitleHandler, mbox.MBoxMessageHandler, mbox.MBoxFolderHandler, file.FileHandler] # For full Pygopherd featureset including scripts and PYG. Same as # above but adds scripts, decompression, and PYG execution. #handlers = [url.HTMLURLHandler, gophermap.BuckGophermapHandler, # mbox.MaildirFolderHandler, mbox.MaildirMessageHandler, # UMN.UMNDirHandler, # tal.TALFileHandler, # html.HTMLFileTitleHandler, # mbox.MBoxMessageHandler, mbox.MBoxFolderHandler, # pyg.PYGHandler, scriptexec.ExecHandler, # file.CompressedFileHandler, file.FileHandler, # url.URLTypeRewriter] ################################################## # Decompressing file handler ################################################## [handlers.file.CompressedFileHandler] # Decompressors is a map from an encoding (as specified in the # pygopherd section above) to a decompression program. # The decompression program must # accept the input in its stdin and write the decompressed output # to stdout. # # If you do not want to decompress things automatically for your # clients, you might wish to NOT use this handler. # # Note: this feature is probably NOT compatible with chroot unless # you take extra precautions. # We enable no decompressors by default... you'll need to do that. decompressors = {} #decompressors = {'bzip2': 'bzcat', # 'gzip' : 'zcat', # 'compress' : 'zcat'} # Regexp to match against filenames pending decompression. # The default will let ALL files be decompressed. decompresspatt = .* # You can be more restrictive: # decompresspatt = \.txt\.(bz2|gz|Z)$ ################################################## # Directory handler ################################################## [handlers.dir.DirHandler] # A regular expression of files to ignore. These files # will not be presented in lists of files to clients, # but if clients know the exact path to the files, they can # still be requested. # # This pattern is matched against the requested selector. # Selectors are guaranteed to begin with a slash by this point. # and never end with a slash unless they consist solely of a slash. # # By default, we ignore files starting with a period, gophermap # files, and files ending with a tilde. # # The default emulates UMN's default plus buck. Please note: # UMNDirHandler implicitly will keep all files starting with a dot out of # directory listings. If you exclude these files explicitly in ignorepatt, # then not only will they not show up, but the handler will also not scan # them for links and the like. # # A buck-only server might like: # # ignorepatt = ~$|/\.|/gophermap$ ignorepatt = /.cap$|/lost\+found$|/lib$|/bin$|/etc$|/dev$|~$|/\.cache|/\.forward$|/\.message$|/\.hushlogin$|/\.kermrc$|/\.notar$|/\.where$|/veronica.ctl$|/robots.txt$|/nohup.out$|/gophermap$|\.abstract$|\.keyboards$|\.ask|\.3d$|~$ # Expiration time, in seconds, for the cache. # Set to 0 to disable caching entirely. cachetime = 180 # Name of the cahe file. Must be set to something even if the cachetime # is zero. In that case, this filename will not be used but for the conf # file to parse, it must still be set. cachefile = .cache.pygopherd.dir ################################################## # UMN Directory Handler ################################################## [handlers.UMN.UMNDirHandler] # Extension stripping behavior. When a file from a directory # is presented in a menu, and no name is given, what to do? # For instance, given a file Welcome.txt and pygopherd.tar.gz: # # If extstrip is none, present Welcome.txt and pygopherd.tar.gz in the # menu. # # If extstrip is nonencoded, modify only those files that do not # have encodings. (If CompressedFileHandler is used, modify only # those files that to not have *HANDLED* encodings.) # If gzip is NOT a handled encoding, you'd get names Welcome and # pygopherd.tar.gz. If gzip IS a handled encoding, you'd get # Welcome and pygopherd. # # If extstrip is full, modify all modifyable names. Welcome.txt -> # Welcome and pygopherd.tar.gz -> pygopherd. # extstrip = none extstrip = nonencoded # extstrip = full [handlers.ZIP.ZIPHandler] ################################################## # ZIP file handler ################################################## # Even if it's listed in the available handlers, it's disabled here by # default. enabled = false pattern = \.zip$ ###################################################################### # PROTOCOLS ###################################################################### ################################################## # Protocol Multiplexer ################################################## [protocols.ProtocolMultiplexer] # A list of the protocols to consider for each request. # The protocols are tried in the order listed. protocols = [wap.WAPProtocol, http.HTTPProtocol, gopherp.GopherPlusProtocol, rfc1436.GopherProtocol] ################################################## # Gopher+ Protocol ################################################## [protocols.gopherp.GopherPlusProtocol] # The name and e-mail of the administrator admin = Unconfigured Pygopherd Admin ################################################## # HTTP Protocol ################################################## [protocols.http.HTTPProtocol] iconmapping = {'h' : 'text.gif', '0' : 'text.gif', '4' : 'binhex.gif', 's' : 'sound1.gif', 'g' : 'image3.gif', 'I' : 'image3.gif', 'M' : 'text.gif', '9' : 'binary.gif', '1' : 'folder.gif', '7' : 'folder.gif', 'i' : 'blank.gif'} # You can use this option to put something at the top of each HTML # page generated. # # The following tokens will be interpolated: # # GOPHERURL -- the Gopher URL for this page. # pagetopper = Welcome to Gopherspace! You are browsing Gopher through a Web interface right now. You can use most browsers or Gopher clients to browse Gopher natively. If your browser supports it, try clicking here to see this page in Gopher directly. To find Gopher browsers, click here.


################################################## # WAP Protocol ################################################## [protocols.wap.WAPProtocol] # waptop is the URL to access with WAP devices. The default, /wap, means # that accessing http://sitename.com/wap will bring up your site in WAP # mode. # # PyGopherd can autodetect WAP from some phones, so this is not always # necessary. waptop = /wap pygopherd-2.0.18.3+nmu4ubuntu1/conf/mime.types0000664000000000000000000003572610762620505016021 0ustar ############################################################################### # # MIME-TYPES and the extensions that represent them # # This file is part of the "mime-support" package. Please send email (not a # bug report) to mime-support@packages.debian.org if you would like new types # and/or extensions to be added. # # Note: Compression schemes like "gzip", "bzip", and "compress" are not # actually "mime-types". They are "encodings" and hence must _not_ have # entries in this file to map their extensions. The "mime-type" of an # encoded file refers to the type of data that has been encoded, not the # type of the encoding. # ############################################################################### application/activemessage application/andrew-inset ez application/applefile application/atomicmail application/batch-SMTP application/beep+xml application/cals-1840 application/commonground application/cu-seeme csm cu application/cybercash application/dca-rft application/dec-dx application/dsptype tsp application/dvcs application/EDI-Consent application/EDIFACT application/EDI-X12 application/eshop application/font-tdpfr application/futuresplash spl application/ghostview 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/mac-compactpro cpt application/marc application/mac-binhex40 hqx application/macwriteii application/mathematica nb application/mathematica-old application/msaccess mdb application/msword doc dot application/news-message-id application/news-transmission application/octet-stream bin application/ocsp-request application/ocsp-response application/oda oda application/parityfec application/pgp-encrypted application/pgp-keys application/pdf pdf application/pgp-signature pgp application/pkcs10 application/pkcs7-mime application/pkcs7-signature application/pkix-cert application/pkixcmp application/pkix-crl application/postscript ps ai eps application/prs.alvestrand.titrax-sheet application/prs.cww application/prs.nprend application/qsig application/riscos application/remote-printing application/rtf 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.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.bmi application/vnd.businessobjects 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.ctc-posml application/vnd.cups-postscript application/vnd.cups-raster application/vnd.cups-raw 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.FloGraphIt 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-hpid application/vnd.hp-hps application/vnd.hp-PCL application/vnd.hp-PCLXL 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.mseq application/vnd.ms-excel xls xlb application/vnd.msign application/vnd.ms-lrm application/vnd.ms-powerpoint ppt pps pot application/vnd.ms-project application/vnd.ms-tnef application/vnd.ms-works application/vnd.musician application/vnd.music-niff 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.powerbuilder75 application/vnd.powerbuilder75-s application/vnd.powerbuilder7-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 application/vnd.uplanet.bearer-choice-wbxml 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.listcmd application/vnd.uplanet.listcmd-wbxml application/vnd.uplanet.list-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 wp5 application/zip zip application/x-123 wk application/x400-bp application/x-bcpio bcpio application/x-cdlink vcd application/x-chess-pgn pgn application/x-core application/x-cpio cpio application/x-csh csh application/x-debian-package deb application/x-director dcr dir dxr application/x-doom wad application/x-dms dms application/x-dvi dvi application/x-executable application/x-font pfa pfb gsf pcf pcf.Z application/x-futuresplash spl application/x-gnumeric gnumeric application/x-gtar gtar tgz taz application/x-hdf hdf application/x-httpd-php phtml pht php application/x-httpd-php3 php3 application/x-httpd-php3-source phps application/x-httpd-php3-preprocessed php3p application/x-httpd-php4 php4 application/x-ica ica application/x-java-applet application/x-java-archive jar application/x-java-bean application/x-java-jnlp-file jnlp application/x-java-serialized-object ser application/x-java-vm class application/x-javascript js application/x-kdelnk application/x-kchart chrt application/x-killustrator kil application/x-kpresenter kpr kpt application/x-koan skp skd skt skm application/x-kspread ksp application/x-kword kwd kwt application/x-latex latex application/x-lha lha application/x-lzh lzh application/x-lzx lzx application/x-maker frm maker frame fm fb book fbdoc application/x-mif mif application/xml application/xml-dtd application/xml-external-parsed-entity application/x-msdos-program com exe bat dll application/x-msi msi application/x-netcdf nc cdf application/x-ns-proxy-autoconfig pac application/x-object o application/x-ogg ogg application/x-oz-application oza application/x-perl pl pm application/x-pkcs7-crl crl application/x-redhat-package-manager rpm application/x-rx application/x-sh application/x-shar shar application/x-shellscript application/x-shockwave-flash swf swfl application/x-sh sh application/x-star-office sdd sda 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-tex-gf gf application/x-tex-pk pk application/x-texinfo texinfo texi application/x-trash ~ % bak old sik 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/x-wingz wz application/x-x509-ca-cert crt application/x-xfig fig 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 mpega mp2 mp3 audio/mpegurl m3u audio/parityfec audio/prs.sid 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-gsm gsm audio/x-mpegurl m3u audio/x-pn-realaudio-plugin rpm audio/x-pn-realaudio ra rm ram audio/x-realaudio ra audio/x-scpls pls 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/pcx pcx 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-coreldraw cdr image/x-coreldrawpattern pat image/x-coreldrawtemplate cdt image/x-corelphotopaint cpt image/x-djvu djvu djv image/x-jng jng image/x-ms-bmp bmp 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 inode/chardevice inode/blockdevice inode/directory-locked inode/directory inode/fifo inode/socket message/delivery-status message/disposition-notification message/external-body message/http message/s-http message/news message/partial message/rfc822 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/comma-separated-values csv text/css css text/directory text/english text/enriched text/html htm html xhtml text/mathml mml text/parityfec text/plain asc txt text diff text/prs.lines.tag text/rfc822-headers text/richtext rtx text/rtf rtf text/t140 text/tab-separated-values tsv text/uri-list text/vnd.abc text/vnd.curl text/vnd.DMClientScript text/vnd.flatland.3dml text/vnd.fly text/vnd.fmi.flexstor text/vnd.in3d.3dml text/vnd.in3d.spot text/vnd.IPTC.NewsML text/vnd.IPTC.NITF 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/xml xml xsl text/x-c++hdr h++ hpp hxx hh text/x-c++src c++ cpp cxx cc text/x-chdr h text/x-crontab text/x-csh csh text/x-csrc c text/x-java java text/x-makefile text/xml-external-parsed-entity text/x-moc moc text/x-pascal p pas text/x-setext etx text/x-sh sh text/x-tcl tcl tk text/x-tex tex ltx sty cls text/x-vcalendar vcs text/x-vcard vcf video/dl dl video/fli fli video/gl gl video/mpeg mpeg mpg mpe video/quicktime qt mov video/mp4v-es video/parityfec video/pointer 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-mng mng video/x-ms-asf asf asx video/x-msvideo avi video/x-sgi-movie movie x-conference/x-cooltalk ice x-world/x-vrml vrm vrml wrl