aboutsummaryrefslogtreecommitdiff
path: root/en_US.ISO8859-1
diff options
context:
space:
mode:
Diffstat (limited to 'en_US.ISO8859-1')
-rw-r--r--en_US.ISO8859-1/Makefile9
-rw-r--r--en_US.ISO8859-1/articles/Makefile31
-rw-r--r--en_US.ISO8859-1/articles/Makefile.inc5
-rw-r--r--en_US.ISO8859-1/articles/committers-guide/Makefile27
-rw-r--r--en_US.ISO8859-1/articles/committers-guide/article.sgml2350
-rw-r--r--en_US.ISO8859-1/articles/console-server/Makefile18
-rw-r--r--en_US.ISO8859-1/articles/console-server/article.sgml1229
-rw-r--r--en_US.ISO8859-1/articles/console-server/itgastyle.css223
-rw-r--r--en_US.ISO8859-1/articles/console-server/tk0231-9-1.pngbin1401 -> 0 bytes
-rw-r--r--en_US.ISO8859-1/articles/contributing/Makefile16
-rw-r--r--en_US.ISO8859-1/articles/contributing/article.sgml495
-rw-r--r--en_US.ISO8859-1/articles/contributors/Makefile16
-rw-r--r--en_US.ISO8859-1/articles/contributors/article.sgml7122
-rw-r--r--en_US.ISO8859-1/articles/cvsup-advanced/Makefile16
-rw-r--r--en_US.ISO8859-1/articles/cvsup-advanced/article.sgml267
-rw-r--r--en_US.ISO8859-1/articles/dialup-firewall/Makefile14
-rw-r--r--en_US.ISO8859-1/articles/dialup-firewall/article.sgml375
-rw-r--r--en_US.ISO8859-1/articles/diskless-x/Makefile14
-rw-r--r--en_US.ISO8859-1/articles/diskless-x/article.sgml349
-rw-r--r--en_US.ISO8859-1/articles/explaining-bsd/Makefile23
-rw-r--r--en_US.ISO8859-1/articles/explaining-bsd/article.sgml545
-rw-r--r--en_US.ISO8859-1/articles/filtering-bridges/Makefile13
-rw-r--r--en_US.ISO8859-1/articles/filtering-bridges/article.sgml356
-rw-r--r--en_US.ISO8859-1/articles/fonts/Makefile14
-rw-r--r--en_US.ISO8859-1/articles/fonts/article.sgml976
-rw-r--r--en_US.ISO8859-1/articles/formatting-media/Makefile14
-rw-r--r--en_US.ISO8859-1/articles/formatting-media/article.sgml620
-rw-r--r--en_US.ISO8859-1/articles/freebsd-questions/Makefile23
-rw-r--r--en_US.ISO8859-1/articles/freebsd-questions/article.sgml564
-rw-r--r--en_US.ISO8859-1/articles/ipsec-must/Makefile14
-rw-r--r--en_US.ISO8859-1/articles/ipsec-must/article.sgml338
-rw-r--r--en_US.ISO8859-1/articles/laptop/Makefile18
-rw-r--r--en_US.ISO8859-1/articles/laptop/article.sgml179
-rw-r--r--en_US.ISO8859-1/articles/mh/Makefile14
-rw-r--r--en_US.ISO8859-1/articles/mh/article.sgml763
-rw-r--r--en_US.ISO8859-1/articles/multi-os/Makefile14
-rw-r--r--en_US.ISO8859-1/articles/multi-os/article.sgml740
-rw-r--r--en_US.ISO8859-1/articles/new-users/Makefile14
-rw-r--r--en_US.ISO8859-1/articles/new-users/article.sgml1055
-rw-r--r--en_US.ISO8859-1/articles/programming-tools/Makefile14
-rw-r--r--en_US.ISO8859-1/articles/programming-tools/article.sgml17
-rw-r--r--en_US.ISO8859-1/articles/pxe/Makefile13
-rw-r--r--en_US.ISO8859-1/articles/pxe/article.sgml280
-rw-r--r--en_US.ISO8859-1/articles/serial-uart/Makefile13
-rw-r--r--en_US.ISO8859-1/articles/serial-uart/article.sgml2424
-rw-r--r--en_US.ISO8859-1/articles/solid-state/Makefile24
-rw-r--r--en_US.ISO8859-1/articles/solid-state/article.sgml630
-rw-r--r--en_US.ISO8859-1/articles/storage-devices/Makefile13
-rw-r--r--en_US.ISO8859-1/articles/storage-devices/article.sgml2627
-rw-r--r--en_US.ISO8859-1/articles/vm-design/Makefile16
-rw-r--r--en_US.ISO8859-1/articles/vm-design/article.sgml838
-rw-r--r--en_US.ISO8859-1/articles/vm-design/fig1.eps104
-rw-r--r--en_US.ISO8859-1/articles/vm-design/fig2.eps115
-rw-r--r--en_US.ISO8859-1/articles/vm-design/fig3.eps133
-rw-r--r--en_US.ISO8859-1/articles/vm-design/fig4.eps133
-rw-r--r--en_US.ISO8859-1/articles/zip-drive/Makefile14
-rw-r--r--en_US.ISO8859-1/articles/zip-drive/article.sgml267
-rw-r--r--en_US.ISO8859-1/books/Makefile15
-rw-r--r--en_US.ISO8859-1/books/Makefile.inc5
-rw-r--r--en_US.ISO8859-1/books/arch-handbook/Makefile47
-rw-r--r--en_US.ISO8859-1/books/arch-handbook/book.sgml312
-rw-r--r--en_US.ISO8859-1/books/arch-handbook/chapters.ent66
-rw-r--r--en_US.ISO8859-1/books/arch-handbook/driverbasics/chapter.sgml391
-rw-r--r--en_US.ISO8859-1/books/arch-handbook/isa/chapter.sgml2479
-rw-r--r--en_US.ISO8859-1/books/arch-handbook/kobj/chapter.sgml298
-rw-r--r--en_US.ISO8859-1/books/arch-handbook/locking/chapter.sgml333
-rw-r--r--en_US.ISO8859-1/books/arch-handbook/pci/chapter.sgml372
-rw-r--r--en_US.ISO8859-1/books/arch-handbook/scsi/chapter.sgml1983
-rw-r--r--en_US.ISO8859-1/books/arch-handbook/sysinit/chapter.sgml161
-rw-r--r--en_US.ISO8859-1/books/arch-handbook/usb/chapter.sgml623
-rw-r--r--en_US.ISO8859-1/books/arch-handbook/vm/chapter.sgml255
-rw-r--r--en_US.ISO8859-1/books/bibliography/Makefile25
-rw-r--r--en_US.ISO8859-1/books/bibliography/book.sgml36
-rw-r--r--en_US.ISO8859-1/books/corp-net-guide/08-01.eps8104
-rw-r--r--en_US.ISO8859-1/books/corp-net-guide/08-02.eps8655
-rw-r--r--en_US.ISO8859-1/books/corp-net-guide/08-03.eps8489
-rw-r--r--en_US.ISO8859-1/books/corp-net-guide/08-04.eps8386
-rw-r--r--en_US.ISO8859-1/books/corp-net-guide/08-05.eps12613
-rw-r--r--en_US.ISO8859-1/books/corp-net-guide/08-06.eps8457
-rw-r--r--en_US.ISO8859-1/books/corp-net-guide/Makefile25
-rw-r--r--en_US.ISO8859-1/books/corp-net-guide/book.sgml3213
-rw-r--r--en_US.ISO8859-1/books/corp-net-guide/freebsd.dsl18
-rw-r--r--en_US.ISO8859-1/books/design-44bsd/Makefile20
-rw-r--r--en_US.ISO8859-1/books/design-44bsd/book.sgml2858
-rw-r--r--en_US.ISO8859-1/books/design-44bsd/fig1.eps340
-rw-r--r--en_US.ISO8859-1/books/design-44bsd/fig2.eps1476
-rw-r--r--en_US.ISO8859-1/books/design-44bsd/freebsd.dsl18
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/Makefile47
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/book.sgml312
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/chapters.ent66
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/dma/chapter.sgml1326
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/driverbasics/chapter.sgml391
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/introduction/chapter.sgml226
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/ipv6/chapter.sgml1587
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/isa/chapter.sgml2479
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/kerneldebug/Makefile15
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/kerneldebug/chapter.sgml640
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/kobj/chapter.sgml298
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/l10n/chapter.sgml83
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/locking/chapter.sgml333
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/pci/chapter.sgml372
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/policies/Makefile15
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/policies/chapter.sgml400
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/scsi/chapter.sgml1983
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/secure/chapter.sgml514
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/sockets/chapter.sgml1773
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/sockets/layers.eps92
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/sockets/sain.eps88
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/sockets/sainfill.eps88
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/sockets/sainlsb.eps96
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/sockets/sainmsb.eps96
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/sockets/sainserv.eps90
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/sockets/serv.eps160
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/sockets/serv2.eps211
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/sockets/slayers.eps113
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/sysinit/chapter.sgml161
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/tools/chapter.sgml2298
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/usb/chapter.sgml623
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/vm/chapter.sgml255
-rw-r--r--en_US.ISO8859-1/books/developers-handbook/x86/chapter.sgml6488
-rw-r--r--en_US.ISO8859-1/books/faq/Makefile27
-rw-r--r--en_US.ISO8859-1/books/faq/book.sgml12517
-rw-r--r--en_US.ISO8859-1/books/fdp-primer/Makefile50
-rw-r--r--en_US.ISO8859-1/books/fdp-primer/book.sgml300
-rw-r--r--en_US.ISO8859-1/books/fdp-primer/chapter.decl1
-rw-r--r--en_US.ISO8859-1/books/fdp-primer/chapters.ent25
-rw-r--r--en_US.ISO8859-1/books/fdp-primer/doc-build/chapter.sgml498
-rw-r--r--en_US.ISO8859-1/books/fdp-primer/examples/appendix.sgml355
-rw-r--r--en_US.ISO8859-1/books/fdp-primer/overview/chapter.sgml300
-rw-r--r--en_US.ISO8859-1/books/fdp-primer/psgml-mode/chapter.sgml150
-rw-r--r--en_US.ISO8859-1/books/fdp-primer/see-also/chapter.sgml134
-rw-r--r--en_US.ISO8859-1/books/fdp-primer/sgml-markup/chapter.sgml2600
-rw-r--r--en_US.ISO8859-1/books/fdp-primer/sgml-primer/chapter.sgml1556
-rw-r--r--en_US.ISO8859-1/books/fdp-primer/structure/chapter.sgml295
-rw-r--r--en_US.ISO8859-1/books/fdp-primer/stylesheets/chapter.sgml102
-rw-r--r--en_US.ISO8859-1/books/fdp-primer/the-website/chapter.sgml218
-rw-r--r--en_US.ISO8859-1/books/fdp-primer/tools/chapter.sgml285
-rw-r--r--en_US.ISO8859-1/books/fdp-primer/translations/chapter.sgml482
-rw-r--r--en_US.ISO8859-1/books/fdp-primer/writing-style/chapter.sgml388
-rw-r--r--en_US.ISO8859-1/books/handbook/basics/disk-layout.kilbin1450 -> 0 bytes
-rw-r--r--en_US.ISO8859-1/books/handbook/multimedia/Makefile15
-rw-r--r--en_US.ISO8859-1/books/handbook/multimedia/chapter.sgml579
-rw-r--r--en_US.ISO8859-1/books/porters-handbook/Makefile29
-rw-r--r--en_US.ISO8859-1/books/porters-handbook/book.sgml4564
-rw-r--r--en_US.ISO8859-1/books/porters-handbook/freebsd.dsl40
-rw-r--r--en_US.ISO8859-1/books/ppp-primer/Makefile26
-rw-r--r--en_US.ISO8859-1/books/ppp-primer/book.sgml2372
147 files changed, 0 insertions, 148248 deletions
diff --git a/en_US.ISO8859-1/Makefile b/en_US.ISO8859-1/Makefile
deleted file mode 100644
index 0b2210c098..0000000000
--- a/en_US.ISO8859-1/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-# $FreeBSD$
-
-SUBDIR = articles
-SUBDIR+= books
-
-COMPAT_SYMLINK = en
-
-DOC_PREFIX?= ${.CURDIR}/..
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/Makefile b/en_US.ISO8859-1/articles/Makefile
deleted file mode 100644
index 233345a467..0000000000
--- a/en_US.ISO8859-1/articles/Makefile
+++ /dev/null
@@ -1,31 +0,0 @@
-# $FreeBSD: doc/en_US.ISO8859-1/articles/Makefile,v 1.19 2001/10/08 06:19:13 murray Exp $
-
-SUBDIR = committers-guide
-SUBDIR+= console-server
-SUBDIR+= contributing
-SUBDIR+= contributors
-SUBDIR+= cvsup-advanced
-SUBDIR+= dialup-firewall
-SUBDIR+= diskless-x
-SUBDIR+= explaining-bsd
-SUBDIR+= filtering-bridges
-SUBDIR+= freebsd-questions
-SUBDIR+= fonts
-SUBDIR+= formatting-media
-SUBDIR+= ipsec-must
-SUBDIR+= laptop
-SUBDIR+= mh
-SUBDIR+= multi-os
-SUBDIR+= new-users
-SUBDIR+= programming-tools
-SUBDIR+= pxe
-SUBDIR+= serial-uart
-SUBDIR+= solid-state
-SUBDIR+= storage-devices
-SUBDIR+= vm-design
-SUBDIR+= zip-drive
-
-# ROOT_SYMLINKS+= new-users
-
-DOC_PREFIX?= ${.CURDIR}/../..
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/Makefile.inc b/en_US.ISO8859-1/articles/Makefile.inc
deleted file mode 100644
index feb3008c1c..0000000000
--- a/en_US.ISO8859-1/articles/Makefile.inc
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# $FreeBSD: doc/en_US.ISO8859-1/articles/Makefile.inc,v 1.3 1999/09/06 06:52:35 peter Exp $
-#
-
-DESTDIR?= ${DOCDIR}/en_US.ISO8859-1/articles/${.CURDIR:T}
diff --git a/en_US.ISO8859-1/articles/committers-guide/Makefile b/en_US.ISO8859-1/articles/committers-guide/Makefile
deleted file mode 100644
index 51fe6d2820..0000000000
--- a/en_US.ISO8859-1/articles/committers-guide/Makefile
+++ /dev/null
@@ -1,27 +0,0 @@
-#
-# $FreeBSD: doc/en_US.ISO_8859-1/articles/committers-guide/Makefile,v 1.3 1999/09/06 06:52:35 peter Exp $
-#
-# Build the FreeBSD New Committers Guide
-#
-
-MAINTAINER=jhb@FreeBSD.org
-
-DOC?= article
-
-FORMATS?= html
-
-INSTALL_COMPRESSED?= gz
-INSTALL_ONLY_COMPRESSED?=
-
-JADEFLAGS+= -V %generate-article-toc%
-
-#
-# SRCS lists the individual SGML files that make up the document. Changes
-# to any of these files will force a rebuild
-#
-
-# SGML content
-SRCS= article.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/committers-guide/article.sgml b/en_US.ISO8859-1/articles/committers-guide/article.sgml
deleted file mode 100644
index c73cade440..0000000000
--- a/en_US.ISO8859-1/articles/committers-guide/article.sgml
+++ /dev/null
@@ -1,2350 +0,0 @@
-<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man;
-
-<!ENTITY % freebsd PUBLIC "-//FreeBSD//ENTITIES DocBook Miscellaneous FreeBSD Entities//EN">
-%freebsd;
-
-<!ENTITY % authors PUBLIC "-//FreeBSD//ENTITIES DocBook Author Entities//EN">
-%authors;
-
-<!ENTITY % mailing-lists PUBLIC "-//FreeBSD//ENTITIES DocBook Mailing List Entities//EN">
-%mailing-lists;
-]>
-
-<article>
- <articleinfo>
- <title>Committer Guide</title>
-
- <authorgroup>
- <author>
- <surname>The FreeBSD Documentation Project</surname>
- </author>
- </authorgroup>
-
- <pubdate>$FreeBSD: doc/en_US.ISO8859-1/articles/committers-guide/article.sgml,v 1.82 2001/08/06 22:43:27 murray Exp $</pubdate>
-
- <copyright>
- <year>1999</year>
- <year>2000</year>
- <year>2001</year>
- <holder>The FreeBSD Documentation Project</holder>
- </copyright>
-
- <abstract>
- <para>This document provides information for the FreeBSD committer
- community. All new committers should read this document before they
- start, and existing committers are strongly encouraged to review it
- from time to time.</para>
- </abstract>
- </articleinfo>
-
- <sect1 id="admin">
- <title>Administrative Details</title>
-
- <informaltable frame="none" orient="port">
- <tgroup cols="2">
- <tbody>
- <row>
- <entry><emphasis>Main Repository Host</emphasis></entry>
- <entry><hostid>freefall.FreeBSD.org</hostid></entry>
- </row>
-
- <row>
- <entry><emphasis>Login Methods</emphasis></entry>
- <entry>&man.ssh.1;</entry>
- </row>
-
- <row>
- <entry><emphasis>Main CVSROOT</emphasis></entry>
- <entry><filename>/home/ncvs</filename></entry>
- </row>
-
- <row>
- <entry><emphasis>Main CVS Repository Meisters</emphasis></entry>
- <entry>&a.jdp; and &a.peter; as well as &a.asami; for
- <filename>ports/</filename></entry>
- </row>
-
- <row>
- <entry><emphasis>Mailing List</emphasis></entry>
- <entry><email>developers@FreeBSD.org</email>,
- <email>cvs-committers@FreeBSD.org</email></entry>
- </row>
-
- <row>
- <entry><emphasis>Noteworthy CVS Tags</emphasis></entry>
- <entry>RELENG_3 (3.x-STABLE), RELENG_4 (4.x-STABLE), HEAD (-CURRENT)</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <para>It is required that you use &man.ssh.1; or &man.telnet.1;
- with Kerberos 5 to connect to the repository hosts. These are
- generally more secure than plain &man.telnet.1; or
- &man.rlogin.1; since credential negotiation will always be
- encrypted. All traffic is encrypted by default with &man.ssh.1;.
- With utilities like &man.ssh-agent.1; and &man.scp.1; also
- available, &man.ssh.1; is also far more convenient. If you do
- not know anything about &man.ssh.1;, please see
- <xref linkend="ssh.guide">.</para>
- </sect1>
-
- <sect1 id="cvs.operations">
- <title>CVS Operations</title>
-
- <para>It is assumed that you are already familiar with the basic operation
- of CVS.</para>
-
- <para>The CVS Repository Meisters (Peter Wemm and John Polstra)
- are the <quote>owners</quote> of the CVS repository and are
- responsible for any and <emphasis>all</emphasis> direct
- modification of it for the purposes of cleanup or fixing some
- grievous abuse of CVS by a committer. No one else should
- attempt to touch the repository directly. Should you cause some
- repository accident, say a bad cvs import or tag operation, do
- <emphasis role="bold">not</emphasis> attempt to fix it yourself!
- Mail or call John or Peter immediately and report the problem to
- one of them instead. The only ones allowed to directly fiddle
- the repository bits are the repomeisters. Satoshi Asami is also a
- repomeister for the <filename>ports/</filename> portion of the
- tree.</para>
-
- <para>CVS operations are usually done by logging into
- <hostid>freefall</hostid>, making sure the
- <envar>CVSROOT</envar> environment variable is set to
- <filename>/home/ncvs</filename>, and then doing the appropriate
- check-out/check-in operations. If you wish to add
- something which is wholly new (like contrib-ified
- sources, etc), a script called <quote>easy-import</quote> is
- also provided for making the process easier. It automatically
- adds the new module entry, does the appropriate thing with
- <command>cvs import</command>, etc. &ndash; just run it without
- arguments and it will prompt you for everything it needs to
- know.</para>
-
- <para>Note that when you use CVS on <hostid>freefall</hostid>, you
- should set your <literal>umask</literal> to <literal>2</literal>,
- as well as setting the <envar>CVSUMASK</envar> environment
- variable to <literal>2</literal>. This ensures that any new
- files created by <command>cvs add</command> will have the correct
- permissions. If you add a file or directory and discover that the
- file in the repository has incorrect permissions (specifically,
- all files in the repository should be group writable by group
- <literal>ncvs</literal>), contact one of the repository meisters
- as described below.</para>
-
- <para>If you are familiar with remote CVS and consider yourself
- pretty studly with CVS in general, you can also do CVS
- operations directly from your own machine and local working
- sources. Just remember to set <envar>CVS_RSH</envar> to
- <wordasword>ssh</wordasword> so that you are using a relatively
- secure and reliable transport. If you have no idea what any of
- the above even means, on the other hand, then please stick with
- logging into <hostid>freefall</hostid> and applying your diffs
- with &man.patch.1;.</para>
-
- <para>If you need to use CVS <command>add</command> and
- <command>delete</command> operations in a manner that is
- effectively a <quote>mv</quote> operation, then a repository
- copy is in order rather than your CVS <command>add</command> and
- <command>delete</command>. In a repository copy, a <link
- linkend="conventions">CVS Meister</link> will copy the file(s)
- to their new name and/or location and let you know when it is
- done. The purpose of a repository copy is to preserve file
- change history, or logs. We in the FreeBSD Project greatly
- value the change history CVS gives to the project.</para>
-
- <para>CVS reference information, tutorials, and FAQs can also be found at:
- <ulink
- url="http://www.cvshome.org/docs/index.html">http://www.cvshome.org/docs/index.html</ulink>,
- and the information in <ulink url="http://cvsbook.red-bean.com/cvsbook.html">Karl Fogel's
- chapters from <quote>Open Source Development with CVS</quote></ulink> are also very
- useful.</para>
-
- <para>&a.des; also supplied the following <quote>mini primer</quote> for
- CVS.</para>
-
- <orderedlist>
- <listitem>
- <para>Check out a module with the <command>co</command> or
- <command>checkout</command> command.</para>
-
- <screen>&prompt.user; <userinput>cvs checkout shazam</userinput></screen>
-
- <para>This checks out a copy of the <filename>shazam</filename> module. If
- there is no <filename>shazam</filename> module in the modules file, it looks for a
- top-level directory named <filename>shazam</filename> instead.</para>
-
- <table frame="none">
- <title>Useful <command>cvs checkout</command> options</title>
-
- <tgroup cols=2>
- <tbody>
- <row>
- <entry><option>-P</option></entry>
- <entry>Don't create empty directories</entry>
- </row>
-
- <row>
- <entry><option>-l</option></entry>
- <entry>Check out a single level, no subdirectories</entry>
- </row>
-
- <row>
- <entry><option>-r<replaceable>rev</replaceable></option></entry>
- <entry>Check out revision, branch or tag
- <replaceable>rev</replaceable></entry>
- </row>
-
- <row>
- <entry><option>-D<replaceable>date</replaceable></option></entry>
- <entry>Check out the sources as they were on date
- <replaceable>date</replaceable></entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <para>Practical FreeBSD examples:</para>
-
- <itemizedlist>
- <listitem>
- <para>Check out the <filename>miscfs</filename> module,
- which corresponds to <filename>src/sys/miscfs</filename>:</para>
-
- <screen>&prompt.user; <userinput>cvs co miscfs</userinput></screen>
-
- <para>You now have a directory named <filename>miscfs</filename>
- with subdirectories <filename>CVS</filename>,
- <filename>deadfs</filename>, <filename>devfs</filename>, and so
- on. One of these (<filename>linprocfs</filename>) is
- empty.</para>
- </listitem>
-
- <listitem>
- <para>Check out the same files, but with full path:</para>
-
- <screen>&prompt.user; <userinput>cvs co src/sys/miscfs</userinput></screen>
-
- <para>You now have a directory named <filename>src</filename>,
- with subdirectories <filename>CVS</filename> and
- <filename>sys</filename>. <filename>src/sys</filename> has
- subdirectories <filename>CVS</filename> and
- <filename>miscfs</filename>, etc.</para>
- </listitem>
-
- <listitem>
- <para>Check out the same files, but prunes empty
- directories:</para>
-
- <screen>&prompt.user; <userinput>cvs co -P miscfs</userinput></screen>
-
- <para>You now have a directory named
- <filename>miscfs</filename> with subdirectories
- <filename>CVS</filename>, <filename>deadfs</filename>,
- <filename>devfs</filename>... but note that there is no
- <filename>linprocfs</filename> subdirectory, because there
- are no files in it.</para>
- </listitem>
-
- <listitem>
- <para>Check out the directory <filename>miscfs</filename>, but
- none of the subdirectories:</para>
-
- <screen>&prompt.root; <userinput>cvs co -l miscfs</userinput></screen>
-
- <para>You now have a directory named <filename>miscfs</filename>
- with just one subdirectory named
- <filename>CVS</filename>.</para>
- </listitem>
-
- <listitem>
- <para>Check out the <filename>miscfs</filename> module as
- it is in the 4.x branch:</para>
-
- <screen>&prompt.user; <userinput>cvs co -rRELENG_4 miscfs</userinput></screen>
-
- <para>You can modify the sources and commit along this
- branch.</para>
- </listitem>
-
- <listitem>
- <para>Check out the <filename>miscfs</filename> module as
- it was in 3.4-RELEASE.</para>
-
- <screen>&prompt.user; <userinput>cvs co -rRELENG_3_4_0_RELEASE miscfs</userinput></screen>
-
- <para>You will not be able to commit modifications, since
- RELENG_3_4_0_RELEASE is a point in time, not a branch.</para>
- </listitem>
-
- <listitem>
- <para>Check out the <filename>miscfs</filename> module as it was
- on Jan 15 2000.</para>
-
- <screen>&prompt.user; <userinput>cvs co -D'01/15/2000' miscfs</userinput></screen>
-
- <para>You will not be able to commit modifications.</para>
- </listitem>
-
- <listitem>
- <para>Check out the <filename>miscfs</filename> module as it was
- one week ago.</para>
-
- <screen>&prompt.user; <userinput>cvs co -D'last week' miscfs</userinput></screen>
-
- <para>You will not be able to commit modifications.</para>
- </listitem>
- </itemizedlist>
-
- <para>Note that cvs stores metadata in subdirectories named
- <filename>CVS</filename>.</para>
-
- <para>Arguments to <option>-D</option> and <option>-r</option>
- are sticky, which means cvs will remember them later, e.g.
- when you do a <command>cvs update</command>.</para>
- </listitem>
-
- <listitem>
- <para>Check the status of checked-out files with the
- <command>status</command> command.</para>
-
- <screen>&prompt.user; <userinput>cvs status shazam</userinput></screen>
-
- <para>This displays the status of the
- <filename>shazam</filename> file or of every file in the
- <filename>shazam</filename> directory. For every file, the
- status is given as one of:</para>
-
- <informaltable frame="none">
- <tgroup cols=2>
- <tbody>
- <row>
- <entry>Up-to-date</entry>
- <entry>File is up-to-date and unmodified.</entry>
- </row>
-
- <row>
- <entry>Needs Patch</entry>
- <entry>File is unmodified, but there's a newer revision in
- the repository.</entry>
- </row>
-
- <row>
- <entry>Locally Modified</entry>
- <entry>File is up-to-date, but modified.</entry>
- </row>
-
- <row>
- <entry>Needs Merge</entry>
- <entry>File is modified, and there's a newer revision in the
- repository.</entry>
- </row>
-
- <row>
- <entry>File had conflicts on merge</entry>
- <entry>There were conflicts the last time this file was
- updated, and they haven't been resolved yet.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <para>You'll also see the local revision and date,
- the revision number of the newest applicable version
- (<quote>newest applicable</quote> because if you have a
- sticky date, tag or branch, it may not be the actual newest
- revision), and any sticky tags, dates or options.</para>
- </listitem>
-
- <listitem>
- <para>Once you've checked something out, update it with the
- <command>update</command> command.</para>
-
- <screen>&prompt.user; <userinput>cvs update shazam</userinput></screen>
-
- <para>This updates the <filename>shazam</filename> file or the
- contents of the <filename>shazam</filename> directory to the
- latest version along the branch you checked out. If you
- checked out a <quote>point in time</quote>, does nothing
- unless the tags have moved in the repository or some other weird
- stuff is going on.</para>
-
- <para>Useful options, in addition to those listed above for
- <command>checkout</command>:</para>
-
- <informaltable frame="none">
- <tgroup cols=2>
- <tbody>
- <row>
- <entry><option>-d</option></entry>
- <entry>Check out any additional missing directories.</entry>
- </row>
-
- <row>
- <entry><option>-A</option></entry>
- <entry>Update to head of main branch.</entry>
- </row>
-
- <row>
- <entry><option>-j<replaceable>rev</replaceable></option></entry>
- <entry>More magic (see below).</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <para>If you checked out a module with <option>-r</option> or
- <option>-D</option>, running <command>cvs update</command>
- with a different <option>-r</option> or <option>-D</option>
- argument or with <option>-A</option> will select a new branch,
- revision or date. The <option>-A</option> option clears all
- sticky tags, dates or revisions whereas <option>-r</option>
- and <option>-D</option> set new ones.</para>
-
- <para>Theoretically, specifying <literal>HEAD</literal> as
- argument to <option>-r</option> will give you the same result
- as <option>-A</option>, but that's just theory.</para>
-
- <para>The <option>-d</option> option is useful if:</para>
-
- <itemizedlist>
- <listitem>
- <para>somebody has added subdirectories to the module
- you've checked out after you checked it out.</para>
- </listitem>
-
- <listitem>
- <para>you checked out with <option>-l</option>, and later
- change your mind and want to check out the subdirectories
- as well.</para>
- </listitem>
-
- <listitem>
- <para>you deleted some subdirectories and want to check
- them all back out.</para>
- </listitem>
- </itemizedlist>
-
- <para><emphasis>Watch the output of the <command>cvs
- update</command> with care.</emphasis> The letter in front of
- each file name indicates what was done with it:</para>
-
- <informaltable frame="none">
- <tgroup cols=2>
- <tbody>
- <row>
- <entry><literal>U</literal></entry>
- <entry>The file was updated with no trouble.</entry>
- </row>
-
- <row>
- <entry><literal>P</literal></entry>
- <entry>The file was updated with no trouble (you'll only see
- this when working against a remote repo).</entry>
- </row>
-
- <row>
- <entry><literal>M</literal></entry>
- <entry>The file had been modified, and was merged with no
- conflicts.</entry>
- </row>
-
- <row>
- <entry><literal>C</literal></entry>
- <entry>The file had been modified, and was merged with
- conflicts.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <para>Merging is what happens if you check out a copy of
- some source code, modify it, then someone else commits a
- change, and you run <command>cvs update</command>. CVS notices
- that you've made local changes, and tries to merge your
- changes with the changes between the version you originally
- checked out and the one you updated to. If the changes are to
- separate portions of the file, it'll almost always work fine
- (though the result might not be syntactically or semantically
- correct).</para>
-
- <para>CVS will print an 'M' in front of every locally modified
- file even if there is no newer version in the repository, so
- <command>cvs update</command> is handy for getting a summary
- of what you've changed locally.</para>
-
- <para>If you get a <literal>C</literal>, then your changes
- conflicted with the changes in the repository (the changes
- were to the same lines, or neighboring lines, or you changed
- the local file so much that <command>cvs</command> can't
- figure out how to apply the repository's changes). You'll have
- to go through the file manually and resolve the conflicts;
- they'll be marked with rows of <literal>&lt;</literal>,
- <literal>=</literal> and <literal>&gt;</literal> signs. For
- every conflict, there'll be a marker line with seven
- <literal>&lt;</literal> signs and the name of the file,
- followed by a chunk of what your local file contained,
- followed by a separator line with seven <literal>=</literal>
- signs, followed by the corresponding chunk in the
- repository version, followed by a marker line with seven
- <literal>&gt;</literal> signs and the revision number you
- updated to.</para>
-
- <para>The <option>-j</option> option is slightly voodoo. It
- updates the local file to the specified revision as if you
- used <option>-r</option>, but it does not change the recorded
- revision number or branch of the local file. It's not really
- useful except when used twice, in which case it will merge the
- changes between the two specified versions into the working
- copy.</para>
-
- <para>For instance, say you commit a change to
- <filename>shazam/shazam.c</filename> in &os.current; and later
- want to MFC it. The change you want to MFC was revision
- 1.15:</para>
-
- <itemizedlist>
- <listitem>
- <para>Check out the &os.stable; version of the
- <filename>shazam</filename> module:</para>
-
- <screen>&prompt.user; <userinput>cvs co -rRELENG_4 shazam</userinput></screen>
- </listitem>
-
- <listitem>
- <para>Apply the changes between rev 1.14 and 1.15:</para>
-
- <screen>&prompt.user; <userinput>cvs update -j1.14 -j1.15 shazam/shazam.c</userinput></screen>
- </listitem>
- </itemizedlist>
-
- <para>You'll almost certainly get a conflict because
- of the <literal>$Id: article.sgml,v 1.83 2001-08-22 23:16:09 mike Exp $</literal> (or in FreeBSD's case,
- <literal>$FreeBSD<!-- stop expansion -->$</literal>) lines, so you'll have to edit
- the file to resolve the conflict (remove the marker lines and
- the second <literal>$Id: article.sgml,v 1.83 2001-08-22 23:16:09 mike Exp $</literal> line, leaving the original
- <literal>$Id: article.sgml,v 1.83 2001-08-22 23:16:09 mike Exp $</literal> line intact).</para>
- </listitem>
-
- <listitem>
- <para>View differences between the local version and the
- repository version with the <command>diff</command>
- command.</para>
-
- <screen>&prompt.user; <userinput>cvs diff shazam</userinput></screen>
-
- <para>shows you every modification you've made to the
- <filename>shazam</filename> file or module.</para>
-
- <table frame="none">
- <title>Useful <command>cvs diff</command> options</title>
-
- <tgroup cols=2>
- <tbody>
- <row>
- <entry><option>-u</option></entry>
- <entry>Uses the unified diff format.</entry>
- </row>
-
- <row>
- <entry><option>-N</option></entry>
- <entry>Shows missing or added files.</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <para>You always want to use <option>-u</option>, since
- unified diffs are much easier to read than almost any other
- diff format (in some circumstances, context diffs may be
- better, but they're much bulkier). A unified diff consists of
- a series of hunks. Each hunk begins with a line that starts
- with two <literal>@</literal> signs and specifies where in the
- file the differences are and how many lines they span. This
- is followed by a number of lines; some (preceded by a blank)
- are context; some (preceded by a <literal>-</literal> sign)
- are outtakes and some (preceded by a <literal>+</literal>) are
- additions.</para>
-
- <para>You can also diff against a different version
- than the one you checked out by specifying a version
- with <option>-r</option> or <option>-D</option> as in
- <command>checkout</command> or <command>update</command>,
- or even view the diffs between two arbitrary versions
- (with no regard for what you have locally) by specifying
- <emphasis>two</emphasis> versions with <option>-r</option> or
- <option>-D</option>.</para>
- </listitem>
-
- <listitem>
- <para>View log entries with the <command>log</command>
- command.</para>
-
- <screen>&prompt.user; <userinput>cvs log shazam</userinput></screen>
-
- <para>If <filename>shazam</filename> is a file, this will print a
- <emphasis>header</emphasis> with information about this file, such
- as where in the repository this file is stored, which revision is
- the <literal>HEAD</literal> for this file, what branches this file
- is in, and any tags that are valid for this file. Then, for each
- revision of this file, a log message is printed. This includes
- the date and time of the commit, who did the commit, how many lines
- were added and/or deleted, and finally the log message that the
- committer who did the change wrote.</para>
-
- <para>If <filename>shazam</filename> is a directory, then the log
- information described above is printed for each file in the
- directory in turn. Unless you give the <option>-l</option> to
- <command>log</command>, the log for all subdirectories of
- <filename>shazam</filename> is printed too, in a recursive
- manner.</para>
-
- <para>Use the <command>log</command> command to view the history of
- one or more files, as it's stored in the CVS repository. You can
- even use it to view the log message of a specific revision, if you
- add the <option>-r<replaceable>rev</replaceable></option> to the
- <command>log</command> command:</para>
-
- <screen>&prompt.user; <userinput>cvs log -r1.2 shazam</userinput></screen>
-
- <para>This will print only the log message for revision
- <literal>1.2</literal> of file <filename>shazam</filename> if it is
- a file, or the log message for revision <literal>1.2</literal> of
- each file under <filename>shazam</filename> if it is a
- directory.</para>
- </listitem>
-
- <listitem>
- <para>See who did what with the <command>annotate</command> command.
- This command shows you each line of the specified file or
- files, along with which user most recently changed that
- line.</para>
-
- <screen>&prompt.user; <userinput>cvs annotate shazam</userinput></screen>
- </listitem>
-
- <listitem>
- <para>Add new files with the <command>add</command> command.</para>
-
- <para>Create the file, <command>cvs add</command> it, then
- <command>cvs commit</command> it.</para>
-
- <para>Similarly, you can add new directories by creating them
- and then <command>cvs add</command>ing them. Note that you
- don't need to commit directories.</para>
- </listitem>
-
- <listitem>
- <para>Remove obsolete files with the <command>remove</command> command.</para>
-
- <para>Remove the file, then <command>cvs rm</command> it, then
- <command>cvs commit</command> it.</para>
- </listitem>
-
- <listitem>
- <para>Commit with the <command>commit</command> or
- <command>checkin</command> command.</para>
-
- <table frame="none">
- <title>Useful <command>cvs commit</command> options</title>
-
- <tgroup cols=2>
- <tbody>
- <row>
- <entry><option>-f</option></entry>
- <entry>Force a commit of an unmodified file.</entry>
- </row>
-
- <row>
- <entry><option>-m<replaceable>msg</replaceable></option></entry>
- <entry>Specify a commit message on the command line rather
- than invoking an editor.</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <para>Use the <option>-f</option> option if you realize that
- you left out important information from the commit message.</para>
-
- <para>Good commit messages are important. They tell others
- why you did the changes you did, not just right here and now,
- but months or years from now when someone wonders why some
- seemingly illogical or inefficient piece of code snuck into
- your source file. It's also an invaluable aid to deciding
- which changes to MFC and which not to MFC.</para>
-
- <para>Don't waste space in the commit messages explaining
- <emphasis>what</emphasis> you did. That's what
- <command>cvs diff</command> is for. Instead, tell us
- <emphasis>why</emphasis> you did it.</para>
-
- <para>Avoid committing several unrelated changes in one go. It
- makes merging difficult, and also makes it harder to determine
- which change is the culprit if a bug crops up.</para>
-
- <para>Avoid committing style or whitespace fixes and
- functionality fixes in one go. It makes merging difficult,
- and also makes it harder to understand just what functional
- changes were made.</para>
-
- <para>Avoid committing changes to multiple files in one go
- with a generic, vague message. Instead, commit each file (or
- small groups of files) with tailored commit messages.</para>
-
- <para>Before committing, <emphasis>always</emphasis>:</para>
-
- <itemizedlist>
- <listitem>
- <para>verify which branch you're committing to, using
- <command>cvs status</command>.</para>
- </listitem>
-
- <listitem>
- <para>review your diffs, using
- <command>cvs diff</command></para>
- </listitem>
- </itemizedlist>
-
- <para>Also, ALWAYS specify which files to commit explicitly on
- the command line, so you don't accidentally commit other files
- than the ones you intended - <command>cvs commit</command>
- with no arguments will commit every modification in your
- current working directory and every subdirectory.</para>
- </listitem>
- </orderedlist>
-
- <para>Additional tips and tricks:</para>
-
- <orderedlist>
- <listitem>
-
- <para>You can place commonly used options in your
- <filename>~/.cvsrc</filename>, like this:</para>
-
- <programlisting>cvs -z3
-diff -Nu
-update -Pd
-checkout -P</programlisting>
-
- <para>This example says:</para>
-
- <itemizedlist>
- <listitem>
- <para>always use compression level 3 when talking to a
- remote server. This is a life-saver when working over a
- slow connection.</para>
- </listitem>
-
- <listitem>
- <para>always use the <option>-N</option> (show added or
- removed files) and <option>-u</option> (unified diff
- format) options to &man.diff.1;.</para>
- </listitem>
-
- <listitem>
- <para>always use the <option>-P</option> (prune empty
- directories) and <option>-d</option> (check out new
- directories) options when updating.</para>
- </listitem>
-
- <listitem>
- <para>always use the <option>-P</option> (prune empty
- directories) option when checking out.</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para>Use Eivind Eklund's <command>cdiff</command> script to
- view unidiffs. It's a wrapper for &man.less.1; that adds ANSI
- color codes to make hunk headers, outtakes and additions stand
- out; context and garbage are unmodified. It also expands tabs
- properly (tabs often look wrong in diffs because of the extra
- character in front of each line).</para>
-
- <para><ulink url="http://people.FreeBSD.org/~eivind/cdiff">http://people.FreeBSD.org/~eivind/cdiff</ulink></para>
-
- <para>Simply use it instead of &man.more.1; or &man.less.1;:</para>
-
- <screen>&prompt.user; <userinput>cvs diff -Nu shazam | cdiff</userinput></screen>
-
- <para>Alternatively some editors like &man.vim.1;
- (ports/editors/vim5) have color support and when used as
- a pager with color syntax highlighting switched on will
- highlight many types of file, including diffs, patches,
- and cvs/rcs logs. </para>
-
- <screen>&prompt.user; <userinput> echo "syn on" >> ~/.vimrc </userinput>
-&prompt.user; <userinput> cvs diff -Nu shazam | vim -</userinput>
-&prompt.user; <userinput> cvs log shazam | vim -</userinput> </screen>
- </listitem>
-
- <listitem>
- <para>CVS is old, arcane, crufty and buggy, and sometimes
- exhibits non-deterministic behavior which some claim as proof
- that it's actually merely the Newtonian manifestation of a
- sentient transdimensional entity. It's not humanly possible
- to know its every quirk inside out, so don't be afraid to ask
- the resident AI (<email>cvs@FreeBSD.org</email>) for help when
- you screw up.</para>
- </listitem>
-
- <listitem>
- <para>Don't leave the <command>cvs commit</command> command in commit
- message editing mode for too long (more than 2-3 minutes). It
- locks the directory you are working with and will prevent other
- developers from committing into the same directory. If you have
- to type a long commit message, type it before executing
- <command>cvs commit</command>, and insert it into the commit
- message.</para>
- </listitem>
- </orderedlist>
-
- </sect1>
-
- <sect1 id="conventions">
- <title>Conventions and Traditions</title>
-
- <para>As a new committer there are a number of things you should do
- first.</para>
-
- <itemizedlist>
- <listitem>
- <para>Add yourself to the <quote>Developers</quote> section of
- the <ulink url="../contributors">Contributors List</ulink>
- and remove yourself from the <quote>Additional
- Contributors</quote> section.</para>
-
- <para>This is a relatively easy task, but remains a good first test of
- your CVS skills.</para>
- </listitem>
-
- <listitem>
- <para>Add an entry for yourself to
- <filename>www/en/news/news.xml</filename>. Look for the other
- entries that look like <quote>A new committer</quote> and follow the
- format.</para>
- </listitem>
-
- <listitem>
- <para>If you have a PGP or GnuPG key, you may want to add it to
- <filename>doc/en_US.ISO8859-1/books/handbook/pgpkeys</filename>.
- </para>
- </listitem>
-
- <listitem>
- <para>Some people add an entry for themselves to
- <filename>ports/astro/xearth/files/freebsd.committers.markers</filename>.</para>
- </listitem>
-
- <listitem>
- <para>Some people add an entry for themselves to <filename>src/usr.bin/calendar/calendars/calendar.freebsd</filename>.</para>
- </listitem>
-
- <listitem>
- <para>Introduce yourself to the other committers, otherwise no one
- will have any idea who you are or what you are working on. You do
- not have to write a comprehensive biography, just write a paragraph
- or two about who you are and what you plan to be working on as a
- committer in FreeBSD. Email this to
- <email>developers@FreeBSD.org</email> and you will be on your
- way!</para>
- </listitem>
-
- <listitem>
- <para>Log into <hostid>hub.FreeBSD.org</hostid> and create a
- <filename>/var/forward/<replaceable>user</replaceable></filename>
- (where <replaceable>user</replaceable> is your username) file
- containing the e-mail address where you want mail addressed to
- <replaceable>yourusername</replaceable>@FreeBSD.org to be forwarded.
- This includes all of the commit messages as well as any other mail
- addressed to <email>cvs-committers@FreeBSD.org</email> and
- <email>developers@FreeBSD.org</email>. Really
- large mailboxes which have taken up permanent residence on
- <hostid>hub</hostid> often get <quote>accidently</quote> truncated
- without warning, so forward it or read it and you will not lose
- it.</para>
- </listitem>
- </itemizedlist>
-
- <para>All new committers also have a mentor assigned to them for
- the first few months. Your mentor is more or less responsible for
- explaining anything which is confusing to you and is also
- responsible for your actions during this initial period. If you
- make a bogus commit, it is only going to embarrass your mentor
- and you should probably make it a policy to pass at least your
- first few commits by your mentor before committing it to the
- repository.</para>
-
- <para>All commits should go to &os.current; first
- before being merged to &os.stable;. No major new
- features or high-risk modifications should be made to the
- &os.stable; branch.</para>
- </sect1>
-
- <sect1 id="developer.relations">
- <title>Developer Relations</title>
-
- <para>If you are working directly on your own code or on code
- which is already well established as your responsibility, then
- there is probably little need to check with other committers
- before jumping in with a commit. If you see a bug in an area of
- the system which is clearly orphaned (and there are a few such
- areas, to our shame), the same applies. If, however, you are
- about to modify something which is clearly being actively
- maintained by someone else (and it is only by watching the
- <literal>cvs-committers</literal> mailing list that you can
- really get a feel for just what is and is not) then consider
- sending the change to them instead, just as you would have
- before becoming a committer. For ports, you should contact the
- listed <makevar>MAINTAINER</makevar> in the
- <filename>Makefile</filename>. For other parts of the
- repository, if you are unsure who the active maintainer might
- be, it may help to scan the output of <command>cvs log</command>
- to see who has committed changes in the past. &a.fenner; has
- written a nice shell script that can help determine who the
- active maintainer might be. It lists each person who has
- committed to a given file along with the number of commits each
- person has made. It can be found on <hostid>freefall</hostid>
- at <filename>~fenner/bin/whodid</filename>. If your queries go
- unanswered or the committer otherwise indicates a lack of
- proprietary interest in the area affected, go ahead and commit
- it.</para>
-
- <para>If you are unsure about a commit for any reason at
- all, have it reviewed by <literal>-hackers</literal>
- before committing. Better to have it flamed then and there
- rather than when it is part of the CVS repository. If you do
- happen to commit something which results in controversy
- erupting, you may also wish to consider backing the change out
- again until the matter is settled. Remember &ndash; with CVS we
- can always change it back.</para>
- </sect1>
-
- <sect1 id="gnats">
- <title>GNATS</title>
-
- <para>The FreeBSD Project utilizes
- <application>GNATS</application> for tracking bugs and change
- requests. Be sure that if you commit a fix or suggestion found
- in a <application>GNATS</application> PR, you use
- <command>edit-pr <replaceable>pr-number</replaceable></command>
- on <hostid>freefall</hostid> to close it. It is also considered
- nice if you take time to close any PRs associated with your
- commits, if appropriate. You can also make use of
- &man.send-pr.1; yourself for proposing any change which you feel
- should probably be made, pending a more extensive peer-review
- first.</para>
-
- <para>You can find out more about <application>GNATS</application>
- at:</para>
-
- <itemizedlist>
- <listitem>
- <para><ulink url="http://www.cs.utah.edu/csinfo/texinfo/gnats/gnats.html">http://www.cs.utah.edu/csinfo/texinfo/gnats/gnats.html</ulink></para>
- </listitem>
-
- <listitem>
- <para><ulink url="http://www.FreeBSD.org/support.html">http://www.FreeBSD.org/support.html</ulink></para>
- </listitem>
-
- <listitem>
- <para><ulink url="http://www.FreeBSD.org/send-pr.html">http://www.FreeBSD.org/send-pr.html</ulink></para>
- </listitem>
-
- <listitem>
- <para>&man.send-pr.1;</para>
- </listitem>
- </itemizedlist>
-
- <para>You can run a local copy of GNATS, and then integrate the FreeBSD
- GNATS tree in to it using CVSup. Then you can run GNATS commands
- locally, or use other interfaces, such as <command>tkgnats</command>.
- This lets you query the PR database without needing to be connected to
- the Internet.</para>
-
- <procedure>
- <title>Using a local GNATS tree</title>
-
- <step>
- <para>If you are not already downloading the GNATS tree, add this line
- to your <filename>supfile</filename>, and re-sup. Note that since
- GNATS is not under CVS control it has no tag, so if you are adding
- it to your existing <filename>supfile</filename> it should appear
- before any <quote>tag=</quote> entry as these remain active once set.
- </para>
-
- <programlisting>gnats release=current prefix=/usr</programlisting>
-
- <para>This will place the FreeBSD GNATS tree in
- <filename>/usr/gnats</filename>. You can use a
- <emphasis>refuse</emphasis> file to control which categories to
- receive. For example, to only receive <literal>docs</literal> PRs,
- put this line in
- <filename>/usr/local/etc/cvsup/sup/refuse</filename><footnote>
- <para>The precise path depends on the <literal>*default
- base</literal> setting in your
- <filename>supfile</filename>.</para>
- </footnote>.</para>
-
- <programlisting>gnats/[a-ce-z]*</programlisting>
-
- <para>The rest of these examples assume you have only supped the
- <literal>docs</literal> category. Adjust them as necessary,
- depending on the categories you are synching.</para>
- </step>
-
- <step>
- <para>Install the GNATS port from
- <filename>ports/databases/gnats</filename>. This will place the
- various GNATS directories under
- <filename>$PREFIX/share/gnats</filename>.</para>
- </step>
-
- <step>
- <para>Symlink the GNATS directories you are supping under the version
- of GNATS you have installed.</para>
-
- <screen>&prompt.root; <userinput>cd /usr/local/share/gnats/gnats-db</userinput>
-&prompt.root; <userinput>ln -s /usr/gnats/docs</userinput></screen>
-
- <para>Repeat as necessary, depending on how many GNATS categories you
- are synching.</para>
- </step>
-
- <step>
- <para>Update the GNATS <filename>categories</filename> file with these
- categories. The file is
- <filename>$PREFIX/share/gnats/gnats-db/gnats-adm/categories</filename>.</para>
-
- <programlisting># This category is mandatory
-pending:Category for faulty PRs:gnats-admin:
-#
-# FreeBSD categories
-#
-docs:Documentation Bug:nik:</programlisting>
- </step>
-
- <step>
- <para>Run <filename>$PREFIX/libexec/gnats/gen-index</filename> to
- recreate the GNATS index. The output has to be redirected to
- <filename>$PREFIX/share/gnats/gnats-db/gnats-adm/index</filename>.
- You can do this periodically from &man.cron.8;, or run &man.cvsup.1;
- from a shell script that does this as well.</para>
-
- <screen>&prompt.root; <userinput>/usr/local/libexec/gnats/gen-index \
- > /usr/local/share/gnats/gnats-db/gnats-adm/index</userinput></screen>
- </step>
-
- <step>
- <para>Test the configuration by querying the PR database. This
- command shows open <literal>docs</literal> PRs.</para>
-
- <screen>&prompt.root; <userinput>query-pr -c docs -s open</userinput></screen>
-
- <para>Other interfaces, like
- <filename>ports/databases/tkgnats</filename> should also work
- nicely.</para>
- </step>
-
- <step>
- <para>Pick a PR and close it.</para>
- </step>
- </procedure>
-
- <note>
- <para>This procedure only works to allow you to view and query the PRs
- locally. To edit or close them you will still have to log in to
- <hostid>freefall</hostid> and do it from there.</para>
- </note>
- </sect1>
-
- <sect1 id="people">
- <title>Who's Who</title>
-
- <para>Besides Peter Wemm and John Polstra, the repository
- meisters, there are other FreeBSD project members whom you will
- probably get to know in your role as a committer. Briefly,
- and by no means all-inclusively, these are:</para>
-
- <variablelist>
- <varlistentry>
- <term>&a.asami;</term>
-
- <listitem>
- <para>Satoshi is the Ports Wraith, meaning that he has
- ultimate authority over any modifications to the ports
- collection or the ports skeleton makefiles. He is also
- the one responsible for administering ports freezes before
- the releases.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>&a.nik;</term>
-
- <listitem>
- <para>Nik oversees the
- <ulink url="http://www.FreeBSD.org/docproj/index.html">Doc. Project</ulink>.
- As well as writing documentation he put together the
- infrastructure under <filename>doc/share/mk</filename> and the
- stylesheets and related code under
- <filename>doc/share/sgml</filename>. If you've got questions
- about these you are encouraged to send them via the
- <email>doc@FreeBSD.org</email> mailing list. Committers
- interested in contributing to the documentation should familiarise
- themself with the
- <ulink url="http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/fdp-primer/index.html">Documentation Project Primer</ulink>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>&a.ru;</term>
-
- <listitem>
- <para>Ruslan is Mister &man.mdoc.7;. If you are writing a
- man page and need
- some advice on the structure, or the markup, ask Ruslan.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>&a.bde;</term>
-
- <listitem>
- <para>Bruce is the Style Police-Meister.
- When you do a commit that could have been done better,
- Bruce will be there to tell you. Be thankful that someone
- is. Bruce is also very knowledgeable on the various
- standards applicable to FreeBSD.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>&a.gallatin;</term>
- <term>&a.mjacob;</term>
- <term>&a.dfr;</term>
- <term>&a.obrien;</term>
-
- <listitem>
- <para>These are the primary developers and overseers of the
- DEC Alpha AXP platform.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>&a.dg;</term>
-
- <listitem>
- <para>David is the overseer of the
- VM system. If you have a VM system change in mind,
- coordinate it with David.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>&a.jkh;</term>
-
- <listitem>
- <para>Jordan is the release engineer. He is responsible for
- setting release deadlines and controlling the release
- process. During code freezes, he also has final authority
- on all changes to the system for whichever branch is
- pending release status. If there is something you want
- merged from &os.current; to
- &os.stable; (whatever values those may have
- at any given time), he is also the one to talk to about
- it.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>&a.bmah;</term>
-
- <listitem>
- <para>Bruce is keeper of the release notes
- (<filename>src/release/texts/*</filename> or
- <filename>src/release/doc/*</filename>,
- as appropriate). If you commit a
- change that you think is worthy of mention in the release notes,
- please make sure Bruce knows about it. Better still, send him
- a patch with your suggested commentary for the release
- notes.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>&a.obrien;</term>
-
- <listitem>
- <para>David is the unofficial <filename>src/contrib</filename>-Meister.
- If you have something
- significant you'd like to do there, you should probably
- coordinate it with David first. Please consult him before
- importing into <filename>src/contrib</filename> if you have
- never done this before in the FreeBSD CVS repository. Also
- if you need to commit to something you do not maintain in
- <filename>src/contrib</filename> and it is unclear who the
- maintainer / point of contact is. (It is also not a bad idea
- to consult David if you need to make a non-import commit to
- something you maintain in <filename>src/contrib</filename> and
- you are new to how FreeBSD does things.)</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>&a.brian;</term>
-
- <listitem>
- <para>Official maintainer of
- <filename>/usr/sbin/ppp</filename>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>&a.wollman;</term>
-
- <listitem>
- <para>If you need advice on obscure network internals or
- aren't sure of some potential change to the networking
- subsystem you have in mind, Garrett is someone to talk
- to. Garrett is also very knowledgeable on the various
- standards applicable to FreeBSD.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>&a.committers;</term>
-
- <listitem>
- <para>cvs-committers is the entity that CVS uses to send you all your
- commit messages. You should <emphasis>never</emphasis> send email
- directly to this list. You should only send replies to this list
- when they are short and are directly related to a commit.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>&a.developers;</term>
-
- <listitem>
- <para>developers is all committers. This list was created to be a
- forum for the committers "community" issues. Examples are Core
- voting, announcements, etc... developers@FreeBSD.org is
- <emphasis>not</emphasis> intended as a place for code reviews or a
- replacement for arch@FreeBSD.org or audit@FreeBSD.org. In fact
- using it as such hurts the FreeBSD Project as it gives a sense of a
- closed list where general decisions affecting all of the FreeBSD
- using community are made with out being "open".</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect1>
-
- <sect1 id="ssh.guide">
- <title>SSH Quick-Start Guide</title>
-
- <procedure>
- <step>
- <para>If you are using FreeBSD 4.0 or later,
- OpenSSH is included in the base system.
- If you are using an earlier release,
- update and install one of the SSH ports. In general,
- you will probably want to get OpenSSH from the port in
- <filename>/usr/ports/security/openssh</filename>. You
- may also wish to check out the original ssh1 in
- <filename>/usr/ports/security/ssh</filename>, but make
- certain you pay attention to its license. Note that both
- of these ports cannot be installed at the same time.</para>
- </step>
-
- <step>
- <para>If you do not wish to type your password in every
- time you use &man.ssh.1;, and you use RSA keys to
- authenticate, &man.ssh-agent.1; is there for your
- convenience. If you want to use &man.ssh-agent.1;, make
- sure that you run it before running other applications. X
- users, for example, usually do this from their
- <filename>.xsession</filename> or
- <filename>.xinitrc</filename> file. See &man.ssh-agent.1;
- for details.</para>
- </step>
-
- <step>
- <para>Generate a key pair using &man.ssh-keygen.1;. The key
- pair will wind up in the
- <filename><envar>$HOME</envar>/.ssh</filename>
- directory.</para>
- </step>
-
- <step>
- <para>Send your public key
- (<filename><envar>$HOME</envar>/.ssh/identity.pub</filename>)
- to the person setting you up as a committer so it can be put
- into your <filename>authorized_keys</filename> file in your
- home directory on <hostid>freefall</hostid>
- (i.e.
- <filename><envar>$HOME</envar>/.ssh/authorized_keys</filename>).
- </para>
- </step>
- </procedure>
-
- <para>Now you should be able to use &man.ssh-add.1; for
- authentication once per session. This will prompt you for
- your private key's pass phrase, and then store it in your
- authentication agent (&man.ssh-agent.1;). If you no longer
- wish to have your key stored in the agent, issuing
- <command>ssh-add -d</command> will remove it.</para>
-
- <para>Test by doing something such as <command>ssh
- freefall.FreeBSD.org ls /usr</command>.</para>
-
- <para>For more information, see
- <filename>/usr/ports/security/openssh</filename>, &man.ssh.1;,
- &man.ssh-add.1;, &man.ssh-agent.1;, &man.ssh-keygen.1;, and
- &man.scp.1;.</para>
- </sect1>
-
- <sect1>
- <title>The FreeBSD Committers' Big List of Rules</title>
-
- <orderedlist>
- <listitem>
- <para>Respect other committers.</para>
- </listitem>
-
- <listitem>
- <para>Respect other contributors.</para>
- </listitem>
-
- <listitem>
- <para>Discuss any significant change
- <emphasis>before</emphasis> committing.</para>
- </listitem>
-
- <listitem>
- <para>Respect existing maintainers (if listed in the
- <makevar>MAINTAINER</makevar> field in
- <filename>Makefile</filename> or in the
- <filename>MAINTAINER</filename> file in the top-level
- directory).</para>
- </listitem>
-
- <listitem>
- <para>Never touch the repository directly. Ask a
- Repomeister.</para>
- </listitem>
-
- <listitem>
- <para>Any disputed change must be backed out pending
- resolution of the dispute if requested by a maintainer.
- Security related changes may
- override a maintainer's wishes at the Security Officer's
- discretion.</para>
- </listitem>
-
- <listitem>
- <para>Changes go to &os.current; before
- &os.stable; unless specifically permitted by
- the release engineer or unless they're not applicable to
- &os.current;. Any non-trivial or non-urgent
- change which is applicable should also be allowed to sit in
- &os.current; for at least 3 days before
- merging so that it can be given sufficient testing. The
- release engineer has the same authority over the
- &os.stable; branch as outlined for the
- maintainer in rule #6.</para>
- </listitem>
-
- <listitem>
- <para>Don't fight in public with other committers; it looks
- bad. If you must <quote>strongly disagree</quote> about
- something, do so only in private.</para>
- </listitem>
-
- <listitem>
- <para>Respect all code freezes and read the
- <literal>committers</literal> mailing list in a timely manner
- so you know when a code freeze is in effect.</para>
- </listitem>
-
- <listitem>
- <para>When in doubt on any procedure, ask first!</para>
- </listitem>
-
- <listitem>
- <para>Test your changes before committing them.</para>
- </listitem>
-
- <listitem>
- <para>Don't commit to anything under the
- <filename>src/contrib</filename>,
- <filename>src/crypto</filename>, and
- <filename>src/sys/contrib</filename> trees without
- <emphasis>explicit</emphasis> approval from the respective
- maintainer(s).</para>
- </listitem>
- </orderedlist>
-
- <para>As noted, breaking some of these rules can be grounds for
- suspension or, upon repeated offense, permanent removal of
- commit privileges. Three or more members of core
- acting in unison,
- have the power to temporarily suspend commit privileges until
- <literal>-core</literal> as a whole has the chance to review the
- issue. In case of an <quote>emergency</quote> (a committer
- doing damage to the repository), a temporary suspension may also
- be done by the repository meisters or any other member of core
- who may happen to be awake at the time. Only core as a whole
- has the authority to suspend commit privileges for any
- significant length of time or to remove them permanently, the
- latter generally only being done after consultation with
- committers. This rule does not exist to set core up as a bunch
- of cruel dictators who can dispose of committers as casually as
- empty soda cans, but to give the project a kind of safety fuse.
- If someone is seriously out of control, it's important to be
- able to deal with this immediately rather than be paralyzed by
- debate. In all cases, a committer whose privileges are
- suspended or revoked is entitled to a <quote>hearing</quote>,
- the total duration of the suspension being determined at that
- time. A committer whose privileges are suspended may also
- request a review of the decision after 30 days and every 30 days
- thereafter (unless the total suspension period is less than 30
- days). A committer whose privileges have been revoked entirely
- may request a review after a period of 6 months have elapsed.
- This review policy is <emphasis>strictly informal</emphasis>
- and, in all cases, core reserves the right to either act on or
- disregard requests for review if they feel their original
- decision to be the right one.</para>
-
- <para>In all other aspects of project operation, core is a subset
- of committers and is bound by the <emphasis>same
- rules</emphasis>. Just because someone is in core doesn't mean
- that they have special dispensation to step outside of any of
- the lines painted here; core's <quote>special powers</quote>
- only kick in when it acts as a group, not on an individual
- basis. As individuals, we are all committers first and core
- second.</para>
-
- <sect2>
- <title>Details</title>
-
- <orderedlist>
- <listitem>
- <para>Respect other committers.</para>
-
- <para>This means that you need to treat other committers as
- the peer-group developers that they are. Despite our
- occasional attempts to prove the contrary, one doesn't get
- into committers by being stupid and nothing rankles more
- than being treated that way by one of your peers. Whether
- we always feel respect for one another or not (and
- everyone has off days), we still have to
- <emphasis>treat</emphasis> other committers with respect
- at all times or the whole team structure rapidly breaks
- down.</para>
-
- <para>Being able to work together long term is this project's
- greatest asset, one far more important than any set of
- changes to the code, and turning arguments about code into
- issues that affect our long-term ability to work
- harmoniously together is just not worth the trade-off by
- any conceivable stretch of the imagination.</para>
-
- <para>To comply with this rule, don't send email when you're
- angry or otherwise behave in a manner which is likely to
- strike others as needlessly confrontational. First calm
- down, then think about how to communicate in the most
- effective fashion for convincing the other person(s) that
- your side of the argument is correct, don't just blow off
- some steam so you can feel better in the short term at the
- cost of a long-term flame war. Not only is this very bad
- <quote>energy economics</quote>, but repeated displays of
- public aggression which impair our ability to work well
- together will be dealt with severely by the project
- leadership and may result in suspension or termination of
- your commit privileges. That's never an option which the
- project's leadership enjoys in the slightest, but unity
- comes first. No amount of code or good advice is worth
- trading that away.</para>
- </listitem>
-
- <listitem>
- <para>Respect other contributors.</para>
-
- <para>You weren't always a committer. At one time you were
- a contributor. Remember that at all times. Remember what
- it was like trying to get help and attention. Don't forget
- that your work as a contributor time was very important to
- you. Remember what it was like. Don't discourage, belittle,
- or demean contributors. Treat them with respect. They are
- our committers in waiting. They are every bit as important
- to the project as committers. Their contributions are as
- valid and as important as your own. After all, you made
- many contributions before you became a committer. Always
- remember that. </para>
-
- <para>Consider the points raised under 'Respect other committers'
- and apply them also to contributors.</para>
- </listitem>
-
- <listitem>
- <para>Discuss any significant change
- <emphasis>before</emphasis> committing.</para>
-
- <para>The CVS repository is not where changes should be
- initially submitted for correctness or argued over, that
- should happen first in the mailing lists and then
- committed only once something resembling consensus has
- been reached. This doesn't mean that you have to ask
- permission before correcting every obvious syntax error or
- man page misspelling, simply that you should try to
- develop a feel for when a proposed change isn't quite such
- a no-brainer and requires some feedback first. People
- really don't mind sweeping changes if the result is
- something clearly better than what they had before, they
- just don't like being <emphasis>surprised</emphasis> by
- those changes. The very best way of making sure that
- you're on the right track is to have your code reviewed by
- one or more other committers.</para>
-
- <para>When in doubt, ask for review!</para>
- </listitem>
-
- <listitem>
- <para>Respect existing maintainers if listed.</para>
-
- <para>Many parts of FreeBSD aren't <quote>owned</quote> in
- the sense that any specific individual will jump up and
- yell if you commit a change to <quote>their</quote> area,
- but it still pays to check first. One convention we use
- is to put a maintainer line in the
- <filename>Makefile</filename> for any package or subtree
- which is being actively maintained by one or more people;
- see <ulink
- url="http://www.FreeBSD.org/handbook/policies.html">http://www.FreeBSD.org/handbook/policies.html</ulink>
- for documentation on this. Where sections of code have
- several maintainers, commits to affected areas by one
- maintainer need to be reviewed by at least one other
- maintainer. In cases where the
- <quote>maintainer-ship</quote> of something isn't clear,
- you can also look at the CVS logs for the file(s) in
- question and see if someone has been working recently or
- predominantly in that area.</para>
-
- <para>Other areas of FreeBSD fall under the control of
- someone who manages an overall category of FreeBSD
- evolution, such as internationalization or networking.
- See <ulink
- url="../contributors/staff-who.html">http://www.FreeBSD.org/doc/en_US.ISO8859-1/articles/contributors/staff-who.html</ulink> for more information on this.</para>
- </listitem>
-
- <listitem>
- <para>Never touch the repository directly. Ask a
- Repomeister.</para>
-
- <para>This is pretty clear - you're not allowed to make
- direct modifications to the CVS repository, period. In
- case of difficulty, ask one of the repository meisters by
- sending mail to <email>cvs@FreeBSD.org</email> and simply
- wait for them to fix the problem and get back to you. Do
- not attempt to fix the problem yourself!</para>
-
- <para>If you're thinking about putting down a tag or doing a
- new import of code on a vendor branch, you might also find
- it useful to ask for advice first. A lot of people get
- this wrong the first few times and the consequences are
- expensive in terms of files touched and angry CVSup/CTM
- folks who are suddenly getting a lot of changes sent over
- unnecessarily.</para>
- </listitem>
-
- <listitem>
- <para>Any disputed change must be backed out pending
- resolution of the dispute if requested by a maintainer.
- Security related changes may
- override a maintainer's wishes at the Security Officer's
- discretion.</para>
-
- <para>This may be hard to swallow in times of conflict (when
- each side is convinced that they're in the right, of
- course) but CVS makes it unnecessary to have an ongoing
- dispute raging when it's far easier to simply reverse the
- disputed change, get everyone calmed down again and then
- try and figure out how best to proceed. If the change
- turns out to be the best thing after all, it can be easily
- brought back. If it turns out not to be, then the users
- didn't have to live with the bogus change in the tree
- while everyone was busily debating its merits. People
- very very rarely call for back-outs in the repository
- since discussion generally exposes bad or controversial
- changes before the commit even happens, but on such rare
- occasions the back-out should be done without argument so
- that we can get immediately on to the topic of figuring
- out whether it was bogus or not.</para>
- </listitem>
-
- <listitem>
- <para>Changes go to &os.current; before
- &os.stable; unless specifically permitted
- by the release engineer or unless they're not applicable
- to &os.current;. Any non-trivial or
- non-urgent change which is applicable should also be
- allowed to sit in &os.current; for at least
- 3 days before merging so that it can be given sufficient
- testing. The release engineer has the same authority over
- the &os.stable; branch as outlined in rule
- #6.</para>
-
- <para>This is another <quote>don't argue about it</quote>
- issue since it's the release engineer who is ultimately
- responsible (and gets beaten up) if a change turns out to
- be bad. Please respect this and give the release engineer
- your full cooperation when it comes to the
- &os.stable; branch. The management of
- &os.stable; may frequently seem to be
- overly conservative to the casual observer, but also bear
- in mind the fact that conservatism is supposed to be the
- hallmark of &os.stable; and different rules
- apply there than in &os.current;. There's
- also really no point in having &os.current;
- be a testing ground if changes are merged over to
- &os.stable; immediately. Changes need a
- chance to be tested by the &os.current;
- developers, so allow some time to elapse before merging
- unless the &os.stable; fix is critical,
- time sensitive or so obvious as to make further testing
- unnecessary (spelling fixes to manpages, obvious bug/typo
- fixes, etc.) In other words, apply common sense.</para>
- </listitem>
-
- <listitem>
- <para>Don't fight in public with other committers; it looks
- bad. If you must <quote>strongly disagree</quote> about
- something, do so only in private.</para>
-
- <para>This project has a public image to uphold and that
- image is very important to all of us, especially if we are
- to continue to attract new members. There will be
- occasions when, despite everyone's very best attempts at
- self-control, tempers are lost and angry words are
- exchanged, and the best we can do is try and minimize the
- effects of this until everyone has cooled back down. That
- means that you should not air your angry words in public
- and you should not forward private correspondence to
- public mailing lists or aliases. What people say
- one-to-one is often much less sugar-coated than what they
- would say in public, and such communications therefore
- have no place there - they only serve to inflame an
- already bad situation. If the person sending you a
- flame-o-gram at least had the grace to send it privately,
- then have the grace to keep it private yourself. If you
- feel you are being unfairly treated by another developer,
- and it is causing you anguish, bring the matter up with
- core rather than taking it public. We will do our best to
- play peace makers and get things back to sanity. In cases
- where the dispute involves a change to the codebase and
- the participants do not appear to be reaching an amicable
- agreement, core may appoint a mutually-agreeable 3rd party
- to resolve the dispute. All parties involved must then
- agree to be bound by the decision reached by this 3rd
- party.</para>
- </listitem>
-
- <listitem>
- <para>Respect all code freezes and read the
- <literal>committers</literal> mailing list on a timely
- basis so you know when they are.</para>
-
- <para>Committing changes during a code freeze is a really
- big mistake and committers are expected to keep up-to-date
- on what's going on before jumping in after a long absence
- and committing 10 megabytes worth of accumulated stuff.
- People who abuse this on a regular basis will have their
- commit privileges suspended until they get back from the
- FreeBSD Happy Reeducation Camp we run in Greenland.</para>
- </listitem>
-
- <listitem>
- <para>When in doubt on any procedure, ask first!</para>
-
- <para>Many mistakes are made because someone is in a hurry
- and just assumes they know the right way of doing
- something. If you have not done it before, chances are
- good that you do not actually know the way we do things
- and really need to ask first or you are going to
- completely embarrass yourself in public. There's no shame
- in asking <quote>how in the heck do I do this?</quote> We
- already know you are an intelligent person; otherwise, you
- would not be a committer.</para>
- </listitem>
-
- <listitem>
- <para>Test your changes before committing them.</para>
-
- <para>This may sound obvious, but if it really were so
- obvious then we probably wouldn't see so many cases of
- people clearly not doing this. If your changes are to the
- kernel, make sure you can still compile both GENERIC and
- LINT. If your changes are anywhere else, make sure you
- can still make world. If your changes are to a branch,
- make sure your testing occurs with a machine which is
- running that code. If you have a change which also may
- break another architecture, be sure and test on all
- supported architectures. Currently, this is only the x86
- and the Alpha so it's pretty easy to do. If you need to
- test on the AXP, your account on <hostid
- role="fqdn">beast.FreeBSD.org</hostid> will let you
- compile and test Alpha binaries/kernels/etc. As other
- architectures are added to the FreeBSD supported platforms
- list, the appropriate shared testing resources will be
- made available.</para>
- </listitem>
-
- <listitem>
- <para>Don't commit to anything under the
- <filename>src/contrib</filename>,
- <filename>src/crypto</filename>, and
- <filename>src/sys/contrib</filename> trees without
- <emphasis>explicit</emphasis> approval from the respective
- maintainer(s).</para>
-
- <para>The trees mentioned above are for contributed software
- usually imported onto a vendor branch. Committing something
- there, even if it doesn't take the file off the vendor branch,
- may cause unnecessary headaches for those responsible for
- maintaining that particular piece of software. Thus, unless
- you have <emphasis>explicit</emphasis> approval from the
- maintainer (or you are the maintainer), do
- <emphasis>not</emphasis> commit there!</para>
-
- <para>Please note that this doesn't mean you shouldn't try to
- improve the software in question; you are still more than
- welcome to do so. Ideally, you should submit your patches to
- the vendor. If your changes are FreeBSD-specific, talk to the
- maintainer; they may be willing to apply them locally. But
- whatever you do, do <emphasis>not</emphasis> commit there by
- yourself!</para>
-
- <para>Contact the &a.core; if you wish to take up maintainership
- of an unmaintained part of the tree.</para>
- </listitem>
- </orderedlist>
- </sect2>
-
- <sect2>
- <title>Other Suggestions</title>
-
- <para>When committing documentation changes, use a spell checker
- before committing. :) For all SGML docs, you should also
- verify that your formatting directives are correct by running
- <command>make lint</command>.</para>
-
- <para>For all on-line manual pages, run <command>manck</command>
- (from ports) over the man page to verify all of the cross
- references and file references are correct and that the man
- page has all of the appropriate <makevar>MLINK</makevar>s
- installed.</para>
-
- <para>Do not mix style fixes with new functionality. A style
- fix is any change which does not modify the functionality of
- the code. Mixing the changes obfuscates the functionality
- change when using <command>cvs diff</command>, which can hide
- any new bugs. Do not include whitespace changes with content
- changes in commits to <filename>doc/</filename> or
- <filename>www/</filename>. The extra clutter in the diffs
- makes the translators' job much more difficult. Instead, make
- any style or whitespace changes in separate commits that are
- clearly labeled as such in the commit message.</para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Ports Specific FAQ</title>
-
- <qandaset>
- <qandadiv>
- <title>Adding a New Port</title>
-
- <qandaentry>
- <question>
- <para>How do I add a new port?</para>
- </question>
-
- <answer>
- <para>First, please read the section about repository
- copy.</para>
-
- <para>The easiest way to add a new port is to use the
- <command>addport</command> script on
- <hostid>freefall</hostid>. It will add a port from the
- directory you specify, determining the category automatically
- from the port <filename>Makefile</filename>.
- It will also add an entry to the
- <filename>CVSROOT/modules</filename> file and the port's
- category <filename>Makefile</filename>. It was
- written by &a.mharo; and &a.will;, but Will is the current
- maintainer so please send questions/patches about
- <command>addport</command> to him.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>Any other things I need to know when I add a new
- port?</para>
- </question>
-
- <answer>
- <para>Check the port, preferably to make sure it compiles
- and packages correctly. This is the recommended
- sequence:</para>
-
- <screen>&prompt.root; <userinput>make install</userinput>
-&prompt.root; <userinput>make package</userinput>
-&prompt.root; <userinput>make deinstall</userinput>
-&prompt.root; <userinput>pkg_add <replaceable>package you built above</replaceable></userinput>
-&prompt.root; <userinput>make deinstall</userinput>
-&prompt.root; <userinput>make reinstall</userinput>
-&prompt.root; <userinput>make package</userinput>
- </screen>
-
- <para>The
- <ulink url="http://www.FreeBSD.org/porters-handbook/index.html">Porters
- Handbook</ulink> contains more detailed
- instructions.</para>
-
- <para>Use &man.portlint.1; to check the syntax of the port.
- You don't necessarily have to eliminate all warnings but
- make sure you have fixed the simple ones.</para>
-
- <para>If the port came from a submitter who has not
- contributed to the project before, add that person's
- name to the <ulink
- url="../contributors/contrib-additional.html">Additional
- Contributors</ulink> section of the FreeBSD Contributors
- List.</para>
-
- <para>Close the PR if the port came in as a PR. To close
- a PR, just do
- <userinput>edit-pr <replaceable>PR#</replaceable></userinput>
- on <hostid>freefall</hostid> and change the
- <varname>state</varname> from <constant>open</constant>
- to <constant>closed</constant>. You will be asked to
- enter a log message and then you are done.</para>
- </answer>
- </qandaentry>
- </qandadiv>
-
- <qandadiv>
- <title>Repository Copies</title>
-
- <qandaentry>
- <question>
- <para>When do we need a repository copy?</para>
- </question>
-
- <answer>
- <para>When you want to add a port that is related to
- any port that is already in the tree in a separate
- directory, please send mail to the ports manager asking
- about it. Here <wordasword>related</wordasword> means
- it is a different version or a slightly modified
- version. Examples are
- <filename>print/ghostscript*</filename> (different
- versions) and <filename>x11-wm/windowmaker*</filename>
- (English-only and internationalized version).</para>
-
- <para>Another example is when a port is moved from one
- subdirectory to another, or when you want to change the
- name of a directory because the author(s) renamed their
- software even though it is a
- descendant of a port already in a tree.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>When do we <emphasis>not</emphasis> need a
- repository copy?</para>
- </question>
-
- <answer>
- <para>When there is no history to preserve. If a port is
- added into a wrong category and is moved immediately,
- it suffices to simply <command>cvs remove</command> the
- old one and <command>addport</command> the new
- one.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>What do I need to do?</para>
- </question>
-
- <answer>
- <para>Send mail to the ports manager, who will do a copy
- from the old location/name to the new location/name.
- You will then get a notice, at which point you are
- expected to perform the following:</para>
-
- <procedure>
- <step>
- <para><command>cvs remove</command> the old port (if
- necessary)</para>
- </step>
-
- <step>
- <para>Adjust the parent (category)
- <filename>Makefile</filename></para>
- </step>
-
- <step>
- <para>Update <filename>CVSROOT/modules</filename></para>
- </step>
-
- <step>
- <para>If other ports depend on the updated port,
- change their <filename>Makefile</filename>s'
- dependency lines</para>
- </step>
-
- <step>
- <para>If the port changed categories, modify the
- <makevar>CATEGORIES</makevar> line of the port's
- <filename>Makefile</filename> accordingly</para>
- </step>
- </procedure>
- </answer>
- </qandaentry>
- </qandadiv>
-
- <qandadiv>
- <title>Ports Freeze</title>
-
- <qandaentry>
- <question>
- <para>What is a <quote>ports freeze</quote>?</para>
- </question>
-
- <answer>
- <para>Before a release, it is necessary to restrict
- commits to the ports tree for a short period of time
- while the packages and the release itself are being
- built. This is to ensure consistency among the various
- parts of the release, and is called the <quote>ports
- freeze</quote>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>How long is a ports freeze?</para>
- </question>
-
- <answer>
- <para>Usually an hour or two.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>What does it mean to me?</para>
- </question>
-
- <answer>
- <para>During the ports freeze, you are not allowed to
- commit anything to the tree without explicit approval
- from the ports manager. <quote>Explicit
- approval</quote> here means either of the
- following:</para>
-
- <itemizedlist>
- <listitem>
- <para>You asked the ports manager and got a reply
- saying, <quote>Go ahead and commit
- it.</quote></para>
- </listitem>
-
- <listitem>
- <para>The ports manager sent a mail to you or the
- mailing lists during the ports freeze pointing out
- that the port is broken and has to be fixed.</para>
- </listitem>
- </itemizedlist>
-
- <para>Note that you do not have implicit permission to fix
- a port during the freeze just because it is
- broken.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>How do I know when the ports freeze starts?</para>
- </question>
-
- <answer>
- <para>The ports manager will send out warning messages to
- the <email>freebsd-ports@FreeBSD.org</email> and
- <email>cvs-committers@FreeBSD.org</email> mailing lists
- announcing the start of the impending release, usually
- two or three weeks in advance. The exact starting time
- will not be determined until a few days before the
- actual release. This is because the ports freeze has to
- be synchronized with the release, and it is usually not
- known until then when exactly the release will be
- rolled.</para>
-
- <para>When the freeze starts, there will be another
- announcement to the
- <email>cvs-committers@FreeBSD.org</email> list, of
- course.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>How do I know when the ports freeze ends?</para>
- </question>
-
- <answer>
- <para>A few hours after the release, the ports manager
- will send out a mail to the
- <email>freebsd-ports@FreeBSD.org</email> and
- <email>cvs-committers@FreeBSD.org</email> mailing lists
- announcing the end of the ports freeze. Note that the
- release being cut does not automatically end the freeze.
- We have to make sure there will not be any last minute
- snafus that result in an immediate re-rolling of the
- release.</para>
- </answer>
- </qandaentry>
- </qandadiv>
-
- <qandadiv>
- <title>Miscellaneous Questions</title>
-
- <qandaentry>
- <question>
- <para>How do I know if my port is building correctly or
- not?</para>
- </question>
-
- <answer>
- <para>First, go check
- <ulink url="http://bento.FreeBSD.org/~asami/errorlogs/">http://bento.FreeBSD.org/~asami/errorlogs/</ulink>.
-
- There you will find error logs from the latest package
- building runs on 3-stable, 4-stable and 5-current.</para>
-
- <para>However, just because the port doesn't show up there
- doesn't mean it's building correctly. (One of the
- dependencies may have failed, for instance.) Here are
- the relevant directories on bento, so feel free to dig
- around.</para>
-
- <programlisting> /a/asami/portbuild/3/errors error logs from latest 3-stable run
- /logs all logs from latest 3-stable run
- /packages packages from latest 3-stable run
- /bak/errors error logs from last complete 3-stable run
- /bak/logs all logs from last complete 3-stable run
- /bak/packages packages from last complete 3-stable run
- /4/errors error logs from latest 4-stable run
- /logs all logs from latest 4-stable run
- /packages packages from latest 4-stable run
- /bak/errors error logs from last complete 4-stable run
- /bak/logs all logs from last complete 4-stable run
- /bak/packages packages from last complete 4-stable run
- /5/errors error logs from latest 5-current run
- /logs all logs from latest 5-current run
- /packages packages from latest 5-current run
- /bak/errors error logs from last complete 5-current run
- /bak/logs all logs from last complete 5-current run
- /bak/packages packages from last complete 5-current run
- </programlisting>
-
- <para>Basically, if the port shows up in
- <filename>packages</filename>, or it is in
- <filename>logs</filename> but not in
- <filename>errors</filename>, it built fine. (The
- <filename>errors</filename> directories are what you get
- from the web page.)</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>I added a new port. Do I need to add it to the
- <filename>INDEX</filename>?</para>
- </question>
-
- <answer>
- <para>No. The ports manager will regenerate the
- <filename>INDEX</filename> and commit it every few
- days.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>Are there any other files I'm not allowed to
- touch?</para>
- </question>
-
- <answer>
- <para>Any file directly under <filename>ports/</filename>, or
- any file under a subdirectory that starts with an
- uppercase letter (<filename>Mk/</filename>,
- <filename>Tools/</filename>, etc.). In particular, the
- ports manager is very protective of
- <filename>ports/Mk/bsd.port*.mk</filename> so don't
- commit changes to those files unless you want to face his
- wra(i)th.</para>
- </answer>
- </qandaentry>
- </qandadiv>
- </qandaset>
- </sect1>
-
- <sect1>
- <title>Miscellaneous Questions</title>
-
- <qandaset>
- <qandaentry>
- <question>
- <para>Why are trivial or cosmetic changes to files on a vendor
- branch a bad idea?</para>
- </question>
-
- <answer>
- <itemizedlist>
- <listitem>
- <para>From now on, every new vendor release of that file will
- need to have patches merged in by hand.</para>
- </listitem>
-
- <listitem>
- <para>From now on, every new vendor release of that file will
- need to have patches <emphasis>verified</emphasis> by hand.</para>
- </listitem>
-
- <listitem>
- <para>The <option>-j</option> option doesn't work very well.
- Ask &a.obrien; for horror stories.</para>
- </listitem>
- </itemizedlist>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>How do I add a new file to a CVS branch?</para>
- </question>
-
- <answer>
- <para>To add a file onto a branch, simply checkout or update
- to the branch you want to add to and then add the file using
- <command>cvs add</command> as you normally would. For
- example, if you wanted to MFC the file
- <filename>src/sys/alpha/include/smp.h</filename> from HEAD
- to RELENG_4 and it does not exist in RELENG_4 yet, you would
- use the following steps:</para>
-
- <example>
- <title>MFC'ing a New File</title>
-
- <screen>&prompt.user; <userinput>cd sys/alpha/include</userinput>
-&prompt.user; <userinput>cvs update -rRELENG_4</userinput>
-cvs update: Updating .
-U clockvar.h
-U console.h
-...
-&prompt.user; <userinput>cvs update -kk -Ap smp.h &gt; smp.h</userinput>
-===================================================================
-Checking out smp.h
-RCS: /usr/cvs/src/sys/alpha/include/smp.h,v
-VERS: 1.1
-***************
-&prompt.user; <userinput>cvs add smp.h</userinput>
-cvs add: scheduling file `smp.h' for addition on branch `RELENG_4'
-cvs add: use 'cvs commit' to add this file permanently
-&prompt.user; <userinput>cvs commit</userinput>
- </screen>
- </example>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>What <quote>meta</quote> information should I include in a
- commit message?</para>
- </question>
-
- <answer>
- <para>As well as including an informative message with each commit
- you may need to include some additional information as
- well.</para>
-
- <para>This information consists of one or more lines containing the
- the key word or phrase, a colon, tabs for formatting, and then the
- additional information.</para>
-
- <para>The key words or phrases are:</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <tbody>
- <row>
- <entry><literal>PR:</literal></entry>
- <entry>The problem report (if any) which is affected
- (typically, by being closed) by this commit.</entry>
- </row>
-
- <row>
- <entry><literal>Submitted by:</literal></entry>
- <entry>The name and e-mail address of the person that
- submitted the fix.</entry>
- </row>
-
- <row>
- <entry><literal>Reviewed by:</literal></entry>
- <entry>The name and e-mail address of the person or people
- that reviewed the change. If a patch was submitted to a
- mailing list for review, and the review was favourable,
- then just include the list name.</entry>
- </row>
-
- <row>
- <entry><literal>Approved by:</literal></entry>
- <entry>The name and e-mail address of the person or people
- that approved the change. It is customary to get prior
- approval for a commit if it is to an area of the tree to
- which you do not usually commit. In addition, during the
- run up to a new release all commits
- <emphasis>must</emphasis> be approved by the release
- engineer. If these are your first commits then you should
- have passed them past your mentor first for approval, and
- you should list your mentor.</entry>
- </row>
-
- <row>
- <entry><literal>Obtained from:</literal></entry>
- <entry>The name of the project (if any) from which the code
- was obtained.</entry>
- </row>
-
- <row>
- <entry><literal>MFC after:</literal></entry>
-
- <entry>If you wish to receive an e-mail reminder to
- <acronym>MFC</acronym> at a later date, specify the
- number of days, weeks, or months after which an
- <acronym>MFC</acronym> is planned.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <example>
- <title>Commit log for a commit based on a PR</title>
-
- <para>You want to commit a change based on a PR submitted by John
- Smith containing a patch. The end of the commit message should
- look something like this.</para>
-
- <programlisting>...
-
-PR: foo/12345
-Submitted by: John Smith &lt;John.Smith@example.com></programlisting>
- </example>
-
- <example>
- <title>Commit log for a commit needing review</title>
-
- <para>You want to change the virtual memory system. You have
- posted patches to the appropriate mailing list (in this case,
- <literal>freebsd-arch</literal>) and the changes have been
- approved.</para>
-
- <programlisting>...
-
-Reviewed by: -arch</programlisting>
- </example>
-
- <example>
- <title>Commit log for a commit needing approval</title>
-
- <para>You want to commit a change to a section of the tree with a
- MAINTAINER assigned. You have collaborated with the listed
- MAINTAINER, who has told you to go ahead and commit.</para>
-
- <programlisting>...
-
-Approved by: <replaceable>abc</replaceable></programlisting>
-
- <para>Where <replaceable>abc</replaceable> is the account name of
- the person who approved.</para>
- </example>
-
- <example>
- <title>Commit log for a commit bringing in code from
- OpenBSD</title>
-
- <para>You want to commit some code based on work done in the
- OpenBSD project.</para>
-
- <programlisting>...
-
-Obtained from: OpenBSD</programlisting>
- </example>
-
- <example>
- <title>Commit log for a change to &os.current; with a planned
- commit to &os.stable; to follow at a later date.</title>
-
- <para>You want to commit some code which will be merged from
- &os.current; into the &os.stable; branch after two
- weeks.</para>
-
- <programlisting>...
-
-MFC after: <replaceable>2 weeks</replaceable></programlisting>
-
- <para>Where <replaceable>2</replaceable> is the number of days,
- weeks, or months after which an <acronym>MFC</acronym> is
- planned. The <replaceable>weeks</replaceable> option may be
- <literal>day</literal>, <literal>days</literal>,
- <literal>week</literal>, <literal>weeks</literal>,
- <literal>month</literal>, <literal>months</literal>,
- or may be left off (in which case, days will be assumed).</para>
- </example>
-
- <para>In some cases you may need to combine some of these.</para>
-
- <para>Consider the situation where a user has submitted a PR
- containing code from the NetBSD project. You are looking at the
- PR, but it's not an area of the tree you normally work in, so
- you've decided to get the change reviewed by the
- <literal>arch</literal> mailing list. Since the change is
- complex, you opt to <acronym>MFC</acronym> after one month to
- allow adequate testing.</para>
-
- <para>The extra information to include in the commit would look
- something like</para>
-
- <programlisting>PR: foo/54321
-Submitted by: John Smith &lt;John.Smith@example.com>
-Reviewed by: -arch
-Obtained from: NetBSD
-MFC after: 1 month</programlisting>
- </answer>
- </qandaentry>
- </qandaset>
- </sect1>
-</article>
diff --git a/en_US.ISO8859-1/articles/console-server/Makefile b/en_US.ISO8859-1/articles/console-server/Makefile
deleted file mode 100644
index d96170fbe9..0000000000
--- a/en_US.ISO8859-1/articles/console-server/Makefile
+++ /dev/null
@@ -1,18 +0,0 @@
-# $FreeBSD$
-
-DOC?= article
-
-DOCFORMAT= html
-
-FORMATS?= html
-
-INSTALL_COMPRESSED?=gz
-INSTALL_ONLY_COMPRESSED?=
-
-SRCS= article.sgml
-CSS_SHEET= itgastyle.css
-IMAGES= tk0231-9-1.png
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/console-server/article.sgml b/en_US.ISO8859-1/articles/console-server/article.sgml
deleted file mode 100644
index 76d4f4a8a5..0000000000
--- a/en_US.ISO8859-1/articles/console-server/article.sgml
+++ /dev/null
@@ -1,1229 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
- <head>
- <title>Console Server</title>
- <link rel="stylesheet" href="./itgastyle.css">
- </head>
-
- <body>
- <h1>Console Server</h1>
-
- <h2>The Problem</h2>
-
- <p>You have a computer room with lots of Unix server machines and
- lots of comms hardware. Each of these machines needs a serial
- console. But serial terminals are hard to find and quite
- expensive (especially compared to a much more capable PC). And
- they take up a lot of precious space in the computer room.</p>
-
- <p>You need access to the console because when things break, that
- is where error messages go. And some tasks have to be done on
- the console (e.g. boot problems or OS installs/upgrades). Some
- Unix systems allow the console to break out to the ROM monitor
- which can sometimes be the only way to unstick a hung machine.
- This is often done with a LINE BREAK sent on the console serial
- port.</p>
-
- <p>If we're going to play about with consoles, then there are a
- couple of other things that would be great:</p>
-
- <ul>
- <li>
- <p>Remote access. Even in the same office, it would be
- convenient to access all the consoles from your desk without
- walking into the computer room. But often the machines are
- off-site, perhaps even in another country.</p></li>
-
- <li>
- <p>Logging. If something has gone wrong, you would like to be
- able to have a look at the previous console output to see
- what's up. Ordinary console screens give you the last 25
- lines. More would be better.</p>
-
- <li>
- <p>Network Independence. The solution needs to work even if the
- network is down. After all, a failed network is when you need
- consoles the most! Even better is network independence with
- remote access.</p></li>
-
- <li>
- <p>No single-point failure. A console system that crashes every
- machine when it fails is no use. This is particularly tricky
- with Sun Unix hosts as they will interpret a powered-off
- terminal as a BREAK, and drop back to the ROM monitor.</p></li>
-
- <li>
- <p>Interface with a pager or some similar alerter
- device.</p></li>
-
- <li>
- <p>Ability to power-cycle machines remotely.</p></li>
-
- <li>
- <p>Not be <em>too</em> expensive. Free is even better!</p></li>
- </ul>
-
- <h2>Possible Solutions</h2>
-
- <p>If you use PC hardware for your servers, then a so-called
- "<em>KVM switch</em>" is one possible solution. This allows the
- use of a single <em>K</em>eyboard, <em>V</em>ideo screen and
- <em>M</em>ouse for multiple boxes. This cuts down on the space
- problem, but only works for PC hardware (not any comms gear you
- might have), and is not accessible from outside the computer
- room. Nor does it have much scroll-back or logging, and you
- have to handle alerting some other way. The big downside is
- that it will not work for serial-only devices, such as
- communications hardware. This means that even with a room full
- of PC-based servers, you are probably still going to need some
- sort of serial console solution. [Actually, Doug Schache has
- pointed out that you <em>can</em> get KVM switches that also do
- serial consoles or Sun-compatible KVM switching as well as PCs,
- but they are expensive. See <a
- href="http://www.avocent.com">Avocent</a> for example.]</p>
-
- <p>You might be tempted to do without a console terminal, but when
- things go pear-shaped you <em>really</em> need to see what's on
- the console. And you have to use the console to boot the
- machine and do things like OS upgrades or installs.</p>
-
- <p>You might try having a single console terminal and switching
- from server to server as needed, either with a serial switch or
- just by patching it into the required machine. Serial switches
- are also hard to come by and not cheap, and may cause problems
- with sending BREAK when they switch. And (if your computer room
- is anything like ours) you never seem to have the right
- combination of patch leads to connect to the machine you need
- to, and even if the leads are there you can never work out
- exactly which combination of DTE/DCE headshells goes with which
- lead goes with which hardware. So you spend the first 10
- minutes fooling around with breakout boxes and a box of leads,
- all while the server is down and the users are screaming. Of
- course this doesn't deal with the logging or remote access
- requirements. And inevitably the console is not switched to the
- machine you need so you lose all the console messages that might
- tell you what's going on.</p>
-
- <p>One popular solution is to use terminal server hardware.
- Typically, the serial ports are connected to the various machine
- consoles, and set up for "reverse telnet" access. This means a
- user can telnet to a given IP/port and be connected to the
- appropriate console. This can be very cost-effective, as
- suitable old terminal servers can be picked up fairly cheaply
- (assuming you don't have a couple lying around). And it is of
- course network-accessible so suitable for remote access. But it
- suffers from one major drawback: if the network is down, then
- you have <em>no</em> access to any console, even if you are
- standing right next to the machine. (This may be partially
- alleviated by having a suitable terminal connected to one of the
- terminal server ports and connecting from there, but the
- terminal server software may not support that.) Also there is
- no logging or replay of console messages. But with a bit of
- work, and the addition of some software such as <a
- href="http://www.conserver.com">conserver</a> (described below),
- this can be made to work pretty well.</p>
-
- <p>A possibility suggested by Bron Gondwana is similar to the
- above solution. If you use servers with multiple serial ports,
- you can connect each spare serial port to the console port of
- the "next" server, creating a ring of console connections (in
- some sort of order). This can be made to work reasonably well
- with the aid of the <a
- href="http://www.conserver.com">conserver</a> software, but can
- be a bit confusing otherwise (i.e. remembering which port is
- connected to which console). And you are stuck if you need to
- use serial ports for other things (such as modems) or you have
- machines without spare ports.</p>
-
- <p>Or, if your budget exceeds your willingness to hack, you can
- buy an off-the-shelf solution. These vary in price and
- capability. See, for example, <a
- href="http://www.lightwavecom.com/">Lightwave</a>, <a
- href="http://www.perle.com">Perle</a>, <a
- href="http://www.avocent.com">Avocent</a> or <a
- href="http://www.blackbox.com/faxbacks/23000/23362.PDF">Black
- Box</a>. These solutions can be quite expensive - typically
- $USD100 - $USD400 per port.</p>
-
- <h2>Our Solution</h2>
-
- <p>In light of the above requirements, we chose a solution based
- on a dedicated PC running Unix with a multiport serial card, and
- some software designed to handle serial consoles.</p>
-
- <p>It includes the following elements:</p>
-
- <ul>
- <li><p>A surplus PC. We used a Pentium 166, with a PCI bus,
- 2Gbyte hard disk and 64Mb of RAM. This is a massive overkill
- for this task, and P-100, 500Mb, 32Mb would be more than
- enough.</p></li>
-
- <li><p>A PC Unix system. We used <a
- href="http://www.freebsd.org">FreeBSD 4.3</a> as that is used
- for other tasks within our office.</p></li>
-
- <li><p>A multi-port serial card. We chose the <a
- href="http://www.stallion.com/html/products/easyio.html">EasyIO-PCI</a>
- 8-port card from <a href="http://www.stallion.com">Stallion
- Technologies</a>. This cost us about $AUD740, or under
- $100/port, from <a href="http://www.ht.com.au/">Harris
- Technologies</a> (which has lots of stuff but is by no means
- the cheapest place in town - shop around and you might get it
- a lot cheaper.) This card has a big DB80 connector on the
- back, and a cable plugs into that which has a block with 8
- RJ-45 sockets on it. (We chose the RJ-45 version as our
- entire cable plant is RJ-45. This allows us to patch
- connections from the required box to the console server
- without any special cables.) This is the only thing we needed
- to buy to make this all happen.</p></li>
-
- <li><p>We build two servers, one for each computer room, with 8
- ports in one and 16 ports (via two EasyIO-PCI cards) in the
- other. If we needed more than 16 ports, then another of the
- Stallion cards would be more cost-effective. We could
- conceivably support 128 ports in each server (with 2
- EasyConnect 8/64 host cards and 8 16 port RJ-45 modules) for
- about $AUD12,000.</p></li>
-
- <li><p>A modem for remote access to the console server host when
- the network is down. We haven't done this yet as the computer
- room is next door, but when we put a server in Sydney we will
- add the modem. The idea is that when the network is down, you
- can dial up and log into the server machine and run the
- console program locally. For security, we will probably leave
- the modem powered off and ask the gopher in Sydney to turn on
- the well-labelled button when we need it.</p></li>
-
- <li><p>A program called <a
- href="http://www.conserver.com/">conserver</a>. This program
- does all the magic required to enable remote access to
- consoles, and do the replaying and logging etc. It comes in
- two parts: a server called <code>conserver</code> that runs as
- a daemon and connects to the serial ports, handles logging
- etc, and a client program called <code>console</code> that can
- connect to the server, display console messages, send
- keystrokes (and BREAKs) etc.</p></li>
- </ul>
-
- <p>This design covers all the major requirements except remote
- power cycling:</p>
-
- <ul>
-
- <li><p>Remote access comes because the <code>console</code>
- client program works across the network.</p></li>
-
- <li><p>Logging is handled by the <code>conserver</code>
- program.</p></li>
-
- <li><p>If the network is down, then we can use the console on
- the PC to run the <code>console</code> client locally. For
- remote sites, we can add a modem for dial-in access to the the
- server command line to run the client.</p></li>
-
- <li><p>By patching the Solaris servers (see <a
- href="#solaris">below</a>), we can avoid pranging the whole
- computer room when the console server PC crashes (or the power
- supply fails, or whatever).</p></li>
-
- <li><p>We already have pager alerts from another system we have
- installed, but the console server has all the required log
- info so that could easily be implemented if we needed. And it
- even has a modem for calling the pager company!</p></li>
-
- <li><p>We don't currently support remote power cycling. Some
- versions of the conserver program support this, but it does
- require specialised serial-controlled power boards. We have
- no immediate need for remote power cycling (we have a gopher
- in each remote office who can do it by remote control) so this
- is not a major problem, and we could add it easily should we
- ever see the need and get the appropriate hardware.</p></li>
-
- <li><p>This solution was very cheap. Total cost for the 9-port
- server was $AUD750 for the IO card, as we re-used a surplus PC
- and already owned the hardware for the special cables. If we
- had to buy everything, then it would still only cost around
- $AUD1500 for the 8-port server.</p></li>
- </ul>
-
- <h2>Setting Up The Server</h2>
-
- <h4>Patching the Stallion driver</h4>
-
- <p>The only hitch with setting up the server PC is getting the
- device drivers for the Stallion card. FreeBSD has supported
- Stallion ISA cards for many years, but unfortunately the driver
- has not been actively maintained for some years, and doesn't
- support the newer Stallion cards (such as the EasyIO-PCI card or
- some of the other ISA cards with newer UART chips). I have put
- together a <a href="stal-jumbo-patch">patch file</a> for FreeBSD
- 4.3 (based on the work of many other people) that will update
- the system to support these newer cards. Hopefully, this patch
- will be committed to the FreeBSD tree in time for the 4.4
- release. If you are running FreeBSD 4 from prior to this time,
- you will need to download and apply this patch (instructions are
- included at the top of the patch file). If you are running
- FreeBSD 3, then you had probably best upgrade.</p>
-
- <h4>Configuring a new kernel</h4>
-
- <p>The Stallion driver is not included in the default
- <samp>GENERIC</samp> kernel, so you will need to create a kernel
- config file with the appropriate entries. See the
- <samp>stl(4)</samp> man page and the appropriate section of the
- <a
- href="http://www.au.freebsd.org/handbook/kernelconfig.html">FreeBSD
- Handbook</a>.</p>
-
- <h4>Building World</h4>
-
- <p>After applying the patch you will certainly need to update the
- whole system, including all the user programs and the kernel.
- See the documentation in <samp>/usr/src/UPDATING</samp> and the
- <a href="http://www.FreeBSD.org/handbook/makeworld.html">FreeBSD
- Handbook</a>.</p>
-
- <h4>Making The Devices</h4>
-
- <p>You will need to make the device notes for the Stallion card
- (which are not made by default). A new version of
- <samp>/dev/MAKEDEV</samp> with Stallion support will have been
- created by the <samp>mergemaster</samp> run during the above
- procedure. If you have a Stallion card with more than 8 ports,
- then you will need to edit <samp>/dev/MAKEDEV</samp> and change
- the definition of <samp>maxport</samp> at about line 250. By
- default, <samp>MAKEDEV</samp> only makes device nodes for 8
- ports to keep the size of the <samp>/dev</samp> directory down.</p>
-
- <p>Run a command like</p>
-<pre>
- cd /dev/ && sh MAKEDEV cuaE0
-</pre>
-
- <p>to create dial-out devices for the first Stallion card. See
- the comments in <samp>MAKEDEV</samp> and the <samp>stl(4)</samp>
- man page for more details.</p>
-
- <h4>Compiling conserver</h4>
-
- <p>(See the section on Conserver versions <a
- href="#conserver-versions">below</a>; the version I use is not
- the one available in the FreeBSD ports collection.)</p>
-
- <p>There are two ways to install conserver. You can either
- compile from the source or use the FreeBSD ports framework.</p>
-
- <h5>Using the port framework</h5>
-
- <p>Using the ports framework is a bit cleaner, as the package
- system can then keep track of installed software and cleanly
- delete them when not being used. Download the port framework
- from <a href="conserver-port.tar.gz">here</a>, unpack it to
- create a directory called <code>conserver-port</code>. CD to
- that directory and (as <code>root</code>) type</p>
-
-<pre>
- make DEFAULTHOST=<em>consolehost</em> install
-</pre>
-
- <p>where <em>consolehost</em> is the name of the machine running
- the console server. Specifying this when the binary is compiled
- will avoid having to either specify it each time the program is
- run on remote hosts or having to maintain a
- <code>conserver.cf</code> file on every host. This command will
- fetch, patch, configure, compile and install the conserver
- application.</p>
-
- <p>You can then run <samp>make package</samp> to create a binary
- package that can be installed on all the other FreeBSD hosts
- with the <samp>pkg_add</samp> command. For extra style points,
- you can make a two versions of the package: one for the console
- server machine without a <samp>DEFAULTHOST</samp> argument, and
- one for all the other hosts with a <samp>DEFAULTHOST</samp>
- argument. This will mean the console client program on the
- console server machine will default to <samp>localhost</samp>,
- which will work in the absence of name servers when the network
- is busted, and also allow "trusted" (i.e. no password required)
- connections via the localhost IP address for users logged into
- the console server machine (either via the console screen or the
- emergency backup modem). The version for the other machines
- with a <samp>DEFAULTHOST</samp> argument means users can just
- use the <samp>console</samp> client without specifying a
- hostname every time, and without needing to configure the
- <samp>conserver.cf</samp> file on every machine.</p>
-
- <h5>From the source tarball</h5>
-
- <p>If you prefer, you can download conserver and compile it
- yourself. You might need to do this if you want to install the
- console client on non-FreeBSD systems. We run the client on our
- Solaris hosts and it inter-operates with the FreeBSD-hosted
- server with no problems. This allows anyone in the whole
- company (many of whom have PCs and no FreeBSD host access on
- their desk) to access the console server.</p>
-
- <p>Download the file from the <a
- href="ftp://ftp.conserver.com/conserver/conserver-7.0.2.tar.gz">conserver.com
- FTP site</a>. Extract it into a handy directory then configure
- it by running</p>
-
-<pre>
- ./configure --with-master=<em>consoleserver</em> --with-port=782
-</pre>
-
- <p>The <code>--with-master</code> argument avoids having to
- specify the master server every time the client is run remotely
- (or keeping up-to-date config files on all remote hosts). The
- <code>--with-port</code> argument avoids having to update
- <code>/etc/services</code> on every machine.</p>
-
- <p>Then type <code>make</code> and, as root, <code>make
- install</code>.</p>
-
- <h4>Configuring conserver</h4>
-
- <p>The conserver program is configured via a file called
- <code>conserver.cf</code>. This file usually lives in
- <code>/usr/local/etc</code> and is documented in the <a
- href="conserver.cf.html"><code>conserver.cf(5)</code></a> man
- page.</p>
-
- <p>Our config file looks like this:</p>
-<pre>
-LOGDIR=/var/log/consoles
-gallows:/dev/cuaE0:9600p:&:
-roo:/dev/cuaE1:9600p:&:
-kanga:/dev/cuaE2:9600p:&:
-%%
-allow: itga.com.au
-trusted: 127.0.0.1 buzz
-</pre>
- <p>The first line means all the console log files by default go
- into the directory <code>/var/log/consoles/</code>. The
- <samp>&</samp> in each line says the log file for that machine
- will be <samp>/var/log/consoles/</samp><em>machine</em>.
-
- <p>The next three lines show three machines to which we need to
- connect. We use the cuaE<em>x</em> devices rather than the
- ttyE<em>x</em> devices because console ports typically don't
- show carrier. This means that opening ttyE<em>x</em> would hang
- and <code>conserver</code> would never connect. Using the
- cuaE<em>x</em> device avoids this problem. Another solution
- would be to use the ttyE<em>x</em> devices and enable <em>soft
- carrier</em> on these ports, perhaps by setting this using the
- ttyiE<em>x</em> device in the <code>/etc/rc.serial</code> file.
- See the comments in this file for more details. Also see the
- <code>sio(4)</code> man page for information on the
- initial-state and locked-state devices. (The Stallion driver
- also supports these conventions). And see the
- <code>stty(1)</code> man page for details on setting device
- modes.</p>
-
- <p>The last section shows that any user logged into the server
- machine has passwordless access to all consoles. We do this
- because there are no user accounts on this machine and it is
- safely isolated from the wide world behind our firewall. The
- allow line allows anyone on a machine inside our organisation to
- access the console server if they provide their password, which
- is recorded in the <code>conserver.passwd</code> file (see next
- section).</p>
-
- <h4>Setting conserver passwords</h4>
-
- <p>The <code>conserver.passwd</code> file contains the encrypted
- version of the password that each user. The file is documented
- in the <a
- href="conserver.cf.html"><code>conserver.cf(5)</code></a> man
- page.</p>
-
- <p>The only tricky bit is loading the file with encoded passwords.
- It appeared in FreeBSD that was is no obvious way to generate an
- encrypted password for inclusion in another file (but see
- below). So I put together a quick hack perl script to do
- this:</p>
-
-<pre><![ CDATA [/*
-@rands = ();
-foreach (0..4) {
- push(@rands, rand 64);
-}
-
-$salt = join '', ('.', '/', 0..9, 'A'..'Z', 'a'..'z')[@rands];
-
-$salt = '$1$' . $salt . '$';
-
-print 'Enter password: ';
-`stty -echo`;
-$cleartext = <>;
-`stty echo`;
-chop($cleartext);
-print crypt($cleartext, $salt), "\n";
-]]></pre>
-
- <p>(Note that this uses the FreeBSD MD5-style encrypted passwords.
- Running this on other Unix variants, or on FreeBSD with DES
- passwords, will likely need a different style of salt.)</p>
-
- <p>Kris Kennaway has since pointed out you can get the same effect
- using the <samp>openssl passwd</samp> command:</p>
-
-<pre>
-$ openssl passwd -1
-Password: &lt;password&gt;
-$1$VTd27V2G$eFu23iHpLvCBM5nQtNlKj/
-$
-</pre>
-
- <h4>Starting conserver at system boot time</h4>
-
- <p>There are two ways this can be done. Firstly, you could start
- up conserver from init by including an entry in /etc/ttys that
- looks a bit like this:</p>
-
-<pre>
-cuaE0 "/usr/local/sbin/conserver" unknown on insecure
-</pre>
-
- <p>This has two advantages: init will restart the master console
- server if it ever crashes for any reason (but we have not
- noticed any crashes so far), and it arranges for STDOUT of the
- conserver process to be directed to the named tty (in this case
- cuaE0). This is useful because you can plug a terminal into
- this port, and the conserver program will show all console
- output not otherwise captured by a client console connection.
- This is useful as a general monitoring tool to see if anything
- is going on. We set this terminal up in the computer room but
- visible from the main office. It's a very handy feature. The
- downside of running conserver from the ttys file is that it
- cannot run in daemon mode (else init would continually restart
- it). This means conserver won't write a PID file, which makes
- it hard to rotate the log files.</p>
-
- <p>So we start conserver from an rc.d script. If you installed
- conserver via the port, there will be a
- <code>conserver.sh.sample</code> file installed in
- <code>/usr/local/etc/rc.d</code>. Copy and/or rename this to
- <code>conserver.sh</code> to enable conserver to start at boot
- time.</p>
-
- <p>In fact we use a modified version of this script which also
- connects conserver to a terminal via a tty device so we can
- monitor unwatched console output. Our conserver.sh script looks
- like this:</p>
-
-<pre>
-#!/bin/sh
-#
-# Startup for conserver
-#
-
-PATH=/usr/bin:/usr/local/bin
-
-case "$1" in
- 'start')
- TTY=/dev/cuaE7
- conserver -d > $TTY
- # get NL->CR+NL mapping so msgs look right
- stty < /dev/cuaE7 opost onlcr
- echo -n ' conserver'
- ;;
-
- 'stop')
- kill `cat /var/run/conserver.pid` && echo -n ' conserver'
- ;;
-
- *)
- echo "Usage: $0 { start | stop }"
- ;;
-
-esac
-exit 0
-</pre>
-
- <p>(Note the use of cuaE0 device and the need to set TTY modes for
- proper NL->CR handling).</p>
-
- <h4>Keeping the log files trimmed</h4>
-
- <p>FreeBSD has a program called <code>newsyslog</code> that will
- automatically handle log file trimming. Just add some lines to
- the configuration file <code>/etc/newsyslog.conf</code> for the
- console logs:</p>
-
-<pre>
-#
-# The log files from conserver
-/var/log/consoles/gallows 644 10 1000 * Z /var/run/conserver.pid
-/var/log/consoles/kanga 644 10 1000 * Z /var/run/conserver.pid
-/var/log/consoles/roo 644 10 1000 * Z /var/run/conserver.pid
-</pre>
-
- <p>This tells newsyslog (which is run from cron every hour on the
- hour) that the console log files should be archived and
- compressed once they reach 1Mb, that we should keep 10 of them,
- and that to signal the server program you send a SIGHUP to the
- process whose PID is in the conserver.pid file. This is the
- master server, and it will arrange to signal all the child
- processes. Yes, this will send a HUP to all clients whenever a
- single log file needs rotating, but that is quite cheap. See
- the newsysylog(8) man page for details.</p>
-
- <h2>Cabling</h2>
-
- <p>This is always the hardest part of this kind of problem!! We
- had only a dozen or so cables/headshells to build, and we
- already had a collection of the appropriate crimping tools and
- hardware, so we did it ourselves. But if you are not set up for
- this, or you have a large number of cables to make, then you
- might consider getting some cables custom made. Look in the
- yellow pages, there are a suprising number of places that do
- this! Getting custom-made cabling is good, and you can get much
- more professional results, but can be expensive. For example,
- the RJ-45 to DB-25 adapter kits described below are about $10
- each; custom-made headshells are about twice that (and take a
- couple of weeks to arrive). Similarly, crimping custom RJ-45 to
- RJ-45 leads is quite cheap (say, $5 each) but it takes a fair
- amount of time. Custom made RJ-45 socket to RJ-45 plug
- converters cost about $25 each.</p>
-
- <p>We have settled on RJ-45 Cat-V cabling for all our office and
- computer room cabling needs. This included patching between
- racks in the computer room. For serial connections, we use
- patchable headshells that have RJ-45 sockets on the back. This
- allows us to patch whatever RJ-45 - DB-25 connections we need.</p>
-
- <p>Which is just as well, because there are many incompatible ways
- to represent serial connections on the RJ-45 plug. So the
- cabling has to be very careful to use the right mapping.</p>
-
- <h4>RJ-45 colors</h4>
-
- <p>RJ-45 cables and plugs have 8 pins/conductors. These are used
- as 4 matched pairs. There are a couple of conventions about how
- the pairs are mapped onto pins, but 100baseT uses the most
- common (known as EIA 586B). There are three common color-coding
- conventions for the individual conductors in RJ-45 cables. They
- are:</p>
-
- <table>
- <tr class="alt">
- <th>Pin</th>
- <th>Scheme 1</th>
- <th>Scheme 2 (EIA 568B)</th>
- <th>Scheme 3 (EIA 568A)</th>
- <th>Pair</th>
- </tr>
- <tr>
- <td>1</td>
- <td>Blue</td>
- <td>White+Green</td>
- <td>White+Orange</td>
- <td>2+</td>
- </tr>
- <tr class="alt">
- <td>2</td>
- <td>Orange</td>
- <td>Green</td>
- <td>Orange</td>
- <td>2-</td>
- </tr>
- <tr>
- <td>3</td>
- <td>Black</td>
- <td>White+Orange</td>
- <td>White+Green</td>
- <td>3+</td>
- </tr>
- <tr class="alt">
- <td>4</td>
- <td>Red</td>
- <td>Blue</td>
- <td>Blue</td>
- <td>1+</td>
- </tr>
- <tr>
- <td>5</td>
- <td>Green</td>
- <td>White+Blue</td>
- <td>White+Blue</td>
- <td>1-</td>
- </tr>
- <tr class="alt">
- <td>6</td>
- <td>Yellow</td>
- <td>Orange</td>
- <td>Green</td>
- <td>3-</td>
- </tr>
- <tr>
- <td>7</td>
- <td>Brown</td>
- <td>White+Brown</td>
- <td>White+Brown</td>
- <td>4+</td>
- </tr>
- <tr class="alt">
- <td>8</td>
- <td>White<br>or Grey</td>
- <td>Brown</td>
- <td>Brown</td>
- <td>4-</td>
- </tr>
- </table>
-
- <p>Note EIA 468A and EIA 568B are very similar, simply swapping
- the colors assigned to pair 2 and pair 3.</p>
-
- <p>See for example the <a
- href="http://www.cabletron.com/support/techtips/tk0231-9.html">Cabletron
- Tech Support Site</a> for more details.</p>
-
- <p>The pins in the RJ-45 plug are numbered from 1 to 8. Holding a
- patch lead with the cable pointing down and the clip away from
- you, pin 1 is at the left. Or, looking into an RJ-45 socket
- with the clip to the top, pin 1 is on the right. The following
- illustration (shamelessly lifted from the Cabletron web site
- above) shows it pretty well:</p>
-
- <img alt="RJ45" src="tk0231-9-1.png">
-
- <p>We have four classes of equipment to deal with in our setup:</p>
-
-<dl>
-
-<dt>Sun Servers
-<dd>
-
- <p>Sun servers operate as DTE (i.e. send data on TxD and read RxD,
- and assert DTR) with a female DB-25 socket on board. So we need
- to create a headshell for the Stallion that operates as DCE and
- has a male DB-25 plug (i.e. acts as a <em>null modem</em> cable
- as well as converts from RJ-45 to DB-25). We use headshells
- that have an RJ-45 socket in them and 8 short flyleads with
- DB-25 pins on the end. These pins can be inserted into the
- DB-25 plug as required. This allows us to create a custom
- RJ-45-DB-25 mapping. We used a couple of different sorts,
- including the <a href="http://www.molexpn.com.au/">MOD-TAP</a>
- part no. <a
- href="http://www.molexpn.com.au/products/index.nsx/1/7/0/0/id=340">06-9888-999-00</a>
- and the <a
- href="http://www.blackbox.com/faxbacks/12000/12654.PDF">FA730
- series</a> from <a href="http://www.blackboxoz.com.au/">Black
- Box</a>.</p>
-
- <p>On our version of the headshells, these flyleads had the
- following colours (from Pin 1-8): Blue, Orange, Black, Red,
- Green, Yellow, Brown, White. (Looking into an RJ-45 socket,
- with the clip towards the top, pin 1 is on the right.) This is
- how they are connected to the DB-25 socket:</p>
-
- <table>
- <tr class="alt">
- <th>Stallion RJ-45 Pin</th>
- <th>Colour</th>
- <th>Signal</th>
- <th>Sun DB-25 Male Pin</th>
- <th>RS232 Signal</th>
- </tr>
- <tr align=center>
- <td>1</td>
- <td>Blue</td>
- <td>DCD</td>
- <td>20</td>
- <td>DTR</td>
- </tr>
- <tr align=center class="alt">
- <td>2</td>
- <td>Orange</td>
- <td>RTS</td>
- <td>5</td>
- <td>CTS</td>
- </tr>
- <tr align=center>
- <td>3</td>
- <td>Black</td>
- <td>Chassis Gnd</td>
- <td>1</td>
- <td>Chassis Gnd</td>
- </tr>
- <tr align=center class="alt">
- <td>4</td>
- <td>Red</td>
- <td>TxD</td>
- <td>3</td>
- <td>RxD</td>
- </tr>
- <tr align=center>
- <td>5</td>
- <td>Green</td>
- <td>RxD</td>
- <td>2</td>
- <td>TxD</td>
- </tr>
- <tr align=center class="alt">
- <td>6</td>
- <td>Yellow</td>
- <td>Signal Gnd</td>
- <td>7</td>
- <td>Signal Gnd</td>
- </tr>
- <tr align=center>
- <td>7</td>
- <td>Brown</td>
- <td>CTS</td>
- <td>4</td>
- <td>RTS</td>
- </tr>
- <tr align=center class="alt">
- <td>8</td>
- <td>White</td>
- <td>RTS</td>
- <td>8</td>
- <td>DCD</td>
- </tr>
- </table>
-
- <p>Note that colours may be different for your cables/headshells.
- In particular, pin 8 may be grey instead of white.</p>
-
- <p>Remember to label the headshell <em>clearly</em>, in a way that
- will not fade/fall off/rub off with time!</p>
-
-<dt>Cisco 16xx/26xx/36xx Routers
-<dd>
-
- <p>I think that all Cisco gear that has RJ-45 console ports and
- runs IOS will have the same cable requirements. But best to
- check first. We've tried this on 1600s and 2600s only.</p>
-
- <p>Both the Stallion card and the 2600 have RJ-45 connections, but
- of course they are not compatible. So you need to crimp up a
- special RJ-45-RJ-45 cable. And this cable must be plugged in
- the right way round! We use normal RJ-45 flyleads from the
- router to the patch panel, then the special flylead from the
- patch panel to the Stallion card.</p>
-
- <p>We built two special Stallion-Cisco leads by cutting in half a
- 2m flylead and crimping an RJ-45 with the appropriate pinouts to
- each free end. The original connector will be the Cisco end of
- the cable, the new crimped connector will be the Stallion end.
- Holding the RJ-45 connector on the flylead with the cable
- pointing down and the clip pointing away, this is the order of
- the colours of the cables in our flylead (pins 1-8, from L to
- R): white/green, green, white/orange, blue, white/blue, orange,
- white/brown, brown. For the Stallion end, trim and discard the
- brown/white+brown and green/white+green pairs. Then holding the
- RJ-45 plug in the same manner (cable down, clip away), the
- connections should be (from L to R): None, None, Blue, Orange,
- White/Orange, White/Blue, None, None, as shown:</p>
-
-<table>
-<tr class="alt"><th>Cisco RJ-45 Pin<th>Colour<th>Cisco Signal<th>Stallion RJ-45
-Pin<th>Stallion Signal</tr>
-<tr align=center><td>1<td>White/Green<td>RTS<td>N/C<td>&nbsp;</tr>
-<tr align=center class="alt"><td>2<td>Green<td>DTR<td>N/C<td>&nbsp;</tr>
-<tr align=center><td>3<td>White/Orange<td>TxD<td>5<td>RxD</tr>
-<tr align=center class="alt"><td>4<td>Blue<td>Gnd<td>3<td>Gnd</tr>
-<tr align=center><td>5<td>White/Blue<td>Gnd<td>6<td>Gnd</tr>
-<tr align=center class="alt"><td>6<td>Orange<td>RxD<td>4<td>TxD</tr>
-<tr align=center><td>7<td>White/Brown<td>DSR<td>N/C<td>&nbsp;</tr>
-<tr align=center class="alt"><td>8<td>Brown<td>CTS<td>N/C<td>&nbsp;</tr>
-</table>
-
- <p>Note again that colours may be different for your cables/headshells.</p>
-
- <p>Carefully label the cable, and each end of the cable, and test
- it. If it doesn't work, testing is <em>really</em> hard as they
- don't make RJ-45 serial line testers!</p>
-
- <p>Let me state this more stongly: Be <em>very</em> <b>VERY</b>
- sure that you label this cable in a way that is easily,
- instantly and permanently recognisable as a special cable and
- not easily confused with normal drop cables. Some suggestions
- (from Hugh Irvine):</p>
-<ul>
-<li> Make them out of different coloured cable
-
-<li> For marking the ends, clear heat-shrink tubing slipped over
-printed labels *before* putting on the connectors is the best way I've
-seen for marking what they are.
-
-<li>You can also use Panduit or similar tags that
-you put on with nylon tie straps, but I find the ink wears off the
-tags.
-</ul>
-
-<p>
-
-<dt>Cisco Catalyst switches
-<dd>
-
-Astoundingly, the pinout on the console ports of the Catalysts is
-actually <em>different</em> to the pinout used on the 26xx-series
-Cisco hardware. I think the way to tell which is which is by
-considering the operating software. If it uses IOS, then the previous
-pinout is required. If it uses the switch software, then this pinout
-is required.
-
- <p>Fortunately, while the pinouts are different, the Catalyst
- pinout is simply a mirror image of the pinout for the 2600.
- Even more fortunately, the Ciscos (both Catalysts and 2600s)
- seem to ship with a special "rollover" cable, which is exactly
- what is required in this case. We use the rollover cable from
- the Catalysts to the patch panel, then the same cable as above
- for the 2600s from the patch panel to the Stallion card, and it
- all works just fine.</p>
-
- <p>This rollover cable is an RJ-45-RJ-45 cable and is intended to
- be used with the shipped (hardwired) RJ-45 - DB-25 and RJ-45 -
- DB-9 headshells for console connections. Ours are 2m long,
- either light blue or black, and are quite flat. Attempts to use
- them for 100baseT ethernet will fail miserably! You can tell it
- is a rollover cable by holding both ends with the cable pointing
- down and the clip pointing away from you. Check the colour of
- the leads in each pin in the two connectors, they should be
- mirror images. (In our case, one goes
- grey-orange-black-red-green-yellow-blue-brown, the other
- brown-blue-yellow-green-red-black-orange-grey). This is a
- rollover cable.</p>
-
- <p>If you don't have a rollover cable present, then you can use
- the same cable as for the 26xx except plug it in the other way
- around (i.e. original 8-pin plug goes into the Stallion, the new
- crimped plug with only 4 active wires goes into the Catalyst).</p>
-
-<p>
-
-<dt>FreeBSD Servers (or any other i386 PC systems using a serial console)
-<dd>
-
- <p>We run FreeBSD 4 on a couple of i386 PCs for various peripheral
- uses. FreeBSD usually uses a screen and keyboard for the
- console, but can be configured to use a serial port (usually the
- first serial port known as COM1 in DOS/Windows or ttyd0 in
- Unix).</p>
-
- <p>The cabling for these servers depends on the PC harware. If
- the PC has DB-25 female socket on board (as most older PCs do),
- then the same headshell as works for the Sun server above will
- work fine. If the PC has DB-9 male plug on board (as more
- recent PCs tend to do), then there are two choices. Either use
- a DB-9 to DB-25 converter (this is not recommended as it can
- lead to unreliable connections over the long term as the adapter
- is bumped/works loose), or build an RJ-45 to DB-9 cable as
- follows:</p>
-
-<table>
-<tr class="alt"><th>Stallion RJ-45 Pin<th>Colour<th>Signal<th>PC DB-9 Female
-Pin<th>RS232 Signal</tr>
-<tr align=center><td>1<td>Blue<td>DCD<td>4<td>DTR</tr>
-<tr align=center class="alt"><td>2<td>Orange<td>RTS<td>8<td>CTS</tr>
-<tr align=center><td>3<td>Black<td>Chassis Gnd<td>N/C<td>&nbsp;</tr>
-<tr align=center class="alt"><td>4<td>Red<td>TxD<td>2<td>RxD</tr>
-<tr align=center><td>5<td>Green<td>RxD<td>3<td>TxD</tr>
-<tr align=center class="alt"><td>6<td>Yellow<td>Signal
-Gnd<td>5<td>Signal Gnd</tr>
-<tr align=center><td>7<td>Brown<td>CTS<td>7<td>RTS</tr>
-<tr align=center class="alt"><td>8<td>White<td>RTS<td>1<td>DCD</tr>
-</table>
-See <a href="#freebsd">below</a> for tips on configuring FreeBSD to
-use a serial console.
-</dl>
-
-
-
- <h2><a name="solaris">On Sun Systems And Break</a></h2>
-
- <p>Anyone who has turned off a terminal used as a console for a
- Sun system will know what happens and why this is a problem.
- Sun hardware recognises a serial BREAK as a command to halt the
- OS and return to the ROM monitor prompt. A serial BREAK is an
- out-of-band signal on an RS-232 serial port that involves making
- the TX DATA line active (i.e. pulled down to less than -5v) for
- more than two whole character times (or about 2ms on a 9600bps
- line). Alas, this BREAK signal is all to easily generated by
- serial hardware during power-on or power-off. And the Stallion
- card does, in fact, generate breaks when the power to the PC
- fails. Unless fixed, this problem would mean that every Sun box
- connected to the console server would be halted whenever the
- power failed (due to dead power supplies, or fat-fingered
- operators unplugging it, or whatever). This is clearly not an
- acceptable situation.</p>
-
- <p>Fortunately, Sun have come up with a set of fixes for this.
- For Solaris 2.6 and later (and perhaps earlier, but who was
- crazy enough to run 2.5??), the <code>kbd(1)</code> command can
- be used to disable the ROM-on-BREAK behaviour. This is a good
- start, but leaves you out of luck in the situation where a break
- is needed to get into a broken machine.</p>
-
- <p>Starting with Solaris 8, the <code>kbd</code> command can also
- be used to enable an alternate break sequence using the
- <samp>kbd -a alternate</samp> command. When this is set, the
- key sequence &lt;Return&gt;&lt;Tilda&gt;&lt;control-B&gt;
- (within 5 seconds) will drop to the ROM. You can enable this
- permanently by editing the <code>/etc/default/kbd</code> file;
- see the <code>kbd(1)</code> man page. Note that this alternate
- break sequence is only active once the kernel has started
- running multiuser and processed the default file. While the ROM
- is active (during power-on and during the boot process) and
- while running single-user, you still need to use a BREAK to get
- to the ROM prompt. The console client can cause the server to
- send a BREAK using the escape sequence "^Ecl1" (i.e. escape, c,
- ell, one).</p>
-
- <p>If you have a Sun software support contract, there are patches
- available for Solaris 2.6 and 2.7 that add the"alternate break"
- capability integrated into Solaris 2.8. Solaris 2.6 requires
- patch 105924-10 or higher. Solaris 2.7 requires patch 107589-02
- or higher.</p>
-
- <p>We have added this patch to all our Solaris 2.6 servers, and
- added it (and the entry in the /etc/default/kbd file) to our
- jumpstart configuration so it will automatically be added to
- every new install.</p>
-
- <p>We have confirmed by direct testing that neither the Cisco
- 16xx, 26xx, or Catalyst hardware suffers from the BREAK sent
- when the Stallion card loses power.</p>
-
- <h2><a name="freebsd">Using a Serial Console on FreeBSD</a></h2>
-
- <p>The procedure for doing this is described in detail in the <a
- href="http://www.freebsd.org/handbook/serialconsole-setup.html">FreeBSD
- Handbook</a>. This is a quick summary.</p>
-
- <h4>Check the kernel configuration</h4>
-
- <p>Check that the kernel configuration file has <samp>flags
- 0x10</samp> in the config line for the <samp>sio0</samp> device.
- This signals this device (known as <samp>COM1</samp> in
- DOS/Windows or <samp>/dev/ttyd0</samp> in FreeBSD) can be used
- as a console. This flag is set on the <samp>GENERIC</samp> and
- <samp>LINT</samp> sample configs, so is likely to be set in your
- kernel.</p>
-
- <h4>Create the <samp>/boot.conf</samp> file</h4>
-
- <p>This file should be created containing a single line containing
- just "-h". This tells the FreeBSD boot blocks to use the serial
- console.</p>
-
- <h4>Edit <samp>/etc/ttys</samp></h4>
-
- <p>Edit this file and make the following changes.</p>
-
- <p>If you are not going to have any keyboard/video screen on this
- server at all, you should find all the lines for
- <samp>ttyv0</samp> through <samp>ttyv8</samp>:</p>
-
-<pre>
-ttyv1 "/usr/libexec/getty Pc" cons25 on secure
-</pre>
-
- <p>Change the <samp>on</samp> to <samp>off</samp>. This will stop
- login screens being run on the useless video consoles.</p>
-
- <p>Find the line containing <samp>ttyd0</samp>. Change it
- from</p>
-
-<pre>
-ttyd0 "/usr/libexec/getty std.9600" dialup off secure
-</pre>
-
- <p>to</p>
-
-<pre>
-ttyd0 "/usr/libexec/getty std.9600" vt100 on secure
-</pre>
-
- <p>(replacing <samp>vt100</samp> with the term type of your
- console. <samp>xterms</samp> might be a good choice). This
- allows you to log in to the console port once the system is
- running multi-user.</p>
-
- <p>Reboot and away you go!</p>
-
- <h2>Security Implications</h2>
-
- <p>The client-server protocol for <code>conserver</code> requires
- the user of the <code>console</code> client to enter a password.
- This password is passed across the net in <em>cleartext!!!</em>
- This means <code>conserver</code> is not really suitable for use
- across untrusted networks (such as the Internet). Use of
- conserver-only passwords (in the <code>conserver.passwd</code>
- file) slightly mitigate this problem, but anyone sniffing a
- conserver connection can easily get console access, and from
- there prang your machine using the console break sequence. For
- operating across the Internet, use something secure like
- <em>SSH</em> to log into to the server machine, and run the
- console client there.</p>
-
- <h2><a name="conserver-versions">On Conserver Versions</a></h2>
-
- <p>The <code>conserver</code> program has fractured into a number
- of versions. The home page referenced above seems to be the
- latest and most featureful version around, and carries a version
- number of "7.0.2". This is maintained by Bryan Stansell (<a
- href="mailto:bryan@conserver.com">bryan@conserver.com</a>), who
- has brought together the work of many people (listed on his
- webpage).</p>
-
- <p>The FreeBSD ports collection contains a port for version 8.5 of
- conserver. This seems to be older and less featureful than the
- 7.0.2 version (in particular, it doesn't support consoles
- connected to terminal server ports and does not support a
- <code>conserver.passwd</code> file), and is written in a fairly
- idiosyncratic manner (using a preprocessor to generate C code).
- Version 8.5 is maintained by Kevin S Braunsdorf (<a
- href="mailto:ksb+conserver@sa.fedex.com">ksb+conserver@sa.fedex.com</a>)
- who did most of the original work on conserver, and whose work
- Bryan Stansell is building on. The 8.5 version does support one
- feature not in the 7.0.2 version (controlling power to remote
- machines via a specific serial-interfaced power controller
- hardware).</p>
-
- <p>As shipped with FreeBSD, the 8.5 version doesn't authenticate
- against FreeBSD servers using MD5 passwords. There is a patch
- in the FreeBSD GNATS system (<a
- href="http://www.freebsd.org/cgi/query-pr.cgi?pr=28432">ports/28432</a>)
- that fixes this problem. Kevin has indicated this patch will be
- included in future versions of conserver from him. There are a
- couple of other problems with the 8.5 version as well.</p>
-
- <ul>
- <li><p>It is hard to rotate log files, as <code>conserver</code>
- doesn't create a PID file and killing the parent conserver
- process doesn't kill the children (which have the logfiles
- open).</p></li>
-
- <li><p>Compiling it (on anything other than FreeBSD) is a pain
- because it depends on a couple of other large programs to
- compile. This is because it is not written in C but in a
- macro language that produces C code, and so depends on these
- macro processors. The intent of this macro language is to
- hide system dependencies. The 7.0.2 version uses GNU
- configure for the same task, and compiling this version on
- Solaris is a breeze. (Compiling 8.5 is easier on FreeBSD as
- the ports framework takes care of all this for you).</p></li>
-
- <li><p>After compiling on Solaris, the <code>console</code>
- program would not authenticate against the
- <code>conserver</code> program on FreeBSD, because it used
- <code>getpass()</code> on Solaris that silently truncates
- passwords to 8 characters. FreeBSD uses MD5 passwords that
- can be (and in our case, are) longer than 8 characters.</p>
-
- <li><p>There was some confusion about the role of "groups" in
- <code>conserver</code>. When replaying log messages in 8.5,
- it seemed to replay messages from all consoles in the group,
- whereas 7.0.2 seems to do the obvious thing and keep output
- from individual consoles separate. (This may well have just
- been boneheaded setup mistakes on my part however.) The
- upshot was that the 8.5 version needed a new group (and
- process) per console, whereas the 7.0.2 version will happily
- support multiple ports per process.</p></li>
- </ul>
-
-
- <H2>Links</h2>
-
- <p><a href="http://www.conserver.com/">Homepage</a> for the latest
- version of conserver.</p>
-
- <p><a
- href="ftp://ftp.conserver.com/conserver/conserver-7.0.2.tar.gz">FTP</a>
- the conserver 7.0.2 source tarball.</p>
-
- <p><a href="http://www.stallion.com">Stallion Technologies</a> homepage.</p>
-
- <p>David Harris' <a
- href="http://www.conserver.com/consoles/msock.html">Minor Scroll
- Of Console Knowledge</a> contains heaps of good information on
- serial consoles and serial comms in general.</p>
-
- <p>His <a href="http://www.conserver.com/consoles/">Greater Scroll
- of Console Knowledge</a> contains evern more specific info on
- connecting various devices to various other devices. Oh the
- joys of standards!</p>
-
- <p>Doug Hughes has <a
- href="http://www.eng.auburn.edu/users/doug/console.html">a
- similar console server</a> based on the <samp>screen</samp>
- program and an old SunOs host.</p>
-
- <p>The <a href="http://www.realweasel.com">Real Weasel</a> company
- makes a ISA or PCI video card that looks like a PC video card
- but actually talks to a serial port. This can be used to
- implement serial consoles on PC hardware for operating systems
- that can't be forced to use serial console ports early
- enough.</p>
-
- <h2>Files</h2>
-
- <a href="stal-jumbo-patch">Stallion Jumbo Patch for FreeBSD 4
- (unzipped, 400k)</a><br> The same <a
- href="stal-jumbo-patch.gz">Stallion Jumbo Patch for FreeBSD 4
- (gzipped, 140k)</a><br>
-
- A FreeBSD <a href="conserver-port.tar.gz">port framework</a> for
- conserver 7.0.2.<br> The <a href="conserver-port.shar">Port
- framework as a SHAR file</a><br>
-
- <h2>Man Pages</h2>
-
- <a href="console.html">console(8)</a><br>
- <a href="conserver.html">conserver(8)</a><br>
- <a href="conserver.cf.html">conserver.cf(5)</a><br>
-
- <h2>Change Log</h2>
-
-<dl>
-<dt>10 July, 2001
-<dd>Initial version announced on FreeBSD and Sage-AU mailing lists.
-
-<dt>12 July, 2001
-<dd>
-<ul>
-<li>Notes on some commercial console servers from Doug Schache.
-<li>Grrr. Fixed the pinout for the Cisco - Stallion RJ-45 cable.
-The cable would have worked but was backwards. The new table now
-reflects the description.
-<li>Noted that Catalyst cable is a 26xx cable plugged in the othyer
-way around.
-<li>Added notes about RJ-45 pin numberring and color coding
-conventions
-<li>Added notes about serial console on FreeBSD/i386 platforms.
-<li>Now in RCS.
-</ul>
-
-<dt>13 July, 2001
-<dd>
-<ul>
-<li>Notes on cable marking from Hugh Irvine
-<li>Notes on custom-made cables, source for headshells
-</ul>
-
-<dt>18 July, 2001
-<dd>
-<ul>
-<li>Links to Black Box adapters
-<li>Fix dates. It's July, already!
-<li>Pointers to commercial solutions and serial-port-on-other-server setup
-<li>Pointer to "openssl passwd" command
-</ul>
-
-</dl>
-
- <hr>
- <address><a href="mailto:gnb@itga.com.au">Gregory Bond</a></address>
-<!-- Created: Wed Jul 4 12:35:02 EST 2001 -->
-<!-- hhmts start -->
-Last modified: Thu Jul 19 10:19:28 EST 2001
-<!-- hhmts end -->
-<br>
-$Id: article.sgml,v 1.1 2001-09-13 07:22:12 murray Exp $
-
- </body>
-</html>
diff --git a/en_US.ISO8859-1/articles/console-server/itgastyle.css b/en_US.ISO8859-1/articles/console-server/itgastyle.css
deleted file mode 100644
index d3bb7da620..0000000000
--- a/en_US.ISO8859-1/articles/console-server/itgastyle.css
+++ /dev/null
@@ -1,223 +0,0 @@
-body {
- background-color: rgb(255,255,255)
-}
-
-H1.itgadoc {
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-weight: bold;
- font-size: 16pt;
-}
-
-H2.itgadoc {
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-weight: bold;
- font-size: 12pt;
-}
-
-H3.itgadoc {
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-weight: bold;
- font-size: 10pt;
-}
-
-TD.itghead1 {
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-weight: bold;
- font-size: 16pt;
-}
-
-TD.itghead2 {
- color: black;
- font-family: Arial, Helvetica, sans-serif;
- font-weight: bold;
- font-size: 10pt;
-}
-
-H3.std {
- color: "#2131ce";
- font-family: Arial, Helvetica, sans-serif;
-}
-H2.std {
- color: "#2131ce";
- font-family: Arial, Helvetica, sans-serif;
-}
-caption.std {
- color: "#2131ce";
- font-family: Arial, Helvetica, sans-serif;
- font-weight: bold;
- font-size: 12pt;
-}
-caption.outline {
- color: "#2131ce";
- background-color: #ebebeb;
- font-family: Arial, Helvetica, sans-serif;
- font-weight: bold;
- font-size: 12pt;
-}
-th.std {
- color: "#2131ce";
- font-family: Arial, Helvetica, sans-serif;
- font-weight: bold;
- font-size: 10pt;
-}
-
-th.outline {
- color: "#2131ce";
- background-color: #ebebeb;
- font-family: Arial, Helvetica, sans-serif;
- font-weight: bold;
- font-size: 10pt;
-}
-td.std {
- color: "#2131ce";
- font-family: Arial, Helvetica, sans-serif;
- font-weight: normal;
- font-size: 10pt;
-}
-
-caption.news {
- color: rgb(255,255,255);
- font-family: Arial, Helvetica, sans-serif;
- font-weight: bold;
-}
-
-big.news {
- color: rgb(194,194,194);
- font-size: 20pt;
- font-family: Arial, Helvetica, sans-serif;
- font-weight: normal;
-}
-
-table.news {
- background-color: rgb(204,255,204);
- color: rgb(194,194,194);
- font-family: Arial, Helvetica, sans-serif;
- font-size: 12pt;
- font-weight: normal;
-}
-
-tr.alt {
- background-color: lavender;
-}
-
-tr.header {
- background-color: rgb(245,222,179);
- color: rgb(194,194,194);
- font-family: Arial, Helvetica, sans-serif;
- font-size: 12pt;
- font-weight: bold;
-}
-
-tr.tablerow {
- background-color: rgb(204,255,204);
- color: rgb(194,194,194);
- font-family: Arial, Helvetica, sans-serif;
- font-size: 12pt;
- font-weight: normal;
-}
-
-td.header {
- background-color: rgb(245,222,179);
- color: rgb(0,0,255);
- font-family: Arial, Helvetica, sans-serif;
- font-size: 12pt;
- font-weight: bold;
-}
-
-td.tablerow {
- background-color: rgb(204,255,204);
- color: rgb(0,0,255);
- font-family: Arial, Helvetica, sans-serif;
- font-size: 12pt;
- font-weight: normal;
-}
-
-UL.std {
- color: rgb(194,194,194);
- font-family: Arial, Helvetica, sans-serif;
- font-weight: normal;
-}
-UL.small {
- color: rgb(194,194,194);
- font-family: Arial, Helvetica, sans-serif;
- font-weight: bold;
- font-size: 10pt;
-}
-UL.big {
- color: rgb(111,221,0);
- font-family: Arial, Helvetica, sans-serif;
- font-weight: bold;
- font-size: 12pt;
-}
-
-span.std {
- color: "#2131ce";
- font-family: Arial, Helvetica, sans-serif;
- font-weight: normal;
- font-size: 10pt;
-}
-
-span.itgadoc {
- color: "black";
- font-family: Arial, Helvetica, sans-serif;
- font-weight: normal;
- font-size: 10pt;
-}
-
-span.outline {
- color: "#2131ce";
- font-family: Arial, Helvetica, sans-serif;
- font-weight: bold;
- font-size: 12pt;
-}
-
-div.tty-example {
- width: 100%;
- border: none;
- padding: 10px;
- font-family: "Lucida Typewriter", lucidatypewriter, monospace;
- background-color-color: rgb(230,230,250);
-}
-
-span.error {
- font: bold 18pt helvetica;
- color: rgb(255,0,0);
-}
-tr.email {
- background-color: rgb(255,250,250);
-}
-
-table.outline {
- background-color: #ebebeb;
-}
-
-table.std {
- background-color: white;
-}
-
-td.input {
- background-color: #ebebeb;
- color: "#2131ce";
- font-family: Arial, Helvetica, sans-serif;
- font-weight: normal;
- font-size: 10pt;
-}
-
-p.head {
- background-color: lavender;
- font-family: Arial, Helvetica, sans-serif;
- font-weight: bold;
- font-size: 10pt;
-}
-
-p.std {
- background-color: white;
- font-family: Arial, Helvetica, sans-serif;
- font-weight: normal;
- font-size: 10pt;
-}
-
diff --git a/en_US.ISO8859-1/articles/console-server/tk0231-9-1.png b/en_US.ISO8859-1/articles/console-server/tk0231-9-1.png
deleted file mode 100644
index ddce3e0e34..0000000000
--- a/en_US.ISO8859-1/articles/console-server/tk0231-9-1.png
+++ /dev/null
Binary files differ
diff --git a/en_US.ISO8859-1/articles/contributing/Makefile b/en_US.ISO8859-1/articles/contributing/Makefile
deleted file mode 100644
index 27aeb7f607..0000000000
--- a/en_US.ISO8859-1/articles/contributing/Makefile
+++ /dev/null
@@ -1,16 +0,0 @@
-# $FreeBSD$
-
-DOC?= article
-
-FORMATS?= html
-
-INSTALL_COMPRESSED?=gz
-INSTALL_ONLY_COMPRESSED?=
-
-JADEFLAGS+= -V %generate-article-toc%
-
-SRCS= article.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/contributing/article.sgml b/en_US.ISO8859-1/articles/contributing/article.sgml
deleted file mode 100644
index 6860cc3dd7..0000000000
--- a/en_US.ISO8859-1/articles/contributing/article.sgml
+++ /dev/null
@@ -1,495 +0,0 @@
-<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man;
-<!ENTITY % freebsd PUBLIC "-//FreeBSD//ENTITIES DocBook Miscellaneous
-FreeBSD Entities//EN"> %freebsd;
-<!ENTITY % newsgroups PUBLIC "-//FreeBSD//ENTITIES DocBook Newsgroup Entities//EN"> %newsgroups;
-<!ENTITY % authors PUBLIC "-//FreeBSD//ENTITIES DocBook Author Entities//EN">
-%authors;
-<!ENTITY % mailing-lists PUBLIC "-//FreeBSD//ENTITIES DocBook Mailing List Entities//EN"> %mailing-lists;
-<!ENTITY % not.published "IGNORE">
-]>
-
-<article>
- <articleinfo>
- <title>Contributing to FreeBSD</title>
-
- <pubdate>$FreeBSD: doc/en_US.ISO8859-1/articles/contributing/article.sgml,v 1.469 2001/10/08 06:18:45 murray Exp $</pubdate>
-
- <abstract>
- <para>This article describes the different ways in which an
- individual or organization may contribute to the FreeBSD
- Project.</para>
- </abstract>
-
- <authorgroup>
- <author>
- <firstname>Jordan</firstname>
- <surname>Hubbard</surname>
- <contrib>Contributed by </contrib>
- </author>
- </authorgroup>
- </articleinfo>
-
- <indexterm><primary>contributing</primary></indexterm>
- <para>So you want to contribute something to FreeBSD? That is great! We can
- always use the help, and FreeBSD is one of those systems that
- <emphasis>relies</emphasis> on the contributions of its user base in order
- to survive. Your contributions are not only appreciated, they are vital
- to FreeBSD's continued growth!</para>
-
- <para>Contrary to what some people might also have you believe, you do not
- need to be a hot-shot programmer or a close personal friend of the FreeBSD
- core team in order to have your contributions accepted. The FreeBSD
- Project's development is done by a large and growing number of
- international contributors whose ages and areas of technical expertise
- vary greatly, and there is always more work to be done than there are
- people available to do it.</para>
-
- <para>Since the FreeBSD project is responsible for an entire operating
- system environment (and its installation) rather than just a kernel or a
- few scattered utilities, our <filename>TODO</filename> list also spans a
- very wide range of tasks, from documentation, beta testing and
- presentation to highly specialized types of kernel development. No matter
- what your skill level, there is almost certainly something you can do to
- help the project!</para>
-
- <para>Commercial entities engaged in FreeBSD-related enterprises are also
- encouraged to contact us. Need a special extension to make your product
- work? You will find us receptive to your requests, given that they are not
- too outlandish. Working on a value-added product? Please let us know! We
- may be able to work cooperatively on some aspect of it. The free software
- world is challenging a lot of existing assumptions about how software is
- developed, sold, and maintained throughout its life cycle, and we urge you
- to at least give it a second look.</para>
-
- <sect1 id="contrib-what">
- <title>What Is Needed</title>
-
- <para>The following list of tasks and sub-projects represents something of
- an amalgam of the various core team <filename>TODO</filename> lists and
- user requests we have collected over the last couple of months. Where
- possible, tasks have been ranked by degree of urgency. If you are
- interested in working on one of the tasks you see here, send mail to the
- coordinator listed by clicking on their names. If no coordinator has
- been appointed, maybe you would like to volunteer?</para>
-
- <sect2>
- <title>Ongoing Tasks</title>
-
- <para>Most of the tasks listed in the previous sections require either a
- considerable investment of time or an in-depth knowledge of the
- FreeBSD kernel (or both). However, there are also many useful tasks
- which are suitable for &quot;weekend hackers&quot;, or people without
- programming skills.</para>
-
- <orderedlist>
- <listitem>
- <para>If you run FreeBSD-current and have a good Internet
- connection, there is a machine <hostid
- role="fqdn">current.FreeBSD.org</hostid> which builds a full
- release once a day &mdash; every now and again, try and install
- the latest release from it and report any failures in the
- process.</para>
- </listitem>
-
- <listitem>
- <para>Read the freebsd-bugs mailing list. There might be a
- problem you can comment constructively on or with patches you
- can test. Or you could even try to fix one of the problems
- yourself.</para>
- </listitem>
-
- <listitem>
- <para>Read through the FAQ and Handbook periodically. If anything
- is badly explained, out of date or even just completely wrong, let
- us know. Even better, send us a fix (SGML is not difficult to
- learn, but there is no objection to ASCII submissions).</para>
- </listitem>
-
- <listitem>
- <para>Help translate FreeBSD documentation into your native language
- (if not already available) &mdash; just send an email to &a.doc;
- asking if anyone is working on it. Note that you are not
- committing yourself to translating every single FreeBSD document
- by doing this &mdash; in fact, the documentation most in need of
- translation is the installation instructions.</para>
- </listitem>
-
- <listitem>
- <para>Read the freebsd-questions mailing list and &ng.misc
- occasionally (or even regularly). It can be very satisfying to
- share your expertise and help people solve their problems;
- sometimes you may even learn something new yourself! These forums
- can also be a source of ideas for things to work on.</para>
- </listitem>
-
- <listitem>
- <para>If you know of any bug fixes which have been successfully
- applied to -current but have not been merged into -stable after a
- decent interval (normally a couple of weeks), send the committer a
- polite reminder.</para>
- </listitem>
-
- <listitem>
- <para>Move contributed software to <filename>src/contrib</filename>
- in the source tree.</para>
- </listitem>
-
- <listitem>
- <para>Make sure code in <filename>src/contrib</filename> is up to
- date.</para>
- </listitem>
-
- <listitem>
- <para>Build the source tree (or just part of it) with extra warnings
- enabled and clean up the warnings.</para>
- </listitem>
-
- <listitem>
- <para>Fix warnings for ports which do deprecated things like
- using <function>gets()</function> or including
- <filename>malloc.h</filename>.</para>
- </listitem>
-
- <listitem>
- <para>If you have contributed any ports, send your patches back to
- the original author (this will make your life easier when they
- bring out the next version)</para>
- </listitem>
-
- <listitem>
- <para>Suggest further tasks for this list!</para>
- </listitem>
- </orderedlist>
- </sect2>
-
- <sect2>
- <title>Work through the PR Database</title>
-
- <indexterm><primary>problem reports database</primary></indexterm>
- <para>The <ulink
- url="http://www.FreeBSD.org/cgi/query-pr-summary.cgi">FreeBSD PR
- list</ulink> shows all the current active problem reports and
- requests for enhancement that have been submitted by FreeBSD users.
- Look through the open PRs, and see if anything there takes your
- interest. Some of these might be very simple tasks, that just need an
- extra pair of eyes to look over them and confirm that the fix in the
- PR is a good one. Others might be much more complex.</para>
-
- <para>Start with the PRs that have not been assigned to anyone else, but
- if one them is assigned to someone else, but it looks like something
- you can handle, email the person it is assigned to and ask if you can
- work on it&mdash;they might already have a patch ready to be tested,
- or further ideas that you can discuss with them.</para>
- </sect2>
- </sect1>
-
- <sect1 id="contrib-how">
- <title>How to Contribute</title>
-
- <para>Contributions to the system generally fall into one or more of the
- following 6 categories:</para>
-
- <sect2 id="contrib-general">
- <title>Bug Reports and General Commentary</title>
-
- <para>An idea or suggestion of <emphasis>general</emphasis> technical
- interest should be mailed to the &a.hackers;. Likewise, people with
- an interest in such things (and a tolerance for a
- <emphasis>high</emphasis> volume of mail!) may subscribe to the
- hackers mailing list by sending mail to &a.majordomo;. See <ulink
- url="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/eresources.html#ERESOURCES-MAIL">The
- FreeBSD Handbook</ulink> for more information
- about this and other mailing lists.</para>
-
- <para>If you find a bug or are submitting a specific change, please
- report it using the &man.send-pr.1; program or its <ulink
- url="http://www.FreeBSD.org/send-pr.html">WEB-based
- equivalent</ulink>. Try to fill-in each field of the bug report.
- Unless they exceed 65KB, include any patches directly in the report.
- If the patch is suitable to be applied to the source tree put
- <literal>[PATCH]</literal> in the synopsis of the report.
- When including patches, <emphasis>do not</emphasis> use cut-and-paste
- because cut-and-paste turns tabs into spaces and makes them unusable.
- Consider compressing patches and using &man.uuencode.1; if they exceed
- 20KB. Upload very large submissions to <ulink
- url="ftp://ftp.FreeBSD.org/pub/FreeBSD/incoming/">ftp.FreeBSD.org:/pub/FreeBSD/incoming/</ulink>.</para>
-
- <para>After filing a report, you should receive confirmation along with
- a tracking number. Keep this tracking number so that you can update
- us with details about the problem by sending mail to
- <email>bug-followup@FreeBSD.org</email>. Use the number as the
- message subject, e.g. <literal>"Re: kern/3377"</literal>. Additional
- information for any bug report should be submitted this way.</para>
-
- <para>If you do not receive confirmation in a timely fashion (3 days to
- a week, depending on your email connection) or are, for some reason,
- unable to use the &man.send-pr.1; command, then you may ask
- someone to file it for you by sending mail to the &a.bugs;.</para>
- </sect2>
-
- <sect2>
- <title>Changes to the Documentation</title>
-
- <indexterm><primary>documentation submissions</primary></indexterm>
- <para>Changes to the documentation are overseen by the &a.doc;. Send
- submissions and changes (even small ones are welcome!) using
- <command>send-pr</command> as described in <link
- linkend="contrib-general">Bug Reports and General
- Commentary</link>.</para>
- </sect2>
-
- <sect2>
- <title>Changes to Existing Source Code</title>
-
- <indexterm><primary>FreeBSD-current</primary></indexterm>
- <para>An addition or change to the existing source code is a somewhat
- trickier affair and depends a lot on how far out of date you are with
- the current state of the core FreeBSD development. There is a special
- on-going release of FreeBSD known as <quote>FreeBSD-current</quote>
- which is made available in a variety of ways for the convenience of
- developers working actively on the system. See <ulink url="
- http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/current-stable.html">The
- FreeBSD Handbook</ulink> for more
- information about getting and using FreeBSD-current.</para>
-
- <para>Working from older sources unfortunately means that your changes
- may sometimes be too obsolete or too divergent for easy re-integration
- into FreeBSD. Chances of this can be minimized somewhat by
- subscribing to the &a.announce; and the &a.current; lists, where
- discussions on the current state of the system take place.</para>
-
- <para>Assuming that you can manage to secure fairly up-to-date sources
- to base your changes on, the next step is to produce a set of diffs to
- send to the FreeBSD maintainers. This is done with the &man.diff.1;
- command, with the <quote>context diff</quote> form
- being preferred. For example:</para>
-
- <indexterm>
- <primary><command>diff</command></primary>
- </indexterm>
- <para>
- <screen>&prompt.user; <userinput>diff -c oldfile newfile</userinput></screen>
-
- or
-
- <screen>&prompt.user; <userinput>diff -c -r olddir newdir</userinput></screen>
-
- would generate such a set of context diffs for the given source file
- or directory hierarchy. See the man page for &man.diff.1; for more
- details.</para>
-
- <para>Once you have a set of diffs (which you may test with the
- &man.patch.1; command), you should submit them for inclusion with
- FreeBSD. Use the &man.send-pr.1; program as described in <link
- linkend="contrib-general">Bug Reports and General Commentary</link>.
- <emphasis>Do not</emphasis> just send the diffs to the &a.hackers; or
- they will get lost! We greatly appreciate your submission (this is a
- volunteer project!); because we are busy, we may not be able to
- address it immediately, but it will remain in the PR database until we
- do. Indicate your submission by including <literal>[PATCH]</literal>
- in the synopsis of the report.</para>
-
- <indexterm>
- <primary><command>uuencode</command></primary>
- </indexterm>
- <para>If you feel it appropriate (e.g. you have added, deleted, or
- renamed files), bundle your changes into a <command>tar</command> file
- and run the &man.uuencode.1; program on it. Shar archives are also
- welcome.</para>
-
- <para>If your change is of a potentially sensitive nature, e.g. you are
- unsure of copyright issues governing its further distribution or you
- are simply not ready to release it without a tighter review first,
- then you should send it to &a.core; directly rather than submitting it
- with &man.send-pr.1;. The core mailing list reaches a much smaller
- group of people who do much of the day-to-day work on FreeBSD. Note
- that this group is also <emphasis>very busy</emphasis> and so you
- should only send mail to them where it is truly necessary.</para>
-
- <para>Please refer to &man.intro.9; and &man.style.9; style for
- some information on coding style. We would appreciate it if you
- were at least aware of this information before submitting
- code.</para>
- </sect2>
-
- <sect2>
- <title>New Code or Major Value-Added Packages</title>
-
- <para>In the case of a significant contribution of a large body
- work, or the addition of an important new feature to FreeBSD, it
- becomes almost always necessary to either send changes as uuencoded
- tar files or upload them to a web or FTP site for other people to
- access. If you do not have access to a web or FTP site, ask on an
- appropriate FreeBSD mailing list for someone to host the changes for
- you.</para>
-
- <para>When working with large amounts of code, the touchy subject of
- copyrights also invariably comes up. Acceptable copyrights for code
- included in FreeBSD are:</para>
-
- <orderedlist>
- <indexterm><primary>BSD copyright</primary></indexterm>
- <listitem>
- <para>The BSD copyright. This copyright is most preferred due to
- its <quote>no strings attached</quote> nature and general
- attractiveness to commercial enterprises. Far from discouraging
- such commercial use, the FreeBSD Project actively encourages such
- participation by commercial interests who might eventually be
- inclined to invest something of their own into FreeBSD.</para>
- </listitem>
-
- <indexterm><primary>GPL</primary><see>GNU General Public License</see></indexterm>
- <indexterm><primary>GNU General Public License</primary></indexterm>
- <listitem>
- <para>The GNU General Public License, or <quote>GPL</quote>.
- This license is not quite as popular with us due to the amount
- of extra effort demanded of anyone using the code for
- commercial purposes, but given the sheer quantity of GPL'd code
- we currently require (compiler, assembler, text formatter, etc)
- it would be silly to refuse additional contributions under this
- license. Code under the GPL also goes into a different part of
- the tree, that being <filename>/sys/gnu</filename> or
- <filename>/usr/src/gnu</filename>, and is therefore easily
- identifiable to anyone for whom the GPL presents a
- problem.</para>
- </listitem>
- </orderedlist>
-
- <para>Contributions coming under any other type of copyright must be
- carefully reviewed before their inclusion into FreeBSD will be
- considered. Contributions for which particularly restrictive
- commercial copyrights apply are generally rejected, though the authors
- are always encouraged to make such changes available through their own
- channels.</para>
-
- <para>To place a <quote>BSD-style</quote> copyright on your work, include
- the following text at the very beginning of every source code file you
- wish to protect, replacing the text between the <literal>%%</literal>
- with the appropriate information.</para>
-
- <programlisting>Copyright (c) %%proper_years_here%%
- %%your_name_here%%, %%your_state%% %%your_zip%%.
- All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer as
- the first lines of this file unmodified.
-2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY %%your_name_here%% ``AS IS'' AND ANY EXPRESS OR
-IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-IN NO EVENT SHALL %%your_name_here%% BE LIABLE FOR ANY DIRECT, INDIRECT,
-INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
- &#36;Id&#36;</programlisting>
-
- <para>For your convenience, a copy of this text can be found in
- <filename>/usr/share/examples/etc/bsd-style-copyright</filename>.</para>
- </sect2>
-
- <sect2>
- <title>Money, Hardware or Internet Access</title>
-
- <para>We are always very happy to accept donations to further the cause
- of the FreeBSD Project and, in a volunteer effort like ours, a little
- can go a long way! Donations of hardware are also very important to
- expanding our list of supported peripherals since we generally lack
- the funds to buy such items ourselves.</para>
-
- <sect3>
- <title><anchor id="donations">Donating Funds</title>
-
- <para>The FreeBSD Foundation is a non-profit, tax-exempt
- foundation established to further the goals of the FreeBSD
- Project. As a 501(c)3 entity, the Foundation is generally
- exempt from US federal income tax as well as Colorado
- State income tax. Donations to a tax-exempt entity are
- often deductible from taxable federal income.</para>
-
- <para>Donations may be sent in check form to:
- <address>
- The FreeBSD Foundation
- <street>7321 Brockway Dr.</street>
- <city>Boulder</city>, <state>CO</state> <postcode>80303</postcode>
- <country>USA</country>
- </address>
- The Foundation is not yet able to accept other forms
- of payment such as credit cards and PayPal.</para>
-
- <para>More information about the FreeBSD Foundation can be
- found in <ulink
- url="http://people.freebsd.org/~jdp/foundation/announcement.html">The
- FreeBSD Foundation -- an Introduction</ulink>. To contact
- the Foundation by email, write to
- <email>bod@FreeBSDFoundation.org</email>.</para>
- </sect3>
-
- <sect3>
- <title>Donating Hardware</title>
- <indexterm><primary>donations</primary></indexterm>
-
- <para>Donations of hardware in any of the 3 following categories are
- also gladly accepted by the FreeBSD Project:</para>
-
- <itemizedlist>
- <listitem>
- <para>General purpose hardware such as disk drives, memory or
- complete systems should be sent to the FreeBSD, Inc. address
- listed in the <emphasis>donating funds</emphasis>
- section.</para>
- </listitem>
-
- <listitem>
- <para>Hardware for which ongoing compliance testing is desired.
- We are currently trying to put together a testing lab of all
- components that FreeBSD supports so that proper regression
- testing can be done with each new release. We are still lacking
- many important pieces (network cards, motherboards, etc) and if
- you would like to make such a donation, please contact &a.dg;
- for information on which items are still required.</para>
- </listitem>
-
- <listitem>
- <para>Hardware currently unsupported by FreeBSD for which you
- would like to see such support added. Please contact the
- &a.core; before sending such items as we will need to find a
- developer willing to take on the task before we can accept
- delivery of new hardware.</para>
- </listitem>
- </itemizedlist>
- </sect3>
-
- <sect3>
- <title>Donating Internet Access</title>
-
- <para>We can always use new mirror sites for FTP, WWW or
- <command>cvsup</command>. If you would like to be such a mirror,
- please contact the FreeBSD project administrators
- <email>hubs@FreeBSD.org</email> for more information.</para>
- </sect3>
- </sect2>
- </sect1>
-
-</article>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- End:
--->
diff --git a/en_US.ISO8859-1/articles/contributors/Makefile b/en_US.ISO8859-1/articles/contributors/Makefile
deleted file mode 100644
index 27aeb7f607..0000000000
--- a/en_US.ISO8859-1/articles/contributors/Makefile
+++ /dev/null
@@ -1,16 +0,0 @@
-# $FreeBSD$
-
-DOC?= article
-
-FORMATS?= html
-
-INSTALL_COMPRESSED?=gz
-INSTALL_ONLY_COMPRESSED?=
-
-JADEFLAGS+= -V %generate-article-toc%
-
-SRCS= article.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/contributors/article.sgml b/en_US.ISO8859-1/articles/contributors/article.sgml
deleted file mode 100644
index cea038a1a4..0000000000
--- a/en_US.ISO8859-1/articles/contributors/article.sgml
+++ /dev/null
@@ -1,7122 +0,0 @@
-<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man;
-<!ENTITY % authors PUBLIC "-//FreeBSD//ENTITIES DocBook Author Entities//EN">
-%authors;
-<!ENTITY % not.published "IGNORE">
-]>
-
-<article>
- <articleinfo>
- <title>Contributors to FreeBSD</title>
-
- <pubdate>$FreeBSD$</pubdate>
-
- <abstract>
- <para>This article lists individuals and organizations who have
- made a contribution to FreeBSD.</para>
- </abstract>
- </articleinfo>
-
- <sect1 id="donors">
- <title>Donors Gallery</title>
-
- <para>The FreeBSD Project is indebted to the following donors and would
- like to publicly thank them here!</para>
-
- <itemizedlist>
- <listitem>
- <para><emphasis>Contributors to the central server
- project:</emphasis></para>
-
- <para>The following individuals and businesses made it possible for
- the FreeBSD Project to build a new central server machine to
- eventually replace <hostid role="fqdn">freefall.FreeBSD.org</hostid>
- by donating the following items:</para>
-
- <itemizedlist>
- <listitem>
- <para>&a.mbarkah and his employer, <ulink url="http://www.hemi.com/">
- Hemisphere Online</ulink>, donated a <emphasis>Pentium Pro
- (P6) 200MHz CPU</emphasis></para>
- </listitem>
-
- <listitem>
- <para><ulink url="http://www.asacomputers.com/">ASA
- Computers</ulink> donated a <emphasis>Tyan 1662
- motherboard</emphasis>.</para>
- </listitem>
-
- <listitem>
- <para>Joe McGuckin <email>joe@via.net</email> of <ulink
- url="http://www.via.net/">ViaNet Communications</ulink> donated
- a <emphasis>Kingston ethernet controller.</emphasis></para>
- </listitem>
-
- <listitem>
- <para>Jack O'Neill <email>jack@diamond.xtalwind.net</email>
- donated an <emphasis>NCR 53C875 SCSI controller
- card</emphasis>.</para>
- </listitem>
-
- <listitem>
- <para>Ulf Zimmermann <email>ulf@Alameda.net</email> of <ulink
- url="http://www.Alameda.net/">Alameda Networks</ulink> donated
- <emphasis>128MB of memory</emphasis>, a <emphasis>4 Gb disk
- drive and the case.</emphasis></para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para><emphasis>Direct funding:</emphasis></para>
-
- <para>The following individuals and businesses have generously
- contributed direct funding to the project:</para>
-
- <itemizedlist>
- <listitem>
- <para>Annelise Anderson
- <email>ANDRSN@HOOVER.STANFORD.EDU</email></para>
- </listitem>
-
- <listitem>
- <para>&a.dillon;</para>
- </listitem>
-
- <listitem>
- <para><ulink url="http://www.bluemountain.com/">Blue Mountain
- Arts</ulink></para>
- </listitem>
-
- <listitem>
- <para><ulink url="http://www.epilogue.com/">Epilogue Technology
- Corporation</ulink></para>
- </listitem>
-
- <listitem>
- <para>&a.sef;</para>
- </listitem>
-
- <listitem>
- <para><ulink url="http://www.gta.com/">Global Technology
- Associates, Inc</ulink></para>
- </listitem>
-
- <listitem>
- <para>Don Scott Wilde</para>
- </listitem>
-
- <listitem>
- <para>Gianmarco Giovannelli
- <email>gmarco@masternet.it</email></para>
- </listitem>
-
- <listitem>
- <para>Josef C. Grosch <email>joeg@truenorth.org</email></para>
- </listitem>
-
- <listitem>
- <para>Robert T. Morris</para>
- </listitem>
-
- <listitem>
- <para>&a.chuckr;</para>
- </listitem>
-
- <listitem>
- <para>Kenneth P. Stox <email>ken@stox.sa.enteract.com</email> of
- <ulink url="http://www.imagescape.com/">Imaginary Landscape,
- LLC.</ulink></para>
- </listitem>
-
- <listitem>
- <para>Dmitry S. Kohmanyuk <email>dk@dog.farm.org</email></para>
- </listitem>
-
- <listitem>
- <para><ulink url="http://www.cdrom.co.jp/">Laser5</ulink> of Japan
- (a portion of the profits from sales of their various FreeBSD
- CDROMs).</para>
- </listitem>
-
- <listitem>
- <para><ulink url="http://www.mmjp.or.jp/fuki/">Fuki Shuppan
- Publishing Co.</ulink> donated a portion of their profits from
- <emphasis>Hajimete no FreeBSD</emphasis> (FreeBSD, Getting
- started) to the FreeBSD and XFree86 projects.</para>
- </listitem>
-
- <listitem>
- <para><ulink url="http://www.ascii.co.jp/">ASCII Corp.</ulink>
- donated a portion of their profits from several FreeBSD-related
- books to the FreeBSD project.</para>
- </listitem>
-
- <listitem>
- <para><ulink url="http://www.yokogawa.co.jp/">Yokogawa Electric
- Corp</ulink> has generously donated significant funding to the
- FreeBSD project.</para>
- </listitem>
-
- <listitem>
- <para><ulink url="http://www.buffnet.net/">BuffNET</ulink></para>
- </listitem>
-
- <listitem>
- <para><ulink url="http://www.pacificsolutions.com/">Pacific
- Solutions</ulink></para>
- </listitem>
-
- <listitem>
- <para><ulink url="http://www.siemens.de/">Siemens AG</ulink>
- via Andre Albsmeier
- <email>andre.albsmeier@mchp.siemens.de</email></para>
- </listitem>
-
- <listitem>
- <para>Chris Silva <email>ras@interaccess.com</email></para>
- </listitem>
-
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para><emphasis>Hardware contributors:</emphasis></para>
-
- <para>The following individuals and businesses have generously
- contributed hardware for testing and device driver
- development/support:</para>
-
- <itemizedlist>
- <listitem>
- <para>BSDi for providing the Pentium P5-90 and
- 486/DX2-66 EISA/VL systems that are being used for our
- development work, to say nothing of the network access and other
- donations of hardware resources.</para>
- </listitem>
-
- <listitem>
- <para>TRW Financial Systems, Inc. provided 130 PCs, three 68 GB
- file servers, twelve Ethernets, two routers and an ATM switch for
- debugging the diskless code.</para>
- </listitem>
-
- <listitem>
- <para>Dermot McDonnell donated the Toshiba XM3401B CDROM drive
- currently used in freefall.</para>
- </listitem>
-
- <listitem>
- <para>&a.chuck; contributed his floppy tape streamer for
- experimental work.</para>
- </listitem>
-
- <listitem>
- <para>Larry Altneu <email>larry@ALR.COM</email>, and &a.wilko;,
- provided Wangtek and Archive QIC-02 tape drives in order to
- improve the <devicename>wt</devicename> driver.</para>
- </listitem>
-
- <listitem>
- <para>Ernst Winter <email>ewinter@lobo.muc.de</email> contributed
- a 2.88 MB floppy drive to the project. This will hopefully
- increase the pressure for rewriting the floppy disk driver.
- </para>
- </listitem>
-
- <listitem>
- <para><ulink url="http://www.tekram.com/">Tekram
- Technologies</ulink> sent one each of their DC-390, DC-390U
- and DC-390F FAST and ULTRA SCSI host adapter cards for
- regression testing of the NCR and AMD drivers with their cards.
- They are also to be applauded for making driver sources for free
- operating systems available from their FTP server <ulink
- url="ftp://ftp.tekram.com/scsi/FreeBSD/">ftp://ftp.tekram.com/scsi/FreeBSD/</ulink>.</para>
- </listitem>
-
- <listitem>
- <para>Larry M. Augustin contributed not only a
- Symbios Sym8751S SCSI card, but also a set of data books,
- including one about the forthcoming Sym53c895 chip with Ultra-2
- and LVD support, and the latest programming manual with
- information on how to safely use the advanced features of the
- latest Symbios SCSI chips. Thanks a lot!</para>
- </listitem>
-
- <listitem>
- <para>Christoph Kukulies <email>kuku@FreeBSD.org</email> donated
- an FX120 12 speed Mitsumi CDROM drive for IDE CDROM driver
- development.</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para><emphasis>Special contributors:</emphasis></para>
-
- <itemizedlist>
- <listitem>
- <para><ulink url="http://www.osd.bsdi.com/">BSDi</ulink> (formerly Walnut Creek CDROM)
- has donated almost more than we can say (see the History
- section of the <ulink url="/handbook">FreeBSD Handbook</ulink> for more details).
- In particular, we would like to thank them for the original
- hardware used for <hostid
- role="fqdn">freefall.FreeBSD.org</hostid>, our primary
- development machine, and for <hostid
- role="fqdn">thud.FreeBSD.org</hostid>, a testing and build
- box. We are also indebted to them for funding various
- contributors over the years and providing us with unrestricted
- use of their T1 connection to the Internet.</para>
- </listitem>
-
- <listitem>
- <para>The <ulink url="http://www.interface-business.de/">interface
- business GmbH, Dresden</ulink> has been patiently supporting
- &a.joerg; who has often preferred FreeBSD work over paid work, and
- used to fall back to their (quite expensive) EUnet Internet
- connection whenever his private connection became too slow or
- flaky to work with it...</para>
- </listitem>
-
- <listitem>
- <para><ulink url="http://www.bsdi.com/">Berkeley Software Design,
- Inc.</ulink> has contributed their DOS emulator code to the
- remaining BSD world, which is used in the
- <emphasis>doscmd</emphasis> command.</para>
- </listitem>
- </itemizedlist>
- </listitem>
- </itemizedlist>
- </sect1>
-
-<!--- XXX top level "staff" group vs additional contributors"
- <title>FreeBSD Project Staff</title>
-
- <para>The FreeBSD Project is managed and operated by the following groups of
- people:</para>
--->
-
- <sect1 id="staff-core">
- <title>The FreeBSD Core Team</title>
-
- <para>The FreeBSD core team constitutes the project's <quote>Board of
- Directors</quote>, responsible for deciding the project's overall goals
- and direction as well as managing <link linkend="staff-who">specific
- areas</link> of the FreeBSD project landscape.</para>
-
- <para>(in alphabetical order by last name):</para>
-
- <itemizedlist>
- <listitem>
- <para>&a.asami;</para>
- </listitem>
-
- <listitem>
- <para>&a.dg;</para>
- </listitem>
-
- <listitem>
- <para>&a.jkh;</para>
- </listitem>
-
- <listitem>
- <para>&a.grog;</para>
- </listitem>
-
- <listitem>
- <para>&a.imp;</para>
- </listitem>
-
- <listitem>
- <para>&a.dfr;</para>
- </listitem>
-
- <listitem>
- <para>&a.msmith;</para>
- </listitem>
-
- <listitem>
- <para>&a.rwatson;</para>
- </listitem>
-
- <listitem>
- <para>&a.peter;</para>
- </listitem>
- </itemizedlist>
- </sect1>
-
-<!--
- This list is sorted by last name, not by entity or tenure.
--->
-
- <sect1 id="staff-committers">
- <title>The FreeBSD Developers</title>
-
- <para>These are the people who have commit privileges and do the
- engineering work on the FreeBSD source tree. All core team members are
- also developers.</para>
-
- <itemizedlist>
- <listitem>
- <para>&a.akiyama;</para>
- </listitem>
-
- <listitem>
- <para>&a.jmas;</para>
- </listitem>
-
- <listitem>
- <para>&a.will;</para>
- </listitem>
-
- <listitem>
- <para>&a.ugen;</para>
- </listitem>
-
- <listitem>
- <para>&a.toshi;</para>
- </listitem>
-
- <listitem>
- <para>&a.babkin;</para>
- </listitem>
-
- <listitem>
- <para>&a.dbaker;</para>
- </listitem>
-
- <listitem>
- <para>&a.jhb;</para>
- </listitem>
-
- <listitem>
- <para>&a.dmlb;</para>
- </listitem>
-
- <listitem>
- <para>&a.mike;</para>
- </listitem>
-
- <listitem>
- <para>&a.mbarkah;</para>
- </listitem>
-
- <listitem>
- <para>&a.rvb;</para>
- </listitem>
-
- <listitem>
- <para>&a.dougb;</para>
- </listitem>
-
- <listitem>
- <para>&a.tobez;</para>
- </listitem>
-
- <listitem>
- <para>&a.stb;</para>
- </listitem>
-
- <listitem>
- <para>&a.pb;</para>
- </listitem>
-
- <listitem>
- <para>&a.abial;</para>
- </listitem>
-
- <listitem>
- <para>&a.jb;</para>
- </listitem>
-
- <listitem>
- <para>&a.nbm;</para>
- </listitem>
-
- <listitem>
- <para>&a.torstenb;</para>
- </listitem>
-
- <listitem>
- <para>&a.mb;</para>
- </listitem>
-
- <listitem>
- <para>&a.jmb;</para>
- </listitem>
-
- <listitem>
- <para>&a.wilko;</para>
- </listitem>
-
- <listitem>
- <para>&a.jake;</para>
- </listitem>
-
- <listitem>
- <para>&a.dburr;</para>
- </listitem>
-
- <listitem>
- <para>&a.adrian;</para>
- </listitem>
-
- <listitem>
- <para>&a.dwcjr;</para>
- </listitem>
-
- <listitem>
- <para>&a.charnier;</para>
- </listitem>
-
- <listitem>
- <para>&a.jon;</para>
- </listitem>
-
- <listitem>
- <para>&a.luoqi;</para>
- </listitem>
-
- <listitem>
- <para>&a.ache;</para>
- </listitem>
-
- <listitem>
- <para>&a.ejc;</para>
- </listitem>
-
- <listitem>
- <para>&a.kjc;</para>
- </listitem>
-
- <listitem>
- <para>&a.cjh;</para>
- </listitem>
-
- <listitem>
- <para>&a.cjc;</para>
- </listitem>
-
- <listitem>
- <para>&a.nik;</para>
- </listitem>
-
- <listitem>
- <para>&a.archie;</para>
- </listitem>
-
- <listitem>
- <para>&a.chris;</para>
- </listitem>
-
- <listitem>
- <para>&a.alc;</para>
- </listitem>
-
- <listitem>
- <para>&a.cracauer;</para>
- </listitem>
-
- <listitem>
- <para>&a.dec;</para>
- </listitem>
-
- <listitem>
- <para>&a.pds;</para>
- </listitem>
-
- <listitem>
- <para>&a.adam;</para>
- </listitem>
-
- <listitem>
- <para>&a.brooks;</para>
- </listitem>
-
- <listitem>
- <para>&a.bsd;</para>
- </listitem>
-
- <listitem>
- <para>&a.jwd;</para>
- </listitem>
-
- <listitem>
- <para>&a.dillon;</para>
- </listitem>
-
- <listitem>
- <para>&a.mdodd;</para>
- </listitem>
-
- <listitem>
- <para>&a.dd;</para>
- </listitem>
-
- <listitem>
- <para>&a.iedowse;</para>
- </listitem>
-
- <listitem>
- <para>&a.robert;</para>
- </listitem>
-
- <listitem>
- <para>&a.gad;</para>
- </listitem>
-
- <listitem>
- <para>&a.dufault;</para>
- </listitem>
-
- <listitem>
- <para>&a.uhclem;</para>
- </listitem>
-
- <listitem>
- <para>&a.tegge;</para>
- </listitem>
-
- <listitem>
- <para>&a.deischen;</para>
- </listitem>
-
- <listitem>
- <para>&a.eivind;</para>
- </listitem>
-
- <listitem>
- <para>&a.julian;</para>
- </listitem>
-
- <listitem>
- <para>&a.rse;</para>
- </listitem>
-
- <listitem>
- <para>&a.ue;</para>
- </listitem>
-
- <listitem>
- <para>&a.ru;</para>
- </listitem>
-
- <listitem>
- <para>&a.se;</para>
- </listitem>
-
- <listitem>
- <para>&a.bde;</para>
- </listitem>
-
- <listitem>
- <para>&a.jasone;</para>
- </listitem>
-
- <listitem>
- <para>&a.sef;</para>
- </listitem>
-
- <listitem>
- <para>&a.jedgar;</para>
- </listitem>
-
- <listitem>
- <para>&a.green;</para>
- </listitem>
-
- <listitem>
- <para>&a.fenner;</para>
- </listitem>
-
- <listitem>
- <para>&a.lioux;</para>
- </listitem>
-
- <listitem>
- <para>&a.jfieber;</para>
- </listitem>
-
- <listitem>
- <para>&a.jfitz;</para>
- </listitem>
-
- <listitem>
- <para>&a.petef;</para>
- </listitem>
-
- <listitem>
- <para>&a.scrappy;</para>
- </listitem>
-
- <listitem>
- <para>&a.lars;</para>
- </listitem>
-
- <listitem>
- <para>&a.dirk;</para>
- </listitem>
-
- <listitem>
- <para>&a.sf;</para>
- </listitem>
-
- <listitem>
- <para>&a.shige;</para>
- </listitem>
-
- <listitem>
- <para>&a.billf;</para>
- </listitem>
-
- <listitem>
- <para>&a.furuta;</para>
- </listitem>
-
- <listitem>
- <para>&a.gallatin;</para>
- </listitem>
-
- <listitem>
- <para>&a.patrick;</para>
- </listitem>
-
- <listitem>
- <para>&a.tg;</para>
- </listitem>
-
- <listitem>
- <para>&a.gibbs;</para>
- </listitem>
-
- <listitem>
- <para>&a.brandon;</para>
- </listitem>
-
- <listitem>
- <para>&a.gioria;</para>
- </listitem>
-
- <listitem>
- <para>&a.graichen;</para>
- </listitem>
-
- <listitem>
- <para>&a.cg;</para>
- </listitem>
-
- <listitem>
- <para>&a.rgrimes;</para>
- </listitem>
-
- <listitem>
- <para>&a.jmg;</para>
- </listitem>
-
- <listitem>
- <para>&a.hanai;</para>
- </listitem>
-
- <listitem>
- <para>&a.roger;</para>
- </listitem>
-
- <listitem>
- <para>&a.mharo;</para>
- </listitem>
-
- <listitem>
- <para>&a.dannyboy;</para>
- </listitem>
-
- <listitem>
- <para>&a.thepish;</para>
- </listitem>
-
- <listitem>
- <para>&a.jhay;</para>
- </listitem>
-
- <listitem>
- <para>&a.sheldonh;</para>
- </listitem>
-
- <listitem>
- <para>&a.mikeh;</para>
- </listitem>
-
- <listitem>
- <para>&a.helbig;</para>
- </listitem>
-
- <listitem>
- <para>&a.ghelmer;</para>
- </listitem>
-
- <listitem>
- <para>&a.erich;</para>
- </listitem>
-
- <listitem>
- <para>&a.chm;</para>
- </listitem>
-
- <listitem>
- <para>&a.nhibma;</para>
- </listitem>
-
- <listitem>
- <para>&a.flathill;</para>
- </listitem>
-
- <listitem>
- <para>&a.orion;</para>
- </listitem>
-
- <listitem>
- <para>&a.pho;</para>
- </listitem>
-
- <listitem>
- <para>&a.horikawa;</para>
- </listitem>
-
- <listitem>
- <para>&a.hosokawa;</para>
- </listitem>
-
- <listitem>
- <para>&a.jeh;</para>
- </listitem>
-
- <listitem>
- <para>&a.hsu;</para>
- </listitem>
-
- <listitem>
- <para>&a.foxfair;</para>
- </listitem>
-
- <listitem>
- <para>&a.tom;</para>
- </listitem>
-
- <listitem>
- <para>&a.mph;</para>
- </listitem>
-
- <listitem>
- <para>&a.imura;</para>
- </listitem>
-
- <listitem>
- <para>&a.shin;</para>
- </listitem>
-
- <listitem>
- <para>&a.itojun;</para>
- </listitem>
-
- <listitem>
- <para>&a.iwasaki;</para>
- </listitem>
-
- <listitem>
- <para>&a.mjacob;</para>
- </listitem>
-
- <listitem>
- <para>&a.keith;</para>
- </listitem>
-
- <listitem>
- <para>&a.gj;</para>
- </listitem>
-
- <listitem>
- <para>&a.trevor;</para>
- </listitem>
-
- <listitem>
- <para>&a.phk;</para>
- </listitem>
-
- <listitem>
- <para>&a.tomsoft;</para>
- </listitem>
-
- <listitem>
- <para>&a.joe;</para>
- </listitem>
-
- <listitem>
- <para>&a.cokane;</para>
- </listitem>
-
- <listitem>
- <para>&a.kato;</para>
- </listitem>
-
- <listitem>
- <para>&a.kris;</para>
- </listitem>
-
- <listitem>
- <para>&a.keramida;</para>
- </listitem>
-
- <listitem>
- <para>&a.fjoe;</para>
- </listitem>
-
- <listitem>
- <para>&a.kiri;</para>
- </listitem>
-
- <listitem>
- <para>&a.andreas;</para>
- </listitem>
-
- <listitem>
- <para>&a.lkoeller;</para>
- </listitem>
-
- <listitem>
- <para>&a.motoyuki;</para>
- </listitem>
-
- <listitem>
- <para>&a.jkoshy;</para>
- </listitem>
-
- <listitem>
- <para>&a.kuriyama;</para>
- </listitem>
-
- <listitem>
- <para>&a.alex;</para>
- </listitem>
-
- <listitem>
- <para>&a.chern;</para>
- </listitem>
-
- <listitem>
- <para>&a.reg;</para>
- </listitem>
-
- <listitem>
- <para>&a.jlemon;</para>
- </listitem>
-
- <listitem>
- <para>&a.truckman;</para>
- </listitem>
-
- <listitem>
- <para>&a.ijliao;</para>
- </listitem>
-
- <listitem>
- <para>&a.lile;</para>
- </listitem>
-
- <listitem>
- <para>&a.clive;</para>
- </listitem>
-
- <listitem>
- <para>&a.kevlo;</para>
- </listitem>
-
- <listitem>
- <para>&a.scottl;</para>
- </listitem>
-
- <listitem>
- <para>&a.ade;</para>
- </listitem>
-
- <listitem>
- <para>&a.jmacd;</para>
- </listitem>
-
- <listitem>
- <para>&a.smace;</para>
- </listitem>
-
- <listitem>
- <para>&a.bmah;</para>
- </listitem>
-
- <listitem>
- <para>&a.dwmalone;</para>
- </listitem>
-
- <listitem>
- <para>&a.mckay;</para>
- </listitem>
-
- <listitem>
- <para>&a.mckusick;</para>
- </listitem>
-
- <listitem>
- <para>&a.eric;</para>
- </listitem>
-
- <listitem>
- <para>&a.ken;</para>
- </listitem>
-
- <listitem>
- <para>&a.dinoex;</para>
- </listitem>
-
- <listitem>
- <para>&a.hm;</para>
- </listitem>
-
- <listitem>
- <para>&a.sanpei;</para>
- </listitem>
-
- <listitem>
- <para>&a.bmilekic;</para>
- </listitem>
-
- <listitem>
- <para>&a.mita;</para>
- </listitem>
-
- <listitem>
- <para>&a.non;</para>
- </listitem>
-
- <listitem>
- <para>&a.jim;</para>
- </listitem>
-
- <listitem>
- <para>&a.marcel;</para>
- </listitem>
-
- <listitem>
- <para>&a.dan;</para>
- </listitem>
-
- <listitem>
- <para>&a.tmm;</para>
- </listitem>
-
- <listitem>
- <para>&a.amurai;</para>
- </listitem>
-
- <listitem>
- <para>&a.markm;</para>
- </listitem>
-
- <listitem>
- <para>&a.rich;</para>
- </listitem>
-
- <listitem>
- <para>&a.knu;</para>
- </listitem>
-
- <listitem>
- <para>&a.nakai;</para>
- </listitem>
-
- <listitem>
- <para>&a.max;</para>
- </listitem>
-
- <listitem>
- <para>&a.newton;</para>
- </listitem>
-
- <listitem>
- <para>&a.rnordier;</para>
- </listitem>
-
- <listitem>
- <para>&a.davidn;</para>
- </listitem>
-
- <listitem>
- <para>&a.obrien;</para>
- </listitem>
-
- <listitem>
- <para>&a.danny;</para>
- </listitem>
-
- <listitem>
- <para>&a.okazaki;</para>
- </listitem>
-
- <listitem>
- <para>&a.olgeni;</para>
- </listitem>
-
- <listitem>
- <para>&a.ljo;</para>
- </listitem>
-
- <listitem>
- <para>&a.onoe;</para>
- </listitem>
-
- <listitem>
- <para>&a.marko;</para>
- </listitem>
-
- <listitem>
- <para>&a.gpalmer;</para>
- </listitem>
-
- <listitem>
- <para>&a.fsmp;</para>
- </listitem>
-
- <listitem>
- <para>&a.smpatel;</para>
- </listitem>
-
- <listitem>
- <para>&a.cp;</para>
- </listitem>
-
- <listitem>
- <para>&a.wpaul;</para>
- </listitem>
-
- <listitem>
- <para>&a.mp;</para>
- </listitem>
-
- <listitem>
- <para>&a.alfred;</para>
- </listitem>
-
- <listitem>
- <para>&a.roam;</para>
- </listitem>
-
- <listitem>
- <para>&a.wes;</para>
- </listitem>
-
- <listitem>
- <para>&a.cpiazza;</para>
- </listitem>
-
- <listitem>
- <para>&a.pirzyk;</para>
- </listitem>
-
- <listitem>
- <para>&a.jdp;</para>
- </listitem>
-
- <listitem>
- <para>&a.bp;</para>
- </listitem>
-
- <listitem>
- <para>&a.rpratt;</para>
- </listitem>
-
- <listitem>
- <para>&a.steve;</para>
- </listitem>
-
- <listitem>
- <para>&a.mpp;</para>
- </listitem>
-
- <listitem>
- <para>&a.markp;</para>
- </listitem>
-
- <listitem>
- <para>&a.darrenr;</para>
- </listitem>
-
- <listitem>
- <para>&a.csgr;</para>
- </listitem>
-
- <listitem>
- <para>&a.greid;</para>
- </listitem>
-
- <listitem>
- <para>&a.mr;</para>
- </listitem>
-
- <listitem>
- <para>&a.martin;</para>
- </listitem>
-
- <listitem>
- <para>&a.benno;</para>
- </listitem>
-
- <listitem>
- <para>&a.luigi;</para>
- </listitem>
-
- <listitem>
- <para>&a.paul;</para>
- </listitem>
-
- <listitem>
- <para>&a.roberto;</para>
- </listitem>
-
- <listitem>
- <para>&a.chuckr;</para>
- </listitem>
-
- <listitem>
- <para>&a.jesusr;</para>
- </listitem>
-
- <listitem>
- <para>&a.guido;</para>
- </listitem>
-
- <listitem>
- <para>&a.groudier;</para>
- </listitem>
-
- <listitem>
- <para>&a.dima;</para>
- </listitem>
-
- <listitem>
- <para>&a.asmodai;</para>
- </listitem>
-
- <listitem>
- <para>&a.ps;</para>
- </listitem>
-
- <listitem>
- <para>&a.sada;</para>
- </listitem>
-
- <listitem>
- <para>&a.hrs;</para>
- </listitem>
-
- <listitem>
- <para>&a.wsanchez;</para>
- </listitem>
-
- <listitem>
- <para>&a.nsayer;</para>
- </listitem>
-
- <listitem>
- <para>&a.sos;</para>
- </listitem>
-
- <listitem>
- <para>&a.wosch;</para>
- </listitem>
-
- <listitem>
- <para>&a.schweikh;</para>
- </listitem>
-
- <listitem>
- <para>&a.dick;</para>
- </listitem>
-
- <listitem>
- <para>&a.jseger;</para>
- </listitem>
-
- <listitem>
- <para>&a.semenu;</para>
- </listitem>
-
- <listitem>
- <para>&a.gshapiro;</para>
- </listitem>
-
- <listitem>
- <para>&a.shiba;</para>
- </listitem>
-
- <listitem>
- <para>&a.tshiozak;</para>
- </listitem>
-
- <listitem>
- <para>&a.simokawa;</para>
- </listitem>
-
- <listitem>
- <para>&a.vanilla;</para>
- </listitem>
-
- <listitem>
- <para>&a.silby;</para>
- </listitem>
-
- <listitem>
- <para>&a.shafeeq;</para>
- </listitem>
-
- <listitem>
- <para>&a.demon;</para>
- </listitem>
-
- <listitem>
- <para>&a.jesper;</para>
- </listitem>
-
- <listitem>
- <para>&a.msmith;</para>
- </listitem>
-
- <listitem>
- <para>&a.ben;</para>
- </listitem>
-
- <listitem>
- <para>&a.nsouch;</para>
- </listitem>
-
- <listitem>
- <para>&a.issei;</para>
- </listitem>
-
- <listitem>
- <para>&a.des;</para>
- </listitem>
-
- <listitem>
- <para>&a.sobomax;</para>
- </listitem>
-
- <listitem>
- <para>&a.dcs;</para>
- </listitem>
-
- <listitem>
- <para>&a.brian;</para>
- </listitem>
-
- <listitem>
- <para>&a.mks;</para>
- </listitem>
-
- <listitem>
- <para>&a.stark;</para>
- </listitem>
-
- <listitem>
- <para>&a.murray;</para>
- </listitem>
-
- <listitem>
- <para>&a.sumikawa;</para>
- </listitem>
-
- <listitem>
- <para>&a.gsutter;</para>
- </listitem>
-
- <listitem>
- <para>&a.unfurl;</para>
- </listitem>
-
- <listitem>
- <para>&a.nyan;</para>
- </listitem>
-
- <listitem>
- <para>&a.tanimura;</para>
- </listitem>
-
- <listitem>
- <para>&a.taoka;</para>
- </listitem>
-
- <listitem>
- <para>&a.mtaylor;</para>
- </listitem>
-
- <listitem>
- <para>&a.dt;</para>
- </listitem>
-
- <listitem>
- <para>&a.mi;</para>
- </listitem>
-
- <listitem>
- <para>&a.yar;</para>
- </listitem>
-
- <listitem>
- <para>&a.cwt;</para>
- </listitem>
-
- <listitem>
- <para>&a.pst;</para>
- </listitem>
-
- <listitem>
- <para>&a.ume;</para>
- </listitem>
-
- <listitem>
- <para>&a.semenu;</para>
- </listitem>
-
- <listitem>
- <para>&a.rv;</para>
- </listitem>
-
- <listitem>
- <para>&a.hoek;</para>
- </listitem>
-
- <listitem>
- <para>&a.logo;</para>
- </listitem>
-
- <listitem>
- <para>&a.nectar;</para>
- </listitem>
-
- <listitem>
- <para>&a.jayanth;</para>
- </listitem>
-
- <listitem>
- <para>&a.wjv;</para>
- </listitem>
-
- <listitem>
- <para>&a.bean;</para>
- </listitem>
-
- <listitem>
- <para>&a.swallace;</para>
- </listitem>
-
- <listitem>
- <para>&a.takawata;</para>
- </listitem>
-
- <listitem>
- <para>&a.assar;</para>
- </listitem>
-
- <listitem>
- <para>&a.dwhite;</para>
- </listitem>
-
- <listitem>
- <para>&a.nate;</para>
- </listitem>
-
- <listitem>
- <para>&a.wollman;</para>
- </listitem>
-
- <listitem>
- <para>&a.keichii;</para>
- </listitem>
-
- <listitem>
- <para>&a.joerg;</para>
- </listitem>
-
- <listitem>
- <para>&a.kbyanc;</para>
- </listitem>
-
- <listitem>
- <para>&a.uch;</para>
- </listitem>
-
- <listitem>
- <para>&a.yokota;</para>
- </listitem>
-
- <listitem>
- <para>&a.andy;</para>
- </listitem>
-
- <listitem>
- <para>&a.zarzycki;</para>
- </listitem>
-
- <listitem>
- <para>&a.phantom;</para>
- </listitem>
-
- <listitem>
- <para>&a.jmz;</para>
- </listitem>
-
- </itemizedlist>
- </sect1>
-
- <sect1 id="staff-doc">
-
-
- <title>The FreeBSD Documentation Project</title>
-
- <para>The <ulink url="http://www.FreeBSD.org/docproj/docproj.html">FreeBSD
- Documentation Project</ulink> is responsible for a number of different
- services, each service being run by an individual and his
- <emphasis>deputies</emphasis> (if any):</para>
-
- <variablelist>
- <varlistentry>
- <term>Documentation Project Architect</term>
-
- <listitem>
- <para>&a.nik;</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Handbook Editor</term>
-
- <listitem>
- <para>&a.jim;</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>FAQ Editor</term>
-
- <listitem>
- <para>&a.faq;</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>News Editor</term>
-
- <listitem>
- <para>&a.jim;</para>
- </listitem>
- </varlistentry>
-
-
- <varlistentry>
- <term>In the Press Editor</term>
-
- <listitem>
- <para>&a.jkoshy;</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>FreeBSD Really-Quick NewsLetter Editor</term>
-
- <listitem>
- <para>Chris Coleman <email>chrisc@vmunix.com</email></para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Gallery Editor</term>
-
- <listitem>
- <para>&a.phantom;</para>
- </listitem>
- </varlistentry>
-
-<![ %not.published; [
-
- <varlistentry>
- <term>Commercial Editor</term>
-
- <listitem>
- <para>nobody yet</para>
- </listitem>
- </varlistentry>
-
-]]>
-
-<![ %not.published; [
-
- <varlistentry>
- <term>Web Changes Editor</term>
-
- <listitem>
- <para>&a.www;</para>
- </listitem>
- </varlistentry>
-
-]]>
-
- <varlistentry>
- <term>User Groups Editor</term>
-
- <listitem>
- <para>&a.grog;</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>FreeBSD Projects and Tasklist Editor</term>
-
- <listitem>
- <para>&a.asmodai;</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>FreeBSD Java Project</term>
-
- <listitem>
- <para>&a.patrick;</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>LinuxDoc to DocBook conversion</term>
-
- <listitem>
- <para>&a.nik;</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect1>
-
- <sect1 id="staff-who">
- <title>Who is Responsible for What</title>
-
- <variablelist>
- <varlistentry>
- <term><ulink
- url="http://www.FreeBSD.org/docproj/docproj.html">Documentation
- Project Manager</ulink></term>
-
- <listitem>
- <para>&a.nik;</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Boot blocks</term>
-
- <listitem>
- <para>&a.rnordier;, &a.jhb;</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Boot loader</term>
-
- <listitem>
- <para>&a.dcs;</para>
- <para>&a.jhb;</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Internationalization</term>
-
- <listitem>
- <para>&a.ache;</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Postmaster</term>
-
- <listitem>
- <para>&a.jmb;</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Release Coordinator</term>
-
- <listitem>
- <para>&a.jkh;</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Public Relations &amp; Corporate Liaison</term>
-
- <listitem>
- <para>&a.jkh;</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><ulink url="http://www.FreeBSD.org/security/">Security
- Officer</ulink></term>
-
- <listitem>
- <para>&a.kris;</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><ulink url="http://www.FreeBSD.org/support.html#cvs">Source
- Repository Managers</ulink></term>
-
- <listitem>
- <para>Principal: &a.peter;</para>
-
- <para>Assistant: &a.jdp;</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><ulink url="http://www.FreeBSD.org/ports/">Ports
- Manager</ulink></term>
-
- <listitem>
- <para>&a.asami;</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Standards</term>
-
- <listitem>
- <para>&a.wollman;</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>XFree86 Project, Inc. Liaison</term>
-
- <listitem>
- <para>&a.rich;</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><ulink url="http://www.FreeBSD.org/support.html#gnats">GNATS
- Administrator</ulink></term>
-
- <listitem>
- <para>&a.steve;</para>
- </listitem>
- </varlistentry>
-
- </variablelist>
- </sect1>
-
- <sect1 id="contrib-corealumni">
- <title>Core Team Alumni</title>
-
- <indexterm><primary>core team</primary></indexterm>
- <para>The following people were members of the FreeBSD core team during
- the periods indicated. We thank them for their past efforts in the
- service of the FreeBSD project.</para>
-
- <para><emphasis>In rough chronological order:</emphasis></para>
-
- <itemizedlist>
- <listitem>
- <para>&a.ache (1993 - 2000)</para>
- </listitem>
-
- <listitem>
- <para>&a.jmb (1993 - 2000)</para>
- </listitem>
-
- <listitem>
- <para>&a.bde (1992 - 2000)</para>
- </listitem>
-
- <listitem>
- <para>&a.gibbs (1993 - 2000)</para>
- </listitem>
-
- <listitem>
- <para>&a.rich (1994 - 2000)</para>
- </listitem>
-
- <listitem>
- <para>&a.phk (1992 - 2000)</para>
- </listitem>
-
- <listitem>
- <para>&a.gpalmer (1993 - 2000)</para>
- </listitem>
-
- <listitem>
- <para>&a.sos (1993 - 2000)</para>
- </listitem>
-
- <listitem>
- <para>&a.wollman (1993 - 2000)</para>
- </listitem>
-
- <listitem>
- <para>&a.joerg (1995 - 2000)</para>
- </listitem>
-
- <listitem>
- <para>&a.jdp (1997 - 2000)</para>
- </listitem>
-
- <listitem>
- <para>&a.guido (1995 - 1999)</para>
- </listitem>
-
- <listitem>
- <para>&a.dyson (1993 - 1998)</para>
- </listitem>
-
- <listitem>
- <para>&a.nate (1992 - 1996)</para>
- </listitem>
-
- <listitem>
- <para>&a.rgrimes (1992 - 1995)</para>
- </listitem>
-
- <listitem>
- <para>Andreas Schulz (1992 - 1995)</para>
- </listitem>
-
- <listitem>
- <para>&a.csgr (1993 - 1995)</para>
- </listitem>
-
- <listitem>
- <para>&a.paul (1992 - 1995)</para>
- </listitem>
-
- <listitem>
- <para>&a.smace (1993 - 1994)</para>
- </listitem>
-
- <listitem>
- <para>Andrew Moore (1993 - 1994)</para>
- </listitem>
-
- <listitem>
- <para>Christoph Robitschko (1993 - 1994)</para>
- </listitem>
-
- <listitem>
- <para>J. T. Conklin (1992 - 1993)</para>
- </listitem>
- </itemizedlist>
- </sect1>
-
- <sect1 id="contrib-develalumni">
- <title>Development Team Alumni</title>
-
- <indexterm><primary>development team</primary></indexterm>
- <para>The following people were members of the FreeBSD development team
- during the periods indicated. We thank them for their past efforts
- in the service of the FreeBSD project.</para>
-
- <para><emphasis>In rough chronological order:</emphasis></para>
-
- <itemizedlist>
- <listitem>
- <para>&a.tedm (???? - 2000)</para>
- </listitem>
- <listitem>
- <para>&a.karl (???? - 2000)</para>
- </listitem>
- <listitem>
- <para>&a.gclarkii (1993 - 2000)</para>
- </listitem>
- <listitem>
- <para>&a.jraynard (???? - 2000)</para>
- </listitem>
- <listitem>
- <para>&a.jgreco (???? - 1999)</para>
- </listitem>
- <listitem>
- <para>&a.ats (???? - 1999)</para>
- </listitem>
- <listitem>
- <para>Jamil Weatherby (1997 - 1999)</para>
- </listitem>
- <listitem>
- <para>meganm (???? - 1998)</para>
- </listitem>
- <listitem>
- <para>&a.dyson (???? - 1998)</para>
- </listitem>
- <listitem>
- <para>Amancio Hasty (1997 - 1998)</para>
- </listitem>
- <listitem>
- <para>Drew Derbyshire (1997 - 1998)</para>
- </listitem>
- </itemizedlist>
- </sect1>
-
- <sect1 id="contrib-derived">
- <title>Derived Software Contributors</title>
-
- <para>This software was originally derived from William F. Jolitz's 386BSD
- release 0.1, though almost none of the original 386BSD specific code
- remains. This software has been essentially re-implemented from the
- 4.4BSD-Lite release provided by the Computer Science Research Group
- (CSRG) at the University of California, Berkeley and associated academic
- contributors.</para>
-
- <para>There are also portions of NetBSD and OpenBSD that have been
- integrated into FreeBSD as well, and we would therefore like to thank
- all the contributors to NetBSD and OpenBSD for their work.</para>
- </sect1>
-
- <sect1 id="contrib-additional">
- <title>Additional FreeBSD Contributors</title>
-
- <para>(in alphabetical order by first name):</para>
-
- <itemizedlist>
- <listitem>
- <para>ABURAYA Ryushirou <email>rewsirow@ff.iij4u.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>AMAGAI Yoshiji <email>amagai@nue.org</email></para>
- </listitem>
-
- <listitem>
- <para>Aaron Bornstein <email>aaronb@j51.com</email></para>
- </listitem>
-
- <listitem>
- <para>Aaron Smith <email>aaron@mutex.org</email></para>
- </listitem>
-
- <listitem>
- <para>Achim Patzner <email>ap@noses.com</email></para>
- </listitem>
-
- <listitem>
- <para>Ada T Lim <email>ada@bsd.org</email></para>
- </listitem>
-
- <listitem>
- <para>Adam Baran <email>badam@mw.mil.pl</email></para>
- </listitem>
-
- <listitem>
- <para>Adam Glass <email>glass@postgres.berkeley.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Adam Herzog <email>adam@herzogdesigns.com</email></para>
- </listitem>
-
- <listitem>
- <para>Adam Kranzel <email>adam@alameda.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Adam McDougall <email>mcdouga9@egr.msu.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Adam Strohl <email>troll@digitalspark.net</email></para>
- </listitem>
-
- <listitem>
- <para>Adoal Xu <email>adoal@iname.com</email></para>
- </listitem>
-
- <listitem>
- <para>Adrian Colley <email>aecolley@ois.ie</email></para>
- </listitem>
-
- <listitem>
- <para>Adrian Hall <email>ahall@mirapoint.com</email></para>
- </listitem>
-
- <listitem>
- <para>Adrian Mariano <email>adrian@cam.cornell.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Adrian Steinmann <email>ast@marabu.ch</email></para>
- </listitem>
-
- <listitem>
- <para>Adrian T. Filipi-Martin
- <email>atf3r@agate.cs.virginia.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Ajit Thyagarajan <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Akio Morita
- <email>amorita@meadow.scphys.kyoto-u.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Akira SAWADA <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Akira Watanabe
- <email>akira@myaw.ei.meisei-u.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Akito Fujita <email>fujita@zoo.ncl.omron.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Alain Kalker
- <email>A.C.P.M.Kalker@student.utwente.nl</email></para>
- </listitem>
-
- <listitem>
- <para>Alan Bawden <email>alan@curry.epilogue.com</email></para>
- </listitem>
-
- <listitem>
- <para>Alec Wolman <email>wolman@cs.washington.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Aled Morris <email>aledm@routers.co.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Aleksandr A Babaylov <email>.@babolo.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Alex G. Bulushev <email>bag@demos.su</email></para>
- </listitem>
-
- <listitem>
- <para>Alex D. Chen
- <email>dhchen@Canvas.dorm7.nccu.edu.tw</email></para>
- </listitem>
-
- <listitem>
- <para>Alex Le Heux <email>alexlh@funk.org</email></para>
- </listitem>
-
- <listitem>
- <para>Alex Kapranoff <email>kappa@zombie.antar.bryansk.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Alex Perel <email>veers@disturbed.net</email></para>
- </listitem>
-
- <listitem>
- <para>Alex Semenyaka <email>alex@rinet.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Alex Varju <email>varju@webct.com</email></para>
- </listitem>
-
- <listitem>
- <para>Alex Zepeda <email>garbanzo@hooked.net</email></para>
- </listitem>
-
- <listitem>
- <para>Alexander B. Povolotsky <email>tarkhil@mgt.msk.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Alexander Gelfenbain <email>mail@gelf.com</email></para>
- </listitem>
-
- <listitem>
- <para>Alexander Leidinger
- <email>Alexander+FBSD@Leidinger.net</email></para>
- </listitem>
-
- <listitem>
- <para>Alexandre Peixoto
- <email>alexandref@tcoip.com.br</email></para>
- </listitem>
-
- <listitem>
- <para>Alexandre Snarskii <email>snar@paranoia.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Alistair G. Crooks <email>agc@uts.amdahl.com</email></para>
- </listitem>
-
- <listitem>
- <para>Allan Bowhill <email>bowhill@bowhill.vservers.com</email></para>
- </listitem>
-
- <listitem>
- <para>Allan Saddi <email>asaddi@philosophysw.com</email></para>
- </listitem>
-
- <listitem>
- <para>Allen Campbell <email>allenc@verinet.com</email></para>
- </listitem>
-
- <listitem>
- <para>Amakawa Shuhei <email>amakawa@hoh.t.u-tokyo.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Amancio Hasty <email>hasty@star-gate.com</email></para>
- </listitem>
-
- <listitem>
- <para>Amir Farah <email>amir@comtrol.com</email></para>
- </listitem>
-
- <listitem>
- <para>Amir Shalem <email>amir@boom.org.il</email></para>
- </listitem>
-
- <listitem>
- <para>Amy Baron <email>amee@beer.org</email></para>
- </listitem>
-
- <listitem>
- <para>The Anarcat <email>beaupran@iro.umontreal.ca</email></para>
- </listitem>
-
- <listitem>
- <para>Anatoly A. Orehovsky <email>tolik@mpeks.tomsk.su</email></para>
- </listitem>
-
- <listitem>
- <para>Anatoly Vorobey <email>mellon@pobox.com</email></para>
- </listitem>
-
- <listitem>
- <para>Anders Andersson <email>anders@codefactory.se</email></para>
- </listitem>
-
- <listitem>
- <para>Anders Nordby <email>anders@fix.no</email></para>
- </listitem>
-
- <listitem>
- <para>Anders Thulin <email>Anders.X.Thulin@telia.se</email></para>
- </listitem>
-
- <listitem>
- <para>Andras Olah <email>olah@cs.utwente.nl</email></para>
- </listitem>
-
- <listitem>
- <para>Andre Albsmeier
- <email>Andre.Albsmeier@mchp.siemens.de</email></para>
- </listitem>
-
- <listitem>
- <para>Andre Goeree <email>abgoeree@uwnet.nl</email></para>
- </listitem>
-
- <listitem>
- <para>Andre Oppermann <email>andre@pipeline.ch</email></para>
- </listitem>
-
- <listitem>
- <para>Andreas Haakh <email>ah@alman.robin.de</email></para>
- </listitem>
-
- <listitem>
- <para>Andreas Kohout <email>shanee@rabbit.augusta.de</email></para>
- </listitem>
-
- <listitem>
- <para>Andreas Lohr <email>andreas@marvin.RoBIN.de</email></para>
- </listitem>
-
- <listitem>
- <para>Andreas Schulz <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Andreas Wetzel <email>mickey@deadline.snafu.de</email></para>
- </listitem>
-
- <listitem>
- <para>Andreas Wrede <email>andreas@planix.com</email></para>
- </listitem>
-
- <listitem>
- <para>Andres Vega Garcia <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Andrew Atrens <email>atreand@statcan.ca</email></para>
- </listitem>
-
- <listitem>
- <para>Andrew Boothman <email>andrew@cream.org</email></para>
- </listitem>
-
- <listitem>
- <para>Andrew Gillham <email>gillham@andrews.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Andrew Gordon <email>andrew.gordon@net-tel.co.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Andrew Herbert <email>andrew@werple.apana.org.au</email></para>
- </listitem>
-
- <listitem>
- <para>Andrew J. Korty <email>ajk@purdue.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Andrew L. Moore <email>alm@mclink.com</email></para>
- </listitem>
-
- <listitem>
- <para>Andrew L. Neporada <email>andrew@chg.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Andrew McRae <email>amcrae@cisco.com</email></para>
- </listitem>
-
- <listitem>
- <para>Andrew Stevenson <email>andrew@ugh.net.au</email></para>
- </listitem>
-
- <listitem>
- <para>Andrew Timonin <email>tim@pool1.convey.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Andrew V. Stesin <email>stesin@elvisti.kiev.ua</email></para>
- </listitem>
-
- <listitem>
- <para>Andrew Webster <email>awebster@dataradio.com</email></para>
- </listitem>
-
- <listitem>
- <para>Andrey Novikov <email>andrey@novikov.com</email></para>
- </listitem>
-
- <listitem>
- <para>Andrey Simonenko <email>simon@comsys.ntu-kpi.kiev.ua</email></para>
- </listitem>
-
- <listitem>
- <para>Andrey Tchoritch <email>andy@venus.sympad.net</email></para>
- </listitem>
-
- <listitem>
- <para>Andy Farkas <email>andyf@speednet.com.au</email></para>
- </listitem>
-
- <listitem>
- <para>Andy Sparrow <email>spadger@best.com</email></para>
- </listitem>
-
- <listitem>
- <para>Andy Valencia <email>ajv@csd.mot.com</email></para>
- </listitem>
-
- <listitem>
- <para>Andy Whitcroft <email>andy@sarc.city.ac.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Angelo Turetta <email>ATuretta@stylo.it</email></para>
- </listitem>
-
- <listitem>
- <para>Anthony C. Chavez <email>magus@xmission.com</email></para>
- </listitem>
-
- <listitem>
- <para>Anthony Yee-Hang Chan <email>yeehang@netcom.com</email></para>
- </listitem>
-
- <listitem>
- <para>Anton N. Bruesov <email>antonz@library.ntu-kpi.kiev.ua</email></para>
- </listitem>
-
- <listitem>
- <para>Anton Voronin <email>anton@urc.ac.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Antti Kaipila <email>anttik@iki.fi</email></para>
- </listitem>
-
- <listitem>
- <para>arci <email>vega@sophia.inria.fr</email></para>
- </listitem>
-
- <listitem>
- <para>Are Bryne <email>are.bryne@communique.no</email></para>
- </listitem>
-
- <listitem>
- <para>Ari Suutari <email>ari@suutari.iki.fi</email></para>
- </listitem>
-
- <listitem>
- <para>Arindum Mukerji <email>rmukerji@execpc.com</email></para>
- </listitem>
-
- <listitem>
- <para>Arjan de Vet <email>devet@IAEhv.nl</email></para>
- </listitem>
-
- <listitem>
- <para>Arne Henrik Juul <email>arnej@Lise.Unit.NO</email></para>
- </listitem>
-
- <listitem>
- <para>Arun Sharma <email>adsharma@sharmas.dhs.org</email></para>
- </listitem>
-
- <listitem>
- <para>Arnaud S. Launay <email>asl@launay.org</email></para>
- </listitem>
-
- <listitem>
- <para>Ask Bjoern Hansen <email>ask@valueclick.com</email></para>
- </listitem>
-
- <listitem>
- <para>Atsushi Furuta <email>furuta@sra.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Atsushi Murai <email>amurai@spec.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Atushi Sakauchi <email>sakauchi@yamame.to</email></para>
- </listitem>
-
- <listitem>
- <para>Bakul Shah <email>bvs@bitblocks.com</email></para>
- </listitem>
-
- <listitem>
- <para>Barry Bierbauch <email>pivrnec@vszbr.cz</email></para>
- </listitem>
-
- <listitem>
- <para>Barry Lustig <email>barry@ictv.com</email></para>
- </listitem>
-
- <listitem>
- <para>Ben Hutchinson <email>benhutch@xfiles.org.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Ben Jackson <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Ben Walter <email>bwalter@itachi.swcp.com</email></para>
- </listitem>
-
- <listitem>
- <para>Benjamin Lewis <email>bhlewis@gte.net</email></para>
- </listitem>
-
- <listitem>
- <para>Berend de Boer <email>berend@pobox.com</email></para>
- </listitem>
-
- <listitem>
- <para>Bernd Rosauer <email>br@schiele-ct.de</email></para>
- </listitem>
-
- <listitem>
- <para>Bill Kish <email>kish@osf.org</email></para>
- </listitem>
-
- <listitem>
- <para>Bill Trost <email>trost@cloud.rain.com</email></para>
- </listitem>
-
- <listitem>
- <para>Blaz Zupan <email>blaz@amis.net</email></para>
- </listitem>
-
- <listitem>
- <para>Bob Van Valzah <email>Bob@whitebarn.com</email></para>
- </listitem>
-
- <listitem>
- <para>Bob Wilcox <email>bob@obiwan.uucp</email></para>
- </listitem>
-
- <listitem>
- <para>Bob Willcox <email>bob@luke.pmr.com</email></para>
- </listitem>
-
- <listitem>
- <para>Boris Staeblow <email>balu@dva.in-berlin.de</email></para>
- </listitem>
-
- <listitem>
- <para>Boyd Faulkner <email>faulkner@mpd.tandem.com</email></para>
- </listitem>
-
- <listitem>
- <para>Boyd R. Faulkner <email>faulkner@asgard.bga.com</email></para>
- </listitem>
-
- <listitem>
- <para>Brad Chapman <email>chapmanb@arches.uga.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Brad Hendrickse <email>bradh@uunet.co.za</email></para>
- </listitem>
-
- <listitem>
- <para>Brad Karp <email>karp@eecs.harvard.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Bradley Dunn <email>bradley@dunn.org</email></para>
- </listitem>
-
- <listitem>
- <para>Brad Jones <email>brad@kazrak.com</email></para>
- </listitem>
-
- <listitem>
- <para>Brandon Fosdick <email>bfoz@glue.umd.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Brandon Gillespie <email>brandon@roguetrader.com</email></para>
- </listitem>
-
- <listitem>
- <para>&a.wlloyd;</para>
- </listitem>
-
- <listitem>
- <para>Brent J. Nordquist <email>bjn@visi.com</email></para>
- </listitem>
-
- <listitem>
- <para>Brett Lymn <email>blymn@mulga.awadi.com.AU</email></para>
- </listitem>
-
- <listitem>
- <para>Brett Taylor
- <email>brett@peloton.runet.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Brian Campbell <email>brianc@pobox.com</email></para>
- </listitem>
-
- <listitem>
- <para>Brian Clapper <email>bmc@willscreek.com</email></para>
- </listitem>
-
- <listitem>
- <para>Brian Cully <email>shmit@kublai.com</email></para>
- </listitem>
-
- <listitem>
- <para>Brian Handy
- <email>handy@lambic.space.lockheed.com</email></para>
- </listitem>
-
- <listitem>
- <para>Brian Litzinger <email>brian@MediaCity.com</email></para>
- </listitem>
-
- <listitem>
- <para>Brian McGovern <email>bmcgover@cisco.com</email></para>
- </listitem>
-
- <listitem>
- <para>Brian Moore <email>ziff@houdini.eecs.umich.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Brian R. Haug <email>haug@conterra.com</email></para>
- </listitem>
-
- <listitem>
- <para>Brian Tao <email>taob@risc.org</email></para>
- </listitem>
-
- <listitem>
- <para>Brion Moss <email>brion@queeg.com</email></para>
- </listitem>
-
- <listitem>
- <para>Bruce Albrecht <email>bruce@zuhause.mn.org</email></para>
- </listitem>
-
- <listitem>
- <para>Bruce Gingery <email>bgingery@gtcs.com</email></para>
- </listitem>
-
- <listitem>
- <para>Bruce J. Keeler <email>loodvrij@gridpoint.com</email></para>
- </listitem>
-
- <listitem>
- <para>Bruce Murphy <email>packrat@iinet.net.au</email></para>
- </listitem>
-
- <listitem>
- <para>Bruce Walter <email>walter@fortean.com</email></para>
- </listitem>
-
- <listitem>
- <para>Carey Jones <email>mcj@acquiesce.org</email></para>
- </listitem>
-
- <listitem>
- <para>Carl Fongheiser <email>cmf@netins.net</email></para>
- </listitem>
-
- <listitem>
- <para>Carl Mascott <email>cmascott@world.std.com</email></para>
- </listitem>
-
- <listitem>
- <para>Casper <email>casper@acc.am</email></para>
- </listitem>
-
- <listitem>
- <para>Castor Fu <email>castor@geocast.com</email></para>
- </listitem>
-
- <listitem>
- <para>Chad David <email>davidc@acns.ab.ca</email></para>
- </listitem>
-
- <listitem>
- <para>Chain Lee <email>chain@110.net</email></para>
- </listitem>
-
- <listitem>
- <para>Charles Hannum <email>mycroft@ai.mit.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Charles Henrich <email>henrich@msu.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Charles Mott <email>cmott@scientech.com</email></para>
- </listitem>
-
- <listitem>
- <para>Charles Owens <email>owensc@enc.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Chet Ramey <email>chet@odin.INS.CWRU.Edu</email></para>
- </listitem>
-
- <listitem>
- <para>Chia-liang Kao <email>clkao@CirX.ORG</email></para>
- </listitem>
-
- <listitem>
- <para>Chiharu Shibata <email>chi@bd.mbn.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Chip Norkus <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Chris Csanady <email>cc@tarsier.ca.sandia.gov</email></para>
- </listitem>
-
- <listitem>
- <para>Chris Dabrowski <email>chris@vader.org</email></para>
- </listitem>
-
- <listitem>
- <para>Chris Dillon <email>cdillon@wolves.k12.mo.us</email></para>
- </listitem>
-
- <listitem>
- <para>Chris Shenton
- <email>cshenton@angst.it.hq.nasa.gov</email></para>
- </listitem>
-
- <listitem>
- <para>&a.cshumway;</para>
- </listitem>
-
- <listitem>
- <para>Chris Stenton <email>jacs@gnome.co.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Chris Timmons <email>skynyrd@opus.cts.cwu.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Chris Torek <email>torek@ee.lbl.gov</email></para>
- </listitem>
-
- <listitem>
- <para>Christian Gusenbauer
- <email>cg@fimp01.fim.uni-linz.ac.at</email></para>
- </listitem>
-
- <listitem>
- <para>Christian Haury <email>Christian.Haury@sagem.fr</email></para>
- </listitem>
-
- <listitem>
- <para>Christian Weisgerber
- <email>naddy@mips.inka.de</email></para>
- </listitem>
-
- <listitem>
- <para>Christoph P. Kukulies <email>kuku@FreeBSD.org</email></para>
- </listitem>
-
- <listitem>
- <para>Christoph Robitschko
- <email>chmr@edvz.tu-graz.ac.at</email></para>
- </listitem>
-
- <listitem>
- <para>Christoph Weber-Fahr
- <email>wefa@callcenter.systemhaus.net</email></para>
- </listitem>
-
- <listitem>
- <para>Christopher G. Demetriou
- <email>cgd@postgres.berkeley.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Christopher N. Harrell <email>cnh@ivmg.net</email></para>
- </listitem>
-
- <listitem>
- <para>Christopher Preston <email>rbg@gayteenresource.org</email></para>
- </listitem>
-
- <listitem>
- <para>Christopher T. Johnson
- <email>cjohnson@neunacht.netgsi.com</email></para>
- </listitem>
-
- <listitem>
- <para>Chrisy Luke <email>chrisy@flix.net</email></para>
- </listitem>
-
- <listitem>
- <para>Chuck Hein <email>chein@cisco.com</email></para>
- </listitem>
-
- <listitem>
- <para>Cliff Rowley <email>dozprompt@onsea.com</email></para>
- </listitem>
-
- <listitem>
- <para>Colman Reilly <email>careilly@tcd.ie</email></para>
- </listitem>
-
- <listitem>
- <para>Conrad Sabatier <email>conrads@home.com</email></para>
- </listitem>
-
- <listitem>
- <para>Coranth Gryphon <email>gryphon@healer.com</email></para>
- </listitem>
-
- <listitem>
- <para>Cornelis van der Laan
- <email>nils@guru.ims.uni-stuttgart.de</email></para>
- </listitem>
-
- <listitem>
- <para>Cove Schneider <email>cove@brazil.nbn.com</email></para>
- </listitem>
-
- <listitem>
- <para>Craig Leres <email>leres@ee.lbl.gov</email></para>
- </listitem>
-
- <listitem>
- <para>Craig Loomis <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Craig Metz <email>cmetz@inner.net</email></para>
- </listitem>
-
- <listitem>
- <para>Craig Spannring <email>cts@internetcds.com</email></para>
- </listitem>
-
- <listitem>
- <para>Craig Struble <email>cstruble@vt.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Cristian Ferretti <email>cfs@riemann.mat.puc.cl</email></para>
- </listitem>
-
- <listitem>
- <para>Curt Mayer <email>curt@toad.com</email></para>
- </listitem>
-
- <listitem>
- <para>Cy Schubert <email>cschuber@uumail.gov.bc.ca</email></para>
- </listitem>
-
- <listitem>
- <para>Cyrille Lefevre <email>clefevre@citeweb.net</email></para>
- </listitem>
-
- <listitem>
- <para>Cyrus Rahman <email>cr@jcmax.com</email></para>
- </listitem>
-
- <listitem>
- <para>Dai Ishijima <email>ishijima@tri.pref.osaka.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Daisuke Watanabe <email>NU7D-WTNB@asahi-net.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Damian Hamill <email>damian@cablenet.net</email></para>
- </listitem>
-
- <listitem>
- <para>Dan Cross <email>tenser@spitfire.ecsel.psu.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Dan Langille <email>dan@freebsddiary.org</email></para>
- </listitem>
-
- <listitem>
- <para>Dan Lukes <email>dan@obluda.cz</email></para>
- </listitem>
-
- <listitem>
- <para>Dan Nelson <email>dnelson@emsphone.com</email></para>
- </listitem>
-
- <listitem>
- <para>Dan Papasian <email>bugg@bugg.strangled.net</email></para>
- </listitem>
-
- <listitem>
- <para>Dan Piponi <email>wmtop@tanelorn.demon.co.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Dan Walters <email>hannibal@cyberstation.net</email></para>
- </listitem>
-
- <listitem>
- <para>Daniel Hagan
- <email>dhagan@cs.vt.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Daniel O'Connor <email>doconnor@gsoft.com.au</email></para>
- </listitem>
-
- <listitem>
- <para>Daniel Poirot <email>poirot@aio.jsc.nasa.gov</email></para>
- </listitem>
-
- <listitem>
- <para>Daniel Rock <email>rock@cs.uni-sb.de</email></para>
- </listitem>
-
- <listitem>
- <para>Daniel W. McRobb <email>dwm@caimis.com</email></para>
- </listitem>
-
- <listitem>
- <para>Danny Egen <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Danny J. Zerkel <email>dzerkel@phofarm.com</email></para>
- </listitem>
-
- <listitem>
- <para>Dave Adkins <email>adkin003@tc.umn.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Dave Andersen <email>angio@aros.net</email></para>
- </listitem>
-
- <listitem>
- <para>Dave Blizzard <email>dblizzar@sprynet.com</email></para>
- </listitem>
-
- <listitem>
- <para>Dave Bodenstab <email>imdave@synet.net</email></para>
- </listitem>
-
- <listitem>
- <para>Dave Burgess <email>burgess@hrd769.brooks.af.mil</email></para>
- </listitem>
-
- <listitem>
- <para>Dave Chapeskie <email>dchapes@ddm.on.ca</email></para>
- </listitem>
-
- <listitem>
- <para>Dave Cornejo <email>dave@dogwood.com</email></para>
- </listitem>
-
- <listitem>
- <para>Dave Edmondson <email>davided@sco.com</email></para>
- </listitem>
-
- <listitem>
- <para>Dave Glowacki <email>dglo@ssec.wisc.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Dave Marquardt <email>marquard@austin.ibm.com</email></para>
- </listitem>
-
- <listitem>
- <para>Dave Tweten <email>tweten@FreeBSD.org</email></para>
- </listitem>
-
- <listitem>
- <para>David A. Adkins <email>adkin003@tc.umn.edu</email></para>
- </listitem>
-
- <listitem>
- <para>David A. Bader <email>dbader@eece.unm.edu</email></para>
- </listitem>
-
- <listitem>
- <para>David Borman <email>dab@bsdi.com</email></para>
- </listitem>
-
- <listitem>
- <para>David Dawes <email>dawes@XFree86.org</email></para>
- </listitem>
-
- <listitem>
- <para>David Filo <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>David Holland <email>dholland@eecs.harvard.edu</email></para>
- </listitem>
-
- <listitem>
- <para>David Holloway <email>daveh@gwythaint.tamis.com</email></para>
- </listitem>
-
- <listitem>
- <para>David Horwitt <email>dhorwitt@ucsd.edu</email></para>
- </listitem>
-
- <listitem>
- <para>David Hovemeyer <email>daveho@infocom.com</email></para>
- </listitem>
-
- <listitem>
- <para>David Jones <email>dej@qpoint.torfree.net</email></para>
- </listitem>
-
- <listitem>
- <para>David Kelly <email>dkelly@tomcat1.tbe.com</email></para>
- </listitem>
-
- <listitem>
- <para>David Kulp <email>dkulp@neomorphic.com</email></para>
- </listitem>
-
- <listitem>
- <para>David L. Nugent <email>davidn@blaze.net.au</email></para>
- </listitem>
-
- <listitem>
- <para>David Leonard <email>d@scry.dstc.edu.au</email></para>
- </listitem>
-
- <listitem>
- <para>David Muir Sharnoff <email>muir@idiom.com</email></para>
- </listitem>
-
- <listitem>
- <para>David S. Miller <email>davem@jenolan.rutgers.edu</email></para>
- </listitem>
-
- <listitem>
- <para>David Sugar <email>dyfet@gnu.org</email></para>
- </listitem>
-
- <listitem>
- <para>David Wolfskill <email>dhw@whistle.com</email></para>
- </listitem>
-
- <listitem>
- <para>Dean Gaudet <email>dgaudet@arctic.org</email></para>
- </listitem>
-
- <listitem>
- <para>Dean Huxley <email>dean@fsa.ca</email></para>
- </listitem>
-
- <listitem>
- <para>Denis Fortin <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Denis Shaposhnikov <email>dsh@vlink.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Dennis Glatting
- <email>dennis.glatting@software-munitions.com</email></para>
- </listitem>
-
- <listitem>
- <para>Denton Gentry <email>denny1@home.com</email></para>
- </listitem>
-
- <listitem>
- <para>der Mouse <email>mouse@Collatz.McRCIM.McGill.EDU</email></para>
- </listitem>
-
- <listitem>
- <para>Derek Inksetter <email>derek@saidev.com</email></para>
- </listitem>
-
- <listitem>
- <para>DI. Christian Gusenbauer
- <email>cg@scotty.edvz.uni-linz.ac.at</email></para>
- </listitem>
-
- <listitem>
- <para>Dirk Keunecke <email>dk@panda.rhein-main.de</email></para>
- </listitem>
-
- <listitem>
- <para>Dirk Nehrling <email>nerle@pdv.de</email></para>
- </listitem>
-
- <listitem>
- <para>Dishanker Rajakulendren <email>draj@oceanfree.net</email></para>
- </listitem>
-
- <listitem>
- <para>Dmitry A. Yanko <email>fm@astral.ntu-kpi.kiev.ua</email></para>
- </listitem>
-
- <listitem>
- <para>Dmitry Khrustalev <email>dima@xyzzy.machaon.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Dmitry Kohmanyuk <email>dk@farm.org</email></para>
- </listitem>
-
- <listitem>
- <para>Dmitry Morozovsky <email>marck@rinet.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Dom Mitchell <email>dom@myrddin.demon.co.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Domas Mituzas <email>midom@dammit.lt</email></para>
- </listitem>
-
- <listitem>
- <para>Dominik Brettnacher <email>domi@saargate.de</email></para>
- </listitem>
-
- <listitem>
- <para>Dominik Rothert <email>dr@domix.de</email></para>
- </listitem>
-
- <listitem>
- <para>Don Croyle <email>croyle@gelemna.ft-wayne.in.us</email></para>
- </listitem>
-
- <listitem>
- <para>Donn Miller <email>dmmiller@cvzoom.net</email></para>
- </listitem>
-
- <listitem>
- <para>Dan Pelleg <email>dpelleg+unison@cs.cmu.edu</email></para>
- </listitem>
-
- <listitem>
- <para>&a.whiteside;</para>
- </listitem>
-
- <listitem>
- <para>Don Morrison <email>dmorrisn@u.washington.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Don Yuniskis <email>dgy@rtd.com</email></para>
- </listitem>
-
- <listitem>
- <para>Donald Maddox <email>dmaddox@conterra.com</email></para>
- </listitem>
-
- <listitem>
- <para>Douglas Ambrisko <email>ambrisko@whistle.com</email></para>
- </listitem>
-
- <listitem>
- <para>Douglas Carmichael <email>dcarmich@mcs.com</email></para>
- </listitem>
-
- <listitem>
- <para>Douglas Crosher <email>dtc@scrooge.ee.swin.oz.au</email></para>
- </listitem>
-
- <listitem>
- <para>Drew Derbyshire <email>ahd@kew.com</email></para>
- </listitem>
-
- <listitem>
- <para>Dustin Sallings <email>dustin@spy.net</email></para>
- </listitem>
-
- <listitem>
- <para>Eckart "Isegrim" Hofmann
- <email>Isegrim@Wunder-Nett.org</email></para>
- </listitem>
-
- <listitem>
- <para>Ed Gold
- <email>vegold01@starbase.spd.louisville.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Ed Hudson <email>elh@p5.spnet.com</email></para>
- </listitem>
-
- <listitem>
- <para>Edward Chuang <email>edwardc@firebird.org.tw</email></para>
- </listitem>
-
- <listitem>
- <para>Edward Wang <email>edward@edcom.com</email></para>
- </listitem>
-
- <listitem>
- <para>Edwin Groothus <email>edwin@nwm.wan.philips.com</email></para>
- </listitem>
-
- <listitem>
- <para>Edwin Mons <email>e@ik.nu</email></para>
- </listitem>
-
- <listitem>
- <para>Ege Rekk <email>aagero@aage.priv.no</email></para>
- </listitem>
-
- <listitem>
- <para>Eiji-usagi-MATSUmoto <email>usagi@clave.gr.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Eike Bernhardt <email>eike.bernhardt@gmx.de</email></para>
- </listitem>
-
- <listitem>
- <para>ELISA Font Project</para>
- </listitem>
-
- <listitem>
- <para>Elmar Bartel
- <email>bartel@informatik.tu-muenchen.de</email></para>
- </listitem>
-
- <listitem>
- <para>Eoin Lawless <email>eoin@maths.tcd.ie</email></para>
- </listitem>
-
- <listitem>
- <para>Eric A. Griff <email>eric@talesfromthereal.com</email></para>
- </listitem>
-
- <listitem>
- <para>Eric Blood <email>eblood@cs.unr.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Eric D. Futch <email>efutch@nyct.net</email></para>
- </listitem>
-
- <listitem>
- <para>Eric J. Haug <email>ejh@slustl.slu.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Eric J. Schwertfeger <email>eric@cybernut.com</email></para>
- </listitem>
-
- <listitem>
- <para>Eric L. Hernes <email>erich@lodgenet.com</email></para>
- </listitem>
-
- <listitem>
- <para>Eric P. Scott <email>eps@sirius.com</email></para>
- </listitem>
-
- <listitem>
- <para>Eric Sprinkle <email>eric@ennovatenetworks.com</email></para>
- </listitem>
-
- <listitem>
- <para>Erich Stefan Boleyn <email>erich@uruk.org</email></para>
- </listitem>
-
- <listitem>
- <para>Erich Zigler <email>erich@tacni.net</email></para>
- </listitem>
-
- <listitem>
- <para>Erik H. Bakke <email>erikhb@bgnett.no</email></para>
- </listitem>
-
- <listitem>
- <para>Erik E. Rantapaa <email>rantapaa@math.umn.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Erik H. Moe <email>ehm@cris.com</email></para>
- </listitem>
-
- <listitem>
- <para>Ernst de Haan <email>ernst@heinz.jollem.com</email></para>
- </listitem>
-
- <listitem>
- <para>Ernst Winter <email>ewinter@lobo.muc.de</email></para>
- </listitem>
-
- <listitem>
- <para>Espen Skoglund <email>esk@ira.uka.de</email></para>
- </listitem>
-
- <listitem>
- <para>Eugene M. Kim <email>astralblue@usa.net</email></para>
- </listitem>
-
- <listitem>
- <para>Eugene Radchenko <email>genie@qsar.chem.msu.su</email></para>
- </listitem>
-
- <listitem>
- <para>Eugeny Kuzakov <email>CoreDumped@coredumped.null.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Evan Champion <email>evanc@synapse.net</email></para>
- </listitem>
-
- <listitem>
- <para>Fanying Jen <email>fanying@fynet.com</email></para>
- </listitem>
-
- <listitem>
- <para>Faried Nawaz <email>fn@Hungry.COM</email></para>
- </listitem>
-
- <listitem>
- <para>Flemming Jacobsen <email>fj@batmule.dk</email></para>
- </listitem>
-
- <listitem>
- <para>Fong-Ching Liaw <email>fong@juniper.net</email></para>
- </listitem>
-
- <listitem>
- <para>Francis M J Hsieh <email>mjshieh@life.nthu.edu.tw</email></para>
- </listitem>
-
- <listitem>
- <para>Francisco Reyes <email>fjrm@yahoo.com</email></para>
- </listitem>
-
- <listitem>
- <para>Frank Bartels <email>knarf@camelot.de</email></para>
- </listitem>
-
- <listitem>
- <para>Frank Chen Hsiung Chan
- <email>frankch@waru.life.nthu.edu.tw</email></para>
- </listitem>
-
- <listitem>
- <para>Frank Durda IV <email>uhclem@nemesis.lonestar.org</email></para>
- </listitem>
-
- <listitem>
- <para>Frank MacLachlan <email>fpm@n2.net</email></para>
- </listitem>
-
- <listitem>
- <para>Frank Nobis <email>fn@Radio-do.de</email></para>
- </listitem>
-
- <listitem>
- <para>Frank ten Wolde <email>franky@pinewood.nl</email></para>
- </listitem>
-
- <listitem>
- <para>Frank van der Linden <email>frank@fwi.uva.nl</email></para>
- </listitem>
-
- <listitem>
- <para>Frank Volf <email>volf@oasis.IAEhv.nl</email></para>
- </listitem>
-
- <listitem>
- <para>Fred Cawthorne <email>fcawth@jjarray.umn.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Fred Gilham <email>gilham@csl.sri.com</email></para>
- </listitem>
-
- <listitem>
- <para>Fred Templin <email>templin@erg.sri.com</email></para>
- </listitem>
-
- <listitem>
- <para>Frederick Earl Gray <email>fgray@rice.edu</email></para>
- </listitem>
-
- <listitem>
- <para>FUJIMOTO Kensaku
- <email>fujimoto@oscar.elec.waseda.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>FURUSAWA Kazuhisa
- <email>furusawa@com.cs.osakafu-u.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Fuyuhiko Maruyama <email>fuyuhik8@is.titech.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>&a.stanislav;</para>
- </listitem>
-
- <listitem>
- <para>Gabor Kincses <email>gabor@acm.org</email></para>
- </listitem>
-
- <listitem>
- <para>Gabor Zahemszky <email>zgabor@CoDe.hu</email></para>
- </listitem>
-
- <listitem>
- <para>Gareth McCaughan <email>gjm11@dpmms.cam.ac.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Gary A. Browning <email>gab10@griffcd.amdahl.com</email></para>
- </listitem>
-
- <listitem>
- <para>Gary Howland <email>gary@hotlava.com</email></para>
- </listitem>
-
- <listitem>
- <para>Gary J. <email>garyj@rks32.pcs.dec.com</email></para>
- </listitem>
-
- <listitem>
- <para>Gary Kline <email>kline@thought.org</email></para>
- </listitem>
-
- <listitem>
- <para>Gary W. Swearingen <email>swear@aa.net</email></para>
- </listitem>
-
- <listitem>
- <para>Gaspar Chilingarov <email>nightmar@lemming.acc.am</email></para>
- </listitem>
-
- <listitem>
- <para>Gea-Suan Lin <email>gsl@tpts4.seed.net.tw</email></para>
- </listitem>
-
- <listitem>
- <para>Gene Raytsin <email>pal@paladin7.net</email></para>
- </listitem>
-
- <listitem>
- <para>Geoff Rehmet <email>csgr@alpha.ru.ac.za</email></para>
- </listitem>
-
- <listitem>
- <para>Georg Wagner <email>georg.wagner@ubs.com</email></para>
- </listitem>
-
- <listitem>
- <para>Gianlorenzo Masini <email>masini@uniroma3.it</email></para>
- </listitem>
-
- <listitem>
- <para>Gianmarco Giovannelli
- <email>gmarco@giovannelli.it</email></para>
- </listitem>
-
- <listitem>
- <para>Gil Kloepfer Jr. <email>gil@limbic.ssdl.com</email></para>
- </listitem>
-
- <listitem>
- <para>Gilad Rom <email>rom_glsa@ein-hashofet.co.il</email></para>
- </listitem>
-
- <listitem>
- <para>Giles Lean <email>giles@nemeton.com.au</email></para>
- </listitem>
-
- <listitem>
- <para>Ginga Kawaguti
- <email>ginga@amalthea.phys.s.u-tokyo.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Glen Foster <email>gfoster@gfoster.com</email></para>
- </listitem>
-
- <listitem>
- <para>Glenn Johnson <email>gljohns@bellsouth.net</email></para>
- </listitem>
-
- <listitem>
- <para>Godmar Back <email>gback@facility.cs.utah.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Goran Hammarback <email>goran@astro.uu.se</email></para>
- </listitem>
-
- <listitem>
- <para>Gord Matzigkeit <email>gord@enci.ucalgary.ca</email></para>
- </listitem>
-
- <listitem>
- <para>Gordon Greeff <email>gvg@uunet.co.za</email></para>
- </listitem>
-
- <listitem>
- <para>Graham Wheeler <email>gram@cdsec.com</email></para>
- </listitem>
-
- <listitem>
- <para>Greg A. Woods <email>woods@zeus.leitch.com</email></para>
- </listitem>
-
- <listitem>
- <para>Greg Ansley <email>gja@ansley.com</email></para>
- </listitem>
-
- <listitem>
- <para>Greg Lewis <email>glewis@eyesbeyond.com</email></para>
- </listitem>
-
- <listitem>
- <para>Greg Robinson <email>greg@rosevale.com.au</email></para>
- </listitem>
-
- <listitem>
- <para>Greg Troxel <email>gdt@ir.bbn.com</email></para>
- </listitem>
-
- <listitem>
- <para>Greg Ungerer <email>gerg@stallion.oz.au</email></para>
- </listitem>
-
- <listitem>
- <para>Gregory Bond <email>gnb@itga.com.au</email></para>
- </listitem>
-
- <listitem>
- <para>Gregory D. Moncreaff
- <email>moncrg@bt340707.res.ray.com</email></para>
- </listitem>
-
- <listitem>
- <para>Guy Harris <email>guy@netapp.com</email></para>
- </listitem>
-
- <listitem>
- <para>Guy Helmer <email>ghelmer@cs.iastate.edu</email></para>
- </listitem>
-
- <listitem>
- <para>HAMADA Naoki <email>hamada@astec.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Hannu Savolainen <email>hannu@voxware.pp.fi</email></para>
- </listitem>
-
- <listitem>
- <para>Hans Huebner <email>hans@artcom.de</email></para>
- </listitem>
-
- <listitem>
- <para>Hans Petter Bieker <email>zerium@webindex.no</email></para>
- </listitem>
-
- <listitem>
- <para>Hans Zuidam <email>hans@brandinnovators.com</email></para>
- </listitem>
-
- <listitem>
- <para>Harlan Stenn <email>Harlan.Stenn@pfcs.com</email></para>
- </listitem>
-
- <listitem>
- <para>Harold Barker <email>hbarker@dsms.com</email></para>
- </listitem>
-
- <listitem>
- <para>Harry Newton <email>harry_newton@telinco.co.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Havard Eidnes
- <email>Havard.Eidnes@runit.sintef.no</email></para>
- </listitem>
-
- <listitem>
- <para>Heikki Suonsivu <email>hsu@cs.hut.fi</email></para>
- </listitem>
-
- <listitem>
- <para>Heiko W. Rupp <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Helmut F. Wirth <email>hfwirth@ping.at</email></para>
- </listitem>
-
- <listitem>
- <para>Henrik Vestergaard Draboel
- <email>hvd@terry.ping.dk</email></para>
- </listitem>
-
- <listitem>
- <para>Herb Peyerl <email>hpeyerl@NetBSD.org</email></para>
- </listitem>
-
- <listitem>
- <para>Hideaki Ohmon <email>ohmon@tom.sfc.keio.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Hidekazu Kuroki <email>hidekazu@cs.titech.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Hideki Yamamoto <email>hyama@acm.org</email></para>
- </listitem>
-
- <listitem>
- <para>Hideyuki Suzuki
- <email>hideyuki@sat.t.u-tokyo.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Hirayama Issei <email>iss@mail.wbs.ne.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Hiroaki Sakai <email>sakai@miya.ee.kagu.sut.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Hiroharu Tamaru <email>tamaru@ap.t.u-tokyo.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Hironori Ikura <email>hikura@kaisei.org</email></para>
- </listitem>
-
- <listitem>
- <para>Hiroshi Nishikawa <email>nis@pluto.dti.ne.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Hiroya Tsubakimoto <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Holger Lamm <email>holger@eit.uni-kl.de</email></para>
- </listitem>
-
- <listitem>
- <para>Holger Veit <email>Holger.Veit@gmd.de</email></para>
- </listitem>
-
- <listitem>
- <para>Holm Tiffe <email>holm@geophysik.tu-freiberg.de</email></para>
- </listitem>
-
- <listitem>
- <para>HONDA Yasuhiro
- <email>honda@kashio.info.mie-u.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Horance Chou
- <email>horance@freedom.ie.cycu.edu.tw</email></para>
- </listitem>
-
- <listitem>
- <para>Horihiro Kumagai <email>kuma@jp.FreeBSD.org</email></para>
- </listitem>
-
- <listitem>
- <para>HOSOBUCHI Noriyuki <email>hoso@buchi.tama.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>HOTARU-YA <email>hotaru@tail.net</email></para>
- </listitem>
-
- <listitem>
- <para>Hr.Ladavac <email>lada@ws2301.gud.siemens.co.at</email></para>
- </listitem>
-
- <listitem>
- <para>Hubert Feyrer <email>hubertf@NetBSD.ORG</email></para>
- </listitem>
-
- <listitem>
- <para>Hugh F. Mahon <email>hugh@nsmdserv.cnd.hp.com</email></para>
- </listitem>
-
- <listitem>
- <para>Hugh Mahon <email>h_mahon@fc.hp.com</email></para>
- </listitem>
-
- <listitem>
- <para>Hung-Chi Chu <email>hcchu@r350.ee.ntu.edu.tw</email></para>
- </listitem>
-
- <listitem>
- <para>Ian Holland <email>ianh@tortuga.com.au</email></para>
- </listitem>
-
- <listitem>
- <para>Ian Struble <email>ian@broken.net</email></para>
- </listitem>
-
- <listitem>
- <para>Ian Vaudrey <email>i.vaudrey@bigfoot.com</email></para>
- </listitem>
-
- <listitem>
- <para>Igor Khasilev <email>igor@jabber.paco.odessa.ua</email></para>
- </listitem>
-
- <listitem>
- <para>Igor Roshchin <email>str@giganda.komkon.org</email></para>
- </listitem>
-
- <listitem>
- <para>Igor Serikov <email>bt@turtle.pangeatech.com</email></para>
- </listitem>
-
- <listitem>
- <para>Igor Sviridov <email>siac@ua.net</email></para>
- </listitem>
-
- <listitem>
- <para>Igor Vinokurov <email>igor@zynaps.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Ikuo Nakagawa <email>ikuo@isl.intec.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Ilia Chipitsine <email>ilia@jane.cgu.chel.su</email></para>
- </listitem>
-
- <listitem>
- <para>Ilya V. Komarov <email>mur@lynx.ru</email></para>
- </listitem>
-
- <listitem>
- <para>IMAI Takeshi <email>take-i@ceres.dti.ne.jp</email></para>
- </listitem>
-
- <listitem>
- <para>IMAMURA Tomoaki
- <email>tomoak-i@is.aist-nara.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Itsuro Saito <email>saito@miv.t.u-tokyo.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>IWASHITA Yoji <email>shuna@pop16.odn.ne.jp</email></para>
- </listitem>
-
- <listitem>
- <para>J. Bryant <email>jbryant@argus.flash.net</email></para>
- </listitem>
-
- <listitem>
- <para>J. David Lowe <email>lowe@saturn5.com</email></para>
- </listitem>
-
- <listitem>
- <para>J. Han <email>hjh@photino.com</email></para>
- </listitem>
-
- <listitem>
- <para>J. Hawk <email>jhawk@MIT.EDU</email></para>
- </listitem>
-
- <listitem>
- <para>J.T. Conklin <email>jtc@cygnus.com</email></para>
- </listitem>
-
- <listitem>
- <para>Jack <email>jack@zeus.xtalwind.net</email></para>
- </listitem>
-
- <listitem>
- <para>Jacob Bohn Lorensen <email>jacob@jblhome.ping.mk</email></para>
- </listitem>
-
- <listitem>
- <para>Jagane D Sundar <email>jagane@netcom.com</email></para>
- </listitem>
-
- <listitem>
- <para>Jake Hamby <email>jehamby@anobject.com</email></para>
- </listitem>
-
- <listitem>
- <para>James Clark <email>jjc@jclark.com</email></para>
- </listitem>
-
- <listitem>
- <para>James D. Stewart <email>jds@c4systm.com</email></para>
- </listitem>
-
- <listitem>
- <para>James da Silva <email>jds@cs.umd.edu</email></para>
- </listitem>
-
- <listitem>
- <para>James Jegers <email>jimj@miller.cs.uwm.edu</email></para>
- </listitem>
-
- <listitem>
- <para>James Raynard
- <email>fhackers@jraynard.demon.co.uk</email></para>
- </listitem>
-
- <listitem>
- <para>James T. Liu <email>jtliu@phlebas.rockefeller.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Jamie Heckford <email>jamie@jamiesdomain.co.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Jan Conard
- <email>charly@fachschaften.tu-muenchen.de</email></para>
- </listitem>
-
- <listitem>
- <para>Jan Jungnickel <email>Jan@Jungnickel.com</email></para>
- </listitem>
-
- <listitem>
- <para>Jan Koum <email>jkb@FreeBSD.org</email></para>
- </listitem>
-
- <listitem>
- <para>Jan L. Peterson <email>jlp@flipdog.com</email></para>
- </listitem>
-
- <listitem>
- <para>Janick Taillandier
- <email>Janick.Taillandier@ratp.fr</email></para>
- </listitem>
-
- <listitem>
- <para>Janusz Kokot <email>janek@gaja.ipan.lublin.pl</email></para>
- </listitem>
-
- <listitem>
- <para>Jarle Greipsland <email>jarle@idt.unit.no</email></para>
- </listitem>
-
- <listitem>
- <para>Jason DiCioccio <email>geniusj@ods.org</email></para>
- </listitem>
-
- <listitem>
- <para>Jason Garman <email>init@risen.org</email></para>
- </listitem>
-
- <listitem>
- <para>Jason R. Mastaler
- <email>jason-freebsd@mastaler.com</email></para>
- </listitem>
-
- <listitem>
- <para>Jason Thorpe <email>thorpej@NetBSD.org</email></para>
- </listitem>
-
- <listitem>
- <para>Jason Wright <email>jason@OpenBSD.org</email></para>
- </listitem>
-
- <listitem>
- <para>Jason Young
- <email>doogie@forbidden-donut.anet-stl.com</email></para>
- </listitem>
-
- <listitem>
- <para>Javier Martin Rueda <email>jmrueda@diatel.upm.es</email></para>
- </listitem>
-
- <listitem>
- <para>Jay Fenlason <email>hack@datacube.com</email></para>
- </listitem>
-
- <listitem>
- <para>Jay Krell <email>jay.krell@cornell.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Jaye Mathisen <email>mrcpu@cdsnet.net</email></para>
- </listitem>
-
- <listitem>
- <para>Jeff Bartig <email>jeffb@doit.wisc.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Jeff Brown <email>jabrown@caida.org</email></para>
- </listitem>
-
- <listitem>
- <para>Jeff Forys <email>jeff@forys.cranbury.nj.us</email></para>
- </listitem>
-
- <listitem>
- <para>Jeff Kletsky <email>Jeff@Wagsky.com</email></para>
- </listitem>
-
- <listitem>
- <para>Jeff Palmer <email>scorpio@drkshdw.org</email></para>
- </listitem>
-
- <listitem>
- <para>Jeffrey Evans <email>evans@scnc.k12.mi.us</email></para>
- </listitem>
-
- <listitem>
- <para>Jeffrey Wheat <email>jeff@cetlink.net</email></para>
- </listitem>
-
- <listitem>
- <para>Jeremy Allison <email>jallison@whistle.com</email></para>
- </listitem>
-
- <listitem>
- <para>Jeremy Chadwick <email>yoshi@parodius.com</email></para>
- </listitem>
-
- <listitem>
- <para>Jeremy Chatfield <email>jdc@xinside.com</email></para>
- </listitem>
-
- <listitem>
- <para>Jeremy Karlson <email>karlj000@unbc.ca</email></para>
- </listitem>
-
- <listitem>
- <para>Jeremy Prior <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Jeremy Shaffner <email>jeremy@external.org</email></para>
- </listitem>
-
- <listitem>
- <para>Jesse McConnell <email>jesse@cylant.com</email></para>
- </listitem>
-
- <listitem>
- <para>Jesse Rosenstock <email>jmr@ugcs.caltech.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Jian-Da Li <email>jdli@csie.nctu.edu.tw</email></para>
- </listitem>
-
- <listitem>
- <para>Jim Babb <email>babb@FreeBSD.org</email></para>
- </listitem>
-
- <listitem>
- <para>Jim Binkley <email>jrb@cs.pdx.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Jim Bloom <email>bloom@acm.org</email></para>
- </listitem>
-
- <listitem>
- <para>Jim Carroll <email>jim@carroll.com</email></para>
- </listitem>
-
- <listitem>
- <para>Jim Flowers <email>jflowers@ezo.net</email></para>
- </listitem>
-
- <listitem>
- <para>Jim Leppek <email>jleppek@harris.com</email></para>
- </listitem>
-
- <listitem>
- <para>Jim Lowe <email>james@cs.uwm.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Jim Mattson <email>jmattson@sonic.net</email></para>
- </listitem>
-
- <listitem>
- <para>Jim Mercer <email>jim@komodo.reptiles.org</email></para>
- </listitem>
-
- <listitem>
- <para>Jim Sloan <email>odinn@atlantabiker.net</email></para>
- </listitem>
-
- <listitem>
- <para>Jim Wilson <email>wilson@moria.cygnus.com</email></para>
- </listitem>
-
- <listitem>
- <para>Jimbo Bahooli
- <email>griffin@blackhole.iceworld.org</email></para>
- </listitem>
-
- <listitem>
- <para>Jin Guojun <email>jin@george.lbl.gov</email></para>
- </listitem>
-
- <listitem>
- <para>Joachim Kuebart <email>kuebart@mathematik.uni-ulm.de</email></para>
- </listitem>
-
- <listitem>
- <para>Joao Carlos Mendes Luis <email>jonny@jonny.eng.br</email></para>
- </listitem>
-
- <listitem>
- <para>Jochen Pohl <email>jpo.drs@sni.de</email></para>
- </listitem>
-
- <listitem>
- <para>Joe "Marcus" Clarke <email>marcus@marcuscom.com</email></para>
- </listitem>
-
- <listitem>
- <para>Joe Abley <email>jabley@automagic.org</email></para>
- </listitem>
-
- <listitem>
- <para>Joe Jih-Shian Lu <email>jslu@dns.ntu.edu.tw</email></para>
- </listitem>
-
- <listitem>
- <para>Joe Orthoefer <email>j_orthoefer@tia.net</email></para>
- </listitem>
-
- <listitem>
- <para>Joe Traister <email>traister@mojozone.org</email></para>
- </listitem>
-
- <listitem>
- <para>Joel Faedi <email>Joel.Faedi@esial.u-nancy.fr</email></para>
- </listitem>
-
- <listitem>
- <para>Joel Ray Holveck <email>joelh@gnu.org</email></para>
- </listitem>
-
- <listitem>
- <para>Joel Sutton <email>jsutton@bbcon.com.au</email></para>
- </listitem>
-
- <listitem>
- <para>Jordan DeLong <email>fracture@allusion.net</email></para>
- </listitem>
-
- <listitem>
- <para>Joseph Scott <email>joseph@randomnetworks.com</email></para>
- </listitem>
-
- <listitem>
- <para>Johan Granlund <email>johan@granlund.nu</email></para>
- </listitem>
-
- <listitem>
- <para>Johan Karlsson <email>k@numeri.campus.luth.se</email></para>
- </listitem>
-
- <listitem>
- <para>Johan Larsson <email>johan@moon.campus.luth.se</email></para>
- </listitem>
-
- <listitem>
- <para>Johann Tonsing <email>jtonsing@mikom.csir.co.za</email></para>
- </listitem>
-
- <listitem>
- <para>Johannes 5 Joemann <email>joemann@beefree.free.de</email></para>
- </listitem>
-
- <listitem>
- <para>Johannes Helander <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Johannes Stille <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>John Beckett <email>jbeckett@southern.edu</email></para>
- </listitem>
-
- <listitem>
- <para>John Beukema <email>jbeukema@hk.super.net</email></para>
- </listitem>
-
- <listitem>
- <para>John Brezak <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>John Capo <email>jc@irbs.com</email></para>
- </listitem>
-
- <listitem>
- <para>John F. Woods <email>jfw@jfwhome.funhouse.com</email></para>
- </listitem>
-
- <listitem>
- <para>John Goerzen
- <email>jgoerzen@alexanderwohl.complete.org</email></para>
- </listitem>
-
- <listitem>
- <para>John Heidemann <email>johnh@isi.edu</email></para>
- </listitem>
-
- <listitem>
- <para>John Hood <email>cgull@owl.org</email></para>
- </listitem>
-
- <listitem>
- <para>John Kohl <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>John Lind <email>john@starfire.mn.org</email></para>
- </listitem>
-
- <listitem>
- <para>John Mackin <email>john@physiol.su.oz.au</email></para>
- </listitem>
-
- <listitem>
- <para>John Merryweather Cooper <email>jmcoopr@webmail.bmi.net</email></para>
- </listitem>
-
- <listitem>
- <para>John P <email>johnp@lodgenet.com</email></para>
- </listitem>
-
- <listitem>
- <para>John Perry <email>perry@vishnu.alias.net</email></para>
- </listitem>
-
- <listitem>
- <para>John Preisler <email>john@vapornet.com</email></para>
- </listitem>
-
- <listitem>
- <para>John Reynolds <email>jjreynold@home.com</email></para>
- </listitem>
-
- <listitem>
- <para>John Rochester <email>jr@cs.mun.ca</email></para>
- </listitem>
-
- <listitem>
- <para>John Sadler <email>john_sadler@alum.mit.edu</email></para>
- </listitem>
-
- <listitem>
- <para>John Saunders <email>john@pacer.nlc.net.au</email></para>
- </listitem>
-
- <listitem>
- <para>John Wehle <email>john@feith.com</email></para>
- </listitem>
-
- <listitem>
- <para>John Woods <email>jfw@eddie.mit.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Johny Mattsson <email>lonewolf@flame.org</email></para>
- </listitem>
-
- <listitem>
- <para>Jon Morgan <email>morgan@terminus.trailblazer.com</email></para>
- </listitem>
-
- <listitem>
- <para>Jonathan Belson <email>jon@witchspace.com</email></para>
- </listitem>
-
- <listitem>
- <para>Jonathan H N Chin <email>jc254@newton.cam.ac.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Jonathan Hanna
- <email>jh@pc-21490.bc.rogers.wave.ca</email></para>
- </listitem>
-
- <listitem>
- <para>Jonathan Pennington <email>john@coastalgeology.org</email></para>
- </listitem>
-
- <listitem>
- <para>Jorge Goncalves <email>j@bug.fe.up.pt</email></para>
- </listitem>
-
- <listitem>
- <para>Jorge M. Goncalves <email>ee96199@tom.fe.up.pt</email></para>
- </listitem>
-
- <listitem>
- <para>Jos Backus <email>jbackus@plex.nl</email></para>
- </listitem>
-
- <listitem>
- <para>Jose Marques <email>jose@nobody.org</email></para>
- </listitem>
-
- <listitem>
- <para>Josef Grosch
- <email>jgrosch@superior.mooseriver.com</email></para>
- </listitem>
-
- <listitem>
- <para>Joseph Stein <email>joes@wstein.com</email></para>
- </listitem>
-
- <listitem>
- <para>Josh Gilliam <email>josh@quick.net</email></para>
- </listitem>
-
- <listitem>
- <para>Josh Tiefenbach <email>josh@ican.net</email></para>
- </listitem>
-
- <listitem>
- <para>Juergen Lock <email>nox@jelal.hb.north.de</email></para>
- </listitem>
-
- <listitem>
- <para>Juha Inkari <email>inkari@cc.hut.fi</email></para>
- </listitem>
-
- <listitem>
- <para>Jukka A. Ukkonen <email>jau@iki.fi</email></para>
- </listitem>
-
- <listitem>
- <para>Julian Assange <email>proff@suburbia.net</email></para>
- </listitem>
-
- <listitem>
- <para>Julian Coleman <email>j.d.coleman@ncl.ac.uk</email></para>
- </listitem>
-
- <listitem>
- <para>&a.jhs;</para>
- </listitem>
-
- <listitem>
- <para>Julian Jenkins <email>kaveman@magna.com.au</email></para>
- </listitem>
-
- <listitem>
- <para>Junichi Satoh <email>junichi@jp.FreeBSD.org</email></para>
- </listitem>
-
- <listitem>
- <para>Junji SAKAI <email>sakai@jp.FreeBSD.org</email></para>
- </listitem>
-
- <listitem>
- <para>Junya WATANABE <email>junya-w@remus.dti.ne.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Justas <email>justas@mbank.lv</email></para>
- </listitem>
-
- <listitem>
- <para>Justin Stanford <email>jus@security.za.net</email></para>
- </listitem>
-
- <listitem>
- <para>K.Higashino <email>a00303@cc.hc.keio.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Kai Vorma <email>vode@snakemail.hut.fi</email></para>
- </listitem>
-
- <listitem>
- <para>Kaleb S. Keithley <email>kaleb@ics.com</email></para>
- </listitem>
-
- <listitem>
- <para>Kaneda Hiloshi <email>vanitas@ma3.seikyou.ne.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Kang-ming Liu <email>gugod@gugod.org</email></para>
- </listitem>
-
- <listitem>
- <para>Kapil Chowksey <email>kchowksey@hss.hns.com</email></para>
- </listitem>
-
- <listitem>
- <para>Karl Denninger <email>karl@mcs.com</email></para>
- </listitem>
-
- <listitem>
- <para>Karl Dietz <email>Karl.Dietz@triplan.com</email></para>
- </listitem>
-
- <listitem>
- <para>Karl Lehenbauer <email>karl@NeoSoft.com</email></para>
- </listitem>
-
- <listitem>
- <para>KATO Tsuguru <email>tkato@prontomail.ne.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Kawanobe Koh <email>kawanobe@st.rim.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Kees Jan Koster <email>kjk1@ukc.ac.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Keith Bostic <email>bostic@bostic.com</email></para>
- </listitem>
-
- <listitem>
- <para>Keith E. Walker <email>kew@icehouse.net</email></para>
- </listitem>
-
- <listitem>
- <para>Keith Moore <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Keith Sklower <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Ken Hornstein <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Ken Key <email>key@cs.utk.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Ken Mayer <email>kmayer@freegate.com</email></para>
- </listitem>
-
- <listitem>
- <para>Kenji Saito <email>marukun@mx2.nisiq.net</email></para>
- </listitem>
-
- <listitem>
- <para>Kenji Tomita <email>tommyk@da2.so-net.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Kenneth Furge <email>kenneth.furge@us.endress.com</email></para>
- </listitem>
-
- <listitem>
- <para>Kenneth Monville <email>desmo@bandwidth.org</email></para>
- </listitem>
-
- <listitem>
- <para>Kenneth R. Westerback <email>krw@tcn.net</email></para>
- </listitem>
-
- <listitem>
- <para>Kenneth Stailey <email>kstailey@gnu.ai.mit.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Kent Talarico <email>kent@shipwreck.tsoft.net</email></para>
- </listitem>
-
- <listitem>
- <para>Kent Vander Velden <email>graphix@iastate.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Kentaro Inagaki <email>JBD01226@niftyserve.ne.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Kevin Bracey <email>kbracey@art.acorn.co.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Kevin Day <email>toasty@dragondata.com</email></para>
- </listitem>
-
- <listitem>
- <para>Kevin Lahey <email>kml@nas.nasa.gov</email></para>
- </listitem>
-
- <listitem>
- <para>Kevin Meltzer <email>perlguy@perlguy.com</email></para>
- </listitem>
-
- <listitem>
- <para>Kevin Street <email>street@iname.com</email></para>
- </listitem>
-
- <listitem>
- <para>Kevin Van Maren <email>vanmaren@fast.cs.utah.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Killer <email>killer@prosalg.no</email></para>
- </listitem>
-
- <listitem>
- <para>Kim Scarborough <email>sluggo@unknown.nu</email></para>
- </listitem>
-
- <listitem>
- <para>Kiril Mitev <email>kiril@ideaglobal.com</email></para>
- </listitem>
-
- <listitem>
- <para>Kiroh HARADA <email>kiroh@kh.rim.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Klaus Herrmann <email>klaus.herrmann@gmx.net</email></para>
- </listitem>
-
- <listitem>
- <para>Klaus Klein <email>kleink@layla.inka.de</email></para>
- </listitem>
-
- <listitem>
- <para>Klaus-J. Wolf <email>Yanestra@t-online.de</email></para>
- </listitem>
-
- <listitem>
- <para>Koichi Sato <email>copan@ppp.fastnet.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Konrad Heuer <email>kheuer@gwdu60.gwdg.de</email></para>
- </listitem>
-
- <listitem>
- <para>Konstantin Chuguev <email>Konstantin.Chuguev@dante.org.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Kostya Lukin <email>lukin@okbmei.msk.su</email></para>
- </listitem>
-
- <listitem>
- <para>Kouichi Hirabayashi <email>kh@mogami-wire.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Kris Dow <email>kris@vilnya.demon.co.uk</email></para>
- </listitem>
-
- <listitem>
- <para>KUNISHIMA Takeo <email>kunishi@c.oka-pu.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Kurt D. Zeilenga <email>Kurt@Boolean.NET</email></para>
- </listitem>
-
- <listitem>
- <para>Kurt Olsen <email>kurto@tiny.mcs.usu.edu</email></para>
- </listitem>
-
- <listitem>
- <para>L. Jonas Olsson
- <email>ljo@ljo-slip.DIALIN.CWRU.Edu</email></para>
- </listitem>
-
- <listitem>
- <para>Larry Altneu <email>larry@ALR.COM</email></para>
- </listitem>
-
- <listitem>
- <para>Lars Bernhardsson <email>lab@fnurt.net</email></para>
- </listitem>
-
- <listitem>
- <para>Lars K&ouml;ller
- <email>Lars.Koeller@Uni-Bielefeld.DE</email></para>
- </listitem>
-
- <listitem>
- <para>Laurence Lopez <email>lopez@mv.mv.com</email></para>
- </listitem>
-
- <listitem>
- <para>Lee Cremeans <email>lcremean@tidalwave.net</email></para>
- </listitem>
-
- <listitem>
- <para>Leo Kim <email>leo@florida.sarang.net</email></para>
- </listitem>
-
- <listitem>
- <para>Leo Serebryakov <email>lev@serebryakov.spb.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Liang Tai-hwa
- <email>avatar@www.mmlab.cse.yzu.edu.tw</email></para>
- </listitem>
-
- <listitem>
- <para>Lon Willett <email>lon%softt.uucp@math.utah.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Louis A. Mamakos <email>louie@TransSys.COM</email></para>
- </listitem>
-
- <listitem>
- <para>Louis Mamakos <email>loiue@TransSys.com</email></para>
- </listitem>
-
- <listitem>
- <para>Lowell Gilbert <email>lowell@world.std.com</email></para>
- </listitem>
-
- <listitem>
- <para>Lucas James <email>Lucas.James@ldjpc.apana.org.au</email></para>
- </listitem>
-
- <listitem>
- <para>Lyndon Nerenberg <email>lyndon@orthanc.ab.ca</email></para>
- </listitem>
-
- <listitem>
- <para>M. L. Dodson <email>bdodson@scms.utmb.EDU</email></para>
- </listitem>
-
- <listitem>
- <para>M.C. Wong <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Magnus Enbom <email>dot@tinto.campus.luth.se</email></para>
- </listitem>
-
- <listitem>
- <para>Mahesh Neelakanta <email>mahesh@gcomm.com</email></para>
- </listitem>
-
- <listitem>
- <para>Makoto MATSUSHITA <email>matusita@jp.FreeBSD.org</email></para>
- </listitem>
-
- <listitem>
- <para>Makoto WATANABE
- <email>watanabe@zlab.phys.nagoya-u.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Makoto YAMAKURA <email>makoto@pinpott.spnet.ne.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Malte Lance <email>malte.lance@gmx.net</email></para>
- </listitem>
-
- <listitem>
- <para>MANTANI Nobutaka <email>nobutaka@nobutaka.com</email></para>
- </listitem>
-
- <listitem>
- <para>Manu Iyengar
- <email>iyengar@grunthos.pscwa.psca.com</email></para>
- </listitem>
-
- <listitem>
- <para>Marc Frajola <email>marc@dev.com</email></para>
- </listitem>
-
- <listitem>
- <para>Marc Ramirez <email>mrami@mramirez.sy.yale.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Marc Slemko <email>marcs@znep.com</email></para>
- </listitem>
-
- <listitem>
- <para>Marc van Kempen <email>wmbfmk@urc.tue.nl</email></para>
- </listitem>
-
- <listitem>
- <para>Marc van Woerkom <email>van.woerkom@netcologne.de</email></para>
- </listitem>
-
- <listitem>
- <para>Marcin Cieslak <email>saper@system.pl</email></para>
- </listitem>
-
- <listitem>
- <para>Mark Andrews <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Mark Cammidge <email>mark@gmtunx.ee.uct.ac.za</email></para>
- </listitem>
-
- <listitem>
- <para>Mark Diekhans <email>markd@grizzly.com</email></para>
- </listitem>
-
- <listitem>
- <para>Mark Huizer <email>xaa@stack.nl</email></para>
- </listitem>
-
- <listitem>
- <para>Mark J. Taylor <email>mtaylor@cybernet.com</email></para>
- </listitem>
-
- <listitem>
- <para>Mark Knight <email>markk@knigma.org</email></para>
- </listitem>
-
- <listitem>
- <para>Mark Krentel <email>krentel@rice.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Mark Mayo <email>markm@vmunix.com</email></para>
- </listitem>
-
- <listitem>
- <para>Mark Thompson <email>thompson@tgsoft.com</email></para>
- </listitem>
-
- <listitem>
- <para>Mark Tinguely <email>tinguely@plains.nodak.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Mark Treacy <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Mark Valentine <email>mark@thuvia.org</email></para>
- </listitem>
-
- <listitem>
- <para>Markus Holmberg <email>saska@acc.umu.se</email></para>
- </listitem>
-
- <listitem>
- <para>Martin Birgmeier <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Martin Blapp <email>blapp@attic.ch</email></para>
- </listitem>
-
- <listitem>
- <para>Martin Hinner <email>mhi@linux.gyarab.cz</email></para>
- </listitem>
-
- <listitem>
- <para>Martin Ibert <email>mib@ppe.bb-data.de</email></para>
- </listitem>
-
- <listitem>
- <para>Martin Kammerhofer <email>dada@sbox.tu-graz.ac.at</email></para>
- </listitem>
-
- <listitem>
- <para>Martin Minkus <email>diskiller@cnbinc.com</email></para>
- </listitem>
-
- <listitem>
- <para>Martin Renters <email>martin@tdc.on.ca</email></para>
- </listitem>
-
- <listitem>
- <para>Martti Kuparinen
- <email>martti.kuparinen@ericsson.com</email></para>
- </listitem>
-
- <listitem>
- <para>Masachika ISHIZUKA
- <email>ishizuka@isis.min.ntt.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Masahiro Sekiguchi
- <email>seki@sysrap.cs.fujitsu.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Masahiro TAKEMURA
- <email>mastake@msel.t.u-tokyo.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Masanobu Saitoh <email>msaitoh@spa.is.uec.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Masanori Kanaoka <email>kana@saijo.mke.mei.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Masanori Kiriake <email>seiken@ARGV.AC</email></para>
- </listitem>
-
- <listitem>
- <para>Masatoshi TAMURA
- <email>tamrin@shinzan.kuee.kyoto-u.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Mats Lofkvist <email>mal@algonet.se</email></para>
- </listitem>
-
- <listitem>
- <para>Matt Bartley <email>mbartley@lear35.cytex.com</email></para>
- </listitem>
-
- <listitem>
- <para>Matt Heckaman <email>matt@LUCIDA.QC.CA</email></para>
- </listitem>
-
- <listitem>
- <para>Matt Thomas <email>matt@3am-software.com</email></para>
- </listitem>
-
- <listitem>
- <para>Matt White <email>mwhite+@CMU.EDU</email></para>
- </listitem>
-
- <listitem>
- <para>Matthew C. Mead <email>mmead@Glock.COM</email></para>
- </listitem>
-
- <listitem>
- <para>Matthew Cashdollar <email>mattc@rfcnet.com</email></para>
- </listitem>
-
- <listitem>
- <para>Matthew Emmerton <email>root@gabby.gsicomp.on.ca</email></para>
- </listitem>
-
- <listitem>
- <para>Matthew Flatt <email>mflatt@cs.rice.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Matthew Fuller <email>fullermd@futuresouth.com</email></para>
- </listitem>
-
- <listitem>
- <para>Matthew Stein <email>matt@bdd.net</email></para>
- </listitem>
-
- <listitem>
- <para>Matthew West <email>mwest@uct.ac.za</email></para>
- </listitem>
-
- <listitem>
- <para>Matthias Pfaller <email>leo@dachau.marco.de</email></para>
- </listitem>
-
- <listitem>
- <para>Matthias Scheler <email>tron@netbsd.org</email></para>
- </listitem>
-
- <listitem>
- <para>Mattias Gronlund
- <email>Mattias.Gronlund@sa.erisoft.se</email></para>
- </listitem>
-
- <listitem>
- <para>Mattias Pantzare <email>pantzer@ludd.luth.se</email></para>
- </listitem>
-
- <listitem>
- <para>Maurice Castro
- <email>maurice@planet.serc.rmit.edu.au</email></para>
- </listitem>
-
- <listitem>
- <para>Max Euston <email>meuston@jmrodgers.com</email></para>
- </listitem>
-
- <listitem>
- <para>Maxim Bolotin <email>max@rsu.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Maxim Konovalov <email>maxim@macomnet.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Maxime Henrion <email>mhenrion@cybercable.fr</email></para>
- </listitem>
-
- <listitem>
- <para>Micha Class
- <email>michael_class@hpbbse.bbn.hp.com</email></para>
- </listitem>
-
- <listitem>
- <para>Michael Alyn Miller <email>malyn@strangeGizmo.com</email></para>
- </listitem>
-
- <listitem>
- <para>Michael Lucas <email>mwlucas@blackhelicopters.org</email></para>
- </listitem>
-
- <listitem>
- <para>Michael Lyngb&oslash;l <email>michael@lyngbol.dk</email></para>
- </listitem>
-
- <listitem>
- <para>Michael Butler <email>imb@scgt.oz.au</email></para>
- </listitem>
-
- <listitem>
- <para>Michael Butschky <email>butsch@computi.erols.com</email></para>
- </listitem>
-
- <listitem>
- <para>Michael Clay <email>mclay@weareb.org</email></para>
- </listitem>
-
- <listitem>
- <para>Michael Galassi <email>nerd@percival.rain.com</email></para>
- </listitem>
-
- <listitem>
- <para>Michael Hancock <email>michaelh@cet.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Michael Hohmuth <email>hohmuth@inf.tu-dresden.de</email></para>
- </listitem>
-
- <listitem>
- <para>Michael Perlman <email>canuck@caam.rice.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Michael Petry <email>petry@netwolf.NetMasters.com</email></para>
- </listitem>
-
- <listitem>
- <para>Michael Sardo <email>jaeger16@yahoo.com</email></para>
- </listitem>
-
- <listitem>
- <para>Michael Searle <email>searle@longacre.demon.co.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Michael Schout <email>mschout@gkg.net</email></para>
- </listitem>
-
- <listitem>
- <para>Michael Urban <email>murban@tznet.com</email></para>
- </listitem>
-
- <listitem>
- <para>Michael Vasilenko <email>acid@stu.cn.ua</email></para>
- </listitem>
-
- <listitem>
- <para>Michal Listos <email>mcl@Amnesiac.123.org</email></para>
- </listitem>
-
- <listitem>
- <para>Michio Karl Jinbo
- <email>karl@marcer.nagaokaut.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Miguel Angel Sagreras
- <email>msagre@cactus.fi.uba.ar</email></para>
- </listitem>
-
- <listitem>
- <para>Mihoko Tanaka <email>m_tonaka@pa.yokogawa.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Mika Nystrom <email>mika@cs.caltech.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Mikael Hybsch <email>micke@dynas.se</email></para>
- </listitem>
-
- <listitem>
- <para>Mikael Karpberg
- <email>karpen@ocean.campus.luth.se</email></para>
- </listitem>
-
- <listitem>
- <para>Mike Bristow <email>mike@urgle.com</email></para>
- </listitem>
-
- <listitem>
- <para>Mike Del <email>repenting@hotmail.com</email></para>
- </listitem>
-
- <listitem>
- <para>Mike Durian <email>durian@plutotech.com</email></para>
- </listitem>
-
- <listitem>
- <para>Mike Durkin <email>mdurkin@tsoft.sf-bay.org</email></para>
- </listitem>
-
- <listitem>
- <para>Mike E. Matsnev <email>mike@azog.cs.msu.su</email></para>
- </listitem>
-
- <listitem>
- <para>Mike Evans <email>mevans@candle.com</email></para>
- </listitem>
-
- <listitem>
- <para>Mike Futerko <email>mike@LITech.lviv.ua</email></para>
- </listitem>
-
- <listitem>
- <para>Mike Grupenhoff <email>kashmir@umiacs.umd.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Mike Harding <email>mvh@ix.netcom.com</email></para>
- </listitem>
-
- <listitem>
- <para>Mike Hibler <email>mike@marker.cs.utah.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Mike Karels <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Mike McGaughey <email>mmcg@cs.monash.edu.au</email></para>
- </listitem>
-
- <listitem>
- <para>Mike Meyer <email>mwm@mired.org</email></para>
- </listitem>
-
- <listitem>
- <para>Mike Mitchell <email>mitchell@ref.tfs.com</email></para>
- </listitem>
-
- <listitem>
- <para>Mike Murphy <email>mrm@alpharel.com</email></para>
- </listitem>
-
- <listitem>
- <para>Mike Peck <email>mike@binghamton.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Mike Sherwood <email>mike@fate.com</email></para>
- </listitem>
-
- <listitem>
- <para>Mike Spengler <email>mks@msc.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Mikhail A. Sokolov <email>mishania@demos.su</email></para>
- </listitem>
-
- <listitem>
- <para>Ming-I Hseh <email>PA@FreeBSD.ee.Ntu.edu.TW</email></para>
- </listitem>
-
- <listitem>
- <para>Mitsuru Yoshida <email>mitsuru@riken.go.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Monte Mitzelfelt <email>monte@gonefishing.org</email></para>
- </listitem>
-
- <listitem>
- <para>Morgan Davis <email>root@io.cts.com</email></para>
- </listitem>
-
- <listitem>
- <para>MOROHOSHI Akihiko <email>moro@race.u-tokyo.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Mostyn Lewis <email>mostyn@mrl.com</email></para>
- </listitem>
-
- <listitem>
- <para>Motomichi Matsuzaki <email>mzaki@e-mail.ne.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Motoyuki Kasahara <email>m-kasahr@sra.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>N.G.Smith <email>ngs@sesame.hensa.ac.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Nadav Eiron <email>nadav@barcode.co.il</email></para>
- </listitem>
-
- <listitem>
- <para>NAGAO Tadaaki <email>nagao@cs.titech.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>NAKAJI Hiroyuki
- <email>nakaji@tutrp.tut.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>NAKAMURA Kazushi <email>nkazushi@highway.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>NAKAMURA Motonori
- <email>motonori@econ.kyoto-u.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>NAKATA, Maho <email>chat95@mbox.kyoto-inet.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Nanbor Wang <email>nw1@cs.wustl.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Naofumi Honda
- <email>honda@Kururu.math.sci.hokudai.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Naoki Hamada <email>nao@tom-yam.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Narvi <email>narvi@haldjas.folklore.ee</email></para>
- </listitem>
-
- <listitem>
- <para>Nathan Dorfman <email>nathan@rtfm.net</email></para>
- </listitem>
-
- <listitem>
- <para>Neal Fachan <email>kneel@ishiboo.com</email></para>
- </listitem>
-
- <listitem>
- <para>Niall Smart <email>rotel@indigo.ie</email></para>
- </listitem>
-
- <listitem>
- <para>Nicholas Esborn <email>nick@netdot.net</email></para>
- </listitem>
-
- <listitem>
- <para>Nick Barnes <email>Nick.Barnes@pobox.com</email></para>
- </listitem>
-
- <listitem>
- <para>Nick Handel <email>nhandel@NeoSoft.com</email></para>
- </listitem>
-
- <listitem>
- <para>Nick Hilliard <email>nick@foobar.org</email></para>
- </listitem>
-
- <listitem>
- <para>Nick Johnson <email>freebsd@spatula.net</email></para>
- </listitem>
-
- <listitem>
- <para>Nick Williams <email>njw@cs.city.ac.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Nickolay N. Dudorov <email>nnd@itfs.nsk.su</email></para>
- </listitem>
-
- <listitem>
- <para>NIIMI Satoshi <email>sa2c@and.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Niklas Hallqvist <email>niklas@filippa.appli.se</email></para>
- </listitem>
-
- <listitem>
- <para>Nils M. Holm <email>nmh@t3x.org</email></para>
- </listitem>
-
- <listitem>
- <para>Nisha Talagala <email>nisha@cs.berkeley.edu</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>adrian@virginia.edu</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>alex@elvisti.kiev.ua</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>anto@netscape.net</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>bobson@egg.ics.nitch.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>bovynf@awe.be</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>burg@is.ge.com</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>chris@gnome.co.uk</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>colsen@usa.net</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>coredump@nervosa.com</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>dannyman@arh0300.urh.uiuc.edu</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>davids@SECNET.COM</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>derek@free.org</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>devet@adv.IAEhv.nl</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>djv@bedford.net</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>dvv@sprint.net</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>enami@ba2.so-net.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>flash@eru.tubank.msk.su</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>flash@hway.ru</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>fn@pain.csrv.uidaho.edu</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>frf@xocolatl.com</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>gclarkii@netport.neosoft.com</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>gordon@sheaky.lonestar.org</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>graaf@iae.nl</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>greg@greg.rim.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>grossman@cygnus.com</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>gusw@fub46.zedat.fu-berlin.de</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>hfir@math.rochester.edu</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>hnokubi@yyy.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>iaint@css.tuu.utas.edu.au</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>invis@visi.com</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>ishisone@sra.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>iverson@lionheart.com</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>jpt@magic.net</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>junker@jazz.snu.ac.kr</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>k-sugyou@ccs.mt.nec.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>kenji@reseau.toyonaka.osaka.jp</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>kfurge@worldnet.att.net</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>lh@aus.org</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>lhecking@nmrc.ucc.ie</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>mrgreen@mame.mu.oz.au</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>nakagawa@jp.FreeBSD.org</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>ohki@gssm.otsuka.tsukuba.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>owaki@st.rim.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>pechter@shell.monmouth.com</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>pete@pelican.pelican.com</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>pritc003@maroon.tc.umn.edu</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>risner@stdio.com</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>roman@rpd.univ.kiev.ua</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>root@ns2.redline.ru</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>root@uglabgw.ug.cs.sunysb.edu</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>stephen.ma@jtec.com.au</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>sumii@is.s.u-tokyo.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>takas-su@is.aist-nara.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>tamone@eig.unige.ch</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>tjevans@raleigh.ibm.com</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>tony-o@iij.ad.jp amurai@spec.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>torii@tcd.hitachi.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>uenami@imasy.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>uhlar@netlab.sk</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>vode@hut.fi</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>wlloyd@mpd.ca</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>wlr@furball.wellsfargo.com</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>wmbfmk@urc.tue.nl</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>yamagata@nwgpc.kek.jp</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>ziggy@ryan.org</email></para>
- </listitem>
-
- <listitem>
- <para>No Name <email>ZW6T-KND@j.asahi-net.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Nobuhiro Yasutomi <email>nobu@psrc.isac.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Nobuyuki Koganemaru
- <email>kogane@koganemaru.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>NOKUBI Hirotaka <email>h-nokubi@yyy.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Norio Suzuki <email>nosuzuki@e-mail.ne.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Noritaka Ishizumi <email>graphite@jp.FreeBSD.org</email></para>
- </listitem>
-
- <listitem>
- <para>Noriyuki Soda <email>soda@sra.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Oddbjorn Steffenson <email>oddbjorn@tricknology.org</email</para>
- </listitem>
-
- <listitem>
- <para>Oh Junseon <email>hollywar@mail.holywar.net</email></para>
- </listitem>
-
- <listitem>
- <para>Olaf Wagner <email>wagner@luthien.in-berlin.de</email></para>
- </listitem>
-
- <listitem>
- <para>Oleg Semyonov <email>os@altavista.net</email></para>
- </listitem>
-
- <listitem>
- <para>Oleg Sharoiko <email>os@rsu.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Oleg V. Volkov <email>rover@lglobus.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Olexander Kunytsa <email>kunia@wolf.istc.kiev.ua</email></para>
- </listitem>
-
- <listitem>
- <para>Oliver Breuninger <email>ob@seicom.NET</email></para>
- </listitem>
-
- <listitem>
- <para>Oliver Friedrichs <email>oliver@secnet.com</email></para>
- </listitem>
-
- <listitem>
- <para>Oliver Fromme
- <email>oliver.fromme@heim3.tu-clausthal.de</email></para>
- </listitem>
-
- <listitem>
- <para>Oliver Helmling
- <email>oliver.helmling@stud.uni-bayreuth.de</email></para>
- </listitem>
-
- <listitem>
- <para>Oliver Laumann
- <email>net@informatik.uni-bremen.de</email></para>
- </listitem>
-
- <listitem>
- <para>Oliver Lehmann
- <email>Kai_Allard_Liao@gmx.de</email></para>
- </listitem>
-
- <listitem>
- <para>Oliver Oberdorf <email>oly@world.std.com</email></para>
- </listitem>
-
- <listitem>
- <para>Olof Johansson <email>offe@ludd.luth.se</email></para>
- </listitem>
-
- <listitem>
- <para>Osokin Sergey aka oZZ <email>ozz@FreeBSD.org.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Pace Willisson <email>pace@blitz.com</email></para>
- </listitem>
-
- <listitem>
- <para>Paco Rosich <email>rosich@modico.eleinf.uv.es</email></para>
- </listitem>
-
- <listitem>
- <para>Palle Girgensohn <email>girgen@partitur.se</email></para>
- </listitem>
-
- <listitem>
- <para>Parag Patel <email>parag@cgt.com</email></para>
- </listitem>
-
- <listitem>
- <para>Pascal Pederiva <email>pascal@zuo.dec.com</email></para>
- </listitem>
-
- <listitem>
- <para>Pasvorn Boonmark <email>boonmark@juniper.net</email></para>
- </listitem>
-
- <listitem>
- <para>Patrick Alken <email>cosine@ellipse.mcs.drexel.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Patrick Bihan-Faou <email>patrick@mindstep.com</email></para>
- </listitem>
-
- <listitem>
- <para>Patrick Hausen <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Patrick Li <email>pat@databits.net</email></para>
- </listitem>
-
- <listitem>
- <para>Patrick Seal <email>patseal@hyperhost.net</email></para>
- </listitem>
-
- <listitem>
- <para>Paul Antonov <email>apg@demos.su</email></para>
- </listitem>
-
- <listitem>
- <para>Paul F. Werkowski <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Paul Fox <email>pgf@foxharp.boston.ma.us</email></para>
- </listitem>
-
- <listitem>
- <para>Paul Koch <email>koch@thehub.com.au</email></para>
- </listitem>
-
- <listitem>
- <para>Paul Kranenburg <email>pk@NetBSD.org</email></para>
- </listitem>
-
- <listitem>
- <para>Paul M. Lambert <email>plambert@plambert.net</email></para>
- </listitem>
-
- <listitem>
- <para>Paul Mackerras <email>paulus@cs.anu.edu.au</email></para>
- </listitem>
-
- <listitem>
- <para>Paul Popelka <email>paulp@uts.amdahl.com</email></para>
- </listitem>
-
- <listitem>
- <para>Paul S. LaFollette, Jr. <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Paul Sandys <email>myj@nyct.net</email></para>
- </listitem>
-
- <listitem>
- <para>Paul T. Root <email>proot@horton.iaces.com</email></para>
- </listitem>
-
- <listitem>
- <para>Paul Vixie <email>paul@vix.com</email></para>
- </listitem>
-
- <listitem>
- <para>Paulo Menezes <email>paulo@isr.uc.pt</email></para>
- </listitem>
-
- <listitem>
- <para>Paulo Menezes <email>pm@dee.uc.pt</email></para>
- </listitem>
-
- <listitem>
- <para>Pedro A M Vazquez <email>vazquez@IQM.Unicamp.BR</email></para>
- </listitem>
-
- <listitem>
- <para>Pedro Giffuni <email>giffunip@asme.org</email></para>
- </listitem>
-
- <listitem>
- <para>Per Wigren <email>wigren@home.se</email></para>
- </listitem>
-
- <listitem>
- <para>Pete Bentley <email>pete@demon.net</email></para>
- </listitem>
-
- <listitem>
- <para>Peter Childs <email>pjchilds@imforei.apana.org.au</email></para>
- </listitem>
-
- <listitem>
- <para>Peter Cornelius <email>pc@inr.fzk.de</email></para>
- </listitem>
-
- <listitem>
- <para>Peter Haight <email>peterh@prognet.com</email></para>
- </listitem>
-
- <listitem>
- <para>Peter Jeremy <email>peter.jeremy@alcatel.com.au</email></para>
- </listitem>
-
- <listitem>
- <para>Peter M. Chen <email>pmchen@eecs.umich.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Peter Much <email>peter@citylink.dinoex.sub.org</email></para>
- </listitem>
-
- <listitem>
- <para>Peter Olsson <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Peter Philipp <email>pjp@bsd-daemon.net</email></para>
- </listitem>
-
- <listitem>
- <para>Peter Stubbs <email>PETERS@staidan.qld.edu.au</email></para>
- </listitem>
-
- <listitem>
- <para>Peter van Heusden <email>pvh@egenetics.com</email></para>
- </listitem>
-
- <listitem>
- <para>Phil Maker <email>pjm@cs.ntu.edu.au</email></para>
- </listitem>
-
- <listitem>
- <para>Phil Sutherland
- <email>philsuth@mycroft.dialix.oz.au</email></para>
- </listitem>
-
- <listitem>
- <para>Phil Taylor <email>phil@zipmail.co.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Philip Musumeci <email>philip@rmit.edu.au</email></para>
- </listitem>
-
- <listitem>
- <para>Philippe Lefebvre <email>nemesis@balistik.net</email></para>
- </listitem>
-
- <listitem>
- <para>Pierre Y. Dampure <email>pierre.dampure@k2c.co.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Pius Fischer <email>pius@ienet.com</email></para>
- </listitem>
-
- <listitem>
- <para>Pomegranate <email>daver@flag.blackened.net</email></para>
- </listitem>
-
- <listitem>
- <para>Powerdog Industries
- <email>kevin.ruddy@powerdog.com</email></para>
- </listitem>
-
- <listitem>
- <para>Priit J&auml;rv <email>priit@cc.ttu.ee</email></para>
- </listitem>
-
- <listitem>
- <para>R Joseph Wright <email>rjoseph@mammalia.org</email></para>
- </listitem>
-
- <listitem>
- <para>R. Kym Horsell</para>
- </listitem>
-
- <listitem>
- <para>Ralf Friedl <email>friedl@informatik.uni-kl.de</email></para>
- </listitem>
-
- <listitem>
- <para>Randal S. Masutani <email>randal@comtest.com</email></para>
- </listitem>
-
- <listitem>
- <para>Randall Hopper <email>rhh@ct.picker.com</email></para>
- </listitem>
-
- <listitem>
- <para>Randall W. Dean <email>rwd@osf.org</email></para>
- </listitem>
-
- <listitem>
- <para>Randy Bush <email>rbush@bainbridge.verio.net</email></para>
- </listitem>
-
- <listitem>
- <para>Rasmus Kaj <email>kaj@Raditex.se</email></para>
- </listitem>
-
- <listitem>
- <para>Reinier Bezuidenhout
- <email>rbezuide@mikom.csir.co.za</email></para>
- </listitem>
-
- <listitem>
- <para>Remy Card <email>Remy.Card@masi.ibp.fr</email></para>
- </listitem>
-
- <listitem>
- <para>Ricardas Cepas <email>rch@richard.eu.org</email></para>
- </listitem>
-
- <listitem>
- <para>Riccardo Veraldi <email>veraldi@cs.unibo.it</email></para>
- </listitem>
-
- <listitem>
- <para>Rich Wood <email>rich@FreeBSD.org.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Richard Henderson <email>richard@atheist.tamu.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Richard Hwang <email>rhwang@bigpanda.com</email></para>
- </listitem>
-
- <listitem>
- <para>Richard Kiss <email>richard@homemail.com</email></para>
- </listitem>
-
- <listitem>
- <para>Richard J Kuhns <email>rjk@watson.grauel.com</email></para>
- </listitem>
-
- <listitem>
- <para>Richard M. Neswold
- <email>rneswold@enteract.com</email></para>
- </listitem>
-
- <listitem>
- <para>Richard Seaman, Jr. <email>dick@tar.com</email></para>
- </listitem>
-
- <listitem>
- <para>Richard Stallman <email>rms@gnu.ai.mit.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Richard Straka <email>straka@user1.inficad.com</email></para>
- </listitem>
-
- <listitem>
- <para>Richard Tobin <email>richard@cogsci.ed.ac.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Richard Wackerbarth <email>rkw@Dataplex.NET</email></para>
- </listitem>
-
- <listitem>
- <para>Richard Winkel <email>rich@math.missouri.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Richard Wiwatowski <email>rjwiwat@adelaide.on.net</email></para>
- </listitem>
-
- <listitem>
- <para>Rick Macklem <email>rick@snowhite.cis.uoguelph.ca</email></para>
- </listitem>
-
- <listitem>
- <para>Rick Macklin <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Rob Austein <email>sra@epilogue.com</email></para>
- </listitem>
-
- <listitem>
- <para>Rob Mallory <email>rmallory@qualcomm.com</email></para>
- </listitem>
-
- <listitem>
- <para>Rob Snow <email>rsnow@txdirect.net</email></para>
- </listitem>
-
- <listitem>
- <para>Robert Crowe <email>bob@speakez.com</email></para>
- </listitem>
-
- <listitem>
- <para>Robert D. Thrush <email>rd@phoenix.aii.com</email></para>
- </listitem>
-
- <listitem>
- <para>Robert Eckardt
- <email>roberte@MEP.Ruhr-Uni-Bochum.de</email></para>
- </listitem>
-
- <listitem>
- <para>Robert P Ricci <email>ricci@cs.utah.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Robert Sanders <email>rsanders@mindspring.com</email></para>
- </listitem>
-
- <listitem>
- <para>Robert Sexton <email>robert@kudra.com</email></para>
- </listitem>
-
- <listitem>
- <para>Robert Shady <email>rls@id.net</email></para>
- </listitem>
-
- <listitem>
- <para>Robert Swindells <email>swindellsr@genrad.co.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Robert Withrow <email>witr@rwwa.com</email></para>
- </listitem>
-
- <listitem>
- <para>Robert Yoder <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Robin Carey
- <email>robin@mailgate.dtc.rankxerox.co.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Rod Taylor <email>rod@idiotswitch.org</email></para>
- </listitem>
-
- <listitem>
- <para>Roger Hardiman <email>roger@cs.strath.ac.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Roland Jesse <email>jesse@cs.uni-magdeburg.de</email></para>
- </listitem>
-
- <listitem>
- <para>Roman Shterenzon <email>roman@xpert.com</email></para>
- </listitem>
-
- <listitem>
- <para>Ron Bickers <email>rbickers@intercenter.net</email></para>
- </listitem>
-
- <listitem>
- <para>Ron Lenk <email>rlenk@widget.xmission.com</email></para>
- </listitem>
-
- <listitem>
- <para>Ronald Kuehn <email>kuehn@rz.tu-clausthal.de</email></para>
- </listitem>
-
- <listitem>
- <para>Rudolf Cejka <email>cejkar@dcse.fee.vutbr.cz</email></para>
- </listitem>
-
- <listitem>
- <para>Ruslan Belkin <email>rus@home2.UA.net</email></para>
- </listitem>
-
- <listitem>
- <para>Ruslan Shevchenko <email>rssh@cam.grad.kiev.ua</email></para>
- </listitem>
-
- <listitem>
- <para>Russell L. Carter <email>rcarter@pinyon.org</email></para>
- </listitem>
-
- <listitem>
- <para>Russell Vincent <email>rv@groa.uct.ac.za</email></para>
- </listitem>
-
- <listitem>
- <para>Ryan Younce <email>ryany@pobox.com</email></para>
- </listitem>
-
- <listitem>
- <para>Ryuichiro IMURA <email>imura@af.airnet.ne.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Sakai Hiroaki <email>sakai@miya.ee.kagu.sut.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Sakari Jalovaara <email>sja@tekla.fi</email></para>
- </listitem>
-
- <listitem>
- <para>Sam Hartman <email>hartmans@mit.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Samuel Lam <email>skl@ScalableNetwork.com</email></para>
- </listitem>
-
- <listitem>
- <para>Samuel Tardieu <email>sam@inf.enst.fr</email></para>
- </listitem>
-
- <listitem>
- <para>Samuele Zannoli <email>zannoli@cs.unibo.it</email></para>
- </listitem>
-
- <listitem>
- <para>Sander Janssen <email>janssen@rendo.dekooi.nl</email></para>
- </listitem>
-
- <listitem>
- <para>Sander Vesik <email>sander@haldjas.folklore.ee</email></para>
- </listitem>
-
- <listitem>
- <para>Sandro Sigala <email>ssigala@globalnet.it</email></para>
- </listitem>
-
- <listitem>
- <para>SANETO Takanori <email>sanewo@strg.sony.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>SASAKI Shunsuke <email>ele@pop17.odn.ne.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Sascha Blank <email>blank@fox.uni-trier.de</email></para>
- </listitem>
-
- <listitem>
- <para>Sascha Wildner <email>swildner@channelz.GUN.de</email></para>
- </listitem>
-
- <listitem>
- <para>Satoh Junichi <email>junichi@astec.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>SAWADA Mizuki <email>miz@qb3.so-net.ne.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Scot Elliott <email>scot@poptart.org</email></para>
- </listitem>
-
- <listitem>
- <para>Scot W. Hetzel <email>hetzels@westbend.net</email></para>
- </listitem>
-
- <listitem>
- <para>Scott A. Kenney <email>saken@rmta.ml.org</email></para>
- </listitem>
-
- <listitem>
- <para>Scott A. Moberly <email>smoberly@xavier.dyndns.org</email></para>
- </listitem>
-
- <listitem>
- <para>Scott Blachowicz
- <email>scott.blachowicz@seaslug.org</email></para>
- </listitem>
-
- <listitem>
- <para>Scott Burris <email>scott@pita.cns.ucla.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Scott Hazen Mueller <email>scott@zorch.sf-bay.org</email></para>
- </listitem>
-
- <listitem>
- <para>Scott Michel <email>scottm@cs.ucla.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Scott Mitchel <email>scott@uk.FreeBSD.org</email></para>
- </listitem>
-
- <listitem>
- <para>Scott Reynolds <email>scott@clmqt.marquette.mi.us</email></para>
- </listitem>
-
- <listitem>
- <para>Sebastian Strollo <email>seb@erix.ericsson.se</email></para>
- </listitem>
-
- <listitem>
- <para>Serge V. Vakulenko <email>vak@zebub.msk.su</email></para>
- </listitem>
-
- <listitem>
- <para>Sergei Chechetkin <email>csl@whale.sunbay.crimea.ua</email></para>
- </listitem>
-
- <listitem>
- <para>Sergei S. Laskavy <email>laskavy@pc759.cs.msu.su</email></para>
- </listitem>
-
- <listitem>
- <para>Sergey Gershtein <email>sg@mplik.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Sergey Kosyakov <email>ks@itp.ac.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Sergey N. Vorokov <email>serg@tmn.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Sergey Potapov <email>sp@alkor.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Sergey Samoyloff <email>gonza@techline.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Sergey Shkonda <email>serg@bcs.zp.ua</email></para>
- </listitem>
-
- <listitem>
- <para>Sergey Skvortsov <email>skv@protey.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Sergey V.Dorokhov <email>svd@kbtelecom.nalnet.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Sergio Lenzi <email>lenzi@bsi.com.br</email></para>
- </listitem>
-
- <listitem>
- <para>Shaun Courtney <email>shaun@emma.eng.uct.ac.za</email></para>
- </listitem>
-
- <listitem>
- <para>Shawn M. Carey <email>smcarey@mailbox.syr.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Shell Hung <email>shell@shellhung.org</email></para>
- </listitem>
-
- <listitem>
- <para>Shigio Yamaguchi <email>shigio@tamacom.com</email></para>
- </listitem>
-
- <listitem>
- <para>Shinya Esu <email>esu@yk.rim.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Shinya FUJIE <email>fujie@tk.elec.waseda.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Shuichi Tanaka <email>stanaka@bb.mbn.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Simon <email>simon@masi.ibp.fr</email></para>
- </listitem>
-
- <listitem>
- <para>Simon Burge <email>simonb@telstra.com.au</email></para>
- </listitem>
-
- <listitem>
- <para>Simon Dick <email>simond@irrelevant.org</email></para>
- </listitem>
-
- <listitem>
- <para>Simon J Gerraty <email>sjg@melb.bull.oz.au</email></para>
- </listitem>
-
- <listitem>
- <para>Simon Marlow <email>simonm@dcs.gla.ac.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Simon Shapiro <email>shimon@simon-shapiro.org</email></para>
- </listitem>
-
- <listitem>
- <para>Sin'ichiro MIYATANI <email>siu@phaseone.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Slaven Rezic <email>eserte@cs.tu-berlin.de</email></para>
- </listitem>
-
- <listitem>
- <para>Soochon Radee <email>slr@mitre.org</email></para>
- </listitem>
-
- <listitem>
- <para>Soren Dayton <email>csdayton@midway.uchicago.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Soren Dossing <email>sauber@netcom.com</email></para>
- </listitem>
-
- <listitem>
- <para>Soren S. Jorvang <email>soren@wheel.dk</email></para>
- </listitem>
-
- <listitem>
- <para>Stefan Bethke <email>stb@hanse.de</email></para>
- </listitem>
-
- <listitem>
- <para>Stefan Eggers <email>seggers@semyam.dinoco.de</email></para>
- </listitem>
-
- <listitem>
- <para>Stefan Moeding <email>s.moeding@ndh.net</email></para>
- </listitem>
-
- <listitem>
- <para>Stefan Petri <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Stefan `Sec` Zehl <email>sec@42.org</email></para>
- </listitem>
-
- <listitem>
- <para>Steinar Haug <email>sthaug@nethelp.no</email></para>
- </listitem>
-
- <listitem>
- <para>Stephane E. Potvin <email>sepotvin@videotron.ca</email></para>
- </listitem>
-
- <listitem>
- <para>Stephane Legrand <email>stephane@lituus.fr</email></para>
- </listitem>
-
- <listitem>
- <para>Stephen Clawson
- <email>sclawson@marker.cs.utah.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Stephen F. Combs <email>combssf@salem.ge.com</email></para>
- </listitem>
-
- <listitem>
- <para>Stephen Farrell <email>stephen@farrell.org</email></para>
- </listitem>
-
- <listitem>
- <para>Stephen Hocking <email>sysseh@devetir.qld.gov.au</email></para>
- </listitem>
-
- <listitem>
- <para>Stephen J. Roznowski <email>sjr@home.net</email></para>
- </listitem>
-
- <listitem>
- <para>Stephen McKay <email>syssgm@devetir.qld.gov.au</email></para>
- </listitem>
-
- <listitem>
- <para>Stephen Melvin <email>melvin@zytek.com</email></para>
- </listitem>
-
- <listitem>
- <para>Steve Bauer <email>sbauer@rock.sdsmt.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Steve Coltrin <email>spcoltri@unm.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Steve Deering <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Steve Gerakines <email>steve2@genesis.tiac.net</email></para>
- </listitem>
-
- <listitem>
- <para>Steve Gericke <email>steveg@comtrol.com</email></para>
- </listitem>
-
- <listitem>
- <para>Steve Piette <email>steve@simon.chi.il.US</email></para>
- </listitem>
-
- <listitem>
- <para>Steve Schwarz <email>schwarz@alpharel.com</email></para>
- </listitem>
-
- <listitem>
- <para>Steven Enderle <email>panic@subphase.de</email></para>
- </listitem>
-
- <listitem>
- <para>Steven G. Kargl
- <email>kargl@troutmask.apl.washington.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Steven H. Samorodin <email>samorodi@NUXI.com</email></para>
- </listitem>
-
- <listitem>
- <para>Steven McCanne <email>mccanne@cs.berkeley.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Steven Plite <email>splite@purdue.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Steven Wallace <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Stijn Hoop <email>stijn@win.tue.nl</email></para>
- </listitem>
-
- <listitem>
- <para>Stuart Henderson
- <email>stuart@internationalschool.co.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Sue Blake <email>sue@welearn.com.au</email></para>
- </listitem>
-
- <listitem>
- <para>Sugimoto Sadahiro <email>ixtl@komaba.utmc.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>SUGIMURA Takashi <email>sugimura@jp.FreeBSD.org</email></para>
- </listitem>
-
- <listitem>
- <para>Sugiura Shiro <email>ssugiura@duo.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Sujal Patel <email>smpatel@wam.umd.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Sungman Cho <email>smcho@tsp.korea.ac.kr</email></para>
- </listitem>
-
- <listitem>
- <para>Sune Stjerneby <email>stjerneby@usa.net</email></para>
- </listitem>
-
- <listitem>
- <para>SURANYI Peter
- <email>suranyip@jks.is.tsukuba.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Suzuki Yoshiaki
- <email>zensyo@ann.tama.kawasaki.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Svein Skogen
- <email>tds@nsn.no</email></para>
- </listitem>
-
- <listitem>
- <para>Sybolt de Boer <email>bolt@xs4all.nl</email></para>
- </listitem>
-
- <listitem>
- <para>Tadashi Kumano <email>kumano@strl.nhk.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Taguchi Takeshi <email>taguchi@tohoku.iij.ad.jp</email></para>
- </listitem>
-
- <listitem>
- <para>TAKAHASHI Kaoru <email>kaoru@kaisei.org</email></para>
- </listitem>
-
- <listitem>
- <para>Takahiro Yugawa <email>yugawa@orleans.rim.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Takashi Mega <email>mega@minz.org</email></para>
- </listitem>
-
- <listitem>
- <para>Takashi Uozu <email>j1594016@ed.kagu.sut.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Takayuki Ariga <email>a00821@cc.hc.keio.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Takeru NAIKI <email>naiki@bfd.es.hokudai.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Takeshi Amaike <email>amaike@iri.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Takeshi MUTOH <email>mutoh@info.nara-k.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Takeshi Ohashi
- <email>ohashi@mickey.ai.kyutech.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Takeshi WATANABE
- <email>watanabe@crayon.earth.s.kobe-u.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Takuya SHIOZAKI
- <email>tshiozak@makino.ise.chuo-u.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Tatoku Ogaito <email>tacha@tera.fukui-med.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Tatsuya Kudoh <email>cdr@cosmonet.org</email></para>
- </listitem>
-
- <listitem>
- <para>Ted Buswell <email>tbuswell@mediaone.net</email></para>
- </listitem>
-
- <listitem>
- <para>Ted Faber <email>faber@isi.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Ted Lemon <email>mellon@isc.org</email></para>
- </listitem>
-
- <listitem>
- <para>Terry Lambert <email>terry@lambert.org</email></para>
- </listitem>
-
- <listitem>
- <para>Terry Lee <email>terry@uivlsi.csl.uiuc.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Tetsuya Furukawa <email>tetsuya@secom-sis.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Theo de Raadt <email>deraadt@OpenBSD.org</email></para>
- </listitem>
-
- <listitem>
- <para>Thomas <email>thomas@mathematik.uni-Bremen.de</email></para>
- </listitem>
-
- <listitem>
- <para>Thomas D. Dean <email>tomdean@ix.netcom.com</email></para>
- </listitem>
-
- <listitem>
- <para>Thomas David Rivers <email>rivers@dignus.com</email></para>
- </listitem>
-
- <listitem>
- <para>Thomas E. Zander <email>rriggs@f113.hadiko.de</email></para>
- </listitem>
-
- <listitem>
- <para>Thomas G. McWilliams <email>tgm@netcom.com</email></para>
- </listitem>
-
- <listitem>
- <para>Thomas Graichen
- <email>graichen@omega.physik.fu-berlin.de</email></para>
- </listitem>
-
- <listitem>
- <para>Thomas K&ouml;nig
- <email>Thomas.Koenig@ciw.uni-karlsruhe.de</email></para>
- </listitem>
-
- <listitem>
- <para>Thomas Ptacek <email>unknown</email></para>
- </listitem>
-
- <listitem>
- <para>Thomas Quinot <email>thomas@cuivre.fr.eu.org</email></para>
- </listitem>
-
- <listitem>
- <para>Thomas A. Stephens <email>tas@stephens.org</email></para>
- </listitem>
-
- <listitem>
- <para>Thomas Stromberg <email>tstrombe@rtci.com</email></para>
- </listitem>
-
- <listitem>
- <para>Thomas Valentino Crimi
- <email>tcrimi+@andrew.cmu.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Thomas Wintergerst <email>thomas@lemur.nord.de</email></para>
- </listitem>
-
- <listitem>
- <para>&THORN;&oacute;r&eth;ur &Iacute;varsson
- <email>totii@est.is</email></para>
- </listitem>
-
- <listitem>
- <para>Thierry Thomas <email>tthomas@mail.dotcom.fr</email></para>
- </listitem>
-
- <listitem>
- <para>Timothy Jensen <email>toast@blackened.com</email></para>
- </listitem>
-
- <listitem>
- <para>Tim Kientzle <email>kientzle@netcom.com</email></para>
- </listitem>
-
- <listitem>
- <para>Tim Singletary
- <email>tsingle@sunland.gsfc.nasa.gov</email></para>
- </listitem>
-
- <listitem>
- <para>Tim Wilkinson <email>tim@sarc.city.ac.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Timo J. Rinne <email>tri@iki.fi</email></para>
- </listitem>
-
- <listitem>
- <para>Tobias Reifenberger <email>treif@mayn.de</email></para>
- </listitem>
-
- <listitem>
- <para>Todd Miller <email>millert@openbsd.org</email></para>
- </listitem>
-
- <listitem>
- <para>Tom <email>root@majestix.cmr.no</email></para>
- </listitem>
-
- <listitem>
- <para>Tom <email>tom@sdf.com</email></para>
- </listitem>
-
- <listitem>
- <para>Tom Gray - DCA <email>dcasba@rain.org</email></para>
- </listitem>
-
- <listitem>
- <para>Tom Jobbins <email>tom@tom.tj</email></para>
- </listitem>
-
- <listitem>
- <para>Tom Pusateri <email>pusateri@juniper.net</email></para>
- </listitem>
-
- <listitem>
- <para>Tom Rush <email>tarush@mindspring.com</email></para>
- </listitem>
-
- <listitem>
- <para>Tom Samplonius <email>tom@misery.sdf.com</email></para>
- </listitem>
-
- <listitem>
- <para>Tomohiko Kurahashi
- <email>kura@melchior.q.t.u-tokyo.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Tony Kimball <email>alk@Think.COM</email></para>
- </listitem>
-
- <listitem>
- <para>Tony Li <email>tli@jnx.com</email></para>
- </listitem>
-
- <listitem>
- <para>Tony Lynn <email>wing@cc.nsysu.edu.tw</email></para>
- </listitem>
-
- <listitem>
- <para>Tony Maher <email>tonym@biolateral.com.au</email></para>
- </listitem>
-
- <listitem>
- <para>Torbjorn Granlund <email>tege@matematik.su.se</email></para>
- </listitem>
-
- <listitem>
- <para>Toshihiko SHIMOKAWA <email>toshi@tea.forus.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Toshihiro Kanda <email>candy@kgc.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Toshiomi Moriki
- <email>Toshiomi.Moriki@ma1.seikyou.ne.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Trefor S. <email>trefor@flevel.co.uk</email></para>
- </listitem>
-
- <listitem>
- <para>Trenton Schulz <email>twschulz@cord.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Trevor Blackwell <email>tlb@viaweb.com</email></para>
- </listitem>
-
- <listitem>
- <para>Udo Schweigert <email>ust@cert.siemens.de</email></para>
- </listitem>
-
- <listitem>
- <para>Ugo Paternostro <email>paterno@dsi.unifi.it</email></para>
- </listitem>
-
- <listitem>
- <para>Ulf Kieber <email>kieber@sax.de</email></para>
- </listitem>
-
- <listitem>
- <para>Ulli Linzen <email>ulli@perceval.camelot.de</email></para>
- </listitem>
-
- <listitem>
- <para>URATA Shuichiro <email>s-urata@nmit.tmg.nec.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Uwe Arndt <email>arndt@mailhost.uni-koblenz.de</email></para>
- </listitem>
-
- <listitem>
- <para>Vadim Belman <email>vab@lflat.vas.mobilix.dk</email></para>
- </listitem>
-
- <listitem>
- <para>Vadim Chekan <email>vadim@gc.lviv.ua</email></para>
- </listitem>
-
- <listitem>
- <para>Vadim Kolontsov <email>vadim@tversu.ac.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Vadim Mikhailov <email>mvp@braz.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Valentin Nechayev <email>netch@lucky.net</email></para>
- </listitem>
-
- <listitem>
- <para>Van Jacobson <email>van@ee.lbl.gov</email></para>
- </listitem>
-
- <listitem>
- <para>Vasily V. Grechishnikov
- <email>bazilio@ns1.ied-vorstu.ac.ru</email></para>
- </listitem>
-
- <listitem>
- <para>Vasim Valejev <email>vasim@uddias.diaspro.com</email></para>
- </listitem>
-
- <listitem>
- <para>Vernon J. Schryver <email>vjs@mica.denver.sgi.com</email></para>
- </listitem>
-
- <listitem>
- <para>Veselin Slavov <email>vess@btc.net</email></para>
- </listitem>
-
- <listitem>
- <para>Vic Abell <email>abe@cc.purdue.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Ville Eerola <email>ve@sci.fi</email></para>
- </listitem>
-
- <listitem>
- <para>Vince Valenti <email>vince@blue-box.net</email></para>
- </listitem>
-
- <listitem>
- <para>Vincent Poy <email>vince@venus.gaianet.net</email></para>
- </listitem>
-
- <listitem>
- <para>Vincenzo Capuano
- <email>VCAPUANO@vmprofs.esoc.esa.de</email></para>
- </listitem>
-
- <listitem>
- <para>Virgil Champlin <email>champlin@pa.dec.com</email></para>
- </listitem>
-
- <listitem>
- <para>Vladimir A. Jakovenko
- <email>vovik@ntu-kpi.kiev.ua</email></para>
- </listitem>
-
- <listitem>
- <para>Vladimir Kushnir <email>kushn@mail.kar.net</email></para>
- </listitem>
-
- <listitem>
- <para>Vsevolod Lobko <email>seva@alex-ua.com</email></para>
- </listitem>
-
- <listitem>
- <para>W. Gerald Hicks <email>wghicks@bellsouth.net</email></para>
- </listitem>
-
- <listitem>
- <para>W. Richard Stevens <email>rstevens@noao.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Walt Howard <email>howard@ee.utah.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Walt M. Shandruk <email>walt@erudition.net</email</para>
- </listitem>
-
- <listitem>
- <para>Warren Toomey <email>wkt@csadfa.cs.adfa.oz.au</email></para>
- </listitem>
-
- <listitem>
- <para>Wayne Scott <email>wscott@ichips.intel.com</email></para>
- </listitem>
-
- <listitem>
- <para>Werner Griessl
- <email>werner@btp1da.phy.uni-bayreuth.de</email></para>
- </listitem>
-
- <listitem>
- <para>Wes Santee <email>wsantee@wsantee.oz.net</email></para>
- </listitem>
-
- <listitem>
- <para>Wietse Venema <email>wietse@wzv.win.tue.nl</email></para>
- </listitem>
-
- <listitem>
- <para>Wiljo Heinen <email>wiljo@freeside.ki.open.de</email></para>
- </listitem>
-
- <listitem>
- <para>Willem Jan Withagen <email>wjw@surf.IAE.nl</email></para>
- </listitem>
-
- <listitem>
- <para>William Jolitz <email>withheld</email></para>
- </listitem>
-
- <listitem>
- <para>William Liao <email>william@tale.net</email></para>
- </listitem>
-
- <listitem>
- <para>Wojtek Pilorz
- <email>wpilorz@celebris.bdk.lublin.pl</email></para>
- </listitem>
-
- <listitem>
- <para>Wolfgang Helbig <email>helbig@ba-stuttgart.de</email></para>
- </listitem>
-
- <listitem>
- <para>Wolfgang Solfrank <email>ws@tools.de</email></para>
- </listitem>
-
- <listitem>
- <para>Wolfgang Stanglmeier <email>wolf@FreeBSD.org</email></para>
- </listitem>
-
- <listitem>
- <para>Wu Ching-hong <email>woju@FreeBSD.ee.Ntu.edu.TW</email></para>
- </listitem>
-
- <listitem>
- <para>&a.wylie;</para>
- </listitem>
-
- <listitem>
- <para>Yarema <email>yds@ingress.com</email></para>
- </listitem>
-
- <listitem>
- <para>Yaroslav Terletsky <email>ts@polynet.lviv.ua</email></para>
- </listitem>
-
- <listitem>
- <para>Yasuhiro Fukama <email>yasuf@big.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Yasuhito FUTATSUKI <email>futatuki@fureai.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Yen-Ming Lee <email>leeym@bsd.ce.ntu.edu.tw</email></para>
- </listitem>
-
- <listitem>
- <para>Yen-Shuo Su <email>yssu@CCCA.NCTU.edu.tw</email></para>
- </listitem>
-
- <listitem>
- <para>Yin-Jieh Chen <email>yinjieh@Crazyman.Dorm13.NCTU.edu.tw</email></para>
- </listitem>
-
- <listitem>
- <para>Yixin Jin <email>yjin@rain.cs.ucla.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Yoichi Asai <email>yatt@msc.biglobe.ne.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Yoichi Nakayama <email>yoichi@eken.phys.nagoya-u.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Yoshiaki Uchikawa <email>yoshiaki@kt.rim.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Yoshihiko SARUMRU <email>mistral@imasy.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Yoshihisa NAKAGAWA
- <email>y-nakaga@ccs.mt.nec.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Yoshikazu Goto <email>gotoh@ae.anritsu.co.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Yoshimasa Ohnishi
- <email>ohnishi@isc.kyutech.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Yoshishige Arai <email>ryo2@on.rim.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Yuichi MATSUTAKA <email>matutaka@osa.att.ne.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Yujiro MIYATA
- <email>miyata@bioele.nuee.nagoya-u.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Yu-Shun Wang <email>yushunwa@isi.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Yusuke Nawano <email>azuki@azkey.org</email></para>
- </listitem>
-
- <listitem>
- <para>Yuu Yashiki <email>s974123@cc.matsuyama-u.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Yuuki SAWADA <email>mami@whale.cc.muroran-it.ac.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Yuuichi Narahara <email>aconitum@po.teleway.ne.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Yuval Yarom <email>yval@cs.huji.ac.il</email></para>
- </listitem>
-
- <listitem>
- <para>Yves Fonk <email>yves@cpcoup5.tn.tudelft.nl</email></para>
- </listitem>
-
- <listitem>
- <para>Yves Fonk <email>yves@dutncp8.tn.tudelft.nl</email></para>
- </listitem>
-
- <listitem>
- <para>Zach Heilig <email>zach@gaffaneys.com</email></para>
- </listitem>
-
- <listitem>
- <para>Zach Zurflu <email>zach@pabst.bendnet.com</email></para>
- </listitem>
-
- <listitem>
- <para>Zahemszhky Gabor <email>zgabor@code.hu</email></para>
- </listitem>
-
- <listitem>
- <para>Zhong Ming-Xun <email>zmx@mail.CDPA.nsysu.edu.tw</email></para>
- </listitem>
- </itemizedlist>
- </sect1>
-
- <sect1 id="contrib-386bsd">
- <title>386BSD Patch Kit Patch Contributors</title>
-
- <para>(in alphabetical order by first name):</para>
-
- <itemizedlist>
- <listitem>
- <para>Adam Glass <email>glass@postgres.berkeley.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Adrian Hall <email>ahall@mirapoint.com</email></para>
- </listitem>
-
- <listitem>
- <para>Andrey A. Chernov <email>ache@astral.msk.su</email></para>
- </listitem>
-
- <listitem>
- <para>Andrew Herbert <email>andrew@werple.apana.org.au</email></para>
- </listitem>
-
- <listitem>
- <para>Andrew Moore <email>alm@netcom.com</email></para>
- </listitem>
-
- <listitem>
- <para>Andy Valencia <email>ajv@csd.mot.com</email>
- <email>jtk@netcom.com</email></para>
- </listitem>
-
- <listitem>
- <para>Arne Henrik Juul <email>arnej@Lise.Unit.NO</email></para>
- </listitem>
-
- <listitem>
- <para>Bakul Shah <email>bvs@bitblocks.com</email></para>
- </listitem>
-
- <listitem>
- <para>Barry Lustig <email>barry@ictv.com</email></para>
- </listitem>
-
- <listitem>
- <para>Bob Wilcox <email>bob@obiwan.uucp</email></para>
- </listitem>
-
- <listitem>
- <para>Branko Lankester</para>
- </listitem>
-
- <listitem>
- <para>Brett Lymn <email>blymn@mulga.awadi.com.AU</email></para>
- </listitem>
-
- <listitem>
- <para>Charles Hannum <email>mycroft@ai.mit.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Chris G. Demetriou
- <email>cgd@postgres.berkeley.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Chris Torek <email>torek@ee.lbl.gov</email></para>
- </listitem>
-
- <listitem>
- <para>Christoph Robitschko
- <email>chmr@edvz.tu-graz.ac.at</email></para>
- </listitem>
-
- <listitem>
- <para>Daniel Poirot <email>poirot@aio.jsc.nasa.gov</email></para>
- </listitem>
-
- <listitem>
- <para>Dave Burgess <email>burgess@hrd769.brooks.af.mil</email></para>
- </listitem>
-
- <listitem>
- <para>Dave Rivers <email>rivers@ponds.uucp</email></para>
- </listitem>
-
- <listitem>
- <para>David Dawes <email>dawes@physics.su.OZ.AU</email></para>
- </listitem>
-
- <listitem>
- <para>David Greenman <email>dg@Root.COM</email></para>
- </listitem>
-
- <listitem>
- <para>Eric J. Haug <email>ejh@slustl.slu.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Felix Gaehtgens
- <email>felix@escape.vsse.in-berlin.de</email></para>
- </listitem>
-
- <listitem>
- <para>Frank Maclachlan <email>fpm@crash.cts.com</email></para>
- </listitem>
-
- <listitem>
- <para>Gary A. Browning <email>gab10@griffcd.amdahl.com</email></para>
- </listitem>
-
- <listitem>
- <para>Gary Howland <email>gary@hotlava.com</email></para>
- </listitem>
-
- <listitem>
- <para>Geoff Rehmet <email>csgr@alpha.ru.ac.za</email></para>
- </listitem>
-
- <listitem>
- <para>Goran Hammarback <email>goran@astro.uu.se</email></para>
- </listitem>
-
- <listitem>
- <para>Guido van Rooij <email>guido@gvr.org</email></para>
- </listitem>
-
- <listitem>
- <para>Guy Antony Halse <email>guy@rucus.ru.ac.za</email></para>
- </listitem>
-
- <listitem>
- <para>Guy Harris <email>guy@auspex.com</email></para>
- </listitem>
-
- <listitem>
- <para>Havard Eidnes
- <email>Havard.Eidnes@runit.sintef.no</email></para>
- </listitem>
-
- <listitem>
- <para>Herb Peyerl <email>hpeyerl@novatel.cuc.ab.ca</email></para>
- </listitem>
-
- <listitem>
- <para>Holger Veit <email>Holger.Veit@gmd.de</email></para>
- </listitem>
-
- <listitem>
- <para>Ishii Masahiro, R. Kym Horsell</para>
- </listitem>
-
- <listitem>
- <para>J.T. Conklin <email>jtc@cygnus.com</email></para>
- </listitem>
-
- <listitem>
- <para>Jagane D Sundar <email>jagane@netcom.com</email></para>
- </listitem>
-
- <listitem>
- <para>James Clark <email>jjc@jclark.com</email></para>
- </listitem>
-
- <listitem>
- <para>James Jegers <email>jimj@miller.cs.uwm.edu</email></para>
- </listitem>
-
- <listitem>
- <para>James W. Dolter</para>
- </listitem>
-
- <listitem>
- <para>James da Silva <email>jds@cs.umd.edu</email> et al</para>
- </listitem>
-
- <listitem>
- <para>Jay Fenlason <email>hack@datacube.com</email></para>
- </listitem>
-
- <listitem>
- <para>Jim Wilson <email>wilson@moria.cygnus.com</email></para>
- </listitem>
-
- <listitem>
- <para>J&ouml;rg Lohse
- <email>lohse@tech7.informatik.uni-hamburg.de</email></para>
- </listitem>
-
- <listitem>
- <para>J&ouml;rg Wunsch
- <email>joerg_wunsch@uriah.heep.sax.de</email></para>
- </listitem>
-
- <listitem>
- <para>John Dyson</para>
- </listitem>
-
- <listitem>
- <para>John Woods <email>jfw@eddie.mit.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Jordan K. Hubbard <email>jkh@whisker.hubbard.ie</email></para>
- </listitem>
-
- <listitem>
- <para>Julian Elischer <email>julian@dialix.oz.au</email></para>
- </listitem>
-
- <listitem>
- <para>Julian Stacey <email>jhs@FreeBSD.org</email></para>
- </listitem>
-
- <listitem>
- <para>Karl Dietz <email>Karl.Dietz@triplan.com</email></para>
- </listitem>
-
- <listitem>
- <para>Karl Lehenbauer <email>karl@NeoSoft.com</email>
- <email>karl@one.neosoft.com</email></para>
- </listitem>
-
- <listitem>
- <para>Keith Bostic <email>bostic@toe.CS.Berkeley.EDU</email></para>
- </listitem>
-
- <listitem>
- <para>Ken Hughes</para>
- </listitem>
-
- <listitem>
- <para>Kent Talarico <email>kent@shipwreck.tsoft.net</email></para>
- </listitem>
-
- <listitem>
- <para>Kevin Lahey <email>kml%rokkaku.UUCP@mathcs.emory.edu</email>
- <email>kml@mosquito.cis.ufl.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Konstantinos Konstantinidis <email>kkonstan@duth.gr</email></para>
- </listitem>
-
- <listitem>
- <para>Marc Frajola <email>marc@dev.com</email></para>
- </listitem>
-
- <listitem>
- <para>Mark Tinguely <email>tinguely@plains.nodak.edu</email>
- <email>tinguely@hookie.cs.ndsu.NoDak.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Martin Renters <email>martin@tdc.on.ca</email></para>
- </listitem>
-
- <listitem>
- <para>Michael Clay <email>mclay@weareb.org</email></para>
- </listitem>
-
- <listitem>
- <para>Michael Galassi <email>nerd@percival.rain.com</email></para>
- </listitem>
-
- <listitem>
- <para>Mike Durkin <email>mdurkin@tsoft.sf-bay.org</email></para>
- </listitem>
-
- <listitem>
- <para>Naoki Hamada <email>nao@tom-yam.or.jp</email></para>
- </listitem>
-
- <listitem>
- <para>Nate Williams <email>nate@bsd.coe.montana.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Nick Handel <email>nhandel@NeoSoft.com</email>
- <email>nick@madhouse.neosoft.com</email></para>
- </listitem>
-
- <listitem>
- <para>Pace Willisson <email>pace@blitz.com</email></para>
- </listitem>
-
- <listitem>
- <para>Paul Kranenburg <email>pk@cs.few.eur.nl</email></para>
- </listitem>
-
- <listitem>
- <para>Paul Mackerras <email>paulus@cs.anu.edu.au</email></para>
- </listitem>
-
- <listitem>
- <para>Paul Popelka <email>paulp@uts.amdahl.com</email></para>
- </listitem>
-
- <listitem>
- <para>Peter da Silva <email>peter@NeoSoft.com</email></para>
- </listitem>
-
- <listitem>
- <para>Phil Sutherland
- <email>philsuth@mycroft.dialix.oz.au</email></para>
- </listitem>
-
- <listitem>
- <para>Poul-Henning Kamp <email>phk@FreeBSD.org</email></para>
- </listitem>
-
- <listitem>
- <para>Ralf Friedl <email>friedl@informatik.uni-kl.de</email></para>
- </listitem>
-
- <listitem>
- <para>Rick Macklem <email>root@snowhite.cis.uoguelph.ca</email></para>
- </listitem>
-
- <listitem>
- <para>Robert D. Thrush <email>rd@phoenix.aii.com</email></para>
- </listitem>
-
- <listitem>
- <para>Rodney W. Grimes <email>rgrimes@cdrom.com</email></para>
- </listitem>
-
- <listitem>
- <para>Sascha Wildner <email>swildner@channelz.GUN.de</email></para>
- </listitem>
-
- <listitem>
- <para>Scott Burris <email>scott@pita.cns.ucla.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Scott Reynolds <email>scott@clmqt.marquette.mi.us</email></para>
- </listitem>
-
- <listitem>
- <para>Sean Eric Fagan <email>sef@kithrup.com</email></para>
- </listitem>
-
- <listitem>
- <para>Simon J Gerraty <email>sjg@melb.bull.oz.au</email>
- <email>sjg@zen.void.oz.au</email></para>
- </listitem>
-
- <listitem>
- <para>Stephen McKay <email>syssgm@devetir.qld.gov.au</email></para>
- </listitem>
-
- <listitem>
- <para>Terry Lambert <email>terry@icarus.weber.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Terry Lee <email>terry@uivlsi.csl.uiuc.edu</email></para>
- </listitem>
-
- <listitem>
- <para>Tor Egge <email>Tor.Egge@idi.ntnu.no</email></para>
- </listitem>
-
- <listitem>
- <para>Warren Toomey <email>wkt@csadfa.cs.adfa.oz.au</email></para>
- </listitem>
-
- <listitem>
- <para>Wiljo Heinen <email>wiljo@freeside.ki.open.de</email></para>
- </listitem>
-
- <listitem>
- <para>William Jolitz <email>withheld</email></para>
- </listitem>
-
- <listitem>
- <para>Wolfgang Solfrank <email>ws@tools.de</email></para>
- </listitem>
-
- <listitem>
- <para>Wolfgang Stanglmeier <email>wolf@dentaro.GUN.de</email></para>
- </listitem>
-
- <listitem>
- <para>Yuval Yarom <email>yval@cs.huji.ac.il</email></para>
- </listitem>
- </itemizedlist>
- </sect1>
-</article>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- End:
--->
diff --git a/en_US.ISO8859-1/articles/cvsup-advanced/Makefile b/en_US.ISO8859-1/articles/cvsup-advanced/Makefile
deleted file mode 100644
index 27aeb7f607..0000000000
--- a/en_US.ISO8859-1/articles/cvsup-advanced/Makefile
+++ /dev/null
@@ -1,16 +0,0 @@
-# $FreeBSD$
-
-DOC?= article
-
-FORMATS?= html
-
-INSTALL_COMPRESSED?=gz
-INSTALL_ONLY_COMPRESSED?=
-
-JADEFLAGS+= -V %generate-article-toc%
-
-SRCS= article.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/cvsup-advanced/article.sgml b/en_US.ISO8859-1/articles/cvsup-advanced/article.sgml
deleted file mode 100644
index 2502d1fefe..0000000000
--- a/en_US.ISO8859-1/articles/cvsup-advanced/article.sgml
+++ /dev/null
@@ -1,267 +0,0 @@
-<!--
- The FreeBSD Documentation Project
--->
-
-<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man;
-]>
-
-<article>
- <articleinfo>
- <title>CVSup Advanced Points</title>
-
- <authorgroup>
- <author>
- <firstname>Salvo</firstname>
- <surname>Bartolotta</surname>
-
- <affiliation>
- <address><email>bartequi@neomedia.it</email></address>
- </affiliation>
- </author>
- </authorgroup>
-
- <pubdate>$FreeBSD$</pubdate>
-
- <abstract>
- <para>The present article assumes a basic understanding of CVSup
- operation. It documents several delicate issues connected with
- source synchronization via CVSup, viz. effective solutions to
- the problem of stale files as well as special source updating
- cases; which issues are likely to cause apparently inexplicable
- troubles.</para>
- </abstract>
- </articleinfo>
-
- <sect1 id="preface">
- <title>Preface</title>
-
- <para>This document is the fruit of the author's attempts to
- fully understand the niceties of cvsup & source updating.&nbsp;:-)
- While the author has made every effort to make these pages
- as informative and correct as possible, he is only human and
- may have made all sorts of typos, mistakes, etc. He will be
- very grateful for any comments and/or suggestions you send to
- his e-mail address, <email>bartequi@neomedia.it</email>.</para>
- </sect1>
-
-
- <sect1 id="introduction">
- <title>Introduction</title>
-
- <para>If you have visited
- <ulink url="http://www.polstra.com">John Polstra's site</ulink>
- and read
- <ulink url="http://www.polstra.com/projects/freeware/CVSup/faq.html">his
-FAQ</ulink>,
- you may have noticed Question 12 & 13.</para>
-
- <para>When updating any collection of sources (eg
- <filename>/usr/ports</filename>), &man.cvsup.1; makes use of
- the related checkouts file in order to perform the updating
- process in the most efficient and correct way. In this example
- (<filename>/usr/ports</filename>), the related checkouts file
- is <filename>/usr/sup/ports-all/checkouts.cvs:.</filename> if
- your base is <filename>/usr</filename>.</para>
-
- <para>A checkouts file contains information on the current status
- of your sources -- in a way, a sort of "photograph". This
- significant information enables cvsup to retrieve updates most
- effectively. Further, and maybe more important, it enables cvsup
- to correctly manage your sources by locally deleting any files
- no longer present in the repository, thus leaving no stale files
- on your system. In fact, without a checkouts file, cvsup would
- NOT know which files your collection was composed of (cf
- &man.cvsup.1; and the fallback method for details); as a result,
- it could NOT delete on your system those files no longer present
- in the repository. They would remain on your system (stale
- files), and might cause you subtle build failures or other
- trouble. For example, this problem is likely to occur if you
- first update your ports collection several weeks after you
- have got(ten) your installation CDs.</para>
-
- <para>It is therefore recommended that you adopt the two-step procedure
- outlined in the Cvsup FAQ (cf Q12, Q13); in subsequent sections, you
- will be given interesting and instructive concrete examples.</para>
- </sect1>
-
- <sect1 id="script">
- <title>A useful python script: cvsupchk</title>
-
- <para>Alternatively, in order to examine your sources for
- inconsistencies, you may wish to utilize the cvsupchk python
- script; which script is currently found in
- <filename>/usr/ports/net/cvsup/work/cvsup-16.1/contrib/cvsupchk</filename>,
- together with a nice <filename>README</filename>. Prerequisites:</para>
-
- <orderedlist>
- <listitem>
- <para><literal>/usr/ports/net/cvsup</literal> &prompt.root;
-<userinput> make extract</userinput></para>
- </listitem>
-
- <listitem>
- <para>python (also found in the ports collection :-))</para>
- </listitem>
-
- <listitem>
- <para>a checkouts file for your collection of sources.</para>
- </listitem>
- </orderedlist>
-
- <para>If you are updating your sources for the very first time,
- of course you do not have a checkouts file. After installing
- python and updating your sources (eg <filename>/usr/ports</filename>),
- you can check them thus:</para>
-
- <screen>&prompt.user; <filename>/path/to/</filename><userinput>cvsupchk
--d /usr -c /usr/sup/ports-all/checkouts.cvs:. | more</userinput></screen>
-
- <para>If you want to check your RELENG_4 sources:</para>
-
- <screen>&prompt.user; <filename>/path/to/</filename><userinput>cvsupchk
--d /usr -c /usr/sup/src-all/checkouts.cvs:RELENG_4 | more</userinput></screen>
-
- <para>In each case, cvsupchk will inspect your sources for
- inconsistencies by utilizing the information contained in the
- related checkouts file. Such anomalies as deleted files being
- present (aka stale files), missing checked-out files, extra RCS
- files, and dead directories will be printed to standard output.</para>
-
- <para>In the next section, we will provide important, typical
- examples of source updating; which examples will show you the
- role of checkouts files and the dangers of negligent source
- management.</para>
- </sect1>
-
- <sect1 id="examples">
- <title>Examples of more advanced source management</title>
-
- <sect2>
- <title>How to safely change tags when updating
-<literal>src-all.</literal></title>
-
- <para>If you specify eg tag=A in your supfile, cvsup will create
- a checkouts file called <filename>checkouts.cvs:A</filename>:
- for instance, if tag=RELENG_4, a checkouts file called
- <filename>checkouts.cvs:RELENG_4</filename> is generated.
- This file will be used to retrieve and/or store identification
- information on your 4-STABLE sources.</para>
-
- <para>When tracking <literal>src-all</literal>, if you wish to
- pass from tag=A to tag=B (A less/greater than B not making
- any difference) and if your checkouts file is
- <filename>checkouts.cvs:A</filename>, the following actions
- should be performed:</para>
-
- <orderedlist>
- <listitem>
- <para>&prompt.root; <userinput>mv checkouts.cvs:A
-checkouts.cvs:B</userinput>
- (This provides the subsequent step with the appropriate
- checkouts file)</para>
- </listitem>
-
- <listitem>
- <para>write a supfile whose collection line reads:</para>
- <programlisting>src-all tag=B</programlisting>
- </listitem>
-
- <listitem>
- <para>cvsup your sources using the new supfile.</para>
- </listitem>
- </orderedlist>
-
- <para>Cvsup will look for <filename>checkouts.cvs:B</filename>
- -- in that the target is B; that is, cvsup will make use of
- the information contained therein to correctly manage your
- sources.</para>
-
- <para>The benefits:</para>
-
- <itemizedlist>
- <listitem>
- <para>the sources are dealt with correctly (in particular,
- no stale files)</para>
- </listitem>
-
- <listitem>
- <para>less load is placed on the server, in that cvsup
- operates in the most efficient way.</para>
- </listitem>
- </itemizedlist>
-
-
- <para>For example, A=RELENG_4, B=. The period in "B=." means
- -CURRENT. This is a rather typical update, from 4-STABLE
- to -CURRENT. While it is straightforward to "downgrade" your
- sources (eg from -CURRENT to -STABLE), downgrading a system
- is quite another matter. You are STRONGLY advised not to
- attempt such an operation, unless you know exactly what you
- are doing.</para>
- </sect2>
-
- <sect2>
- <title>Updating to the same tag as of a different date</title>
-
- <para>If you wish to switch from "tag=A" to "tag=A" as of a
- different GMT date (say, "date=D"), you will execute the
- following:</para>
-
- <orderedlist>
- <listitem>
- <para>write a supfile whose collection line reads:</para>
- <programlisting>src-all tag=A date=D</programlisting>
- </listitem>
-
- <listitem>
- <para>update your sources using the new supfile</para>
- </listitem>
- </orderedlist>
-
- <para>Whether the new date precedes that of the last sync
- operation with tag=A or not, it is immaterial. For example,
- in order to specify the date "August 27, 2000, 10:00:00 GMT"
- you write the line:</para>
-
-
- <programlisting>src-all tag=RELENG_4
-date=2000.08.27.10.00.00</programlisting>
-
- <para>N.B. The format of a date is rigid. You have to specify
- all the components of the date: century (20, ie the 20th
- century, must be supplied whereas 19, the past century, can
- be omitted), year, month, day, hour, minutes, seconds -- as
- shown in the above example. For more information, please
- see &man.cvsup.1;.</para>
-
- <para>Whether or not a date is specified, the checkouts file
- is called <filename>checkouts.cvs:A</filename> (eg
- <filename>checkouts.cvs:RELENG_4</filename>). As a result,
- no particular action is needed in order to revert to the
- previous state: you have to modify the date in the supfile,
- and csvup again.</para>
- </sect2>
-
-
- <sect2>
- <title>Updating your ports collection for the first time</title>
-
- <para>Since ports are tagged "." (ie -CURRENT), you can
- correctly "sync" them for the first time by adding the date
- keyword (cf &man.cvsup.1; for the exact format): you should
- specify a date as close as possible to that of "shipping" of
- your ports tree. After cvsup has correctly created the ports
- checkouts file, which is precisely the goal of this first
- special sync operation, the date field must be removed;
- all subsequent updates will be carried out smoothly.</para>
-
- <para>If you have been reading the apparently nit-picking
- remarks in these sections, you will probably have recognized
- the potential for scr^Wtrouble in a source updating process.
- A number of people have actually run into problems. You have
- been warned. :-)</para>
- </sect2>
- </sect1>
-</article>
diff --git a/en_US.ISO8859-1/articles/dialup-firewall/Makefile b/en_US.ISO8859-1/articles/dialup-firewall/Makefile
deleted file mode 100644
index 886e21cc9d..0000000000
--- a/en_US.ISO8859-1/articles/dialup-firewall/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-# $FreeBSD$
-
-DOC?= article
-
-FORMATS?= html
-
-INSTALL_COMPRESSED?=gz
-INSTALL_ONLY_COMPRESSED?=
-
-SRCS= article.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/dialup-firewall/article.sgml b/en_US.ISO8859-1/articles/dialup-firewall/article.sgml
deleted file mode 100644
index d4370e1593..0000000000
--- a/en_US.ISO8859-1/articles/dialup-firewall/article.sgml
+++ /dev/null
@@ -1,375 +0,0 @@
-<!--
- The FreeBSD Documentation Project
--->
-
-<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man;
-]>
-
-<article>
- <articleinfo>
- <title>Dialup firewalling with FreeBSD</title>
-
- <authorgroup>
- <author>
- <firstname>Marc</firstname>
- <surname>Silver</surname>
-
- <affiliation>
- <address><email>marcs@draenor.org</email></address>
- </affiliation>
- </author>
- </authorgroup>
-
- <pubdate>$FreeBSD: doc/en_US.ISO8859-1/articles/dialup-firewall/article.sgml,v 1.16 2001/09/24 11:28:11 murray Exp $</pubdate>
-
- <abstract>
- <para>This article documents how to setup a firewall using a PPP
- dialup with FreeBSD and IPFW, and specifically with firewalling over
- a dialup with a dynamically assigned IP address. This document does
- not cover setting up your PPP connection in the first place.</para>
- </abstract>
- </articleinfo>
-
- <sect1 id="preface">
- <title>Preface</title>
-
- <para>Dialup Firewalling with FreeBSD</para>
-
- <para>This document covers the process that is required to setup
- firewalling with FreeBSD when an IP address is assigned dynamically
- by your ISP. While every effort has been made to make this document
- as informative and correct as possible, you are welcome to mail your
- comments/suggestions to the <email>marcs@draenor.org</email>.</para>
- </sect1>
-
- <sect1 id="kernel">
- <title>Kernel Options</title>
-
- <para>The first thing you'll need to do is recompile your kernel
- If you need more information on how to recompile the kernel,
- then the best place to start is the <ulink
- URL="http://www.freebsd.org/handbook/kernelconfig.html">kernel
- configuration section in the Handbook</ulink>. You need to add the
- following options into your kernel configuration file:</para>
-
- <variablelist>
- <varlistentry>
- <term><literal>options IPFIREWALL</literal></term>
-
- <listitem>
- <para>Enables the kernel's firewall code.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><literal>options IPFIREWALL_VERBOSE</literal></term>
-
- <listitem>
- <para>Sends logged packets to the system logger.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><literal>options
- IPFIREWALL_VERBOSE_LIMIT=<replaceable>100</replaceable></literal></term>
-
- <listitem>
- <para>Limits the number of times a matching entry is logged. This
- prevents your log file from filling up with lots of repetitive
- entries.
- <replaceable>100</replaceable> is a reasonable number to use, but
- you can adjust it based on your requirements.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><literal>options IPDIVERT</literal></term>
-
- <listitem>
- <para>Enables <emphasis>divert</emphasis> sockets, which will be
- shown later.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>There are some other <emphasis>optional</emphasis> items that you can compile
- into the kernel for some added security. These are not required in
- order to get firewalling to work, but some more paranoid users may
- want to use them.</para>
-
- <variablelist>
- <varlistentry>
- <term><literal>options TCP_DROP_SYNFIN</literal></term>
-
- <listitem>
- <para>This option ignores TCP packets with SYN and FIN. This
- prevents tools such as nmap etc from identifying the TCP/IP
- stack of the machine, but breaks support for RFC1644
- extensions. This is <emphasis>not</emphasis> recommended if the machine will be
- running a web server.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>Don't reboot once you have recompiled the kernel. Hopefully,
- we will only need to reboot once to complete the installation of the
- firewall.</para>
- </sect1>
-
- <sect1 id="rcconf">
- <title>Changing <filename>/etc/rc.conf</filename> to load the
- firewall</title>
-
- <para>We now need to make some changes to
- <filename>/etc/rc.conf</filename> in order to tell it about the
- firewall. Simply add the following lines:</para>
-
- <programlisting>firewall_enable="YES"
-firewall_script="/etc/firewall/fwrules"
-natd_enable="YES"
-natd_interface="tun0"
-natd_flags="-dynamic"</programlisting>
-
- <para>For more information on the functions of these statements take
- a look at <filename>/etc/defaults/rc.conf</filename> and read
- &man.rc.conf.5;</para>
- </sect1>
-
- <sect1>
- <title>Disable PPP's network address translation</title>
-
- <para>You may already be using PPP's built in network address
- translation (NAT). If that is the case then you will have to disable
- it, as these examples use &man.natd.8; to do the same.</para>
-
- <para>If you already have a block of entries to
- automatically start PPP, it probably looks like this:</para>
-
- <programlisting>ppp_enable="YES"
-ppp_mode="auto"
-ppp_nat="YES"
-ppp_profile="<replaceable>profile</replaceable>"</programlisting>
-
- <para>If so, remove the <literal>ppp_nat="YES"</literal> line. You will
- also need to remove any <literal>nat enable yes</literal> or
- <literal>alias enable yes</literal> in
- <filename>/etc/ppp/ppp.conf</filename>.</para>
- </sect1>
-
- <sect1 id="rules">
- <title>The ruleset for the firewall</title>
-
- <para>We're nearly done now. All that remains now is to define
- the firewall rules and then we can reboot and the firewall
- should be up and running. I realize that everyone will want
- something slightly different when it comes to their rulebase.
- What I've tried to do is write a rulebase that suits most dialup
- users. You can obviously modify it to your needs by using the
- following rules as the foundation for your own rulebase. First,
- let's start with the basics of closed firewalling. What you
- want to do is deny everything by default and then only open up
- for the things you really need. Rules should be in the order of
- allow first and then deny. The premise is that you add the
- rules for your allows, and then everything else is
- denied. :)</para>
-
- <para>Now, let's make the dir <filename
- class="directory">/etc/firewall</filename>. Change into the
- directory and edit the file <filename>fwrules</filename> as we
- specified in <filename>rc.conf</filename>. Please note that you
- can change this filename to anything you wish. This guide just
- gives an example of a filename. </para>
-
- <para>Now, let's look at a sample firewall file, that is commented
- nicely.</para>
-
- <programlisting># Firewall rules
-# Written by Marc Silver (marcs@draenor.org)
-# http://draenor.org/ipfw
-# Freely distributable
-
-
-# Define the firewall command (as in /etc/rc.firewall) for easy
-# reference. Helps to make it easier to read.
-fwcmd="/sbin/ipfw"
-
-# Force a flushing of the current rules before we reload.
-$fwcmd -f flush
-
-# Divert all packets through the tunnel interface.
-$fwcmd add divert natd all from any to any via tun0
-
-# Allow all data from my network card and localhost. Make sure you
-# change your network card (mine was fxp0) before you reboot. :)
-$fwcmd add allow ip from any to any via lo0
-$fwcmd add allow ip from any to any via fxp0
-
-# Allow all connections that I initiate.
-$fwcmd add allow tcp from any to any out xmit tun0 setup
-
-# Once connections are made, allow them to stay open.
-$fwcmd add allow tcp from any to any via tun0 established
-
-# Everyone on the internet is allowed to connect to the following
-# services on the machine. This example shows that people may connect
-# to ssh and apache.
-$fwcmd add allow tcp from any to any 80 setup
-$fwcmd add allow tcp from any to any 22 setup
-
-# This sends a RESET to all ident packets.
-$fwcmd add reset log tcp from any to any 113 in recv tun0
-
-# Allow outgoing DNS queries ONLY to the specified servers.
-$fwcmd add allow udp from any to <replaceable>x.x.x.x</replaceable> 53 out xmit tun0
-
-# Allow them back in with the answers... :)
-$fwcmd add allow udp from <replaceable>x.x.x.x</replaceable> 53 to any in recv tun0
-
-# Allow ICMP (for ping and traceroute to work). You may wish to
-# disallow this, but I feel it suits my needs to keep them in.
-$fwcmd add 65435 allow icmp from any to any
-
-# Deny all the rest.
-$fwcmd add 65435 deny log ip from any to any</programlisting>
-
- <para>You now have a fully functional firewall that will allow on
- connections to ports 80 and 22 and will log any other connection
- attempts. Now, you should be able to safely reboot and your firewall
- should come up fine. If you find this incorrect in anyway or experience
- any problems, or have any suggestions to improve this page, please
- email me.</para>
- </sect1>
-
- <sect1>
- <title>Questions</title>
-
- <qandaset>
- <qandaentry>
- <question>
- <para>Why are you using &man.natd.8; and &man.ipfw.8; when
- you could be using the built in &man.ppp.8;
- filters?</para>
- </question>
-
- <answer>
- <para>I'll have to be honest and say there's no definitive
- reason why I use <command>ipfw</command> and
- <command>natd</command> instead of the built in
- <command>ppp</command> filters. From the discussions I've
- had with people the consensus seems to be that while
- <command>ipfw</command> is certainly more powerful and
- more configurable than the <command>ppp</command> filters,
- what it makes up for in functionality it loses in being
- easy to customize. One of the reasons I use it is because
- I prefer firewalling to be done at a kernel level rather
- than by a userland program.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>I get messages like <errorname>limit 100 reached on entry
- 2800</errorname> and after that I never see more denies in my
- logs. Is my firewall still working?</para>
- </question>
-
- <answer>
- <para>This merely means that the maximum logging count for
- the rule has been reached. The rule itself is still
- working, but it will no longer log until such time as you
- reset the logging counters. You can reset the logging
- counters with the <command>ipfw resetlog</command>
- command. Alternatively, you may increase the log limit in
- your kernel configuration with the
- <option>IPFIREWALL_VERBOSE_LIMIT</option> option as
- described above.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>If I'm using private addresses internally, such as in the
- 192.168.0.0 range, could I add a command like <literal>$fwcmd add
- deny all from any to 192.168.0.0:255.255.0.0 via tun0</literal>
- to the firewall rules to prevent outside attempts to connect to
- internal machines?</para>
- </question>
-
- <answer>
- <para>The simple answer is no. The reason for this is that
- <command>natd</command> is doing address translation for
- <emphasis>anything</emphasis> being diverted through the
- <devicename>tun0</devicename> device. As far as it's
- concerned incoming packets will speak only to the
- dynamically assigned IP address and <emphasis>not</emphasis> to the internal
- network. Note though that you can add a rule like
- <literal>$fwcmd add deny all from 192.168.0.4:255.255.0.0
- to any via tun0</literal> which would limit a host on your
- internal network from going out via the firewall.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>There must be something wrong. I followed your instructions
- to the letter and now I am locked out.</para>
- </question>
-
- <answer>
- <para>This tutorial assumes that you are running
- <emphasis>userland-ppp</emphasis>, therefore the supplied ruleset
- operates on the <devicename>tun0</devicename> interface, which
- corresponds to the first connection made with &man.ppp.8; (a.k.a.
- <emphasis>user-ppp</emphasis>). Additional connections would use
- <devicename>tun1</devicename>, <devicename>tun2</devicename> and so
- on.</para>
-
- <para>You should also note that &man.pppd.8; uses the
- <devicename>ppp0</devicename> interface instead, so if you
- start the connection with &man.pppd.8; you must substitute
- <devicename>tun0</devicename> for
- <devicename>ppp0</devicename>. A quick way to edit the
- firewall rules to reflect this change is shown below. The
- original ruleset is backed up as
- <filename>fwrules_tun0</filename>.</para>
-
- <screen> &prompt.user; <userinput>cd /etc/firewall</userinput>
- /etc/firewall&prompt.user; <userinput>su</userinput>
- <prompt>Password:</prompt>
- /etc/firewall&prompt.root; <userinput>mv fwrules fwrules_tun0</userinput>
- /etc/firewall&prompt.root; <userinput>cat fwrules_tun0 | sed s/tun0/ppp0/g > fwrules</userinput>
- </screen>
-
- <para>To know whether you are currently using &man.ppp.8; or
- &man.pppd.8; you can examine the output of
- &man.ifconfig.8; once the connection is up. E.g., for a
- connection made with &man.pppd.8; you would see something
- like this (showing only the relevant lines):</para>
-
- <screen> &prompt.user; <userinput>ifconfig</userinput>
- <emphasis>(skipped...)</emphasis>
- ppp0: flags=<replaceable>8051&lt;UP,POINTOPOINT,RUNNING,MULTICAST&gt; mtu 1524</replaceable>
- inet <replaceable>xxx.xxx.xxx.xxx</replaceable> --&gt; <replaceable>xxx.xxx.xxx.xxx</replaceable> netmask <replaceable>0xff000000</replaceable>
- <emphasis>(skipped...)</emphasis>
- </screen>
-
- <para>On the other hand, for a connection made with
- &man.ppp.8; (<emphasis>user-ppp</emphasis>) you should see
- something similar to this:</para>
-
- <screen> &prompt.user; <userinput>ifconfig</userinput>
- <emphasis>(skipped...)</emphasis>
- ppp0: flags=<replaceable>8010&lt;POINTOPOINT,MULTICAST&gt; mtu 1500</replaceable>
- <emphasis>(skipped...)</emphasis>
- tun0: flags=<replaceable>8051&lt;UP,POINTOPOINT,RUNNING,MULTICAST&gt; mtu 1524</replaceable>
- <emphasis>(IPv6 stuff skipped...)</emphasis>
- inet <replaceable>xxx.xxx.xxx.xxx</replaceable> --&gt; <replaceable>xxx.xxx.xxx.xxx</replaceable> netmask <replaceable>0xffffff00</replaceable>
- Opened by PID <replaceable>xxxxx</replaceable>
- <emphasis>(skipped...)</emphasis></screen>
- </answer>
- </qandaentry>
- </qandaset>
- </sect1>
-</article>
diff --git a/en_US.ISO8859-1/articles/diskless-x/Makefile b/en_US.ISO8859-1/articles/diskless-x/Makefile
deleted file mode 100644
index 886e21cc9d..0000000000
--- a/en_US.ISO8859-1/articles/diskless-x/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-# $FreeBSD$
-
-DOC?= article
-
-FORMATS?= html
-
-INSTALL_COMPRESSED?=gz
-INSTALL_ONLY_COMPRESSED?=
-
-SRCS= article.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/diskless-x/article.sgml b/en_US.ISO8859-1/articles/diskless-x/article.sgml
deleted file mode 100644
index d6a6fd1fde..0000000000
--- a/en_US.ISO8859-1/articles/diskless-x/article.sgml
+++ /dev/null
@@ -1,349 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD: doc/en_US.ISO8859-1/articles/diskless-x/article.sgml,v 1.4 2001/04/17 15:53:37 nik Exp $
--->
-
-<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man;
-]>
-
-<article>
- <articleinfo>
- <title>Diskless X Server: a how to guide</title>
-
- <authorgroup>
- <author>
- <firstname>Jerry</firstname>
- <surname>Kendall</surname>
- <affiliation>
- <address>
- <email>jerry@kcis.com</email>
- </address>
- </affiliation>
- </author></authorgroup>
-
- <pubdate>28-December-1996</pubdate>
-
- <copyright>
- <year>1996</year>
- <holder>Jerry Kendall</holder>
- </copyright>
-
- <abstract>
- <para>With the help of some friends on the FreeBSD-hackers list, I have
- been able to create a diskless X terminal. The creation of the X
- terminal required first creating a diskless system with minimal
- utilities mounted via NFS. These same steps were used to create 2
- separate diskless systems. The first is <hostid
- role="fqdn">altair.kcis.com</hostid>. A diskless X terminal that I
- run on my old 386DX-40. It has a 340Meg hard disk but, I did not want
- to change it. So, it boots from <hostid
- role="fqdn">antares.kcis.com</hostid> across a Ethernet. The second
- system is a 486DX2-66. I setup a diskless FreeBSD (complete) that
- uses no local disk. The server in that case is a Sun 670MP running
- SunOS 4.1.3. The same setup configuration was needed for both.</para>
-
- <para>I am sure that there is stuff that needs to be added
- to this. Please send me any comments.</para>
- </abstract>
- </articleinfo>
-
- <sect1>
- <title>Creating the boot floppy (On the diskless system)</title>
-
- <para>Since the network boot loaders will not work with some of the TSR's
- and such that MS-DOS uses, it is best to create a dedicated boot floppy
- or, if you can, create an MS-DOS menu that will (via the
- <filename>config.sys</filename>/<filename>autoexec.bat</filename> files)
- ask what configuration to load when the system starts. The later is the
- method that I use and it works great. My MS-DOS (6.x) menu is
- below.</para>
-
- <example>
- <title><filename>config.sys</filename></title>
-
- <programlisting>[menu]
-menuitem=normal, normal
-menuitem=unix, unix
-[normal]
-....
-normal config.sys stuff
-...
-[unix]</programlisting>
- </example>
-
- <example>
- <title><filename>autoexec.bat</filename></title>
-
- <programlisting>@ECHO OFF
-goto %config%
-
-:normal
-...
-normal autoexec.bat stuff
-...
-goto end
-
-:unix
-cd \netboot
-nb8390.com
-
-:end</programlisting>
- </example>
- </sect1>
-
- <sect1>
- <title>Getting the network boot programs (On the server)</title>
-
- <para>Compile the 'net-boot' programs that are located in
- <filename>/usr/src/sys/i386/boot/netboot</filename>. You should read
- the comments at the top of the <filename>Makefile</filename>. Adjust as
- required. Make a backup of the original in case it gets foobar'd. When
- the build is done, there should be 2 MS-DOS executables,
- <filename>nb8390.com</filename> and <filename>nb3c509.com</filename>.
- One of these two programs will be what you need to run on the diskless
- server. It will load the kernel from the boot server. At this point,
- put both programs on the MS-DOS boot floppy created earlier.</para>
- </sect1>
-
- <sect1>
- <title>Determine which program to run (On the diskless system)</title>
-
- <para>If you know the chipset that your Ethernet adapter uses, this is
- easy. If you have the NS8390 chipset, or a NS8390 based chipset, use
- <filename>nb8390.com</filename>. If you have a 3Com 509 based chipset,
- use the <filename>nb3C509.com</filename> boot program. If you are not
- sure which you have, try using one, if it says <errorname>No adapter
- found</errorname>, try the other. Beyond that, you are pretty much on
- your own.</para>
- </sect1>
-
- <sect1>
- <title>Booting across the network</title>
-
- <para>Boot the diskless system with out any config.sys/autoexec.bat
- files. Try running the boot program for your Ethernet adapter.</para>
-
- <para>My Ethernet adapter is running in WD8013 16bit mode so I run
- <filename>nb8390.com</filename></para>
-
- <screen><prompt>C:&gt;</prompt> <userinput>cd \netboot</userinput>
-<prompt>C:&gt</prompt> <userinput>nb8390</userinput>
-
-<prompt>Boot from Network (Y/N) ?</prompt> <userinput>Y</userinput>
-
-BOOTP/TFTP/NFS bootstrap loader ESC for menu
-
-Searching for adapter..
-WD8013EBT base 0x0300, memory 0x000D8000, addr 00:40:01:43:26:66
-
-Searching for server...</screen>
-
- <para>At this point, my diskless system is trying to find a machine to act
- as a boot server. Make note of the <literal>addr</literal> line above,
- you will need this number later. Reset the diskless system and modify
- your <filename>config.sys</filename> and
- <filename>autoexec.bat</filename> files to do these steps automatically
- for you. Perhaps in a menu. If you had to run
- <command>nb3c509.com</command> instead of <command>nb8390.com</command>
- the output is the same as above. If you got <errorname>No adapter
- found</errorname> at the <literal>Searching for adapter...</literal>
- message, verify that you did indeed set the compile time defines in the
- <filename>Makefile</filename> correctly.</para>
- </sect1>
-
- <sect1>
- <title>Allowing systems to boot across the network (On the server)</title>
-
- <para>Make sure the <filename>/etc/inetd.conf</filename> file has entries
- for tftp and bootps. Mine are listed below:</para>
-
- <programlisting>tftp dgram udp wait nobody /usr/libexec/tftpd tftpd /tftpboot
-#
-# Additions by who ever you are
-bootps dgram udp wait root /usr/libexec/bootpd bootpd /etc/bootptab</programlisting>
-
- <para>If you have to change the <filename>/etc/inetd.conf</filename> file,
- send a <literal>HUP</literal> signal to inetd. To do this, get the
- process ID of inetd with <command>ps -ax | grep inetd | grep -v
- grep</command>. Once you have it, send it a <literal>HUP</literal> signal. Do this by
- <command>kill -HUP &lt;pid&gt;</command>. This will force inetd to
- re-read its config file.</para>
-
- <para>Did you remember to note the <literal>addr</literal> line from the
- output of the boot loader on the diskless system? Guess what, here is
- where you need it.</para>
-
- <para>Add an entry to <literal>/etc/bootptab</literal> (maybe creating the
- file). It should be laid out identical to this:</para>
-
- <programlisting>altair:\
- :ht=ether:\
- :ha=004001432666:\
- :sm=255.255.255.0:\
- :hn:\
- :ds=199.246.76.1:\
- :ip=199.246.76.2:\
- :gw=199.246.76.1:\
- :vm=rfc1048:</programlisting>
-
- <para>The lines are as follows:</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <tbody>
- <row>
- <entry><literal>altair</literal></entry>
- <entry>the diskless systems name without the domain name.</entry>
- </row>
-
- <row>
- <entry><literal>ht=ether</literal></entry>
- <entry>the hardware type of 'ethernet'.</entry>
- </row>
-
- <row>
- <entry><literal>ha=004001432666</literal></entry>
- <entry>the hardware address (the number noted above).</entry>
- </row>
-
- <row>
- <entry><literal>sm=255.255.255.0</literal></entry>
- <entry>the subnet mask.</entry>
- </row>
-
- <row>
- <entry><literal>hn</literal></entry>
- <entry>tells server to send client's hostname to the
- client.</entry>
- </row>
-
- <row>
- <entry><literal>ds=199.246.76.1</literal></entry>
- <entry>tells the client who the domain server is.</entry>
- </row>
-
- <row>
- <entry><literal>ip=199.246.76.2</literal></entry>
- <entry>tells the client what it's IP address is.</entry>
- </row>
-
- <row>
- <entry><literal>gw=199.246.76.1</literal></entry>
- <entry>tells the client what the default gateway is.</entry>
- </row>
-
- <row>
- <entry><literal>vm=...</literal></entry>
- <entry>just leave it there.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <note>
- <para>Be sure to setup the IP addresses correctly, the addresses above
- are my own.</para>
- </note>
-
- <para>Create the directory <filename>/tftpboot</filename> on the server it will contain the
- configuration files for the diskless systems that the server will serve.
- These files will be named <filename>cfg.<replaceable>ip</replaceable></filename> where <replaceable>ip</replaceable> is the IP
- address of the diskless system. The config file for <hostid>altair</hostid> is
- <filename>/tftpboot/cfg.199.246.76.2</filename>. The contents is:</para>
-
- <programlisting>rootfs 199.246.76.1:/DiskLess/rootfs/altair
-hostname altair.kcis.com</programlisting>
-
- <para>The line <literal>hostname altair.kcis.com</literal> simply tells
- the diskless system what its fully qualified domain name is.</para>
-
- <para>The line <literal>rootfs
- 199.246.76.1:/DiskLess/rootfs/altair</literal> tells the diskless
- system where its NFS mountable root filesystem is located.</para>
-
- <note>
- <para>The NFS mounted root filesystem will be mounted <emphasis>read
- only</emphasis>.</para>
- </note>
-
- <para>The hierarchy for the diskless system can be re-mounted allowing
- read-write operations if required.</para>
-
- <para>I use my spare 386DX-40 as a dedicated X terminal.</para>
-
- <para>The hierarchy for <hostid>altair</hostid> is:</para>
-
- <literallayout>/
-/bin
-/etc
-/tmp
-/sbin
-/dev
-/dev/fd
-/usr
-/var
-/var/run</literallayout>
-
- <para>The actual list of files is:</para>
-
- <screen>-r-xr-xr-x 1 root wheel 779984 Dec 11 23:44 ./kernel
--r-xr-xr-x 1 root bin 299008 Dec 12 00:22 ./bin/sh
--rw-r--r-- 1 root wheel 499 Dec 15 15:54 ./etc/rc
--rw-r--r-- 1 root wheel 1411 Dec 11 23:19 ./etc/ttys
--rw-r--r-- 1 root wheel 157 Dec 15 15:42 ./etc/hosts
--rw-r--r-- 1 root bin 1569 Dec 15 15:26 ./etc/XF86Config.altair
--r-x------ 1 bin bin 151552 Jun 10 1995 ./sbin/init
--r-xr-xr-x 1 bin bin 176128 Jun 10 1995 ./sbin/ifconfig
--r-xr-xr-x 1 bin bin 110592 Jun 10 1995 ./sbin/mount_nfs
--r-xr-xr-x 1 bin bin 135168 Jun 10 1995 ./sbin/reboot
--r-xr-xr-x 1 root bin 73728 Dec 13 22:38 ./sbin/mount
--r-xr-xr-x 1 root wheel 1992 Jun 10 1995 ./dev/MAKEDEV.local
--r-xr-xr-x 1 root wheel 24419 Jun 10 1995 ./dev/MAKEDEV</screen>
-
- <para>Don't forget to run <command>MAKEDEV all</command> in the
- <filename>dev</filename> directory.</para>
-
- <para>My <filename>/etc/rc</filename> for <hostid>altair</hostid>
- is:</para>
-
-<programlisting>#!/bin/sh
-#
-PATH=/bin:/
-export PATH
-#
-# configure the localhost
-/sbin/ifconfig lo0 127.0.0.1
-#
-# configure the ethernet card
-/sbin/ifconfig ed0 199.246.76.2 netmask 0xffffff00
-#
-# mount the root filesystem via NFS
-/sbin/mount antares:/DiskLess/rootfs/altair /
-#
-# mount the /usr filesystem via NFS
-/sbin/mount antares:/DiskLess/usr /usr
-#
-/usr/X11R6/bin/XF86_SVGA -query antares -xf86config /etc/XF86Config.altair > /dev/null 2>&1
-#
-# Reboot after X exits
-/sbin/reboot
-#
-# We blew up....
-exit 1</programlisting>
-
- <para>Any comments and all questions welcome.</para>
- </sect1>
-</article>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- End:
--->
diff --git a/en_US.ISO8859-1/articles/explaining-bsd/Makefile b/en_US.ISO8859-1/articles/explaining-bsd/Makefile
deleted file mode 100644
index 3893643f3e..0000000000
--- a/en_US.ISO8859-1/articles/explaining-bsd/Makefile
+++ /dev/null
@@ -1,23 +0,0 @@
-#
-# $FreeBSD: doc/en_US.ISO_8859-1/articles/freebsd-questions/Makefile,v 1.1 2001/02/16 00:22:33 nik Exp $
-#
-
-MAINTAINER=grog@FreeBSD.org
-
-DOC?= article
-
-FORMATS?= html
-
-INSTALL_COMPRESSED?= gz
-INSTALL_ONLY_COMPRESSED?=
-
-#
-# SRCS lists the individual SGML files that make up the document. Changes
-# to any of these files will force a rebuild
-#
-
-# SGML content
-SRCS= article.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/explaining-bsd/article.sgml b/en_US.ISO8859-1/articles/explaining-bsd/article.sgml
deleted file mode 100644
index 6bbf269ebd..0000000000
--- a/en_US.ISO8859-1/articles/explaining-bsd/article.sgml
+++ /dev/null
@@ -1,545 +0,0 @@
-<!-- $FreeBSD$ -->
-<!-- The FreeBSD Documentation Project -->
-
-<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man;
-]>
-
-<article>
- <articleinfo>
- <title>Explaining BSD</title>
-
- <author>
- <firstname>Greg</firstname>
- <surname>Lehey</surname>
-
- <affiliation>
- <address><email>grog@FreeBSD.org</email></address>
- </affiliation>
- </author>
-
- <abstract>
- <para>In the open source world, the word <quote>Linux</quote> is almost
- synonymous with <quote>Operating System</quote>, but it's not the only
- open source <trademark>UNIX</trademark> operating system. According
- to the <ulink
- url="http://www.leb.net/hzo/ioscount/data/r.9904.txt">Internet
- Operating System Counter</ulink>, as of April 1999 31.3% of the
- world's network connected machines run Linux. 14.6% run BSD UNIX.
- Some of the world's largest web operations, such as <ulink
- url="http://www.yahoo.com">Yahoo!</ulink>, run BSD. The world's
- busiest FTP server, <ulink
- url="ftp://ftp.cdrom.com">ftp.cdrom.com</ulink>, uses BSD to
- transfer 1.4 TB of data a day. Clearly this is not a niche
- market: BSD is a well-kept secret.</para>
-
- <para>So what's the secret? Why isn't BSD better known? This white
- paper addresses these and other questions.</para>
-
- <para>Throughout this paper, differences between BSD and Linux will be
- noted <emphasis>like this</emphasis>.</para>
- </abstract>
- </articleinfo>
-
- <sect1>
- <title>What is BSD?</title>
-
- <para>BSD stands for <quote>Berkeley Software Distribution</quote>. It is
- the name of distributions of source code from the University of
- California, Berkeley, which were originally extensions to AT&amp;T's
- Research UNIX operating system. Several open source operating system
- projects are based on a release of this source code known as
- 4.4BSD-Lite. In addition, they comprise a number of packages from other
- Open Source projects, including notably the GNU project. The overall
- operating system comprises:</para>
-
- <itemizedlist>
- <listitem>
- <para>The BSD kernel, which handles process scheduling, memory
- management, symmetric multi-processing (SMP), device drivers,
- etc.</para>
-
- <para><emphasis>Unlike the Linux kernel, there are several different
- BSD kernels with differing capabilities.</emphasis></para>
- </listitem>
-
- <listitem>
- <para>The C library, the base API for the system.</para>
-
- <para><emphasis>The BSD C library is based on code from Berkeley, not
- the GNU project.</emphasis></para>
- </listitem>
-
- <listitem>
- <para>Utilities such as shells, file utilities, compilers and
- linkers.</para>
-
- <para><emphasis>Some of the utilities are derived from the GNU
- project, others are not.</emphasis></para>
- </listitem>
-
- <listitem>
- <para>The X Window system, which handles graphical display.</para>
-
- <para>The X Window system used in most versions of BSD is maintained
- by a separate project, the
- <ulink url="http://www.XFree86.org/">XFree86 project</ulink>.
- This is the same code as Linux uses. BSD does not normally
- specify a <quote>graphical desktop</quote> such as GNOME or KDE,
- though these are available.</para>
- </listitem>
-
- <listitem>
- <para>Many other programs and utilities.</para>
- </listitem>
- </itemizedlist>
- </sect1>
-
- <sect1>
- <title>What, a real UNIX?</title>
-
- <para>The BSD operating systems are not clones, but open source
- derivatives of AT&amp;T's Research UNIX operating system, which is also
- the ancestor of the modern UNIX System V. This may surprise you. How
- could that happen when AT&amp;T has never released its code as open
- source?</para>
-
- <para>It's true that AT&amp;T UNIX is not open source, and in a copyright
- sense BSD is very definitely <emphasis>not</emphasis> UNIX, but on the
- other hand, AT&amp;T has imported sources from other projects,
- noticeably the Computer Sciences Research Group of the University of
- California in Berkeley, CA. Starting in 1976, the CSRG started
- releasing tapes of their software, calling them <emphasis>Berkeley
- Software Distribution</emphasis> or <emphasis>BSD</emphasis>.</para>
-
- <para>Initial BSD releases consisted mainly of user programs, but that
- changed dramatically when the CSRG landed a contract with the Defense
- Advanced Projects Research Agency (DARPA) to upgrade the communications
- protocols on their network, ARPANET. The new protocols were known as
- the <emphasis>Internet Protocols</emphasis>, later
- <emphasis>TCP/IP</emphasis> after the most important protocols. The
- first widely distributed implementation was part of 4.2BSD, in
- 1982.</para>
-
- <para>In the course of the 1980s, a number of new workstation companies
- sprang up. Many preferred to license UNIX rather than developing
- operating systems for themselves. In particular, Sun Microsystems
- licensed UNIX and implemented a version of 4.2BSD, which they called
- SunOS. When AT&amp;T themselves were allowed to sell UNIX commercially,
- they started with a somewhat bare-bones implementation called System
- III, to be quickly followed by System V. The System V code base did not
- include networking, so all implementations included additional software
- from the BSD, including the TCP/IP software, but also utilities such as
- the <emphasis>csh</emphasis> shell and the <emphasis>vi</emphasis>
- editor. Collectively, these enhancements were known as the
- <emphasis>Berkeley Extensions</emphasis>.</para>
-
- <para>The BSD tapes contained AT&amp;T source code and thus required a
- UNIX source license. By 1990, the CSRG's funding was running out, and
- it faced closure. Some members of the group decided to release the BSD
- code, which was Open Source, without the AT&amp;T proprietary code.
- This finally happened with the <emphasis>Networking Tape 2</emphasis>,
- usually known as <emphasis>Net/2</emphasis>. Net/2 was not a complete
- operating system: about 20% of the kernel code was missing. One of the
- CSRG members, William F. Jolitz, wrote the remaining code and released
- it in early 1992 as <emphasis>386BSD</emphasis>. At the same time,
- another group of ex-CSRG members formed a commercial company called
- <ulink url="http://www.bsdi.com">Berkeley Software Design Inc.</ulink>
- and released a beta version of an operating system called
- <ulink url="http://www.bsdi.com">BSD/386</ulink>, which was based on
- the same sources. The name of the operating system has since changed
- to BSD/OS.</para>
-
- <para>386BSD never became a stable operating system. Instead, two other
- projects split off from it in 1993:
- <ulink url="http://www.NetBSD.org">NetBSD</ulink> and
- <ulink url="http://www.FreeBSD.org">FreeBSD</ulink>. The two projects
- originally diverged due to differences in patience waiting for
- improvements to 386BSD: the NetBSD people started early in the year,
- and the first version of FreeBSD wasn't ready until the end of the
- year. In the meantime, the code base had diverged sufficiently to
- make it difficult to merge. In addition, the projects had different
- aims, as we'll see below. In 1996, a further project,
- <ulink url="http://www.OpenBSD.org">OpenBSD</ulink>, split off from
- NetBSD.</para>
- </sect1>
-
- <sect1>
- <title>Why isn't BSD better known?</title>
-
- <para>For a number of reasons, BSD is relatively unknown:</para>
-
- <orderedlist>
- <listitem>
- <para>The BSD developers are often more interested in polishing their
- code than marketing it.</para>
- </listitem>
-
- <listitem>
- <para>Much of Linux's popularity is due to factors external to the
- Linux projects, such as the press, and to companies formed to
- provide Linux services. Until recently, the open source BSDs had no
- such proponents.</para>
- </listitem>
-
- <listitem>
- <para>BSD developers tend to be more experienced than Linux
- developers, and have less interest in making the system easy to use.
- Newcomers tend to feel more comfortable with Linux.</para>
- </listitem>
-
- <listitem>
- <para>In 1992, AT&amp;T sued
- <ulink url="http://www.bsdi.com">BSDI</ulink>,
- the vendor of BSD/386, alleging that the product contained
- AT&amp;T-copyrighted code. The case was settled out of court in
- 1994, but the spectre of the litigation continues to haunt people.
- As recently as March 2000 an article published on the web claimed
- that the court case had been <quote>recently settled</quote>.</para>
-
- <para>One detail that the lawsuit did clarify is the naming: in the
- 1980s, BSD was known as <quote>BSD UNIX</quote>. With the
- elimination of the last vestige of AT&amp;T code from BSD, it
- also lost the right to the name UNIX. Thus you will see
- references in book titles to <quote>the 4.3BSD UNIX operating
- system</quote> and <quote>the 4.4BSD operating
- system</quote>.</para>
- </listitem>
-
- <listitem>
- <para>There is a perception that the BSD projects are fragmented and
- belligerent. The
- <ulink url="http://interactive.wsj.com/bin/login?Tag=/&amp;URI=/archive/retrieve.cgi%253Fid%253DSB952470579348918651.djm&">Wall Street
- Journal</ulink> spoke of <quote>balkanization</quote> of the
- BSD projects. Like the law suit, this perception bases mainly
- on ancient history.</para>
- </listitem>
- </orderedlist>
- </sect1>
-
- <sect1>
- <title>Comparing BSD and Linux</title>
-
- <para>So what's really the difference between, say, Debian Linux and
- FreeBSD? For the average user, the difference is surprisingly small:
- Both are UNIX-like operating systems. Both are developed by
- non-commercial projects (this doesn't apply to many other Linux
- distributions, of course). In the following section, we'll look at BSD
- and compare it to Linux. The description applies most closely to
- FreeBSD, which accounts for an estimated 80% of the BSD installations,
- but the differences from NetBSD and OpenBSD are small.</para>
-
- <sect2>
- <title>Who owns BSD?</title>
-
- <para>No one person or corporation owns BSD. It is created and
- distributed by a community of highly technical and committed
- contributors all over the world. Some of the components of BSD are
- Open Source projects managed by a different project maintainer.</para>
- </sect2>
-
- <sect2>
- <title>How is BSD developed and updated?</title>
-
- <para>The BSD kernels are developed and updated following the Open
- Source development model. Each project maintains a publicly
- accessible <emphasis>source tree</emphasis> under the
- <ulink url="http://www.sourcegear.com/CVS">Concurrent Versions
- System</ulink> (CVS), which contains all source files for the
- project, including documentation and other incidental files. CVS
- allows users to <quote>check out</quote> (in other words, to
- extract a copy of) any desired version of the system.</para>
-
- <para>A large number of developers worldwide contribute to improvements
- to BSD. They are divided into three kinds:</para>
-
- <itemizedlist>
- <listitem>
- <para><firstterm>Contributors</firstterm> write code or documentation.
- They are not permitted to commit (add code) directly to the source
- tree. In order for their code to be included in the system, it
- must be reviewed and checked in by a registered developer, known
- as a <emphasis>committer</emphasis>.</para>
- </listitem>
-
- <listitem>
- <para><firstterm>Committers</firstterm> are developers with write
- access to the source tree. In order to become a committer, an
- individual must show ability in the area in which he is
- active.</para>
-
- <para>
- It is at the individual committer's discretion whether he should
- obtain authority before committing changes to the source tree. In
- general, an experienced committer may make changes which are
- obviously correct without obtaining consensus. For example, a
- documentation project committer may correct typographical or
- grammatical errors without review. On the other hand, developers
- making far-reaching or complicated changes are expected to submit
- their changes for review before committing them. In extreme
- cases, a core team member with a function such as Principal
- Architect may order that changes be removed from the tree, a
- process known as <firstterm>backing out</firstterm>. All committers
- receive mail describing each individual commit, so it is not
- possible to commit secretly.</para>
- </listitem>
-
- <listitem>
- <para>The <firstterm>Core team</firstterm>. FreeBSD and
- NetBSD each have a core team which manages the project. The
- core teams developed in the course of the projects, and their role
- is not always well-defined. It is not necessary to be a developer
- in order to be a core team member, though it is normal. The rules
- for the core team vary from one project to the other, but in
- general they have more say in the direction of the project than
- non-core team members have.</para>
- </listitem>
- </itemizedlist>
-
- <para>This arrangement differs from Linux in a number of ways:</para>
-
- <orderedlist>
- <listitem>
- <para>No one person controls the content of the system. In
- practice, this difference is overrated, since the Chief Architect
- can require that code be backed out, and even in the Linux project
- several people are permitted to make changes.</para>
- </listitem>
-
- <listitem>
- <para>On the other hand, there <emphasis>is</emphasis> a central
- repository, a single place where you can find the entire operating
- system sources, including all older versions.</para>
- </listitem>
-
- <listitem>
- <para>BSD projects maintain the entire <quote>Operating
- System</quote>, not only the kernel. This distinction is only
- marginally useful: neither BSD nor Linux is useful without
- applications. The applications used under BSD are frequently the
- same as the applications used under Linux.</para>
- </listitem>
-
- <listitem>
- <para>As a result of the formalized maintenance of a single CVS
- source tree, BSD development is clear, and it is possible to
- access any version of the system by release number or by date.
- CVS also allows incremental updates to the system: for example,
- the FreeBSD repository is updated about 100 times a day. Most of
- these changes are small.</para>
- </listitem>
- </orderedlist>
- </sect2>
-
- <sect2>
- <title>BSD releases</title>
-
- <para>Each BSD project provides the system in three different
- <quote>releases</quote>. As with Linux, releases are assigned a
- number such as 1.4.1 or 3.5. In addition, the version number has a
- suffix indicating its purpose:</para>
-
- <orderedlist>
- <listitem>
- <para>The development version of the system is called
- <firstterm>CURRENT</firstterm>. FreeBSD assigns a number to
- CURRENT, for example FreeBSD 5.0-CURRENT. NetBSD uses a slightly
- different naming scheme and appends a single-letter suffix which
- indicates changes in the internal interfaces, for example NetBSD
- 1.4.3G. OpenBSD does not assign a number ("OpenBSD-current").
- All new development on the system goes into this branch.</para>
- </listitem>
-
- <listitem>
- <para>At regular intervals, between two and four times a year, the
- projects bring out a <firstterm>RELEASE</firstterm> version of the
- system, which is available on CD-ROM and for free download from
- FTP sites, for example OpenBSD 2.6-RELEASE or NetBSD 1.4-RELEASE.
- The RELEASE version is intended for end users and is the normal
- version of the system. NetBSD also provides <emphasis>patch
- releases</emphasis> with a third digit, for example NetBSD
- 1.4.2.</para>
- </listitem>
-
- <listitem>
- <para>As bugs are found in a RELEASE version, they are fixed, and
- the fixes are added to the CVS tree. In FreeBSD, the resultant
- version is called the <firstterm>STABLE</firstterm> version, while in NetBSD and OpenBSD
- it continues to be called the RELEASE version. Smaller new
- features can also be added to this branch after a period of test
- in the CURRENT branch.</para>
- </listitem>
- </orderedlist>
-
- <para><emphasis>By contrast, Linux maintains two separate code trees:
- the stable version and the development version. Stable versions
- have an even minor version number, such as 2.0, 2.2 or 2.4.
- Development versions have an odd minor version number, such as 2.1,
- 2.3 or 2.5. In each case, the number is followed by a further
- number designating the exact release. In addition, each vendor adds
- their own userland programs and utilities, so the name of the
- distribution is also important. Each distribution vendor also
- assigns version numbers to the distribution, so a complete
- description might be something like <quote>TurboLinux 6.0 with kernel
- 2.2.14</quote></emphasis></para>
- </sect2>
-
- <sect2>
- <title>What versions of BSD are available?</title>
-
- <para>In contrast to the numerous Linux distributions, there are only
- three open source BSDs. Each BSD project maintains its own source
- tree and its own kernel. In practice, though, there appear to be
- fewer divergences between the userland code of the projects than there
- is in Linux.</para>
-
- <para>It's difficult to categorize the goals of each project: the
- differences are very subjective. Basically,</para>
-
- <itemizedlist>
- <listitem>
- <para>FreeBSD aims for high performance and ease of use by
- end users, and is a favourite of web content providers. It runs
- on PCs and Compaq's Alpha processors. The FreeBSD project has
- significantly more users than the other projects.</para>
- </listitem>
-
- <listitem>
- <para>NetBSD aims for maximum portability: <quote>of course it runs
- NetBSD</quote>. It runs on machines from palmtops to large
- servers, and has even been used on NASA space missions. It is a
- particularly good choice for running on old non-Intel
- hardware.</para>
- </listitem>
-
- <listitem>
- <para>OpenBSD aims for security and code purity: it uses a
- combination of the open source concept and rigorous code reviews
- to create a system which is demonstrably correct, making it the
- choice of security-conscious organizations such as banks, stock
- exchanges and US Government departments. Like NetBSD, it runs on
- a number of platforms.</para>
- </listitem>
- </itemizedlist>
-
- <para>There are also two additional BSD operating systems which are not
- open source, BSD/OS and Apple's Mac OS X:</para>
-
- <itemizedlist>
- <listitem>
- <para>BSD/OS is the oldest of the 4.4BSD derivatives. It
- is not open source, though source code licenses are available at
- relatively low cost. It resembles FreeBSD in many ways.</para>
- </listitem>
-
- <listitem>
- <para><ulink url="http://www.apple.com/macosx/server/">Mac OS
- X</ulink> is the latest version of the operating system for
- <ulink url="http://www.apple.com">Apple Computer Inc.'s</ulink>
- Macintosh line. Unlike the rest of the operating system, the
- kernel is open source. As part of this development, key Apple
- developers have commit access to the FreeBSD source tree.</para>
- </listitem>
- </itemizedlist>
- </sect2>
-
- <sect2>
- <title>How does the BSD license differ from the GNU Public
- license?</title>
-
- <para>Linux is available under the
- <ulink url="http://www.fsf.org/copyleft/gpl.html">GNU General Public
- License</ulink> (GPL), which is designed to eliminate closed
- source software. In particular, any derivative work of a product
- released under the GPL must also be supplied with source code if
- requested. By contrast, the
- <ulink url="http://www.opensource.org/licenses/bsd-license.html">BSD
- license</ulink> is less restrictive: binary-only distributions are
- allowed. This is particularly attractive for embedded
- applications.</para>
- </sect2>
-
- <sect2>
- <title>What else should I know?</title>
-
- <para>Since fewer applications are available for BSD than Linux, the BSD
- developers created a Linux compatibility package, which allows Linux
- programs to run under BSD. The package includes both kernel
- modifications, in order to correctly perform Linux system calls, and
- Linux compatibility files such as the C library. There is no
- noticeable difference in execution speed between a Linux application
- running on a Linux machine and a Linux application running on a BSD
- machine of the same speed.</para>
-
- <para>The <quote>all from one supplier</quote> nature of BSD means that
- upgrades are much easier to handle than is frequently the case with
- Linux. BSD handles library version upgrades by providing
- compatibility modules for earlier library versions, so it is possible
- to run binaries which are several years old with no problems.</para>
- </sect2>
-
- <sect2>
- <title>Which should I use, BSD or Linux?</title>
-
- <para>What does this all mean in practice? Who should use BSD, who
- should use Linux?</para>
-
- <para>This is a very difficult question to answer. Here are some
- guidelines:</para>
-
- <itemizedlist>
- <listitem>
- <para><quote>If it ain't broke, don't fix it</quote>: If you already
- use an open source operating system, and you are happy with it,
- there's probably no good reason to change.</para>
- </listitem>
-
- <listitem>
- <para>BSD systems, in particular FreeBSD, can have notably higher
- performance than Linux. But this isn't across the board. In many
- cases, there is little or no difference in performance. In some
- cases, Linux may perform better than FreeBSD.</para>
- </listitem>
-
- <listitem>
- <para>In general, BSD systems have a better reputation for
- reliability, mainly as a result of the more mature code
- base.</para>
- </listitem>
-
- <listitem>
- <para>The BSD license may be more attractive than the GPL.</para>
- </listitem>
-
- <listitem>
- <para>BSD can execute Linux code, while Linux can't execute BSD
- code. As a result, more software is available for BSD than for
- Linux.</para>
- </listitem>
- </itemizedlist>
- </sect2>
-
- <sect2>
- <title>Who provides support, service, and training for BSD?</title>
-
- <para>BSDi have always supported BSD/OS, and they have recently
- announced support contracts for FreeBSD.</para>
-
- <para>In addition, each of the projects has a list of consultants for
- hire:
- <ulink url="http://www.freebsd.org/commercial/consulting_bycat.html">FreeBSD</ulink>,
- <ulink url="http://www.netbsd.org/gallery/consultants.html">NetBSD</ulink>,
- and <ulink url="http://www.openbsd.org/support.html">OpenBSD</ulink>.</para>
- </sect2>
- </sect1>
-</article>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- End:
--->
diff --git a/en_US.ISO8859-1/articles/filtering-bridges/Makefile b/en_US.ISO8859-1/articles/filtering-bridges/Makefile
deleted file mode 100644
index 7a18da1228..0000000000
--- a/en_US.ISO8859-1/articles/filtering-bridges/Makefile
+++ /dev/null
@@ -1,13 +0,0 @@
-
-DOC?= article
-
-FORMATS?= html
-
-INSTALL_COMPRESSED?=gz
-INSTALL_ONLY_COMPRESSED?=
-
-SRCS= article.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/filtering-bridges/article.sgml b/en_US.ISO8859-1/articles/filtering-bridges/article.sgml
deleted file mode 100644
index ae360c94fb..0000000000
--- a/en_US.ISO8859-1/articles/filtering-bridges/article.sgml
+++ /dev/null
@@ -1,356 +0,0 @@
-<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man;
-]>
-
-<article>
- <articleinfo>
- <title>Filtering Bridges</title>
-
- <authorgroup>
- <author>
- <firstname>Nick</firstname>
- <surname>Sayer</surname>
-
- <affiliation>
- <address><email>nsayer@FreeBSD.org</email></address>
- </affiliation>
- </author>
- </authorgroup>
-
- <pubdate>$FreeBSD: doc/en_US.ISO8859-1/articles/filtering-bridges/article.sgml,v 1.1 2001/06/25 15:04:01 nik Exp $</pubdate>
-
- <abstract>
- <para>For those of you who don't know, DSL differs from more traditional
- connectivity methods in that the "connectivity spigot" that comes
- out of the wall has no possibility for packet filtering. If you get
- a T1 line or some such it will come with a router that can generally
- include a packet filter. If you get ISDN or a dialup link, you also
- either have a software routing component (a PPP daemon, specifically)
- that can do some filtering or can be combined with a filter on the
- machine running the link. But with DSL you only get a little white
- box with some Blinkenlights on it and an Ethernet port that takes
- your traffic back and forth from the Internet and nothing else (to
- some extent the same can be said of other mass-market high speed
- connectivity methods, like cable modems or high speed wireless links
- as well. The same technique I plan to describe works just as well
- for them, or for any other technology that provides an Ethernet
- port with no filtering).</para>
- </abstract>
- </articleinfo>
-
- <sect1 id="filtering-bridges-why">
- <title>Why use a filtering bridge?</title>
-
- <para>Bridging is not the only conceivable option. It is possible to
- set up a two Ethernet machine as a router instead of a bridge.
- Where it is possible to do so, it is actually a better idea.
- Bridges run their interfaces in promiscuous mode, meaning they
- must process every packet presented to them. The problem is
- that routers can only route traffic between different subnets.
- Also, subnets can only be made by by cutting an existing space in
- half or defining a new space that is typically unroutable (see
- <ulink url="ftp://nis.nsf.net/internet/documents/rfc/rfc1918.txt">RFC 1918</ulink>).
- This wastes half of the useful addresses (or at least puts
- them on the "wrong" side of the router -- the thing that is
- doing the packet filtering that makes the inside network safe).
- Using a bridge costs some CPU cycles, but makes all of the
- problems of adding a 2nd router go away.</para>
- </sect1>
-
- <sect1 id="filtering-bridges-kernel">
- <title>Configuring a Kernel</title>
-
- <important>
- <para>After configuring and installing a kernel as shown here, you
- should carry out the other
- <link linkend="filtering-bridges-finalprep">final preperation</link>
- tasks <emphasis>before</emphasis> booting into your new kernel.</para>
- </important>
-
- <para>Adding bridging to a FreeBSD machine is not hard to do. It means
- having 2 (or more, but we'll just use 2 here) Ethernet cards and adding
- a couple of lines to the kernel configuration. Since May of 2000,
- RELENG_4 and -current have had bridging support for all Ethernet
- interfaces. This does not mean that any Ethernet interface will work.
- For them to work, they have to support a working promiscuous mode for
- both reception and transmition -- that is, they have to be able to
- transmit Ethernet packets with any source address, not just their own.
- In order to get good throughput, the cards should also be PCI bus
- mastering cards. The best choices still are the Intel EtherExpress Pro
- 100 cards, with 3com 3c9xx cards being second.</para>
-
- <para>So you will want to add the following to your kernel configuration
- file:</para>
-
- <programlisting>device fxp (or whatever is appropriate for the cards you're using)
-options BRIDGE
-options IPFIREWALL
-options IPFIREWALL_VERBOSE</programlisting>
-
- <para>Note that recent versions of FreeBSD support dynamically loading the
- IP Firewall code into the kernel. You can't do this, however, with
- bridging, as the bridge code itself needs to interact with IPFIREWALL
- in a special way.</para>
-
- <para>It is also a good idea at this point to see if Luigi has updated
- versions of the bridge code available that are more recent than what is
- in the distribution. As an example, 3.3-RELEASE comes with 981214, but
- as of this writing, the most up-to-date bridge code is 990810. You can
- fetch the latest version from
- <ulink url="http://www.iet.unipi.it/~luigi/">http://www.iet.unipi.it/~luigi/</ulink>. You will want to fetch <filename>bridge.c</filename> and <filename>bridge.h</filename> and drop them into <filename>sys/net/</filename>.</para>
-
- <para>For instructions on how to build and install a new kernel, refer to
- the
- <ulink url="http://www.FreeBSD.org/handbook/kernelconfig-building.html">Building and Installing a Custom Kernel</ulink> section of the handbook</para>
- </sect1>
-
- <sect1 id="filtering-bridges-finalprep">
- <title>Final Preperation</title>
-
- <para>Before you boot the new kernel, you must make some preparations in
- <filename>rc.boot</filename> and <filename>rc.firewall</filename>. The
- default rule for the firewall is to drop all packets on the floor. You
- will want to override this by setting up the 'open' firewall in
- <filename>/etc/rc.conf</filename>. Put these lines in
- <filename>/etc/rc.conf</filename> to achieve this:</para>
-
-<programlisting>firewall_enable="YES"
-firewall_type="open"</programlisting>
-
- <para>There is one more thing that is necessary. When running IP over
- Ethernet, there are actually two Ethernet protocols in use. One
- is IP, the other is ARP. ARP is used when a machine must figure out
- what Ethernet address coresponds to a given IP address. ARP is not
- a part of the IP layer, since it only applies to IP when run over
- Ethernet. The standard ipfirewall rule for the open firewall is</para>
-
- <programlisting>pass ip from any to any</programlisting>
-
- <para>but what about ARP? If ARP is not passed, no IP traffic can flow at
- all. But IPFIREWALL has no provisions for dealing with non-IP
- protocols, and that includes ARP. Fortunately, a hackish extension was
- made to the ipfirewall code to assist filtering bridges. If you set up
- a special rule for UDP packets from IP address
- <hostid role="ipaddr">0.0.0.0</hostid>, the UDP port number will be used
- to match the Ethernet protocol number for bridged packets. In this way
- your bridge can be configured to pass or reject non IP protocols. So add
- this line just below the two lines near the top of
- <filename>/etc/rc.firewall</filename> that deal with
- <devicename>lo0</devicename> (the ones that say that you should almost
- never change those two rules).</para>
-
- <programlisting>${fwcmd} add allow udp from 0.0.0.0 2054 to 0.0.0.0</programlisting>
-
- <para>This rule makes almost no sense at all from a normal perspective on
- IPFIREWALL, but the bridge code will use it to pass ARP packets without
- restriction (which you almost certainly want to do).</para>
-
- <para>Now you should be able to reboot your machine and have it act no
- differently than it did before. There will be some new boot messages
- about bridging, but the bridging will not be enabled. If there are any
- problems, you should try and sort them out at this point before
- proceeding.</para>
- </sect1>
-
- <sect1 id="filtering-bridges-enabling">
- <title>Enabling The Bridge</title>
-
- <para>Next, you should do this:</para>
-
- <screen>&prompt.root; <userinput>sysctl -w net.link.ether.bridge_ipfw=1</userinput>
-&prompt.root; <userinput>sysctl -w net.link.ether.bridge=1</userinput></screen>
-
- <para>At this point, the bridge should be enabled, and because of the
- previous changes to <filename>/etc/rc.conf</filename>, the firewall
- should be wide open. At this point, you should be able to insert the
- machine between two sets of hosts and go back and forth without
- difficulty. If so, the next step is to add those two sysctl lines to
- either <filename>/etc/rc.local</filename> or add the net.link.[blah
- blah]=1 portions of the lines to <filename>/etc/sysctl.conf</filename>
- (which path you take depends on what version of FreeBSD you
- have).</para>
-
- <para>Now before we started all of this, you should have had a machine
- with two Ethernet interfaces, but with only one of them configured. That
- is, there should only be one ifconfig line
- <filename>/etc/rc.conf</filename>. With the bridge in place, that is
- still true. But there is a detail that deserves some thought. The
- bridge is not in place by default. That means that until the sysctls
- are run that turn the bridge on, rather late in the startup, it is still
- an ordinary machine with two interfaces, only one of which is configured
- by <filename>/etc/rc.conf</filename>. This becomes important for those
- portions of the startup that require network access, say for DNS
- resolution. Some care must be made in picking which interface is going
- to be the configured one. In most cases, you are best to pick the
- "outside" one (that is, the interface connected to the Internet). Let's
- presume for the sake of the examples to come, that
- <devicename>fxp0</devicename> is the "outside" interface, and
- <devicename>fxp1</devicename> is the "inside" one. That means that fxp0
- should be mentioned in <filename>/etc/rc.conf</filename>'s ifconfig
- sections, but <devicename>fxp1</devicename> should not be. The sysctl
- that turns the bridge on will make <devicename>fxp1</devicename> start
- working automagically.</para>
- </sect1>
-
- <sect1 id="filtering-bridges-ipfirewall">
- <title>Configuring The Firewall</title>
-
- <para>Now it is time to start adding ipfirewall rules to secure the inside
- network. There are some complications in doing this because not all of
- the ipfirewall functionality is available on bridged packets. Also,
- there is a difference between packets that are in the process of being
- bridged and packets that are being received by the local machine. In
- general, packets being bridged are only run through ipfirewall once, not
- twice as is usually the case. Bridged packets are filtered while they
- are being received, so rules that use 'out' or 'xmit' will never match.
- I usually use 'in via' which is an older syntax, but one that makes
- sense as you read it. Another limitation is that you are restricted
- only to 'pass' or 'drop' for filtering bridged packets. Sophisticated
- things like 'divert' or 'forward' or 'reject' are not available. Such
- options can still be used, but only on traffic to or from the bridge
- machine itself.</para>
-
- <para>New in FreeBSD 4.0 is the concept of stateful filtering. This is a
- big boost for UDP traffic, which typically is a request going out,
- followed shortly thereafter by a response with the exact same set of IP
- addresses and port numbers (but with source and dest reversed, of
- course). For firewalls that have no statekeeping, there is almost no
- way to deal with this sort of traffic short of setting up proxies. But
- a firewall that can "remember" an outgoing UDP packet and for the next
- few minutes allow a response, handling UDP services is trivial. The
- example to follow shows how to do this. The truly paranoid can also set
- up rules like this to handle TCP. This allows you to avoid some sorts
- of denial of service attacks or other nasty tricks, but it also
- typically makes your state table mushroom in size.</para>
-
- <para>Let's look at an example setup. Note first that at the top of
- <filename>/etc/rc.firewall</filename> we should already have taken care
- of the loopback interface and the special hack for ARP should still be
- in place. So we won't worry about them any further.</para>
-
-<programlisting>us_ip=192.168.1.1
-oif=fxp0
-iif=fxp1
-
-# Things that we've kept state on before get to go through in a hurry.
-${ipfw} add check-state
-
-# Throw away RFC 1918 networks
-${ipfw} add deny log ip from 10.0.0.0/8 to any in via ${oif}
-${ipfw} add deny log ip from 172.16.0.0/12 to any in via ${oif}
-${ipfw} add deny log ip from 192.68.0.0/16 to any in via ${oif}
-
-# Allow the bridge machine to say anything it wants (keep state if UDP)
-${ipfw} add pass udp from ${us_ip} to any keep-state
-${ipfw} add pass ip from ${us_ip} to any
-
-# Allow the inside net to say anything it wants (keep state if UDP)
-${ipfw} add pass udp from any to any in via ${iif} keep-state
-${ipfw} add pass ip from any to any in via ${iif}
-
-# Allow all manner of ICMP
-${ipfw} add pass icmp from any to any
-
-# TCP section
-# established TCP sessions are ok everywhere.
-${ipfw} add pass tcp from any to any established
-# Pass the "quarantine" range.
-${ipfw} add pass tcp from any to any 49152-65535 in via ${oif}
-# Pass ident probes. It's better than waiting for them to timeout
-${ipfw} add pass tcp from any to any 113 in via ${oif}
-# Pass SSH.
-${ipfw} add pass tcp from any to any 22 in via ${oif}
-# Pass DNS. Only if you have name servers inside.
-#${ipfw} add pass tcp from any to any 53 in via ${oif}
-# Pass SMTP to the mail server only
-${ipfw} add pass tcp from any to mailhost 25 in via ${oif}
-
-# UDP section
-# Pass the "quarantine" range.
-${ipfw} add pass udp from any to any 49152-65535 in via ${oif}
-# Pass DNS. Only if you have name servers inside.
-#${ipfw} add pass udp from any to any 53 in via ${oif}
-
-# Everything else is suspect
-${ipfw} add deny log ip from any to any</programlisting>
-
- <para>Those of you who have set up firewalls before may notice some things
- missing. In particular, there are no anti-spoofing rules. That is,
- we did <emphasis>not</emphasis> add:</para>
-
- <programlisting>${ipfw} add deny ip from ${us_ip}/24 to any in via ${oif}</programlisting>
-
- <para>That is, drop packets claiming to be from our network that are
- coming in from the outside. This is something that you would commonly
- do to make sure that someone doesn't try and evade the packet filter by
- generating nefarious packets that look like they are from the inside.
- The problem with that is that there is at least one host on the outside
- interface that you do not want to ignore -- your router. In my
- particular case, I have some machines on the outside and some on the
- inside, but I don't necessarily want the outside machines to have
- routine access to the inside. At the same time, I don't want to throw
- their traffic away. In my own case, my ISP anti-spoofs at their router,
- so I don't need to bother. And in general, the fewer rules the better,
- since it will take time and CPU to process each one.</para>
-
- <para>Note also that the last rule is almost an exact duplicate of the
- default rule 65536. There are two major differences when it comes to
- bridging, however. Our rule logs what it drops, of course, but our rule
- will only apply to IP traffic. Apart from the UDP
- <hostid role="ipaddr">0.0.0.0</hostid> trick there is no way to deal
- with non IP traffic, so the default rule at 65536 will drop ALL traffic,
- not merely all non-IP traffic. So the net effect is that unmatched IP
- traffic will be logged, but not non-IP traffic. If you want, you can
- add option <literal>IPFIREWALL_DEFAULT_TO_ACCEPT</literal> to your
- <link linkend="filtering-bridges-kernel">kernel configuration</link> and
- non-IP traffic will be passed instead of dropped. But in the case of a
- filtering bridge between you and the Internet, it is unlikely that you
- would want to do this (if you are sufficiently paranoid).</para>
-
- <para>There is a rule for passing SMTP to a mailhost if you have one.
- Obviously the whole ruleset above should be flavored to taste, and
- that is an example of a specific service exemption. Note that
- in order for 'mailhost' to work, name service lookups must work
- BEFORE the bridge is enabled. This is an example of making sure
- that you enable the correct interface.</para>
-
- <para>Another item to note is that the DNS rules are set up only to
- allow DNS servers to work. This means that if don't set up a
- DNS server, you don't need them.</para>
-
- <para>Folks used to setting up IP firewalls also probably are used to
- either having a 'reset' or a 'forward' rule for ident packets
- (TCP port 113). Unfortunately, this is not an option with the
- bridging code, so the path of least resistance is to simply pass
- them to their destination. As long as that destination machine
- isn't running an ident daemon, this is relatively harmless.
- The alternative is dropping port 113 connections, which makes
- firing up things like IRC take forever (the ident probe must
- timeout).</para>
-
- <para>The only other thing that's a little weird that you may have noticed
- is that there is a rule to let ${us_ip} speak and a separate rule to
- allow the inside network to speak. Remember that this is because the
- two sets of traffic will be taking different paths through the kernel
- and into the packet filter. The inside net will be going through the
- bridge code. The local machine, however, will be using the normal IP
- stack to speak. Thus the two rules to handle the different cases. The
- in via ${oif} rules work for both paths. In general if you use in via
- rules throughout the filter, you will need to make an exception for
- locally generated packets, because they didn't "come in" via
- anything.</para>
- </sect1>
-
- <sect1 id="filtering-bridges-contributors">
- <title>Contributors</title>
-
- <para>To some extent the material for this discussion is a combination of
- the items that were discussed by Luigi Rizzo in his Dummynet lecture at
- FreeBSDcon '99 and by Mark Murray during his Network Security lecture.
- In addition, for quite some time now I have been putting together
- filtering bridges for friends and colleagues who were getting DSL
- connections for their home.</para>
- </sect1>
-</article>
-
diff --git a/en_US.ISO8859-1/articles/fonts/Makefile b/en_US.ISO8859-1/articles/fonts/Makefile
deleted file mode 100644
index 886e21cc9d..0000000000
--- a/en_US.ISO8859-1/articles/fonts/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-# $FreeBSD$
-
-DOC?= article
-
-FORMATS?= html
-
-INSTALL_COMPRESSED?=gz
-INSTALL_ONLY_COMPRESSED?=
-
-SRCS= article.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/fonts/article.sgml b/en_US.ISO8859-1/articles/fonts/article.sgml
deleted file mode 100644
index 09425ef64d..0000000000
--- a/en_US.ISO8859-1/articles/fonts/article.sgml
+++ /dev/null
@@ -1,976 +0,0 @@
-<!-- $FreeBSD: doc/en_US.ISO8859-1/articles/fonts/article.sgml,v 1.16 2001/07/06 13:02:48 dd Exp $ -->
-<!-- The FreeBSD Documentation Project -->
-<!DOCTYPE ARTICLE PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man;
-]>
-
-<!-- Recently, I wanted to figure out how to use some additional fonts that
- I had accumulated. I finally figured out *how to do it* from the various
- man pages and documentation. Since it might be of use to other users,
- and I didn't see any reference to this topic in the FAQ or handbook, I
- thought I'd try my hand at a simple cookbook tutorial addressing the
- use of fonts. I have included my unanswered questions at the end of
- the document.
-
- Anyway, here's what I put together. This is my present understanding of
- fonts and how to use them with FreeBSD. I am sure that there are errors or
- misunderstandings, but it contains enough valid information to allow the
- use of additional fonts with Ghostscript, X11 and Groff. This is my first
- attempt to write anything along the lines of a tutorial/FAQ, so I am sure
- it is pretty raw. There are probably better ways to do some of this stuff,
- and I would welcome being corrected.
- -->
-
-<!-- The section "Setting a virtual console to 80x60 line mode" was
- updated to reflect changes in FreeBSD system configuration
- files by Mark Ovens <mark@ukug.uk.freebsd.org> 27/5/00
- -->
-
-<article>
- <articleinfo>
- <title>Fonts and FreeBSD</title>
-
- <subtitle>A Tutorial</subtitle>
-
- <authorgroup>
- <author>
- <firstname>Dave</firstname>
-
- <surname>Bodenstab</surname>
-
- <affiliation>
- <address>
- <email>imdave@synet.net</email>
- </address>
- </affiliation>
- </author>
- </authorgroup>
-
- <pubdate>Wed Aug 7, 1996</pubdate>
-
- <abstract>
- <para>This document contains a description of the various font
- files that may be used with FreeBSD and the syscons driver,
- X11, Ghostscript and Groff. Cookbook examples are provided
- for switching the syscons display to 80x60 mode, and for using
- type 1 fonts with the above application programs.</para>
- </abstract>
- </articleinfo>
-
- <sect1>
- <title>Introduction</title>
-
- <para>There are many sources of fonts available, and one might ask
- how they might be used with FreeBSD. The answer can be found by
- carefully searching the documentation for the component that one
- would like to use. This is very time consuming, so this
- tutorial is an attempt to provide a shortcut for others who
- might be interested.</para>
- </sect1>
-
- <sect1>
- <title>Basic terminology</title>
-
- <para>There are many different font formats and associated font
- file suffixes. A few that will be addressed here are:</para>
-
- <variablelist>
- <varlistentry>
- <term><filename>.pfa</filename>, <filename>.pfb</filename></term>
-
- <listitem>
- <para>Postscript type 1 fonts. The
- <filename>.pfa</filename> is the
- <emphasis>A</emphasis>scii form and
- <filename>.pfb</filename> the <emphasis>B</emphasis>inary
- form.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><filename>.afm</filename></term>
-
- <listitem>
- <para>The font metrics associated with a type 1 font.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><filename>.pfm</filename></term>
-
- <listitem>
- <para>The printer font metrics associated with a type 1
- font.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><filename>.ttf</filename></term>
-
- <listitem>
- <para>A TrueType font</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><filename>.fot</filename></term>
-
- <listitem>
- <para>An indirect reference to a TrueType font (not an
- actual font)</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><filename>.fon</filename>, <filename>.fnt</filename></term>
-
- <listitem>
- <para>Bitmapped screen fonts</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>The <filename>.fot</filename> file is used by Windows as
- sort of a symbolic link to the actual TrueType font
- (<filename>.ttf</filename>) file. The <filename>.fon</filename>
- font files are also used by Windows. I know of no way to use
- this font format with FreeBSD.</para>
- </sect1>
-
- <sect1>
- <title>What font formats can I use?</title>
-
- <para>Which font file format is useful depends on the application
- being used. FreeBSD by itself uses no fonts. Application
- programs and/or drivers may make use of the font files. Here is
- a small cross reference of application/driver to the font type
- suffixes:</para>
-
- <variablelist>
- <varlistentry>
- <term>Driver</term>
-
- <listitem>
- <variablelist>
- <varlistentry>
- <term>syscons</term>
-
- <listitem>
- <para><filename>.fnt</filename></para>
- </listitem>
- </varlistentry>
- </variablelist>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Application</term>
-
- <listitem>
- <variablelist>
- <varlistentry>
- <term>Ghostscript</term>
-
- <listitem>
- <para><filename>.pfa</filename>,
- <filename>.pfb</filename>,
- <filename>.ttf</filename></para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>X11</term>
-
- <listitem>
- <para><filename>.pfa</filename>,
- <filename>.pfb</filename></para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Groff</term>
-
- <listitem>
- <para><filename>.pfa</filename>,
- <filename>.afm</filename></para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Povray</term>
-
- <listitem>
- <para><filename>.ttf</filename></para>
- </listitem>
- </varlistentry>
- </variablelist>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>The <filename>.fnt</filename> suffix is used quite
- frequently. I suspect that whenever someone wanted to create a
- specialized font file for their application, more often than not
- they chose this suffix. Therefore, it is likely that files with
- this suffix are not all the same format; specifically, the
- <filename>.fnt</filename> files used by syscons under FreeBSD
- may not be the same format as a <filename>.fnt</filename> file
- one encounters in the MSDOS/Windows environment. I have not
- made any attempt at using other <filename>.fnt</filename> files
- other than those provided with FreeBSD.</para>
- </sect1>
-
- <sect1>
- <title>Setting a virtual console to 80x60 line mode</title>
-
- <para>First, an 8x8 font must be loaded. To do this,
- <filename>/etc/rc.conf</filename> should contain the
- line (change the font name to an appropriate one for
- your locale):</para>
-
- <informalexample>
- <programlisting>font8x8="iso-8x8" # font 8x8 from /usr/share/syscons/fonts/* (or NO).</programlisting>
- </informalexample>
-
- <para>The command to actually switch the mode is
- &man.vidcontrol.1;:</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>vidcontrol VGA_80x60</userinput></screen>
- </informalexample>
-
- <para>Various screen-oriented programs, such as &man.vi.1;, must
- be able to determine the current screen dimensions. As this is
- achieved this through <command>ioctl</command> calls to the console
- driver (such as &man.syscons.4;) they will correctly determine the new
- screen dimensions.</para>
-
- <para>To make this more seamless, one can embed these commands in
- the startup scripts so it takes place when the system boots.
- To do this is add this line to <filename>/etc/rc.conf</filename>
- </para>
-
- <informalexample>
- <programlisting>allscreens_flags="VGA_80x60" # Set this vidcontrol mode for all virtual screens
- </programlisting>
- </informalexample>
-
- <para>References: &man.rc.conf.5;, &man.vidcontrol.1;.</para>
- </sect1>
-
- <sect1>
- <title>Using type 1 fonts with X11</title>
-
- <para>X11 can use either the <filename>.pfa</filename> or the
- <filename>.pfb</filename> format fonts. The X11 fonts are
- located in various subdirectories under
- <filename>/usr/X11R6/lib/X11/fonts</filename>. Each font file
- is cross referenced to its X11 name by the contents of the
- <filename>fonts.dir</filename> file in each directory.</para>
-
- <para>There is already a directory named <filename>Type1</filename>. The
- most straight forward way to add a new font is to put it into
- this directory. A better way is to keep all new fonts in a
- separate directory and use a symbolic link to the additional
- font. This allows one to more easily keep track of ones fonts
- without confusing them with the fonts that were originally
- provided. For example:</para>
-
- <informalexample>
- <screen><lineannotation>Create a directory to contain the font files</lineannotation>
-&prompt.user; <userinput>mkdir -p /usr/local/share/fonts/type1</userinput>
-&prompt.user; <userinput>cd /usr/local/share/fonts/type1</userinput>
-
-<lineannotation>Place the .pfa, .pfb and .afm files here</lineannotation>
-<lineannotation>One might want to keep readme files, and other documentation</lineannotation>
-<lineannotation>for the fonts here also</lineannotation>
-&prompt.user; <userinput>cp /cdrom/fonts/atm/showboat/showboat.pfb .</userinput>
-&prompt.user; <userinput>cp /cdrom/fonts/atm/showboat/showboat.afm .</userinput>
-
-<lineannotation>Maintain an index to cross reference the fonts</lineannotation>
-&prompt.user; <userinput>echo showboat - InfoMagic CICA, Dec 1994, /fonts/atm/showboat &gt;&gt;INDEX</userinput></screen>
- </informalexample>
-
- <para>Now, to use a new font with X11, one must make the font file
- available and update the font name files. The X11 font names
- look like:</para>
-
- <informalexample>
- <screen>-bitstream-charter-medium-r-normal-xxx-0-0-0-0-p-0-iso8859-1
- | | | | | | | | | | | | \ \
- | | | | | \ \ \ \ \ \ \ +----+- character set
- | | | | \ \ \ \ \ \ \ +- average width
- | | | | \ \ \ \ \ \ +- spacing
- | | | \ \ \ \ \ \ +- vertical res.
- | | | \ \ \ \ \ +- horizontal res.
- | | | \ \ \ \ +- points
- | | | \ \ \ +- pixels
- | | | \ \ \
- foundry family weight slant width additional style</screen>
- </informalexample>
-
- <para>A new name needs to be created for each new font. If you
- have some information from the documentation that accompanied
- the font, then it could serve as the basis for creating the
- name. If there is no information, then you can get some idea by
- using &man.strings.1; on the font file. For example:</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>strings showboat.pfb | more</userinput>
-%!FontType1-1.0: Showboat 001.001
-%%CreationDate: 1/15/91 5:16:03 PM
-%%VMusage: 1024 45747
-% Generated by Fontographer 3.1
-% Showboat
- 1991 by David Rakowski. Alle Rechte Vorbehalten.
-FontDirectory/Showboat known{/Showboat findfont dup/UniqueID known{dup
-/UniqueID get 4962377 eq exch/FontType get 1 eq and}{pop false}ifelse
-{save true}{false}ifelse}{false}ifelse
-12 dict begin
-/FontInfo 9 dict dup begin
- /version (001.001) readonly def
- /FullName (Showboat) readonly def
- /FamilyName (Showboat) readonly def
- /Weight (Medium) readonly def
- /ItalicAngle 0 def
- /isFixedPitch false def
- /UnderlinePosition -106 def
- /UnderlineThickness 16 def
- /Notice (Showboat
- 1991 by David Rakowski. Alle Rechte Vorbehalten.) readonly def
-end readonly def
-/FontName /Showboat def
---stdin--</screen>
- </informalexample>
-
- <para>Using this information, a possible name might be:</para>
-
- <informalexample>
- <screen>-type1-Showboat-medium-r-normal-decorative-0-0-0-0-p-0-iso8859-1</screen>
- </informalexample>
-
- <para>The components of our name are:</para>
-
- <variablelist>
- <varlistentry>
- <term>Foundry</term>
-
- <listitem>
- <para>Lets just name all the new fonts
- <literal>type1</literal>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Family</term>
-
- <listitem>
- <para>The name of the font.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Weight</term>
-
- <listitem>
- <para>Normal, bold, medium, semibold, etc. From the
- &man.strings.1;
- output above, it appears that this font has a weight of
- <emphasis>medium</emphasis>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Slant</term>
-
- <listitem>
- <para><emphasis remap=bf>r</emphasis>oman, <emphasis
- remap=bf>i</emphasis>talic, <emphasis
- remap=bf>o</emphasis>blique, etc. Since the
- <emphasis>ItalicAngle</emphasis> is zero,
- <emphasis>roman</emphasis> will be used.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Width</term>
-
- <listitem>
- <para>Normal, wide, condensed, extended, etc. Until it can
- be examined, the assumption will be
- <emphasis>normal</emphasis>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Additional style</term>
-
- <listitem>
- <para>Usually omitted, but this will indicate that the font
- contains decorative capital letters.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Spacing</term>
-
- <listitem>
- <para>proportional or monospaced.
- <emphasis>Proportional</emphasis> is used since
- <emphasis>isFixedPitch</emphasis> is false.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>All of these names are arbitrary, but one should strive to
- be compatible with the existing conventions. A font is
- referenced by name with possible wild cards by an X11 program,
- so the name chosen should make some sense. One might begin by
- simply using
-
- <informalexample>
- <screen>&hellip;-normal-r-normal-&hellip;-p-&hellip;
- </screen>
- </informalexample>
-
- as the name, and then use
- &man.xfontsel.1;
- to examine it and adjust the name based on the appearance of the
- font.</para>
-
- <para>So, to complete our example:</para>
-
- <informalexample>
- <screen><lineannotation>Make the font accessible to X11</lineannotation>
-&prompt.user; <userinput>cd /usr/X11R6/lib/X11/fonts/Type1</userinput>
-&prompt.user; <userinput>ln -s /usr/local/share/fonts/type1/showboat.pfb .</userinput>
-
-<lineannotation>Edit fonts.dir and fonts.scale, adding the line describing the font
-and incrementing the number of fonts which is found on the first line.</lineannotation>
-&prompt.user; <userinput>ex fonts.dir
-:1p
-25
-:1c
-26
-.
-:$a
-showboat.pfb -type1-showboat-medium-r-normal-decorative-0-0-0-0-p-0-iso8859-1
-.
-:wq</userinput>
-
-<lineannotation><filename>fonts.scale</filename> seems to be identical to <filename>fonts.dir</filename>&hellip;</lineannotation>
-&prompt.user; <userinput>cp fonts.dir fonts.scale</userinput>
-
-<lineannotation>Tell X11 that things have changed</lineannotation>
-&prompt.user; <userinput>xset fp rehash</userinput>
-
-<lineannotation>Examine the new font</lineannotation>
-&prompt.user; <userinput>xfontsel -pattern -type1-*</userinput></screen>
- </informalexample>
-
- <para>References: &man.xfontsel.1;, &man.xset.1;, <citetitle>The X
- Windows System in a Nutshell</citetitle>, <ulink
- URL="http://www.ora.com/">O'Reilly &amp;
- Associates</ulink>.</para>
- </sect1>
-
- <sect1>
- <title>Using type 1 fonts with Ghostscript</title>
-
- <para>Ghostscript references a font via its <filename>Fontmap</filename>
- file. This must be modified in a similar way to the X11
- <filename>fonts.dir</filename> file. Ghostscript can use either
- the <filename>.pfa</filename> or the <filename>.pfb</filename>
- format fonts. Using the font from the previous example, here is
- how to use it with Ghostscript:</para>
-
- <informalexample>
- <screen><lineannotation>Put the font in Ghostscript's font directory</lineannotation>
-&prompt.user; <userinput>cd /usr/local/share/ghostscript/fonts</userinput>
-&prompt.user; <userinput>ln -s /usr/local/share/fonts/type1/showboat.pfb .</userinput>
-
-<lineannotation>Edit Fontmap so Ghostscript knows about the font</lineannotation>
-&prompt.user; <userinput>cd /usr/local/share/ghostscript/4.01</userinput>
-&prompt.user; <userinput>ex Fontmap
-:$a
-/Showboat (showboat.pfb) ; % From CICA /fonts/atm/showboat
-.
-:wq</userinput>
-
-<lineannotation>Use Ghostscript to examine the font</lineannotation>
-&prompt.user; <userinput>gs prfont.ps</userinput>
-Aladdin Ghostscript 4.01 (1996-7-10)
-Copyright (C) 1996 Aladdin Enterprises, Menlo Park, CA. All rights
-reserved.
-This software comes with NO WARRANTY: see the file PUBLIC for details.
-Loading Times-Roman font from /usr/local/share/ghostscript/fonts/tir_____.pfb...
- /1899520 581354 1300084 13826 0 done.
-GS&gt;<userinput>Showboat DoFont</userinput>
-Loading Showboat font from /usr/local/share/ghostscript/fonts/showboat.pfb...
- 1939688 565415 1300084 16901 0 done.
-&gt;&gt;showpage, press &lt;return&gt; to continue&lt;&lt;
-&gt;&gt;showpage, press &lt;return&gt; to continue&lt;&lt;
-&gt;&gt;showpage, press &lt;return&gt; to continue&lt;&lt;
-GS&gt;<userinput>quit</userinput></screen>
- </informalexample>
-
- <para>References: <filename>fonts.txt</filename> in the
- Ghostscript 4.01 distribution</para>
- </sect1>
-
- <sect1>
- <title>Using type 1 fonts with Groff</title>
-
- <para>Now that the new font can be used by both X11 and
- Ghostscript, how can one use the new font with groff? First of
- all, since we are dealing with type 1 postscript fonts, the
- groff device that is applicable is the <emphasis>ps</emphasis>
- device. A font file must be created for each font that groff
- can use. A groff font name is just a file in
- <filename>/usr/share/groff_font/devps</filename>. With our
- example, the font file could be
- <filename>/usr/share/groff_font/devps/SHOWBOAT</filename>. The
- file must be created using tools provided by groff.</para>
-
- <para>The first tool is <command>afmtodit</command>. This is not
- normally installed, so it must be retrieved from the source
- distribution. I found I had to change the first line of the
- file, so I did:</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>cp /usr/src/gnu/usr.bin/groff/afmtodit/afmtodit.pl /tmp</userinput>
-&prompt.user; <userinput>ex /tmp/afmtodit.pl
-:1c
-#!/usr/bin/perl -P-
-.
-:wq</userinput></screen>
- </informalexample>
-
- <para>This tool will create the groff font file from the metrics
- file (<filename>.afm</filename> suffix.) Continuing with our
- example:</para>
-
- <informalexample>
- <screen><lineannotation>Many <filename>.afm</filename> files are in Mac format&hellip; ^M delimited lines
-We need to convert them to unix style ^J delimited lines</lineannotation>
-&prompt.user; <userinput>cd /tmp</userinput>
-&prompt.user; <userinput>cat /usr/local/share/fonts/type1/showboat.afm |
- tr '\015' '\012' &gt;showboat.afm</userinput>
-
-<lineannotation>Now create the groff font file</lineannotation>
-&prompt.user; <userinput>cd /usr/share/groff_font/devps</userinput>
-&prompt.user; <userinput>/tmp/afmtodit.pl -d DESC -e text.enc /tmp/showboat.afm generate/textmap SHOWBOAT</userinput></screen>
- </informalexample>
-
- <para>The font can now be referenced with the name
- SHOWBOAT.</para>
-
- <para>If ghostscript is used to drive the printers on the system,
- then nothing more needs to be done. However, if true postscript
- printers are used, then the font must be down loaded to the
- printer in order for the font to be used (unless the printer
- happens to have the showboat font built in or on an accessible
- font disk.) The final step is to create a down loadable font.
- The <command>pfbtops</command> tool is used to create the
- <filename>.pfa</filename> format of the font, and the
- <filename>download</filename> file is modified to reference the new
- font. The <filename>download</filename> file must reference the
- internal name of the font. This can easily be determined from
- the groff font file as illustrated:</para>
-
- <informalexample>
- <screen><lineannotation>Create the <filename>.pfa</filename> font file</lineannotation>
-&prompt.user; <userinput>pfbtops /usr/local/share/fonts/type1/showboat.pfb &gt;showboat.pfa</userinput></screen>
- </informalexample>
-
- <para>Of course, if the <filename>.pfa</filename> file is already
- available, just use a symbolic link to reference it.</para>
-
- <informalexample>
- <screen><lineannotation>Get the internal font name</lineannotation>
-&prompt.user; <userinput>fgrep internalname SHOWBOAT</userinput>
-internalname Showboat
-
-<lineannotation>Tell groff that the font must be down loaded</lineannotation>
-&prompt.user; <userinput>ex download
-:$a
-Showboat showboat.pfa
-.
-:wq</userinput></screen>
- </informalexample>
-
- <para>To test the font:</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>cd /tmp</userinput>
-&prompt.user; <userinput>cat &gt;example.t &lt;&lt;EOF
-.sp 5
-.ps 16
-This is an example of the Showboat font:
-.br
-.ps 48
-.vs (\n(.s+2)p
-.sp
-.ft SHOWBOAT
-ABCDEFGHI
-.br
-JKLMNOPQR
-.br
-STUVWXYZ
-.sp
-.ps 16
-.vs (\n(.s+2)p
-.fp 5 SHOWBOAT
-.ft R
-To use it for the first letter of a paragraph, it will look like:
-.sp 50p
-\s(48\f5H\s0\fRere is the first sentence of a paragraph that uses the
-showboat font as its first letter.
-Additional vertical space must be used to allow room for the larger
-letter.
-EOF</userinput>
-&prompt.user; <userinput>groff -Tps example.t &gt;example.ps</userinput>
-
-<lineannotation>To use ghostscript/ghostview</lineannotation>
-&prompt.user; <userinput>ghostview example.ps</userinput>
-
-<lineannotation>To print it</lineannotation>
-&prompt.user; <userinput>lpr -Ppostscript example.ps</userinput></screen>
- </informalexample>
-
- <para>References:
- <filename>/usr/src/gnu/usr.bin/groff/afmtodit/afmtodit.man</filename>,
- &man.groff.font.5;, &man.groff.char.7;, &man.pfbtops.1;.</para>
- </sect1>
-
- <sect1>
- <title>Converting TrueType fonts to a groff/postscript format for
- groff</title>
-
- <para>This potentially requires a bit of work, simply because it
- depends on some utilities that are not installed as part of the
- base system. They are:</para>
-
- <variablelist>
- <varlistentry>
- <term><command>ttf2pf</command></term>
-
- <listitem>
- <para>TrueType to postscript conversion utilities. This
- allows conversion of a TrueType font to an ascii font
- metric (<filename>.afm</filename>) file.</para>
-
- <para>Currently available at <ulink
- url="http://sunsite.icm.edu.pl/pub/GUST/contrib/BachoTeX98/ttf2pf/">http://sunsite.icm.edu.pl/pub/GUST/contrib/BachoTeX98/ttf2pf</ulink>.
- Note: These files are postscript programs and must be
- downloaded to disk by holding down the
- <keycap>Shift</keycap> key when clicking on the link.
- Otherwise, your browser may try to launch
- <application>ghostview</application> to view them.</para>
-
- <para>The files of interest are:</para>
-
- <itemizedlist>
- <listitem>
- <para><filename>GS_TTF.PS</filename></para>
- </listitem>
-
- <listitem>
- <para><filename>PF2AFM.PS</filename></para>
- </listitem>
-
- <listitem>
- <para><filename>ttf2pf.ps</filename></para>
- </listitem>
- </itemizedlist>
-
- <para>The funny upper/lower case is due to their being
- intended also for DOS shells.
- <filename>ttf2pf.ps</filename> makes use of the others as
- upper case, so any renaming must be consistent with this.
- (Actually, <filename>GS_TTF.PS</filename> and
- <filename>PFS2AFM.PS</filename> are supposedly part of the
- ghostscript distribution, but it's just as easy to use
- these as an isolated utility. FreeBSD doesn't seem to
- include the latter.) You also may want to have these
- installed to
- <filename>/usr/local/share/groff_font/devps</filename>(?).</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>afmtodit</command></term>
-
- <listitem>
- <para>Creates font files for use with groff from ascii font
- metrics file. This usually resides in the directory,
- <filename>/usr/src/contrib/groff/afmtodit</filename>, and
- requires some work to get going.</para>
-
- <note>
- <para> If you're paranoid about working in the
- <filename>/usr/src</filename> tree, simply copy the
- contents of the above directory to a work
- location.</para>
- </note>
-
- <para>In the work area, you'll need to make the utility.
- Just type:</para>
-
- <screen><prompt>#</prompt> <userinput>make -f Makefile.sub afmtodit</userinput>
- </screen>
-
- <para>You may also need to copy
- <filename>/usr/contrib/groff/devps/generate/textmap</filename>
- to
- <filename>/usr/share/groff_font/devps/generate</filename>
- if it doesn't already exist.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>Once all these utilities are in place, you're ready to
- commence:</para>
-
- <orderedlist>
- <listitem>
- <para>Create the <filename>.afm</filename> file by
- typing:</para>
-
- <screen><prompt>%</prompt> <userinput>gs <optional>-dNODISPLAY</optional> <optional>-q</optional> -- ttf2pf.ps <replaceable>TTF_name</replaceable> <optional><replaceable>PS_font_name</replaceable> <optional><replaceable>AFM_name</replaceable></optional></optional></userinput>
- </screen>
-
- <para>Where, <replaceable>TTF_name</replaceable> is your
- TrueType font file, <replaceable>PS_font_name</replaceable>
- is the file name for the <filename>.pfa</filename> file,
- <replaceable>AFM_name</replaceable> is the name you wish for
- the <filename>.afm</filename> file. If you do not specify
- output file names for the <filename>.pfa</filename> or
- <filename>.afm</filename> files, then default names will be
- generated from the TrueType font file name.</para>
-
- <para>This also produces a <filename>.pfa</filename> file, the
- ascii postscript font metrics file
- (<filename>.pfb</filename> is for the binary form). This
- won't be needed, but could (I think) be useful for a
- fontserver.</para>
-
- <para>For example, to convert the 30f9 Barcode font using the
- default file names, use the following command:</para>
-
- <screen><prompt>%</prompt> <userinput>gs -dNODISPLAY -- ttf2pf.ps 3of9.ttf</userinput>
-Aladdin Ghostscript 5.10 (1997-11-23)
-Copyright (C) 1997 Aladdin Enterprises, Menlo Park, CA. All rights reserved.
-This software comes with NO WARRANTY: see the file PUBLIC for details.
-Converting 3of9.ttf to 3of9.pfa and 3of9.afm.
- </screen>
-
- <para>If you want the converted fonts to be stored in
- <filename>A.pfa</filename> and <filename>B.afm</filename>,
- then use this command:</para>
-
- <screen><prompt>%</prompt> <userinput>gs -dNODISPLAY -- ttf2pf.ps 3of9.ttf A B</userinput>
-Aladdin Ghostscript 5.10 (1997-11-23)
-Copyright (C) 1997 Aladdin Enterprises, Menlo Park, CA. All rights reserved.
-This software comes with NO WARRANTY: see the file PUBLIC for details.
-Converting 3of9.ttf to A.pfa and B.afm.
- </screen>
- </listitem>
-
- <listitem>
- <para>Create the groff postscript file:</para>
-
- <para>Change directories to
- <filename>/usr/share/groff_font/devps</filename> so as to
- make the following command easier to execute. You'll
- probably need root privileges for this. (Or, if you're
- paranoid about working there, make sure you reference the
- files <filename>DESC</filename>,
- <filename>text.enc</filename> and
- <filename>generate/textmap</filename> as being in this
- directory.)</para>
-
- <screen><prompt>%</prompt> <userinput>afmtodit -d DESC -e text.enc file.afm \
- generate/textmap <replaceable>PS_font_name</replaceable></userinput>
- </screen>
-
- <para>Where, <filename>file.afm</filename> is the
- <replaceable>AFM_name</replaceable> created by
- <command>ttf2pf.ps</command> above, and
- <replaceable>PS_font_name</replaceable> is the font name
- used from that command, as well as the name that
- &man.groff.1; will use for references to this font. For
- example, assuming you used the first
- <command>tiff2pf.ps</command> command above, then the 3of9
- Barcode font can be created using the command:</para>
-
- <screen><prompt>%</prompt> <userinput>afmtodit -d DESC -e text.enc 3of9.afm \
- generate/textmap 3of9</userinput>
- </screen>
-
- <para>Ensure that the resulting
- <replaceable>PS_font_name</replaceable> file (e.g.,
- <filename>3of9</filename> in the example above) is located
- in the directory
- <filename>/usr/share/groff_font/devps</filename> by copying
- or moving it there.</para>
-
- <para>Note that if <filename>ttf2pf.ps</filename> assigns a
- font name using the one it finds in the TrueType font file
- and you want to use a different name, you must edit the
- <filename>.afm</filename> file prior to running
- <command>afmtodit</command>. This name must also match the
- one used in the Fontmap file if you wish to pipe
- &man.groff.1; into &man.gs.1;.</para>
- </listitem>
- </orderedlist>
- </sect1>
-
- <sect1>
- <title>Can TrueType fonts be used with other programs?</title>
-
- <para>The TrueType font format is used by Windows, Windows 95, and
- Mac's. It is quite popular and there are a great number of
- fonts available in this format.</para>
-
- <para>Unfortunately, there are few applications that I am aware of
- that can use this format: Ghostscript and Povray come to mind.
- Ghostscript's support, according to the documentation, is
- rudimentary and the results are likely to be inferior to type 1
- fonts. Povray version 3 also has the ability to use TrueType
- fonts, but I rather doubt many people will be creating documents
- as a series of raytraced pages :-).</para>
-
- <para>This rather dismal situation may soon change. The <ulink
- url="http://www.freetype.org/">FreeType Project</ulink> is
- currently developing a useful set of FreeType tools:</para>
-
- <itemizedlist>
- <listitem>
- <para>The freetype module is included with XFree86 4.x. For
- more information please see the <ulink
- url="http://www.freebsd.org/handbook/x-fonts.html">FreeBSD
- Handbook</ulink> or the <ulink
- url="http://www.xfree86.org/4.0.2/fonts.html">XFree86 4.0.2
- Fonts</ulink> page.</para>
- </listitem>
-
- <listitem>
- <para>The <command>xfsft</command> font server for X11 can
- serve TrueType fonts in addition to regular fonts. Though
- currently in beta, it is said to be quite usable. See
- <ulink
- url="http://www.dcs.ed.ac.uk/home/jec/programs/xfsft/">Juliusz
- Chroboczek's page</ulink> for further information.
- Porting instructions for FreeBSD can be found at <ulink
- url="http://math.missouri.edu/~stephen/software/">Stephen
- Montgomery's software page</ulink>.</para>
- </listitem>
-
- <listitem>
- <para><command>xfstt</command> is another font server for X11,
- available under <ulink url="
- ftp://sunsite.unc.edu/pub/Linux/X11/fonts">
- ftp://sunsite.unc.edu/pub/Linux/X11/fonts</ulink>.</para>
- </listitem>
-
- <listitem>
- <para>A program called <command>ttf2bdf</command> can produce
- BDF files suitable for use in an X environment from TrueType
- files. Linux binaries are said to be available from <ulink
- url="ftp://crl.nmsu.edu/CLR/multiling/General">ftp://crl.nmsu.edu/CLR/multiling/General/</ulink>.</para>
- </listitem>
-
- <listitem>
- <para>For people requiring the use of Asian TrueType fonts,
- the <command>XTT</command> font server may be worth a look.
- Information about <command>XTT</command> can be found at
- URL: <ulink
- url="http://hawk.ise.chuo-u.ac.jp/student/person/tshiozak/study/freebsd-at-random/x-tt/index-en.html">http://hawk.ise.chuo-u.ac.jp/student/person/tshiozak/study/freebsd-at-random/x-tt/index-en.html</ulink>.</para>
- </listitem>
-
- <listitem>
- <para>and others &hellip;</para>
- </listitem>
- </itemizedlist>
-
- <para>The <ulink
- url="http://freetype.sourceforge.net/projects.html">FreeType Projects
- page </ulink> is a good starting point for information on
- these and other free TrueType projects.</para>
- </sect1>
-
- <sect1>
- <title>Where can additional fonts be obtained?</title>
-
- <para>Many fonts are available on the Internet. They are either
- entirely free, or are share-ware. In addition, there are many
- inexpensive CDROMs available that contain many fonts. Some
- Internet locations (as of August 1996) are:</para>
-
- <itemizedlist>
- <listitem>
- <para><ulink
- url="ftp://ftp.winsite.com">ftp://ftp.winsite.com</ulink>
- (Formerly CICA)</para>
- </listitem>
-
- <listitem>
- <para><ulink
- url="http://www.simtel.net/">http://www.simtel.net/</ulink></para>
- </listitem>
-
- <listitem>
- <para><ulink
- url="ftp://ftp.coast.net/">ftp://ftp.coast.net/</ulink></para>
- </listitem>
-
- <listitem>
- <para><ulink
- url="http://af-pc-plloyd.ecel.uwa.edu.au/fonts/index.html">http://af-pc-plloyd.ecel.uwa.edu.au/fonts/index.html</ulink></para>
- </listitem>
-
- <listitem>
- <para><ulink
- url="http://www.esselte.com/letraset/index.html">http://www.esselte.com/letraset/index.html</ulink></para>
- </listitem>
-
- <listitem>
- <para><ulink
- url="http://www.inil.com/users/elfring/esf.htm">http://www.inil.com/users/elfring/esf.htm</ulink></para>
- </listitem>
- </itemizedlist>
- </sect1>
-
- <sect1>
- <title>Additional questions</title>
-
- <itemizedlist>
- <listitem>
- <para>What use are the <filename>.pfm</filename> files?</para>
- </listitem>
-
- <listitem>
- <para>Can one generate the <filename>.afm</filename> file from
- a <filename>.pfa</filename> or
- <filename>.pfb</filename>?</para>
- </listitem>
-
- <listitem>
- <para>How to generate the groff character mapping files for
- postscript fonts with non-standard character names?</para>
- </listitem>
-
- <listitem>
- <para>Can xditview and devX?? devices be setup to access all
- the new fonts?</para>
- </listitem>
-
- <listitem>
- <para>It would be good to have examples of using TrueType
- fonts with povray and ghostscript.</para>
- </listitem>
- </itemizedlist>
- </sect1>
-</article>
diff --git a/en_US.ISO8859-1/articles/formatting-media/Makefile b/en_US.ISO8859-1/articles/formatting-media/Makefile
deleted file mode 100644
index 886e21cc9d..0000000000
--- a/en_US.ISO8859-1/articles/formatting-media/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-# $FreeBSD$
-
-DOC?= article
-
-FORMATS?= html
-
-INSTALL_COMPRESSED?=gz
-INSTALL_ONLY_COMPRESSED?=
-
-SRCS= article.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/formatting-media/article.sgml b/en_US.ISO8859-1/articles/formatting-media/article.sgml
deleted file mode 100644
index 6714d32718..0000000000
--- a/en_US.ISO8859-1/articles/formatting-media/article.sgml
+++ /dev/null
@@ -1,620 +0,0 @@
-<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man;
-]>
-<!-- $FreeBSD: doc/en_US.ISO8859-1/articles/formatting-media/article.sgml,v 1.20 2001/08/21 20:16:45 logo Exp $ -->
-<article>
- <articleinfo>
- <title>Formatting Media For Use With FreeBSD</title>
-
- <subtitle>A Tutorial</subtitle>
-
- <authorgroup>
- <author>
- <firstname>Doug</firstname>
-
- <surname>White</surname>
-
- <affiliation>
- <address>
- <email>dwhite@resnet.uoregon.edu</email>
- </address>
- </affiliation>
- </author>
- </authorgroup>
-
- <pubdate>March 1997</pubdate>
-
- <abstract>
- <para>This document describes how to slice, partition, and
- format hard disk drives and similar media for use with
- FreeBSD. The examples given have been tested under FreeBSD
- 2.2 and should work for other releases. The text has been updated
- for FreeBSD version 4.</para>
- </abstract>
- </articleinfo>
-
- <sect1>
- <title>Introduction & Definitions</title>
-
- <sect2>
- <title>Overview</title>
-
- <para>Successfully adding disks to an existing system is the
- mark of an experienced system administrator. Slicing,
- partitioning, and adding disks requires a careful dance of
- proper command and name syntax. One slipped finger and an
- entire disk could disappear in seconds. This document is
- written in an attempt to simplify this process and avoid
- accidents. Thankfully, enhancements to existing tools
- (notably sysinstall) have greatly improved this process in
- recent releases of FreeBSD.</para>
-
- <para>There are two possible modes of disk formatting:</para>
-
- <itemizedlist>
- <listitem>
- <para><firstterm>compatibility mode</firstterm>: Arranging a
- disk so that it has a slice table for use with other
- operating systems.</para>
- </listitem>
-
- <listitem>
- <para><firstterm>dedicated mode</firstterm>, sometimes called
- <firstterm>dangerously dedicated mode</firstterm>: Formatting a disk
- with no slice table. This makes the process of adding disks easier,
- however non-FreeBSD operating systems may not accept the disk. The
- term <emphasis>dangerously</emphasis> refers to the danger that the
- system may not recognize a disk formatted in this manner.</para>
- </listitem> </itemizedlist>
-
- <para>For most cases, dedicated mode is the easiest to set up
- and use in existing systems, as a new disk is usually
- dedicated entirely to FreeBSD. However, compatibility mode
- insures optimum interoperability with future installations at
- a cost of increased complexity.</para>
-
- <para>In addition to selecting the mode, two methods of slicing
- the disk are available. One is using the system installation
- tool <command>/stand/sysinstall</command>. 2.1.7-RELEASE and
- later versions of <command>sysinstall</command> contain code
- to ease setup of disks during normal system operation, mainly
- allowing access to the Label and Partition editors and a Write
- feature which will update just the selected disk and slice
- without affecting other disks. The other method is running
- the tools manually from a root command line. For
- dedicated mode, only three or four commands are involved while
- <command>sysinstall</command> requires some
- manipulation.</para>
- </sect2>
-
- <sect2>
- <title>Definitions</title>
-
- <para>Unix disk management over the centuries has invented many
- new definitions for old words. The following glossary covers
- the definitions used in this document and (hopefully) for
- FreeBSD in general.</para>
-
-<!-- I'm tempted to use GLOSSARY here but will resort to a list for
-now. -->
-
- <itemizedlist>
- <listitem>
- <para>compatibility mode: Arranging a disk so that it has a
- slice table for use with other operating systems. Oppose
- dedicated mode.</para>
- </listitem>
-
- <listitem>
- <para>(dangerously) dedicated mode: Formatting a disk with no
- slice table. This makes the process of adding disks
- easier, however non-FreeBSD operating systems may not
- accept the disk. Oppose compatibility mode.</para>
- </listitem>
-
- <listitem>
- <para>disk: A circular disc, covered with magnetic or
- similarly manipulable material, spun by a motor under a
- head. Data is stored on the disk by changing the pattern
- of magnetism on the disc, which can be later read. Hard
- disks, CDROMs, Magneto-optical,and Zip/Jaz removables are
- examples of disks.</para>
- </listitem>
-
- <listitem>
- <para>slice: A division of a disk. Up to four slices are
- permitted on one disk in the PC standard. Slices are
- composed of contiguous sectors. Slices are recorded in a
- <quote>slice table</quote> used by the system BIOS to
- locate bootable partitions. The slice table is usually
- called the <quote>partition table</quote> in DOS parlance. Maintained by
- the fdisk utility.</para>
- </listitem>
-
- <listitem>
- <para>partition: A division of a slice. Usually used in
- reference to divisions of the FreeBSD slice of a disk.
- Each filesystem and swap area on a disk resides in a
- partition. Maintained using the disklabel utility.</para>
- </listitem>
-
- <listitem>
- <para>sector: Smallest subdivision of a disk. One sector
- usually represents 512 bytes of data.</para>
- </listitem>
- </itemizedlist>
- </sect2>
-
- <sect2>
- <title>Warnings & Pitfalls</title>
-
- <para>Building disks is not something to take lightly. It is
- quite possible to destroy the contents of other disks in your
- system if the proper precautions are not taken.</para>
-
- <para><emphasis>Check your work carefully.</emphasis> It is very simple
- to destroy the incorrect disk when working with these
- commands. When in doubt consult the kernel boot output for
- the proper device.</para>
-
- <para>Needless to say, we are not responsible for any damage to
- any data or hardware that you may experience. You work at
- your own risk!</para>
- </sect2>
-
- <sect2>
- <title>Zip, Jaz, and Other Removables</title>
-
- <para>Removable disks can be formatted in the same way as normal
- hard disks. It is essential to have the disk drive connected
- to the system and a disk placed in the drive during startup,
- so the kernel can determine the drive's geometry. Check the
- <command>dmesg</command> output and make sure your device and
- the disk's size is listed. If the kernel reports
-
- <informalexample>
- <screen>Can't get the size</screen>
- </informalexample>
-
- then the disk was not in the drive. In this case, you will
- need to restart the machine before attempting to format
- disks.</para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Formatting Disks in Dedicated Mode</title>
-
- <sect2>
- <title>Introduction</title>
-
- <para>This section details how to make disks that are totally
- dedicated to FreeBSD. Remember, dedicated mode disks sometimes
- cannot be booted by the PC architecture.</para>
- </sect2>
-
- <sect2>
- <title>Making Dedicated Mode Disks using Sysinstall</title>
-
- <para><command>/stand/sysinstall</command>, the system
- installation utility, has been expanded in recent versions to
- make the process of dividing disks properly a less tiring
- affair. The fdisk and disklabel editors built into sysinstall
- are GUI tools that remove much of the confusion from slicing
- disks. For FreeBSD versions 2.1.7 and later, this is perhaps
- the simplest way to slice disks.</para>
-
- <procedure>
- <step>
- <para>Start sysinstall as root by typing
-
- <informalexample>
- <screen>&prompt.root; <userinput>/stand/sysinstall</userinput></screen>
- </informalexample>
-
- from the command prompt.</para>
- </step>
-
- <step>
- <para>Select <command>Index</command>.</para>
- </step>
-
- <step>
- <para>Select <command>Partition</command>.</para>
- </step>
-
- <step>
- <para>Select the disk to edit with arrow keys and
- <keycap>SPACE</keycap>.</para>
- </step>
-
- <step>
- <para>If you are using this entire disk for FreeBSD, select
- <command>A</command>.</para>
- </step>
-
- <step>
- <para>When asked:
-
- <informalexample>
- <screen>Do you want to do this with a true partition entry so as to remain
-cooperative with any future possible operating systems on the
-drive(s)?</screen>
- </informalexample>
-
- answer <command>No</command>.</para>
- </step>
-
- <step>
- <para>When asked if you still want to do this, answer
- <command>Yes</command>.</para>
- </step>
-
- <step>
- <para>Select <command>Write</command>.</para>
- </step>
-
- <step>
- <para>When warned about writing on installed systems, answer
- <command>Yes</command>.</para>
- </step>
-
- <step>
- <para><command>Quit</command>the FDISK Editor and
- <keycap>ESCAPE</keycap> back to the Index menu.</para>
- </step>
-
- <step>
- <para>Select <command>Label</command> from the Index
- menu.</para>
- </step>
-
- <step>
- <para>Label as desired. For a single partition, enter
- <command>C</command> to Create a partition, accept the
- default size, partition type Filesystem, and a mountpoint
- (which isn't used).</para>
- </step>
-
- <step>
- <para>Enter <command>W</command> when done and confirm to
- continue. The filesystem will be newfs'd for you, unless
- you select otherwise (for new partitions you'll want to
- do this!). You'll get the error:
-
- <informalexample>
- <screen>Error mounting /mnt/dev/ad2s1e on /mnt/blah : No such file or directory</screen>
- </informalexample>
-
- Ignore.</para>
- </step>
-
- <step>
- <para>Exit out by repeatedly pressing
- <keycap>ESCAPE</keycap>.</para>
- </step>
- </procedure>
- </sect2>
-
- <sect2>
- <title>Making Dedicated Mode Disks Using the Command Line</title>
-
- <para>Execute the following commands, replacing <devicename>ad2</devicename> with the
- disk name.</para>
-
- <informalexample>
- <screen>&prompt.root; <userinput>dd if=/dev/zero of=/dev/ad2 count=2</userinput>
-&prompt.root; <userinput>disklabel /dev/ad2 | disklabel -B -R -r ad2 /dev/stdin</userinput>
-<lineannotation>We only want one partition, so using slice 'c' should be fine:</lineannotation>
-&prompt.root; <userinput>newfs /dev/ad2c</userinput></screen>
- </informalexample>
-
- <para>If you need to edit the disklabel to create multiple
- partitions (such as swap), use the following: </para>
-
- <informalexample>
- <screen>&prompt.root; <userinput>dd if=/dev/zero of=/dev/ad2 count=2</userinput>
-&prompt.root; <userinput>disklabel /dev/ad2 > /tmp/label</userinput>
-<lineannotation>Edit disklabel to add partitions:</lineannotation>
-&prompt.root; <userinput>vi /tmp/label</userinput>
-&prompt.root; <userinput>disklabel -B -R -r ad2 /tmp/label</userinput>
-<lineannotation>newfs partitions appropriately</lineannotation></screen>
- </informalexample>
-
- <para>Your disk is now ready for use.</para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Making Compatibility Mode Disks</title>
-
- <sect2>
- <title>Introduction</title>
-
- <para>The command line is the easiest way to make dedicated
- disks, and the worst way to make compatibility disks. The
- command-line <command>fdisk</command> utility requires higher math skills and an
- in-depth understanding of the slice table, which is more than
- most people want to deal with. Use sysinstall for
- compatibility disks, as described below.</para>
- </sect2>
-
- <sect2>
- <title>Making Compatibility Mode Disks Using Sysinstall</title>
-
- <procedure>
- <step>
- <para>Start sysinstall as root by typing
-
- <informalexample>
- <screen>&prompt.root; <userinput>/stand/sysinstall</userinput></screen>
- </informalexample>
-
- from the command prompt.</para>
- </step>
-
- <step>
- <para>Select <command>Index</command>.</para>
- </step>
-
- <step>
- <para>Select <command>Partition</command>.</para>
- </step>
-
- <step>
- <para>Select the disk to edit with arrow keys and
- <keycap>SPACE</keycap>.</para>
- </step>
-
- <step>
- <para>If you are using this entire disk for FreeBSD, select
- <command>A</command>.</para>
- </step>
-
- <step>
- <para>When asked:
-
- <informalexample>
- <screen>Do you want to do this with a true partition entry so as to remain
-cooperative with any future possible operating systems on the
-drive(s)?</screen>
- </informalexample>
-
- answer <command>yes</command>.</para>
- </step>
-
- <step>
- <para>Select <command>Write</command>.</para>
- </step>
-
- <step>
- <para>When asked to install the boot manager, select None
- with <keycap>SPACE</keycap> then hit
- <keycap>ENTER</keycap> for OK.</para>
- </step>
-
- <step>
- <para><command>Quit</command> the FDISK Editor.</para>
- </step>
-
- <step>
- <para>You'll be asked about the boot manager, select
- <command>None</command> again. </para>
- </step>
-
- <step>
- <para>Select <command>Label</command> from the Index
- menu.</para>
- </step>
-
- <step>
- <para>Label as desired. For a single partition, accept the
- default size, type filesystem, and a mountpoint (which
- isn't used).</para>
- </step>
-
- <step>
- <para>The filesystem will be newfs'd for you, unless you
- select otherwise (for new partitions you'll want to do
- this!). You'll get the error:
-
- <informalexample>
- <screen>Error mounting /mnt/dev/ad2s1e on /mnt/blah : No such file or directory</screen>
- </informalexample>
-
- Ignore.</para>
- </step>
-
- <step>
- <para>Exit out by repeatedly pressing
- <keycap>ESCAPE</keycap>.</para>
- </step>
- </procedure>
-
- <para>Your new disk is now ready for use.</para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Other Disk Operations</title>
-
- <sect2>
- <title>Adding Swap Space</title>
-
- <para>As a system grows, it's need for swap space can also grow.
- Although adding swap space to existing disks is very
- difficult, a new disk can be partitioned with additional swap
- space.</para>
-
- <para>To add swap space when adding a disk to a system:</para>
-
- <procedure>
- <step>
- <para>When partitioning the disk, edit the disklabel and
- allocate the amount of swap space to add in partition `b'
- and the remainder in another partition, such as `a' or
- `e'. The size is given in 512 byte blocks.</para>
- </step>
-
- <step>
- <para>When newfsing the drive, do NOT newfs the `c'
- partition. Instead, newfs the partition where the
- non-swap space lies.</para>
- </step>
-
- <step>
- <para>Add an entry to <filename>/etc/fstab</filename> as
- follows:</para>
-
- <informalexample>
- <programlisting>/dev/ad0b none swap sw 0 0
- </programlisting>
- </informalexample>
-
- <para>Change <filename>/dev/ad0b</filename> to the device of the newly added
- space.</para>
- </step>
-
- <step>
- <para>To make the new space immediately available, use the
- <command>swapon</command> command.
-
- <informalexample>
- <screen>&prompt.root; <userinput>swapon /dev/da0b</userinput>
-swapon: added /dev/da0b as swap space</screen>
- </informalexample>
- </para>
- </step>
- </procedure>
- </sect2>
-
- <sect2>
- <title>Copying the Contents of Disks</title>
-<!-- Should have specific tag -->
-
- <para>Submitted By: Renaud Waldura
- (<email>renaud@softway.com</email>) </para>
-
- <para>To move file from your original base disk to the fresh new
- one, do:
-
- <informalexample>
- <screen>&prompt.root; <userinput>mount /dev/ad2 /mnt</userinput>
-&prompt.root; <userinput>pax -r -w -p e /usr/home /mnt</userinput>
-&prompt.root; <userinput>umount /mnt</userinput>
-&prompt.root; <userinput>rm -rf /usr/home/*</userinput>
-&prompt.root; <userinput>mount /dev/ad2 /usr/home</userinput></screen>
- </informalexample>
- </para>
- </sect2>
-
- <sect2>
- <title>Creating Striped Disks using CCD</title>
-
- <para>Commands Submitted By: Stan Brown
- (<email>stanb@awod.com</email>) </para>
-
- <para>The Concatenated Disk Driver, or CCD, allows you to treat
- several identical disks as a single disk. Striping can result
- in increased disk performance by distributing reads and writes
- across the disks. See the &man.ccd.4; and &man.ccdconfig.8;
- man pages or the <ulink
- URL="http://stampede.cs.berkeley.edu/ccd/">CCD
- Homepage</ulink> for further details.</para>
-
- <para>You no longer need to build a special kernel to run ccd. When you
- run <command>ccdconfig</command>, it will load the KLD for you if the
- kernel does not contain CCD support.</para>
-
- <para>You build CCDs on disk partitions of type
- <emphasis>4.2BSD</emphasis>. If you want to use the entire disk, you
- still need to create a new partition. For example, <userinput>disklabel
- -e</userinput> might show:</para>
-
- <informalexample>
- <screen># size offset fstype [fsize bsize bps/cpg]
- c: 60074784 0 unused 0 0 0 # (Cyl. 0 - 59597)</screen>
- </informalexample>
-
- <para>You shouldn't use partition <emphasis>c</emphasis> for the CCD,
- since it is of type <emphasis>unused</emphasis>. Instead, create a new
- partition of exactly the same size, but with type
- <emphasis>4.2BSD</emphasis>:</para>
-
- <informalexample>
- <screen># size offset fstype [fsize bsize bps/cpg]
- c: 60074784 0 unused 0 0 0 # (Cyl. 0 - 59597)
-<userinput> e: 60074784 0 4.2BSD 0 0 0 # (Cyl. 0 - 59597)</userinput></screen>
- </informalexample>
-
- <para>To create a new CCD, execute the following commands. This
- describes how to add three disks together; simply add or remove devices
- as necessary. Remember that the disks to be striped must be
- <emphasis>identical.</emphasis></para>
-
- <informalexample>
- <screen>&prompt.root; <userinput>cd /dev ; sh MAKDEV ccd0</userinput>
-
-&prompt.root; <userinput>disklabel -r -w da0 auto</userinput>
-&prompt.root; <userinput>disklabel -r -w da1 auto</userinput>
-&prompt.root; <userinput>disklabel -r -w da2 auto</userinput>
-
-&prompt.root; <userinput>disklabel -e da0</userinput>
-<lineannotation>Add partition e with type 4.2BSD</lineannotation>
-&prompt.root; <userinput>disklabel -e da1</userinput>
-<lineannotation>Add partition e with type 4.2BSD</lineannotation>
-&prompt.root; <userinput>disklabel -e da2</userinput>
-<lineannotation>Add partition e with type 4.2BSD</lineannotation>
-
-&prompt.root; <userinput>ccdconfig ccd0 273 0 /dev/da0e /dev/da1e /dev/da2e</userinput>
-
-&prompt.root; <userinput>newfs /dev/ccd0c</userinput></screen>
- </informalexample>
-
- <para>The value 273 is the stripe size. This is the number of disk
- sectors (of 512 bytes each) in each block of data on the CCD. It should
- be at least 128 kB, and it should not be not be a power of 2.</para>
-
- <para>Now you can mount and use your CCD by referencing device
- <filename>/dev/ccd0c</filename>.</para>
-
- <para>A more powerful and flexible alternative to CCD is Vinum. See the
- <ulink URL="http://www.vinumvm.org/">Vinum Project home page</ulink>
- for further details.</para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Credits</title>
-
- <para>The author would like to thank the following individuals for
- their contributions to this project:</para>
-
- <itemizedlist>
- <listitem>
- <para>Darryl Okahata
- (<email>darrylo@hpnmhjw.sr.hp.com</email>) for his simple
- dedicated mode setup documentation which I have used
- repeatedly on FreeBSD-questions.</para>
- </listitem>
-
- <listitem>
- <para>Jordan Hubbard (<email>jkh@FreeBSD.org</email>) for
- making sysinstall useful for this type of task.</para>
- </listitem>
-
- <listitem>
- <para>John Fieber (<email>jfieber@indiana.edu</email>) for
- making information and examples of the DocBook DTD on which
- this document is based.</para>
- </listitem>
-
- <listitem>
- <para>Greg Lehey (<email>grog@FreeBSD.org</email>) for
- checking my work and pointing out inaccuracies, as well as
- miscellaneous support.</para>
- </listitem>
- </itemizedlist>
- </sect1>
-</article>
diff --git a/en_US.ISO8859-1/articles/freebsd-questions/Makefile b/en_US.ISO8859-1/articles/freebsd-questions/Makefile
deleted file mode 100644
index 16296d21ff..0000000000
--- a/en_US.ISO8859-1/articles/freebsd-questions/Makefile
+++ /dev/null
@@ -1,23 +0,0 @@
-#
-# $FreeBSD: doc/en_US.ISO_8859-1/articles/committers-guide/Makefile,v 1.3 1999/09/06 06:52:35 peter Exp $
-#
-
-MAINTAINER=grog@FreeBSD.org
-
-DOC?= article
-
-FORMATS?= html
-
-INSTALL_COMPRESSED?= gz
-INSTALL_ONLY_COMPRESSED?=
-
-#
-# SRCS lists the individual SGML files that make up the document. Changes
-# to any of these files will force a rebuild
-#
-
-# SGML content
-SRCS= article.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/freebsd-questions/article.sgml b/en_US.ISO8859-1/articles/freebsd-questions/article.sgml
deleted file mode 100644
index 2e3394c91b..0000000000
--- a/en_US.ISO8859-1/articles/freebsd-questions/article.sgml
+++ /dev/null
@@ -1,564 +0,0 @@
-<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man;
-]>
-
-<article>
- <articleinfo>
- <title>How to get best results from the FreeBSD-questions mailing
- list</title>
-
- <author>
- <firstname>Greg</firstname>
- <surname>Lehey</surname>
-
- <affiliation>
- <address><email>grog@FreeBSD.org</email></address>
- </affiliation>
- </author>
-
- <pubdate>$FreeBSD: doc/en_US.ISO8859-1/articles/freebsd-questions/article.sgml,v 1.5 2001/07/17 20:51:47 chern Exp $</pubdate>
-
- <abstract>
- <para>This document provides useful information for people looking to
- prepare an e-mail to the FreeBSD-questions mailing list. Advice and
- hints are given that will maximise the chance that the reader will
- receive useful replies.</para>
-
- <para>This document is regularly posted to the FreeBSD-questions mailing
- list.</para>
- </abstract>
- </articleinfo>
-
- <sect1>
- <title id="Introduction">Introduction</title>
-
- <para><literal>FreeBSD-questions</literal> is a mailing list maintained by
- the FreeBSD project to help people who have questions about the normal
- use of FreeBSD. Another group, <literal>FreeBSD-hackers</literal>,
- discusses more advanced questions such as future development
- work.</para>
-
- <note>
- <para>The term <quote>hacker</quote> has nothing to do with breaking
- into other people's computers. The correct term for the latter
- activity is <quote>cracker</quote>, but the popular press hasn't found
- out yet. The FreeBSD hackers disapprove strongly of cracking
- security, and have nothing to do with it. For a longer description of
- hackers, see Eric Raymond's <ulink
- url="http://www.tuxedo.org/~esr/faqs/hacker-howto.html">How To Become
- A Hacker</ulink></para>
- </note>
-
- <para>This is a regular posting aimed to help both those seeking advice
- from FreeBSD-questions (the <quote>newcomers</quote>), and also those
- who answer the questions (the <quote>hackers</quote>).</para>
-
- <para>Inevitably there is some friction, which stems from the different
- viewpoints of the two groups. The newcomers accuse the hackers of being
- arrogant, stuck-up, and unhelpful, while the hackers accuse the
- newcomers of being stupid, unable to read plain English, and expecting
- everything to be handed to them on a silver platter. Of course, there's
- an element of truth in both these claims, but for the most part these
- viewpoints come from a sense of frustration.</para>
-
- <para>In this document, I'd like to do something to relieve this
- frustration and help everybody get better results from
- FreeBSD-questions. In the following section, I recommend how to submit
- a question; after that, we'll look at how to answer one.</para>
- </sect1>
-
- <sect1>
- <title id="subscribe">How to subscribe to FreeBSD-questions</title>
-
- <para>FreeBSD-questions is a mailing list, so you need mail access. Send
- a mail message to <email>majordomo@FreeBSD.org</email> with the single
- line:</para>
-
- <literallayout class="monospaced">subscribe FreeBSD-questions</literallayout>
-
- <para><application>majordomo</application> is an automatic program which
- maintains the mailing list, so you don't need a subject line. If your
- mailer complains, however, you can put anything you like in the subject
- line.</para>
-
- <para>When you get the reply from <application>majordomo</application>
- telling you the details of the list, <emphasis>please save
- it</emphasis>. If you ever should want to leave the list, you'll need
- the information there. See the next section for more details.</para>
- </sect1>
-
- <sect1>
- <title id="unsubscribe">How to unsubscribe from FreeBSD-questions</title>
-
- <para>When you subscribed to FreeBSD-questions, you got a welcome message
- from <email>Majordomo@FreeBSD.ORG</email>. In this message, amongst
- other things, it told you how to unsubscribe. Here's a typical
- message:</para>
-
- <literallayout class="monospaced">Welcome to the freebsd-questions mailing list!
-
-If you ever want to remove yourself from this mailing list, you can send
-mail to "Majordomo@FreeBSD.ORG" with the following command in the body
-of your email message:
-
-unsubscribe freebsd-questions Greg Lehey &lt;grog@lemis.de&gt;
-
-Here's the general information for the list you've subscribed to,
-in case you don't already have it:
-
-FREEBSD-QUESTIONS User questions
-This is the mailing list for questions about FreeBSD.
-You should not send "how to" questions to the technical lists unless
-you consider the question to be pretty technical.</literallayout>
-
- <para>Normally, unsubscribing is even simpler than the message suggests:
- you don't need to specify your mail ID unless it is different from the
- one which you specified when you subscribed.</para>
-
- <para>If Majordomo replies and tells you (incorrectly) that you're not on
- the list, this may mean one of two things:</para>
-
- <orderedlist>
- <listitem>
- <para>You have changed your mail ID since you subscribed. That's
- where keeping the original message from <literal>majordomo</literal>
- comes in handy. For example, the sample message above shows my mail
- ID as <literal>grog@lemis.de</literal>. Since then, I have changed
- it to <literal>grog@lemis.com</literal>. If I were to try to remove
- <literal>grog@lemis.com</literal> from the list, it would fail: I
- would have to specify the name with which I joined.</para>
- </listitem>
-
- <listitem>
- <para>You're subscribed to a mailing list which is subscribed to
- <literal>FreeBSD-questions</literal>. If that's the case, you'll
- have to figure out which one it is and get your name taken off that
- one. If you're not sure which one it might be, check the headers of
- the messages you receive from freebsd-questions: maybe there's a
- clue there.</para>
- </listitem>
- </orderedlist>
-
- <para>If you've done all this, and you still can't figure out what's going
- on, send a message to <email>Postmaster@FreeBSD.org</email>, and he will
- sort things out for you. <emphasis>Don't</emphasis> send a message to
- FreeBSD-questions: they can't help you.</para>
- </sect1>
-
- <sect1>
- <title id="askwho">Should I ask <literal>-questions</literal> or
- <literal>-hackers</literal>?</title>
-
- <para>Two mailing lists handle general questions about FreeBSD,
- <literal>FreeBSD-questions</literal> and
- <literal>FreeBSD-hackers</literal>. In some cases, it's not really
- clear which group you should ask. The following criteria should help
- for 99% of all questions, however:</para>
-
- <orderedlist>
- <listitem>
- <para>If the question is of a general nature, ask
- <literal>FreeBSD-questions</literal>. Examples might be questions
- about installing FreeBSD or the use of a particular UNIX
- utility.</para>
- </listitem>
-
- <listitem>
- <para>If you think the question relates to a bug, but you're not sure,
- or you don't know how to look for it, send the message to
- <literal>FreeBSD-questions</literal>.</para>
- </listitem>
-
- <listitem>
- <para>If the question relates to a bug, and you're
- <emphasis>sure</emphasis> that it's a bug (for example, you can
- pinpoint the place in the code where it happens, and you maybe have
- a fix), then send the message to
- <literal>FreeBSD-hackers</literal>.</para>
- </listitem>
-
- <listitem>
- <para>If the question relates to enhancements to FreeBSD, and you
- can make suggestions about how to implement them, then send the
- message to <literal>FreeBSD-hackers</literal>.</para>
- </listitem>
- </orderedlist>
-
- <para>There are also a number of other specialized mailing lists, for
- example <literal>FreeBSD-isp</literal>, which caters to the interests of
- ISPs (Internet Service Providers) who run FreeBSD. If you happen to be
- an ISP, this doesn't mean you should automatically send your questions
- to <literal>FreeBSD-isp</literal>. The criteria above still apply, and
- it's in your interest to stick to them, since you're more likely to get
- good results that way.</para>
- </sect1>
-
- <sect1>
- <title id="submit">How to submit a question</title>
-
- <para>When submitting a question to FreeBSD-questions, consider the
- following points:</para>
-
- <itemizedlist>
- <listitem>
- <para>Remember that nobody gets paid for answering a FreeBSD
- question. They do it of their own free will. You can influence this
- free will positively by submitting a well-formulated question
- supplying as much relevant information as possible. You can
- influence this free will negatively by submitting an incomplete,
- illegible, or rude question. It's perfectly possible to send a
- message to FreeBSD-questions and not get an answer even if you
- follow these rules. It's much more possible to not get an answer if
- you don't. In the rest of this document, we'll look at how to get
- the most out of your question to FreeBSD-questions.</para>
- </listitem>
-
- <listitem>
- <para>Not everybody who answers FreeBSD questions reads every message:
- they look at the subject line and decide whether it interests them.
- Clearly, it's in your interest to specify a subject. ``FreeBSD
- problem'' or ``Help'' aren't enough. If you provide no subject at
- all, many people won't bother reading it. If your subject isn't
- specific enough, the people who can answer it may not read
- it.</para>
- </listitem>
-
- <listitem>
- <para>Format your message so that it is legible, and
- PLEASE DON'T SHOUT!!!!!. We appreciate that a lot of people don't
- speak English as their first language, and we try to make
- allowances for that, but it's really painful to try to read a
- message written full of typos or without any line breaks.</para>
-
- <para>Don't underestimate the effect that a poorly formatted mail
- message has, not just on the FreeBSD-questions mailing list.
- Your mail message is all people see of you, and if it's poorly
- formatted, one line per paragraph, badly spelt, or full of
- errors, it will give people a poor impression of you.</para>
-
- <para>A lot of badly formatted messages come from
- <ulink url="http://www.lemis.com/email.html">bad mailers or badly
- configured mailers</ulink>. The following mailers are known to
- send out badly formatted messages without you finding out about
- them:</para>
-
- <itemizedlist>
- <listitem>
- <para>cc:Mail</para>
- </listitem>
-
- <listitem>
- <para>Eudora</para>
- </listitem>
-
- <listitem>
- <para>exmh</para>
- </listitem>
-
- <listitem>
- <para>Microsoft Exchange</para>
- </listitem>
-
- <listitem>
- <para>Microsoft Internet Mail</para>
- </listitem>
-
- <listitem>
- <para>Microsoft Outlook</para>
- </listitem>
-
- <listitem>
- <para>Netscape</para>
- </listitem>
- </itemizedlist>
-
- <para>As you can see, the mailers in the Microsoft world are frequent
- offenders. If at all possible, use a UNIX mailer. If you must use a
- mailer under Microsoft environments, make sure it is set up
- correctly. Try not to use <acronym>MIME</acronym>: a lot of people
- use mailers which don't get on very well with
- <acronym>MIME</acronym>.</para>
- </listitem>
-
- <listitem>
- <para>Make sure your time and time zone are set correctly. This may
- seem a little silly, since your message still gets there, but many
- of the people you are trying to reach get several hundred messages a
- day. They frequently sort the incoming messages by subject and by
- date, and if your message doesn't come before the first answer, they
- may assume they missed it and not bother to look.</para>
- </listitem>
-
- <listitem>
- <para>Don't include unrelated questions in the same message. Firstly,
- a long message tends to scare people off, and secondly, it's more
- difficult to get all the people who can answer all the questions to
- read the message.</para>
- </listitem>
-
- <listitem>
- <para>Specify as much information as possible. This is a difficult
- area, and we need to expand on what information you need to submit,
- but here's a start:</para>
-
- <itemizedlist>
- <listitem>
- <para>In nearly every case, it's important to know the version of
- FreeBSD you're running. This is particularly the case for
- FreeBSD-CURRENT, where you should also specify the date of the
- sources, though of course you shouldn't be sending questions
- about -CURRENT to FreeBSD-questions.</para>
- </listitem>
-
- <listitem><para>With any problem which <emphasis>could</emphasis> be
- hardware related, tell us about your hardware. In case of
- doubt, assume it's possible that it's hardware. What kind of
- CPU are you using? How fast? What motherboard? How much
- memory? What peripherals?</para>
-
- <para>There's a judgement call here, of course, but the output of
- the &man.dmesg.8; command can frequently be very useful, since it
- tells not just what hardware you're running, but what version of
- FreeBSD as well.</para>
- </listitem>
-
- <listitem>
- <para>If you get error messages, don't say <quote>I get error
- messages</quote>, say (for example) <quote>I get the error
- message 'No route to host'</quote>.</para>
- </listitem>
-
- <listitem>
- <para>If your system panics, don't say <quote>My system
- panicked</quote>, say (for example) <quote>my system panicked
- with the message 'free vnode isn't'</quote>.</para>
- </listitem>
-
- <listitem>
- <para>If you have difficulty installing FreeBSD, please tell us
- what hardware you have. In particular, it's important to know
- the IRQs and I/O addresses of the boards installed in your
- machine.</para>
- </listitem>
-
- <listitem>
- <para>If you have difficulty getting PPP to run, describe the
- configuration. Which version of PPP do you use? What kind of
- authentication do you have? Do you have a static or dynamic IP
- address? What kind of messages do you get in the log
- file?</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para>A lot of the information you need to supply is the output of
- programs, such as &man.dmesg.8;, or console messages, which usually
- appear in <filename>/var/log/messages</filename>. Don't try to copy
- this information by typing it in again; it's a real pain, and you're
- bound to make a mistake. To send log file contents, either make a
- copy of the file and use an editor to trim the information to what
- is relevant, or cut and paste into your message. For the output of
- programs like &man.dmesg.8;, redirect the output to a file and
- include that. For example,</para>
-
- <screen>&prompt.user; <userinput>dmesg &gt; /tmp/dmesg.out</userinput></screen>
-
- <para>This redirects the information to the file
- <filename>/tmp/dmesg.out</filename>.</para>
- </listitem>
-
- <listitem>
- <para>If you do all this, and you still don't get an answer, there
- could be other reasons. For example, the problem is so complicated
- that nobody knows the answer, or the person who does know the answer
- was offline. If you don't get an answer after, say, a week, it
- might help to re-send the message. If you don't get an answer to
- your second message, though, you're probably not going to get one
- from this forum. Resending the same message again and again will
- only make you unpopular.</para>
- </listitem>
- </itemizedlist>
-
- <para>To summarize, let's assume you know the answer to the following
- question (yes, it's the same one in each case).
- You choose which of these two questions you would be more prepared to
- answer:</para>
-
- <example>
- <title>Message 1</title>
-
- <literallayout class="monospaced">Subject: HELP!!?!??
-I just can't get hits damn silly FereBSD system to
-workd, and Im really good at this tsuff, but I have never seen
-anythign sho difficult to install, it jst wont work whatever I try
-so why don't y9ou guys tell me what I doing wrong.</literallayout>
- </example>
-
- <example>
- <title>Message 2</title>
-
- <literallayout class="monospaced">Subject: Problems installing FreeBSD
-
-I've just got the FreeBSD 2.1.5 CDROM from Walnut Creek, and I'm having a lot
-of difficulty installing it. I have a 66 MHz 486 with 16 MB of
-memory and an Adaptec 1540A SCSI board, a 1.2GB Quantum Fireball
-disk and a Toshiba 3501XA CDROM drive. The installation works just
-fine, but when I try to reboot the system, I get the message
-``Missing Operating System''.</literallayout>
- </example>
- </sect1>
-
- <sect1>
- <title id="followup">How to follow up to a question</title>
-
- <para>Often you will want to send in additional information to a question
- you have already sent. The best way to do this is to reply to your
- original message. This has three advantages:</para>
-
- <orderedlist>
- <listitem>
- <para>You include the original message text, so people will know what
- you're talking about. Don't forget to trim unnecessary text out,
- though.</para>
- </listitem>
-
- <listitem>
- <para>The text in the subject line stays the same (you did remember to
- put one in, didn't you?). Many mailers will sort messages by
- subject. This helps group messages together.</para>
- </listitem>
-
- <listitem>
- <para>The message reference numbers in the header will refer to the
- previous message. Some mailers, such as
- <ulink url="http://www.mutt.org/">mutt</ulink>, can
- <emphasis>thread</emphasis> messages, showing the exact
- relationships between the messages.</para>
- </listitem>
- </orderedlist>
- </sect1>
-
- <sect1>
- <title id="answer">How to answer a question</title>
-
-
- <para>Before you answer a question to FreeBSD-questions, consider:</para>
-
- <orderedlist>
- <listitem>
- <para>A lot of the points on submitting questions also apply to
- answering questions. Read them.</para>
- </listitem>
-
- <listitem>
- <para>Has somebody already answered the question? The easiest way to
- check this is to sort your incoming mail by subject: then
- (hopefully) you'll see the question followed by any answers, all
- together.</para>
-
- <para>If somebody has already answered it, it doesn't automatically
- mean that you shouldn't send another answer. But it makes sense to
- read all the other answers first.</para>
- </listitem>
-
- <listitem>
- <para>Do you have something to contribute beyond what has already been
- said? In general, <quote>Yeah, me too</quote> answers don't help
- much, although there are exceptions, like when somebody is
- describing a problem he's having, and he doesn't know whether it's
- his fault or whether there's something wrong with the hardware or
- software. If you do send a <quote>me too</quote> answer, you should
- also include any further relevant information.</para>
- </listitem>
-
- <listitem>
- <para>Are you sure you understand the question? Very frequently, the
- person who asks the question is confused or doesn't express himself
- very well. Even with the best understanding of the system, it's
- easy to send a reply which doesn't answer the question. This
- doesn't help: you'll leave the person who submitted the question
- more frustrated or confused than ever. If nobody else answers, and
- you're not too sure either, you can always ask for more
- information.</para>
- </listitem>
-
- <listitem>
- <para>Are you sure your answer is correct?
- If not, wait a day or so. If nobody else comes up with a
- better answer, you can still reply and say, for example, <quote>I
- don't know if this is correct, but since nobody else has
- replied, why don't you try replacing your ATAPI CDROM with
- a frog?</quote>.</para>
- </listitem>
-
- <listitem>
- <para>Unless there's a good reason to do otherwise, reply to the
- sender and to FreeBSD-questions. Many people on the
- FreeBSD-questions are <quote>lurkers</quote>: they learn by reading
- messages sent and replied to by others. If you take a message which
- is of general interest off the list, you're depriving these people
- of their information. Be careful with group replies; lots of people
- send messages with hundreds of CCs. If this is the case, be sure to
- trim the Cc: lines appropriately.</para>
- </listitem>
-
- <listitem>
- <para>Include relevant text from the original message. Trim it to the
- minimum, but don't overdo it. It should still be possible for
- somebody who didn't read the original message to understand what
- you're talking about.</para>
- </listitem>
-
- <listitem>
- <para>Use some technique to identify which text came from the original
- message, and which text you add. I personally find that prepending
- <quote><literal>&gt; </literal></quote> to the original message
- works best. Leaving white space after the
- <quote><literal>&gt; </literal></quote> and leave empty lines
- between your text and the original text both make the result more
- readable.</para>
- </listitem>
-
- <listitem>
- <para>Put your response in the correct place (after the text to which
- it replies). It's very difficult to read a thread of responses
- where each reply comes before the text to which it replies.</para>
- </listitem>
-
- <listitem>
- <para>Most mailers change the subject line on a reply by prepending a
- text such as <quote>Re: </quote>. If your mailer doesn't do it
- automatically, you should do it manually.</para>
- </listitem>
-
- <listitem>
- <para>If the submitter didn't abide by format conventions (lines too
- long, inappropriate subject line), <emphasis>please</emphasis> fix
- it. In the case of an incorrect subject line (such as
- <quote>HELP!!??</quote>), change the subject line to (say)
- <quote>Re: Difficulties with sync PPP (was: HELP!!??)</quote>. That
- way other people trying to follow the thread will have less
- difficulty following it.</para>
-
- <para>In such cases, it's appropriate to say what you did and why you
- did it, but try not to be rude. If you find you can't answer
- without being rude, don't answer.</para>
-
- <para>If you just want to reply to a message because of its bad
- format, just reply to the submitter, not to the list. You can just
- send him this message in reply, if you like.</para>
- </listitem>
- </orderedlist>
- </sect1>
-</article>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- End:
--->
diff --git a/en_US.ISO8859-1/articles/ipsec-must/Makefile b/en_US.ISO8859-1/articles/ipsec-must/Makefile
deleted file mode 100644
index 5a348e95df..0000000000
--- a/en_US.ISO8859-1/articles/ipsec-must/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-# $FreeBSD: doc/en_US.ISO8859-1/articles/ipsec-must/Makefile,v 1.1 2000/06/26 09:10:24 nik Exp $
-
-DOC?= article
-
-FORMATS?= html
-
-INSTALL_COMPRESSED?=gz
-INSTALL_ONLY_COMPRESSED?=
-
-SRCS= article.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/ipsec-must/article.sgml b/en_US.ISO8859-1/articles/ipsec-must/article.sgml
deleted file mode 100644
index 886e73a50a..0000000000
--- a/en_US.ISO8859-1/articles/ipsec-must/article.sgml
+++ /dev/null
@@ -1,338 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD: doc/en_US.ISO8859-1/articles/ipsec-must/article.sgml,v 1.7 2001/07/29 09:52:55 dd Exp $
--->
-
-<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man;
-]>
-
-<article>
- <articleinfo>
- <title>Independent Verification of IPSec Functionality in FreeBSD</title>
-
- <author>
- <firstname>David</firstname>
- <surname>Honig</surname>
-
- <affiliation>
- <address><email>honig@sprynet.com</email></address>
- </affiliation>
- </author>
-
- <pubdate>3 May 1999</pubdate>
-
- <abstract>
- <para>You installed IPsec and it seems to be working. How do you
- know? I describe a method for experimentally verifying that IPsec is
- working.</para>
- </abstract>
- </articleinfo>
-
- <sect1>
- <title>The Problem</title>
-
- <para>First, let's assume you have <link linkend="ipsec-install">
- installed <emphasis>IPsec</emphasis></link>. How do you know
- it's <link linkend="caveat">working</link>? Sure, your
- connection won't work if its misconfigured, and it will work
- when you finally get it right. &man.netstat.1; will list it.
- But can you independently confirm it?</para>
- </sect1>
-
- <sect1>
- <title>The Solution</title>
-
- <para>First, some crypto-relevant info theory:</para>
-
- <orderedlist>
- <listitem>
- <para>encrypted data is uniformly distributed, i.e., has maximal
- entropy per symbol;</para>
- </listitem>
-
- <listitem>
- <para>raw, uncompressed data is typically redundant, i.e., has
- sub-maximal entropy.</para>
- </listitem>
- </orderedlist>
-
- <para>Suppose you could measure the entropy of the data to- and
- from- your network interface. Then you could see the difference
- between unencrypted data and encrypted data. This would be true
- even if some of the data in <quote>encrypted mode</quote> was
- not encrypted---as the outermost IP header must be, if the
- packet is to be routable.</para>
-
- <sect2 id="MUST">
- <title>MUST</title>
-
- <para>Ueli Maurer's <quote>Universal Statistical Test for Random
- Bit Generators</quote>(<ulink
- url="http://www.geocities.com/SiliconValley/Code/4704/universal.pdf">
- <acronym>MUST</acronym></ulink>) quickly measures the entropy
- of a sample. It uses a compression-like algorithm. <link
- linkend="code">The code is given below</link> for a variant
- which measures successive (~quarter megabyte) chunks of a
- file.</para>
- </sect2>
-
- <sect2 id="tcpdump">
- <title>Tcpdump</title>
-
- <para>We also need a way to capture the raw network data. A
- program called &man.tcpdump.1; lets you do this, if you have
- enabled the <emphasis>Berkeley Packet Filter</emphasis>
- interface in your <link linkend="kernel">kernel's config
- file</link>.</para>
-
- <para>The command</para>
-
- <screen><userinput><command>tcpdump</command> -c 4000 -s 10000 -w <replaceable>dumpfile.bin</replaceable></userinput></screen>
-
- <para>will capture 4000 raw packets to
- <replaceable>dumpfile.bin</replaceable>. Up to 10,000 bytes per
- packet will be captured in this example.</para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>The Experiment</title>
-
- <para>Here's the experiment.</para>
-
- <procedure>
- <step>
- <para>Open a window to an IPsec host and another window to an
- insecure host.</para>
- </step>
-
- <step>
- <para>Now start <link linkend="tcpdump">capturing
- packets</link>.</para>
- </step>
-
- <step>
- <para>In the <quote>secure</quote> window, run the Unix
- command &man.yes.1;, which will stream the <literal>y</literal>
- character. After a while, stop this. Switch to the
- insecure window, and repeat. After a while, stop.</para>
- </step>
-
- <step>
- <para>Now run <link linkend="code">MUST</link> on the
- captured packets. You should see something like the
- following. The important thing to note is that the secure
- connection has 93% (6.7) of the expected value (7.18), and
- the <quote>normal</quote> connection has 29% (2.1) of the
- expected value.</para>
-
- <screen>&prompt.user; <userinput>tcpdump -c 4000 -s 10000 -w <replaceable>ipsecdemo.bin</replaceable></userinput>
-&prompt.user; <userinput>uliscan <replaceable>ipsecdemo.bin</replaceable></userinput>
-
-Uliscan 21 Dec 98
-L=8 256 258560
-Measuring file ipsecdemo.bin
-Init done
-Expected value for L=8 is 7.1836656
-6.9396 --------------------------------------------------------
-6.6177 -----------------------------------------------------
-6.4100 ---------------------------------------------------
-2.1101 -----------------
-2.0838 -----------------
-2.0983 -----------------</screen>
- </step>
- </procedure>
- </sect1>
-
- <sect1 id="caveat">
- <title>Caveat</title>
-
- <para>This experiment shows that IPsec <emphasis>does</emphasis>
- seem to be distributing the payload data
- <emphasis>uniformly</emphasis>, as encryption should. However,
- the experiment described here <emphasis>cannot</emphasis>
- detect many possible flaws in a system (none of which do I have
- any evidence for). These include poor key generation or
- exchange, data or keys being visible to others, use of weak
- algorithms, kernel subversion, etc. Study the source; know the
- code.</para>
- </sect1>
-
- <sect1 id="IPsec">
- <title>IPsec---Definition</title>
-
- <para>Internet Protocol security extensions to IPv4; required for
- IPv6. A protocol for negotiating encryption and authentication
- at the IP (host-to-host) level. SSL secures only one application
- socket; <application>SSH</application> secures only a login;
- <application>PGP</application> secures only a specified file or
- message. IPsec encrypts everything between two hosts.</para>
- </sect1>
-
- <sect1 id="ipsec-install">
- <title>Installing IPsec</title>
-
- <para>Most of the modern versions of FreeBSD have IPsec support
- in their base source. So you'll probably will need to include
- <option>IPSEC</option> option in your kernel config and, after
- kernel rebuild and reinstall, configure IPsec connections using
- &man.setkey.8; command.</para>
-
- <para>A comprehensive guide on running IPsec on FreeBSD is
- provided in <ulink
- url="../../books/handbook/ipsec.html">FreeBSD
- Handbook</ulink>.</para>
- </sect1>
-
- <sect1 id="kernel">
- <title>src/sys/i386/conf/KERNELNAME</title>
-
- <para>This needs to be present in the kernel config file in order
- to be able to capture network data with &man.tcpdump.1;. Be sure
- to run &man.config.8; after adding this, and rebuild and
- reinstall.</para>
-
- <programlisting>device bpf</programlisting>
- </sect1>
-
- <sect1 id="code">
- <title>Maurer's Universal Statistical Test (for block size=8
- bits)</title>
-
- <para>You can find the same code at <ulink
- url="http://www.geocities.com/SiliconValley/Code/4704/uliscanc.txt">
- this link</ulink>.</para>
-
-<programlisting>/*
- ULISCAN.c ---blocksize of 8
-
- 1 Oct 98
- 1 Dec 98
- 21 Dec 98 uliscan.c derived from ueli8.c
-
- This version has // comments removed for Sun cc
-
- This implements Ueli M Maurer's "Universal Statistical Test for Random
- Bit Generators" using L=8
-
- Accepts a filename on the command line; writes its results, with other
- info, to stdout.
-
- Handles input file exhaustion gracefully.
-
- Ref: J. Cryptology v 5 no 2, 1992 pp 89-105
- also on the web somewhere, which is where I found it.
-
- -David Honig
- honig@sprynet.com
-
- Usage:
- ULISCAN filename
- outputs to stdout
-*/
-
-#define L 8
-#define V (1&lt;&lt;L)
-#define Q (10*V)
-#define K (100 *Q)
-#define MAXSAMP (Q + K)
-
-#include &lt;stdio.h&gt;
-#include &lt;math.h&gt;
-
-int main(argc, argv)
-int argc;
-char **argv;
-{
- FILE *fptr;
- int i,j;
- int b, c;
- int table[V];
- double sum = 0.0;
- int iproduct = 1;
- int run;
-
- extern double log(/* double x */);
-
- printf("Uliscan 21 Dec 98 \nL=%d %d %d \n", L, V, MAXSAMP);
-
- if (argc &lt; 2) {
- printf("Usage: Uliscan filename\n");
- exit(-1);
- } else {
- printf("Measuring file %s\n", argv[1]);
- }
-
- fptr = fopen(argv[1],"rb");
-
- if (fptr == NULL) {
- printf("Can't find %s\n", argv[1]);
- exit(-1);
- }
-
- for (i = 0; i &lt; V; i++) {
- table[i] = 0;
- }
-
- for (i = 0; i &lt; Q; i++) {
- b = fgetc(fptr);
- table[b] = i;
- }
-
- printf("Init done\n");
-
- printf("Expected value for L=8 is 7.1836656\n");
-
- run = 1;
-
- while (run) {
- sum = 0.0;
- iproduct = 1;
-
- if (run)
- for (i = Q; run && i &lt; Q + K; i++) {
- j = i;
- b = fgetc(fptr);
-
- if (b &lt; 0)
- run = 0;
-
- if (run) {
- if (table[b] &gt; j)
- j += K;
-
- sum += log((double)(j-table[b]));
-
- table[b] = i;
- }
- }
-
- if (!run)
- printf("Premature end of file; read %d blocks.\n", i - Q);
-
- sum = (sum/((double)(i - Q))) / log(2.0);
- printf("%4.4f ", sum);
-
- for (i = 0; i &lt; (int)(sum*8.0 + 0.50); i++)
- printf("-");
-
- printf("\n");
-
- /* refill initial table */
- if (0) {
- for (i = 0; i &lt; Q; i++) {
- b = fgetc(fptr);
- if (b &lt; 0) {
- run = 0;
- } else {
- table[b] = i;
- }
- }
- }
- }
-}</programlisting>
- </sect1>
-</article>
diff --git a/en_US.ISO8859-1/articles/laptop/Makefile b/en_US.ISO8859-1/articles/laptop/Makefile
deleted file mode 100644
index 483154c25e..0000000000
--- a/en_US.ISO8859-1/articles/laptop/Makefile
+++ /dev/null
@@ -1,18 +0,0 @@
-#
-# $FreeBSD$
-#
-# Article about using FreeBSD on laptops
-#
-
-DOC?= article
-
-FORMATS?= html
-
-INSTALL_COMPRESSED?=gz
-INSTALL_ONLY_COMPRESSED?=
-
-SRCS= article.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/laptop/article.sgml b/en_US.ISO8859-1/articles/laptop/article.sgml
deleted file mode 100644
index b36463ee91..0000000000
--- a/en_US.ISO8859-1/articles/laptop/article.sgml
+++ /dev/null
@@ -1,179 +0,0 @@
-<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man;
-
-<!ENTITY % freebsd PUBLIC "-//FreeBSD//ENTITIES DocBook Miscellaneous FreeBSD Entities//EN">
-%freebsd;
-
-<!ENTITY % authors PUBLIC "-//FreeBSD//ENTITIES DocBook Author Entities//EN">
-%authors;
-
-<!ENTITY % mailing-lists PUBLIC "-//FreeBSD//ENTITIES DocBook Mailing List Entities//EN">
-%mailing-lists;
-]>
-
-<article>
- <articleinfo>
- <title>FreeBSD on Laptops</title>
-
- <pubdate>$FreeBSD$</pubdate>
-
- <abstract>
- <para>FreeBSD works fine on most laptops, with a few caveats.
- Some issues specific to running FreeBSD on laptops, relating
- to different hardware requirements from desktops, are
- discussed below.</para>
- </abstract>
- </articleinfo>
-
- <para>FreeBSD is often thought of as a server operating system, but
- it works just fine on the desktop, and if you want to use it on
- your laptop you can enjoy all the usual benefits: systematic
- layout, easy administration and upgrading, the ports/packages
- system for adding software, and so on. (Its other benefits,
- such as stability, network performance, and performance under
- a heavy load, may not be obvious on a laptop, of course.)
- However, installing it on laptops often involves problems which
- are not encountered on desktop machines and are not commonly
- discussed (laptops, even more than desktops, are fine-tuned for
- Microsoft Windows). This article aims to discuss some of these
- issues.</para>
-
- <sect1>
- <title>XFree86</title>
-
- <para>Recent versions of XFree86 work with most display adapters
- available on laptops these days. Acceleration may not be
- supported, but a generic SVGA configuration should work.</para>
-
- <para>Check your laptop documentation for which card you have,
- and check in the XFree86 documentation (or setup program)
- to see whether it's specifically supported. If it's not, use
- a generic device (don't go for a name which just looks
- similar). In XFree86 version 4, you can try your luck
- with the command <userinput>XFree86 -configure</userinput>
- which auto-detects a lot of configurations.</para>
-
- <para>The problem often is configuring the monitor. Common
- resources for XFree86 focus on CRT monitors; getting a
- suitable modeline for an LCD display may be tricky. You may
- be lucky and not need to specify a modeline, or just need to
- specify suitable HorizSync and VertRefresh ranges. If that
- doesn't work, the best option is to check web resources
- devoted to configuring X on laptops (these are often
- linux-oriented sites but it doesn't matter because both systems
- use XFree86) and copy a modeline posted by someone for similar
- hardware.</para>
-
- <para>Most laptops come with two buttons on their pointing
- devices, which is rather problematic in X (since the middle
- button is commonly used to paste text); you can map a
- simultaneous left-right click in your X configuration to
- a middle button click with the line
-<programlisting>
-Option "Emulate3Buttons"
-</programlisting>
- in the XF86Config file in the "InputDevice" section (for XFree86
- version 4; for version 3, put just the line "Emulate3Buttons",
- without the quotes, in the "Pointer" section.)
- </sect1>
-
- <sect1>
- <title>Modems</title>
- <para>
- Laptops usually come with internal (on-board) modems.
- Unfortunately, this almost always means they are "winmodems" whose
- functionality is implemented in software, for which only windows
- drivers are normally available (though a few drivers are beginning
- to show up for other operating systems). Otherwise, you
- need to buy an external modem: the most compact option is
- probably a PC-Card (PCMCIA) modem, discussed below, but
- serial or USB modems may be cheaper. Generally, regular
- modems (non-winmodems) should work fine.
- </para>
-
- </sect1>
-
- <sect1>
- <title>PCMCIA (PC-card) devices</title>
-
- <para> Most laptops come with PCMCIA (also called PC-card)
- slots; these are supported fine under FreeBSD. Look through
- your boot-up messages (using dmesg) and see whether these were
- detected correctly (they should appear as
- <devicename>pccard0</devicename>,
- <devicename>pccard1</devicename> etc on devices like
- <devicename>pcic0</devicename>).</para>
-
- <para>FreeBSD currently supports 16-bit PCMCIA cards, but not
- 32-bit ("CardBus") cards. A database of supported cards is in
- the file <filename>/etc/defaults/pccard.conf</filename>. Look
- through it, and preferably buy cards listed there. Cards not
- listed may also work as "generic" devices: in particular most
- modems (16-bit) should work fine, provided they're not
- winmodems (these do exist even as PC-cards, so watch out). If
- your card is recognised as a generic modem, note that the
- default pccard.conf file specifies a delay time of 10 seconds
- (to avoid freezes on certain modems); this may well be
- over-cautious for your modem, so you may want to play with it,
- reducing it or removing it totally.</para>
-
- <para>Some parts of pccard.conf may need editing. Check the irq
- line, and be sure to remove any number already being used: in
- particular, if you have an on board sound card, remove irq 5
- (otherwise you may experience hangs when you insert a card).
- Check also the available memory slots; if your card is not
- being detected, try changing it to one of the other allowed
- values (listed in the man page &man.pccardc.8;).
- </para>
-
- <para>If it's not running already, start the pccardd daemon.
- (To enable it at boot time, add
- <programlisting>pccardd_enable="YES"</programlisting> to
- <filename>/etc/rc.conf</filename>). Now your cards should be
- detected when you insert and remove them, and you should get
- log messages about new devices being enabled.</para>
-
- <para>There have been major changes to the pccard code
- (including ISA routing of interrupts, for machines whose
- PCIBIOS FreeBSD can't seem to use) before the FreeBSD 4.4
- release. If you have problems, try upgrading your system.
-
- </sect1>
-
- <sect1>
-
- <title>Power management</title>
-
- <para>Unfortunately, this is not very reliably supported under
- FreeBSD. If you're lucky, some functions may work reliably;
- or they may not work at all.</para>
-
- <para>To enable this, you may need to compile a kernel with
- power management support (<literal>device apm0</literal>) or
- add an option to <filename>/boot/loader.conf</filename>, and
- also enable the apm daemon at boot time (line
- <literal>apm_enable="YES"</literal> in
- <filename>/etc/rc.conf</filename>). The apm commands are
- listed in the &man.apm.8; manpage. For instance,
- <command>apm -b</command> gives you battery status (or 255 if
- not supported), <command>apm -Z</command> puts the laptop on
- standby, <command>apm -z</command> (or zzz) suspends it. To
- shutdown and power off the machine, use "shutdown -p".
- Again, some or all of these functions may not work very well
- or at all. You may find that laptop suspension/standby works
- in console mode but not under X (that is, the screen doesn't
- come on again; in that case, switch to a virtual console
- (using Ctrl-Alt-F1 or another function key) and then execute
- the apm command.
- </para>
-
- <para>The X window system (XFree86) also includes display power
- management (look at the &man.xset.1; man page, and search for
- dpms there). You may want to investigate this. However, this,
- too, works inconsistently on laptops: it
- often turns off the display but doesn't turn off the
- backlight.</para>
-
- </sect1>
-</article>
diff --git a/en_US.ISO8859-1/articles/mh/Makefile b/en_US.ISO8859-1/articles/mh/Makefile
deleted file mode 100644
index 886e21cc9d..0000000000
--- a/en_US.ISO8859-1/articles/mh/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-# $FreeBSD$
-
-DOC?= article
-
-FORMATS?= html
-
-INSTALL_COMPRESSED?=gz
-INSTALL_ONLY_COMPRESSED?=
-
-SRCS= article.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/mh/article.sgml b/en_US.ISO8859-1/articles/mh/article.sgml
deleted file mode 100644
index 91025e8ff1..0000000000
--- a/en_US.ISO8859-1/articles/mh/article.sgml
+++ /dev/null
@@ -1,763 +0,0 @@
-<!-- $FreeBSD: doc/en_US.ISO8859-1/articles/mh/article.sgml,v 1.12 2001/07/11 13:13:41 nik Exp $ -->
-<!-- FreeBSD Documentation Project -->
-
-<!DOCTYPE ARTICLE PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN">
-<article>
- <articleinfo>
- <title>An MH Primer</title>
-
- <authorgroup>
- <author>
- <firstname>Matt</firstname>
-
- <surname>Midboe</surname>
-
- <affiliation>
- <address>
- <email>matt@garply.com</email>
- </address>
- </affiliation>
- </author>
- </authorgroup>
-
- <pubdate>v1.0, 16 January 1996</pubdate>
-
- <abstract>
- <para>This document contains an introduction to using MH on
- FreeBSD</para>
- </abstract>
- </articleinfo>
-
- <sect1 id="mhintro">
- <title>Introduction</title>
-
- <para>MH started back in 1977 at the RAND Corporation, where the
- initial philosophies behind MH were developed. MH isn't so much
- a monolithic email program but a philosophy about how best to
- develop tools for reading email. The MH developers have done a
- great job adhering to the <acronym>KISS</acronym> principle: Keep It
- Simple Stupid. Rather than have one large program for reading,
- sending and handling email they have written specialized
- programs for each part of your email life. One might liken MH to
- the specialization that one finds in insects and nature. Each
- tool in MH does one thing, and does it very well.</para>
-
- <para>Beyond just the various tools that one uses to handle their
- email MH has done an excellent job keeping the configuration of
- each of these tools consistent and uniform. In fact, if you are
- not quite sure how something is supposed to work or what the
- arguments for some command are supposed to be then you can
- generally guess and be right. Each MH command is consistent
- about how it handles reading the configuration files and how it
- takes arguments on the command line. One useful thing to
- remember is that you can always add a <option>-help</option> to
- the command to have it display the options for that
- command.</para>
-
- <para>The first thing that you need to do is to make sure that you
- have installed the MH package on your FreeBSD machine. If you
- installed from CDROM you should be able to execute the following
- to load mh:
-
- <informalexample>
- <screen>&prompt.root; <userinput>pkg_add /cdrom/packages/mh-6.8.3.tgz</userinput></screen>
- </informalexample>
-
- You will notice that it created a <filename>/usr/local/lib/mh</filename>
- directory for you as well as adding several binaries to the
- <filename>/usr/local/bin</filename> directory. If you would prefer to
- compile it yourself then you can anonymous ftp it from <ulink
- URL="ftp://ftp.ics.uci.edu/">ftp.ics.uci.edu</ulink> or <ulink
- URL="ftp://louie.udel.edu/">louie.udel.edu</ulink>.</para>
-
- <para>This primer is not a full comprehensive explanation of how
- MH works. This is just intended to get you started on the road
- to happier, faster mail reading. You should read the man pages
- for the various commands. Also you might want to read the <ulink
- URL="news:comp.mail.mh">comp.mail.mh</ulink> newsgroup. Also
- you can read the <ulink
- URL="http://www.cis.ohio-state.edu/hypertext/faq/usenet/mh-faq/part1/faq.html">FAQ
- for MH</ulink>. The best resource for MH is the O'Reilly and
- Associates book written by Jerry Peek.</para>
- </sect1>
-
- <sect1>
- <title>Reading Mail</title>
-
- <para>This section covers how to use <command>inc</command>,
- <command>show</command>, <command>scan</command>, <command>next</command>,
- <command>prev</command>, <command>rmm</command>, <command>rmf</command>, and
- <command>msgchk</command>. One of the best things about MH is the
- consistent interface between programs. A few things to keep in
- mind when using these commands is how to specify message lists.
- In the case of <command>inc</command> this doesn't really make any
- sense but with commands like <command>show</command> it is useful to
- know. </para>
-
- <para>A message list can consist of something like <parameter>23
- 20 16</parameter> which will act on messages 23, 20 and 16. This is
- fairly simple but you can do more useful things like
- <parameter>23-30</parameter> which will act on all the messages between
- 23 and 30. You can also specify something like
- <parameter>cur:10</parameter> which will act on the current message and
- the next 9 messages. The <parameter>cur</parameter>, <parameter>last</parameter>,
- and <parameter>first</parameter> messages are special messages that refer
- to the current, last or first message in the folder.</para>
-
- <sect2 id="inc">
- <title><command>inc</command>, <command>msgchk</command>&mdash;read in your
- new email or check it</title>
-
- <para>If you just type in <userinput>inc</userinput> and hit
- <keycap>return</keycap> you will be well on your way to getting
- started with MH. The first time you run <command>inc</command> it
- will setup your account to use all the MH defaults and ask you
- about creating a Mail directory. If you have mail waiting to
- be downloaded you will see something that looks like:</para>
-
- <informalexample>
- <screen> 29 01/15 Doug White Re: Another Failed to boot problem&lt;&lt;On Mon, 15 J
- 30 01/16 "Jordan K. Hubbar Re: FBSD 2.1&lt;&lt;&gt; Do you want a library instead of
- 31 01/16 Bruce Evans Re: location of bad144 table&lt;&lt;&gt;&gt; &gt;It would appea
- 32 01/16 "Jordan K. Hubbar Re: video is up&lt;&lt;&gt; Anyway, mrouted won't run, ev
- 33 01/16 Michael Smith Re: FBSD 2.1&lt;&lt;Nate Williams stands accused of sa</screen>
- </informalexample>
-
- <para>This is the same thing you will see from a
- <command>scan</command> (see <xref linkend="scan">). If you just run
- <command>inc</command> with no arguments it will look on your
- computer for email that is supposed to be coming to
- you.</para>
-
- <para>A lot of people like to use POP for grabbing their email.
- MH can do POP to grab your email. You will need to give
- <command>inc</command> a few command line arguments.</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>inc -host mail.pop.org -user <replaceable>username</replaceable> -norpop</userinput></screen>
- </informalexample>
-
- <para>That tells <command>inc</command> to go to
- <parameter>mail.pop.org</parameter> to download your email, and that
- your username on their system is <replaceable>username</replaceable>. The
- <option>-norpop</option> option tells <command>inc</command> to use
- plain POP3 for downloading your email. MH has support for a
- few different dialects of POP. More than likely you will never
- ever need to use them though. While you can do more complex
- things with inc such as audit files and scan format files this
- will get you going.</para>
-
- <para>The <command>msgchk</command> command is used to get information
- on whether or not you have new email. <command>msgchk</command> takes
- the same <option>-host</option> and <option>-user</option>
- options that <command>inc</command> takes.</para>
- </sect2>
-
- <sect2 id="show">
- <title><command>show</command>, <command>next</command> and
- <command>prev</command>&mdash;displaying and moving through
- email</title>
-
- <para><command>show</command> is to show a letter in your current
- folder. Like <command>inc</command>, <command>show</command> is a fairly
- straightforward command. If you just type <userinput>show</userinput>
- and hit <keycap>return</keycap> then it displays the current
- message. You can also give specific message numbers to
- show:</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>show 32 45 56</userinput></screen>
- </informalexample>
-
- <para>This would display message numbers 32, 45 and 56 right
- after each other. Unless you change the default behavior
- <command>show</command> basically just does a <command>more</command> on the
- email message.</para>
-
- <para><command>next</command> is used to move onto the next message and
- <command>prev</command> will go to the previous message. Both
- commands have an implied <command>show</command> command so that when
- you go to the next message it automatically displays
- it.</para>
- </sect2>
-
- <sect2 id="scan">
- <title><command>scan</command>&mdash;shows you a scan of your
- messages</title>
-
- <para><command>scan</command> will display a brief listing of the
- messages in your current folder. This is an example of what
- the <command>scan</command> command will give you.</para>
-
- <informalexample>
- <screen> 30+ 01/16 Jordan K. Hubbar Re: FBSD 2.1&lt;&lt;&gt; Do you want a library instead of
- 31 01/16 Bruce Evans Re: location of bad144 table&lt;&lt;&gt;&gt; &gt;It would appea
- 32 01/16 Jordan K. Hubbar Re: video is up&lt;&lt;&gt; Anyway, mrouted won't run, ev
- 33 01/16 Michael Smith Re: FBSD 2.1&lt;&lt;Nate Williams stands accused of sa</screen>
- </informalexample>
-
- <para>Like just about everything in MH this display is very
- configurable. This is the typical default display. It gives
- you the message number, the date on the email, the sender, the
- subject line, and a sentence fragment from the very beginning
- of the email if it can fit it. The <literal>+</literal> means that
- message is the current message, so if you do a
- <command>show</command> it will display that message.</para>
-
- <para>One useful option for scan is the
- <option>-reverse</option> option. This will list your messages
- with the highest message number first and lowest message
- number last. Another useful option with <command>scan</command> is to
- have it read from a file. If you want to scan your incoming
- mailbox on FreeBSD without having to <command>inc</command> it you
- can do <command>scan -file
- /var/mail/<replaceable>username</replaceable></command>. This can be used
- with any file that is in the <database>mbox</database> format.</para>
- </sect2>
-
- <sect2 id="rmm">
- <title><command>rmm</command> and <command>rmf</command>&mdash;remove the
- current message or folder</title>
-
- <para><command>rmm</command> is used to remove a mail message. The
- default is typically to not actually remove the message but to
- rename the file to one that is ignored by the MH commands. You
- will periodically need to go through and physically delete the
- <quote>removed</quote> messages.</para>
-
- <para>The <command>rmf</command> command is used to remove folders.
- This doesn't just rename the files but actually removes the
- from the hard drive so you should be careful when you use this
- command.</para>
- </sect2>
-
- <sect2 id="samplereading">
- <title>A typical session of reading with MH</title>
-
- <para>The first thing that you will want to do is
- <command>inc</command> your new mail. So at a shell prompt just type
- in <command>inc</command> and hit <keycap>return</keycap>.</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>inc</userinput>
-Incorporating new mail into inbox...
-
- 36+ 01/19 Stephen L. Lange Request...&lt;&lt;Please remove me as contact for pind
- 37 01/19 Matt Thomas Re: kern/950: Two PCI bridge chips fail (multipl
- 38 01/19 Amancio Hasty Jr Re: FreeBSD and VAT&lt;&lt;&gt;&gt;&gt; Bill Fenner said: &gt; In
-&prompt.user;</screen>
- </informalexample>
-
- <para>This shows you the new email that has been added to your
- mailbox. So the next thing to do is <command>show</command> the email
- and move around.</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>show</userinput>
-Received: by sashimi.wwa.com (Smail3.1.29.1 #2)
- id m0tdMZ2-001W2UC; Fri, 19 Jan 96 13:33 CST
-Date: Fri, 19 Jan 1996 13:33:31 -0600 (CST)
-From: "Stephen L. Lange" &lt;stvlange@wwa.com&gt;
-To: matt@garply.com
-Subject: Request...
-Message-Id: &lt;Pine.BSD.3.91.960119133211.824A-100000@sashimi.wwa.com&gt;
-Mime-Version: 1.0
-Content-Type: TEXT/PLAIN; charset=US-ASCII
-
-
-Please remove me as contact for pindat.com
-
-&prompt.user; <userinput>rmm</userinput>
-&prompt.user; <userinput>next</userinput>
-Received: from localhost (localhost [127.0.0.1]) by whydos.lkg.dec.com (8.6.11/8
-.6.9) with SMTP id RAA24416; Fri, 19 Jan 1996 17:56:48 GMT
-Message-Id: &lt;199601191756.RAA24416@whydos.lkg.dec.com&gt;
-X-Authentication-Warning: whydos.lkg.dec.com: Host localhost didn't use HELO pro
-tocol
-To: hsu@clinet.fi
-Cc: hackers@FreeBSD.org
-Subject: Re: kern/950: Two PCI bridge chips fail (multiple multiport ethernet
- boards)
-In-Reply-To: Your message of "Fri, 19 Jan 1996 00:18:36 +0100."
- &lt;199601182318.AA11772@Sysiphos&gt;
-X-Mailer: exmh version 1.5omega 10/6/94
-Date: Fri, 19 Jan 1996 17:56:40 +0000
-From: Matt Thomas &lt;matt@lkg.dec.com&gt;
-Sender: owner-hackers@FreeBSD.org
-Precedence: bulk
-
-
-This is due to a typo in pcireg.h (to
-which I am probably the guilty party).</screen>
- </informalexample>
-
- <para>The <command>rmm</command> removed the current message and the
- <command>next</command> command moved me on to the next message. Now
- if I wanted to look at ten most recent messages so I could
- read one of them here is what I would do:</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>scan last:10</userinput>
- 26 01/16 maddy Re: Testing some stuff&lt;&lt;yeah, well, Trinity has
- 27 01/17 Automatic digest NET-HAPPENINGS Digest - 16 Jan 1996 to 17 Jan 19
- 28 01/17 Evans A Criswell Re: Hey dude&lt;&lt;&gt;From matt@tempest.garply.com Tue
- 29 01/16 Karl Heuer need configure/make volunteers&lt;&lt;The FSF is looki
- 30 01/18 Paul Stephanouk Re: [alt.religion.scientology] Raw Meat (humor)&lt;
- 31 01/18 Bill Lenherr Re: Linux NIS Solaris&lt;&lt;--- On Thu, 18 Jan 1996 1
- 34 01/19 John Fieber Re: Stuff for the email section?&lt;&lt;On Fri, 19 Jan
- 35 01/19 support@foo.garpl [garply.com #1138] parlor&lt;&lt;Hello. This is the Ne
- 37+ 01/19 Matt Thomas Re: kern/950: Two PCI bridge chips fail (multipl
- 38 01/19 Amancio Hasty Jr Re: FreeBSD and VAT&lt;&lt;&gt;&gt;&gt; Bill Fenner said: &gt; In
-&prompt.user;</screen>
- </informalexample>
-
- <para>Then if I wanted to read message number 27 I would do a
- <userinput>show 27</userinput> and it would be displayed. As you can
- probably tell from this sample session MH is pretty easy to
- use and looking through emails and displaying them is fairly
- intuitive and easy.</para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Folders and Mail Searching</title>
-
- <para>Anybody who gets lots of email definitely wants to be able
- to prioritize, stamp, brief, de-brief, and number their emails
- in a variety of different ways. MH can do this better than just
- about anything. One thing that we haven't really talked about is
- the concept of folders. You have undoubtedly come across the
- folders concept using other email programs. MH has folders too.
- MH can even do sub-folders of a folder. One thing you should
- keep in mind with MH is that when you ran <command>inc</command> for
- the first time and it asked you if it could create a
- <filename>Mail</filename> directory it began storing everything in that
- directory. If you look at that directory you will find a
- directory named <filename>inbox</filename>. The <filename>inbox</filename>
- directory houses all of your incoming mail that hasn't been
- thrown anywhere else.</para>
-
- <para>Whenever you create a new folder a new directory is going to
- be created underneath your MH <filename>Mail</filename> directory, and
- messages in that folder are going to be stored in that
- directory. When new email comes in that new email is thrown
- into your <filename>inbox</filename> directory with a file name that is
- equivalent to the message number. So even if you didn't have
- any of the MH tools to read your email you could still use
- standard Unix commands to munge around in those directories and
- just more your files. It's this simplicity that really gives you
- a lot of power with what you can do with your email.</para>
-
- <para>Just as you can use message lists like <parameter>23 16
- 42</parameter> with most MH commands there is a folder option you can
- specify with just about every MH command. If you do a
- <command>scan +freebsd</command> it will scan your <filename>freebsd</filename>
- folder, and your current folder will be changed to
- <filename>freebsd</filename>. If you do a <command>show +freebsd 23 16
- 42</command>, <command>show</command> is going to switch to your
- <filename>freebsd</filename> folder and display messages 23, 16 and 42.
- So remember that <option>+<replaceable>folder</replaceable></option> syntax. You
- will need to make sure you use it to make commands process
- different folders. Remember you default folder for mail is
- <filename>inbox</filename> so doing a <command>folder +inbox</command> should
- always get you back to your mail. Of course, in MH's infinite
- flexibility this can be changed but most places have probably
- left it as <command>inbox</command>.</para>
-
- <sect2>
- <title><command>pick</command>&mdash;search email that matches certain
- criteria</title>
-
- <para><command>pick</command> is one of the more complex commands in
- the MH system. So you might want to read the
- <citerefentry><refentrytitle>pick</refentrytitle><manvolnum>1</manvolnum></citerefentry> man
- page for a more thorough understanding. At its simplest level
- you can do something like</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>pick -search pci</userinput>
-15
-42
-55
-56
-57</screen>
- </informalexample>
-
- <para>This will tell <command>pick</command> to look through every
- single line in every message in your current folder and tell
- you which message numbers it found the word <literal>pci</literal>
- in. You can then <command>show</command> those messages and read them
- if you wish or <command>rmm</command> them. You would have to specify
- something like <command>show 15 42 55-57</command> to display them
- though. A slightly more useful thing to do is this:</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>pick -search pci -seq pick</userinput>
-5 hits
-&prompt.user; <userinput>show pick</userinput></screen>
- </informalexample>
-
- <para>This will show you the same messages you just didn't have
- to work as hard to do it. The <option>-seq</option> option is
- really an abbreviation of <option>-sequence</option> and
- <command>pick</command> is just a sequence which contains the message
- numbers that matched. You can use sequences with just about
- any MH command. So you could have done an <command>rmm pick</command>
- and all those messages would be removed instead. You sequence
- can be named anything. If you run pick again it will overwrite
- the old sequence if you use the same name.</para>
-
- <para>Doing a <command>pick -search</command> can be a bit more
- time consuming than just searching for message from someone,
- or to someone. So <command>pick</command> allows you to use the
- following predefined search criteria:</para>
-
- <variablelist>
- <varlistentry>
- <term><option>-to</option></term>
-
- <listitem>
- <para>search based upon who the message is to</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-cc</option></term>
-
- <listitem>
- <para>search based on who is in the cc list</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-from</option></term>
-
- <listitem>
- <para>search for who sent the message</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-subject</option></term>
-
- <listitem>
- <para>search for emails with this subject</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-date</option></term>
-
- <listitem>
- <para>find emails with a matching dat</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>--<replaceable>component</replaceable></option></term>
-
- <listitem>
- <para>search for any other component in the header. (i.e.
- <option>--reply-to</option> to find all emails with a certain
- reply-to in the header)</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>This allows you to do things like
-
- <informalexample>
- <screen>&prompt.user; <userinput>pick -to freebsd-hackers@FreeBSD.org -seq hackers</userinput></screen>
- </informalexample>
-
- to get a list of all the email send to the FreeBSD hackers
- mailing list. <command>pick</command> also allows you to group these
- criteria in different ways using the following options:</para>
-
- <itemizedlist>
- <listitem>
- <para>&hellip; <option>-and</option> &hellip;</para>
- </listitem>
-
- <listitem>
- <para>&hellip; <option>-or</option> &hellip</para>
- </listitem>
-
- <listitem>
- <para><option>-not</option> &hellip;</para>
- </listitem>
-
- <listitem>
- <para><option>-lbrace</option> &hellip;
- <option>-rbrace</option></para>
- </listitem>
- </itemizedlist>
-
- <para>These commands allow you to do things like</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>pick -to freebsd-hackers -or -cc freebsd-hackers</userinput></screen>
- </informalexample>
-
- <para>That will grab all the email in your inbox that was sent
- to freebsd-hackers or cc'd to that list. The brace options
- allow you to group search criteria together. This is sometimes
- very necessary as in the following example</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>pick -lbrace -to freebsd-hackers -and
- -not -cc freebsd-questions -rbrace -and -subject pci</userinput></screen>
- </informalexample>
-
- <para>Basically this says <quote>pick (to freebsd-hackers and
- not cc'd on freebsd-questions) and the subject is
- pci</quote>. It should look through your folder and find
- all messages sent to the freebsd-hackers list that aren't cc'd
- to the freebsd-questions list that contain something on pci in
- the subject line. Ordinarily you might have to worry about
- something called operator precedence. Remember in math how you
- evaluate from left to right and you do multiplication and
- division first and addition and subtraction second? MH has the
- same type of rules for <command>pick</command>. It's fairly complex
- so you might want to study the man page. This document is just
- to help you get acquainted with MH.</para>
- </sect2>
-
- <sect2>
- <title><command>folder</command>, <command>folders</command>,
- <command>refile</command>&mdash;three useful programs for folder
- maintenance</title>
-
- <para>There are three programs which are primarily just for
- manipulating your folders. The <command>folder</command> program is
- used to switch between folders, pack them, and list them. At
- its simplest level you can do a <command>folder
- +<replaceable>newfolder</replaceable></command> and you will be switched into
- <replaceable>newfolder</replaceable>. From there on out all your MH
- commands like <command>comp</command>, <command>repl</command>,
- <command>scan</command>, and <command>show</command> will act on that
- <command>newfolder</command> folder.</para>
-
- <para>Sometimes when you are reading and deleting messages you
- will develop <quote>holes</quote> in your folders. If you do a
- <command>scan</command> you might just see messages 34, 35, 36, 43,
- 55, 56, 57, 80. If you do a <command>folder -pack</command>
- this will renumber all your messages so that there are no
- holes. It doesn't actually delete any messages though. So you
- may need to periodically go through and physically delete
- <command>rmm</command>'d messages.</para>
-
- <para>If you need statistics on your folders you can do a
- <command>folders</command> or <command>folder -all</command> to list
- all your folders, how many messages they have, what the
- current message is in each one and so on. This line of stats
- it displays for all your folders is the same one you get when
- you change to a folder with <command>folder +foldername</command>. A
- <command>folders</command> command looks like this:</para>
-
- <informalexample>
- <screen> Folder # of messages ( range ); cur msg (other files)
- announce has 1 message ( 1- 1).
- drafts has no messages.
- f-hackers has 43 messages ( 1- 43).
- f-questions has 16 messages ( 1- 16).
- inbox+ has 35 messages ( 1- 38); cur= 37.
- lists has 8 messages ( 1- 8).
- netfuture has 1 message ( 1- 1).
- out has 31 messages ( 1- 31).
- personal has 6 messages ( 1- 6).
- todo has 58 messages ( 1- 58); cur= 1.
-
- TOTAL= 199 messages in 13 folders.</screen>
- </informalexample>
-
- <para>The <command>refile</command> command is what you use to move
- messages between folders. When you do something like
- <command>refile 23 +netfuture</command> message number 23 is moved
- into the <filename>netfuture</filename> folder. You could also do
- something like <command>refile 23 +netfuture/latest</command> which
- would put message number 23 in a subfolder called
- <filename>latest</filename> under the <filename>netfuture</filename> folder.
- If you want to keep a message in the current folder and link
- it you can do a <command>refile -link 23 +netfuture</command>
- which would keep 23 in your current <filename>inbox</filename> but
- also list in your <filename>netfuture</filename> folder. You are
- probably beginning to realize some of the really powerful
- things you can do with MH.</para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Sending Mail</title>
-
- <para>Email is a two way street for most people so you want to be
- able to send something back. The way MH handles sending mail can
- be a bit difficult to follow at first, but it allows for
- incredible flexibility. The first thing MH does is to copy a
- components file into your outgoing email. A components file is
- basically a skeleton email letter with stuff like the To: and
- Subject: headers already in it. You are then sent into your
- editor where you fill in the header information and then type
- the body of your message below the dashed lines in the message.
- Then to the <command>whatnow</command> program. When you are at the
- <prompt>What now?</prompt> prompt you can tell it to
- <command>send</command>, <command>list</command>, <command>edit</command>,
- <command>edit</command>, <command>push</command>, and <command>quit</command>. Most
- of these commands are self-explanatory. So the message sending
- process involves copying a component file, editing your email,
- and then telling the <command>whatnow</command> program what to do with
- your email.</para>
-
- <sect2>
- <title><command>comp</command>, <command>forw</command>,
- <command>reply</command>&mdash;compose, forward or reply to a message
- to someone</title>
-
- <para>The <command>comp</command> program has a few useful command line
- options. The most important one to know right now is the
- <option>-editor</option> option. When MH is installed the
- default editor is usually a program called
- <command>prompter</command> which comes with MH. It's not a very
- exciting editor and basically just gets the job done. So when
- you go to compose a message to someone you might want to use
- <command>comp -editor /usr/bin/vi</command> or <command>comp -editor
- /usr/local/bin/pico</command> instead. Once you have run
- <emphasis>comp</emphasis> you are in your editor and you see
- something that looks like this:</para>
-
- <informalexample>
- <screen>To:
-cc:
-Subject:
---------</screen>
- </informalexample>
-
- <para>You need to put the person you are sending the mail to
- after the <literal>To:</literal> line. It works the same way for the
- other headers also, so you would need to put your subject
- after the <literal>Subject:</literal> line. Then you would just put
- the body of your message after the dashed lines. It may seem a
- bit simplistic since a lot of email programs have special
- requesters that ask you for this information but there really
- isn't any point to that. Plus this really gives you excellent
- flexibility.</para>
-
- <informalexample>
- <screen>To:<userinput>freebsd-rave@FreeBSD.org</userinput>
-cc:
-Subject:<userinput>And on the 8th day God created the FreeBSD core team</userinput>
---------
-<userinput>Wow this is an amazing operating system. Thanks!</userinput></screen>
- </informalexample>
-
- <para>You can now save this message and exit your editor. You
- will see the <prompt>What now?</prompt> prompt and you can type in
- <userinput>send</userinput> or <userinput>s</userinput> and hit
- <keycap>return</keycap>. Then the FreeBSD core team will receive
- their just rewards. As I mentioned earlier you can also use
- other commands, for example <command>quit</command> if you don't want
- to send the message.</para>
-
- <para>The <command>forw</command> command is stunningly similar. The
- big difference being that the message you are forwarding is
- automatically included in the outgoing message. When you run
- <command>forw</command> it will forward your current message. You can
- always tell it to forward something else by doing something
- like <command>forw 23</command> and then message number 23 will be
- put in your outgoing message instead of the current message.
- Beyond those small differences <command>forw</command> functions
- exactly the same as <command>comp</command>. You go through the exact
- same message sending process.</para>
-
- <para>The <command>repl</command> command will reply to whatever your
- current message is, unless you give it a different message to
- reply to. <command>repl</command> will do its best to go ahead and
- fill in some of the email headers already. So you will notice
- that the <literal>To:</literal> header already has the address of the
- recipient in there. Also the <literal>Subject:</literal> line will
- already be filled in. You then go about the normal message
- composition process and you are done. One useful command line
- option to know here is the <option>-cc</option> option. You
- can use <parameter>all</parameter>, <parameter>to</parameter>, <parameter>cc</parameter>,
- <parameter>me</parameter> after the <option>-cc</option> option to have
- <command>repl</command> automatically add the various addresses to
- the cc list in the message. You have probably noticed that the
- original message isn't included. This is because most MH
- setups are configured to do this from the start.</para>
- </sect2>
-
- <sect2>
- <title><filename>components</filename>, and
- <filename>replcomps</filename>&mdash;components files for
- <command>comp</command> and <command>repl</command></title>
-
- <para>The <filename>components</filename> file is usually in
- <filename>/usr/local/lib/mh</filename>. You can copy that file
- into your MH Mail directory and edit to contain what you want
- it to contain. It is a fairly basic file. You have various
- email headers at the top, a dashed line and then nothing. The
- <command>comp</command> command just copies this
- <filename>components</filename> file and then edits it. You can add
- any kind of valid RFC822 header you want. For instance you
- could have something like this in your <filename>components</filename>
- file:</para>
-
- <informalexample>
- <screen>To:
-Fcc: out
-Subject:
-X-Mailer: MH 6.8.3
-X-Home-Page: http://www.FreeBSD.org/
--------</screen>
- </informalexample>
-
- <para>MH would then copy this components file and throw you into
- your editor. The <filename>components</filename> file is fairly
- simple. If you wanted to have a signature on those messages
- you would just put your signature in that
- <filename>components</filename> file.</para>
-
- <para>The <filename>replcomps</filename> file is a bit more complex. The
- default <filename>replcomps</filename> looks like this:</para>
-
- <informalexample>
- <screen>%(lit)%(formataddr %&lt;{reply-to}%?{from}%?{sender}%?{return-path}%&gt;)\
-%&lt;(nonnull)%(void(width))%(putaddr To: )\n%&gt;\
-%(lit)%(formataddr{to})%(formataddr{cc})%(formataddr(me))\
-%&lt;(nonnull)%(void(width))%(putaddr cc: )\n%&gt;\
-%&lt;{fcc}Fcc: %{fcc}\n%&gt;\
-%&lt;{subject}Subject: Re: %{subject}\n%&gt;\
-%&lt;{date}In-reply-to: Your message of "\
-%&lt;(nodate{date})%{date}%|%(pretty{date})%&gt;."%&lt;{message-id}
- %{message-id}%&gt;\n%&gt;\
---------</screen>
- </informalexample>
-
- <para>It's in the same basic format as the
- <filename>components</filename> file but it contains quite a few extra
- formatting codes. The <literal>%(lit)</literal> command makes room
- for the address. The <literal>%(formataddr</literal> is a function
- that returns a proper email address. The next part is
- <literal>%&lt;</literal> which means if and the
- <literal>{reply-to}</literal> means the reply-to field in the
- original message. So that might be translated this way:</para>
-
- <informalexample>
- <screen>%&lt;<emphasis remap=bf>if</emphasis> {reply-to} <emphasis remap=bf>the original message has a reply-to</emphasis>
-then give that to formataddr, %? <emphasis remap=bf>else</emphasis> {from} <emphasis remap=bf>take the
-from address</emphasis>, %? <emphasis remap=bf>else</emphasis> {sender} <emphasis remap=bf>take the sender address</emphasis>, %?
-<emphasis remap=bf>else</emphasis> {return-path} <emphasis remap=bf>take the return-path from the original
-message</emphasis>, %&gt; <emphasis remap=bf>endif</emphasis>.</screen>
- </informalexample>
-
- <para>As you can tell MH formatting can get rather involved. You
- can probably decipher what most of the other functions and
- variables mean. All of the information on writing these format
- strings is in the MH-Format man page. The really nice thing is
- that once you have built your customized
- <filename>replcomps</filename> file you won't need to touch it again.
- No other email program really gives you the power and
- flexibility that MH gives you.</para>
- </sect2>
- </sect1>
-</article>
diff --git a/en_US.ISO8859-1/articles/multi-os/Makefile b/en_US.ISO8859-1/articles/multi-os/Makefile
deleted file mode 100644
index 886e21cc9d..0000000000
--- a/en_US.ISO8859-1/articles/multi-os/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-# $FreeBSD$
-
-DOC?= article
-
-FORMATS?= html
-
-INSTALL_COMPRESSED?=gz
-INSTALL_ONLY_COMPRESSED?=
-
-SRCS= article.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/multi-os/article.sgml b/en_US.ISO8859-1/articles/multi-os/article.sgml
deleted file mode 100644
index c04c9ee501..0000000000
--- a/en_US.ISO8859-1/articles/multi-os/article.sgml
+++ /dev/null
@@ -1,740 +0,0 @@
-<!-- $FreeBSD: doc/en_US.ISO8859-1/articles/multi-os/article.sgml,v 1.17 2001/07/11 13:24:45 nik Exp $ -->
-<!DOCTYPE ARTICLE PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN">
-<article>
- <articleinfo>
- <title>Installing and Using FreeBSD With Other Operating Systems</title>
-
- <authorgroup>
- <author>
- <firstname>Jay</firstname>
-
- <surname>Richmond</surname>
-
- <affiliation>
- <address>
- <email>jayrich@sysc.com</email>
- </address>
- </affiliation>
- </author>
- </authorgroup>
-
- <pubdate>6 August 1996</pubdate>
-
- <abstract>
- <para>This document discusses how to make FreeBSD coexist nicely
- with other popular operating systems such as Linux, MS-DOS,
- OS/2, and Windows 95. Special thanks to: Annelise Anderson
- <email>andrsn@stanford.edu</email>, Randall Hopper
- <email>rhh@ct.picker.com</email>, and Jordan K. Hubbard
- <email>jkh@time.cdrom.com</email></para>
- </abstract>
- </articleinfo>
-
- <sect1>
- <title>Overview</title>
-
- <para>Most people can't fit these operating systems together
- comfortably without having a larger hard disk, so special
- information on large EIDE drives is included. Because there are
- so many combinations of possible operating systems and hard disk
- configurations, the <xref linkend="ch5"> section may be of the
- most use to you. It contains descriptions of specific working
- computer setups that use multiple operating systems.</para>
-
- <para>This document assumes that you have already made room on
- your hard disk for an additional operating system. Any time you
- repartition your hard drive, you run the risk of destroying the
- data on the original partitions. However, if your hard drive is
- completely occupied by DOS, you might find the FIPS utility
- (included on the FreeBSD CDROM in the
- <filename>\TOOLS</filename> directory or via <ulink
- URL="ftp://ftp.FreeBSD.org/pub/FreeBSD/tools">ftp</ulink>)
- useful. It lets you repartition your hard disk without
- destroying the data already on it. There is also a commercial
- program available called Partition Magic, which lets you size
- and delete partitions without consequence.</para>
- </sect1>
-
- <sect1 id="ch2">
- <title>Overview of Boot Managers</title>
-
- <para>These are just brief descriptions of some of the different
- boot managers you may encounter. Depending on your computer
- setup, you may find it useful to use more than one of them on
- the same system.</para>
-
- <variablelist>
- <varlistentry>
- <term>Boot Easy</term>
-
- <listitem>
- <para>This is the default boot manager used with FreeBSD.
- It has the ability to boot most anything, including BSD,
- OS/2 (HPFS), Windows 95 (FAT and FAT32), and Linux.
- Partitions are selected with the function keys.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>OS/2 Boot Manager</term>
-
- <listitem>
- <para>This will boot FAT, HPFS, FFS (FreeBSD), and EXT2
- (Linux). It will also boot FAT32 partitions. Partitions
- are selected using arrow keys. The OS/2 Boot Manager is
- the only one to use its own separate partition, unlike the
- others which use the master boot record (MBR). Therefore,
- it must be installed below the 1024th cylinder to avoid
- booting problems. It can boot Linux using LILO when it is
- part of the boot sector, not the MBR. Go to <ulink
- URL="http://www.linuxresources.com/LDP/HOWTO/HOWTO-INDEX.html">Linux
- HOWTOs</ulink> on the World Wide Web for more
- information on booting Linux with OS/2's boot
- manager.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>OS-BS</term>
-
- <listitem>
- <para>This is an alternative to Boot Easy. It gives you more
- control over the booting process, with the ability to set
- the default partition to boot and the booting timeout.
- The beta version of this programs allows you to boot by
- selecting the OS with your arrow keys. It is included on
- the FreeBSD CD in the <filename>\TOOLS</filename>
- directory, and via <ulink
- URL="ftp://ftp.FreeBSD.org/pub/FreeBSD/tools">ftp</ulink>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>LILO, or LInux LOader</term>
-
- <listitem>
- <para>This is a limited boot manager. It will boot FreeBSD,
- though some customization work is required in the LILO
- configuration file.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <note id="fat32">
- <title>About FAT32</title>
-
- <para>FAT32 is the replacement to the FAT filesystem included in
- Microsoft's OEM SR2 Beta release, which is expected to be
- utilized on computers pre-loaded with Windows 95 towards the
- end of 1996. It converts the normal FAT file system and
- allows you to use smaller cluster sizes for larger hard
- drives. FAT32 also modifies the traditional FAT boot sector
- and allocation table, making it incompatible with some boot
- managers.</para>
- </note>
- </sect1>
-
- <sect1 id="ch3">
- <title>A Typical Installation</title>
-
- <para>Let's say I have two large EIDE hard drives, and I want to
- install FreeBSD, Linux, and Windows 95 on them.</para>
-
- <para>Here's how I might do it using these hard disks:</para>
-
- <itemizedlist>
- <listitem>
- <para><filename>/dev/wd0</filename> (first physical hard disk)</para>
- </listitem>
-
- <listitem>
- <para><filename>/dev/wd1</filename> (second hard disk)</para>
- </listitem>
- </itemizedlist>
-
- <para>Both disks have 1416 cylinders.</para>
-
- <procedure>
- <step>
- <para>I boot from a MS-DOS or Windows 95 boot disk that
- contains the <filename>FDISK.EXE</filename> utility and make a small
- 50 meg primary partition (35-40 for Windows 95, plus a
- little breathing room) on the first disk. Also create a
- larger partition on the second hard disk for my Windows
- applications and data.</para>
- </step>
-
- <step>
- <para>I reboot and install Windows 95 (easier said than done)
- on the <filename>C:</filename> partition.</para>
- </step>
-
- <step>
- <para>The next thing I do is install Linux. I'm not sure
- about all the distributions of Linux, but slackware includes
- LILO (see <xref linkend="ch2">). When I am partitioning out
- my hard disk with Linux <command>fdisk</command>, I would
- put all of Linux on the first drive (maybe 300 megs for a
- nice root partition and some swap space).</para>
- </step>
-
- <step>
- <para>After I install Linux, and are prompted about installing
- LILO, make SURE that I install it on the boot sector of my
- root Linux partition, not in the MBR (master boot
- record).</para>
- </step>
-
- <step>
- <para>The remaining hard disk space can go to FreeBSD. I also
- make sure that my FreeBSD root slice does not go beyond the
- 1024th cylinder. (The 1024th cylinder is 528 megs into the
- disk with our hypothetical 720MB disks). I will use the
- rest of the hard drive (about 270 megs) for the
- <filename>/usr</filename> and <filename>/</filename> slices if I wish. The
- rest of the second hard disk (size depends on the amount of
- my Windows application/data partition that I created in step
- 1 can go to the <filename>/usr/src</filename> slice and swap
- space.</para>
- </step>
-
- <step>
- <para>When viewed with the Windows 95 <command>fdisk</command>
- utility, my hard drives should now look something like this:
-
- <screen>---------------------------------------------------------------------
-
- Display Partition Information
-
-Current fixed disk drive: 1
-
-Partition Status Type Volume_Label Mbytes System Usage
-C: 1 A PRI DOS 50 FAT** 7%
- 2 A Non-DOS (Linux) 300 43%
-
-Total disk space is 696 Mbytes (1 Mbyte = 1048576 bytes)
-
-Press Esc to continue
-
----------------------------------------------------------------------
-
- Display Partition Information
-
-Current fixed disk drive: 2
-
-Partition Status Type Volume_Label Mbytes System Usage
-D: 1 A PRI DOS 420 FAT** 60%
-
-Total disk space is 696 Mbytes (1 Mbyte = 1048576 bytes)
-
-Press Esc to continue
-
----------------------------------------------------------------------</screen>
- ** May say FAT16 or FAT32 if you are using the OEM SR2
- update. See <xref linkend="ch2">).</para>
- </step>
-
- <step>
- <para>Install FreeBSD. I make sure to boot with my first hard
- disk set at <quote>NORMAL</quote> in the BIOS. If it is not,
- I'll have the enter my true disk geometry at boot time (to
- get this, boot Windows 95 and consult Microsoft Diagnostics
- (<filename>MSD.EXE</filename>), or check your BIOS) with the
- parameter <literal>hd0=1416,16,63</literal> where
- <replaceable>1416</replaceable> is the number of cylinders on my hard
- disk, <replaceable>16</replaceable> is the number of heads per track,
- and <replaceable>63</replaceable> is the number of sectors per track on
- the drive.</para>
- </step>
-
- <step>
- <para>When partitioning out the hard disk, I make sure to
- install Boot Easy on the first disk. I don't worry about
- the second disk, nothing is booting off of it.</para>
- </step>
-
- <step>
- <para>When I reboot, Boot Easy should recognize my three
- bootable partitions as DOS (Windows 95), Linux, and BSD
- (FreeBSD).</para>
- </step>
- </procedure>
- </sect1>
-
- <sect1 id="ch4">
- <title>Special Considerations</title>
-
- <para>Most operating systems are very picky about where and how
- they are placed on the hard disk. Windows 95 and DOS need to be
- on the first primary partition on the first hard disk. OS/2 is
- the exception. It can be installed on the first or second disk
- in a primary or extended partition. If you are not sure, keep
- the beginning of the bootable partitions below the 1024th
- cylinder.</para>
-
- <para>If you install Windows 95 on an existing BSD system, it will
- <quote>destroy</quote> the MBR, and you will have to reinstall your
- previous boot manager. Boot Easy can be reinstalled by using
- the BOOTINST.EXE utility included in the \TOOLS directory on the
- CDROM, and via <ulink
- URL="ftp://ftp.FreeBSD.org/pub/FreeBSD/tools">ftp</ulink>.
- You can also re-start the installation process and go to the
- partition editor. From there, mark the FreeBSD partition as
- bootable, select Boot Manager, and then type W to (W)rite out
- the information to the MBR. You can now reboot, and Boot Easy
- should then recognize Windows 95 as DOS.</para>
-
- <para>Please keep in mind that OS/2 can read FAT and HPFS
- partitions, but not FFS (FreeBSD) or EXT2 (Linux) partitions.
- Likewise, Windows 95 can only read and write to FAT and FAT32
- (see <xref linkend="ch2">) partitions. FreeBSD can read most
- file systems, but currently cannot read HPFS partitions. Linux
- can read HPFS partitions, but can't write to them. Recent
- versions of the Linux kernel (2.x) can read and write to Windows
- 95 VFAT partitions (VFAT is what gives Windows 95 long file
- names - it's pretty much the same as FAT). Linux can read and
- write to most file systems. Got that? I hope so.</para>
- </sect1>
-
- <sect1 id="ch5">
- <title>Examples</title>
-
- <para><emphasis>(section needs work, please send your example to
- <email>jayrich@sysc.com</email>)</emphasis>.</para>
-
- <para>FreeBSD+Win95: If you installed FreeBSD after Windows 95,
- you should see <literal>DOS</literal> on the Boot Easy menu. This is
- Windows 95. If you installed Windows 95 after FreeBSD, read
- <xref linkend="ch4"> above. As long as your hard disk does not
- have 1024 cylinders you should not have a problem booting. If
- one of your partitions goes beyond the 1024th cylinder however,
- and you get messages like <errorname>invalid system disk</errorname>
- under DOS (Windows 95) and FreeBSD will not boot, try looking
- for a setting in your BIOS called <quote>&gt; 1024 cylinder
- support</quote> or <quote>NORMAL/LBA</quote> mode. DOS may need LBA
- (Logical Block Addressing) in order to boot correctly. If the
- idea of switching BIOS settings every time you boot up doesn't
- appeal to you, you can boot FreeBSD through DOS via the
- <filename>FBSDBOOT.EXE</filename> utility on the CD (It should find your
- FreeBSD partition and boot it.)</para>
-
- <para>FreeBSD+OS/2+Win95: Nothing new here. OS/2's boot manger
- can boot all of these operating systems, so that shouldn't be a
- problem.</para>
-
- <para>FreeBSD+Linux: You can also use Boot Easy to boot both
- operating systems.</para>
-
- <para>FreeBSD+Linux+Win95: (see <xref linkend="ch3">)</para>
- </sect1>
-
- <sect1 id="sources">
- <title>Other Sources of Help</title>
-
- <para>There are many <ulink
- URL="http://www.linuxresources.com/LDP/HOWTO/HOWTO-INDEX.html">Linux
- HOW-TOs</ulink> that deal with multiple operating systems on
- the same hard disk.</para>
-
- <para>The <ulink
- URL="http://www.linuxresources.com/LDP/HOWTO/mini/Linux+DOS+Win95+OS2.html">Linux+DOS+Win95+OS2
- mini-HOWTO</ulink> offers help on configuring the OS/2 boot
- manager, and the <ulink
- URL="http://www.linuxresources.com/LDP/HOWTO/mini/Linux+FreeBSD.html">Linux+FreeBSD
- mini-HOWTO</ulink> might be interesting as well. The <ulink
- URL="http://www.in.net/~jkatz/win95/Linux-HOWTO.html">Linux-HOWTO</ulink>
- is also helpful.</para>
-
- <para>The <ulink
- URL="http://www.dorsai.org/~dcl/publications/NTLDR_Hacking">NT
- Loader Hacking Guide</ulink> provides good information on
- multibooting Windows NT, '95, and DOS with other operating
- systems.</para>
-
- <para>And Hale Landis's "How It Works" document pack contains some
- good info on all sorts of disk geometry and booting related
- topics. You can find it at
- <ulink
- URL="ftp://fission.dt.wdc.com/pub/otherdocs/pc_systems/how_it_works/allhiw.zip">ftp://fission.dt.wdc.com/pub/otherdocs/pc_systems/how_it_works/allhiw.zip</ulink>.</para>
-
- <para>Finally, don't overlook FreeBSD's kernel documentation on
- the booting procedure, available in the kernel source
- distribution (it unpacks to <ulink
- URL="file:/usr/src/sys/i386/boot/biosboot/README.386BSD">file:/usr/src/sys/i386/boot/biosboot/README.386BSD</ulink>.</para>
- </sect1>
-
- <sect1>
- <title>Technical Details</title>
-
- <para><emphasis>(Contributed by Randall Hopper,
- <email>rhh@ct.picker.com</email>)</emphasis></para>
-
- <para>This section attempts to give you enough basic information
- about your hard disks and the disk booting process so that you
- can troubleshoot most problems you might encounter when getting
- set up to boot several operating systems. It starts in pretty
- basic terms, so you may want to skim down in this section until
- it begins to look unfamiliar and then start reading.</para>
-
- <sect2>
- <title>Disk Primer</title>
-
- <para>Three fundamental terms are used to describe the location
- of data on your hard disk: Cylinders, Heads, and Sectors.
- It's not particularly important to know what these terms
- relate to except to know that, together, they identify where
- data is physically on your disk.</para>
-
- <para>Your disk has a particular number of cylinders, number of
- heads, and number of sectors per cylinder-head (a
- cylinder-head also known nown as a track). Collectively this
- information defines the "physical disk geometry" for your hard
- disk. There are typically 512 bytes per sector, and 63
- sectors per track, with the number of cylinders and heads
- varying widely from disk to disk. Thus you can figure the
- number of bytes of data that'll fit on your own disk by
- calculating:</para>
-
- <informalexample>
- <para>(# of cylinders) &times; (# heads) &times; (63
- sectors/track) &times; (512 bytes/sect)</para>
- </informalexample>
-
- <para>For example, on my 1.6 Gig Western Digital AC31600 EIDE hard
- disk,that's:</para>
-
- <informalexample>
- <para>(3148 cyl) &times; (16 heads) &times; (63
- sectors/track) &times (512 bytes/sect)</para>
- </informalexample>
-
- <para>which is 1,624,670,208 bytes, or around 1.6 Gig.</para>
-
- <para>You can find out the physical disk geometry (number of
- cylinders, heads, and sectors/track counts) for your hard
- disks using ATAID or other programs off the net. Your hard
- disk probably came with this information as well. Be careful
- though: if you're using BIOS LBA (see <xref
- linkend="limits">), you can't use just any program to get
- the physical geometry. This is because many programs (e.g.
- <filename>MSD.EXE</filename> or FreeBSD fdisk) don't identify the
- physical disk geometry; they instead report the
- <firstterm>translated geometry</firstterm> (virtual numbers from using
- LBA). Stay tuned for what that means.</para>
-
- <para>One other useful thing about these terms. Given 3
- numbers&mdash;a cylinder number, a head number, and a
- sector-within-track number&mdash;you identify a specific
- absolute sector (a 512 byte block of data) on your disk.
- Cylinders and Heads are numbered up from 0, and Sectors are
- numbered up from 1.</para>
-
- <para>For those that are interested in more technical details,
- information on disk geometry, boot sectors, BIOSes, etc. can
- be found all over the net. Query Lycos, Yahoo, etc. for
- <literal>boot sector</literal> or <literal>master boot record</literal>.
- Among the useful info you'll find are Hale Landis's
- <citetitle>How It Works</citetitle> document pack. See the <xref
- linkend="sources"> section for a few pointers to this
- pack.</para>
-
- <para>Ok, enough terminology. We're talking about booting
- here.</para>
- </sect2>
-
- <sect2 id="booting">
- <title>The Booting Process</title>
-
- <para>On the first sector of your disk (Cyl 0, Head 0, Sector 1)
- lives the Master Boot Record (MBR). It contains a map of your
- disk. It identifies up to 4 <firstterm>partitions</firstterm>, each of
- which is a contiguous chunk of that disk. FreeBSD calls
- partitions <firstterm>slices</firstterm> to avoid confusion with it's
- own partitions, but we won't do that here. Each partition can
- contain its own operating system.</para>
-
- <para>Each partition entry in the MBR has a <firstterm>Partition
- ID</firstterm>, a <firstterm>Start Cylinder/Head/Sector</firstterm>, and an
- <firstterm>End Cylinder/Head/Sector</firstterm>. The Partition ID
- tells what type of partition it is (what OS) and the Start/End
- tells where it is. <xref linkend="tbl-pid"> lists a
- smattering of some common Partition IDs.</para>
-
- <table id="tbl-pid">
- <title>Partition IDs</title>
-
- <tgroup cols="2">
- <thead>
- <row>
- <entry>ID (hex)</entry>
- <entry>Description</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>01</entry>
- <entry>Primary DOS12 (12-bit FAT)</entry>
- </row>
-
- <row>
- <entry>04</entry>
- <entry>Primary DOS16 (16-bit FAT)</entry>
- </row>
-
- <row>
- <entry>05</entry>
- <entry>Extended DOS</entry>
- </row>
-
- <row>
- <entry>06</entry>
- <entry>Primary big DOS (&gt; 32MB)</entry>
- </row>
-
- <row>
- <entry>0A</entry>
- <entry>OS/2</entry>
- </row>
-
- <row>
- <entry>83</entry>
- <entry>Linux (EXT2FS)</entry>
- </row>
-
- <row>
- <entry>A5</entry>
- <entry>FreeBSD, NetBSD, 386BSD (UFS)</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <para>Note that not all partitions are bootable (e.g. Extended
- DOS). Some are&mdash;some aren't. What makes a partition
- bootable is the configuration of the <firstterm>Partition Boot
- Sector</firstterm> that exists at the beginning of each
- partition.</para>
-
- <para>When you configure your favorite boot manager, it looks up
- the entries in the MBR partition tables of all your hard disks
- and lets you name the entries in that list. Then when you
- boot, the boot manager is invoked by special code in the
- Master Boot Sector of the first probed hard disk on your
- system. It looks at the MBR partition table entry
- corresponding to the partition choice you made, uses the Start
- Cylinder/Head/Sector information for that partition, loads up
- the Partition Boot Sector for that partition, and gives it
- control. That Boot Sector for the partition itself contains
- enough information to start loading the operating system on
- that partition.</para>
-
- <para>One thing we just brushed past that's important to know.
- All of your hard disks have MBRs. However, the one that's
- important is the one on the disk that's first probed by the
- BIOS. If you have only IDE hard disks, its the first IDE disk
- (e.g. primary disk on first controller). Similarly for SCSI
- only systems. If you have both IDE and SCSI hard disks
- though, the IDE disk is typically probed first by the BIOS, so
- the first IDE disk is the first probed disk. The boot manager
- you will install will be hooked into the MBR on this first
- probed hard disk that we've just described.</para>
- </sect2>
-
- <sect2 id="limits">
- <title>Booting Limitations and Warnings</title>
-
- <para>Now the interesting stuff that you need to watch out
- for.</para>
-
- <sect3>
- <title>The dreaded 1024 cylinder limit and how BIOS LBA helps</title>
-
- <para>The first part of the booting process is all done
- through the BIOS, (if that's a new term to you, the BIOS is
- a software chip on your system motherboard which provides
- startup code for your computer). As such, this first part
- of the process is subject to the limitations of the BIOS
- interface.</para>
-
- <para>The BIOS interface used to read the hard disk during
- this period (INT 13H, Subfunction 2) allocates 10 bits to
- the Cylinder Number, 8 bits to the Head Number, and 6 bits
- to the Sector Number. This restricts users of this
- interface (i.e. boot managers hooked into your disk's MBR as
- well as OS loaders hooked into the Boot Sectors) to the
- following limits:</para>
-
- <itemizedlist>
- <listitem>
- <para>1024 cylinders, max</para>
- </listitem>
-
- <listitem>
- <para>256 heads, max</para>
- </listitem>
-
- <listitem>
- <para>64 sectors/track, max (actually 63, <literal>0</literal>
- isn't available)</para>
- </listitem>
- </itemizedlist>
-
- <para>Now big hard disks have lots of cylinders but not a lot
- of heads, so invariably with big hard disks the number of
- cylinders is greater than 1024. Given this and the BIOS
- interface as is, you can't boot off just anywhere on your
- hard disk. The boot code (the boot manager and the OS
- loader hooked into all bootable partitions' Boot Sectors)
- has to reside below cylinder 1024. In fact, if your hard
- disk is typical and has 16 heads, this equates to:</para>
-
- <informalexample>
- <para>1024 cyl/disk &times; 16 heads/disk &times; 63
- sect/(cyl-head) &times; 512 bytes/sector</para>
- </informalexample>
-
- <para>which is around the often-mentioned 528MB limit.</para>
-
- <para>This is where BIOS LBA (Logical Block Addressing) comes
- in. BIOS LBA gives the user of the BIOS API calls access to
- physical cylinders above 1024 though the BIOS interfaces by
- redefining a cylinder. That is, it remaps your cylinders
- and heads, making it appear through the BIOS as though the
- disk has fewer cylinders and more heads than it actually
- does. In other words, it takes advantage of the fact that
- hard disks have relatively few heads and lots of cylinders
- by shifting the balance between number of cylinders and
- number of heads so that both numbers lie below the
- above-mentioned limits (1024 cylinders, 256 heads).</para>
-
- <para>With BIOS LBA, the hard disk size limitation is
- virtually removed (well, pushed up to 8 Gigabytes anyway).
- If you have an LBA BIOS, you can put FreeBSD or any OS
- anywhere you want and not hit the 1024 cylinder
- limit.</para>
-
- <para>To use my 1.6 Gig Western Digital as an example again,
- it's physical geometry is:</para>
-
- <informalexample>
- <para>(3148 cyl, 16 heads, 63 sectors/track, 512
- bytes/sector)</para>
- </informalexample>
-
- <para>However, my BIOS LBA remaps this to:</para>
-
- <informalexample>
- <para>(787 cyl, 64 heads, 63 sectors/track, 512
- bytes/sector)</para>
- </informalexample>
-
- <para>giving the same effective size disk, but with cylinder
- and head counts within the BIOS API's range (Incidentally, I
- have both Linux and FreeBSD existing on one of my hard disks
- above the 1024th physical cylinder, and both operating
- systems boot fine, thanks to BIOS LBA).</para>
- </sect3>
-
- <sect3>
- <title>Boot Managers and Disk Allocation</title>
-
- <para>Another gotcha to watch out when installing boot
- managers is allocating space for your boot manager. It's
- best to be aware of this issue up front to save yourself
- from having to reinstall one or more of your OSs.</para>
-
- <para>If you followed the discussion in <xref
- linkend="booting"> about the Master Boot Sector (where the
- MBR is), Partition Boot Sectors, and the booting process,
- you may have been wondering just exactly where on your hard
- disk that nifty boot manager is going to live. Well, some
- boot managers are small enough to fit entirely within the
- Master Boot Sector (Cylinder 0, Head 0, Sector 0) along with
- the partition table. Others need a bit more room and
- actually extend a few sectors past the Master Boot Sector in
- the Cylinder 0 Head 0 track, since that's typically
- free&hellip;typically.</para>
-
- <para>That's the catch. Some operating systems (FreeBSD
- included) let you start their partitions right after the
- Master Boot Sector at Cylinder 0, Head 0, Sector 2 if you
- want. In fact, if you give FreeBSD's sysinstall a disk with
- an empty chunk up front or the whole disk empty, that's
- where it'll start the FreeBSD partition by default (at least
- it did when I fell into this trap). Then when you go to
- install your boot manager, if it's one that occupies a few
- extra sectors after the MBR, it'll overwrite the front of
- the first partition's data. In the case of FreeBSD, this
- overwrites the disk label, and renders your FreeBSD
- partition unbootable.</para>
-
- <para>The easy way to avoid this problem (and leave yourself
- the flexibility to try different boot managers later) is
- just to always leave the first full track on your disk
- unallocated when you partition your disk. That is, leave
- the space from Cylinder 0, Head 0, Sector 2 through Cylinder
- 0, Head 0, Sector 63 unallocated, and start your first
- partition at Cylinder 0, Head 1, Sector 1. For what it's
- worth, when you create a DOS partition at the front of your
- disk, DOS leaves this space open by default (this is why
- some boot managers assume it's free). So creating a DOS
- partition up at the front of your disk avoids this problem
- altogether. I like to do this myself, creating 1 Meg DOS
- partition up front, because it also avoids my primary DOS
- drive letters shifting later when I repartition.</para>
-
- <para>For reference, the following boot managers use the
- Master Boot Sector to store their code and data:</para>
-
- <itemizedlist>
- <listitem>
- <para>OS-BS 1.35</para>
- </listitem>
-
- <listitem>
- <para>Boot Easy</para>
- </listitem>
-
- <listitem>
- <para>LILO</para>
- </listitem>
- </itemizedlist>
-
- <para>These boot managers use a few additional sectors after
- the Master Boot Sector:</para>
-
- <itemizedlist>
- <listitem>
- <para>OS-BS 2.0 Beta 8 (sectors 2-5)</para>
- </listitem>
-
- <listitem>
- <para>OS/2's boot manager</para>
- </listitem>
- </itemizedlist>
- </sect3>
-
- <sect3>
- <title>What if your machine won't boot?</title>
-
- <para>At some point when installing boot managers, you might
- leave the MBR in a state such that your machine won't boot.
- This is unlikely, but possible when re-FDISKing underneath
- an already-installed boot manager.</para>
-
- <para>If you have a bootable DOS partition on your disk, you
- can boot off a DOS floppy, and run:</para>
-
- <informalexample>
- <screen>A:\> <userinput>FDISK /MBR</userinput></screen>
- </informalexample>
-
- <para>to put the original, simple DOS boot code back into the
- system. You can then boot DOS (and DOS only) off the hard
- drive. Alternatively, just re-run your boot manager
- installation program off a bootable floppy.</para>
- </sect3>
- </sect2>
- </sect1>
-</article>
diff --git a/en_US.ISO8859-1/articles/new-users/Makefile b/en_US.ISO8859-1/articles/new-users/Makefile
deleted file mode 100644
index 886e21cc9d..0000000000
--- a/en_US.ISO8859-1/articles/new-users/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-# $FreeBSD$
-
-DOC?= article
-
-FORMATS?= html
-
-INSTALL_COMPRESSED?=gz
-INSTALL_ONLY_COMPRESSED?=
-
-SRCS= article.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/new-users/article.sgml b/en_US.ISO8859-1/articles/new-users/article.sgml
deleted file mode 100644
index bb85037af0..0000000000
--- a/en_US.ISO8859-1/articles/new-users/article.sgml
+++ /dev/null
@@ -1,1055 +0,0 @@
-<!-- $FreeBSD: doc/en_US.ISO8859-1/articles/new-users/article.sgml,v 1.26 2001/09/24 01:32:07 murray Exp $ -->
-<!-- The FreeBSD Documentation Project -->
-
-<!DOCTYPE ARTICLE PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man;
-]>
-
-<article>
- <articleinfo>
- <title>For People New to Both FreeBSD and Unix</title>
-
- <authorgroup>
- <author>
- <firstname>Annelise</firstname>
-
- <surname>Anderson</surname>
-
- <affiliation>
- <address><email>andrsn@andrsn.stanford.edu</email></address>
- </affiliation>
- </author>
- </authorgroup>
-
- <pubdate>August 15, 1997</pubdate>
-
- <abstract>
- <para>Congratulations on installing FreeBSD! This introduction
- is for people new to both FreeBSD <emphasis>and</emphasis>
- Un*x&mdash;so it starts with basics. It assumes you're using
- version 2.0.5 or later of FreeBSD as distributed by BSDi
- or FreeBSD.org, your system (for now) has a single user
- (you)&mdash;and you're probably pretty good with DOS/Windows
- or OS/2.</para>
- </abstract>
- </articleinfo>
-
- <sect1>
- <title>Logging in and Getting Out</title>
-
- <para>Log in (when you see <prompt >login:</prompt>) as a user you
- created during installation or as <firstterm>root</firstterm>.
- (Your FreeBSD installation will already have an account for
- root; root can go anywhere and do anything, including deleting
- essential files, so be careful!) The symbols &prompt.user; and
- &prompt.root; in the following stand for the prompt (yours may
- be different), with &prompt.user; indicating an ordinary user
- and &prompt.root; indicating root.</para>
-
- <para>To log out (and get a new <prompt >login:</prompt> prompt)
- type</para>
-
- <informalexample>
- <screen>&prompt.root; <userinput>exit</userinput></screen>
- </informalexample>
-
- <para>as often as necessary. Yes, press <keysym>enter</keysym>
- after commands, and remember that Unix is
- case-sensitive&mdash;<command>exit</command>, not
- <command>EXIT</command>.</para>
-
- <para>To shut down the machine type</para>
-
- <informalexample>
- <screen>&prompt.root; <userinput>/sbin/shutdown -h now</userinput></screen>
- </informalexample>
-
- <para>Or to reboot type</para>
-
- <informalexample>
- <screen>&prompt.root; <userinput>/sbin/shutdown -r now</userinput></screen>
- </informalexample>
-
- <para>or</para>
-
- <informalexample>
- <screen>&prompt.root; <userinput>/sbin/reboot</userinput></screen>
- </informalexample>
-
- <para>You can also reboot with
- <keycombo><keycap>Ctrl</keycap><keycap>Alt</keycap><keycap>Delete</keycap></keycombo>.
- Give it a little time to do its work. This is equivalent to
- <command>/sbin/reboot</command> in recent releases of FreeBSD
- and is much, much better than hitting the reset button. You
- don't want to have to reinstall this thing, do you?</para>
- </sect1>
-
- <sect1>
- <title>Adding A User with Root Privileges</title>
-
- <para>If you didn't create any users when you installed the system
- and are thus logged in as root, you should probably create a
- user now with</para>
-
- <informalexample>
- <screen>&prompt.root; <userinput>adduser</userinput></screen>
- </informalexample>
-
- <para>The first time you use adduser, it might ask for some
- defaults to save. You might want to make the default shell
- &man.csh.1; instead of &man.sh.1;, if it suggests
- <command>sh</command> as the default. Otherwise just press
- enter to accept each default. These defaults are saved in
- <filename>/etc/adduser.conf</filename>, an editable file.</para>
-
- <para>Suppose you create a user <username>jack</username> with
- full name <emphasis>Jack Benimble</emphasis>. Give jack a
- password if security (even kids around who might pound on the
- keyboard) is an issue. When it asks you if you want to invite
- jack into other groups, type <groupname>wheel</groupname></para>
-
- <informalexample>
- <screen>Login group is ``jack''. Invite jack into other groups: <userinput>wheel</userinput></screen>
- </informalexample>
-
- <para>This will make it possible to log in as
- <username>jack</username> and use the &man.su.1;
- command to become root. Then you won't get scolded any more for
- logging in as root.</para>
-
- <para>You can quit <command>adduser</command> any time by typing
- <keycombo><keycap>Ctrl</keycap><keycap>C</keycap></keycombo>,
- and at the end you'll have a chance to approve your new user or
- simply type <keycap>n</keycap> for no. You might want to create
- a second new user (jill?) so that when you edit jack's login
- files, you'll have a hot spare in case something goes
- wrong.</para>
-
- <para>Once you've done this, use <command>exit</command> to get
- back to a login prompt and log in as <username>jack</username>.
- In general, it's a good idea to do as much work as possible as
- an ordinary user who doesn't have the power&mdash;and
- risk&mdash;of root.</para>
-
- <para>If you already created a user and you want the user to be
- able to <command>su</command> to root, you can log in as root
- and edit the file <filename>/etc/group</filename>, adding jack
- to the first line (the group <groupname>wheel</groupname>). But
- first you need to practice &man.vi.1;, the text editor&mdash;or
- use the simpler text editor, &man.ee.1;, installed on recent
- version of FreeBSD.</para>
-
- <para>To delete a user, use the <command>rmuser</command>
- command.</para>
- </sect1>
-
- <sect1>
- <title>Looking Around</title>
-
- <para>Logged in as an ordinary user, look around and try out some
- commands that will access the sources of help and information
- within FreeBSD.</para>
-
- <para>Here are some commands and what they do:</para>
-
- <variablelist>
- <varlistentry>
- <term><command>id</command></term>
-
- <listitem>
- <para>Tells you who you are!</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>pwd</command></term>
-
- <listitem>
- <para>Shows you where you are&mdash;the current working
- directory.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>ls</command></term>
-
- <listitem>
- <para>Lists the files in the current directory.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>ls <option>-F</option></command></term>
-
- <listitem>
- <para>Lists the files in the current directory with a
- <literal>*</literal> after executables, a
- <literal>/</literal> after directories, and an
- <literal>@</literal> after symbolic links.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>ls <option>-l</option></command></term>
-
- <listitem>
- <para>Lists the files in long format&mdash;size, date,
- permissions.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>ls <option>-a</option></command></term>
-
- <listitem>
- <para>Lists hidden <quote>dot</quote> files with the others.
- If you're root, the <quote>dot</quote> files show up
- without the <option>-a</option> switch.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>cd</command></term>
-
- <listitem>
- <para>Changes directories. <command>cd
- <parameter>..</parameter></command> backs up one level;
- note the space after <command>cd</command>. <command>cd
- <parameter>/usr/local</parameter></command> goes there.
- <command>cd <parameter>~</parameter></command> goes to the
- home directory of the person logged in&mdash;e.g.,
- <filename>/usr/home/jack</filename>. Try <command>cd
- <parameter>/cdrom</parameter></command>, and then
- <command>ls</command>, to find out if your CDROM is
- mounted and working.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>view
- <replaceable>filename</replaceable></command></term>
-
- <listitem>
- <para>Lets you look at a file (named
- <replaceable>filename</replaceable>) without changing it.
- Try <command>view
- <parameter>/etc/fstab</parameter></command>.
- <command>:q</command> to quit.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>cat
- <replaceable>filename</replaceable></command></term>
-
- <listitem>
- <para>Displays <replaceable>filename</replaceable> on
- screen. If it's too long and you can see only the end of
- it, press <keycap>ScrollLock</keycap> and use the
- <keycap>up-arrow</keycap> to move backward; you can use
- <keycap>ScrollLock</keycap> with man pages too. Press
- <keycap>ScrollLock</keycap> again to quit scrolling. You
- might want to try <command>cat</command> on some of the
- dot files in your home directory&mdash;<command>cat
- <parameter>.cshrc</parameter></command>, <command>cat
- <parameter>.login</parameter></command>, <command>cat
- <parameter>.profile</parameter></command>.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>You'll notice aliases in <filename>.cshrc</filename> for
- some of the <command>ls</command> commands (they're very
- convenient). You can create other aliases by editing
- <filename>.cshrc</filename>. You can make these aliases
- available to all users on the system by putting them in the
- system-wide <command>csh</command> configuration file,
- <filename>/etc/csh.cshrc</filename>.</para>
- </sect1>
-
- <sect1>
- <title>Getting Help and Information</title>
-
- <para>Here are some useful sources of help.
- <replaceable>Text</replaceable> stands for something of your
- choice that you type in&mdash;usually a command or
- filename.</para>
-
- <variablelist>
- <varlistentry>
- <term><command>apropos
- <replaceable>text</replaceable></command></term>
-
- <listitem>
- <para>Everything containing string
- <replaceable>text</replaceable> in the <database>whatis
- database</database>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>man
- <replaceable>text</replaceable></command></term>
-
- <listitem>
- <para>The man page for <replaceable>text</replaceable>. The
- major source of documentation for Un*x systems.
- <command>man <parameter>ls</parameter></command> will tell
- you all the ways to use the <command>ls</command> command.
- Press <keycap>Enter</keycap> to move through text,
- <keycombo><keycap>Ctrl</keycap><keycap>B</keycap></keycombo>
- to go back a page,
- <keycombo><keycap>Ctrl</keycap><keycap>F</keycap></keycombo>
- to go forward, <keycap>q</keycap> or
- <keycombo><keycap>Ctrl</keycap><keycap>C</keycap></keycombo>
- to quit.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>which
- <replaceable>text</replaceable></command></term>
-
- <listitem>
- <para>Tells you where in the user's path the command
- <replaceable>text</replaceable> is found.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>locate
- <replaceable>text</replaceable></command></term>
-
- <listitem>
- <para>All the paths where the string
- <replaceable>text</replaceable> is found.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>whatis
- <replaceable>text</replaceable></command></term>
-
- <listitem>
- <para>Tells you what the command
- <replaceable>text</replaceable> does and its man page.
- Typing <command>whatis *</command> will tell you about all
- the binaries in the current directory.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>whereis
- <replaceable>text</replaceable></command></term>
-
- <listitem>
- <para>Finds the file <replaceable>text</replaceable>, giving
- its full path.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>You might want to try using <command>whatis</command> on
- some common useful commands like <command>cat</command>,
- <command>more</command>, <command>grep</command>,
- <command>mv</command>, <command>find</command>,
- <command>tar</command>, <command>chmod</command>,
- <command>chown</command>, <command>date</command>, and
- <command>script</command>. <command>more</command> lets you
- read a page at a time as it does in DOS, e.g., <command>ls -l |
- more</command> or <command>more
- <replaceable>filename</replaceable></command>. The
- <literal>*</literal> works as a wildcard&mdash;e.g., <command>ls
- w*</command> will show you files beginning with
- <literal>w</literal>.</para>
-
- <para>Are some of these not working very well? Both
- &man.locate.1; and &man.whatis.1; depend
- on a database that's rebuilt weekly. If your machine isn't
- going to be left on over the weekend (and running FreeBSD), you
- might want to run the commands for daily, weekly, and monthly
- maintenance now and then. Run them as root and give each one
- time to finish before you start the next one, for now.</para>
-
- <informalexample>
- <screen>&prompt.root; <userinput>periodic daily</userinput>
-<lineannotation>output omitted</lineannotation>
-&prompt.root; <userinput>periodic weekly</userinput>
-<lineannotation>output omitted</lineannotation>
-&prompt.root; <userinput>periodic monthly</userinput>
-<lineannotation>output omitted</lineannotation></screen>
- </informalexample>
-
- <para>If you get tired of waiting, press
- <keycombo><keycap>Alt</keycap><keycap>F2</keycap></keycombo> to
- get another <firstterm>virtual console</firstterm>, and log in
- again. After all, it's a multi-user, multi-tasking system.
- Nevertheless these commands will probably flash messages on your
- screen while they're running; you can type
- <command>clear</command> at the prompt to clear the screen.
- Once they've run, you might want to look at
- <filename>/var/mail/root</filename> and
- <filename>/var/log/messages</filename>.</para>
-
- <para>Running such commands is part of system
- administration&mdash;and as a single user of a Unix system,
- you're your own system administrator. Virtually everything you
- need to be root to do is system administration. Such
- responsibilities aren't covered very well even in those big fat
- books on Unix, which seem to devote a lot of space to pulling
- down menus in windows managers. You might want to get one of
- the two leading books on systems administration, either Evi
- Nemeth et.al.'s <citetitle>UNIX System Administration
- Handbook</citetitle> (Prentice-Hall, 1995, ISBN
- 0-13-15051-7)&mdash;the second edition with the red cover; or
- &AElig;leen Frisch's <citetitle>Essential System
- Administration</citetitle> (O'Reilly &amp; Associates, 1993,
- ISBN 0-937175-80-3). I used Nemeth.</para>
- </sect1>
-
- <sect1>
- <title>Editing Text</title>
-
- <para>To configure your system, you need to edit text files. Most
- of them will be in the <filename>/etc</filename> directory; and
- you'll need to <command>su</command> to root to be able to
- change them. You can use the easy <command>ee</command>, but in
- the long run the text editor <command>vi</command> is worth
- learning. There's an excellent tutorial on vi in
- <filename>/usr/src/contrib/nvi/docs/tutorial</filename> if you
- have that installed; otherwise you can get it by FTP to
- <hostid>ftp.cdrom.com</hostid> in the directory
- FreeBSD/FreeBSD-current/src/contrib/nvi/docs/tutorial.</para>
-
- <para>Before you edit a file, you should probably back it up.
- Suppose you want to edit <filename>/etc/rc.conf</filename>. You
- could just use <command>cd /etc</command> to get to the
- <filename>/etc</filename> directory and do:</para>
-
- <informalexample>
- <screen>&prompt.root; <userinput>cp rc.conf rc.conf.orig</userinput></screen>
- </informalexample>
-
- <para>This would copy <filename>rc.conf</filename> to
- <filename>rc.conf.orig</filename>, and you could later copy
- <filename>rc.conf.orig</filename> to
- <filename>rc.conf</filename> to recover the original. But even
- better would be moving (renaming) and then copying back:</para>
-
- <informalexample>
- <screen>&prompt.root; <userinput>mv rc.conf rc.conf.orig</userinput>
-&prompt.root; <userinput>cp rc.conf.orig rc.conf</userinput></screen>
- </informalexample>
-
- <para>because the <command>mv</command> command preserves the
- original date and owner of the file. You can now edit
- <filename>rc.conf</filename>. If you want the original back,
- you'd then <userinput>mv rc.conf rc.conf.myedit</userinput>
- (assuming you want to preserve your edited version) and
- then</para>
-
- <informalexample>
- <screen>&prompt.root; <userinput>mv rc.conf.orig rc.conf</userinput></screen>
- </informalexample>
-
- <para>to put things back the way they were.</para>
-
- <para>To edit a file, type</para>
-
- <informalexample>
- <screen>&prompt.root; <userinput>vi <replaceable>filename</replaceable></userinput></screen>
- </informalexample>
-
- <para>Move through the text with the arrow keys.
- <keycap>Esc</keycap> (the escape key) puts <command>vi</command>
- in command mode. Here are some commands:</para>
-
- <variablelist>
- <varlistentry>
- <term><command>x</command></term>
-
- <listitem>
- <para>delete letter the cursor is on</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>dd</command></term>
-
- <listitem>
- <para>delete the entire line (even if it wraps on the
- screen)</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>i</command></term>
-
- <listitem>
- <para>insert text at the cursor</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>a</command></term>
-
- <listitem>
- <para>insert text after the cursor</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>Once you type <command>i</command> or <command>a</command>,
- you can enter text. <command>Esc</command> puts you back in
- command mode where you can type</para>
-
- <variablelist>
- <varlistentry>
- <term><command>:w</command></term>
-
- <listitem>
- <para>to write your changes to disk and continue
- editing</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>:wq</command></term>
-
- <listitem>
- <para>to write and quit</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>:q!</command></term>
-
- <listitem>
- <para>to quit without saving changes</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>/<replaceable>text</replaceable></command></term>
-
- <listitem>
- <para>to move the cursor to <replaceable>text</replaceable>;
- <command>/<keycap>Enter</keycap></command> (the enter key)
- to find the next instance of
- <replaceable>text</replaceable>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>G</command></term>
-
- <listitem>
- <para>to go to the end of the file</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command><replaceable>n</replaceable>G</command></term>
-
- <listitem>
- <para>to go to line <replaceable>n</replaceable> in the
- file, where <replaceable>n</replaceable> is a
- number</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><keycombo><keycap>Ctrl</keycap><keycap>L</keycap></keycombo></term>
-
- <listitem>
- <para>to redraw the screen</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><keycombo><keycap>Ctrl</keycap><keycap>b</keycap></keycombo> and
- <keycombo><keycap>Ctrl</keycap><keycap>f</keycap></keycombo></term>
-
- <listitem>
- <para>go back and forward a screen, as they do with
- <command>more</command> and <command>view</command>.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>Practice with <command>vi</command> in your home directory
- by creating a new file with <command>vi
- <replaceable>filename</replaceable></command> and adding and
- deleting text, saving the file, and calling it up again.
- <command>vi</command> delivers some surprises because it's
- really quite complex, and sometimes you'll inadvertently issue a
- command that will do something you don't expect. (Some people
- actually like <command>vi</command>&mdash;it's more powerful
- than DOS EDIT&mdash;find out about the <command>:r</command>
- command.) Use <keycap>Esc</keycap> one or more times to be sure
- you're in command mode and proceed from there when it gives you
- trouble, save often with <command>:w</command>, and use
- <command>:q!</command> to get out and start over (from your last
- <command>:w</command>) when you need to.</para>
-
- <para>Now you can <command>cd</command> to
- <filename>/etc</filename>, <command>su</command> to root, use
- <command>vi</command> to edit the file
- <filename>/etc/group</filename>, and add a user to wheel so the
- user has root privileges. Just add a comma and the user's login
- name to the end of the first line in the file, press
- <keycap>Esc</keycap>, and use <command>:wq</command> to write
- the file to disk and quit. Instantly effective. (You didn't
- put a space after the comma, did you?)</para>
- </sect1>
-
- <sect1>
- <title>Printing Files from DOS</title>
-
- <para>At this point you probably don't have the printer working,
- so here's a way to create a file from a man page, move it to a
- floppy, and then print it from DOS. Suppose you want to read
- carefully about changing permissions on files (pretty
- important). You can use <command>man chmod</command> to read
- about it. The command</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>man chmod | col -b &gt; chmod.txt</></screen>
- </informalexample>
-
- <para>will remove formatting codes and send the man page to the
- <filename>chmod.txt</filename> file instead of showing it on
- your screen. Now put a dos-formatted diskette in your floppy
- drive a, <command>su</command> to root, and type</para>
-
- <informalexample>
- <screen>&prompt.root; <userinput>/sbin/mount -t msdos /dev/fd0 /mnt</></screen>
- </informalexample>
-
- <para>to mount the floppy drive on
- <filename>/mnt</filename>.</para>
-
- <para>Now (you no longer need to be root, and you can type
- <command>exit</command> to get back to being user jack) you can
- go to the directory where you created
- <filename>chmod.txt</filename> and copy the file to the floppy
- with:</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>cp chmod.txt /mnt</></screen>
- </informalexample>
-
- <para>and use <command>ls /mnt</command> to get a directory
- listing of <filename>/mnt</filename>, which should show the file
- <filename>chmod.txt</filename>.</para>
-
- <para>You might especially want to make a file from
- <filename>/sbin/dmesg</filename> by typing</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>/sbin/dmesg &gt; dmesg.txt</></screen>
- </informalexample>
-
- <para>and copying <filename>dmesg.txt</filename> to the floppy.
- <command>/sbin/dmesg</command> is the boot log record, and it's
- useful to understand it because it shows what FreeBSD found when
- it booted up. If you ask questions on
- <email>freebsd-questions@FreeBSD.org</email> or on a USENET
- group&mdash;like <quote>FreeBSD isn't finding my tape drive,
- what do I do?</quote>&mdash;people will want to know what
- <command>dmesg</command> has to say.</para>
-
- <para>You can now dismount the floppy drive (as root) to get the
- disk out with</para>
-
- <informalexample>
- <screen>&prompt.root; <userinput>/sbin/umount /mnt</></screen>
- </informalexample>
-
- <para>and reboot to go to DOS. Copy these files to a DOS
- directory, call them up with DOS EDIT, Windows Notepad or
- Wordpad, or a word processor, make a minor change so the file
- has to be saved, and print as you normally would from DOS or
- Windows. Hope it works! man pages come out best if printed
- with the DOS <command>print</command> command. (Copying files
- from FreeBSD to a mounted DOS partition is in some cases still a
- little risky.)</para>
-
- <para>Getting the printer printing from FreeBSD involves creating
- an appropriate entry in <filename>/etc/printcap</filename> and
- creating a matching spool directory in
- <filename>/var/spool/output</filename>. If your printer is on
- <hardware>lpt0</hardware> (what DOS calls
- <hardware>LPT1</hardware>), you may only need to go to
- <filename>/var/spool/output</filename> and (as root) create the
- directory <filename>lpd</filename> by typing: <command>mkdir
- lpd</command>, if it doesn't already exist. Then the printer
- should respond if it's turned on when the system is booted, and
- <command>lp</command> or <command>lpr</command> should send a
- file to the printer. Whether or not the file actually prints
- depends on configuring it, which is covered in the <ulink
- URL="../../books/handbook/handbook.html">FreeBSD
- handbook.</ulink></para>
- </sect1>
-
- <sect1>
- <title>Other Useful Commands</title>
-
- <variablelist>
- <varlistentry>
- <term><command>df</command></term>
-
- <listitem>
- <para>shows file space and mounted systems.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>ps aux</command></term>
-
- <listitem>
- <para>shows processes running. <command>ps ax</command> is a
- narrower form.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>rm <replaceable>filename</replaceable></command></term>
-
- <listitem>
- <para>remove <replaceable>filename</replaceable>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>rm -R <replaceable>dir</replaceable></command></term>
-
- <listitem>
- <para>removes a directory <replaceable>dir</replaceable> and all
- subdirectories&mdash;careful!</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>ls -R</command></term>
-
- <listitem>
- <para>lists files in the current directory and all
- subdirectories; I used a variant, <command>ls -AFR &gt;
- where.txt</command>, to get a list of all the files in
- <filename>/</filename> and (separately)
- <filename>/usr</filename> before I found better ways to
- find files.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>passwd</command></term>
-
- <listitem>
- <para>to change user's password (or root's password)</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>man hier</command></term>
-
- <listitem>
- <para>man page on the Unix file system</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>Use <command>find</command> to locate <filename>filename</filename> in
- <filename>/usr</filename> or any of its subdirectories
- with</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>find /usr -name "<replaceable>filename</>"</></screen>
- </informalexample>
-
- <para>You can use <literal>*</literal> as a wildcard in
- <parameter>"<replaceable>filename</replaceable>"</parameter>
- (which should be in quotes). If you tell
- <command>find</command> to search in <filename>/</filename>
- instead of <filename>/usr</filename> it will look for the
- file(s) on all mounted file systems, including the CDROM and the
- DOS partition.</para>
-
- <para>An excellent book that explains Unix commands and utilities
- is Abrahams &amp; Larson, <citetitle>Unix for the
- Impatient</citetitle> (2nd ed., Addison-Wesley, 1996).
- There's also a lot of Unix information on the Internet. Try the
- <ulink URL="http://www.geek-girl.com/unix.html">Unix Reference
- Desk</ulink>.</para>
- </sect1>
-
- <sect1>
- <title>Next Steps</title>
-
- <para>You should now have the tools you need to get around and
- edit files, so you can get everything up and running. There is
- a great deal of information in the FreeBSD handbook (which is
- probably on your hard drive) and <ulink
- URL="http://www.FreeBSD.org/">FreeBSD's web site</ulink>. A
- wide variety of packages and ports are on the CDROM as well as
- the web site. The handbook tells you more about how to use them
- (get the package if it exists, with <command>pkg_add
- /cdrom/packages/All/<replaceable>packagename</replaceable></command>,
- where <replaceable>packagename</replaceable> is the filename of
- the package). The CDROM has lists of the packages and ports
- with brief descriptions in
- <filename>cdrom/packages/index</filename>,
- <filename>cdrom/packages/index.txt</filename>, and
- <filename>cdrom/ports/index</filename>, with fuller descriptions
- in <filename>/cdrom/ports/*/*/pkg/DESCR</filename>, where the
- <literal>*</literal>s represent subdirectories of kinds of
- programs and program names respectively.</para>
-
- <para>If you find the handbook too sophisticated (what with
- <command>lndir</command> and all) on installing ports from the
- CDROM, here's what usually works:</para>
-
- <para>Find the port you want, say <command>kermit</command>.
- There will be a directory for it on the CDROM. Copy the
- subdirectory to <filename>/usr/local</filename> (a good place
- for software you add that should be available to all users)
- with:</para>
-
- <informalexample>
- <screen>&prompt.root; <userinput>cp -R /cdrom/ports/comm/kermit /usr/local</></screen>
- </informalexample>
-
- <para>This should result in a
- <filename>/usr/local/kermit</filename> subdirectory that has all
- the files that the <command>kermit</command> subdirectory on the
- CDROM has.</para>
-
- <para>Next, create the directory
- <filename>/usr/ports/distfiles</filename> if it doesn't already
- exist using <command>mkdir</command>. Now check check
- <filename>/cdrom/ports/distfiles</filename> for a file with a
- name that indicates it's the port you want. Copy that file to
- <filename>/usr/ports/distfiles</filename>; in recent versions
- you can skip this step, as FreeBSD will do it for you. In the
- case of <command>kermit</command>, there is no distfile.</para>
-
- <para>Then <command>cd</command> to the subdirectory of
- <filename>/usr/local/kermit</filename> that has the file
- <filename>Makefile</filename>. Type</para>
-
- <informalexample>
- <screen>&prompt.root; <userinput>make all install</></screen>
- </informalexample>
-
- <para>During this process the port will FTP to get any compressed
- files it needs that it didn't find on the CDROM or in
- <filename>/usr/ports/distfiles</filename>. If you don't have
- your network running yet and there was no file for the port in
- <filename>/cdrom/ports/distfiles</filename>, you will have to
- get the distfile using another machine and copy it to
- <filename>/usr/ports/distfiles</filename> from a floppy or your
- DOS partition. Read <filename>Makefile</filename> (with
- <command>cat</command> or <command>more</command> or
- <command>view</command>) to find out where to go (the master
- distribution site) to get the file and what its name is. Its
- name will be truncated when downloaded to DOS, and after you get
- it into <filename>/usr/ports/distfiles</filename> you'll have to
- rename it (with the <command>mv</command> command) to its
- original name so it can be found. (Use binary file transfers!)
- Then go back to <filename>/usr/local/kermit</filename>, find the
- directory with <filename>Makefile</filename>, and type
- <command>make all install</command>.</para>
-
- <para>The other thing that happens when installing ports or
- packages is that some other program is needed. If the
- installation stops with a message <errorname>can't find
- unzip</errorname> or whatever, you might need to install the
- package or port for unzip before you continue.</para>
-
- <para>Once it's installed type <command>rehash</command> to make
- FreeBSD reread the files in the path so it knows what's there.
- (If you get a lot of <errorname>path not found</errorname>
- messages when you use <command>whereis</command> or which, you
- might want to make additions to the list of directories in the
- path statement in <filename>.cshrc</filename> in your home
- directory. The path statement in Unix does the same kind of
- work it does in DOS, except the current directory is not (by
- default) in the path for security reasons; if the command you
- want is in the directory you're in, you need to type
- <filename>./</filename> before the command to make it work; no
- space after the slash.)</para>
-
- <para>You might want to get the most recent version of Netscape
- from their <ulink URL="ftp://ftp.netscape.com">FTP site</ulink>.
- (Netscape requires the X Window System.) There's now a FreeBSD
- version, so look around carefully. Just use <command>gunzip
- <replaceable>filename</replaceable></command> and <command>tar
- xvf <replaceable>filename</replaceable></command> on it, move
- the binary to <filename>/usr/local/bin</filename> or some other
- place binaries are kept, <command>rehash</command>, and then put
- the following lines in <filename>.cshrc</filename> in each
- user's home directory or (easier) in
- <filename>/etc/csh.cshrc</filename>, the system-wide
- <command>csh</command> start-up file:</para>
-
- <informalexample>
- <programlisting>setenv XKEYSYMDB /usr/X11R6/lib/X11/XKeysymDB
-setenv XNLSPATH /usr/X11R6/lib/X11/nls</programlisting>
- </informalexample>
-
- <para>This assumes that the file <filename>XKeysymDB</filename>
- and the directory <filename>nls</filename> are in
- <filename>/usr/X11R6/lib/X11</filename>; if they're not, find
- them and put them there.</para>
-
- <para>If you originally got Netscape as a port using the CDROM (or
- FTP), don't replace <filename>/usr/local/bin/netscape</filename>
- with the new netscape binary; this is just a shell script that
- sets up the environment variables for you. Instead rename the
- new binary to <filename>netscape.bin</filename> and replace the
- old binary, which is
- <filename>/usr/local/netscape/netscape</filename>.</para>
- </sect1>
-
- <sect1>
- <title>Your Working Environment</title>
-
- <para>Your shell is the most important part of your working
- environment. In DOS, the usual shell is command.com. The shell
- is what interprets the commands you type on the command line,
- and thus communicates with the rest of the operating system.
- You can also write shell scripts, which are like DOS batch
- files: a series of commands to be run without your
- intervention.</para>
-
- <para>Two shells come installed with FreeBSD:
- <command>csh</command> and <command>sh</command>.
- <command>csh</command> is good for command-line work, but
- scripts should be written with <command>sh</command> (or
- <command>bash</command>). You can find out what shell you have
- by typing <command>echo $SHELL</command>.</para>
-
- <para>The <command>csh</command> shell is okay, but
- <command>tcsh</command> does everything <command>csh</command>
- does and more. It allows you to recall commands with the arrow
- keys and edit them. It has tab-key completion of filenames
- (<command>csh</command> uses the <keycap>Esc</keycap> key), and
- it lets you switch to the directory you were last in with
- <command>cd -</command>. It's also much easier to alter your
- prompt with <command>tcsh</command>. It makes life a lot
- easier.</para>
-
- <para>Here are the three steps for installing a new shell:</para>
-
- <procedure>
- <step>
- <para>Install the shell as a port or a package, just as you
- would any other port or package. Use
- <command>rehash</command> and <command>which tcsh</command>
- (assuming you're installing <command>tcsh</command>) to make
- sure it got installed.</para>
- </step>
-
- <step>
- <para>As root, edit <filename>/etc/shells</filename>, adding a
- line in the file for the new shell, in this case
- <filename>/usr/local/bin/tcsh</filename>, and save the file.
- (Some ports may do this for you.)</para>
- </step>
-
- <step>
- <para>Use the <command>chsh</command> command to change your
- shell to <command>tcsh</command> permanently, or type
- <command>tcsh</command> at the prompt to change your shell
- without logging in again.</para>
- </step>
- </procedure>
-
- <note>
- <para>It can be dangerous to change root's shell to something
- other than <command>sh</command> or <command>csh</command> on
- early versions of FreeBSD and many other versions of Unix; you
- may not have a working shell when the system puts you into
- single user mode. The solution is to use <command>su
- -m</command> to become root, which will give you the
- <command>tcsh</command> as root, because the shell is part of
- the environment. You can make this permanent by adding it to
- your <filename>.tcshrc</filename> file as an alias with
- <programlisting>alias su su -m.</programlisting></para>
- </note>
-
- <para>When <command>tcsh</command> starts up, it will read the
- <filename>/etc/csh.cshrc</filename> and
- <filename>/etc/csh.login</filename> files, as does
- <command>csh</command>. It will also read the
- <filename>.login</filename> file in your home directory and the
- <filename>.cshrc</filename> file as well, unless you provide a
- <filename>.tcshrc</filename> file. This you can do by simply
- copying <filename>.cshrc</filename> to
- <filename>.tcshrc</filename>.</para>
-
- <para>Now that you've installed <command>tcsh</command>, you can
- adjust your prompt. You can find the details in the manual page
- for <command>tcsh</command>, but here is a line to put in your
- <filename>.tcshrc</filename> that will tell you how many
- commands you have typed, what time it is, and what directory you
- are in. It also produces a <literal>></literal> if you're an
- ordinary user and a <literal>#</literal> if you're root, but
- tsch will do that in any case:</para>
-
- <para>set prompt = "%h %t %~ %# "</para>
-
- <para>This should go in the same place as the existing set prompt
- line if there is one, or under "if($?prompt) then" if not.
- Comment out the old line; you can always switch back to it if
- you prefer it. Don't forget the spaces and quotes. You can get
- the <filename>.tcshrc</filename> reread by typing
- <command>source .tcshrc</command>.</para>
-
- <para>You can get a listing of other environmental variables that
- have been set by typing <command>env</command> at the prompt.
- The result will show you your default editor, pager, and
- terminal type, among possibly many others. A useful command if
- you log in from a remote location and can't run a program
- because the terminal isn't capable is <command>setenv TERM
- vt100</command>.</para>
- </sect1>
-
- <sect1>
- <title>Other</title>
-
- <para>As root, you can dismount the CDROM with
- <command>/sbin/umount /cdrom</command>, take it out of the
- drive, insert another one, and mount it with
- <command>/sbin/mount_cd9660 /dev/cd0a /cdrom</command> assuming
- <hardware>cd0a</hardware> is the device name for your CDROM
- drive. The most recent versions of FreeBSD let you mount the
- CDROM with just <command>/sbin/mount /cdrom</command>.</para>
-
- <para>Using the live file system&mdash;the second of FreeBSD's
- CDROM disks&mdash;is useful if you've got limited space. What
- is on the live file system varies from release to release. You
- might try playing games from the CDROM. This involves using
- <command>lndir</command>, which gets installed with the X Window
- System, to tell the program(s) where to find the necessary
- files, because they're in the <filename>/cdrom</filename> file
- system instead of in <filename>/usr</filename> and its
- subdirectories, which is where they're expected to be. Read
- <command>man lndir</command>.</para>
- </sect1>
-
- <sect1>
- <title>Comments Welcome</title>
-
- <para>If you use this guide I'd be interested in knowing where it
- was unclear and what was left out that you think should be
- included, and if it was helpful. My thanks to Eugene W. Stark,
- professor of computer science at SUNY-Stony Brook, and John
- Fieber for helpful comments.</para>
-
- <para>Annelise Anderson,
- <email>andrsn@andrsn.stanford.edu</email></para>
- </sect1>
-</article>
diff --git a/en_US.ISO8859-1/articles/programming-tools/Makefile b/en_US.ISO8859-1/articles/programming-tools/Makefile
deleted file mode 100644
index 886e21cc9d..0000000000
--- a/en_US.ISO8859-1/articles/programming-tools/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-# $FreeBSD$
-
-DOC?= article
-
-FORMATS?= html
-
-INSTALL_COMPRESSED?=gz
-INSTALL_ONLY_COMPRESSED?=
-
-SRCS= article.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/programming-tools/article.sgml b/en_US.ISO8859-1/articles/programming-tools/article.sgml
deleted file mode 100644
index ae9d862e30..0000000000
--- a/en_US.ISO8859-1/articles/programming-tools/article.sgml
+++ /dev/null
@@ -1,17 +0,0 @@
-<!-- $FreeBSD: doc/en_US.ISO8859-1/articles/programming-tools/article.sgml,v 1.16 2001/07/06 13:02:51 dd Exp $ -->
-<!-- The FreeBSD Documentation Project -->
-
-<!DOCTYPE ARTICLE PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN">
-<article>
- <articleinfo>
- <title>A User's Guide to FreeBSD Programming Tools</title>
- </articleinfo>
-
- <sect1>
- <title>This document has moved!</title>
-
- <para>This document has been integrated into the <ulink
- url="../../books/developers-handbook/">Developer's
- Handbook</ulink>. Please update your bookmarks.</para>
- </sect1>
-</article>
diff --git a/en_US.ISO8859-1/articles/pxe/Makefile b/en_US.ISO8859-1/articles/pxe/Makefile
deleted file mode 100644
index 7a18da1228..0000000000
--- a/en_US.ISO8859-1/articles/pxe/Makefile
+++ /dev/null
@@ -1,13 +0,0 @@
-
-DOC?= article
-
-FORMATS?= html
-
-INSTALL_COMPRESSED?=gz
-INSTALL_ONLY_COMPRESSED?=
-
-SRCS= article.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/pxe/article.sgml b/en_US.ISO8859-1/articles/pxe/article.sgml
deleted file mode 100644
index c64283ad34..0000000000
--- a/en_US.ISO8859-1/articles/pxe/article.sgml
+++ /dev/null
@@ -1,280 +0,0 @@
-<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man
-
-<!ENTITY % authors PUBLIC "-//FreeBSD//ENTITIES DocBook Author Entities//EN">
-%authors;
-
-]>
-
-<article>
- <articleinfo>
- <title>FreeBSD Jumpstart Guide</title>
-
- <authorgroup>
- <author>
- <firstname>Alfred</firstname>
- <surname>Perlstein</surname>
-
- <affiliation>
- <address><email>alfred@FreeBSD.org</email></address>
- </affiliation>
- </author>
- </authorgroup>
-
- <pubdate>$FreeBSD: doc/en_US.ISO8859-1/articles/pxe/article.sgml,v 1.6 2001/09/29 08:48:35 murray Exp $</pubdate>
-
- <abstract>
- <para>This article details the method used to allow machines to install
- FreeBSD using the Intel PXE method of booting a machine over a network.
- </para>
- </abstract>
- </articleinfo>
-
- <sect1 id="introduction">
- <title>Introduction</title>
-
- <warning>
- <para>This procedure will make the 'Server' both insecure and dangerous,
- it's best to just keep the 'Server' on it's own hub and not in any way
- accessable by any machines other than the 'Clients'.</para>
- </warning>
-
- <para>Terminology : </para>
-
- <informaltable frame="none">
- <tgroup cols="2">
-
- <tbody>
- <row>
- <entry>Server</entry>
- <entry>The machine offering netboot and install options.</entry>
- </row>
-
- <row>
- <entry>Client</entry>
- <entry>The machine that will have FreeBSD installed on it.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <para>Requires:
- Clients supporting the Intel PXE netboot option, an Ethernet connection.
- </para>
-
- <para>Please let me know if you come across anything you have problems with
- or suggestions for additional documentation.</para>
-
- <para>If you'd like someone to train/implement a specific netinstall system
- for you, please send email so that we can discuss terms.</para>
-
- <para>I'd also like to thank &a.ps; and &a.jhb; for doing most of the
- programming work on pxeboot, the interface to Intel's PXE (netboot)
- system.</para>
- </sect1>
-
- <sect1 id="server-config">
- <title>Server Configuration</title>
-
- <procedure>
- <step>
- <para>Install DHCP : Install isc-dhcp-2.0 you can use this config file
- <ulink url="http://people.freebsd.org/~alfred/pxe/dhcpd.conf">
- dhcpd.conf</ulink>, stick it in /usr/local/etc/</para>
- </step>
-
- <step>
- <para>Enable tftp:</para>
-
- <procedure>
- <step>
- <para>Make a directory <filename>/usr/tftpboot</filename></para>
- </step>
-
- <step>
- <para>Add this line to your
- <filename>/etc/inetd.conf</filename>:</para>
-
-<programlisting>tftp dgram udp wait nobody /usr/libexec/tftpd tftpd /usr/tftpboot</programlisting>
- </step>
- </procedure>
-
- </step>
-
- <step>
- <para>Enable NFS:</para>
-
- <procedure>
- <step>
- <para>Add this to <filename>/etc/rc.conf</filename>:</para>
-
- <programlisting>nfs_server_enable="YES"</programlisting>
- </step>
-
- <step>
- <para>Add this to <filename>/etc/exports</filename>:</para>
-
- <programlisting>/usr -alldirs -ro</programlisting>
- </step>
- </procedure>
- </step>
-
- <step>
- <para>Reboot to enable the new services or start them
- manually.</para>
- </step>
- </procedure>
- </sect1>
-
- <sect1 id="bootstrap-config">
- <title>Bootstrap Setup</title>
-
- <procedure>
- <step>
- <para>Download bootfiles : Download the
- <ulink url="ftp://ftp.FreeBSD.org/pub/FreeBSD/snapshots/i386/kern.flp">
- kern.flp</ulink> and
- <ulink url="ftp://ftp.FreeBSD.opg/pub/FreeBSD/snapshots/i386/mfsroot.flp">
- mfsroot.flp</ulink> floppy images.</para>
- </step>
-
- <step>
- <para>Setup tftp/pxe-boot directory:</para>
-
- <procedure>
- <step>
- <para>Put pxeboot in the boot directory:</para>
-
- <screen>&prompt.root; <userinput>rm -rf /usr/obj/*</userinput>
-&prompt.root; <userinput>cd /usr/src/sys/boot</userinput>
-&prompt.root; <userinput>make</userinput>
-&prompt.root; <userinput>cp /usr/src/sys/boot/i386/pxeldr/pxeboot /usr/tftpboot</userinput></screen>
- </step>
-
- <step>
- <para>Using the vndevice mount the <filename>kern.flp</filename>
- file and copy its contents to
- <filename>/usr/tftpboot</filename>:</para>
-
- <screen>&prompt.root; <userinput>vnconfig vn0 kern.flp</userinput> # associate a vndevice with the file
-&prompt.root; <userinput>mount /dev/vn0 /mnt</userinput> # mount it
-&prompt.root; <userinput>cp -R /mnt /usr/tftpboot</userinput> # copy the contents to /usr/tftpboot
-&prompt.root; <userinput>umount /mnt</userinput> # unmount it
-&prompt.root; <userinput>vnconfig -u vn0</userinput> # disassociate the vndevice from the file</screen>
- </step>
- </procedure>
- </step>
-
- <step>
- <para>Compile a custom kernel for the clients (particularly to avoid
- the device config screen at boot) and stick it in
- <filename>/usr/tftpboot</filename>.</para>
- </step>
-
- <step>
- <para>Make a special <filename>loader.rc</filename> to and install it
- in <filename>/usr/tftpboot/boot/loader.rc</filename> so that it
- doesn't prompt for the second disk, here's
- <ulink url="http://people.FreeBSD.org/~alfred/pxe/loader.rc">
- mine</ulink>.</para>
- </step>
-
- <step>
- <para>Extract the installer and helper utilities from the mfsroot disk
- and uncompress them, put them in <filename>/usr/tftpboot</filename>
- as well:</para>
-
- <screen>&prompt.root; <userinput>vnconfig vn0 mfsroot.flp</userinput> # associate a vndevice with the file
-&prompt.root; <userinput>mount /dev/vn0 /mnt</userinput> # mount it
-&prompt.root; <userinput>cp /mnt/mfsroot.gz /usr/tftpboot</userinput> # copy the contents to /usr/tftpboot
-&prompt.root; <userinput>umount /mnt</userinput> # unmount it
-&prompt.root; <userinput>vnconfig -u vn0</userinput> # disassociate the vndevice from the file
-&prompt.root; <userinput>cd /usr/tftpboot</userinput> # get into the pxeboot directory
-&prompt.root; <userinput>gunzip mfsroot.gz</userinput> # uncompress the mfsroot</screen>
- </step>
-
- <step>
- <para>Make your sysinstall script <filename>install.cfg</filename>, you
- can use
- <ulink url="http://people.FreeBSD.org/~alfred/pxe/install.cfg">
- mine</ulink> as a template, but you must edit it.</para>
- </step>
-
- <step>
- <para>Copy the sysinstall script into the extracted and uncompressed
- mfsroot image:</para>
-
- <screen>&prompt.root; <userinput>cd /usr/tftpboot</userinput>
-&prompt.root; <userinput>vnconfig vn0 mfsroot</userinput>
-&prompt.root; <userinput>mount /dev/vn0 /mnt</userinput>
-&prompt.root; <userinput>cp install.cfg /mnt</userinput>
-&prompt.root; <userinput>umount /mnt</userinput>
-&prompt.root; <userinput>vnconfig -u vn0</userinput></screen>
- </step>
- </procedure>
- </sect1>
-
- <sect1 id="install-setup">
- <title>Install Setup</title>
-
- <procedure>
- <step>
- <para>Put the install files in an NFS accessable location on the
- Server. Make a directory corresponding the 'nfs' directive in the
- <filename> install.cfg</filename> file and mirror the FreeBSD
- install files there, you'll want it to look somewhat like
- this:</para>
-
- <screen>ABOUT.TXT TROUBLE.TXT compat20 floppies ports
-ERRATA.TXT UPGRADE.TXT compat21 games proflibs
-HARDWARE.TXT XF86336 compat22 info src
-INSTALL.TXT bin compat3x kern.flp
-LAYOUT.TXT catpages crypto manpages
-README.TXT cdrom.inf dict mfsroot.flp
-RELNOTES.TXT compat1x doc packages</screen>
- </step>
-
- <step>
- <para>Copy the compressed packages into the packages/All directory
- under <filename>nfs</filename>.</para>
- </step>
-
- <step>
- <para>Make sure you have an <filename>INDEX</filename> file prepared
- in the packages directory. You can make your own
- <filename>INDEX</filename> entries like so:</para>
-
- <programlisting>alfred-1.0||/|Alfred install bootstrap||alfred@FreeBSD.org||||</programlisting>
-
- <para>Then you can install custom packages, particularly your own
- custom post-install package.</para>
- </step>
- </procedure>
- </sect1>
-
- <sect1 id="custom-postinst-package">
- <title>Custom Post-Install Package</title>
-
- <para>You can use the script <filename>pkgmaker.sh</filename> to create a
- custom package for post install, the idea is to have it install and
- configure any special things you may need done.
- <filename>pkgmaker</filename> is run in the directory above the package
- you wish to create with the single argument of the package (ie mypkg)
- which will then create a mypkg.tgz for you to include in your sysinstall
- package.</para>
-
- <para>Inside your custom package dir you'll want a file called
- <filename>PLIST</filename> which contains all the files that you wish to
- install and be incorperated into your package.</para>
-
- <para>You'll also want files called '<filename>pre</filename>' and
- '<filename>post</filename>' in the directory, these are shell scripts
- that you want to execute before and after your package is
- installed.</para>
-
- <para>Since this package is in your <filename>install.cfg</filename> file
- it should be run and do the final configuration for you.</para>
- </sect1>
-</article>
-
diff --git a/en_US.ISO8859-1/articles/serial-uart/Makefile b/en_US.ISO8859-1/articles/serial-uart/Makefile
deleted file mode 100644
index 7a18da1228..0000000000
--- a/en_US.ISO8859-1/articles/serial-uart/Makefile
+++ /dev/null
@@ -1,13 +0,0 @@
-
-DOC?= article
-
-FORMATS?= html
-
-INSTALL_COMPRESSED?=gz
-INSTALL_ONLY_COMPRESSED?=
-
-SRCS= article.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/serial-uart/article.sgml b/en_US.ISO8859-1/articles/serial-uart/article.sgml
deleted file mode 100644
index 194816c89b..0000000000
--- a/en_US.ISO8859-1/articles/serial-uart/article.sgml
+++ /dev/null
@@ -1,2424 +0,0 @@
-<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man;
-<!ENTITY % authors PUBLIC "-//FreeBSD//ENTITIES DocBook Author Entities//EN">
-%authors;
-]>
-
-<article>
- <articleinfo>
- <title>Serial and UART Tutorial</title>
-
- <authorgroup>
- <author>
- <firstname>Frank</firstname>
- <surname>Durda</surname>
-
- <affiliation>
- <address><email>uhclem@FreeBSD.org</email></address>
- </affiliation>
- </author>
- </authorgroup>
-
- <pubdate>$FreeBSD: doc/en_US.ISO8859-1/articles/pxe/article.sgml,v 1.1 2001/06/25 14:51:37 nik Exp $</pubdate>
-
- <abstract>
- <para>This article talks about using serial hardware with FreeBSD.</para>
- </abstract>
- </articleinfo>
-
- <sect1 id="uart">
- <title>The UART: What it is and how it works</title>
-
- <para><emphasis>Copyright &copy; 1996 &a.uhclem;, All Rights
- Reserved. 13 January 1996.</emphasis></para>
-
- <para>The Universal Asynchronous Receiver/Transmitter (UART)
- controller is the key component of the serial communications
- subsystem of a computer. The UART takes bytes of data and
- transmits the individual bits in a sequential fashion. At the
- destination, a second UART re-assembles the bits into complete
- bytes.</para>
-
- <para>Serial transmission is commonly used with modems and for
- non-networked communication between computers, terminals and
- other devices.</para>
-
- <para>There are two primary forms of serial transmission:
- Synchronous and Asynchronous. Depending on the modes that are
- supported by the hardware, the name of the communication
- sub-system will usually include a <literal>A</literal> if it
- supports Asynchronous communications, and a
- <literal>S</literal> if it supports Synchronous
- communications. Both forms are described below.</para>
-
- <para>Some common acronyms are:</para>
-
- <blockquote>
- <para>UART Universal Asynchronous Receiver/Transmitter</para>
- </blockquote>
-
- <blockquote>
- <para>USART Universal Synchronous-Asynchronous
- Receiver/Transmitter</para>
- </blockquote>
-
- <sect2>
- <title>Synchronous Serial Transmission</title>
-
- <para>Synchronous serial transmission requires that the sender
- and receiver share a clock with one another, or that the
- sender provide a strobe or other timing signal so that the
- receiver knows when to <quote>read</quote> the next bit of
- the data. In most forms of serial Synchronous
- communication, if there is no data available at a given
- instant to transmit, a fill character must be sent instead
- so that data is always being transmitted. Synchronous
- communication is usually more efficient because only data
- bits are transmitted between sender and receiver, and
- synchronous communication can be more costly if extra wiring
- and circuits are required to share a clock signal between
- the sender and receiver.</para>
-
- <para>A form of Synchronous transmission is used with printers
- and fixed disk devices in that the data is sent on one set
- of wires while a clock or strobe is sent on a different
- wire. Printers and fixed disk devices are not normally
- serial devices because most fixed disk interface standards
- send an entire word of data for each clock or strobe signal
- by using a separate wire for each bit of the word. In the
- PC industry, these are known as Parallel devices.</para>
-
- <para>The standard serial communications hardware in the PC
- does not support Synchronous operations. This mode is
- described here for comparison purposes only.</para>
- </sect2>
-
- <sect2>
- <title>Asynchronous Serial Transmission</title>
-
- <para>Asynchronous transmission allows data to be transmitted
- without the sender having to send a clock signal to the
- receiver. Instead, the sender and receiver must agree on
- timing parameters in advance and special bits are added to
- each word which are used to synchronize the sending and
- receiving units.</para>
-
- <para>When a word is given to the UART for Asynchronous
- transmissions, a bit called the "Start Bit" is added to the
- beginning of each word that is to be transmitted. The Start
- Bit is used to alert the receiver that a word of data is
- about to be sent, and to force the clock in the receiver
- into synchronization with the clock in the transmitter.
- These two clocks must be accurate enough to not have the
- frequency drift by more than 10% during the transmission of
- the remaining bits in the word. (This requirement was set
- in the days of mechanical teleprinters and is easily met by
- modern electronic equipment.)</para>
-
- <para>After the Start Bit, the individual bits of the word of
- data are sent, with the Least Significant Bit (LSB) being
- sent first. Each bit in the transmission is transmitted for
- exactly the same amount of time as all of the other bits,
- and the receiver <quote>looks</quote> at the wire at
- approximately halfway through the period assigned to each
- bit to determine if the bit is a <literal>1</literal> or a
- <literal>0</literal>. For example, if it takes two seconds
- to send each bit, the receiver will examine the signal to
- determine if it is a <literal>1</literal> or a
- <literal>0</literal> after one second has passed, then it
- will wait two seconds and then examine the value of the next
- bit, and so on.</para>
-
- <para>The sender does not know when the receiver has
- <quote>looked</quote> at the value of the bit. The sender
- only knows when the clock says to begin transmitting the
- next bit of the word.</para>
-
- <para>When the entire data word has been sent, the transmitter
- may add a Parity Bit that the transmitter generates. The
- Parity Bit may be used by the receiver to perform simple
- error checking. Then at least one Stop Bit is sent by the
- transmitter.</para>
-
- <para>When the receiver has received all of the bits in the
- data word, it may check for the Parity Bits (both sender and
- receiver must agree on whether a Parity Bit is to be used),
- and then the receiver looks for a Stop Bit. If the Stop Bit
- does not appear when it is supposed to, the UART considers
- the entire word to be garbled and will report a Framing
- Error to the host processor when the data word is read. The
- usual cause of a Framing Error is that the sender and
- receiver clocks were not running at the same speed, or that
- the signal was interrupted.</para>
-
- <para>Regardless of whether the data was received correctly or
- not, the UART automatically discards the Start, Parity and
- Stop bits. If the sender and receiver are configured
- identically, these bits are not passed to the host.</para>
-
- <para>If another word is ready for transmission, the Start Bit
- for the new word can be sent as soon as the Stop Bit for the
- previous word has been sent.</para>
-
- <para>Because asynchronous data is <quote>self
- synchronizing</quote>, if there is no data to transmit, the
- transmission line can be idle.</para>
- </sect2>
-
- <sect2>
- <title>Other UART Functions</title>
-
- <para>In addition to the basic job of converting data from
- parallel to serial for transmission and from serial to
- parallel on reception, a UART will usually provide
- additional circuits for signals that can be used to indicate
- the state of the transmission media, and to regulate the
- flow of data in the event that the remote device is not
- prepared to accept more data. For example, when the device
- connected to the UART is a modem, the modem may report the
- presence of a carrier on the phone line while the computer
- may be able to instruct the modem to reset itself or to not
- take calls by asserting or disasserting one more of these
- extra signals. The function of each of these additional
- signals is defined in the EIA RS232-C standard.</para>
- </sect2>
-
- <sect2>
- <title>The RS232-C and V.24 Standards</title>
-
- <para>In most computer systems, the UART is connected to
- circuitry that generates signals that comply with the EIA
- RS232-C specification. There is also a CCITT standard named
- V.24 that mirrors the specifications included in
- RS232-C.</para>
-
- <sect3>
- <title>RS232-C Bit Assignments (Marks and Spaces)</title>
-
- <para>In RS232-C, a value of <literal>1</literal> is called
- a <literal>Mark</literal> and a value of
- <literal>0</literal> is called a <literal>Space</literal>.
- When a communication line is idle, the line is said to be
- <quote>Marking</quote>, or transmitting continuous
- <literal>1</literal> values.</para>
-
- <para>The Start bit always has a value of
- <literal>0</literal> (a Space). The Stop Bit always has a
- value of <literal>1</literal> (a Mark). This means that
- there will always be a Mark (1) to Space (0) transition on
- the line at the start of every word, even when multiple
- word are transmitted back to back. This guarantees that
- sender and receiver can resynchronize their clocks
- regardless of the content of the data bits that are being
- transmitted.</para>
-
- <para>The idle time between Stop and Start bits does not
- have to be an exact multiple (including zero) of the bit
- rate of the communication link, but most UARTs are
- designed this way for simplicity.</para>
-
- <para>In RS232-C, the "Marking" signal (a
- <literal>1</literal>) is represented by a voltage between
- -2 VDC and -12 VDC, and a "Spacing" signal (a
- <literal>0</literal>) is represented by a voltage between
- 0 and +12 VDC. The transmitter is supposed to send +12
- VDC or -12 VDC, and the receiver is supposed to allow for
- some voltage loss in long cables. Some transmitters in
- low power devices (like portable computers) sometimes use
- only +5 VDC and -5 VDC, but these values are still
- acceptable to a RS232-C receiver, provided that the cable
- lengths are short.</para>
- </sect3>
-
- <sect3>
- <title>RS232-C Break Signal</title>
-
- <para>RS232-C also specifies a signal called a
- <literal>Break</literal>, which is caused by sending
- continuous Spacing values (no Start or Stop bits). When
- there is no electricity present on the data circuit, the
- line is considered to be sending
- <literal>Break</literal>.</para>
-
- <para>The <literal>Break</literal> signal must be of a
- duration longer than the time it takes to send a complete
- byte plus Start, Stop and Parity bits. Most UARTs can
- distinguish between a Framing Error and a Break, but if
- the UART cannot do this, the Framing Error detection can
- be used to identify Breaks.</para>
-
- <para>In the days of teleprinters, when numerous printers
- around the country were wired in series (such as news
- services), any unit could cause a <literal>Break</literal>
- by temporarily opening the entire circuit so that no
- current flowed. This was used to allow a location with
- urgent news to interrupt some other location that was
- currently sending information.</para>
-
- <para>In modern systems there are two types of Break
- signals. If the Break is longer than 1.6 seconds, it is
- considered a "Modem Break", and some modems can be
- programmed to terminate the conversation and go on-hook or
- enter the modems' command mode when the modem detects this
- signal. If the Break is smaller than 1.6 seconds, it
- signifies a Data Break and it is up to the remote computer
- to respond to this signal. Sometimes this form of Break
- is used as an Attention or Interrupt signal and sometimes
- is accepted as a substitute for the ASCII CONTROL-C
- character.</para>
-
- <para>Marks and Spaces are also equivalent to
- <quote>Holes</quote> and <quote>No Holes</quote> in paper
- tape systems.</para>
-
- <note>
- <para>Breaks cannot be generated from paper tape or from
- any other byte value, since bytes are always sent with
- Start and Stop bit. The UART is usually capable of
- generating the continuous Spacing signal in response to
- a special command from the host processor.</para>
- </note>
- </sect3>
-
- <sect3>
- <title>RS232-C DTE and DCE Devices</title>
-
- <para>The RS232-C specification defines two types of
- equipment: the Data Terminal Equipment (DTE) and the Data
- Carrier Equipment (DCE). Usually, the DTE device is the
- terminal (or computer), and the DCE is a modem. Across
- the phone line at the other end of a conversation, the
- receiving modem is also a DCE device and the computer that
- is connected to that modem is a DTE device. The DCE
- device receives signals on the pins that the DTE device
- transmits on, and vice versa.</para>
-
- <para>When two devices that are both DTE or both DCE must be
- connected together without a modem or a similar media
- translater between them, a NULL modem must be used. The
- NULL modem electrically re-arranges the cabling so that
- the transmitter output is connected to the receiver input
- on the other device, and vice versa. Similar translations
- are performed on all of the control signals so that each
- device will see what it thinks are DCE (or DTE) signals
- from the other device.</para>
-
- <para>The number of signals generated by the DTE and DCE
- devices are not symmetrical. The DTE device generates
- fewer signals for the DCE device than the DTE device
- receives from the DCE.</para>
- </sect3>
-
- <sect3>
- <title>RS232-C Pin Assignments</title>
-
- <para>The EIA RS232-C specification (and the ITU equivalent,
- V.24) calls for a twenty-five pin connector (usually a
- DB25) and defines the purpose of most of the pins in that
- connector.</para>
-
- <para>In the IBM Personal Computer and similar systems, a
- subset of RS232-C signals are provided via nine pin
- connectors (DB9). The signals that are not included on
- the PC connector deal mainly with synchronous operation,
- and this transmission mode is not supported by the UART
- that IBM selected for use in the IBM PC.</para>
-
- <para>Depending on the computer manufacturer, a DB25, a DB9,
- or both types of connector may be used for RS232-C
- communications. (The IBM PC also uses a DB25 connector
- for the parallel printer interface which causes some
- confusion.)</para>
-
- <para>Below is a table of the RS232-C signal assignments in
- the DB25 and DB9 connectors.</para>
-
- <informaltable frame="none">
- <tgroup cols="7">
- <thead>
- <row>
- <entry>DB25 RS232-C Pin</entry> <entry>DB9 IBM PC
- Pin</entry> <entry>EIA Circuit Symbol</entry>
- <entry>CCITT Circuit Symbol</entry> <entry>Common
- Name</entry> <entry>Signal Source</entry>
- <entry>Description</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>1</entry>
- <entry>-</entry>
- <entry>AA</entry>
- <entry>101</entry>
- <entry>PG/FG</entry>
- <entry>-</entry>
- <entry>Frame/Protective Ground</entry>
- </row>
-
- <row>
- <entry>2</entry>
- <entry>3</entry>
- <entry>BA</entry>
- <entry>103</entry>
- <entry>TD</entry>
- <entry>DTE</entry>
- <entry>Transmit Data</entry>
- </row>
-
- <row>
- <entry>3</entry>
- <entry>2</entry>
- <entry>BB</entry>
- <entry>104</entry>
- <entry>RD</entry>
- <entry>DCE</entry>
- <entry>Receive Data</entry>
- </row>
-
- <row>
- <entry>4</entry>
- <entry>7</entry>
- <entry>CA</entry>
- <entry>105</entry>
- <entry>RTS</entry>
- <entry>DTE</entry>
- <entry>Request to Send</entry>
- </row>
-
- <row>
- <entry>5</entry>
- <entry>8</entry>
- <entry>CB</entry>
- <entry>106</entry>
- <entry>CTS</entry>
- <entry>DCE</entry>
- <entry>Clear to Send</entry>
- </row>
-
- <row>
- <entry>6</entry>
- <entry>6</entry>
- <entry>CC</entry>
- <entry>107</entry>
- <entry>DSR</entry>
- <entry>DCE</entry>
- <entry>Data Set Ready</entry>
- </row>
-
- <row>
- <entry>7</entry>
- <entry>5</entry>
- <entry>AV</entry>
- <entry>102</entry>
- <entry>SG/GND</entry>
- <entry>-</entry>
- <entry>Signal Ground</entry>
- </row>
-
- <row>
- <entry>8</entry>
- <entry>1</entry>
- <entry>CF</entry>
- <entry>109</entry>
- <entry>DCD/CD</entry>
- <entry>DCE</entry>
- <entry>Data Carrier Detect</entry>
- </row>
-
- <row>
- <entry>9</entry>
- <entry>-</entry>
- <entry>-</entry>
- <entry>-</entry>
- <entry>-</entry>
- <entry>-</entry>
- <entry>Reserved for Test</entry>
- </row>
-
- <row>
- <entry>10</entry>
- <entry>-</entry>
- <entry>-</entry>
- <entry>-</entry>
- <entry>-</entry>
- <entry>-</entry>
- <entry>Reserved for Test</entry>
- </row>
-
- <row>
- <entry>11</entry>
- <entry>-</entry>
- <entry>-</entry>
- <entry>-</entry>
- <entry>-</entry>
- <entry>-</entry>
- <entry>Reserved for Test</entry>
- </row>
-
- <row>
- <entry>12</entry>
- <entry>-</entry>
- <entry>CI</entry>
- <entry>122</entry>
- <entry>SRLSD</entry>
- <entry>DCE</entry>
- <entry>Sec. Recv. Line Signal Detector</entry>
- </row>
-
- <row>
- <entry>13</entry>
- <entry>-</entry>
- <entry>SCB</entry>
- <entry>121</entry>
- <entry>SCTS</entry>
- <entry>DCE</entry>
- <entry>Secondary Clear to Send</entry>
- </row>
-
- <row>
- <entry>14</entry>
- <entry>-</entry>
- <entry>SBA</entry>
- <entry>118</entry>
- <entry>STD</entry>
- <entry>DTE</entry>
- <entry>Secondary Transmit Data</entry>
- </row>
-
- <row>
- <entry>15</entry>
- <entry>-</entry>
- <entry>DB</entry>
- <entry>114</entry>
- <entry>TSET</entry>
- <entry>DCE</entry>
- <entry>Trans. Sig. Element Timing</entry>
- </row>
-
- <row>
- <entry>16</entry>
- <entry>-</entry>
- <entry>SBB</entry>
- <entry>119</entry>
- <entry>SRD</entry>
- <entry>DCE</entry>
- <entry>Secondary Received Data</entry>
- </row>
-
- <row>
- <entry>17</entry>
- <entry>-</entry>
- <entry>DD</entry>
- <entry>115</entry>
- <entry>RSET</entry>
- <entry>DCE</entry>
- <entry>Receiver Signal Element Timing</entry>
- </row>
-
- <row>
- <entry>18</entry>
- <entry>-</entry>
- <entry>-</entry>
- <entry>141</entry>
- <entry>LOOP</entry>
- <entry>DTE</entry>
- <entry>Local Loopback</entry>
- </row>
-
- <row>
- <entry>19</entry>
- <entry>-</entry>
- <entry>SCA</entry>
- <entry>120</entry>
- <entry>SRS</entry>
- <entry>DTE</entry>
- <entry>Secondary Request to Send</entry>
- </row>
-
- <row>
- <entry>20</entry>
- <entry>4</entry>
- <entry>CD</entry>
- <entry>108.2</entry>
- <entry>DTR</entry>
- <entry>DTE</entry>
- <entry>Data Terminal Ready</entry>
- </row>
-
- <row>
- <entry>21</entry>
- <entry>-</entry>
- <entry>-</entry>
- <entry>-</entry>
- <entry>RDL</entry>
- <entry>DTE</entry>
- <entry>Remote Digital Loopback</entry>
- </row>
-
- <row>
- <entry>22</entry>
- <entry>9</entry>
- <entry>CE</entry>
- <entry>125</entry>
- <entry>RI</entry>
- <entry>DCE</entry>
- <entry>Ring Indicator</entry>
- </row>
-
- <row>
- <entry>23</entry>
- <entry>-</entry>
- <entry>CH</entry>
- <entry>111</entry>
- <entry>DSRS</entry>
- <entry>DTE</entry>
- <entry>Data Signal Rate Selector</entry>
- </row>
-
- <row>
- <entry>24</entry>
- <entry>-</entry>
- <entry>DA</entry>
- <entry>113</entry>
- <entry>TSET</entry>
- <entry>DTE</entry>
- <entry>Trans. Sig. Element Timing</entry>
- </row>
-
- <row>
- <entry>25</entry>
- <entry>-</entry>
- <entry>-</entry>
- <entry>142</entry>
- <entry>-</entry>
- <entry>DCE</entry>
- <entry>Test Mode</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </sect3>
- </sect2>
-
- <sect2>
- <title>Bits, Baud and Symbols</title>
-
- <para>Baud is a measurement of transmission speed in
- asynchronous communication. Because of advances in modem
- communication technology, this term is frequently misused
- when describing the data rates in newer devices.</para>
-
- <para>Traditionally, a Baud Rate represents the number of bits
- that are actually being sent over the media, not the amount
- of data that is actually moved from one DTE device to the
- other. The Baud count includes the overhead bits Start, Stop
- and Parity that are generated by the sending UART and
- removed by the receiving UART. This means that seven-bit
- words of data actually take 10 bits to be completely
- transmitted. Therefore, a modem capable of moving 300 bits
- per second from one place to another can normally only move
- 30 7-bit words if Parity is used and one Start and Stop bit
- are present.</para>
-
- <para>If 8-bit data words are used and Parity bits are also
- used, the data rate falls to 27.27 words per second, because
- it now takes 11 bits to send the eight-bit words, and the
- modem still only sends 300 bits per second.</para>
-
- <para>The formula for converting bytes per second into a baud
- rate and vice versa was simple until error-correcting modems
- came along. These modems receive the serial stream of bits
- from the UART in the host computer (even when internal
- modems are used the data is still frequently serialized) and
- converts the bits back into bytes. These bytes are then
- combined into packets and sent over the phone line using a
- Synchronous transmission method. This means that the Stop,
- Start, and Parity bits added by the UART in the DTE (the
- computer) were removed by the modem before transmission by
- the sending modem. When these bytes are received by the
- remote modem, the remote modem adds Start, Stop and Parity
- bits to the words, converts them to a serial format and then
- sends them to the receiving UART in the remote computer, who
- then strips the Start, Stop and Parity bits.</para>
-
- <para>The reason all these extra conversions are done is so
- that the two modems can perform error correction, which
- means that the receiving modem is able to ask the sending
- modem to resend a block of data that was not received with
- the correct checksum. This checking is handled by the
- modems, and the DTE devices are usually unaware that the
- process is occurring.</para>
-
- <para>By striping the Start, Stop and Parity bits, the
- additional bits of data that the two modems must share
- between themselves to perform error-correction are mostly
- concealed from the effective transmission rate seen by the
- sending and receiving DTE equipment. For example, if a
- modem sends ten 7-bit words to another modem without
- including the Start, Stop and Parity bits, the sending modem
- will be able to add 30 bits of its own information that the
- receiving modem can use to do error-correction without
- impacting the transmission speed of the real data.</para>
-
- <para>The use of the term Baud is further confused by modems
- that perform compression. A single 8-bit word passed over
- the telephone line might represent a dozen words that were
- transmitted to the sending modem. The receiving modem will
- expand the data back to its original content and pass that
- data to the receiving DTE.</para>
-
- <para>Modern modems also include buffers that allow the rate
- that bits move across the phone line (DCE to DCE) to be a
- different speed than the speed that the bits move between
- the DTE and DCE on both ends of the conversation. Normally
- the speed between the DTE and DCE is higher than the DCE to
- DCE speed because of the use of compression by the
- modems.</para>
-
- <para>Because the number of bits needed to describe a byte
- varied during the trip between the two machines plus the
- differing bits-per-seconds speeds that are used present on
- the DTE-DCE and DCE-DCE links, the usage of the term Baud to
- describe the overall communication speed causes problems and
- can misrepresent the true transmission speed. So Bits Per
- Second (bps) is the correct term to use to describe the
- transmission rate seen at the DCE to DCE interface and Baud
- or Bits Per Second are acceptable terms to use when a
- connection is made between two systems with a wired
- connection, or if a modem is in use that is not performing
- error-correction or compression.</para>
-
- <para>Modern high speed modems (2400, 9600, 14,400, and
- 19,200bps) in reality still operate at or below 2400 baud,
- or more accurately, 2400 Symbols per second. High speed
- modem are able to encode more bits of data into each Symbol
- using a technique called Constellation Stuffing, which is
- why the effective bits per second rate of the modem is
- higher, but the modem continues to operate within the
- limited audio bandwidth that the telephone system provides.
- Modems operating at 28,800 and higher speeds have variable
- Symbol rates, but the technique is the same.</para>
- </sect2>
-
- <sect2>
- <title>The IBM Personal Computer UART</title>
-
- <para>Starting with the original IBM Personal Computer, IBM
- selected the National Semiconductor INS8250 UART for use in
- the IBM PC Parallel/Serial Adapter. Subsequent generations
- of compatible computers from IBM and other vendors continued
- to use the INS8250 or improved versions of the National
- Semiconductor UART family.</para>
-
- <sect3>
- <title>National Semiconductor UART Family Tree</title>
-
- <para>There have been several versions and subsequent
- generations of the INS8250 UART. Each major version is
- described below.</para>
-
- <!-- This should really be a graphic -->
- <programlisting>INS8250 -&gt; INS8250B
- \
- \
- \-&gt; INS8250A -&gt; INS82C50A
- \
- \
- \-&gt; NS16450 -&gt; NS16C450
- \
- \
- \-&gt; NS16550 -&gt; NS16550A -&gt; PC16550D</programlisting>
-
- <variablelist>
- <varlistentry>
- <term>INS8250</term>
-
- <listitem>
- <para>This part was used in the original IBM PC and
- IBM PC/XT. The original name for this part was the
- INS8250 ACE (Asynchronous Communications Element)
- and it is made from NMOS technology.</para>
-
- <para>The 8250 uses eight I/O ports and has a one-byte
- send and a one-byte receive buffer. This original
- UART has several race conditions and other
- flaws. The original IBM BIOS includes code to work
- around these flaws, but this made the BIOS dependent
- on the flaws being present, so subsequent parts like
- the 8250A, 16450 or 16550 could not be used in the
- original IBM PC or IBM PC/XT.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>INS8250-B</term>
-
- <listitem>
- <para>This is the slower speed of the INS8250 made
- from NMOS technology. It contains the same problems
- as the original INS8250.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>INS8250A</term>
-
- <listitem>
- <para>An improved version of the INS8250 using XMOS
- technology with various functional flaws
- corrected. The INS8250A was used initially in PC
- clone computers by vendors who used
- <quote>clean</quote> BIOS designs. Because of the
- corrections in the chip, this part could not be used
- with a BIOS compatible with the INS8250 or
- INS8250B.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>INS82C50A</term>
-
- <listitem>
- <para>This is a CMOS version (low power consumption)
- of the INS8250A and has similar functional
- characteristics.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>NS16450</term>
-
- <listitem>
- <para>Same as NS8250A with improvements so it can be
- used with faster CPU bus designs. IBM used this
- part in the IBM AT and updated the IBM BIOS to no
- longer rely on the bugs in the INS8250.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>NS16C450</term>
-
- <listitem>
- <para>This is a CMOS version (low power consumption)
- of the NS16450.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>NS16550</term>
-
- <listitem>
- <para>Same as NS16450 with a 16-byte send and receive
- buffer but the buffer design was flawed and could
- not be reliably be used.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>NS16550A</term>
-
- <listitem>
- <para>Same as NS16550 with the buffer flaws
- corrected. The 16550A and its successors have become
- the most popular UART design in the PC industry,
- mainly due it its ability to reliably handle higher
- data rates on operating systems with sluggish
- interrupt response times.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>NS16C552</term>
-
- <listitem>
- <para>This component consists of two NS16C550A CMOS
- UARTs in a single package.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>PC16550D</term>
-
- <listitem>
- <para>Same as NS16550A with subtle flaws
- corrected. This is revision D of the 16550 family
- and is the latest design available from National
- Semiconductor.</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect3>
-
- <sect3>
- <title>The NS16550AF and the PC16550D are the same thing</title>
-
- <para>National reorganized their part numbering system a few
- years ago, and the NS16550AFN no longer exists by that
- name. (If you have a NS16550AFN, look at the date code on
- the part, which is a four digit number that usually starts
- with a nine. The first two digits of the number are the
- year, and the last two digits are the week in that year
- when the part was packaged. If you have a NS16550AFN, it
- is probably a few years old.)</para>
-
- <para>The new numbers are like PC16550DV, with minor
- differences in the suffix letters depending on the package
- material and its shape. (A description of the numbering
- system can be found below.)</para>
-
- <para>It is important to understand that in some stores, you
- may pay &#36;15(US) for a NS16550AFN made in 1990 and in
- the next bin are the new PC16550DN parts with minor fixes
- that National has made since the AFN part was in
- production, the PC16550DN was probably made in the past
- six months and it costs half (as low as &#36;5(US) in
- volume) as much as the NS16550AFN because they are readily
- available.</para>
-
- <para>As the supply of NS16550AFN chips continues to shrink,
- the price will probably continue to increase until more
- people discover and accept that the PC16550DN really has
- the same function as the old part number.</para>
- </sect3>
-
- <sect3>
- <title>National Semiconductor Part Numbering System</title>
-
- <para>The older NS<replaceable>nnnnnrqp</replaceable> part
- numbers are now of the format
- PC<replaceable>nnnnnrgp</replaceable>.</para>
-
- <para>The <replaceable>r</replaceable> is the revision
- field. The current revision of the 16550 from National
- Semiconductor is <literal>D</literal>.</para>
-
- <para>The <replaceable>p</replaceable> is the package-type
- field. The types are:</para>
-
- <informaltable frame="none">
- <tgroup cols="3">
- <tbody>
- <row>
- <entry>"F"</entry>
- <entry>QFP</entry>
- <entry>(quad flat pack) L lead type</entry>
- </row>
-
- <row>
- <entry>"N"</entry>
- <entry>DIP</entry>
- <entry>(dual inline package) through hole straight lead
- type</entry>
- </row>
-
- <row>
- <entry>"V"</entry>
- <entry>LPCC</entry>
- <entry>(lead plastic chip carrier) J lead type</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <para>The <replaceable>g</replaceable> is the product grade
- field. If an <literal>I</literal> precedes the
- package-type letter, it indicates an
- <quote>industrial</quote> grade part, which has higher
- specs than a standard part but not as high as Military
- Specification (Milspec) component. This is an optional
- field.</para>
-
- <para>So what we used to call a NS16550AFN (DIP Package) is
- now called a PC16550DN or PC16550DIN.</para>
- </sect3>
- </sect2>
-
- <sect2>
- <title>Other Vendors and Similar UARTs</title>
-
- <para>Over the years, the 8250, 8250A, 16450 and 16550 have
- been licensed or copied by other chip vendors. In the case
- of the 8250, 8250A and 16450, the exact circuit (the
- <quote>megacell</quote>) was licensed to many vendors,
- including Western Digital and Intel. Other vendors
- reverse-engineered the part or produced emulations that had
- similar behavior.</para>
-
- <para>In internal modems, the modem designer will frequently
- emulate the 8250A/16450 with the modem microprocessor, and
- the emulated UART will frequently have a hidden buffer
- consisting of several hundred bytes. Because of the size of
- the buffer, these emulations can be as reliable as a 16550A
- in their ability to handle high speed data. However, most
- operating systems will still report that the UART is only a
- 8250A or 16450, and may not make effective use of the extra
- buffering present in the emulated UART unless special
- drivers are used.</para>
-
- <para>Some modem makers are driven by market forces to abandon
- a design that has hundreds of bytes of buffer and instead
- use a 16550A UART so that the product will compare favorably
- in market comparisons even though the effective performance
- may be lowered by this action.</para>
-
- <para>A common misconception is that all parts with
- <quote>16550A</quote> written on them are identical in
- performance. There are differences, and in some cases,
- outright flaws in most of these 16550A clones.</para>
-
- <para>When the NS16550 was developed, the National
- Semiconductor obtained several patents on the design and
- they also limited licensing, making it harder for other
- vendors to provide a chip with similar features. Because of
- the patents, reverse-engineered designs and emulations had
- to avoid infringing the claims covered by the patents.
- Subsequently, these copies almost never perform exactly the
- same as the NS16550A or PC16550D, which are the parts most
- computer and modem makers want to buy but are sometimes
- unwilling to pay the price required to get the genuine
- part.</para>
-
- <para>Some of the differences in the clone 16550A parts are
- unimportant, while others can prevent the device from being
- used at all with a given operating system or driver. These
- differences may show up when using other drivers, or when
- particular combinations of events occur that were not well
- tested or considered in the Windows driver. This is because
- most modem vendors and 16550-clone makers use the Microsoft
- drivers from Windows for Workgroups 3.11 and the Microsoft
- MS-DOS utility as the primary tests for compatibility with
- the NS16550A. This over-simplistic criteria means that if a
- different operating system is used, problems could appear
- due to subtle differences between the clones and genuine
- components.</para>
-
- <para>National Semiconductor has made available a program
- named <application>COMTEST</application> that performs
- compatibility tests independent of any OS drivers. It
- should be remembered that the purpose of this type of
- program is to demonstrate the flaws in the products of the
- competition, so the program will report major as well as
- extremely subtle differences in behavior in the part being
- tested.</para>
-
- <para>In a series of tests performed by the author of this
- document in 1994, components made by National Semiconductor,
- TI, StarTech, and CMD as well as megacells and emulations
- embedded in internal modems were tested with COMTEST. A
- difference count for some of these components is listed
- below. Because these tests were performed in 1994, they may
- not reflect the current performance of the given product
- from a vendor.</para>
-
- <para>It should be noted that COMTEST normally aborts when an
- excessive number or certain types of problems have been
- detected. As part of this testing, COMTEST was modified so
- that it would not abort no matter how many differences were
- encountered.</para>
-
- <informaltable frame="none">
- <tgroup cols="3">
- <thead>
- <row>
- <entry>Vendor</entry>
- <entry>Part Number</entry>
- <entry>Errors (aka "differences" reported)</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>National</entry>
- <entry>(PC16550DV)</entry>
- <entry>0</entry>
- </row>
-
- <row>
- <entry>National</entry>
- <entry>(NS16550AFN)</entry>
- <entry>0</entry>
- </row>
-
- <row>
- <entry>National</entry>
- <entry>(NS16C552V)</entry>
- <entry>0</entry>
- </row>
-
- <row>
- <entry>TI</entry>
- <entry>(TL16550AFN)</entry>
- <entry>3</entry>
- </row>
-
- <row>
- <entry>CMD</entry>
- <entry>(16C550PE)</entry>
- <entry>19</entry>
- </row>
-
- <row>
- <entry>StarTech</entry>
- <entry>(ST16C550J)</entry>
- <entry>23</entry>
- </row>
-
- <row>
- <entry>Rockwell</entry>
- <entry>Reference modem with internal 16550 or an
- emulation (RC144DPi/C3000-25)</entry>
- <entry>117</entry>
- </row>
-
- <row>
- <entry>Sierra</entry>
- <entry>Modem with an internal 16550
- (SC11951/SC11351)</entry>
- <entry>91</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <note>
- <para>To date, the author of this document has not found any
- non-National parts that report zero differences using the
- COMTEST program. It should also be noted that National
- has had five versions of the 16550 over the years and the
- newest parts behave a bit differently than the classic
- NS16550AFN that is considered the benchmark for
- functionality. COMTEST appears to turn a blind eye to the
- differences within the National product line and reports
- no errors on the National parts (except for the original
- 16550) even when there are official erratas that describe
- bugs in the A, B and C revisions of the parts, so this
- bias in COMTEST must be taken into account.</para>
- </note>
-
- <para>It is important to understand that a simple count of
- differences from COMTEST does not reveal a lot about what
- differences are important and which are not. For example,
- about half of the differences reported in the two modems
- listed above that have internal UARTs were caused by the
- clone UARTs not supporting five- and six-bit character
- modes. The real 16550, 16450, and 8250 UARTs all support
- these modes and COMTEST checks the functionality of these
- modes so over fifty differences are reported. However,
- almost no modern modem supports five- or six-bit characters,
- particularly those with error-correction and compression
- capabilities. This means that the differences related to
- five- and six-bit character modes can be discounted.</para>
-
- <para>Many of the differences COMTEST reports have to do with
- timing. In many of the clone designs, when the host reads
- from one port, the status bits in some other port may not
- update in the same amount of time (some faster, some slower)
- as a <emphasis>real</emphasis> NS16550AFN and COMTEST looks
- for these differences. This means that the number of
- differences can be misleading in that one device may only
- have one or two differences but they are extremely serious,
- and some other device that updates the status registers
- faster or slower than the reference part (that would
- probably never affect the operation of a properly written
- driver) could have dozens of differences reported.</para>
-
- <para>COMTEST can be used as a screening tool to alert the
- administrator to the presence of potentially incompatible
- components that might cause problems or have to be handled
- as a special case.</para>
-
- <para>If you run COMTEST on a 16550 that is in a modem or a
- modem is attached to the serial port, you need to first
- issue a ATE0&amp;W command to the modem so that the modem
- will not echo any of the test characters. If you forget to
- do this, COMTEST will report at least this one
- difference:</para>
-
- <screen>Error (6)...Timeout interrupt failed: IIR = c1 LSR = 61</screen>
- </sect2>
-
- <sect2>
- <title>8250/16450/16550 Registers</title>
-
- <para>The 8250/16450/16550 UART occupies eight contiguous I/O
- port addresses. In the IBM PC, there are two defined
- locations for these eight ports and they are known
- collectively as COM1 and COM2. The makers of PC-clones and
- add-on cards have created two additional areas known as COM3
- and COM4, but these extra COM ports conflict with other
- hardware on some systems. The most common conflict is with
- video adapters that provide IBM 8514 emulation.</para>
-
- <para>COM1 is located from 0x3f8 to 0x3ff and normally uses
- IRQ 4 COM2 is located from 0x2f8 to 0x2ff and normally uses
- IRQ 3 COM3 is located from 0x3e8 to 0x3ef and has no
- standardized IRQ COM4 is located from 0x2e8 to 0x2ef and has
- no standardized IRQ.</para>
-
- <para>A description of the I/O ports of the 8250/16450/16550
- UART is provided below.</para>
-
- <informaltable frame="none">
- <tgroup cols="3">
- <thead>
- <row>
- <entry>I/O Port</entry>
- <entry>Access Allowed</entry>
- <entry>Description</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>+0x00</entry>
- <entry>write (DLAB==0)</entry>
- <entry><para>Transmit Holding Register
- (THR).</para><para>Information written to this port are
- treated as data words and will be transmitted by the
- UART.</para></entry>
- </row>
-
- <row>
- <entry>+0x00</entry>
- <entry>read (DLAB==0)</entry>
- <entry><para>Receive Buffer Register (RBR).</para><para>Any
- data words received by the UART form the serial link are
- accessed by the host by reading this
- port.</para></entry>
- </row>
-
- <row>
- <entry>+0x00</entry>
- <entry>write/read (DLAB==1)</entry>
- <entry><para>Divisor Latch LSB (DLL)</para><para>This value
- will be divided from the master input clock (in the IBM
- PC, the master clock is 1.8432MHz) and the resulting
- clock will determine the baud rate of the UART. This
- register holds bits 0 thru 7 of the
- divisor.</para></entry>
- </row>
-
- <row>
- <entry>+0x01</entry>
- <entry>write/read (DLAB==1)</entry>
- <entry><para>Divisor Latch MSB (DLH)</para><para>This value
- will be divided from the master input clock (in the IBM
- PC, the master clock is 1.8432MHz) and the resulting
- clock will determine the baud rate of the UART. This
- register holds bits 8 thru 15 of the
- divisor.</para></entry>
- </row>
-
- <row>
- <entry>+0x01</entry>
- <entry>write/read (DLAB==0)</entry>
- <entrytbl cols="2">
- <colspec colnum="1" colname="col1">
- <colspec colnum="2" colname="col2">
- <spanspec namest="col1" nameend="col2" spanname="1to2">
-
- <tbody>
- <row>
- <entry spanname="1to2"><para>Interrupt Enable Register
- (IER)</para><para>The 8250/16450/16550 UART
- classifies events into one of four categories.
- Each category can be configured to generate an
- interrupt when any of the events occurs. The
- 8250/16450/16550 UART generates a single external
- interrupt signal regardless of how many events in
- the enabled categories have occurred. It is up to
- the host processor to respond to the interrupt and
- then poll the enabled interrupt categories
- (usually all categories have interrupts enabled)
- to determine the true cause(s) of the
- interrupt.</para></entry>
- </row>
-
- <row>
- <entry>Bit 7</entry>
- <entry>Reserved, always 0.</entry>
- </row>
-
- <row>
- <entry>Bit 6</entry>
- <entry>Reserved, always 0.</entry>
- </row>
-
- <row>
- <entry>Bit 5</entry>
- <entry>Reserved, always 0.</entry>
- </row>
-
- <row>
- <entry>Bit 4</entry>
- <entry>Reserved, always 0.</entry>
- </row>
-
- <row>
- <entry>Bit 3</entry>
- <entry>Enable Modem Status Interrupt (EDSSI). Setting
- this bit to "1" allows the UART to generate an
- interrupt when a change occurs on one or more of the
- status lines.</entry>
- </row>
-
- <row>
- <entry>Bit 2</entry>
- <entry>Enable Receiver Line Status Interrupt (ELSI)
- Setting this bit to "1" causes the UART to generate
- an interrupt when the an error (or a BREAK signal)
- has been detected in the incoming data.</entry>
- </row>
-
- <row>
- <entry>Bit 1</entry>
- <entry>Enable Transmitter Holding Register Empty
- Interrupt (ETBEI) Setting this bit to "1" causes the
- UART to generate an interrupt when the UART has room
- for one or more additional characters that are to be
- transmitted.</entry>
- </row>
-
- <row>
- <entry>Bit 0</entry>
- <entry>Enable Received Data Available Interrupt
- (ERBFI) Setting this bit to "1" causes the UART to
- generate an interrupt when the UART has received
- enough characters to exceed the trigger level of the
- FIFO, or the FIFO timer has expired (stale data), or
- a single character has been received when the FIFO
- is disabled.</entry>
- </row>
- </tbody>
- </entrytbl>
- </row>
-
- <row>
- <entry>+0x02</entry>
- <entry>write</entry>
- <entrytbl cols="4">
- <colspec colnum="1" colname="col1">
- <colspec colnum="2" colname="col2">
- <colspec colnum="3" colname="col3">
- <colspec colnum="4" colname="col4">
- <spanspec namest="col1" nameend="col4" spanname="1to4">
- <spanspec namest="col2" nameend="col4" spanname="2to4">
-
- <tbody>
- <row>
- <entry spanname="1to4">FIFO Control Register (FCR)
- (This port does not exist on the 8250 and 16450
- UART.)</entry>
- </row>
-
- <row>
- <entry>Bit 7</entry>
- <entry spanname="2to4">Receiver Trigger Bit #1</entry>
- </row>
-
- <row>
- <entry>Bit 6</entry>
- <entry spanname="2to4"><para>Receiver Trigger Bit
- #0</para><para>These two bits control at what
- point the receiver is to generate an interrupt
- when the FIFO is active.</para></entry>
- </row>
-
- <row>
- <entry colname="col2">7</entry>
- <entry colname="col3">6</entry>
- <entry colname="col4">How many words are received
- before an interrupt is generated</entry>
- </row>
-
- <row>
- <entry colname="col2">0</entry>
- <entry colname="col3">0</entry>
- <entry colname="col4">1</entry>
- </row>
-
- <row>
- <entry colname="col2">0</entry>
- <entry colname="col3">1</entry>
- <entry colname="col4">4</entry>
- </row>
-
- <row>
- <entry colname="col2">1</entry>
- <entry colname="col3">0</entry>
- <entry colname="col4">8</entry>
- </row>
-
- <row>
- <entry colname="col2">1</entry>
- <entry colname="col3">1</entry>
- <entry colname="col4">14</entry>
- </row>
-
- <row>
- <entry>Bit 5</entry>
- <entry spanname="2to4">Reserved, always 0.</entry>
- </row>
-
- <row>
- <entry>Bit 4</entry>
- <entry spanname="2to4">Reserved, always 0.</entry>
- </row>
-
- <row>
- <entry>Bit 3</entry>
- <entry spanname="2to4">DMA Mode Select. If Bit 0 is
- set to "1" (FIFOs enabled), setting this bit changes
- the operation of the -RXRDY and -TXRDY signals from
- Mode 0 to Mode 1.</entry>
- </row>
-
- <row>
- <entry>Bit 2</entry>
- <entry spanname="2to4">Transmit FIFO Reset. When a
- "1" is written to this bit, the contents of the FIFO
- are discarded. Any word currently being transmitted
- will be sent intact. This function is useful in
- aborting transfers.</entry>
- </row>
-
- <row>
- <entry>Bit 1</entry>
- <entry spanname="2to4">Receiver FIFO Reset. When a
- "1" is written to this bit, the contents of the FIFO
- are discarded. Any word currently being assembled
- in the shift register will be received
- intact.</entry>
- </row>
-
- <row>
- <entry>Bit 0</entry>
- <entry spanname="2to4">16550 FIFO Enable. When set,
- both the transmit and receive FIFOs are enabled.
- Any contents in the holding register, shift
- registers or FIFOs are lost when FIFOs are enabled
- or disabled.</entry>
- </row>
- </tbody>
- </entrytbl>
- </row>
-
- <row>
- <entry>+0x02</entry>
- <entry>read</entry>
- <entrytbl cols="6">
- <colspec colnum="1" colname="col1">
- <colspec colnum="2" colname="col2">
- <colspec colnum="3" colname="col3">
- <colspec colnum="4" colname="col4">
- <colspec colnum="5" colname="col5">
- <colspec colnum="6" colname="col6">
- <spanspec namest="col1" nameend="col6" spanname="1to6">
- <spanspec namest="col2" nameend="col6" spanname="2to6">
-
- <tbody>
- <row>
- <entry spanname="1to6">Interrupt Identification
- Register</entry>
- </row>
-
- <row>
- <entry>Bit 7</entry>
- <entry spanname="2to6">FIFOs enabled. On the
- 8250/16450 UART, this bit is zero.</entry>
- </row>
-
- <row>
- <entry>Bit 6</entry>
- <entry spanname="2to6">FIFOs enabled. On the
- 8250/16450 UART, this bit is zero.</entry>
- </row>
-
- <row>
- <entry>Bit 5</entry>
- <entry spanname="2to6">Reserved, always 0.</entry>
- </row>
-
- <row>
- <entry>Bit 4</entry>
- <entry spanname="2to6">Reserved, always 0.</entry>
- </row>
-
- <row>
- <entry>Bit 3</entry>
- <entry spanname="2to6">Interrupt ID Bit #2. On the
- 8250/16450 UART, this bit is zero.</entry>
- </row>
-
- <row>
- <entry>Bit 2</entry>
- <entry spanname="2to6">Interrupt ID Bit #1</entry>
- </row>
-
- <row>
- <entry>Bit 1</entry>
- <entry spanname="2to6">Interrupt ID Bit #0.These
- three bits combine to report the category of
- event that caused the interrupt that is in
- progress. These categories have priorities,
- so if multiple categories of events occur at
- the same time, the UART will report the more
- important events first and the host must
- resolve the events in the order they are
- reported. All events that caused the current
- interrupt must be resolved before any new
- interrupts will be generated. (This is a
- limitation of the PC architecture.)</entry>
- </row>
-
- <row>
- <entry colname="col2">2</entry>
- <entry colname="col3">1</entry>
- <entry colname="col4">0</entry>
- <entry colname="col5">Priority</entry>
- <entry colname="col6">Description</entry>
- </row>
-
- <row>
- <entry colname="col2">0</entry>
- <entry colname="col3">1</entry>
- <entry colname="col4">1</entry>
- <entry colname="col5">First</entry>
- <entry colname="col6">Received Error (OE, PE, BI, or
- FE)</entry>
- </row>
-
- <row>
- <entry colname="col2">0</entry>
- <entry colname="col3">1</entry>
- <entry colname="col4">0</entry>
- <entry colname="col5">Second</entry>
- <entry colname="col6">Received Data Available</entry>
- </row>
-
- <row>
- <entry colname="col2">1</entry>
- <entry colname="col3">1</entry>
- <entry colname="col4">0</entry>
- <entry colname="col5">Second</entry>
- <entry colname="col6">Trigger level identification
- (Stale data in receive buffer)</entry>
- </row>
-
- <row>
- <entry colname="col2">0</entry>
- <entry colname="col3">0</entry>
- <entry colname="col4">1</entry>
- <entry colname="col5">Third</entry>
- <entry colname="col6">Transmitter has room for more
- words (THRE)</entry>
- </row>
-
- <row>
- <entry colname="col2">0</entry>
- <entry colname="col3">0</entry>
- <entry colname="col4">0</entry>
- <entry colname="col5">Fourth</entry>
- <entry colname="col6">Modem Status Change (-CTS, -DSR,
- -RI, or -DCD)</entry>
- </row>
-
- <row>
- <entry>Bit 0</entry>
- <entry spanname="2to6">Interrupt Pending Bit. If this
- bit is set to "0", then at least one interrupt is
- pending.</entry>
- </row>
- </tbody>
- </entrytbl>
- </row>
-
- <row>
- <entry>+0x03</entry>
- <entry>write/read</entry>
- <entrytbl cols="5">
- <colspec colnum="1" colname="col1">
- <colspec colnum="2" colname="col2">
- <colspec colnum="3" colname="col3">
- <colspec colnum="4" colname="col4">
- <colspec colnum="5" colname="col5">
- <spanspec namest="col1" nameend="col5" spanname="1to5">
- <spanspec namest="col2" nameend="col5" spanname="2to5">
- <spanspec namest="col4" nameend="col5" spanname="4to5">
-
- <tbody>
- <row>
- <entry spanname="1to5">Line Control Register
- (LCR)</entry>
- </row>
-
- <row>
- <entry>Bit 7</entry>
- <entry spanname="2to5">Divisor Latch Access Bit
- (DLAB). When set, access to the data
- transmit/receive register (THR/RBR) and the
- Interrupt Enable Register (IER) is disabled. Any
- access to these ports is now redirected to the
- Divisor Latch Registers. Setting this bit, loading
- the Divisor Registers, and clearing DLAB should be
- done with interrupts disabled.</entry>
- </row>
-
- <row>
- <entry>Bit 6</entry>
- <entry spanname="2to5">Set Break. When set to "1",
- the transmitter begins to transmit continuous
- Spacing until this bit is set to "0". This
- overrides any bits of characters that are being
- transmitted.</entry>
- </row>
-
- <row>
- <entry>Bit 5</entry>
- <entry spanname="2to5">Stick Parity. When parity is
- enabled, setting this bit causes parity to always be
- "1" or "0", based on the value of Bit 4.</entry>
- </row>
-
- <row>
- <entry>Bit 4</entry>
- <entry spanname="2to5">Even Parity Select (EPS). When
- parity is enabled and Bit 5 is "0", setting this bit
- causes even parity to be transmitted and expected.
- Otherwise, odd parity is used.</entry>
- </row>
-
- <row>
- <entry>Bit 3</entry>
- <entry spanname="2to5">Parity Enable (PEN). When set
- to "1", a parity bit is inserted between the last
- bit of the data and the Stop Bit. The UART will
- also expect parity to be present in the received
- data.</entry>
- </row>
-
- <row>
- <entry>Bit 2</entry>
- <entry spanname="2to5">Number of Stop Bits (STB). If
- set to "1" and using 5-bit data words, 1.5 Stop Bits
- are transmitted and expected in each data word. For
- 6, 7 and 8-bit data words, 2 Stop Bits are
- transmitted and expected. When this bit is set to
- "0", one Stop Bit is used on each data word.</entry>
- </row>
-
- <row>
- <entry>Bit 1</entry>
- <entry spanname="2to5">Word Length Select Bit #1
- (WLSB1)</entry>
- </row>
-
- <row>
- <entry>Bit 0</entry>
- <entry spanname="2to5">Word Length Select Bit #0
- (WLSB0)</entry>
- </row>
-
- <row>
- <entry colname="col2" spanname="2to5">Together these
- bits specify the number of bits in each data
- word.</entry>
- </row>
-
- <row>
- <entry colname="col2">1</entry>
- <entry colname="col3">0</entry>
- <entry colname="col4" spanname="4to5">Word
- Length</entry>
- </row>
-
- <row>
- <entry colname="col2">0</entry>
- <entry colname="col3">0</entry>
- <entry colname="col4" spanname="4to5">5 Data
- Bits</entry>
- </row>
-
- <row>
- <entry colname="col2">0</entry>
- <entry colname="col3">1</entry>
- <entry colname="col4" spanname="4to5">6 Data
- Bits</entry>
- </row>
-
- <row>
- <entry colname="col2">1</entry>
- <entry colname="col3">0</entry>
- <entry colname="col4" spanname="4to5">7 Data
- Bits</entry>
- </row>
-
- <row>
- <entry colname="col2">1</entry>
- <entry colname="col3">1</entry>
- <entry colname="col4" spanname="4to5">8 Data
- Bits</entry>
- </row>
- </tbody>
- </entrytbl>
- </row>
-
- <row>
- <entry>+0x04</entry>
- <entry>write/read</entry>
- <entrytbl cols="2">
- <colspec colnum="1" colname="col1">
- <colspec colnum="2" colname="col2">
- <spanspec namest="col1" nameend="col2" spanname="1to2">
-
- <tbody>
- <row>
- <entry spanname="1to2">Modem Control Register
- (MCR)</entry>
- </row>
-
- <row>
- <entry>Bit 7</entry>
- <entry>Reserved, always 0.</entry>
- </row>
-
- <row>
- <entry>Bit 6</entry>
- <entry>Reserved, always 0.</entry>
- </row>
-
- <row>
- <entry>Bit 5</entry>
- <entry>Reserved, always 0.</entry>
- </row>
-
- <row>
- <entry>Bit 4</entry>
- <entry>Loop-Back Enable. When set to "1", the UART
- transmitter and receiver are internally connected
- together to allow diagnostic operations. In
- addition, the UART modem control outputs are
- connected to the UART modem control inputs. CTS is
- connected to RTS, DTR is connected to DSR, OUT1 is
- connected to RI, and OUT 2 is connected to
- DCD.</entry>
- </row>
-
- <row>
- <entry>Bit 3</entry>
- <entry>OUT 2. An auxiliary output that the host
- processor may set high or low. In the IBM PC serial
- adapter (and most clones), OUT 2 is used to
- tri-state (disable) the interrupt signal from the
- 8250/16450/16550 UART.</entry>
- </row>
-
- <row>
- <entry>Bit 2</entry>
- <entry>OUT 1. An auxiliary output that the host
- processor may set high or low. This output is not
- used on the IBM PC serial adapter.</entry>
- </row>
-
- <row>
- <entry>Bit 1</entry>
- <entry>Request to Send (RTS). When set to "1", the
- output of the UART -RTS line is Low
- (Active).</entry>
- </row>
-
- <row>
- <entry>Bit 0</entry>
- <entry>Data Terminal Ready (DTR). When set to "1",
- the output of the UART -DTR line is Low
- (Active).</entry>
- </row>
- </tbody>
- </entrytbl>
- </row>
-
- <row>
- <entry>+0x05</entry>
- <entry>write/read</entry>
- <entrytbl cols="2">
- <colspec colnum="1" colname="col1">
- <colspec colnum="2" colname="col2">
- <spanspec namest="col1" nameend="col2" spanname="1to2">
-
- <tbody>
- <row>
- <entry spanname="1to2">Line Status Register
- (LSR)</entry>
- </row>
-
- <row>
- <entry>Bit 7</entry>
- <entry>Error in Receiver FIFO. On the 8250/16450
- UART, this bit is zero. This bit is set to "1" when
- any of the bytes in the FIFO have one or more of the
- following error conditions: PE, FE, or BI.</entry>
- </row>
-
- <row>
- <entry>Bit 6</entry>
- <entry>Transmitter Empty (TEMT). When set to "1",
- there are no words remaining in the transmit FIFO
- or the transmit shift register. The transmitter is
- completely idle.</entry>
- </row>
-
- <row>
- <entry>Bit 5</entry>
- <entry>Transmitter Holding Register Empty (THRE).
- When set to "1", the FIFO (or holding register) now
- has room for at least one additional word to
- transmit. The transmitter may still be transmitting
- when this bit is set to "1".</entry>
- </row>
-
- <row>
- <entry>Bit 4</entry>
- <entry>Break Interrupt (BI). The receiver has
- detected a Break signal.</entry>
- </row>
-
- <row>
- <entry>Bit 3</entry>
- <entry>Framing Error (FE). A Start Bit was detected
- but the Stop Bit did not appear at the expected
- time. The received word is probably
- garbled.</entry>
- </row>
-
- <row>
- <entry>Bit 2</entry>
- <entry>Parity Error (PE). The parity bit was
- incorrect for the word received.</entry>
- </row>
-
- <row>
- <entry>Bit 1</entry>
- <entry>Overrun Error (OE). A new word was received
- and there was no room in the receive buffer. The
- newly-arrived word in the shift register is
- discarded. On 8250/16450 UARTs, the word in the
- holding register is discarded and the newly- arrived
- word is put in the holding register.</entry>
- </row>
-
- <row>
- <entry>Bit 0</entry>
- <entry>Data Ready (DR) One or more words are in the
- receive FIFO that the host may read. A word must be
- completely received and moved from the shift
- register into the FIFO (or holding register for
- 8250/16450 designs) before this bit is set.</entry>
- </row>
- </tbody>
- </entrytbl>
- </row>
-
- <row>
- <entry>+0x06</entry>
- <entry>write/read</entry>
- <entrytbl cols="2">
- <colspec colnum="1" colname="col1">
- <colspec colnum="2" colname="col2">
- <spanspec namest="col1" nameend="col2" spanname="1to2">
-
- <tbody>
- <row>
- <entry spanname="1to2">Modem Status Register
- (MSR)</entry>
- </row>
-
- <row>
- <entry>Bit 7</entry>
- <entry>Data Carrier Detect (DCD). Reflects the state
- of the DCD line on the UART.</entry>
- </row>
-
- <row>
- <entry>Bit 6</entry>
- <entry>Ring Indicator (RI). Reflects the state of the
- RI line on the UART.</entry>
- </row>
-
- <row>
- <entry>Bit 5</entry>
- <entry>Data Set Ready (DSR). Reflects the state of
- the DSR line on the UART.</entry>
- </row>
-
- <row>
- <entry>Bit 4</entry>
- <entry>Clear To Send (CTS). Reflects the state of the
- CTS line on the UART.</entry>
- </row>
-
- <row>
- <entry>Bit 3</entry>
- <entry>Delta Data Carrier Detect (DDCD). Set to "1"
- if the -DCD line has changed state one more
- time since the last time the MSR was read by the
- host.</entry>
- </row>
-
- <row>
- <entry>Bit 2</entry>
- <entry>Trailing Edge Ring Indicator (TERI). Set to
- "1" if the -RI line has had a low to high transition
- since the last time the MSR was read by the
- host.</entry>
- </row>
-
- <row>
- <entry>Bit 1</entry>
- <entry>Delta Data Set Ready (DDSR). Set to "1" if the
- -DSR line has changed state one more time
- since the last time the MSR was read by the
- host.</entry>
- </row>
-
- <row>
- <entry>Bit 0</entry>
- <entry>Delta Clear To Send (DCTS). Set to "1" if the
- -CTS line has changed state one more time
- since the last time the MSR was read by the
- host.</entry>
- </row>
- </tbody>
- </entrytbl>
- </row>
-
- <row>
- <entry>+0x07</entry>
- <entry>write/read</entry>
- <entry>Scratch Register (SCR). This register performs no
- function in the UART. Any value can be written by the
- host to this location and read by the host later
- on.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </sect2>
-
- <sect2>
- <title>Beyond the 16550A UART</title>
-
- <para>Although National Semiconductor has not offered any
- components compatible with the 16550 that provide additional
- features, various other vendors have. Some of these
- components are described below. It should be understood
- that to effectively utilize these improvements, drivers may
- have to be provided by the chip vendor since most of the
- popular operating systems do not support features beyond
- those provided by the 16550.</para>
-
- <variablelist>
- <varlistentry>
- <term>ST16650</term>
-
- <listitem>
- <para>By default this part is similar to the NS16550A, but an
- extended 32-byte send and receive buffer can be optionally
- enabled. Made by StarTech.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>TIL16660</term>
-
- <listitem>
- <para>By default this part behaves similar to the NS16550A,
- but an extended 64-byte send and receive buffer can be
- optionally enabled. Made by Texas Instruments.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Hayes ESP</term>
-
- <listitem>
- <para>This proprietary plug-in card contains a 2048-byte send
- and receive buffer, and supports data rates to
- 230.4Kbit/sec. Made by Hayes.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>In addition to these <quote>dumb</quote> UARTs, many vendors
- produce intelligent serial communication boards. This type of
- design usually provides a microprocessor that interfaces with
- several UARTs, processes and buffers the data, and then alerts the
- main PC processor when necessary. Because the UARTs are not
- directly accessed by the PC processor in this type of
- communication system, it is not necessary for the vendor to use
- UARTs that are compatible with the 8250, 16450, or the 16550 UART.
- This leaves the designer free to components that may have better
- performance characteristics.</para>
- </sect2>
- </sect1>
-
- <sect1 id="sio">
- <title>Configuring the <devicename>sio</devicename> driver</title>
-
- <para>The <devicename>sio</devicename> driver provides support
- for NS8250-, NS16450-, NS16550 and NS16550A-based EIA RS-232C
- (CCITT V.24) communications interfaces. Several multiport
- cards are supported as well. See the &man.sio.4; manual page
- for detailed technical documentation.</para>
-
- <sect2>
- <title>Digi International (DigiBoard) PC/8</title>
-
- <para><emphasis>Contributed by &a.awebster;. 26 August
- 1995.</emphasis></para>
-
- <para>Here is a config snippet from a machine with a Digi
- International PC/8 with 16550. It has 8 modems connected to
- these 8 lines, and they work just great. Do not forget to
- add <literal>options COM_MULTIPORT</literal> or it will not
- work very well!</para>
-
- <programlisting>device sio4 at isa? port 0x100 tty flags 0xb05
-device sio5 at isa? port 0x108 tty flags 0xb05
-device sio6 at isa? port 0x110 tty flags 0xb05
-device sio7 at isa? port 0x118 tty flags 0xb05
-device sio8 at isa? port 0x120 tty flags 0xb05
-device sio9 at isa? port 0x128 tty flags 0xb05
-device sio10 at isa? port 0x130 tty flags 0xb05
-device sio11 at isa? port 0x138 tty flags 0xb05 irq 9 vector siointr</programlisting>
-
- <para>The trick in setting this up is that the MSB of the
- flags represent the last SIO port, in this case 11 so flags
- are 0xb05.</para>
- </sect2>
-
- <sect2>
- <title>Boca 16</title>
-
- <para><emphasis>Contributed by &a.whiteside;. 26 August
- 1995.</emphasis></para>
-
- <para>The procedures to make a Boca 16 port board with FreeBSD
- are pretty straightforward, but you will need a couple
- things to make it work:</para>
-
- <orderedlist>
- <listitem>
- <para>You either need the kernel sources installed so you
- can recompile the necessary options or you will need
- someone else to compile it for you. The 2.0.5 default
- kernel does <emphasis>not</emphasis> come with
- multiport support enabled and you will need to add a
- device entry for each port anyways.</para>
- </listitem>
-
- <listitem>
- <para>Two, you will need to know the interrupt and IO
- setting for your Boca Board so you can set these options
- properly in the kernel.</para>
- </listitem>
- </orderedlist>
-
- <para>One important note &mdash; the actual UART chips for the
- Boca 16 are in the connector box, not on the internal board
- itself. So if you have it unplugged, probes of those ports
- will fail. I have never tested booting with the box
- unplugged and plugging it back in, and I suggest you do not
- either.</para>
-
- <para>If you do not already have a custom kernel
- configuration file set up, refer to <ulink
- url="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig.html">Kernel
- Configuration</ulink> chapter of the FreeBSD Handbook for
- general procedures. The following are the specifics for the
- Boca 16 board and assume you are using the kernel name
- MYKERNEL and editing with vi.</para>
-
- <procedure>
- <step>
- <para>Add the line
-
- <programlisting>options COM_MULTIPORT</programlisting>
-
- to the config file.</para>
- </step>
-
- <step>
- <para>Where the current <literal>device
- sio<replaceable>n</replaceable></literal> lines are, you
- will need to add 16 more devices. Only the last device
- includes the interrupt vector for the board. (See the
- &man.sio.4; manual page for detail as to why.) The
- following example is for a Boca Board with an interrupt
- of 3, and a base IO address 100h. The IO address for
- Each port is +8 hexadecimal from the previous port, thus
- the 100h, 108h, 110h... addresses.</para>
-
- <programlisting>device sio1 at isa? port 0x100 tty flags 0x1005
-device sio2 at isa? port 0x108 tty flags 0x1005
-device sio3 at isa? port 0x110 tty flags 0x1005
-device sio4 at isa? port 0x118 tty flags 0x1005
-&hellip;
-device sio15 at isa? port 0x170 tty flags 0x1005
-device sio16 at isa? port 0x178 tty flags 0x1005 irq 3 vector siointr</programlisting>
-
- <para>The flags entry <emphasis>must</emphasis> be changed
- from this example unless you are using the exact same
- sio assignments. Flags are set according to
- 0x<replaceable>M</replaceable><replaceable>YY</replaceable>
- where <replaceable>M</replaceable> indicates the minor
- number of the master port (the last port on a Boca 16)
- and <replaceable>YY</replaceable> indicates if FIFO is
- enabled or disabled(enabled), IRQ sharing is used(yes)
- and if there is an AST/4 compatible IRQ control
- register(no). In this example, <programlisting> flags
- 0x1005</programlisting> indicates that the master port
- is sio16. If I added another board and assigned sio17
- through sio28, the flags for all 16 ports on
- <emphasis>that</emphasis> board would be 0x1C05, where
- 1C indicates the minor number of the master port. Do
- not change the 05 setting.</para>
- </step>
-
- <step>
- <para>Save and complete the kernel configuration,
- recompile, install and reboot. Presuming you have
- successfully installed the recompiled kernel and have it
- set to the correct address and IRQ, your boot message
- should indicate the successful probe of the Boca ports
- as follows: (obviously the sio numbers, IO and IRQ could
- be different)</para>
-
- <screen>sio1 at 0x100-0x107 flags 0x1005 on isa
-sio1: type 16550A (multiport)
-sio2 at 0x108-0x10f flags 0x1005 on isa
-sio2: type 16550A (multiport)
-sio3 at 0x110-0x117 flags 0x1005 on isa
-sio3: type 16550A (multiport)
-sio4 at 0x118-0x11f flags 0x1005 on isa
-sio4: type 16550A (multiport)
-sio5 at 0x120-0x127 flags 0x1005 on isa
-sio5: type 16550A (multiport)
-sio6 at 0x128-0x12f flags 0x1005 on isa
-sio6: type 16550A (multiport)
-sio7 at 0x130-0x137 flags 0x1005 on isa
-sio7: type 16550A (multiport)
-sio8 at 0x138-0x13f flags 0x1005 on isa
-sio8: type 16550A (multiport)
-sio9 at 0x140-0x147 flags 0x1005 on isa
-sio9: type 16550A (multiport)
-sio10 at 0x148-0x14f flags 0x1005 on isa
-sio10: type 16550A (multiport)
-sio11 at 0x150-0x157 flags 0x1005 on isa
-sio11: type 16550A (multiport)
-sio12 at 0x158-0x15f flags 0x1005 on isa
-sio12: type 16550A (multiport)
-sio13 at 0x160-0x167 flags 0x1005 on isa
-sio13: type 16550A (multiport)
-sio14 at 0x168-0x16f flags 0x1005 on isa
-sio14: type 16550A (multiport)
-sio15 at 0x170-0x177 flags 0x1005 on isa
-sio15: type 16550A (multiport)
-sio16 at 0x178-0x17f irq 3 flags 0x1005 on isa
-sio16: type 16550A (multiport master)</screen>
-
- <para>If the messages go by too fast to see,
-
- <screen>&prompt.root; <userinput>dmesg | more</userinput></screen>
- will show you the boot messages.</para>
- </step>
-
- <step>
- <para>Next, appropriate entries in
- <filename>/dev</filename> for the devices must be made
- using the <filename>/dev/MAKEDEV</filename>
- script. After becoming root:</para>
-
- <screen>&prompt.root; <userinput>cd /dev</userinput>
-&prompt.root; <userinput>./MAKEDEV tty1</userinput>
-&prompt.root; <userinput>./MAKEDEV cua1</userinput>
-<emphasis>(everything in between)</emphasis>
-&prompt.root; <userinput>./MAKEDEV ttyg</userinput>
-&prompt.root; <userinput>./MAKEDEV cuag</userinput></screen>
-
- <para>If you do not want or need call-out devices for some
- reason, you can dispense with making the
- <filename>cua*</filename> devices.</para>
- </step>
-
- <step>
- <para>If you want a quick and sloppy way to make sure the
- devices are working, you can simply plug a modem into
- each port and (as root)
-
- <screen>&prompt.root; <userinput>echo at &gt; ttyd*</userinput></screen>
- for each device you have made. You
- <emphasis>should</emphasis> see the RX lights flash for each
- working port.</para>
- </step>
- </procedure>
- </sect2>
-
- <sect2>
- <title>Support for Cheap Multi-UART Cards</title>
-
- <para><emphasis>Contributed by Helge Oldach
- <email>hmo@sep.hamburg.com</email>, September
- 1999</emphasis></para>
-
- <para>Ever wondered about FreeBSD support for your 20$
- multi-I/O card with two (or more) COM ports, sharing IRQs?
- Here's how:</para>
-
- <para>Usually the only option to support these kind of boards
- is to use a distinct IRQ for each port. For example, if
- your CPU board has an on-board <devicename>COM1</devicename>
- port (aka <devicename>sio0</devicename>&ndash;I/O address
- 0x3F8 and IRQ 4) and you have an extension board with two
- UARTs, you will commonly need to configure them as
- <devicename>COM2</devicename> (aka
- <devicename>sio1</devicename>&ndash;I/O address 0x2F8 and
- IRQ 3), and the third port (aka
- <devicename>sio2</devicename>) as I/O 0x3E8 and IRQ 5.
- Obviously this is a waste of IRQ resources, as it should be
- basically possible to run both extension board ports using a
- single IRQ with the <literal>COM_MULTIPORT</literal>
- configuration described in the previous sections.</para>
-
- <para>Such cheap I/O boards commonly have a 4 by 3 jumper
- matrix for the COM ports, similar to the following:</para>
-
-<programlisting> o o o *
-Port A |
- o * o *
-Port B |
- o * o o
-IRQ 2 3 4 5</programlisting>
-
- <para>Shown here is port A wired for IRQ 5 and port B wired
- for IRQ 3. The IRQ columns on your specific board may
- vary&mdash;other boards may supply jumpers for IRQs 3, 4, 5,
- and 7 instead.</para>
-
- <para>One could conclude that wiring both ports for IRQ 3
- using a handcrafted wire-made jumper covering all three
- connection points in the IRQ 3 column would solve the issue,
- but no. You cannot duplicate IRQ 3 because the output
- drivers of each UART are wired in a <quote>totem
- pole</quote> fashion, so if one of the UARTs drives IRQ 3,
- the output signal will not be what you would expect.
- Depending on the implementation of the extension board or
- your motherboard, the IRQ 3 line will continuously stay up,
- or always stay low.</para>
-
- <para>You need to decouple the IRQ drivers for the two UARTs,
- so that the IRQ line of the board only goes up if (and only
- if) one of the UARTs asserts a IRQ, and stays low otherwise.
- The solution was proposed by Joerg Wunsch
- <email>j@ida.interface-business.de</email>: To solder up a
- wired-or consisting of two diodes (Germanium or
- Schottky-types strongly preferred) and a 1 kOhm resistor.
- Here is the schematic, starting from the 4 by 3 jumper field
- above:</para>
-
-<programlisting> Diode
- +---------->|-------+
- / |
- o * o o | 1 kOhm
-Port A +----|######|-------+
- o * o o | |
-Port B `-------------------+ ==+==
- o * o o | Ground
- \ |
- +--------->|-------+
-IRQ 2 3 4 5 Diode</programlisting>
-
- <para>The cathodes of the diodes are connected to a common
- point, together with a 1 kOhm pull-down resistor. It is
- essential to connect the resistor to ground to avoid
- floating of the IRQ line on the bus.</para>
-
- <para>Now we are ready to configure a kernel. Staying with
- this example, we would configure:</para>
-
- <programlisting># standard on-board COM1 port
-device sio0 at isa? port "IO_COM1" tty flags 0x10
-# patched-up multi-I/O extension board
-options COM_MULTIPORT
-device sio1 at isa? port "IO_COM2" tty flags 0x205
-device sio2 at isa? port "IO_COM3" tty flags 0x205 irq 3</programlisting>
-
- <para>Note that the <literal>flags</literal> setting for
- <devicename>sio1</devicename> and
- <devicename>sio2</devicename> is truly essential; refer to
- &man.sio.4; for details. (Generally, the
- <literal>2</literal> in the "flags" attribute refers to
- <devicename>sio</devicename>2 which holds the IRQ, and you
- surely want a <literal>5</literal> low nibble.) With kernel
- verbose mode turned on this should yield something similar
- to this:</para>
-
- <screen>sio0: irq maps: 0x1 0x11 0x1 0x1
-sio0 at 0x3f8-0x3ff irq 4 flags 0x10 on isa
-sio0: type 16550A
-sio1: irq maps: 0x1 0x9 0x1 0x1
-sio1 at 0x2f8-0x2ff flags 0x205 on isa
-sio1: type 16550A (multiport)
-sio2: irq maps: 0x1 0x9 0x1 0x1
-sio2 at 0x3e8-0x3ef irq 3 flags 0x205 on isa
-sio2: type 16550A (multiport master)</screen>
-
- <para>Though <filename>/sys/i386/isa/sio.c</filename> is
- somewhat cryptic with its use of the <quote>irq maps</quote>
- array above, the basic idea is that you observe
- <literal>0x1</literal> in the first, third, and fourth
- place. This means that the corresponding IRQ was set upon
- output and cleared after, which is just what we would
- expect. If your kernel does not display this behavior, most
- likely there is something wrong with your wiring.</para>
- </sect2>
- </sect1>
-
- <sect1 id="cy">
- <title>Configuring the <devicename>cy</devicename> driver</title>
-
- <para><emphasis>Contributed by Alex Nash. 6 June
- 1996.</emphasis></para>
-
- <para>The Cyclades multiport cards are based on the
- <devicename>cy</devicename> driver instead of the usual
- <devicename>sio</devicename> driver used by other multiport
- cards. Configuration is a simple matter of:</para>
-
- <procedure>
- <step>
- <para>Add the <devicename>cy</devicename> device to your
- kernel configuration (note that your irq and iomem
- settings may differ).</para>
-
- <programlisting>device cy0 at isa? tty irq 10 iomem 0xd4000 iosiz 0x2000 vector cyintr</programlisting>
- </step>
-
- <step>
- <para>Rebuild and install the new kernel.</para>
- </step>
-
- <step>
- <para>Make the device nodes by typing (the following
- example assumes an 8-port board):</para>
-
- <screen>&prompt.root; <userinput>cd /dev</userinput>
-&prompt.root; <userinput>for i in 0 1 2 3 4 5 6 7;do ./MAKEDEV cuac$i ttyc$i;done</userinput></screen>
- </step>
-
- <step>
- <para>If appropriate, add dialup entries to
- <filename>/etc/ttys</filename> by duplicating serial
- device (<literal>ttyd</literal>) entries and using
- <literal>ttyc</literal> in place of
- <literal>ttyd</literal>. For example:</para>
-
- <programlisting>ttyc0 "/usr/libexec/getty std.38400" unknown on insecure
-ttyc1 "/usr/libexec/getty std.38400" unknown on insecure
-ttyc2 "/usr/libexec/getty std.38400" unknown on insecure
-&hellip;
-ttyc7 "/usr/libexec/getty std.38400" unknown on insecure</programlisting>
- </step>
-
- <step>
- <para>Reboot with the new kernel.</para>
- </step>
- </procedure>
- </sect1>
-
- <sect1>
- <title>Configuring the <devicename>si</devicename> driver</title>
-
- <para><emphasis>Contributed by &a.nsayer;. 25 March
- 1998.</emphasis></para>
-
- <para>The Specialix SI/XIO and SX multiport cards use the
- <devicename>si</devicename> driver. A single machine can have
- up to 4 host cards. The following host cards are
- supported:</para>
-
- <itemizedlist>
- <listitem><para>ISA SI/XIO host card (2 versions)</para></listitem>
- <listitem><para>EISA SI/XIO host card</para></listitem>
- <listitem><para>PCI SI/XIO host card</para></listitem>
- <listitem><para>ISA SX host card</para></listitem>
- <listitem><para>PCI SX host card</para></listitem>
- </itemizedlist>
-
- <para>Although the SX and SI/XIO host cards look markedly
- different, their functionality are basically the same. The
- host cards do not use I/O locations, but instead require a 32K
- chunk of memory. The factory configuration for ISA cards
- places this at <literal>0xd0000-0xd7fff</literal>. They also
- require an IRQ. PCI cards will, of course, auto-configure
- themselves.</para>
-
- <para>You can attach up to 4 external modules to each host
- card. The external modules contain either 4 or 8 serial
- ports. They come in the following varieties:</para>
-
- <itemizedlist>
- <listitem><para>SI 4 or 8 port modules. Up to 57600 bps on each port
- supported.</para></listitem>
-
- <listitem><para>XIO 8 port modules. Up to 115200 bps on each port
- supported. One type of XIO module has 7 serial and 1 parallel
- port.</para></listitem>
-
- <listitem><para>SXDC 8 port modules. Up to 921600 bps on each port
- supported. Like XIO, a module is available with one parallel
- port as well.</para></listitem>
- </itemizedlist>
-
- <para>To configure an ISA host card, add the following line to
- your kernel configuration file, changing the numbers as
- appropriate:</para>
-
- <programlisting>device si0 at isa? tty iomem 0xd0000 irq 11</programlisting>
-
- <para>Valid IRQ numbers are 9, 10, 11, 12 and 15 for SX ISA host
- cards and 11, 12 and 15 for SI/XIO ISA host cards.</para>
-
- <para>To configure an EISA or PCI host card, use this line:</para>
-
- <programlisting>device si0</programlisting>
-
- <para>After adding the configuration entry, rebuild and
- install your new kernel.</para>
-
- <para>After rebooting with the new kernel, you need to make the
- device nodes in /dev. The <filename>MAKEDEV</filename> script
- will take care of this for you. Count how many total ports
- you have and type:</para>
-
- <screen>&prompt.root; <userinput>cd /dev</userinput>
-&prompt.root; <userinput>./MAKEDEV ttyA<replaceable>nn</replaceable> cuaA<replaceable>nn</replaceable></userinput></screen>
-
- <para>(where <replaceable>nn</replaceable> is the number of
- ports)</para>
-
- <para>If you want login prompts to appear on these ports, you
- will need to add lines like this to
- <filename>/etc/ttys</filename>:</para>
-
- <programlisting>ttyA01 "/usr/libexec/getty std.9600" vt100 on insecure</programlisting>
-
- <para>Change the terminal type as appropriate. For modems,
- <userinput>dialup</userinput> or
- <userinput>unknown</userinput> is fine.</para>
-
- </sect1>
-
-</article>
diff --git a/en_US.ISO8859-1/articles/solid-state/Makefile b/en_US.ISO8859-1/articles/solid-state/Makefile
deleted file mode 100644
index 9c83b48577..0000000000
--- a/en_US.ISO8859-1/articles/solid-state/Makefile
+++ /dev/null
@@ -1,24 +0,0 @@
-#
-# $FreeBSD: doc/en_US.ISO8859-1/articles/committers-guide/Makefile,v 1.4 2001/04/08 17:26:59 nik Exp $
-#
-#
-
-DOC?= article
-
-FORMATS?= html
-
-INSTALL_COMPRESSED?= gz
-INSTALL_ONLY_COMPRESSED?=
-
-JADEFLAGS+= -V %generate-article-toc%
-
-#
-# SRCS lists the individual SGML files that make up the document. Changes
-# to any of these files will force a rebuild
-#
-
-# SGML content
-SRCS= article.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/solid-state/article.sgml b/en_US.ISO8859-1/articles/solid-state/article.sgml
deleted file mode 100644
index 00d5ee11d1..0000000000
--- a/en_US.ISO8859-1/articles/solid-state/article.sgml
+++ /dev/null
@@ -1,630 +0,0 @@
-<!-- Copyright (c) 2001 The FreeBSD Documentation Project
-
- Redistribution and use in source (SGML DocBook) and 'compiled' forms
- (SGML, HTML, PDF, PostScript, RTF and so forth) with or without
- modification, are permitted provided that the following conditions
- are met:
-
- 1. Redistributions of source code (SGML DocBook) must retain the above
- copyright notice, this list of conditions and the following
- disclaimer as the first lines of this file unmodified.
-
- 2. Redistributions in compiled form (transformed to other DTDs,
- converted to PDF, PostScript, RTF and other formats) must reproduce
- the above copyright notice, this list of conditions and the
- following disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS DOCUMENTATION IS PROVIDED BY THE FREEBSD DOCUMENTATION PROJECT "AS
- IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NIK CLAYTON BE LIABLE FOR ANY
- DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
- $FreeBSD: doc/en_US.ISO8859-1/articles/solid-state/article.sgml,v 1.4 2001/07/11 11:08:47 nik Exp $
--->
-
-<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man;
-<!ENTITY legalnotice SYSTEM "../../share/sgml/legalnotice.sgml">
-]>
-
-<article>
- <articleinfo>
- <title>FreeBSD and Solid State Devices</title>
-
- <authorgroup>
- <author>
- <firstname>John</firstname>
- <surname>Kozubik</surname>
-
- <affiliation>
- <address><email>john@kozubik.com</email></address>
- </affiliation>
- </author>
- </authorgroup>
-
- <pubdate>$FreeBSD: doc/en_US.ISO8859-1/articles/solid-state/article.sgml,v 1.4 2001/07/11 11:08:47 nik Exp $</pubdate>
-
- <copyright>
- <year>2001</year>
- <holder>The FreeBSD Documentation Project</holder>
- </copyright>
-
- &legalnotice;
-
- <abstract>
- <para>This article covers the use of solid state disk devices in FreeBSD
- to create embedded systems.</para>
-
- <para>Embedded systems have the advantage of increased stability due to
- the lack of integral moving parts (hard drives). Account must be
- taken, however, for the generally low disk space available in the
- system and the durability of the storage medium.</para>
-
- <para>Specific topics to be covered include the types and attributes of
- solid state media suitable for disk use in FreeBSD, kernel options
- that are of interest in such an environment, the
- <filename>rc.diskless</filename> mechanisms that automate the
- initialization of such systems and the need for read-only filesystems,
- and building file systems from scratch. The article will conclude
- with some general strategies for small and read-only FreeBSD
- environments.</para>
- </abstract>
- </articleinfo>
-
- <sect1 id="intro">
- <title>Solid State Disk Devices</title>
-
- <para>The scope of this article will be limited to solid state disk
- devices made from flash memory. Flash memory is a solid state memory
- (no moving parts) that is non-volatile (the memory maintains data even
- after all power sources have been disconnected). Flash memory can
- withstand tremendous physical shock and is reasonably fast (the flash
- memory solutions covered in this article are slightly slower than a EIDE
- hard disk for write operations, and much faster for read operations).
- One very important aspect of flash memory, the ramifications of which
- will be discussed later in this article, is that each sector has a
- limited rewrite capacity. You can only write, erase, and write again to
- a sector of flash memory a certain number of times before the sector
- becomes permanently unusable. Although many flash memory products
- automatically map bad blocks, and although some even distribute write
- operations evenly throughout the unit, the fact remains that there
- exists a limit to the amount of writing that can be done to the device.
- Competitive units have between 1,000,000 and 10,000,000 writes per
- sector in their specification. This figure varies due to the
- temperature of the environment.</para>
-
- <para>Specifically, we will be discussing ATA compatible compact-flash
- units and the M-Systems Disk-On-Chip flash memory unit. ATA compatible
- compact-flash cards are quite popular as storage media for digital
- cameras. Of particular interest is the fact that they pin out directly
- to the IDE bus and are compatible with the ATA command set. Therefore,
- with a very simple and low-cost adaptor, these devices can be attached
- directly to an IDE bus in a computer. Once implemented in this manner,
- operating systems such as FreeBSD see the device as a normal hard disk
- (albeit small). The M-Systems Disk-On-Chip product is based on the same
- underlying flash memory technology as ATA compatible compact-flash
- cards, but resides in a DIP form factor and is not ATA compatible. To
- use such a device, not only must you install it on a motherboard that
- has a Disk-On-Chip socket, you must also build the `fla` driver into any
- FreeBSD kernel you wish to use it with. Further, there is critical,
- manufacturer-specific data residing in the boot sector of this device,
- so you must take care not to install the FreeBSD (or any other) boot
- loader when using this.</para>
-
- <para>Other solid state disk solutions do exist, but their expense,
- obscurity, and relative unease of use places them beyond the scope of
- this article.</para>
- </sect1>
-
- <sect1 id="kernel">
- <title>Kernel Options</title>
-
- <para>A few kernel options are of specific interest to those creating
- an embedded FreeBSD system.</para>
-
- <para>First, all embedded FreeBSD systems that use flash memory as system
- disk will be interested in memory disks and memory filesystems. Because
- of the limited number of writes that can be done to flash memory, the
- disk and the filesystems no the disk will most likely be mounted
- read-only. In this environment, filesystems such as
- <filename>/tmp</filename> and <filename>/var</filename> are mounted as
- memory filesystems to allow the system to create logs and update
- counters and temporary files. Memory filesystems are a critical
- component to a successful solid state FreeBSD implementation.</para>
-
- <para>You should make sure the following lines exist in your kernel
- configuration file:</para>
-
- <programlisting>options MFS # Memory Filesystem
-options MD_ROOT # md device usable as a potential root device
-pseudo-device md # memory disk</programlisting>
-
- <para>Second, if you will be using the M-Systems Disk-On-Chip product, you
- must also include this line:</para>
-
- <programlisting>device fla0 at isa?</programlisting>
- </sect1>
-
- <sect1 id="ro-fs">
- <title><filename>rc.diskless</filename> and Read-Only Filesystems</title>
-
- <para>The post-boot initialization of an embedded FreeBSD system is
- controlled by <filename>/etc/rc.diskless2</filename>
- (<filename>/etc/rc.diskless1</filename> is for BOOTP diskless boot).
- This initialization script is invoked by placing a line in
- <filename>/etc/rc.conf</filename> as follows:</para>
-
- <programlisting>diskless_mount=/etc/rc.diskless2</programlisting>
-
- <para><filename>rc.diskless2</filename> mounts <filename>/var</filename>
- as a memory filesystem, makes a configurable list of directories in
- <filename>/var</filename> with the &man.mkdir.1; command, changes modes
- on some of those directories, and extracts a list of device entries to
- copy to a writable (again, a memory filesystem)
- <filename>/dev</filename> partition. In the execution of
- <filename>/etc/rc.diskless2</filename>, one other
- <filename>rc.conf</filename> variable comes into play -
- <literal>varsize</literal>. The <filename>/etc/rc.diskless2</filename>
- file creates a <filename>/var</filename> partition based on the value of
- this variable in <filename>rc.conf</filename>:</para>
-
- <programlisting>varsize=8192</programlisting>
-
- <para>Remember that this value is in sectors. The creation of the
- <filename>/dev</filename> partition by
- <filename>/etc/rc.diskless2</filename>, however, is governed by a
- hard-coded value of 4096 sectors. It is trivial to change this entry in
- the <filename>/etc/rc.diskless2</filename> file itself, although you
- shouldn't need more space than that for
- <filename>/dev</filename>.</para>
-
- <para>It is important to remember that the
- <filename>/etc/rc.diskless2</filename> script assumes that you have
- already removed your conventional <filename>/tmp</filename> partition
- and replaced it with a symbolic link to <filename>/var/tmp</filename>.
- Because <filename>tmp</filename> is one of the directories created in
- <filename>/var</filename> by the <filename>/etc/rc.diskless2</filename>
- script, and because <filename>/var</filename> is a memory file system
- (which is mounted read-write), <filename>/tmp</filename> will now be a
- directory that is read-write as well.</para>
-
- <para>The fact that <filename>/var</filename> and
- <filename>/dev</filename> are read-write filesystems is an important
- distinction, as the <filename>/</filename> partition (and any other
- partitions you may have on your flash media) should be mounted
- read-only. Remember that in <xref linkend="intro"> we detailed the
- limitations of flash memory - specifically the limited write capability.
- The importance of not mounting filesystems on flash media read-write,
- and the importance of not using a swap file cannot be overstated. A
- swap file on a busy system can burn through a piece of flash media in
- less than one year. Heavy logging or temporary file creation and
- destruction can do the same. Therefore, in addition to removing the
- <literal>swap</literal> and <literal>/proc</literal> entries from your
- <filename>/etc/fstab</filename> file, you should also change the Options
- field for each filesystem to <literal>ro</literal> as follows:</para>
-
- <programlisting># Device Mountpoint FStype Options Dump Pass#
-/dev/ad0s1a / ufs ro 1 1</programlisting>
-
- <para>A few applications in the average system will immediately begin to
- fail as a result of this change. For instance, ports will not install
- from the ports tree because the
- <filename>/var/db/port.mkversion</filename> file does not exist. cron
- will not run properly as a result of missing cron tabs in the
- <filename>/var</filename> created by
- <filename>/etc/rc.diskless2</filename>, and syslog and dhcp will
- encounter problems as well as a result of the read-only filesystem and
- missing items in the <filename>/var</filename> that
- <filename>/etc/rc.diskless2</filename> has created. These are only
- temporary problems though, and are addressed, along with solutions to
- the execution of other common software packages in
- <xref linkend="strategies">.</para>
-
- <para>An important thing to remember is that a filesystem that was mounted
- read-only with <filename>/etc/fstab</filename> can be made read-write at
- any time by issuing the command:</para>
-
- <screen>&prompt.root; <userinput>/sbin/mount -uw <replaceable>partition</replaceable></userinput></screen>
-
- <para>and can be toggled back to read-only with the command:</para>
-
- <screen>&prompt.root; <userinput>/sbin/mount -ur <replaceable>partition</replaceable></userinput></screen>
- </sect1>
-
- <sect1>
- <title>Building a File System From Scratch</title>
-
- <para>Because ATA compatible compact-flash cards are seen by FreeBSD as
- normal IDE hard drives, as is a M-Systems Disk-On-Chip product (when you
- are running a kernel with the fla driver built in) you could
- theoretically install FreeBSD from the network using the kern and
- mfsroot floppies or from a CD. Other than the fact that you should not
- write a boot-loader of any kind to the M-Systems device, no special
- instructions are needed.</para>
-
- <para>However, even a small installation of FreeBSD using normal
- installation procedures can produce a system in size of greater than 200
- megabytes. Because most people will be using smaller flash memory
- devices (128 megabytes is considered fairly large - 32 or even 16
- megabytes is common) an installation using normal mechanisms is not
- possible&mdash;there is simply not enough disk space for even the
- smallest of conventional installations.</para>
-
- <para>The easiest way to overcome this space limitation is to install
- FreeBSD using conventional means to a normal hard disk. After the
- installation is complete, pare down the operating system to a size that
- will fit onto your flash media, then tar the entire filesystem. The
- following steps will guide you through the process of preparing a piece
- of flash memory for your tarred filesystem. Remember, because a normal
- installation is not being performed, operations such as partitioning,
- labeling, file-system creation, etc. need to be performed by hand. In
- addition to the kern and mfsroot floppy disks, you will also need to use
- the fixit floppy. If you are using a M-Systems Disk-On-Chip, the kernel
- on your kern floppy must have the <literal>fla</literal> option detailed
- in <xref linkend="kernel"> compiled into it. Please see
- <xref linkend="kern.flp"> for instructions on creating a new kernel for
- <filename>kern.flp</filename>.</para>
-
- <procedure>
- <step>
- <title>Partitioning your flash media device</title>
-
- <para>After booting with the kern and mfsroot floppies, choose
- <literal>custom</literal> from the installation menu. In the custom
- installation menu, choose <literal>partition</literal>. In the
- partition menu, you should delete all existing partitions using the
- <keycap>d</keycap> key. After deleting all existing partitions,
- create a partition using the <keycap>c</keycap> key and accept the
- default value for the size of the partition. When asked for the
- type of the partition, make sure the value is set to
- <literal>165</literal>. Now write this partition table to the disk
- by pressing the <keycap>w</keycap> key (this is a hidden option on
- this screen). When presented with a menu to choose a boot manager,
- take care to select <literal>None</literal> if you are using an
- M-Systems Disk-On-Chip. If you are using a ATA compatible compact
- flash card, you should choose the FreeBSD Boot Manager. Now press
- the <keycap>q</keycap> key to quit the partition menu. You will be
- shown the boot manager menu once more - repeat the choice you made
- earlier.</para>
- </step>
-
- <step>
- <title>Creating file systems on your flash memory device</title>
-
- <para>Exit the custom installation menu, and from the main
- installation menu choose the <literal>fixit</literal> option. After
- entering the fixit environment, enter the following commands:</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <thead>
- <row>
- <entry align="center">ATA compatible</entry>
-
- <entry align="center">Disk-On-Chip</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry><para><screen>&prompt.root; <userinput>mknod /dev/ad0a c 116 0</userinput>
-&prompt.root; <userinput>mknod /dev/ad0c c 116 2</userinput>
-&prompt.root; <userinput>disklabel -e /dev/ad0c</userinput></screen></para></entry>
-
- <entry><para><screen>&prompt.root; <userinput>mknod /dev/fla0a c 102 0</userinput>
-&prompt.root; <userinput>mknod /dev/fla0c c 102 2</userinput>
-&prompt.root; <userinput>disklabel -e /dev/fla0c</userinput></screen></para></entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <para>At this point you will have entered the vi editor under the
- auspices of the disklabel command. If you are using Disk-On-Chip,
- the first step will be to change the type value near the beginning
- of the file from <literal>ESDI</literal> to
- <literal>DOC2K</literal>. Next, regardless of whether you are using
- Disk-On-Chip or ATA compatible compact flash media, you need to add
- an a: line at the end of the file. This <literal>a:</literal> line
- should look like:</para>
-
- <programlisting>a: <replaceable>123456</replaceable> 0 4.2BSD 0 0</programlisting>
-
- <para>Where <replaceable>123456</replaceable> is a number that is
- exactly the same as the number in the existing <literal>c:</literal>
- entry for size. Basically you are duplicating the existing
- <literal>c:</literal> line as an <literal>a:</literal> line, making
- sure that fstype is <literal>4.2BSD</literal>. Save the file and
- exit.</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <thead>
- <row>
- <entry align="center">ATA compatible</entry>
-
- <entry align="center">Disk-On-Chip</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry><para><screen>&prompt.root; <userinput>disklabel -B -r /dev/ad0c</userinput>
-&prompt.root; <userinput>newfs /dev/ad0a</userinput></screen></para></entry>
-
- <entry><para><screen>&prompt.root; <userinput>disklabel -B -r /dev/fla0c</userinput>
-&prompt.root; <userinput>newfs /dev/fla0a</userinput></screen></para></entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </step>
-
- <step>
- <title>Placing your filesystem on the flash media</title>
-
- <para>Mount the newly prepared flash media:</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <thead>
- <row>
- <entry align="center">ATA compatible</entry>
-
- <entry align="center">Disk-On-Chip</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry><para><screen>&prompt.root; <userinput>mount /dev/ad0a /flash</userinput></screen></para></entry>
-
- <entry><para><screen>&prompt.root; <userinput>mount /dev/fla0a /flash</userinput></screen></para></entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <para>Bring this machine up on the network so we may transfer our tar
- file and explode it onto our flash media filesystem. One example of
- how to do this is:</para>
-
- <screen>&prompt.root; <userinput>ifconfig xl0 192.168.0.10 netmask 255.255.255.0</userinput>
-&prompt.root; <userinput>route add default 192.168.0.1</userinput></screen>
-
- <para>Now that the machine is on the network, transfer your tar file.
- You may be faced with a bit of a dilemma at this point - if your
- flash memory part is 128 megabytes, for instance, and your tar file
- is larger than 64 megabytes, you cannot have your tar file on the
- flash media at the same time as you explode it - you will run out of
- space. One solution to this problem, if you are using FTP, is to
- untar the file while it is transferred over FTP. If you perform
- your transfer in this manner, you will never have the tar file and
- the tar contents on your disk at the same time:</para>
-
- <screen><prompt>ftp></prompt> <userinput>get tarfile.tar "| tar xvf -"</userinput></screen>
-
- <para>If your tarfile is gzipped, you can accomplish this as
- well:</para>
-
- <screen><prompt>ftp></prompt> <userinput>get tarfile.tar "| zcat | tar xvf -"</userinput></screen>
-
- <para>After the contents of your tarred filesystem are on your flash
- memory file system, you can unmount the flash memory and
- reboot:</para>
-
- <screen>&prompt.root; <userinput>cd /</userinput>
-&prompt.root; <userinput>umount /flash</userinput>
-&prompt.root; <userinput>exit</userinput></screen>
-
- <para>Assuming that you configured your filesystem correctly when it
- was built on the normal hard disk (with your filesystems mounted
- read-only, and with the necessary options compiled into the kernel)
- you should now be successfully booting your FreeBSD embedded
- system.</para>
- </step>
- </procedure>
- </sect1>
-
- <sect1 id="kern.flp">
- <title>Building a <filename>kern.flp</filename> Installation Floppy with
- the fla Driver</title>
-
- <note>
- <para>This section of the article is relevant only to those using
- M-Systems Disk-On-Chip flash media.</para>
- </note>
-
- <para>It is possible that your <filename>kern.flp</filename> boot floppy
- does not have a kernel with the <devicename>fla</devicename> driver
- compiled into it necessary for the system to recognize the Disk-On-Chip.
- If you have booted off of the installation floppies and are told that no
- disks are present, then you are probably lacking the
- <devicename>fla</devicename> driver in your kernel.</para>
-
- <para>After you have built a kernel with <devicename>fla</devicename>
- support that is smaller than 1.4 megabytes, you can create a custom
- <filename>kern.flp</filename> floppy image with it by following these
- instructions:</para>
-
- <procedure>
- <step>
- <para>Obtain an existing kern.flp image file</para>
- </step>
-
- <step>
- <para><screen>&prompt.root; <userinput>vnconfig vn0c kern.flp</userinput></screen></para>
- </step>
-
- <step>
- <para><screen>&prompt.root; <userinput>mount /dev/vn0c /mnt</userinput></screen></para>
- </step>
-
- <step>
- <para>Place your kernel file into <filename>/mnt</filename>, replacing
- the existing one</para>
- </step>
-
- <step>
- <para><screen>&prompt.root; <userinput>vnconfig -d vn0c</userinput></screen></para>
- </step>
- </procedure>
-
- <para>Your <filename>kern.flp</filename> file now has your new kernel on it.</para>
- </sect1>
-
- <sect1 id="strategies">
- <title>System Strategies for Small and Read Only Environments</title>
-
- <para>In <xref linkend="ro-fs">, it was pointed out that the
- <filename>/var</filename> filesystem constructed by
- <filename>/etc/rc.diskless2</filename> and the presence of a read-only
- root filesystem causes problems with many common software packages used
- with FreeBSD. In this article, suggestions for successfully running
- cron, syslog, ports installations, and the Apache web server will be
- provided.</para>
-
- <sect2>
- <title>cron</title>
-
- <para>In <filename>/etc/rc.diskless2</filename> there is a variable
- named <literal>var_dirs</literal>. This variable consists of a
- space-delimited list of directories that will be created inside of
- <filename>/var</filename> after it is mounted as a memory filesystem.
- <filename>cron</filename> and <filename>cron/tabs</filename> are not
- in that list, and without those directories, cron will complain. By
- inserting <literal>cron</literal>, <literal>cron/tabs</literal>, and
- perhaps even <literal>at</literal>, and <literal>at/jobs</literal> as
- elements of that variable, you will facilitate the running of the
- &man.cron.8; and &man.at.1; daemons.</para>
-
- <para>However, this still does not solve the problem of maintaining cron
- tabs across reboots. When the system reboots, the
- <filename>/var</filename> filesystem that is in memory will disappear
- and any cron tabs you may have had in it will also disappear.
- Therefore, one solution would be to create cron tabs for the users
- that need them, mount your <filename>/</filename> filesystem as
- read-write and copy those cron tabs to somewhere safe, like
- <filename>/etc/tabs</filename>, then add a line to the end of
- <filename>/etc/rc.diskless2</filename> that copies those crontabs into
- <filename>/var/cron/tabs</filename> after that directory has been
- created during system initialization. You may also need to add a line
- that changes modes and permissions on the directories you create and
- the files you copy with <filename>/etc/rc.diskless2</filename>.</para>
- </sect2>
-
- <sect2>
- <title>syslog</title>
-
- <para><filename>syslog.conf</filename> specifies the locations of
- certain log files that exist in <filename>/var/log</filename>. These
- files are not created by <filename>/etc/rc.diskless2</filename> upon
- system initialization. Therefore, somewhere in
- <filename>/etc/rc.diskless2</filename>, after the section that creates
- the directories in <filename>/var</filename>, you will need to add
- something like this:</para>
-
- <screen>&prompt.root; <userinput>touch /var/log/security /var/log/maillog /var/log/cron /var/log/messages</userinput>
-&prompt.root; <userinput>chmod 0644 /var/log/*</userinput></screen>
-
- <para>You will also need to add the log directory to the list of
- directories that <filename>/etc/rc.diskless2</filename>
- creates.</para>
- </sect2>
-
- <sect2>
- <title>ports installation</title>
-
- <para>Before discussing the changes necessary to successfully use the
- ports tree, a reminder is necessary regarding the read-only nature of
- your filesystems on the flash media. Since they are read-only, you
- will need to temporarily mount them read-write using the mount syntax
- shown in <xref linkend="ro-fs">. You should always remount those
- filesystems read-only when you are done with any maintenance - it is
- dangerous to leave them in read-write mode lest a process begin
- logging or otherwise writing regularly to the flash media and wearing
- it out over time.</para>
-
- <para>To make it possible to enter a ports directory and successfully
- run <command>make install</command>, it is necessary for the file
- <filename>/var/db/port.mkversion</filename> to exist, and that it have
- a correct date in it. Further, we must create a packages directory on
- a non-memory filesystem that will keep track of our packages across
- reboots. Because it is necessary to mount your filesystems as
- read-write for the installation of a package anyway, it is sensible to
- assume that an area on the flash media can also be used for package
- information to be written to.</para>
-
- <para>First, create a package database directory. This is normally in
- <filename>/var/db/pkg</filename>, but we cannot place it there as it
- will disappear every time the system is booted.</para>
-
- <screen>&prompt.root; <userinput>mkdir /etc/pkg</userinput></screen>
-
- <para>Now, add a line to <filename>/etc/rc.diskless2</filename> that
- links the <filename>/etc/pkg</filename> directory to
- <filename>/var/db/pkg</filename>. An example:</para>
-
- <screen>&prompt.root; <userinput>ln -s /etc/pkg /var/db/pkg</userinput></screen>
-
- <para>Add another line in <filename>/etc/rc.diskless2</filename> that
- creates and populates
- <filename>/var/db/port.mkversion</filename></para>
-
- <screen>&prompt.root; <userinput>touch /var/db/port.mkversion</userinput>
-&prompt.root; <userinput>chmod 0644 /var/db/port.mkversion</userinput>
-&prompt.root; <userinput>echo <replaceable>20010412</replaceable> >> /var/db/port.mkversion</userinput></screen>
-
- <para>where <replaceable>20010412</replaceable> is a date that is
- appropriate for your particular release of FreeBSD</para>
-
- <para>Now, any time that you mount your file systems as read-write and
- install a package, the <command>make install</command> will work
- because it finds a suitable
- <filename>/var/db/port.mkversion</filename>, and package information
- will be written successfully to <filename>/etc/pkg</filename> (because
- the filesystem will, at that time, be mounted read-write) which will
- always be available to the operating system as
- <filename>/var/db/pkg</filename>.</para>
- </sect2>
-
- <sect2>
- <title>Apache Web Server</title>
-
- <para>Apache keeps pid files and logs in
- <filename><replaceable>apache_install</replaceable>/logs</filename>.
- Since this directory no doubt exists on a read-only file system, this
- will not work. It is necessary to add a new directory to the
- <filename>/etc/rc.diskless2</filename> list of directories to create
- in <filename>/var</filename>, to link
- <filename><replaceable>apache_install</replaceable>/logs</filename> to
- <filename>/var/log/apache</filename>. It is also necessary to set
- permissions and ownership on this new directory.</para>
-
- <para>First, add the directory <literal>log/apache</literal> to the list
- of directories to be created in
- <filename>/etc/rc.diskless2</filename>.</para>
-
- <para>Second, add these commands to
- <filename>/etc/rc.diskless2</filename> after the directory creation
- section:</para>
-
- <screen>&prompt.root; <userinput>chmod 0774 /var/log/apache</userinput>
-&prompt.root; <userinput>chown nobody:nobody /var/log/apache</userinput></screen>
-
- <para>Finally, remove the existing
- <filename><replaceable>apache_install</replaceable>/logs</filename>
- directory, and replace it with a link:</para>
-
- <screen>&prompt.root; <userinput>rm -rf (apache_install)/logs</userinput>
-&prompt.root; <userinput>ln -s /var/log/apache (apache_install)/logs</userinput></screen>
- </sect2>
- </sect1>
-</article>
-
diff --git a/en_US.ISO8859-1/articles/storage-devices/Makefile b/en_US.ISO8859-1/articles/storage-devices/Makefile
deleted file mode 100644
index 7a18da1228..0000000000
--- a/en_US.ISO8859-1/articles/storage-devices/Makefile
+++ /dev/null
@@ -1,13 +0,0 @@
-
-DOC?= article
-
-FORMATS?= html
-
-INSTALL_COMPRESSED?=gz
-INSTALL_ONLY_COMPRESSED?=
-
-SRCS= article.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/storage-devices/article.sgml b/en_US.ISO8859-1/articles/storage-devices/article.sgml
deleted file mode 100644
index b3778f8ebb..0000000000
--- a/en_US.ISO8859-1/articles/storage-devices/article.sgml
+++ /dev/null
@@ -1,2627 +0,0 @@
-<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man;
-<!ENTITY % authors PUBLIC "-//FreeBSD//ENTITIES DocBook Author Entities//EN">
-%authors;
-]>
-
-<article>
- <articleinfo>
- <title>Storage Devices</title>
-
- <authorgroup>
- <author>
- <firstname>Wilko</firstname>
- <surname>Bulte</surname>
-
- <affiliation>
- <address><email>wilko@FreeBSD.org</email></address>
- </affiliation>
- </author>
- </authorgroup>
-
- <pubdate>$FreeBSD: doc/en_US.ISO8859-1/articles/storage-devices/article.sgml,v 1.1 2001/07/13 22:30:40 murray Exp $</pubdate>
-
- <abstract>
- <para>This article talks about storage devices with FreeBSD.</para>
- </abstract>
- </articleinfo>
-
- <sect1 id="esdi">
- <title>Using ESDI hard disks</title>
-
- <para><emphasis>Copyright &copy; 1995, &a.wilko;. 24 September
- 1995.</emphasis></para>
-
- <para>ESDI is an acronym that means Enhanced Small Device
- Interface. It is loosely based on the good old ST506/412
- interface originally devised by Seagate Technology, the makers
- of the first affordable 5.25" winchester disk.</para>
-
- <para>The acronym says Enhanced, and rightly so. In the first
- place the speed of the interface is higher, 10 or 15
- Mbits/second instead of the 5 Mbits/second of ST412 interfaced
- drives. Secondly some higher level commands are added, making
- the ESDI interface somewhat 'smarter' to the operating system
- driver writers. It is by no means as smart as SCSI by the way.
- ESDI is standardized by ANSI.</para>
-
- <para>Capacities of the drives are boosted by putting more sectors
- on each track. Typical is 35 sectors per track, high capacity
- drives I have seen were up to 54 sectors/track.</para>
-
- <para>Although ESDI has been largely obsoleted by IDE and SCSI
- interfaces, the availability of free or cheap surplus drives
- makes them ideal for low (or now) budget systems.</para>
-
- <sect2>
- <title>Concepts of ESDI</title>
-
- <sect3>
- <title>Physical connections</title>
-
- <para>The ESDI interface uses two cables connected to each drive.
- One cable is a 34 pin flat cable edge connector that carries the
- command and status signals from the controller to the drive and
- vice-versa. The command cable is daisy chained between all the
- drives. So, it forms a bus onto which all drives are
- connected.</para>
-
- <para>The second cable is a 20 pin flat cable edge connector that
- carries the data to and from the drive. This cable is radially
- connected, so each drive has its own direct connection to the
- controller.</para>
-
- <para>To the best of my knowledge PC ESDI controllers are limited to
- using a maximum of 2 drives per controller. This is compatibility
- feature(?) left over from the WD1003 standard that reserves only a
- single bit for device addressing.</para>
- </sect3>
-
- <sect3>
- <title>Device addressing</title>
-
- <para>On each command cable a maximum of 7 devices and 1 controller
- can be present. To enable the controller to uniquely identify
- which drive it addresses, each ESDI device is equipped with
- jumpers or switches to select the devices address.</para>
-
- <para>On PC type controllers the first drive is set to address 0,
- the second disk to address 1. <emphasis>Always make
- sure</emphasis> you set each disk to an unique address! So, on a
- PC with its two drives/controller maximum the first drive is drive
- 0, the second is drive 1.</para>
- </sect3>
-
- <sect3>
- <title>Termination</title>
-
- <para>The daisy chained command cable (the 34 pin cable remember?)
- needs to be terminated at the last drive on the chain. For this
- purpose ESDI drives come with a termination resistor network that
- can be removed or disabled by a jumper when it is not used.</para>
-
- <para>So, one and <emphasis>only</emphasis> one drive, the one at
- the farthest end of the command cable has its terminator
- installed/enabled. The controller automatically terminates the
- other end of the cable. Please note that this implies that the
- controller must be at one end of the cable and
- <emphasis>not</emphasis> in the middle.</para>
- </sect3>
- </sect2>
-
- <sect2>
- <title>Using ESDI disks with FreeBSD</title>
-
- <para>Why is ESDI such a pain to get working in the first
- place?</para>
-
- <para>People who tried ESDI disks with FreeBSD are known to have
- developed a profound sense of frustration. A combination of factors
- works against you to produce effects that are hard to understand
- when you have never seen them before.</para>
-
- <para>This has also led to the popular legend ESDI and FreeBSD is a
- plain NO-GO. The following sections try to list all the pitfalls
- and solutions.</para>
-
- <sect3>
- <title>ESDI speed variants</title>
-
- <para>As briefly mentioned before, ESDI comes in two speed flavors.
- The older drives and controllers use a 10 Mbits/second data
- transfer rate. Newer stuff uses 15 Mbits/second.</para>
-
- <para>It is not hard to imagine that 15 Mbits/second drive cause
- problems on controllers laid out for 10 Mbits/second. As always,
- consult your controller <emphasis>and</emphasis> drive
- documentation to see if things match.</para>
- </sect3>
-
- <sect3>
- <title>Stay on track</title>
-
- <para>Mainstream ESDI drives use 34 to 36 sectors per track. Most
- (older) controllers cannot handle more than this number of
- sectors. Newer, higher capacity, drives use higher numbers of
- sectors per track. For instance, I own a 670 MB drive that has 54
- sectors per track.</para>
-
- <para>In my case, the controller could not handle this number of
- sectors. It proved to work well except that it only used 35
- sectors on each track. This meant losing a lot of disk
- space.</para>
-
- <para>Once again, check the documentation of your hardware for more
- info. Going out-of-spec like in the example might or might not
- work. Give it a try or get another more capable
- controller.</para>
- </sect3>
-
- <sect3>
- <title>Hard or soft sectoring</title>
-
- <para>Most ESDI drives allow hard or soft sectoring to be selected
- using a jumper. Hard sectoring means that the drive will produce
- a sector pulse on the start of each new sector. The controller
- uses this pulse to tell when it should start to write or
- read.</para>
-
- <para>Hard sectoring allows a selection of sector size (normally
- 256, 512 or 1024 bytes per formatted sector). FreeBSD uses 512
- byte sectors. The number of sectors per track also varies while
- still using the same number of bytes per formatted sector. The
- number of <emphasis>unformatted</emphasis> bytes per sector
- varies, dependent on your controller it needs more or less
- overhead bytes to work correctly. Pushing more sectors on a
- track of course gives you more usable space, but might give
- problems if your controller needs more bytes than the drive
- offers.</para>
-
- <para>In case of soft sectoring, the controller itself determines
- where to start/stop reading or writing. For ESDI hard sectoring
- is the default (at least on everything I came across). I never
- felt the urge to try soft sectoring.</para>
-
- <para>In general, experiment with sector settings before you install
- FreeBSD because you need to re-run the low-level format after each
- change.</para>
- </sect3>
-
- <sect3>
- <title>Low level formatting</title>
-
- <para>ESDI drives need to be low level formatted before they are
- usable. A reformat is needed whenever you figgle with the number
- of sectors/track jumpers or the physical orientation of the drive
- (horizontal, vertical). So, first think, then format. The format
- time must not be underestimated, for big disks it can take
- hours.</para>
-
- <para>After a low level format, a surface scan is done to find and
- flag bad sectors. Most disks have a manufacturer bad block list
- listed on a piece of paper or adhesive sticker. In addition, on
- most disks the list is also written onto the disk. Please use the
- manufacturer's list. It is much easier to remap a defect now than
- after FreeBSD is installed.</para>
-
- <para>Stay away from low-level formatters that mark all sectors of a
- track as bad as soon as they find one bad sector. Not only does
- this waste space, it also and more importantly causes you grief
- with bad144 (see the section on bad144).</para>
- </sect3>
-
- <sect3>
- <title>Translations</title>
-
- <para>Translations, although not exclusively a ESDI-only problem,
- might give you real trouble. Translations come in multiple
- flavors. Most of them have in common that they attempt to work
- around the limitations posed upon disk geometries by the original
- IBM PC/AT design (thanks IBM!).</para>
-
- <para>First of all there is the (in)famous 1024 cylinder limit. For
- a system to be able to boot, the stuff (whatever operating system)
- must be in the first 1024 cylinders of a disk. Only 10 bits are
- available to encode the cylinder number. For the number of
- sectors the limit is 64 (0-63). When you combine the 1024
- cylinder limit with the 16 head limit (also a design feature) you
- max out at fairly limited disk sizes.</para>
-
- <para>To work around this problem, the manufacturers of ESDI PC
- controllers added a BIOS prom extension on their boards. This
- BIOS extension handles disk I/O for booting (and for some
- operating systems <emphasis>all</emphasis> disk I/O) by using
- translation. For instance, a big drive might be presented to the
- system as having 32 heads and 64 sectors/track. The result is
- that the number of cylinders is reduced to something below 1024
- and is therefore usable by the system without problems. It is
- noteworthy to know that FreeBSD does not use the BIOS after its
- kernel has started. More on this later.</para>
-
- <para>A second reason for translations is the fact that most older
- system BIOSes could only handle drives with 17 sectors per track
- (the old ST412 standard). Newer system BIOSes usually have a
- user-defined drive type (in most cases this is drive type
- 47).</para>
-
- <warning>
- <para>Whatever you do to translations after reading this document,
- keep in mind that if you have multiple operating systems on the
- same disk, all must use the same translation</para>
- </warning>
-
- <para>While on the subject of translations, I have seen one
- controller type (but there are probably more like this) offer the
- option to logically split a drive in multiple partitions as a BIOS
- option. I had select 1 drive == 1 partition because this
- controller wrote this info onto the disk. On power-up it read the
- info and presented itself to the system based on the info from the
- disk.</para>
- </sect3>
-
- <sect3>
- <title>Spare sectoring</title>
-
- <para>Most ESDI controllers offer the possibility to remap bad
- sectors. During/after the low-level format of the disk bad
- sectors are marked as such, and a replacement sector is put in
- place (logically of course) of the bad one.</para>
-
- <para>In most cases the remapping is done by using N-1 sectors on
- each track for actual data storage, and sector N itself is the
- spare sector. N is the total number of sectors physically
- available on the track. The idea behind this is that the
- operating system sees a 'perfect' disk without bad sectors. In
- the case of FreeBSD this concept is not usable.</para>
-
- <para>The problem is that the translation from
- <emphasis>bad</emphasis> to <emphasis>good</emphasis> is performed
- by the BIOS of the ESDI controller. FreeBSD, being a true 32 bit
- operating system, does not use the BIOS after it has been booted.
- Instead, it has device drivers that talk directly to the
- hardware.</para>
-
- <para><emphasis>So: don't use spare sectoring, bad block remapping
- or whatever it may be called by the controller manufacturer when
- you want to use the disk for FreeBSD.</emphasis></para>
- </sect3>
-
- <sect3>
- <title>Bad block handling</title>
-
- <para>The preceding section leaves us with a problem. The
- controller's bad block handling is not usable and still FreeBSD's
- filesystems assume perfect media without any flaws. To solve this
- problem, FreeBSD use the <command>bad144</command> tool. Bad144
- (named after a Digital Equipment standard for bad block handling)
- scans a FreeBSD slice for bad blocks. Having found these bad
- blocks, it writes a table with the offending block numbers to the
- end of the FreeBSD slice.</para>
-
- <para>When the disk is in operation, the disk accesses are checked
- against the table read from the disk. Whenever a block number is
- requested that is in the <command>bad144</command> list, a
- replacement block (also from the end of the FreeBSD slice) is
- used. In this way, the <command>bad144</command> replacement
- scheme presents 'perfect' media to the FreeBSD filesystems.</para>
-
- <para>There are a number of potential pitfalls associated with the
- use of <command>bad144</command>. First of all, the slice cannot
- have more than 126 bad sectors. If your drive has a high number
- of bad sectors, you might need to divide it into multiple FreeBSD
- slices each containing less than 126 bad sectors. Stay away from
- low-level format programs that mark <emphasis>every</emphasis>
- sector of a track as bad when they find a flaw on the track. As
- you can imagine, the 126 limit is quickly reached when the
- low-level format is done this way.</para>
-
- <para>Second, if the slice contains the root filesystem, the slice
- should be within the 1024 cylinder BIOS limit. During the boot
- process the bad144 list is read using the BIOS and this only
- succeeds when the list is within the 1024 cylinder limit.</para>
-
- <note>
- <para>The restriction is not that only the root
- <emphasis>filesystem</emphasis> must be within the 1024 cylinder
- limit, but rather the entire <emphasis>slice</emphasis> that
- contains the root filesystem.</para>
- </note>
- </sect3>
-
- <sect3>
- <title>Kernel configuration</title>
-
- <para>ESDI disks are handled by the same <literal>wd</literal>driver
- as IDE and ST412 MFM disks. The <literal>wd</literal> driver
- should work for all WD1003 compatible interfaces.</para>
-
- <para>Most hardware is jumperable for one of two different I/O
- address ranges and IRQ lines. This allows you to have two wd
- type controllers in one system.</para>
-
- <para>When your hardware allows non-standard strappings, you can use
- these with FreeBSD as long as you enter the correct info into the
- kernel config file. An example from the kernel config file (they
- live in <filename>/sys/i386/conf</filename> BTW).</para>
-
- <programlisting># First WD compatible controller
-controller wdc0 at isa? port "IO_WD1" bio irq 14 vector wdintr
-disk wd0 at wdc0 drive 0
-disk wd1 at wdc0 drive 1
-# Second WD compatible controller
-controller wdc1 at isa? port "IO_WD2" bio irq 15 vector wdintr
-disk wd2 at wdc1 drive 0
-disk wd3 at wdc1 drive 1</programlisting>
- </sect3>
- </sect2>
-
- <sect2>
- <title>Particulars on ESDI hardware</title>
-
- <sect3>
- <title>Adaptec 2320 controllers</title>
-
- <para>I successfully installed FreeBSD onto a ESDI disk controlled
- by a ACB-2320. No other operating system was present on the
- disk.</para>
-
- <para>To do so I low level formatted the disk using
- <command>NEFMT.EXE</command> (<command>ftp</command>able from
- <hostid role="fqdn">www.adaptec.com</hostid>) and answered NO to
- the question whether the disk should be formatted with a spare
- sector on each track. The BIOS on the ACD-2320 was disabled. I
- used the <literal>free configurable</literal> option in the system
- BIOS to allow the BIOS to boot it.</para>
-
- <para>Before using <command>NEFMT.EXE</command> I tried to format
- the disk using the ACB-2320 BIOS built-in formatter. This proved
- to be a show stopper, because it did not give me an option to
- disable spare sectoring. With spare sectoring enabled the FreeBSD
- installation process broke down on the <command>bad144</command>
- run.</para>
-
- <para>Please check carefully which
- ACB-232<replaceable>xy</replaceable> variant you have. The
- <replaceable>x</replaceable> is either <literal>0</literal> or
- <literal>2</literal>, indicating a controller without or with a
- floppy controller on board.</para>
-
- <para>The <literal>y</literal> is more interesting. It can either
- be a blank, a <literal>A-8</literal> or a <literal>D</literal>. A
- blank indicates a plain 10 Mbits/second controller. An
- <literal>A-8</literal> indicates a 15 Mbits/second controller
- capable of handling 52 sectors/track. A <literal>D</literal>
- means a 15 Mbits/second controller that can also handle drives
- with &gt; 36 sectors/track (also 52 ?).</para>
-
- <para>All variations should be capable of using 1:1 interleaving.
- Use 1:1, FreeBSD is fast enough to handle it.</para>
- </sect3>
-
- <sect3>
- <title>Western Digital WD1007 controllers</title>
-
- <para>I successfully installed FreeBSD onto a ESDI disk controlled
- by a WD1007 controller. To be precise, it was a WD1007-WA2.
- Other variations of the WD1007 do exist.</para>
-
- <para>To get it to work, I had to disable the sector translation and
- the WD1007's onboard BIOS. This implied I could not use the
- low-level formatter built into this BIOS. Instead, I grabbed
- <command>WDFMT.EXE</command> from <hostid
- role="fqdn">www.wdc.com</hostid> Running this formatted my drive
- just fine.</para>
- </sect3>
-
- <sect3>
- <title>Ultrastor U14F controllers</title>
-
- <para>According to multiple reports from the net, Ultrastor ESDI
- boards work OK with FreeBSD. I lack any further info on
- particular settings.</para>
- </sect3>
- </sect2>
-
- <sect2 id="esdi-further-reading">
- <title>Further reading</title>
-
- <para>If you intend to do some serious ESDI hacking, you might want to
- have the official standard at hand:</para>
-
- <para>The latest ANSI X3T10 committee document is: Enhanced Small
- Device Interface (ESDI) [X3.170-1990/X3.170a-1991] [X3T10/792D
- Rev 11]</para>
-
- <para>On Usenet the newsgroup <ulink
- url="news:comp.periphs">comp.periphs</ulink> is a noteworthy place
- to look for more info.</para>
-
- <para>The World Wide Web (WWW) also proves to be a very handy info
- source: For info on Adaptec ESDI controllers see <ulink
- url="http://www.adaptec.com/">http://www.adaptec.com/</ulink>. For
- info on Western Digital controllers see <ulink
- url="http://www.wdc.com/">http://www.wdc.com/</ulink>.</para>
- </sect2>
-
- <sect2>
- <title>Thanks to...</title>
-
- <para>Andrew Gordon for sending me an Adaptec 2320 controller and ESDI
- disk for testing.</para>
- </sect2>
- </sect1>
-
- <sect1 id="scsi">
- <title>What is SCSI?</title>
-
- <para><emphasis>Copyright &copy; 1995, &a.wilko;. July 6,
- 1996.</emphasis></para>
-
- <para>SCSI is an acronym for Small Computer Systems Interface. It is an
- ANSI standard that has become one of the leading I/O buses in the
- computer industry. The foundation of the SCSI standard was laid by
- Shugart Associates (the same guys that gave the world the first mini
- floppy disks) when they introduced the SASI bus (Shugart Associates
- Standard Interface).</para>
-
- <para>After some time an industry effort was started to come to a more
- strict standard allowing devices from different vendors to work
- together. This effort was recognized in the ANSI SCSI-1 standard.
- The SCSI-1 standard (approximately 1985) is rapidly becoming obsolete. The
- current standard is SCSI-2 (see <link
- linkend="scsi-further-reading">Further reading</link>), with SCSI-3
- on the drawing boards.</para>
-
- <para>In addition to a physical interconnection standard, SCSI defines a
- logical (command set) standard to which disk devices must adhere.
- This standard is called the Common Command Set (CCS) and was developed
- more or less in parallel with ANSI SCSI-1. SCSI-2 includes the
- (revised) CCS as part of the standard itself. The commands are
- dependent on the type of device at hand. It does not make much sense
- of course to define a Write command for a scanner.</para>
-
- <para>The SCSI bus is a parallel bus, which comes in a number of
- variants. The oldest and most used is an 8 bit wide bus, with
- single-ended signals, carried on 50 wires. (If you do not know what
- single-ended means, do not worry, that is what this document is all
- about.) Modern designs also use 16 bit wide buses, with differential
- signals. This allows transfer speeds of 20Mbytes/second, on cables
- lengths of up to 25 meters. SCSI-2 allows a maximum bus width of 32
- bits, using an additional cable. Quickly emerging are Ultra SCSI (also
- called Fast-20) and Ultra2 (also called Fast-40). Fast-20 is 20
- million transfers per second (20 Mbytes/sec on a 8 bit bus), Fast-40
- is 40 million transfers per second (40 Mbytes/sec on a 8 bit bus).
- Most hard drives sold today are single-ended Ultra SCSI (8 or 16
- bits).</para>
-
- <para>Of course the SCSI bus not only has data lines, but also a number
- of control signals. A very elaborate protocol is part of the standard
- to allow multiple devices to share the bus in an efficient manner. In
- SCSI-2, the data is always checked using a separate parity line. In
- pre-SCSI-2 designs parity was optional.</para>
-
- <para>In SCSI-3 even faster bus types are introduced, along with a
- serial SCSI busses that reduces the cabling overhead and allows a
- higher maximum bus length. You might see names like SSA and
- fibre channel in this context. None of the serial buses are currently
- in widespread use (especially not in the typical FreeBSD environment).
- For this reason the serial bus types are not discussed any
- further.</para>
-
- <para>As you could have guessed from the description above, SCSI devices
- are intelligent. They have to be to adhere to the SCSI standard
- (which is over 2 inches thick BTW). So, for a hard disk drive for
- instance you do not specify a head/cylinder/sector to address a
- particular block, but simply the number of the block you want.
- Elaborate caching schemes, automatic bad block replacement etc are all
- made possible by this 'intelligent device' approach.</para>
-
- <para>On a SCSI bus, each possible pair of devices can communicate.
- Whether their function allows this is another matter, but the standard
- does not restrict it. To avoid signal contention, the 2 devices have
- to arbitrate for the bus before using it.</para>
-
- <para>The philosophy of SCSI is to have a standard that allows
- older-standard devices to work with newer-standard ones. So, an old
- SCSI-1 device should normally work on a SCSI-2 bus. I say Normally,
- because it is not absolutely sure that the implementation of an old
- device follows the (old) standard closely enough to be acceptable on a
- new bus. Modern devices are usually more well-behaved, because the
- standardization has become more strict and is better adhered to by the
- device manufacturers.</para>
-
- <para>Generally speaking, the chances of getting a working set of
- devices on a single bus is better when all the devices are SCSI-2 or
- newer. This implies that you do not have to dump all your old stuff
- when you get that shiny 2GB disk: I own a system on which a pre-SCSI-1
- disk, a SCSI-2 QIC tape unit, a SCSI-1 helical scan tape unit and 2
- SCSI-1 disks work together quite happily. From a performance
- standpoint you might want to separate your older and newer (=faster)
- devices however.</para>
-
- <sect2>
- <title>Components of SCSI</title>
-
- <para>As said before, SCSI devices are smart. The idea is to put the
- knowledge about intimate hardware details onto the SCSI device
- itself. In this way, the host system does not have to worry about
- things like how many heads a hard disks has, or how many tracks
- there are on a specific tape device. If you are curious, the
- standard specifies commands with which you can query your devices on
- their hardware particulars. FreeBSD uses this capability during
- boot to check out what devices are connected and whether they need
- any special treatment.</para>
-
- <para>The advantage of intelligent devices is obvious: the device
- drivers on the host can be made in a much more generic fashion,
- there is no longer a need to change (and qualify!) drivers for every
- odd new device that is introduced.</para>
-
- <para>For cabling and connectors there is a golden rule: get good
- stuff. With bus speeds going up all the time you will save yourself
- a lot of grief by using good material.</para>
-
- <para>So, gold plated connectors, shielded cabling, sturdy connector
- hoods with strain reliefs etc are the way to go. Second golden rule:
- do no use cables longer than necessary. I once spent 3 days hunting
- down a problem with a flaky machine only to discover that shortening
- the SCSI bus by 1 meter solved the problem. And the original bus
- length was well within the SCSI specification.</para>
- </sect2>
-
- <sect2>
- <title>SCSI bus types</title>
-
- <para>From an electrical point of view, there are two incompatible bus
- types: single-ended and differential. This means that there are two
- different main groups of SCSI devices and controllers, which cannot
- be mixed on the same bus. It is possible however to use special
- converter hardware to transform a single-ended bus into a
- differential one (and vice versa). The differences between the bus
- types are explained in the next sections.</para>
-
- <para>In lots of SCSI related documentation there is a sort of jargon
- in use to abbreviate the different bus types. A small list:</para>
-
- <itemizedlist>
- <listitem>
- <para>FWD: Fast Wide Differential</para>
- </listitem>
-
- <listitem>
- <para>FND: Fast Narrow Differential</para>
- </listitem>
-
- <listitem>
- <para>SE: Single Ended</para>
- </listitem>
-
- <listitem>
- <para>FN: Fast Narrow</para>
- </listitem>
-
- <listitem>
- <para>etc.</para>
- </listitem>
- </itemizedlist>
-
-
- <para>With a minor amount of imagination one can usually imagine what
- is meant.</para>
-
- <para>Wide is a bit ambiguous, it can indicate 16 or 32 bit buses. As
- far as I know, the 32 bit variant is not (yet) in use, so wide
- normally means 16 bit.</para>
-
- <para>Fast means that the timing on the bus is somewhat different, so
- that on a narrow (8 bit) bus 10 Mbytes/sec are possible instead of 5
- Mbytes/sec for 'slow' SCSI. As discussed before, bus speeds of 20
- and 40 million transfers/second are also emerging (Fast-20 == Ultra
- SCSI and Fast-40 == Ultra2 SCSI).</para>
-
- <note>
- <para>The data lines &gt; 8 are only used for data transfers and
- device addressing. The transfers of commands and status messages
- etc are only performed on the lowest 8 data lines. The standard
- allows narrow devices to operate on a wide bus. The usable bus
- width is negotiated between the devices. You have to watch your
- device addressing closely when mixing wide and narrow.</para>
- </note>
-
- <sect3>
- <title>Single ended buses</title>
-
- <para>A single-ended SCSI bus uses signals that are either 5 Volts
- or 0 Volts (indeed, TTL levels) and are relative to a COMMON
- ground reference. A singled ended 8 bit SCSI bus has
- approximately 25 ground lines, who are all tied to a single `rail'
- on all devices. A standard single ended bus has a maximum length
- of 6 meters. If the same bus is used with fast-SCSI devices, the
- maximum length allowed drops to 3 meters. Fast-SCSI means that
- instead of 5Mbytes/sec the bus allows 10Mbytes/sec
- transfers.</para>
-
- <para>Fast-20 (Ultra SCSI) and Fast-40 allow for 20 and 40 million
- transfers/second respectively. So, F20 is 20 Mbytes/second on a 8
- bit bus, 40 Mbytes/second on a 16 bit bus etc. For F20 the max
- bus length is 1.5 meters, for F40 it becomes 0.75 meters. Be
- aware that F20 is pushing the limits quite a bit, so you will
- quickly find out if your SCSI bus is electrically sound.</para>
-
- <note>
- <para>If some devices on your bus use 'fast' to communicate your
- bus must adhere to the length restrictions for fast
- buses!</para>
- </note>
-
- <para>It is obvious that with the newer fast-SCSI devices the bus
- length can become a real bottleneck. This is why the differential
- SCSI bus was introduced in the SCSI-2 standard.</para>
-
- <para>For connector pinning and connector types please refer to the
- SCSI-2 standard (see <link linkend="scsi-further-reading">Further
- reading</link>) itself, connectors etc are listed there in
- painstaking detail.</para>
-
- <para>Beware of devices using non-standard cabling. For instance
- Apple uses a 25pin D-type connecter (like the one on serial ports
- and parallel printers). Considering that the official SCSI bus
- needs 50 pins you can imagine the use of this connector needs some
- 'creative cabling'. The reduction of the number of ground wires
- they used is a bad idea, you better stick to 50 pins cabling in
- accordance with the SCSI standard. For Fast-20 and 40 do not even
- think about buses like this.</para>
- </sect3>
-
- <sect3>
- <title>Differential buses</title>
-
- <para>A differential SCSI bus has a maximum length of 25 meters.
- Quite a difference from the 3 meters for a single-ended fast-SCSI
- bus. The idea behind differential signals is that each bus signal
- has its own return wire. So, each signal is carried on a
- (preferably twisted) pair of wires. The voltage difference
- between these two wires determines whether the signal is asserted
- or de-asserted. To a certain extent the voltage difference
- between ground and the signal wire pair is not relevant (do not
- try 10 kVolts though).</para>
-
- <para>It is beyond the scope of this document to explain why this
- differential idea is so much better. Just accept that
- electrically seen the use of differential signals gives a much
- better noise margin. You will normally find differential buses in
- use for inter-cabinet connections. Because of the lower cost
- single ended is mostly used for shorter buses like inside
- cabinets.</para>
-
- <para>There is nothing that stops you from using differential stuff
- with FreeBSD, as long as you use a controller that has device
- driver support in FreeBSD. As an example, Adaptec marketed the
- AHA1740 as a single ended board, whereas the AHA1744 was
- differential. The software interface to the host is identical for
- both.</para>
- </sect3>
-
- <sect3>
- <title>Terminators</title>
-
- <para>Terminators in SCSI terminology are resistor networks that are
- used to get a correct impedance matching. Impedance matching is
- important to get clean signals on the bus, without reflections or
- ringing. If you once made a long distance telephone call on a bad
- line you probably know what reflections are. With 20Mbytes/sec
- traveling over your SCSI bus, you do not want signals echoing
- back.</para>
-
- <para>Terminators come in various incarnations, with more or less
- sophisticated designs. Of course, there are internal and external
- variants. Many SCSI devices come with a number of sockets in
- which a number of resistor networks can (must be!) installed. If
- you remove terminators from a device, carefully store them. You
- will need them when you ever decide to reconfigure your SCSI bus.
- There is enough variation in even these simple tiny things to make
- finding the exact replacement a frustrating business. There are
- also SCSI devices that have a single jumper to enable or disable a
- built-in terminator. There are special terminators you can stick
- onto a flat cable bus. Others look like external connectors, or a
- connector hood without a cable. So, lots of choice as you can
- see.</para>
-
- <para>There is much debate going on if and when you should switch
- from simple resistor (passive) terminators to active terminators.
- Active terminators contain slightly more elaborate circuit to give
- cleaner bus signals. The general consensus seems to be that the
- usefulness of active termination increases when you have long
- buses and/or fast devices. If you ever have problems with your
- SCSI buses you might consider trying an active terminator. Try to
- borrow one first, they reputedly are quite expensive.</para>
-
- <para>Please keep in mind that terminators for differential and
- single-ended buses are not identical. You should <emphasis>not
- mix</emphasis> the two variants.</para>
-
- <para>OK, and now where should you install your terminators? This is
- by far the most misunderstood part of SCSI. And it is by far the
- simplest. The rule is: <emphasis>every single line on the SCSI
- bus has 2 (two) terminators, one at each end of the
- bus.</emphasis> So, two and not one or three or whatever. Do
- yourself a favor and stick to this rule. It will save you endless
- grief, because wrong termination has the potential to introduce
- highly mysterious bugs. (Note the <quote>potential</quote> here;
- the nastiest part is that it may or may not work.)</para>
-
- <para>A common pitfall is to have an internal (flat) cable in a
- machine and also an external cable attached to the controller. It
- seems almost everybody forgets to remove the terminators from the
- controller. The terminator must now be on the last external
- device, and not on the controller! In general, every
- reconfiguration of a SCSI bus must pay attention to this.</para>
-
- <note>
- <para>Termination is to be done on a per-line basis. This means
- if you have both narrow and wide buses connected to the same
- host adapter, you need to enable termination on the higher 8
- bits of the bus on the adapter (as well as the last devices on
- each bus, of course).</para>
- </note>
-
- <para>What I did myself is remove all terminators from my SCSI
- devices and controllers. I own a couple of external terminators,
- for both the Centronics-type external cabling and for the internal
- flat cable connectors. This makes reconfiguration much
- easier.</para>
-
- <para>On modern devices, sometimes integrated terminators are used.
- These things are special purpose integrated circuits that can be
- enabled or disabled with a control pin. It is not necessary to
- physically remove them from a device. You may find them on newer
- host adapters, sometimes they are software configurable, using
- some sort of setup tool. Some will even auto-detect the cables
- attached to the connectors and automatically set up the
- termination as necessary. At any rate, consult your
- documentation!</para>
- </sect3>
-
- <sect3>
- <title>Terminator power</title>
-
- <para>The terminators discussed in the previous chapter need power
- to operate properly. On the SCSI bus, a line is dedicated to this
- purpose. So, simple huh?</para>
-
- <para>Not so. Each device can provide its own terminator power to
- the terminator sockets it has on-device. But if you have external
- terminators, or when the device supplying the terminator power to
- the SCSI bus line is switched off you are in trouble.</para>
-
- <para>The idea is that initiators (these are devices that initiate
- actions on the bus, a discussion follows) must supply terminator
- power. All SCSI devices are allowed (but not required) to supply
- terminator power.</para>
-
- <para>To allow for un-powered devices on a bus, the terminator power
- must be supplied to the bus via a diode. This prevents the
- backflow of current to un-powered devices.</para>
-
- <para>To prevent all kinds of nastiness, the terminator power is
- usually fused. As you can imagine, fuses might blow. This can,
- but does not have to, lead to a non functional bus. If multiple
- devices supply terminator power, a single blown fuse will not put
- you out of business. A single supplier with a blown fuse
- certainly will. Clever external terminators sometimes have a LED
- indication that shows whether terminator power is present.</para>
-
- <para>In newer designs auto-restoring fuses that 'reset' themselves
- after some time are sometimes used.</para>
- </sect3>
-
- <sect3>
- <title>Device addressing</title>
-
- <para>Because the SCSI bus is, ehh, a bus there must be a way to
- distinguish or address the different devices connected to
- it.</para>
-
- <para>This is done by means of the SCSI or target ID. Each device
- has a unique target ID. You can select the ID to which a device
- must respond using a set of jumpers, or a dip switch, or something
- similar. Some SCSI host adapters let you change the target ID
- from the boot menu. (Yet some others will not let you change the
- ID from 7.) Consult the documentation of your device for more
- information.</para>
-
- <para>Beware of multiple devices configured to use the same ID.
- Chaos normally reigns in this case. A pitfall is that one of the
- devices sharing the same ID sometimes even manages to answer to
- I/O requests!</para>
-
- <para>For an 8 bit bus, a maximum of 8 targets is possible. The
- maximum is 8 because the selection is done bitwise using the 8
- data lines on the bus. For wide buses this increases to the
- number of data lines (usually 16).</para>
-
- <note>
- <para>A narrow SCSI device can not communicate with a SCSI device
- with a target ID larger than 7. This means it is generally not
- a good idea to move your SCSI host adapter's target ID to
- something higher than 7 (or your CDROM will stop
- working).</para>
- </note>
-
- <para>The higher the SCSI target ID, the higher the priority the
- devices has. When it comes to arbitration between devices that
- want to use the bus at the same time, the device that has the
- highest SCSI ID will win. This also means that the SCSI host
- adapter usually uses target ID 7. Note however that the lower 8
- IDs have higher priorities than the higher 8 IDs on a wide-SCSI
- bus. Thus, the order of target IDs is: [7 6 .. 1 0 15 14 .. 9 8]
- on a wide-SCSI system. (If you are wondering why the lower 8
- have higher priority, read the previous paragraph for a
- hint.)</para>
-
- <para>For a further subdivision, the standard allows for Logical
- Units or LUNs for short. A single target ID may have multiple
- LUNs. For example, a tape device including a tape changer may
- have LUN 0 for the tape device itself, and LUN 1 for the tape
- changer. In this way, the host system can address each of the
- functional units of the tape changer as desired.</para>
- </sect3>
-
- <sect3>
- <title>Bus layout</title>
-
- <para>SCSI buses are linear. So, not shaped like Y-junctions, star
- topologies, rings, cobwebs or whatever else people might want to
- invent. One of the most common mistakes is for people with
- wide-SCSI host adapters to connect devices on all three connecters
- (external connector, internal wide connector, internal narrow
- connector). Don't do that. It may appear to work if you are
- really lucky, but I can almost guarantee that your system will
- stop functioning at the most unfortunate moment (this is also
- known as <quote>Murphy's law</quote>).</para>
-
- <para>You might notice that the terminator issue discussed earlier
- becomes rather hairy if your bus is not linear. Also, if you have
- more connectors than devices on your internal SCSI cable, make
- sure you attach devices on connectors on both ends instead of
- using the connectors in the middle and let one or both ends
- dangle. This will screw up the termination of the bus.</para>
-
- <para>The electrical characteristics, its noise margins and
- ultimately the reliability of it all are tightly related to linear
- bus rule.</para>
-
- <para><emphasis>Stick to the linear bus rule!</emphasis></para>
- </sect3>
- </sect2>
-
- <sect2>
- <title>Using SCSI with FreeBSD</title>
-
- <sect3>
- <title>About translations, BIOSes and magic...</title>
-
- <para>As stated before, you should first make sure that you have a
- electrically sound bus.</para>
-
- <para>When you want to use a SCSI disk on your PC as boot disk, you
- must aware of some quirks related to PC BIOSes. The PC BIOS in
- its first incarnation used a low level physical interface to the
- hard disk. So, you had to tell the BIOS (using a setup tool or a
- BIOS built-in setup) how your disk physically looked like. This
- involved stating number of heads, number of cylinders, number of
- sectors per track, obscure things like precompensation and reduced
- write current cylinder etc.</para>
-
- <para>One might be inclined to think that since SCSI disks are smart
- you can forget about this. Alas, the arcane setup issue is still
- present today. The system BIOS needs to know how to access your
- SCSI disk with the head/cyl/sector method in order to load the
- FreeBSD kernel during boot.</para>
-
- <para>The SCSI host adapter or SCSI controller you have put in your
- AT/EISA/PCI/whatever bus to connect your disk therefore has its
- own on-board BIOS. During system startup, the SCSI BIOS takes
- over the hard disk interface routines from the system BIOS. To
- fool the system BIOS, the system setup is normally set to No hard
- disk present. Obvious, isn't it?</para>
-
- <para>The SCSI BIOS itself presents to the system a so called
- <emphasis>translated</emphasis> drive. This means that a fake
- drive table is constructed that allows the PC to boot the drive.
- This translation is often (but not always) done using a pseudo
- drive with 64 heads and 32 sectors per track. By varying the
- number of cylinders, the SCSI BIOS adapts to the actual drive
- size. It is useful to note that 32 * 64 / 2 = the size of your
- drive in megabytes. The division by 2 is to get from disk blocks
- that are normally 512 bytes in size to Kbytes.</para>
-
- <para>Right. All is well now?! No, it is not. The system BIOS has
- another quirk you might run into. The number of cylinders of a
- bootable hard disk cannot be greater than 1024. Using the
- translation above, this is a show-stopper for disks greater than 1
- GB. With disk capacities going up all the time this is causing
- problems.</para>
-
- <para>Fortunately, the solution is simple: just use another
- translation, e.g. with 128 heads instead of 32. In most cases new
- SCSI BIOS versions are available to upgrade older SCSI host
- adapters. Some newer adapters have an option, in the form of a
- jumper or software setup selection, to switch the translation the
- SCSI BIOS uses.</para>
-
- <para>It is very important that <emphasis>all</emphasis> operating
- systems on the disk use the <emphasis>same translation</emphasis>
- to get the right idea about where to find the relevant partitions.
- So, when installing FreeBSD you must answer any questions about
- heads/cylinders etc using the translated values your host adapter
- uses.</para>
-
- <para>Failing to observe the translation issue might lead to
- un-bootable systems or operating systems overwriting each others
- partitions. Using fdisk you should be able to see all
- partitions.</para>
-
- <para>You might have heard some talk of <quote>lying</quote> devices?
- Older FreeBSD kernels used to report the geometry of SCSI disks
- when booting. An example from one of my systems:</para>
-
- <screen>aha0 targ 0 lun 0: &lt;MICROP 1588-15MB1057404HSP4&gt;
-sd0: 636MB (1303250 total sec), 1632 cyl, 15 head, 53 sec, bytes/sec 512</screen>
-
- <para>Newer kernels usually do not report this information.
- e.g.</para>
-
- <screen>(bt0:0:0): "SEAGATE ST41651 7574" type 0 fixed SCSI 2
-sd0(bt0:0:0): Direct-Access 1350MB (2766300 512 byte sectors)</screen>
-
- <para>Why has this changed?</para>
-
- <para>This info is retrieved from the SCSI disk itself. Newer disks
- often use a technique called zone bit recording. The idea is that
- on the outer cylinders of the drive there is more space so more
- sectors per track can be put on them. This results in disks that
- have more tracks on outer cylinders than on the inner cylinders
- and, last but not least, have more capacity. You can imagine that
- the value reported by the drive when inquiring about the geometry
- now becomes suspect at best, and nearly always misleading. When
- asked for a geometry , it is nearly always better to supply the
- geometry used by the BIOS, or <emphasis>if the BIOS is never going
- to know about this disk</emphasis>, (e.g. it is not a booting
- disk) to supply a fictitious geometry that is convenient.</para>
- </sect3>
-
- <sect3>
- <title>SCSI subsystem design</title>
-
- <para>FreeBSD uses a layered SCSI subsystem. For each different
- controller card a device driver is written. This driver knows all
- the intimate details about the hardware it controls. The driver
- has a interface to the upper layers of the SCSI subsystem through
- which it receives its commands and reports back any status.</para>
-
- <para>On top of the card drivers there are a number of more generic
- drivers for a class of devices. More specific: a driver for tape
- devices (abbreviation: st), magnetic disks (sd), CDROMs (cd) etc.
- In case you are wondering where you can find this stuff, it all
- lives in <filename>/sys/scsi</filename>. See the man pages in
- section 4 for more details.</para>
-
- <para>The multi level design allows a decoupling of low-level bit
- banging and more high level stuff. Adding support for another
- piece of hardware is a much more manageable problem.</para>
- </sect3>
-
- <sect3>
- <title>Kernel configuration</title>
-
- <para>Dependent on your hardware, the kernel configuration file must
- contain one or more lines describing your host adapter(s). This
- includes I/O addresses, interrupts etc. Consult the man page for
- your adapter driver to get more info. Apart from that, check out
- <filename>/sys/i386/conf/LINT</filename> for an overview of a
- kernel config file. <filename>LINT</filename> contains every
- possible option you can dream of. It does
- <emphasis>not</emphasis> imply <filename>LINT</filename> will
- actually get you to a working kernel at all.</para>
-
- <para>Although it is probably stating the obvious: the kernel config
- file should reflect your actual hardware setup. So, interrupts,
- I/O addresses etc must match the kernel config file. During
- system boot messages will be displayed to indicate whether the
- configured hardware was actually found.</para>
-
- <note>
- <para>Note that most of the EISA/PCI drivers (namely
- <devicename>ahb</devicename>, <devicename>ahc</devicename>,
- <devicename>ncr</devicename> and <devicename>amd</devicename>
- will automatically obtain the correct parameters from the host
- adapters themselves at boot time; thus, you just need to write,
- for instance, <literal>controller ahc0</literal>.</para>
- </note>
-
- <para>An example loosely based on the FreeBSD 2.2.5-Release kernel
- config file <filename>LINT</filename> with some added comments
- (between []):</para>
-
- <programlisting># SCSI host adapters: `aha', `ahb', `aic', `bt', `nca'
-#
-# aha: Adaptec 154x
-# ahb: Adaptec 174x
-# ahc: Adaptec 274x/284x/294x
-# aic: Adaptec 152x and sound cards using the Adaptec AIC-6360 (slow!)
-# amd: AMD 53c974 based SCSI cards (e.g., Tekram DC-390 and 390T)
-# bt: Most Buslogic controllers
-# nca: ProAudioSpectrum cards using the NCR 5380 or Trantor T130
-# ncr: NCR/Symbios 53c810/815/825/875 etc based SCSI cards
-# uha: UltraStore 14F and 34F
-# sea: Seagate ST01/02 8 bit controller (slow!)
-# wds: Western Digital WD7000 controller (no scatter/gather!).
-#
-
-[For an Adaptec AHA274x/284x/294x/394x etc controller]
-controller ahc0
-
-[For an NCR/Symbios 53c875 based controller]
-controller ncr0
-
-[For an Ultrastor adapter]
-controller uha0 at isa? port "IO_UHA0" bio irq ? drq 5 vector uhaintr
-
-# Map SCSI buses to specific SCSI adapters
-controller scbus0 at ahc0
-controller scbus2 at ncr0
-controller scbus1 at uha0
-
-# The actual SCSI devices
-disk sd0 at scbus0 target 0 unit 0 [SCSI disk 0 is at scbus 0, LUN 0]
-disk sd1 at scbus0 target 1 [implicit LUN 0 if omitted]
-disk sd2 at scbus1 target 3 [SCSI disk on the uha0]
-disk sd3 at scbus2 target 4 [SCSI disk on the ncr0]
-tape st1 at scbus0 target 6 [SCSI tape at target 6]
-device cd0 at scbus? [the first ever CDROM found, no wiring]</programlisting>
-
- <para>The example above tells the kernel to look for a ahc (Adaptec
- 274x) controller, then for an NCR/Symbios board, and so on. The
- lines following the controller specifications tell the kernel to
- configure specific devices but <emphasis>only</emphasis> attach
- them when they match the target ID and LUN specified on the
- corresponding bus.</para>
-
- <para>Wired down devices get <quote>first shot</quote> at the unit
- numbers so the first non <quote>wired down</quote> device, is
- allocated the unit number one greater than the highest
- <quote>wired down</quote> unit number for that kind of device. So,
- if you had a SCSI tape at target ID 2 it would be configured as
- st2, as the tape at target ID 6 is wired down to unit number
- 1.</para>
-
- <note>
- <para>Wired down devices need not be found to get their unit
- number. The unit number for a wired down device is reserved for
- that device, even if it is turned off at boot time. This allows
- the device to be turned on and brought on-line at a later time,
- without rebooting. Notice that a device's unit number has
- <emphasis>no</emphasis> relationship with its target ID on the
- SCSI bus.</para>
- </note>
-
- <para>Below is another example of a kernel config file as used by
- FreeBSD version &lt; 2.0.5. The difference with the first example
- is that devices are not <quote>wired down</quote>. <quote>Wired
- down</quote> means that you specify which SCSI target belongs to
- which device.</para>
-
- <para>A kernel built to the config file below will attach the first
- SCSI disk it finds to sd0, the second disk to sd1 etc. If you ever
- removed or added a disk, all other devices of the same type (disk
- in this case) would 'move around'. This implies you have to
- change <filename>/etc/fstab</filename> each time.</para>
-
- <para>Although the old style still works, you are
- <emphasis>strongly</emphasis> recommended to use this new feature.
- It will save you a lot of grief whenever you shift your hardware
- around on the SCSI buses. So, when you re-use your old trusty
- config file after upgrading from a pre-FreeBSD2.0.5.R system check
- this out.</para>
-
- <programlisting>[driver for Adaptec 174x]
-controller ahb0 at isa? bio irq 11 vector ahbintr
-
-[for Adaptec 154x]
-controller aha0 at isa? port "IO_AHA0" bio irq 11 drq 5 vector ahaintr
-
-[for Seagate ST01/02]
-controller sea0 at isa? bio irq 5 iomem 0xc8000 iosiz 0x2000 vector seaintr
-
-controller scbus0
-
-device sd0 [support for 4 SCSI harddisks, sd0 up sd3]
-device st0 [support for 2 SCSI tapes]
-
-[for the CDROM]
-device cd0 #Only need one of these, the code dynamically grows</programlisting>
-
- <para>Both examples support SCSI disks. If during boot more devices
- of a specific type (e.g. sd disks) are found than are configured
- in the booting kernel, the system will simply allocate more
- devices, incrementing the unit number starting at the last number
- <quote>wired down</quote>. If there are no <quote>wired
- down</quote> devices then counting starts at unit 0.</para>
-
- <para>Use <command>man 4 scsi</command> to check for the latest info
- on the SCSI subsystem. For more detailed info on host adapter
- drivers use e.g., <command>man 4 ahc</command> for info on the
- Adaptec 294x driver.</para>
- </sect3>
-
- <sect3>
- <title>Tuning your SCSI kernel setup</title>
-
- <para>Experience has shown that some devices are slow to respond to
- INQUIRY commands after a SCSI bus reset (which happens at boot
- time). An INQUIRY command is sent by the kernel on boot to see
- what kind of device (disk, tape, CDROM etc.) is connected to a
- specific target ID. This process is called device probing by the
- way.</para>
-
- <para>To work around the 'slow response' problem, FreeBSD allows a
- tunable delay time before the SCSI devices are probed following a
- SCSI bus reset. You can set this delay time in your kernel
- configuration file using a line like:</para>
-
- <programlisting>options SCSI_DELAY=15 #Be pessimistic about Joe SCSI device</programlisting>
-
- <para>This line sets the delay time to 15 seconds. On my own system
- I had to use 3 seconds minimum to get my trusty old CDROM drive
- to be recognized. Start with a high value (say 30 seconds or so)
- when you have problems with device recognition. If this helps,
- tune it back until it just stays working.</para>
- </sect3>
-
- <sect3 id="scsi-rogue-devices">
- <title>Rogue SCSI devices</title>
-
- <para>Although the SCSI standard tries to be complete and concise,
- it is a complex standard and implementing things correctly is no
- easy task. Some vendors do a better job then others.</para>
-
- <para>This is exactly where the <quote>rogue</quote> devices come
- into view. Rogues are devices that are recognized by the FreeBSD
- kernel as behaving slightly (...) non-standard. Rogue devices are
- reported by the kernel when booting. An example for two of my
- cartridge tape units:</para>
-
- <screen>Feb 25 21:03:34 yedi /kernel: ahb0 targ 5 lun 0: &lt;TANDBERG TDC 3600 -06:&gt;
-Feb 25 21:03:34 yedi /kernel: st0: Tandberg tdc3600 is a known rogue
-
-Mar 29 21:16:37 yedi /kernel: aha0 targ 5 lun 0: &lt;ARCHIVE VIPER 150 21247-005&gt;
-Mar 29 21:16:37 yedi /kernel: st1: Archive Viper 150 is a known rogue </screen>
-
- <para>For instance, there are devices that respond to all LUNs on a
- certain target ID, even if they are actually only one device. It
- is easy to see that the kernel might be fooled into believing that
- there are 8 LUNs at that particular target ID. The confusion this
- causes is left as an exercise to the reader.</para>
-
- <para>The SCSI subsystem of FreeBSD recognizes devices with bad
- habits by looking at the INQUIRY response they send when probed.
- Because the INQUIRY response also includes the version number of
- the device firmware, it is even possible that for different
- firmware versions different workarounds are used. See e.g.
- <filename>/sys/scsi/st.c</filename> and
- <filename>/sys/scsi/scsiconf.c</filename> for more info on how
- this is done.</para>
-
- <para>This scheme works fine, but keep in mind that it of course
- only works for devices that are known to be weird. If you are the
- first to connect your bogus Mumbletech SCSI CDROM you might be
- the one that has to define which workaround is needed.</para>
-
- <para>After you got your Mumbletech working, please send the
- required workaround to the FreeBSD development team for inclusion
- in the next release of FreeBSD. Other Mumbletech owners will be
- grateful to you.</para>
- </sect3>
-
- <sect3>
- <title>Multiple LUN devices</title>
-
- <para>In some cases you come across devices that use multiple
- logical units (LUNs) on a single SCSI ID. In most cases FreeBSD
- only probes devices for LUN 0. An example are so called bridge
- boards that connect 2 non-SCSI harddisks to a SCSI bus (e.g. an
- Emulex MD21 found in old Sun systems).</para>
-
- <para>This means that any devices with LUNs != 0 are not normally
- found during device probe on system boot. To work around this
- problem you must add an appropriate entry in /sys/scsi/scsiconf.c
- and rebuild your kernel.</para>
-
- <para>Look for a struct that is initialized like below:</para>
-
- <programlisting>{
- T_DIRECT, T_FIXED, "MAXTOR", "XT-4170S", "B5A",
- "mx1", SC_ONE_LU
-}</programlisting>
-
- <para>For you Mumbletech BRIDGE2000 that has more than one LUN, acts
- as a SCSI disk and has firmware revision 123 you would add
- something like:</para>
-
- <programlisting>{
- T_DIRECT, T_FIXED, "MUMBLETECH", "BRIDGE2000", "123",
- "sd", SC_MORE_LUS
-}</programlisting>
-
- <para>The kernel on boot scans the inquiry data it receives against
- the table and acts accordingly. See the source for more
- info.</para>
- </sect3>
-
- <sect3>
- <title>Tagged command queuing</title>
-
- <para>Modern SCSI devices, particularly magnetic disks,
- support what is called tagged command queuing (TCQ).</para>
-
- <para>In a nutshell, TCQ allows the device to have multiple I/O
- requests outstanding at the same time. Because the device is
- intelligent, it can optimize its operations (like head
- positioning) based on its own request queue. On SCSI devices
- like RAID (Redundant Array of Independent Disks) arrays the TCQ
- function is indispensable to take advantage of the device's
- inherent parallelism.</para>
-
- <para>Each I/O request is uniquely identified by a <quote>tag</quote>
- (hence the name tagged command queuing) and this tag is used by
- FreeBSD to see which I/O in the device drivers queue is reported
- as complete by the device.</para>
-
- <para>It should be noted however that TCQ requires device driver
- support and that some devices implemented it <quote>not quite
- right</quote> in their firmware. This problem bit me once, and it
- leads to highly mysterious problems. In such cases, try to
- disable TCQ.</para>
- </sect3>
-
- <sect3>
- <title>Busmaster host adapters</title>
-
- <para>Most, but not all, SCSI host adapters are bus mastering
- controllers. This means that they can do I/O on their own without
- putting load onto the host CPU for data movement.</para>
-
- <para>This is of course an advantage for a multitasking operating
- system like FreeBSD. It must be noted however that there might be
- some rough edges.</para>
-
- <para>For instance an Adaptec 1542 controller can be set to use
- different transfer speeds on the host bus (ISA or AT in this
- case). The controller is settable to different rates because not
- all motherboards can handle the higher speeds. Problems like
- hang-ups, bad data etc might be the result of using a higher data
- transfer rate then your motherboard can stomach.</para>
-
- <para>The solution is of course obvious: switch to a lower data
- transfer rate and try if that works better.</para>
-
- <para>In the case of a Adaptec 1542, there is an option that can be
- put into the kernel config file to allow dynamic determination of
- the right, read: fastest feasible, transfer rate. This option is
- disabled by default:</para>
-
- <programlisting>options "TUNE_1542" #dynamic tune of bus DMA speed</programlisting>
-
- <para>Check the man pages for the host adapter that you use. Or
- better still, use the ultimate documentation (read: driver
- source).</para>
- </sect3>
- </sect2>
-
- <sect2>
- <title>Tracking down problems</title>
-
- <para>The following list is an attempt to give a guideline for the
- most common SCSI problems and their solutions. It is by no means
- complete.</para>
-
- <itemizedlist>
- <listitem>
- <para>Check for loose connectors and cables.</para>
- </listitem>
-
- <listitem>
- <para>Check and double check the location and number of your
- terminators.</para>
- </listitem>
-
- <listitem>
- <para>Check if your bus has at least one supplier of terminator
- power (especially with external terminators.</para>
- </listitem>
-
- <listitem>
- <para>Check if no double target IDs are used.</para>
- </listitem>
-
- <listitem>
- <para>Check if all devices to be used are powered up.</para>
- </listitem>
-
- <listitem>
- <para>Make a minimal bus config with as little devices as
- possible.</para>
- </listitem>
-
- <listitem>
- <para>If possible, configure your host adapter to use slow bus
- speeds.</para>
- </listitem>
-
- <listitem>
- <para>Disable tagged command queuing to make things as simple as
- possible (for a NCR host adapter based system see man
- ncrcontrol)</para>
- </listitem>
-
- <listitem>
- <para>If you can compile a kernel, make one with the
- <literal>SCSIDEBUG</literal> option, and try accessing the
- device with debugging turned on for that device. If your device
- does not even probe at startup, you may have to define the
- address of the device that is failing, and the desired debug
- level in <filename>/sys/scsi/scsidebug.h</filename>. If it
- probes but just does not work, you can use the
- &man.scsi.8; command to dynamically set a debug level to
- it in a running kernel (if <literal>SCSIDEBUG</literal> is
- defined). This will give you <emphasis>copious</emphasis>
- debugging output with which to confuse the gurus. See
- <command>man 4 scsi</command> for more exact information. Also
- look at <command>man 8 scsi</command>.</para>
- </listitem>
- </itemizedlist>
- </sect2>
-
- <sect2 id="scsi-further-reading">
- <title>Further reading</title>
-
- <para>If you intend to do some serious SCSI hacking, you might want to
- have the official standard at hand:</para>
-
- <para>Approved American National Standards can be purchased from
- ANSI at
-
- <address>
- <otheraddr>13th Floor</otheraddr>
- <street>11 West 42nd Street</street>
- <city>New York</city>
- <state>NY</state> <postcode>10036</postcode>
- Sales Dept: <phone>(212) 642-4900</phone>
- </address>
- </para>
-
- <para>You can also buy many ANSI
- standards and most committee draft documents from Global
- Engineering Documents,
-
- <address>
- <street>15 Inverness Way East</street>
- <city>Englewood</city>
- <state>CO</state>, <postcode>80112-5704</postcode>
- Phone: <phone>(800) 854-7179</phone>
- Outside USA and Canada: <phone>(303) 792-2181</phone>
- Fax: <fax>(303) 792- 2192</fax>
- </address>
- </para>
-
- <para>Many X3T10 draft documents are available electronically on the
- SCSI BBS (719-574-0424) and on the <hostid
- role="fqdn">ncrinfo.ncr.com</hostid> anonymous FTP site.</para>
-
- <para>Latest X3T10 committee documents are:</para>
-
- <itemizedlist>
- <listitem>
- <para>AT Attachment (ATA or IDE) [X3.221-1994]
- (<emphasis>Approved</emphasis>)</para>
- </listitem>
-
- <listitem>
- <para>ATA Extensions (ATA-2) [X3T10/948D Rev 2i]</para>
- </listitem>
-
- <listitem>
- <para>Enhanced Small Device Interface (ESDI)
- [X3.170-1990/X3.170a-1991]
- (<emphasis>Approved</emphasis>)</para>
- </listitem>
-
- <listitem>
- <para>Small Computer System Interface &mdash; 2 (SCSI-2)
- [X3.131-1994] (<emphasis>Approved</emphasis>)</para>
- </listitem>
-
- <listitem>
- <para>SCSI-2 Common Access Method Transport and SCSI Interface
- Module (CAM) [X3T10/792D Rev 11]</para>
- </listitem>
- </itemizedlist>
-
- <para>Other publications that might provide you with additional
- information are:</para>
-
- <itemizedlist>
- <listitem>
- <para><quote>SCSI: Understanding the Small Computer System
- Interface</quote>, written by NCR Corporation. Available from:
- Prentice Hall, Englewood Cliffs, NJ, 07632 Phone: (201) 767-5937
- ISBN 0-13-796855-8</para>
- </listitem>
-
- <listitem>
- <para><quote>Basics of SCSI</quote>, a SCSI tutorial written by
- Ancot Corporation Contact Ancot for availability information at:
- Phone: (415) 322-5322 Fax: (415) 322-0455</para>
- </listitem>
-
- <listitem>
- <para><quote>SCSI Interconnection Guide Book</quote>, an AMP
- publication (dated 4/93, Catalog 65237) that lists the various
- SCSI connectors and suggests cabling schemes. Available from
- AMP at (800) 522-6752 or (717) 564-0100</para>
- </listitem>
-
- <listitem>
- <para><quote>Fast Track to SCSI</quote>, A Product Guide written by
- Fujitsu. Available from: Prentice Hall, Englewood Cliffs, NJ,
- 07632 Phone: (201) 767-5937 ISBN 0-13-307000-X</para>
- </listitem>
-
- <listitem>
- <para><quote>The SCSI Bench Reference</quote>, <quote>The SCSI
- Encyclopedia</quote>, and the <quote>SCSI Tutor</quote>, ENDL
- Publications, 14426 Black Walnut Court, Saratoga CA, 95070
- Phone: (408) 867-6642</para>
- </listitem>
-
- <listitem>
- <para><quote>Zadian SCSI Navigator</quote> (quick ref. book) and
- <quote>Discover the Power of SCSI</quote> (First book along with
- a one-hour video and tutorial book), Zadian Software, Suite 214,
- 1210 S. Bascom Ave., San Jose, CA 92128, (408) 293-0800</para>
- </listitem>
- </itemizedlist>
-
- <para>On Usenet the newsgroups <ulink
- url="news:comp.periphs.scsi">comp.periphs.scsi</ulink> and <ulink
- url="news:comp.periphs">comp.periphs</ulink> are noteworthy places
- to look for more info. You can also find the SCSI-Faq there, which
- is posted periodically.</para>
-
- <para>Most major SCSI device and host adapter suppliers operate FTP
- sites and/or BBS systems. They may be valuable sources of
- information about the devices you own.</para>
- </sect2>
- </sect1>
-
- <sect1 id="hw-storage-controllers">
- <title>* Disk/tape controllers</title>
-
- <sect2>
- <title>* SCSI</title>
-
- <para></para>
- </sect2>
-
- <sect2>
- <title>* IDE</title>
-
- <para></para>
- </sect2>
-
- <sect2>
- <title>* Floppy</title>
-
- <para></para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Hard drives</title>
-
- <sect2>
- <title>SCSI hard drives</title>
-
- <para><emphasis>Contributed by &a.asami;. 17 February
- 1998.</emphasis></para>
-
- <para>As mentioned in the <link linkend="scsi">SCSI</link> section,
- virtually all SCSI hard drives sold today are SCSI-2 compliant and
- thus will work fine as long as you connect them to a supported SCSI
- host adapter. Most problems people encounter are either due to
- badly designed cabling (cable too long, star topology, etc.),
- insufficient termination, or defective parts. Please refer to the
- <link linkend="scsi">SCSI</link> section first if your SCSI hard
- drive is not working. However, there are a couple of things you may
- want to take into account before you purchase SCSI hard drives for
- your system.</para>
-
- <sect3>
- <title>Rotational speed</title>
-
- <para>Rotational speeds of SCSI drives sold today range from around
- 4,500RPM to 10,000RPM. Most of them are either 5,400RPM or
- 7,200RPM. Even though the 7,200RPM drives can generally transfer
- data faster, they run considerably hotter than their 5,400RPM
- counterparts. A large fraction of today's disk drive malfunctions
- are heat-related. If you do not have very good cooling in your PC
- case, you may want to stick with 5,400RPM or slower drives.</para>
-
- <para>Note that newer drives, with higher areal recording densities,
- can deliver much more bits per rotation than older ones. Today's
- top-of-line 5,400RPM drives can sustain a throughput comparable to
- 7,200RPM drives of one or two model generations ago. The number
- to find on the spec sheet for bandwidth is <quote>internal data
- (or transfer) rate</quote>. It is usually in megabits/sec so
- divide it by 8 and you'll get the rough approximation of how much
- megabytes/sec you can get out of the drive.</para>
-
- <para>(If you are a speed maniac and want a 10,000RPM drive for your
- cute little PC, be my guest; however, those drives become
- extremely hot. Don't even think about it if you don't have a fan
- blowing air <emphasis>directly at</emphasis> the drive or a
- properly ventilated disk enclosure.)</para>
-
- <para>Obviously, the latest 10,000RPM drives and 7,200RPM drives can
- deliver more data than the latest 5,400RPM drives, so if absolute
- bandwidth is the necessity for your applications, you have little
- choice but to get the faster drives. Also, if you need low
- latency, faster drives are better; not only do they usually have
- lower average seek times, but also the rotational delay is one
- place where slow-spinning drives can never beat a faster one.
- (The average rotational latency is half the time it takes to
- rotate the drive once; thus, it's 3 milliseconds for 10,000RPM
- drives, 4.2ms for 7,200RPM drives and 5.6ms for 5,400RPM drives.)
- Latency is seek time plus rotational delay. Make sure you
- understand whether you need low latency or more accesses per
- second, though; in the latter case (e.g., news servers), it may
- not be optimal to purchase one big fast drive. You can achieve
- similar or even better results by using the ccd (concatenated
- disk) driver to create a striped disk array out of multiple slower
- drives for comparable overall cost.</para>
-
- <para>Make sure you have adequate air flow around the drive,
- especially if you are going to use a fast-spinning drive. You
- generally need at least 1/2" (1.25cm) of spacing above and below a
- drive. Understand how the air flows through your PC case. Most
- cases have the power supply suck the air out of the back. See
- where the air flows in, and put the drive where it will have the
- largest volume of cool air flowing around it. You may need to seal
- some unwanted holes or add a new fan for effective cooling.</para>
-
- <para>Another consideration is noise. Many 7,200 or faster drives
- generate a high-pitched whine which is quite unpleasant to most
- people. That, plus the extra fans often required for cooling, may
- make 7,200 or faster drives unsuitable for some office and home
- environments.</para>
- </sect3>
-
- <sect3>
- <title>Form factor</title>
-
- <para>Most SCSI drives sold today are of 3.5" form factor. They
- come in two different heights; 1.6" (<quote>half-height</quote>) or
- 1" (<quote>low-profile</quote>). The half-height drive is the same
- height as a CDROM drive. However, don't forget the spacing rule
- mentioned in the previous section. If you have three standard
- 3.5" drive bays, you will not be able to put three half-height
- drives in there (without frying them, that is).</para>
- </sect3>
-
- <sect3>
- <title>Interface</title>
-
- <para>The majority of SCSI hard drives sold today are Ultra or
- Ultra-wide SCSI. The maximum bandwidth of Ultra SCSI is 20MB/sec,
- and Ultra-wide SCSI is 40MB/sec. There is no difference in max
- cable length between Ultra and Ultra-wide; however, the more
- devices you have on the same bus, the sooner you will start having
- bus integrity problems. Unless you have a well-designed disk
- enclosure, it is not easy to make more than 5 or 6 Ultra SCSI
- drives work on a single bus.</para>
-
- <para>On the other hand, if you need to connect many drives, going
- for Fast-wide SCSI may not be a bad idea. That will have the same
- max bandwidth as Ultra (narrow) SCSI, while electronically it's
- much easier to get it <quote>right</quote>. My advice would be: if
- you want to connect many disks, get wide SCSI drives; they usually
- cost a little more but it may save you down the road. (Besides,
- if you can't afford the cost difference, you shouldn't be building
- a disk array.)</para>
-
- <para>There are two variant of wide SCSI drives; 68-pin and 80-pin
- SCA (Single Connector Attach). The SCA drives don't have a
- separate 4-pin power connector, and also read the SCSI ID settings
- through the 80-pin connector. If you are really serious about
- building a large storage system, get SCA drives and a good SCA
- enclosure (dual power supply with at least one extra fan). They
- are more electronically sound than 68-pin counterparts because
- there is no <quote>stub</quote> of the SCSI bus inside the disk
- canister as in arrays built from 68-pin drives. They are easier
- to install too (you just need to screw the drive in the canister,
- instead of trying to squeeze in your fingers in a tight place to
- hook up all the little cables (like the SCSI ID and disk activity
- LED lines).</para>
- </sect3>
- </sect2>
-
- <sect2>
- <title>* IDE hard drives</title>
-
- <para></para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Tape drives</title>
-
- <para><emphasis>Contributed by &a.jmb;. 2 July
- 1996.</emphasis></para>
-
- <sect2>
- <title>General tape access commands</title>
-
- <para>&man.mt.1; provides generic access to the tape drives. Some of
- the more common commands are <command>rewind</command>,
- <command>erase</command>, and <command>status</command>. See the
- &man.mt.1; manual page for a detailed description.</para>
- </sect2>
-
- <sect2>
- <title>Controller Interfaces</title>
-
- <para>There are several different interfaces that support tape drives.
- The interfaces are SCSI, IDE, Floppy and Parallel Port. A wide
- variety of tape drives are available for these interfaces.
- Controllers are discussed in <link
- linkend="hw-storage-controllers">Disk/tape
- controllers</link>.</para>
- </sect2>
-
- <sect2>
- <title>SCSI drives</title>
-
- <para>The &man.st.4; driver provides support for 8mm (Exabyte), 4mm
- (DAT: Digital Audio Tape), QIC (Quarter-Inch Cartridge), DLT
- (Digital Linear Tape), QIC Mini cartridge and 9-track (remember the
- big reels that you see spinning in Hollywood computer rooms) tape
- drives. See the &man.st.4; manual page for a detailed
- description.</para>
-
- <para>The drives listed below are currently being used by members of
- the FreeBSD community. They are not the only drives that will work
- with FreeBSD. They just happen to be the ones that we use.</para>
-
- <sect3>
- <title>4mm (DAT: Digital Audio Tape)</title>
-
- <para><link linkend="hw-storage-python-28454">Archive Python
- 28454</link></para>
-
- <para><link linkend="hw-storage-python-04687">Archive Python
- 04687</link></para>
-
- <para><link linkend="hw-storage-hp1533a">HP C1533A</link></para>
-
- <para><link linkend="hw-storage-hp1534a">HP C1534A</link></para>
-
- <para><link linkend="hw-storage-hp35450a">HP 35450A</link></para>
-
- <para><link linkend="hw-storage-hp35470a">HP 35470A</link></para>
-
- <para><link linkend="hw-storage-hp35480a">HP 35480A</link></para>
-
- <para><link linkend="hw-storage-sdt5000">SDT-5000</link></para>
-
- <para><link linkend="hw-storage-wangtek6200">Wangtek
- 6200</link></para>
- </sect3>
-
- <sect3>
- <title>8mm (Exabyte)</title>
-
- <para><link linkend="hw-storage-exb8200">EXB-8200</link></para>
-
- <para><link linkend="hw-storage-exb8500">EXB-8500</link></para>
-
- <para><link linkend="hw-storage-exb8505">EXB-8505</link></para>
- </sect3>
-
- <sect3>
- <title>QIC (Quarter-Inch Cartridge)</title>
-
- <para><link linkend="hw-storage-anaconda">Archive Anaconda
- 2750</link></para>
-
- <para><link linkend="hw-storage-viper60">Archive Viper
- 60</link></para>
-
- <para><link linkend="hw-storage-viper150">Archive Viper
- 150</link></para>
-
- <para><link linkend="hw-storage-viper2525">Archive Viper
- 2525</link></para>
-
- <para><link linkend="hw-storage-tandberg3600">Tandberg TDC
- 3600</link></para>
-
- <para><link linkend="hw-storage-tandberg3620">Tandberg TDC
- 3620</link></para>
-
- <para><link linkend="hw-storage-tandberg3800">Tandberg TDC
- 3800</link></para>
-
- <para><link linkend="hw-storage-tandberg4222">Tandberg TDC
- 4222</link></para>
-
- <para><link linkend="hw-storage-wangtek5525es">Wangtek
- 5525ES</link></para>
- </sect3>
-
- <sect3>
- <title>DLT (Digital Linear Tape)</title>
-
- <para><link linkend="hw-storage-dectz87">Digital TZ87</link></para>
- </sect3>
-
- <sect3>
- <title>Mini-Cartridge</title>
-
- <para><link linkend="hw-storage-ctms3200">Conner CTMS
- 3200</link></para>
-
- <para><link linkend="hw-storage-exb2501">Exabyte 2501</link></para>
- </sect3>
-
- <sect3>
- <title>Autoloaders/Changers</title>
-
- <para><link linkend="hw-storage-hp1553a">Hewlett-Packard HP C1553A
- Autoloading DDS2</link></para>
- </sect3>
- </sect2>
-
- <sect2>
- <title>* IDE drives</title>
-
- <para></para>
- </sect2>
-
- <sect2>
- <title>Floppy drives</title>
-
- <para><link linkend="hw-storage-conner420r">Conner 420R</link></para>
- </sect2>
-
- <sect2>
- <title>* Parallel port drives</title>
-
- <para></para>
- </sect2>
-
- <sect2>
- <title>Detailed Information</title>
-
- <sect3 id="hw-storage-anaconda">
- <title>Archive Anaconda 2750</title>
-
- <para>The boot message identifier for this drive is <literal>ARCHIVE
- ANCDA 2750 28077 -003 type 1 removable SCSI 2</literal></para>
-
- <para>This is a QIC tape drive.</para>
-
- <para>Native capacity is 1.35GB when using QIC-1350 tapes. This
- drive will read and write QIC-150 (DC6150), QIC-250 (DC6250), and
- QIC-525 (DC6525) tapes as well.</para>
-
- <para>Data transfer rate is 350kB/s using &man.dump.8;.
- Rates of 530kB/s have been reported when using
- Amanda</para>
-
- <para>Production of this drive has been discontinued.</para>
-
- <para>The SCSI bus connector on this tape drive is reversed from
- that on most other SCSI devices. Make sure that you have enough
- SCSI cable to twist the cable one-half turn before and after the
- Archive Anaconda tape drive, or turn your other SCSI devices
- upside-down.</para>
-
- <para>Two kernel code changes are required to use this drive. This
- drive will not work as delivered.</para>
-
- <para>If you have a SCSI-2 controller, short jumper 6. Otherwise,
- the drive behaves are a SCSI-1 device. When operating as a SCSI-1
- device, this drive, <quote>locks</quote> the SCSI bus during some
- tape operations, including: fsf, rewind, and rewoffl.</para>
-
- <para>If you are using the NCR SCSI controllers, patch the file
- <filename>/usr/src/sys/pci/ncr.c</filename> (as shown below).
- Build and install a new kernel.</para>
-
- <programlisting>*** 4831,4835 ****
- };
-
-! if (np-&gt;latetime&gt;4) {
- /*
- ** Although we tried to wake it up,
---- 4831,4836 ----
- };
-
-! if (np-&gt;latetime&gt;1200) {
- /*
- ** Although we tried to wake it up,</programlisting>
-
- <para>Reported by: &a.jmb;</para>
- </sect3>
-
- <sect3 id="hw-storage-python-28454">
- <title>Archive Python 28454</title>
-
- <para>The boot message identifier for this drive is <literal>ARCHIVE
- Python 28454-XXX4ASB</literal> <literal>type 1 removable SCSI
- 2</literal> <literal>density code 0x8c, 512-byte
- blocks</literal></para>
-
- <para>This is a DDS-1 tape drive.</para>
-
- <para>Native capacity is 2.5GB on 90m tapes.</para>
-
- <para>Data transfer rate is XXX.</para>
-
- <para>This drive was repackaged by Sun Microsystems as model
- 595-3067.</para>
-
- <para>Reported by: Bob Bishop <email>rb@gid.co.uk</email></para>
-
- <para>Throughput is in the 1.5 MByte/sec range, however this will
- drop if the disks and tape drive are on the same SCSI
- controller.</para>
-
- <para>Reported by: Robert E. Seastrom
- <email>rs@seastrom.com</email></para>
- </sect3>
-
- <sect3 id="hw-storage-python-04687">
- <title>Archive Python 04687</title>
-
- <para>The boot message identifier for this drive is <literal>ARCHIVE
- Python 04687-XXX 6580</literal> <literal>Removable Sequential
- Access SCSI-2 device</literal></para>
-
- <para>This is a DAT-DDS-2 drive.</para>
-
- <para>Native capacity is 4GB when using 120m tapes.</para>
-
- <para>This drive supports hardware data compression. Switch 4
- controls MRS (Media Recognition System). MRS tapes have stripes
- on the transparent leader. Switch 4 <emphasis>off</emphasis>
- enables MRS, <emphasis>on</emphasis> disables MRS.</para>
-
- <para>Parity is controlled by switch 5. Switch 5
- <emphasis>on</emphasis> to enable parity control. Compression is
- enabled with Switch 6 <emphasis>off</emphasis>. It is possible to
- override compression with the <literal>SCSI MODE SELECT</literal>
- command (see &man.mt.1;).</para>
-
- <para>Data transfer rate is 800kB/s.</para>
- </sect3>
-
- <sect3 id="hw-storage-viper60">
- <title>Archive Viper 60</title>
-
- <para>The boot message identifier for this drive is <literal>ARCHIVE
- VIPER 60 21116 -007</literal> <literal>type 1 removable SCSI
- 1</literal></para>
-
- <para>This is a QIC tape drive.</para>
-
- <para>Native capacity is 60MB.</para>
-
- <para>Data transfer rate is XXX.</para>
-
- <para>Production of this drive has been discontinued.</para>
-
- <para>Reported by: Philippe Regnauld
- <email>regnauld@hsc.fr</email></para>
- </sect3>
-
- <sect3 id="hw-storage-viper150">
- <title>Archive Viper 150</title>
-
- <para>The boot message identifier for this drive is <literal>ARCHIVE
- VIPER 150 21531 -004</literal> <literal>Archive Viper 150 is a
- known rogue</literal> <literal>type 1 removable SCSI
- 1</literal>. A multitude of firmware revisions exist for this
- drive. Your drive may report different numbers (e.g
- <literal>21247 -005</literal>.</para>
-
- <para>This is a QIC tape drive.</para>
-
- <para>Native capacity is 150/250MB. Both 150MB (DC6150) and 250MB
- (DC6250) tapes have the recording format. The 250MB tapes are
- approximately 67% longer than the 150MB tapes. This drive can
- read 120MB tapes as well. It can not write 120MB tapes.</para>
-
- <para>Data transfer rate is 100kB/s</para>
-
- <para>This drive reads and writes DC6150 (150MB) and DC6250 (250MB)
- tapes.</para>
-
- <para>This drives quirks are known and pre-compiled into the scsi
- tape device driver (&man.st.4;).</para>
-
- <para>Under FreeBSD 2.2-CURRENT, use <command>mt blocksize
- 512</command> to set the blocksize. (The particular drive had
- firmware revision 21247 -005. Other firmware revisions may behave
- differently) Previous versions of FreeBSD did not have this
- problem.</para>
-
- <para>Production of this drive has been discontinued.</para>
-
- <para>Reported by: Pedro A M Vazquez
- <email>vazquez@IQM.Unicamp.BR</email></para>
-
- <para>&a.msmith;</para>
- </sect3>
-
- <sect3 id="hw-storage-viper2525">
- <title>Archive Viper 2525</title>
-
- <para>The boot message identifier for this drive is <literal>ARCHIVE
- VIPER 2525 25462 -011</literal> <literal>type 1 removable SCSI
- 1</literal></para>
-
- <para>This is a QIC tape drive.</para>
-
- <para>Native capacity is 525MB.</para>
-
- <para>Data transfer rate is 180kB/s at 90 inches/sec.</para>
-
- <para>The drive reads QIC-525, QIC-150, QIC-120 and QIC-24 tapes.
- Writes QIC-525, QIC-150, and QIC-120.</para>
-
- <para>Firmware revisions prior to <literal>25462 -011</literal> are
- bug ridden and will not function properly.</para>
-
- <para>Production of this drive has been discontinued.</para>
- </sect3>
-
- <sect3 id="hw-storage-conner420r">
- <title>Conner 420R</title>
-
- <para>The boot message identifier for this drive is <literal>Conner
- tape</literal>.</para>
-
- <para>This is a floppy controller, mini cartridge tape drive.</para>
-
- <para>Native capacity is XXXX</para>
-
- <para>Data transfer rate is XXX</para>
-
- <para>The drive uses QIC-80 tape cartridges.</para>
-
- <para>Reported by: Mark Hannon
- <email>mark@seeware.DIALix.oz.au</email></para>
- </sect3>
-
- <sect3 id="hw-storage-ctms3200">
- <title>Conner CTMS 3200</title>
-
- <para>The boot message identifier for this drive is <literal>CONNER
- CTMS 3200 7.00</literal> <literal>type 1 removable SCSI
- 2</literal>.</para>
-
- <para>This is a mini cartridge tape drive.</para>
-
- <para>Native capacity is XXXX</para>
-
- <para>Data transfer rate is XXX</para>
-
- <para>The drive uses QIC-3080 tape cartridges.</para>
-
- <para>Reported by: Thomas S. Traylor
- <email>tst@titan.cs.mci.com</email></para>
- </sect3>
-
- <sect3 id="hw-storage-dectz87">
- <title><ulink
- url="http://www.digital.com/info/Customer-Update/931206004.txt.html">DEC TZ87</ulink></title>
-
- <para>The boot message identifier for this drive is <literal>DEC
- TZ87 (C) DEC 9206</literal> <literal>type 1 removable SCSI
- 2</literal> <literal>density code 0x19</literal></para>
-
- <para>This is a DLT tape drive.</para>
-
- <para>Native capacity is 10GB.</para>
-
- <para>This drive supports hardware data compression.</para>
-
- <para>Data transfer rate is 1.2MB/s.</para>
-
- <para>This drive is identical to the Quantum DLT2000. The drive
- firmware can be set to emulate several well-known drives,
- including an Exabyte 8mm drive.</para>
-
- <para>Reported by: &a.wilko;</para>
- </sect3>
-
- <sect3 id="hw-storage-exb2501">
- <title><ulink
- url="http://www.Exabyte.COM:80/Products/Minicartridge/2501/Rfeatures.html">Exabyte EXB-2501</ulink></title>
-
- <para>The boot message identifier for this drive is <literal>EXABYTE
- EXB-2501</literal></para>
-
- <para>This is a mini-cartridge tape drive.</para>
-
- <para>Native capacity is 1GB when using MC3000XL
- mini cartridges.</para>
-
- <para>Data transfer rate is XXX</para>
-
- <para>This drive can read and write DC2300 (550MB), DC2750 (750MB),
- MC3000 (750MB), and MC3000XL (1GB) mini cartridges.</para>
-
- <para>WARNING: This drive does not meet the SCSI-2 specifications.
- The drive locks up completely in response to a SCSI MODE_SELECT
- command unless there is a formatted tape in the drive. Before
- using this drive, set the tape blocksize with</para>
-
- <screen>&prompt.root; <userinput>mt -f /dev/st0ctl.0 blocksize 1024</userinput></screen>
-
- <para>Before using a mini cartridge for the first time, the
- mini cartridge must be formated. FreeBSD 2.1.0-RELEASE and
- earlier:</para>
-
- <screen>&prompt.root; <userinput>/sbin/scsi -f /dev/rst0.ctl -s 600 -c "4 0 0 0 0 0"</userinput></screen>
-
- <para>(Alternatively, fetch a copy of the
- <command>scsiformat</command> shell script from FreeBSD
- 2.1.5/2.2.) FreeBSD 2.1.5 and later:</para>
-
- <screen>&prompt.root; <userinput>/sbin/scsiformat -q -w /dev/rst0.ctl</userinput></screen>
-
- <para>Right now, this drive cannot really be recommended for
- FreeBSD.</para>
-
- <para>Reported by: Bob Beaulieu
- <email>ez@eztravel.com</email></para>
- </sect3>
-
- <sect3 id="hw-storage-exb8200">
- <title>Exabyte EXB-8200</title>
-
- <para>The boot message identifier for this drive is <literal>EXABYTE
- EXB-8200 252X</literal> <literal>type 1 removable SCSI
- 1</literal></para>
-
- <para>This is an 8mm tape drive.</para>
-
- <para>Native capacity is 2.3GB.</para>
-
- <para>Data transfer rate is 270kB/s.</para>
-
- <para>This drive is fairly slow in responding to the SCSI bus during
- boot. A custom kernel may be required (set SCSI_DELAY to 10
- seconds).</para>
-
- <para>There are a large number of firmware configurations for this
- drive, some have been customized to a particular vendor's
- hardware. The firmware can be changed via EPROM
- replacement.</para>
-
- <para>Production of this drive has been discontinued.</para>
-
- <para>Reported by: &a.msmith;</para>
- </sect3>
-
- <sect3 id="hw-storage-exb8500">
- <title>Exabyte EXB-8500</title>
-
- <para>The boot message identifier for this drive is <literal>EXABYTE
- EXB-8500-85Qanx0 0415</literal> <literal>type 1 removable SCSI
- 2</literal></para>
-
- <para>This is an 8mm tape drive.</para>
-
- <para>Native capacity is 5GB.</para>
-
- <para>Data transfer rate is 300kB/s.</para>
-
- <para>Reported by: Greg Lehey <email>grog@lemis.de</email></para>
- </sect3>
-
- <sect3 id="hw-storage-exb8505">
- <title><ulink
- url="http://www.Exabyte.COM:80/Products/8mm/8505XL/Rfeatures.html">Exabyte EXB-8505</ulink></title>
-
- <para>The boot message identifier for this drive is
- <literal>EXABYTE EXB-85058SQANXR1 05B0</literal> <literal>type 1
- removable SCSI 2</literal></para>
-
- <para>This is an 8mm tape drive which supports compression, and is
- upward compatible with the EXB-5200 and EXB-8500.</para>
-
- <para>Native capacity is 5GB.</para>
-
- <para>The drive supports hardware data compression.</para>
-
- <para>Data transfer rate is 300kB/s.</para>
-
- <para>Reported by: Glen Foster
- <email>gfoster@gfoster.com</email></para>
- </sect3>
-
- <sect3 id="hw-storage-hp1533a">
- <title>Hewlett-Packard HP C1533A</title>
-
- <para>The boot message identifier for this drive is <literal>HP
- C1533A 9503</literal> <literal>type 1 removable SCSI
- 2</literal>.</para>
-
- <para>This is a DDS-2 tape drive. DDS-2 means hardware data
- compression and narrower tracks for increased data
- capacity.</para>
-
- <para>Native capacity is 4GB when using 120m tapes. This drive
- supports hardware data compression.</para>
-
- <para>Data transfer rate is 510kB/s.</para>
-
- <para>This drive is used in Hewlett-Packard's SureStore 6000eU and
- 6000i tape drives and C1533A DDS-2 DAT drive.</para>
-
- <para>The drive has a block of 8 dip switches. The proper settings
- for FreeBSD are: 1 ON; 2 ON; 3 OFF; 4 ON; 5 ON; 6 ON; 7 ON; 8
- ON.</para>
-
- <informaltable frame="none">
- <tgroup cols="3">
- <thead>
- <row>
- <entry>switch 1</entry>
- <entry>switch 2</entry>
- <entry>Result</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>On</entry>
- <entry>On</entry>
- <entry>Compression enabled at power-on, with host
- control</entry>
- </row>
-
- <row>
- <entry>On</entry>
- <entry>Off</entry>
- <entry>Compression enabled at power-on, no host
- control</entry>
- </row>
-
- <row>
- <entry>Off</entry>
- <entry>On</entry>
- <entry>Compression disabled at power-on, with host
- control</entry>
- </row>
-
- <row>
- <entry>Off</entry>
- <entry>Off</entry>
- <entry>Compression disabled at power-on, no host
- control</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <para>Switch 3 controls MRS (Media Recognition System). MRS tapes
- have stripes on the transparent leader. These identify the tape
- as DDS (Digital Data Storage) grade media. Tapes that do not have
- the stripes will be treated as write-protected. Switch 3 OFF
- enables MRS. Switch 3 ON disables MRS.</para>
-
- <para>See <ulink url="http://www.hp.com/tape/c_intro.html">HP
- SureStore Tape Products</ulink> and <ulink
- url="http://www.impediment.com/hp/hp_technical.html">Hewlett-Packard
- Disk and Tape Technical Information</ulink> for more information
- on configuring this drive.</para>
-
- <para><emphasis>Warning:</emphasis> Quality control on these drives
- varies greatly. One FreeBSD core-team member has returned 2 of
- these drives. Neither lasted more than 5 months.</para>
-
- <para>Reported by: &a.se;</para>
- </sect3>
-
- <sect3 id="hw-storage-hp1534a">
- <title>Hewlett-Packard HP 1534A</title>
-
- <para>The boot message identifier for this drive is <literal>HP
- HP35470A T503</literal> <literal>type 1 removable SCSI
- 2</literal> <literal>Sequential-Access density code 0x13,
- variable blocks</literal>.</para>
-
- <para>This is a DDS-1 tape drive. DDS-1 is the original DAT tape
- format.</para>
-
- <para>Native capacity is 2GB when using 90m tapes.</para>
-
- <para>Data transfer rate is 183kB/s.</para>
-
- <para>The same mechanism is used in Hewlett-Packard's SureStore
- <ulink url="http://www.dmo.hp.com/tape/sst2000.htm">2000i</ulink>
- tape drive, C35470A DDS format DAT drive, C1534A DDS format DAT
- drive and HP C1536A DDS format DAT drive.</para>
-
- <para>The HP C1534A DDS format DAT drive has two indicator lights,
- one green and one amber. The green one indicates tape action:
- slow flash during load, steady when loaded, fast flash during
- read/write operations. The amber one indicates warnings: slow
- flash when cleaning is required or tape is nearing the end of its
- useful life, steady indicates an hard fault. (factory service
- required?)</para>
-
- <para>Reported by Gary Crutcher
- <email>gcrutchr@nightflight.com</email></para>
- </sect3>
-
- <sect3 id="hw-storage-hp1553a">
- <title>Hewlett-Packard HP C1553A Autoloading DDS2</title>
-
- <para>The boot message identifier for this drive is "".</para>
-
- <para>This is a DDS-2 tape drive with a tape changer. DDS-2 means
- hardware data compression and narrower tracks for increased data
- capacity.</para>
-
- <para>Native capacity is 24GB when using 120m tapes. This drive
- supports hardware data compression.</para>
-
- <para>Data transfer rate is 510kB/s (native).</para>
-
- <para>This drive is used in Hewlett-Packard's SureStore <ulink
- url="http://www.dmo.hp.com/tape/sst12000.htm">12000e</ulink>
- tape drive.</para>
-
- <para>The drive has two selectors on the rear panel. The selector
- closer to the fan is SCSI id. The other selector should be set to
- 7.</para>
-
- <para>There are four internal switches. These should be set: 1 ON;
- 2 ON; 3 ON; 4 OFF.</para>
-
- <para>At present the kernel drivers do not automatically change
- tapes at the end of a volume. This shell script can be used to
- change tapes:</para>
-
- <programlisting>#!/bin/sh
-PATH="/sbin:/usr/sbin:/bin:/usr/bin"; export PATH
-
-usage()
-{
- echo "Usage: dds_changer [123456ne] raw-device-name
- echo "1..6 = Select cartridge"
- echo "next cartridge"
- echo "eject magazine"
- exit 2
-}
-
-if [ $# -ne 2 ] ; then
- usage
-fi
-
-cdb3=0
-cdb4=0
-cdb5=0
-
-case $1 in
- [123456])
- cdb3=$1
- cdb4=1
- ;;
- n)
- ;;
- e)
- cdb5=0x80
- ;;
- ?)
- usage
- ;;
-esac
-
-scsi -f $2 -s 100 -c "1b 0 0 $cdb3 $cdb4 $cdb5"</programlisting>
- </sect3>
-
- <sect3 id="hw-storage-hp35450a">
- <title>Hewlett-Packard HP 35450A</title>
-
- <para>The boot message identifier for this drive is <literal>HP
- HP35450A -A C620</literal> <literal>type 1 removable SCSI
- 2</literal> <literal>Sequential-Access density code
- 0x13</literal></para>
-
- <para>This is a DDS-1 tape drive. DDS-1 is the original DAT tape
- format.</para>
-
- <para>Native capacity is 1.2GB.</para>
-
- <para>Data transfer rate is 160kB/s.</para>
-
- <para>Reported by: Mark Thompson
- <email>mark.a.thompson@pobox.com</email></para>
- </sect3>
-
- <sect3 id="hw-storage-hp35470a">
- <title>Hewlett-Packard HP 35470A</title>
-
- <para>The boot message identifier for this drive is <literal>HP
- HP35470A 9 09</literal> <literal>type 1 removable SCSI
- 2</literal></para>
-
- <para>This is a DDS-1 tape drive. DDS-1 is the original DAT tape
- format.</para>
-
- <para>Native capacity is 2GB when using 90m tapes.</para>
-
- <para>Data transfer rate is 183kB/s.</para>
-
- <para>The same mechanism is used in Hewlett-Packard's SureStore
- <ulink url="http://www.dmo.hp.com/tape/sst2000.htm">2000i</ulink>
- tape drive, C35470A DDS format DAT drive, C1534A DDS format DAT
- drive, and HP C1536A DDS format DAT drive.</para>
-
- <para><emphasis>Warning:</emphasis> Quality control on these drives
- varies greatly. One FreeBSD core-team member has returned 5 of
- these drives. None lasted more than 9 months.</para>
-
- <para>Reported by: David Dawes
- <email>dawes@rf900.physics.usyd.edu.au</email> (9 09)</para>
-
- </sect3>
-
- <sect3 id="hw-storage-hp35480a">
- <title>Hewlett-Packard HP 35480A</title>
-
- <para>The boot message identifier for this drive is <literal>HP
- HP35480A 1009</literal> <literal>type 1 removable SCSI
- 2</literal> <literal>Sequential-Access density code
- 0x13</literal>.</para>
-
- <para>This is a DDS-DC tape drive. DDS-DC is DDS-1 with hardware
- data compression. DDS-1 is the original DAT tape format.</para>
-
- <para>Native capacity is 2GB when using 90m tapes. It cannot handle
- 120m tapes. This drive supports hardware data compression.
- Please refer to the section on <link
- linkend="hw-storage-hp1533a">HP C1533A</link> for the proper
- switch settings.</para>
-
- <para>Data transfer rate is 183kB/s.</para>
-
- <para>This drive is used in Hewlett-Packard's SureStore <ulink
- url="http://www.dmo.hp.com/tape/sst5000.htm">5000eU</ulink> and
- <ulink url="http://www.dmo.hp.com/tape/sst5000.htm">5000i</ulink>
- tape drives and C35480A DDS format DAT drive..</para>
-
- <para>This drive will occasionally hang during a tape eject
- operation (<command>mt offline</command>). Pressing the front
- panel button will eject the tape and bring the tape drive back to
- life.</para>
-
- <para>WARNING: HP 35480-03110 only. On at least two occasions this
- tape drive when used with FreeBSD 2.1.0, an IBM Server 320 and an
- 2940W SCSI controller resulted in all SCSI disk partitions being
- lost. The problem has not be analyzed or resolved at this
- time.</para>
- </sect3>
-
- <sect3 id="hw-storage-sdt5000">
- <title><ulink
- url="http://www.sel.sony.com/SEL/ccpg/storage/tape/t5000.html">Sony SDT-5000</ulink></title>
-
- <para>There are at least two significantly different models: one is
- a DDS-1 and the other DDS-2. The DDS-1 version is
- <literal>SDT-5000 3.02</literal>. The DDS-2 version is
- <literal>SONY SDT-5000 327M</literal>. The DDS-2 version has a 1MB
- cache. This cache is able to keep the tape streaming in almost
- any circumstances.</para>
-
- <para>The boot message identifier for this drive is <literal>SONY
- SDT-5000 3.02</literal> <literal>type 1 removable SCSI
- 2</literal> <literal>Sequential-Access density code
- 0x13</literal></para>
-
- <para>Native capacity is 4GB when using 120m tapes. This drive
- supports hardware data compression.</para>
-
- <para>Data transfer rate is depends upon the model or the drive. The
- rate is 630kB/s for the <literal>SONY SDT-5000 327M</literal>
- while compressing the data. For the <literal>SONY SDT-5000
- 3.02</literal>, the data transfer rate is 225kB/s.</para>
-
- <para>In order to get this drive to stream, set the blocksize to 512
- bytes (<command>mt blocksize 512</command>) reported by Kenneth
- Merry <email>ken@ulc199.residence.gatech.edu</email>.</para>
-
- <para><literal>SONY SDT-5000 327M</literal> information reported by
- Charles Henrich <email>henrich@msu.edu</email>.</para>
-
- <para>Reported by: &a.jmz;</para>
- </sect3>
-
- <sect3 id="hw-storage-tandberg3600">
- <title>Tandberg TDC 3600</title>
-
- <para>The boot message identifier for this drive is
- <literal>TANDBERG TDC 3600 =08:</literal> <literal>type 1
- removable SCSI 2</literal></para>
-
- <para>This is a QIC tape drive.</para>
-
- <para>Native capacity is 150/250MB.</para>
-
- <para>This drive has quirks which are known and work around code is
- present in the scsi tape device driver (&man.st.4;).
- Upgrading the firmware to XXX version will fix the quirks and
- provide SCSI 2 capabilities.</para>
-
- <para>Data transfer rate is 80kB/s.</para>
-
- <para>IBM and Emerald units will not work. Replacing the firmware
- EPROM of these units will solve the problem.</para>
-
- <para>Reported by: &a.msmith;</para>
- </sect3>
-
- <sect3 id="hw-storage-tandberg3620">
- <title>Tandberg TDC 3620</title>
-
- <para>This is very similar to the <link
- linkend="hw-storage-tandberg3600">Tandberg TDC 3600</link>
- drive.</para>
-
- <para>Reported by: &a.joerg;</para>
- </sect3>
-
- <sect3 id="hw-storage-tandberg3800">
- <title>Tandberg TDC 3800</title>
-
- <para>The boot message identifier for this drive is
- <literal>TANDBERG TDC 3800 =04Y</literal> <literal>Removable
- Sequential Access SCSI-2 device</literal></para>
-
- <para>This is a QIC tape drive.</para>
-
- <para>Native capacity is 525MB.</para>
-
- <para>Reported by: &a.jhs;</para>
- </sect3>
-
- <sect3 id="hw-storage-tandberg4222">
- <title>Tandberg TDC 4222</title>
-
- <para>The boot message identifier for this drive is
- <literal>TANDBERG TDC 4222 =07</literal> <literal>type 1 removable
- SCSI 2</literal></para>
-
- <para>This is a QIC tape drive.</para>
-
- <para>Native capacity is 2.5GB. The drive will read all cartridges
- from the 60 MB (DC600A) upwards, and write 150 MB (DC6150)
- upwards. Hardware compression is optionally supported for the 2.5
- GB cartridges.</para>
-
- <para>This drives quirks are known and pre-compiled into the scsi
- tape device driver (&man.st.4;) beginning with FreeBSD
- 2.2-CURRENT. For previous versions of FreeBSD, use
- <command>mt</command> to read one block from the tape, rewind the
- tape, and then execute the backup program (<command>mt fsr 1; mt
- rewind; dump ...</command>)</para>
-
- <para>Data transfer rate is 600kB/s (vendor claim with compression),
- 350 KB/s can even be reached in start/stop mode. The rate
- decreases for smaller cartridges.</para>
-
- <para>Reported by: &a.joerg;</para>
- </sect3>
-
- <sect3 id="hw-storage-wangtek5525es">
- <title>Wangtek 5525ES</title>
-
- <para>The boot message identifier for this drive is <literal>WANGTEK
- 5525ES SCSI REV7 3R1</literal> <literal>type 1 removable SCSI
- 1</literal> <literal>density code 0x11, 1024-byte
- blocks</literal></para>
-
- <para>This is a QIC tape drive.</para>
-
- <para>Native capacity is 525MB.</para>
-
- <para>Data transfer rate is 180kB/s.</para>
-
- <para>The drive reads 60, 120, 150, and 525MB tapes. The drive will
- not write 60MB (DC600 cartridge) tapes. In order to overwrite 120
- and 150 tapes reliably, first erase (<command>mt erase</command>)
- the tape. 120 and 150 tapes used a wider track (fewer tracks per
- tape) than 525MB tapes. The <quote>extra</quote> width of the
- previous tracks is not overwritten, as a result the new data lies
- in a band surrounded on both sides by the previous data unless the
- tape have been erased.</para>
-
- <para>This drives quirks are known and pre-compiled into the scsi
- tape device driver (&man.st.4;).</para>
-
- <para>Other firmware revisions that are known to work are:
- M75D</para>
-
- <para>Reported by: Marc van Kempen <email>marc@bowtie.nl</email>
- <literal>REV73R1</literal> Andrew Gordon
- <email>Andrew.Gordon@net-tel.co.uk</email>
- <literal>M75D</literal></para>
- </sect3>
-
- <sect3 id="hw-storage-wangtek6200">
- <title>Wangtek 6200</title>
-
- <para>The boot message identifier for this drive is <literal>WANGTEK
- 6200-HS 4B18</literal> <literal>type 1 removable SCSI
- 2</literal> <literal>Sequential-Access density code
- 0x13</literal></para>
-
- <para>This is a DDS-1 tape drive.</para>
-
- <para>Native capacity is 2GB using 90m tapes.</para>
-
- <para>Data transfer rate is 150kB/s.</para>
-
- <para>Reported by: Tony Kimball <email>alk@Think.COM</email></para>
- </sect3>
- </sect2>
-
- <sect2>
- <title>* Problem drives</title>
-
- <para></para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>CDROM drives</title>
-
- <para><emphasis>Contributed by &a.obrien;. 23 November
- 1997.</emphasis></para>
-
- <para>Generally speaking those in <emphasis>The FreeBSD
- Project</emphasis> prefer SCSI CDROM drives over IDE CDROM
- drives. However not all SCSI CDROM drives are equal. Some
- feel the quality of some SCSI CDROM drives have been
- deteriorating to that of IDE CDROM drives. Toshiba used to be
- the favored stand-by, but many on the SCSI mailing list have
- found displeasure with the 12x speed XM-5701TA as its volume
- (when playing audio CDROMs) is not controllable by the various
- audio player software.</para>
-
- <para>Another area where SCSI CDROM manufacturers are cutting corners is
- adherence to the <link linkend="scsi-further-reading">SCSI
- specification</link>. Many SCSI CDROMs will respond to <link
- linkend="scsi-rogue-devices">multiple LUNs</link> for its target
- address. Known violators include the 6x Teac CD-56S 1.0D.</para>
- </sect1>
-
-</article> \ No newline at end of file
diff --git a/en_US.ISO8859-1/articles/vm-design/Makefile b/en_US.ISO8859-1/articles/vm-design/Makefile
deleted file mode 100644
index 6758b4073a..0000000000
--- a/en_US.ISO8859-1/articles/vm-design/Makefile
+++ /dev/null
@@ -1,16 +0,0 @@
-# $FreeBSD: doc/en_US.ISO_8859-1/articles/mh/Makefile,v 1.8 1999/09/06 06:52:37 peter Exp $
-
-DOC?= article
-
-FORMATS?= html
-
-IMAGES= fig1.eps fig2.eps fig3.eps fig4.eps
-
-INSTALL_COMPRESSED?=gz
-INSTALL_ONLY_COMPRESSED?=
-
-SRCS= article.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/vm-design/article.sgml b/en_US.ISO8859-1/articles/vm-design/article.sgml
deleted file mode 100644
index 78cfdf1c57..0000000000
--- a/en_US.ISO8859-1/articles/vm-design/article.sgml
+++ /dev/null
@@ -1,838 +0,0 @@
-<!-- $FreeBSD: doc/en_US.ISO8859-1/articles/vm-design/article.sgml,v 1.6 2001/07/17 20:51:49 chern Exp $ -->
-<!-- FreeBSD Documentation Project -->
-
-<!DOCTYPE ARTICLE PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man;
-]>
-
-<article>
- <articleinfo>
- <title>Design elements of the FreeBSD VM system</title>
-
- <authorgroup>
- <author>
- <firstname>Matthew</firstname>
-
- <surname>Dillon</surname>
-
- <affiliation>
- <address>
- <email>dillon@apollo.backplane.com</email>
- </address>
- </affiliation>
- </author>
- </authorgroup>
-
- <abstract>
- <para>The title is really just a fancy way of saying that I am going to
- attempt to describe the whole VM enchilada, hopefully in a way that
- everyone can follow. For the last year I have concentrated on a number
- of major kernel subsystems within FreeBSD, with the VM and Swap
- subsystems being the most interesting and NFS being <quote>a necessary
- chore</quote>. I rewrote only small portions of the code. In the VM
- arena the only major rewrite I have done is to the swap subsystem.
- Most of my work was cleanup and maintenance, with only moderate code
- rewriting and no major algorithmic adjustments within the VM
- subsystem. The bulk of the VM subsystem's theoretical base remains
- unchanged and a lot of the credit for the modernization effort in the
- last few years belongs to John Dyson and David Greenman. Not being a
- historian like Kirk I will not attempt to tag all the various features
- with peoples names, since I will invariably get it wrong.</para>
- </abstract>
-
- <legalnotice>
- <para>This article was originally published in the January 2000 issue of
- <ulink url="http://www.daemonnews.org/">DaemonNews</ulink>. This
- version of the article may include updates from Matt and other authors
- to reflect changes in FreeBSD's VM implementation.</para>
- </legalnotice>
- </articleinfo>
-
- <sect1>
- <title>Introduction</title>
-
- <para>Before moving along to the actual design let's spend a little time
- on the necessity of maintaining and modernizing any long-living
- codebase. In the programming world, algorithms tend to be more
- important than code and it is precisely due to BSD's academic roots that
- a great deal of attention was paid to algorithm design from the
- beginning. More attention paid to the design generally leads to a clean
- and flexible codebase that can be fairly easily modified, extended, or
- replaced over time. While BSD is considered an <quote>old</quote>
- operating system by some people, those of us who work on it tend to view
- it more as a <quote>mature</quote> codebase which has various components
- modified, extended, or replaced with modern code. It has evolved, and
- FreeBSD is at the bleeding edge no matter how old some of the code might
- be. This is an important distinction to make and one that is
- unfortunately lost to many people. The biggest error a programmer can
- make is to not learn from history, and this is precisely the error that
- many other modern operating systems have made. NT is the best example
- of this, and the consequences have been dire. Linux also makes this
- mistake to some degree&mdash;enough that we BSD folk can make small
- jokes about it every once in a while, anyway. Linux's problem is simply
- one of a lack of experience and history to compare ideas against, a
- problem that is easily and rapidly being addressed by the Linux
- community in the same way it has been addressed in the BSD
- community&mdash;by continuous code development. The NT folk, on the
- other hand, repeatedly make the same mistakes solved by Unix decades ago
- and then spend years fixing them. Over and over again. They have a
- severe case of <quote>not designed here</quote> and <quote>we are always
- right because our marketing department says so</quote>. I have little
- tolerance for anyone who cannot learn from history.</para>
-
- <para>Much of the apparent complexity of the FreeBSD design, especially in
- the VM/Swap subsystem, is a direct result of having to solve serious
- performance issues that occur under various conditions. These issues
- are not due to bad algorithmic design but instead rise from
- environmental factors. In any direct comparison between platforms,
- these issues become most apparent when system resources begin to get
- stressed. As I describe FreeBSD's VM/Swap subsystem the reader should
- always keep two points in mind. First, the most important aspect of
- performance design is what is known as <quote>Optimizing the Critical
- Path</quote>. It is often the case that performance optimizations add a
- little bloat to the code in order to make the critical path perform
- better. Second, a solid, generalized design outperforms a
- heavily-optimized design over the long run. While a generalized design
- may end up being slower than an heavily-optimized design when they are
- first implemented, the generalized design tends to be easier to adapt to
- changing conditions and the heavily-optimized design winds up having to
- be thrown away. Any codebase that will survive and be maintainable for
- years must therefore be designed properly from the beginning even if it
- costs some performance. Twenty years ago people were still arguing that
- programming in assembly was better than programming in a high-level
- language because it produced code that was ten times as fast. Today,
- the fallibility of that argument is obvious&mdash;as are the parallels
- to algorithmic design and code generalization.</para>
- </sect1>
-
- <sect1>
- <title>VM Objects</title>
-
- <para>The best way to begin describing the FreeBSD VM system is to look at
- it from the perspective of a user-level process. Each user process sees
- a single, private, contiguous VM address space containing several types
- of memory objects. These objects have various characteristics. Program
- code and program data are effectively a single memory-mapped file (the
- binary file being run), but program code is read-only while program data
- is copy-on-write. Program BSS is just memory allocated and filled with
- zeros on demand, called demand zero page fill. Arbitrary files can be
- memory-mapped into the address space as well, which is how the shared
- library mechanism works. Such mappings can require modifications to
- remain private to the process making them. The fork system call adds an
- entirely new dimension to the VM management problem on top of the
- complexity already given.</para>
-
- <para>A program binary data page (which is a basic copy-on-write page)
- illustrates the complexity. A program binary contains a preinitialized
- data section which is initially mapped directly from the program file.
- When a program is loaded into a process's VM space, this area is
- initially memory-mapped and backed by the program binary itself,
- allowing the VM system to free/reuse the page and later load it back in
- from the binary. The moment a process modifies this data, however, the
- VM system must make a private copy of the page for that process. Since
- the private copy has been modified, the VM system may no longer free it,
- because there is no longer any way to restore it later on.</para>
-
- <para>You will notice immediately that what was originally a simple file
- mapping has become much more complex. Data may be modified on a
- page-by-page basis whereas the file mapping encompasses many pages at
- once. The complexity further increases when a process forks. When a
- process forks, the result is two processes&mdash;each with their own
- private address spaces, including any modifications made by the original
- process prior to the call to <function>fork()</function>. It would be
- silly for the VM system to make a complete copy of the data at the time
- of the <function>fork()</function> because it is quite possible that at
- least one of the two processes will only need to read from that page
- from then on, allowing the original page to continue to be used. What
- was a private page is made copy-on-write again, since each process
- (parent and child) expects their own personal post-fork modifications to
- remain private to themselves and not effect the other.</para>
-
- <para>FreeBSD manages all of this with a layered VM Object model. The
- original binary program file winds up being the lowest VM Object layer.
- A copy-on-write layer is pushed on top of that to hold those pages which
- had to be copied from the original file. If the program modifies a data
- page belonging to the original file the VM system takes a fault and
- makes a copy of the page in the higher layer. When a process forks,
- additional VM Object layers are pushed on. This might make a little
- more sense with a fairly basic example. A <function>fork()</function>
- is a common operation for any *BSD system, so this example will consider
- a program that starts up, and forks. When the process starts, the VM
- system creates an object layer, let's call this A:</para>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="fig1" format="EPS">
- </imageobject>
-
- <textobject>
- <literallayout class="monospaced">+---------------+
-| A |
-+---------------+</literallayout>
- </textobject>
-
- <textobject>
- <phrase>A picture</phrase>
- </textobject>
- </mediaobject>
-
- <para>A represents the file&mdash;pages may be paged in and out of the
- file's physical media as necessary. Paging in from the disk is
- reasonable for a program, but we really don't want to page back out and
- overwrite the executable. The VM system therefore creates a second
- layer, B, that will be physically backed by swap space:</para>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="fig2" format="EPS">
- </imageobject>
-
- <textobject>
- <literallayout class="monospaced">+---------------+
-| B |
-+---------------+
-| A |
-+---------------+</literallayout>
- </textobject>
- </mediaobject>
-
- <para>On the first write to a page after this, a new page is created in B,
- and its contents are initialized from A. All pages in B can be paged in
- or out to a swap device. When the program forks, the VM system creates
- two new object layers&mdash;C1 for the parent, and C2 for the
- child&mdash;that rest on top of B:</para>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="fig3" format="EPS">
- </imageobject>
-
- <textobject>
- <literallayout class="monospaced">+-------+-------+
-| C1 | C2 |
-+-------+-------+
-| B |
-+---------------+
-| A |
-+---------------+</literallayout>
- </textobject>
- </mediaobject>
-
- <para>In this case, let's say a page in B is modified by the original
- parent process. The process will take a copy-on-write fault and
- duplicate the page in C1, leaving the original page in B untouched.
- Now, let's say the same page in B is modified by the child process. The
- process will take a copy-on-write fault and duplicate the page in C2.
- The original page in B is now completely hidden since both C1 and C2
- have a copy and B could theoretically be destroyed if it does not
- represent a 'real' file). However, this sort of optimization is not
- trivial to make because it is so fine-grained. FreeBSD does not make
- this optimization. Now, suppose (as is often the case) that the child
- process does an <function>exec()</function>. Its current address space
- is usually replaced by a new address space representing a new file. In
- this case, the C2 layer is destroyed:</para>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="fig4" format="EPS">
- </imageobject>
-
- <textobject>
- <literallayout class="monospaced">+-------+
-| C1 |
-+-------+-------+
-| B |
-+---------------+
-| A |
-+---------------+</literallayout>
- </textobject>
- </mediaobject>
-
- <para>In this case, the number of children of B drops to one, and all
- accesses to B now go through C1. This means that B and C1 can be
- collapsed together. Any pages in B that also exist in C1 are deleted
- from B during the collapse. Thus, even though the optimization in the
- previous step could not be made, we can recover the dead pages when
- either of the processes exit or <function>exec()</function>.</para>
-
- <para>This model creates a number of potential problems. The first is that
- you can wind up with a relatively deep stack of layered VM Objects which
- can cost scanning time and memory when you take a fault. Deep
- layering can occur when processes fork and then fork again (either
- parent or child). The second problem is that you can wind up with dead,
- inaccessible pages deep in the stack of VM Objects. In our last example
- if both the parent and child processes modify the same page, they both
- get their own private copies of the page and the original page in B is
- no longer accessible by anyone. That page in B can be freed.</para>
-
- <para>FreeBSD solves the deep layering problem with a special optimization
- called the <quote>All Shadowed Case</quote>. This case occurs if either
- C1 or C2 take sufficient COW faults to completely shadow all pages in B.
- Lets say that C1 achieves this. C1 can now bypass B entirely, so rather
- then have C1->B->A and C2->B->A we now have C1->A and C2->B->A. But
- look what also happened&mdash;now B has only one reference (C2), so we
- can collapse B and C2 together. The end result is that B is deleted
- entirely and we have C1->A and C2->A. It is often the case that B will
- contain a large number of pages and neither C1 nor C2 will be able to
- completely overshadow it. If we fork again and create a set of D
- layers, however, it is much more likely that one of the D layers will
- eventually be able to completely overshadow the much smaller dataset
- represented by C1 or C2. The same optimization will work at any point in
- the graph and the grand result of this is that even on a heavily forked
- machine VM Object stacks tend to not get much deeper then 4. This is
- true of both the parent and the children and true whether the parent is
- doing the forking or whether the children cascade forks.</para>
-
- <para>The dead page problem still exists in the case where C1 or C2 do not
- completely overshadow B. Due to our other optimizations this case does
- not represent much of a problem and we simply allow the pages to be
- dead. If the system runs low on memory it will swap them out, eating a
- little swap, but that's it.</para>
-
- <para>The advantage to the VM Object model is that
- <function>fork()</function> is extremely fast, since no real data
- copying need take place. The disadvantage is that you can build a
- relatively complex VM Object layering that slows page fault handling
- down a little, and you spend memory managing the VM Object structures.
- The optimizations FreeBSD makes proves to reduce the problems enough
- that they can be ignored, leaving no real disadvantage.</para>
- </sect1>
-
- <sect1>
- <title>SWAP Layers</title>
-
- <para>Private data pages are initially either copy-on-write or zero-fill
- pages. When a change, and therefore a copy, is made, the original
- backing object (usually a file) can no longer be used to save a copy of
- the page when the VM system needs to reuse it for other purposes. This
- is where SWAP comes in. SWAP is allocated to create backing store for
- memory that does not otherwise have it. FreeBSD allocates the swap
- management structure for a VM Object only when it is actually needed.
- However, the swap management structure has had problems
- historically.</para>
-
- <para>Under FreeBSD 3.x the swap management structure preallocates an
- array that encompasses the entire object requiring swap backing
- store&mdash;even if only a few pages of that object are swap-backed.
- This creates a kernel memory fragmentation problem when large objects
- are mapped, or processes with large runsizes (RSS) fork. Also, in order
- to keep track of swap space, a <quote>list of holes</quote> is kept in
- kernel memory, and this tends to get severely fragmented as well. Since
- the 'list of holes' is a linear list, the swap allocation and freeing
- performance is a non-optimal O(n)-per-page. It also requires kernel
- memory allocations to take place during the swap freeing process, and
- that creates low memory deadlock problems. The problem is further
- exacerbated by holes created due to the interleaving algorithm. Also,
- the swap block map can become fragmented fairly easily resulting in
- non-contiguous allocations. Kernel memory must also be allocated on the
- fly for additional swap management structures when a swapout occurs. It
- is evident that there was plenty of room for improvement.</para>
-
- <para>For FreeBSD 4.x, I completely rewrote the swap subsystem. With this
- rewrite, swap management structures are allocated through a hash table
- rather than a linear array giving them a fixed allocation size and much
- finer granularity. Rather then using a linearly linked list to keep
- track of swap space reservations, it now uses a bitmap of swap blocks
- arranged in a radix tree structure with free-space hinting in the radix
- node structures. This effectively makes swap allocation and freeing an
- O(1) operation. The entire radix tree bitmap is also preallocated in
- order to avoid having to allocate kernel memory during critical low
- memory swapping operations. After all, the system tends to swap when it
- is low on memory so we should avoid allocating kernel memory at such
- times in order to avoid potential deadlocks. Finally, to reduce
- fragmentation the radix tree is capable of allocating large contiguous
- chunks at once, skipping over smaller fragmented chunks. I did not take
- the final step of having an 'allocating hint pointer' that would trundle
- through a portion of swap as allocations were made in order to further
- guarantee contiguous allocations or at least locality of reference, but
- I ensured that such an addition could be made.</para>
- </sect1>
-
- <sect1>
- <title>When to free a page</title>
-
- <para>Since the VM system uses all available memory for disk caching,
- there are usually very few truly-free pages. The VM system depends on
- being able to properly choose pages which are not in use to reuse for
- new allocations. Selecting the optimal pages to free is possibly the
- single-most important function any VM system can perform because if it
- makes a poor selection, the VM system may be forced to unnecessarily
- retrieve pages from disk, seriously degrading system performance.</para>
-
- <para>How much overhead are we willing to suffer in the critical path to
- avoid freeing the wrong page? Each wrong choice we make will cost us
- hundreds of thousands of CPU cycles and a noticeable stall of the
- affected processes, so we are willing to endure a significant amount of
- overhead in order to be sure that the right page is chosen. This is why
- FreeBSD tends to outperform other systems when memory resources become
- stressed.</para>
-
- <para>The free page determination algorithm is built upon a history of the
- use of memory pages. To acquire this history, the system takes advantage
- of a page-used bit feature that most hardware page tables have.</para>
-
- <para>In any case, the page-used bit is cleared and at some later point
- the VM system comes across the page again and sees that the page-used
- bit has been set. This indicates that the page is still being actively
- used. If the bit is still clear it is an indication that the page is not
- being actively used. By testing this bit periodically, a use history (in
- the form of a counter) for the physical page is developed. When the VM
- system later needs to free up some pages, checking this history becomes
- the cornerstone of determining the best candidate page to reuse.</para>
-
- <sidebar>
- <title>What if the hardware has no page-used bit?</title>
-
- <para>For those platforms that do not have this feature, the system
- actually emulates a page-used bit. It unmaps or protects a page,
- forcing a page fault if the page is accessed again. When the page
- fault is taken, the system simply marks the page as having been used
- and unprotects the page so that it may be used. While taking such page
- faults just to determine if a page is being used appears to be an
- expensive proposition, it is much less expensive than reusing the page
- for some other purpose only to find that a process needs it back and
- then have to go to disk.</para>
- </sidebar>
-
- <para>FreeBSD makes use of several page queues to further refine the
- selection of pages to reuse as well as to determine when dirty pages
- must be flushed to their backing store. Since page tables are dynamic
- entities under FreeBSD, it costs virtually nothing to unmap a page from
- the address space of any processes using it. When a page candidate has
- been chosen based on the page-use counter, this is precisely what is
- done. The system must make a distinction between clean pages which can
- theoretically be freed up at any time, and dirty pages which must first
- be written to their backing store before being reusable. When a page
- candidate has been found it is moved to the inactive queue if it is
- dirty, or the cache queue if it is clean. A separate algorithm based on
- the dirty-to-clean page ratio determines when dirty pages in the
- inactive queue must be flushed to disk. Once this is accomplished, the
- flushed pages are moved from the inactive queue to the cache queue. At
- this point, pages in the cache queue can still be reactivated by a VM
- fault at relatively low cost. However, pages in the cache queue are
- considered to be <quote>immediately freeable</quote> and will be reused
- in an LRU (least-recently used) fashion when the system needs to
- allocate new memory.</para>
-
- <para>It is important to note that the FreeBSD VM system attempts to
- separate clean and dirty pages for the express reason of avoiding
- unnecessary flushes of dirty pages (which eats I/O bandwidth), nor does
- it move pages between the various page queues gratuitously when the
- memory subsystem is not being stressed. This is why you will see some
- systems with very low cache queue counts and high active queue counts
- when doing a <command>systat -vm</command> command. As the VM system
- becomes more stressed, it makes a greater effort to maintain the various
- page queues at the levels determined to be the most effective. An urban
- myth has circulated for years that Linux did a better job avoiding
- swapouts than FreeBSD, but this in fact is not true. What was actually
- occurring was that FreeBSD was proactively paging out unused pages in
- order to make room for more disk cache while Linux was keeping unused
- pages in core and leaving less memory available for cache and process
- pages. I don't know whether this is still true today.</para>
- </sect1>
-
- <sect1>
- <title>Pre-Faulting and Zeroing Optimizations</title>
-
- <para>Taking a VM fault is not expensive if the underlying page is already
- in core and can simply be mapped into the process, but it can become
- expensive if you take a whole lot of them on a regular basis. A good
- example of this is running a program such as &man.ls.1; or &man.ps.1;
- over and over again. If the program binary is mapped into memory but
- not mapped into the page table, then all the pages that will be accessed
- by the program will have to be faulted in every time the program is run.
- This is unnecessary when the pages in question are already in the VM
- Cache, so FreeBSD will attempt to pre-populate a process's page tables
- with those pages that are already in the VM Cache. One thing that
- FreeBSD does not yet do is pre-copy-on-write certain pages on exec. For
- example, if you run the &man.ls.1; program while running <command>vmstat
- 1</command> you will notice that it always takes a certain number of
- page faults, even when you run it over and over again. These are
- zero-fill faults, not program code faults (which were pre-faulted in
- already). Pre-copying pages on exec or fork is an area that could use
- more study.</para>
-
- <para>A large percentage of page faults that occur are zero-fill faults.
- You can usually see this by observing the <command>vmstat -s</command>
- output. These occur when a process accesses pages in its BSS area. The
- BSS area is expected to be initially zero but the VM system does not
- bother to allocate any memory at all until the process actually accesses
- it. When a fault occurs the VM system must not only allocate a new page,
- it must zero it as well. To optimize the zeroing operation the VM system
- has the ability to pre-zero pages and mark them as such, and to request
- pre-zeroed pages when zero-fill faults occur. The pre-zeroing occurs
- whenever the CPU is idle but the number of pages the system pre-zeros is
- limited in order to avoid blowing away the memory caches. This is an
- excellent example of adding complexity to the VM system in order to
- optimize the critical path.</para>
- </sect1>
-
- <sect1>
- <title>Page Table Optimizations</title>
-
- <para>The page table optimizations make up the most contentious part of
- the FreeBSD VM design and they have shown some strain with the advent of
- serious use of <function>mmap()</function>. I think this is actually a
- feature of most BSDs though I am not sure when it was first introduced.
- There are two major optimizations. The first is that hardware page
- tables do not contain persistent state but instead can be thrown away at
- any time with only a minor amount of management overhead. The second is
- that every active page table entry in the system has a governing
- <literal>pv_entry</literal> structure which is tied into the
- <literal>vm_page</literal> structure. FreeBSD can simply iterate
- through those mappings that are known to exist while Linux must check
- all page tables that <emphasis>might</emphasis> contain a specific
- mapping to see if it does, which can achieve O(n^2) overhead in certain
- situations. It is because of this that FreeBSD tends to make better
- choices on which pages to reuse or swap when memory is stressed, giving
- it better performance under load. However, FreeBSD requires kernel
- tuning to accommodate large-shared-address-space situations such as
- those that can occur in a news system because it may run out of
- <literal>pv_entry</literal> structures.</para>
-
- <para>Both Linux and FreeBSD need work in this area. FreeBSD is trying to
- maximize the advantage of a potentially sparse active-mapping model (not
- all processes need to map all pages of a shared library, for example),
- whereas Linux is trying to simplify its algorithms. FreeBSD generally
- has the performance advantage here at the cost of wasting a little extra
- memory, but FreeBSD breaks down in the case where a large file is
- massively shared across hundreds of processes. Linux, on the other hand,
- breaks down in the case where many processes are sparsely-mapping the
- same shared library and also runs non-optimally when trying to determine
- whether a page can be reused or not.</para>
- </sect1>
-
- <sect1>
- <title>Page Coloring</title>
-
- <para>We'll end with the page coloring optimizations. Page coloring is a
- performance optimization designed to ensure that accesses to contiguous
- pages in virtual memory make the best use of the processor cache. In
- ancient times (i.e. 10+ years ago) processor caches tended to map
- virtual memory rather than physical memory. This led to a huge number of
- problems including having to clear the cache on every context switch in
- some cases, and problems with data aliasing in the cache. Modern
- processor caches map physical memory precisely to solve those problems.
- This means that two side-by-side pages in a processes address space may
- not correspond to two side-by-side pages in the cache. In fact, if you
- aren't careful side-by-side pages in virtual memory could wind up using
- the same page in the processor cache&mdash;leading to cacheable data
- being thrown away prematurely and reducing CPU performance. This is true
- even with multi-way set-associative caches (though the effect is
- mitigated somewhat).</para>
-
- <para>FreeBSD's memory allocation code implements page coloring
- optimizations, which means that the memory allocation code will attempt
- to locate free pages that are contiguous from the point of view of the
- cache. For example, if page 16 of physical memory is assigned to page 0
- of a process's virtual memory and the cache can hold 4 pages, the page
- coloring code will not assign page 20 of physical memory to page 1 of a
- process's virtual memory. It would, instead, assign page 21 of physical
- memory. The page coloring code attempts to avoid assigning page 20
- because this maps over the same cache memory as page 16 and would result
- in non-optimal caching. This code adds a significant amount of
- complexity to the VM memory allocation subsystem as you can well
- imagine, but the result is well worth the effort. Page Coloring makes VM
- memory as deterministic as physical memory in regards to cache
- performance.</para>
- </sect1>
-
- <sect1>
- <title>Conclusion</title>
-
- <para>Virtual memory in modern operating systems must address a number of
- different issues efficiently and for many different usage patterns. The
- modular and algorithmic approach that BSD has historically taken allows
- us to study and understand the current implementation as well as
- relatively cleanly replace large sections of the code. There have been a
- number of improvements to the FreeBSD VM system in the last several
- years, and work is ongoing.</para>
- </sect1>
-
- <sect1>
- <title>Bonus QA session by Allen Briggs
- <email>briggs@ninthwonder.com</email></title>
-
- <qandaset>
- <qandaentry>
- <question>
- <para>What is <quote>the interleaving algorithm</quote> that you
- refer to in your listing of the ills of the FreeBSD 3.x swap
- arrangements?</para>
- </question>
-
- <answer>
- <para>FreeBSD uses a fixed swap interleave which defaults to 4. This
- means that FreeBSD reserves space for four swap areas even if you
- only have one, two, or three. Since swap is interleaved the linear
- address space representing the <quote>four swap areas</quote> will be
- fragmented if you don't actually have four swap areas. For
- example, if you have two swap areas A and B FreeBSD's address
- space representation for that swap area will be interleaved in
- blocks of 16 pages:</para>
-
- <literallayout>A B C D A B C D A B C D A B C D</literallayout>
-
- <para>FreeBSD 3.x uses a <quote>sequential list of free
- regions</quote> approach to accounting for the free swap areas.
- The idea is that large blocks of free linear space can be
- represented with a single list node
- (<filename>kern/subr_rlist.c</filename>). But due to the
- fragmentation the sequential list winds up being insanely
- fragmented. In the above example, completely unused swap will
- have A and B shown as <quote>free</quote> and C and D shown as
- <quote>all allocated</quote>. Each A-B sequence requires a list
- node to account for because C and D are holes, so the list node
- cannot be combined with the next A-B sequence.</para>
-
- <para>Why do we interleave our swap space instead of just tack swap
- areas onto the end and do something fancier? Because it's a whole
- lot easier to allocate linear swaths of an address space and have
- the result automatically be interleaved across multiple disks than
- it is to try to put that sophistication elsewhere.</para>
-
- <para>The fragmentation causes other problems. Being a linear list
- under 3.x, and having such a huge amount of inherent
- fragmentation, allocating and freeing swap winds up being an O(N)
- algorithm instead of an O(1) algorithm. Combined with other
- factors (heavy swapping) and you start getting into O(N^2) and
- O(N^3) levels of overhead, which is bad. The 3.x system may also
- need to allocate KVM during a swap operation to create a new list
- node which can lead to a deadlock if the system is trying to
- pageout pages in a low-memory situation.</para>
-
- <para>Under 4.x we do not use a sequential list. Instead we use a
- radix tree and bitmaps of swap blocks rather than ranged list
- nodes. We take the hit of preallocating all the bitmaps required
- for the entire swap area up front but it winds up wasting less
- memory due to the use of a bitmap (one bit per block) instead of a
- linked list of nodes. The use of a radix tree instead of a
- sequential list gives us nearly O(1) performance no matter how
- fragmented the tree becomes.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>I don't get the following:</para>
-
- <blockquote>
- <para>It is important to note that the FreeBSD VM system attempts
- to separate clean and dirty pages for the express reason of
- avoiding unnecessary flushes of dirty pages (which eats I/O
- bandwidth), nor does it move pages between the various page
- queues gratuitously when the memory subsystem is not being
- stressed. This is why you will see some systems with very low
- cache queue counts and high active queue counts when doing a
- <command>systat -vm</command> command.</para>
- </blockquote>
-
- <para>How is the separation of clean and dirty (inactive) pages
- related to the situation where you see low cache queue counts and
- high active queue counts in <command>systat -vm</command>? Do the
- systat stats roll the active and dirty pages together for the
- active queue count?</para>
- </question>
-
- <answer>
- <para>Yes, that is confusing. The relationship is
- <quote>goal</quote> verses <quote>reality</quote>. Our goal is to
- separate the pages but the reality is that if we are not in a
- memory crunch, we don't really have to.</para>
-
- <para>What this means is that FreeBSD will not try very hard to
- separate out dirty pages (inactive queue) from clean pages (cache
- queue) when the system is not being stressed, nor will it try to
- deactivate pages (active queue -> inactive queue) when the system
- is not being stressed, even if they aren't being used.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para> In the &man.ls.1; / <command>vmstat 1</command> example,
- wouldn't some of the page faults be data page faults (COW from
- executable file to private page)? I.e., I would expect the page
- faults to be some zero-fill and some program data. Or are you
- implying that FreeBSD does do pre-COW for the program data?</para>
- </question>
-
- <answer>
- <para>A COW fault can be either zero-fill or program-data. The
- mechanism is the same either way because the backing program-data
- is almost certainly already in the cache. I am indeed lumping the
- two together. FreeBSD does not pre-COW program data or zero-fill,
- but it <emphasis>does</emphasis> pre-map pages that exist in its
- cache.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>In your section on page table optimizations, can you give a
- little more detail about <literal>pv_entry</literal> and
- <literal>vm_page</literal> (or should vm_page be
- <literal>vm_pmap</literal>&mdash;as in 4.4, cf. pp. 180-181 of
- McKusick, Bostic, Karel, Quarterman)? Specifically, what kind of
- operation/reaction would require scanning the mappings?</para>
-
- <para>How does Linux do in the case where FreeBSD breaks down
- (sharing a large file mapping over many processes)?</para>
- </question>
-
- <answer>
- <para>A <literal>vm_page</literal> represents an (object,index#)
- tuple. A <literal>pv_entry</literal> represents a hardware page
- table entry (pte). If you have five processes sharing the same
- physical page, and three of those processes's page tables actually
- map the page, that page will be represented by a single
- <literal>vm_page</literal> structure and three
- <literal>pv_entry</literal> structures.</para>
-
- <para><literal>pv_entry</literal> structures only represent pages
- mapped by the MMU (one <literal>pv_entry</literal> represents one
- pte). This means that when we need to remove all hardware
- references to a <literal>vm_page</literal> (in order to reuse the
- page for something else, page it out, clear it, dirty it, and so
- forth) we can simply scan the linked list of
- <literal>pv_entry</literal>'s associated with that
- <literal>vm_page</literal> to remove or modify the pte's from
- their page tables.</para>
-
- <para>Under Linux there is no such linked list. In order to remove
- all the hardware page table mappings for a
- <literal>vm_page</literal> linux must index into every VM object
- that <emphasis>might</emphasis> have mapped the page. For
- example, if you have 50 processes all mapping the same shared
- library and want to get rid of page X in that library, you need to
- index into the page table for each of those 50 processes even if
- only 10 of them have actually mapped the page. So Linux is
- trading off the simplicity of its design against performance.
- Many VM algorithms which are O(1) or (small N) under FreeBSD wind
- up being O(N), O(N^2), or worse under Linux. Since the pte's
- representing a particular page in an object tend to be at the same
- offset in all the page tables they are mapped in, reducing the
- number of accesses into the page tables at the same pte offset
- will often avoid blowing away the L1 cache line for that offset,
- which can lead to better performance.</para>
-
- <para>FreeBSD has added complexity (the <literal>pv_entry</literal>
- scheme) in order to increase performance (to limit page table
- accesses to <emphasis>only</emphasis> those pte's that need to be
- modified).</para>
-
- <para>But FreeBSD has a scaling problem that Linux does not in that
- there are a limited number of <literal>pv_entry</literal>
- structures and this causes problems when you have massive sharing
- of data. In this case you may run out of
- <literal>pv_entry</literal> structures even though there is plenty
- of free memory available. This can be fixed easily enough by
- bumping up the number of <literal>pv_entry</literal> structures in
- the kernel config, but we really need to find a better way to do
- it.</para>
-
- <para>In regards to the memory overhead of a page table verses the
- <literal>pv_entry</literal> scheme: Linux uses
- <quote>permanent</quote> page tables that are not throw away, but
- does not need a <literal>pv_entry</literal> for each potentially
- mapped pte. FreeBSD uses <quote>throw away</quote> page tables but
- adds in a <literal>pv_entry</literal> structure for each
- actually-mapped pte. I think memory utilization winds up being
- about the same, giving FreeBSD an algorithmic advantage with its
- ability to throw away page tables at will with very low
- overhead.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>Finally, in the page coloring section, it might help to have a
- little more description of what you mean here. I didn't quite
- follow it.</para>
- </question>
-
- <answer>
- <para>Do you know how an L1 hardware memory cache works? I'll
- explain: Consider a machine with 16MB of main memory but only 128K
- of L1 cache. Generally the way this cache works is that each 128K
- block of main memory uses the <emphasis>same</emphasis> 128K of
- cache. If you access offset 0 in main memory and then offset
- offset 128K in main memory you can wind up throwing away the
- cached data you read from offset 0!</para>
-
- <para>Now, I am simplifying things greatly. What I just described
- is what is called a <quote>direct mapped</quote> hardware memory
- cache. Most modern caches are what are called
- 2-way-set-associative or 4-way-set-associative caches. The
- set-associatively allows you to access up to N different memory
- regions that overlap the same cache memory without destroying the
- previously cached data. But only N.</para>
-
- <para>So if I have a 4-way set associative cache I can access offset
- 0, offset 128K, 256K and offset 384K and still be able to access
- offset 0 again and have it come from the L1 cache. If I then
- access offset 512K, however, one of the four previously cached
- data objects will be thrown away by the cache.</para>
-
- <para>It is extremely important&hellip;
- <emphasis>extremely</emphasis> important for most of a processor's
- memory accesses to be able to come from the L1 cache, because the
- L1 cache operates at the processor frequency. The moment you have
- an L1 cache miss and have to go to the L2 cache or to main memory,
- the processor will stall and potentially sit twiddling its fingers
- for <emphasis>hundreds</emphasis> of instructions worth of time
- waiting for a read from main memory to complete. Main memory (the
- dynamic ram you stuff into a computer) is
- <emphasis>slow</emphasis>, when compared to the speed of a modern
- processor core.</para>
-
- <para>Ok, so now onto page coloring: All modern memory caches are
- what are known as <emphasis>physical</emphasis> caches. They
- cache physical memory addresses, not virtual memory addresses.
- This allows the cache to be left alone across a process context
- switch, which is very important.</para>
-
- <para>But in the Unix world you are dealing with virtual address
- spaces, not physical address spaces. Any program you write will
- see the virtual address space given to it. The actual
- <emphasis>physical</emphasis> pages underlying that virtual
- address space are not necessarily physically contiguous! In fact,
- you might have two pages that are side by side in a processes
- address space which wind up being at offset 0 and offset 128K in
- <emphasis>physical</emphasis> memory.</para>
-
- <para>A program normally assumes that two side-by-side pages will be
- optimally cached. That is, that you can access data objects in
- both pages without having them blow away each other's cache entry.
- But this is only true if the physical pages underlying the virtual
- address space are contiguous (insofar as the cache is
- concerned).</para>
-
- <para>This is what Page coloring does. Instead of assigning
- <emphasis>random</emphasis> physical pages to virtual addresses,
- which may result in non-optimal cache performance , Page coloring
- assigns <emphasis>reasonably-contiguous</emphasis> physical pages
- to virtual addresses. Thus programs can be written under the
- assumption that the characteristics of the underlying hardware
- cache are the same for their virtual address space as they would
- be if the program had been run directly in a physical address
- space.</para>
-
- <para>Note that I say <quote>reasonably</quote> contiguous rather
- than simply <quote>contiguous</quote>. From the point of view of a
- 128K direct mapped cache, the physical address 0 is the same as
- the physical address 128K. So two side-by-side pages in your
- virtual address space may wind up being offset 128K and offset
- 132K in physical memory, but could also easily be offset 128K and
- offset 4K in physical memory and still retain the same cache
- performance characteristics. So page-coloring does
- <emphasis>not</emphasis> have to assign truly contiguous pages of
- physical memory to contiguous pages of virtual memory, it just
- needs to make sure it assigns contiguous pages from the point of
- view of cache performance and operation.</para>
- </answer>
- </qandaentry>
- </qandaset>
- </sect1>
-</article>
diff --git a/en_US.ISO8859-1/articles/vm-design/fig1.eps b/en_US.ISO8859-1/articles/vm-design/fig1.eps
deleted file mode 100644
index 49d2c05a56..0000000000
--- a/en_US.ISO8859-1/articles/vm-design/fig1.eps
+++ /dev/null
@@ -1,104 +0,0 @@
-%!PS-Adobe-2.0 EPSF-2.0
-%%Title: fig1.eps
-%%Creator: fig2dev Version 3.2.3 Patchlevel
-%%CreationDate: Sun Oct 8 19:54:25 2000
-%%For: nik@canyon.nothing-going-on.org (Nik Clayton)
-%%BoundingBox: 0 0 119 65
-%%Magnification: 1.0000
-%%EndComments
-/$F2psDict 200 dict def
-$F2psDict begin
-$F2psDict /mtrx matrix put
-/col-1 {0 setgray} bind def
-/col0 {0.000 0.000 0.000 srgb} bind def
-/col1 {0.000 0.000 1.000 srgb} bind def
-/col2 {0.000 1.000 0.000 srgb} bind def
-/col3 {0.000 1.000 1.000 srgb} bind def
-/col4 {1.000 0.000 0.000 srgb} bind def
-/col5 {1.000 0.000 1.000 srgb} bind def
-/col6 {1.000 1.000 0.000 srgb} bind def
-/col7 {1.000 1.000 1.000 srgb} bind def
-/col8 {0.000 0.000 0.560 srgb} bind def
-/col9 {0.000 0.000 0.690 srgb} bind def
-/col10 {0.000 0.000 0.820 srgb} bind def
-/col11 {0.530 0.810 1.000 srgb} bind def
-/col12 {0.000 0.560 0.000 srgb} bind def
-/col13 {0.000 0.690 0.000 srgb} bind def
-/col14 {0.000 0.820 0.000 srgb} bind def
-/col15 {0.000 0.560 0.560 srgb} bind def
-/col16 {0.000 0.690 0.690 srgb} bind def
-/col17 {0.000 0.820 0.820 srgb} bind def
-/col18 {0.560 0.000 0.000 srgb} bind def
-/col19 {0.690 0.000 0.000 srgb} bind def
-/col20 {0.820 0.000 0.000 srgb} bind def
-/col21 {0.560 0.000 0.560 srgb} bind def
-/col22 {0.690 0.000 0.690 srgb} bind def
-/col23 {0.820 0.000 0.820 srgb} bind def
-/col24 {0.500 0.190 0.000 srgb} bind def
-/col25 {0.630 0.250 0.000 srgb} bind def
-/col26 {0.750 0.380 0.000 srgb} bind def
-/col27 {1.000 0.500 0.500 srgb} bind def
-/col28 {1.000 0.630 0.630 srgb} bind def
-/col29 {1.000 0.750 0.750 srgb} bind def
-/col30 {1.000 0.880 0.880 srgb} bind def
-/col31 {1.000 0.840 0.000 srgb} bind def
-
-end
-save
-newpath 0 65 moveto 0 0 lineto 119 0 lineto 119 65 lineto closepath clip newpath
--143.0 298.0 translate
-1 -1 scale
-
-/cp {closepath} bind def
-/ef {eofill} bind def
-/gr {grestore} bind def
-/gs {gsave} bind def
-/sa {save} bind def
-/rs {restore} bind def
-/l {lineto} bind def
-/m {moveto} bind def
-/rm {rmoveto} bind def
-/n {newpath} bind def
-/s {stroke} bind def
-/sh {show} bind def
-/slc {setlinecap} bind def
-/slj {setlinejoin} bind def
-/slw {setlinewidth} bind def
-/srgb {setrgbcolor} bind def
-/rot {rotate} bind def
-/sc {scale} bind def
-/sd {setdash} bind def
-/ff {findfont} bind def
-/sf {setfont} bind def
-/scf {scalefont} bind def
-/sw {stringwidth} bind def
-/tr {translate} bind def
-/tnt {dup dup currentrgbcolor
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
- bind def
-/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
- 4 -2 roll mul srgb} bind def
-/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
-/$F2psEnd {$F2psEnteredState restore end} def
-
-$F2psBegin
-%%Page: 1 1
-10 setmiterlimit
- 0.06000 0.06000 sc
-% Polyline
-7.500 slw
-n 2400 4200 m 4050 4200 l 4050 4950 l 2400 4950 l
- cp gs col0 s gr
-% Polyline
-n 4050 4200 m
- 4350 3900 l gs col0 s gr
-% Polyline
-n 2400 4200 m 2700 3900 l 4350 3900 l 4350 4650 l
- 4050 4950 l gs col0 s gr
-/Helvetica-Bold ff 180.00 scf sf
-3225 4650 m
-gs 1 -1 sc (A) dup sw pop 2 div neg 0 rm col0 sh gr
-$F2psEnd
-rs
diff --git a/en_US.ISO8859-1/articles/vm-design/fig2.eps b/en_US.ISO8859-1/articles/vm-design/fig2.eps
deleted file mode 100644
index fcb8bd41ad..0000000000
--- a/en_US.ISO8859-1/articles/vm-design/fig2.eps
+++ /dev/null
@@ -1,115 +0,0 @@
-%!PS-Adobe-2.0 EPSF-2.0
-%%Title: fig2.eps
-%%Creator: fig2dev Version 3.2.3 Patchlevel
-%%CreationDate: Sun Oct 8 19:55:31 2000
-%%For: nik@canyon.nothing-going-on.org (Nik Clayton)
-%%BoundingBox: 0 0 120 110
-%%Magnification: 1.0000
-%%EndComments
-/$F2psDict 200 dict def
-$F2psDict begin
-$F2psDict /mtrx matrix put
-/col-1 {0 setgray} bind def
-/col0 {0.000 0.000 0.000 srgb} bind def
-/col1 {0.000 0.000 1.000 srgb} bind def
-/col2 {0.000 1.000 0.000 srgb} bind def
-/col3 {0.000 1.000 1.000 srgb} bind def
-/col4 {1.000 0.000 0.000 srgb} bind def
-/col5 {1.000 0.000 1.000 srgb} bind def
-/col6 {1.000 1.000 0.000 srgb} bind def
-/col7 {1.000 1.000 1.000 srgb} bind def
-/col8 {0.000 0.000 0.560 srgb} bind def
-/col9 {0.000 0.000 0.690 srgb} bind def
-/col10 {0.000 0.000 0.820 srgb} bind def
-/col11 {0.530 0.810 1.000 srgb} bind def
-/col12 {0.000 0.560 0.000 srgb} bind def
-/col13 {0.000 0.690 0.000 srgb} bind def
-/col14 {0.000 0.820 0.000 srgb} bind def
-/col15 {0.000 0.560 0.560 srgb} bind def
-/col16 {0.000 0.690 0.690 srgb} bind def
-/col17 {0.000 0.820 0.820 srgb} bind def
-/col18 {0.560 0.000 0.000 srgb} bind def
-/col19 {0.690 0.000 0.000 srgb} bind def
-/col20 {0.820 0.000 0.000 srgb} bind def
-/col21 {0.560 0.000 0.560 srgb} bind def
-/col22 {0.690 0.000 0.690 srgb} bind def
-/col23 {0.820 0.000 0.820 srgb} bind def
-/col24 {0.500 0.190 0.000 srgb} bind def
-/col25 {0.630 0.250 0.000 srgb} bind def
-/col26 {0.750 0.380 0.000 srgb} bind def
-/col27 {1.000 0.500 0.500 srgb} bind def
-/col28 {1.000 0.630 0.630 srgb} bind def
-/col29 {1.000 0.750 0.750 srgb} bind def
-/col30 {1.000 0.880 0.880 srgb} bind def
-/col31 {1.000 0.840 0.000 srgb} bind def
-
-end
-save
-newpath 0 110 moveto 0 0 lineto 120 0 lineto 120 110 lineto closepath clip newpath
--174.0 370.0 translate
-1 -1 scale
-
-/cp {closepath} bind def
-/ef {eofill} bind def
-/gr {grestore} bind def
-/gs {gsave} bind def
-/sa {save} bind def
-/rs {restore} bind def
-/l {lineto} bind def
-/m {moveto} bind def
-/rm {rmoveto} bind def
-/n {newpath} bind def
-/s {stroke} bind def
-/sh {show} bind def
-/slc {setlinecap} bind def
-/slj {setlinejoin} bind def
-/slw {setlinewidth} bind def
-/srgb {setrgbcolor} bind def
-/rot {rotate} bind def
-/sc {scale} bind def
-/sd {setdash} bind def
-/ff {findfont} bind def
-/sf {setfont} bind def
-/scf {scalefont} bind def
-/sw {stringwidth} bind def
-/tr {translate} bind def
-/tnt {dup dup currentrgbcolor
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
- bind def
-/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
- 4 -2 roll mul srgb} bind def
-/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
-/$F2psEnd {$F2psEnteredState restore end} def
-
-$F2psBegin
-%%Page: 1 1
-10 setmiterlimit
- 0.06000 0.06000 sc
-/Helvetica-Bold ff 180.00 scf sf
-3750 5100 m
-gs 1 -1 sc (B) dup sw pop 2 div neg 0 rm col0 sh gr
-% Polyline
-7.500 slw
-n 4871 5100 m 4879 5100 l gs col0 s gr
-% Polyline
-n 2925 5400 m 4575 5400 l 4575 6150 l 2925 6150 l
- cp gs col0 s gr
-% Polyline
-n 4575 4650 m
- 4875 4350 l gs col0 s gr
-% Polyline
-n 2925 4650 m 4575 4650 l 4575 5400 l 2925 5400 l
- cp gs col0 s gr
-% Polyline
-n 2925 4650 m 3225 4350 l 4875 4350 l 4875 5100 l
- 4575 5400 l gs col0 s gr
-/Helvetica-Bold ff 180.00 scf sf
-3750 5850 m
-gs 1 -1 sc (A) dup sw pop 2 div neg 0 rm col0 sh gr
-% Polyline
-n 4875 5100 m 4875 5850 l
- 4575 6150 l gs col0 s gr
-$F2psEnd
-rs
diff --git a/en_US.ISO8859-1/articles/vm-design/fig3.eps b/en_US.ISO8859-1/articles/vm-design/fig3.eps
deleted file mode 100644
index 0e3138b2ed..0000000000
--- a/en_US.ISO8859-1/articles/vm-design/fig3.eps
+++ /dev/null
@@ -1,133 +0,0 @@
-%!PS-Adobe-2.0 EPSF-2.0
-%%Title: fig3.eps
-%%Creator: fig2dev Version 3.2.3 Patchlevel
-%%CreationDate: Sun Oct 8 19:53:51 2000
-%%For: nik@canyon.nothing-going-on.org (Nik Clayton)
-%%BoundingBox: 0 0 120 155
-%%Magnification: 1.0000
-%%EndComments
-/$F2psDict 200 dict def
-$F2psDict begin
-$F2psDict /mtrx matrix put
-/col-1 {0 setgray} bind def
-/col0 {0.000 0.000 0.000 srgb} bind def
-/col1 {0.000 0.000 1.000 srgb} bind def
-/col2 {0.000 1.000 0.000 srgb} bind def
-/col3 {0.000 1.000 1.000 srgb} bind def
-/col4 {1.000 0.000 0.000 srgb} bind def
-/col5 {1.000 0.000 1.000 srgb} bind def
-/col6 {1.000 1.000 0.000 srgb} bind def
-/col7 {1.000 1.000 1.000 srgb} bind def
-/col8 {0.000 0.000 0.560 srgb} bind def
-/col9 {0.000 0.000 0.690 srgb} bind def
-/col10 {0.000 0.000 0.820 srgb} bind def
-/col11 {0.530 0.810 1.000 srgb} bind def
-/col12 {0.000 0.560 0.000 srgb} bind def
-/col13 {0.000 0.690 0.000 srgb} bind def
-/col14 {0.000 0.820 0.000 srgb} bind def
-/col15 {0.000 0.560 0.560 srgb} bind def
-/col16 {0.000 0.690 0.690 srgb} bind def
-/col17 {0.000 0.820 0.820 srgb} bind def
-/col18 {0.560 0.000 0.000 srgb} bind def
-/col19 {0.690 0.000 0.000 srgb} bind def
-/col20 {0.820 0.000 0.000 srgb} bind def
-/col21 {0.560 0.000 0.560 srgb} bind def
-/col22 {0.690 0.000 0.690 srgb} bind def
-/col23 {0.820 0.000 0.820 srgb} bind def
-/col24 {0.500 0.190 0.000 srgb} bind def
-/col25 {0.630 0.250 0.000 srgb} bind def
-/col26 {0.750 0.380 0.000 srgb} bind def
-/col27 {1.000 0.500 0.500 srgb} bind def
-/col28 {1.000 0.630 0.630 srgb} bind def
-/col29 {1.000 0.750 0.750 srgb} bind def
-/col30 {1.000 0.880 0.880 srgb} bind def
-/col31 {1.000 0.840 0.000 srgb} bind def
-
-end
-save
-newpath 0 155 moveto 0 0 lineto 120 0 lineto 120 155 lineto closepath clip newpath
--174.0 370.0 translate
-1 -1 scale
-
-/cp {closepath} bind def
-/ef {eofill} bind def
-/gr {grestore} bind def
-/gs {gsave} bind def
-/sa {save} bind def
-/rs {restore} bind def
-/l {lineto} bind def
-/m {moveto} bind def
-/rm {rmoveto} bind def
-/n {newpath} bind def
-/s {stroke} bind def
-/sh {show} bind def
-/slc {setlinecap} bind def
-/slj {setlinejoin} bind def
-/slw {setlinewidth} bind def
-/srgb {setrgbcolor} bind def
-/rot {rotate} bind def
-/sc {scale} bind def
-/sd {setdash} bind def
-/ff {findfont} bind def
-/sf {setfont} bind def
-/scf {scalefont} bind def
-/sw {stringwidth} bind def
-/tr {translate} bind def
-/tnt {dup dup currentrgbcolor
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
- bind def
-/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
- 4 -2 roll mul srgb} bind def
-/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
-/$F2psEnd {$F2psEnteredState restore end} def
-
-$F2psBegin
-%%Page: 1 1
-10 setmiterlimit
- 0.06000 0.06000 sc
-/Helvetica-Bold ff 180.00 scf sf
-4125 4350 m
-gs 1 -1 sc (C2) dup sw pop 2 div neg 0 rm col0 sh gr
-% Polyline
-7.500 slw
-n 4871 5100 m 4879 5100 l gs col0 s gr
-% Polyline
-n 2925 5400 m 4575 5400 l 4575 6150 l 2925 6150 l
- cp gs col0 s gr
-% Polyline
-n 4575 4650 m
- 4875 4350 l gs col0 s gr
-% Polyline
-n 2925 4650 m 4575 4650 l 4575 5400 l 2925 5400 l
- cp gs col0 s gr
-% Polyline
-n 4875 3600 m 4875 5100 l
- 4575 5400 l gs col0 s gr
-% Polyline
-n 2925 4650 m 2925 3900 l 3225 3600 l
- 4875 3600 l gs col0 s gr
-% Polyline
-n 2925 3900 m 4425 3900 l 4575 3900 l
- 4875 3600 l gs col0 s gr
-% Polyline
-n 4575 4650 m
- 4575 3900 l gs col0 s gr
-% Polyline
-n 3750 4650 m 3750 3900 l
- 4050 3600 l gs col0 s gr
-/Helvetica-Bold ff 180.00 scf sf
-3750 5850 m
-gs 1 -1 sc (A) dup sw pop 2 div neg 0 rm col0 sh gr
-/Helvetica-Bold ff 180.00 scf sf
-3750 5100 m
-gs 1 -1 sc (B) dup sw pop 2 div neg 0 rm col0 sh gr
-/Helvetica-Bold ff 180.00 scf sf
-3375 4350 m
-gs 1 -1 sc (C1) dup sw pop 2 div neg 0 rm col0 sh gr
-% Polyline
-n 4875 5100 m 4875 5850 l
- 4575 6150 l gs col0 s gr
-$F2psEnd
-rs
diff --git a/en_US.ISO8859-1/articles/vm-design/fig4.eps b/en_US.ISO8859-1/articles/vm-design/fig4.eps
deleted file mode 100644
index 24fc1b5add..0000000000
--- a/en_US.ISO8859-1/articles/vm-design/fig4.eps
+++ /dev/null
@@ -1,133 +0,0 @@
-%!PS-Adobe-2.0 EPSF-2.0
-%%Title: fig4.eps
-%%Creator: fig2dev Version 3.2.3 Patchlevel
-%%CreationDate: Sun Oct 8 19:55:53 2000
-%%For: nik@canyon.nothing-going-on.org (Nik Clayton)
-%%BoundingBox: 0 0 120 155
-%%Magnification: 1.0000
-%%EndComments
-/$F2psDict 200 dict def
-$F2psDict begin
-$F2psDict /mtrx matrix put
-/col-1 {0 setgray} bind def
-/col0 {0.000 0.000 0.000 srgb} bind def
-/col1 {0.000 0.000 1.000 srgb} bind def
-/col2 {0.000 1.000 0.000 srgb} bind def
-/col3 {0.000 1.000 1.000 srgb} bind def
-/col4 {1.000 0.000 0.000 srgb} bind def
-/col5 {1.000 0.000 1.000 srgb} bind def
-/col6 {1.000 1.000 0.000 srgb} bind def
-/col7 {1.000 1.000 1.000 srgb} bind def
-/col8 {0.000 0.000 0.560 srgb} bind def
-/col9 {0.000 0.000 0.690 srgb} bind def
-/col10 {0.000 0.000 0.820 srgb} bind def
-/col11 {0.530 0.810 1.000 srgb} bind def
-/col12 {0.000 0.560 0.000 srgb} bind def
-/col13 {0.000 0.690 0.000 srgb} bind def
-/col14 {0.000 0.820 0.000 srgb} bind def
-/col15 {0.000 0.560 0.560 srgb} bind def
-/col16 {0.000 0.690 0.690 srgb} bind def
-/col17 {0.000 0.820 0.820 srgb} bind def
-/col18 {0.560 0.000 0.000 srgb} bind def
-/col19 {0.690 0.000 0.000 srgb} bind def
-/col20 {0.820 0.000 0.000 srgb} bind def
-/col21 {0.560 0.000 0.560 srgb} bind def
-/col22 {0.690 0.000 0.690 srgb} bind def
-/col23 {0.820 0.000 0.820 srgb} bind def
-/col24 {0.500 0.190 0.000 srgb} bind def
-/col25 {0.630 0.250 0.000 srgb} bind def
-/col26 {0.750 0.380 0.000 srgb} bind def
-/col27 {1.000 0.500 0.500 srgb} bind def
-/col28 {1.000 0.630 0.630 srgb} bind def
-/col29 {1.000 0.750 0.750 srgb} bind def
-/col30 {1.000 0.880 0.880 srgb} bind def
-/col31 {1.000 0.840 0.000 srgb} bind def
-
-end
-save
-newpath 0 155 moveto 0 0 lineto 120 0 lineto 120 155 lineto closepath clip newpath
--174.0 370.0 translate
-1 -1 scale
-
-/cp {closepath} bind def
-/ef {eofill} bind def
-/gr {grestore} bind def
-/gs {gsave} bind def
-/sa {save} bind def
-/rs {restore} bind def
-/l {lineto} bind def
-/m {moveto} bind def
-/rm {rmoveto} bind def
-/n {newpath} bind def
-/s {stroke} bind def
-/sh {show} bind def
-/slc {setlinecap} bind def
-/slj {setlinejoin} bind def
-/slw {setlinewidth} bind def
-/srgb {setrgbcolor} bind def
-/rot {rotate} bind def
-/sc {scale} bind def
-/sd {setdash} bind def
-/ff {findfont} bind def
-/sf {setfont} bind def
-/scf {scalefont} bind def
-/sw {stringwidth} bind def
-/tr {translate} bind def
-/tnt {dup dup currentrgbcolor
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
- bind def
-/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
- 4 -2 roll mul srgb} bind def
-/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
-/$F2psEnd {$F2psEnteredState restore end} def
-
-$F2psBegin
-%%Page: 1 1
-10 setmiterlimit
- 0.06000 0.06000 sc
-/Helvetica-Bold ff 180.00 scf sf
-3375 4350 m
-gs 1 -1 sc (C1) dup sw pop 2 div neg 0 rm col0 sh gr
-% Polyline
-7.500 slw
-n 4871 5100 m 4879 5100 l gs col0 s gr
-% Polyline
-n 2925 5400 m 4575 5400 l 4575 6150 l 2925 6150 l
- cp gs col0 s gr
-% Polyline
-n 4575 4650 m
- 4875 4350 l gs col0 s gr
-% Polyline
-n 2925 4650 m 4575 4650 l 4575 5400 l 2925 5400 l
- cp gs col0 s gr
-% Polyline
-n 4875 4350 m 4875 5100 l
- 4575 5400 l gs col0 s gr
-% Polyline
-n 2925 4650 m 2925 3900 l 3225 3600 l
- 4050 3600 l gs col0 s gr
-% Polyline
-n 3750 4650 m 3750 3900 l
- 4050 3600 l gs col0 s gr
-% Polyline
-n 2925 3900 m
- 3750 3900 l gs col0 s gr
-% Polyline
-n 3750 4650 m 4050 4350 l
- 4875 4350 l gs col0 s gr
-% Polyline
-n 4050 4350 m
- 4050 3600 l gs col0 s gr
-/Helvetica-Bold ff 180.00 scf sf
-3750 5850 m
-gs 1 -1 sc (A) dup sw pop 2 div neg 0 rm col0 sh gr
-/Helvetica-Bold ff 180.00 scf sf
-3750 5100 m
-gs 1 -1 sc (B) dup sw pop 2 div neg 0 rm col0 sh gr
-% Polyline
-n 4875 5100 m 4875 5850 l
- 4575 6150 l gs col0 s gr
-$F2psEnd
-rs
diff --git a/en_US.ISO8859-1/articles/zip-drive/Makefile b/en_US.ISO8859-1/articles/zip-drive/Makefile
deleted file mode 100644
index 60f4a450ea..0000000000
--- a/en_US.ISO8859-1/articles/zip-drive/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-# $FreeBSD: doc/en_US.ISO_8859-1/articles/programming-tools/Makefile,v 1.8 1999/09/06 06:52:38 peter Exp $
-
-DOC?= article
-
-FORMATS?= html
-
-INSTALL_COMPRESSED?=gz
-INSTALL_ONLY_COMPRESSED?=
-
-SRCS= article.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/zip-drive/article.sgml b/en_US.ISO8859-1/articles/zip-drive/article.sgml
deleted file mode 100644
index a13c8430c1..0000000000
--- a/en_US.ISO8859-1/articles/zip-drive/article.sgml
+++ /dev/null
@@ -1,267 +0,0 @@
-<!-- $FreeBSD -->
-
-<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man;
-]>
-
-<article>
- <articleinfo>
- <title>ZIP Drives</title>
-
- <authorgroup>
- <author>
- <firstname>Jason</firstname>
- <surname>Bacon</surname>
-
- <affiliation>
- <address><email>acadix@execpc.com</email></address>
- </affiliation>
- </author>
- </authorgroup>
- </articleinfo>
-
- <sect1>
- <title>ZIP Drive Basics</title>
-
- <para>ZIP disks are high capacity, removable, magnetic disks, which can be
- read or written by ZIP drives from iomega corporation. ZIP disks are
- similar to floppy disks, except that they are much faster, and have a
- much greater capacity. While floppy disks typically hold 1.44
- megabytes, ZIP disks are available in two sizes, namely 100 megabytes
- and 250 megabytes. ZIP drives should not be confused with the
- super-floppy, a 120 megabyte floppy drive which also handles traditional
- 1.44 megabyte floppies.</para>
-
- <para>IOMEGA also sells a higher capacity, higher performance drive
- called the JAZZ drive. JAZZ drives come in 1 gigabyte and
- 2 gigabyte sizes.</para>
-
- <para>ZIP drives are available as internal or external units, using one
- of three interfaces:</para>
-
- <orderedlist>
- <listitem>
- <para>The SCSI (Small Computer Standard Interface) interface is the
- fastest, most sophisticated, most expandable, and most expensive
- interface. The SCSI interface is used by all types of computers
- from PC's to RISC workstations to minicomputers, to connect all
- types of peripherals such as disk drives, tape drives, scanners, and
- so on. SCSI ZIP drives may be internal or external, assuming your
- host adapter has an external connector.</para>
-
- <note>
- <para>If you are using an external SCSI device, it is important
- never to connect or disconnect it from the SCSI bus while the
- computer is running. Doing so may cause file-system damage on the
- disks that remain connected.</para>
- </note>
-
- <para>If you want maximum performance and easy setup, the SCSI
- interface is the best choice. This will probably require adding a
- SCSI host adapter, since most PC's (except for high-performance
- servers) don't have built-in SCSI support. Each SCSI host adapter
- can support either 7 or 15 SCSI devices, depending on the
- model.</para>
-
- <para>Each SCSI device has it's own controller, and these
- controllers are fairly intelligent and well standardized, (the
- second `S' in SCSI is for Standard) so from the operating system's
- point of view, all SCSI disk drives look about the same, as do all
- SCSI tape drives, etc. To support SCSI devices, the operating
- system need only have a driver for the particular host adapter, and
- a generic driver for each type of device, i.e. a SCSI disk driver,
- SCSI tape driver, and so on. There are some SCSI devices that can
- be better utilized with specialized drivers (e.g. DAT tape drives),
- but they tend to work OK with the generic driver, too. It's just
- that the generic drivers may not support some of the special
- features.</para>
-
- <para>Using a SCSI zip drive is simply a matter of determining which
- device file in the <filename>/dev</filename> directory represents
- the ZIP drive. This can be determined by looking at the boot
- messages while FreeBSD is booting (or in
- <filename>/var/log/messages</filename> after booting), where you'll
- see a line something like this:</para>
-
- <programlisting>da1: &lt;IOMEGA ZIP 100 D.13&gt; Removable Direct Access SCSI-2 Device</programlisting>
-
- <para>This means that the ZIP drive is represented by the file
- <filename>/dev/da1</filename>.</para>
- </listitem>
-
- <listitem>
- <para>The IDE (Integrated Drive Electronics) interface is a low-cost
- disk drive interface used by many desktop PC's. Most IDE devices
- are strictly internal.</para>
-
- <para>Performance of IDE ZIP drives is comparable to SCSI ZIP drives.
- (The IDE interface is not as fast as SCSI, but ZIP drives
- performance is limited mainly by the mechanics of the drive, not by
- the bus interface.)</para>
-
- <para>The drawback of the IDE interface is the limitations it imposes.
- Most IDE adapters can only support 2 devices, and IDE interfaces are
- not typically designed for the long term. For example, the original
- IDE interface would not support hard disks with more than 1024
- cylinders, which forced a lot of people to upgrade their hardware
- prematurely. If you have plans to expand your PC by adding another
- disk, a tape drive, or scanner, you may want to invest in a SCSI
- host adapter and a SCSI ZIP drive to avoid problems in the
- future.</para>
-
- <para>IDE devices in FreeBSD are prefixed with a <literal>w</literal>.
- For example, an IDE hard disk might be
- <filename>/dev/wd0</filename>, an IDE (ATAPI) CDROM might be
- <filename>/dev/wcd1</filename>, and so on.</para>
- </listitem>
-
- <listitem>
- <para>The parallel port interface is popular for portable external
- devices such as external ZIP drives and scanners, because virtually
- every computer has a standard parallel port (usually used for
- printers). This makes things easy for people to transfer data
- between multiple computers by toting around their ZIP drive.</para>
-
- <para>Performance will generally be slower than a SCSI or IDE ZIP
- drive, since it is limited by the speed of the parallel port.
- Parallel port speed varies considerably between various computers,
- and can often be configured in the system BIOS. Some machines
- will also require BIOS configuration to operate the parallel
- port in bidirectional mode. (Parallel ports were originally
- designed only for output to printers)</para>
- </listitem>
- </orderedlist>
- </sect1>
-
- <sect1>
- <title>Parallel ZIP: The <devicename>vpo</devicename> Driver</title>
-
- <para>To use a parallel-port ZIP drive under FreeBSD, the
- <devicename>vpo</devicename> driver must be configured into the kernel.
- Parallel port ZIP drives also have a built-in SCSI controller. The vpo
- driver allows the FreeBSD kernel to communicate with the ZIP drive's
- SCSI controller through the parallel port.</para>
-
- <para>Since the vpo driver is not a standard part of the kernel (as of
- FreeBSD 3.2), you will need to rebuild the kernel to enable this device.
- The process of building a kernel is outlined in detail in another
- section. The following steps outline the process in brief for the
- purpose of enabling the vpo driver:</para>
-
- <orderedlist>
- <listitem>
- <para>Run <command>/stand/sysinstall</command>, and install the kernel
- source code on your system.</para>
-
- <screen>&prompt.root; <userinput>cd /sys/i386/conf</userinput>
-&prompt.root; <userinput>cp GENERIC MYKERNEL</userinput></screen>
-
- <para>Edit <filename>MYKERNEL</filename>, change the
- <literal>ident</literal> line to <literal>MYKERNEL</literal>, and
- uncomment the line describing the vpo driver.</para>
-
- <para>If you have a second parallel port, you may need to copy the
- section for <literal>ppc0</literal> to create a
- <literal>ppc1</literal> device. The second parallel port usually
- uses IRQ 5 and address 378. Only the IRQ is required in the config
- file.</para>
-
- <para>If you're root hard disk is a SCSI disk, you might run into a
- problem with probing order, which will cause the system to attempt
- to use the ZIP drive as the root device. This will cause a boot
- failure, unless you happen to have a FreeBSD root file-system on
- your ZIP disk! In this case, you will need to <quote>wire
- down</quote> the root disk, i.e. force the kernel to bind a
- specific device to <filename>/dev/da0</filename>, the root SCSI
- disk. It will then assign the ZIP disk to the next available SCSI
- disk, e.g. <literal>/dev/da1</literal>. To wire down your SCSI hard
- drive as <literal>da0</literal>, change the line
-
- <programlisting>device da0</programlisting>
-
- to
-
- <programlisting>disk da0 at scbus0 target 0 unit 0</programlisting></para>
-
- <para>You may need to change the target above to match the SCSI ID of
- your disk drive. You should also wire down the scbus0 entry to your
- controller. For example, if you have an Adaptec 15xx controller,
- you would change
-
- <programlisting>controller scbus0</programlisting>
-
- to
-
- <programlisting>controller scbus0 at aha0</programlisting></para>
-
- <para>Lastly, as long as you're editing the kernel config, you
- can take the opportunity to remove all the unnecessary drivers. This
- should be done with a great deal of caution, and only if you feel
- confident about making kernel modifications. Removing unnecessary
- drivers will reduce the kernel size, leaving more memory available
- for your applications. To determine which drivers are not needed,
- go to the end of the file <filename>/var/log/messages</filename>, and look for lines
- reading "not found". Then, comment out these devices in your config
- file. You can also change other options to reduce the size and
- increase the speed of your kernel. Read the section on rebuilding
- your kernel for more complete information.</para>
- </listitem>
-
- <listitem>
- <para>Now it's time to compile the kernel:</para>
-
- <screen>&prompt.root; <userinput>/usr/sbin/config MYKERNEL</userinput>
-&prompt.root; <userinput>cd ../../compile/MYKERNEL</userinput>
-&prompt.root; <userinput>make clean depend && make all install</userinput></screen>
- </listitem>
- </orderedlist>
-
- <para>After the kernel is rebuilt, you'll need to reboot. Make sure the
- ZIP drive is connected to the parallel port before the boot begins. You
- should see the ZIP drive show up in the boot messages as device vpo0 or
- vpo1, depending on which parallel port the drive is attached to. It
- should also show which device file the ZIP drive has been bound to. This
- will be <filename>/dev/da0</filename> if you have no other SCSI disks in
- the system, or <filename>/dev/da1</filename> if you have a SCSI hard
- disk wired down as the root device.</para>
- </sect1>
-
- <sect1>
- <title>Mounting ZIP disks</title>
-
- <para>To access the ZIP disk, you simply mount it like any other disk
- device. The file-system is represented as slice 4 on the device, so for
- SCSI or parallel ZIP disks, you would use:</para>
-
- <screen>&prompt.root; <userinput>mount_msdos /dev/da1s4 /mnt</userinput></screen>
-
- <para>For IDE ZIP drives, use:</para>
-
- <screen>&prompt.root; <userinput>mount_msdos /dev/wd1s4 /mnt</userinput></screen>
-
- <para>It will also be helpful to update <filename>/etc/fstab</filename> to
- make mounting easier. Add a line like the following, edited to suit your
- system:
-
- <programlisting>/dev/da1s4 /zip msdos rw,noauto 0 0</programlisting>
-
- and create the directory <filename>/zip</filename>.</para>
-
- <para>Then, you can mount simply by typing
-
- <screen>&prompt.root; <userinput>mount /zip</userinput></screen>
-
- and unmount by typing
-
- <screen>&prompt.root; <userinput>umount /zip</userinput></screen></para>
-
- <para>For more information on the format of
- <filename>/etc/fstab</filename>, see &man.fstab.5;.</para>
-
- <para>You can also create a FreeBSD file-system on the ZIP disk
- using &man.newfs.8;. However, the disk will only be usable on a FreeBSD
- system, or perhaps a few other Unix clones that recognize FreeBSD
- file-systems. (Definitely not DOS or Windows.)</para>
- </sect1>
-</article>
diff --git a/en_US.ISO8859-1/books/Makefile b/en_US.ISO8859-1/books/Makefile
deleted file mode 100644
index de2ed2f597..0000000000
--- a/en_US.ISO8859-1/books/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-# $FreeBSD: doc/en_US.ISO_8859-1/books/Makefile,v 1.9 2001/04/09 20:41:33 nik Exp $
-
-SUBDIR = corp-net-guide
-SUBDIR+= design-44bsd
-SUBDIR+= developers-handbook
-SUBDIR+= faq
-SUBDIR+= fdp-primer
-SUBDIR+= handbook
-SUBDIR+= porters-handbook
-SUBDIR+= ppp-primer
-
-ROOT_SYMLINKS= faq handbook
-
-DOC_PREFIX?= ${.CURDIR}/../..
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/books/Makefile.inc b/en_US.ISO8859-1/books/Makefile.inc
deleted file mode 100644
index 9a7534a3b1..0000000000
--- a/en_US.ISO8859-1/books/Makefile.inc
+++ /dev/null
@@ -1,5 +0,0 @@
-#
-# $FreeBSD: doc/en_US.ISO8859-1/books/Makefile.inc,v 1.3 1999/09/06 06:52:39 peter Exp $
-#
-
-DESTDIR?= ${DOCDIR}/en_US.ISO8859-1/books/${.CURDIR:T}
diff --git a/en_US.ISO8859-1/books/arch-handbook/Makefile b/en_US.ISO8859-1/books/arch-handbook/Makefile
deleted file mode 100644
index 2c0e962d91..0000000000
--- a/en_US.ISO8859-1/books/arch-handbook/Makefile
+++ /dev/null
@@ -1,47 +0,0 @@
-#
-# $FreeBSD: doc/en_US.ISO8859-1/books/developers-handbook/Makefile,v 1.7 2001/07/19 22:06:05 murray Exp $
-#
-# Build the FreeBSD Developers' Handbook.
-#
-
-MAINTAINER=asmodai@FreeBSD.org
-
-DOC?= book
-
-FORMATS?= html-split
-
-INSTALL_COMPRESSED?= gz
-INSTALL_ONLY_COMPRESSED?=
-
-GEN_INDEX?= yes
-
-# Images
-IMAGES= sockets/layers.eps sockets/sain.eps sockets/sainfill.eps sockets/sainlsb.eps sockets/sainmsb.eps sockets/sainserv.eps sockets/serv.eps sockets/serv2.eps sockets/slayers.eps
-
-#
-# SRCS lists the individual SGML files that make up the document. Changes
-# to any of these files will force a rebuild
-#
-
-# SGML content
-SRCS= book.sgml
-SRCS+= introduction/chapter.sgml
-SRCS+= tools/chapter.sgml
-SRCS+= secure/chapter.sgml
-SRCS+= l10n/chapter.sgml
-SRCS+= locking/chapter.sgml
-SRCS+= sockets/chapter.sgml
-SRCS+= ipv6/chapter.sgml
-SRCS+= isa/chapter.sgml
-SRCS+= pci/chapter.sgml
-SRCS+= usb/chapter.sgml
-SRCS+= scsi/chapter.sgml
-SRCS+= x86/chapter.sgml
-SRCS+= vm/chapter.sgml
-SRCS+= dma/chapter.sgml
-SRCS+= kerneldebug/chapter.sgml
-
-# Entities
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/books/arch-handbook/book.sgml b/en_US.ISO8859-1/books/arch-handbook/book.sgml
deleted file mode 100644
index 8e47eb22ff..0000000000
--- a/en_US.ISO8859-1/books/arch-handbook/book.sgml
+++ /dev/null
@@ -1,312 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD: doc/en_US.ISO8859-1/books/developers-handbook/book.sgml,v 1.27 2001/09/02 21:19:03 murray Exp $
--->
-
-<!DOCTYPE BOOK PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-<!ENTITY % bookinfo PUBLIC "-//FreeBSD//ENTITIES DocBook BookInfo Entities//EN">
-%bookinfo;
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man;
-<!ENTITY % chapters SYSTEM "chapters.ent"> %chapters;
-<!ENTITY % authors PUBLIC "-//FreeBSD//ENTITIES DocBook Author Entities//EN"> %authors
-<!ENTITY % mailing-lists PUBLIC "-//FreeBSD//ENTITIES DocBook Mailing List Entities//EN"> %mailing-lists;
-]>
-
-<book>
- <bookinfo>
- <title>FreeBSD Developers' Handbook</title>
-
- <corpauthor>The FreeBSD Documentation Project</corpauthor>
-
- <pubdate>August 2000</pubdate>
-
- <copyright>
- <year>2000</year>
- <year>2001</year>
- <holder>The FreeBSD Documentation Project</holder>
- </copyright>
-
- &bookinfo.legalnotice;
-
- <abstract>
- <para>Welcome to the Developers' Handbook. This manual is a
- <emphasis>work in progress</emphasis> and is the work of many
- individuals. Many sections do not yet exist and some of those
- that do exist need to be updated. If you are interested in
- helping with this project, send email to the &a.doc;.</para>
-
- <para>The latest version of this document is always available
- from the <ulink URL="http://www.FreeBSD.org/">FreeBSD World
- Wide Web server</ulink>. It may also be downloaded in a
- variety of formats and compression options from the <ulink
- url="ftp://ftp.FreeBSD.org/pub/FreeBSD/doc">FreeBSD FTP
- server</ulink> or one of the numerous <ulink
- url="http://www.freebsd.org/handbook/mirrors-ftp.html">mirror
- sites</ulink>.</para>
- </abstract>
- </bookinfo>
-
- <part id="Basics">
- <title>Basics</title>
-
- &chap.introduction;
- &chap.tools;
- &chap.secure;
- &chap.l10n;
-
- </part>
-
- <part id="ipc">
- <title>Interprocess Communication</title>
-
- <chapter id="signals">
- <title>* Signals</title>
-
- <para>Signals, pipes, semaphores, message queues, shared memory,
- ports, sockets, doors</para>
-
- </chapter>
-
- &chap.sockets;
- &chap.ipv6;
-
- </part>
-
- <part id="kernel">
- <title>Kernel</title>
-
- <chapter id="kernelhistory">
- <title>* History of the Unix Kernel</title>
-
- <para>Some history of the Unix/BSD kernel, system calls, how do
- processes work, blocking, scheduling, threads (kernel),
- context switching, signals, interrupts, modules, etc.</para>
-
- <para></para>
- </chapter>
-
- &chap.locking;
- &chap.kobj;
- &chap.sysinit;
- &chap.vm;
- &chap.dma;
- &chap.kerneldebug;
-
- <chapter id="ufs">
- <title>* UFS</title>
-
- <para>UFS, FFS, Ext2FS, JFS, inodes, buffer cache, labeling,
- locking, metadata, soft-updates, LFS, portalfs, procfs,
- vnodes, memory sharing, memory objects, TLBs, caching</para>
-
- </chapter>
-
- <chapter id="afs">
- <title>* AFS</title>
-
- <para>AFS, NFS, SANs etc]</para>
-
- </chapter>
-
- <chapter id="syscons">
- <title>* Syscons</title>
-
- <para>Syscons, tty, PCVT, serial console, screen savers,
- etc</para>
-
- </chapter>
-
- <chapter id="compatibility">
- <title>* Compatibility Layers</title>
-
- <sect1 id="linux">
- <title>* Linux</title>
-
- <para>Linux, SVR4, etc</para>
- </sect1>
-
- </chapter>
- </part>
-
- <part id="devicedrivers">
- <title>Device Drivers</title>
-
- &chap.driverbasics;
- &chap.isa;
- &chap.pci;
- &chap.scsi;
- &chap.usb;
-
- <chapter id="newbus">
- <title>* NewBus</title>
-
- <para>This chapter will talk about the FreeBSD NewBus
- architecture.</para>
- </chapter>
-
- <chapter id="oss">
- <title>* Sound subsystem</title>
-
- <para>OSS, waveforms, etc</para>
-
- </chapter>
-
- </part>
-
- <part id="architectures">
- <title>Architectures</title>
-
- &chap.x86;
-
- <chapter id="alpha">
- <title>* Alpha</title>
-
- <para>Talk about the architectural specifics of
- FreeBSD/alpha.</para>
-
- <para>Explanation of allignment errors, how to fix, how to
- ignore.</para>
-
- <para>Example assembly language code for FreeBSD/alpha.</para>
- </chapter>
-
- <chapter id="ia64">
- <title>* IA-64</title>
-
- <para>Talk about the architectural specifics of
- FreeBSD/ia64.</para>
-
- </chapter>
- </part>
-
- <part id="appendices">
- <title>Appendices</title>
-
- <bibliography>
-
- <biblioentry id="COD" xreflabel="1">
- <authorgroup>
- <author>
- <firstname>Dave</firstname>
- <othername role="MI">A</othername>
- <surname>Patterson</surname>
- </author>
- <author>
- <firstname>John</firstname>
- <othername role="MI">L</othername>
- <surname>Hennessy</surname>
- </author>
- </authorgroup>
- <copyright><year>1998</year><holder>Morgan Kaufmann Publishers,
- Inc.</holder></copyright>
- <isbn>1-55860-428-6</isbn>
- <publisher>
- <publishername>Morgan Kaufmann Publishers, Inc.</publishername>
- </publisher>
- <title>Computer Organization and Design</title>
- <subtitle>The Hardware / Software Interface</subtitle>
- <pagenums>1-2</pagenums>
- </biblioentry>
-
- <biblioentry xreflabel="2">
- <authorgroup>
- <author>
- <firstname>W.</firstname>
- <othername role="Middle">Richard</othername>
- <surname>Stevens</surname>
- </author>
- </authorgroup>
- <copyright><year>1993</year><holder>Addison Wesley Longman,
- Inc.</holder></copyright>
- <isbn>0-201-56317-7</isbn>
- <publisher>
- <publishername>Addison Wesley Longman, Inc.</publishername>
- </publisher>
- <title>Advanced Programming in the Unix Environment</title>
- <pagenums>1-2</pagenums>
- </biblioentry>
-
- <biblioentry xreflabel="3">
- <authorgroup>
- <author>
- <firstname>Marshall</firstname>
- <othername role="Middle">Kirk</othername>
- <surname>McKusick</surname>
- </author>
- <author>
- <firstname>Keith</firstname>
- <surname>Bostic</surname>
- </author>
- <author>
- <firstname>Michael</firstname>
- <othername role="MI">J</othername>
- <surname>Karels</surname>
- </author>
- <author>
- <firstname>John</firstname>
- <othername role="MI">S</othername>
- <surname>Quarterman</surname>
- </author>
- </authorgroup>
- <copyright><year>1996</year><holder>Addison-Wesley Publishing Company,
- Inc.</holder></copyright>
- <isbn>0-201-54979-4</isbn>
- <publisher>
- <publishername>Addison-Wesley Publishing Company, Inc.</publishername>
- </publisher>
- <title>The Design and Implementation of the 4.4 BSD Operating System</title>
- <pagenums>1-2</pagenums>
- </biblioentry>
-
- <biblioentry id="Phrack" xreflabel="4">
- <authorgroup>
- <author>
- <firstname>Aleph</firstname>
- <surname>One</surname>
- </author>
- </authorgroup>
- <title>Phrack 49; "Smashing the Stack for Fun and Profit"</title>
- </biblioentry>
-
- <biblioentry id="StackGuard" xreflabel="5">
- <authorgroup>
- <author>
- <firstname>Chrispin</firstname>
- <surname>Cowan</surname>
- </author>
- <author>
- <firstname>Calton</firstname>
- <surname>Pu</surname>
- </author>
- <author>
- <firstname>Dave</firstname>
- <surname>Maier</surname>
- </author>
- </authorgroup>
- <title>StackGuard; Automatic Adaptive Detection and Prevention of
- Buffer-Overflow Attacks</title>
- </biblioentry>
-
- <biblioentry id="OpenBSD" xreflabel="6">
- <authorgroup>
- <author>
- <firstname>Todd</firstname>
- <surname>Miller</surname>
- </author>
- <author>
- <firstname>Theo</firstname>
- <surname>de Raadt</surname>
- </author>
- </authorgroup>
- <title>strlcpy and strlcat -- consistent, safe string copy and
- concatenation.</title>
- </biblioentry>
-
- </bibliography>
-
- &chap.index;
- </part>
-
-</book>
diff --git a/en_US.ISO8859-1/books/arch-handbook/chapters.ent b/en_US.ISO8859-1/books/arch-handbook/chapters.ent
deleted file mode 100644
index 16d4820d09..0000000000
--- a/en_US.ISO8859-1/books/arch-handbook/chapters.ent
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
- Creates entities for each chapter in the FreeBSD Developer's
- Handbook. Each entity is named chap.foo, where foo is the value
- of the id attribute on that chapter, and corresponds to the name of
- the directory in which that chapter's .sgml file is stored.
-
- Chapters should be listed in the order in which they are referenced.
-
- $FreeBSD: doc/en_US.ISO8859-1/books/developers-handbook/chapters.ent,v 1.12 2001/09/02 21:19:03 murray Exp $
--->
-
-<!-- Part one -->
-<!ENTITY chap.introduction SYSTEM "introduction/chapter.sgml">
-<!ENTITY chap.tools SYSTEM "tools/chapter.sgml">
-<!ENTITY chap.secure SYSTEM "secure/chapter.sgml">
-<!ENTITY chap.l10n SYSTEM "l10n/chapter.sgml">
-
-<!-- Part two -->
-<!ENTITY chap.kobj SYSTEM "kobj/chapter.sgml">
-<!ENTITY chap.sysinit SYSTEM "sysinit/chapter.sgml">
-<!ENTITY chap.locking SYSTEM "locking/chapter.sgml">
-
-<!-- Part three -->
-<!ENTITY chap.vm SYSTEM "vm/chapter.sgml">
-<!ENTITY chap.dma SYSTEM "dma/chapter.sgml">
-
-<!-- Part four -->
-<!-- No significant material yet, still in book.sgml -->
-
-<!-- Part five -->
-<!-- No significant material yet, still in book.sgml -->
-
-<!-- Part six -->
-<!ENTITY chap.sockets SYSTEM "sockets/chapter.sgml">
-<!ENTITY chap.ipv6 SYSTEM "ipv6/chapter.sgml">
-
-<!-- Part seven -->
-<!-- No significant material yet, still in book.sgml -->
-
-<!-- Part eight -->
-<!-- No significant material yet, still in book.sgml -->
-
-<!-- Part nine -->
-<!-- No significant material yet, still in book.sgml -->
-
-<!ENTITY chap.kerneldebug SYSTEM "kerneldebug/chapter.sgml">
-
-<!-- Part ten -->
-<!ENTITY chap.driverbasics SYSTEM "driverbasics/chapter.sgml">
-<!ENTITY chap.isa SYSTEM "isa/chapter.sgml">
-<!ENTITY chap.pci SYSTEM "pci/chapter.sgml">
-<!ENTITY chap.scsi SYSTEM "scsi/chapter.sgml">
-<!ENTITY chap.usb SYSTEM "usb/chapter.sgml">
-
-<!-- Part eleven -->
-<!ENTITY chap.x86 SYSTEM "x86/chapter.sgml">
-
-<!-- Part twelve -->
-<!-- No significant material yet, still in book.sgml -->
-
-<!-- Part thirteen -->
-<!-- No significant material yet, still in book.sgml -->
-
-<!-- Part fourteen (appendices) -->
-<!ENTITY chap.bibliography SYSTEM "bibliography/chapter.sgml">
-<!ENTITY chap.index SYSTEM "index.sgml">
diff --git a/en_US.ISO8859-1/books/arch-handbook/driverbasics/chapter.sgml b/en_US.ISO8859-1/books/arch-handbook/driverbasics/chapter.sgml
deleted file mode 100644
index a65ec54238..0000000000
--- a/en_US.ISO8859-1/books/arch-handbook/driverbasics/chapter.sgml
+++ /dev/null
@@ -1,391 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD: doc/en_US.ISO8859-1/books/developers-handbook/driverbasics/chapter.sgml,v 1.8 2001/07/19 10:37:35 dd Exp $
--->
-
-<chapter id="driverbasics">
- <title>Writing FreeBSD Device Drivers</title>
-
- <para>This chapter was written by &a.murray; with selections from a
- variety of sources including the intro(4) man page by
- &a.joerg;.</para>
-
- <sect1>
- <title>Introduction</title>
- <para>This chapter provides a brief introduction to writing device
- drivers for FreeBSD. A device in this context is a term used
- mostly for hardware-related stuff that belongs to the system,
- like disks, printers, or a graphics display with its keyboard.
- A device driver is the software component of the operating
- system that controls a specific device. There are also
- so-called pseudo-devices where a device driver emulates the
- behaviour of a device in software without any particular
- underlying hardware. Device drivers can be compiled into the
- system statically or loaded on demand through the dynamic kernel
- linker facility `kld'.</para>
-
- <para>Most devices in a Unix-like operating system are accessed
- through device-nodes, sometimes also called special files.
- These files are usually located under the directory
- <filename>/dev</filename> in the file system hierarchy. Until
- devfs is fully integrated into FreeBSD, each device node must be
- created statically and independent of the existence of the
- associated device driver. Most device nodes on the system are
- created by running <command>MAKEDEV</command>.</para>
-
- <para>Device drivers can roughly be broken down into two
- categories; character and network device drivers.</para>
-
- </sect1>
-
- <sect1>
- <title>Dynamic Kernel Linker Facility - KLD</title>
-
- <para>The kld interface allows system administrators to
- dynamically add and remove functionality from a running system.
- This allows device driver writers to load their new changes into
- a running kernel without constantly rebooting to test
- changes.</para>
-
- <para>The kld interface is used through the following
- administrator commands :
-
- <itemizedlist>
- <listitem><simpara><command>kldload</command> - loads a new kernel
- module</simpara></listitem>
- <listitem><simpara><command>kldunload</command> - unloads a kernel
- module</simpara></listitem>
- <listitem><simpara><command>kldstat</command> - lists the currently loadded
- modules</simpara></listitem>
- </itemizedlist>
- </para>
-
- <para>Skeleton Layout of a kernel module</para>
-
-<programlisting>/*
- * KLD Skeleton
- * Inspired by Andrew Reiter's Daemonnews article
- */
-
-#include &lt;sys/types.h&gt;
-#include &lt;sys/module.h&gt;
-#include &lt;sys/systm.h&gt; /* uprintf */
-#include &lt;sys/errno.h&gt;
-#include &lt;sys/param.h&gt; /* defines used in kernel.h */
-#include &lt;sys/kernel.h&gt; /* types used in module initialization */
-
-/*
- * Load handler that deals with the loading and unloading of a KLD.
- */
-
-static int
-skel_loader(struct module *m, int what, void *arg)
-{
- int err = 0;
-
- switch (what) {
- case MOD_LOAD: /* kldload */
- uprintf("Skeleton KLD loaded.\n");
- break;
- case MOD_UNLOAD:
- uprintf("Skeleton KLD unloaded.\n");
- break;
- default:
- err = EINVAL;
- break;
- }
- return(err);
-}
-
-/* Declare this module to the rest of the kernel */
-
-static moduledata_t skel_mod = {
- "skel",
- skel_loader,
- NULL
-};
-
-DECLARE_MODULE(skeleton, skel_mod, SI_SUB_KLD, SI_ORDER_ANY);</programlisting>
-
-
- <sect2>
- <title>Makefile</title>
-
- <para>FreeBSD provides a makefile include that you can use to
- quickly compile your kernel addition.</para>
-
- <programlisting>SRCS=skeleton.c
-KMOD=skeleton
-
-.include &lt;bsd.kmod.mk&gt;</programlisting>
-
- <para>Simply running <command>make</command> with this makefile
- will create a file <filename>skeleton.ko</filename> that can
- be loaded into your system by typing :
-<screen> &prompt.root
- kldload -v ./skeleton.ko</screen>
- </para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Accessing a device driver</title>
-
- <para>Unix provides a common set of system calls for user
- applications to use. The upper layers of the kernel dispatch
- these calls to the corresponding device driver when a user
- accesses a device node. The <command>/dev/MAKEDEV</command>
- script makes most of the device nodes for your system but if you
- are doing your own driver development it may be necessary to
- create your own device nodes with <command>mknod</command>
- </para>
-
- <sect2>
- <title>Creating static device nodes</title>
-
- <para>The <command>mknod</command> command requires four
- arguments to create a device node. You must specify the name
- of this device node, the type of device, the major number of
- the device, and the minor number of the device.</para>
- </sect2>
-
- <sect2>
- <title>Dynamic device nodes</title>
-
- <para>The device filesystem, or devfs, provides access to the
- kernel's device namespace in the global filesystem namespace.
- This eliminates the problems of potentially having a device
- driver without a static device node, or a device node without
- an installed device driver. Devfs is still a work in
- progress, but it is already working quite nice.</para>
- </sect2>
-
- </sect1>
-
- <sect1>
- <title>Character Devices</title>
-
- <para>A character device driver is one that transfers data
- directly to and from a user process. This is the most common
- type of device driver and there are plenty of simple examples in
- the source tree.</para>
-
- <para>This simple example pseudo-device remembers whatever values
- you write to it and can then supply them back to you when you
- read from it.</para>
-
- <programlisting>/*
- * Simple `echo' pseudo-device KLD
- *
- * Murray Stokely
- */
-
-#define MIN(a,b) (((a) < (b)) ? (a) : (b))
-
-#include &lt;sys/types.h&gt;
-#include &lt;sys/module.h&gt;
-#include &lt;sys/systm.h&gt; /* uprintf */
-#include &lt;sys/errno.h&gt;
-#include &lt;sys/param.h&gt; /* defines used in kernel.h */
-#include &lt;sys/kernel.h&gt; /* types used in module initialization */
-#include &lt;sys/conf.h&gt; /* cdevsw struct */
-#include &lt;sys/uio.h&gt; /* uio struct */
-#include &lt;sys/malloc.h&gt;
-
-#define BUFFERSIZE 256
-
-/* Function prototypes */
-d_open_t echo_open;
-d_close_t echo_close;
-d_read_t echo_read;
-d_write_t echo_write;
-
-/* Character device entry points */
-static struct cdevsw echo_cdevsw = {
- echo_open,
- echo_close,
- echo_read,
- echo_write,
- noioctl,
- nopoll,
- nommap,
- nostrategy,
- "echo",
- 33, /* reserved for lkms - /usr/src/sys/conf/majors */
- nodump,
- nopsize,
- D_TTY,
- -1
-};
-
-typedef struct s_echo {
- char msg[BUFFERSIZE];
- int len;
-} t_echo;
-
-/* vars */
-static dev_t sdev;
-static int len;
-static int count;
-static t_echo *echomsg;
-
-MALLOC_DECLARE(M_ECHOBUF);
-MALLOC_DEFINE(M_ECHOBUF, "echobuffer", "buffer for echo module");
-
-/*
- * This function acts is called by the kld[un]load(2) system calls to
- * determine what actions to take when a module is loaded or unloaded.
- */
-
-static int
-echo_loader(struct module *m, int what, void *arg)
-{
- int err = 0;
-
- switch (what) {
- case MOD_LOAD: /* kldload */
- sdev = make_dev(<literal>&</literal>echo_cdevsw,
- 0,
- UID_ROOT,
- GID_WHEEL,
- 0600,
- "echo");
- /* kmalloc memory for use by this driver */
- /* malloc(256,M_ECHOBUF,M_WAITOK); */
- MALLOC(echomsg, t_echo *, sizeof(t_echo), M_ECHOBUF, M_WAITOK);
- printf("Echo device loaded.\n");
- break;
- case MOD_UNLOAD:
- destroy_dev(sdev);
- FREE(echomsg,M_ECHOBUF);
- printf("Echo device unloaded.\n");
- break;
- default:
- err = EINVAL;
- break;
- }
- return(err);
-}
-
-int
-echo_open(dev_t dev, int oflags, int devtype, struct proc *p)
-{
- int err = 0;
-
- uprintf("Opened device \"echo\" successfully.\n");
- return(err);
-}
-
-int
-echo_close(dev_t dev, int fflag, int devtype, struct proc *p)
-{
- uprintf("Closing device \"echo.\"\n");
- return(0);
-}
-
-/*
- * The read function just takes the buf that was saved via
- * echo_write() and returns it to userland for accessing.
- * uio(9)
- */
-
-int
-echo_read(dev_t dev, struct uio *uio, int ioflag)
-{
- int err = 0;
- int amt;
-
- /* How big is this read operation? Either as big as the user wants,
- or as big as the remaining data */
- amt = MIN(uio->uio_resid, (echomsg->len - uio->uio_offset > 0) ? echomsg->len - uio->uio_offset : 0);
- if ((err = uiomove(echomsg->msg + uio->uio_offset,amt,uio)) != 0) {
- uprintf("uiomove failed!\n");
- }
-
- return err;
-}
-
-/*
- * echo_write takes in a character string and saves it
- * to buf for later accessing.
- */
-
-int
-echo_write(dev_t dev, struct uio *uio, int ioflag)
-{
- int err = 0;
-
- /* Copy the string in from user memory to kernel memory */
- err = copyin(uio->uio_iov->iov_base, echomsg->msg, MIN(uio->uio_iov->iov_len,BUFFERSIZE));
-
- /* Now we need to null terminate */
- *(echomsg->msg + MIN(uio->uio_iov->iov_len,BUFFERSIZE)) = 0;
- /* Record the length */
- echomsg->len = MIN(uio->uio_iov->iov_len,BUFFERSIZE);
-
- if (err != 0) {
- uprintf("Write failed: bad address!\n");
- }
-
- count++;
- return(err);
-}
-
-DEV_MODULE(echo,echo_loader,NULL);</programlisting>
-
- <para>To install this driver you will first need to make a node on
- your filesystem with a command such as : </para>
-
- <screen>&prompt.root mknod /dev/echo c 33 0</screen>
-
- <para>With this driver loaded you should now be able to type
- something like :</para>
-
- <screen>&prompt.root echo -n "Test Data" > /dev/echo
-&prompt.root cat /dev/echo
-Test Data</screen>
-
- <para>Real hardware devices in the next chapter..</para>
-
- <para>Additional Resources
- <itemizedlist>
- <listitem><simpara><ulink
- url="http://www.daemonnews.org/200010/blueprints.html">Dynamic
- Kernel Linker (KLD) Facility Programming Tutorial</ulink> -
- <ulink url="http://www.daemonnews.org">Daemonnews</ulink> October 2000</simpara></listitem>
- <listitem><simpara><ulink
- url="http://www.daemonnews.org/200007/newbus-intro.html">How
- to Write Kernel Drivers with NEWBUS</ulink> - <ulink
- url="http://www.daemonnews.org">Daemonnews</ulink> July
- 2000</simpara></listitem>
- </itemizedlist>
- </para>
- </sect1>
-
- <sect1>
- <title>Network Drivers</title>
-
- <para>Drivers for network devices do not use device nodes in order
- to be accessed. Their selection is based on other decisions
- made inside the kernel and instead of calling open(), use of a
- network device is generally introduced by using the system call
- socket(2).</para>
-
- <para>man ifnet(), loopback device, Bill Paul's drivers,
- etc..</para>
-
- </sect1>
-
-</chapter>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-declaration: "../chapter.decl"
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- sgml-parent-document: ("../book.sgml" "part" "chapter")
- End:
--->
diff --git a/en_US.ISO8859-1/books/arch-handbook/isa/chapter.sgml b/en_US.ISO8859-1/books/arch-handbook/isa/chapter.sgml
deleted file mode 100644
index 96f68a88c5..0000000000
--- a/en_US.ISO8859-1/books/arch-handbook/isa/chapter.sgml
+++ /dev/null
@@ -1,2479 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD: doc/en_US.ISO8859-1/books/developers-handbook/isa/chapter.sgml,v 1.1 2001/05/02 01:56:01 murray Exp $
--->
-
-<chapter id="isa-driver">
- <title>ISA device drivers</title>
-
- <para>
- <emphasis>
- This chapter was written by &a.babkin; Modifications for the
- handbook made by &a.murray;, &a.wylie;, and &a.logo;.
- </emphasis>
- </para>
-
- <sect1>
- <title>Synopsis</title>
-
- <para>This chapter introduces the issues relevant to writing a
- driver for an ISA device. The pseudo-code presented here is
- rather detailed and reminiscent of the real code but is still
- only pseudo-code. It avoids the details irrelevant to the
- subject of the discussion. The real-life examples can be found
- in the source code of real drivers. In particular the drivers
- "ep" and "aha" are good sources of information.</para>
- </sect1>
-
- <sect1>
- <title>Basic information</title>
-
- <para>A typical ISA driver would need the following include
- files:</para>
-
-<programlisting>#include &lt;sys/module.h&gt;
-#include &lt;sys/bus.h&gt;
-#include &lt;machine/bus.h&gt;
-#include &lt;machine/resource.h&gt;
-#include &lt;sys/rman.h&gt;
-
-#include &lt;isa/isavar.h&gt;
-#include &lt;isa/pnpvar.h&gt;</programlisting>
-
- <para>They describe the things specific to the ISA and generic
- bus subsystem.</para>
-
- <para>The bus subsystem is implemented in an object-oriented
- fashion, its main structures are accessed by associated method
- functions.</para>
-
- <para>The list of bus methods implemented by an ISA driver is like
- one for any other bus. For a hypothetical driver named "xxx"
- they would be:</para>
-
- <itemizedlist>
- <listitem>
- <para><function>static void xxx_isa_identify (driver_t *,
- device_t);</function> Normally used for bus drivers, not
- device drivers. But for ISA devices this method may have
- special use: if the device provides some device-specific
- (non-PnP) way to auto-detect devices this routine may
- implement it.</para>
- </listitem>
-
- <listitem>
- <para><function>static int xxx_isa_probe (device_t
- dev);</function> Probe for a device at a known (or PnP)
- location. This routine can also accommodate device-specific
- auto-detection of parameters for partially configured
- devices.</para>
- </listitem>
-
- <listitem>
- <para><function>static int xxx_isa_attach (device_t
- dev);</function> Attach and initialize device.</para>
- </listitem>
-
- <listitem>
- <para><function>static int xxx_isa_detach (device_t
- dev);</function> Detach device before unloading the driver
- module.</para>
- </listitem>
-
- <listitem>
- <para><function>static int xxx_isa_shutdown (device_t
- dev);</function> Execute shutdown of the device before
- system shutdown.</para>
- </listitem>
-
- <listitem>
- <para><function>static int xxx_isa_suspend (device_t
- dev);</function> Suspend the device before the system goes
- to the power-save state. May also abort transition to the
- power-save state.</para>
- </listitem>
-
- <listitem>
- <para><function>static int xxx_isa_resume (device_t
- dev);</function> Resume the device activity after return
- from power-save state.</para>
- </listitem>
-
- </itemizedlist>
-
- <para><function>xxx_isa_probe()</function> and
- <function>xxx_isa_attach()</function> are mandatory, the rest of
- the routines are optional, depending on the device's
- needs.</para>
-
- <para>The driver is linked to the system with the following set of
- descriptions.</para>
-
-<programlisting> /* table of supported bus methods */
- static device_method_t xxx_isa_methods[] = {
- /* list all the bus method functions supported by the driver */
- /* omit the unsupported methods */
- DEVMETHOD(device_identify, xxx_isa_identify),
- DEVMETHOD(device_probe, xxx_isa_probe),
- DEVMETHOD(device_attach, xxx_isa_attach),
- DEVMETHOD(device_detach, xxx_isa_detach),
- DEVMETHOD(device_shutdown, xxx_isa_shutdown),
- DEVMETHOD(device_suspend, xxx_isa_suspend),
- DEVMETHOD(device_resume, xxx_isa_resume),
-
- { 0, 0 }
- };
-
- static driver_t xxx_isa_driver = {
- "xxx",
- xxx_isa_methods,
- sizeof(struct xxx_softc),
- };
-
-
- static devclass_t xxx_devclass;
-
- DRIVER_MODULE(xxx, isa, xxx_isa_driver, xxx_devclass,
- load_function, load_argument);</programlisting>
-
- <para>Here struct <structname>xxx_softc</structname> is a
- device-specific structure that contains private driver data
- and descriptors for the driver's resources. The bus code
- automatically allocates one softc descriptor per device as
- needed.</para>
-
- <para>If the driver is implemented as a loadable module then
- <function>load_function()</function> is called to do
- driver-specific initialization or clean-up when the driver is
- loaded or unloaded and load_argument is passed as one of its
- arguments. If the driver does not support dynamic loading (in
- other words it must always be linked into kernel) then these
- values should be set to 0 and the last definition would look
- like:</para>
-
- <programlisting> DRIVER_MODULE(xxx, isa, xxx_isa_driver,
- xxx_devclass, 0, 0);</programlisting>
-
- <para>If the driver is for a device which supports PnP then a
- table of supported PnP IDs must be defined. The table
- consists of a list of PnP IDs supported by this driver and
- human-readable descriptions of the hardware types and models
- having these IDs. It looks like:</para>
-
-<programlisting> static struct isa_pnp_id xxx_pnp_ids[] = {
- /* a line for each supported PnP ID */
- { 0x12345678, "Our device model 1234A" },
- { 0x12345679, "Our device model 1234B" },
- { 0, NULL }, /* end of table */
- };</programlisting>
-
- <para>If the driver does not support PnP devices it still needs
- an empty PnP ID table, like:</para>
-
-<programlisting> static struct isa_pnp_id xxx_pnp_ids[] = {
- { 0, NULL }, /* end of table */
- };</programlisting>
-
- </sect1>
-
- <sect1>
- <title>Device_t pointer</title>
-
- <para><structname>Device_t</structname> is the pointer type for
- the device structure. Here we consider only the methods
- interesting from the device driver writer's standpoint. The
- methods to manipulate values in the device structure
- are:</para>
-
- <itemizedlist>
-
- <listitem><para><function>device_t
- device_get_parent(dev)</function> Get the parent bus of a
- device.</para></listitem>
-
- <listitem><para><function>driver_t
- device_get_driver(dev)</function> Get pointer to its driver
- structure.</para></listitem>
-
- <listitem><para><function>char
- *device_get_name(dev)</function> Get the driver name, such
- as "xxx" for our example.</para></listitem>
-
- <listitem><para><function>int device_get_unit(dev)</function>
- Get the unit number (units are numbered from 0 for the
- devices associated with each driver).</para></listitem>
-
- <listitem><para><function>char
- *device_get_nameunit(dev)</function> Get the device name
- including the unit number, such as "xxx0" , "xxx1" and so
- on.</para></listitem>
-
- <listitem><para><function>char
- *device_get_desc(dev)</function> Get the device
- description. Normally it describes the exact model of device
- in human-readable form.</para></listitem>
-
- <listitem><para><function>device_set_desc(dev,
- desc)</function> Set the description. This makes the device
- description point to the string desc which may not be
- deallocated or changed after that.</para></listitem>
-
- <listitem><para><function>device_set_desc_copy(dev,
- desc)</function> Set the description. The description is
- copied into an internal dynamically allocated buffer, so the
- string desc may be changed afterwards without adverse
- effects.</para></listitem>
-
- <listitem><para><function>void
- *device_get_softc(dev)</function> Get pointer to the device
- descriptor (struct <structname>xxx_softc</structname>)
- associated with this device.</para></listitem>
-
- <listitem><para><function>u_int32_t
- device_get_flags(dev)</function> Get the flags specified for
- the device in the configuration file.</para></listitem>
-
- </itemizedlist>
-
- <para>A convenience function <function>device_printf(dev, fmt,
- ...)</function> may be used to print the messages from the
- device driver. It automatically prepends the unitname and
- colon to the message.</para>
-
- <para>The device_t methods are implemented in the file
- kern/bus_subr.c.</para>
-
- </sect1>
-
- <sect1>
- <title>Config file and the order of identifying and probing
- during auto-configuration</title>
-
- <para>The ISA devices are described in the kernel config file
- like:</para>
-
- <programlisting>device xxx0 at isa? port 0x300 irq 10 drq 5
- iomem 0xd0000 flags 0x1 sensitive</programlisting>
-
- <para>The values of port, IRQ and so on are converted to the
- resource values associated with the device. They are optional,
- depending on the device needs and abilities for
- auto-configuration. For example, some devices don't need DRQ
- at all and some allow the driver to read the IRQ setting from
- the device configuration ports. If a machine has multiple ISA
- buses the exact bus may be specified in the configuration
- line, like "isa0" or "isa1", otherwise the device would be
- searched for on all the ISA buses.</para>
-
- <para>"sensitive" is a resource requesting that this device must
- be probed before all non-sensitive devices. It is supported
- but does not seem to be used in any current driver.</para>
-
- <para>For legacy ISA devices in many cases the drivers are still
- able to detect the configuration parameters. But each device
- to be configured in the system must have a config line. If two
- devices of some type are installed in the system but there is
- only one configuration line for the corresponding driver, ie:
- <programlisting>device xxx0 at isa?</programlisting> then only
- one device will be configured.</para>
-
- <para>But for the devices supporting automatic identification by
- the means of Plug-n-Play or some proprietary protocol one
- configuration line is enough to configure all the devices in
- the system, like the one above or just simply:</para>
-
- <programlisting>device xxx at isa?</programlisting>
-
- <para>If a driver supports both auto-identified and legacy
- devices and both kinds are installed at once in one machine
- then it's enough to describe in the config file the legacy
- devices only. The auto-identified devices will be added
- automatically.</para>
-
- <para>When an ISA bus is auto-configured the events happen as
- follows:</para>
-
- <para>All the drivers' identify routines (including the PnP
- identify routine which identifies all the PnP devices) are
- called in random order. As they identify the devices they add
- them to the list on the ISA bus. Normally the drivers'
- identify routines associate their drivers with the new
- devices. The PnP identify routine does not know about the
- other drivers yet so it does not associate any with the new
- devices it adds.</para>
-
- <para>The PnP devices are put to sleep using the PnP protocol to
- prevent them from being probed as legacy devices.</para>
-
- <para>The probe routines of non-PnP devices marked as
- "sensitive" are called. If probe for a device went
- successfully, the attach routine is called for it.</para>
-
- <para>The probe and attach routines of all non-PNP devices are
- called likewise.</para>
-
- <para>The PnP devices are brought back from the sleep state and
- assigned the resources they request: I/O and memory address
- ranges, IRQs and DRQs, all of them not conflicting with the
- attached legacy devices.</para>
-
- <para>Then for each PnP device the probe routines of all the
- present ISA drivers are called. The first one that claims the
- device gets attached. It is possible that multiple drivers
- would claim the device with different priority, the
- highest-priority driver wins. The probe routines must call
- <function>ISA_PNP_PROBE()</function> to compare the actual PnP
- ID with the list of the IDs supported by the driver and if the
- ID is not in the table return failure. That means that
- absolutely every driver, even the ones not supporting any PnP
- devices must call <function>ISA_PNP_PROBE()</function>, at
- least with an empty PnP ID table to return failure on unknown
- PnP devices.</para>
-
- <para>The probe routine returns a positive value (the error
- code) on error, zero or negative value on success.</para>
-
- <para>The negative return values are used when a PnP device
- supports multiple interfaces. For example, an older
- compatibility interface and a newer advanced interface which
- are supported by different drivers. Then both drivers would
- detect the device. The driver which returns a higher value in
- the probe routine takes precedence (in other words, the driver
- returning 0 has highest precedence, returning -1 is next,
- returning -2 is after it and so on). In result the devices
- which support only the old interface will be handled by the
- old driver (which should return -1 from the probe routine)
- while the devices supporting the new interface as well will be
- handled by the new driver (which should return 0 from the
- probe routine). If multiple drivers return the same value then
- the one called first wins. So if a driver returns value 0 it
- may be sure that it won the priority arbitration.</para>
-
- <para>The device-specific identify routines can also assign not
- a driver but a class of drivers to the device. Then all the
- drivers in the class are probed for this device, like the case
- with PnP. This feature is not implemented in any existing
- driver and is not considered further in this document.</para>
-
- <para>Because the PnP devices are disabled when probing the
- legacy devices they will not be attached twice (once as legacy
- and once as PnP). But in case of device-dependent identify
- routines it's the responsibility of the driver to make sure
- that the same device won't be attached by the driver twice:
- once as legacy user-configured and once as
- auto-identified.</para>
-
- <para>Another practical consequence for the auto-identified
- devices (both PnP and device-specific) is that the flags can
- not be passed to them from the kernel configuration file. So
- they must either not use the flags at all or use the flags
- from the device unit 0 for all the auto-identified devices or
- use the sysctl interface instead of flags.</para>
-
- <para>Other unusual configurations may be accommodated by
- accessing the configuration resources directly with functions
- of families <function>resource_query_*()</function> and
- <function>resource_*_value()</function>. Their implementations
- are located in kern/subr_bus.h. The old IDE disk driver
- i386/isa/wd.c contains examples of such use. But the standard
- means of configuration must always be preferred. Leave parsing
- the configuration resources to the bus configuration
- code.</para>
-
- </sect1>
-
- <sect1>
- <title>Resources</title>
-
- <para>The information that a user enters into the kernel
- configuration file is processed and passed to the kernel as
- configuration resources. This information is parsed by the bus
- configuration code and transformed into a value of structure
- device_t and the bus resources associated with it. The drivers
- may access the configuration resources directly using
- functions resource_* for more complex cases of
- configuration. But generally it's not needed nor recommended,
- so this issue is not discussed further.</para>
-
- <para>The bus resources are associated with each device. They
- are identified by type and number within the type. For the ISA
- bus the following types are defined:</para>
-
- <itemizedlist>
- <listitem>
- <para><emphasis>SYS_RES_IRQ</emphasis> - interrupt
- number</para>
- </listitem>
-
- <listitem>
- <para><emphasis>SYS_RES_DRQ</emphasis> - ISA DMA channel
- number</para>
- </listitem>
-
- <listitem>
- <para><emphasis>SYS_RES_MEMORY</emphasis> - range of
- device memory mapped into the system memory space
- </para>
- </listitem>
-
- <listitem>
- <para><emphasis>SYS_RES_IOPORT</emphasis> - range of
- device I/O registers</para>
- </listitem>
- </itemizedlist>
-
- <para>The enumeration within types starts from 0, so if a device
- has two memory regions if would have resources of type
- SYS_RES_MEMORY numbered 0 and 1. The resource type has
- nothing to do with the C language type, all the resource
- values have the C language type "unsigned long" and must be
- cast as necessary. The resource numbers don't have to be
- contiguous although for ISA they normally would be. The
- permitted resource numbers for ISA devices are:</para>
-
- <programlisting> IRQ: 0-1
- DRQ: 0-1
- MEMORY: 0-3
- IOPORT: 0-7</programlisting>
-
- <para>All the resources are represented as ranges, with a start
- value and count. For IRQ and DRQ resources the count would be
- normally equal to 1. The values for memory refer to the
- physical addresses.</para>
-
- <para>Three types of activities can be performed on
- resources:</para>
-
- <itemizedlist>
- <listitem><para>set/get</para></listitem>
- <listitem><para>allocate/release</para></listitem>
- <listitem><para>activate/deactivate</para></listitem>
- </itemizedlist>
-
- <para>Setting sets the range used by the resource. Allocation
- reserves the requested range that no other driver would be
- able to reserve it (and checking that no other driver reserved
- this range already). Activation makes the resource accessible
- to the driver doing whatever is necessary for that (for
- example, for memory it would be mapping into the kernel
- virtual address space).</para>
-
- <para>The functions to manipulate resources are:</para>
-
- <itemizedlist>
- <listitem>
- <para><function>int bus_set_resource(device_t dev, int type,
- int rid, u_long start, u_long count)</function></para>
-
- <para>Set a range for a resource. Returns 0 if successful,
- error code otherwise. Normally the only reason this
- function would return an error is value of type, rid,
- start or count out of permitted range.</para>
-
- <itemizedlist>
- <listitem>
- <para> dev - driver's device</para>
- </listitem>
- <listitem>
- <para> type - type of resource, SYS_RES_* </para>
- </listitem>
- <listitem>
- <para> rid - resource number (ID) within type </para>
- </listitem>
- <listitem>
- <para> start, count - resource range </para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para><function>int bus_get_resource(device_t dev, int type,
- int rid, u_long *startp, u_long *countp)</function></para>
-
- <para>Get the range of resource. Returns 0 if successful,
- error code if the resource is not defined yet.</para>
- </listitem>
-
- <listitem>
- <para><function>u_long bus_get_resource_start(device_t dev,
- int type, int rid) u_long bus_get_resource_count (device_t
- dev, int type, int rid)</function></para>
-
- <para>Convenience functions to get only the start or
- count. Return 0 in case of error, so if the resource start
- has 0 among the legitimate values it would be impossible
- to tell if the value is 0 or an error occurred. Luckily,
- no ISA resources for add-on drivers may have a start value
- equal 0.</para>
- </listitem>
-
- <listitem>
- <para><function>void bus_delete_resource(device_t dev, int
- type, int rid)</function></para>
- <para> Delete a resource, make it undefined.</para>
- </listitem>
-
- <listitem>
- <para><function>struct resource *
- bus_alloc_resource(device_t dev, int type, int *rid,
- u_long start, u_long end, u_long count, u_int
- flags)</function></para>
-
- <para>Allocate a resource as a range of count values not
- allocated by anyone else, somewhere between start and
- end. Alas, alignment is not supported. If the resource
- was not set yet it's automatically created. The special
- values of start 0 and end ~0 (all ones) means that the
- fixed values previously set by
- <function>bus_set_resource()</function> must be used
- instead: start and count as themselves and
- end=(start+count), in this case if the resource was not
- defined before then an error is returned. Although rid is
- passed by reference it's not set anywhere by the resource
- allocation code of the ISA bus. (The other buses may use a
- different approach and modify it).</para>
- </listitem>
- </itemizedlist>
-
- <para>Flags are a bitmap, the flags interesting for the caller
- are:</para>
-
- <itemizedlist>
- <listitem>
- <para><emphasis>RF_ACTIVE</emphasis> - causes the resource
- to be automatically activated after allocation.</para>
- </listitem>
-
- <listitem>
- <para><emphasis>RF_SHAREABLE</emphasis> - resource may be
- shared at the same time by multiple drivers.</para>
- </listitem>
-
- <listitem>
- <para><emphasis>RF_TIMESHARE</emphasis> - resource may be
- time-shared by multiple drivers, i.e. allocated at the
- same time by many but activated only by one at any given
- moment of time.</para>
- </listitem>
-<!-- XXXDONT KNOW IT THESE SHOULD BE TWO SEPERATE LISTS OR NOT -->
- <listitem>
- <para>Returns 0 on error. The allocated values may be
- obtained from the returned handle using methods
- <function>rhand_*()</function>.</para>
- </listitem>
- <listitem>
- <para><function>int bus_release_resource(device_t dev, int
- type, int rid, struct resource *r)</function></para>
- </listitem>
-
- <listitem>
- <para>Release the resource, r is the handle returned by
- <function>bus_alloc_resource()</function>. Returns 0 on
- success, error code otherwise.</para>
- </listitem>
-
- <listitem>
- <para><function>int bus_activate_resource(device_t dev, int
- type, int rid, struct resource *r)</function>
- <function>int bus_deactivate_resource(device_t dev, int
- type, int rid, struct resource *r)</function></para>
- </listitem>
-
- <listitem>
- <para>Activate or deactivate resource. Return 0 on success,
- error code otherwise. If the resource is time-shared and
- currently activated by another driver then EBUSY is
- returned.</para>
- </listitem>
-
- <listitem>
- <para><function>int bus_setup_intr(device_t dev, struct
- resource *r, int flags, driver_intr_t *handler, void *arg,
- void **cookiep)</function> <function>int
- bus_teardown_intr(device_t dev, struct resource *r, void
- *cookie)</function></para>
- </listitem>
-
- <listitem>
- <para>Associate or de-associate the interrupt handler with a
- device. Return 0 on success, error code otherwise.</para>
- </listitem>
-
- <listitem>
- <para>r - the activated resource handler describing the
- IRQ</para>
- <para>flags - the interrupt priority level, one of:</para>
-
- <itemizedlist>
- <listitem>
- <para><function>INTR_TYPE_TTY</function> - terminals and
- other likewise character-type devices. To mask them
- use <function>spltty()</function>.</para>
- </listitem>
- <listitem>
- <para><function>(INTR_TYPE_TTY |
- INTR_TYPE_FAST)</function> - terminal type devices
- with small input buffer, critical to the data loss on
- input (such as the old-fashioned serial ports). To
- mask them use <function>spltty()</function>.</para>
- </listitem>
- <listitem>
- <para><function>INTR_TYPE_BIO</function> - block-type
- devices, except those on the CAM controllers. To mask
- them use <function>splbio()</function>.</para>
- </listitem>
- <listitem>
- <para><function>INTR_TYPE_CAM</function> - CAM (Common
- Access Method) bus controllers. To mask them use
- <function>splcam()</function>.</para>
- </listitem>
- <listitem>
- <para><function>INTR_TYPE_NET</function> - network
- interface controllers. To mask them use
- <function>splimp()</function>.</para>
- </listitem>
- <listitem>
- <para><function>INTR_TYPE_MISC</function> -
- miscellaneous devices. There is no other way to mask
- them than by <function>splhigh()</function> which
- masks all interrupts.</para>
- </listitem>
- </itemizedlist>
- </listitem>
- </itemizedlist>
-
- <para>When an interrupt handler executes all the other
- interrupts matching its priority level will be masked. The
- only exception is the MISC level for which no other interrupts
- are masked and which is not masked by any other
- interrupt.</para>
-
- <itemizedlist>
- <listitem>
- <para><emphasis>handler</emphasis> - pointer to the handler
- function, the type driver_intr_t is defined as "void
- driver_intr_t(void *)"</para>
- </listitem>
- <listitem>
- <para><emphasis>arg</emphasis> - the argument passed to the
- handler to identify this particular device. It is cast
- from void* to any real type by the handler. The old
- convention for the ISA interrupt handlers was to use the
- unit number as argument, the new (recommended) convention
- is using a pointer to the device softc structure.</para>
- </listitem>
- <listitem>
- <para><emphasis>cookie[p]</emphasis> - the value received
- from <function>setup()</function> is used to identify the
- handler when passed to
- <function>teardown()</function></para>
- </listitem>
- </itemizedlist>
-
- <para>A number of methods is defined to operate on the resource
- handlers (struct resource *). Those of interest to the device
- driver writers are:</para>
-
- <itemizedlist>
- <listitem>
- <para><function>u_long rman_get_start(r) u_long
- rman_get_end(r)</function> Get the start and end of
- allocated resource range.</para>
- </listitem>
- <listitem>
- <para><function>void *rman_get_virtual(r)</function> Get
- the virtual address of activated memory resource.</para>
- </listitem>
- </itemizedlist>
-
- </sect1>
-
- <sect1>
- <title>Bus memory mapping</title>
-
- <para>In many cases data is exchanged between the driver and the
- device through the memory. Two variants are possible:</para>
-
- <para>(a) memory is located on the device card</para>
- <para>(b) memory is the main memory of computer</para>
-
- <para>In the case (a) the driver always copies the data back and
- forth between the on-card memory and the main memory as
- necessary. To map the on-card memory into the kernel virtual
- address space the physical address and length of the on-card
- memory must be defined as a SYS_RES_MEMORY resource. That
- resource can then be allocated and activated, and its virtual
- address obtained using
- <function>rman_get_virtual()</function>. The older drivers
- used the function <function>pmap_mapdev()</function> for this
- purpose, which should not be used directly any more. Now it's
- one of the internal steps of resource activation.</para>
-
- <para>Most of the ISA cards will have their memory configured
- for physical location somewhere in range 640KB-1MB. Some of
- the ISA cards require larger memory ranges which should be
- placed somewhere under 16MB (because of the 24-bit address
- limitation on the ISA bus). In that case if the machine has
- more memory than the start address of the device memory (in
- other words, they overlap) a memory hole must be configured at
- the address range used by devices. Many BIOSes allow to
- configure a memory hole of 1MB starting at 14MB or
- 15MB. FreeBSD can handle the memory holes properly if the BIOS
- reports them properly (old BIOSes may have this feature
- broken).</para>
-
- <para>In the case (b) just the address of the data is sent to
- the device, and the device uses DMA to actually access the
- data in the main memory. Two limitations are present: First,
- ISA cards can only access memory below 16MB. Second, the
- contiguous pages in virtual address space may not be
- contiguous in physical address space, so the device may have
- to do scatter/gather operations. The bus subsystem provides
- ready solutions for some of these problems, the rest has to be
- done by the drivers themselves.</para>
-
- <para>Two structures are used for DMA memory allocation,
- bus_dma_tag_t and bus_dmamap_t. Tag describes the properties
- required for the DMA memory. Map represents a memory block
- allocated according to these properties. Multiple maps may be
- associated with the same tag.</para>
-
- <para>Tags are organized into a tree-like hierarchy with
- inheritance of the properties. A child tag inherits all the
- requirements of its parent tag or may make them more strict
- but never more loose.</para>
-
- <para>Normally one top-level tag (with no parent) is created for
- each device unit. If multiple memory areas with different
- requirements are needed for each device then a tag for each of
- them may be created as a child of the parent tag.</para>
-
- <para>The tags can be used to create a map in two ways.</para>
-
- <para>First, a chunk of contiguous memory conformant with the
- tag requirements may be allocated (and later may be
- freed). This is normally used to allocate relatively
- long-living areas of memory for communication with the
- device. Loading of such memory into a map is trivial: it's
- always considered as one chunk in the appropriate physical
- memory range.</para>
-
- <para>Second, an arbitrary area of virtual memory may be loaded
- into a map. Each page of this memory will be checked for
- conformance to the map requirement. If it conforms then it's
- left at it's original location. If it is not then a fresh
- conformant "bounce page" is allocated and used as intermediate
- storage. When writing the data from the non-conformant
- original pages they will be copied to their bounce pages first
- and then transferred from the bounce pages to the device. When
- reading the data would go from the device to the bounce pages
- and then copied to their non-conformant original pages. The
- process of copying between the original and bounce pages is
- called synchronization. This is normally used on per-transfer
- basis: buffer for each transfer would be loaded, transfer done
- and buffer unloaded.</para>
-
- <para>The functions working on the DMA memory are:</para>
-
- <itemizedlist>
- <listitem>
- <para><function>int bus_dma_tag_create(bus_dma_tag_t parent,
- bus_size_t alignment, bus_size_t boundary, bus_addr_t
- lowaddr, bus_addr_t highaddr, bus_dma_filter_t *filter, void
- *filterarg, bus_size_t maxsize, int nsegments, bus_size_t
- maxsegsz, int flags, bus_dma_tag_t *dmat)</function></para>
-
- <para>Create a new tag. Returns 0 on success, the error code
- otherwise.</para>
-
- <itemizedlist>
- <listitem>
- <para><emphasis>parent</emphasis> - parent tag, or NULL to
- create a top-level tag <emphasis>alignment</emphasis> -
- required physical alignment of the memory area to be
- allocated for this tag. Use value 1 for "no specific
- alignment". Applies only to the future
- <function>bus_dmamem_alloc()</function> but not
- <function>bus_dmamap_create()</function> calls.
- <emphasis>boundary</emphasis> - physical address
- boundary that must not be crossed when allocating the
- memory. Use value 0 for "no boundary". Applies only to
- the future <function>bus_dmamem_alloc()</function> but
- not <function>bus_dmamap_create()</function> calls.
- Must be power of 2. If the memory is planned to be used
- in non-cascaded DMA mode (i.e. the DMA addresses will be
- supplied not by the device itself but by the ISA DMA
- controller) then the boundary must be no larger than
- 64KB (64*1024) due to the limitations of the DMA
- hardware.</para>
- </listitem>
-
- <listitem>
- <para><emphasis>lowaddr, highaddr</emphasis> - the names
- are slighlty misleading; these values are used to limit
- the permitted range of physical addresses used to
- allocate the memory. The exact meaning varies depending
- on the planned future use:</para>
-
- <itemizedlist>
- <listitem>
- <para>For <function>bus_dmamem_alloc()</function> all
- the addresses from 0 to lowaddr-1 are considered
- permitted, the higher ones are forbidden.</para>
- </listitem>
-
- <listitem>
- <para>For <function>bus_dmamap_create()</function> all
- the addresses outside the inclusive range [lowaddr;
- highaddr] are considered accessible. The addresses
- of pages inside the range are passed to the filter
- function which decides if they are accessible. If no
- filter function is supplied then all the range is
- considered unaccessible.</para>
- </listitem>
-
- <listitem>
- <para>For the ISA devices the normal values (with no
- filter function) are:</para>
- <para>lowaddr = BUS_SPACE_MAXADDR_24BIT</para>
- <para>highaddr = BUS_SPACE_MAXADDR</para>
- </listitem>
- </itemizedlist>
-
- </listitem>
-
- <listitem>
- <para><emphasis>filter, filterarg</emphasis> - the filter
- function and its argument. If NULL is passed for filter
- then the whole range [lowaddr, highaddr] is considered
- unaccessible when doing
- <function>bus_dmamap_create()</function>. Otherwise the
- physical address of each attempted page in range
- [lowaddr; highaddr] is passed to the filter function
- which decides if it is accessible. The prototype of the
- filter function is: <function>int filterfunc(void *arg,
- bus_addr_t paddr)</function> It must return 0 if the
- page is accessible, non-zero otherwise.</para>
- </listitem>
-
- <listitem>
- <para><emphasis>maxsize</emphasis> - the maximal size of
- memory (in bytes) that may be allocated through this
- tag. In case it's difficult to estimate or could be
- arbitrarily big, the value for ISA devices would be
- BUS_SPACE_MAXSIZE_24BIT.</para>
- </listitem>
-
- <listitem>
- <para><emphasis>nsegments</emphasis> - maximal number of
- scatter-gather segments supported by the device. If
- unrestricted then the value BUS_SPACE_UNRESTRICTED
- should be used. This value is recommended for the parent
- tags, the actual restrictions would then be specified
- for the descendant tags. Tags with nsegments equal to
- BUS_SPACE_UNRESTRICTED may not be used to actually load
- maps, they may be used only as parent tags. The
- practical limit for nsegments seems to be about 250-300,
- higher values will cause kernel stack overflow. But
- anyway the hardware normally can't support that many
- scatter-gather buffers.</para>
- </listitem>
-
- <listitem>
- <para><emphasis>maxsegsz</emphasis> - maximal size of a
- scatter-gather segment supported by the device. The
- maximal value for ISA device would be
- BUS_SPACE_MAXSIZE_24BIT.</para>
- </listitem>
-
- <listitem>
- <para><emphasis>flags</emphasis> - a bitmap of flags. The
- only interesting flags are:</para>
-
- <itemizedlist>
- <listitem>
- <para><emphasis>BUS_DMA_ALLOCNOW</emphasis> - requests
- to allocate all the potentially needed bounce pages
- when creating the tag</para>
- </listitem>
-
- <listitem>
- <para><emphasis>BUS_DMA_ISA</emphasis> - mysterious
- flag used only on Alpha machines. It is not defined
- for the i386 machines. Probably it should be used
- by all the ISA drivers for Alpha machines but it
- looks like there are no such drivers yet.</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para><emphasis>dmat</emphasis> - pointer to the storage
- for the new tag to be returned</para>
- </listitem>
-
- </itemizedlist>
-
- </listitem>
-
- <listitem> <!-- Second entry in list alpha -->
- <para><function>int bus_dma_tag_destroy(bus_dma_tag_t
- dmat)</function></para>
-
- <para>Destroy a tag. Returns 0 on success, the error code
- otherwise.</para>
-
- <para>dmat - the tag to be destroyed</para>
-
- </listitem>
-
- <listitem> <!-- Third entry in list alpha -->
- <para><function>int bus_dmamem_alloc(bus_dma_tag_t dmat,
- void** vaddr, int flags, bus_dmamap_t
- *mapp)</function></para>
-
- <para>Allocate an area of contiguous memory described by the
- tag. The size of memory to be allocated is tag's maxsize.
- Returns 0 on success, the error code otherwise. The result
- still has to be loaded by
- <function>bus_dmamap_load()</function> before used to get
- the physical address of the memory.</para>
-
-<!-- XXX What it is Wylie, I got to here -->
-
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>dmat</emphasis> - the tag
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>vaddr</emphasis> - pointer to the storage
- for the kernel virtual address of the allocated area
- to be returned.
- </para>
- </listitem>
- <listitem>
- <para>
- flags - a bitmap of flags. The only interesting flag is:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>BUS_DMA_NOWAIT</emphasis> - if the
- memory is not immediately available return the
- error. If this flag is not set then the routine
- is allowed to sleep waiting until the memory
- will become available.
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
- <listitem>
- <para>
- <emphasis>mapp</emphasis> - pointer to the storage
- for the new map to be returned
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem> <!-- Fourth entry in list alpha -->
- <para>
- <function>void bus_dmamem_free(bus_dma_tag_t dmat, void
- *vaddr, bus_dmamap_t map)</function>
- </para>
- <para>
- Free the memory allocated by
- <function>bus_dmamem_alloc()</function>. As of now
- freeing of the memory allocated with ISA restrictions is
- not implemented. Because of this the recommended model
- of use is to keep and re-use the allocated areas for as
- long as possible. Do not lightly free some area and then
- shortly allocate it again. That does not mean that
- <function>bus_dmamem_free()</function> should not be
- used at all: hopefully it will be properly implemented
- soon.
- </para>
-
- <itemizedlist>
- <listitem>
- <para><emphasis>dmat</emphasis> - the tag
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>vaddr</emphasis> - the kernel virtual
- address of the memory
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>map</emphasis> - the map of the memory (as
- returned from
- <function>bus_dmamem_alloc()</function>)
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem> <!-- The fifth entry in list alpha -->
- <para>
- <function>int bus_dmamap_create(bus_dma_tag_t dmat, int
- flags, bus_dmamap_t *mapp)</function>
- </para>
- <para>
- Create a map for the tag, to be used in
- <function>bus_dmamap_load()</function> later. Returns 0
- on success, the error code otherwise.
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>dmat</emphasis> - the tag
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>flags</emphasis> - theoretically, a bit map
- of flags. But no flags are defined yet, so as of now
- it will be always 0.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>mapp</emphasis> - pointer to the storage
- for the new map to be returned
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem> <!-- Sixth entry in the alpha list -->
- <para>
- <function>int bus_dmamap_destroy(bus_dma_tag_t dmat,
- bus_dmamap_t map)</function>
- </para>
- <para>
- Destroy a map. Returns 0 on success, the error code otherwise.
- </para>
-
- <itemizedlist>
- <listitem>
- <para>
- dmat - the tag to which the map is associated
- </para>
- </listitem>
- <listitem>
- <para>
- map - the map to be destroyed
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem> <!-- Seventh entry in list alpha -->
- <para>
- <function>int bus_dmamap_load(bus_dma_tag_t dmat,
- bus_dmamap_t map, void *buf, bus_size_t buflen,
- bus_dmamap_callback_t *callback, void *callback_arg, int
- flags)</function>
- </para>
- <para>
- Load a buffer into the map (the map must be previously
- created by <function>bus_dmamap_create()</function> or
- <function>bus_dmamem_alloc()</function>). All the pages
- of the buffer are checked for conformance to the tag
- requirements and for those not conformant the bounce
- pages are allocated. An array of physical segment
- descriptors is built and passed to the callback
- routine. This callback routine is then expected to
- handle it in some way. The number of bounce buffers in
- the system is limited, so if the bounce buffers are
- needed but not immediately available the request will be
- queued and the callback will be called when the bounce
- buffers will become available. Returns 0 if the callback
- was executed immediately or EINPROGRESS if the request
- was queued for future execution. In the latter case the
- synchronization with queued callback routine is the
- responsibility of the driver.
- </para>
- <!--<blockquote>-->
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>dmat</emphasis> - the tag
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>map</emphasis> - the map
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>buf</emphasis> - kernel virtual address of
- the buffer
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>buflen</emphasis> - length of the buffer
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>callback</emphasis>,<function>
- callback_arg</function> - the callback function and
- its argument
- </para>
- </listitem>
- </itemizedlist>
- <!--</blockquote>-->
- <para>
- The prototype of callback function is:
- </para>
- <para>
- <function>void callback(void *arg, bus_dma_segment_t
- *seg, int nseg, int error)</function>
- </para>
- <!-- <blockquote> -->
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>arg</emphasis> - the same as callback_arg
- passed to <function>bus_dmamap_load()</function>
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>seg</emphasis> - array of the segment
- descriptors
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>nseg</emphasis> - number of descriptors in
- array
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>error</emphasis> - indication of the
- segment number overflow: if it's set to EFBIG then
- the buffer did not fit into the maximal number of
- segments permitted by the tag. In this case only the
- permitted number of descriptors will be in the
- array. Handling of this situation is up to the
- driver: depending on the desired semantics it can
- either consider this an error or split the buffer in
- two and handle the second part separately
- </para>
- </listitem>
- </itemizedlist>
- <!-- </blockquote> -->
- <para>
- Each entry in the segments array contains the fields:
- </para>
-
- <!-- <blockquote> -->
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>ds_addr</emphasis> - physical bus address
- of the segment
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>ds_len</emphasis> - length of the segment
- </para>
- </listitem>
- </itemizedlist>
- <!-- </blockquote>-->
- </listitem>
-
- <listitem> <!-- Eighth entry in alpha list -->
- <para>
- <function>void bus_dmamap_unload(bus_dma_tag_t dmat,
- bus_dmamap_t map)</function>
- </para>
- <para>unload the map.
- </para>
- <!-- <blockquote> -->
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>dmat</emphasis> - tag
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>map</emphasis> - loaded map
- </para>
- </listitem>
- </itemizedlist>
- <!-- </blockquote> -->
- </listitem>
-
- <listitem> <!-- Ninth entry list alpha -->
- <para>
- <function>void bus_dmamap_sync (bus_dma_tag_t dmat,
- bus_dmamap_t map, bus_dmasync_op_t op)</function>
- </para>
- <para>
- Synchronise a loaded buffer with its bounce pages before
- and after physical transfer to or from device. This is
- the function that does all the necessary copying of data
- between the original buffer and its mapped version. The
- buffers must be synchronized both before and after doing
- the transfer.
- </para>
- <!-- <blockquote> -->
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>dmat</emphasis> - tag
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>map</emphasis> - loaded map
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>op</emphasis> - type of synchronization
- operation to perform:
- </para>
- </listitem>
- </itemizedlist>
- <!-- <blockquote> -->
- <itemizedlist>
- <listitem>
- <para>
- <function>BUS_DMASYNC_PREREAD</function> - before
- reading from device into buffer
- </para>
- </listitem>
- <listitem>
- <para>
- <function>BUS_DMASYNC_POSTREAD</function> - after
- reading from device into buffer
- </para>
- </listitem>
- <listitem>
- <para>
- <function>BUS_DMASYNC_PREWRITE</function> - before
- writing the buffer to device
- </para>
- </listitem>
- <listitem>
- <para>
- <function>BUS_DMASYNC_POSTWRITE</function> - after
- writing the buffer to device
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
- </itemizedlist> <!-- End of list alpha -->
-<!-- </blockquote>
-</blockquote> -->
-
- <para>
- As of now PREREAD and POSTWRITE are null operations but that
- may change in the future, so they must not be ignored in the
- driver. Synchronization is not needed for the memory
- obtained from <function>bus_dmamem_alloc()</function>.
- </para>
- <para>
- Before calling the callback function from
- <function>bus_dmamap_load()</function> the segment array is
- stored in the stack. And it gets pre-allocated for the
- maximal number of segments allowed by the tag. Because of
- this the practical limit for the number of segments on i386
- architecture is about 250-300 (the kernel stack is 4KB minus
- the size of the user structure, size of a segment array
- entry is 8 bytes, and some space must be left). Because the
- array is allocated based on the maximal number this value
- must not be set higher than really needed. Fortunately, for
- most of hardware the maximal supported number of segments is
- much lower. But if the driver wants to handle buffers with a
- very large number of scatter-gather segments it should do
- that in portions: load part of the buffer, transfer it to
- the device, load next part of the buffer, and so on.
- </para>
- <para>
- Another practical consequence is that the number of segments
- may limit the size of the buffer. If all the pages in the
- buffer happen to be physically non-contiguous then the
- maximal supported buffer size for that fragmented case would
- be (nsegments * page_size). For example, if a maximal number
- of 10 segments is supported then on i386 maximal guaranteed
- supported buffer size would be 40K. If a higher size is
- desired then special tricks should be used in the driver.
- </para>
- <para>
- If the hardware does not support scatter-gather at all or
- the driver wants to support some buffer size even if it's
- heavily fragmented then the solution is to allocate a
- contiguous buffer in the driver and use it as intermediate
- storage if the original buffer does not fit.
- </para>
- <para>
- Below are the typical call sequences when using a map depend
- on the use of the map. The characters -> are used to show
- the flow of time.
- </para>
- <para>
- For a buffer which stays practically fixed during all the
- time between attachment and detachment of a device:</para>
- <para>
- bus_dmamem_alloc -> bus_dmamap_load -> ...use buffer... ->
- -> bus_dmamap_unload -> bus_dmamem_free
- </para>
-
- <para>For a buffer that changes frequently and is passed from
- outside the driver:
-
- <!-- XXX is this correct? -->
- <programlisting> bus_dmamap_create ->
- -> bus_dmamap_load -> bus_dmamap_sync(PRE...) -> do transfer ->
- -> bus_dmamap_sync(POST...) -> bus_dmamap_unload ->
- ...
- -> bus_dmamap_load -> bus_dmamap_sync(PRE...) -> do transfer ->
- -> bus_dmamap_sync(POST...) -> bus_dmamap_unload ->
- -> bus_dmamap_destroy </programlisting>
-
- </para>
- <para>
- When loading a map created by
- <function>bus_dmamem_alloc()</function> the passed address
- and size of the buffer must be the same as used in
- <function>bus_dmamem_alloc()</function>. In this case it is
- guaranteed that the whole buffer will be mapped as one
- segment (so the callback may be based on this assumption)
- and the request will be executed immediately (EINPROGRESS
- will never be returned). All the callback needs to do in
- this case is to save the physical address.
- </para>
- <para>
- A typical example would be:
- </para>
-
- <programlisting> static void
- alloc_callback(void *arg, bus_dma_segment_t *seg, int nseg, int error)
- {
- *(bus_addr_t *)arg = seg[0].ds_addr;
- }
-
- ...
- int error;
- struct somedata {
- ....
- };
- struct somedata *vsomedata; /* virtual address */
- bus_addr_t psomedata; /* physical bus-relative address */
- bus_dma_tag_t tag_somedata;
- bus_dmamap_t map_somedata;
- ...
-
- error=bus_dma_tag_create(parent_tag, alignment,
- boundary, lowaddr, highaddr, /*filter*/ NULL, /*filterarg*/ NULL,
- /*maxsize*/ sizeof(struct somedata), /*nsegments*/ 1,
- /*maxsegsz*/ sizeof(struct somedata), /*flags*/ 0,
- &#38;tag_somedata);
- if(error)
- return error;
-
- error = bus_dmamem_alloc(tag_somedata, &#38;vsomedata, /* flags*/ 0,
- &#38;map_somedata);
- if(error)
- return error;
-
- bus_dmamap_load(tag_somedata, map_somedata, (void *)vsomedata,
- sizeof (struct somedata), alloc_callback,
- (void *) &#38;psomedata, /*flags*/0); </programlisting>
-
- <para>
- Looks a bit long and complicated but that's the way to do
- it. The practical consequence is: if multiple memory areas
- are allocated always together it would be a really good idea
- to combine them all into one structure and allocate as one
- (if the alignment and boundary limitations permit).
- </para>
- <para>
- When loading an arbitrary buffer into the map created by
- <function>bus_dmamap_create()</function> special measures
- must be taken to synchronize with the callback in case it
- would be delayed. The code would look like:
- </para>
-
- <programlisting> {
- int s;
- int error;
-
- s = splsoftvm();
- error = bus_dmamap_load(
- dmat,
- dmamap,
- buffer_ptr,
- buffer_len,
- callback,
- /*callback_arg*/ buffer_descriptor,
- /*flags*/0);
- if (error == EINPROGRESS) {
- /*
- * Do whatever is needed to ensure synchronization
- * with callback. Callback is guaranteed not to be started
- * until we do splx() or tsleep().
- */
- }
- splx(s);
- } </programlisting>
-
- <para>
- Two possible approaches for the processing of requests are:
- </para>
- <para>
- 1. If requests are completed by marking them explicitly as
- done (such as the CAM requests) then it would be simpler to
- put all the further processing into the callback driver
- which would mark the request when it's done. Then not much
- extra synchronization is needed. For the flow control
- reasons it may be a good idea to freeze the request queue
- until this request gets completed.
- </para>
- <para>
- 2. If requests are completed when the function returns (such
- as classic read or write requests on character devices) then
- a synchronization flag should be set in the buffer
- descriptor and <function>tsleep()</function> called. Later
- when the callback gets called it will do it's processing and
- check this synchronization flag. If it's set then the
- callback should issue a wakeup. In this approach the
- callback function could either do all the needed processing
- (just like the previous case) or simply save the segments
- array in the buffer descriptor. Then after callback
- completes the calling function could use this saved segments
- array and do all the processing.
-
- </para>
- </sect1>
-<!--_________________________________________________________________________-->
-<!--~~~~~~~~~~~~~~~~~~~~END OF SECTION~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
-
- <sect1>
- <title>DMA</title>
- <!-- Section Marked up by Wylie -->
- <para>
- The Direct Memory Access (DMA) is implemented in the ISA bus
- through the DMA controller (actually, two of them but that's
- an irrelevant detail). To make the early ISA devices simple
- and cheap the logic of the bus control and address
- generation was concentrated in the DMA controller.
- Fortunately, FreeBSD provides a set of functions that mostly
- hide the annoying details of the DMA controller from the
- device drivers.
- </para>
-
- <para>
- The simplest case is for the fairly intelligent
- devices. Like the bus master devices on PCI they can
- generate the bus cycles and memory addresses all by
- themselves. The only thing they really need from the DMA
- controller is bus arbitration. So for this purpose they
- pretend to be cascaded slave DMA controllers. And the only
- thing needed from the system DMA controller is to enable the
- cascaded mode on a DMA channel by calling the following
- function when attaching the driver:
- </para>
-
- <para>
- <function>void isa_dmacascade(int channel_number)</function>
- </para>
-
- <para>
- All the further activity is done by programming the
- device. When detaching the driver no DMA-related functions
- need to be called.
- </para>
-
- <para>
- For the simpler devices things get more complicated. The
- functions used are:
- </para>
-
- <itemizedlist>
-
- <listitem>
- <para>
- <function>int isa_dma_acquire(int chanel_number)</function>
- </para>
- <para>
- Reserve a DMA channel. Returns 0 on success or EBUSY
- if the channel was already reserved by this or a
- different driver. Most of the ISA devices are not able
- to share DMA channels anyway, so normally this
- function is called when attaching a device. This
- reservation was made redundant by the modern interface
- of bus resources but still must be used in addition to
- the latter. If not used then later, other DMA routines
- will panic.
- </para>
- </listitem>
-
- <listitem>
- <para>
- <function>int isa_dma_release(int chanel_number)</function>
- </para>
- <para>
- Release a previously reserved DMA channel. No
- transfers must be in progress when the channel is
- released (as well as the device must not try to
- initiate transfer after the channel is released).
- </para>
- </listitem>
-
- <listitem>
- <para>
- <function>void isa_dmainit(int chan, u_int
- bouncebufsize)</function>
- </para>
- <para>
- Allocate a bounce buffer for use with the specified
- channel. The requested size of the buffer can't exceed
- 64KB. This bounce buffer will be automatically used
- later if a transfer buffer happens to be not
- physically contiguous or outside of the memory
- accessible by the ISA bus or crossing the 64KB
- boundary. If the transfers will be always done from
- buffers which conform to these conditions (such as
- those allocated by
- <function>bus_dmamem_alloc()</function> with proper
- limitations) then <function>isa_dmainit()</function>
- does not have to be called. But it's quite convenient
- to transfer arbitrary data using the DMA controller.
- The bounce buffer will automatically care of the
- scatter-gather issues.
- </para>
- <!-- <blockquote> -->
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>chan</emphasis> - channel number
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>bouncebufsize</emphasis> - size of the
- bounce buffer in bytes
- </para>
- </listitem>
- </itemizedlist>
-<!-- </blockquote> -->
-<!--</para> -->
- </listitem>
-
- <listitem>
- <para>
- <function>void isa_dmastart(int flags, caddr_t addr, u_int
- nbytes, int chan)</function>
- </para>
- <para>
- Prepare to start a DMA transfer. This function must be
- called to set up the DMA controller before actually
- starting transfer on the device. It checks that the
- buffer is contiguous and falls into the ISA memory
- range, if not then the bounce buffer is automatically
- used. If bounce buffer is required but not set up by
- <function>isa_dmainit()</function> or too small for
- the requested transfer size then the system will
- panic. In case of a write request with bounce buffer
- the data will be automatically copied to the bounce
- buffer.
- </para>
- </listitem>
- <listitem>
- <para>flags - a bitmask determining the type of operation to
- be done. The direction bits B_READ and B_WRITE are mutually
- exclusive.
- </para>
- <!-- <blockquote> -->
- <itemizedlist>
- <listitem>
- <para>
- B_READ - read from the ISA bus into memory
- </para>
- </listitem>
- <listitem>
- <para>
- B_WRITE - write from the memory to the ISA bus
- </para>
- </listitem>
- <listitem>
- <para>
- B_RAW - if set then the DMA controller will remember
- the buffer and after the end of transfer will
- automatically re-initialize itself to repeat transfer
- of the same buffer again (of course, the driver may
- change the data in the buffer before initiating
- another transfer in the device). If not set then the
- parameters will work only for one transfer, and
- <function>isa_dmastart()</function> will have to be
- called again before initiating the next
- transfer. Using B_RAW makes sense only if the bounce
- buffer is not used.
- </para>
- </listitem>
- </itemizedlist>
-<!-- </blockquote> -->
- </listitem>
- <listitem>
- <para>
- addr - virtual address of the buffer
- </para>
- </listitem>
- <listitem>
- <para>
- nbytes - length of the buffer. Must be less or equal to
- 64KB. Length of 0 is not allowed: the DMA controller will
- understand it as 64KB while the kernel code will
- understand it as 0 and that would cause unpredictable
- effects. For channels number 4 and higher the length must
- be even because these channels transfer 2 bytes at a
- time. In case of an odd length the last byte will not be
- transferred.
- </para>
- </listitem>
- <listitem>
- <para>
- chan - channel number
- </para>
- </listitem>
-
- <listitem>
- <para>
- <function>void isa_dmadone(int flags, caddr_t addr, int
- nbytes, int chan)</function>
- </para>
- <para>
- Synchronize the memory after device reports that transfer
- is done. If that was a read operation with a bounce buffer
- then the data will be copied from the bounce buffer to the
- original buffer. Arguments are the same as for
- <function>isa_dmastart()</function>. Flag B_RAW is
- permitted but it does not affect
- <function>isa_dmadone()</function> in any way.
- </para>
- </listitem>
-
- <listitem>
- <para>
- <function>int isa_dmastatus(int channel_number)</function>
- </para>
- <para>
- Returns the number of bytes left in the current transfer
- to be transferred. In case the flag B_READ was set in
- <function>isa_dmastart()</function> the number returned
- will never be equal to zero. At the end of transfer it
- will be automatically reset back to the length of
- buffer. The normal use is to check the number of bytes
- left after the device signals that the transfer is
- completed. If the number of bytes is not 0 then probably
- something went wrong with that transfer.
- </para>
- </listitem>
-
- <listitem>
- <para>
- <function>int isa_dmastop(int channel_number)</function>
- </para>
- <para>
- Aborts the current transfer and returns the number of
- bytes left untransferred.
- </para>
- </listitem>
- </itemizedlist>
- </sect1>
-
- <sect1>
- <title>xxx_isa_probe</title>
- <!-- Section marked up by Wylie -->
-
- <para>
- This function probes if a device is present. If the driver
- supports auto-detection of some part of device configuration
- (such as interrupt vector or memory address) this
- auto-detection must be done in this routine.
- </para>
-
- <para>
- As for any other bus, if the device cannot be detected or
- is detected but failed the self-test or some other problem
- happened then it returns a positive value of error. The
- value ENXIO must be returned if the device is not
- present. Other error values may mean other conditions. Zero
- or negative values mean success. Most of the drivers return
- zero as success.
- </para>
-
- <para>
- The negative return values are used when a PnP device
- supports multiple interfaces. For example, an older
- compatibility interface and a newer advanced interface which
- are supported by different drivers. Then both drivers would
- detect the device. The driver which returns a higher value
- in the probe routine takes precedence (in other words, the
- driver returning 0 has highest precedence, one returning -1
- is next, one returning -2 is after it and so on). In result
- the devices which support only the old interface will be
- handled by the old driver (which should return -1 from the
- probe routine) while the devices supporting the new
- interface as well will be handled by the new driver (which
- should return 0 from the probe routine).
- </para>
-
- <para>
- The device descriptor struct xxx_softc is allocated by the
- system before calling the probe routine. If the probe
- routine returns an error the descriptor will be
- automatically deallocated by the system. So if a probing
- error occurs the driver must make sure that all the
- resources it used during probe are deallocated and that
- nothing keeps the descriptor from being safely
- deallocated. If the probe completes successfully the
- descriptor will be preserved by the system and later passed
- to the routine <function>xxx_isa_attach()</function>. If a
- driver returns a negative value it can't be sure that it
- will have the highest priority and its attach routine will
- be called. So in this case it also must release all the
- resources before returning and if necessary allocate them
- again in the attach routine. When
- <function>xxx_isa_probe()</function> returns 0 releasing the
- resources before returning is also a good idea, a
- well-behaved driver should do so. But in case if there is
- some problem with releasing the resources the driver is
- allowed to keep resources between returning 0 from the probe
- routine and execution of the attach routine.
- </para>
-
- <para>
- A typical probe routine starts with getting the device
- descriptor and unit:
- </para>
-
- <programlisting> struct xxx_softc *sc = device_get_softc(dev);
- int unit = device_get_unit(dev);
- int pnperror;
- int error = 0;
-
- sc->dev = dev; /* link it back */
- sc->unit = unit; </programlisting>
-
- <para>
- Then check for the PnP devices. The check is carried out by
- a table containing the list of PnP IDs supported by this
- driver and human-readable descriptions of the device models
- corresponding to these IDs.
- </para>
-
- <programlisting>
- pnperror=ISA_PNP_PROBE(device_get_parent(dev), dev,
- xxx_pnp_ids); if(pnperror == ENXIO) return ENXIO;
- </programlisting>
-
- <para>
- The logic of ISA_PNP_PROBE is the following: If this card
- (device unit) was not detected as PnP then ENOENT will be
- returned. If it was detected as PnP but its detected ID does
- not match any of the IDs in the table then ENXIO is
- returned. Finally, if it has PnP support and it matches on
- of the IDs in the table, 0 is returned and the appropriate
- description from the table is set by
- <function>device_set_desc()</function>.
- </para>
-
- <para>
- If a driver supports only PnP devices then the condition
- would look like:
- </para>
-
- <programlisting> if(pnperror != 0)
- return pnperror; </programlisting>
-
- <para>
- No special treatment is required for the drivers which don't
- support PnP because they pass an empty PnP ID table and will
- always get ENXIO if called on a PnP card.
- </para>
-
- <para>
- The probe routine normally needs at least some minimal set
- of resources, such as I/O port number to find the card and
- probe it. Depending on the hardware the driver may be able
- to discover the other necessary resources automatically. The
- PnP devices have all the resources pre-set by the PnP
- subsystem, so the driver does not need to discover them by
- itself.
- </para>
-
- <para>
- Typically the minimal information required to get access to
- the device is the I/O port number. Then some devices allow
- to get the rest of information from the device configuration
- registers (though not all devices do that). So first we try
- to get the port start value:
- </para>
-
- <programlisting> sc->port0 = bus_get_resource_start(dev,
- SYS_RES_IOPORT, 0 /*rid*/); if(sc->port0 == 0) return ENXIO;
- </programlisting>
-
- <para>
- The base port address is saved in the structure softc for
- future use. If it will be used very often then calling the
- resource function each time would be prohibitively slow. If
- we don't get a port we just return an error. Some device
- drivers can instead be clever and try to probe all the
- possible ports, like this:
- </para>
-
- <programlisting>
- /* table of all possible base I/O port addresses for this device */
- static struct xxx_allports {
- u_short port; /* port address */
- short used; /* flag: if this port is already used by some unit */
- } xxx_allports = {
- { 0x300, 0 },
- { 0x320, 0 },
- { 0x340, 0 },
- { 0, 0 } /* end of table */
- };
-
- ...
- int port, i;
- ...
-
- port = bus_get_resource_start(dev, SYS_RES_IOPORT, 0 /*rid*/);
- if(port !=0 ) {
- for(i=0; xxx_allports[i].port!=0; i++) {
- if(xxx_allports[i].used || xxx_allports[i].port != port)
- continue;
-
- /* found it */
- xxx_allports[i].used = 1;
- /* do probe on a known port */
- return xxx_really_probe(dev, port);
- }
- return ENXIO; /* port is unknown or already used */
- }
-
- /* we get here only if we need to guess the port */
- for(i=0; xxx_allports[i].port!=0; i++) {
- if(xxx_allports[i].used)
- continue;
-
- /* mark as used - even if we find nothing at this port
- * at least we won't probe it in future
- */
- xxx_allports[i].used = 1;
-
- error = xxx_really_probe(dev, xxx_allports[i].port);
- if(error == 0) /* found a device at that port */
- return 0;
- }
- /* probed all possible addresses, none worked */
- return ENXIO;</programlisting>
-
- <para>
- Of course, normally the driver's
- <function>identify()</function> routine should be used for
- such things. But there may be one valid reason why it may be
- better to be done in <function>probe()</function>: if this
- probe would drive some other sensitive device crazy. The
- probe routines are ordered with consideration of the
- "sensitive" flag: the sensitive devices get probed first and
- the rest of devices later. But the
- <function>identify()</function> routines are called before
- any probes, so they show no respect to the sensitive devices
- and may upset them.
- </para>
-
- <para>
- Now, after we got the starting port we need to set the port
- count (except for PnP devices) because the kernel does not
- have this information in the configuration file.
- </para>
-
- <programlisting>
- if(pnperror /* only for non-PnP devices */
- &#38;&#38; bus_set_resource(dev, SYS_RES_IOPORT, 0, sc->port0,
- XXX_PORT_COUNT)&lt;0)
- return ENXIO;</programlisting>
-
- <para>
- Finally allocate and activate a piece of port address space
- (special values of start and end mean "use those we set by
- <function>bus_set_resource()</function>"):
- </para>
-
- <programlisting>
- sc->port0_rid = 0;
- sc->port0_r = bus_alloc_resource(dev, SYS_RES_IOPORT,
- &#38;sc->port0_rid,
- /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE);
-
- if(sc->port0_r == NULL)
- return ENXIO;</programlisting>
-
- <para>
- Now having access to the port-mapped registers we can poke
- the device in some way and check if it reacts like it is
- expected to. If it does not then there is probably some
- other device or no device at all at this address.
- </para>
-
- <para>
- Normally drivers don't set up the interrupt handlers until
- the attach routine. Instead they do probes in the polling
- mode using the <function>DELAY()</function> function for
- timeout. The probe routine must never hang forever, all the
- waits for the device must be done with timeouts. If the
- device does not respond within the time it's probably broken
- or misconfigured and the driver must return error. When
- determining the timeout interval give the device some extra
- time to be on the safe side: although
- <function>DELAY()</function> is supposed to delay for the
- same amount of time on any machine it has some margin of
- error, depending on the exact CPU.
- </para>
-
- <para>
- If the probe routine really wants to check that the
- interrupts really work it may configure and probe the
- interrupts too. But that's not recommended.
- </para>
-
- <programlisting>
- /* implemented in some very device-specific way */
- if(error = xxx_probe_ports(sc))
- goto bad; /* will deallocate the resources before returning */
- </programlisting>
-
- <para>
- The fucntion <function>xxx_probe_ports()</function> may also
- set the device description depending on the exact model of
- device it discovers. But if there is only one supported
- device model this can be as well done in a hardcoded way.
- Of course, for the PnP devices the PnP support sets the
- description from the table automatically.
- </para>
-
-
- <programlisting> if(pnperror)
- device_set_desc(dev, "Our device model 1234");
- </programlisting>
-
- <para>
- Then the probe routine should either discover the ranges of
- all the resources by reading the device configuration
- registers or make sure that they were set explicitly by the
- user. We will consider it with an example of on-board
- memory. The probe routine should be as non-intrusive as
- possible, so allocation and check of functionality of the
- rest of resources (besides the ports) would be better left
- to the attach routine.
- </para>
-
- <para>
- The memory address may be specified in the kernel
- configuration file or on some devices it may be
- pre-configured in non-volatile configuration registers. If
- both sources are available and different, which one should
- be used? Probably if the user bothered to set the address
- explicitly in the kernel configuration file they know what
- they're doing and this one should take precedence. An
- example of implementation could be:
- </para>
- <programlisting>
- /* try to find out the config address first */
- sc->mem0_p = bus_get_resource_start(dev, SYS_RES_MEMORY, 0 /*rid*/);
- if(sc->mem0_p == 0) { /* nope, not specified by user */
- sc->mem0_p = xxx_read_mem0_from_device_config(sc);
-
-
- if(sc->mem0_p == 0)
- /* can't get it from device config registers either */
- goto bad;
- } else {
- if(xxx_set_mem0_address_on_device(sc) &lt; 0)
- goto bad; /* device does not support that address */
- }
-
- /* just like the port, set the memory size,
- * for some devices the memory size would not be constant
- * but should be read from the device configuration registers instead
- * to accommodate different models of devices. Another option would
- * be to let the user set the memory size as "msize" configuration
- * resource which will be automatically handled by the ISA bus.
- */
- if(pnperror) { /* only for non-PnP devices */
- sc->mem0_size = bus_get_resource_count(dev, SYS_RES_MEMORY, 0 /*rid*/);
- if(sc->mem0_size == 0) /* not specified by user */
- sc->mem0_size = xxx_read_mem0_size_from_device_config(sc);
-
- if(sc->mem0_size == 0) {
- /* suppose this is a very old model of device without
- * auto-configuration features and the user gave no preference,
- * so assume the minimalistic case
- * (of course, the real value will vary with the driver)
- */
- sc->mem0_size = 8*1024;
- }
-
- if(xxx_set_mem0_size_on_device(sc) &lt; 0)
- goto bad; /* device does not support that size */
-
- if(bus_set_resource(dev, SYS_RES_MEMORY, /*rid*/0,
- sc->mem0_p, sc->mem0_size)&lt;0)
- goto bad;
- } else {
- sc->mem0_size = bus_get_resource_count(dev, SYS_RES_MEMORY, 0 /*rid*/);
- } </programlisting>
-
- <para>
- Resources for IRQ and DRQ are easy to check by analogy.
- </para>
-
- <para>
- If all went well then release all the resources and return success.
- </para>
-
- <programlisting> xxx_free_resources(sc);
- return 0;</programlisting>
-
- <para>
- Finally, handle the troublesome situations. All the
- resources should be deallocated before returning. We make
- use of the fact that before the structure softc is passed to
- us it gets zeroed out, so we can find out if some resource
- was allocated: then its descriptor is non-zero.
- </para>
-
- <programlisting> bad:
-
- xxx_free_resources(sc);
- if(error)
- return error;
- else /* exact error is unknown */
- return ENXIO;</programlisting>
-
- <para>
- That would be all for the probe routine. Freeing of
- resources is done from multiple places, so it's moved to a
- function which may look like:
- </para>
-
-<programlisting>static void
- xxx_free_resources(sc)
- struct xxx_softc *sc;
- {
- /* check every resource and free if not zero */
-
- /* interrupt handler */
- if(sc->intr_r) {
- bus_teardown_intr(sc->dev, sc->intr_r, sc->intr_cookie);
- bus_release_resource(sc->dev, SYS_RES_IRQ, sc->intr_rid,
- sc->intr_r);
- sc->intr_r = 0;
- }
-
- /* all kinds of memory maps we could have allocated */
- if(sc->data_p) {
- bus_dmamap_unload(sc->data_tag, sc->data_map);
- sc->data_p = 0;
- }
- if(sc->data) { /* sc->data_map may be legitimately equal to 0 */
- /* the map will also be freed */
- bus_dmamem_free(sc->data_tag, sc->data, sc->data_map);
- sc->data = 0;
- }
- if(sc->data_tag) {
- bus_dma_tag_destroy(sc->data_tag);
- sc->data_tag = 0;
- }
-
- ... free other maps and tags if we have them ...
-
- if(sc->parent_tag) {
- bus_dma_tag_destroy(sc->parent_tag);
- sc->parent_tag = 0;
- }
-
- /* release all the bus resources */
- if(sc->mem0_r) {
- bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->mem0_rid,
- sc->mem0_r);
- sc->mem0_r = 0;
- }
- ...
- if(sc->port0_r) {
- bus_release_resource(sc->dev, SYS_RES_IOPORT, sc->port0_rid,
- sc->port0_r);
- sc->port0_r = 0;
- }
- }</programlisting>
-
- </sect1>
-
- <sect1>
- <title>xxx_isa_attach</title>
- <!-- Section Marked up by Wylie -->
-
- <para>The attach routine actually connects the driver to the
- system if the probe routine returned success and the system
- had chosen to attach that driver. If the probe routine
- returned 0 then the attach routine may expect to receive the
- device structure softc intact, as it was set by the probe
- routine. Also if the probe routine returns 0 it may expect
- that the attach routine for this device shall be called at
- some point in the future. If the probe routine returns a
- negative value then the driver may make none of these
- assumptions.
- </para>
-
- <para>The attach routine returns 0 if it completed successfully or
- error code otherwise.
- </para>
-
- <para>The attach routine starts just like the probe routine,
- with getting some frequently used data into more accessible
- variables.
- </para>
-
- <programlisting> struct xxx_softc *sc = device_get_softc(dev);
- int unit = device_get_unit(dev);
- int error = 0;</programlisting>
-
- <para>Then allocate and activate all the necessary
- resources. Because normally the port range will be released
- before returning from probe, it has to be allocated
- again. We expect that the probe routine had properly set all
- the resource ranges, as well as saved them in the structure
- softc. If the probe routine had left some resource allocated
- then it does not need to be allocated again (which would be
- considered an error).
- </para>
-
- <programlisting> sc->port0_rid = 0;
- sc->port0_r = bus_alloc_resource(dev, SYS_RES_IOPORT, &#38;sc->port0_rid,
- /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE);
-
- if(sc->port0_r == NULL)
- return ENXIO;
-
- /* on-board memory */
- sc->mem0_rid = 0;
- sc->mem0_r = bus_alloc_resource(dev, SYS_RES_MEMORY, &#38;sc->mem0_rid,
- /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE);
-
- if(sc->mem0_r == NULL)
- goto bad;
-
- /* get its virtual address */
- sc->mem0_v = rman_get_virtual(sc->mem0_r);</programlisting>
-
- <para>The DMA request channel (DRQ) is allocated likewise. To
- initialize it use functions of the
- <function>isa_dma*()</function> family. For example:
- </para>
-
- <para><function>isa_dmacascade(sc->drq0);</function></para>
-
- <para>The interrupt request line (IRQ) is a bit
- special. Besides allocation the driver's interrupt handler
- should be associated with it. Historically in the old ISA
- drivers the argument passed by the system to the interrupt
- handler was the device unit number. But in modern drivers
- the convention suggests passing the pointer to structure
- softc. The important reason is that when the structures
- softc are allocated dynamically then getting the unit number
- from softc is easy while getting softc from unit number is
- difficult. Also this convention makes the drivers for
- different buses look more uniform and allows them to share
- the code: each bus gets its own probe, attach, detach and
- other bus-specific routines while the bulk of the driver
- code may be shared among them.
- </para>
-
- <programlisting>
- sc->intr_rid = 0;
- sc->intr_r = bus_alloc_resource(dev, SYS_RES_MEMORY, &#38;sc->intr_rid,
- /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE);
-
- if(sc->intr_r == NULL)
- goto bad;
-
- /*
- * XXX_INTR_TYPE is supposed to be defined depending on the type of
- * the driver, for example as INTR_TYPE_CAM for a CAM driver
- */
- error = bus_setup_intr(dev, sc->intr_r, XXX_INTR_TYPE,
- (driver_intr_t *) xxx_intr, (void *) sc, &#38;sc->intr_cookie);
- if(error)
- goto bad;
-
- </programlisting>
-
-
- <para>If the device needs to make DMA to the main memory then
- this memory should be allocated like described before:
- </para>
-
- <programlisting> error=bus_dma_tag_create(NULL, /*alignment*/ 4,
- /*boundary*/ 0, /*lowaddr*/ BUS_SPACE_MAXADDR_24BIT,
- /*highaddr*/ BUS_SPACE_MAXADDR, /*filter*/ NULL, /*filterarg*/ NULL,
- /*maxsize*/ BUS_SPACE_MAXSIZE_24BIT,
- /*nsegments*/ BUS_SPACE_UNRESTRICTED,
- /*maxsegsz*/ BUS_SPACE_MAXSIZE_24BIT, /*flags*/ 0,
- &#38;sc->parent_tag);
- if(error)
- goto bad;
-
- /* many things get inherited from the parent tag
- * sc->data is supposed to point to the structure with the shared data,
- * for example for a ring buffer it could be:
- * struct {
- * u_short rd_pos;
- * u_short wr_pos;
- * char bf[XXX_RING_BUFFER_SIZE]
- * } *data;
- */
- error=bus_dma_tag_create(sc->parent_tag, 1,
- 0, BUS_SPACE_MAXADDR, 0, /*filter*/ NULL, /*filterarg*/ NULL,
- /*maxsize*/ sizeof(* sc->data), /*nsegments*/ 1,
- /*maxsegsz*/ sizeof(* sc->data), /*flags*/ 0,
- &#38;sc->data_tag);
- if(error)
- goto bad;
-
- error = bus_dmamem_alloc(sc->data_tag, &#38;sc->data, /* flags*/ 0,
- &#38;sc->data_map);
- if(error)
- goto bad;
-
- /* xxx_alloc_callback() just saves the physical address at
- * the pointer passed as its argument, in this case &#38;sc->data_p.
- * See details in the section on bus memory mapping.
- * It can be implemented like:
- *
- * static void
- * xxx_alloc_callback(void *arg, bus_dma_segment_t *seg,
- * int nseg, int error)
- * {
- * *(bus_addr_t *)arg = seg[0].ds_addr;
- * }
- */
- bus_dmamap_load(sc->data_tag, sc->data_map, (void *)sc->data,
- sizeof (* sc->data), xxx_alloc_callback, (void *) &#38;sc->data_p,
- /*flags*/0);</programlisting>
-
-
- <para>After all the necessary resources are allocated the
- device should be initialized. The initialization may include
- testing that all the expected features are functional.</para>
-
- <programlisting> if(xxx_initialize(sc) &lt; 0)
- goto bad; </programlisting>
-
-
- <para>The bus subsystem will automatically print on the
- console the device description set by probe. But if the
- driver wants to print some extra information about the
- device it may do so, for example:</para>
-
- <programlisting>
- device_printf(dev, "has on-card FIFO buffer of %d bytes\n", sc->fifosize);
- </programlisting>
-
- <para>If the initialization routine experiences any problems
- then printing messages about them before returning error is
- also recommended.</para>
-
- <para>The final step of the attach routine is attaching the
- device to its functional subsystem in the kernel. The exact
- way to do it depends on the type of the driver: a character
- device, a block device, a network device, a CAM SCSI bus
- device and so on.</para>
-
- <para>If all went well then return success.</para>
-
- <programlisting> error = xxx_attach_subsystem(sc);
- if(error)
- goto bad;
-
- return 0; </programlisting>
-
- <para>Finally, handle the troublesome situations. All the
- resources should be deallocated before returning an
- error. We make use of the fact that before the structure
- softc is passed to us it gets zeroed out, so we can find out
- if some resource was allocated: then its descriptor is
- non-zero.</para>
-
- <programlisting> bad:
-
- xxx_free_resources(sc);
- if(error)
- return error;
- else /* exact error is unknown */
- return ENXIO;</programlisting>
-
- <para>That would be all for the attach routine.</para>
-
- </sect1>
-
-
- <sect1>
- <title>xxx_isa_detach</title>
-
- <para>
- If this function is present in the driver and the driver is
- compiled as a loadable module then the driver gets the
- ability to be unloaded. This is an important feature if the
- hardware supports hot plug. But the ISA bus does not support
- hot plug, so this feature is not particularly important for
- the ISA devices. The ability to unload a driver may be
- useful when debugging it, but in many cases installation of
- the new version of the driver would be required only after
- the old version somehow wedges the system and reboot will be
- needed anyway, so the efforts spent on writing the detach
- routine may not be worth it. Another argument is that
- unloading would allow upgrading the drivers on a production
- machine seems to be mostly theoretical. Installing a new
- version of a driver is a dangerous operation which should
- never be performed on a production machine (and which is not
- permitted when the system is running in secure mode). Still
- the detach routine may be provided for the sake of
- completeness.
- </para>
-
- <para>
- The detach routine returns 0 if the driver was successfully
- detached or the error code otherwise.
- </para>
-
- <para>
- The logic of detach is a mirror of the attach. The first
- thing to do is to detach the driver from its kernel
- subsystem. If the device is currently open then the driver
- has two choices: refuse to be detached or forcibly close and
- proceed with detach. The choice used depends on the ability
- of the particular kernel subsystem to do a forced close and
- on the preferences of the driver's author. Generally the
- forced close seems to be the preferred alternative.
- <programlisting> struct xxx_softc *sc = device_get_softc(dev);
- int error;
-
- error = xxx_detach_subsystem(sc);
- if(error)
- return error;</programlisting>
- </para>
- <para>
- Next the driver may want to reset the hardware to some
- consistent state. That includes stopping any ongoing
- transfers, disabling the DMA channels and interrupts to
- avoid memory corruption by the device. For most of the
- drivers this is exactly what the shutdown routine does, so
- if it is included in the driver we can as well just call it.
- </para>
- <para><function>xxx_isa_shutdown(dev);</function></para>
-
- <para>
- And finally release all the resources and return success.
- <programlisting> xxx_free_resources(sc);
- return 0;</programlisting>
-
- </para>
- </sect1>
-
- <sect1>
- <title>xxx_isa_shutdown</title>
-
- <para>
- This routine is called when the system is about to be shut
- down. It is expected to bring the hardware to some
- consistent state. For most of the ISA devices no special
- action is required, so the function is not really necessary
- because the device will be re-initialized on reboot
- anyway. But some devices have to be shut down with a special
- procedure, to make sure that they will be properly detected
- after soft reboot (this is especially true for many devices
- with proprietary identification protocols). In any case
- disabling DMA and interrupts in the device registers and
- stopping any ongoing transfers is a good idea. The exact
- action depends on the hardware, so we don't consider it here
- in any details.
- </para>
-
- <para>
- xxx_intr
- </para>
-
- <para>
- The interrupt handler is called when an interrupt is
- received which may be from this particular device. The ISA
- bus does not support interrupt sharing (except some special
- cases) so in practice if the interrupt handler is called
- then the interrupt almost for sure came from its
- device. Still the interrupt handler must poll the device
- registers and make sure that the interrupt was generated by
- its device. If not it should just return.
- </para>
-
- <para>
- The old convention for the ISA drivers was getting the
- device unit number as an argument. It is obsolete, and the
- new drivers receive whatever argument was specified for them
- in the attach routine when calling
- <function>bus_setup_intr()</function>. By the new convention
- it should be the pointer to the structure softc. So the
- interrupt handler commonly starts as:
- </para>
-
- <programlisting>
- static void
- xxx_intr(struct xxx_softc *sc)
- {
-
- </programlisting>
-
- <para>
- It runs at the interrupt priority level specified by the
- interrupt type parameter of
- <function>bus_setup_intr()</function>. That means that all
- the other interrupts of the same type as well as all the
- software interrupts are disabled.
- </para>
-
- <para>
- To avoid races it is commonly written as a loop:
- </para>
-
- <programlisting>
- while(xxx_interrupt_pending(sc)) {
- xxx_process_interrupt(sc);
- xxx_acknowledge_interrupt(sc);
- } </programlisting>
-
- <para>
- The interrupt handler has to acknowledge interrupt to the
- device only but not to the interrupt controller, the system
- takes care of the latter.
- </para>
-
- </sect1>
-</chapter>
diff --git a/en_US.ISO8859-1/books/arch-handbook/kobj/chapter.sgml b/en_US.ISO8859-1/books/arch-handbook/kobj/chapter.sgml
deleted file mode 100644
index a9ea688b9a..0000000000
--- a/en_US.ISO8859-1/books/arch-handbook/kobj/chapter.sgml
+++ /dev/null
@@ -1,298 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD$
--->
-
-<chapter id="kernel-objects">
- <title>Kernel Objects</title>
-
- <para>Kernel Objects, or <firstterm>Kobj</firstterm> provides an
- object-oriented C programming system for the kernel. As such the
- data being operated on carries the description of how to operate
- on it. This allows operations to be added and removed from an
- interface at run time and without breaking binary
- compatibility.</para>
-
- <sect1>
- <title>Terminology</title>
-
- <variablelist>
- <varlistentry>
- <term>Object</term>
- <listitem><para>A set of data - data structure - data
- allocation.</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Method</term>
- <listitem>
- <para>An operation - function.</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Class</term>
- <listitem>
- <para>One or more methods.</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Interface</term>
- <listitem>
- <para>A standard set of one or more methods.</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect1>
-
- <sect1>
- <title>Kobj Operation</title>
-
- <para>Kobj works by generating descriptions of methods. Each
- description holds a unique id as well as a default function. The
- description's address is used to uniquely identify the method
- within a class' method table.</para>
-
- <para>A class is built by creating a method table associating one
- or more functions with method descriptions. Before use the class
- is compiled. The compilation allocates a cache and associates it
- with the class. A unique id is assigned to each method
- description within the method table of the class if not already
- done so by another referencing class compilation. For every
- method to be used a function is generated by script to qualify
- arguments and automatically reference the method description for
- a lookup. The generated function looks up the method by using
- the unique id associated with the method description as a hash
- into the cache associated with the object's class. If the method
- is not cached the generated function proceeds to use the class'
- table to find the method. If the method is found then the
- associated function within the class is used; otherwise, the
- default function associated with the method description is
- used.</para>
-
- <para>These indirections can be visualized as the
- following:</para>
-
- <programlisting>object->cache<->class</programlisting>
-
- </sect1>
-
- <sect1>
- <title>Using Kobj</title>
-
- <sect2>
- <title>Structures</title>
-
- <programlisting>struct kobj_method</programlisting>
- </sect2>
-
- <sect2>
- <title>Functions</title>
-
- <programlisting>void kobj_class_compile(kobj_class_t cls);
-void kobj_class_compile_static(kobj_class_t cls, kobj_ops_t ops);
-void kobj_class_free(kobj_class_t cls);
-kobj_t kobj_create(kobj_class_t cls, struct malloc_type *mtype, int mflags);
-void kobj_init(kobj_t obj, kobj_class_t cls);
-void kobj_delete(kobj_t obj, struct malloc_type *mtype);</programlisting>
- </sect2>
-
- <sect2>
- <title>Macros</title>
-
- <programlisting>KOBJ_CLASS_FIELDS
-KOBJ_FIELDS
-DEFINE_CLASS(name, methods, size)
-KOBJMETHOD(NAME, FUNC)</programlisting>
- </sect2>
-
- <sect2>
- <title>Headers</title>
-
- <programlisting>&lt;sys/param.h>
-&lt;sys/kobj.h></programlisting>
- </sect2>
-
- <sect2>
- <title>Creating an interface template</title>
-
- <para>The first step in using Kobj is to create an
- Interface. Creating the interface involves creating a template
- that the script
- <filename>src/sys/kern/makeobjops.pl</filename> can use to
- generate the header and code for the method declarations and
- method lookup functions.</para>
-
- <para>Within this template the following keywords are used:
- <literal>#include</literal>, <literal>INTERFACE</literal>,
- <literal>CODE</literal>, <literal>METHOD</literal>,
- <literal>STATICMETHOD</literal>, and
- <literal>DEFAULT</literal>.</para>
-
- <para>The <literal>#include</literal> statement and what follows
- it is copied verbatim to the head of the generated code
- file.</para>
-
- <para>For example:</para>
-
- <programlisting>#include &lt;sys/foo.h></programlisting>
-
- <para>The <literal>INTERFACE</literal> keyword is used to define
- the interface name. This name is concatenated with each method
- name as [interface name]_[method name]. It's syntax is
- INTERFACE [interface name];.</para>
-
- <para>For example:</para>
-
- <programlisting>INTERFACE foo;</programlisting>
-
- <para>The <literal>CODE</literal> keyword copies its arguments
- verbatim into the code file. It's syntax is
- <literal>CODE { [whatever] };</literal></para>
-
- <para>For example:</para>
-
- <programlisting>CODE {
- struct foo * foo_alloc_null(struct bar *)
- {
- return NULL;
-}
-};</programlisting>
-
- <para>The <literal>METHOD</literal> keyword describes a method. It's syntax is
- <literal>METHOD [return type] [method name] { [object [,
- arguments]] };</literal></para>
-
- <para>For example:</para>
-
- <programlisting>METHOD int bar {
- struct object *;
- struct foo *;
- struct bar;
-};</programlisting>
-
- <para>The <literal>DEFAULT</literal> keyword may follow the
- <literal>METHOD</literal> keyword. It extends the
- <literal>METHOD</literal> key word to include the default
- function for method. The extended syntax is
- <literal>METHOD [return type] [method name] {
- [object; [other arguments]] }DEFAULT [default
- function];</literal></para>
-
- <para>For example:</para>
-
- <programlisting>METHOD int bar {
- struct object *;
- struct foo *;
- int bar;
-} DEFAULT foo_hack;</programlisting>
-
- <para>The <literal>STATICMETHOD</literal> keyword is used like
- the <literal>METHOD</literal> keyword except the kobj data isn't
- at the head of the object structure so casting to kobj_t would
- be incorrect. Instead <literal>STATICMETHOD</literal> relies on the Kobj data being
- referenced as 'ops'. This is also useful for calling
- methods directly out of a class's method table.</para>
-
- <para>Other complete examples:</para>
-
- <programlisting>src/sys/kern/bus_if.m
-src/sys/kern/device_if.m</programlisting>
-
- </sect2>
-
- <sect2>
- <title>Creating a Class</title>
-
- <para>The second step in using Kobj is to create a class. A
- class consists of a name, a table of methods, and the size of
- objects if Kobj's object handling facilities are used. To
- create the class use the macro
- <function>DEFINE_CLASS()</function>. To create the method
- table create an array of kobj_method_t terminated by a NULL
- entry. Each non-NULL entry may be created using the macro
- <function>KOBJMETHOD()</function>.</para>
-
- <para>For example:</para>
-
- <programlisting>DEFINE_CLASS(fooclass, foomethods, sizeof(struct foodata));
-
-kobj_method_t foomethods[] = {
- KOBJMETHOD(bar_doo, foo_doo),
- KOBJMETHOD(bar_foo, foo_foo),
- { NULL, NULL}
-};</programlisting>
-
- <para>The class must be <quote>compiled</quote>. Depending on
- the state of the system at the time that the class is to be
- initialized a statically allocated cache, <quote>ops
- table</quote> have to be used. This can be accomplished by
- declaring a <structname>struct kobj_ops</structname> and using
- <function>kobj_class_compile_static();</function> otherwise,
- <function>kobj_class_compile()</function> should be used.</para>
- </sect2>
-
- <sect2>
- <title>Creating an Object</title>
-
- <para>The third step in using Kobj involves how to define the
- object. Kobj object creation routines assume that Kobj data is
- at the head of an object. If this in not appropriate you will
- have to allocate the object yourself and then use
- <function>kobj_init()</function> on the Kobj portion of it;
- otherwise, you may use <function>kobj_create()</function> to
- allocate and initialize the Kobj portion of the object
- automatically. <function>kobj_init()</function> may also be
- used to change the class that an object uses.</para>
-
- <para>To integrate Kobj into the object you should use the macro
- KOBJ_FIELDS.</para>
-
- <para>For example</para>
-
- <programlisting>struct foo_data {
- KOBJ_FIELDS;
- foo_foo;
- foo_bar;
-};</programlisting>
- </sect2>
-
- <sect2>
- <title>Calling Methods</title>
-
- <para>The last step in using Kobj is to simply use the generated
- functions to use the desired method within the object's
- class. This is as simple as using the interface name and the
- method name with a few modifications. The interface name
- should be concatenated with the method name using a '_'
- between them, all in upper case.</para>
-
- <para>For example, if the interface name was foo and the method
- was bar then the call would be:</para>
-
- <programlisting>[return value = ] FOO_BAR(object [, other parameters]);</programlisting>
-
- </sect2>
-
- <sect2>
- <title>Cleaning Up</title>
-
- <para>When an object allocated through
- <function>kobj_create()</function> is no longer needed
- <function>kobj_delete()</function> may be called on it, and
- when a class is no longer being used
- <function>kobj_class_free()</function> may be called on it.</para>
- </sect2>
- </sect1>
-</chapter>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-declaration: "../chapter.decl"
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- sgml-parent-document: ("../book.sgml" "part" "chapter")
- End:
--->
diff --git a/en_US.ISO8859-1/books/arch-handbook/locking/chapter.sgml b/en_US.ISO8859-1/books/arch-handbook/locking/chapter.sgml
deleted file mode 100644
index 993d649ffc..0000000000
--- a/en_US.ISO8859-1/books/arch-handbook/locking/chapter.sgml
+++ /dev/null
@@ -1,333 +0,0 @@
-<!--
- The FreeBSD Documentation Project
- The FreeBSD SMP Next Generation Project
-
- $FreeBSD: doc/en_US.ISO_8859-1/books/developers-handbook/locking/chapter.sgml,v 1.1 2000/11/29 04:15:17 jhb Exp $
--->
-
-<chapter id="locking">
- <title>Locking Notes</title>
-
- <para><emphasis>This chapter is maintained by the FreeBSD SMP Next
- Generation Project
- <email>freebsd-smp@FreeBSD.org</email>.</emphasis></para>
-
-
- <para>This document outlines the locking used in the FreeBSD kernel
- to permit effective multi-processing within the kernel. Locking
- can be achieved via several means. Data structures can be
- protected by mutexes or &man.lockmgr.9; locks. A few variables
- are protected simply by always using atomic operations to access
- them.</para>
-
- <sect1>
- <title>Mutexes</title>
-
- <para>A mutex is simply a lock used to guarantee mutual exclusion.
- Specifically, a mutex may only be owned by one entity at a time.
- If another entity wishes to obtain a mutex that is already
- owned, it must wait until the mutex is released. In the FreeBSD
- kernel, mutexes are owned by processes.</para>
-
- <para>Mutexes may be recursively acquired, but they are intended
- to be held for a short period of time. Specifically, one may
- not sleep while holding a mutex. If you need to hold a lock
- across a sleep, use a &man.lockmgr.9; lock.</para>
-
- <para>Each mutex has several properties of interest:</para>
-
- <variablelist>
- <varlistentry>
- <term>Variable Name</term>
- <listitem>
- <para>The name of the <type>struct mtx</type> variable in
- the kernel source.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Logical Name</term>
- <listitem>
- <para>The name of the mutex assigned to it by
- <function>mtx_init</function>. This name is displayed in
- KTR trace messages and witness errors and warnings and is
- used to distinguish mutexes in the witness code.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Type</term>
- <listitem>
- <para>The type of the mutex in terms of the
- <constant>MTX_*</constant> flags. The meaning for each
- flag is related to its meaning as documented in
- &man.mutex.9;.</para>
-
- <variablelist>
- <varlistentry>
- <term><constant>MTX_DEF</constant></term>
- <listitem>
- <para>A sleep mutex</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>MTX_SPIN</constant></term>
- <listitem>
- <para>A spin mutex</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>MTX_COLD</constant></term>
- <listitem>
- <para>This mutex is initialized very early. Thus, it
- must be declared via
- <function>MUTEX_DECLARE</function>, and the
- <constant>MTX_COLD</constant> flag must be passed to
- <function>mtx_init</function>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>MTX_TOPHALF</constant></term>
- <listitem>
- <para>This spin mutex does not disable
- interrupts.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>MTX_NORECURSE</constant></term>
- <listitem>
- <para>This mutex is not allowed to recurse.</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Protectees</term>
- <listitem>
- <para>A list of data structures or data structure members
- that this entry protects. For data structure members, the
- name will be in the form of
- <structname/structure name/.<structfield/member name/.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Dependent Functions</term>
- <listitem>
- <para>Functions that can only be called if this mutex is
- held.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <table frame="all" colsep="1" rowsep="1" pgwide="1">
- <title>Mutex List</title>
-
- <tgroup cols="5">
- <thead>
- <row>
- <entry>Variable Name</entry>
- <entry>Logical Name</entry>
- <entry>Type</entry>
- <entry>Protectees</entry>
- <entry>Dependent Functions</entry>
- </row>
- </thead>
-
- <!-- The scheduler lock -->
- <tbody>
- <row>
- <entry>sched_lock</entry>
- <entry><quote>sched lock</quote></entry>
- <entry>
- <constant>MTX_SPIN</constant> |
- <constant>MTX_COLD</constant>
- </entry>
- <entry>
- <varname>_gmonparam</varname>,
- <varname>cnt.v_swtch</varname>,
- <varname>cp_time</varname>,
- <varname>curpriority</varname>,
- <structname/mtx/.<structfield/mtx_blocked/,
- <structname/mtx/.<structfield/mtx_contested/,
- <structname/proc/.<structfield/p_contested/,
- <structname/proc/.<structfield/p_blocked/,
- <structname/proc/.<structfield/p_flag/
- (<constant>P_PROFIL</constant> XXX,
- <constant>P_INMEM</constant>,
- <constant>P_SINTR</constant>,
- <constant>P_TIMEOUT</constant>,
- <constant>P_SWAPINREQ</constant> XXX,
- <constant>P_INMEN</constant> XXX),
- <structname/proc/.<structfield/p_nice/,
- <structname/proc/.<structfield/p_procq/,
- <structname/proc/.<structfield/p_blocked/,
- <structname/proc/.<structfield/p_estcpu/,
- <structname/proc/.<structfield/p_nativepri/,
- <structname/proc/.<structfield/p_priority/,
- <structname/proc/.<structfield/p_usrpri/,
- <structname/proc/.<structfield/p_rtprio/,
- <structname/proc/.<structfield/p_rqindex/,
- <structname/proc/.<structfield/p_stats->p_prof/,
- <structname/proc/.<structfield/p_stats->p_ru/,
- <structname/proc/.<structfield/p_stat/,
- <structname/proc/.<structfield/p_cpticks/
- <structname/proc/.<structfield/p_iticks/,
- <structname/proc/.<structfield/p_uticks/,
- <structname/proc/.<structfield/p_sticks/,
- <structname/proc/.<structfield/p_swtime/,
- <structname/proc/.<structfield/p_slptime/,
- <structname/proc/.<structfield/p_runtime/,
- <structname/proc/.<structfield/p_pctcpu/,
- <structname/proc/.<structfield/p_oncpu/,
- <structname/proc/.<structfield/p_asleep/,
- <structname/proc/.<structfield/p_wchan/,
- <structname/proc/.<structfield/p_wmesg/,
- <structname/proc/.<structfield/p_slpq/,
- <structname/proc/.<structfield/p_vmspace/
- (XXX - in <function>statclock</function>),
- <varname>pscnt</varname>,
- <varname>slpque</varname>,
- <varname>itqueuebits</varname>,
- <varname>itqueues</varname>,
- <varname>rtqueuebits</varname>,
- <varname>rtqueues</varname>,
- <varname>queuebits</varname>,
- <varname>queues</varname>,
- <varname>idqueuebits</varname>,
- <varname>idqueues</varname>,
- <varname>switchtime</varname>,
- </entry>
- <entry>
- <function>setrunqueue</function>,
- <function>remrunqueue</function>,
- <function>mi_switch</function>,
- <function>chooseproc</function>,
- <function>schedclock</function>,
- <function>resetpriority</function>,
- <function>updatepri</function>,
- <function>maybe_resched</function>,
- <function>cpu_switch</function>,
- <function>cpu_throw</function>
- </entry>
- </row>
-
- <!-- The vm86 pcb lock -->
- <row>
- <entry>vm86pcb_lock</entry>
- <entry><quote>vm86pcb lock</quote></entry>
- <entry>
- <constant>MTX_DEF</constant> |
- <constant>MTX_COLD</constant>
- </entry>
- <entry>
- <varname>vm86pcb</varname>
- </entry>
- <entry>
- <function>vm86_bioscall</function>
- </entry>
- </row>
-
- <!-- Giant -->
- <row>
- <entry>Giant</entry>
- <entry><quote>Giant</quote></entry>
- <entry>
- <constant>MTX_DEF</constant> |
- <constant>MTX_COLD</constant>
- </entry>
- <entry>nearly everything</entry>
- <entry>lots</entry>
- </row>
-
- <!-- The callout lock -->
- <row>
- <entry>callout_lock</entry>
- <entry><quote>callout lock</quote></entry>
- <entry>
- <constant>MTX_SPIN</constant>
- </entry>
- <entry>
- <varname>callfree</varname>,
- <varname>callwheel</varname>,
- <varname>nextsoftcheck</varname>,
- <structname/proc/.<structfield/p_itcallout/,
- <structname/proc/.<structfield/p_slpcallout/,
- <varname>softticks</varname>,
- <varname>ticks</varname>
- </entry>
- <entry>
- </entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </sect1>
-
- <sect1>
- <title>Lock Manager Locks</title>
-
- <para>Locks that are provided via the &man.lockmgr.9; interface
- are lock manager locks. These locks are reader-writer locks and
- may be held by a sleeping process.</para>
-
- <table>
- <title>&man.lockmgr.9; Lock List</title>
-
- <tgroup cols="2">
- <thead>
- <row>
- <entry>Variable Name</entry>
- <entry>Protectees</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry><varname>allproc_lock</varname></entry>
- <entry>
- <varname>allproc</varname>
- <varname>zombproc</varname>
- <varname>pidhashtbl</varname>
- <structname/proc/.<structfield/p_list/
- <structname/proc/.<structfield/p_hash/
- <varname>nextpid</varname>
- </entry>
- <entry><varname>proctree_lock</varname></entry>
- <entry>
- <structname/proc/.<structfield/p_children/
- <structname/proc/.<structfield/p_sibling/
- </entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </sect1>
-
- <sect1>
- <title>Atomically Protected Variables</title>
-
- <para>An atomically protected variable is a special variable that
- is not protected by an explicit lock. Instead, all data
- accesses to the variables use special atomic operations as
- described in &man.atomic.9;. Very few variables are treated
- this way, although other synchronization primitives such as
- mutexes are implemented with atomically protected
- variables.</para>
-
- <itemizedlist>
- <listitem>
- <para><varname>astpending</varname></para>
- </listitem>
-
- <listitem>
- <para><structname/mtx/.<structfield/mtx_lock/</para>
- </listitem>
- </itemizedlist>
- </sect1>
-</chapter>
diff --git a/en_US.ISO8859-1/books/arch-handbook/pci/chapter.sgml b/en_US.ISO8859-1/books/arch-handbook/pci/chapter.sgml
deleted file mode 100644
index ca94063864..0000000000
--- a/en_US.ISO8859-1/books/arch-handbook/pci/chapter.sgml
+++ /dev/null
@@ -1,372 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD: doc/en_US.ISO_8859-1/books/developers-handbook/pci/chapter.sgml,v 1.2 2001/04/09 00:33:42 dd Exp $
--->
-
-<chapter id="pci">
- <title>PCI Devices</title>
-
- <para>This chapter will talk about the FreeBSD mechanisms for
- writing a device driver for a device on a PCI bus.</para>
-
- <sect1>
- <title>Probe and Attach</title>
-
- <para>Information here about how the PCI bus code iterates through
- the unattached devices and see if a newly loaded kld will attach
- to any of them.</para>
-
-<programlisting>/*
- * Simple KLD to play with the PCI functions.
- *
- * Murray Stokely
- */
-
-#define MIN(a,b) (((a) < (b)) ? (a) : (b))
-
-#include &lt;sys/types.h&gt;
-#include &lt;sys/module.h&gt;
-#include &lt;sys/systm.h&gt; /* uprintf */
-#include &lt;sys/errno.h&gt;
-#include &lt;sys/param.h&gt; /* defines used in kernel.h */
-#include &lt;sys/kernel.h&gt; /* types used in module initialization */
-#include &lt;sys/conf.h&gt; /* cdevsw struct */
-#include &lt;sys/uio.h&gt; /* uio struct */
-#include &lt;sys/malloc.h&gt;
-#include &lt;sys/bus.h&gt; /* structs, prototypes for pci bus stuff */
-
-#include &lt;pci/pcivar.h&gt; /* For get_pci macros! */
-
-/* Function prototypes */
-d_open_t mypci_open;
-d_close_t mypci_close;
-d_read_t mypci_read;
-d_write_t mypci_write;
-
-/* Character device entry points */
-
-static struct cdevsw mypci_cdevsw = {
- mypci_open,
- mypci_close,
- mypci_read,
- mypci_write,
- noioctl,
- nopoll,
- nommap,
- nostrategy,
- "mypci",
- 36, /* reserved for lkms - /usr/src/sys/conf/majors */
- nodump,
- nopsize,
- D_TTY,
- -1
-};
-
-/* vars */
-static dev_t sdev;
-
-/* We're more interested in probe/attach than with
- open/close/read/write at this point */
-
-int
-mypci_open(dev_t dev, int oflags, int devtype, struct proc *p)
-{
- int err = 0;
-
- uprintf("Opened device \"mypci\" successfully.\n");
- return(err);
-}
-
-int
-mypci_close(dev_t dev, int fflag, int devtype, struct proc *p)
-{
- int err=0;
-
- uprintf("Closing device \"mypci.\"\n");
- return(err);
-}
-
-int
-mypci_read(dev_t dev, struct uio *uio, int ioflag)
-{
- int err = 0;
-
- uprintf("mypci read!\n");
- return err;
-}
-
-int
-mypci_write(dev_t dev, struct uio *uio, int ioflag)
-{
- int err = 0;
-
- uprintf("mypci write!\n");
- return(err);
-}
-
-/* PCI Support Functions */
-
-/*
- * Return identification string if this is device is ours.
- */
-static int
-mypci_probe(device_t dev)
-{
- uprintf("MyPCI Probe\n"
- "Vendor ID : 0x%x\n"
- "Device ID : 0x%x\n",pci_get_vendor(dev),pci_get_device(dev));
-
- if (pci_get_vendor(dev) == 0x11c1) {
- uprintf("We've got the Winmodem, probe successful!\n");
- return 0;
- }
-
- return ENXIO;
-}
-
-/* Attach function is only called if the probe is successful */
-
-static int
-mypci_attach(device_t dev)
-{
- uprintf("MyPCI Attach for : deviceID : 0x%x\n",pci_get_vendor(dev));
- sdev = make_dev(<literal>&</literal>mypci_cdevsw,
- 0,
- UID_ROOT,
- GID_WHEEL,
- 0600,
- "mypci");
- uprintf("Mypci device loaded.\n");
- return ENXIO;
-}
-
-/* Detach device. */
-
-static int
-mypci_detach(device_t dev)
-{
- uprintf("Mypci detach!\n");
- return 0;
-}
-
-/* Called during system shutdown after sync. */
-
-static int
-mypci_shutdown(device_t dev)
-{
- uprintf("Mypci shutdown!\n");
- return 0;
-}
-
-/*
- * Device suspend routine.
- */
-static int
-mypci_suspend(device_t dev)
-{
- uprintf("Mypci suspend!\n");
- return 0;
-}
-
-/*
- * Device resume routine.
- */
-
-static int
-mypci_resume(device_t dev)
-{
- uprintf("Mypci resume!\n");
- return 0;
-}
-
-static device_method_t mypci_methods[] = {
- /* Device interface */
- DEVMETHOD(device_probe, mypci_probe),
- DEVMETHOD(device_attach, mypci_attach),
- DEVMETHOD(device_detach, mypci_detach),
- DEVMETHOD(device_shutdown, mypci_shutdown),
- DEVMETHOD(device_suspend, mypci_suspend),
- DEVMETHOD(device_resume, mypci_resume),
-
- { 0, 0 }
-};
-
-static driver_t mypci_driver = {
- "mypci",
- mypci_methods,
- 0,
- /* sizeof(struct mypci_softc), */
-};
-
-static devclass_t mypci_devclass;
-
-DRIVER_MODULE(mypci, pci, mypci_driver, mypci_devclass, 0, 0);</programlisting>
-
- <para>Additional Resources
- <itemizedlist>
- <listitem><simpara><ulink url="http://www.pcisig.org">PCI
- Special Interest Group</ulink></simpara></listitem>
-
- <listitem><simpara>PCI System Architecture, Fourth Edition by
- Tom Shanley, et al.</simpara></listitem>
-
- </itemizedlist>
- </para>
- </sect1>
-
- <sect1>
- <title>Bus Resources</title>
-
- <para>FreeBSD provides an object-oriented mechanism for requesting
- resources from a parent bus. Almost all devices will be a child
- member of some sort of bus (PCI, ISA, USB, SCSI, etc) and these
- devices need to acquire resources from their parent bus (such as
- memory segments, interrupt lines, or DMA channels).</para>
-
- <sect2>
- <title>Base Address Registers</title>
-
- <para>To do anything particularly useful with a PCI device you
- will need to obtain the <emphasis>Base Address
- Registers</emphasis> (BARs) from the PCI Configuration space.
- The PCI-specific details of obtaining the BAR is abstracted in
- the <function>bus_alloc_resource()</function> function.</para>
-
- <para>For example, a typical driver might have something similar
- to this in the <function>attach()</function> function. : </para>
-
-<programlisting> sc->bar0id = 0x10;
- sc->bar0res = bus_alloc_resource(dev, SYS_RES_MEMORY, &amp;(sc->bar0id),
- 0, ~0, 1, RF_ACTIVE);
- if (sc->bar0res == NULL) {
- uprintf("Memory allocation of PCI base register 0 failed!\n");
- error = ENXIO;
- goto fail1;
- }
-
- sc->bar1id = 0x14;
- sc->bar1res = bus_alloc_resource(dev, SYS_RES_MEMORY, &amp;(sc->bar1id),
- 0, ~0, 1, RF_ACTIVE);
- if (sc->bar1res == NULL) {
- uprintf("Memory allocation of PCI base register 1 failed!\n");
- error = ENXIO;
- goto fail2;
- }
- sc->bar0_bt = rman_get_bustag(sc->bar0res);
- sc->bar0_bh = rman_get_bushandle(sc->bar0res);
- sc->bar1_bt = rman_get_bustag(sc->bar1res);
- sc->bar1_bh = rman_get_bushandle(sc->bar1res);
-
-</programlisting>
-
- <para>Handles for each base address register are kept in the
- <structname>softc</structname> structure so that they can be
- used to write to the device later.</para>
-
- <para>These handles can then be used to read or write from the
- device registers with the <function>bus_space_*</function>
- functions. For example, a driver might contain a shorthand
- function to read from a board specific register like this :
- </para>
-
-<programlisting>uint16_t
-board_read(struct ni_softc *sc, uint16_t address) {
- return bus_space_read_2(sc->bar1_bt, sc->bar1_bh, address);
-}
-</programlisting>
-
- <para>Similarly, one could write to the registers with : </para>
-
-<programlisting>void
-board_write(struct ni_softc *sc, uint16_t address, uint16_t value) {
- bus_space_write_2(sc->bar1_bt, sc->bar1_bh, address, value);
-}
-</programlisting>
-
- <para>These functions exist in 8bit, 16bit, and 32bit versions
- and you should use
- <function>bus_space_{read|write}_{1|2|4}</function>
- accordingly.</para>
-
- </sect2>
- <sect2>
- <title>Interrupts</title>
-
- <para>Interrupts are allocated from the object-oriented bus code
- in a way similar to the memory resources. First an IRQ
- resource must be allocated from the parent bus, and then the
- interrupt handler must be setup to deal with this IRQ.</para>
-
- <para>Again, a sample from a device
- <function>attach()</function> function says more than
- words.</para>
-
-<programlisting>/* Get the IRQ resource */
-
- sc->irqid = 0x0;
- sc->irqres = bus_alloc_resource(dev, SYS_RES_IRQ, &amp;(sc->irqid),
- 0, ~0, 1, RF_SHAREABLE | RF_ACTIVE);
- if (sc->irqres == NULL) {
- uprintf("IRQ allocation failed!\n");
- error = ENXIO;
- goto fail3;
- }
-
- /* Now we should setup the interrupt handler */
-
- error = bus_setup_intr(dev, sc->irqres, INTR_TYPE_MISC,
- my_handler, sc, &amp;(sc->handler));
- if (error) {
- printf("Couldn't set up irq\n");
- goto fail4;
- }
-
- sc->irq_bt = rman_get_bustag(sc->irqres);
- sc->irq_bh = rman_get_bushandle(sc->irqres);
-</programlisting>
-
- </sect2>
-
- <sect2>
- <title>DMA</title>
- <para>On the PC, peripherals that want to do bus-mastering DMA
- must deal with physical addresses. This is a problem since
- FreeBSD uses virtual memory and deals almost exclusively with
- virtual addresses. Fortunately, there is a function,
- <function>vtophys()</function> to help.</para>
-
-<programlisting>#include &lt;vm/vm.h&gt;
-#include &lt;vm/pmap.h&gt;
-
-#define vtophys(virtual_address) (...)
-</programlisting>
-
- <para>The solution is a bit different on the alpha however, and
- what we really want is a function called
- <function>vtobus()</function>.</para>
-
-<programlisting>#if defined(__alpha__)
-#define vtobus(va) alpha_XXX_dmamap((vm_offset_t)va)
-#else
-#define vtobus(va) vtophys(va)
-#endif
-</programlisting>
-
- </sect2>
-
- <sect2>
- <title>Deallocating Resources</title>
-
- <para>It's very important to deallocate all of the resources
- that were allocated during <function>attach()</function>.
- Care must be taken to deallocate the correct stuff even on a
- failure condition so that the system will remain useable while
- your driver dies.</para>
-
- </sect2>
- </sect1>
-
-</chapter>
-
-
diff --git a/en_US.ISO8859-1/books/arch-handbook/scsi/chapter.sgml b/en_US.ISO8859-1/books/arch-handbook/scsi/chapter.sgml
deleted file mode 100644
index 072aea5499..0000000000
--- a/en_US.ISO8859-1/books/arch-handbook/scsi/chapter.sgml
+++ /dev/null
@@ -1,1983 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD: doc/en_US.ISO8859-1/books/developers-handbook/scsi/chapter.sgml,v 1.4 2001/06/13 11:35:56 tom Exp $
--->
-
-<chapter id="scsi">
- <title>Common Access Method SCSI Controllers</title>
-
- <para><emphasis>This chapter was written by &a.babkin;
- Modifications for the handbook made by
- &a.murray;.</emphasis></para>
-
- <sect1>
- <title>Synopsis</title>
-
- <para>This document assumes that the reader has a general
- understanding of device drivers in FreeBSD and of the SCSI
- protocol. Much of the information in this document was
- extracted from the drivers :</para>
-
- <itemizedlist>
-
- <listitem><para>ncr (<filename>/sys/pci/ncr.c</filename>) by
- Wolfgang Stanglmeier and Stefan Esser</para></listitem>
-
- <listitem><para>sym (<filename>/sys/pci/sym.c</filename>) by
- Gerard Roudier</para></listitem>
-
- <listitem><para>aic7xxx
- (<filename>/sys/dev/aic7xxx/aic7xxx.c</filename>) by Justin
- T. Gibbs</para></listitem>
-
- </itemizedlist>
-
- <para>and from the CAM code itself (by Justing T. Gibbs, see
- <filename>/sys/cam/*</filename>). When some solution looked the
- most logical and was essentially verbatim extracted from the code
- by Justin Gibbs, I marked it as "recommended".</para>
-
- <para>The document is illustrated with examples in
- pseudo-code. Although sometimes the examples have many details
- and look like real code, it's still pseudo-code. It was written
- to demonstrate the concepts in an understandable way. For a real
- driver other approaches may be more modular and efficient. It
- also abstracts from the hardware details, as well as issues that
- would cloud the demonstrated concepts or that are supposed to be
- described in the other chapters of the developers handbook. Such
- details are commonly shown as calls to functions with descriptive
- names, comments or pseudo-statements. Fortunately real life
- full-size examples with all the details can be found in the real
- drivers.</para>
-
- </sect1>
-
- <sect1>
- <title>General architecture</title>
-
- <para>CAM stands for Common Access Method. It's a generic way to
- address the I/O buses in a SCSI-like way. This allows a
- separation of the generic device drivers from the drivers
- controlling the I/O bus: for example the disk driver becomes able
- to control disks on both SCSI, IDE, and/or any other bus so the
- disk driver portion does not have to be rewritten (or copied and
- modified) for every new I/O bus. Thus the two most important
- active entities are:</para>
-
- <itemizedlist>
- <listitem><para><emphasis>Peripheral Modules</emphasis> - a
- driver for peripheral devices (disk, tape, CDROM,
- etc.)</para></listitem>
- <listitem><para><emphasis>SCSI Interface Modules </emphasis>(SIM)
- - a Host Bus Adapter drivers for connecting to an I/O bus such
- as SCSI or IDE.</para></listitem>
- </itemizedlist>
-
- <para>A peripheral driver receives requests from the OS, converts
- them to a sequence of SCSI commands and passes these SCSI
- commands to a SCSI Interface Module. The SCSI Interface Module
- is responsible for passing these commands to the actual hardware
- (or if the actual hardware is not SCSI but, for example, IDE
- then also converting the SCSI commands to the native commands of
- the hardware).</para>
-
- <para>Because we are interested in writing a SCSI adapter driver
- here, from this point on we will consider everything from the
- SIM standpoint.</para>
-
- <para>A typical SIM driver needs to include the following
- CAM-related header files:</para>
-
-<programlisting>#include &lt;cam/cam.h&gt;
-#include &lt;cam/cam_ccb.h&gt;
-#include &lt;cam/cam_sim.h&gt;
-#include &lt;cam/cam_xpt_sim.h&gt;
-#include &lt;cam/cam_debug.h&gt;
-#include &lt;cam/scsi/scsi_all.h&gt;</programlisting>
-
- <para>The first thing each SIM driver must do is register itself
- with the CAM subsystem. This is done during the driver's
- <function>xxx_attach()</function> function (here and further
- xxx_ is used to denote the unique driver name prefix). The
- <function>xxx_attach()</function> function itself is called by
- the system bus auto-configuration code which we don't describe
- here.</para>
-
- <para>This is achieved in multiple steps: first it's necessary to
- allocate the queue of requests associated with this SIM:</para>
-
-<programlisting> struct cam_devq *devq;
-
- if(( devq = cam_simq_alloc(SIZE) )==NULL) {
- error; /* some code to handle the error */
- }</programlisting>
-
- <para>Here SIZE is the size of the queue to be allocated, maximal
- number of requests it could contain. It's the number of requests
- that the SIM driver can handle in parallel on one SCSI
- card. Commonly it can be calculated as:</para>
-
-<programlisting>SIZE = NUMBER_OF_SUPPORTED_TARGETS * MAX_SIMULTANEOUS_COMMANDS_PER_TARGET</programlisting>
-
- <para>Next we create a descriptor of our SIM:</para>
-
-<programlisting> struct cam_sim *sim;
-
- if(( sim = cam_sim_alloc(action_func, poll_func, driver_name,
- softc, unit, max_dev_transactions,
- max_tagged_dev_transactions, devq) )==NULL) {
- cam_simq_free(devq);
- error; /* some code to handle the error */
- }</programlisting>
-
- <para>Note that if we are not able to create a SIM descriptor we
- free the <structname>devq</structname> also because we can do
- nothing else with it and we want to conserve memory.</para>
-
- <para>If a SCSI card has multiple SCSI buses on it then each bus
- requires its own <structname>cam_sim</structname>
- structure.</para>
-
- <para>An interesting question is what to do if a SCSI card has
- more than one SCSI bus, do we need one
- <structname>devq</structname> structure per card or per SCSI
- bus? The answer given in the comments to the CAM code is:
- either way, as the driver's author prefers.</para>
-
- <para>The arguments are :
- <itemizedlist>
-
- <listitem><para><function>action_func</function> - pointer to
- the driver's <function>xxx_action</function> function.
- <funcSynopsis><funcPrototype>
- <funcDef>static void
- <function>xxx_action</function>
- </funcDef>
- <paramdef>
- <parameter>struct cam_sim *sim</parameter>,
- <parameter>union ccb *ccb</parameter>
- </paramdef>
- </funcPrototype></funcSynopsis>
- </para></listitem>
-
- <listitem><para><function>poll_func</function> - pointer to
- the driver's <function>xxx_poll()</function>
- <funcSynopsis><funcPrototype>
- <funcDef>static void
- <function>xxx_poll</function>
- </funcDef>
- <paramdef>
- <parameter>struct cam_sim *sim</parameter>
- </paramdef>
- </funcPrototype></funcSynopsis>
- </para></listitem>
-
- <listitem><para>driver_name - the name of the actual driver,
- such as "ncr" or "wds"</para></listitem>
-
- <listitem><para><structName>softc</structName> - pointer to the
- driver's internal descriptor for this SCSI card. This
- pointer will be used by the driver in future to get private
- data.</para></listitem>
-
- <listitem><para>unit - the controller unit number, for example
- for controller "wds0" this number will be
- 0</para></listitem>
-
- <listitem><para>max_dev_transactions - maximal number of
- simultaneous transactions per SCSI target in the non-tagged
- mode. This value will be almost universally equal to 1, with
- possible exceptions only for the non-SCSI cards. Also the
- drivers that hope to take advantage by preparing one
- transaction while another one is executed may set it to 2
- but this does not seem to be worth the
- complexity.</para></listitem>
-
- <listitem><para>max_tagged_dev_transactions - the same thing,
- but in the tagged mode. Tags are the SCSI way to initiate
- multiple transactions on a device: each transaction is
- assigned a unique tag and the transaction is sent to the
- device. When the device completes some transaction it sends
- back the result together with the tag so that the SCSI
- adapter (and the driver) can tell which transaction was
- completed. This argument is also known as the maximal tag
- depth. It depends on the abilities of the SCSI
- adapter.</para></listitem>
- </itemizedlist>
- </para>
-
- <para>Finally we register the SCSI buses associated with our SCSI
- adapter:</para>
-
-<programlisting> if(xpt_bus_register(sim, bus_number) != CAM_SUCCESS) {
- cam_sim_free(sim, /*free_devq*/ TRUE);
- error; /* some code to handle the error */
- }</programlisting>
-
- <para>If there is one <structName>devq</structName> structure per
- SCSI bus (i.e. we consider a card with multiple buses as
- multiple cards with one bus each) then the bus number will
- always be 0, otherwise each bus on the SCSI card should be get a
- distinct number. Each bus needs its own separate structure
- cam_sim.</para>
-
- <para>After that our controller is completely hooked to the CAM
- system. The value of <structName>devq</structName> can be
- discarded now: sim will be passed as an argument in all further
- calls from CAM and devq can be derived from it.</para>
-
- <para>CAM provides the framework for such asynchronous
- events. Some events originate from the lower levels (the SIM
- drivers), some events originate from the peripheral drivers,
- some events originate from the CAM subsystem itself. Any driver
- can register callbacks for some types of the asynchronous
- events, so that it would be notified if these events
- occur.</para>
-
- <para>A typical example of such an event is a device reset. Each
- transaction and event identifies the devices to which it applies
- by the means of "path". The target-specific events normally
- occur during a transaction with this device. So the path from
- that transaction may be re-used to report this event (this is
- safe because the event path is copied in the event reporting
- routine but not deallocated nor passed anywhere further). Also
- it's safe to allocate paths dynamically at any time including
- the interrupt routines, although that incurs certain overhead,
- and a possible problem with this approach is that there may be
- no free memory at that time. For a bus reset event we need to
- define a wildcard path including all devices on the bus. So we
- can create the path for the future bus reset events in advance
- and avoid problems with the future memory shortage:</para>
-
-<programlisting> struct cam_path *path;
-
- if(xpt_create_path(&amp;path, /*periph*/NULL,
- cam_sim_path(sim), CAM_TARGET_WILDCARD,
- CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
- xpt_bus_deregister(cam_sim_path(sim));
- cam_sim_free(sim, /*free_devq*/TRUE);
- error; /* some code to handle the error */
- }
-
- softc->wpath = path;
- softc->sim = sim;</programlisting>
-
- <para>As you can see the path includes:</para>
-
- <itemizedlist>
- <listitem><para>ID of the peripheral driver (NULL here because we have
- none)</para></listitem>
-
- <listitem><para>ID of the SIM driver
- (<function>cam_sim_path(sim)</function>)</para></listitem>
-
- <listitem><para>SCSI target number of the device (CAM_TARGET_WILDCARD
- means "all devices")</para></listitem>
-
- <listitem><para>SCSI LUN number of the subdevice (CAM_LUN_WILDCARD means
- "all LUNs")</para></listitem>
- </itemizedlist>
-
- <para>If the driver can't allocate this path it won't be able to
- work normally, so in that case we dismantle that SCSI
- bus.</para>
-
- <para>And we save the path pointer in the
- <structName>softc</structName> structure for future use. After
- that we save the value of sim (or we can also discard it on the
- exit from <function>xxx_probe()</function> if we wish).</para>
-
- <para>That's all for a minimalistic initialization. To do things
- right there is one more issue left. </para>
-
- <para>For a SIM driver there is one particularly interesting
- event: when a target device is considered lost. In this case
- resetting the SCSI negotiations with this device may be a good
- idea. So we register a callback for this event with CAM. The
- request is passed to CAM by requesting CAM action on a CAM
- control block for this type of request:</para>
-
-<programlisting> struct ccb_setasync csa;
-
- xpt_setup_ccb(&amp;csa.ccb_h, path, /*priority*/5);
- csa.ccb_h.func_code = XPT_SASYNC_CB;
- csa.event_enable = AC_LOST_DEVICE;
- csa.callback = xxx_async;
- csa.callback_arg = sim;
- xpt_action((union ccb *)&amp;csa);</programlisting>
-
- <para>Now we take a look at the <function>xxx_action()</function>
- and <function>xxx_poll()</function> driver entry points.</para>
-
- <para>
- <funcSynopsis><funcPrototype>
- <funcDef>static void
- <function>xxx_action</function>
- </funcDef>
- <paramdef>
- <parameter>struct cam_sim *sim</parameter>,
- <parameter>union ccb *ccb</parameter>
- </paramdef>
- </funcPrototype></funcSynopsis>
- </para>
-
- <para>Do some action on request of the CAM subsystem. Sim
- describes the SIM for the request, CCB is the request
- itself. CCB stands for "CAM Control Block". It is a union of
- many specific instances, each describing arguments for some type
- of transactions. All of these instances share the CCB header
- where the common part of arguments is stored.</para>
-
- <para>CAM supports the SCSI controllers working in both initiator
- ("normal") mode and target (simulating a SCSI device) mode. Here
- we only consider the part relevant to the initiator mode.</para>
-
- <para>There are a few function and macros (in other words,
- methods) defined to access the public data in the struct sim:</para>
-
- <itemizedlist>
- <listitem><para><function>cam_sim_path(sim)</function> - the
- path ID (see above)</para></listitem>
-
- <listitem><para><function>cam_sim_name(sim)</function> - the
- name of the sim</para></listitem>
-
- <listitem><para><function>cam_sim_softc(sim)</function> - the
- pointer to the softc (driver private data)
- structure</para></listitem>
-
- <listitem><para><function> cam_sim_unit(sim)</function> - the
- unit number</para></listitem>
-
- <listitem><para><function> cam_sim_bus(sim)</function> - the bus
- ID</para></listitem>
- </itemizedlist>
-
- <para>To identify the device, <function>xxx_action()</function> can
- get the unit number and pointer to its structure softc using
- these functions.</para>
-
- <para>The type of request is stored in
- <structField>ccb-&gt;ccb_h.func_code</structField>. So generally
- <function>xxx_action()</function> consists of a big
- switch:</para>
-
-<programlisting> struct xxx_softc *softc = (struct xxx_softc *) cam_sim_softc(sim);
- struct ccb_hdr *ccb_h = &amp;ccb->ccb_h;
- int unit = cam_sim_unit(sim);
- int bus = cam_sim_bus(sim);
-
- switch(ccb_h->func_code) {
- case ...:
- ...
- default:
- ccb_h->status = CAM_REQ_INVALID;
- xpt_done(ccb);
- break;
- }</programlisting>
-
- <para>As can be seen from the default case (if an unknown command
- was received) the return code of the command is set into
- <structField>ccb-&gt;ccb_h.status</structField> and the completed
- CCB is returned back to CAM by calling
- <function>xpt_done(ccb)</function>. </para>
-
- <para><function>xpt_done()</function> does not have to be called
- from <function>xxx_action()</function>: For example an I/O
- request may be enqueued inside the SIM driver and/or its SCSI
- controller. Then when the device would post an interrupt
- signaling that the processing of this request is complete
- <function>xpt_done()</function> may be called from the interrupt
- handling routine.</para>
-
- <para>Actually, the CCB status is not only assigned as a return
- code but a CCB has some status all the time. Before CCB is
- passed to the <function>xxx_action()</function> routine it gets
- the status CCB_REQ_INPROG meaning that it's in progress. There
- are a surprising number of status values defined in
- <filename>/sys/cam/cam.h</filename> which should be able to
- represent the status of a request in great detail. More
- interesting yet, the status is in fact a "bitwise or" of an
- enumerated status value (the lower 6 bits) and possible
- additional flag-like bits (the upper bits). The enumerated
- values will be discussed later in more detail. The summary of
- them can be found in the Errors Summary section. The possible
- status flags are:</para>
-
- <itemizedlist>
-
- <listitem><para><emphasis>CAM_DEV_QFRZN</emphasis> - if the
- SIM driver gets a serious error (for example, the device does
- not respond to the selection or breaks the SCSI protocol) when
- processing a CCB it should freeze the request queue by calling
- <function>xpt_freeze_simq()</function>, return the other
- enqueued but not processed yet CCBs for this device back to
- the CAM queue, then set this flag for the troublesome CCB and
- call <function>xpt_done()</function>. This flag causes the CAM
- subsystem to unfreeze the queue after it handles the
- error.</para></listitem>
-
- <listitem><para><emphasis>CAM_AUTOSNS_VALID</emphasis> - if
- the device returned an error condition and the flag
- CAM_DIS_AUTOSENSE is not set in CCB the SIM driver must
- execute the REQUEST SENSE command automatically to extract the
- sense (extended error information) data from the device. If
- this attempt was successful the sense data should be saved in
- the CCB and this flag set.</para></listitem>
-
- <listitem><para><emphasis>CAM_RELEASE_SIMQ</emphasis> - like
- CAM_DEV_QFRZN but used in case there is some problem (or
- resource shortage) with the SCSI controller itself. Then all
- the future requests to the controller should be stopped by
- <function>xpt_freeze_simq()</function>. The controller queue
- will be restarted after the SIM driver overcomes the shortage
- and informs CAM by returning some CCB with this flag
- set.</para></listitem>
-
- <listitem><para><emphasis>CAM_SIM_QUEUED</emphasis> - when SIM
- puts a CCB into its request queue this flag should be set (and
- removed when this CCB gets dequeued before being returned back
- to CAM). This flag is not used anywhere in the CAM code now,
- so its purpose is purely diagnostic.</para></listitem>
-
- </itemizedlist>
-
- <para>The function <function>xxx_action()</function> is not
- allowed to sleep, so all the synchronization for resource access
- must be done using SIM or device queue freezing. Besides the
- aforementioned flags the CAM subsystem provides functions
- <function>xpt_selease_simq()</function> and
- <function>xpt_release_devq()</function> to unfreeze the queues
- directly, without passing a CCB to CAM.</para>
-
- <para>The CCB header contains the following fields:</para>
-
- <itemizedlist>
-
- <listitem><para><emphasis>path</emphasis> - path ID for the
- request</para></listitem>
-
- <listitem><para><emphasis>target_id</emphasis> - target device
- ID for the request</para></listitem>
-
- <listitem><para><emphasis>target_lun</emphasis> - LUN ID of
- the target device</para></listitem>
-
- <listitem><para><emphasis>timeout</emphasis> - timeout
- interval for this command, in milliseconds</para></listitem>
-
- <listitem><para><emphasis>timeout_ch</emphasis> - a
- convenience place for the SIM driver to store the timeout handle
- (the CAM subsystem itself does not make any assumptions about
- it)</para></listitem>
-
- <listitem><para><emphasis>flags</emphasis> - various bits of
- information about the request spriv_ptr0, spriv_ptr1 - fields
- reserved for private use by the SIM driver (such as linking to
- the SIM queues or SIM private control blocks); actually, they
- exist as unions: spriv_ptr0 and spriv_ptr1 have the type (void
- *), spriv_field0 and spriv_field1 have the type unsigned long,
- sim_priv.entries[0].bytes and sim_priv.entries[1].bytes are byte
- arrays of the size consistent with the other incarnations of the
- union and sim_priv.bytes is one array, twice
- bigger.</para></listitem>
-
- </itemizedlist>
-
- <para>The recommended way of using the SIM private fields of CCB
- is to define some meaningful names for them and use these
- meaningful names in the driver, like:</para>
-
-<programlisting>#define ccb_some_meaningful_name sim_priv.entries[0].bytes
-#define ccb_hcb spriv_ptr1 /* for hardware control block */</programlisting>
-
- <para>The most common initiator mode requests are:</para>
- <itemizedlist>
- <listitem><para><emphasis>XPT_SCSI_IO</emphasis> - execute an
- I/O transaction</para>
-
- <para>The instance "struct ccb_scsiio csio" of the union ccb is
- used to transfer the arguments. They are:</para>
-
- <itemizedlist>
- <listitem><para><emphasis>cdb_io</emphasis> - pointer to
- the SCSI command buffer or the buffer
- itself</para></listitem>
-
- <listitem><para><emphasis>cdb_len</emphasis> - SCSI
- command length</para></listitem>
-
- <listitem><para><emphasis>data_ptr</emphasis> - pointer to
- the data buffer (gets a bit complicated if scatter/gather is
- used)</para></listitem>
-
- <listitem><para><emphasis>dxfer_len</emphasis> - length of
- the data to transfer</para></listitem>
-
- <listitem><para><emphasis>sglist_cnt</emphasis> - counter
- of the scatter/gather segments</para></listitem>
-
- <listitem><para><emphasis>scsi_status</emphasis> - place
- to return the SCSI status</para></listitem>
-
- <listitem><para><emphasis>sense_data</emphasis> - buffer
- for the SCSI sense information if the command returns an
- error (the SIM driver is supposed to run the REQUEST SENSE
- command automatically in this case if the CCB flag
- CAM_DIS_AUTOSENSE is not set)</para></listitem>
-
- <listitem><para><emphasis>sense_len</emphasis> - the
- length of that buffer (if it happens to be higher than size
- of sense_data the SIM driver must silently assume the
- smaller value) resid, sense_resid - if the transfer of data
- or SCSI sense returned an error these are the returned
- counters of the residual (not transferred) data. They do not
- seem to be especially meaningful, so in a case when they are
- difficult to compute (say, counting bytes in the SCSI
- controller's FIFO buffer) an approximate value will do as
- well. For a successfully completed transfer they must be set
- to zero.</para></listitem>
-
- <listitem><para><emphasis>tag_action</emphasis> - the kind
- of tag to use:
-
- <itemizedlist>
- <listitem><para>CAM_TAG_ACTION_NONE - don't use tags for this
- transaction</para></listitem>
- <listitem><para>MSG_SIMPLE_Q_TAG, MSG_HEAD_OF_Q_TAG,
- MSG_ORDERED_Q_TAG - value equal to the appropriate tag
- message (see /sys/cam/scsi/scsi_message.h); this gives only
- the tag type, the SIM driver must assign the tag value
- itself</para></listitem>
- </itemizedlist>
-
- </para></listitem>
-
- </itemizedlist>
-
- <para>The general logic of handling this request is the
- following:</para>
-
- <para>The first thing to do is to check for possible races, to
- make sure that the command did not get aborted when it was
- sitting in the queue:</para>
-
-<programlisting> struct ccb_scsiio *csio = &amp;ccb->csio;
-
- if ((ccb_h->status &amp; CAM_STATUS_MASK) != CAM_REQ_INPROG) {
- xpt_done(ccb);
- return;
- }</programlisting>
-
- <para>Also we check that the device is supported at all by our
- controller:</para>
-
-<programlisting> if(ccb_h->target_id > OUR_MAX_SUPPORTED_TARGET_ID
- || cch_h->target_id == OUR_SCSI_CONTROLLERS_OWN_ID) {
- ccb_h->status = CAM_TID_INVALID;
- xpt_done(ccb);
- return;
- }
- if(ccb_h->target_lun > OUR_MAX_SUPPORTED_LUN) {
- ccb_h->status = CAM_LUN_INVALID;
- xpt_done(ccb);
- return;
- }</programlisting>
-
- <para>Then allocate whatever data structures (such as
- card-dependent hardware control block) we need to process this
- request. If we can't then freeze the SIM queue and remember
- that we have a pending operation, return the CCB back and ask
- CAM to re-queue it. Later when the resources become available
- the SIM queue must be unfrozen by returning a ccb with the
- CAM_SIMQ_RELEASE bit set in its status. Otherwise, if all went
- well, link the CCB with the hardware control block (HCB) and
- mark it as queued.</para>
-
-<programlisting> struct xxx_hcb *hcb = allocate_hcb(softc, unit, bus);
-
- if(hcb == NULL) {
- softc->flags |= RESOURCE_SHORTAGE;
- xpt_freeze_simq(sim, /*count*/1);
- ccb_h->status = CAM_REQUEUE_REQ;
- xpt_done(ccb);
- return;
- }
-
- hcb->ccb = ccb; ccb_h->ccb_hcb = (void *)hcb;
- ccb_h->status |= CAM_SIM_QUEUED;</programlisting>
-
- <para>Extract the target data from CCB into the hardware control
- block. Check if we are asked to assign a tag and if yes then
- generate an unique tag and build the SCSI tag messages. The
- SIM driver is also responsible for negotiations with the
- devices to set the maximal mutually supported bus width,
- synchronous rate and offset.</para>
-
-<programlisting> hcb->target = ccb_h->target_id; hcb->lun = ccb_h->target_lun;
- generate_identify_message(hcb);
- if( ccb_h->tag_action != CAM_TAG_ACTION_NONE )
- generate_unique_tag_message(hcb, ccb_h->tag_action);
- if( !target_negotiated(hcb) )
- generate_negotiation_messages(hcb);</programlisting>
-
- <para>Then set up the SCSI command. The command storage may be
- specified in the CCB in many interesting ways, specified by
- the CCB flags. The command buffer can be contained in CCB or
- pointed to, in the latter case the pointer may be physical or
- virtual. Since the hardware commonly needs physical address we
- always convert the address to the physical one.</para>
-
- <para>A NOT-QUITE RELATED NOTE: Normally this is done by a call
- to vtophys(), but for the PCI device (which account for most
- of the SCSI controllers now) drivers' portability to the Alpha
- architecture the conversion must be done by vtobus() instead
- due to special Alpha quirks. [IMHO it would be much better to
- have two separate functions, vtop() and ptobus() then vtobus()
- would be a simple superposition of them.] In case if a
- physical address is requested it's OK to return the CCB with
- the status CAM_REQ_INVALID, the current drivers do that. But
- it's also possible to compile the Alpha-specific piece of
- code, as in this example (there should be a more direct way to
- do that, without conditional compilation in the drivers). If
- necessary a physical address can be also converted or mapped
- back to a virtual address but with big pain, so we don't do
- that.</para>
-
-<programlisting> if(ccb_h->flags &amp; CAM_CDB_POINTER) {
- /* CDB is a pointer */
- if(!(ccb_h->flags &amp; CAM_CDB_PHYS)) {
- /* CDB pointer is virtual */
- hcb->cmd = vtobus(csio->cdb_io.cdb_ptr);
- } else {
- /* CDB pointer is physical */
-#if defined(__alpha__)
- hcb->cmd = csio->cdb_io.cdb_ptr | alpha_XXX_dmamap_or ;
-#else
- hcb->cmd = csio->cdb_io.cdb_ptr ;
-#endif
- }
- } else {
- /* CDB is in the ccb (buffer) */
- hcb->cmd = vtobus(csio->cdb_io.cdb_bytes);
- }
- hcb->cmdlen = csio->cdb_len;</programlisting>
-
- <para>Now it's time to set up the data. Again, the data storage
- may be specified in the CCB in many interesting ways,
- specified by the CCB flags. First we get the direction of the
- data transfer. The simplest case is if there is no data to
- transfer:</para>
-
-<programlisting> int dir = (ccb_h->flags &amp; CAM_DIR_MASK);
-
- if (dir == CAM_DIR_NONE)
- goto end_data;</programlisting>
-
- <para>Then we check if the data is in one chunk or in a
- scatter-gather list, and the addresses are physical or
- virtual. The SCSI controller may be able to handle only a
- limited number of chunks of limited length. If the request
- hits this limitation we return an error. We use a special
- function to return the CCB to handle in one place the HCB
- resource shortages. The functions to add chunks are
- driver-dependent, and here we leave them without detailed
- implementation. See description of the SCSI command (CDB)
- handling for the details on the address-translation issues.
- If some variation is too difficult or impossible to implement
- with a particular card it's OK to return the status
- CAM_REQ_INVALID. Actually, it seems like the scatter-gather
- ability is not used anywhere in the CAM code now. But at least
- the case for a single non-scattered virtual buffer must be
- implemented, it's actively used by CAM.</para>
-
-<programlisting> int rv;
-
- initialize_hcb_for_data(hcb);
-
- if((!(ccb_h->flags &amp; CAM_SCATTER_VALID)) {
- /* single buffer */
- if(!(ccb_h->flags &amp; CAM_DATA_PHYS)) {
- rv = add_virtual_chunk(hcb, csio->data_ptr, csio->dxfer_len, dir);
- }
- } else {
- rv = add_physical_chunk(hcb, csio->data_ptr, csio->dxfer_len, dir);
- }
- } else {
- int i;
- struct bus_dma_segment *segs;
- segs = (struct bus_dma_segment *)csio->data_ptr;
-
- if ((ccb_h->flags &amp; CAM_SG_LIST_PHYS) != 0) {
- /* The SG list pointer is physical */
- rv = setup_hcb_for_physical_sg_list(hcb, segs, csio->sglist_cnt);
- } else if (!(ccb_h->flags &amp; CAM_DATA_PHYS)) {
- /* SG buffer pointers are virtual */
- for (i = 0; i < csio->sglist_cnt; i++) {
- rv = add_virtual_chunk(hcb, segs[i].ds_addr,
- segs[i].ds_len, dir);
- if (rv != CAM_REQ_CMP)
- break;
- }
- } else {
- /* SG buffer pointers are physical */
- for (i = 0; i < csio->sglist_cnt; i++) {
- rv = add_physical_chunk(hcb, segs[i].ds_addr,
- segs[i].ds_len, dir);
- if (rv != CAM_REQ_CMP)
- break;
- }
- }
- }
- if(rv != CAM_REQ_CMP) {
- /* we expect that add_*_chunk() functions return CAM_REQ_CMP
- * if they added a chunk successfully, CAM_REQ_TOO_BIG if
- * the request is too big (too many bytes or too many chunks),
- * CAM_REQ_INVALID in case of other troubles
- */
- free_hcb_and_ccb_done(hcb, ccb, rv);
- return;
- }
- end_data:</programlisting>
-
- <para>If disconnection is disabled for this CCB we pass this
- information to the hcb:</para>
-
-<programlisting> if(ccb_h->flags &amp; CAM_DIS_DISCONNECT)
- hcb_disable_disconnect(hcb);</programlisting>
-
- <para>If the controller is able to run REQUEST SENSE command all
- by itself then the value of the flag CAM_DIS_AUTOSENSE should
- also be passed to it, to prevent automatic REQUEST SENSE if the
- CAM subsystem does not want it.</para>
-
- <para>The only thing left is to set up the timeout, pass our hcb
- to the hardware and return, the rest will be done by the
- interrupt handler (or timeout handler).</para>
-
-<programlisting> ccb_h->timeout_ch = timeout(xxx_timeout, (caddr_t) hcb,
- (ccb_h->timeout * hz) / 1000); /* convert milliseconds to ticks */
- put_hcb_into_hardware_queue(hcb);
- return;</programlisting>
-
- <para>And here is a possible implementation of the function
- returning CCB:</para>
-
-<programlisting> static void
- free_hcb_and_ccb_done(struct xxx_hcb *hcb, union ccb *ccb, u_int32_t status)
- {
- struct xxx_softc *softc = hcb->softc;
-
- ccb->ccb_h.ccb_hcb = 0;
- if(hcb != NULL) {
- untimeout(xxx_timeout, (caddr_t) hcb, ccb->ccb_h.timeout_ch);
- /* we're about to free a hcb, so the shortage has ended */
- if(softc->flags &amp; RESOURCE_SHORTAGE) {
- softc->flags &amp;= ~RESOURCE_SHORTAGE;
- status |= CAM_RELEASE_SIMQ;
- }
- free_hcb(hcb); /* also removes hcb from any internal lists */
- }
- ccb->ccb_h.status = status |
- (ccb->ccb_h.status &amp; ~(CAM_STATUS_MASK|CAM_SIM_QUEUED));
- xpt_done(ccb);
- }</programlisting>
- </listitem>
-
- <listitem><para><emphasis>XPT_RESET_DEV</emphasis> - send the SCSI "BUS
- DEVICE RESET" message to a device</para>
-
- <para>There is no data transferred in CCB except the header and
- the most interesting argument of it is target_id. Depending on
- the controller hardware a hardware control block just like for
- the XPT_SCSI_IO request may be constructed (see XPT_SCSI_IO
- request description) and sent to the controller or the SCSI
- controller may be immediately programmed to send this RESET
- message to the device or this request may be just not supported
- (and return the status CAM_REQ_INVALID). Also on completion of
- the request all the disconnected transactions for this target
- must be aborted (probably in the interrupt routine).</para>
-
- <para>Also all the current negotiations for the target are lost on
- reset, so they might be cleaned too. Or they clearing may be
- deferred, because anyway the target would request re-negotiation
- on the next transaction.</para></listitem>
-
- <listitem><para><emphasis>XPT_RESET_BUS</emphasis> - send the RESET signal
- to the SCSI bus</para>
-
- <para>No arguments are passed in the CCB, the only interesting
- argument is the SCSI bus indicated by the struct sim
- pointer.</para>
-
- <para>A minimalistic implementation would forget the SCSI
- negotiations for all the devices on the bus and return the
- status CAM_REQ_CMP.</para>
-
- <para>The proper implementation would in addition actually reset
- the SCSI bus (possible also reset the SCSI controller) and mark
- all the CCBs being processed, both those in the hardware queue
- and those being disconnected, as done with the status
- CAM_SCSI_BUS_RESET. Like:</para>
-
-<programlisting> int targ, lun;
- struct xxx_hcb *h, *hh;
- struct ccb_trans_settings neg;
- struct cam_path *path;
-
- /* The SCSI bus reset may take a long time, in this case its completion
- * should be checked by interrupt or timeout. But for simplicity
- * we assume here that it's really fast.
- */
- reset_scsi_bus(softc);
-
- /* drop all enqueued CCBs */
- for(h = softc->first_queued_hcb; h != NULL; h = hh) {
- hh = h->next;
- free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);
- }
-
- /* the clean values of negotiations to report */
- neg.bus_width = 8;
- neg.sync_period = neg.sync_offset = 0;
- neg.valid = (CCB_TRANS_BUS_WIDTH_VALID
- | CCB_TRANS_SYNC_RATE_VALID | CCB_TRANS_SYNC_OFFSET_VALID);
-
- /* drop all disconnected CCBs and clean negotiations */
- for(targ=0; targ <= OUR_MAX_SUPPORTED_TARGET; targ++) {
- clean_negotiations(softc, targ);
-
- /* report the event if possible */
- if(xpt_create_path(&amp;path, /*periph*/NULL,
- cam_sim_path(sim), targ,
- CAM_LUN_WILDCARD) == CAM_REQ_CMP) {
- xpt_async(AC_TRANSFER_NEG, path, &amp;neg);
- xpt_free_path(path);
- }
-
- for(lun=0; lun <= OUR_MAX_SUPPORTED_LUN; lun++)
- for(h = softc->first_discon_hcb[targ][lun]; h != NULL; h = hh) {
- hh=h->next;
- free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);
- }
- }
-
- ccb->ccb_h.status = CAM_REQ_CMP;
- xpt_done(ccb);
-
- /* report the event */
- xpt_async(AC_BUS_RESET, softc->wpath, NULL);
- return;</programlisting>
-
- <para>Implementing the SCSI bus reset as a function may be a good
- idea because it would be re-used by the timeout function as a
- last resort if the things go wrong.</para></listitem>
-
- <listitem><para><emphasis>XPT_ABORT</emphasis> - abort the specified
- CCB</para>
-
- <para>The arguments are transferred in the instance "struct
- ccb_abort cab" of the union ccb. The only argument field in it
- is:</para>
-
- <para><emphasis>abort_ccb</emphasis> - pointer to the CCB to be
- aborted</para>
-
- <para>If the abort is not supported just return the status
- CAM_UA_ABORT. This is also the easy way to minimally implement
- this call, return CAM_UA_ABORT in any case.</para>
-
- <para>The hard way is to implement this request honestly. First
- check that abort applies to a SCSI transaction:</para>
-
-<programlisting> struct ccb *abort_ccb;
- abort_ccb = ccb->cab.abort_ccb;
-
- if(abort_ccb->ccb_h.func_code != XPT_SCSI_IO) {
- ccb->ccb_h.status = CAM_UA_ABORT;
- xpt_done(ccb);
- return;
- }</programlisting>
-
- <para>Then it's necessary to find this CCB in our queue. This can
- be done by walking the list of all our hardware control blocks
- in search for one associated with this CCB:</para>
-
-<programlisting> struct xxx_hcb *hcb, *h;
-
- hcb = NULL;
-
- /* We assume that softc->first_hcb is the head of the list of all
- * HCBs associated with this bus, including those enqueued for
- * processing, being processed by hardware and disconnected ones.
- */
- for(h = softc->first_hcb; h != NULL; h = h->next) {
- if(h->ccb == abort_ccb) {
- hcb = h;
- break;
- }
- }
-
- if(hcb == NULL) {
- /* no such CCB in our queue */
- ccb->ccb_h.status = CAM_PATH_INVALID;
- xpt_done(ccb);
- return;
- }
-
- hcb=found_hcb;</programlisting>
-
- <para>Now we look at the current processing status of the HCB. It
- may be either sitting in the queue waiting to be sent to the
- SCSI bus, being transferred right now, or disconnected and
- waiting for the result of the command, or actually completed by
- hardware but not yet marked as done by software. To make sure
- that we don't get in any races with hardware we mark the HCB as
- being aborted, so that if this HCB is about to be sent to the
- SCSI bus the SCSI controller will see this flag and skip
- it.</para>
-
-<programlisting> int hstatus;
-
- /* shown as a function, in case special action is needed to make
- * this flag visible to hardware
- */
- set_hcb_flags(hcb, HCB_BEING_ABORTED);
-
- abort_again:
-
- hstatus = get_hcb_status(hcb);
- switch(hstatus) {
- case HCB_SITTING_IN_QUEUE:
- remove_hcb_from_hardware_queue(hcb);
- /* FALLTHROUGH */
- case HCB_COMPLETED:
- /* this is an easy case */
- free_hcb_and_ccb_done(hcb, abort_ccb, CAM_REQ_ABORTED);
- break;</programlisting>
-
- <para>If the CCB is being transferred right now we would like to
- signal to the SCSI controller in some hardware-dependent way
- that we want to abort the current transfer. The SCSI controller
- would set the SCSI ATTENTION signal and when the target responds
- to it send an ABORT message. We also reset the timeout to make
- sure that the target is not sleeping forever. If the command
- would not get aborted in some reasonable time like 10 seconds
- the timeout routine would go ahead and reset the whole SCSI bus.
- Because the command will be aborted in some reasonable time we
- can just return the abort request now as successfully completed,
- and mark the aborted CCB as aborted (but not mark it as done
- yet).</para>
-
-<programlisting> case HCB_BEING_TRANSFERRED:
- untimeout(xxx_timeout, (caddr_t) hcb, abort_ccb->ccb_h.timeout_ch);
- abort_ccb->ccb_h.timeout_ch =
- timeout(xxx_timeout, (caddr_t) hcb, 10 * hz);
- abort_ccb->ccb_h.status = CAM_REQ_ABORTED;
- /* ask the controller to abort that HCB, then generate
- * an interrupt and stop
- */
- if(signal_hardware_to_abort_hcb_and_stop(hcb) < 0) {
- /* oops, we missed the race with hardware, this transaction
- * got off the bus before we aborted it, try again */
- goto abort_again;
- }
-
- break;</programlisting>
-
- <para>If the CCB is in the list of disconnected then set it up as
- an abort request and re-queue it at the front of hardware
- queue. Reset the timeout and report the abort request to be
- completed.</para>
-
-<programlisting> case HCB_DISCONNECTED:
- untimeout(xxx_timeout, (caddr_t) hcb, abort_ccb->ccb_h.timeout_ch);
- abort_ccb->ccb_h.timeout_ch =
- timeout(xxx_timeout, (caddr_t) hcb, 10 * hz);
- put_abort_message_into_hcb(hcb);
- put_hcb_at_the_front_of_hardware_queue(hcb);
- break;
- }
- ccb->ccb_h.status = CAM_REQ_CMP;
- xpt_done(ccb);
- return;</programlisting>
-
- <para>That's all for the ABORT request, although there is one more
- issue. Because the ABORT message cleans all the ongoing
- transactions on a LUN we have to mark all the other active
- transactions on this LUN as aborted. That should be done in the
- interrupt routine, after the transaction gets aborted.</para>
-
- <para>Implementing the CCB abort as a function may be quite a good
- idea, this function can be re-used if an I/O transaction times
- out. The only difference would be that the timed out transaction
- would return the status CAM_CMD_TIMEOUT for the timed out
- request. Then the case XPT_ABORT would be small, like
- that:</para>
-
-<programlisting> case XPT_ABORT:
- struct ccb *abort_ccb;
- abort_ccb = ccb->cab.abort_ccb;
-
- if(abort_ccb->ccb_h.func_code != XPT_SCSI_IO) {
- ccb->ccb_h.status = CAM_UA_ABORT;
- xpt_done(ccb);
- return;
- }
- if(xxx_abort_ccb(abort_ccb, CAM_REQ_ABORTED) < 0)
- /* no such CCB in our queue */
- ccb->ccb_h.status = CAM_PATH_INVALID;
- else
- ccb->ccb_h.status = CAM_REQ_CMP;
- xpt_done(ccb);
- return;</programlisting>
- </listitem>
-
- <listitem><para><emphasis>XPT_SET_TRAN_SETTINGS</emphasis> - explicitly
- set values of SCSI transfer settings</para>
-
- <para>The arguments are transferred in the instance "struct ccb_trans_setting cts"
-of the union ccb:</para>
-
- <itemizedlist>
- <listitem><para><emphasis>valid</emphasis> - a bitmask showing
- which settings should be updated:</para></listitem>
-
- <listitem><para><emphasis>CCB_TRANS_SYNC_RATE_VALID</emphasis>
- - synchronous transfer rate</para></listitem>
-
- <listitem><para><emphasis>CCB_TRANS_SYNC_OFFSET_VALID</emphasis>
- - synchronous offset</para></listitem>
-
- <listitem><para><emphasis>CCB_TRANS_BUS_WIDTH_VALID</emphasis>
- - bus width</para></listitem>
-
- <listitem><para><emphasis>CCB_TRANS_DISC_VALID</emphasis> -
- set enable/disable disconnection</para></listitem>
-
- <listitem><para><emphasis>CCB_TRANS_TQ_VALID</emphasis> - set
- enable/disable tagged queuing</para></listitem>
-
- <listitem><para><emphasis>flags</emphasis> - consists of two
- parts, binary arguments and identification of
- sub-operations. The binary arguments are :</para>
- <itemizedlist>
- <listitem><para><emphasis>CCB_TRANS_DISC_ENB</emphasis> - enable disconnection</para></listitem>
- <listitem><para><emphasis>CCB_TRANS_TAG_ENB</emphasis> -
- enable tagged queuing</para></listitem>
- </itemizedlist>
- </listitem>
-
- <listitem><para>the sub-operations are:</para>
- <itemizedlist>
- <listitem><para><emphasis>CCB_TRANS_CURRENT_SETTINGS</emphasis>
- - change the current negotiations</para></listitem>
-
- <listitem><para><emphasis>CCB_TRANS_USER_SETTINGS</emphasis>
- - remember the desired user values sync_period, sync_offset -
- self-explanatory, if sync_offset==0 then the asynchronous mode
- is requested bus_width - bus width, in bits (not
- bytes)</para></listitem>
- </itemizedlist>
- </listitem>
-
- </itemizedlist>
-
- <para>Two sets of negotiated parameters are supported, the user
- settings and the current settings. The user settings are not
- really used much in the SIM drivers, this is mostly just a piece
- of memory where the upper levels can store (and later recall)
- its ideas about the parameters. Setting the user parameters
- does not cause re-negotiation of the transfer rates. But when
- the SCSI controller does a negotiation it must never set the
- values higher than the user parameters, so it's essentially the
- top boundary.</para>
-
- <para>The current settings are, as the name says,
- current. Changing them means that the parameters must be
- re-negotiated on the next transfer. Again, these "new current
- settings" are not supposed to be forced on the device, just they
- are used as the initial step of negotiations. Also they must be
- limited by actual capabilities of the SCSI controller: for
- example, if the SCSI controller has 8-bit bus and the request
- asks to set 16-bit wide transfers this parameter must be
- silently truncated to 8-bit transfers before sending it to the
- device.</para>
-
- <para>One caveat is that the bus width and synchronous parameters
- are per target while the disconnection and tag enabling
- parameters are per lun.</para>
-
- <para>The recommended implementation is to keep 3 sets of
- negotiated (bus width and synchronous transfer)
- parameters:</para>
-
- <itemizedlist>
- <listitem><para><emphasis>user</emphasis> - the user set, as
- above</para></listitem>
-
- <listitem><para><emphasis>current</emphasis> - those actually
- in effect</para></listitem>
-
- <listitem><para><emphasis>goal</emphasis> - those requested by
- setting of the "current" parameters</para></listitem>
- </itemizedlist>
-
- <para>The code looks like:</para>
-
-<programlisting> struct ccb_trans_settings *cts;
- int targ, lun;
- int flags;
-
- cts = &amp;ccb->cts;
- targ = ccb_h->target_id;
- lun = ccb_h->target_lun;
- flags = cts->flags;
- if(flags &amp; CCB_TRANS_USER_SETTINGS) {
- if(flags &amp; CCB_TRANS_SYNC_RATE_VALID)
- softc->user_sync_period[targ] = cts->sync_period;
- if(flags &amp; CCB_TRANS_SYNC_OFFSET_VALID)
- softc->user_sync_offset[targ] = cts->sync_offset;
- if(flags &amp; CCB_TRANS_BUS_WIDTH_VALID)
- softc->user_bus_width[targ] = cts->bus_width;
-
- if(flags &amp; CCB_TRANS_DISC_VALID) {
- softc->user_tflags[targ][lun] &amp;= ~CCB_TRANS_DISC_ENB;
- softc->user_tflags[targ][lun] |= flags &amp; CCB_TRANS_DISC_ENB;
- }
- if(flags &amp; CCB_TRANS_TQ_VALID) {
- softc->user_tflags[targ][lun] &amp;= ~CCB_TRANS_TQ_ENB;
- softc->user_tflags[targ][lun] |= flags &amp; CCB_TRANS_TQ_ENB;
- }
- }
- if(flags &amp; CCB_TRANS_CURRENT_SETTINGS) {
- if(flags &amp; CCB_TRANS_SYNC_RATE_VALID)
- softc->goal_sync_period[targ] =
- max(cts->sync_period, OUR_MIN_SUPPORTED_PERIOD);
- if(flags &amp; CCB_TRANS_SYNC_OFFSET_VALID)
- softc->goal_sync_offset[targ] =
- min(cts->sync_offset, OUR_MAX_SUPPORTED_OFFSET);
- if(flags &amp; CCB_TRANS_BUS_WIDTH_VALID)
- softc->goal_bus_width[targ] = min(cts->bus_width, OUR_BUS_WIDTH);
-
- if(flags &amp; CCB_TRANS_DISC_VALID) {
- softc->current_tflags[targ][lun] &amp;= ~CCB_TRANS_DISC_ENB;
- softc->current_tflags[targ][lun] |= flags &amp; CCB_TRANS_DISC_ENB;
- }
- if(flags &amp; CCB_TRANS_TQ_VALID) {
- softc->current_tflags[targ][lun] &amp;= ~CCB_TRANS_TQ_ENB;
- softc->current_tflags[targ][lun] |= flags &amp; CCB_TRANS_TQ_ENB;
- }
- }
- ccb->ccb_h.status = CAM_REQ_CMP;
- xpt_done(ccb);
- return;</programlisting>
-
- <para>Then when the next I/O request will be processed it will
- check if it has to re-negotiate, for example by calling the
- function target_negotiated(hcb). It can be implemented like
- this:</para>
-
-<programlisting> int
- target_negotiated(struct xxx_hcb *hcb)
- {
- struct softc *softc = hcb->softc;
- int targ = hcb->targ;
-
- if( softc->current_sync_period[targ] != softc->goal_sync_period[targ]
- || softc->current_sync_offset[targ] != softc->goal_sync_offset[targ]
- || softc->current_bus_width[targ] != softc->goal_bus_width[targ] )
- return 0; /* FALSE */
- else
- return 1; /* TRUE */
- }</programlisting>
-
- <para>After the values are re-negotiated the resulting values must
- be assigned to both current and goal parameters, so for future
- I/O transactions the current and goal parameters would be the
- same and <function>target_negotiated()</function> would return
- TRUE. When the card is initialized (in
- <function>xxx_attach()</function>) the current negotiation
- values must be initialized to narrow asynchronous mode, the goal
- and current values must be initialized to the maximal values
- supported by controller.</para></listitem>
-
- <listitem><para><emphasis>XPT_GET_TRAN_SETTINGS</emphasis> - get values of
- SCSI transfer settings</para>
-
- <para>This operations is the reverse of
- XPT_SET_TRAN_SETTINGS. Fill up the CCB instance "struct
- ccb_trans_setting cts" with data as requested by the flags
- CCB_TRANS_CURRENT_SETTINGS or CCB_TRANS_USER_SETTINGS (if both
- are set then the existing drivers return the current
- settings). Set all the bits in the valid field.</para></listitem>
-
- <listitem><para><emphasis>XPT_CALC_GEOMETRY</emphasis> - calculate logical
- (BIOS) geometry of the disk</para>
-
- <para>The arguments are transferred in the instance "struct
- ccb_calc_geometry ccg" of the union ccb:</para>
-
- <itemizedlist>
-
- <listitem><para><emphasis>block_size</emphasis> - input, block
- (A.K.A sector) size in bytes</para></listitem>
-
- <listitem><para><emphasis>volume_size</emphasis> - input,
- volume size in bytes</para></listitem>
-
- <listitem><para><emphasis>cylinders</emphasis> - output,
- logical cylinders</para></listitem>
-
- <listitem><para><emphasis>heads</emphasis> - output, logical
- heads</para></listitem>
-
- <listitem><para><emphasis>secs_per_track</emphasis> - output,
- logical sectors per track</para></listitem>
-
- </itemizedlist>
-
- <para>If the returned geometry differs much enough from what the
- SCSI controller BIOS thinks and a disk on this SCSI controller
- is used as bootable the system may not be able to boot. The
- typical calculation example taken from the aic7xxx driver
- is:</para>
-
-<programlisting> struct ccb_calc_geometry *ccg;
- u_int32_t size_mb;
- u_int32_t secs_per_cylinder;
- int extended;
-
- ccg = &amp;ccb->ccg;
- size_mb = ccg->volume_size
- / ((1024L * 1024L) / ccg->block_size);
- extended = check_cards_EEPROM_for_extended_geometry(softc);
-
- if (size_mb > 1024 &amp;&amp; extended) {
- ccg->heads = 255;
- ccg->secs_per_track = 63;
- } else {
- ccg->heads = 64;
- ccg->secs_per_track = 32;
- }
- secs_per_cylinder = ccg->heads * ccg->secs_per_track;
- ccg->cylinders = ccg->volume_size / secs_per_cylinder;
- ccb->ccb_h.status = CAM_REQ_CMP;
- xpt_done(ccb);
- return;</programlisting>
-
- <para>This gives the general idea, the exact calculation depends
- on the quirks of the particular BIOS. If BIOS provides no way
- set the "extended translation" flag in EEPROM this flag should
- normally be assumed equal to 1. Other popular geometries
- are:</para>
-
-<programlisting> 128 heads, 63 sectors - Symbios controllers
- 16 heads, 63 sectors - old controllers</programlisting>
-
- <para>Some system BIOSes and SCSI BIOSes fight with each other
- with variable success, for example a combination of Symbios
- 875/895 SCSI and Phoenix BIOS can give geometry 128/63 after
- power up and 255/63 after a hard reset or soft reboot.</para>
- </listitem>
-
- <listitem><para><emphasis>XPT_PATH_INQ</emphasis> - path inquiry, in other
- words get the SIM driver and SCSI controller (also known as HBA
- - Host Bus Adapter) properties</para>
-
- <para>The properties are returned in the instance "struct
-ccb_pathinq cpi" of the union ccb:</para>
-
- <itemizedlist>
-
- <listitem><para>version_num - the SIM driver version number, now
- all drivers use 1</para></listitem>
-
- <listitem><para>hba_inquiry - bitmask of features supported by
- the controller:</para></listitem>
-
- <listitem><para>PI_MDP_ABLE - supports MDP message (something
- from SCSI3?)</para></listitem>
-
- <listitem><para>PI_WIDE_32 - supports 32 bit wide
- SCSI</para></listitem>
-
- <listitem><para>PI_WIDE_16 - supports 16 bit wide
- SCSI</para></listitem>
-
- <listitem><para>PI_SDTR_ABLE - can negotiate synchronous
- transfer rate</para></listitem>
-
- <listitem><para>PI_LINKED_CDB - supports linked
- commands</para></listitem>
-
- <listitem><para>PI_TAG_ABLE - supports tagged
- commands</para></listitem>
-
- <listitem><para>PI_SOFT_RST - supports soft reset alternative
- (hard reset and soft reset are mutually exclusive within a
- SCSI bus)</para></listitem>
-
- <listitem><para>target_sprt - flags for target mode support, 0
- if unsupported</para></listitem>
-
- <listitem><para>hba_misc - miscellaneous controller
- features:</para></listitem>
-
- <listitem><para>PIM_SCANHILO - bus scans from high ID to low
- ID</para></listitem>
-
- <listitem><para>PIM_NOREMOVE - removable devices not included in
- scan</para></listitem>
-
- <listitem><para>PIM_NOINITIATOR - initiator role not
- supported</para></listitem>
-
- <listitem><para>PIM_NOBUSRESET - user has disabled initial BUS
- RESET</para></listitem>
-
- <listitem><para>hba_eng_cnt - mysterious HBA engine count,
- something related to compression, now is always set to
- 0</para></listitem>
-
- <listitem><para>vuhba_flags - vendor-unique flags, unused
- now</para></listitem>
-
- <listitem><para>max_target - maximal supported target ID (7 for
- 8-bit bus, 15 for 16-bit bus, 127 for Fibre
- Channel)</para></listitem>
-
- <listitem><para>max_lun - maximal supported LUN ID (7 for older
- SCSI controllers, 63 for newer ones)</para></listitem>
-
- <listitem><para>async_flags - bitmask of installed Async
- handler, unused now</para></listitem>
-
- <listitem><para>hpath_id - highest Path ID in the subsystem,
- unused now</para></listitem>
-
- <listitem><para>unit_number - the controller unit number,
- cam_sim_unit(sim)</para></listitem>
-
- <listitem><para>bus_id - the bus number,
- cam_sim_bus(sim)</para></listitem>
-
- <listitem><para>initiator_id - the SCSI ID of the controller
- itself</para></listitem>
-
- <listitem><para>base_transfer_speed - nominal transfer speed in
- KB/s for asynchronous narrow transfers, equals to 3300 for
- SCSI</para></listitem>
-
- <listitem><para>sim_vid - SIM driver's vendor id, a
- zero-terminated string of maximal length SIM_IDLEN including
- the terminating zero</para></listitem>
-
- <listitem><para>hba_vid - SCSI controller's vendor id, a
- zero-terminated string of maximal length HBA_IDLEN including
- the terminating zero</para></listitem>
-
- <listitem><para>dev_name - device driver name, a zero-terminated
- string of maximal length DEV_IDLEN including the terminating
- zero, equal to cam_sim_name(sim)</para></listitem>
-
- </itemizedlist>
-
- <para>The recommended way of setting the string fields is using
- strncpy, like:</para>
-
-<programlisting> strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN);</programlisting>
-
- <para>After setting the values set the status to CAM_REQ_CMP and mark the
-CCB as done.</para>
- </listitem>
- </itemizedlist>
-
- </sect1>
-
- <sect1>
- <title>Polling</title>
-
- <funcSynopsis><funcPrototype>
- <funcDef>static void
- <function>xxx_poll</function>
- </funcDef>
- <paramdef>
- <parameter>struct cam_sim *sim</parameter>
- </paramdef>
- </funcPrototype></funcSynopsis>
-
- <para>The poll function is used to simulate the interrupts when
- the interrupt subsystem is not functioning (for example, when
- the system has crashed and is creating the system dump). The CAM
- subsystem sets the proper interrupt level before calling the
- poll routine. So all it needs to do is to call the interrupt
- routine (or the other way around, the poll routine may be doing
- the real action and the interrupt routine would just call the
- poll routine). Why bother about a separate function then ?
- Because of different calling conventions. The
- <function>xxx_poll</function> routine gets the struct cam_sim
- pointer as its argument when the PCI interrupt routine by common
- convention gets pointer to the struct
- <structName>xxx_softc</structName> and the ISA interrupt routine
- gets just the device unit number. So the poll routine would
- normally look as:</para>
-
-<programlisting>static void
-xxx_poll(struct cam_sim *sim)
-{
- xxx_intr((struct xxx_softc *)cam_sim_softc(sim)); /* for PCI device */
-}</programlisting>
-
- <para>or</para>
-
-<programlisting>static void
-xxx_poll(struct cam_sim *sim)
-{
- xxx_intr(cam_sim_unit(sim)); /* for ISA device */
-}</programlisting>
-
- </sect1>
-
- <sect1>
- <title>Asynchronous Events</title>
-
- <para>If an asynchronous event callback has been set up then the
- callback function should be defined.</para>
-
-<programlisting>static void
-ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)</programlisting>
-
- <itemizedlist>
- <listitem><para>callback_arg - the value supplied when registering the
- callback</para></listitem>
-
- <listitem><para>code - identifies the type of event</para></listitem>
-
- <listitem><para>path - identifies the devices to which the event
- applies</para></listitem>
-
- <listitem><para>arg - event-specific argument</para></listitem>
- </itemizedlist>
-
- <para>Implementation for a single type of event, AC_LOST_DEVICE,
- looks like:</para>
-
-<programlisting> struct xxx_softc *softc;
- struct cam_sim *sim;
- int targ;
- struct ccb_trans_settings neg;
-
- sim = (struct cam_sim *)callback_arg;
- softc = (struct xxx_softc *)cam_sim_softc(sim);
- switch (code) {
- case AC_LOST_DEVICE:
- targ = xpt_path_target_id(path);
- if(targ <= OUR_MAX_SUPPORTED_TARGET) {
- clean_negotiations(softc, targ);
- /* send indication to CAM */
- neg.bus_width = 8;
- neg.sync_period = neg.sync_offset = 0;
- neg.valid = (CCB_TRANS_BUS_WIDTH_VALID
- | CCB_TRANS_SYNC_RATE_VALID | CCB_TRANS_SYNC_OFFSET_VALID);
- xpt_async(AC_TRANSFER_NEG, path, &amp;neg);
- }
- break;
- default:
- break;
- }</programlisting>
-
- </sect1>
-
- <sect1>
- <title>Interrupts</title>
-
- <para>The exact type of the interrupt routine depends on the type
- of the peripheral bus (PCI, ISA and so on) to which the SCSI
- controller is connected.</para>
-
- <para>The interrupt routines of the SIM drivers run at the
- interrupt level splcam. So <function>splcam()</function> should
- be used in the driver to synchronize activity between the
- interrupt routine and the rest of the driver (for a
- multiprocessor-aware driver things get yet more interesting but
- we ignore this case here). The pseudo-code in this document
- happily ignores the problems of synchronization. The real code
- must not ignore them. A simple-minded approach is to set
- <function>splcam()</function> on the entry to the other routines
- and reset it on return thus protecting them by one big critical
- section. To make sure that the interrupt level will be always
- restored a wrapper function can be defined, like:</para>
-
-<programlisting> static void
- xxx_action(struct cam_sim *sim, union ccb *ccb)
- {
- int s;
- s = splcam();
- xxx_action1(sim, ccb);
- splx(s);
- }
-
- static void
- xxx_action1(struct cam_sim *sim, union ccb *ccb)
- {
- ... process the request ...
- }</programlisting>
-
- <para>This approach is simple and robust but the problem with it
- is that interrupts may get blocked for a relatively long time
- and this would negatively affect the system's performance. On
- the other hand the functions of the <function>spl()</function>
- family have rather high overhead, so vast amount of tiny
- critical sections may not be good either.</para>
-
- <para>The conditions handled by the interrupt routine and the
- details depend very much on the hardware. We consider the set of
- "typical" conditions.</para>
-
- <para>First, we check if a SCSI reset was encountered on the bus
- (probably caused by another SCSI controller on the same SCSI
- bus). If so we drop all the enqueued and disconnected requests,
- report the events and re-initialize our SCSI controller. It is
- important that during this initialization the controller won't
- issue another reset or else two controllers on the same SCSI bus
- could ping-pong resets forever. The case of fatal controller
- error/hang could be handled in the same place, but it will
- probably need also sending RESET signal to the SCSI bus to reset
- the status of the connections with the SCSI devices.</para>
-
-<programlisting> int fatal=0;
- struct ccb_trans_settings neg;
- struct cam_path *path;
-
- if( detected_scsi_reset(softc)
- || (fatal = detected_fatal_controller_error(softc)) ) {
- int targ, lun;
- struct xxx_hcb *h, *hh;
-
- /* drop all enqueued CCBs */
- for(h = softc->first_queued_hcb; h != NULL; h = hh) {
- hh = h->next;
- free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);
- }
-
- /* the clean values of negotiations to report */
- neg.bus_width = 8;
- neg.sync_period = neg.sync_offset = 0;
- neg.valid = (CCB_TRANS_BUS_WIDTH_VALID
- | CCB_TRANS_SYNC_RATE_VALID | CCB_TRANS_SYNC_OFFSET_VALID);
-
- /* drop all disconnected CCBs and clean negotiations */
- for(targ=0; targ <= OUR_MAX_SUPPORTED_TARGET; targ++) {
- clean_negotiations(softc, targ);
-
- /* report the event if possible */
- if(xpt_create_path(&amp;path, /*periph*/NULL,
- cam_sim_path(sim), targ,
- CAM_LUN_WILDCARD) == CAM_REQ_CMP) {
- xpt_async(AC_TRANSFER_NEG, path, &amp;neg);
- xpt_free_path(path);
- }
-
- for(lun=0; lun <= OUR_MAX_SUPPORTED_LUN; lun++)
- for(h = softc->first_discon_hcb[targ][lun]; h != NULL; h = hh) {
- hh=h->next;
- if(fatal)
- free_hcb_and_ccb_done(h, h->ccb, CAM_UNREC_HBA_ERROR);
- else
- free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);
- }
- }
-
- /* report the event */
- xpt_async(AC_BUS_RESET, softc->wpath, NULL);
-
- /* re-initialization may take a lot of time, in such case
- * its completion should be signaled by another interrupt or
- * checked on timeout - but for simplicity we assume here that
- * it's really fast
- */
- if(!fatal) {
- reinitialize_controller_without_scsi_reset(softc);
- } else {
- reinitialize_controller_with_scsi_reset(softc);
- }
- schedule_next_hcb(softc);
- return;
- }</programlisting>
-
- <para>If interrupt is not caused by a controller-wide condition
- then probably something has happened to the current hardware
- control block. Depending on the hardware there may be other
- non-HCB-related events, we just do not consider them here. Then
- we analyze what happened to this HCB:</para>
-
-<programlisting> struct xxx_hcb *hcb, *h, *hh;
- int hcb_status, scsi_status;
- int ccb_status;
- int targ;
- int lun_to_freeze;
-
- hcb = get_current_hcb(softc);
- if(hcb == NULL) {
- /* either stray interrupt or something went very wrong
- * or this is something hardware-dependent
- */
- handle as necessary;
- return;
- }
-
- targ = hcb->target;
- hcb_status = get_status_of_current_hcb(softc);</programlisting>
-
- <para>First we check if the HCB has completed and if so we check
- the returned SCSI status.</para>
-
-<programlisting> if(hcb_status == COMPLETED) {
- scsi_status = get_completion_status(hcb);</programlisting>
-
- <para>Then look if this status is related to the REQUEST SENSE
- command and if so handle it in a simple way.</para>
-
-<programlisting> if(hcb->flags &amp; DOING_AUTOSENSE) {
- if(scsi_status == GOOD) { /* autosense was successful */
- hcb->ccb->ccb_h.status |= CAM_AUTOSNS_VALID;
- free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_SCSI_STATUS_ERROR);
- } else {
- autosense_failed:
- free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_AUTOSENSE_FAIL);
- }
- schedule_next_hcb(softc);
- return;
- }</programlisting>
-
- <para>Else the command itself has completed, pay more attention to
- details. If auto-sense is not disabled for this CCB and the
- command has failed with sense data then run REQUEST SENSE
- command to receive that data.</para>
-
-<programlisting> hcb->ccb->csio.scsi_status = scsi_status;
- calculate_residue(hcb);
-
- if( (hcb->ccb->ccb_h.flags &amp; CAM_DIS_AUTOSENSE)==0
- &amp;&amp; ( scsi_status == CHECK_CONDITION
- || scsi_status == COMMAND_TERMINATED) ) {
- /* start auto-SENSE */
- hcb->flags |= DOING_AUTOSENSE;
- setup_autosense_command_in_hcb(hcb);
- restart_current_hcb(softc);
- return;
- }
- if(scsi_status == GOOD)
- free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_REQ_CMP);
- else
- free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_SCSI_STATUS_ERROR);
- schedule_next_hcb(softc);
- return;
- }</programlisting>
-
- <para>One typical thing would be negotiation events: negotiation
- messages received from a SCSI target (in answer to our
- negotiation attempt or by target's initiative) or the target is
- unable to negotiate (rejects our negotiation messages or does
- not answer them).</para>
-
-<programlisting> switch(hcb_status) {
- case TARGET_REJECTED_WIDE_NEG:
- /* revert to 8-bit bus */
- softc->current_bus_width[targ] = softc->goal_bus_width[targ] = 8;
- /* report the event */
- neg.bus_width = 8;
- neg.valid = CCB_TRANS_BUS_WIDTH_VALID;
- xpt_async(AC_TRANSFER_NEG, hcb->ccb.ccb_h.path_id, &amp;neg);
- continue_current_hcb(softc);
- return;
- case TARGET_ANSWERED_WIDE_NEG:
- {
- int wd;
-
- wd = get_target_bus_width_request(softc);
- if(wd <= softc->goal_bus_width[targ]) {
- /* answer is acceptable */
- softc->current_bus_width[targ] =
- softc->goal_bus_width[targ] = neg.bus_width = wd;
-
- /* report the event */
- neg.valid = CCB_TRANS_BUS_WIDTH_VALID;
- xpt_async(AC_TRANSFER_NEG, hcb->ccb.ccb_h.path_id, &amp;neg);
- } else {
- prepare_reject_message(hcb);
- }
- }
- continue_current_hcb(softc);
- return;
- case TARGET_REQUESTED_WIDE_NEG:
- {
- int wd;
-
- wd = get_target_bus_width_request(softc);
- wd = min (wd, OUR_BUS_WIDTH);
- wd = min (wd, softc->user_bus_width[targ]);
-
- if(wd != softc->current_bus_width[targ]) {
- /* the bus width has changed */
- softc->current_bus_width[targ] =
- softc->goal_bus_width[targ] = neg.bus_width = wd;
-
- /* report the event */
- neg.valid = CCB_TRANS_BUS_WIDTH_VALID;
- xpt_async(AC_TRANSFER_NEG, hcb->ccb.ccb_h.path_id, &amp;neg);
- }
- prepare_width_nego_rsponse(hcb, wd);
- }
- continue_current_hcb(softc);
- return;
- }</programlisting>
-
- <para>Then we handle any errors that could have happened during
- auto-sense in the same simple-minded way as before. Otherwise we
- look closer at the details again.</para>
-
-<programlisting> if(hcb->flags &amp; DOING_AUTOSENSE)
- goto autosense_failed;
-
- switch(hcb_status) {</programlisting>
-
- <para>The next event we consider is unexpected disconnect. Which
- is considered normal after an ABORT or BUS DEVICE RESET message
- and abnormal in other cases.</para>
-
-<programlisting> case UNEXPECTED_DISCONNECT:
- if(requested_abort(hcb)) {
- /* abort affects all commands on that target+LUN, so
- * mark all disconnected HCBs on that target+LUN as aborted too
- */
- for(h = softc->first_discon_hcb[hcb->target][hcb->lun];
- h != NULL; h = hh) {
- hh=h->next;
- free_hcb_and_ccb_done(h, h->ccb, CAM_REQ_ABORTED);
- }
- ccb_status = CAM_REQ_ABORTED;
- } else if(requested_bus_device_reset(hcb)) {
- int lun;
-
- /* reset affects all commands on that target, so
- * mark all disconnected HCBs on that target+LUN as reset
- */
-
- for(lun=0; lun <= OUR_MAX_SUPPORTED_LUN; lun++)
- for(h = softc->first_discon_hcb[hcb->target][lun];
- h != NULL; h = hh) {
- hh=h->next;
- free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);
- }
-
- /* send event */
- xpt_async(AC_SENT_BDR, hcb->ccb->ccb_h.path_id, NULL);
-
- /* this was the CAM_RESET_DEV request itself, it's completed */
- ccb_status = CAM_REQ_CMP;
- } else {
- calculate_residue(hcb);
- ccb_status = CAM_UNEXP_BUSFREE;
- /* request the further code to freeze the queue */
- hcb->ccb->ccb_h.status |= CAM_DEV_QFRZN;
- lun_to_freeze = hcb->lun;
- }
- break;</programlisting>
-
- <para>If the target refuses to accept tags we notify CAM about
- that and return back all commands for this LUN:</para>
-
-<programlisting> case TAGS_REJECTED:
- /* report the event */
- neg.flags = 0 &amp; ~CCB_TRANS_TAG_ENB;
- neg.valid = CCB_TRANS_TQ_VALID;
- xpt_async(AC_TRANSFER_NEG, hcb->ccb.ccb_h.path_id, &amp;neg);
-
- ccb_status = CAM_MSG_REJECT_REC;
- /* request the further code to freeze the queue */
- hcb->ccb->ccb_h.status |= CAM_DEV_QFRZN;
- lun_to_freeze = hcb->lun;
- break;</programlisting>
-
- <para>Then we check a number of other conditions, with processing
- basically limited to setting the CCB status:</para>
-
-<programlisting> case SELECTION_TIMEOUT:
- ccb_status = CAM_SEL_TIMEOUT;
- /* request the further code to freeze the queue */
- hcb->ccb->ccb_h.status |= CAM_DEV_QFRZN;
- lun_to_freeze = CAM_LUN_WILDCARD;
- break;
- case PARITY_ERROR:
- ccb_status = CAM_UNCOR_PARITY;
- break;
- case DATA_OVERRUN:
- case ODD_WIDE_TRANSFER:
- ccb_status = CAM_DATA_RUN_ERR;
- break;
- default:
- /* all other errors are handled in a generic way */
- ccb_status = CAM_REQ_CMP_ERR;
- /* request the further code to freeze the queue */
- hcb->ccb->ccb_h.status |= CAM_DEV_QFRZN;
- lun_to_freeze = CAM_LUN_WILDCARD;
- break;
- }</programlisting>
-
- <para>Then we check if the error was serious enough to freeze the
- input queue until it gets proceeded and do so if it is:</para>
-
-<programlisting> if(hcb->ccb->ccb_h.status &amp; CAM_DEV_QFRZN) {
- /* freeze the queue */
- xpt_freeze_devq(ccb->ccb_h.path, /*count*/1);
-
- /* re-queue all commands for this target/LUN back to CAM */
-
- for(h = softc->first_queued_hcb; h != NULL; h = hh) {
- hh = h->next;
-
- if(targ == h->targ
- &amp;&amp; (lun_to_freeze == CAM_LUN_WILDCARD || lun_to_freeze == h->lun) )
- free_hcb_and_ccb_done(h, h->ccb, CAM_REQUEUE_REQ);
- }
- }
- free_hcb_and_ccb_done(hcb, hcb->ccb, ccb_status);
- schedule_next_hcb(softc);
- return;</programlisting>
-
- <para>This concludes the generic interrupt handling although
- specific controllers may require some additions.</para>
-
- </sect1>
-
- <sect1>
- <title>Errors Summary</title>
-
- <para>When executing an I/O request many things may go wrong. The
- reason of error can be reported in the CCB status with great
- detail. Examples of use are spread throughout this document. For
- completeness here is the summary of recommended responses for
- the typical error conditions:</para>
-
- <itemizedlist>
-
- <listitem><para><emphasis>CAM_RESRC_UNAVAIL</emphasis> - some
- resource is temporarily unavailable and the SIM driver cannot
- generate an event when it will become available. An example of
- this resource would be some intra-controller hardware resource
- for which the controller does not generate an interrupt when
- it becomes available.</para></listitem>
-
- <listitem><para><emphasis>CAM_UNCOR_PARITY</emphasis> -
- unrecovered parity error occurred</para></listitem>
-
- <listitem><para><emphasis>CAM_DATA_RUN_ERR</emphasis> - data
- overrun or unexpected data phase (going in other direction
- than specified in CAM_DIR_MASK) or odd transfer length for
- wide transfer</para></listitem>
-
- <listitem><para><emphasis>CAM_SEL_TIMEOUT</emphasis> - selection
- timeout occurred (target does not respond)</para></listitem>
-
- <listitem><para><emphasis>CAM_CMD_TIMEOUT</emphasis> - command
- timeout occurred (the timeout function ran)</para></listitem>
-
- <listitem><para><emphasis>CAM_SCSI_STATUS_ERROR</emphasis> - the
- device returned error</para></listitem>
-
- <listitem><para><emphasis>CAM_AUTOSENSE_FAIL</emphasis> - the
- device returned error and the REQUEST SENSE COMMAND
- failed</para></listitem>
-
- <listitem><para><emphasis>CAM_MSG_REJECT_REC</emphasis> - MESSAGE
- REJECT message was received</para></listitem>
-
- <listitem><para><emphasis>CAM_SCSI_BUS_RESET</emphasis> - received
- SCSI bus reset</para></listitem>
-
- <listitem><para><emphasis>CAM_REQ_CMP_ERR</emphasis> -
- "impossible" SCSI phase occurred or something else as weird or
- just a generic error if further detail is not
- available</para></listitem>
-
- <listitem><para><emphasis>CAM_UNEXP_BUSFREE</emphasis> -
- unexpected disconnect occurred</para></listitem>
-
- <listitem><para><emphasis>CAM_BDR_SENT</emphasis> - BUS DEVICE
- RESET message was sent to the target</para></listitem>
-
- <listitem><para><emphasis>CAM_UNREC_HBA_ERROR</emphasis> -
- unrecoverable Host Bus Adapter Error</para></listitem>
-
- <listitem><para><emphasis>CAM_REQ_TOO_BIG</emphasis> - the request
- was too large for this controller</para></listitem>
-
- <listitem><para><emphasis>CAM_REQUEUE_REQ</emphasis> - this
- request should be re-queued to preserve transaction ordering.
- This typically occurs when the SIM recognizes an error that
- should freeze the queue and must place other queued requests
- for the target at the sim level back into the XPT
- queue. Typical cases of such errors are selection timeouts,
- command timeouts and other like conditions. In such cases the
- troublesome command returns the status indicating the error,
- the and the other commands which have not be sent to the bus
- yet get re-queued.</para></listitem>
-
- <listitem><para><emphasis>CAM_LUN_INVALID</emphasis> - the LUN
- ID in the request is not supported by the SCSI
- controller</para></listitem>
-
- <listitem><para><emphasis>CAM_TID_INVALID</emphasis> - the
- target ID in the request is not supported by the SCSI
- controller</para></listitem>
- </itemizedlist>
- </sect1>
-
- <sect1>
- <title>Timeout Handling</title>
-
- <para>When the timeout for an HCB expires that request should be
- aborted, just like with an XPT_ABORT request. The only
- difference is that the returned status of aborted request should
- be CAM_CMD_TIMEOUT instead of CAM_REQ_ABORTED (that's why
- implementation of the abort better be done as a function). But
- there is one more possible problem: what if the abort request
- itself will get stuck? In this case the SCSI bus should be
- reset, just like with an XPT_RESET_BUS request (and the idea
- about implementing it as a function called from both places
- applies here too). Also we should reset the whole SCSI bus if a
- device reset request got stuck. So after all the timeout
- function would look like:</para>
-
-<programlisting>static void
-xxx_timeout(void *arg)
-{
- struct xxx_hcb *hcb = (struct xxx_hcb *)arg;
- struct xxx_softc *softc;
- struct ccb_hdr *ccb_h;
-
- softc = hcb->softc;
- ccb_h = &amp;hcb->ccb->ccb_h;
-
- if(hcb->flags &amp; HCB_BEING_ABORTED
- || ccb_h->func_code == XPT_RESET_DEV) {
- xxx_reset_bus(softc);
- } else {
- xxx_abort_ccb(hcb->ccb, CAM_CMD_TIMEOUT);
- }
-}</programlisting>
-
- <para>When we abort a request all the other disconnected requests
- to the same target/LUN get aborted too. So there appears a
- question, should we return them with status CAM_REQ_ABORTED or
- CAM_CMD_TIMEOUT ? The current drivers use CAM_CMD_TIMEOUT. This
- seems logical because if one request got timed out then probably
- something really bad is happening to the device, so if they
- would not be disturbed they would time out by themselves.</para>
-
- </sect1>
-
-</chapter>
diff --git a/en_US.ISO8859-1/books/arch-handbook/sysinit/chapter.sgml b/en_US.ISO8859-1/books/arch-handbook/sysinit/chapter.sgml
deleted file mode 100644
index 468e739d12..0000000000
--- a/en_US.ISO8859-1/books/arch-handbook/sysinit/chapter.sgml
+++ /dev/null
@@ -1,161 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD: $
--->
-
-<chapter id="sysinit">
- <title>The Sysinit Framework</title>
-
- <para>Sysinit is the framework for a generic call sort and dispatch
- mechanisim. FreeBSD currently uses it for the dynamic
- initialization of the kernel. Sysinit allows FreeBSD's kernel
- subsystems to be reordered, and added, removed, and replaced at
- kernel link time when the kernel or one of its modules is loaded
- without having to edit a staticly ordered initilization routing
- and recompile the kernel. This system also allows kernel modules,
- currently called <firstterm>KLD's</firstterm>, to be seperatly
- compiled, linked, and initilized at boot time and loaded even
- later while the system is already running. This is accomplished
- using the <quote>kernel linker</quote> and <quote>linker
- sets</quote>.</para>
-
- <sect1>
- <title>Terminology</title>
-
- <variablelist>
- <varlistentry>
- <term>Linker Set</term>
- <listitem>
- <para>A linker technique in which the linker gathers
- staticly declared data throughout a program's source files
- into a single contagiously addressable unit of
- data.</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect1>
-
- <sect1>
- <title>Sysinit Operation</title>
-
- <para>Sysinit relies on the ability of the linker to take static
- data declared at multiple locations throughout a program's
- source and group it together as a single contagious chunk of
- data. This linker technique is called a <quote>linker
- set</quote>. Sysinit uses two linker sets to maintain two data
- sets containing each consumer's call order, function, and a
- pointer to the data to pass to taht function.</para>
-
- <para>Sysinit uses two priorites when ordering the functions for
- execution. The first priority is a subsystem ID giving an
- overall order Sysinit's dispatch of funtions. Current predeclard
- ID's are in <filename>&lt;sys/kernel.h></filename> in the enum
- list <literal>sysinit_sub_id</literal>. The second priority used
- is an element order within the subsystem. Current predeclard
- subsystem element orders are in
- <filename>&lt;sys/kernel.h></filename> in the enum list
- <literal>sysinit_elem_order</literal>.</para>
-
- <para>There are currently two uses for Sysinit. Function dispatch
- at system startup and kernel module loads, and function dispatch
- at system shutdown and kernel module unload.</para>
- </sect1>
-
-
- <sect1>
- <title>Using Sysinit</title>
-
- <sect2>
- <title>Interface</title>
-
- <sect3>
- <title>Headers</title>
-
- <programlisting>&lt;sys/kernel.h></programlisting>
- </sect3>
-
- <sect3>
- <title>Macros</title>
-
- <programlisting>SYSINIT(uniquifier, subsystem, order, func, ident)
- SYSUNINIT(uniquifier, subsystem, order, func, ident)</programlisting>
- </sect3>
- </sect2>
-
- <sect2>
- <title>Startup</title>
-
- <para>The <literal>SYSINIT()</literal> macro creates the
- necessary sysinit data in Sysinit's startup data set for
- Sysinit to sort and dispatch a function at system startup and
- module load. <literal>SYSINIT()</literal> takes a uniquifier
- that Sysinit uses identify the particular function dispatch
- data, the subsystem order, the subsystem element order, the
- function to call, and the data to pass the fuction. All
- functions must take a constant pointer argument.
- </para>
-
- <para>For example:</para>
-
- <programlisting>#include &lt;sys/kernel.h>
-
-void foo_null(void *unused)
-{
- foo_doo();
-}
-SYSINIT(foo_null, SI_SUB_FOO, SI_ORDER_FOO, NULL);
-
-struct foo foo_voodoo = {
- FOO_VOODOO;
-}
-
-void foo_arg(void *vdata)
-{
- struct foo *foo = (struct foo *)vdata;
- foo_data(foo);
-}
-SYSINIT(foo_arg, SI_SUB_FOO, SI_ORDER_FOO, foo_voodoo);
- </programlisting>
- </sect2>
-
- <sect2>
- <title>Shutdown</title>
-
- <para>The <literal>SYSUNINIT()</literal> macro behaves similarly
- to the <literal>SYSINIT()</literal> macro except that it adds
- the Sysinit data to Sysinit's shutdown data set.</para>
-
- <para>For example:</para>
-
- <programlisting>#include &lt;sys/kernel.h>
-
-void foo_cleanup(void *unused)
-{
- foo_kill();
-}
-SYSUNINIT(foo_cleanup, SI_SUB_FOO, SI_ORDER_FOO, NULL);
-
-struct foo_stack foo_stack = {
- FOO_STACK_VOODOO;
-}
-
-void foo_flush(void *vdata)
-{
-}
-SYSUNINIT(foo_flush, SI_SUB_FOO, SI_ORDER_FOO, foo_stack);
- </programlisting>
- </sect2>
- </sect1>
-</chapter>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-declaration: "../chapter.decl"
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- sgml-parent-document: ("../book.sgml" "part" "chapter")
- End:
--->
diff --git a/en_US.ISO8859-1/books/arch-handbook/usb/chapter.sgml b/en_US.ISO8859-1/books/arch-handbook/usb/chapter.sgml
deleted file mode 100644
index 9656256e31..0000000000
--- a/en_US.ISO8859-1/books/arch-handbook/usb/chapter.sgml
+++ /dev/null
@@ -1,623 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD$
--->
-
-<chapter id="usb">
- <title>USB Devices</title>
-
- <para><emphasis>This chapter was written by &a.nhibma;. Modifications made for
- the handbook by &a.murray;.</emphasis></para>
-
- <sect1>
- <title>Introduction</title>
-
- <para>The Universal Serial Bus (USB) is a new way of attaching
- devices to personal computers. The bus architecture features
- two-way communication and has been developed as a response to
- devices becoming smarter and requiring more interaction with the
- host. USB support is included in all current PC chipsets and is
- therefore available in all recently built PCs. Apple's
- introduction of the USB-only iMac has been a major incentive for
- hardware manufacturers to produce USB versions of their devices.
- The future PC specifications specify that all legacy connectors
- on PCs should be replaced by one or more USB connectors,
- providing generic plug and play capabilities. Support for USB
- hardware was available at a very early stage in NetBSD and was
- developed by Lennart Augustsson for the NetBSD project. The
- code has been ported to FreeBSD and we are currently maintaining
- a shared code base. For the implementation of the USB subsystem
- a number of features of USB are important.</para>
-
- <para><emphasis>Lennart Augustsson has done most of the implementation of
- the USB support for the NetBSD project. Many thanks for this
- incredible amount of work. Many thanks also to Ardy and Dirk for
- their comments and proofreading of this paper.</emphasis></para>
-
- <itemizedlist>
-
- <listitem><para>Devices connect to ports on the computer
- directly or on devices called hubs, forming a treelike device
- structure.</para></listitem>
-
- <listitem><para>The devices can be connected and disconnected at
- run time.</para></listitem>
-
- <listitem><para>Devices can suspend themselves and trigger
- resumes of the host system</para></listitem>
-
- <listitem><para>As the devices can be powered from the bus, the
- host software has to keep track of power budgets for each
- hub.</para></listitem>
-
- <listitem><para>Different quality of service requirements by the
- different device types together with the maximum of 126
- devices that can be connected to the same bus, require proper
- scheduling of transfers on the shared bus to take full
- advantage of the 12Mbps bandwidth available. (over 400Mbps
- with USB 2.0)</para></listitem>
-
- <listitem><para>Devices are intelligent and contain easily
- accessible information about themselves</para></listitem>
-
- </itemizedlist>
-
- <para>The development of drivers for the USB subsystem and devices
- connected to it is supported by the specifications that have
- been developed and will be developed. These specifications are
- publicly available from the USB home pages. Apple has been very
- strong in pushing for standards based drivers, by making drivers
- for the generic classes available in their operating system
- MacOS and discouraging the use of separate drivers for each new
- device. This chapter tries to collate essential information for a
- basic understanding of the present implementation of the USB
- stack in FreeBSD/NetBSD. It is recommended however to read it
- together with the relevant specifications mentioned in the
- references below.</para>
-
- <sect2>
- <title>Structure of the USB Stack</title>
-
- <para>The USB support in FreeBSD can be split into three
- layers. The lowest layer contains the host controller driver,
- providing a generic interface to the hardware and its scheduling
- facilities. It supports initialisation of the hardware,
- scheduling of transfers and handling of completed and/or failed
- transfers. Each host controller driver implements a virtual hub
- providing hardware independent access to the registers
- controlling the root ports on the back of the machine.</para>
-
- <para>The middle layer handles the device connection and
- disconnection, basic initialisation of the device, driver
- selection, the communication channels (pipes) and does
- resource management. This services layer also controls the
- default pipes and the device requests transferred over
- them.</para>
-
- <para>The top layer contains the individual drivers supporting
- specific (classes of) devices. These drivers implement the
- protocol that is used over the pipes other than the default
- pipe. They also implement additional functionality to make the
- device available to other parts of the kernel oruserland. They
- use the USB driver interface (USBDI) exposed by the services
- layer.</para>
- </sect2>
- </sect1>
-
- <sect1 id="usb-hc">
- <title>Host Controllers</title>
-
- <para>The host controller (HC) controls the transmission of
- packets on the bus. Frames of 1 millisecond are used. At the
- start of each frame the host controller generates a Start of
- Frame (SOF) packet.</para>
-
- <para>The SOF packet is used to synchronise to the start of the
- frame and to keep track of the frame number. Within each frame
- packets are transferred, either from host to device (out) or
- from device to host (in). Transfers are always initiated by the
- host (polled transfers). Therefore there can only be one host
- per USB bus. Each transfer of a packet has a status stage in
- which the recipient of the data can return either ACK
- (acknowledge reception), NAK (retry), STALL (error condition) or
- nothing (garbled data stage, device not available or
- disconnected). Section 8.5 of the <ulink
- url="http://www.usb.org/developers/docs.html">USB
- specification</ulink> explains the details of packets in more
- detail. Four different types of transfers can occur on a USB
- bus: control, bulk, interrupt and isochronous. The types of
- transfers and their characteristics are described below (`Pipes'
- subsection).</para>
-
- <para>Large transfers between the device on the USB bus and the
- device driver are split up into multiple packets by the host
- controller or the HC driver.</para>
-
- <para>Device requests (control transfers) to the default endpoints
- are special. They consist of two or three phases: SETUP, DATA
- (optional) and STATUS. The set-up packet is sent to the
- device. If there is a data phase, the direction of the data
- packet(s) is given in the set-up packet. The direction in the
- status phase is the opposite of the direction during the data
- phase, or IN if there was no data phase. The host controller
- hardware also provides registers with the current status of the
- root ports and the changes that have occurred since the last
- reset of the status change register. Access to these registers
- is provided through a virtualised hub as suggested in the USB
- specification [ 2]. Thevirtual hub must comply with the hub
- device class given in chapter 11 of that specification. It must
- provide a default pipe through which device requests can be sent
- to it. It returns the standard andhub class specific set of
- descriptors. It should also provide an interrupt pipe that
- reports changes happening at its ports. There are currently two
- specifications for host controllers available: <ulink
- url="http://developer.intel.com/design/USB/UHCI11D.htm">Universal
- Host Controller Interface</ulink> (UHCI; Intel) and <ulink
- url="http://www.compaq.com/productinfo/development/openhci.html">Open
- Host Controller Interface</ulink> (OHCI; Compaq, Microsoft,
- National Semiconductor). The UHCI specification has been
- designed to reduce hardware complexity byrequiring the host
- controller driver to supply a complete schedule of the transfers
- for each frame. OHCI type controllers are much more independent
- by providing a more abstract interface doing alot of work
- themselves. </para>
-
- <sect2>
- <title>UHCI</title>
-
- <para>The UHCI host controller maintains a framelist with 1024
- pointers to per frame data structures. It understands two
- different data types: transfer descriptors (TD) and queue
- heads (QH). Each TD represents a packet to be communicated to
- or from a device endpoint. QHs are a means to groupTDs (and
- QHs) together.</para>
-
- <para>Each transfer consists of one or more packets. The UHCI
- driver splits large transfers into multiple packets. For every
- transfer, apart from isochronous transfers, a QH is
- allocated. For every type of transfer these QHs are collected
- at a QH for that type. Isochronous transfers have to be
- executed first because of the fixed latency requirement and
- are directly referred to by the pointer in the framelist. The
- last isochronous TD refers to the QH for interrupt transfers
- for that frame. All QHs for interrupt transfers point at the
- QH for control transfers, which in turn points at the QH for
- bulk transfers. The following diagram gives a graphical
- overview of this:</para>
-
- <para>This results in the following schedule being run in each
- frame. After fetching the pointer for the current frame from
- the framelist the controller first executes the TDs for all
- the isochronous packets in that frame. The last of these TDs
- refers to the QH for the interrupt transfers for
- thatframe. The host controller will then descend from that QH
- to the QHs for the individual interrupt transfers. After
- finishing that queue, the QH for the interrupt transfers will
- refer the controller to the QH for all control transfers. It
- will execute all the subqueues scheduled there, followed by
- all the transfers queued at the bulk QH. To facilitate the
- handling of finished or failed transfers different types of
- interrupts are generatedby the hardware at the end of each
- frame. In the last TD for a transfer the Interrupt-On
- Completion bit is set by the HC driver to flag an interrupt
- when the transfer has completed. An error interrupt is flagged
- if a TD reaches its maximum error count. If the short packet
- detect bit is set in a TD and less than the set packet length
- is transferred this interrupt is flagged to notify
- the controller driver of the completed transfer. It is the host
- controller driver's task to find out which transfer has
- completed or produced an error. When called the interrupt
- service routine will locate all the finished transfers and
- call their callbacks.</para>
-
- <para>See for a more elaborate description the <ulink
- url="http://developer.intel.com/design/USB/UHCI11D.htm">UHCI
- specification.</ulink></para>
-
- </sect2>
-
- <sect2>
- <title>OHCI</title>
-
- <para>Programming an OHCI host controller is much simpler. The
- controller assumes that a set of endpoints is available, and
- is aware of scheduling priorities and the ordering of the
- types of transfers in a frame. The main data structure used by
- the host controller is the endpoint descriptor (ED) to which
- aqueue of transfer descriptors (TDs) is attached. The ED
- contains the maximum packet size allowed for an endpoint and
- the controller hardware does the splitting into packets. The
- pointers to the data buffers are updated after each transfer
- and when the start and end pointer are equal, the TD is
- retired to the done-queue. The four types of endpoints have
- their own queues. Control and bulk endpoints are queued each at
- their own queue. Interrupt EDs are queued in a tree, with the
- level in the tree defining the frequency at which they
- run.</para>
-
- <para>framelist interruptisochronous control bulk</para>
-
- <para>The schedule being run by the host controller in each
- frame looks as follows. The controller will first run the
- non-periodic control and bulk queues, up to a time limit set
- by the HC driver. Then the interrupt transfers for that frame
- number are run, by using the lower five bits of the frame
- number as an index into level 0 of the tree of interrupts
- EDs. At the end of this tree the isochronous EDs are connected
- and these are traversed subsequently. The isochronous TDs
- contain the frame number of the first frame the transfer
- should be run in. After all the periodic transfers have been
- run, the control and bulk queues are traversed
- again. Periodically the interrupt service routine is called to
- process the done queue and call the callbacks for each
- transfer and reschedule interrupt and isochronous
- endpoints.</para>
-
- <para>See for a more elaborate description the <ulink
- url="http://www.compaq.com/productinfo/development/openhci.html">
- OHCI specification</ulink>. Services layer The middle layer
- provides access to the device in a controlled way and
- maintains resources inuse by the different drivers and the
- services layer. The layer takes care of the following
- aspects:</para>
-
- <itemizedlist>
- <listitem><para>The device configuration
- information</para></listitem>
- <listitem><para>The pipes to communicate with a
- device</para></listitem>
- <listitem><para>Probing and attaching and detaching form a
- device.</para></listitem>
- </itemizedlist>
-
- </sect2>
- </sect1>
-
- <sect1 id="usb-dev">
- <title>USB Device Information</title>
-
- <sect2>
- <title>Device configuration information</title>
-
- <para>Each device provides different levels of configuration
- information. Each device has one or more configurations, of
- which one is selected during probe/attach. A configuration
- provides power and bandwidth requirements. Within each
- configuration there can be multiple interfaces. A device
- interface is a collection of endpoints. For example USB
- speakers can have an interface for the audio data (Audio
- Class) and an interface for the knobs, dials and buttons (HID
- Class). All interfaces in a configuration areactive at the
- same time and can be attached to by different drivers. Each
- interface can have alternates, providing different quality of
- service parameters. In for example cameras this is used to
- provide different frame sizes and numbers of frames per
- second.</para>
-
- <para>Within each interface 0 or more endpoints can be
- specified. Endpoints are the unidirectional access points for
- communicating with a device. They provide buffers to
- temporarily store incoming or outgoing data from the
- device. Each endpoint has a unique address within
- a configuration, the endpoint's number plus its direction. The
- default endpoint, endpoint 0, is not part of any interface and
- available in all configurations. It is managed by the services
- layer and not directly available to device drivers.</para>
-
- <para>Level 0 Level 1 Level 2 Slot 0</para>
- <para>Slot 3 Slot 2 Slot 1</para>
- <para>(Only 4 out of 32 slots shown)</para>
-
- <para>This hierarchical configuration information is described
- in the device by a standard set of descriptors (see section 9.6
- of the USB specification [ 2]). They can be requested through
- the Get Descriptor Request. The services layer caches these
- descriptors to avoid unnecessary transferson the USB
- bus. Access to the descriptors is provided through function
- calls.</para>
-
- <itemizedlist>
- <listitem><para>Device descriptors: General information about
- the device, like Vendor, Product and Revision Id, supported
- device class, subclass and protocol if applicable, maximum
- packet size for the default endpoint, etc.</para></listitem>
-
- <listitem><para>Configuration descriptors: The number of
- interfaces in this configuration, suspend and resume
- functionality supported and power
- requirements.</para></listitem>
-
- <listitem><para>Interface descriptors: interface class,
- subclass and protocol if applicable, number of alternate
- settings for the interface and the number of
- endpoints.</para></listitem>
-
- <listitem><para>Endpoint descriptors: Endpoint address,
- direction and type, maximum packet size supported and
- polling frequency if type is interrupt endpoint. There is no
- descriptor for thedefault endpoint (endpoint 0) and it is
- never counted in an interface descriptor.</para></listitem>
-
- <listitem><para>String descriptors: In the other descriptors
- string indices are supplied for some fields.These can be
- used to retrieve descriptive strings, possibly in multiple
- languages.</para></listitem>
-
- </itemizedlist>
-
- <para>Class specifications can add their own descriptor types
- that are available through the GetDescriptor Request.</para>
-
- <para>Pipes Communication to end points on a device flows
- through so-called pipes. Drivers submit transfers to endpoints
- to a pipe and provide a callback to be called on completion or
- failure of the transfer (asynchronous transfers) or wait for
- completion (synchronous transfer). Transfers to an endpoint
- are serialised in the pipe. A transfer can either complete,
- fail or time-out (if a time-out has been set). There are two
- types of time-outs for transfers. Time-outs can happen due to
- time-out on the USBbus (milliseconds). These time-outs are
- seen as failures and can be due to disconnection of the
- device. A second form of time-out is implemented in software
- and is triggered when a transfer does not complete within a
- specified amount of time (seconds). These are caused by a
- device acknowledging negatively (NAK) the transferred
- packets. The cause for this is the device not being ready to
- receive data, buffer under- or overrun or protocol
- errors.</para>
-
- <para>If a transfer over a pipe is larger than the maximum
- packet size specified in the associated endpoint descriptor,
- the host controller (OHCI) or the HC driver (UHCI) will split
- the transfer into packets of maximum packet size, with the
- last packet possibly smaller than the maximum
- packetsize.</para>
-
- <para>Sometimes it is not a problem for a device to return less
- data than requested. For example abulk-in-transfer to a modem
- might request 200 bytes of data, but the modem has only 5
- bytes available at that time. The driver can set the short
- packet (SPD) flag. It allows the host controller to accept a
- packet even if the amount of data transferred is less than
- requested. This flag is only valid for in-transfers, as the
- amount of data to be sent to a device is always known
- beforehand. If an unrecoverable error occurs in a device
- during a transfer the pipe is stalled. Before any more data is
- accepted or sent the driver needs to resolve the cause of the
- stall and clear the endpoint stall condition through send the
- clear endpoint halt device request over the default
- pipe. The default endpoint should never stall.</para>
-
- <para>There are four different types of endpoints and
- corresponding pipes: - Control pipe / default pipe: There is
- one control pipe per device, connected to the default endpoint
- (endpoint 0). The pipe carries the device requests and
- associated data. The difference between transfers over the
- default pipe and other pipes is that the protocol for
- thetransfers is described in the USB specification [ 2]. These
- requests are used to reset and configure the device. A basic
- set of commands that must be supported by each device is
- provided in chapter 9 of the USB specification [ 2]. The
- commands supported on this pipe canbe extended by a device
- class specification to support additional
- functionality.</para>
-
- <itemizedlist>
- <listitem><para>Bulk pipe: This is the USB equivalent to a raw
- transmission medium.</para></listitem>
- <listitem><para>Interrupt pipe: The host sends a request for
- data to the device and if the device has nothing to send, it
- will NAK the data packet. Interrupt transfers are scheduled
- at a frequency specifiedwhen creating the
- pipe.</para></listitem>
-
- <listitem><para>Isochronous pipe: These pipes are intended for
- isochronous data, for example video oraudio streams, with
- fixed latency, but no guaranteed delivery. Some support for
- pipes of this type is available in the current
- implementation. Packets in control, bulk and interrupt
- transfers are retried if an error occurs during transmission
- or the device acknowledges the packet negatively (NAK) due to
- for example lack of buffer space to store the incoming
- data. Isochronous packets are however not retried in case of
- failed delivery or NAK of a packet as this might violate the
- timing constraints.</para></listitem>
- </itemizedlist>
-
- <para>The availability of the necessary bandwidth is calculated
- during the creation of the pipe. Transfersare scheduled within
- frames of 1 millisecond. The bandwidth allocation within a
- frame is prescribed by the USB specification, section 5.6 [
- 2]. Isochronous and interrupt transfers areallowed to consume
- up to 90% of the bandwidth within a frame. Packets for control
- and bulk transfers are scheduled after all isochronous and
- interrupt packets and will consume all the remaining
- bandwidth.</para>
-
- <para>More information on scheduling of transfers and bandwidth
- reclamation can be found in chapter 5of the USB specification
- [ 2], section 1.3 of the UHCI specification [ 3] and section
- 3.4.2 of the OHCI specification [4].</para>
-
- </sect2>
- </sect1>
-
- <sect1 id="usb-devprobe">
- <title>Device probe and attach</title>
-
- <para>After the notification by the hub that a new device has been
- connected, the service layer switcheson the port, providing the
- device with 100 mA of current. At this point the device is in
- its default state and listening to device address 0. The
- services layer will proceed to retrieve the various descriptors
- through the default pipe. After that it will send a Set Address
- request to move the device away from the default device address
- (address 0). Multiple device drivers might be able to support
- the device. For example a modem driver might beable to support
- an ISDN TA through the AT compatibility interface. A driver for
- that specific model of the ISDN adapter might however be able to
- provide much better support for this device. To support this
- flexibility, the probes return priorities indicating their level
- of support. Support for a specific revision of a product ranks
- the highest and the generic driver the lowest priority. It might
- also be that multiple drivers could attach to one device if
- there are multiple interfaceswithin one configuration. Each
- driver only needs to support a subset of the interfaces.</para>
-
- <para>The probing for a driver for a newly attached device checks
- first for device specific drivers. If notfound, the probe code
- iterates over all supported configurations until a driver
- attaches in a configuration. To support devices with multiple
- drivers on different interfaces, the probe iteratesover all
- interfaces in a configuration that have not yet been claimed by
- a driver. Configurations that exceed the power budget for the
- hub are ignored. During attach the driver should initialise the
- device to its proper state, but not reset it, as this will make
- the device disconnect itself from the bus and restart the
- probing process for it. To avoid consuming unnecessary bandwidth
- should not claim the interrupt pipe at attach time, but
- should postpone allocating the pipe until the file is opened and
- the data is actually used. When the file is closed the pipe
- should be closed again, eventhough the device might still be
- attached.</para>
-
- <sect2>
- <title>Device disconnect and detach</title>
-
- <para>A device driver should expect to receive errors during any
- transaction with the device. The designof USB supports and
- encourages the disconnection of devices at any point in
- time. Drivers should make sure that they do the right thing
- when the device disappears.</para>
-
- <para>Furthermore a device that has been disconnected and
- reconnected will not be reattached at the same device
- instance. This might change in the future when more devices
- support serial numbers (see the device descriptor) or other
- means of defining an identity for a device have been
- developed.</para>
-
- <para>The disconnection of a device is signalled by a hub in the
- interrupt packet delivered to the hub driver. The status
- change information indicates which port has seen a connection
- change. The device detach method for all device drivers for
- the device connected on that port are called and the structures
- cleaned up. If the port status indicates that in the mean time
- a device has been connected to that port, the procedure for
- probing and attaching the device will be started. A device
- reset will produce a disconnect-connect sequence on the hub
- and will be handled as described above.</para>
-
- </sect2>
- </sect1>
-
- <sect1 id="usb-protocol">
- <title>USB Drivers Protocol Information</title>
-
- <para>The protocol used over pipes other than the default pipe is
- undefined by the USB specification. Information on this can be
- found from various sources. The most accurate source is the
- developer's section on the USB home pages [ 1]. From these pages
- a growing number of deviceclass specifications are
- available. These specifications specify what a compliant device
- should look like from a driver perspective, basic functionality
- it needs to provide and the protocol that is to be used over the
- communication channels. The USB specification [ 2] includes the
- description of the Hub Class. A class specification for Human
- Interface Devices (HID) has been created to cater for keyboards,
- tablets, bar-code readers, buttons, knobs, switches, etc. A
- third example is the class specification for mass storage
- devices. For a full list of device classes see the developers
- sectionon the USB home pages [ 1].</para>
-
- <para>For many devices the protocol information has not yet been
- published however. Information on the protocol being used might
- be available from the company making the device. Some companies
- will require you to sign a Non -Disclosure Agreement (NDA)
- before giving you the specifications. This in most cases
- precludes making the driver open source.</para>
-
- <para>Another good source of information is the Linux driver
- sources, as a number of companies have started to provide drivers
- for Linux for their devices. It is always a good idea to contact
- the authors of those drivers for their source of
- information.</para>
-
- <para>Example: Human Interface Devices The specification for the
- Human Interface Devices like keyboards, mice, tablets, buttons,
- dials,etc. is referred to in other device class specifications
- and is used in many devices.</para>
-
- <para>For example audio speakers provide endpoints to the digital
- to analogue converters and possibly an extra pipe for a
- microphone. They also provide a HID endpoint in a separate
- interface for the buttons and dials on the front of the
- device. The same is true for the monitor control class. It is
- straightforward to build support for these interfaces through
- the available kernel and userland libraries together with the
- HID class driver or the generic driver. Another device that
- serves as an example for interfaces within one configuration
- driven by different device drivers is a cheap keyboard with
- built-in legacy mouse port. To avoid having the cost of
- including the hardware for a USB hub in the device,
- manufacturers combined the mouse data received from the PS/2 port
- on the back of the keyboard and the keypresses from the keyboard
- into two separate interfaces in the same configuration. The
- mouse and keyboard drivers each attach to the appropriate
- interface and allocate the pipes to the two independent
- endpoints.</para>
-
- <para>Example: Firmware download Many devices that have been
- developed are based on a general purpose processor with
- anadditional USB core added to it. Because the development of
- drivers and firmware for USB devices is still very new, many
- devices require the downloading of the firmware after they
- have been connected.</para>
-
- <para>The procedure followed is straightforward. The device
- identifies itself through a vendor and product Id. The first
- driver probes and attaches to it and downloads the firmware into
- it. After that the device soft resets itself and the driver is
- detached. After a short pause the devicere announces its presence
- on the bus. The device will have changed its
- vendor/product/revision Id to reflect the fact that it has been
- supplied with firmware and as a consequence a second driver will
- probe it and attach to it.</para>
-
- <para>An example of these types of devices is the ActiveWire I/O
- board, based on the EZ-USB chip. For this chip a generic firmware
- downloader is available. The firmware downloaded into the
- ActiveWire board changes the revision Id. It will then perform a
- soft reset of the USB part of the EZ-USB chip to disconnect from
- the USB bus and again reconnect.</para>
-
- <para>Example: Mass Storage Devices Support for mass storage
- devices is mainly built around existing protocols. The Iomega
- USB Zipdrive is based on the SCSI version of their drive. The
- SCSI commands and status messages are wrapped in blocks and
- transferred over the bulk pipes to and from the device,
- emulating a SCSI controller over the USB wire. ATAPI and UFI
- commands are supported in a similar fashion.</para>
-
- <para>The Mass Storage Specification supports 2 different types of
- wrapping of the command block.The initial attempt was based on
- sending the command and status through the default pipe and
- using bulk transfers for the data to be moved between the host
- and the device. Based on experience a second approach was
- designed that was based on wrapping the command and status
- blocks and sending them over the bulk out and in endpoint. The
- specification specifies exactly what has to happen when and what
- has to be done in case an error condition is encountered. The
- biggest challenge when writing drivers for these devices is to
- fit USB based protocol into theexisting support for mass storage
- devices. CAM provides hooks to do this in a fairly straight
- forward way. ATAPI is less simple as historically the IDE
- interface has never had many different appearances.</para>
-
- <para>The support for the USB floppy from Y-E Data is again less
- straightforward as a new command set has been designed.</para>
-
- </sect1>
-
-</chapter> \ No newline at end of file
diff --git a/en_US.ISO8859-1/books/arch-handbook/vm/chapter.sgml b/en_US.ISO8859-1/books/arch-handbook/vm/chapter.sgml
deleted file mode 100644
index 4710973d5f..0000000000
--- a/en_US.ISO8859-1/books/arch-handbook/vm/chapter.sgml
+++ /dev/null
@@ -1,255 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD: doc/en_US.ISO_8859-1/books/developers-handbook/usb/chapter.sgml,v 1.1 2001/04/13 09:05:13 murray Exp $
--->
-
-<chapter id="vm">
- <title>Virtual Memory System</title>
-
- <sect1 id="internals-vm">
- <title>The FreeBSD VM System</title>
-
- <para><emphasis>Contributed by &a.dillon;. 6 Feb 1999</emphasis></para>
-
- <sect2>
- <title>Management of physical
- memory&mdash;<literal>vm_page_t</literal></title>
-
- <para>Physical memory is managed on a page-by-page basis through the
- <literal>vm_page_t</literal> structure. Pages of physical memory are
- categorized through the placement of their respective
- <literal>vm_page_t</literal> structures on one of several paging
- queues.</para>
-
- <para>A page can be in a wired, active, inactive, cache, or free state.
- Except for the wired state, the page is typically placed in a doubly
- link list queue representing the state that it is in. Wired pages
- are not placed on any queue.</para>
-
- <para>FreeBSD implements a more involved paging queue for cached and
- free pages in order to implement page coloring. Each of these states
- involves multiple queues arranged according to the size of the
- processor's L1 and L2 caches. When a new page needs to be allocated,
- FreeBSD attempts to obtain one that is reasonably well aligned from
- the point of view of the L1 and L2 caches relative to the VM object
- the page is being allocated for.</para>
-
- <para>Additionally, a page may be held with a reference count or locked
- with a busy count. The VM system also implements an <quote>ultimate
- locked</quote> state for a page using the PG_BUSY bit in the page's
- flags.</para>
-
- <para>In general terms, each of the paging queues operates in a LRU
- fashion. A page is typically placed in a wired or active state
- initially. When wired, the page is usually associated with a page
- table somewhere. The VM system ages the page by scanning pages in a
- more active paging queue (LRU) in order to move them to a less-active
- paging queue. Pages that get moved into the cache are still
- associated with a VM object but are candidates for immediate reuse.
- Pages in the free queue are truly free. FreeBSD attempts to minimize
- the number of pages in the free queue, but a certain minimum number of
- truly free pages must be maintained in order to accommodate page
- allocation at interrupt time.</para>
-
- <para>If a process attempts to access a page that does not exist in its
- page table but does exist in one of the paging queues ( such as the
- inactive or cache queues), a relatively inexpensive page reactivation
- fault occurs which causes the page to be reactivated. If the page
- does not exist in system memory at all, the process must block while
- the page is brought in from disk.</para>
-
- <para>FreeBSD dynamically tunes its paging queues and attempts to
- maintain reasonable ratios of pages in the various queues as well as
- attempts to maintain a reasonable breakdown of clean v.s. dirty pages.
- The amount of rebalancing that occurs depends on the system's memory
- load. This rebalancing is implemented by the pageout daemon and
- involves laundering dirty pages (syncing them with their backing
- store), noticing when pages are activity referenced (resetting their
- position in the LRU queues or moving them between queues), migrating
- pages between queues when the queues are out of balance, and so forth.
- FreeBSD's VM system is willing to take a reasonable number of
- reactivation page faults to determine how active or how idle a page
- actually is. This leads to better decisions being made as to when to
- launder or swap-out a page.</para>
- </sect2>
-
- <sect2>
- <title>The unified buffer
- cache&mdash;<literal>vm_object_t</literal></title>
-
- <para>FreeBSD implements the idea of a generic <quote>VM object</quote>.
- VM objects can be associated with backing store of various
- types&mdash;unbacked, swap-backed, physical device-backed, or
- file-backed storage. Since the filesystem uses the same VM objects to
- manage in-core data relating to files, the result is a unified buffer
- cache.</para>
-
- <para>VM objects can be <emphasis>shadowed</emphasis>. That is, they
- can be stacked on top of each other. For example, you might have a
- swap-backed VM object stacked on top of a file-backed VM object in
- order to implement a MAP_PRIVATE mmap()ing. This stacking is also
- used to implement various sharing properties, including,
- copy-on-write, for forked address spaces.</para>
-
- <para>It should be noted that a <literal>vm_page_t</literal> can only be
- associated with one VM object at a time. The VM object shadowing
- implements the perceived sharing of the same page across multiple
- instances.</para>
- </sect2>
-
- <sect2>
- <title>Filesystem I/O&mdash;<literal>struct buf</literal></title>
-
- <para>vnode-backed VM objects, such as file-backed objects, generally
- need to maintain their own clean/dirty info independent from the VM
- system's idea of clean/dirty. For example, when the VM system decides
- to synchronize a physical page to its backing store, the VM system
- needs to mark the page clean before the page is actually written to
- its backing s tore. Additionally, filesystems need to be able to map
- portions of a file or file metadata into KVM in order to operate on
- it.</para>
-
- <para>The entities used to manage this are known as filesystem buffers,
- <literal>struct buf</literal>'s, and also known as
- <literal>bp</literal>'s. When a filesystem needs to operate on a
- portion of a VM object, it typically maps part of the object into a
- struct buf and the maps the pages in the struct buf into KVM. In the
- same manner, disk I/O is typically issued by mapping portions of
- objects into buffer structures and then issuing the I/O on the buffer
- structures. The underlying vm_page_t's are typically busied for the
- duration of the I/O. Filesystem buffers also have their own notion of
- being busy, which is useful to filesystem driver code which would
- rather operate on filesystem buffers instead of hard VM pages.</para>
-
- <para>FreeBSD reserves a limited amount of KVM to hold mappings from
- struct bufs, but it should be made clear that this KVM is used solely
- to hold mappings and does not limit the ability to cache data.
- Physical data caching is strictly a function of
- <literal>vm_page_t</literal>'s, not filesystem buffers. However,
- since filesystem buffers are used placehold I/O, they do inherently
- limit the amount of concurrent I/O possible. As there are usually a
- few thousand filesystem buffers available, this is not usually a
- problem.</para>
- </sect2>
-
- <sect2>
- <title>Mapping Page Tables - vm_map_t, vm_entry_t</title>
-
- <para>FreeBSD separates the physical page table topology from the VM
- system. All hard per-process page tables can be reconstructed on the
- fly and are usually considered throwaway. Special page tables such as
- those managing KVM are typically permanently preallocated. These page
- tables are not throwaway.</para>
-
- <para>FreeBSD associates portions of vm_objects with address ranges in
- virtual memory through <literal>vm_map_t</literal> and
- <literal>vm_entry_t</literal> structures. Page tables are directly
- synthesized from the
- <literal>vm_map_t</literal>/<literal>vm_entry_t</literal>/
- <literal>vm_object_t</literal> hierarchy. Remember when I mentioned
- that physical pages are only directly associated with a
- <literal>vm_object</literal>. Well, that isn't quite true.
- <literal>vm_page_t</literal>'s are also linked into page tables that
- they are actively associated with. One <literal>vm_page_t</literal>
- can be linked into several <emphasis>pmaps</emphasis>, as page tables
- are called. However, the hierarchical association holds so all
- references to the same page in the same object reference the same
- <literal>vm_page_t</literal> and thus give us buffer cache unification
- across the board.</para>
- </sect2>
-
- <sect2>
- <title>KVM Memory Mapping</title>
-
- <para>FreeBSD uses KVM to hold various kernel structures. The single
- largest entity held in KVM is the filesystem buffer cache. That is,
- mappings relating to <literal>struct buf</literal> entities.</para>
-
- <para>Unlike Linux, FreeBSD does NOT map all of physical memory into
- KVM. This means that FreeBSD can handle memory configurations up to
- 4G on 32 bit platforms. In fact, if the mmu were capable of it,
- FreeBSD could theoretically handle memory configurations up to 8TB on
- a 32 bit platform. However, since most 32 bit platforms are only
- capable of mapping 4GB of ram, this is a moot point.</para>
-
- <para>KVM is managed through several mechanisms. The main mechanism
- used to manage KVM is the <emphasis>zone allocator</emphasis>. The
- zone allocator takes a chunk of KVM and splits it up into
- constant-sized blocks of memory in order to allocate a specific type
- of structure. You can use <command>vmstat -m</command> to get an
- overview of current KVM utilization broken down by zone.</para>
- </sect2>
-
- <sect2>
- <title>Tuning the FreeBSD VM system</title>
-
- <para>A concerted effort has been made to make the FreeBSD kernel
- dynamically tune itself. Typically you do not need to mess with
- anything beyond the <literal>maxusers</literal> and
- <literal>NMBCLUSTERS</literal> kernel config options. That is, kernel
- compilation options specified in (typically)
- <filename>/usr/src/sys/i386/conf/<replaceable>CONFIG_FILE</replaceable></filename>.
- A description of all available kernel configuration options can be
- found in <filename>/usr/src/sys/i386/conf/LINT</filename>.</para>
-
- <para>In a large system configuration you may wish to increase
- <literal>maxusers</literal>. Values typically range from 10 to 128.
- Note that raising <literal>maxusers</literal> too high can cause the
- system to overflow available KVM resulting in unpredictable operation.
- It is better to leave maxusers at some reasonable number and add other
- options, such as <literal>NMBCLUSTERS</literal>, to increase specific
- resources.</para>
-
- <para>If your system is going to use the network heavily, you may want
- to increase <literal>NMBCLUSTERS</literal>. Typical values range from
- 1024 to 4096.</para>
-
- <para>The <literal>NBUF</literal> parameter is also traditionally used
- to scale the system. This parameter determines the amount of KVA the
- system can use to map filesystem buffers for I/O. Note that this
- parameter has nothing whatsoever to do with the unified buffer cache!
- This parameter is dynamically tuned in 3.0-CURRENT and later kernels
- and should generally not be adjusted manually. We recommend that you
- <emphasis>not</emphasis> try to specify an <literal>NBUF</literal>
- parameter. Let the system pick it. Too small a value can result in
- extremely inefficient filesystem operation while too large a value can
- starve the page queues by causing too many pages to become wired
- down.</para>
-
- <para>By default, FreeBSD kernels are not optimized. You can set
- debugging and optimization flags with the
- <literal>makeoptions</literal> directive in the kernel configuration.
- Note that you should not use <option>-g</option> unless you can
- accommodate the large (typically 7 MB+) kernels that result.</para>
-
- <programlisting>makeoptions DEBUG="-g"
-makeoptions COPTFLAGS="-O -pipe"</programlisting>
-
- <para>Sysctl provides a way to tune kernel parameters at run-time. You
- typically do not need to mess with any of the sysctl variables,
- especially the VM related ones.</para>
-
- <para>Run time VM and system tuning is relatively straightforward.
- First, use softupdates on your UFS/FFS filesystems whenever possible.
- <filename>/usr/src/contrib/sys/softupdates/README</filename> contains
- instructions (and restrictions) on how to configure it up.</para>
-
- <para>Second, configure sufficient swap. You should have a swap
- partition configured on each physical disk, up to four, even on your
- <quote>work</quote> disks. You should have at least 2x the swap space
- as you have main memory, and possibly even more if you do not have a
- lot of memory. You should also size your swap partition based on the
- maximum memory configuration you ever intend to put on the machine so
- you do not have to repartition your disks later on. If you want to be
- able to accommodate a crash dump, your first swap partition must be at
- least as large as main memory and <filename>/var/crash</filename> must
- have sufficient free space to hold the dump.</para>
-
- <para>NFS-based swap is perfectly acceptable on -4.x or later systems,
- but you must be aware that the NFS server will take the brunt of the
- paging load.</para>
- </sect2>
- </sect1>
-
-</chapter>
diff --git a/en_US.ISO8859-1/books/bibliography/Makefile b/en_US.ISO8859-1/books/bibliography/Makefile
deleted file mode 100644
index 6ca5ea735d..0000000000
--- a/en_US.ISO8859-1/books/bibliography/Makefile
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# $FreeBSD: doc/en_US.ISO8859-1/books/handbook/Makefile,v 1.40 2001/07/17 01:37:39 murray Exp $
-#
-#
-
-MAINTAINER=nik@FreeBSD.org
-
-DOC?= book
-
-FORMATS?= html
-
-INSTALL_COMPRESSED?= gz
-INSTALL_ONLY_COMPRESSED?=
-
-#
-# SRCS lists the individual SGML files that make up the document. Changes
-# to any of these files will force a rebuild
-#
-
-# SGML content
-SRCS= book.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/books/bibliography/book.sgml b/en_US.ISO8859-1/books/bibliography/book.sgml
deleted file mode 100644
index 0e4df7e775..0000000000
--- a/en_US.ISO8859-1/books/bibliography/book.sgml
+++ /dev/null
@@ -1,36 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD: doc/en_US.ISO8859-1/books/handbook/book.sgml,v 1.106 2001/07/13 22:55:50 murray Exp $
--->
-
-<!DOCTYPE BOOK PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-<!ENTITY bibliography SYSTEM "../../../share/sgml/bibliography.sgml">
-]>
-
-<book>
- <bookinfo>
- <title>FreeBSD Bibliography</title>
-
- <corpauthor>The FreeBSD Documentation Project</corpauthor>
-
- <pubdate>February 1999</pubdate>
-
- <copyright>
- <year>2001</year>
- <holder>The FreeBSD Documentation Project</holder>
- </copyright>
-
- </bookinfo>
-
- &bibliography;
-</book>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- End:
--->
diff --git a/en_US.ISO8859-1/books/corp-net-guide/08-01.eps b/en_US.ISO8859-1/books/corp-net-guide/08-01.eps
deleted file mode 100644
index a23990fc07..0000000000
--- a/en_US.ISO8859-1/books/corp-net-guide/08-01.eps
+++ /dev/null
@@ -1,8104 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: Adobe Illustrator(R) 8.0
-%%AI8_CreatorVersion: 8.0.1
-%%For: (Mark Bergeron) (PD&PS)
-%%Title: (08-01 3594)
-%%CreationDate: (11/21/00) (9:07 AM)
-%%BoundingBox: 150 275 421 404
-%%HiResBoundingBox: 150.9429 275.7031 420.7891 403.7451
-%%DocumentProcessColors: Black
-%%DocumentFonts: Formata-Bold
-%%+ Helvetica
-%%DocumentNeededFonts: Formata-Bold
-%%+ Helvetica
-%%DocumentSuppliedResources: procset Adobe_level2_AI5 1.2 0
-%%+ procset Adobe_typography_AI5 1.0 1
-%%+ procset Adobe_ColorImage_AI6 1.3 0
-%%+ procset Adobe_Illustrator_AI5 1.3 0
-%%+ procset Adobe_cshow 2.0 8
-%%+ procset Adobe_shading_AI8 1.0 0
-%AI5_FileFormat 4.0
-%AI3_ColorUsage: Black&White
-%AI3_IncludePlacedImages
-%AI7_ImageSettings: 1
-%%CMYKProcessColor: 0 0 0 0.15 (15%)
-%%+ 0 0 0 0.3 (30%)
-%%+ 0 0 0 0.5 (50%)
-%%+ 0 0 0 0.75 (75%)
-%%+ 1 1 1 1 ([Registration])
-%%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set)
-%%+ Options: 1 16 0 1 0 1 1 1 0 1 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 2 3 4
-%%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 ()
-%AI3_TemplateBox: 306.5 395.5 306.5 395.5
-%AI3_TileBox: 12 14 600 782
-%AI3_DocumentPreview: Macintosh_ColorPic
-%AI5_ArtSize: 612 792
-%AI5_RulerUnits: 3
-%AI5_ArtFlags: 1 0 0 1 0 0 1 0 0
-%AI5_TargetResolution: 800
-%AI5_NumLayers: 1
-%AI8_OpenToView: 147 503 2.3424 1137 777 18 0 1 7 40 0 0
-%AI5_OpenViewLayers: 7
-%%PageOrigin:12 14
-%%AI3_PaperRect:-12 782 600 -10
-%%AI3_Margin:12 -14 -12 10
-%AI7_GridSettings: 12 3 12 3 1 0 0.29 1 1 0.65 1 1
-%%EndComments
-%%BeginProlog
-%%BeginResource: procset Adobe_level2_AI5 1.2 0
-%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation)
-%%Version: 1.2 0
-%%CreationDate: (04/10/93) ()
-%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved)
-userdict /Adobe_level2_AI5 26 dict dup begin
- put
- /packedarray where not
- {
- userdict begin
- /packedarray
- {
- array astore readonly
- } bind def
- /setpacking /pop load def
- /currentpacking false def
- end
- 0
- } if
- pop
- userdict /defaultpacking currentpacking put true setpacking
- /initialize
- {
- Adobe_level2_AI5 begin
- } bind def
- /terminate
- {
- currentdict Adobe_level2_AI5 eq
- {
- end
- } if
- } bind def
- mark
- /setcustomcolor where not
- {
- /findcmykcustomcolor
- {
- (AI8_CMYK_CustomColor)
- 6 packedarray
- } bind def
- /findrgbcustomcolor
- {
- (AI8_RGB_CustomColor)
- 5 packedarray
- } bind def
- /setcustomcolor
- {
- exch
- aload pop dup
- (AI8_CMYK_CustomColor) eq
- {
- pop pop
- 4
- {
- 4 index mul
- 4 1 roll
- } repeat
- 5 -1 roll pop
- setcmykcolor
- }
- {
- dup (AI8_RGB_CustomColor) eq
- {
- pop pop
- 3
- {
- 1 exch sub
- 3 index mul
- 1 exch sub
- 3 1 roll
- } repeat
- 4 -1 roll pop
- setrgbcolor
- }
- {
- pop
- 4
- {
- 4 index mul 4 1 roll
- } repeat
- 5 -1 roll pop
- setcmykcolor
- } ifelse
- } ifelse
- }
- def
- } if
- /setAIseparationgray
- {
- false setoverprint
- 0 setgray
- /setseparationgray where{
- pop setseparationgray
- }{
- /setcolorspace where{
- pop
- [/Separation (All) /DeviceCMYK {dup dup dup}] setcolorspace
- 1 exch sub setcolor
- }{
- setgray
- }ifelse
- }ifelse
- } def
-
- /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def
- userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put
- userdict /level2?
- systemdict /languagelevel known dup
- {
- pop systemdict /languagelevel get 2 ge
- } if
- put
-/level2ScreenFreq
-{
- begin
- 60
- HalftoneType 1 eq
- {
- pop Frequency
- } if
- HalftoneType 2 eq
- {
- pop GrayFrequency
- } if
- HalftoneType 5 eq
- {
- pop Default level2ScreenFreq
- } if
- end
-} bind def
-userdict /currentScreenFreq
- level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put
-level2? not
- {
- /setcmykcolor where not
- {
- /setcmykcolor
- {
- exch .11 mul add exch .59 mul add exch .3 mul add
- 1 exch sub setgray
- } def
- } if
- /currentcmykcolor where not
- {
- /currentcmykcolor
- {
- 0 0 0 1 currentgray sub
- } def
- } if
- /setoverprint where not
- {
- /setoverprint /pop load def
- } if
- /selectfont where not
- {
- /selectfont
- {
- exch findfont exch
- dup type /arraytype eq
- {
- makefont
- }
- {
- scalefont
- } ifelse
- setfont
- } bind def
- } if
- /cshow where not
- {
- /cshow
- {
- [
- 0 0 5 -1 roll aload pop
- ] cvx bind forall
- } bind def
- } if
- } if
- cleartomark
- /anyColor?
- {
- add add add 0 ne
- } bind def
- /testColor
- {
- gsave
- setcmykcolor currentcmykcolor
- grestore
- } bind def
- /testCMYKColorThrough
- {
- testColor anyColor?
- } bind def
- userdict /composite?
- 1 0 0 0 testCMYKColorThrough
- 0 1 0 0 testCMYKColorThrough
- 0 0 1 0 testCMYKColorThrough
- 0 0 0 1 testCMYKColorThrough
- and and and
- put
- composite? not
- {
- userdict begin
- gsave
- /cyan? 1 0 0 0 testCMYKColorThrough def
- /magenta? 0 1 0 0 testCMYKColorThrough def
- /yellow? 0 0 1 0 testCMYKColorThrough def
- /black? 0 0 0 1 testCMYKColorThrough def
- grestore
- /isCMYKSep? cyan? magenta? yellow? black? or or or def
- /customColor? isCMYKSep? not def
- end
- } if
- end defaultpacking setpacking
-%%EndResource
-%%BeginResource: procset Adobe_typography_AI5 1.0 1
-%%Title: (Typography Operators)
-%%Version: 1.0 1
-%%CreationDate:(6/10/1996) ()
-%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved)
-currentpacking true setpacking
-userdict /Adobe_typography_AI5 68 dict dup begin
-put
-/initialize
-{
- begin
- begin
- Adobe_typography_AI5 begin
- Adobe_typography_AI5
- {
- dup xcheck
- {
- bind
- } if
- pop pop
- } forall
- end
- end
- end
- Adobe_typography_AI5 begin
-} def
-/terminate
-{
- currentdict Adobe_typography_AI5 eq
- {
- end
- } if
-} def
-/modifyEncoding
-{
- /_tempEncode exch ddef
- /_pntr 0 ddef
- {
- counttomark -1 roll
- dup type dup /marktype eq
- {
- pop pop exit
- }
- {
- /nametype eq
- {
- _tempEncode /_pntr dup load dup 3 1 roll 1 add ddef 3 -1 roll
- put
- }
- {
- /_pntr exch ddef
- } ifelse
- } ifelse
- } loop
- _tempEncode
-} def
-/havefont
-{
- systemdict /languagelevel known
- {
- /Font resourcestatus dup
- { exch pop exch pop }
- if
- }
- {
- systemdict /FontDirectory get 1 index known
- { pop true }
- {
- systemdict /fileposition known
- {
- dup length 6 add exch
- Ss 6 250 getinterval
- cvs pop
- Ss exch 0 exch getinterval
- status
- { pop pop pop pop true }
- { false }
- ifelse
- }
- {
- pop false
- }
- ifelse
- }
- ifelse
- }
- ifelse
-} def
-/TE
-{
- StandardEncoding 256 array copy modifyEncoding
- /_nativeEncoding exch def
-} def
-/subststring {
- exch 2 index exch search
- {
- exch pop
- exch dup () eq
- {
- pop exch concatstring
- }
- {
- 3 -1 roll
- exch concatstring
- concatstring
- } ifelse
- exch pop true
- }
- {
- pop pop false
- } ifelse
-} def
-/concatstring {
- 1 index length 1 index length
- 1 index add
- string
- dup 0 5 index putinterval
- dup 2 index 4 index putinterval
- 4 1 roll pop pop pop
-} def
-%
-/TZ
-{
- dup type /arraytype eq
- {
- /_wv exch def
- }
- {
- /_wv 0 def
- } ifelse
- /_useNativeEncoding exch def
- 2 index havefont
- {
- 3 index
- 255 string
- cvs
-
- dup
- (_Symbol_)
- eq
- {
- pop
- 2 index
- findfont
-
- }
- {
- 1 index 0 eq
- {
- dup length 1 sub
- 1 exch
- getinterval
-
- cvn
- findfont
- }
- {
- pop 2 index findfont
- } ifelse
- } ifelse
- }
- {
- dup 1 eq
- {
- 2 index 64 string cvs
- dup (-90pv-RKSJ-) (-83pv-RKSJ-) subststring
- {
- exch pop dup havefont
- {
- findfont false
- }
- {
- pop true
- } ifelse
- }
- {
- pop dup
- (-90ms-RKSJ-) (-Ext-RKSJ-) subststring
- {
- exch pop dup havefont
- {
- findfont false
- }
- {
- pop true
- } ifelse
- }
- {
- pop pop true
- } ifelse
- } ifelse
- {
- 1 index 1 eq
- {
- /Ryumin-Light-Ext-RKSJ-V havefont
- {/Ryumin-Light-Ext-RKSJ-V}
- {/Courier}
- ifelse
- }
- {
- /Ryumin-Light-83pv-RKSJ-H havefont
- {/Ryumin-Light-83pv-RKSJ-H}
- {/Courier}
- ifelse
- } ifelse
- findfont
- [1 0 0.5 1 0 0] makefont
- } if
- }
- {
- /Courier findfont
- } ifelse
- } ifelse
- _wv type /arraytype eq
- {
- _wv makeblendedfont
- } if
- dup length 10 add dict
- begin
- mark exch
- {
- 1 index /FID ne
- {
- def
- } if
- cleartomark mark
- } forall
- pop
- /FontScript exch def
- /FontDirection exch def
- /FontRequest exch def
- /FontName exch def
- counttomark 0 eq
- {
- 1 _useNativeEncoding eq
- {
- /Encoding _nativeEncoding def
- } if
- cleartomark
- }
- {
- /Encoding load 256 array copy
- modifyEncoding /Encoding exch def
- } ifelse
- FontName currentdict
- end
- definefont pop
-} def
-/tr
-{
- _ax _ay 3 2 roll
-} def
-/trj
-{
- _cx _cy _sp _ax _ay 6 5 roll
-} def
-/a0
-{
- /Tx
- {
- dup
- currentpoint 3 2 roll
- tr _psf
- newpath moveto
- tr _ctm _pss
- } ddef
- /Tj
- {
- dup
- currentpoint 3 2 roll
- trj _pjsf
- newpath moveto
- trj _ctm _pjss
- } ddef
-} def
-/a1
-{
-W B
-} def
-/e0
-{
- /Tx
- {
- tr _psf
- } ddef
- /Tj
- {
- trj _pjsf
- } ddef
-} def
-/e1
-{
-W F
-} def
-/i0
-{
- /Tx
- {
- tr sp
- } ddef
- /Tj
- {
- trj jsp
- } ddef
-} def
-/i1
-{
- W N
-} def
-/o0
-{
- /Tx
- {
- tr sw rmoveto
- } ddef
- /Tj
- {
- trj swj rmoveto
- } ddef
-} def
-/r0
-{
- /Tx
- {
- tr _ctm _pss
- } ddef
- /Tj
- {
- trj _ctm _pjss
- } ddef
-} def
-/r1
-{
-W S
-} def
-/To
-{
- pop _ctm currentmatrix pop
-} def
-/TO
-{
- iTe _ctm setmatrix newpath
-} def
-/Tp
-{
- pop _tm astore pop _ctm setmatrix
- _tDict begin
- /W
- {
- } def
- /h
- {
- } def
-} def
-/TP
-{
- end
- iTm 0 0 moveto
-} def
-/Tr
-{
- _render 3 le
- {
- currentpoint newpath moveto
- } if
- dup 8 eq
- {
- pop 0
- }
- {
- dup 9 eq
- {
- pop 1
- } if
- } ifelse
- dup /_render exch ddef
- _renderStart exch get load exec
-} def
-/iTm
-{
- _ctm setmatrix _tm concat
- _shift aload pop _lineorientation 1 eq { exch } if translate
- _scale aload pop _lineorientation 1 eq _yokoorientation 1 eq or { exch } if scale
-} def
-/Tm
-{
- _tm astore pop iTm 0 0 moveto
-} def
-/Td
-{
- _mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto
-} def
-/iTe
-{
- _render -1 eq
- {
- }
- {
- _renderEnd _render get dup null ne
- {
- load exec
- }
- {
- pop
- } ifelse
- } ifelse
- /_render -1 ddef
-} def
-/Ta
-{
- pop
-} def
-/Tf
-{
- 1 index type /nametype eq
- {
- dup 0.75 mul 1 index 0.25 mul neg
- } if
- /_fontDescent exch ddef
- /_fontAscent exch ddef
- /_fontSize exch ddef
- /_fontRotateAdjust _fontAscent _fontDescent add 2 div neg ddef
- /_fontHeight _fontSize ddef
- findfont _fontSize scalefont setfont
-} def
-/Tl
-{
- pop neg 0 exch
- _leading astore pop
-} def
-/Tt
-{
- pop
-} def
-/TW
-{
- 3 npop
-} def
-/Tw
-{
- /_cx exch ddef
-} def
-/TC
-{
- 3 npop
-} def
-/Tc
-{
- /_ax exch ddef
-} def
-/Ts
-{
- 0 exch
- _shift astore pop
- currentpoint
- iTm
- moveto
-} def
-/Ti
-{
- 3 npop
-} def
-/Tz
-{
- count 1 eq { 100 } if
- 100 div exch 100 div exch
- _scale astore pop
- iTm
-} def
-/TA
-{
- pop
-} def
-/Tq
-{
- pop
-} def
-/Tg
-{
- pop
-} def
-/TG
-{
- pop
-} def
-/Tv
-{
- /_lineorientation exch ddef
-} def
-/TV
-{
- /_charorientation exch ddef
-} def
-/Ty
-{
- dup /_yokoorientation exch ddef 1 sub neg Tv
-} def
-/TY
-{
- pop
-} def
-/T~
-{
- Tx
-} def
-/Th
-{
- pop pop pop pop pop
-} def
-/TX
-{
- pop
-} def
-/Tk
-{
- _fontSize mul 1000 div
- _lineorientation 0 eq { neg 0 } { 0 exch } ifelse
- rmoveto
- pop
-} def
-/TK
-{
- 2 npop
-} def
-/T*
-{
- _leading aload pop
- _lineorientation 0 ne { exch } if
- Td
-} def
-/T*-
-{
- _leading aload pop
- _lineorientation 0 ne { exch } if
- exch neg exch neg
- Td
-} def
-/T-
-{
- _ax neg 0 rmoveto
- _lineorientation 1 eq _charorientation 0 eq and { 1 TV _hyphen Tx 0 TV } { _hyphen Tx } ifelse
-} def
-/T+
-{
-} def
-/TR
-{
- _ctm currentmatrix pop
- _tm astore pop
- iTm 0 0 moveto
-} def
-/TS
-{
- currentfont 3 1 roll
- /_Symbol_ findfont _fontSize scalefont setfont
-
- 0 eq
- {
- Tx
- }
- {
- Tj
- } ifelse
- setfont
-} def
-/Xb
-{
- pop pop
-} def
-/Tb /Xb load def
-/Xe
-{
- pop pop pop pop
-} def
-/Te /Xe load def
-/XB
-{
-} def
-/TB /XB load def
-currentdict readonly pop
-end
-setpacking
-%
-/X^
-{
- currentfont 5 1 roll
- dup havefont
- {
- findfont _fontSize scalefont setfont
- }
- {
- pop
- exch
- } ifelse
- 2 index 0 eq
- {
- Tx
- }
- {
- Tj
- } ifelse
- pop pop
- setfont
-} def
-/T^ /X^ load def
-%%EndResource
-%%BeginProcSet: Adobe_ColorImage_AI6 1.3 0
-userdict /Adobe_ColorImage_AI6 known not
-{
- userdict /Adobe_ColorImage_AI6 53 dict put
-} if
-userdict /Adobe_ColorImage_AI6 get begin
-/initialize {
- Adobe_ColorImage_AI6 begin
- Adobe_ColorImage_AI6 {
- dup type /arraytype eq {
- dup xcheck {
- bind
- } if
- } if
- pop pop
- } forall
-} def
-/terminate { end } def
-currentdict /Adobe_ColorImage_AI6_Vars known not {
- /Adobe_ColorImage_AI6_Vars 41 dict def
-} if
-Adobe_ColorImage_AI6_Vars begin
- /plateindex -1 def
- /_newproc null def
- /_proc1 null def
- /_proc2 null def
- /sourcearray 4 array def
- /_ptispace null def
- /_ptiname null def
- /_pti0 0 def
- /_pti1 0 def
- /_ptiproc null def
- /_ptiscale 0 def
- /_pticomps 0 def
- /_ptibuf 0 string def
- /_gtigray 0 def
- /_cticmyk null def
- /_rtirgb null def
- /XIEnable true def
- /XIType 0 def
- /XIEncoding 0 def
- /XICompression 0 def
- /XIChannelCount 0 def
- /XIBitsPerPixel 0 def
- /XIImageHeight 0 def
- /XIImageWidth 0 def
- /XIImageMatrix null def
- /XIRowBytes 0 def
- /XIFile null def
- /XIBuffer1 null def
- /XIBuffer2 null def
- /XIBuffer3 null def
- /XIDataProc null def
- /XIColorSpace /DeviceGray def
- /XIColorValues 0 def
- /XIPlateList false def
-end
-/ci6colorimage /colorimage where {/colorimage get}{null} ifelse def
-/ci6image systemdict /image get def
-/ci6curtransfer systemdict /currenttransfer get def
-/ci6curoverprint /currentoverprint where {/currentoverprint get}{{_of}} ifelse def
-/ci6foureq {
- 4 index ne {
- pop pop pop false
- }{
- 4 index ne {
- pop pop false
- }{
- 4 index ne {
- pop false
- }{
- 4 index eq
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6testplate {
- Adobe_ColorImage_AI6_Vars begin
- /plateindex -1 def
- /setcmykcolor where {
- pop
- gsave
- 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub
- 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub
- 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub
- 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub
- grestore
- 1 0 0 0 ci6foureq {
- /plateindex 0 def
- }{
- 0 1 0 0 ci6foureq {
- /plateindex 1 def
- }{
- 0 0 1 0 ci6foureq {
- /plateindex 2 def
- }{
- 0 0 0 1 ci6foureq {
- /plateindex 3 def
- }{
- 0 0 0 0 ci6foureq {
- /plateindex 5 def
- } if
- } ifelse
- } ifelse
- } ifelse
- } ifelse
- pop pop pop pop
- } if
- plateindex
- end
-} def
-/ci6concatprocs {
- /packedarray where {
- pop dup type /packedarraytype eq 2 index type
- /packedarraytype eq or
- }{
- false
- } ifelse
- {
- /_proc2 exch cvlit def
- /_proc1 exch cvlit def
- _proc1 aload pop
- _proc2 aload pop
- _proc1 length
- _proc2 length add
- packedarray cvx
- }{
- /_proc2 exch cvlit def
- /_proc1 exch cvlit def
- /_newproc _proc1 length _proc2 length add array def
- _newproc 0 _proc1 putinterval
- _newproc _proc1 length _proc2 putinterval
- _newproc cvx
- } ifelse
-} def
-/ci6istint {
- type /arraytype eq
-} def
-/ci6isspot {
- dup type /arraytype eq {
- dup length 1 sub get /Separation eq
- }{
- pop false
- } ifelse
-} def
-/ci6spotname {
- dup ci6isspot {dup length 2 sub get}{pop ()} ifelse
-} def
-/ci6altspace {
- aload pop pop pop ci6colormake
-} def
-/ci6numcomps {
- dup /DeviceGray eq {
- pop 1
- }{
- dup /DeviceRGB eq {
- pop 3
- }{
- /DeviceCMYK eq {
- 4
- }{
- 1
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6marksplate {
- dup /DeviceGray eq {
- pop plateindex 3 eq
- }{
- dup /DeviceRGB eq {
- pop plateindex 5 ne
- }{
- dup /DeviceCMYK eq {
- pop plateindex 5 ne
- }{
- dup ci6isspot {
- /findcmykcustomcolor where {
- pop
- dup length 2 sub get
- 0.1 0.1 0.1 0.1 5 -1 roll
- findcmykcustomcolor 1 setcustomcolor
- systemdict /currentgray get exec
- 1 ne
- }{
- pop plateindex 5 ne
- } ifelse
- }{
- pop plateindex 5 ne
- } ifelse
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6colormake {
- dup ci6numcomps
- exch 1 index 2 add 1 roll
- dup 1 eq {pop}{array astore} ifelse
- exch
-} def
-/ci6colorexpand {
- dup ci6spotname exch
- dup ci6istint {
- ci6altspace
- exch 4 1 roll
- }{
- 1 3 1 roll
- } ifelse
-} def
-/ci6colortint {
- dup /DeviceGray eq {
- 3 1 roll 1 exch sub mul 1 exch sub exch
- }{
- dup /DeviceRGB eq {
- 3 1 roll {1 exch sub 1 index mul 1 exch sub exch} forall pop 3 array astore exch
- }{
- dup /DeviceCMYK eq {
- 3 1 roll {1 index mul exch} forall pop 4 array astore exch
- }{
- 3 1 roll mul exch
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6colortocmyk {
- dup /DeviceGray eq {
- pop 1 exch sub 0 0 0 4 -1 roll 4 array astore
- }{
- dup /DeviceRGB eq {
- pop aload pop _rgbtocmyk 4 array astore
- }{
- dup /DeviceCMYK eq {
- pop
- }{
- ci6altspace ci6colortint ci6colortocmyk
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6makeimagedict {
- 7 dict begin
- /ImageType 1 def
- /Decode exch def
- /DataSource exch def
- /ImageMatrix exch def
- /BitsPerComponent exch def
- /Height exch def
- /Width exch def
- currentdict end
-} def
-/ci6stringinvert {
- 0 1 2 index length 1 sub {
- dup 2 index exch get 255 exch sub 2 index 3 1 roll put
- } for
-} def
-/ci6stringknockout {
- 0 1 2 index length 1 sub {
- 255 2 index 3 1 roll put
- } for
-} def
-/ci6stringapply {
- 0 1 4 index length 1 sub {
- dup
- 4 index exch get
- 3 index 3 1 roll
- 3 index exec
- } for
- pop exch pop
-} def
-/ci6walkrgbstring {
- 0 3 index
- dup length 1 sub 0 3 3 -1 roll {
- 3 getinterval {} forall
- 5 index exec
- 3 index
- } for
-
- 5 {pop} repeat
-} def
-/ci6walkcmykstring
-{
- 0 3 index
- dup length 1 sub 0 4 3 -1 roll {
- 4 getinterval {} forall
-
- 6 index exec
-
- 3 index
-
- } for
-
- 5 { pop } repeat
-
-} def
-/ci6putrgbtograystr
-{
- .11 mul exch
-
- .59 mul add exch
-
- .3 mul add
-
- cvi 3 copy put
-
- pop 1 add
-} def
-/ci6putcmyktograystr
-{
- exch .11 mul add
-
- exch .59 mul add
-
- exch .3 mul add
-
- dup 255 gt { pop 255 } if
-
- 255 exch sub cvi 3 copy put
-
- pop 1 add
-} def
-/ci6rgbtograyproc {
- Adobe_ColorImage_AI6_Vars begin
- sourcearray 0 get exec
- XIBuffer3
- dup 3 1 roll
-
- /ci6putrgbtograystr load exch
- ci6walkrgbstring
- end
-} def
-/ci6cmyktograyproc {
- Adobe_ColorImage_AI6_Vars begin
- sourcearray 0 get exec
- XIBuffer3
- dup 3 1 roll
-
- /ci6putcmyktograystr load exch
- ci6walkcmykstring
- end
-} def
-/ci6separatecmykproc {
- Adobe_ColorImage_AI6_Vars begin
- sourcearray 0 get exec
-
- XIBuffer3
-
- 0 2 index
-
- plateindex 4 2 index length 1 sub {
- get 255 exch sub
-
- 3 copy put pop 1 add
-
- 2 index
- } for
- pop pop exch pop
- end
-} def
-
-/ci6compositeimage {
- dup 1 eq {
- pop pop image
- }{
- /ci6colorimage load null ne {
- ci6colorimage
- }{
- 3 1 roll pop
- sourcearray 0 3 -1 roll put
- 3 eq {/ci6rgbtograyproc}{/ci6cmyktograyproc} ifelse load
- image
- } ifelse
- } ifelse
-} def
-/ci6knockoutimage {
- gsave
- 0 ci6curtransfer exec 1 ci6curtransfer exec
- eq {
- 0 ci6curtransfer exec 0.5 lt
- }{
- 0 ci6curtransfer exec 1 ci6curtransfer exec gt
- } ifelse
- {{pop 0}}{{pop 1}} ifelse
- systemdict /settransfer get exec
- ci6compositeimage
- grestore
-} def
-/ci6drawimage {
- ci6testplate -1 eq {
- pop ci6compositeimage
- }{
- dup type /arraytype eq {
- dup length plateindex gt {plateindex get}{pop false} ifelse
- }{
- {
- true
- }{
- dup 1 eq {plateindex 3 eq}{plateindex 3 le} ifelse
- } ifelse
- } ifelse
- {
- dup 1 eq {
- pop pop ci6image
- }{
- dup 3 eq {
- ci6compositeimage
- }{
- pop pop
- sourcearray 0 3 -1 roll put
- /ci6separatecmykproc load
- ci6image
- } ifelse
- } ifelse
- }{
- ci6curoverprint {
- 7 {pop} repeat
- }{
- ci6knockoutimage
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6proctintimage {
- /_ptispace exch store /_ptiname exch store /_pti1 exch store /_pti0 exch store /_ptiproc exch store
- /_pticomps _ptispace ci6numcomps store
- /_ptiscale _pti1 _pti0 sub store
- level2? {
- _ptiname length 0 gt version cvr 2012 ge and {
- [/Separation _ptiname _ptispace {_ptiproc}] setcolorspace
- [_pti0 _pti1] ci6makeimagedict ci6image
- }{
- [/Indexed _ptispace 255 {255 div _ptiscale mul _pti0 add _ptiproc}] setcolorspace
- [0 255] ci6makeimagedict ci6image
- } ifelse
- }{
- _pticomps 1 eq {
- {
- dup
- {
- 255 div _ptiscale mul _pti0 add _ptiproc 255 mul cvi put
- } ci6stringapply
- } ci6concatprocs ci6image
- }{
- {
- dup length _pticomps mul dup _ptibuf length ne {/_ptibuf exch string store}{pop} ifelse
- _ptibuf {
- exch _pticomps mul exch 255 div _ptiscale mul _pti0 add _ptiproc
- _pticomps 2 add -2 roll
- _pticomps 1 sub -1 0 {
- 1 index add 2 index exch
- 5 -1 roll
- 255 mul cvi put
- } for
- pop pop
- } ci6stringapply
- } ci6concatprocs false _pticomps
- /ci6colorimage load null eq {7 {pop} repeat}{ci6colorimage} ifelse
- } ifelse
- } ifelse
-} def
-/ci6graytintimage {
- /_gtigray 5 -1 roll store
- {1 _gtigray sub mul 1 exch sub} 4 1 roll
- /DeviceGray ci6proctintimage
-} def
-/ci6cmyktintimage {
- /_cticmyk 5 -1 roll store
- {_cticmyk {1 index mul exch} forall pop} 4 1 roll
- /DeviceCMYK ci6proctintimage
-} def
-/ci6rgbtintimage {
- /_rtirgb 5 -1 roll store
- {_rtirgb {1 exch sub 1 index mul 1 exch sub exch} forall pop} 4 1 roll
- /DeviceRGB ci6proctintimage
-} def
-/ci6tintimage {
- ci6testplate -1 eq {
- ci6colorexpand
- 3 -1 roll 5 -1 roll {0}{0 exch} ifelse 4 2 roll
- dup /DeviceGray eq {
- pop ci6graytintimage
- }{
- dup /DeviceRGB eq {
- pop ci6rgbtintimage
- }{
- pop ci6cmyktintimage
- } ifelse
- } ifelse
- }{
- dup ci6marksplate {
- plateindex 5 lt {
- ci6colortocmyk plateindex get
- dup 0 eq ci6curoverprint and {
- 7 {pop} repeat
- }{
- 1 exch sub
- exch {1 0}{0 1} ifelse () ci6graytintimage
- } ifelse
- }{
- pop exch {0}{0 exch} ifelse 0 3 1 roll () ci6graytintimage
- } ifelse
- }{
- ci6curoverprint {
- 8 {pop} repeat
- }{
- pop pop pop
- {pop 1} 0 1 () /DeviceGray ci6proctintimage
- } ifelse
- } ifelse
- } ifelse
-} def
-/XINullImage {
-} def
-/XIImageMask {
- XIImageWidth XIImageHeight false
- [XIImageWidth 0 0 XIImageHeight neg 0 0]
- /XIDataProc load
- imagemask
-} def
-/XIImageTint {
- XIImageWidth XIImageHeight XIBitsPerPixel
- [XIImageWidth 0 0 XIImageHeight neg 0 0]
- /XIDataProc load
- XIType 3 eq XIColorValues XIColorSpace ci6tintimage
-} def
-/XIImage {
- XIImageWidth XIImageHeight XIBitsPerPixel
- [XIImageWidth 0 0 XIImageHeight neg 0 0]
- /XIDataProc load
- false XIChannelCount XIPlateList ci6drawimage
-} def
-/XG {
- pop pop
-} def
-/XF {
- 13 {pop} repeat
-} def
-/Xh {
- Adobe_ColorImage_AI6_Vars begin
- gsave
- /XIType exch def
- /XIImageHeight exch def
- /XIImageWidth exch def
- /XIImageMatrix exch def
- 0 0 moveto
- XIImageMatrix concat
- XIImageWidth XIImageHeight scale
-
- /_lp /null ddef
- _fc
- /_lp /imagemask ddef
- end
-} def
-/XH {
- Adobe_ColorImage_AI6_Vars begin
- grestore
- end
-} def
-/XIEnable {
- Adobe_ColorImage_AI6_Vars /XIEnable 3 -1 roll put
-} def
-/XC {
- Adobe_ColorImage_AI6_Vars begin
- ci6colormake
- /XIColorSpace exch def
- /XIColorValues exch def
- end
-} def
-/XIPlates {
- Adobe_ColorImage_AI6_Vars begin
- /XIPlateList exch def
- end
-} def
-/XI
-{
- Adobe_ColorImage_AI6_Vars begin
- gsave
- /XIType exch def
- cvi dup
- 256 idiv /XICompression exch store
- 256 mod /XIEncoding exch store
- pop pop
- /XIChannelCount exch def
- /XIBitsPerPixel exch def
- /XIImageHeight exch def
- /XIImageWidth exch def
- pop pop pop pop
- /XIImageMatrix exch def
- XIBitsPerPixel 1 eq {
- XIImageWidth 8 div ceiling cvi
- }{
- XIImageWidth XIChannelCount mul
- } ifelse
- /XIRowBytes exch def
- XIEnable {
- /XIBuffer3 XIImageWidth string def
- XICompression 0 eq {
- /XIBuffer1 XIRowBytes string def
- XIEncoding 0 eq {
- {currentfile XIBuffer1 readhexstring pop}
- }{
- {currentfile XIBuffer1 readstring pop}
- } ifelse
- }{
- /XIBuffer1 256 string def
- /XIBuffer2 XIRowBytes string def
- {currentfile XIBuffer1 readline pop (%) anchorsearch {pop} if}
- /ASCII85Decode filter /DCTDecode filter
- /XIFile exch def
- {XIFile XIBuffer2 readstring pop}
- } ifelse
- /XIDataProc exch def
-
- XIType 1 ne {
- 0 setgray
- } if
- XIType 1 eq {
- XIImageMask
- }{
- XIType 2 eq XIType 3 eq or {
- XIImageTint
- }{
- XIImage
- } ifelse
- } ifelse
- }{
- XINullImage
- } ifelse
- /XIPlateList false def
- grestore
- end
-} def
-end
-%%EndProcSet
-%%BeginResource: procset Adobe_Illustrator_AI5 1.3 0
-%%Title: (Adobe Illustrator (R) Version 8.0 Full Prolog)
-%%Version: 1.3 0
-%%CreationDate: (3/7/1994) ()
-%%Copyright: ((C) 1987-1998 Adobe Systems Incorporated All Rights Reserved)
-currentpacking true setpacking
-userdict /Adobe_Illustrator_AI5_vars 112 dict dup begin
-put
-/_?cmyk false def
-/_eo false def
-/_lp /none def
-/_pf
-{
-} def
-/_ps
-{
-} def
-/_psf
-{
-} def
-/_pss
-{
-} def
-/_pjsf
-{
-} def
-/_pjss
-{
-} def
-/_pola 0 def
-/_doClip 0 def
-/cf currentflat def
-/_lineorientation 0 def
-/_charorientation 0 def
-/_yokoorientation 0 def
-/_tm matrix def
-/_renderStart
-[
-/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0
-] def
-/_renderEnd
-[
-null null null null /i1 /i1 /i1 /i1
-] def
-/_render -1 def
-/_shift [0 0] def
-/_ax 0 def
-/_ay 0 def
-/_cx 0 def
-/_cy 0 def
-/_leading
-[
-0 0
-] def
-/_ctm matrix def
-/_mtx matrix def
-/_sp 16#020 def
-/_hyphen (-) def
-/_fontSize 0 def
-/_fontAscent 0 def
-/_fontDescent 0 def
-/_fontHeight 0 def
-/_fontRotateAdjust 0 def
-/Ss 256 string def
-Ss 0 (fonts/) putinterval
-/_cnt 0 def
-/_scale [1 1] def
-/_nativeEncoding 0 def
-/_useNativeEncoding 0 def
-/_tempEncode 0 def
-/_pntr 0 def
-/_tDict 2 dict def
-/_hfname 100 string def
-/_hffound false def
-/Tx
-{
-} def
-/Tj
-{
-} def
-/CRender
-{
-} def
-/_AI3_savepage
-{
-} def
-/_gf null def
-/_cf 4 array def
-/_rgbf 3 array def
-/_if null def
-/_of false def
-/_fc
-{
-} def
-/_gs null def
-/_cs 4 array def
-/_rgbs 3 array def
-/_is null def
-/_os false def
-/_sc
-{
-} def
-/_pd 1 dict def
-/_ed 15 dict def
-/_pm matrix def
-/_fm null def
-/_fd null def
-/_fdd null def
-/_sm null def
-/_sd null def
-/_sdd null def
-/_i null def
-/_lobyte 0 def
-/_hibyte 0 def
-/_cproc null def
-/_cscript 0 def
-/_hvax 0 def
-/_hvay 0 def
-/_hvwb 0 def
-/_hvcx 0 def
-/_hvcy 0 def
-/_bitfont null def
-/_bitlobyte 0 def
-/_bithibyte 0 def
-/_bitkey null def
-/_bitdata null def
-/_bitindex 0 def
-/discardSave null def
-/buffer 256 string def
-/beginString null def
-/endString null def
-/endStringLength null def
-/layerCnt 1 def
-/layerCount 1 def
-/perCent (%) 0 get def
-/perCentSeen? false def
-/newBuff null def
-/newBuffButFirst null def
-/newBuffLast null def
-/clipForward? false def
-end
-userdict /Adobe_Illustrator_AI5 known not {
- userdict /Adobe_Illustrator_AI5 100 dict put
-} if
-userdict /Adobe_Illustrator_AI5 get begin
-/initialize
-{
- Adobe_Illustrator_AI5 dup begin
- Adobe_Illustrator_AI5_vars begin
- /_aicmykps where {pop /_?cmyk _aicmykps def}if
- discardDict
- {
- bind pop pop
- } forall
- dup /nc get begin
- {
- dup xcheck 1 index type /operatortype ne and
- {
- bind
- } if
- pop pop
- } forall
- end
- newpath
-} def
-/terminate
-{
- end
- end
-} def
-/_
-null def
-/ddef
-{
- Adobe_Illustrator_AI5_vars 3 1 roll put
-} def
-/xput
-{
- dup load dup length exch maxlength eq
- {
- dup dup load dup
- length 2 mul dict copy def
- } if
- load begin
- def
- end
-} def
-/npop
-{
- {
- pop
- } repeat
-} def
-/hswj
-{
- dup stringwidth 3 2 roll
- {
- _hvwb eq { exch _hvcx add exch _hvcy add } if
- exch _hvax add exch _hvay add
- } cforall
-} def
-/vswj
-{
- 0 0 3 -1 roll
- {
- dup 255 le
- _charorientation 1 eq
- and
- {
- dup cstring stringwidth 5 2 roll
- _hvwb eq { exch _hvcy sub exch _hvcx sub } if
- exch _hvay sub exch _hvax sub
- 4 -1 roll sub exch
- 3 -1 roll sub exch
- }
- {
- _hvwb eq { exch _hvcy sub exch _hvcx sub } if
- exch _hvay sub exch _hvax sub
- _fontHeight sub
- } ifelse
- } cforall
-} def
-/swj
-{
- 6 1 roll
- /_hvay exch ddef
- /_hvax exch ddef
- /_hvwb exch ddef
- /_hvcy exch ddef
- /_hvcx exch ddef
- _lineorientation 0 eq { hswj } { vswj } ifelse
-} def
-/sw
-{
- 0 0 0 6 3 roll swj
-} def
-/vjss
-{
- 4 1 roll
- {
- dup cstring
- dup length 1 eq
- _charorientation 1 eq
- and
- {
- -90 rotate
- currentpoint
- _fontRotateAdjust add
- moveto
- gsave
- false charpath currentpoint
- 5 index setmatrix stroke
- grestore
- _fontRotateAdjust sub
- moveto
- _sp eq
- {
- 5 index 5 index rmoveto
- } if
- 2 copy rmoveto
- 90 rotate
- }
- {
- currentpoint
- _fontHeight sub
- 5 index sub
- 3 index _sp eq
- {
- 9 index sub
- } if
-
- currentpoint
- exch 4 index stringwidth pop 2 div sub
- exch _fontAscent sub
- moveto
-
- gsave
- 2 index false charpath
- 6 index setmatrix stroke
- grestore
-
- moveto pop pop
- } ifelse
- } cforall
- 6 npop
-} def
-/hjss
-{
- 4 1 roll
- {
- dup cstring
- gsave
- false charpath currentpoint
- 5 index setmatrix stroke
- grestore
- moveto
- _sp eq
- {
- 5 index 5 index rmoveto
- } if
- 2 copy rmoveto
- } cforall
- 6 npop
-} def
-/jss
-{
- _lineorientation 0 eq { hjss } { vjss } ifelse
-} def
-/ss
-{
- 0 0 0 7 3 roll jss
-} def
-/vjsp
-{
- 4 1 roll
- {
- dup cstring
- dup length 1 eq
- _charorientation 1 eq
- and
- {
- -90 rotate
- currentpoint
- _fontRotateAdjust add
- moveto
- false charpath
- currentpoint
- _fontRotateAdjust sub
- moveto
- _sp eq
- {
- 5 index 5 index rmoveto
- } if
- 2 copy rmoveto
- 90 rotate
- }
- {
- currentpoint
- _fontHeight sub
- 5 index sub
- 3 index _sp eq
- {
- 9 index sub
- } if
-
- currentpoint
- exch 4 index stringwidth pop 2 div sub
- exch _fontAscent sub
- moveto
-
- 2 index false charpath
-
- moveto pop pop
- } ifelse
- } cforall
- 6 npop
-} def
-/hjsp
-{
- 4 1 roll
- {
- dup cstring
- false charpath
- _sp eq
- {
- 5 index 5 index rmoveto
- } if
- 2 copy rmoveto
- } cforall
- 6 npop
-} def
-/jsp
-{
- matrix currentmatrix
- _lineorientation 0 eq {hjsp} {vjsp} ifelse
-} def
-/sp
-{
- matrix currentmatrix
- 0 0 0 7 3 roll
- _lineorientation 0 eq {hjsp} {vjsp} ifelse
-} def
-/pl
-{
- transform
- 0.25 sub round 0.25 add exch
- 0.25 sub round 0.25 add exch
- itransform
-} def
-/setstrokeadjust where
-{
- pop true setstrokeadjust
- /c
- {
- curveto
- } def
- /C
- /c load def
- /v
- {
- currentpoint 6 2 roll curveto
- } def
- /V
- /v load def
- /y
- {
- 2 copy curveto
- } def
- /Y
- /y load def
- /l
- {
- lineto
- } def
- /L
- /l load def
- /m
- {
- moveto
- } def
-}
-{
- /c
- {
- pl curveto
- } def
- /C
- /c load def
- /v
- {
- currentpoint 6 2 roll pl curveto
- } def
- /V
- /v load def
- /y
- {
- pl 2 copy curveto
- } def
- /Y
- /y load def
- /l
- {
- pl lineto
- } def
- /L
- /l load def
- /m
- {
- pl moveto
- } def
-} ifelse
-/d
-{
- setdash
-} def
-/cf
-{
-} def
-/i
-{
- dup 0 eq
- {
- pop cf
- } if
- setflat
-} def
-/j
-{
- setlinejoin
-} def
-/J
-{
- setlinecap
-} def
-/M
-{
- setmiterlimit
-} def
-/w
-{
- setlinewidth
-} def
-/XR
-{
- 0 ne
- /_eo exch ddef
-} def
-/H
-{
-} def
-/h
-{
- closepath
-} def
-/N
-{
- _pola 0 eq
- {
- _doClip 1 eq
- {
- _eo {eoclip} {clip} ifelse /_doClip 0 ddef
- } if
- newpath
- }
- {
- /CRender
- {
- N
- } ddef
- } ifelse
-} def
-/n
-{
- N
-} def
-/F
-{
- _pola 0 eq
- {
- _doClip 1 eq
- {
- gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc
- /_doClip 0 ddef
- }
- {
- _pf
- } ifelse
- }
- {
- /CRender
- {
- F
- } ddef
- } ifelse
-} def
-/f
-{
- closepath
- F
-} def
-/S
-{
- _pola 0 eq
- {
- _doClip 1 eq
- {
- gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc
- /_doClip 0 ddef
- }
- {
- _ps
- } ifelse
- }
- {
- /CRender
- {
- S
- } ddef
- } ifelse
-} def
-/s
-{
- closepath
- S
-} def
-/B
-{
- _pola 0 eq
- {
- _doClip 1 eq
- gsave F grestore
- {
- gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc
- /_doClip 0 ddef
- }
- {
- S
- } ifelse
- }
- {
- /CRender
- {
- B
- } ddef
- } ifelse
-} def
-/b
-{
- closepath
- B
-} def
-/W
-{
- /_doClip 1 ddef
-} def
-/*
-{
- count 0 ne
- {
- dup type /stringtype eq
- {
- pop
- } if
- } if
- newpath
-} def
-/u
-{
-} def
-/U
-{
-} def
-/q
-{
- _pola 0 eq
- {
- gsave
- } if
-} def
-/Q
-{
- _pola 0 eq
- {
- grestore
- } if
-} def
-/*u
-{
- _pola 1 add /_pola exch ddef
-} def
-/*U
-{
- _pola 1 sub /_pola exch ddef
- _pola 0 eq
- {
- CRender
- } if
-} def
-/D
-{
- pop
-} def
-/*w
-{
-} def
-/*W
-{
-} def
-/`
-{
- /_i save ddef
- clipForward?
- {
- nulldevice
- } if
- 6 1 roll 4 npop
- concat pop
- userdict begin
- /showpage
- {
- } def
- 0 setgray
- 0 setlinecap
- 1 setlinewidth
- 0 setlinejoin
- 10 setmiterlimit
- [] 0 setdash
- /setstrokeadjust where {pop false setstrokeadjust} if
- newpath
- 0 setgray
- false setoverprint
-} def
-/~
-{
- end
- _i restore
-} def
-/_rgbtocmyk
-{
- 3
- {
- 1 exch sub 3 1 roll
- } repeat
- 3 copy 1 4 1 roll
- 3
- {
- 3 index 2 copy gt
- {
- exch
- } if
- pop 4 1 roll
- } repeat
- pop pop pop
- 4 1 roll
- 3
- {
- 3 index sub
- 3 1 roll
- } repeat
- 4 -1 roll
-} def
-/setrgbfill
-{
- _rgbf astore pop
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _rgbf aload pop setrgbcolor
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/setrgbstroke
-{
- _rgbs astore pop
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _rgbs aload pop setrgbcolor
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/O
-{
- 0 ne
- /_of exch ddef
- /_lp /none ddef
-} def
-/R
-{
- 0 ne
- /_os exch ddef
- /_lp /none ddef
-} def
-/g
-{
- /_gf exch ddef
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _gf setgray
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/G
-{
- /_gs exch ddef
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _gs setgray
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/k
-{
- _cf astore pop
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _cf aload pop setcmykcolor
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/K
-{
- _cs astore pop
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _cs aload pop setcmykcolor
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/Xa
-{
- _?cmyk {
- 3 npop k
- }{
- setrgbfill 4 npop
- } ifelse
-} def
-/XA
-{
- _?cmyk {
- 3 npop K
- }{
- setrgbstroke 4 npop
- } ifelse
-} def
-/Xs
-{
- /_gf exch ddef
- 5 npop
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _gf setAIseparationgray
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/XS
-{
- /_gs exch ddef
- 5 npop
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _gs setAIseparationgray
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/Xx
-{
- exch
- /_gf exch ddef
- 0 eq {
- findcmykcustomcolor
- }{
- _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse
- {
- 4 1 roll 3 npop
- findcmykcustomcolor
- }{
- 8 -4 roll 4 npop
- findrgbcustomcolor
- } ifelse
- } ifelse
- /_if exch ddef
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _if _gf 1 exch sub setcustomcolor
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/XX
-{
- exch
- /_gs exch ddef
- 0 eq {
- findcmykcustomcolor
- }{
- _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse
- {
- 4 1 roll 3 npop
- findcmykcustomcolor
- }{
- 8 -4 roll 4 npop
- findrgbcustomcolor
- } ifelse
- } ifelse
- /_is exch ddef
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _is _gs 1 exch sub setcustomcolor
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/x
-{
- /_gf exch ddef
- findcmykcustomcolor
- /_if exch ddef
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _if _gf 1 exch sub setcustomcolor
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/X
-{
- /_gs exch ddef
- findcmykcustomcolor
- /_is exch ddef
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _is _gs 1 exch sub setcustomcolor
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/XK
-{
- 3 -1 roll pop
- 0 eq
- {
- 1 exch sub
- 3 {dup 3 1 roll mul 5 1 roll} repeat
- mul 4 1 roll
- K
- }
- {
- 1 exch sub 4 1 roll
- 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat
- 4 -1 roll pop
- XA
- } ifelse
-} def
-/Xk
-{
- 3 -1 roll pop
- 0 eq
- {
- 1 exch sub
- 3 {dup 3 1 roll mul 5 1 roll} repeat
- mul 4 1 roll
- k
- }
- {
- 1 exch sub 4 1 roll
- 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat
- 4 -1 roll pop
- Xa
- } ifelse
-} def
-/A
-{
- pop
-} def
-/annotatepage
-{
-userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse
-} def
-/XT {
- pop pop
-} def
-/Xt {
- pop
-} def
-/discard
-{
- save /discardSave exch store
- discardDict begin
- /endString exch store
- gt38?
- {
- 2 add
- } if
- load
- stopped
- pop
- end
- discardSave restore
-} bind def
-userdict /discardDict 7 dict dup begin
-put
-/pre38Initialize
-{
- /endStringLength endString length store
- /newBuff buffer 0 endStringLength getinterval store
- /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store
- /newBuffLast newBuff endStringLength 1 sub 1 getinterval store
-} def
-/shiftBuffer
-{
- newBuff 0 newBuffButFirst putinterval
- newBuffLast 0
- currentfile read not
- {
- stop
- } if
- put
-} def
-0
-{
- pre38Initialize
- mark
- currentfile newBuff readstring exch pop
- {
- {
- newBuff endString eq
- {
- cleartomark stop
- } if
- shiftBuffer
- } loop
- }
- {
- stop
- } ifelse
-} def
-1
-{
- pre38Initialize
- /beginString exch store
- mark
- currentfile newBuff readstring exch pop
- {
- {
- newBuff beginString eq
- {
- /layerCount dup load 1 add store
- }
- {
- newBuff endString eq
- {
- /layerCount dup load 1 sub store
- layerCount 0 eq
- {
- cleartomark stop
- } if
- } if
- } ifelse
- shiftBuffer
- } loop
- } if
-} def
-2
-{
- mark
- {
- currentfile buffer {readline} stopped {
- % assume error was due to overfilling the buffer
- }{
- not
- {
- stop
- } if
- endString eq {
- cleartomark stop
- } if
- }ifelse
- } loop
-} def
-3
-{
- /beginString exch store
- /layerCnt 1 store
- mark
- {
- currentfile buffer {readline} stopped {
- % assume error was due to overfilling the buffer
- }{
- not
- {
- stop
- } if
- dup beginString eq
- {
- pop /layerCnt dup load 1 add store
- }
- {
- endString eq
- {
- layerCnt 1 eq
- {
- cleartomark stop
- }
- {
- /layerCnt dup load 1 sub store
- } ifelse
- } if
- } ifelse
- }ifelse
- } loop
-} def
-end
-userdict /clipRenderOff 15 dict dup begin
-put
-{
- /n /N /s /S /f /F /b /B
-}
-{
- {
- _doClip 1 eq
- {
- /_doClip 0 ddef _eo {eoclip} {clip} ifelse
- } if
- newpath
- } def
-} forall
-/Tr /pop load def
-/Bb {} def
-/BB /pop load def
-/Bg {12 npop} def
-/Bm {6 npop} def
-/Bc /Bm load def
-/Bh {4 npop} def
-end
-/Lb
-{
- 6 npop
- 7 2 roll
- 5 npop
- 0 eq
- {
- 0 eq
- {
- (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard
- }
- {
-
- /clipForward? true def
-
- /Tx /pop load def
- /Tj /pop load def
-
- currentdict end clipRenderOff begin begin
- } ifelse
- }
- {
- 0 eq
- {
- save /discardSave exch store
- } if
- } ifelse
-} bind def
-/LB
-{
- discardSave dup null ne
- {
- restore
- }
- {
- pop
- clipForward?
- {
- currentdict
- end
- end
- begin
-
- /clipForward? false ddef
- } if
- } ifelse
-} bind def
-/Pb
-{
- pop pop
- 0 (%AI5_EndPalette) discard
-} bind def
-/Np
-{
- 0 (%AI5_End_NonPrinting--) discard
-} bind def
-/Ln /pop load def
-/Ap
-/pop load def
-/Ar
-{
- 72 exch div
- 0 dtransform dup mul exch dup mul add sqrt
- dup 1 lt
- {
- pop 1
- } if
- setflat
-} def
-/Mb
-{
- q
-} def
-/Md
-{
-} def
-/MB
-{
- Q
-} def
-/nc 4 dict def
-nc begin
-/setgray
-{
- pop
-} bind def
-/setcmykcolor
-{
- 4 npop
-} bind def
-/setrgbcolor
-{
- 3 npop
-} bind def
-/setcustomcolor
-{
- 2 npop
-} bind def
-currentdict readonly pop
-end
-/XP
-{
- 4 npop
-} bind def
-/XD
-{
- pop
-} bind def
-end
-setpacking
-%%EndResource
-%%BeginResource: procset Adobe_cshow 2.0 8
-%%Title: (Writing System Operators)
-%%Version: 2.0 8
-%%CreationDate: (1/23/89) ()
-%%Copyright: ((C) 1992-1996 Adobe Systems Incorporated All Rights Reserved)
-currentpacking true setpacking
-userdict /Adobe_cshow 14 dict dup begin put
-/initialize
-{
- Adobe_cshow begin
- Adobe_cshow
- {
- dup xcheck
- {
- bind
- } if
- pop pop
- } forall
- end
- Adobe_cshow begin
-} def
-/terminate
-{
-currentdict Adobe_cshow eq
- {
- end
- } if
-} def
-/cforall
-{
- /_lobyte 0 ddef
- /_hibyte 0 ddef
- /_cproc exch ddef
- /_cscript currentfont /FontScript known { currentfont /FontScript get } { -1 } ifelse ddef
- {
- /_lobyte exch ddef
- _hibyte 0 eq
- _cscript 1 eq
- _lobyte 129 ge _lobyte 159 le and
- _lobyte 224 ge _lobyte 252 le and or and
- _cscript 2 eq
- _lobyte 161 ge _lobyte 254 le and and
- _cscript 3 eq
- _lobyte 161 ge _lobyte 254 le and and
- _cscript 25 eq
- _lobyte 161 ge _lobyte 254 le and and
- _cscript -1 eq
- or or or or and
- {
- /_hibyte _lobyte ddef
- }
- {
- _hibyte 256 mul _lobyte add
- _cproc
- /_hibyte 0 ddef
- } ifelse
- } forall
-} def
-/cstring
-{
- dup 256 lt
- {
- (s) dup 0 4 3 roll put
- }
- {
- dup 256 idiv exch 256 mod
- (hl) dup dup 0 6 5 roll put 1 4 3 roll put
- } ifelse
-} def
-/clength
-{
- 0 exch
- { 256 lt { 1 } { 2 } ifelse add } cforall
-} def
-/hawidthshow
-{
- {
- dup cstring
- show
- _hvax _hvay rmoveto
- _hvwb eq { _hvcx _hvcy rmoveto } if
- } cforall
-} def
-/vawidthshow
-{
- {
- dup 255 le
- _charorientation 1 eq
- and
- {
- -90 rotate
- 0 _fontRotateAdjust rmoveto
- cstring
- _hvcx _hvcy _hvwb _hvax _hvay 6 -1 roll awidthshow
- 0 _fontRotateAdjust neg rmoveto
- 90 rotate
- }
- {
- currentpoint
- _fontHeight sub
- exch _hvay sub exch _hvax sub
- 2 index _hvwb eq { exch _hvcy sub exch _hvcx sub } if
- 3 2 roll
- cstring
- dup stringwidth pop 2 div neg _fontAscent neg rmoveto
- show
- moveto
- } ifelse
- } cforall
-} def
-/hvawidthshow
-{
- 6 1 roll
- /_hvay exch ddef
- /_hvax exch ddef
- /_hvwb exch ddef
- /_hvcy exch ddef
- /_hvcx exch ddef
- _lineorientation 0 eq { hawidthshow } { vawidthshow } ifelse
-} def
-/hvwidthshow
-{
- 0 0 3 -1 roll hvawidthshow
-} def
-/hvashow
-{
- 0 0 0 6 -3 roll hvawidthshow
-} def
-/hvshow
-{
- 0 0 0 0 0 6 -1 roll hvawidthshow
-} def
-currentdict readonly pop end
-setpacking
-%%EndResource
-%%BeginResource: procset Adobe_shading_AI8 1.0 0
-%%Title: (Adobe Illustrator 8 Shading Procset)
-%%Version: 1.0 0
-%%CreationDate: (12/17/97) ()
-%%Copyright: ((C) 1987-1997 Adobe Systems Incorporated All Rights Reserved)
-userdict /defaultpacking currentpacking put true setpacking
-userdict /Adobe_shading_AI8 10 dict dup begin put
-/initialize {
- Adobe_shading_AI8 begin
- Adobe_shading_AI8 bdprocs
- Mesh /initialize get exec
-} def
-/terminate {
- currentdict Adobe_shading_AI8 eq {
- end
- } if
-} def
-/bdprocs {
- {
- dup xcheck 1 index type /arraytype eq and {
- bind
- } if
- pop pop
- } forall
-} def
-/X! {pop} def
-/X# {pop pop} def
-/Mesh 40 dict def
-Mesh begin
-/initialize {
- Mesh bdprocs
- Mesh begin
- /emulate? /AI8MeshEmulation where {
- pop AI8MeshEmulation
- }{
- systemdict /shfill known not
- } ifelse def
- end
-} def
-/bd {
- shadingdict begin
-} def
-/paint {
- emulate? {
- end
- }{
- /_lp /none ddef _fc /_lp /none ddef
-
- /AIColorSpace AIColorSpace tocolorspace store
- /ColorSpace AIColorSpace topsspace store
-
- version_ge_3010.106 not systemdict /setsmoothness known and {
- 0.0001 setsmoothness
- } if
-
- composite? {
- /DataSource getdatasrc def
- Matrix concat
- currentdict end
- shfill
- }{
- AIColorSpace makesmarks AIPlateList markingplate and not isoverprint and {
- end
- }{
- /ColorSpace /DeviceGray store
- /Decode [0 1 0 1 0 1] store
- /DataSource getplatesrc def
- Matrix concat
- currentdict end
- shfill
- } ifelse
- } ifelse
- } ifelse
-} def
-/shadingdict 12 dict def
-shadingdict begin
- /ShadingType 6 def
- /BitsPerCoordinate 16 def
- /BitsPerComponent 8 def
- /BitsPerFlag 8 def
-end
-/datafile null def
-/databuf 256 string def
-/dataptr 0 def
-/srcspace null def
-/srcchannels 0 def
-/dstchannels 0 def
-/dstplate 0 def
-/srctodstcolor null def
-/getplatesrc {
- /srcspace AIColorSpace store
- /srcchannels AIColorSpace getnchannels store
- /dstchannels 1 store
- /dstplate getplateindex store
- /srctodstcolor srcspace makesmarks {
- dstplate 4 eq {
- {1 exch sub}
- }{
- {srcspace tocmyk 3 dstplate sub index 1 exch sub 5 1 roll 4 {pop} repeat}
- } ifelse
- }{
- {srcchannels {pop} repeat 1}
- } ifelse store
- /datafile getdatasrc store
- /rdpatch168 load DataLength () /SubFileDecode filter
-} def
-/getdatasrc {
- /rdcmntline load /ASCII85Decode filter
-} def
-/rdpatch168 {
- /dataptr 0 store
- 49 rdcount
- 4 {
- dup {pop srcchannels getint8} if
- dup {pop srctodstcolor dstchannels putint8 true} if
- } repeat
- {databuf 0 dataptr getinterval}{()} ifelse
-} def
-/rdpatch3216 {
- /dataptr 0 store
- 97 rdcount
- 4 {
- dup {pop srcchannels getint16} if
- dup {pop srctodstcolor dstchannels putint16 true} if
- } repeat
- {databuf 0 dataptr getinterval}{()} ifelse
-} def
-/rdcount {
- dup 0 gt {
- datafile databuf dataptr 4 -1 roll getinterval readstring
- exch length dataptr add /dataptr exch store
- }{
- true
- } ifelse
-} def
-/getint8 {
- mark true 3 -1 roll
- {
- dup {pop datafile read} if
- dup {pop 255 div true} if
- } repeat
- {
- counttomark 1 add -1 roll pop true
- }{
- cleartomark false
- } ifelse
-} def
-/putint8 {
- dup dataptr add /dataptr exch store
- dataptr exch
- {
- 1 sub exch
- 255 mul cvi
- databuf 2 index
- 3 -1 roll put
- } repeat
- pop
-} def
-/getint16 {
- mark true 3 -1 roll
- {
- dup {pop datafile read} if
- dup {pop 256 mul datafile read} if
- dup {pop add 65535 div true} if
- } repeat
- {
- counttomark 1 add -1 roll pop true
- }{
- cleartomark false
- } ifelse
-} def
-/putint16 {
- dup 2 mul dataptr add /dataptr exch store
- dataptr exch
- {
- 2 sub exch
- 65535 mul cvi dup
- 256 idiv databuf 3 index 3 -1 roll put
- 256 mod databuf 2 index 1 add 3 -1 roll put
- } repeat
- pop
-} def
-/srcbuf 256 string def
-/rdcmntline {
- currentfile srcbuf readline pop
- (%) anchorsearch {pop} if
-} def
-/getplateindex {
- 0 [cyan? magenta? yellow? black? customColor?] {{exit} if 1 add} forall
-} def
-/aicsarray 4 array def
-/aicsaltvals 4 array def
-/aicsaltcolr aicsaltvals def
-/tocolorspace {
- dup type /arraytype eq {
- mark exch aload pop
- aicsarray 0 3 -1 roll put
- aicsarray 1 3 -1 roll put
- dup aicsarray 2 3 -1 roll put
- gettintxform aicsarray 3 3 -1 roll put
- counttomark aicsaltvals 0 3 -1 roll getinterval /aicsaltcolr exch store
- aicsaltcolr astore pop pop
- aicsarray
- } if
-} def
-/subtintxform {aicsaltcolr {1 index mul exch} forall pop} def
-/addtintxform {aicsaltcolr {1 sub 1 index mul 1 add exch} forall pop} def
-/gettintxform {
- /DeviceRGB eq {/addtintxform}{/subtintxform} ifelse load
-} def
-/getnchannels {
- dup type /arraytype eq {0 get} if
- colorspacedict exch get begin Channels end
-} def
-/makesmarks {
- composite? {
- pop true
- }{
- dup dup type /arraytype eq {0 get} if
- colorspacedict exch get begin MarksPlate end
- } ifelse
-} def
-/markingplate {
- composite? {
- pop true
- }{
- dup type /arraytype eq {
- dup length getplateindex gt {getplateindex get}{pop false} ifelse
- } if
- } ifelse
-} def
-/tocmyk {
- dup dup type /arraytype eq {0 get} if
- colorspacedict exch get begin ToCMYK end
-} def
-/topsspace {
- dup dup type /arraytype eq {0 get} if
- colorspacedict exch get begin ToPSSpace end
-} def
-/colorspacedict 5 dict dup begin
- /DeviceGray 4 dict dup begin
- /Channels 1 def
- /MarksPlate {pop black?} def
- /ToCMYK {pop 1 exch sub 0 0 0 4 -1 roll} def
- /ToPSSpace {} def
- end def
- /DeviceRGB 4 dict dup begin
- /Channels 3 def
- /MarksPlate {pop isCMYKSep?} def
- /ToCMYK {pop _rgbtocmyk} def
- /ToPSSpace {} def
- end def
- /DeviceCMYK 4 dict dup begin
- /Channels 4 def
- /MarksPlate {pop isCMYKSep?} def
- /ToCMYK {pop} def
- /ToPSSpace {} def
- end def
- /Separation 4 dict dup begin
- /Channels 1 def
- /MarksPlate {
- /findcmykcustomcolor where {
- pop dup 1 exch ToCMYK 5 -1 roll 1 get
- findcmykcustomcolor 1 setcustomcolor
- systemdict /currentgray get exec
- 1 ne
- }{
- pop false
- } ifelse
- } def
- /ToCMYK {
- dup 2 get mark exch 4 2 roll
- 3 get exec
- counttomark -1 roll tocmyk
- 5 -1 roll pop
- } def
- /ToPSSpace {} def
- end def
- /Process 4 dict dup begin
- /Channels 1 def
- /MarksPlate {
- isCMYKSep? {
- 1 exch ToCMYK 4 array astore getplateindex get 0 ne
- }{
- pop false
- } ifelse
- } def
- /ToCMYK {
- dup 2 get mark exch 4 2 roll
- 3 get exec
- counttomark -1 roll tocmyk
- 5 -1 roll pop
- } def
- /ToPSSpace {
- 4 array copy dup 0 /Separation put
- } def
- end def
-end def
-/isoverprint {
- /currentoverprint where {pop currentoverprint}{_of} ifelse
-} def
-/version_ge_3010.106 {
- version {cvr} stopped {
- pop
- false
- }{
- 3010.106 ge
- } ifelse
-} def
-end
-end
-defaultpacking setpacking
-%%EndResource
-%%EndProlog
-%%BeginSetup
-%%IncludeFont: Formata-Bold
-%%IncludeFont: Helvetica
-userdict /_useSmoothShade false put
-userdict /_aicmykps false put
-userdict /_forceToCMYK false put
-Adobe_level2_AI5 /initialize get exec
-Adobe_cshow /initialize get exec
-Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 Adobe_typography_AI5 /initialize get exec
-Adobe_ColorImage_AI6 /initialize get exec
-Adobe_shading_AI8 /initialize get exec
-Adobe_Illustrator_AI5 /initialize get exec
-[
-39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis
-/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute
-/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde
-/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex
-/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
-/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash
-/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef
-/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash
-/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef
-/guillemotleft/guillemotright/ellipsis/space/Agrave/Atilde/Otilde/OE/oe
-/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide
-/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright
-/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand
-/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex
-/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex
-/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla
-/hungarumlaut/ogonek/caron
-TE
-%AI55J_Tsume: None
-%AI3_BeginEncoding: _Formata-Bold Formata-Bold
-[/_Formata-Bold/Formata-Bold 0 0 1 TZ
-%AI3_EndEncoding AdobeType
-%AI55J_Tsume: None
-%AI3_BeginEncoding: _Helvetica Helvetica
-[/_Helvetica/Helvetica 0 0 1 TZ
-%AI3_EndEncoding AdobeType
-[161/degree 173/notequal 176/infinity/plusminus/lessequal/greaterequal
-181/mu/partialdiff/summation/product/pi/integral 189/Omega
-195/radical 197/approxequal 198/Delta 214/divide/lozenge 240/apple
-/_Symbol_/Symbol 0 0 0 TZ
-%AI5_Begin_NonPrinting
-Np
-%AI3_BeginPattern: (bi-direction diagonals)
-(bi-direction diagonals) 24.2119 0.2119 96.2124 72.2119 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-2 J 2 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-8.2119 6.2119 m
-14.2119 0.2119 L
-F
-8.2119 0.2119 m
-14.2119 6.2119 L
-F
-%AI6_EndPatternLayer
-) &
-(0 O 0 R 0 0 0 1 k
- 0 0 0 1 K
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-2 J 2 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-24.2119 72.2119 m
-96.2124 0.2119 L
-S
-21.2109 69.2129 m
-90.2124 0.2119 L
-S
-21.207 63.2168 m
-84.2124 0.2119 L
-S
-21.2031 57.2207 m
-78.2124 0.2119 L
-S
-21.1987 51.2246 m
-72.2124 0.2119 L
-S
-21.1958 45.2275 m
-66.2119 0.2119 L
-S
-21.1919 39.2314 m
-60.2119 0.2119 L
-S
-21.188 33.2363 m
-54.2119 0.2119 L
-S
-21.1851 27.2402 m
-48.2119 0.2119 L
-S
-21.1812 21.2432 m
-42.2119 0.2119 L
-S
-21.1768 15.2471 m
-36.2119 0.2119 L
-S
-21.1729 9.251 m
-30.2119 0.2119 L
-S
-21.1699 3.2549 m
-24.2119 0.2119 L
-S
-30.2119 72.2119 m
-99.2134 3.21 L
-S
-36.2119 72.2119 m
-99.2173 9.2061 L
-S
-42.2119 72.2119 m
-99.2212 15.2021 L
-S
-48.2119 72.2119 m
-99.2251 21.1992 L
-S
-54.2119 72.2119 m
-99.228 27.1953 L
-S
-60.2119 72.2119 m
-99.2319 33.1904 L
-S
-66.2119 72.2119 m
-99.2358 39.1865 L
-S
-72.2124 72.2119 m
-99.2397 45.1836 L
-S
-78.2124 72.2119 m
-99.2427 51.1797 L
-S
-84.2124 72.2119 m
-99.2466 57.1758 L
-S
-90.2124 72.2119 m
-99.2505 63.1719 L
-S
-96.2124 72.2119 m
-99.2554 69.1689 L
-S
-0.2119 68.7119 m
-10.2119 58.7119 L
-S
-96.2124 72.2119 m
-24.2119 0.2119 L
-S
-90.2124 72.2119 m
-21.2109 3.21 L
-S
-84.2124 72.2119 m
-21.207 9.2061 L
-S
-78.2124 72.2119 m
-21.2031 15.2021 L
-S
-72.2124 72.2119 m
-21.1987 21.1982 L
-S
-66.2119 72.2119 m
-21.1958 27.1953 L
-S
-60.2119 72.2119 m
-21.1919 33.1904 L
-S
-54.2119 72.2119 m
-21.188 39.1865 L
-S
-48.2119 72.2119 m
-21.1851 45.1826 L
-S
-42.2119 72.2119 m
-21.1812 51.1797 L
-S
-36.2119 72.2119 m
-21.1768 57.1758 L
-S
-30.2119 72.2119 m
-21.1729 63.1719 L
-S
-24.2119 72.2119 m
-21.1699 69.168 L
-S
-99.2134 69.2129 m
-30.2119 0.2119 L
-S
-99.2173 63.2168 m
-36.2119 0.2119 L
-S
-99.2212 57.2207 m
-42.2119 0.2119 L
-S
-99.2251 51.2246 m
-48.2119 0.2119 L
-S
-99.228 45.2275 m
-54.2119 0.2119 L
-S
-99.2319 39.2314 m
-60.2119 0.2119 L
-S
-99.2358 33.2363 m
-66.2119 0.2119 L
-S
-99.2397 27.2393 m
-72.2124 0.2119 L
-S
-99.2427 21.2432 m
-78.2124 0.2119 L
-S
-99.2466 15.2471 m
-84.2124 0.2119 L
-S
-99.2505 9.251 m
-90.2124 0.2119 L
-S
-99.2554 3.2539 m
-96.2124 0.2119 L
-S
-0.2119 58.7119 m
-10.2119 68.7119 L
-S
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI3_BeginPattern: (black dots)
-(black dots) 16 0.6885 88 72.6885 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-1 J 0 j 0.75 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-0 6.6885 m
-6 0.6885 L
-F
-0 0.6885 m
-6 6.6885 L
-F
-%AI6_EndPatternLayer
-) &
-(0 O 0 R 0 0 0 1 k
- 0 0 0 1 K
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-1 J 0 j 0.75 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-28.9365 3.1885 m
-28.9365 3.1885 l
-S
-17.125 3.375 m
-17.125 3.375 l
-S
-26.5 4.6885 m
-26.5 4.6885 l
-S
-35.6865 5.8135 m
-35.6865 5.8135 l
-S
-19.75 0.9385 m
-19.75 0.9385 l
-S
-23.125 7.3135 m
-23.125 7.3135 l
-S
-40.5615 2.4385 m
-40.5615 2.4385 l
-S
-43 1.125 m
-43 1.125 l
-S
-45.0615 5.4385 m
-45.0615 5.4385 l
-S
-56.875 6.375 m
-56.875 6.375 l
-S
-65.3115 5.0635 m
-65.3115 5.0635 l
-S
-51.0615 6.9385 m
-51.0615 6.9385 l
-S
-40.5615 6.9385 m
-40.5615 6.9385 l
-S
-31.1865 6.9385 m
-31.1865 6.9385 l
-S
-59.875 9.5635 m
-59.875 9.5635 l
-S
-62.6865 1.3135 m
-62.6865 1.3135 l
-S
-34.5615 0.9385 m
-34.5615 0.9385 l
-S
-48.4365 2.25 m
-48.4365 2.25 l
-S
-56.3115 0.75 m
-56.3115 0.75 l
-S
-66.625 24.5635 m
-66.625 24.5635 l
-S
-74.3115 24.9385 m
-74.3115 24.9385 l
-S
-78.8115 24.375 m
-78.8115 24.375 l
-S
-82.9365 2.0635 m
-82.9365 2.0635 l
-S
-68.3115 11.8135 m
-68.3115 11.8135 l
-S
-86.5 17.8135 m
-86.5 17.8135 l
-S
-87.0615 4.6885 m
-87.0615 4.6885 l
-S
-79.9365 19.875 m
-79.9365 19.875 l
-S
-77.875 1.125 m
-77.875 1.125 l
-S
-69.625 20.25 m
-69.625 20.25 l
-S
-67.75 6 m
-67.75 6 l
-S
-73.375 17.625 m
-73.375 17.625 l
-S
-76.9365 16.875 m
-76.9365 16.875 l
-S
-72.4365 3.375 m
-72.4365 3.375 l
-S
-77.3115 9.5635 m
-77.3115 9.5635 l
-S
-73.9365 11.25 m
-73.9365 11.25 l
-S
-83.125 7.875 m
-83.125 7.875 l
-S
-85.1865 12.75 m
-85.1865 12.75 l
-S
-81.0615 13.875 m
-81.0615 13.875 l
-S
-17.6865 16.125 m
-17.6865 16.125 l
-S
-45.25 10.3135 m
-45.25 10.3135 l
-S
-31.5615 21.375 m
-31.5615 21.375 l
-S
-20.875 11.8135 m
-20.875 11.8135 l
-S
-34.75 18.5635 m
-34.75 18.5635 l
-S
-25.75 21.9385 m
-25.75 21.9385 l
-S
-34.5615 24.5635 m
-34.5615 24.5635 l
-S
-37.375 16.3135 m
-37.375 16.3135 l
-S
-36.625 12.75 m
-36.625 12.75 l
-S
-23.125 17.25 m
-23.125 17.25 l
-S
-29.3115 12.375 m
-29.3115 12.375 l
-S
-31 15.75 m
-31 15.75 l
-S
-46.1865 22.875 m
-46.1865 22.875 l
-S
-52 15.375 m
-52 15.375 l
-S
-58.375 13.3135 m
-58.375 13.3135 l
-S
-62.6865 20.0635 m
-62.6865 20.0635 l
-S
-62.875 14.0635 m
-62.875 14.0635 l
-S
-44.6865 20.4385 m
-44.6865 20.4385 l
-S
-46.75 15.1885 m
-46.75 15.1885 l
-S
-42.0615 17.0635 m
-42.0615 17.0635 l
-S
-55.1865 17.4385 m
-55.1865 17.4385 l
-S
-58.9365 23.25 m
-58.9365 23.25 l
-S
-60.0615 17.4385 m
-60.0615 17.4385 l
-S
-42.4365 25.125 m
-42.4365 25.125 l
-S
-65.3115 20.625 m
-65.3115 20.625 l
-S
-51.625 24.5635 m
-51.625 24.5635 l
-S
-52 20.625 m
-52 20.625 l
-S
-18.8115 24 m
-18.8115 24 l
-S
-21.25 24.9385 m
-21.25 24.9385 l
-S
-19.375 70.875 m
-19.375 70.875 l
-S
-26.125 66.5635 m
-26.125 66.5635 l
-S
-20.125 66.375 m
-20.125 66.375 l
-S
-38.5 69 m
-38.5 69 l
-S
-47.125 71.625 m
-47.125 71.625 l
-S
-62.875 68.0635 m
-62.875 68.0635 l
-S
-49.75 67.5 m
-49.75 67.5 l
-S
-38.875 65.625 m
-38.875 65.625 l
-S
-29.3115 70.3135 m
-29.3115 70.3135 l
-S
-31.9365 67.5 m
-31.9365 67.5 l
-S
-57.25 65.4385 m
-57.25 65.4385 l
-S
-23.5 69.1885 m
-23.5 69.1885 l
-S
-45.625 65.25 m
-45.625 65.25 l
-S
-26.6865 63.9385 m
-26.6865 63.9385 l
-S
-50.5 63.75 m
-50.5 63.75 l
-S
-32.6865 72 m
-32.6865 72 l
-S
-52.9365 71.4385 m
-52.9365 71.4385 l
-S
-57.8115 69.375 m
-57.8115 69.375 l
-S
-61 64.3135 m
-61 64.3135 l
-S
-28.9365 48.1885 m
-28.9365 48.1885 l
-S
-17.125 48.375 m
-17.125 48.375 l
-S
-21.4365 42.375 m
-21.4365 42.375 l
-S
-19.375 36 m
-19.375 36 l
-S
-26.125 31.6885 m
-26.125 31.6885 l
-S
-20.125 31.5 m
-20.125 31.5 l
-S
-26.5 49.6885 m
-26.5 49.6885 l
-S
-35.6865 50.8135 m
-35.6865 50.8135 l
-S
-19.75 45.9385 m
-19.75 45.9385 l
-S
-23.125 52.3135 m
-23.125 52.3135 l
-S
-40.5615 47.4385 m
-40.5615 47.4385 l
-S
-43 46.125 m
-43 46.125 l
-S
-23.5 39.1885 m
-23.5 39.1885 l
-S
-38.5 34.125 m
-38.5 34.125 l
-S
-47.125 36.75 m
-47.125 36.75 l
-S
-45.0615 50.4385 m
-45.0615 50.4385 l
-S
-56.875 51.375 m
-56.875 51.375 l
-S
-42.8115 39.375 m
-42.8115 39.375 l
-S
-62.875 33.1885 m
-62.875 33.1885 l
-S
-49.75 32.625 m
-49.75 32.625 l
-S
-38.875 30.75 m
-38.875 30.75 l
-S
-29.3115 35.4385 m
-29.3115 35.4385 l
-S
-31.9365 32.625 m
-31.9365 32.625 l
-S
-54.75 30.1885 m
-54.75 30.1885 l
-S
-64.9365 39.75 m
-64.9365 39.75 l
-S
-46.1865 41.8135 m
-46.1865 41.8135 l
-S
-65.3115 50.0635 m
-65.3115 50.0635 l
-S
-51.0615 51.9385 m
-51.0615 51.9385 l
-S
-23.5 34.3135 m
-23.5 34.3135 l
-S
-40.5615 51.9385 m
-40.5615 51.9385 l
-S
-31.1865 51.9385 m
-31.1865 51.9385 l
-S
-45.625 30.375 m
-45.625 30.375 l
-S
-26.6865 29.0635 m
-26.6865 29.0635 l
-S
-59.875 54.5635 m
-59.875 54.5635 l
-S
-50.5 28.875 m
-50.5 28.875 l
-S
-60.75 47.6885 m
-60.75 47.6885 l
-S
-30.625 42.75 m
-30.625 42.75 l
-S
-26.6865 42.375 m
-26.6865 42.375 l
-S
-36.8115 40.125 m
-36.8115 40.125 l
-S
-37.75 43.5 m
-37.75 43.5 l
-S
-34.5615 45.9385 m
-34.5615 45.9385 l
-S
-32.6865 37.125 m
-32.6865 37.125 l
-S
-61.9365 42.75 m
-61.9365 42.75 l
-S
-48.4365 47.25 m
-48.4365 47.25 l
-S
-54.625 42.375 m
-54.625 42.375 l
-S
-56.3115 45.75 m
-56.3115 45.75 l
-S
-52.9365 36.5635 m
-52.9365 36.5635 l
-S
-57.8115 34.5 m
-57.8115 34.5 l
-S
-58.9365 38.625 m
-58.9365 38.625 l
-S
-61 29.4385 m
-61 29.4385 l
-S
-65.875 29.625 m
-65.875 29.625 l
-S
-70.5615 27.75 m
-70.5615 27.75 l
-S
-71.5 52.875 m
-71.5 52.875 l
-S
-69.8115 34.3135 m
-69.8115 34.3135 l
-S
-76.375 27.375 m
-76.375 27.375 l
-S
-71.3115 41.0635 m
-71.3115 41.0635 l
-S
-77.3115 45.375 m
-77.3115 45.375 l
-S
-82 28.6885 m
-82 28.6885 l
-S
-88.1865 27.5635 m
-88.1865 27.5635 l
-S
-83.6865 43.3135 m
-83.6865 43.3135 l
-S
-88 50.0635 m
-88 50.0635 l
-S
-88.1865 44.0635 m
-88.1865 44.0635 l
-S
-88.1865 33.1885 m
-88.1865 33.1885 l
-S
-70 50.4385 m
-70 50.4385 l
-S
-68.875 59.625 m
-68.875 59.625 l
-S
-66.8115 38.25 m
-66.8115 38.25 l
-S
-74.75 42.1885 m
-74.75 42.1885 l
-S
-67.375 47.0635 m
-67.375 47.0635 l
-S
-72.25 64.5 m
-72.25 64.5 l
-S
-73.5615 66.9385 m
-73.5615 66.9385 l
-S
-80.5 47.4385 m
-80.5 47.4385 l
-S
-85.5615 62.4385 m
-85.5615 62.4385 l
-S
-82.9365 71.0635 m
-82.9365 71.0635 l
-S
-69.25 69 m
-69.25 69 l
-S
-80.3115 66.75 m
-80.3115 66.75 l
-S
-84.25 53.25 m
-84.25 53.25 l
-S
-87.0615 55.875 m
-87.0615 55.875 l
-S
-77.875 70.125 m
-77.875 70.125 l
-S
-85.375 47.4385 m
-85.375 47.4385 l
-S
-67.75 64.5 m
-67.75 64.5 l
-S
-67.75 55.125 m
-67.75 55.125 l
-S
-81.625 31.125 m
-81.625 31.125 l
-S
-79.375 39 m
-79.375 39 l
-S
-75.8115 33 m
-75.8115 33 l
-S
-84.4365 37.3135 m
-84.4365 37.3135 l
-S
-76.9365 54.5635 m
-76.9365 54.5635 l
-S
-77.3115 50.625 m
-77.3115 50.625 l
-S
-79.5615 60.75 m
-79.5615 60.75 l
-S
-76.1865 61.6885 m
-76.1865 61.6885 l
-S
-73.75 58.5 m
-73.75 58.5 l
-S
-82.5615 56.625 m
-82.5615 56.625 l
-S
-72.4365 72.375 m
-72.4365 72.375 l
-S
-61.75 25.875 m
-61.75 25.875 l
-S
-57.25 26.625 m
-57.25 26.625 l
-S
-25.75 60.75 m
-25.75 60.75 l
-S
-34.1865 59.4385 m
-34.1865 59.4385 l
-S
-19.9365 61.3135 m
-19.9365 61.3135 l
-S
-31.5615 55.6885 m
-31.5615 55.6885 l
-S
-17.3115 56.625 m
-17.3115 56.625 l
-S
-25.1865 55.125 m
-25.1865 55.125 l
-S
-40.375 62.25 m
-40.375 62.25 l
-S
-46.1865 54.75 m
-46.1865 54.75 l
-S
-56.875 59.4385 m
-56.875 59.4385 l
-S
-40.25 58.1885 m
-40.25 58.1885 l
-S
-36.25 56.4385 m
-36.25 56.4385 l
-S
-49.375 56.8135 m
-49.375 56.8135 l
-S
-53.125 62.625 m
-53.125 62.625 l
-S
-54.25 56.8135 m
-54.25 56.8135 l
-S
-59.5 60 m
-59.5 60 l
-S
-46.1865 60 m
-46.1865 60 l
-S
-30.8115 28.5 m
-30.8115 28.5 l
-S
-19.75 72.9385 m
-19.75 72.9385 l
-S
-43 73.125 m
-43 73.125 l
-S
-34.5615 72.9385 m
-34.5615 72.9385 l
-S
-56.3115 72.75 m
-56.3115 72.75 l
-S
-77.875 73.125 m
-77.875 73.125 l
-S
-72.4365 0.375 m
-72.4365 0.375 l
-S
-16.1865 27.5635 m
-16.1865 27.5635 l
-S
-16 50.0635 m
-16 50.0635 l
-S
-16.1865 44.0635 m
-16.1865 44.0635 l
-S
-16.1865 33.1885 m
-16.1865 33.1885 l
-S
-6 62.3135 m
-6.208 62.3135 6.375 62.4805 6.375 62.6885 c
-6.375 62.8945 6.208 63.0635 6 63.0635 c
-5.793 63.0635 5.625 62.8945 5.625 62.6885 c
-5.625 62.4805 5.793 62.3135 6 62.3135 c
-s
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI3_BeginPattern: (horizontal rules)
-(horizontal rules) 16 0 88 73.9463 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-2 J 0 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-0 6 m
-6 0 L
-F
-0 0 m
-6 6 L
-F
-%AI6_EndPatternLayer
-) &
-(0 O 0 R 0 0 0 1 k
- 0 0 0 1 K
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-2 J 0 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-88 72.9727 m
-16 72.9727 l
-S
-88 71.0273 m
-16 71.0273 L
-S
-88 67.1357 m
-16 67.1357 L
-S
-88 65.1904 m
-16 65.1904 L
-S
-88 63.2441 m
-16 63.2441 L
-S
-88 61.2979 m
-16 61.2979 L
-S
-88 57.4072 m
-16 57.4072 L
-S
-88 55.4609 m
-16 55.4609 L
-S
-88 53.5156 m
-16 53.5156 L
-S
-88 51.5703 m
-16 51.5703 L
-S
-88 49.624 m
-16 49.624 L
-S
-88 47.6787 m
-16 47.6787 L
-S
-88 45.7334 m
-16 45.7334 L
-S
-88 43.7871 m
-16 43.7871 L
-S
-88 39.8965 m
-16 39.8965 L
-S
-88 37.9502 m
-16 37.9502 L
-S
-88 36.0049 m
-16 36.0049 L
-S
-88 34.0586 m
-16 34.0586 L
-S
-88 32.1133 m
-16 32.1133 L
-S
-88 30.168 m
-16 30.168 L
-S
-88 26.2764 m
-16 26.2764 L
-S
-88 22.3848 m
-16 22.3848 L
-S
-88 20.4395 m
-16 20.4395 L
-S
-88 18.4941 m
-16 18.4941 L
-S
-88 16.5479 m
-16 16.5479 L
-S
-88 14.6016 m
-16 14.6016 L
-S
-88 12.6572 m
-16 12.6572 L
-S
-88 8.7646 m
-16 8.7646 L
-S
-88 6.8193 m
-16 6.8193 L
-S
-88 4.874 m
-16 4.874 L
-S
-88 0.9727 m
-16 0.9727 l
-S
-88 2.9277 m
-16 2.9277 L
-S
-88 69.0811 m
-16 69.0811 L
-S
-88 59.3525 m
-16 59.3525 L
-S
-88 41.8418 m
-16 41.8418 L
-S
-88 28.2217 m
-16 28.2217 L
-S
-88 24.3311 m
-16 24.3311 L
-S
-88 10.7109 m
-16 10.7109 L
-S
-6 69.0811 m
-2 69.0811 l
-S
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI3_BeginPattern: (one direction diagonals)
-(one direction diagonals) 28.856 4.6211 100.855 76.6211 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-0 J 2 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-5.106 10.6211 m
-11.106 4.6211 L
-F
-5.106 4.6211 m
-11.106 10.6211 L
-F
-%AI6_EndPatternLayer
-) &
-(0 O 0 R 0 0 0 1 k
- 0 0 0 1 K
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-0 J 1 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-21.3716 66.1055 m
-39.3706 84.1055 l
-S
-21.3716 60.1055 m
-45.3706 84.1055 l
-S
-21.3716 54.1055 m
-51.3706 84.1055 l
-S
-21.3716 48.1055 m
-57.3706 84.1055 l
-S
-21.3716 42.1055 m
-63.3706 84.1055 l
-S
-21.3716 36.1055 m
-69.3706 84.1055 l
-S
-21.3716 30.1055 m
-75.3706 84.1055 l
-S
-21.3716 24.1055 m
-81.3706 84.1055 l
-S
-21.3716 18.1055 m
-87.3706 84.1055 l
-S
-21.3716 12.1055 m
-93.3706 84.1055 l
-S
-21.3716 6.1055 m
-99.3706 84.1055 l
-S
-21.3716 0.1064 m
-105.3706 84.1055 l
-S
-27.3716 0.1064 m
-105.3706 78.1055 l
-S
-33.3706 0.1064 m
-105.3706 72.1055 l
-S
-39.3706 0.1064 m
-105.3706 66.1055 l
-S
-45.3706 0.1064 m
-105.3706 60.1055 l
-S
-51.3706 0.1064 m
-105.3706 54.1055 l
-S
-57.3706 0.1064 m
-105.3706 48.1055 l
-S
-63.3706 0.1064 m
-105.3706 42.1055 l
-S
-69.3706 0.1064 m
-105.3706 36.1055 l
-S
-75.3706 0.1064 m
-105.3706 30.1055 l
-S
-81.3706 0.1064 m
-105.3706 24.1055 l
-S
-87.3706 0.1064 m
-105.3706 18.1055 l
-S
-93.3706 0.1064 m
-105.3706 12.1055 l
-S
-2 j
-0.106 63.1211 m
-10.106 73.1211 L
-S
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI3_BeginPattern: (white dots)
-(white dots) 0.375 0.6885 72.375 72.6885 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-1 J 0 j 0.75 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-13.3115 3.1885 m
-13.3115 3.1885 l
-S
-1.5 3.375 m
-1.5 3.375 l
-S
-10.875 4.6885 m
-10.875 4.6885 l
-S
-20.0615 5.8135 m
-20.0615 5.8135 l
-S
-4.125 0.9385 m
-4.125 0.9385 l
-S
-7.5 7.3135 m
-7.5 7.3135 l
-S
-24.9365 2.4385 m
-24.9365 2.4385 l
-S
-27.375 1.125 m
-27.375 1.125 l
-S
-29.4365 5.4385 m
-29.4365 5.4385 l
-S
-41.25 6.375 m
-41.25 6.375 l
-S
-49.6865 5.0635 m
-49.6865 5.0635 l
-S
-35.4365 6.9385 m
-35.4365 6.9385 l
-S
-24.9365 6.9385 m
-24.9365 6.9385 l
-S
-15.5615 6.9385 m
-15.5615 6.9385 l
-S
-44.25 9.5635 m
-44.25 9.5635 l
-S
-47.0615 1.3135 m
-47.0615 1.3135 l
-S
-18.9365 0.9385 m
-18.9365 0.9385 l
-S
-32.8115 2.25 m
-32.8115 2.25 l
-S
-40.6865 0.75 m
-40.6865 0.75 l
-S
-51 24.5635 m
-51 24.5635 l
-S
-58.6865 24.9385 m
-58.6865 24.9385 l
-S
-63.1865 24.375 m
-63.1865 24.375 l
-S
-67.3115 2.0635 m
-67.3115 2.0635 l
-S
-52.6865 11.8135 m
-52.6865 11.8135 l
-S
-70.875 17.8135 m
-70.875 17.8135 l
-S
-71.4365 4.6885 m
-71.4365 4.6885 l
-S
-64.3115 19.875 m
-64.3115 19.875 l
-S
-62.25 1.125 m
-62.25 1.125 l
-S
-54 20.25 m
-54 20.25 l
-S
-52.125 6 m
-52.125 6 l
-S
-57.75 17.625 m
-57.75 17.625 l
-S
-61.3115 16.875 m
-61.3115 16.875 l
-S
-56.8115 3.375 m
-56.8115 3.375 l
-S
-61.6865 9.5635 m
-61.6865 9.5635 l
-S
-58.3115 11.25 m
-58.3115 11.25 l
-S
-67.5 7.875 m
-67.5 7.875 l
-S
-69.5615 12.75 m
-69.5615 12.75 l
-S
-65.4365 13.875 m
-65.4365 13.875 l
-S
-2.0615 16.125 m
-2.0615 16.125 l
-S
-29.625 10.3135 m
-29.625 10.3135 l
-S
-15.9365 21.375 m
-15.9365 21.375 l
-S
-5.25 11.8135 m
-5.25 11.8135 l
-S
-19.125 18.5635 m
-19.125 18.5635 l
-S
-10.125 21.9385 m
-10.125 21.9385 l
-S
-18.9365 24.5635 m
-18.9365 24.5635 l
-S
-21.75 16.3135 m
-21.75 16.3135 l
-S
-21 12.75 m
-21 12.75 l
-S
-7.5 17.25 m
-7.5 17.25 l
-S
-13.6865 12.375 m
-13.6865 12.375 l
-S
-15.375 15.75 m
-15.375 15.75 l
-S
-30.5615 22.875 m
-30.5615 22.875 l
-S
-36.375 15.375 m
-36.375 15.375 l
-S
-42.75 13.3135 m
-42.75 13.3135 l
-S
-47.0615 20.0635 m
-47.0615 20.0635 l
-S
-47.25 14.0635 m
-47.25 14.0635 l
-S
-29.0615 20.4385 m
-29.0615 20.4385 l
-S
-31.125 15.1885 m
-31.125 15.1885 l
-S
-26.4365 17.0635 m
-26.4365 17.0635 l
-S
-39.5615 17.4385 m
-39.5615 17.4385 l
-S
-43.3115 23.25 m
-43.3115 23.25 l
-S
-44.4365 17.4385 m
-44.4365 17.4385 l
-S
-26.8115 25.125 m
-26.8115 25.125 l
-S
-49.6865 20.625 m
-49.6865 20.625 l
-S
-36 24.5635 m
-36 24.5635 l
-S
-36.375 20.625 m
-36.375 20.625 l
-S
-3.1865 24 m
-3.1865 24 l
-S
-5.625 24.9385 m
-5.625 24.9385 l
-S
-3.75 70.875 m
-3.75 70.875 l
-S
-10.5 66.5635 m
-10.5 66.5635 l
-S
-4.5 66.375 m
-4.5 66.375 l
-S
-22.875 69 m
-22.875 69 l
-S
-31.5 71.625 m
-31.5 71.625 l
-S
-47.25 68.0635 m
-47.25 68.0635 l
-S
-34.125 67.5 m
-34.125 67.5 l
-S
-23.25 65.625 m
-23.25 65.625 l
-S
-13.6865 70.3135 m
-13.6865 70.3135 l
-S
-16.3115 67.5 m
-16.3115 67.5 l
-S
-41.625 65.4385 m
-41.625 65.4385 l
-S
-7.875 69.1885 m
-7.875 69.1885 l
-S
-30 65.25 m
-30 65.25 l
-S
-11.0615 63.9385 m
-11.0615 63.9385 l
-S
-34.875 63.75 m
-34.875 63.75 l
-S
-17.0615 72 m
-17.0615 72 l
-S
-37.3115 71.4385 m
-37.3115 71.4385 l
-S
-42.1865 69.375 m
-42.1865 69.375 l
-S
-45.375 64.3135 m
-45.375 64.3135 l
-S
-13.3115 48.1885 m
-13.3115 48.1885 l
-S
-1.5 48.375 m
-1.5 48.375 l
-S
-5.8115 42.375 m
-5.8115 42.375 l
-S
-3.75 36 m
-3.75 36 l
-S
-10.5 31.6885 m
-10.5 31.6885 l
-S
-4.5 31.5 m
-4.5 31.5 l
-S
-10.875 49.6885 m
-10.875 49.6885 l
-S
-20.0615 50.8135 m
-20.0615 50.8135 l
-S
-4.125 45.9385 m
-4.125 45.9385 l
-S
-7.5 52.3135 m
-7.5 52.3135 l
-S
-24.9365 47.4385 m
-24.9365 47.4385 l
-S
-27.375 46.125 m
-27.375 46.125 l
-S
-7.875 39.1885 m
-7.875 39.1885 l
-S
-22.875 34.125 m
-22.875 34.125 l
-S
-31.5 36.75 m
-31.5 36.75 l
-S
-29.4365 50.4385 m
-29.4365 50.4385 l
-S
-41.25 51.375 m
-41.25 51.375 l
-S
-27.1865 39.375 m
-27.1865 39.375 l
-S
-47.25 33.1885 m
-47.25 33.1885 l
-S
-34.125 32.625 m
-34.125 32.625 l
-S
-23.25 30.75 m
-23.25 30.75 l
-S
-13.6865 35.4385 m
-13.6865 35.4385 l
-S
-16.3115 32.625 m
-16.3115 32.625 l
-S
-39.125 30.1885 m
-39.125 30.1885 l
-S
-49.3115 39.75 m
-49.3115 39.75 l
-S
-30.5615 41.8135 m
-30.5615 41.8135 l
-S
-49.6865 50.0635 m
-49.6865 50.0635 l
-S
-35.4365 51.9385 m
-35.4365 51.9385 l
-S
-7.875 34.3135 m
-7.875 34.3135 l
-S
-24.9365 51.9385 m
-24.9365 51.9385 l
-S
-15.5615 51.9385 m
-15.5615 51.9385 l
-S
-30 30.375 m
-30 30.375 l
-S
-11.0615 29.0635 m
-11.0615 29.0635 l
-S
-44.25 54.5635 m
-44.25 54.5635 l
-S
-34.875 28.875 m
-34.875 28.875 l
-S
-45.125 47.6885 m
-45.125 47.6885 l
-S
-15 42.75 m
-15 42.75 l
-S
-11.0615 42.375 m
-11.0615 42.375 l
-S
-21.1865 40.125 m
-21.1865 40.125 l
-S
-22.125 43.5 m
-22.125 43.5 l
-S
-18.9365 45.9385 m
-18.9365 45.9385 l
-S
-17.0615 37.125 m
-17.0615 37.125 l
-S
-46.3115 42.75 m
-46.3115 42.75 l
-S
-32.8115 47.25 m
-32.8115 47.25 l
-S
-39 42.375 m
-39 42.375 l
-S
-40.6865 45.75 m
-40.6865 45.75 l
-S
-37.3115 36.5635 m
-37.3115 36.5635 l
-S
-42.1865 34.5 m
-42.1865 34.5 l
-S
-43.3115 38.625 m
-43.3115 38.625 l
-S
-45.375 29.4385 m
-45.375 29.4385 l
-S
-50.25 29.625 m
-50.25 29.625 l
-S
-54.9365 27.75 m
-54.9365 27.75 l
-S
-55.875 52.875 m
-55.875 52.875 l
-S
-54.1865 34.3135 m
-54.1865 34.3135 l
-S
-60.75 27.375 m
-60.75 27.375 l
-S
-55.6865 41.0635 m
-55.6865 41.0635 l
-S
-61.6865 45.375 m
-61.6865 45.375 l
-S
-66.375 28.6885 m
-66.375 28.6885 l
-S
-72.5615 27.5635 m
-72.5615 27.5635 l
-S
-68.0615 43.3135 m
-68.0615 43.3135 l
-S
-72.375 50.0635 m
-72.375 50.0635 l
-S
-72.5615 44.0635 m
-72.5615 44.0635 l
-S
-72.5615 33.1885 m
-72.5615 33.1885 l
-S
-54.375 50.4385 m
-54.375 50.4385 l
-S
-53.25 59.625 m
-53.25 59.625 l
-S
-51.1865 38.25 m
-51.1865 38.25 l
-S
-59.125 42.1885 m
-59.125 42.1885 l
-S
-51.75 47.0635 m
-51.75 47.0635 l
-S
-56.625 64.5 m
-56.625 64.5 l
-S
-57.9365 66.9385 m
-57.9365 66.9385 l
-S
-64.875 47.4385 m
-64.875 47.4385 l
-S
-69.9365 62.4385 m
-69.9365 62.4385 l
-S
-67.3115 71.0635 m
-67.3115 71.0635 l
-S
-53.625 69 m
-53.625 69 l
-S
-64.6865 66.75 m
-64.6865 66.75 l
-S
-68.625 53.25 m
-68.625 53.25 l
-S
-71.4365 55.875 m
-71.4365 55.875 l
-S
-62.25 70.125 m
-62.25 70.125 l
-S
-69.75 47.4385 m
-69.75 47.4385 l
-S
-52.125 64.5 m
-52.125 64.5 l
-S
-52.125 55.125 m
-52.125 55.125 l
-S
-66 31.125 m
-66 31.125 l
-S
-63.75 39 m
-63.75 39 l
-S
-60.1865 33 m
-60.1865 33 l
-S
-68.8115 37.3135 m
-68.8115 37.3135 l
-S
-61.3115 54.5635 m
-61.3115 54.5635 l
-S
-61.6865 50.625 m
-61.6865 50.625 l
-S
-63.9365 60.75 m
-63.9365 60.75 l
-S
-60.5615 61.6885 m
-60.5615 61.6885 l
-S
-58.125 58.5 m
-58.125 58.5 l
-S
-66.9365 56.625 m
-66.9365 56.625 l
-S
-56.8115 72.375 m
-56.8115 72.375 l
-S
-46.125 25.875 m
-46.125 25.875 l
-S
-41.625 26.625 m
-41.625 26.625 l
-S
-10.125 60.75 m
-10.125 60.75 l
-S
-18.5615 59.4385 m
-18.5615 59.4385 l
-S
-4.3115 61.3135 m
-4.3115 61.3135 l
-S
-15.9365 55.6885 m
-15.9365 55.6885 l
-S
-1.6865 56.625 m
-1.6865 56.625 l
-S
-9.5615 55.125 m
-9.5615 55.125 l
-S
-24.75 62.25 m
-24.75 62.25 l
-S
-30.5615 54.75 m
-30.5615 54.75 l
-S
-41.25 59.4385 m
-41.25 59.4385 l
-S
-24.625 58.1885 m
-24.625 58.1885 l
-S
-20.625 56.4385 m
-20.625 56.4385 l
-S
-33.75 56.8135 m
-33.75 56.8135 l
-S
-37.5 62.625 m
-37.5 62.625 l
-S
-38.625 56.8135 m
-38.625 56.8135 l
-S
-43.875 60 m
-43.875 60 l
-S
-30.5615 60 m
-30.5615 60 l
-S
-15.1865 28.5 m
-15.1865 28.5 l
-S
-4.125 72.9385 m
-4.125 72.9385 l
-S
-27.375 73.125 m
-27.375 73.125 l
-S
-18.9365 72.9385 m
-18.9365 72.9385 l
-S
-40.6865 72.75 m
-40.6865 72.75 l
-S
-62.25 73.125 m
-62.25 73.125 l
-S
-56.8115 0.375 m
-56.8115 0.375 l
-S
-0.5615 27.5635 m
-0.5615 27.5635 l
-S
-0.375 50.0635 m
-0.375 50.0635 l
-S
-0.5615 44.0635 m
-0.5615 44.0635 l
-S
-0.5615 33.1885 m
-0.5615 33.1885 l
-S
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI5_End_NonPrinting--
-%AI5_Begin_NonPrinting
-Np
-%AI8_BeginBrushPattern
-(New Pattern 2)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7884 8586 m
--7838.1201 8586 L
--7838.1201 8500.6914 L
--7884 8500.6914 L
--7884 8586 L
-n
-u
--7850.4111 8533.3125 m
--7850.3774 8533.3086 -7850.3457 8533.3047 -7850.313 8533.3018 c
--7850.3457 8533.3047 -7850.3774 8533.3086 -7850.4111 8533.3125 c
-n
--7843.6582 8532.1602 m
--7843.647 8532.1572 -7843.6362 8532.1543 -7843.626 8532.1523 c
--7843.6362 8532.1543 -7843.647 8532.1572 -7843.6582 8532.1602 c
-n
--7870.0361 8579.5879 m
--7870.0688 8579.5859 -7870.1006 8579.584 -7870.1318 8579.5801 c
--7870.1162 8579.582 -7870.1016 8579.584 -7870.0854 8579.585 c
--7870.0703 8579.5859 -7870.0527 8579.5879 -7870.0361 8579.5879 c
-n
--7854.5366 8533.6719 m
--7854.4785 8533.668 -7854.4209 8533.6641 -7854.3599 8533.6602 c
--7854.4209 8533.6641 -7854.4785 8533.668 -7854.5366 8533.6719 c
-n
--7839.1553 8576.4043 m
--7839.0625 8576.3281 -7838.9775 8576.252 -7838.9009 8576.1758 c
--7838.5967 8575.8672 -7838.4385 8575.5469 -7838.4385 8575.2207 c
--7838.4385 8575.6289 -7838.689 8576.0254 -7839.1553 8576.4043 c
-n
--7877.3232 8578.5703 m
--7877.3247 8578.5703 -7877.3281 8578.5693 -7877.3311 8578.5684 c
--7877.3306 8578.5693 -7877.3281 8578.5693 -7877.3271 8578.5703 c
--7877.3247 8578.5703 -7877.3247 8578.5703 -7877.3232 8578.5703 c
-n
--7882.21 8577.0645 m
--7882.21 8577.0645 L
--7882.21 8577.0645 L
--7882.21 8577.0645 L
-n
--7858.9209 8533.8545 m
--7858.8994 8533.8545 -7858.8774 8533.8535 -7858.856 8533.8535 c
--7858.8774 8533.8535 -7858.8994 8533.8545 -7858.9209 8533.8545 c
-n
--7863.582 8533.8535 m
--7863.5601 8533.8535 -7863.5391 8533.8545 -7863.5166 8533.8545 c
--7863.5391 8533.8545 -7863.5601 8533.8535 -7863.582 8533.8535 c
-n
--7865.667 8533.7881 m
--7865.7642 8533.7842 -7865.8594 8533.7793 -7865.9561 8533.7754 c
--7865.9058 8533.7773 -7865.8608 8533.7813 -7865.8096 8533.7832 c
--7865.7642 8533.7852 -7865.7134 8533.7861 -7865.667 8533.7881 c
-n
--7884 8529.1426 m
--7884 8529.3066 -7883.96 8529.4688 -7883.8818 8529.627 c
--7883.96 8529.4688 -7884 8529.3066 -7884 8529.1426 c
-n
--7868.0718 8533.6602 m
--7868.0166 8533.6641 -7867.9609 8533.668 -7867.9038 8533.6709 c
--7867.9609 8533.668 -7868.0166 8533.6641 -7868.0718 8533.6602 c
-n
--7878.811 8532.1523 m
--7878.8018 8532.1543 -7878.792 8532.1572 -7878.7822 8532.1592 c
--7878.792 8532.1572 -7878.8018 8532.1543 -7878.811 8532.1523 c
-n
--7872.1201 8533.3027 m
--7872.0898 8533.3057 -7872.0615 8533.3086 -7872.0322 8533.3125 c
--7872.0615 8533.3086 -7872.0898 8533.3057 -7872.1201 8533.3027 c
-n
--7838.4385 8529.1426 m
--7838.4385 8529.3887 -7838.5278 8529.6289 -7838.7002 8529.8643 c
--7838.5278 8529.6289 -7838.4385 8529.3887 -7838.4385 8529.1426 c
-n
--7839.0342 8530.2168 m
--7839.332 8530.4844 -7839.731 8530.7432 -7840.2358 8530.9902 c
--7840.2334 8530.9893 -7840.231 8530.9883 -7840.229 8530.9863 c
--7839.7271 8530.7402 -7839.3311 8530.4834 -7839.0342 8530.2168 c
-n
--7841.187 8531.4004 m
--7841.187 8531.4004 L
--7841.187 8531.4004 L
-n
--7884 8575.2207 m
--7884 8575.5 -7883.876 8575.7754 -7883.6514 8576.042 c
--7883.876 8575.7754 -7884 8575.501 -7884 8575.2207 c
-n
--7856.4824 8533.7754 m
--7856.5791 8533.7793 -7856.6758 8533.7842 -7856.7729 8533.7881 c
--7856.7246 8533.7861 -7856.6758 8533.7852 -7856.6279 8533.7832 c
--7856.5791 8533.7813 -7856.5313 8533.7773 -7856.4824 8533.7754 c
-n
--7872.0942 8579.3828 m
--7872.083 8579.3848 -7872.0698 8579.3867 -7872.0562 8579.3877 c
--7872.0698 8579.3867 -7872.083 8579.3848 -7872.0942 8579.3828 c
-n
--7882.2026 8530.9902 m
--7882.46 8530.8633 -7882.687 8530.7344 -7882.8936 8530.6016 c
--7882.6904 8530.7324 -7882.4639 8530.8613 -7882.21 8530.9863 c
--7882.208 8530.9883 -7882.2041 8530.9893 -7882.2026 8530.9902 c
-n
--7854.4766 8579.7461 m
--7854.4561 8579.7441 -7854.4346 8579.7432 -7854.4146 8579.7422 c
--7854.4346 8579.7432 -7854.4561 8579.7441 -7854.4766 8579.7461 c
-n
--7840.229 8577.0645 m
--7840.229 8577.0645 L
--7840.229 8577.0645 L
--7840.229 8577.0645 L
-n
--7852.2998 8579.5801 m
--7852.335 8579.583 -7852.3706 8579.5859 -7852.4072 8579.5898 c
--7852.3882 8579.5879 -7852.3706 8579.5869 -7852.3521 8579.585 c
--7852.334 8579.584 -7852.3174 8579.582 -7852.2998 8579.5801 c
-n
--7856.5601 8579.8574 m
--7856.6055 8579.8594 -7856.6514 8579.8613 -7856.6958 8579.8633 c
--7856.6738 8579.8623 -7856.6494 8579.8613 -7856.6279 8579.8613 c
--7856.6055 8579.8604 -7856.583 8579.8584 -7856.5601 8579.8574 c
-n
--7868.0186 8579.7422 m
--7868.001 8579.7432 -7867.9834 8579.7441 -7867.9658 8579.7461 c
--7867.9834 8579.7441 -7868.001 8579.7432 -7868.0186 8579.7422 c
-n
--7850.3882 8579.3887 m
--7850.3706 8579.3867 -7850.3535 8579.3848 -7850.3369 8579.3828 c
--7850.3535 8579.3848 -7850.3706 8579.3867 -7850.3882 8579.3887 c
-n
--7865.7422 8579.8633 m
--7865.7881 8579.8613 -7865.833 8579.8594 -7865.8774 8579.8574 c
--7865.8545 8579.8584 -7865.833 8579.8604 -7865.8096 8579.8613 c
--7865.7881 8579.8613 -7865.7646 8579.8623 -7865.7422 8579.8633 c
-n
-0 O
-0.8 g
--7839.1553 8576.4043 m
--7839.437 8576.6309 -7839.7959 8576.8516 -7840.229 8577.0645 C
--7840.229 8577.0645 L
--7840.229 8577.0645 L
--7842.2422 8578.0547 -7845.8286 8578.8721 -7850.3369 8579.3828 c
--7850.3535 8579.3848 -7850.3706 8579.3867 -7850.3882 8579.3887 c
--7851.0088 8579.458 -7851.6465 8579.5215 -7852.2998 8579.5801 c
--7852.3174 8579.582 -7852.334 8579.584 -7852.3521 8579.585 c
--7852.3706 8579.5869 -7852.3882 8579.5879 -7852.4072 8579.5898 c
--7853.0615 8579.6465 -7853.7305 8579.6973 -7854.4146 8579.7422 c
--7854.4346 8579.7432 -7854.4561 8579.7441 -7854.4766 8579.7461 c
--7855.1567 8579.79 -7855.853 8579.8262 -7856.5601 8579.8574 c
--7856.583 8579.8584 -7856.6055 8579.8604 -7856.6279 8579.8613 c
--7856.6494 8579.8613 -7856.6738 8579.8623 -7856.6958 8579.8633 c
--7858.1567 8579.9238 -7859.6694 8579.957 -7861.2202 8579.957 c
--7862.769 8579.957 -7864.2798 8579.9238 -7865.7422 8579.8633 c
--7865.7646 8579.8623 -7865.7881 8579.8613 -7865.8096 8579.8613 c
--7865.833 8579.8604 -7865.8545 8579.8584 -7865.8774 8579.8574 c
--7866.5854 8579.8262 -7867.2832 8579.7891 -7867.9658 8579.7461 c
--7867.9834 8579.7441 -7868.001 8579.7432 -7868.0186 8579.7422 c
--7868.7065 8579.6973 -7869.3799 8579.6465 -7870.0361 8579.5879 c
--7870.0527 8579.5879 -7870.0703 8579.5859 -7870.0854 8579.585 c
--7870.1016 8579.584 -7870.1162 8579.582 -7870.1318 8579.5801 c
--7870.7886 8579.5225 -7871.4321 8579.458 -7872.0562 8579.3877 c
--7872.0698 8579.3867 -7872.083 8579.3848 -7872.0942 8579.3828 c
--7874.0234 8579.165 -7875.7832 8578.8906 -7877.3232 8578.5703 c
--7877.3247 8578.5703 -7877.3247 8578.5703 -7877.3271 8578.5703 c
--7877.3281 8578.5693 -7877.3306 8578.5693 -7877.3311 8578.5684 c
--7879.3896 8578.1406 -7881.0576 8577.6309 -7882.21 8577.0645 C
--7882.21 8577.0645 L
--7882.21 8577.0645 L
--7882.8682 8576.7402 -7883.353 8576.3984 -7883.6514 8576.042 c
--7883.876 8575.7754 -7884 8575.5 -7884 8575.2207 C
--7884 8581.2637 L
--7884 8581.5908 -7883.8408 8581.9102 -7883.5361 8582.2188 c
--7883.2334 8582.5273 -7882.7866 8582.8242 -7882.21 8583.1074 c
--7881.6328 8583.3906 -7880.9287 8583.6602 -7880.1089 8583.9121 c
--7879.29 8584.1641 -7878.3584 8584.3984 -7877.3271 8584.6133 c
--7876.2959 8584.8281 -7875.168 8585.0215 -7873.9561 8585.1914 c
--7872.7432 8585.3623 -7871.4497 8585.5088 -7870.0854 8585.6279 c
--7868.7231 8585.749 -7867.293 8585.8418 -7865.8096 8585.9043 c
--7864.3271 8585.9668 -7862.792 8586 -7861.2202 8586 c
--7859.6465 8586 -7858.1104 8585.9668 -7856.6279 8585.9043 c
--7855.145 8585.8418 -7853.7134 8585.749 -7852.3521 8585.6279 c
--7850.9897 8585.5088 -7849.6934 8585.3623 -7848.4814 8585.1914 c
--7847.2695 8585.0215 -7846.1416 8584.8281 -7845.1104 8584.6133 c
--7844.0801 8584.3984 -7843.147 8584.1641 -7842.3286 8583.9121 c
--7841.5103 8583.6602 -7840.8042 8583.3906 -7840.229 8583.1074 c
--7839.6514 8582.8242 -7839.2041 8582.5273 -7838.9009 8582.2188 c
--7838.5967 8581.9102 -7838.4385 8581.5908 -7838.4385 8581.2637 C
--7838.4385 8575.2207 L
--7838.4385 8575.5469 -7838.5967 8575.8672 -7838.9009 8576.1758 c
--7838.9775 8576.252 -7839.0625 8576.3281 -7839.1553 8576.4043 c
-f
-0.5 g
--7848.209 8572.2383 m
--7847.9424 8572.2383 L
--7847.9424 8572.4561 -7848.041 8572.6621 -7848.209 8572.8555 C
--7848.209 8574.0039 L
--7848.209 8574.1914 -7848.2998 8574.373 -7848.4736 8574.5488 c
--7848.6455 8574.7256 -7848.9014 8574.8945 -7849.231 8575.0566 c
--7849.5615 8575.2197 -7849.9639 8575.373 -7850.4302 8575.5166 c
--7850.8984 8575.6602 -7851.4302 8575.7949 -7852.0186 8575.917 c
--7852.6079 8576.0391 -7853.2529 8576.1504 -7853.9438 8576.248 c
--7854.6377 8576.3447 -7855.376 8576.4277 -7856.1543 8576.4961 c
--7856.9326 8576.5645 -7857.749 8576.6191 -7858.5967 8576.6543 c
--7859.4438 8576.6895 -7860.3218 8576.709 -7861.2192 8576.709 c
--7862.1162 8576.709 -7862.9946 8576.6895 -7863.8408 8576.6543 c
--7864.687 8576.6191 -7865.5049 8576.5645 -7866.2822 8576.4961 c
--7867.061 8576.4277 -7867.8008 8576.3447 -7868.4927 8576.248 c
--7869.1846 8576.1504 -7869.8306 8576.0391 -7870.418 8575.917 c
--7871.0063 8575.7949 -7871.54 8575.6602 -7872.0063 8575.5166 c
--7872.4746 8575.373 -7872.8774 8575.2197 -7873.2065 8575.0566 c
--7873.5361 8574.8945 -7873.792 8574.7256 -7873.9658 8574.5488 c
--7874.1377 8574.373 -7874.2295 8574.1914 -7874.2295 8574.0039 C
--7874.2295 8572.8555 L
--7874.3975 8572.6621 -7874.4961 8572.4561 -7874.4961 8572.2383 C
--7874.2295 8572.2383 L
--7874.2295 8571.4912 L
--7874.2695 8571.4453 -7874.2974 8571.3965 -7874.3286 8571.3486 C
--7880.1768 8572.2051 -7884 8573.6191 -7884 8575.2207 c
--7884 8575.501 -7883.876 8575.7754 -7883.6514 8576.042 c
--7883.353 8576.3984 -7882.8682 8576.7402 -7882.21 8577.0645 C
--7882.21 8577.0645 L
--7881.0576 8577.6309 -7879.3896 8578.1406 -7877.3311 8578.5684 c
--7877.3281 8578.5693 -7877.3247 8578.5703 -7877.3232 8578.5703 c
--7875.7832 8578.8906 -7874.0234 8579.165 -7872.0942 8579.3828 c
--7872.083 8579.3848 -7872.0698 8579.3867 -7872.0562 8579.3877 c
--7871.4321 8579.458 -7870.7886 8579.5225 -7870.1318 8579.5801 c
--7870.1006 8579.584 -7870.0688 8579.5859 -7870.0361 8579.5879 c
--7869.3799 8579.6465 -7868.7065 8579.6973 -7868.0186 8579.7422 c
--7868.001 8579.7432 -7867.9834 8579.7441 -7867.9658 8579.7461 c
--7867.2832 8579.7891 -7866.5854 8579.8262 -7865.8774 8579.8574 c
--7865.833 8579.8594 -7865.7881 8579.8613 -7865.7422 8579.8633 c
--7864.2798 8579.9238 -7862.769 8579.957 -7861.2202 8579.957 c
--7859.6694 8579.957 -7858.1567 8579.9238 -7856.6958 8579.8633 c
--7856.6514 8579.8613 -7856.6055 8579.8594 -7856.5601 8579.8574 c
--7855.853 8579.8262 -7855.1567 8579.79 -7854.4766 8579.7461 c
--7854.4561 8579.7441 -7854.4346 8579.7432 -7854.4146 8579.7422 c
--7853.7305 8579.6973 -7853.0615 8579.6465 -7852.4072 8579.5898 c
--7852.3706 8579.5859 -7852.335 8579.583 -7852.2998 8579.5801 c
--7851.6465 8579.5215 -7851.0088 8579.458 -7850.3882 8579.3887 c
--7850.3706 8579.3867 -7850.3535 8579.3848 -7850.3369 8579.3828 c
--7845.8286 8578.8721 -7842.2422 8578.0547 -7840.229 8577.0645 C
--7840.229 8577.0645 L
--7839.7959 8576.8516 -7839.437 8576.6309 -7839.1553 8576.4043 c
--7838.689 8576.0254 -7838.4385 8575.6289 -7838.4385 8575.2207 c
--7838.4385 8573.6191 -7842.2617 8572.2051 -7848.1104 8571.3486 C
--7848.1392 8571.3965 -7848.1689 8571.4453 -7848.209 8571.4912 C
--7848.209 8572.2383 L
-f
-0.55 g
--7861.2202 8558.7959 m
--7866.9199 8558.7959 -7872.9287 8557.9863 -7874.2295 8556.4746 C
--7874.2295 8557.2227 L
--7874.0454 8557.2227 L
--7874.0454 8558.3994 -7868.7783 8559.7109 -7861.2202 8559.7109 c
--7853.6602 8559.7109 -7848.3921 8558.3994 -7848.3921 8557.2227 C
--7848.209 8557.2227 L
--7848.209 8556.4746 L
--7849.5088 8557.9863 -7855.5166 8558.7959 -7861.2202 8558.7959 c
-f
--7861.2202 8549.2402 m
--7866.9199 8549.2402 -7872.9287 8548.4307 -7874.2295 8546.9199 C
--7874.2295 8547.666 L
--7874.0454 8547.666 L
--7874.0454 8548.8438 -7868.7783 8550.1563 -7861.2202 8550.1563 c
--7853.6602 8550.1563 -7848.3921 8548.8438 -7848.3921 8547.666 C
--7848.209 8547.666 L
--7848.209 8546.9199 L
--7849.5088 8548.4307 -7855.5166 8549.2402 -7861.2202 8549.2402 c
-f
--7861.2202 8560.1611 m
--7866.9199 8560.1611 -7872.9287 8559.3516 -7874.2295 8557.8398 C
--7874.2295 8558.5879 L
--7874.0454 8558.5879 L
--7874.0454 8559.7646 -7868.7783 8561.0762 -7861.2202 8561.0762 c
--7853.6602 8561.0762 -7848.3921 8559.7646 -7848.3921 8558.5879 C
--7848.209 8558.5879 L
--7848.209 8557.8398 L
--7849.5088 8559.3516 -7855.5166 8560.1611 -7861.2202 8560.1611 c
-f
--7861.2202 8561.5264 m
--7866.9199 8561.5264 -7872.9287 8560.7168 -7874.2295 8559.2051 C
--7874.2295 8559.9531 L
--7874.0454 8559.9531 L
--7874.0454 8561.1299 -7868.7783 8562.4414 -7861.2202 8562.4414 c
--7853.6602 8562.4414 -7848.3921 8561.1299 -7848.3921 8559.9531 C
--7848.209 8559.9531 L
--7848.209 8559.2051 L
--7849.5088 8560.7168 -7855.5166 8561.5264 -7861.2202 8561.5264 c
-f
--7861.2202 8550.6055 m
--7866.9199 8550.6055 -7872.9287 8549.7959 -7874.2295 8548.2852 C
--7874.2295 8549.0322 L
--7874.0454 8549.0322 L
--7874.0454 8550.209 -7868.7783 8551.5205 -7861.2202 8551.5205 c
--7853.6602 8551.5205 -7848.3921 8550.209 -7848.3921 8549.0322 C
--7848.209 8549.0322 L
--7848.209 8548.2852 L
--7849.5088 8549.7959 -7855.5166 8550.6055 -7861.2202 8550.6055 c
-f
--7861.2202 8554.7012 m
--7866.9199 8554.7012 -7872.9287 8553.8906 -7874.2295 8552.3789 C
--7874.2295 8553.127 L
--7874.0454 8553.127 L
--7874.0454 8554.3047 -7868.7783 8555.6162 -7861.2202 8555.6162 c
--7853.6602 8555.6162 -7848.3921 8554.3047 -7848.3921 8553.127 C
--7848.209 8553.127 L
--7848.209 8552.3789 L
--7849.5088 8553.8906 -7855.5166 8554.7012 -7861.2202 8554.7012 c
-f
--7861.2202 8557.4316 m
--7866.9199 8557.4316 -7872.9287 8556.6211 -7874.2295 8555.1104 C
--7874.2295 8555.8574 L
--7874.0454 8555.8574 L
--7874.0454 8557.0342 -7868.7783 8558.3457 -7861.2202 8558.3457 c
--7853.6602 8558.3457 -7848.3921 8557.0342 -7848.3921 8555.8574 C
--7848.209 8555.8574 L
--7848.209 8555.1104 L
--7849.5088 8556.6211 -7855.5166 8557.4316 -7861.2202 8557.4316 c
-f
--7861.2202 8553.3359 m
--7866.9199 8553.3359 -7872.9287 8552.5254 -7874.2295 8551.0146 C
--7874.2295 8551.7617 L
--7874.0454 8551.7617 L
--7874.0454 8552.9395 -7868.7783 8554.25 -7861.2202 8554.25 c
--7853.6602 8554.25 -7848.3921 8552.9395 -7848.3921 8551.7617 C
--7848.209 8551.7617 L
--7848.209 8551.0146 L
--7849.5088 8552.5254 -7855.5166 8553.3359 -7861.2202 8553.3359 c
-f
--7861.2202 8543.7803 m
--7866.9199 8543.7803 -7872.9287 8542.9707 -7874.2295 8541.459 C
--7874.2295 8542.2061 L
--7874.0454 8542.2061 L
--7874.0454 8543.3828 -7868.7783 8544.6953 -7861.2202 8544.6953 c
--7853.6602 8544.6953 -7848.3921 8543.3828 -7848.3921 8542.2061 C
--7848.209 8542.2061 L
--7848.209 8541.459 L
--7849.5088 8542.9707 -7855.5166 8543.7803 -7861.2202 8543.7803 c
-f
--7861.2202 8546.5098 m
--7866.9199 8546.5098 -7872.9287 8545.7012 -7874.2295 8544.1895 C
--7874.2295 8544.9375 L
--7874.0454 8544.9375 L
--7874.0454 8546.1133 -7868.7783 8547.4248 -7861.2202 8547.4248 c
--7853.6602 8547.4248 -7848.3921 8546.1133 -7848.3921 8544.9375 C
--7848.209 8544.9375 L
--7848.209 8544.1895 L
--7849.5088 8545.7012 -7855.5166 8546.5098 -7861.2202 8546.5098 c
-f
--7861.2202 8556.0664 m
--7866.9199 8556.0664 -7872.9287 8555.2559 -7874.2295 8553.7451 C
--7874.2295 8554.4922 L
--7874.0454 8554.4922 L
--7874.0454 8555.6689 -7868.7783 8556.9805 -7861.2202 8556.9805 c
--7853.6602 8556.9805 -7848.3921 8555.6689 -7848.3921 8554.4922 C
--7848.209 8554.4922 L
--7848.209 8553.7451 L
--7849.5088 8555.2559 -7855.5166 8556.0664 -7861.2202 8556.0664 c
-f
--7861.2202 8551.9707 m
--7866.9199 8551.9707 -7872.9287 8551.1611 -7874.2295 8549.6504 C
--7874.2295 8550.3965 L
--7874.0454 8550.3965 L
--7874.0454 8551.5742 -7868.7783 8552.8857 -7861.2202 8552.8857 c
--7853.6602 8552.8857 -7848.3921 8551.5742 -7848.3921 8550.3965 C
--7848.209 8550.3965 L
--7848.209 8549.6504 L
--7849.5088 8551.1611 -7855.5166 8551.9707 -7861.2202 8551.9707 c
-f
--7861.2202 8545.1445 m
--7866.9199 8545.1445 -7872.9287 8544.3359 -7874.2295 8542.8242 C
--7874.2295 8543.5723 L
--7874.0454 8543.5723 L
--7874.0454 8544.748 -7868.7783 8546.0605 -7861.2202 8546.0605 c
--7853.6602 8546.0605 -7848.3921 8544.748 -7848.3921 8543.5723 C
--7848.209 8543.5723 L
--7848.209 8542.8242 L
--7849.5088 8544.3359 -7855.5166 8545.1445 -7861.2202 8545.1445 c
-f
--7861.2202 8547.875 m
--7866.9199 8547.875 -7872.9287 8547.0654 -7874.2295 8545.5547 C
--7874.2295 8546.3008 L
--7874.0454 8546.3008 L
--7874.0454 8547.4785 -7868.7783 8548.791 -7861.2202 8548.791 c
--7853.6602 8548.791 -7848.3921 8547.4785 -7848.3921 8546.3008 C
--7848.209 8546.3008 L
--7848.209 8545.5547 L
--7849.5088 8547.0654 -7855.5166 8547.875 -7861.2202 8547.875 c
-f
--7861.2202 8568.3516 m
--7866.9199 8568.3516 -7872.9287 8567.543 -7874.2295 8566.0313 C
--7874.2295 8566.7783 L
--7874.0454 8566.7783 L
--7874.0454 8567.9551 -7868.7783 8569.2666 -7861.2202 8569.2666 c
--7853.6602 8569.2666 -7848.3921 8567.9551 -7848.3921 8566.7783 C
--7848.209 8566.7783 L
--7848.209 8566.0313 L
--7849.5088 8567.543 -7855.5166 8568.3516 -7861.2202 8568.3516 c
-f
--7861.2202 8572.4473 m
--7866.9199 8572.4473 -7872.9287 8571.6377 -7874.2295 8570.127 C
--7874.2295 8570.873 L
--7874.0454 8570.873 L
--7874.0454 8572.0508 -7868.7783 8573.3623 -7861.2202 8573.3623 c
--7853.6602 8573.3623 -7848.3921 8572.0508 -7848.3921 8570.873 C
--7848.209 8570.873 L
--7848.209 8570.127 L
--7849.5088 8571.6377 -7855.5166 8572.4473 -7861.2202 8572.4473 c
-f
--7861.2202 8571.082 m
--7866.9199 8571.082 -7872.9287 8570.2715 -7874.2295 8568.7607 C
--7874.2295 8569.5078 L
--7874.0454 8569.5078 L
--7874.0454 8570.6855 -7868.7783 8571.998 -7861.2202 8571.998 c
--7853.6602 8571.998 -7848.3921 8570.6855 -7848.3921 8569.5078 C
--7848.209 8569.5078 L
--7848.209 8568.7607 L
--7849.5088 8570.2715 -7855.5166 8571.082 -7861.2202 8571.082 c
-f
--7861.2202 8562.8906 m
--7866.9199 8562.8906 -7872.9287 8562.082 -7874.2295 8560.5703 C
--7874.2295 8561.3184 L
--7874.0454 8561.3184 L
--7874.0454 8562.4941 -7868.7783 8563.8066 -7861.2202 8563.8066 c
--7853.6602 8563.8066 -7848.3921 8562.4941 -7848.3921 8561.3184 C
--7848.209 8561.3184 L
--7848.209 8560.5703 L
--7849.5088 8562.082 -7855.5166 8562.8906 -7861.2202 8562.8906 c
-f
--7861.2202 8566.9863 m
--7866.9199 8566.9863 -7872.9287 8566.1768 -7874.2295 8564.666 C
--7874.2295 8565.4131 L
--7874.0454 8565.4131 L
--7874.0454 8566.5898 -7868.7783 8567.9023 -7861.2202 8567.9023 c
--7853.6602 8567.9023 -7848.3921 8566.5898 -7848.3921 8565.4131 C
--7848.209 8565.4131 L
--7848.209 8564.666 L
--7849.5088 8566.1768 -7855.5166 8566.9863 -7861.2202 8566.9863 c
-f
--7861.2202 8565.6211 m
--7866.9199 8565.6211 -7872.9287 8564.8115 -7874.2295 8563.3008 C
--7874.2295 8564.0479 L
--7874.0454 8564.0479 L
--7874.0454 8565.2246 -7868.7783 8566.5371 -7861.2202 8566.5371 c
--7853.6602 8566.5371 -7848.3921 8565.2246 -7848.3921 8564.0479 C
--7848.209 8564.0479 L
--7848.209 8563.3008 L
--7849.5088 8564.8115 -7855.5166 8565.6211 -7861.2202 8565.6211 c
-f
--7861.2202 8564.2559 m
--7866.9199 8564.2559 -7872.9287 8563.4473 -7874.2295 8561.9355 C
--7874.2295 8562.6826 L
--7874.0454 8562.6826 L
--7874.0454 8563.8594 -7868.7783 8565.1719 -7861.2202 8565.1719 c
--7853.6602 8565.1719 -7848.3921 8563.8594 -7848.3921 8562.6826 C
--7848.209 8562.6826 L
--7848.209 8561.9355 L
--7849.5088 8563.4473 -7855.5166 8564.2559 -7861.2202 8564.2559 c
-f
--7861.2202 8569.7168 m
--7866.9199 8569.7168 -7872.9287 8568.9072 -7874.2295 8567.3965 C
--7874.2295 8568.1426 L
--7874.0454 8568.1426 L
--7874.0454 8569.3203 -7868.7783 8570.6318 -7861.2202 8570.6318 c
--7853.6602 8570.6318 -7848.3921 8569.3203 -7848.3921 8568.1426 C
--7848.209 8568.1426 L
--7848.209 8567.3965 L
--7849.5088 8568.9072 -7855.5166 8569.7168 -7861.2202 8569.7168 c
-f
--7852.3521 8539.5498 m
--7853.7134 8539.6699 -7855.145 8539.7637 -7856.6279 8539.8262 c
--7858.1104 8539.8887 -7859.6465 8539.9229 -7861.2202 8539.9229 c
--7862.792 8539.9229 -7864.3271 8539.8887 -7865.8096 8539.8262 c
--7867.293 8539.7637 -7868.7231 8539.6699 -7870.0854 8539.5498 c
--7871.4497 8539.4307 -7872.7432 8539.2852 -7873.9561 8539.1143 c
--7874.0498 8539.1016 -7874.1362 8539.085 -7874.2295 8539.0713 C
--7874.2295 8539.4766 L
--7874.0454 8539.4766 L
--7874.0454 8540.6523 -7868.7783 8541.9648 -7861.2202 8541.9648 c
--7853.6602 8541.9648 -7848.3921 8540.6523 -7848.3921 8539.4766 C
--7848.209 8539.4766 L
--7848.209 8539.0723 L
--7848.3018 8539.085 -7848.3882 8539.1016 -7848.4814 8539.1143 c
--7849.6934 8539.2852 -7850.9897 8539.4307 -7852.3521 8539.5498 c
-f
--7861.2202 8542.415 m
--7866.9199 8542.415 -7872.9287 8541.6055 -7874.2295 8540.0938 C
--7874.2295 8540.8418 L
--7874.0454 8540.8418 L
--7874.0454 8542.0186 -7868.7783 8543.3301 -7861.2202 8543.3301 c
--7853.6602 8543.3301 -7848.3921 8542.0186 -7848.3921 8540.8418 C
--7848.209 8540.8418 L
--7848.209 8540.0938 L
--7849.5088 8541.6055 -7855.5166 8542.415 -7861.2202 8542.415 c
-f
--7861.2202 8575.1768 m
--7866.9199 8575.1768 -7872.9287 8574.3672 -7874.2295 8572.8555 C
--7874.2295 8574.0039 L
--7874.2295 8574.1914 -7874.1377 8574.373 -7873.9658 8574.5488 c
--7873.792 8574.7256 -7873.5361 8574.8945 -7873.2065 8575.0566 c
--7872.8774 8575.2197 -7872.4746 8575.373 -7872.0063 8575.5166 c
--7871.54 8575.6602 -7871.0063 8575.7949 -7870.418 8575.917 c
--7869.8306 8576.0391 -7869.1846 8576.1504 -7868.4927 8576.248 c
--7867.8008 8576.3447 -7867.061 8576.4277 -7866.2822 8576.4961 c
--7865.5049 8576.5645 -7864.687 8576.6191 -7863.8408 8576.6543 c
--7862.9946 8576.6895 -7862.1162 8576.709 -7861.2192 8576.709 c
--7860.3218 8576.709 -7859.4438 8576.6895 -7858.5967 8576.6543 c
--7857.749 8576.6191 -7856.9326 8576.5645 -7856.1543 8576.4961 c
--7855.376 8576.4277 -7854.6377 8576.3447 -7853.9438 8576.248 c
--7853.2529 8576.1504 -7852.6079 8576.0391 -7852.0186 8575.917 c
--7851.4302 8575.7949 -7850.8984 8575.6602 -7850.4302 8575.5166 c
--7849.9639 8575.373 -7849.5615 8575.2197 -7849.231 8575.0566 c
--7848.9014 8574.8945 -7848.6455 8574.7256 -7848.4736 8574.5488 c
--7848.2998 8574.373 -7848.209 8574.1914 -7848.209 8574.0039 C
--7848.209 8572.8555 L
--7849.5088 8574.3672 -7855.5166 8575.1768 -7861.2202 8575.1768 c
-f
--7874.0454 8572.2383 m
--7874.0454 8573.415 -7868.7783 8574.7266 -7861.2202 8574.7266 c
--7853.6602 8574.7266 -7848.3921 8573.415 -7848.3921 8572.2383 C
--7848.209 8572.2383 L
--7848.209 8571.4912 L
--7849.5088 8573.002 -7855.5166 8573.8125 -7861.2202 8573.8125 c
--7866.9199 8573.8125 -7872.9287 8573.002 -7874.2295 8571.4912 C
--7874.2295 8572.2383 L
--7874.0454 8572.2383 L
-f
-0.15 g
--7861.2202 8541.9648 m
--7868.7783 8541.9648 -7874.0454 8540.6523 -7874.0454 8539.4766 C
--7874.2295 8539.4766 L
--7874.4961 8539.4766 L
--7874.4961 8539.6943 -7874.3975 8539.8994 -7874.2295 8540.0938 c
--7872.9287 8541.6055 -7866.9199 8542.415 -7861.2202 8542.415 c
--7855.5166 8542.415 -7849.5088 8541.6055 -7848.209 8540.0938 c
--7848.041 8539.8994 -7847.9424 8539.6943 -7847.9424 8539.4766 C
--7848.209 8539.4766 L
--7848.3921 8539.4766 L
--7848.3921 8540.6523 -7853.6602 8541.9648 -7861.2202 8541.9648 c
-f
--7861.2202 8543.3301 m
--7868.7783 8543.3301 -7874.0454 8542.0186 -7874.0454 8540.8418 C
--7874.2295 8540.8418 L
--7874.4961 8540.8418 L
--7874.4961 8541.0586 -7874.3975 8541.2637 -7874.2295 8541.459 c
--7872.9287 8542.9707 -7866.9199 8543.7803 -7861.2202 8543.7803 c
--7855.5166 8543.7803 -7849.5088 8542.9707 -7848.209 8541.459 c
--7848.041 8541.2637 -7847.9424 8541.0586 -7847.9424 8540.8418 C
--7848.209 8540.8418 L
--7848.3921 8540.8418 L
--7848.3921 8542.0186 -7853.6602 8543.3301 -7861.2202 8543.3301 c
-f
--7861.2202 8544.6953 m
--7868.7783 8544.6953 -7874.0454 8543.3828 -7874.0454 8542.2061 C
--7874.2295 8542.2061 L
--7874.4961 8542.2061 L
--7874.4961 8542.4238 -7874.3975 8542.6289 -7874.2295 8542.8242 c
--7872.9287 8544.3359 -7866.9199 8545.1445 -7861.2202 8545.1445 c
--7855.5166 8545.1445 -7849.5088 8544.3359 -7848.209 8542.8242 c
--7848.041 8542.6289 -7847.9424 8542.4238 -7847.9424 8542.2061 C
--7848.209 8542.2061 L
--7848.3921 8542.2061 L
--7848.3921 8543.3828 -7853.6602 8544.6953 -7861.2202 8544.6953 c
-f
--7861.2202 8546.0605 m
--7868.7783 8546.0605 -7874.0454 8544.748 -7874.0454 8543.5723 C
--7874.2295 8543.5723 L
--7874.4961 8543.5723 L
--7874.4961 8543.79 -7874.3975 8543.9951 -7874.2295 8544.1895 c
--7872.9287 8545.7012 -7866.9199 8546.5098 -7861.2202 8546.5098 c
--7855.5166 8546.5098 -7849.5088 8545.7012 -7848.209 8544.1895 c
--7848.041 8543.9951 -7847.9424 8543.79 -7847.9424 8543.5723 C
--7848.209 8543.5723 L
--7848.3921 8543.5723 L
--7848.3921 8544.748 -7853.6602 8546.0605 -7861.2202 8546.0605 c
-f
--7861.2202 8547.4248 m
--7868.7783 8547.4248 -7874.0454 8546.1133 -7874.0454 8544.9375 C
--7874.2295 8544.9375 L
--7874.4961 8544.9375 L
--7874.4961 8545.1543 -7874.3975 8545.3594 -7874.2295 8545.5547 c
--7872.9287 8547.0654 -7866.9199 8547.875 -7861.2202 8547.875 c
--7855.5166 8547.875 -7849.5088 8547.0654 -7848.209 8545.5547 c
--7848.041 8545.3594 -7847.9424 8545.1543 -7847.9424 8544.9375 C
--7848.209 8544.9375 L
--7848.3921 8544.9375 L
--7848.3921 8546.1133 -7853.6602 8547.4248 -7861.2202 8547.4248 c
-f
--7861.2202 8548.791 m
--7868.7783 8548.791 -7874.0454 8547.4785 -7874.0454 8546.3008 C
--7874.2295 8546.3008 L
--7874.4961 8546.3008 L
--7874.4961 8546.5195 -7874.3975 8546.7246 -7874.2295 8546.9199 c
--7872.9287 8548.4307 -7866.9199 8549.2402 -7861.2202 8549.2402 c
--7855.5166 8549.2402 -7849.5088 8548.4307 -7848.209 8546.9199 c
--7848.041 8546.7246 -7847.9424 8546.5195 -7847.9424 8546.3008 C
--7848.209 8546.3008 L
--7848.3921 8546.3008 L
--7848.3921 8547.4785 -7853.6602 8548.791 -7861.2202 8548.791 c
-f
--7861.2202 8550.1563 m
--7868.7783 8550.1563 -7874.0454 8548.8438 -7874.0454 8547.666 C
--7874.2295 8547.666 L
--7874.4961 8547.666 L
--7874.4961 8547.8848 -7874.3975 8548.0898 -7874.2295 8548.2852 c
--7872.9287 8549.7959 -7866.9199 8550.6055 -7861.2202 8550.6055 c
--7855.5166 8550.6055 -7849.5088 8549.7959 -7848.209 8548.2852 c
--7848.041 8548.0898 -7847.9424 8547.8848 -7847.9424 8547.666 C
--7848.209 8547.666 L
--7848.3921 8547.666 L
--7848.3921 8548.8438 -7853.6602 8550.1563 -7861.2202 8550.1563 c
-f
--7861.2202 8551.5205 m
--7868.7783 8551.5205 -7874.0454 8550.209 -7874.0454 8549.0322 C
--7874.2295 8549.0322 L
--7874.4961 8549.0322 L
--7874.4961 8549.25 -7874.3975 8549.4551 -7874.2295 8549.6504 c
--7872.9287 8551.1611 -7866.9199 8551.9707 -7861.2202 8551.9707 c
--7855.5166 8551.9707 -7849.5088 8551.1611 -7848.209 8549.6504 c
--7848.041 8549.4551 -7847.9424 8549.25 -7847.9424 8549.0322 C
--7848.209 8549.0322 L
--7848.3921 8549.0322 L
--7848.3921 8550.209 -7853.6602 8551.5205 -7861.2202 8551.5205 c
-f
--7861.2202 8552.8857 m
--7868.7783 8552.8857 -7874.0454 8551.5742 -7874.0454 8550.3965 C
--7874.2295 8550.3965 L
--7874.4961 8550.3965 L
--7874.4961 8550.6152 -7874.3975 8550.8203 -7874.2295 8551.0146 c
--7872.9287 8552.5254 -7866.9199 8553.3359 -7861.2202 8553.3359 c
--7855.5166 8553.3359 -7849.5088 8552.5254 -7848.209 8551.0146 c
--7848.041 8550.8203 -7847.9424 8550.6152 -7847.9424 8550.3965 C
--7848.209 8550.3965 L
--7848.3921 8550.3965 L
--7848.3921 8551.5742 -7853.6602 8552.8857 -7861.2202 8552.8857 c
-f
--7861.2202 8554.25 m
--7868.7783 8554.25 -7874.0454 8552.9395 -7874.0454 8551.7617 C
--7874.2295 8551.7617 L
--7874.4961 8551.7617 L
--7874.4961 8551.9795 -7874.3975 8552.1846 -7874.2295 8552.3789 c
--7872.9287 8553.8906 -7866.9199 8554.7012 -7861.2202 8554.7012 c
--7855.5166 8554.7012 -7849.5088 8553.8906 -7848.209 8552.3789 c
--7848.041 8552.1846 -7847.9424 8551.9795 -7847.9424 8551.7617 C
--7848.209 8551.7617 L
--7848.3921 8551.7617 L
--7848.3921 8552.9395 -7853.6602 8554.25 -7861.2202 8554.25 c
-f
--7861.2202 8555.6162 m
--7868.7783 8555.6162 -7874.0454 8554.3047 -7874.0454 8553.127 C
--7874.2295 8553.127 L
--7874.4961 8553.127 L
--7874.4961 8553.3457 -7874.3975 8553.5508 -7874.2295 8553.7451 c
--7872.9287 8555.2559 -7866.9199 8556.0664 -7861.2202 8556.0664 c
--7855.5166 8556.0664 -7849.5088 8555.2559 -7848.209 8553.7451 c
--7848.041 8553.5508 -7847.9424 8553.3457 -7847.9424 8553.127 C
--7848.209 8553.127 L
--7848.3921 8553.127 L
--7848.3921 8554.3047 -7853.6602 8555.6162 -7861.2202 8555.6162 c
-f
--7861.2202 8556.9805 m
--7868.7783 8556.9805 -7874.0454 8555.6689 -7874.0454 8554.4922 C
--7874.2295 8554.4922 L
--7874.4961 8554.4922 L
--7874.4961 8554.7109 -7874.3975 8554.916 -7874.2295 8555.1104 c
--7872.9287 8556.6211 -7866.9199 8557.4316 -7861.2202 8557.4316 c
--7855.5166 8557.4316 -7849.5088 8556.6211 -7848.209 8555.1104 c
--7848.041 8554.916 -7847.9424 8554.7109 -7847.9424 8554.4922 C
--7848.209 8554.4922 L
--7848.3921 8554.4922 L
--7848.3921 8555.6689 -7853.6602 8556.9805 -7861.2202 8556.9805 c
-f
--7861.2202 8558.3457 m
--7868.7783 8558.3457 -7874.0454 8557.0342 -7874.0454 8555.8574 C
--7874.2295 8555.8574 L
--7874.4961 8555.8574 L
--7874.4961 8556.0752 -7874.3975 8556.2803 -7874.2295 8556.4746 c
--7872.9287 8557.9863 -7866.9199 8558.7959 -7861.2202 8558.7959 c
--7855.5166 8558.7959 -7849.5088 8557.9863 -7848.209 8556.4746 c
--7848.041 8556.2803 -7847.9424 8556.0752 -7847.9424 8555.8574 C
--7848.209 8555.8574 L
--7848.3921 8555.8574 L
--7848.3921 8557.0342 -7853.6602 8558.3457 -7861.2202 8558.3457 c
-f
--7861.2202 8559.7109 m
--7868.7783 8559.7109 -7874.0454 8558.3994 -7874.0454 8557.2227 C
--7874.2295 8557.2227 L
--7874.4961 8557.2227 L
--7874.4961 8557.4395 -7874.3975 8557.6455 -7874.2295 8557.8398 c
--7872.9287 8559.3516 -7866.9199 8560.1611 -7861.2202 8560.1611 c
--7855.5166 8560.1611 -7849.5088 8559.3516 -7848.209 8557.8398 c
--7848.041 8557.6455 -7847.9424 8557.4395 -7847.9424 8557.2227 C
--7848.209 8557.2227 L
--7848.3921 8557.2227 L
--7848.3921 8558.3994 -7853.6602 8559.7109 -7861.2202 8559.7109 c
-f
--7861.2202 8561.0762 m
--7868.7783 8561.0762 -7874.0454 8559.7646 -7874.0454 8558.5879 C
--7874.2295 8558.5879 L
--7874.4961 8558.5879 L
--7874.4961 8558.8057 -7874.3975 8559.0107 -7874.2295 8559.2051 c
--7872.9287 8560.7168 -7866.9199 8561.5264 -7861.2202 8561.5264 c
--7855.5166 8561.5264 -7849.5088 8560.7168 -7848.209 8559.2051 c
--7848.041 8559.0107 -7847.9424 8558.8057 -7847.9424 8558.5879 C
--7848.209 8558.5879 L
--7848.3921 8558.5879 L
--7848.3921 8559.7646 -7853.6602 8561.0762 -7861.2202 8561.0762 c
-f
--7861.2202 8562.4414 m
--7868.7783 8562.4414 -7874.0454 8561.1299 -7874.0454 8559.9531 C
--7874.2295 8559.9531 L
--7874.4961 8559.9531 L
--7874.4961 8560.1709 -7874.3975 8560.376 -7874.2295 8560.5703 c
--7872.9287 8562.082 -7866.9199 8562.8906 -7861.2202 8562.8906 c
--7855.5166 8562.8906 -7849.5088 8562.082 -7848.209 8560.5703 c
--7848.041 8560.376 -7847.9424 8560.1709 -7847.9424 8559.9531 C
--7848.209 8559.9531 L
--7848.3921 8559.9531 L
--7848.3921 8561.1299 -7853.6602 8562.4414 -7861.2202 8562.4414 c
-f
--7861.2202 8563.8066 m
--7868.7783 8563.8066 -7874.0454 8562.4941 -7874.0454 8561.3184 C
--7874.2295 8561.3184 L
--7874.4961 8561.3184 L
--7874.4961 8561.5352 -7874.3975 8561.7412 -7874.2295 8561.9355 c
--7872.9287 8563.4473 -7866.9199 8564.2559 -7861.2202 8564.2559 c
--7855.5166 8564.2559 -7849.5088 8563.4473 -7848.209 8561.9355 c
--7848.041 8561.7412 -7847.9424 8561.5352 -7847.9424 8561.3184 C
--7848.209 8561.3184 L
--7848.3921 8561.3184 L
--7848.3921 8562.4941 -7853.6602 8563.8066 -7861.2202 8563.8066 c
-f
--7861.2202 8565.1719 m
--7868.7783 8565.1719 -7874.0454 8563.8594 -7874.0454 8562.6826 C
--7874.2295 8562.6826 L
--7874.4961 8562.6826 L
--7874.4961 8562.9004 -7874.3975 8563.1055 -7874.2295 8563.3008 c
--7872.9287 8564.8115 -7866.9199 8565.6211 -7861.2202 8565.6211 c
--7855.5166 8565.6211 -7849.5088 8564.8115 -7848.209 8563.3008 c
--7848.041 8563.1055 -7847.9424 8562.9004 -7847.9424 8562.6826 C
--7848.209 8562.6826 L
--7848.3921 8562.6826 L
--7848.3921 8563.8594 -7853.6602 8565.1719 -7861.2202 8565.1719 c
-f
--7861.2202 8566.5371 m
--7868.7783 8566.5371 -7874.0454 8565.2246 -7874.0454 8564.0479 C
--7874.2295 8564.0479 L
--7874.4961 8564.0479 L
--7874.4961 8564.2656 -7874.3975 8564.4707 -7874.2295 8564.666 c
--7872.9287 8566.1768 -7866.9199 8566.9863 -7861.2202 8566.9863 c
--7855.5166 8566.9863 -7849.5088 8566.1768 -7848.209 8564.666 c
--7848.041 8564.4707 -7847.9424 8564.2656 -7847.9424 8564.0479 C
--7848.209 8564.0479 L
--7848.3921 8564.0479 L
--7848.3921 8565.2246 -7853.6602 8566.5371 -7861.2202 8566.5371 c
-f
--7861.2202 8567.9023 m
--7868.7783 8567.9023 -7874.0454 8566.5898 -7874.0454 8565.4131 C
--7874.2295 8565.4131 L
--7874.4961 8565.4131 L
--7874.4961 8565.6309 -7874.3975 8565.8359 -7874.2295 8566.0313 c
--7872.9287 8567.543 -7866.9199 8568.3516 -7861.2202 8568.3516 c
--7855.5166 8568.3516 -7849.5088 8567.543 -7848.209 8566.0313 c
--7848.041 8565.8359 -7847.9424 8565.6309 -7847.9424 8565.4131 C
--7848.209 8565.4131 L
--7848.3921 8565.4131 L
--7848.3921 8566.5898 -7853.6602 8567.9023 -7861.2202 8567.9023 c
-f
--7861.2202 8569.2666 m
--7868.7783 8569.2666 -7874.0454 8567.9551 -7874.0454 8566.7783 C
--7874.2295 8566.7783 L
--7874.4961 8566.7783 L
--7874.4961 8566.9961 -7874.3975 8567.2012 -7874.2295 8567.3965 c
--7872.9287 8568.9072 -7866.9199 8569.7168 -7861.2202 8569.7168 c
--7855.5166 8569.7168 -7849.5088 8568.9072 -7848.209 8567.3965 c
--7848.041 8567.2012 -7847.9424 8566.9961 -7847.9424 8566.7783 C
--7848.209 8566.7783 L
--7848.3921 8566.7783 L
--7848.3921 8567.9551 -7853.6602 8569.2666 -7861.2202 8569.2666 c
-f
--7861.2202 8570.6318 m
--7868.7783 8570.6318 -7874.0454 8569.3203 -7874.0454 8568.1426 C
--7874.2295 8568.1426 L
--7874.4961 8568.1426 L
--7874.4961 8568.3613 -7874.3975 8568.5664 -7874.2295 8568.7607 c
--7872.9287 8570.2715 -7866.9199 8571.082 -7861.2202 8571.082 c
--7855.5166 8571.082 -7849.5088 8570.2715 -7848.209 8568.7607 c
--7848.041 8568.5664 -7847.9424 8568.3613 -7847.9424 8568.1426 C
--7848.209 8568.1426 L
--7848.3921 8568.1426 L
--7848.3921 8569.3203 -7853.6602 8570.6318 -7861.2202 8570.6318 c
-f
--7861.2202 8571.998 m
--7868.7783 8571.998 -7874.0454 8570.6855 -7874.0454 8569.5078 C
--7874.2295 8569.5078 L
--7874.4961 8569.5078 L
--7874.4961 8569.7266 -7874.3975 8569.9316 -7874.2295 8570.127 c
--7872.9287 8571.6377 -7866.9199 8572.4473 -7861.2202 8572.4473 c
--7855.5166 8572.4473 -7849.5088 8571.6377 -7848.209 8570.127 c
--7848.041 8569.9316 -7847.9424 8569.7266 -7847.9424 8569.5078 C
--7848.209 8569.5078 L
--7848.3921 8569.5078 L
--7848.3921 8570.6855 -7853.6602 8571.998 -7861.2202 8571.998 c
-f
--7861.2202 8573.3623 m
--7868.7783 8573.3623 -7874.0454 8572.0508 -7874.0454 8570.873 C
--7874.2295 8570.873 L
--7874.4961 8570.873 L
--7874.4961 8571.0391 -7874.4282 8571.1953 -7874.3286 8571.3486 c
--7874.2974 8571.3965 -7874.2695 8571.4453 -7874.2295 8571.4912 c
--7872.9287 8573.002 -7866.9199 8573.8125 -7861.2202 8573.8125 c
--7855.5166 8573.8125 -7849.5088 8573.002 -7848.209 8571.4912 c
--7848.1689 8571.4453 -7848.1392 8571.3965 -7848.1104 8571.3486 c
--7848.0103 8571.1953 -7847.9424 8571.0391 -7847.9424 8570.873 C
--7848.209 8570.873 L
--7848.3921 8570.873 L
--7848.3921 8572.0508 -7853.6602 8573.3623 -7861.2202 8573.3623 c
-f
--7861.2202 8574.7266 m
--7868.7783 8574.7266 -7874.0454 8573.415 -7874.0454 8572.2383 C
--7874.2295 8572.2383 L
--7874.4961 8572.2383 L
--7874.4961 8572.4561 -7874.3975 8572.6621 -7874.2295 8572.8555 c
--7872.9287 8574.3672 -7866.9199 8575.1768 -7861.2202 8575.1768 c
--7855.5166 8575.1768 -7849.5088 8574.3672 -7848.209 8572.8555 c
--7848.041 8572.6621 -7847.9424 8572.4561 -7847.9424 8572.2383 C
--7848.209 8572.2383 L
--7848.3921 8572.2383 L
--7848.3921 8573.415 -7853.6602 8574.7266 -7861.2202 8574.7266 c
-f
-0.8 g
--7839.0342 8530.2168 m
--7839.3311 8530.4834 -7839.7271 8530.7402 -7840.229 8530.9863 c
--7840.231 8530.9883 -7840.2334 8530.9893 -7840.2358 8530.9902 c
--7840.5225 8531.1309 -7840.8394 8531.2676 -7841.187 8531.4004 c
--7841.187 8531.4004 l
--7841.8857 8531.668 -7842.7026 8531.9189 -7843.626 8532.1523 c
--7843.6362 8532.1543 -7843.647 8532.1572 -7843.6582 8532.1602 c
--7845.501 8532.623 -7847.7583 8533.0117 -7850.313 8533.3018 c
--7850.3457 8533.3047 -7850.3774 8533.3086 -7850.4111 8533.3125 c
--7851.6626 8533.4531 -7852.9834 8533.5703 -7854.3599 8533.6602 c
--7854.4209 8533.6641 -7854.4785 8533.668 -7854.5366 8533.6719 c
--7855.1743 8533.7119 -7855.8232 8533.7461 -7856.4824 8533.7754 c
--7856.5313 8533.7773 -7856.5791 8533.7813 -7856.6279 8533.7832 c
--7856.6758 8533.7852 -7856.7246 8533.7861 -7856.7729 8533.7881 c
--7857.4561 8533.8164 -7858.1514 8533.8379 -7858.856 8533.8535 c
--7858.8774 8533.8535 -7858.8994 8533.8545 -7858.9209 8533.8545 c
--7859.6768 8533.8711 -7860.4424 8533.8789 -7861.2202 8533.8789 c
--7861.9951 8533.8789 -7862.7607 8533.8711 -7863.5166 8533.8545 c
--7863.5391 8533.8545 -7863.5601 8533.8535 -7863.582 8533.8535 c
--7864.2871 8533.8379 -7864.9814 8533.8164 -7865.667 8533.7881 c
--7865.7134 8533.7861 -7865.7642 8533.7852 -7865.8096 8533.7832 c
--7865.8608 8533.7813 -7865.9058 8533.7773 -7865.9561 8533.7754 c
--7866.6162 8533.7461 -7867.2666 8533.7119 -7867.9038 8533.6709 c
--7867.9609 8533.668 -7868.0166 8533.6641 -7868.0718 8533.6602 c
--7869.4526 8533.5703 -7870.7783 8533.4531 -7872.0322 8533.3125 c
--7872.0615 8533.3086 -7872.0898 8533.3057 -7872.1201 8533.3027 c
--7874.6768 8533.0117 -7876.9385 8532.623 -7878.7822 8532.1592 c
--7878.792 8532.1572 -7878.8018 8532.1543 -7878.811 8532.1523 c
--7880.1934 8531.8027 -7881.3408 8531.4121 -7882.2026 8530.9902 c
--7882.2041 8530.9893 -7882.208 8530.9883 -7882.21 8530.9863 c
--7882.4639 8530.8613 -7882.6904 8530.7324 -7882.8936 8530.6016 c
--7883.3799 8530.29 -7883.7178 8529.9639 -7883.8818 8529.627 c
--7883.96 8529.4688 -7884 8529.3066 -7884 8529.1426 C
--7884 8535.1855 L
--7884 8535.5137 -7883.8408 8535.832 -7883.5361 8536.1406 c
--7883.2334 8536.4492 -7882.7866 8536.7461 -7882.21 8537.0303 c
--7881.6328 8537.3125 -7880.9287 8537.583 -7880.1089 8537.834 c
--7879.29 8538.0859 -7878.3584 8538.3203 -7877.3271 8538.5352 c
--7876.377 8538.7324 -7875.335 8538.9121 -7874.2295 8539.0713 c
--7874.1362 8539.085 -7874.0498 8539.1016 -7873.9561 8539.1143 c
--7872.7432 8539.2852 -7871.4497 8539.4307 -7870.0854 8539.5498 c
--7868.7231 8539.6699 -7867.293 8539.7637 -7865.8096 8539.8262 c
--7864.3271 8539.8887 -7862.792 8539.9229 -7861.2202 8539.9229 c
--7859.6465 8539.9229 -7858.1104 8539.8887 -7856.6279 8539.8262 c
--7855.145 8539.7637 -7853.7134 8539.6699 -7852.3521 8539.5498 c
--7850.9897 8539.4307 -7849.6934 8539.2852 -7848.4814 8539.1143 c
--7848.3882 8539.1016 -7848.3018 8539.085 -7848.209 8539.0723 c
--7847.105 8538.9121 -7846.0615 8538.7324 -7845.1104 8538.5352 c
--7844.0801 8538.3203 -7843.147 8538.0859 -7842.3286 8537.834 c
--7841.5103 8537.583 -7840.8042 8537.3125 -7840.229 8537.0303 c
--7839.6514 8536.7461 -7839.2041 8536.4492 -7838.9009 8536.1406 c
--7838.5967 8535.832 -7838.4385 8535.5137 -7838.4385 8535.1855 C
--7838.4385 8529.1426 L
--7838.4385 8529.3887 -7838.5278 8529.6289 -7838.7002 8529.8643 c
--7838.7881 8529.9834 -7838.9038 8530.1016 -7839.0342 8530.2168 c
-f
-0.5 g
--7845.9463 8525.6279 m
--7847.4521 8528.6533 -7849.7656 8530.1738 -7849.8774 8530.2461 C
--7849.9346 8530.2813 L
--7873.333 8530.2813 L
--7873.3887 8529.8389 L
--7873.3638 8529.832 -7871.0127 8529.166 -7868.5498 8524.6582 C
--7877.5342 8525.293 -7884 8527.0605 -7884 8529.1426 c
--7884 8529.3066 -7883.96 8529.4688 -7883.8818 8529.627 c
--7883.7178 8529.9639 -7883.3799 8530.29 -7882.8936 8530.6016 c
--7882.687 8530.7344 -7882.46 8530.8633 -7882.2026 8530.9902 c
--7881.3408 8531.4121 -7880.1934 8531.8027 -7878.811 8532.1523 c
--7878.8018 8532.1543 -7878.792 8532.1572 -7878.7822 8532.1592 c
--7876.9385 8532.623 -7874.6768 8533.0117 -7872.1201 8533.3027 c
--7872.0898 8533.3057 -7872.0615 8533.3086 -7872.0322 8533.3125 c
--7870.7783 8533.4531 -7869.4526 8533.5703 -7868.0718 8533.6602 c
--7868.0166 8533.6641 -7867.9609 8533.668 -7867.9038 8533.6709 c
--7867.2666 8533.7119 -7866.6162 8533.7461 -7865.9561 8533.7754 c
--7865.8594 8533.7793 -7865.7642 8533.7842 -7865.667 8533.7881 c
--7864.9814 8533.8164 -7864.2871 8533.8379 -7863.582 8533.8535 c
--7863.5601 8533.8535 -7863.5391 8533.8545 -7863.5166 8533.8545 c
--7862.7607 8533.8711 -7861.9951 8533.8789 -7861.2202 8533.8789 c
--7860.4424 8533.8789 -7859.6768 8533.8711 -7858.9209 8533.8545 c
--7858.8994 8533.8545 -7858.8774 8533.8535 -7858.856 8533.8535 c
--7858.1514 8533.8379 -7857.4561 8533.8164 -7856.7729 8533.7881 c
--7856.6758 8533.7842 -7856.5791 8533.7793 -7856.4824 8533.7754 c
--7855.8232 8533.7461 -7855.1743 8533.7119 -7854.5366 8533.6719 c
--7854.4785 8533.668 -7854.4209 8533.6641 -7854.3599 8533.6602 c
--7852.9834 8533.5703 -7851.6626 8533.4531 -7850.4111 8533.3125 c
--7850.3774 8533.3086 -7850.3457 8533.3047 -7850.313 8533.3018 c
--7847.7583 8533.0117 -7845.501 8532.623 -7843.6582 8532.1602 c
--7843.647 8532.1572 -7843.6362 8532.1543 -7843.626 8532.1523 c
--7842.7026 8531.9189 -7841.8857 8531.668 -7841.187 8531.4004 C
--7841.187 8531.4004 L
--7840.8394 8531.2676 -7840.5225 8531.1309 -7840.2358 8530.9902 c
--7839.731 8530.7432 -7839.332 8530.4844 -7839.0342 8530.2168 c
--7838.9038 8530.1016 -7838.7881 8529.9834 -7838.7002 8529.8643 c
--7838.5278 8529.6289 -7838.4385 8529.3887 -7838.4385 8529.1426 c
--7838.4385 8527.748 -7841.3359 8526.4951 -7845.9463 8525.6279 C
-f
-*u
-1 g
-1 D
--7867.7471 8524.0996 m
--7866.8584 8522.3203 -7866.5679 8520.6797 -7866.5679 8519.0811 c
--7866.5679 8517.6328 -7866.8057 8516.2178 -7867.0498 8514.7646 c
--7867.2959 8513.2949 -7867.5498 8511.7852 -7867.5498 8510.1855 c
--7867.5498 8509.792 -7867.5352 8509.3926 -7867.5 8508.9863 c
--7867.0518 8503.7461 -7861.4072 8501.1475 -7861.3506 8501.1221 C
--7840.5649 8501.1396 -7839.0386 8501.1406 V
--7840.1807 8501.8877 -7842.5088 8503.7266 -7844.8066 8507.5039 c
--7845.8433 8509.2051 -7846.1567 8511.1133 -7846.1567 8513.041 c
--7846.1567 8514.5996 -7845.9512 8516.1699 -7845.7578 8517.6523 c
--7845.5791 8519.0303 -7845.4038 8520.3633 -7845.4038 8521.5723 c
--7845.4038 8522.4287 -7845.4912 8523.2236 -7845.7256 8523.9277 c
--7846.9727 8527.6641 -7849.792 8529.6445 -7850.0713 8529.832 C
--7850.2046 8529.832 -7870.5674 8529.832 -7872.3569 8529.832 C
--7871.3154 8529.1973 -7869.5391 8527.6836 -7867.7471 8524.0996 c
-f
-0 D
--7850.8975 8526.2422 m
--7865.9287 8526.2422 L
--7865.9287 8526.6914 L
--7850.8975 8526.6914 L
--7850.8975 8526.2422 L
-f
--7849.1025 8512.1074 m
--7863.9087 8512.1074 L
--7863.9087 8512.5566 L
--7849.1025 8512.5566 L
--7849.1025 8512.1074 L
-f
--7863.4609 8517.7168 m
--7863.4609 8518.166 L
--7848.4297 8518.166 L
--7848.4297 8517.7168 L
--7863.4609 8517.7168 L
-f
--7863.6855 8515.9219 m
--7850.001 8515.9219 L
--7850.001 8515.4727 L
--7863.6855 8515.4727 L
--7863.6855 8515.9219 L
-f
--7863.4609 8521.3076 m
--7848.6538 8521.3076 L
--7848.6538 8520.8574 L
--7863.4609 8520.8574 L
--7863.4609 8521.3076 L
-f
--7861.2178 8503.583 m
--7845.7378 8503.583 L
--7845.7378 8503.1328 L
--7861.2178 8503.1328 L
--7861.2178 8503.583 L
-f
--7862.7881 8505.3779 m
--7850.4497 8505.3779 L
--7850.4497 8504.9277 L
--7862.7881 8504.9277 L
--7862.7881 8505.3779 L
-f
--7863.9087 8507.8457 m
--7848.2041 8507.8457 L
--7848.2041 8507.3945 L
--7863.9087 8507.3945 L
--7863.9087 8507.8457 L
-f
--7864.3584 8510.3135 m
--7848.6538 8510.3135 L
--7848.6538 8509.8633 L
--7864.3584 8509.8633 L
--7864.3584 8510.3135 L
-f
--7864.3584 8524 m
--7849.7754 8524 L
--7849.7754 8523.5488 L
--7864.3584 8523.5488 L
--7864.3584 8524 L
-f
-*U
-*u
-0 g
-1 D
--7868.5498 8524.6582 m
--7868.417 8524.4141 -7868.2832 8524.166 -7868.1494 8523.8984 c
--7866.519 8520.6387 -7866.9937 8517.8213 -7867.4946 8514.8389 c
--7867.8057 8512.9785 -7868.1294 8511.0557 -7867.9482 8508.9473 c
--7867.4766 8503.4404 -7861.5938 8500.7383 -7861.4424 8500.6914 C
--7838.2168 8500.6914 L
--7838.1201 8501.1191 L
--7838.1514 8501.1348 -7841.3599 8502.7051 -7844.4238 8507.7373 c
--7846.2144 8510.6797 -7845.7559 8514.1953 -7845.311 8517.5947 c
--7844.9966 8520.002 -7844.7007 8522.2754 -7845.2993 8524.0703 c
--7845.4858 8524.6289 -7845.707 8525.1465 -7845.9463 8525.6279 c
--7847.4521 8528.6533 -7849.7656 8530.1738 -7849.8774 8530.2461 C
--7849.9346 8530.2813 L
--7873.333 8530.2813 L
--7873.3887 8529.8389 L
--7873.3638 8529.832 -7871.0127 8529.166 -7868.5498 8524.6582 c
-f
-0 D
--7867.7471 8524.0996 m
--7869.5391 8527.6836 -7871.3154 8529.1973 -7872.3569 8529.832 C
--7870.5674 8529.832 -7850.2046 8529.832 -7850.0713 8529.832 C
--7849.792 8529.6445 -7846.9727 8527.6641 -7845.7256 8523.9277 c
--7845.4912 8523.2236 -7845.4038 8522.4287 -7845.4038 8521.5723 c
--7845.4038 8520.3633 -7845.5791 8519.0303 -7845.7578 8517.6523 c
--7845.9512 8516.1699 -7846.1567 8514.5996 -7846.1567 8513.041 c
--7846.1567 8511.1133 -7845.8433 8509.2051 -7844.8066 8507.5039 c
--7842.5088 8503.7266 -7840.1807 8501.8877 -7839.0386 8501.1406 C
--7840.5649 8501.1396 -7861.3506 8501.1221 Y
--7861.4072 8501.1475 -7867.0518 8503.7461 -7867.5 8508.9863 c
--7867.5352 8509.3926 -7867.5498 8509.792 -7867.5498 8510.1855 c
--7867.5498 8511.7852 -7867.2959 8513.2949 -7867.0498 8514.7646 c
--7866.8057 8516.2178 -7866.5679 8517.6328 -7866.5679 8519.0811 c
--7866.5679 8520.6797 -7866.8584 8522.3203 -7867.7471 8524.0996 c
-f
-*U
--7845.7378 8503.1328 m
--7861.2178 8503.1328 L
--7861.2178 8503.583 L
--7845.7378 8503.583 L
--7845.7378 8503.1328 L
-f
--7850.4497 8504.9277 m
--7862.7881 8504.9277 L
--7862.7881 8505.3779 L
--7850.4497 8505.3779 L
--7850.4497 8504.9277 L
-f
--7848.2041 8507.3945 m
--7863.9087 8507.3945 L
--7863.9087 8507.8457 L
--7848.2041 8507.8457 L
--7848.2041 8507.3945 L
-f
--7848.6538 8509.8633 m
--7864.3584 8509.8633 L
--7864.3584 8510.3135 L
--7848.6538 8510.3135 L
--7848.6538 8509.8633 L
-f
--7863.9087 8512.5566 m
--7849.1025 8512.5566 L
--7849.1025 8512.1074 L
--7863.9087 8512.1074 L
--7863.9087 8512.5566 L
-f
--7850.001 8515.4727 m
--7863.6855 8515.4727 L
--7863.6855 8515.9219 L
--7850.001 8515.9219 L
--7850.001 8515.4727 L
-f
--7863.4609 8518.166 m
--7848.4297 8518.166 L
--7848.4297 8517.7168 L
--7863.4609 8517.7168 L
--7863.4609 8518.166 L
-f
--7848.6538 8520.8574 m
--7863.4609 8520.8574 L
--7863.4609 8521.3076 L
--7848.6538 8521.3076 L
--7848.6538 8520.8574 L
-f
--7849.7754 8523.5488 m
--7864.3584 8523.5488 L
--7864.3584 8524 L
--7849.7754 8524 L
--7849.7754 8523.5488 L
-f
--7865.9287 8526.6914 m
--7850.8975 8526.6914 L
--7850.8975 8526.2422 L
--7865.9287 8526.2422 L
--7865.9287 8526.6914 L
-f
-U
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 9)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7883.25 8585.25 m
--7840.7246 8585.25 L
--7840.7246 8555.5381 L
--7883.25 8555.5381 L
--7883.25 8585.25 L
-n
-u
-u
-0 O
-0.7 g
--7872.457 8555.7881 m
--7868.6582 8555.7881 -7864.9199 8555.7881 v
--7861.1826 8555.7881 -7861.8242 8558.8838 y
--7845.9258 8558.8838 -7843.4502 8558.8838 v
--7840.9761 8558.8838 -7840.9761 8561.3594 y
--7840.9761 8578.542 l
--7876.541 8578.542 l
--7876.541 8558.9004 l
--7875.3906 8558.9004 l
--7875.439 8555.7881 -7872.457 8555.7881 v
-f
-0 R
-0.9 G
-0.5 w
--7861.8242 8558.8838 m
--7845.9258 8558.8838 -7843.4502 8558.8838 v
-S
-0.5 G
--7862.8594 8556.2715 m
--7861.4634 8557.1426 -7861.8242 8558.8838 y
-S
-0.7 G
--7864.9199 8555.7881 m
--7863.9858 8555.7881 -7863.3247 8555.9814 -7862.8594 8556.2715 c
-S
-0.9 G
--7876.541 8578.542 m
--7876.541 8558.9004 l
--7875.3906 8558.9004 l
--7875.439 8555.7881 -7872.457 8555.7881 v
--7868.6582 8555.7881 -7864.9199 8555.7881 v
-S
-0.25 G
--7840.9761 8561.3594 m
--7840.9761 8578.542 l
--7876.541 8578.542 l
-S
-0.5 G
--7842.019 8559.2715 m
--7840.9761 8559.9668 -7840.9761 8561.3594 y
-S
-0.7 G
--7843.4502 8558.8838 m
--7842.8306 8558.8838 -7842.3672 8559.0391 -7842.019 8559.2715 c
-S
-U
-u
-0 O
-0.7 g
-1 w
--7874.0718 8557.4023 m
--7870.2729 8557.4023 -7866.5342 8557.4023 v
--7862.7954 8557.4023 -7863.439 8560.498 y
--7847.541 8560.498 -7845.0649 8560.498 v
--7842.5903 8560.498 -7842.5903 8562.9727 y
--7842.5903 8580.1563 l
--7878.1558 8580.1563 l
--7878.1558 8560.5146 l
--7877.0054 8560.5146 l
--7877.0542 8557.4023 -7874.0718 8557.4023 v
-f
-0 R
-0.9 G
-0.5 w
--7863.439 8560.498 m
--7847.541 8560.498 -7845.0649 8560.498 v
-S
-0.5 G
--7864.4746 8557.8867 m
--7863.0767 8558.7578 -7863.439 8560.498 y
-S
-0.7 G
--7866.5342 8557.4023 m
--7865.6006 8557.4023 -7864.9409 8557.5957 -7864.4746 8557.8867 c
-S
-0.9 G
--7878.1558 8580.1563 m
--7878.1558 8560.5146 l
--7877.0054 8560.5146 l
--7877.0542 8557.4023 -7874.0718 8557.4023 v
--7870.2729 8557.4023 -7866.5342 8557.4023 v
-S
-0.25 G
--7842.5903 8562.9727 m
--7842.5903 8580.1563 l
--7878.1558 8580.1563 l
-S
-0.5 G
--7843.6338 8560.8848 m
--7842.5903 8561.5811 -7842.5903 8562.9727 y
-S
-0.7 G
--7845.0649 8560.498 m
--7844.4458 8560.498 -7843.981 8560.6533 -7843.6338 8560.8848 c
-S
-U
-u
-0 O
-0.7 g
-1 w
--7875.6846 8559.0176 m
--7871.8882 8559.0176 -7868.1489 8559.0176 v
--7864.4111 8559.0176 -7865.0527 8562.1123 y
--7849.1538 8562.1123 -7846.6802 8562.1123 v
--7844.2046 8562.1123 -7844.2046 8564.5879 y
--7844.2046 8581.7715 l
--7879.771 8581.7715 l
--7879.771 8562.1289 l
--7878.6191 8562.1289 l
--7878.6689 8559.0176 -7875.6846 8559.0176 v
-f
-0 R
-0.9 G
-0.5 w
--7865.0527 8562.1123 m
--7849.1538 8562.1123 -7846.6802 8562.1123 v
-S
-0.5 G
--7866.0898 8559.5 m
--7864.6929 8560.3711 -7865.0527 8562.1123 y
-S
-0.7 G
--7868.1489 8559.0176 m
--7867.2144 8559.0176 -7866.5542 8559.21 -7866.0898 8559.5 c
-S
-0.9 G
--7879.771 8581.7715 m
--7879.771 8562.1289 l
--7878.6191 8562.1289 l
--7878.6689 8559.0176 -7875.6846 8559.0176 v
--7871.8882 8559.0176 -7868.1489 8559.0176 v
-S
-0.25 G
--7844.2046 8564.5879 m
--7844.2046 8581.7715 l
--7879.771 8581.7715 l
-S
-0.5 G
--7845.249 8562.5 m
--7844.2046 8563.1953 -7844.2046 8564.5879 y
-S
-0.7 G
--7846.6802 8562.1123 m
--7846.061 8562.1123 -7845.5962 8562.2676 -7845.249 8562.5 c
-S
-U
-u
-0 O
-0.7 g
-1 w
--7877.2993 8560.6318 m
--7873.5034 8560.6318 -7869.7642 8560.6318 v
--7866.0254 8560.6318 -7866.667 8563.7275 y
--7850.769 8563.7275 -7848.2935 8563.7275 v
--7845.8193 8563.7275 -7845.8193 8566.2031 y
--7845.8193 8583.3867 l
--7881.3857 8583.3867 l
--7881.3857 8563.7441 l
--7880.2334 8563.7441 l
--7880.2842 8560.6318 -7877.2993 8560.6318 v
-f
-0 R
-0.9 G
-0.5 w
--7866.667 8563.7275 m
--7850.769 8563.7275 -7848.2935 8563.7275 v
-S
-0.5 G
--7867.7046 8561.1152 m
--7866.3071 8561.9863 -7866.667 8563.7275 y
-S
-0.7 G
--7869.7642 8560.6318 m
--7868.8286 8560.6318 -7868.1689 8560.8252 -7867.7046 8561.1152 c
-S
-0.9 G
--7881.3857 8583.3867 m
--7881.3857 8563.7441 l
--7880.2334 8563.7441 l
--7880.2842 8560.6318 -7877.2993 8560.6318 v
--7873.5034 8560.6318 -7869.7642 8560.6318 v
-S
-0.25 G
--7845.8193 8566.2031 m
--7845.8193 8583.3867 l
--7881.3857 8583.3867 l
-S
-0.5 G
--7846.8638 8564.1143 m
--7845.8193 8564.8105 -7845.8193 8566.2031 y
-S
-0.7 G
--7848.2935 8563.7275 m
--7847.6753 8563.7275 -7847.2114 8563.8828 -7846.8638 8564.1143 c
-S
-U
-u
-0 O
-0.8 g
-1 w
--7878.9146 8562.2461 m
--7875.1167 8562.2461 -7871.3794 8562.2461 v
--7867.6401 8562.2461 -7868.2817 8565.3418 y
--7852.3838 8565.3418 -7849.9087 8565.3418 v
--7847.4346 8565.3418 -7847.4346 8567.8174 y
--7847.4346 8585 l
--7883.001 8585 l
--7883.001 8565.3574 l
--7881.8481 8565.3574 l
--7881.8994 8562.2461 -7878.9146 8562.2461 v
-f
-0 R
-0.9 G
-0.5 w
--7868.2817 8565.3418 m
--7852.3838 8565.3418 -7849.9087 8565.3418 v
-S
-0.5 G
--7869.3184 8562.7295 m
--7867.9214 8563.6006 -7868.2817 8565.3418 y
-S
-0.7 G
--7871.3794 8562.2461 m
--7870.4438 8562.2461 -7869.7842 8562.4395 -7869.3184 8562.7295 c
-S
-0.9 G
--7883.001 8585 m
--7883.001 8565.3574 l
--7881.8481 8565.3574 l
--7881.8994 8562.2461 -7878.9146 8562.2461 v
--7875.1167 8562.2461 -7871.3794 8562.2461 v
-S
-0.25 G
--7847.4346 8567.8174 m
--7847.4346 8585 l
--7883.001 8585 l
-S
-0.5 G
--7848.4785 8565.7285 m
--7847.4346 8566.4238 -7847.4346 8567.8174 y
-S
-0.7 G
--7849.9087 8565.3418 m
--7849.29 8565.3418 -7848.8262 8565.4971 -7848.4785 8565.7285 c
-S
-U
-U
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 10)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7883.25 8585.25 m
--7815.2593 8585.25 L
--7815.2593 8557.0195 L
--7883.25 8557.0195 L
--7883.25 8585.25 L
-n
-0 O
-0.8 g
--7835.5234 8580.209 m
--7815.4785 8573.3516 l
--7817.0591 8570.4502 l
--7829.7202 8574.4063 l
--7835.7866 8570.4502 l
--7835.5234 8580.209 l
-f
-0 R
-0.9 G
-0.5 w
--7816.7871 8570.3242 m
--7829.7202 8574.4063 l
-S
-0.5 G
--7815.4785 8573.3516 m
--7817.0591 8570.4502 l
-S
-0.25 G
--7835.5234 8580.209 m
--7815.4785 8573.3516 l
-S
-0.5 G
--7829.7202 8574.4063 m
--7835.7866 8570.4502 l
-S
-0 O
-0.8 g
-1 w
--7855.5679 8562.7998 m
--7843.437 8557.5254 l
--7840.0073 8561.7441 l
--7855.5679 8562.7998 l
-f
-1 Ap
-0.57 g
--7835.2598 8582.0547 m
--7881.6802 8582.0547 L
--7881.6802 8584.9551 L
--7835.2598 8584.9551 L
--7835.2598 8582.0547 L
-f
-0 Ap
-0 R
-0.5 G
-0.5 w
--7843.437 8557.5254 m
--7840.0073 8561.7441 l
-S
-0.9 G
--7855.5679 8562.7998 m
--7842.875 8557.248 l
-S
-0 O
-0.8 g
-1 w
--7883.001 8560.7627 m
--7883.001 8582.0859 l
--7834.2046 8582.0859 l
--7834.2046 8564.9121 l
--7837.6338 8560.8223 l
--7883.001 8560.7627 l
-f
-0 R
-0.5 G
-0.5 w
--7883.001 8576.5166 m
--7834.2046 8576.5166 l
-S
--7880.0986 8564.1191 m
--7870.6025 8564.1191 l
-S
--7880.0986 8565.7676 m
--7870.6025 8565.7676 l
-S
--7880.0986 8567.415 m
--7870.6025 8567.415 l
-S
--7880.0986 8569.0635 m
--7870.6025 8569.0635 l
-S
--7880.0986 8570.7109 m
--7870.6025 8570.7109 l
-S
--7834.2046 8564.9121 m
--7837.6338 8560.8223 l
-S
-0.25 G
--7883.001 8582.0859 m
--7834.2046 8582.0859 l
--7834.2046 8564.9121 l
-S
-0.9 G
--7837.6338 8560.793 m
--7883.001 8560.793 l
--7883.001 8582.3555 l
-S
-0.25 G
--7835.2598 8582.0859 m
--7835.2598 8585 l
--7881.6714 8585 l
-S
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 19)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7883.25 8585.25 m
--7836.6338 8585.25 L
--7836.6338 8549.6348 L
--7883.25 8549.6348 L
--7883.25 8585.25 L
-n
-u
-u
-0 O
-0.7495 g
-0 R
-0.25 G
-1 j 0.5 w 2 M
--7836.9722 8585 m
--7836.9722 8582.9805 l
--7843.333 8579.5479 l
--7859.8857 8579.5479 L
--7876.439 8579.5479 l
--7883.001 8582.9805 l
--7883.001 8585 l
--7836.9722 8585 l
-b
-0.8748 G
-2 J 0 j
--7859.8857 8579.5479 m
--7876.439 8579.5479 l
--7883.001 8582.9805 l
--7883.001 8585 l
-S
--7836.9722 8582.9805 m
--7843.333 8579.5479 l
--7859.8857 8579.5479 L
-S
-0 O
-0.9 g
-0.25 G
-0 J 1 j
--7876.3394 8580.7598 m
--7880.377 8582.9805 l
--7839.7993 8582.9805 l
--7843.2319 8580.7598 l
--7876.3394 8580.7598 l
-b
-U
-u
-u
-0.7 g
-0 j 1 w 4 M
--7871.125 8576.6523 m
--7868.8462 8576.6094 L
--7859.7446 8575.041 L
--7850.4634 8576.6094 L
--7848.6694 8576.6094 L
--7848.729 8578.4512 L
--7871.125 8578.4512 L
--7871.125 8576.6523 L
-f
-0 R
-0.25 G
-0.5 w
--7848.6978 8576.6523 m
--7848.7905 8578.4512 L
--7871.1567 8578.4512 L
-S
-0.9 G
--7850.498 8576.6523 m
--7848.6978 8576.6523 L
-S
-0.25 G
--7859.8042 8575.041 m
--7850.498 8576.6523 L
-S
-0.9 G
--7871.1567 8578.4512 m
--7871.1567 8576.6523 L
--7868.9033 8576.6523 L
--7859.8042 8575.041 L
-S
-U
-u
-0 O
-0.7 g
-1 w
--7873.3672 8573.5781 m
--7864.0703 8573.5313 L
--7859.7119 8571.8047 L
--7855.1343 8573.5313 L
--7846.4214 8573.5313 L
--7846.4927 8575.5557 L
--7873.3672 8575.5557 L
--7873.3672 8573.5781 L
-f
-0 R
-0.25 G
-0.5 w
--7846.4546 8573.5781 m
--7846.5649 8575.5557 L
--7873.4038 8575.5557 L
-S
-0.9 G
--7855.1758 8573.5781 m
--7846.4546 8573.5781 L
-S
-0.25 G
--7859.7817 8571.8047 m
--7855.1758 8573.5781 L
-S
-0.9 G
--7873.4038 8575.5557 m
--7873.4038 8573.5781 L
--7864.1406 8573.5781 L
--7859.7817 8571.8047 L
-S
-U
-u
-0 O
-0.7495 g
-0.25 G
-2 J 2 M
--7874.8838 8572.75 m
--7874.8911 8550.8809 l
--7873.9082 8549.8848 L
--7845.9302 8549.9121 L
--7844.9922 8551.0508 L
--7844.9922 8572.4648 L
--7845.8022 8573.6045 L
--7874.0366 8573.6045 l
--7874.8838 8572.75 L
-b
-/BBAccumRotation (4.712389) XT
-0.8748 G
--7874.0366 8573.6045 m
--7874.8838 8572.75 L
--7874.8911 8550.8809 l
--7873.9082 8549.8848 L
--7845.9302 8549.9121 L
-S
-/BBAccumRotation (4.712389) XT
-0 O
-0.9 g
-0.25 G
--7848.0239 8570.7168 m
--7848.0054 8552.7617 L
--7871.8994 8552.7617 L
--7871.9014 8570.7148 L
--7848.0239 8570.7168 L
-b
-/BBAccumRotation (4.712389) XT
-U
-U
-u
-0.15 G
-0 J 4 M
--7843.333 8579.5479 m
--7859.8857 8579.5479 L
--7876.439 8579.5479 L
--7883.001 8582.9805 L
--7883.001 8585 L
--7836.9722 8585 L
--7836.9722 8582.9805 L
--7843.333 8579.5479 L
-s
--7874.0366 8573.6045 m
--7873.4038 8573.6045 L
--7873.4038 8575.5557 L
--7873.3672 8575.5449 L
--7873.3672 8575.5527 L
--7873.4038 8575.5557 L
--7873.3672 8575.5557 L
--7862.731 8575.5557 L
--7868.8462 8576.6094 L
--7871.125 8576.6523 L
--7871.1567 8576.6523 L
--7871.1567 8578.4512 L
--7871.125 8578.4414 L
--7871.125 8578.4482 L
--7871.1567 8578.4512 L
--7871.125 8578.4512 L
--7848.7905 8578.4512 L
--7848.729 8578.4512 L
--7848.6694 8576.6094 L
--7850.4634 8576.6094 L
--7856.7002 8575.5557 L
--7846.5649 8575.5557 L
--7846.4927 8575.5557 L
--7846.4233 8573.6045 L
--7845.8022 8573.6045 L
--7844.9922 8572.4648 L
--7844.9922 8551.0508 L
--7845.9302 8549.9121 L
--7873.9082 8549.8848 L
--7874.8911 8550.8809 L
--7874.8838 8572.75 L
--7874.0366 8573.6045 L
-s
-U
-U
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 22)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7876.001 8578.6211 m
--7827.9502 8578.6211 L
--7827.9502 8497.4414 L
--7876.001 8497.4414 L
--7876.001 8578.6211 L
-n
-u
-u
-u
-0 O
-0.7 g
--7869.2202 8497.6914 m
--7835.2578 8497.6914 L
--7834.7935 8497.7441 L
--7834.3569 8497.9102 L
--7834.0791 8498.2148 L
--7834.0034 8498.543 L
--7834.0034 8562.8496 L
--7834.0791 8563.1855 L
--7834.3569 8563.4355 L
--7834.7935 8563.6504 L
--7835.2578 8563.707 L
--7869.2202 8563.707 L
--7869.6855 8563.6504 L
--7870.0361 8563.4355 L
--7870.3618 8563.1855 L
--7870.4399 8562.8496 L
--7870.4399 8498.543 L
--7870.3618 8498.2148 L
--7870.0361 8497.9102 L
--7869.6855 8497.7441 L
--7869.2202 8497.6914 L
-f
-0 R
-0.25 G
-0.5 w
--7834.0034 8498.543 m
--7834.0034 8562.8496 L
--7834.0791 8563.1855 L
--7834.3569 8563.4355 L
--7834.7935 8563.6504 L
--7835.2578 8563.707 L
--7869.2202 8563.707 L
--7869.6855 8563.6504 L
--7870.0361 8563.4355 L
--7870.3618 8563.1855 L
--7870.4399 8562.8496 L
-S
-0.9 G
--7870.4399 8562.8496 m
--7870.4399 8498.543 L
--7870.3618 8498.2148 L
--7870.0361 8497.9102 L
--7869.6855 8497.7441 L
--7869.2202 8497.6914 L
--7835.2578 8497.6914 L
--7834.7935 8497.7441 L
--7834.3569 8497.9102 L
--7834.0791 8498.2148 L
--7834.0034 8498.543 L
-S
-1 Ap
-0 O
-0.8 g
-0.25 G
-2 J 2 M
--7838.79 8507.9629 m
--7865.4775 8507.9629 L
--7865.4775 8560.2607 L
--7838.79 8560.2607 L
--7838.79 8507.9629 L
-b
-u
--7838.79 8523.8691 m
--7865.4736 8523.8691 L
--7865.4736 8520.0957 L
--7838.79 8520.0957 L
--7838.79 8523.8691 L
-b
--7838.79 8520.0615 m
--7865.4736 8520.0615 L
--7865.4736 8516.2871 L
--7838.79 8516.2871 L
--7838.79 8520.0615 L
-b
-U
-0 Ap
-0.25 g
-0 J 1 w 4 M
--7842.3818 8509.4375 m
--7843.2319 8509.4375 L
--7862.2729 8509.4375 L
--7862.2729 8510.3271 L
--7855.8018 8510.3271 L
--7855.8018 8510.9629 L
--7848.8486 8510.9629 L
--7848.8486 8510.3271 L
--7842.3818 8510.3271 L
--7842.3818 8509.4375 L
-f
-1 Ap
-0.6 g
-0 R
-0.25 G
-2 J 0.5 w 2 M
--7842.8271 8511.3691 m
--7846.8706 8511.3691 L
--7846.8706 8510.7324 L
--7842.8271 8510.7324 L
--7842.8271 8511.3691 L
-b
-u
-0.8 g
--7840.8057 8514.5547 m
--7863.4463 8514.5547 L
--7863.4463 8513.0664 L
--7840.8057 8513.0664 L
--7840.8057 8514.5547 L
-b
--7863.4463 8514.5547 m
--7863.4463 8513.0664 L
--7840.8057 8513.0664 L
-S
-0.9 G
--7840.8057 8513.0664 m
--7840.8057 8514.5547 L
--7863.4463 8514.5547 L
-S
-U
-0 O
-0.7 g
-0 J 1 w 4 M
--7841.1318 8515.6172 m
--7845.1743 8515.6172 L
--7845.1743 8514.9805 L
--7841.1318 8514.9805 L
--7841.1318 8515.6172 L
-f
-0 R
-0.25 G
-2 J 0.5 w 2 M
--7841.1318 8514.9805 m
--7841.1318 8515.6172 L
--7845.1743 8515.6172 L
-S
-u
-u
--7861.5903 8500.6797 m
--7861.5903 8503.7402 L
--7866.9287 8503.7402 L
-S
--7861.5903 8503.7393 m
--7861.5903 8506.7578 L
--7866.9287 8506.7578 L
-S
-U
-u
-0.9 G
--7866.9287 8503.7129 m
--7866.9287 8500.6934 L
--7861.5903 8500.6934 L
-S
--7866.9287 8506.7578 m
--7866.9287 8503.7393 L
--7861.5903 8503.7393 L
-S
-U
-U
-u
-u
-0.25 G
--7837.7178 8500.6797 m
--7837.7178 8503.7402 L
--7843.0542 8503.7402 L
-S
--7837.7178 8503.7393 m
--7837.7178 8506.7578 L
--7843.0542 8506.7578 L
-S
-U
-u
-0.9 G
--7843.0542 8503.7129 m
--7843.0542 8500.6934 L
--7837.7178 8500.6934 L
-S
--7843.0542 8506.7578 m
--7843.0542 8503.7393 L
--7837.7178 8503.7393 L
-S
-U
-U
-0 O
-0.8 g
-0 J 1 w 4 M
--7832.144 8564.9395 m
--7872.3799 8564.9395 L
--7870.6865 8562.6406 L
--7833.8359 8562.6406 L
--7832.144 8564.9395 L
-f
-0 R
-0.9 G
-0.5 w
--7870.4072 8562.4785 m
--7872.3799 8564.9395 L
--7869.9111 8564.9395 l
-S
-0.25 G
--7834.083 8562.3672 m
--7832.144 8564.9395 L
--7872.0337 8564.9395 l
-S
-U
-0 Ap
-0.15 G
--7833.8359 8562.6406 m
--7833.874 8562.6406 L
--7834.0034 8562.4727 L
--7834.0034 8498.543 L
--7834.0791 8498.2148 L
--7834.3569 8497.9102 L
--7834.7935 8497.7441 L
--7835.2578 8497.6914 L
--7869.2202 8497.6914 L
--7869.6855 8497.7441 L
--7870.0361 8497.9102 L
--7870.3618 8498.2148 L
--7870.4399 8498.543 L
--7870.4399 8562.5195 L
--7870.5386 8562.6406 L
--7870.6865 8562.6406 L
--7872.3799 8564.9395 L
--7872.0337 8564.9395 L
--7869.9111 8564.9395 L
--7832.144 8564.9395 L
--7833.8359 8562.6406 L
-s
--7870.4399 8562.5195 m
--7833.8359 8562.5195 l
-S
-U
-U
-0 To
-1 0 0 -1 -7851.9761 8576.5957 0 Tp
-0 Tv
-TP
--24.0247 0 Td
-0 Tr
-0 O
-0 g
-1 w
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
-0 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-36 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 0 0 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
-0 Tc
-0 Tw
-(DNS Ser) Tx 1 -30 Tk
-(v) Tx 1 25 Tk
-(er) Tx 1 0 Tk
-(\r) TX
-TO
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 23)
-0 A
-u
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7878.9351 8565.3359 m
--7830.6465 8565.3359 L
--7830.6465 8506.8223 L
--7878.9351 8506.8223 L
--7878.9351 8565.3359 L
-n
-0 O
-0.64 g
--7830.6465 8513.9863 m
--7832.5977 8506.8223 L
--7849.127 8506.8223 L
--7851.001 8513.9863 L
--7858.666 8513.9863 L
--7860.7529 8506.8223 L
--7877.0625 8506.8223 L
--7878.9351 8513.9863 L
--7878.9351 8514.0137 L
--7830.6465 8514.0137 L
--7830.6465 8513.9863 L
-f
-0.92 g
--7878.9351 8514.0137 m
--7878.9351 8565.3164 L
--7870.5898 8565.3164 L
--7870.5898 8561.6152 L
--7870.5386 8561.6152 L
--7870.5386 8514.0137 L
--7878.9351 8514.0137 L
-f
--7830.6465 8514.0137 m
--7838.7871 8514.0137 L
--7838.7871 8565.3359 L
--7830.6465 8565.3359 L
--7830.6465 8514.0137 L
-f
-0.8158 g
--7870.5386 8514.0137 m
--7870.5386 8561.6152 L
--7838.8442 8561.6152 L
--7838.8442 8565.3359 L
--7838.7871 8565.3359 L
--7838.7871 8514.0137 L
--7870.5386 8514.0137 L
-f
-0 R
-0.67 G
-0.5 w 3.8635 M
--7858.666 8513.9863 m
--7858.6582 8561.6152 L
-S
--7857.8145 8513.9863 m
--7857.8066 8561.6152 L
-S
--7856.9634 8513.9863 m
--7856.9551 8561.6152 L
-S
--7856.1113 8513.9863 m
--7856.103 8561.6152 L
-S
--7855.2598 8513.9863 m
--7855.252 8561.6152 L
-S
--7854.4082 8513.9863 m
--7854.3999 8561.6152 L
-S
--7853.5566 8513.9863 m
--7853.5488 8561.6152 L
-S
--7853.5718 8513.9863 m
--7853.563 8561.6152 L
-S
--7852.7202 8513.9863 m
--7852.7114 8561.6152 L
-S
--7851.8682 8513.9863 m
--7851.8594 8561.6152 L
-S
--7851.0161 8513.9863 m
--7851.0078 8561.6152 L
-S
-U
-0 To
-1 0 0 -1 -7854.791 8576.5957 0 Tp
-0 Tv
-TP
--21.2094 0 Td
-0 Tr
-0 O
-0 g
-1 w 4 M
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
-0 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-53.0468 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 0 0 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 4 Tl
-0 Tc
-0 Tw
-(Mainfr) Tx 1 10 Tk
-(ame) Tx 1 0 Tk
-(\r) TX
-TO
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 43)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7883.749 8585.8232 m
--7870.9414 8585.8232 L
--7870.9414 8557.1563 L
--7883.749 8557.1563 L
--7883.749 8585.8232 L
-n
-0 O
-0.3 g
--7870.9414 8574.5498 m
--7875.1558 8563.2031 L
--7875.3862 8562.5801 -7876.0439 8562.2598 -7876.6719 8562.4141 C
--7876.8018 8562.3506 -7876.9473 8562.3359 -7877.0889 8562.3164 C
--7875.771 8562.1797 -7874.7358 8561.1084 -7874.7358 8559.7627 c
--7874.7358 8558.3184 -7875.9009 8557.1563 -7877.3447 8557.1563 c
--7878.7842 8557.1563 -7879.9482 8558.3184 -7879.9482 8559.7627 c
--7879.9482 8561.1084 -7878.916 8562.1797 -7877.6016 8562.3164 C
--7877.7441 8562.3359 -7877.8809 8562.3506 -7878.0186 8562.4141 C
--7878.645 8562.2598 -7879.3018 8562.5801 -7879.5313 8563.2031 C
--7883.749 8574.5498 L
--7884 8575.2168 -7883.6543 8575.9688 -7882.9834 8576.2188 c
--7882.313 8576.4658 -7881.5664 8576.123 -7881.3193 8575.4531 C
--7880.1289 8572.2441 L
--7880.0054 8572.6758 -7879.876 8573.0762 -7879.7119 8573.4385 C
--7882.4902 8584.2402 L
--7882.668 8584.9375 -7882.252 8585.6416 -7881.5586 8585.8232 c
--7880.8657 8586 -7880.1626 8585.583 -7879.9766 8584.8867 C
--7877.5918 8575.5967 L
--7877.5049 8575.6084 -7877.4282 8575.6494 -7877.3447 8575.6494 c
--7877.2617 8575.6494 -7877.1855 8575.6084 -7877.0991 8575.5967 C
--7874.7129 8584.8867 L
--7874.5303 8585.583 -7873.8242 8586 -7873.1318 8585.8232 c
--7872.4385 8585.6416 -7872.0215 8584.9375 -7872.1978 8584.2402 C
--7874.9766 8573.4385 L
--7874.8154 8573.0762 -7874.6846 8572.6758 -7874.5625 8572.2441 C
--7873.3711 8575.4531 L
--7873.125 8576.123 -7872.3799 8576.4658 -7871.707 8576.2188 c
--7871.0391 8575.9688 -7870.6914 8575.2168 -7870.9414 8574.5498 C
-f
-U
-%AI8_EndBrushPattern
-%AI5_End_NonPrinting--
-%AI5_BeginPalette
-0 0 Pb
-1 1 1 1 ([Registration]) 0 Xs
-([Registration]) Pc
-0 0 0 0.15 (15%) 0 0 Xk
-(15%) Pc
-0 0 0 0.3 (30%) 0 0 Xk
-(30%) Pc
-0 0 0 0.5 (50%) 0 0 Xk
-(50%) Pc
-0 0 0 0.75 (75%) 0 0 Xk
-(75%) Pc
-(horizontal rules) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(horizontal rules) Pc
-(bi-direction diagonals) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(bi-direction diagonals) Pc
-(one direction diagonals) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(one direction diagonals) Pc
-(white dots) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(white dots) Pc
-(black dots) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(black dots) Pc
-PB
-%AI5_EndPalette
-%AI5_Begin_NonPrinting
-Np
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Client)
-(1 /New Pattern 19/ 0 0.0784314 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Client 1)
-(1 /New Pattern 19/ 0 0.0784314 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Folders)
-(1 /New Pattern 9/ 0 0.160784 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Mainframe)
-(1 /New Pattern 23/ 0 0.184314 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(person)
-(1 /New Pattern 43/ 0 0.701961 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Print spooler)
-(1 /New Pattern 2/ 0 0.854902 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Printer)
-(1 /New Pattern 10/ 0 0.160784 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Scatter Brush 1)
-(1 /New Pattern 22/ 0 0.2 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Brush Manager Order)
-(Adobe Brush Manager Order)
-( Adobe Scatter Brush Tool/ Scatter Brush 1/ Adobe Scatter Brush Tool/ ) -
-(Mainframe/ Adobe Scatter Brush Tool/ Client/ Adobe Scatter Brush Tool/) -
-( person/ Adobe Scatter Brush Tool/ Print spooler/ Adobe Scatter Brush ) -
-(Tool/ Folders/ Adobe Scatter Brush Tool/ Printer/ Adobe Scatter Brush ) -
-(Tool/ Client 1/) .
-%AI8_EndPluginObject
-%AI5_End_NonPrinting--
-%AI5_Begin_NonPrinting
-Np
-%AI8_PluginGroupInfo
-(Adobe Path Blends) (Adobe Blends Plugin) (Live Blends)
-%AI8_PluginGroupInfo
-(Adobe PatternOnPath Brush Tool) (Adobe Pattern Brush Plugin) (Art Brush Tool)
-%AI8_PluginGroupInfo
-(Adobe ArtOnPath Brush Tool) (Adobe Art Brush Plugin) (Art Brush Tool)
-%AI8_PluginGroupInfo
-(Adobe Calligraphic Brush Tool) (Undo New Calligraphic Brush) (Calligraphic Brush Tool)
-%AI8_PluginGroupInfo
-(Adobe Scatter Brush Tool) (Adobe Scatter Brush Plugin) (Scatter Brush Tool)
-%AI5_End_NonPrinting--
-%%EndSetup
-%AI5_BeginLayer
-1 1 1 1 0 0 1 0 79 128 255 0 50 Lb
-(Layer 1) Ln
-0 A
-0 R
-0 G
-800 Ar
-0 J 0 j 0.5 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-327.124 315.8066 m
-339.3242 318.5615 345.0566 314.5781 355.2559 313.3779 c
-360.9092 312.7119 380.5332 312.2432 384.124 314.8066 c
-S
-1 Ap
-0 O
-0.95 g
-1 XR
-501.71 169.1504 m
-153.71 169.1504 L
-153.71 589.1504 L
-501.71 589.1504 L
-501.71 169.1504 L
-(b) *
-u
-0 Ap
-0.64 g
-1 w
-0 XR
-344.8242 383.4502 m
-341.5918 390.4512 L
-314.2031 390.4512 L
-311.0977 383.4502 L
-298.3979 383.4502 L
-294.9399 390.4512 L
-267.9165 390.4512 L
-264.813 383.4502 L
-264.813 383.4258 L
-344.8242 383.4258 L
-344.8242 383.4502 L
-f
-0.92 g
-0 R
-0 G
-0.25 w
-264.813 383.4258 m
-264.813 294.8291 L
-278.6401 294.8291 L
-278.6401 298.4453 L
-278.7271 298.4453 L
-278.7271 383.4258 L
-264.813 383.4258 L
-b
-344.8242 383.4258 m
-331.3359 383.4258 L
-331.3359 294.8096 L
-344.8242 294.8096 L
-344.8242 383.4258 L
-b
-0.8158 g
-331.3359 383.4258 m
-278.7271 383.4258 L
-278.7271 298.4453 L
-331.2402 298.4453 L
-B
-0.67 G
-0.5 w 3.8635 M
-298.3979 383.4502 m
-298.4116 298.4453 L
-S
-299.8071 383.4502 m
-299.8208 298.4453 L
-S
-301.2202 383.4502 m
-301.2339 298.4453 L
-S
-302.6304 383.4502 m
-302.644 298.4453 L
-S
-304.0415 383.4502 m
-304.0542 298.4453 L
-S
-305.4536 383.4502 m
-305.4653 298.4453 L
-S
-306.8647 383.4502 m
-306.8755 298.4453 L
-S
-306.8394 383.4502 m
-306.853 298.4453 L
-S
-308.25 383.4502 m
-308.2656 298.4453 L
-S
-309.6602 383.4502 m
-309.6777 298.4453 L
-S
-311.0742 383.4502 m
-311.0879 298.4453 L
-S
-U
-0 G
-0.25 w 4 M
-331.2402 294.8096 m
-331.3359 294.8096 L
-344.8242 294.8096 L
-344.8242 383.4258 L
-344.8242 383.4502 L
-341.5918 390.4512 L
-314.2031 390.4512 L
-311.0977 383.4502 L
-298.3979 383.4502 L
-294.9399 390.4512 L
-267.9165 390.4512 L
-264.813 383.4502 L
-264.813 383.4258 L
-264.813 294.8291 L
-278.6401 294.8291 L
-278.6401 298.4453 L
-278.7271 298.4453 L
-331.2402 298.4453 L
-S
-0 To
-1 0 0 1 306.2915 395.3662 0 Tp
-0 Tv
-TP
--13.2744 0 Td
-0 Tr
-0 O
-0 g
-1 w
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
-0 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-23.6196 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 3.2805 3.2805 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
-0 Tc
-0 Tw
-(Ser) Tx 1 -30 Tk
-(v) Tx 1 25 Tk
-(er) Tx 1 0 Tk
-(\r) TX
-TO
-0 To
-1 0 0 1 236.4463 332.1426 0 Tp
-0 Tv
-TP
--14.7797 0 Td
-0 Tr
--4.5 Ts
-(P) Tx 1 40 Tk
-(ar) Tx 1 10 Tk
-(allel\r) Tx 1 0 Tk
-3.1148 -11 Td
-(Cab) Tx 1 20 Tk
-(le) Tx 1 0 Tk
-(\r) TX
-TO
-0 R
-0 G
-0.5 w
-184.8491 350.9229 m
-197.9233 350.9199 210.9907 351.3887 224.0674 351.2979 c
-227.6689 351.2725 249.1094 354.4385 250.6377 348.4697 c
-251.6982 344.3271 238.7969 344.8301 237.2236 340.9258 C
-241.8062 337.6826 254.5508 340.2188 259.3149 340.2549 c
-269.4844 340.3301 279.0869 337.2725 289.0425 336.8418 c
-S
-1 To
-1 0 0 1 277.1416 348.3008 0 Tp
-0 Tv
-1 Ap
-0 O
-0.88 g
-0.25 w
-334.2256 317.6982 m
-277.1416 317.6982 L
-277.1416 348.3008 L
-334.2256 348.3008 L
-334.2256 317.6982 L
-b
-TP
-6.7002 -8.25 Td
-0 Tr
-0 g
-1 w
-(Pr) Tx 1 -15 Tk
-(intser) Tx 1 -30 Tk
-(v) Tx 1 25 Tk
-(er\r) Tx 1 0 Tk
-4.1519 -11 Td
-(Softw) Tx 1 15 Tk
-(are) Tx 1 0 Tk
-(\r) TX
-TO
-u
-%_0 Ap
-%_0 R
-%_0 G
-%_397.4795 315.1504 m
-%_S
-%_U
-%_0 Ap
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-397.4795 315.1504 m
-N
-u
-u
-u
-0 O
-0.7495 g
-0 R
-0.25 G
-1 j 0.5 w 2 M
-420.4502 297.5928 m
-420.4502 299.6123 l
-414.0889 303.0449 l
-397.5361 303.0449 L
-380.9834 303.0449 l
-374.4209 299.6123 l
-374.4209 297.5928 l
-420.4502 297.5928 l
-b
-0.8748 G
-2 J 0 j
-397.5361 303.0449 m
-380.9834 303.0449 l
-374.4209 299.6123 l
-374.4209 297.5928 l
-S
-420.4502 299.6123 m
-414.0889 303.0449 l
-397.5361 303.0449 L
-S
-0 O
-0.9 g
-0.25 G
-0 J 1 j
-381.083 301.833 m
-377.0449 299.6123 l
-417.6221 299.6123 l
-414.1904 301.833 l
-381.083 301.833 l
-b
-U
-u
-u
-0.7 g
-0 j 1 w 4 M
-386.2969 305.9404 m
-388.5752 305.9834 L
-397.6768 307.5518 L
-406.958 305.9834 L
-408.7529 305.9834 L
-408.6924 304.1416 L
-386.2969 304.1416 L
-386.2969 305.9404 L
-f
-0 R
-0.25 G
-0.5 w
-408.7236 305.9404 m
-408.6318 304.1416 L
-386.2646 304.1416 L
-S
-0.9 G
-406.9238 305.9404 m
-408.7236 305.9404 L
-S
-0.25 G
-397.6182 307.5518 m
-406.9238 305.9404 L
-S
-0.9 G
-386.2646 304.1416 m
-386.2646 305.9404 L
-388.5186 305.9404 L
-397.6182 307.5518 L
-S
-U
-u
-0 O
-0.7 g
-1 w
-384.0547 309.0146 m
-393.3516 309.0615 L
-397.71 310.7881 L
-402.2881 309.0615 L
-411.001 309.0615 L
-410.9287 307.0371 L
-384.0547 307.0371 L
-384.0547 309.0146 L
-f
-0 R
-0.25 G
-0.5 w
-410.9678 309.0146 m
-410.8564 307.0371 L
-384.0186 307.0371 L
-S
-0.9 G
-402.2461 309.0146 m
-410.9678 309.0146 L
-S
-0.25 G
-397.6396 310.7881 m
-402.2461 309.0146 L
-S
-0.9 G
-384.0186 307.0371 m
-384.0186 309.0146 L
-393.2813 309.0146 L
-397.6396 310.7881 L
-S
-U
-u
-0 O
-0.7495 g
-0.25 G
-2 J 2 M
-382.5381 309.8428 m
-382.5303 331.7119 l
-383.5137 332.708 L
-411.4912 332.6807 L
-412.4297 331.542 L
-412.4297 310.1279 L
-411.6201 308.9883 L
-383.3857 308.9883 l
-382.5381 309.8428 L
-b
-/BBAccumRotation (4.712389) XT
-0.8748 G
-383.3857 308.9883 m
-382.5381 309.8428 L
-382.5303 331.7119 l
-383.5137 332.708 L
-411.4912 332.6807 L
-S
-/BBAccumRotation (4.712389) XT
-0 O
-0.9 g
-0.25 G
-409.3975 311.876 m
-409.417 329.8311 L
-385.5225 329.8311 L
-385.5205 311.8779 L
-409.3975 311.876 L
-b
-/BBAccumRotation (4.712389) XT
-U
-U
-u
-0.15 G
-0 J 4 M
-414.0889 303.0449 m
-397.5361 303.0449 L
-380.9834 303.0449 L
-374.4209 299.6123 L
-374.4209 297.5928 L
-420.4502 297.5928 L
-420.4502 299.6123 L
-414.0889 303.0449 L
-s
-383.3857 308.9883 m
-384.0186 308.9883 L
-384.0186 307.0371 L
-384.0547 307.0479 L
-384.0547 307.04 L
-384.0186 307.0371 L
-384.0547 307.0371 L
-394.6904 307.0371 L
-388.5752 305.9834 L
-386.2969 305.9404 L
-386.2646 305.9404 L
-386.2646 304.1416 L
-386.2969 304.1514 L
-386.2969 304.1445 L
-386.2646 304.1416 L
-386.2969 304.1416 L
-408.6318 304.1416 L
-408.6924 304.1416 L
-408.7529 305.9834 L
-406.958 305.9834 L
-400.7217 307.0371 L
-410.8564 307.0371 L
-410.9287 307.0371 L
-410.999 308.9883 L
-411.6201 308.9883 L
-412.4297 310.1279 L
-412.4297 331.542 L
-411.4912 332.6807 L
-383.5137 332.708 L
-382.5303 331.7119 L
-382.5381 309.8428 L
-383.3857 308.9883 L
-s
-U
-U
-U
-U
-(Adobe Scatter Brush Tool) 1 0 56 XP
-%010203043F8000003F8000003F8000003F80000000000000000000000000
-%000000000000000000000000000000000F36436C69656E742031
-/Adobe_Brushed_Path () XT
-0 To
-1 0 0 1 398.3652 291.5283 0 Tp
-0 Tv
-TP
--6.1604 0 Td
-0 Tr
-0 O
-0 g
-1 w
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
--4.5 Ts
-100 100 Tz
--20 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-23.6196 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 3.2805 3.2805 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
--0.18 Tc
-0 Tw
-(PC) Tx 1 0 Tk
-(\r) TX
-TO
-0 To
-1 0 0 1 398.3652 342.3154 0 Tp
-0 Tv
-TP
--15.9844 0 Td
-0 Tr
-(Netw) Tx 1 10 Tk
-(or) Tx 1 -15 Tk
-(k) Tx 1 0 Tk
-(\r) TX
-TO
-0 To
-1 0 0 1 176.1445 369.5293 0 Tp
-0 Tv
-TP
--12.7793 0 Td
-0 Tr
-(Pr) Tx 1 -15 Tk
-(inter) Tx 1 0 Tk
-(\r) TX
-TO
-u
-%_1 g
-%_0 R
-%_0.67 G
-%_1 M
-%_184.939 348.2959 m
-%_B
-%_U
-%_0 Ap
-0 A
-u
-0 O
-1 g
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-184.939 348.2959 m
-F
-u
-0.8 g
-198.6704 339.2217 m
-218.7153 346.0791 l
-217.1348 348.9805 l
-204.4736 345.0244 l
-198.4072 348.9805 l
-198.6704 339.2217 l
-f
-0 R
-0.9 G
-0.5 w
-217.4067 349.1064 m
-204.4736 345.0244 l
-S
-0.5 G
-218.7153 346.0791 m
-217.1348 348.9805 l
-S
-0.25 G
-198.6704 339.2217 m
-218.7153 346.0791 l
-S
-0.5 G
-204.4736 345.0244 m
-198.4072 348.9805 l
-S
-0 O
-0.8 g
-1 w
-178.626 356.6309 m
-190.7568 361.9053 l
-194.1865 357.6865 l
-178.626 356.6309 l
-f
-1 Ap
-0.57 g
-198.9341 337.376 m
-152.5137 337.376 L
-152.5137 334.4756 L
-198.9341 334.4756 L
-198.9341 337.376 L
-f
-0 Ap
-0 R
-0.5 G
-0.5 w
-190.7568 361.9053 m
-194.1865 357.6865 l
-S
-0.9 G
-178.626 356.6309 m
-191.3188 362.1826 l
-S
-0 O
-0.8 g
-1 w
-151.1929 358.668 m
-151.1929 337.3447 l
-199.9893 337.3447 l
-199.9893 354.5186 l
-196.5601 358.6084 l
-151.1929 358.668 l
-f
-0 R
-0.5 G
-0.5 w
-151.1929 342.9141 m
-199.9893 342.9141 l
-S
-154.0952 355.3115 m
-163.5913 355.3115 l
-S
-154.0952 353.6631 m
-163.5913 353.6631 l
-S
-154.0952 352.0156 m
-163.5913 352.0156 l
-S
-154.0952 350.3672 m
-163.5913 350.3672 l
-S
-154.0952 348.7197 m
-163.5913 348.7197 l
-S
-199.9893 354.5186 m
-196.5601 358.6084 l
-S
-0.25 G
-151.1929 337.3447 m
-199.9893 337.3447 l
-199.9893 354.5186 l
-S
-0.9 G
-196.5601 358.6377 m
-151.1929 358.6377 l
-151.1929 337.0752 l
-S
-0.25 G
-198.9341 337.3447 m
-198.9341 334.4307 l
-152.5225 334.4307 l
-S
-U
-U
-(Adobe Scatter Brush Tool) 1 0 55 XP
-%010203043F8000003F8000003F8000003F80000000000000000000000000
-%0000000000000000000000000000000007995072696E746572
-/Adobe_Brushed_Path () XT
-0 To
-1 0 0 1 294.2847 278.0166 0 Tp
-0 Tv
-TP
-0 Tr
-0 O
-0 g
-1 w
-%_ 0 50 XQ
-/_Formata-Bold 9 8.82 -2.313 Tf
-0 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 0 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-0 TA
-%_ 0 XL
-0 TY
-0 TV
-0.0244 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 0 0 Ti
-0 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
-0 Tc
-0 Tw
-(\r) Tx
-TO
-LB
-%AI5_EndLayer--
-%%PageTrailer
-gsave annotatepage grestore showpage
-%%Trailer
-Adobe_Illustrator_AI5 /terminate get exec
-Adobe_shading_AI8 /terminate get exec
-Adobe_ColorImage_AI6 /terminate get exec
-Adobe_typography_AI5 /terminate get exec
-Adobe_cshow /terminate get exec
-Adobe_level2_AI5 /terminate get exec
-%%EOF
diff --git a/en_US.ISO8859-1/books/corp-net-guide/08-02.eps b/en_US.ISO8859-1/books/corp-net-guide/08-02.eps
deleted file mode 100644
index 2317acfb8d..0000000000
--- a/en_US.ISO8859-1/books/corp-net-guide/08-02.eps
+++ /dev/null
@@ -1,8655 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: Adobe Illustrator(R) 8.0
-%%AI8_CreatorVersion: 8.0.1
-%%For: (Mark Bergeron) (PD&PS)
-%%Title: (08-02 3594)
-%%CreationDate: (11/20/00) (3:35 PM)
-%%BoundingBox: 150 266 424 398
-%%HiResBoundingBox: 150.9429 266.0234 423.8008 397.6465
-%%DocumentProcessColors: Black
-%%DocumentFonts: Helvetica
-%%DocumentNeededFonts: Helvetica
-%%DocumentSuppliedResources: procset Adobe_level2_AI5 1.2 0
-%%+ procset Adobe_typography_AI5 1.0 1
-%%+ procset Adobe_ColorImage_AI6 1.3 0
-%%+ procset Adobe_Illustrator_AI5 1.3 0
-%%+ procset Adobe_cshow 2.0 8
-%%+ procset Adobe_shading_AI8 1.0 0
-%AI5_FileFormat 4.0
-%AI3_ColorUsage: Black&White
-%AI3_IncludePlacedImages
-%AI7_ImageSettings: 1
-%%CMYKProcessColor: 0 0 0 0.15 (15%)
-%%+ 0 0 0 0.3 (30%)
-%%+ 0 0 0 0.5 (50%)
-%%+ 0 0 0 0.75 (75%)
-%%+ 1 1 1 1 ([Registration])
-%%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set)
-%%+ Options: 1 16 0 1 0 1 1 1 0 1 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 2 3 4
-%%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 ()
-%AI3_TemplateBox: 306.5 395.5 306.5 395.5
-%AI3_TileBox: 12 14 600 782
-%AI3_DocumentPreview: Macintosh_ColorPic
-%AI5_ArtSize: 612 792
-%AI5_RulerUnits: 3
-%AI5_ArtFlags: 1 0 0 1 0 0 1 0 0
-%AI5_TargetResolution: 800
-%AI5_NumLayers: 1
-%AI8_OpenToView: 217.1108 471.0039 3.4569 1137 777 18 0 1 7 40 0 0
-%AI5_OpenViewLayers: 7
-%%PageOrigin:12 14
-%%AI3_PaperRect:-12 782 600 -10
-%%AI3_Margin:12 -14 -12 10
-%AI7_GridSettings: 12 3 12 3 1 0 0.29 1 1 0.65 1 1
-%%EndComments
-%%BeginProlog
-%%BeginResource: procset Adobe_level2_AI5 1.2 0
-%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation)
-%%Version: 1.2 0
-%%CreationDate: (04/10/93) ()
-%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved)
-userdict /Adobe_level2_AI5 26 dict dup begin
- put
- /packedarray where not
- {
- userdict begin
- /packedarray
- {
- array astore readonly
- } bind def
- /setpacking /pop load def
- /currentpacking false def
- end
- 0
- } if
- pop
- userdict /defaultpacking currentpacking put true setpacking
- /initialize
- {
- Adobe_level2_AI5 begin
- } bind def
- /terminate
- {
- currentdict Adobe_level2_AI5 eq
- {
- end
- } if
- } bind def
- mark
- /setcustomcolor where not
- {
- /findcmykcustomcolor
- {
- (AI8_CMYK_CustomColor)
- 6 packedarray
- } bind def
- /findrgbcustomcolor
- {
- (AI8_RGB_CustomColor)
- 5 packedarray
- } bind def
- /setcustomcolor
- {
- exch
- aload pop dup
- (AI8_CMYK_CustomColor) eq
- {
- pop pop
- 4
- {
- 4 index mul
- 4 1 roll
- } repeat
- 5 -1 roll pop
- setcmykcolor
- }
- {
- dup (AI8_RGB_CustomColor) eq
- {
- pop pop
- 3
- {
- 1 exch sub
- 3 index mul
- 1 exch sub
- 3 1 roll
- } repeat
- 4 -1 roll pop
- setrgbcolor
- }
- {
- pop
- 4
- {
- 4 index mul 4 1 roll
- } repeat
- 5 -1 roll pop
- setcmykcolor
- } ifelse
- } ifelse
- }
- def
- } if
- /setAIseparationgray
- {
- false setoverprint
- 0 setgray
- /setseparationgray where{
- pop setseparationgray
- }{
- /setcolorspace where{
- pop
- [/Separation (All) /DeviceCMYK {dup dup dup}] setcolorspace
- 1 exch sub setcolor
- }{
- setgray
- }ifelse
- }ifelse
- } def
-
- /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def
- userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put
- userdict /level2?
- systemdict /languagelevel known dup
- {
- pop systemdict /languagelevel get 2 ge
- } if
- put
-/level2ScreenFreq
-{
- begin
- 60
- HalftoneType 1 eq
- {
- pop Frequency
- } if
- HalftoneType 2 eq
- {
- pop GrayFrequency
- } if
- HalftoneType 5 eq
- {
- pop Default level2ScreenFreq
- } if
- end
-} bind def
-userdict /currentScreenFreq
- level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put
-level2? not
- {
- /setcmykcolor where not
- {
- /setcmykcolor
- {
- exch .11 mul add exch .59 mul add exch .3 mul add
- 1 exch sub setgray
- } def
- } if
- /currentcmykcolor where not
- {
- /currentcmykcolor
- {
- 0 0 0 1 currentgray sub
- } def
- } if
- /setoverprint where not
- {
- /setoverprint /pop load def
- } if
- /selectfont where not
- {
- /selectfont
- {
- exch findfont exch
- dup type /arraytype eq
- {
- makefont
- }
- {
- scalefont
- } ifelse
- setfont
- } bind def
- } if
- /cshow where not
- {
- /cshow
- {
- [
- 0 0 5 -1 roll aload pop
- ] cvx bind forall
- } bind def
- } if
- } if
- cleartomark
- /anyColor?
- {
- add add add 0 ne
- } bind def
- /testColor
- {
- gsave
- setcmykcolor currentcmykcolor
- grestore
- } bind def
- /testCMYKColorThrough
- {
- testColor anyColor?
- } bind def
- userdict /composite?
- 1 0 0 0 testCMYKColorThrough
- 0 1 0 0 testCMYKColorThrough
- 0 0 1 0 testCMYKColorThrough
- 0 0 0 1 testCMYKColorThrough
- and and and
- put
- composite? not
- {
- userdict begin
- gsave
- /cyan? 1 0 0 0 testCMYKColorThrough def
- /magenta? 0 1 0 0 testCMYKColorThrough def
- /yellow? 0 0 1 0 testCMYKColorThrough def
- /black? 0 0 0 1 testCMYKColorThrough def
- grestore
- /isCMYKSep? cyan? magenta? yellow? black? or or or def
- /customColor? isCMYKSep? not def
- end
- } if
- end defaultpacking setpacking
-%%EndResource
-%%BeginResource: procset Adobe_typography_AI5 1.0 1
-%%Title: (Typography Operators)
-%%Version: 1.0 1
-%%CreationDate:(6/10/1996) ()
-%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved)
-currentpacking true setpacking
-userdict /Adobe_typography_AI5 68 dict dup begin
-put
-/initialize
-{
- begin
- begin
- Adobe_typography_AI5 begin
- Adobe_typography_AI5
- {
- dup xcheck
- {
- bind
- } if
- pop pop
- } forall
- end
- end
- end
- Adobe_typography_AI5 begin
-} def
-/terminate
-{
- currentdict Adobe_typography_AI5 eq
- {
- end
- } if
-} def
-/modifyEncoding
-{
- /_tempEncode exch ddef
- /_pntr 0 ddef
- {
- counttomark -1 roll
- dup type dup /marktype eq
- {
- pop pop exit
- }
- {
- /nametype eq
- {
- _tempEncode /_pntr dup load dup 3 1 roll 1 add ddef 3 -1 roll
- put
- }
- {
- /_pntr exch ddef
- } ifelse
- } ifelse
- } loop
- _tempEncode
-} def
-/havefont
-{
- systemdict /languagelevel known
- {
- /Font resourcestatus dup
- { exch pop exch pop }
- if
- }
- {
- systemdict /FontDirectory get 1 index known
- { pop true }
- {
- systemdict /fileposition known
- {
- dup length 6 add exch
- Ss 6 250 getinterval
- cvs pop
- Ss exch 0 exch getinterval
- status
- { pop pop pop pop true }
- { false }
- ifelse
- }
- {
- pop false
- }
- ifelse
- }
- ifelse
- }
- ifelse
-} def
-/TE
-{
- StandardEncoding 256 array copy modifyEncoding
- /_nativeEncoding exch def
-} def
-/subststring {
- exch 2 index exch search
- {
- exch pop
- exch dup () eq
- {
- pop exch concatstring
- }
- {
- 3 -1 roll
- exch concatstring
- concatstring
- } ifelse
- exch pop true
- }
- {
- pop pop false
- } ifelse
-} def
-/concatstring {
- 1 index length 1 index length
- 1 index add
- string
- dup 0 5 index putinterval
- dup 2 index 4 index putinterval
- 4 1 roll pop pop pop
-} def
-%
-/TZ
-{
- dup type /arraytype eq
- {
- /_wv exch def
- }
- {
- /_wv 0 def
- } ifelse
- /_useNativeEncoding exch def
- 2 index havefont
- {
- 3 index
- 255 string
- cvs
-
- dup
- (_Symbol_)
- eq
- {
- pop
- 2 index
- findfont
-
- }
- {
- 1 index 0 eq
- {
- dup length 1 sub
- 1 exch
- getinterval
-
- cvn
- findfont
- }
- {
- pop 2 index findfont
- } ifelse
- } ifelse
- }
- {
- dup 1 eq
- {
- 2 index 64 string cvs
- dup (-90pv-RKSJ-) (-83pv-RKSJ-) subststring
- {
- exch pop dup havefont
- {
- findfont false
- }
- {
- pop true
- } ifelse
- }
- {
- pop dup
- (-90ms-RKSJ-) (-Ext-RKSJ-) subststring
- {
- exch pop dup havefont
- {
- findfont false
- }
- {
- pop true
- } ifelse
- }
- {
- pop pop true
- } ifelse
- } ifelse
- {
- 1 index 1 eq
- {
- /Ryumin-Light-Ext-RKSJ-V havefont
- {/Ryumin-Light-Ext-RKSJ-V}
- {/Courier}
- ifelse
- }
- {
- /Ryumin-Light-83pv-RKSJ-H havefont
- {/Ryumin-Light-83pv-RKSJ-H}
- {/Courier}
- ifelse
- } ifelse
- findfont
- [1 0 0.5 1 0 0] makefont
- } if
- }
- {
- /Courier findfont
- } ifelse
- } ifelse
- _wv type /arraytype eq
- {
- _wv makeblendedfont
- } if
- dup length 10 add dict
- begin
- mark exch
- {
- 1 index /FID ne
- {
- def
- } if
- cleartomark mark
- } forall
- pop
- /FontScript exch def
- /FontDirection exch def
- /FontRequest exch def
- /FontName exch def
- counttomark 0 eq
- {
- 1 _useNativeEncoding eq
- {
- /Encoding _nativeEncoding def
- } if
- cleartomark
- }
- {
- /Encoding load 256 array copy
- modifyEncoding /Encoding exch def
- } ifelse
- FontName currentdict
- end
- definefont pop
-} def
-/tr
-{
- _ax _ay 3 2 roll
-} def
-/trj
-{
- _cx _cy _sp _ax _ay 6 5 roll
-} def
-/a0
-{
- /Tx
- {
- dup
- currentpoint 3 2 roll
- tr _psf
- newpath moveto
- tr _ctm _pss
- } ddef
- /Tj
- {
- dup
- currentpoint 3 2 roll
- trj _pjsf
- newpath moveto
- trj _ctm _pjss
- } ddef
-} def
-/a1
-{
-W B
-} def
-/e0
-{
- /Tx
- {
- tr _psf
- } ddef
- /Tj
- {
- trj _pjsf
- } ddef
-} def
-/e1
-{
-W F
-} def
-/i0
-{
- /Tx
- {
- tr sp
- } ddef
- /Tj
- {
- trj jsp
- } ddef
-} def
-/i1
-{
- W N
-} def
-/o0
-{
- /Tx
- {
- tr sw rmoveto
- } ddef
- /Tj
- {
- trj swj rmoveto
- } ddef
-} def
-/r0
-{
- /Tx
- {
- tr _ctm _pss
- } ddef
- /Tj
- {
- trj _ctm _pjss
- } ddef
-} def
-/r1
-{
-W S
-} def
-/To
-{
- pop _ctm currentmatrix pop
-} def
-/TO
-{
- iTe _ctm setmatrix newpath
-} def
-/Tp
-{
- pop _tm astore pop _ctm setmatrix
- _tDict begin
- /W
- {
- } def
- /h
- {
- } def
-} def
-/TP
-{
- end
- iTm 0 0 moveto
-} def
-/Tr
-{
- _render 3 le
- {
- currentpoint newpath moveto
- } if
- dup 8 eq
- {
- pop 0
- }
- {
- dup 9 eq
- {
- pop 1
- } if
- } ifelse
- dup /_render exch ddef
- _renderStart exch get load exec
-} def
-/iTm
-{
- _ctm setmatrix _tm concat
- _shift aload pop _lineorientation 1 eq { exch } if translate
- _scale aload pop _lineorientation 1 eq _yokoorientation 1 eq or { exch } if scale
-} def
-/Tm
-{
- _tm astore pop iTm 0 0 moveto
-} def
-/Td
-{
- _mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto
-} def
-/iTe
-{
- _render -1 eq
- {
- }
- {
- _renderEnd _render get dup null ne
- {
- load exec
- }
- {
- pop
- } ifelse
- } ifelse
- /_render -1 ddef
-} def
-/Ta
-{
- pop
-} def
-/Tf
-{
- 1 index type /nametype eq
- {
- dup 0.75 mul 1 index 0.25 mul neg
- } if
- /_fontDescent exch ddef
- /_fontAscent exch ddef
- /_fontSize exch ddef
- /_fontRotateAdjust _fontAscent _fontDescent add 2 div neg ddef
- /_fontHeight _fontSize ddef
- findfont _fontSize scalefont setfont
-} def
-/Tl
-{
- pop neg 0 exch
- _leading astore pop
-} def
-/Tt
-{
- pop
-} def
-/TW
-{
- 3 npop
-} def
-/Tw
-{
- /_cx exch ddef
-} def
-/TC
-{
- 3 npop
-} def
-/Tc
-{
- /_ax exch ddef
-} def
-/Ts
-{
- 0 exch
- _shift astore pop
- currentpoint
- iTm
- moveto
-} def
-/Ti
-{
- 3 npop
-} def
-/Tz
-{
- count 1 eq { 100 } if
- 100 div exch 100 div exch
- _scale astore pop
- iTm
-} def
-/TA
-{
- pop
-} def
-/Tq
-{
- pop
-} def
-/Tg
-{
- pop
-} def
-/TG
-{
- pop
-} def
-/Tv
-{
- /_lineorientation exch ddef
-} def
-/TV
-{
- /_charorientation exch ddef
-} def
-/Ty
-{
- dup /_yokoorientation exch ddef 1 sub neg Tv
-} def
-/TY
-{
- pop
-} def
-/T~
-{
- Tx
-} def
-/Th
-{
- pop pop pop pop pop
-} def
-/TX
-{
- pop
-} def
-/Tk
-{
- _fontSize mul 1000 div
- _lineorientation 0 eq { neg 0 } { 0 exch } ifelse
- rmoveto
- pop
-} def
-/TK
-{
- 2 npop
-} def
-/T*
-{
- _leading aload pop
- _lineorientation 0 ne { exch } if
- Td
-} def
-/T*-
-{
- _leading aload pop
- _lineorientation 0 ne { exch } if
- exch neg exch neg
- Td
-} def
-/T-
-{
- _ax neg 0 rmoveto
- _lineorientation 1 eq _charorientation 0 eq and { 1 TV _hyphen Tx 0 TV } { _hyphen Tx } ifelse
-} def
-/T+
-{
-} def
-/TR
-{
- _ctm currentmatrix pop
- _tm astore pop
- iTm 0 0 moveto
-} def
-/TS
-{
- currentfont 3 1 roll
- /_Symbol_ findfont _fontSize scalefont setfont
-
- 0 eq
- {
- Tx
- }
- {
- Tj
- } ifelse
- setfont
-} def
-/Xb
-{
- pop pop
-} def
-/Tb /Xb load def
-/Xe
-{
- pop pop pop pop
-} def
-/Te /Xe load def
-/XB
-{
-} def
-/TB /XB load def
-currentdict readonly pop
-end
-setpacking
-%
-/X^
-{
- currentfont 5 1 roll
- dup havefont
- {
- findfont _fontSize scalefont setfont
- }
- {
- pop
- exch
- } ifelse
- 2 index 0 eq
- {
- Tx
- }
- {
- Tj
- } ifelse
- pop pop
- setfont
-} def
-/T^ /X^ load def
-%%EndResource
-%%BeginProcSet: Adobe_ColorImage_AI6 1.3 0
-userdict /Adobe_ColorImage_AI6 known not
-{
- userdict /Adobe_ColorImage_AI6 53 dict put
-} if
-userdict /Adobe_ColorImage_AI6 get begin
-/initialize {
- Adobe_ColorImage_AI6 begin
- Adobe_ColorImage_AI6 {
- dup type /arraytype eq {
- dup xcheck {
- bind
- } if
- } if
- pop pop
- } forall
-} def
-/terminate { end } def
-currentdict /Adobe_ColorImage_AI6_Vars known not {
- /Adobe_ColorImage_AI6_Vars 41 dict def
-} if
-Adobe_ColorImage_AI6_Vars begin
- /plateindex -1 def
- /_newproc null def
- /_proc1 null def
- /_proc2 null def
- /sourcearray 4 array def
- /_ptispace null def
- /_ptiname null def
- /_pti0 0 def
- /_pti1 0 def
- /_ptiproc null def
- /_ptiscale 0 def
- /_pticomps 0 def
- /_ptibuf 0 string def
- /_gtigray 0 def
- /_cticmyk null def
- /_rtirgb null def
- /XIEnable true def
- /XIType 0 def
- /XIEncoding 0 def
- /XICompression 0 def
- /XIChannelCount 0 def
- /XIBitsPerPixel 0 def
- /XIImageHeight 0 def
- /XIImageWidth 0 def
- /XIImageMatrix null def
- /XIRowBytes 0 def
- /XIFile null def
- /XIBuffer1 null def
- /XIBuffer2 null def
- /XIBuffer3 null def
- /XIDataProc null def
- /XIColorSpace /DeviceGray def
- /XIColorValues 0 def
- /XIPlateList false def
-end
-/ci6colorimage /colorimage where {/colorimage get}{null} ifelse def
-/ci6image systemdict /image get def
-/ci6curtransfer systemdict /currenttransfer get def
-/ci6curoverprint /currentoverprint where {/currentoverprint get}{{_of}} ifelse def
-/ci6foureq {
- 4 index ne {
- pop pop pop false
- }{
- 4 index ne {
- pop pop false
- }{
- 4 index ne {
- pop false
- }{
- 4 index eq
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6testplate {
- Adobe_ColorImage_AI6_Vars begin
- /plateindex -1 def
- /setcmykcolor where {
- pop
- gsave
- 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub
- 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub
- 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub
- 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub
- grestore
- 1 0 0 0 ci6foureq {
- /plateindex 0 def
- }{
- 0 1 0 0 ci6foureq {
- /plateindex 1 def
- }{
- 0 0 1 0 ci6foureq {
- /plateindex 2 def
- }{
- 0 0 0 1 ci6foureq {
- /plateindex 3 def
- }{
- 0 0 0 0 ci6foureq {
- /plateindex 5 def
- } if
- } ifelse
- } ifelse
- } ifelse
- } ifelse
- pop pop pop pop
- } if
- plateindex
- end
-} def
-/ci6concatprocs {
- /packedarray where {
- pop dup type /packedarraytype eq 2 index type
- /packedarraytype eq or
- }{
- false
- } ifelse
- {
- /_proc2 exch cvlit def
- /_proc1 exch cvlit def
- _proc1 aload pop
- _proc2 aload pop
- _proc1 length
- _proc2 length add
- packedarray cvx
- }{
- /_proc2 exch cvlit def
- /_proc1 exch cvlit def
- /_newproc _proc1 length _proc2 length add array def
- _newproc 0 _proc1 putinterval
- _newproc _proc1 length _proc2 putinterval
- _newproc cvx
- } ifelse
-} def
-/ci6istint {
- type /arraytype eq
-} def
-/ci6isspot {
- dup type /arraytype eq {
- dup length 1 sub get /Separation eq
- }{
- pop false
- } ifelse
-} def
-/ci6spotname {
- dup ci6isspot {dup length 2 sub get}{pop ()} ifelse
-} def
-/ci6altspace {
- aload pop pop pop ci6colormake
-} def
-/ci6numcomps {
- dup /DeviceGray eq {
- pop 1
- }{
- dup /DeviceRGB eq {
- pop 3
- }{
- /DeviceCMYK eq {
- 4
- }{
- 1
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6marksplate {
- dup /DeviceGray eq {
- pop plateindex 3 eq
- }{
- dup /DeviceRGB eq {
- pop plateindex 5 ne
- }{
- dup /DeviceCMYK eq {
- pop plateindex 5 ne
- }{
- dup ci6isspot {
- /findcmykcustomcolor where {
- pop
- dup length 2 sub get
- 0.1 0.1 0.1 0.1 5 -1 roll
- findcmykcustomcolor 1 setcustomcolor
- systemdict /currentgray get exec
- 1 ne
- }{
- pop plateindex 5 ne
- } ifelse
- }{
- pop plateindex 5 ne
- } ifelse
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6colormake {
- dup ci6numcomps
- exch 1 index 2 add 1 roll
- dup 1 eq {pop}{array astore} ifelse
- exch
-} def
-/ci6colorexpand {
- dup ci6spotname exch
- dup ci6istint {
- ci6altspace
- exch 4 1 roll
- }{
- 1 3 1 roll
- } ifelse
-} def
-/ci6colortint {
- dup /DeviceGray eq {
- 3 1 roll 1 exch sub mul 1 exch sub exch
- }{
- dup /DeviceRGB eq {
- 3 1 roll {1 exch sub 1 index mul 1 exch sub exch} forall pop 3 array astore exch
- }{
- dup /DeviceCMYK eq {
- 3 1 roll {1 index mul exch} forall pop 4 array astore exch
- }{
- 3 1 roll mul exch
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6colortocmyk {
- dup /DeviceGray eq {
- pop 1 exch sub 0 0 0 4 -1 roll 4 array astore
- }{
- dup /DeviceRGB eq {
- pop aload pop _rgbtocmyk 4 array astore
- }{
- dup /DeviceCMYK eq {
- pop
- }{
- ci6altspace ci6colortint ci6colortocmyk
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6makeimagedict {
- 7 dict begin
- /ImageType 1 def
- /Decode exch def
- /DataSource exch def
- /ImageMatrix exch def
- /BitsPerComponent exch def
- /Height exch def
- /Width exch def
- currentdict end
-} def
-/ci6stringinvert {
- 0 1 2 index length 1 sub {
- dup 2 index exch get 255 exch sub 2 index 3 1 roll put
- } for
-} def
-/ci6stringknockout {
- 0 1 2 index length 1 sub {
- 255 2 index 3 1 roll put
- } for
-} def
-/ci6stringapply {
- 0 1 4 index length 1 sub {
- dup
- 4 index exch get
- 3 index 3 1 roll
- 3 index exec
- } for
- pop exch pop
-} def
-/ci6walkrgbstring {
- 0 3 index
- dup length 1 sub 0 3 3 -1 roll {
- 3 getinterval {} forall
- 5 index exec
- 3 index
- } for
-
- 5 {pop} repeat
-} def
-/ci6walkcmykstring
-{
- 0 3 index
- dup length 1 sub 0 4 3 -1 roll {
- 4 getinterval {} forall
-
- 6 index exec
-
- 3 index
-
- } for
-
- 5 { pop } repeat
-
-} def
-/ci6putrgbtograystr
-{
- .11 mul exch
-
- .59 mul add exch
-
- .3 mul add
-
- cvi 3 copy put
-
- pop 1 add
-} def
-/ci6putcmyktograystr
-{
- exch .11 mul add
-
- exch .59 mul add
-
- exch .3 mul add
-
- dup 255 gt { pop 255 } if
-
- 255 exch sub cvi 3 copy put
-
- pop 1 add
-} def
-/ci6rgbtograyproc {
- Adobe_ColorImage_AI6_Vars begin
- sourcearray 0 get exec
- XIBuffer3
- dup 3 1 roll
-
- /ci6putrgbtograystr load exch
- ci6walkrgbstring
- end
-} def
-/ci6cmyktograyproc {
- Adobe_ColorImage_AI6_Vars begin
- sourcearray 0 get exec
- XIBuffer3
- dup 3 1 roll
-
- /ci6putcmyktograystr load exch
- ci6walkcmykstring
- end
-} def
-/ci6separatecmykproc {
- Adobe_ColorImage_AI6_Vars begin
- sourcearray 0 get exec
-
- XIBuffer3
-
- 0 2 index
-
- plateindex 4 2 index length 1 sub {
- get 255 exch sub
-
- 3 copy put pop 1 add
-
- 2 index
- } for
- pop pop exch pop
- end
-} def
-
-/ci6compositeimage {
- dup 1 eq {
- pop pop image
- }{
- /ci6colorimage load null ne {
- ci6colorimage
- }{
- 3 1 roll pop
- sourcearray 0 3 -1 roll put
- 3 eq {/ci6rgbtograyproc}{/ci6cmyktograyproc} ifelse load
- image
- } ifelse
- } ifelse
-} def
-/ci6knockoutimage {
- gsave
- 0 ci6curtransfer exec 1 ci6curtransfer exec
- eq {
- 0 ci6curtransfer exec 0.5 lt
- }{
- 0 ci6curtransfer exec 1 ci6curtransfer exec gt
- } ifelse
- {{pop 0}}{{pop 1}} ifelse
- systemdict /settransfer get exec
- ci6compositeimage
- grestore
-} def
-/ci6drawimage {
- ci6testplate -1 eq {
- pop ci6compositeimage
- }{
- dup type /arraytype eq {
- dup length plateindex gt {plateindex get}{pop false} ifelse
- }{
- {
- true
- }{
- dup 1 eq {plateindex 3 eq}{plateindex 3 le} ifelse
- } ifelse
- } ifelse
- {
- dup 1 eq {
- pop pop ci6image
- }{
- dup 3 eq {
- ci6compositeimage
- }{
- pop pop
- sourcearray 0 3 -1 roll put
- /ci6separatecmykproc load
- ci6image
- } ifelse
- } ifelse
- }{
- ci6curoverprint {
- 7 {pop} repeat
- }{
- ci6knockoutimage
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6proctintimage {
- /_ptispace exch store /_ptiname exch store /_pti1 exch store /_pti0 exch store /_ptiproc exch store
- /_pticomps _ptispace ci6numcomps store
- /_ptiscale _pti1 _pti0 sub store
- level2? {
- _ptiname length 0 gt version cvr 2012 ge and {
- [/Separation _ptiname _ptispace {_ptiproc}] setcolorspace
- [_pti0 _pti1] ci6makeimagedict ci6image
- }{
- [/Indexed _ptispace 255 {255 div _ptiscale mul _pti0 add _ptiproc}] setcolorspace
- [0 255] ci6makeimagedict ci6image
- } ifelse
- }{
- _pticomps 1 eq {
- {
- dup
- {
- 255 div _ptiscale mul _pti0 add _ptiproc 255 mul cvi put
- } ci6stringapply
- } ci6concatprocs ci6image
- }{
- {
- dup length _pticomps mul dup _ptibuf length ne {/_ptibuf exch string store}{pop} ifelse
- _ptibuf {
- exch _pticomps mul exch 255 div _ptiscale mul _pti0 add _ptiproc
- _pticomps 2 add -2 roll
- _pticomps 1 sub -1 0 {
- 1 index add 2 index exch
- 5 -1 roll
- 255 mul cvi put
- } for
- pop pop
- } ci6stringapply
- } ci6concatprocs false _pticomps
- /ci6colorimage load null eq {7 {pop} repeat}{ci6colorimage} ifelse
- } ifelse
- } ifelse
-} def
-/ci6graytintimage {
- /_gtigray 5 -1 roll store
- {1 _gtigray sub mul 1 exch sub} 4 1 roll
- /DeviceGray ci6proctintimage
-} def
-/ci6cmyktintimage {
- /_cticmyk 5 -1 roll store
- {_cticmyk {1 index mul exch} forall pop} 4 1 roll
- /DeviceCMYK ci6proctintimage
-} def
-/ci6rgbtintimage {
- /_rtirgb 5 -1 roll store
- {_rtirgb {1 exch sub 1 index mul 1 exch sub exch} forall pop} 4 1 roll
- /DeviceRGB ci6proctintimage
-} def
-/ci6tintimage {
- ci6testplate -1 eq {
- ci6colorexpand
- 3 -1 roll 5 -1 roll {0}{0 exch} ifelse 4 2 roll
- dup /DeviceGray eq {
- pop ci6graytintimage
- }{
- dup /DeviceRGB eq {
- pop ci6rgbtintimage
- }{
- pop ci6cmyktintimage
- } ifelse
- } ifelse
- }{
- dup ci6marksplate {
- plateindex 5 lt {
- ci6colortocmyk plateindex get
- dup 0 eq ci6curoverprint and {
- 7 {pop} repeat
- }{
- 1 exch sub
- exch {1 0}{0 1} ifelse () ci6graytintimage
- } ifelse
- }{
- pop exch {0}{0 exch} ifelse 0 3 1 roll () ci6graytintimage
- } ifelse
- }{
- ci6curoverprint {
- 8 {pop} repeat
- }{
- pop pop pop
- {pop 1} 0 1 () /DeviceGray ci6proctintimage
- } ifelse
- } ifelse
- } ifelse
-} def
-/XINullImage {
-} def
-/XIImageMask {
- XIImageWidth XIImageHeight false
- [XIImageWidth 0 0 XIImageHeight neg 0 0]
- /XIDataProc load
- imagemask
-} def
-/XIImageTint {
- XIImageWidth XIImageHeight XIBitsPerPixel
- [XIImageWidth 0 0 XIImageHeight neg 0 0]
- /XIDataProc load
- XIType 3 eq XIColorValues XIColorSpace ci6tintimage
-} def
-/XIImage {
- XIImageWidth XIImageHeight XIBitsPerPixel
- [XIImageWidth 0 0 XIImageHeight neg 0 0]
- /XIDataProc load
- false XIChannelCount XIPlateList ci6drawimage
-} def
-/XG {
- pop pop
-} def
-/XF {
- 13 {pop} repeat
-} def
-/Xh {
- Adobe_ColorImage_AI6_Vars begin
- gsave
- /XIType exch def
- /XIImageHeight exch def
- /XIImageWidth exch def
- /XIImageMatrix exch def
- 0 0 moveto
- XIImageMatrix concat
- XIImageWidth XIImageHeight scale
-
- /_lp /null ddef
- _fc
- /_lp /imagemask ddef
- end
-} def
-/XH {
- Adobe_ColorImage_AI6_Vars begin
- grestore
- end
-} def
-/XIEnable {
- Adobe_ColorImage_AI6_Vars /XIEnable 3 -1 roll put
-} def
-/XC {
- Adobe_ColorImage_AI6_Vars begin
- ci6colormake
- /XIColorSpace exch def
- /XIColorValues exch def
- end
-} def
-/XIPlates {
- Adobe_ColorImage_AI6_Vars begin
- /XIPlateList exch def
- end
-} def
-/XI
-{
- Adobe_ColorImage_AI6_Vars begin
- gsave
- /XIType exch def
- cvi dup
- 256 idiv /XICompression exch store
- 256 mod /XIEncoding exch store
- pop pop
- /XIChannelCount exch def
- /XIBitsPerPixel exch def
- /XIImageHeight exch def
- /XIImageWidth exch def
- pop pop pop pop
- /XIImageMatrix exch def
- XIBitsPerPixel 1 eq {
- XIImageWidth 8 div ceiling cvi
- }{
- XIImageWidth XIChannelCount mul
- } ifelse
- /XIRowBytes exch def
- XIEnable {
- /XIBuffer3 XIImageWidth string def
- XICompression 0 eq {
- /XIBuffer1 XIRowBytes string def
- XIEncoding 0 eq {
- {currentfile XIBuffer1 readhexstring pop}
- }{
- {currentfile XIBuffer1 readstring pop}
- } ifelse
- }{
- /XIBuffer1 256 string def
- /XIBuffer2 XIRowBytes string def
- {currentfile XIBuffer1 readline pop (%) anchorsearch {pop} if}
- /ASCII85Decode filter /DCTDecode filter
- /XIFile exch def
- {XIFile XIBuffer2 readstring pop}
- } ifelse
- /XIDataProc exch def
-
- XIType 1 ne {
- 0 setgray
- } if
- XIType 1 eq {
- XIImageMask
- }{
- XIType 2 eq XIType 3 eq or {
- XIImageTint
- }{
- XIImage
- } ifelse
- } ifelse
- }{
- XINullImage
- } ifelse
- /XIPlateList false def
- grestore
- end
-} def
-end
-%%EndProcSet
-%%BeginResource: procset Adobe_Illustrator_AI5 1.3 0
-%%Title: (Adobe Illustrator (R) Version 8.0 Full Prolog)
-%%Version: 1.3 0
-%%CreationDate: (3/7/1994) ()
-%%Copyright: ((C) 1987-1998 Adobe Systems Incorporated All Rights Reserved)
-currentpacking true setpacking
-userdict /Adobe_Illustrator_AI5_vars 112 dict dup begin
-put
-/_?cmyk false def
-/_eo false def
-/_lp /none def
-/_pf
-{
-} def
-/_ps
-{
-} def
-/_psf
-{
-} def
-/_pss
-{
-} def
-/_pjsf
-{
-} def
-/_pjss
-{
-} def
-/_pola 0 def
-/_doClip 0 def
-/cf currentflat def
-/_lineorientation 0 def
-/_charorientation 0 def
-/_yokoorientation 0 def
-/_tm matrix def
-/_renderStart
-[
-/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0
-] def
-/_renderEnd
-[
-null null null null /i1 /i1 /i1 /i1
-] def
-/_render -1 def
-/_shift [0 0] def
-/_ax 0 def
-/_ay 0 def
-/_cx 0 def
-/_cy 0 def
-/_leading
-[
-0 0
-] def
-/_ctm matrix def
-/_mtx matrix def
-/_sp 16#020 def
-/_hyphen (-) def
-/_fontSize 0 def
-/_fontAscent 0 def
-/_fontDescent 0 def
-/_fontHeight 0 def
-/_fontRotateAdjust 0 def
-/Ss 256 string def
-Ss 0 (fonts/) putinterval
-/_cnt 0 def
-/_scale [1 1] def
-/_nativeEncoding 0 def
-/_useNativeEncoding 0 def
-/_tempEncode 0 def
-/_pntr 0 def
-/_tDict 2 dict def
-/_hfname 100 string def
-/_hffound false def
-/Tx
-{
-} def
-/Tj
-{
-} def
-/CRender
-{
-} def
-/_AI3_savepage
-{
-} def
-/_gf null def
-/_cf 4 array def
-/_rgbf 3 array def
-/_if null def
-/_of false def
-/_fc
-{
-} def
-/_gs null def
-/_cs 4 array def
-/_rgbs 3 array def
-/_is null def
-/_os false def
-/_sc
-{
-} def
-/_pd 1 dict def
-/_ed 15 dict def
-/_pm matrix def
-/_fm null def
-/_fd null def
-/_fdd null def
-/_sm null def
-/_sd null def
-/_sdd null def
-/_i null def
-/_lobyte 0 def
-/_hibyte 0 def
-/_cproc null def
-/_cscript 0 def
-/_hvax 0 def
-/_hvay 0 def
-/_hvwb 0 def
-/_hvcx 0 def
-/_hvcy 0 def
-/_bitfont null def
-/_bitlobyte 0 def
-/_bithibyte 0 def
-/_bitkey null def
-/_bitdata null def
-/_bitindex 0 def
-/discardSave null def
-/buffer 256 string def
-/beginString null def
-/endString null def
-/endStringLength null def
-/layerCnt 1 def
-/layerCount 1 def
-/perCent (%) 0 get def
-/perCentSeen? false def
-/newBuff null def
-/newBuffButFirst null def
-/newBuffLast null def
-/clipForward? false def
-end
-userdict /Adobe_Illustrator_AI5 known not {
- userdict /Adobe_Illustrator_AI5 100 dict put
-} if
-userdict /Adobe_Illustrator_AI5 get begin
-/initialize
-{
- Adobe_Illustrator_AI5 dup begin
- Adobe_Illustrator_AI5_vars begin
- /_aicmykps where {pop /_?cmyk _aicmykps def}if
- discardDict
- {
- bind pop pop
- } forall
- dup /nc get begin
- {
- dup xcheck 1 index type /operatortype ne and
- {
- bind
- } if
- pop pop
- } forall
- end
- newpath
-} def
-/terminate
-{
- end
- end
-} def
-/_
-null def
-/ddef
-{
- Adobe_Illustrator_AI5_vars 3 1 roll put
-} def
-/xput
-{
- dup load dup length exch maxlength eq
- {
- dup dup load dup
- length 2 mul dict copy def
- } if
- load begin
- def
- end
-} def
-/npop
-{
- {
- pop
- } repeat
-} def
-/hswj
-{
- dup stringwidth 3 2 roll
- {
- _hvwb eq { exch _hvcx add exch _hvcy add } if
- exch _hvax add exch _hvay add
- } cforall
-} def
-/vswj
-{
- 0 0 3 -1 roll
- {
- dup 255 le
- _charorientation 1 eq
- and
- {
- dup cstring stringwidth 5 2 roll
- _hvwb eq { exch _hvcy sub exch _hvcx sub } if
- exch _hvay sub exch _hvax sub
- 4 -1 roll sub exch
- 3 -1 roll sub exch
- }
- {
- _hvwb eq { exch _hvcy sub exch _hvcx sub } if
- exch _hvay sub exch _hvax sub
- _fontHeight sub
- } ifelse
- } cforall
-} def
-/swj
-{
- 6 1 roll
- /_hvay exch ddef
- /_hvax exch ddef
- /_hvwb exch ddef
- /_hvcy exch ddef
- /_hvcx exch ddef
- _lineorientation 0 eq { hswj } { vswj } ifelse
-} def
-/sw
-{
- 0 0 0 6 3 roll swj
-} def
-/vjss
-{
- 4 1 roll
- {
- dup cstring
- dup length 1 eq
- _charorientation 1 eq
- and
- {
- -90 rotate
- currentpoint
- _fontRotateAdjust add
- moveto
- gsave
- false charpath currentpoint
- 5 index setmatrix stroke
- grestore
- _fontRotateAdjust sub
- moveto
- _sp eq
- {
- 5 index 5 index rmoveto
- } if
- 2 copy rmoveto
- 90 rotate
- }
- {
- currentpoint
- _fontHeight sub
- 5 index sub
- 3 index _sp eq
- {
- 9 index sub
- } if
-
- currentpoint
- exch 4 index stringwidth pop 2 div sub
- exch _fontAscent sub
- moveto
-
- gsave
- 2 index false charpath
- 6 index setmatrix stroke
- grestore
-
- moveto pop pop
- } ifelse
- } cforall
- 6 npop
-} def
-/hjss
-{
- 4 1 roll
- {
- dup cstring
- gsave
- false charpath currentpoint
- 5 index setmatrix stroke
- grestore
- moveto
- _sp eq
- {
- 5 index 5 index rmoveto
- } if
- 2 copy rmoveto
- } cforall
- 6 npop
-} def
-/jss
-{
- _lineorientation 0 eq { hjss } { vjss } ifelse
-} def
-/ss
-{
- 0 0 0 7 3 roll jss
-} def
-/vjsp
-{
- 4 1 roll
- {
- dup cstring
- dup length 1 eq
- _charorientation 1 eq
- and
- {
- -90 rotate
- currentpoint
- _fontRotateAdjust add
- moveto
- false charpath
- currentpoint
- _fontRotateAdjust sub
- moveto
- _sp eq
- {
- 5 index 5 index rmoveto
- } if
- 2 copy rmoveto
- 90 rotate
- }
- {
- currentpoint
- _fontHeight sub
- 5 index sub
- 3 index _sp eq
- {
- 9 index sub
- } if
-
- currentpoint
- exch 4 index stringwidth pop 2 div sub
- exch _fontAscent sub
- moveto
-
- 2 index false charpath
-
- moveto pop pop
- } ifelse
- } cforall
- 6 npop
-} def
-/hjsp
-{
- 4 1 roll
- {
- dup cstring
- false charpath
- _sp eq
- {
- 5 index 5 index rmoveto
- } if
- 2 copy rmoveto
- } cforall
- 6 npop
-} def
-/jsp
-{
- matrix currentmatrix
- _lineorientation 0 eq {hjsp} {vjsp} ifelse
-} def
-/sp
-{
- matrix currentmatrix
- 0 0 0 7 3 roll
- _lineorientation 0 eq {hjsp} {vjsp} ifelse
-} def
-/pl
-{
- transform
- 0.25 sub round 0.25 add exch
- 0.25 sub round 0.25 add exch
- itransform
-} def
-/setstrokeadjust where
-{
- pop true setstrokeadjust
- /c
- {
- curveto
- } def
- /C
- /c load def
- /v
- {
- currentpoint 6 2 roll curveto
- } def
- /V
- /v load def
- /y
- {
- 2 copy curveto
- } def
- /Y
- /y load def
- /l
- {
- lineto
- } def
- /L
- /l load def
- /m
- {
- moveto
- } def
-}
-{
- /c
- {
- pl curveto
- } def
- /C
- /c load def
- /v
- {
- currentpoint 6 2 roll pl curveto
- } def
- /V
- /v load def
- /y
- {
- pl 2 copy curveto
- } def
- /Y
- /y load def
- /l
- {
- pl lineto
- } def
- /L
- /l load def
- /m
- {
- pl moveto
- } def
-} ifelse
-/d
-{
- setdash
-} def
-/cf
-{
-} def
-/i
-{
- dup 0 eq
- {
- pop cf
- } if
- setflat
-} def
-/j
-{
- setlinejoin
-} def
-/J
-{
- setlinecap
-} def
-/M
-{
- setmiterlimit
-} def
-/w
-{
- setlinewidth
-} def
-/XR
-{
- 0 ne
- /_eo exch ddef
-} def
-/H
-{
-} def
-/h
-{
- closepath
-} def
-/N
-{
- _pola 0 eq
- {
- _doClip 1 eq
- {
- _eo {eoclip} {clip} ifelse /_doClip 0 ddef
- } if
- newpath
- }
- {
- /CRender
- {
- N
- } ddef
- } ifelse
-} def
-/n
-{
- N
-} def
-/F
-{
- _pola 0 eq
- {
- _doClip 1 eq
- {
- gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc
- /_doClip 0 ddef
- }
- {
- _pf
- } ifelse
- }
- {
- /CRender
- {
- F
- } ddef
- } ifelse
-} def
-/f
-{
- closepath
- F
-} def
-/S
-{
- _pola 0 eq
- {
- _doClip 1 eq
- {
- gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc
- /_doClip 0 ddef
- }
- {
- _ps
- } ifelse
- }
- {
- /CRender
- {
- S
- } ddef
- } ifelse
-} def
-/s
-{
- closepath
- S
-} def
-/B
-{
- _pola 0 eq
- {
- _doClip 1 eq
- gsave F grestore
- {
- gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc
- /_doClip 0 ddef
- }
- {
- S
- } ifelse
- }
- {
- /CRender
- {
- B
- } ddef
- } ifelse
-} def
-/b
-{
- closepath
- B
-} def
-/W
-{
- /_doClip 1 ddef
-} def
-/*
-{
- count 0 ne
- {
- dup type /stringtype eq
- {
- pop
- } if
- } if
- newpath
-} def
-/u
-{
-} def
-/U
-{
-} def
-/q
-{
- _pola 0 eq
- {
- gsave
- } if
-} def
-/Q
-{
- _pola 0 eq
- {
- grestore
- } if
-} def
-/*u
-{
- _pola 1 add /_pola exch ddef
-} def
-/*U
-{
- _pola 1 sub /_pola exch ddef
- _pola 0 eq
- {
- CRender
- } if
-} def
-/D
-{
- pop
-} def
-/*w
-{
-} def
-/*W
-{
-} def
-/`
-{
- /_i save ddef
- clipForward?
- {
- nulldevice
- } if
- 6 1 roll 4 npop
- concat pop
- userdict begin
- /showpage
- {
- } def
- 0 setgray
- 0 setlinecap
- 1 setlinewidth
- 0 setlinejoin
- 10 setmiterlimit
- [] 0 setdash
- /setstrokeadjust where {pop false setstrokeadjust} if
- newpath
- 0 setgray
- false setoverprint
-} def
-/~
-{
- end
- _i restore
-} def
-/_rgbtocmyk
-{
- 3
- {
- 1 exch sub 3 1 roll
- } repeat
- 3 copy 1 4 1 roll
- 3
- {
- 3 index 2 copy gt
- {
- exch
- } if
- pop 4 1 roll
- } repeat
- pop pop pop
- 4 1 roll
- 3
- {
- 3 index sub
- 3 1 roll
- } repeat
- 4 -1 roll
-} def
-/setrgbfill
-{
- _rgbf astore pop
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _rgbf aload pop setrgbcolor
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/setrgbstroke
-{
- _rgbs astore pop
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _rgbs aload pop setrgbcolor
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/O
-{
- 0 ne
- /_of exch ddef
- /_lp /none ddef
-} def
-/R
-{
- 0 ne
- /_os exch ddef
- /_lp /none ddef
-} def
-/g
-{
- /_gf exch ddef
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _gf setgray
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/G
-{
- /_gs exch ddef
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _gs setgray
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/k
-{
- _cf astore pop
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _cf aload pop setcmykcolor
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/K
-{
- _cs astore pop
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _cs aload pop setcmykcolor
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/Xa
-{
- _?cmyk {
- 3 npop k
- }{
- setrgbfill 4 npop
- } ifelse
-} def
-/XA
-{
- _?cmyk {
- 3 npop K
- }{
- setrgbstroke 4 npop
- } ifelse
-} def
-/Xs
-{
- /_gf exch ddef
- 5 npop
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _gf setAIseparationgray
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/XS
-{
- /_gs exch ddef
- 5 npop
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _gs setAIseparationgray
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/Xx
-{
- exch
- /_gf exch ddef
- 0 eq {
- findcmykcustomcolor
- }{
- _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse
- {
- 4 1 roll 3 npop
- findcmykcustomcolor
- }{
- 8 -4 roll 4 npop
- findrgbcustomcolor
- } ifelse
- } ifelse
- /_if exch ddef
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _if _gf 1 exch sub setcustomcolor
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/XX
-{
- exch
- /_gs exch ddef
- 0 eq {
- findcmykcustomcolor
- }{
- _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse
- {
- 4 1 roll 3 npop
- findcmykcustomcolor
- }{
- 8 -4 roll 4 npop
- findrgbcustomcolor
- } ifelse
- } ifelse
- /_is exch ddef
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _is _gs 1 exch sub setcustomcolor
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/x
-{
- /_gf exch ddef
- findcmykcustomcolor
- /_if exch ddef
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _if _gf 1 exch sub setcustomcolor
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/X
-{
- /_gs exch ddef
- findcmykcustomcolor
- /_is exch ddef
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _is _gs 1 exch sub setcustomcolor
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/XK
-{
- 3 -1 roll pop
- 0 eq
- {
- 1 exch sub
- 3 {dup 3 1 roll mul 5 1 roll} repeat
- mul 4 1 roll
- K
- }
- {
- 1 exch sub 4 1 roll
- 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat
- 4 -1 roll pop
- XA
- } ifelse
-} def
-/Xk
-{
- 3 -1 roll pop
- 0 eq
- {
- 1 exch sub
- 3 {dup 3 1 roll mul 5 1 roll} repeat
- mul 4 1 roll
- k
- }
- {
- 1 exch sub 4 1 roll
- 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat
- 4 -1 roll pop
- Xa
- } ifelse
-} def
-/A
-{
- pop
-} def
-/annotatepage
-{
-userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse
-} def
-/XT {
- pop pop
-} def
-/Xt {
- pop
-} def
-/discard
-{
- save /discardSave exch store
- discardDict begin
- /endString exch store
- gt38?
- {
- 2 add
- } if
- load
- stopped
- pop
- end
- discardSave restore
-} bind def
-userdict /discardDict 7 dict dup begin
-put
-/pre38Initialize
-{
- /endStringLength endString length store
- /newBuff buffer 0 endStringLength getinterval store
- /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store
- /newBuffLast newBuff endStringLength 1 sub 1 getinterval store
-} def
-/shiftBuffer
-{
- newBuff 0 newBuffButFirst putinterval
- newBuffLast 0
- currentfile read not
- {
- stop
- } if
- put
-} def
-0
-{
- pre38Initialize
- mark
- currentfile newBuff readstring exch pop
- {
- {
- newBuff endString eq
- {
- cleartomark stop
- } if
- shiftBuffer
- } loop
- }
- {
- stop
- } ifelse
-} def
-1
-{
- pre38Initialize
- /beginString exch store
- mark
- currentfile newBuff readstring exch pop
- {
- {
- newBuff beginString eq
- {
- /layerCount dup load 1 add store
- }
- {
- newBuff endString eq
- {
- /layerCount dup load 1 sub store
- layerCount 0 eq
- {
- cleartomark stop
- } if
- } if
- } ifelse
- shiftBuffer
- } loop
- } if
-} def
-2
-{
- mark
- {
- currentfile buffer {readline} stopped {
- % assume error was due to overfilling the buffer
- }{
- not
- {
- stop
- } if
- endString eq {
- cleartomark stop
- } if
- }ifelse
- } loop
-} def
-3
-{
- /beginString exch store
- /layerCnt 1 store
- mark
- {
- currentfile buffer {readline} stopped {
- % assume error was due to overfilling the buffer
- }{
- not
- {
- stop
- } if
- dup beginString eq
- {
- pop /layerCnt dup load 1 add store
- }
- {
- endString eq
- {
- layerCnt 1 eq
- {
- cleartomark stop
- }
- {
- /layerCnt dup load 1 sub store
- } ifelse
- } if
- } ifelse
- }ifelse
- } loop
-} def
-end
-userdict /clipRenderOff 15 dict dup begin
-put
-{
- /n /N /s /S /f /F /b /B
-}
-{
- {
- _doClip 1 eq
- {
- /_doClip 0 ddef _eo {eoclip} {clip} ifelse
- } if
- newpath
- } def
-} forall
-/Tr /pop load def
-/Bb {} def
-/BB /pop load def
-/Bg {12 npop} def
-/Bm {6 npop} def
-/Bc /Bm load def
-/Bh {4 npop} def
-end
-/Lb
-{
- 6 npop
- 7 2 roll
- 5 npop
- 0 eq
- {
- 0 eq
- {
- (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard
- }
- {
-
- /clipForward? true def
-
- /Tx /pop load def
- /Tj /pop load def
-
- currentdict end clipRenderOff begin begin
- } ifelse
- }
- {
- 0 eq
- {
- save /discardSave exch store
- } if
- } ifelse
-} bind def
-/LB
-{
- discardSave dup null ne
- {
- restore
- }
- {
- pop
- clipForward?
- {
- currentdict
- end
- end
- begin
-
- /clipForward? false ddef
- } if
- } ifelse
-} bind def
-/Pb
-{
- pop pop
- 0 (%AI5_EndPalette) discard
-} bind def
-/Np
-{
- 0 (%AI5_End_NonPrinting--) discard
-} bind def
-/Ln /pop load def
-/Ap
-/pop load def
-/Ar
-{
- 72 exch div
- 0 dtransform dup mul exch dup mul add sqrt
- dup 1 lt
- {
- pop 1
- } if
- setflat
-} def
-/Mb
-{
- q
-} def
-/Md
-{
-} def
-/MB
-{
- Q
-} def
-/nc 4 dict def
-nc begin
-/setgray
-{
- pop
-} bind def
-/setcmykcolor
-{
- 4 npop
-} bind def
-/setrgbcolor
-{
- 3 npop
-} bind def
-/setcustomcolor
-{
- 2 npop
-} bind def
-currentdict readonly pop
-end
-/XP
-{
- 4 npop
-} bind def
-/XD
-{
- pop
-} bind def
-end
-setpacking
-%%EndResource
-%%BeginResource: procset Adobe_cshow 2.0 8
-%%Title: (Writing System Operators)
-%%Version: 2.0 8
-%%CreationDate: (1/23/89) ()
-%%Copyright: ((C) 1992-1996 Adobe Systems Incorporated All Rights Reserved)
-currentpacking true setpacking
-userdict /Adobe_cshow 14 dict dup begin put
-/initialize
-{
- Adobe_cshow begin
- Adobe_cshow
- {
- dup xcheck
- {
- bind
- } if
- pop pop
- } forall
- end
- Adobe_cshow begin
-} def
-/terminate
-{
-currentdict Adobe_cshow eq
- {
- end
- } if
-} def
-/cforall
-{
- /_lobyte 0 ddef
- /_hibyte 0 ddef
- /_cproc exch ddef
- /_cscript currentfont /FontScript known { currentfont /FontScript get } { -1 } ifelse ddef
- {
- /_lobyte exch ddef
- _hibyte 0 eq
- _cscript 1 eq
- _lobyte 129 ge _lobyte 159 le and
- _lobyte 224 ge _lobyte 252 le and or and
- _cscript 2 eq
- _lobyte 161 ge _lobyte 254 le and and
- _cscript 3 eq
- _lobyte 161 ge _lobyte 254 le and and
- _cscript 25 eq
- _lobyte 161 ge _lobyte 254 le and and
- _cscript -1 eq
- or or or or and
- {
- /_hibyte _lobyte ddef
- }
- {
- _hibyte 256 mul _lobyte add
- _cproc
- /_hibyte 0 ddef
- } ifelse
- } forall
-} def
-/cstring
-{
- dup 256 lt
- {
- (s) dup 0 4 3 roll put
- }
- {
- dup 256 idiv exch 256 mod
- (hl) dup dup 0 6 5 roll put 1 4 3 roll put
- } ifelse
-} def
-/clength
-{
- 0 exch
- { 256 lt { 1 } { 2 } ifelse add } cforall
-} def
-/hawidthshow
-{
- {
- dup cstring
- show
- _hvax _hvay rmoveto
- _hvwb eq { _hvcx _hvcy rmoveto } if
- } cforall
-} def
-/vawidthshow
-{
- {
- dup 255 le
- _charorientation 1 eq
- and
- {
- -90 rotate
- 0 _fontRotateAdjust rmoveto
- cstring
- _hvcx _hvcy _hvwb _hvax _hvay 6 -1 roll awidthshow
- 0 _fontRotateAdjust neg rmoveto
- 90 rotate
- }
- {
- currentpoint
- _fontHeight sub
- exch _hvay sub exch _hvax sub
- 2 index _hvwb eq { exch _hvcy sub exch _hvcx sub } if
- 3 2 roll
- cstring
- dup stringwidth pop 2 div neg _fontAscent neg rmoveto
- show
- moveto
- } ifelse
- } cforall
-} def
-/hvawidthshow
-{
- 6 1 roll
- /_hvay exch ddef
- /_hvax exch ddef
- /_hvwb exch ddef
- /_hvcy exch ddef
- /_hvcx exch ddef
- _lineorientation 0 eq { hawidthshow } { vawidthshow } ifelse
-} def
-/hvwidthshow
-{
- 0 0 3 -1 roll hvawidthshow
-} def
-/hvashow
-{
- 0 0 0 6 -3 roll hvawidthshow
-} def
-/hvshow
-{
- 0 0 0 0 0 6 -1 roll hvawidthshow
-} def
-currentdict readonly pop end
-setpacking
-%%EndResource
-%%BeginResource: procset Adobe_shading_AI8 1.0 0
-%%Title: (Adobe Illustrator 8 Shading Procset)
-%%Version: 1.0 0
-%%CreationDate: (12/17/97) ()
-%%Copyright: ((C) 1987-1997 Adobe Systems Incorporated All Rights Reserved)
-userdict /defaultpacking currentpacking put true setpacking
-userdict /Adobe_shading_AI8 10 dict dup begin put
-/initialize {
- Adobe_shading_AI8 begin
- Adobe_shading_AI8 bdprocs
- Mesh /initialize get exec
-} def
-/terminate {
- currentdict Adobe_shading_AI8 eq {
- end
- } if
-} def
-/bdprocs {
- {
- dup xcheck 1 index type /arraytype eq and {
- bind
- } if
- pop pop
- } forall
-} def
-/X! {pop} def
-/X# {pop pop} def
-/Mesh 40 dict def
-Mesh begin
-/initialize {
- Mesh bdprocs
- Mesh begin
- /emulate? /AI8MeshEmulation where {
- pop AI8MeshEmulation
- }{
- systemdict /shfill known not
- } ifelse def
- end
-} def
-/bd {
- shadingdict begin
-} def
-/paint {
- emulate? {
- end
- }{
- /_lp /none ddef _fc /_lp /none ddef
-
- /AIColorSpace AIColorSpace tocolorspace store
- /ColorSpace AIColorSpace topsspace store
-
- version_ge_3010.106 not systemdict /setsmoothness known and {
- 0.0001 setsmoothness
- } if
-
- composite? {
- /DataSource getdatasrc def
- Matrix concat
- currentdict end
- shfill
- }{
- AIColorSpace makesmarks AIPlateList markingplate and not isoverprint and {
- end
- }{
- /ColorSpace /DeviceGray store
- /Decode [0 1 0 1 0 1] store
- /DataSource getplatesrc def
- Matrix concat
- currentdict end
- shfill
- } ifelse
- } ifelse
- } ifelse
-} def
-/shadingdict 12 dict def
-shadingdict begin
- /ShadingType 6 def
- /BitsPerCoordinate 16 def
- /BitsPerComponent 8 def
- /BitsPerFlag 8 def
-end
-/datafile null def
-/databuf 256 string def
-/dataptr 0 def
-/srcspace null def
-/srcchannels 0 def
-/dstchannels 0 def
-/dstplate 0 def
-/srctodstcolor null def
-/getplatesrc {
- /srcspace AIColorSpace store
- /srcchannels AIColorSpace getnchannels store
- /dstchannels 1 store
- /dstplate getplateindex store
- /srctodstcolor srcspace makesmarks {
- dstplate 4 eq {
- {1 exch sub}
- }{
- {srcspace tocmyk 3 dstplate sub index 1 exch sub 5 1 roll 4 {pop} repeat}
- } ifelse
- }{
- {srcchannels {pop} repeat 1}
- } ifelse store
- /datafile getdatasrc store
- /rdpatch168 load DataLength () /SubFileDecode filter
-} def
-/getdatasrc {
- /rdcmntline load /ASCII85Decode filter
-} def
-/rdpatch168 {
- /dataptr 0 store
- 49 rdcount
- 4 {
- dup {pop srcchannels getint8} if
- dup {pop srctodstcolor dstchannels putint8 true} if
- } repeat
- {databuf 0 dataptr getinterval}{()} ifelse
-} def
-/rdpatch3216 {
- /dataptr 0 store
- 97 rdcount
- 4 {
- dup {pop srcchannels getint16} if
- dup {pop srctodstcolor dstchannels putint16 true} if
- } repeat
- {databuf 0 dataptr getinterval}{()} ifelse
-} def
-/rdcount {
- dup 0 gt {
- datafile databuf dataptr 4 -1 roll getinterval readstring
- exch length dataptr add /dataptr exch store
- }{
- true
- } ifelse
-} def
-/getint8 {
- mark true 3 -1 roll
- {
- dup {pop datafile read} if
- dup {pop 255 div true} if
- } repeat
- {
- counttomark 1 add -1 roll pop true
- }{
- cleartomark false
- } ifelse
-} def
-/putint8 {
- dup dataptr add /dataptr exch store
- dataptr exch
- {
- 1 sub exch
- 255 mul cvi
- databuf 2 index
- 3 -1 roll put
- } repeat
- pop
-} def
-/getint16 {
- mark true 3 -1 roll
- {
- dup {pop datafile read} if
- dup {pop 256 mul datafile read} if
- dup {pop add 65535 div true} if
- } repeat
- {
- counttomark 1 add -1 roll pop true
- }{
- cleartomark false
- } ifelse
-} def
-/putint16 {
- dup 2 mul dataptr add /dataptr exch store
- dataptr exch
- {
- 2 sub exch
- 65535 mul cvi dup
- 256 idiv databuf 3 index 3 -1 roll put
- 256 mod databuf 2 index 1 add 3 -1 roll put
- } repeat
- pop
-} def
-/srcbuf 256 string def
-/rdcmntline {
- currentfile srcbuf readline pop
- (%) anchorsearch {pop} if
-} def
-/getplateindex {
- 0 [cyan? magenta? yellow? black? customColor?] {{exit} if 1 add} forall
-} def
-/aicsarray 4 array def
-/aicsaltvals 4 array def
-/aicsaltcolr aicsaltvals def
-/tocolorspace {
- dup type /arraytype eq {
- mark exch aload pop
- aicsarray 0 3 -1 roll put
- aicsarray 1 3 -1 roll put
- dup aicsarray 2 3 -1 roll put
- gettintxform aicsarray 3 3 -1 roll put
- counttomark aicsaltvals 0 3 -1 roll getinterval /aicsaltcolr exch store
- aicsaltcolr astore pop pop
- aicsarray
- } if
-} def
-/subtintxform {aicsaltcolr {1 index mul exch} forall pop} def
-/addtintxform {aicsaltcolr {1 sub 1 index mul 1 add exch} forall pop} def
-/gettintxform {
- /DeviceRGB eq {/addtintxform}{/subtintxform} ifelse load
-} def
-/getnchannels {
- dup type /arraytype eq {0 get} if
- colorspacedict exch get begin Channels end
-} def
-/makesmarks {
- composite? {
- pop true
- }{
- dup dup type /arraytype eq {0 get} if
- colorspacedict exch get begin MarksPlate end
- } ifelse
-} def
-/markingplate {
- composite? {
- pop true
- }{
- dup type /arraytype eq {
- dup length getplateindex gt {getplateindex get}{pop false} ifelse
- } if
- } ifelse
-} def
-/tocmyk {
- dup dup type /arraytype eq {0 get} if
- colorspacedict exch get begin ToCMYK end
-} def
-/topsspace {
- dup dup type /arraytype eq {0 get} if
- colorspacedict exch get begin ToPSSpace end
-} def
-/colorspacedict 5 dict dup begin
- /DeviceGray 4 dict dup begin
- /Channels 1 def
- /MarksPlate {pop black?} def
- /ToCMYK {pop 1 exch sub 0 0 0 4 -1 roll} def
- /ToPSSpace {} def
- end def
- /DeviceRGB 4 dict dup begin
- /Channels 3 def
- /MarksPlate {pop isCMYKSep?} def
- /ToCMYK {pop _rgbtocmyk} def
- /ToPSSpace {} def
- end def
- /DeviceCMYK 4 dict dup begin
- /Channels 4 def
- /MarksPlate {pop isCMYKSep?} def
- /ToCMYK {pop} def
- /ToPSSpace {} def
- end def
- /Separation 4 dict dup begin
- /Channels 1 def
- /MarksPlate {
- /findcmykcustomcolor where {
- pop dup 1 exch ToCMYK 5 -1 roll 1 get
- findcmykcustomcolor 1 setcustomcolor
- systemdict /currentgray get exec
- 1 ne
- }{
- pop false
- } ifelse
- } def
- /ToCMYK {
- dup 2 get mark exch 4 2 roll
- 3 get exec
- counttomark -1 roll tocmyk
- 5 -1 roll pop
- } def
- /ToPSSpace {} def
- end def
- /Process 4 dict dup begin
- /Channels 1 def
- /MarksPlate {
- isCMYKSep? {
- 1 exch ToCMYK 4 array astore getplateindex get 0 ne
- }{
- pop false
- } ifelse
- } def
- /ToCMYK {
- dup 2 get mark exch 4 2 roll
- 3 get exec
- counttomark -1 roll tocmyk
- 5 -1 roll pop
- } def
- /ToPSSpace {
- 4 array copy dup 0 /Separation put
- } def
- end def
-end def
-/isoverprint {
- /currentoverprint where {pop currentoverprint}{_of} ifelse
-} def
-/version_ge_3010.106 {
- version {cvr} stopped {
- pop
- false
- }{
- 3010.106 ge
- } ifelse
-} def
-end
-end
-defaultpacking setpacking
-%%EndResource
-%%EndProlog
-%%BeginSetup
-%%IncludeFont: Helvetica
-userdict /_useSmoothShade false put
-userdict /_aicmykps false put
-userdict /_forceToCMYK false put
-Adobe_level2_AI5 /initialize get exec
-Adobe_cshow /initialize get exec
-Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 Adobe_typography_AI5 /initialize get exec
-Adobe_ColorImage_AI6 /initialize get exec
-Adobe_shading_AI8 /initialize get exec
-Adobe_Illustrator_AI5 /initialize get exec
-[
-39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis
-/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute
-/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde
-/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex
-/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
-/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash
-/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef
-/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash
-/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef
-/guillemotleft/guillemotright/ellipsis/space/Agrave/Atilde/Otilde/OE/oe
-/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide
-/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright
-/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand
-/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex
-/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex
-/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla
-/hungarumlaut/ogonek/caron
-TE
-%AI55J_Tsume: None
-%AI3_BeginEncoding: _Helvetica Helvetica
-[/_Helvetica/Helvetica 0 0 1 TZ
-%AI3_EndEncoding AdobeType
-[161/degree 173/notequal 176/infinity/plusminus/lessequal/greaterequal
-181/mu/partialdiff/summation/product/pi/integral 189/Omega
-195/radical 197/approxequal 198/Delta 214/divide/lozenge 240/apple
-/_Symbol_/Symbol 0 0 0 TZ
-%AI5_Begin_NonPrinting
-Np
-%AI3_BeginPattern: (bi-direction diagonals)
-(bi-direction diagonals) 24.2119 0.2119 96.2124 72.2119 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-2 J 2 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-8.2119 6.2119 m
-14.2119 0.2119 L
-F
-8.2119 0.2119 m
-14.2119 6.2119 L
-F
-%AI6_EndPatternLayer
-) &
-(0 O 0 R 0 0 0 1 k
- 0 0 0 1 K
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-2 J 2 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-24.2119 72.2119 m
-96.2124 0.2119 L
-S
-21.2109 69.2129 m
-90.2124 0.2119 L
-S
-21.207 63.2168 m
-84.2124 0.2119 L
-S
-21.2031 57.2207 m
-78.2124 0.2119 L
-S
-21.1987 51.2246 m
-72.2124 0.2119 L
-S
-21.1958 45.2275 m
-66.2119 0.2119 L
-S
-21.1919 39.2314 m
-60.2119 0.2119 L
-S
-21.188 33.2363 m
-54.2119 0.2119 L
-S
-21.1851 27.2402 m
-48.2119 0.2119 L
-S
-21.1812 21.2432 m
-42.2119 0.2119 L
-S
-21.1768 15.2471 m
-36.2119 0.2119 L
-S
-21.1729 9.251 m
-30.2119 0.2119 L
-S
-21.1699 3.2549 m
-24.2119 0.2119 L
-S
-30.2119 72.2119 m
-99.2134 3.21 L
-S
-36.2119 72.2119 m
-99.2173 9.2061 L
-S
-42.2119 72.2119 m
-99.2212 15.2021 L
-S
-48.2119 72.2119 m
-99.2251 21.1992 L
-S
-54.2119 72.2119 m
-99.228 27.1953 L
-S
-60.2119 72.2119 m
-99.2319 33.1904 L
-S
-66.2119 72.2119 m
-99.2358 39.1865 L
-S
-72.2124 72.2119 m
-99.2397 45.1836 L
-S
-78.2124 72.2119 m
-99.2427 51.1797 L
-S
-84.2124 72.2119 m
-99.2466 57.1758 L
-S
-90.2124 72.2119 m
-99.2505 63.1719 L
-S
-96.2124 72.2119 m
-99.2554 69.1689 L
-S
-0.2119 68.7119 m
-10.2119 58.7119 L
-S
-96.2124 72.2119 m
-24.2119 0.2119 L
-S
-90.2124 72.2119 m
-21.2109 3.21 L
-S
-84.2124 72.2119 m
-21.207 9.2061 L
-S
-78.2124 72.2119 m
-21.2031 15.2021 L
-S
-72.2124 72.2119 m
-21.1987 21.1982 L
-S
-66.2119 72.2119 m
-21.1958 27.1953 L
-S
-60.2119 72.2119 m
-21.1919 33.1904 L
-S
-54.2119 72.2119 m
-21.188 39.1865 L
-S
-48.2119 72.2119 m
-21.1851 45.1826 L
-S
-42.2119 72.2119 m
-21.1812 51.1797 L
-S
-36.2119 72.2119 m
-21.1768 57.1758 L
-S
-30.2119 72.2119 m
-21.1729 63.1719 L
-S
-24.2119 72.2119 m
-21.1699 69.168 L
-S
-99.2134 69.2129 m
-30.2119 0.2119 L
-S
-99.2173 63.2168 m
-36.2119 0.2119 L
-S
-99.2212 57.2207 m
-42.2119 0.2119 L
-S
-99.2251 51.2246 m
-48.2119 0.2119 L
-S
-99.228 45.2275 m
-54.2119 0.2119 L
-S
-99.2319 39.2314 m
-60.2119 0.2119 L
-S
-99.2358 33.2363 m
-66.2119 0.2119 L
-S
-99.2397 27.2393 m
-72.2124 0.2119 L
-S
-99.2427 21.2432 m
-78.2124 0.2119 L
-S
-99.2466 15.2471 m
-84.2124 0.2119 L
-S
-99.2505 9.251 m
-90.2124 0.2119 L
-S
-99.2554 3.2539 m
-96.2124 0.2119 L
-S
-0.2119 58.7119 m
-10.2119 68.7119 L
-S
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI3_BeginPattern: (black dots)
-(black dots) 16 0.6885 88 72.6885 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-1 J 0 j 0.75 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-0 6.6885 m
-6 0.6885 L
-F
-0 0.6885 m
-6 6.6885 L
-F
-%AI6_EndPatternLayer
-) &
-(0 O 0 R 0 0 0 1 k
- 0 0 0 1 K
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-1 J 0 j 0.75 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-28.9365 3.1885 m
-28.9365 3.1885 l
-S
-17.125 3.375 m
-17.125 3.375 l
-S
-26.5 4.6885 m
-26.5 4.6885 l
-S
-35.6865 5.8135 m
-35.6865 5.8135 l
-S
-19.75 0.9385 m
-19.75 0.9385 l
-S
-23.125 7.3135 m
-23.125 7.3135 l
-S
-40.5615 2.4385 m
-40.5615 2.4385 l
-S
-43 1.125 m
-43 1.125 l
-S
-45.0615 5.4385 m
-45.0615 5.4385 l
-S
-56.875 6.375 m
-56.875 6.375 l
-S
-65.3115 5.0635 m
-65.3115 5.0635 l
-S
-51.0615 6.9385 m
-51.0615 6.9385 l
-S
-40.5615 6.9385 m
-40.5615 6.9385 l
-S
-31.1865 6.9385 m
-31.1865 6.9385 l
-S
-59.875 9.5635 m
-59.875 9.5635 l
-S
-62.6865 1.3135 m
-62.6865 1.3135 l
-S
-34.5615 0.9385 m
-34.5615 0.9385 l
-S
-48.4365 2.25 m
-48.4365 2.25 l
-S
-56.3115 0.75 m
-56.3115 0.75 l
-S
-66.625 24.5635 m
-66.625 24.5635 l
-S
-74.3115 24.9385 m
-74.3115 24.9385 l
-S
-78.8115 24.375 m
-78.8115 24.375 l
-S
-82.9365 2.0635 m
-82.9365 2.0635 l
-S
-68.3115 11.8135 m
-68.3115 11.8135 l
-S
-86.5 17.8135 m
-86.5 17.8135 l
-S
-87.0615 4.6885 m
-87.0615 4.6885 l
-S
-79.9365 19.875 m
-79.9365 19.875 l
-S
-77.875 1.125 m
-77.875 1.125 l
-S
-69.625 20.25 m
-69.625 20.25 l
-S
-67.75 6 m
-67.75 6 l
-S
-73.375 17.625 m
-73.375 17.625 l
-S
-76.9365 16.875 m
-76.9365 16.875 l
-S
-72.4365 3.375 m
-72.4365 3.375 l
-S
-77.3115 9.5635 m
-77.3115 9.5635 l
-S
-73.9365 11.25 m
-73.9365 11.25 l
-S
-83.125 7.875 m
-83.125 7.875 l
-S
-85.1865 12.75 m
-85.1865 12.75 l
-S
-81.0615 13.875 m
-81.0615 13.875 l
-S
-17.6865 16.125 m
-17.6865 16.125 l
-S
-45.25 10.3135 m
-45.25 10.3135 l
-S
-31.5615 21.375 m
-31.5615 21.375 l
-S
-20.875 11.8135 m
-20.875 11.8135 l
-S
-34.75 18.5635 m
-34.75 18.5635 l
-S
-25.75 21.9385 m
-25.75 21.9385 l
-S
-34.5615 24.5635 m
-34.5615 24.5635 l
-S
-37.375 16.3135 m
-37.375 16.3135 l
-S
-36.625 12.75 m
-36.625 12.75 l
-S
-23.125 17.25 m
-23.125 17.25 l
-S
-29.3115 12.375 m
-29.3115 12.375 l
-S
-31 15.75 m
-31 15.75 l
-S
-46.1865 22.875 m
-46.1865 22.875 l
-S
-52 15.375 m
-52 15.375 l
-S
-58.375 13.3135 m
-58.375 13.3135 l
-S
-62.6865 20.0635 m
-62.6865 20.0635 l
-S
-62.875 14.0635 m
-62.875 14.0635 l
-S
-44.6865 20.4385 m
-44.6865 20.4385 l
-S
-46.75 15.1885 m
-46.75 15.1885 l
-S
-42.0615 17.0635 m
-42.0615 17.0635 l
-S
-55.1865 17.4385 m
-55.1865 17.4385 l
-S
-58.9365 23.25 m
-58.9365 23.25 l
-S
-60.0615 17.4385 m
-60.0615 17.4385 l
-S
-42.4365 25.125 m
-42.4365 25.125 l
-S
-65.3115 20.625 m
-65.3115 20.625 l
-S
-51.625 24.5635 m
-51.625 24.5635 l
-S
-52 20.625 m
-52 20.625 l
-S
-18.8115 24 m
-18.8115 24 l
-S
-21.25 24.9385 m
-21.25 24.9385 l
-S
-19.375 70.875 m
-19.375 70.875 l
-S
-26.125 66.5635 m
-26.125 66.5635 l
-S
-20.125 66.375 m
-20.125 66.375 l
-S
-38.5 69 m
-38.5 69 l
-S
-47.125 71.625 m
-47.125 71.625 l
-S
-62.875 68.0635 m
-62.875 68.0635 l
-S
-49.75 67.5 m
-49.75 67.5 l
-S
-38.875 65.625 m
-38.875 65.625 l
-S
-29.3115 70.3135 m
-29.3115 70.3135 l
-S
-31.9365 67.5 m
-31.9365 67.5 l
-S
-57.25 65.4385 m
-57.25 65.4385 l
-S
-23.5 69.1885 m
-23.5 69.1885 l
-S
-45.625 65.25 m
-45.625 65.25 l
-S
-26.6865 63.9385 m
-26.6865 63.9385 l
-S
-50.5 63.75 m
-50.5 63.75 l
-S
-32.6865 72 m
-32.6865 72 l
-S
-52.9365 71.4385 m
-52.9365 71.4385 l
-S
-57.8115 69.375 m
-57.8115 69.375 l
-S
-61 64.3135 m
-61 64.3135 l
-S
-28.9365 48.1885 m
-28.9365 48.1885 l
-S
-17.125 48.375 m
-17.125 48.375 l
-S
-21.4365 42.375 m
-21.4365 42.375 l
-S
-19.375 36 m
-19.375 36 l
-S
-26.125 31.6885 m
-26.125 31.6885 l
-S
-20.125 31.5 m
-20.125 31.5 l
-S
-26.5 49.6885 m
-26.5 49.6885 l
-S
-35.6865 50.8135 m
-35.6865 50.8135 l
-S
-19.75 45.9385 m
-19.75 45.9385 l
-S
-23.125 52.3135 m
-23.125 52.3135 l
-S
-40.5615 47.4385 m
-40.5615 47.4385 l
-S
-43 46.125 m
-43 46.125 l
-S
-23.5 39.1885 m
-23.5 39.1885 l
-S
-38.5 34.125 m
-38.5 34.125 l
-S
-47.125 36.75 m
-47.125 36.75 l
-S
-45.0615 50.4385 m
-45.0615 50.4385 l
-S
-56.875 51.375 m
-56.875 51.375 l
-S
-42.8115 39.375 m
-42.8115 39.375 l
-S
-62.875 33.1885 m
-62.875 33.1885 l
-S
-49.75 32.625 m
-49.75 32.625 l
-S
-38.875 30.75 m
-38.875 30.75 l
-S
-29.3115 35.4385 m
-29.3115 35.4385 l
-S
-31.9365 32.625 m
-31.9365 32.625 l
-S
-54.75 30.1885 m
-54.75 30.1885 l
-S
-64.9365 39.75 m
-64.9365 39.75 l
-S
-46.1865 41.8135 m
-46.1865 41.8135 l
-S
-65.3115 50.0635 m
-65.3115 50.0635 l
-S
-51.0615 51.9385 m
-51.0615 51.9385 l
-S
-23.5 34.3135 m
-23.5 34.3135 l
-S
-40.5615 51.9385 m
-40.5615 51.9385 l
-S
-31.1865 51.9385 m
-31.1865 51.9385 l
-S
-45.625 30.375 m
-45.625 30.375 l
-S
-26.6865 29.0635 m
-26.6865 29.0635 l
-S
-59.875 54.5635 m
-59.875 54.5635 l
-S
-50.5 28.875 m
-50.5 28.875 l
-S
-60.75 47.6885 m
-60.75 47.6885 l
-S
-30.625 42.75 m
-30.625 42.75 l
-S
-26.6865 42.375 m
-26.6865 42.375 l
-S
-36.8115 40.125 m
-36.8115 40.125 l
-S
-37.75 43.5 m
-37.75 43.5 l
-S
-34.5615 45.9385 m
-34.5615 45.9385 l
-S
-32.6865 37.125 m
-32.6865 37.125 l
-S
-61.9365 42.75 m
-61.9365 42.75 l
-S
-48.4365 47.25 m
-48.4365 47.25 l
-S
-54.625 42.375 m
-54.625 42.375 l
-S
-56.3115 45.75 m
-56.3115 45.75 l
-S
-52.9365 36.5635 m
-52.9365 36.5635 l
-S
-57.8115 34.5 m
-57.8115 34.5 l
-S
-58.9365 38.625 m
-58.9365 38.625 l
-S
-61 29.4385 m
-61 29.4385 l
-S
-65.875 29.625 m
-65.875 29.625 l
-S
-70.5615 27.75 m
-70.5615 27.75 l
-S
-71.5 52.875 m
-71.5 52.875 l
-S
-69.8115 34.3135 m
-69.8115 34.3135 l
-S
-76.375 27.375 m
-76.375 27.375 l
-S
-71.3115 41.0635 m
-71.3115 41.0635 l
-S
-77.3115 45.375 m
-77.3115 45.375 l
-S
-82 28.6885 m
-82 28.6885 l
-S
-88.1865 27.5635 m
-88.1865 27.5635 l
-S
-83.6865 43.3135 m
-83.6865 43.3135 l
-S
-88 50.0635 m
-88 50.0635 l
-S
-88.1865 44.0635 m
-88.1865 44.0635 l
-S
-88.1865 33.1885 m
-88.1865 33.1885 l
-S
-70 50.4385 m
-70 50.4385 l
-S
-68.875 59.625 m
-68.875 59.625 l
-S
-66.8115 38.25 m
-66.8115 38.25 l
-S
-74.75 42.1885 m
-74.75 42.1885 l
-S
-67.375 47.0635 m
-67.375 47.0635 l
-S
-72.25 64.5 m
-72.25 64.5 l
-S
-73.5615 66.9385 m
-73.5615 66.9385 l
-S
-80.5 47.4385 m
-80.5 47.4385 l
-S
-85.5615 62.4385 m
-85.5615 62.4385 l
-S
-82.9365 71.0635 m
-82.9365 71.0635 l
-S
-69.25 69 m
-69.25 69 l
-S
-80.3115 66.75 m
-80.3115 66.75 l
-S
-84.25 53.25 m
-84.25 53.25 l
-S
-87.0615 55.875 m
-87.0615 55.875 l
-S
-77.875 70.125 m
-77.875 70.125 l
-S
-85.375 47.4385 m
-85.375 47.4385 l
-S
-67.75 64.5 m
-67.75 64.5 l
-S
-67.75 55.125 m
-67.75 55.125 l
-S
-81.625 31.125 m
-81.625 31.125 l
-S
-79.375 39 m
-79.375 39 l
-S
-75.8115 33 m
-75.8115 33 l
-S
-84.4365 37.3135 m
-84.4365 37.3135 l
-S
-76.9365 54.5635 m
-76.9365 54.5635 l
-S
-77.3115 50.625 m
-77.3115 50.625 l
-S
-79.5615 60.75 m
-79.5615 60.75 l
-S
-76.1865 61.6885 m
-76.1865 61.6885 l
-S
-73.75 58.5 m
-73.75 58.5 l
-S
-82.5615 56.625 m
-82.5615 56.625 l
-S
-72.4365 72.375 m
-72.4365 72.375 l
-S
-61.75 25.875 m
-61.75 25.875 l
-S
-57.25 26.625 m
-57.25 26.625 l
-S
-25.75 60.75 m
-25.75 60.75 l
-S
-34.1865 59.4385 m
-34.1865 59.4385 l
-S
-19.9365 61.3135 m
-19.9365 61.3135 l
-S
-31.5615 55.6885 m
-31.5615 55.6885 l
-S
-17.3115 56.625 m
-17.3115 56.625 l
-S
-25.1865 55.125 m
-25.1865 55.125 l
-S
-40.375 62.25 m
-40.375 62.25 l
-S
-46.1865 54.75 m
-46.1865 54.75 l
-S
-56.875 59.4385 m
-56.875 59.4385 l
-S
-40.25 58.1885 m
-40.25 58.1885 l
-S
-36.25 56.4385 m
-36.25 56.4385 l
-S
-49.375 56.8135 m
-49.375 56.8135 l
-S
-53.125 62.625 m
-53.125 62.625 l
-S
-54.25 56.8135 m
-54.25 56.8135 l
-S
-59.5 60 m
-59.5 60 l
-S
-46.1865 60 m
-46.1865 60 l
-S
-30.8115 28.5 m
-30.8115 28.5 l
-S
-19.75 72.9385 m
-19.75 72.9385 l
-S
-43 73.125 m
-43 73.125 l
-S
-34.5615 72.9385 m
-34.5615 72.9385 l
-S
-56.3115 72.75 m
-56.3115 72.75 l
-S
-77.875 73.125 m
-77.875 73.125 l
-S
-72.4365 0.375 m
-72.4365 0.375 l
-S
-16.1865 27.5635 m
-16.1865 27.5635 l
-S
-16 50.0635 m
-16 50.0635 l
-S
-16.1865 44.0635 m
-16.1865 44.0635 l
-S
-16.1865 33.1885 m
-16.1865 33.1885 l
-S
-6 62.3135 m
-6.208 62.3135 6.375 62.4805 6.375 62.6885 c
-6.375 62.8945 6.208 63.0635 6 63.0635 c
-5.793 63.0635 5.625 62.8945 5.625 62.6885 c
-5.625 62.4805 5.793 62.3135 6 62.3135 c
-s
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI3_BeginPattern: (horizontal rules)
-(horizontal rules) 16 0 88 73.9463 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-2 J 0 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-0 6 m
-6 0 L
-F
-0 0 m
-6 6 L
-F
-%AI6_EndPatternLayer
-) &
-(0 O 0 R 0 0 0 1 k
- 0 0 0 1 K
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-2 J 0 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-88 72.9727 m
-16 72.9727 l
-S
-88 71.0273 m
-16 71.0273 L
-S
-88 67.1357 m
-16 67.1357 L
-S
-88 65.1904 m
-16 65.1904 L
-S
-88 63.2441 m
-16 63.2441 L
-S
-88 61.2979 m
-16 61.2979 L
-S
-88 57.4072 m
-16 57.4072 L
-S
-88 55.4609 m
-16 55.4609 L
-S
-88 53.5156 m
-16 53.5156 L
-S
-88 51.5703 m
-16 51.5703 L
-S
-88 49.624 m
-16 49.624 L
-S
-88 47.6787 m
-16 47.6787 L
-S
-88 45.7334 m
-16 45.7334 L
-S
-88 43.7871 m
-16 43.7871 L
-S
-88 39.8965 m
-16 39.8965 L
-S
-88 37.9502 m
-16 37.9502 L
-S
-88 36.0049 m
-16 36.0049 L
-S
-88 34.0586 m
-16 34.0586 L
-S
-88 32.1133 m
-16 32.1133 L
-S
-88 30.168 m
-16 30.168 L
-S
-88 26.2764 m
-16 26.2764 L
-S
-88 22.3848 m
-16 22.3848 L
-S
-88 20.4395 m
-16 20.4395 L
-S
-88 18.4941 m
-16 18.4941 L
-S
-88 16.5479 m
-16 16.5479 L
-S
-88 14.6016 m
-16 14.6016 L
-S
-88 12.6572 m
-16 12.6572 L
-S
-88 8.7646 m
-16 8.7646 L
-S
-88 6.8193 m
-16 6.8193 L
-S
-88 4.874 m
-16 4.874 L
-S
-88 0.9727 m
-16 0.9727 l
-S
-88 2.9277 m
-16 2.9277 L
-S
-88 69.0811 m
-16 69.0811 L
-S
-88 59.3525 m
-16 59.3525 L
-S
-88 41.8418 m
-16 41.8418 L
-S
-88 28.2217 m
-16 28.2217 L
-S
-88 24.3311 m
-16 24.3311 L
-S
-88 10.7109 m
-16 10.7109 L
-S
-6 69.0811 m
-2 69.0811 l
-S
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI3_BeginPattern: (one direction diagonals)
-(one direction diagonals) 28.856 4.6211 100.855 76.6211 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-0 J 2 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-5.106 10.6211 m
-11.106 4.6211 L
-F
-5.106 4.6211 m
-11.106 10.6211 L
-F
-%AI6_EndPatternLayer
-) &
-(0 O 0 R 0 0 0 1 k
- 0 0 0 1 K
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-0 J 1 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-21.3716 66.1055 m
-39.3706 84.1055 l
-S
-21.3716 60.1055 m
-45.3706 84.1055 l
-S
-21.3716 54.1055 m
-51.3706 84.1055 l
-S
-21.3716 48.1055 m
-57.3706 84.1055 l
-S
-21.3716 42.1055 m
-63.3706 84.1055 l
-S
-21.3716 36.1055 m
-69.3706 84.1055 l
-S
-21.3716 30.1055 m
-75.3706 84.1055 l
-S
-21.3716 24.1055 m
-81.3706 84.1055 l
-S
-21.3716 18.1055 m
-87.3706 84.1055 l
-S
-21.3716 12.1055 m
-93.3706 84.1055 l
-S
-21.3716 6.1055 m
-99.3706 84.1055 l
-S
-21.3716 0.1064 m
-105.3706 84.1055 l
-S
-27.3716 0.1064 m
-105.3706 78.1055 l
-S
-33.3706 0.1064 m
-105.3706 72.1055 l
-S
-39.3706 0.1064 m
-105.3706 66.1055 l
-S
-45.3706 0.1064 m
-105.3706 60.1055 l
-S
-51.3706 0.1064 m
-105.3706 54.1055 l
-S
-57.3706 0.1064 m
-105.3706 48.1055 l
-S
-63.3706 0.1064 m
-105.3706 42.1055 l
-S
-69.3706 0.1064 m
-105.3706 36.1055 l
-S
-75.3706 0.1064 m
-105.3706 30.1055 l
-S
-81.3706 0.1064 m
-105.3706 24.1055 l
-S
-87.3706 0.1064 m
-105.3706 18.1055 l
-S
-93.3706 0.1064 m
-105.3706 12.1055 l
-S
-2 j
-0.106 63.1211 m
-10.106 73.1211 L
-S
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI3_BeginPattern: (white dots)
-(white dots) 0.375 0.6885 72.375 72.6885 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-1 J 0 j 0.75 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-13.3115 3.1885 m
-13.3115 3.1885 l
-S
-1.5 3.375 m
-1.5 3.375 l
-S
-10.875 4.6885 m
-10.875 4.6885 l
-S
-20.0615 5.8135 m
-20.0615 5.8135 l
-S
-4.125 0.9385 m
-4.125 0.9385 l
-S
-7.5 7.3135 m
-7.5 7.3135 l
-S
-24.9365 2.4385 m
-24.9365 2.4385 l
-S
-27.375 1.125 m
-27.375 1.125 l
-S
-29.4365 5.4385 m
-29.4365 5.4385 l
-S
-41.25 6.375 m
-41.25 6.375 l
-S
-49.6865 5.0635 m
-49.6865 5.0635 l
-S
-35.4365 6.9385 m
-35.4365 6.9385 l
-S
-24.9365 6.9385 m
-24.9365 6.9385 l
-S
-15.5615 6.9385 m
-15.5615 6.9385 l
-S
-44.25 9.5635 m
-44.25 9.5635 l
-S
-47.0615 1.3135 m
-47.0615 1.3135 l
-S
-18.9365 0.9385 m
-18.9365 0.9385 l
-S
-32.8115 2.25 m
-32.8115 2.25 l
-S
-40.6865 0.75 m
-40.6865 0.75 l
-S
-51 24.5635 m
-51 24.5635 l
-S
-58.6865 24.9385 m
-58.6865 24.9385 l
-S
-63.1865 24.375 m
-63.1865 24.375 l
-S
-67.3115 2.0635 m
-67.3115 2.0635 l
-S
-52.6865 11.8135 m
-52.6865 11.8135 l
-S
-70.875 17.8135 m
-70.875 17.8135 l
-S
-71.4365 4.6885 m
-71.4365 4.6885 l
-S
-64.3115 19.875 m
-64.3115 19.875 l
-S
-62.25 1.125 m
-62.25 1.125 l
-S
-54 20.25 m
-54 20.25 l
-S
-52.125 6 m
-52.125 6 l
-S
-57.75 17.625 m
-57.75 17.625 l
-S
-61.3115 16.875 m
-61.3115 16.875 l
-S
-56.8115 3.375 m
-56.8115 3.375 l
-S
-61.6865 9.5635 m
-61.6865 9.5635 l
-S
-58.3115 11.25 m
-58.3115 11.25 l
-S
-67.5 7.875 m
-67.5 7.875 l
-S
-69.5615 12.75 m
-69.5615 12.75 l
-S
-65.4365 13.875 m
-65.4365 13.875 l
-S
-2.0615 16.125 m
-2.0615 16.125 l
-S
-29.625 10.3135 m
-29.625 10.3135 l
-S
-15.9365 21.375 m
-15.9365 21.375 l
-S
-5.25 11.8135 m
-5.25 11.8135 l
-S
-19.125 18.5635 m
-19.125 18.5635 l
-S
-10.125 21.9385 m
-10.125 21.9385 l
-S
-18.9365 24.5635 m
-18.9365 24.5635 l
-S
-21.75 16.3135 m
-21.75 16.3135 l
-S
-21 12.75 m
-21 12.75 l
-S
-7.5 17.25 m
-7.5 17.25 l
-S
-13.6865 12.375 m
-13.6865 12.375 l
-S
-15.375 15.75 m
-15.375 15.75 l
-S
-30.5615 22.875 m
-30.5615 22.875 l
-S
-36.375 15.375 m
-36.375 15.375 l
-S
-42.75 13.3135 m
-42.75 13.3135 l
-S
-47.0615 20.0635 m
-47.0615 20.0635 l
-S
-47.25 14.0635 m
-47.25 14.0635 l
-S
-29.0615 20.4385 m
-29.0615 20.4385 l
-S
-31.125 15.1885 m
-31.125 15.1885 l
-S
-26.4365 17.0635 m
-26.4365 17.0635 l
-S
-39.5615 17.4385 m
-39.5615 17.4385 l
-S
-43.3115 23.25 m
-43.3115 23.25 l
-S
-44.4365 17.4385 m
-44.4365 17.4385 l
-S
-26.8115 25.125 m
-26.8115 25.125 l
-S
-49.6865 20.625 m
-49.6865 20.625 l
-S
-36 24.5635 m
-36 24.5635 l
-S
-36.375 20.625 m
-36.375 20.625 l
-S
-3.1865 24 m
-3.1865 24 l
-S
-5.625 24.9385 m
-5.625 24.9385 l
-S
-3.75 70.875 m
-3.75 70.875 l
-S
-10.5 66.5635 m
-10.5 66.5635 l
-S
-4.5 66.375 m
-4.5 66.375 l
-S
-22.875 69 m
-22.875 69 l
-S
-31.5 71.625 m
-31.5 71.625 l
-S
-47.25 68.0635 m
-47.25 68.0635 l
-S
-34.125 67.5 m
-34.125 67.5 l
-S
-23.25 65.625 m
-23.25 65.625 l
-S
-13.6865 70.3135 m
-13.6865 70.3135 l
-S
-16.3115 67.5 m
-16.3115 67.5 l
-S
-41.625 65.4385 m
-41.625 65.4385 l
-S
-7.875 69.1885 m
-7.875 69.1885 l
-S
-30 65.25 m
-30 65.25 l
-S
-11.0615 63.9385 m
-11.0615 63.9385 l
-S
-34.875 63.75 m
-34.875 63.75 l
-S
-17.0615 72 m
-17.0615 72 l
-S
-37.3115 71.4385 m
-37.3115 71.4385 l
-S
-42.1865 69.375 m
-42.1865 69.375 l
-S
-45.375 64.3135 m
-45.375 64.3135 l
-S
-13.3115 48.1885 m
-13.3115 48.1885 l
-S
-1.5 48.375 m
-1.5 48.375 l
-S
-5.8115 42.375 m
-5.8115 42.375 l
-S
-3.75 36 m
-3.75 36 l
-S
-10.5 31.6885 m
-10.5 31.6885 l
-S
-4.5 31.5 m
-4.5 31.5 l
-S
-10.875 49.6885 m
-10.875 49.6885 l
-S
-20.0615 50.8135 m
-20.0615 50.8135 l
-S
-4.125 45.9385 m
-4.125 45.9385 l
-S
-7.5 52.3135 m
-7.5 52.3135 l
-S
-24.9365 47.4385 m
-24.9365 47.4385 l
-S
-27.375 46.125 m
-27.375 46.125 l
-S
-7.875 39.1885 m
-7.875 39.1885 l
-S
-22.875 34.125 m
-22.875 34.125 l
-S
-31.5 36.75 m
-31.5 36.75 l
-S
-29.4365 50.4385 m
-29.4365 50.4385 l
-S
-41.25 51.375 m
-41.25 51.375 l
-S
-27.1865 39.375 m
-27.1865 39.375 l
-S
-47.25 33.1885 m
-47.25 33.1885 l
-S
-34.125 32.625 m
-34.125 32.625 l
-S
-23.25 30.75 m
-23.25 30.75 l
-S
-13.6865 35.4385 m
-13.6865 35.4385 l
-S
-16.3115 32.625 m
-16.3115 32.625 l
-S
-39.125 30.1885 m
-39.125 30.1885 l
-S
-49.3115 39.75 m
-49.3115 39.75 l
-S
-30.5615 41.8135 m
-30.5615 41.8135 l
-S
-49.6865 50.0635 m
-49.6865 50.0635 l
-S
-35.4365 51.9385 m
-35.4365 51.9385 l
-S
-7.875 34.3135 m
-7.875 34.3135 l
-S
-24.9365 51.9385 m
-24.9365 51.9385 l
-S
-15.5615 51.9385 m
-15.5615 51.9385 l
-S
-30 30.375 m
-30 30.375 l
-S
-11.0615 29.0635 m
-11.0615 29.0635 l
-S
-44.25 54.5635 m
-44.25 54.5635 l
-S
-34.875 28.875 m
-34.875 28.875 l
-S
-45.125 47.6885 m
-45.125 47.6885 l
-S
-15 42.75 m
-15 42.75 l
-S
-11.0615 42.375 m
-11.0615 42.375 l
-S
-21.1865 40.125 m
-21.1865 40.125 l
-S
-22.125 43.5 m
-22.125 43.5 l
-S
-18.9365 45.9385 m
-18.9365 45.9385 l
-S
-17.0615 37.125 m
-17.0615 37.125 l
-S
-46.3115 42.75 m
-46.3115 42.75 l
-S
-32.8115 47.25 m
-32.8115 47.25 l
-S
-39 42.375 m
-39 42.375 l
-S
-40.6865 45.75 m
-40.6865 45.75 l
-S
-37.3115 36.5635 m
-37.3115 36.5635 l
-S
-42.1865 34.5 m
-42.1865 34.5 l
-S
-43.3115 38.625 m
-43.3115 38.625 l
-S
-45.375 29.4385 m
-45.375 29.4385 l
-S
-50.25 29.625 m
-50.25 29.625 l
-S
-54.9365 27.75 m
-54.9365 27.75 l
-S
-55.875 52.875 m
-55.875 52.875 l
-S
-54.1865 34.3135 m
-54.1865 34.3135 l
-S
-60.75 27.375 m
-60.75 27.375 l
-S
-55.6865 41.0635 m
-55.6865 41.0635 l
-S
-61.6865 45.375 m
-61.6865 45.375 l
-S
-66.375 28.6885 m
-66.375 28.6885 l
-S
-72.5615 27.5635 m
-72.5615 27.5635 l
-S
-68.0615 43.3135 m
-68.0615 43.3135 l
-S
-72.375 50.0635 m
-72.375 50.0635 l
-S
-72.5615 44.0635 m
-72.5615 44.0635 l
-S
-72.5615 33.1885 m
-72.5615 33.1885 l
-S
-54.375 50.4385 m
-54.375 50.4385 l
-S
-53.25 59.625 m
-53.25 59.625 l
-S
-51.1865 38.25 m
-51.1865 38.25 l
-S
-59.125 42.1885 m
-59.125 42.1885 l
-S
-51.75 47.0635 m
-51.75 47.0635 l
-S
-56.625 64.5 m
-56.625 64.5 l
-S
-57.9365 66.9385 m
-57.9365 66.9385 l
-S
-64.875 47.4385 m
-64.875 47.4385 l
-S
-69.9365 62.4385 m
-69.9365 62.4385 l
-S
-67.3115 71.0635 m
-67.3115 71.0635 l
-S
-53.625 69 m
-53.625 69 l
-S
-64.6865 66.75 m
-64.6865 66.75 l
-S
-68.625 53.25 m
-68.625 53.25 l
-S
-71.4365 55.875 m
-71.4365 55.875 l
-S
-62.25 70.125 m
-62.25 70.125 l
-S
-69.75 47.4385 m
-69.75 47.4385 l
-S
-52.125 64.5 m
-52.125 64.5 l
-S
-52.125 55.125 m
-52.125 55.125 l
-S
-66 31.125 m
-66 31.125 l
-S
-63.75 39 m
-63.75 39 l
-S
-60.1865 33 m
-60.1865 33 l
-S
-68.8115 37.3135 m
-68.8115 37.3135 l
-S
-61.3115 54.5635 m
-61.3115 54.5635 l
-S
-61.6865 50.625 m
-61.6865 50.625 l
-S
-63.9365 60.75 m
-63.9365 60.75 l
-S
-60.5615 61.6885 m
-60.5615 61.6885 l
-S
-58.125 58.5 m
-58.125 58.5 l
-S
-66.9365 56.625 m
-66.9365 56.625 l
-S
-56.8115 72.375 m
-56.8115 72.375 l
-S
-46.125 25.875 m
-46.125 25.875 l
-S
-41.625 26.625 m
-41.625 26.625 l
-S
-10.125 60.75 m
-10.125 60.75 l
-S
-18.5615 59.4385 m
-18.5615 59.4385 l
-S
-4.3115 61.3135 m
-4.3115 61.3135 l
-S
-15.9365 55.6885 m
-15.9365 55.6885 l
-S
-1.6865 56.625 m
-1.6865 56.625 l
-S
-9.5615 55.125 m
-9.5615 55.125 l
-S
-24.75 62.25 m
-24.75 62.25 l
-S
-30.5615 54.75 m
-30.5615 54.75 l
-S
-41.25 59.4385 m
-41.25 59.4385 l
-S
-24.625 58.1885 m
-24.625 58.1885 l
-S
-20.625 56.4385 m
-20.625 56.4385 l
-S
-33.75 56.8135 m
-33.75 56.8135 l
-S
-37.5 62.625 m
-37.5 62.625 l
-S
-38.625 56.8135 m
-38.625 56.8135 l
-S
-43.875 60 m
-43.875 60 l
-S
-30.5615 60 m
-30.5615 60 l
-S
-15.1865 28.5 m
-15.1865 28.5 l
-S
-4.125 72.9385 m
-4.125 72.9385 l
-S
-27.375 73.125 m
-27.375 73.125 l
-S
-18.9365 72.9385 m
-18.9365 72.9385 l
-S
-40.6865 72.75 m
-40.6865 72.75 l
-S
-62.25 73.125 m
-62.25 73.125 l
-S
-56.8115 0.375 m
-56.8115 0.375 l
-S
-0.5615 27.5635 m
-0.5615 27.5635 l
-S
-0.375 50.0635 m
-0.375 50.0635 l
-S
-0.5615 44.0635 m
-0.5615 44.0635 l
-S
-0.5615 33.1885 m
-0.5615 33.1885 l
-S
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI5_End_NonPrinting--
-%AI5_Begin_NonPrinting
-Np
-%AI8_BeginBrushPattern
-(New Pattern 2)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7884 8586 m
--7838.1201 8586 L
--7838.1201 8500.6914 L
--7884 8500.6914 L
--7884 8586 L
-n
-u
--7850.4111 8533.3125 m
--7850.3774 8533.3086 -7850.3457 8533.3047 -7850.313 8533.3018 c
--7850.3457 8533.3047 -7850.3774 8533.3086 -7850.4111 8533.3125 c
-n
--7843.6582 8532.1602 m
--7843.647 8532.1572 -7843.6362 8532.1543 -7843.626 8532.1523 c
--7843.6362 8532.1543 -7843.647 8532.1572 -7843.6582 8532.1602 c
-n
--7870.0361 8579.5879 m
--7870.0688 8579.5859 -7870.1006 8579.584 -7870.1318 8579.5801 c
--7870.1162 8579.582 -7870.1016 8579.584 -7870.0854 8579.585 c
--7870.0703 8579.5859 -7870.0527 8579.5879 -7870.0361 8579.5879 c
-n
--7854.5366 8533.6719 m
--7854.4785 8533.668 -7854.4209 8533.6641 -7854.3599 8533.6602 c
--7854.4209 8533.6641 -7854.4785 8533.668 -7854.5366 8533.6719 c
-n
--7839.1553 8576.4043 m
--7839.0625 8576.3281 -7838.9775 8576.252 -7838.9009 8576.1758 c
--7838.5967 8575.8672 -7838.4385 8575.5469 -7838.4385 8575.2207 c
--7838.4385 8575.6289 -7838.689 8576.0254 -7839.1553 8576.4043 c
-n
--7877.3232 8578.5703 m
--7877.3247 8578.5703 -7877.3281 8578.5693 -7877.3311 8578.5684 c
--7877.3306 8578.5693 -7877.3281 8578.5693 -7877.3271 8578.5703 c
--7877.3247 8578.5703 -7877.3247 8578.5703 -7877.3232 8578.5703 c
-n
--7882.21 8577.0645 m
--7882.21 8577.0645 L
--7882.21 8577.0645 L
--7882.21 8577.0645 L
-n
--7858.9209 8533.8545 m
--7858.8994 8533.8545 -7858.8774 8533.8535 -7858.856 8533.8535 c
--7858.8774 8533.8535 -7858.8994 8533.8545 -7858.9209 8533.8545 c
-n
--7863.582 8533.8535 m
--7863.5601 8533.8535 -7863.5391 8533.8545 -7863.5166 8533.8545 c
--7863.5391 8533.8545 -7863.5601 8533.8535 -7863.582 8533.8535 c
-n
--7865.667 8533.7881 m
--7865.7642 8533.7842 -7865.8594 8533.7793 -7865.9561 8533.7754 c
--7865.9058 8533.7773 -7865.8608 8533.7813 -7865.8096 8533.7832 c
--7865.7642 8533.7852 -7865.7134 8533.7861 -7865.667 8533.7881 c
-n
--7884 8529.1426 m
--7884 8529.3066 -7883.96 8529.4688 -7883.8818 8529.627 c
--7883.96 8529.4688 -7884 8529.3066 -7884 8529.1426 c
-n
--7868.0718 8533.6602 m
--7868.0166 8533.6641 -7867.9609 8533.668 -7867.9038 8533.6709 c
--7867.9609 8533.668 -7868.0166 8533.6641 -7868.0718 8533.6602 c
-n
--7878.811 8532.1523 m
--7878.8018 8532.1543 -7878.792 8532.1572 -7878.7822 8532.1592 c
--7878.792 8532.1572 -7878.8018 8532.1543 -7878.811 8532.1523 c
-n
--7872.1201 8533.3027 m
--7872.0898 8533.3057 -7872.0615 8533.3086 -7872.0322 8533.3125 c
--7872.0615 8533.3086 -7872.0898 8533.3057 -7872.1201 8533.3027 c
-n
--7838.4385 8529.1426 m
--7838.4385 8529.3887 -7838.5278 8529.6289 -7838.7002 8529.8643 c
--7838.5278 8529.6289 -7838.4385 8529.3887 -7838.4385 8529.1426 c
-n
--7839.0342 8530.2168 m
--7839.332 8530.4844 -7839.731 8530.7432 -7840.2358 8530.9902 c
--7840.2334 8530.9893 -7840.231 8530.9883 -7840.229 8530.9863 c
--7839.7271 8530.7402 -7839.3311 8530.4834 -7839.0342 8530.2168 c
-n
--7841.187 8531.4004 m
--7841.187 8531.4004 L
--7841.187 8531.4004 L
-n
--7884 8575.2207 m
--7884 8575.5 -7883.876 8575.7754 -7883.6514 8576.042 c
--7883.876 8575.7754 -7884 8575.501 -7884 8575.2207 c
-n
--7856.4824 8533.7754 m
--7856.5791 8533.7793 -7856.6758 8533.7842 -7856.7729 8533.7881 c
--7856.7246 8533.7861 -7856.6758 8533.7852 -7856.6279 8533.7832 c
--7856.5791 8533.7813 -7856.5313 8533.7773 -7856.4824 8533.7754 c
-n
--7872.0942 8579.3828 m
--7872.083 8579.3848 -7872.0698 8579.3867 -7872.0562 8579.3877 c
--7872.0698 8579.3867 -7872.083 8579.3848 -7872.0942 8579.3828 c
-n
--7882.2026 8530.9902 m
--7882.46 8530.8633 -7882.687 8530.7344 -7882.8936 8530.6016 c
--7882.6904 8530.7324 -7882.4639 8530.8613 -7882.21 8530.9863 c
--7882.208 8530.9883 -7882.2041 8530.9893 -7882.2026 8530.9902 c
-n
--7854.4766 8579.7461 m
--7854.4561 8579.7441 -7854.4346 8579.7432 -7854.4146 8579.7422 c
--7854.4346 8579.7432 -7854.4561 8579.7441 -7854.4766 8579.7461 c
-n
--7840.229 8577.0645 m
--7840.229 8577.0645 L
--7840.229 8577.0645 L
--7840.229 8577.0645 L
-n
--7852.2998 8579.5801 m
--7852.335 8579.583 -7852.3706 8579.5859 -7852.4072 8579.5898 c
--7852.3882 8579.5879 -7852.3706 8579.5869 -7852.3521 8579.585 c
--7852.334 8579.584 -7852.3174 8579.582 -7852.2998 8579.5801 c
-n
--7856.5601 8579.8574 m
--7856.6055 8579.8594 -7856.6514 8579.8613 -7856.6958 8579.8633 c
--7856.6738 8579.8623 -7856.6494 8579.8613 -7856.6279 8579.8613 c
--7856.6055 8579.8604 -7856.583 8579.8584 -7856.5601 8579.8574 c
-n
--7868.0186 8579.7422 m
--7868.001 8579.7432 -7867.9834 8579.7441 -7867.9658 8579.7461 c
--7867.9834 8579.7441 -7868.001 8579.7432 -7868.0186 8579.7422 c
-n
--7850.3882 8579.3887 m
--7850.3706 8579.3867 -7850.3535 8579.3848 -7850.3369 8579.3828 c
--7850.3535 8579.3848 -7850.3706 8579.3867 -7850.3882 8579.3887 c
-n
--7865.7422 8579.8633 m
--7865.7881 8579.8613 -7865.833 8579.8594 -7865.8774 8579.8574 c
--7865.8545 8579.8584 -7865.833 8579.8604 -7865.8096 8579.8613 c
--7865.7881 8579.8613 -7865.7646 8579.8623 -7865.7422 8579.8633 c
-n
-0 O
-0.8 g
--7839.1553 8576.4043 m
--7839.437 8576.6309 -7839.7959 8576.8516 -7840.229 8577.0645 C
--7840.229 8577.0645 L
--7840.229 8577.0645 L
--7842.2422 8578.0547 -7845.8286 8578.8721 -7850.3369 8579.3828 c
--7850.3535 8579.3848 -7850.3706 8579.3867 -7850.3882 8579.3887 c
--7851.0088 8579.458 -7851.6465 8579.5215 -7852.2998 8579.5801 c
--7852.3174 8579.582 -7852.334 8579.584 -7852.3521 8579.585 c
--7852.3706 8579.5869 -7852.3882 8579.5879 -7852.4072 8579.5898 c
--7853.0615 8579.6465 -7853.7305 8579.6973 -7854.4146 8579.7422 c
--7854.4346 8579.7432 -7854.4561 8579.7441 -7854.4766 8579.7461 c
--7855.1567 8579.79 -7855.853 8579.8262 -7856.5601 8579.8574 c
--7856.583 8579.8584 -7856.6055 8579.8604 -7856.6279 8579.8613 c
--7856.6494 8579.8613 -7856.6738 8579.8623 -7856.6958 8579.8633 c
--7858.1567 8579.9238 -7859.6694 8579.957 -7861.2202 8579.957 c
--7862.769 8579.957 -7864.2798 8579.9238 -7865.7422 8579.8633 c
--7865.7646 8579.8623 -7865.7881 8579.8613 -7865.8096 8579.8613 c
--7865.833 8579.8604 -7865.8545 8579.8584 -7865.8774 8579.8574 c
--7866.5854 8579.8262 -7867.2832 8579.7891 -7867.9658 8579.7461 c
--7867.9834 8579.7441 -7868.001 8579.7432 -7868.0186 8579.7422 c
--7868.7065 8579.6973 -7869.3799 8579.6465 -7870.0361 8579.5879 c
--7870.0527 8579.5879 -7870.0703 8579.5859 -7870.0854 8579.585 c
--7870.1016 8579.584 -7870.1162 8579.582 -7870.1318 8579.5801 c
--7870.7886 8579.5225 -7871.4321 8579.458 -7872.0562 8579.3877 c
--7872.0698 8579.3867 -7872.083 8579.3848 -7872.0942 8579.3828 c
--7874.0234 8579.165 -7875.7832 8578.8906 -7877.3232 8578.5703 c
--7877.3247 8578.5703 -7877.3247 8578.5703 -7877.3271 8578.5703 c
--7877.3281 8578.5693 -7877.3306 8578.5693 -7877.3311 8578.5684 c
--7879.3896 8578.1406 -7881.0576 8577.6309 -7882.21 8577.0645 C
--7882.21 8577.0645 L
--7882.21 8577.0645 L
--7882.8682 8576.7402 -7883.353 8576.3984 -7883.6514 8576.042 c
--7883.876 8575.7754 -7884 8575.5 -7884 8575.2207 C
--7884 8581.2637 L
--7884 8581.5908 -7883.8408 8581.9102 -7883.5361 8582.2188 c
--7883.2334 8582.5273 -7882.7866 8582.8242 -7882.21 8583.1074 c
--7881.6328 8583.3906 -7880.9287 8583.6602 -7880.1089 8583.9121 c
--7879.29 8584.1641 -7878.3584 8584.3984 -7877.3271 8584.6133 c
--7876.2959 8584.8281 -7875.168 8585.0215 -7873.9561 8585.1914 c
--7872.7432 8585.3623 -7871.4497 8585.5088 -7870.0854 8585.6279 c
--7868.7231 8585.749 -7867.293 8585.8418 -7865.8096 8585.9043 c
--7864.3271 8585.9668 -7862.792 8586 -7861.2202 8586 c
--7859.6465 8586 -7858.1104 8585.9668 -7856.6279 8585.9043 c
--7855.145 8585.8418 -7853.7134 8585.749 -7852.3521 8585.6279 c
--7850.9897 8585.5088 -7849.6934 8585.3623 -7848.4814 8585.1914 c
--7847.2695 8585.0215 -7846.1416 8584.8281 -7845.1104 8584.6133 c
--7844.0801 8584.3984 -7843.147 8584.1641 -7842.3286 8583.9121 c
--7841.5103 8583.6602 -7840.8042 8583.3906 -7840.229 8583.1074 c
--7839.6514 8582.8242 -7839.2041 8582.5273 -7838.9009 8582.2188 c
--7838.5967 8581.9102 -7838.4385 8581.5908 -7838.4385 8581.2637 C
--7838.4385 8575.2207 L
--7838.4385 8575.5469 -7838.5967 8575.8672 -7838.9009 8576.1758 c
--7838.9775 8576.252 -7839.0625 8576.3281 -7839.1553 8576.4043 c
-f
-0.5 g
--7848.209 8572.2383 m
--7847.9424 8572.2383 L
--7847.9424 8572.4561 -7848.041 8572.6621 -7848.209 8572.8555 C
--7848.209 8574.0039 L
--7848.209 8574.1914 -7848.2998 8574.373 -7848.4736 8574.5488 c
--7848.6455 8574.7256 -7848.9014 8574.8945 -7849.231 8575.0566 c
--7849.5615 8575.2197 -7849.9639 8575.373 -7850.4302 8575.5166 c
--7850.8984 8575.6602 -7851.4302 8575.7949 -7852.0186 8575.917 c
--7852.6079 8576.0391 -7853.2529 8576.1504 -7853.9438 8576.248 c
--7854.6377 8576.3447 -7855.376 8576.4277 -7856.1543 8576.4961 c
--7856.9326 8576.5645 -7857.749 8576.6191 -7858.5967 8576.6543 c
--7859.4438 8576.6895 -7860.3218 8576.709 -7861.2192 8576.709 c
--7862.1162 8576.709 -7862.9946 8576.6895 -7863.8408 8576.6543 c
--7864.687 8576.6191 -7865.5049 8576.5645 -7866.2822 8576.4961 c
--7867.061 8576.4277 -7867.8008 8576.3447 -7868.4927 8576.248 c
--7869.1846 8576.1504 -7869.8306 8576.0391 -7870.418 8575.917 c
--7871.0063 8575.7949 -7871.54 8575.6602 -7872.0063 8575.5166 c
--7872.4746 8575.373 -7872.8774 8575.2197 -7873.2065 8575.0566 c
--7873.5361 8574.8945 -7873.792 8574.7256 -7873.9658 8574.5488 c
--7874.1377 8574.373 -7874.2295 8574.1914 -7874.2295 8574.0039 C
--7874.2295 8572.8555 L
--7874.3975 8572.6621 -7874.4961 8572.4561 -7874.4961 8572.2383 C
--7874.2295 8572.2383 L
--7874.2295 8571.4912 L
--7874.2695 8571.4453 -7874.2974 8571.3965 -7874.3286 8571.3486 C
--7880.1768 8572.2051 -7884 8573.6191 -7884 8575.2207 c
--7884 8575.501 -7883.876 8575.7754 -7883.6514 8576.042 c
--7883.353 8576.3984 -7882.8682 8576.7402 -7882.21 8577.0645 C
--7882.21 8577.0645 L
--7881.0576 8577.6309 -7879.3896 8578.1406 -7877.3311 8578.5684 c
--7877.3281 8578.5693 -7877.3247 8578.5703 -7877.3232 8578.5703 c
--7875.7832 8578.8906 -7874.0234 8579.165 -7872.0942 8579.3828 c
--7872.083 8579.3848 -7872.0698 8579.3867 -7872.0562 8579.3877 c
--7871.4321 8579.458 -7870.7886 8579.5225 -7870.1318 8579.5801 c
--7870.1006 8579.584 -7870.0688 8579.5859 -7870.0361 8579.5879 c
--7869.3799 8579.6465 -7868.7065 8579.6973 -7868.0186 8579.7422 c
--7868.001 8579.7432 -7867.9834 8579.7441 -7867.9658 8579.7461 c
--7867.2832 8579.7891 -7866.5854 8579.8262 -7865.8774 8579.8574 c
--7865.833 8579.8594 -7865.7881 8579.8613 -7865.7422 8579.8633 c
--7864.2798 8579.9238 -7862.769 8579.957 -7861.2202 8579.957 c
--7859.6694 8579.957 -7858.1567 8579.9238 -7856.6958 8579.8633 c
--7856.6514 8579.8613 -7856.6055 8579.8594 -7856.5601 8579.8574 c
--7855.853 8579.8262 -7855.1567 8579.79 -7854.4766 8579.7461 c
--7854.4561 8579.7441 -7854.4346 8579.7432 -7854.4146 8579.7422 c
--7853.7305 8579.6973 -7853.0615 8579.6465 -7852.4072 8579.5898 c
--7852.3706 8579.5859 -7852.335 8579.583 -7852.2998 8579.5801 c
--7851.6465 8579.5215 -7851.0088 8579.458 -7850.3882 8579.3887 c
--7850.3706 8579.3867 -7850.3535 8579.3848 -7850.3369 8579.3828 c
--7845.8286 8578.8721 -7842.2422 8578.0547 -7840.229 8577.0645 C
--7840.229 8577.0645 L
--7839.7959 8576.8516 -7839.437 8576.6309 -7839.1553 8576.4043 c
--7838.689 8576.0254 -7838.4385 8575.6289 -7838.4385 8575.2207 c
--7838.4385 8573.6191 -7842.2617 8572.2051 -7848.1104 8571.3486 C
--7848.1392 8571.3965 -7848.1689 8571.4453 -7848.209 8571.4912 C
--7848.209 8572.2383 L
-f
-0.55 g
--7861.2202 8558.7959 m
--7866.9199 8558.7959 -7872.9287 8557.9863 -7874.2295 8556.4746 C
--7874.2295 8557.2227 L
--7874.0454 8557.2227 L
--7874.0454 8558.3994 -7868.7783 8559.7109 -7861.2202 8559.7109 c
--7853.6602 8559.7109 -7848.3921 8558.3994 -7848.3921 8557.2227 C
--7848.209 8557.2227 L
--7848.209 8556.4746 L
--7849.5088 8557.9863 -7855.5166 8558.7959 -7861.2202 8558.7959 c
-f
--7861.2202 8549.2402 m
--7866.9199 8549.2402 -7872.9287 8548.4307 -7874.2295 8546.9199 C
--7874.2295 8547.666 L
--7874.0454 8547.666 L
--7874.0454 8548.8438 -7868.7783 8550.1563 -7861.2202 8550.1563 c
--7853.6602 8550.1563 -7848.3921 8548.8438 -7848.3921 8547.666 C
--7848.209 8547.666 L
--7848.209 8546.9199 L
--7849.5088 8548.4307 -7855.5166 8549.2402 -7861.2202 8549.2402 c
-f
--7861.2202 8560.1611 m
--7866.9199 8560.1611 -7872.9287 8559.3516 -7874.2295 8557.8398 C
--7874.2295 8558.5879 L
--7874.0454 8558.5879 L
--7874.0454 8559.7646 -7868.7783 8561.0762 -7861.2202 8561.0762 c
--7853.6602 8561.0762 -7848.3921 8559.7646 -7848.3921 8558.5879 C
--7848.209 8558.5879 L
--7848.209 8557.8398 L
--7849.5088 8559.3516 -7855.5166 8560.1611 -7861.2202 8560.1611 c
-f
--7861.2202 8561.5264 m
--7866.9199 8561.5264 -7872.9287 8560.7168 -7874.2295 8559.2051 C
--7874.2295 8559.9531 L
--7874.0454 8559.9531 L
--7874.0454 8561.1299 -7868.7783 8562.4414 -7861.2202 8562.4414 c
--7853.6602 8562.4414 -7848.3921 8561.1299 -7848.3921 8559.9531 C
--7848.209 8559.9531 L
--7848.209 8559.2051 L
--7849.5088 8560.7168 -7855.5166 8561.5264 -7861.2202 8561.5264 c
-f
--7861.2202 8550.6055 m
--7866.9199 8550.6055 -7872.9287 8549.7959 -7874.2295 8548.2852 C
--7874.2295 8549.0322 L
--7874.0454 8549.0322 L
--7874.0454 8550.209 -7868.7783 8551.5205 -7861.2202 8551.5205 c
--7853.6602 8551.5205 -7848.3921 8550.209 -7848.3921 8549.0322 C
--7848.209 8549.0322 L
--7848.209 8548.2852 L
--7849.5088 8549.7959 -7855.5166 8550.6055 -7861.2202 8550.6055 c
-f
--7861.2202 8554.7012 m
--7866.9199 8554.7012 -7872.9287 8553.8906 -7874.2295 8552.3789 C
--7874.2295 8553.127 L
--7874.0454 8553.127 L
--7874.0454 8554.3047 -7868.7783 8555.6162 -7861.2202 8555.6162 c
--7853.6602 8555.6162 -7848.3921 8554.3047 -7848.3921 8553.127 C
--7848.209 8553.127 L
--7848.209 8552.3789 L
--7849.5088 8553.8906 -7855.5166 8554.7012 -7861.2202 8554.7012 c
-f
--7861.2202 8557.4316 m
--7866.9199 8557.4316 -7872.9287 8556.6211 -7874.2295 8555.1104 C
--7874.2295 8555.8574 L
--7874.0454 8555.8574 L
--7874.0454 8557.0342 -7868.7783 8558.3457 -7861.2202 8558.3457 c
--7853.6602 8558.3457 -7848.3921 8557.0342 -7848.3921 8555.8574 C
--7848.209 8555.8574 L
--7848.209 8555.1104 L
--7849.5088 8556.6211 -7855.5166 8557.4316 -7861.2202 8557.4316 c
-f
--7861.2202 8553.3359 m
--7866.9199 8553.3359 -7872.9287 8552.5254 -7874.2295 8551.0146 C
--7874.2295 8551.7617 L
--7874.0454 8551.7617 L
--7874.0454 8552.9395 -7868.7783 8554.25 -7861.2202 8554.25 c
--7853.6602 8554.25 -7848.3921 8552.9395 -7848.3921 8551.7617 C
--7848.209 8551.7617 L
--7848.209 8551.0146 L
--7849.5088 8552.5254 -7855.5166 8553.3359 -7861.2202 8553.3359 c
-f
--7861.2202 8543.7803 m
--7866.9199 8543.7803 -7872.9287 8542.9707 -7874.2295 8541.459 C
--7874.2295 8542.2061 L
--7874.0454 8542.2061 L
--7874.0454 8543.3828 -7868.7783 8544.6953 -7861.2202 8544.6953 c
--7853.6602 8544.6953 -7848.3921 8543.3828 -7848.3921 8542.2061 C
--7848.209 8542.2061 L
--7848.209 8541.459 L
--7849.5088 8542.9707 -7855.5166 8543.7803 -7861.2202 8543.7803 c
-f
--7861.2202 8546.5098 m
--7866.9199 8546.5098 -7872.9287 8545.7012 -7874.2295 8544.1895 C
--7874.2295 8544.9375 L
--7874.0454 8544.9375 L
--7874.0454 8546.1133 -7868.7783 8547.4248 -7861.2202 8547.4248 c
--7853.6602 8547.4248 -7848.3921 8546.1133 -7848.3921 8544.9375 C
--7848.209 8544.9375 L
--7848.209 8544.1895 L
--7849.5088 8545.7012 -7855.5166 8546.5098 -7861.2202 8546.5098 c
-f
--7861.2202 8556.0664 m
--7866.9199 8556.0664 -7872.9287 8555.2559 -7874.2295 8553.7451 C
--7874.2295 8554.4922 L
--7874.0454 8554.4922 L
--7874.0454 8555.6689 -7868.7783 8556.9805 -7861.2202 8556.9805 c
--7853.6602 8556.9805 -7848.3921 8555.6689 -7848.3921 8554.4922 C
--7848.209 8554.4922 L
--7848.209 8553.7451 L
--7849.5088 8555.2559 -7855.5166 8556.0664 -7861.2202 8556.0664 c
-f
--7861.2202 8551.9707 m
--7866.9199 8551.9707 -7872.9287 8551.1611 -7874.2295 8549.6504 C
--7874.2295 8550.3965 L
--7874.0454 8550.3965 L
--7874.0454 8551.5742 -7868.7783 8552.8857 -7861.2202 8552.8857 c
--7853.6602 8552.8857 -7848.3921 8551.5742 -7848.3921 8550.3965 C
--7848.209 8550.3965 L
--7848.209 8549.6504 L
--7849.5088 8551.1611 -7855.5166 8551.9707 -7861.2202 8551.9707 c
-f
--7861.2202 8545.1445 m
--7866.9199 8545.1445 -7872.9287 8544.3359 -7874.2295 8542.8242 C
--7874.2295 8543.5723 L
--7874.0454 8543.5723 L
--7874.0454 8544.748 -7868.7783 8546.0605 -7861.2202 8546.0605 c
--7853.6602 8546.0605 -7848.3921 8544.748 -7848.3921 8543.5723 C
--7848.209 8543.5723 L
--7848.209 8542.8242 L
--7849.5088 8544.3359 -7855.5166 8545.1445 -7861.2202 8545.1445 c
-f
--7861.2202 8547.875 m
--7866.9199 8547.875 -7872.9287 8547.0654 -7874.2295 8545.5547 C
--7874.2295 8546.3008 L
--7874.0454 8546.3008 L
--7874.0454 8547.4785 -7868.7783 8548.791 -7861.2202 8548.791 c
--7853.6602 8548.791 -7848.3921 8547.4785 -7848.3921 8546.3008 C
--7848.209 8546.3008 L
--7848.209 8545.5547 L
--7849.5088 8547.0654 -7855.5166 8547.875 -7861.2202 8547.875 c
-f
--7861.2202 8568.3516 m
--7866.9199 8568.3516 -7872.9287 8567.543 -7874.2295 8566.0313 C
--7874.2295 8566.7783 L
--7874.0454 8566.7783 L
--7874.0454 8567.9551 -7868.7783 8569.2666 -7861.2202 8569.2666 c
--7853.6602 8569.2666 -7848.3921 8567.9551 -7848.3921 8566.7783 C
--7848.209 8566.7783 L
--7848.209 8566.0313 L
--7849.5088 8567.543 -7855.5166 8568.3516 -7861.2202 8568.3516 c
-f
--7861.2202 8572.4473 m
--7866.9199 8572.4473 -7872.9287 8571.6377 -7874.2295 8570.127 C
--7874.2295 8570.873 L
--7874.0454 8570.873 L
--7874.0454 8572.0508 -7868.7783 8573.3623 -7861.2202 8573.3623 c
--7853.6602 8573.3623 -7848.3921 8572.0508 -7848.3921 8570.873 C
--7848.209 8570.873 L
--7848.209 8570.127 L
--7849.5088 8571.6377 -7855.5166 8572.4473 -7861.2202 8572.4473 c
-f
--7861.2202 8571.082 m
--7866.9199 8571.082 -7872.9287 8570.2715 -7874.2295 8568.7607 C
--7874.2295 8569.5078 L
--7874.0454 8569.5078 L
--7874.0454 8570.6855 -7868.7783 8571.998 -7861.2202 8571.998 c
--7853.6602 8571.998 -7848.3921 8570.6855 -7848.3921 8569.5078 C
--7848.209 8569.5078 L
--7848.209 8568.7607 L
--7849.5088 8570.2715 -7855.5166 8571.082 -7861.2202 8571.082 c
-f
--7861.2202 8562.8906 m
--7866.9199 8562.8906 -7872.9287 8562.082 -7874.2295 8560.5703 C
--7874.2295 8561.3184 L
--7874.0454 8561.3184 L
--7874.0454 8562.4941 -7868.7783 8563.8066 -7861.2202 8563.8066 c
--7853.6602 8563.8066 -7848.3921 8562.4941 -7848.3921 8561.3184 C
--7848.209 8561.3184 L
--7848.209 8560.5703 L
--7849.5088 8562.082 -7855.5166 8562.8906 -7861.2202 8562.8906 c
-f
--7861.2202 8566.9863 m
--7866.9199 8566.9863 -7872.9287 8566.1768 -7874.2295 8564.666 C
--7874.2295 8565.4131 L
--7874.0454 8565.4131 L
--7874.0454 8566.5898 -7868.7783 8567.9023 -7861.2202 8567.9023 c
--7853.6602 8567.9023 -7848.3921 8566.5898 -7848.3921 8565.4131 C
--7848.209 8565.4131 L
--7848.209 8564.666 L
--7849.5088 8566.1768 -7855.5166 8566.9863 -7861.2202 8566.9863 c
-f
--7861.2202 8565.6211 m
--7866.9199 8565.6211 -7872.9287 8564.8115 -7874.2295 8563.3008 C
--7874.2295 8564.0479 L
--7874.0454 8564.0479 L
--7874.0454 8565.2246 -7868.7783 8566.5371 -7861.2202 8566.5371 c
--7853.6602 8566.5371 -7848.3921 8565.2246 -7848.3921 8564.0479 C
--7848.209 8564.0479 L
--7848.209 8563.3008 L
--7849.5088 8564.8115 -7855.5166 8565.6211 -7861.2202 8565.6211 c
-f
--7861.2202 8564.2559 m
--7866.9199 8564.2559 -7872.9287 8563.4473 -7874.2295 8561.9355 C
--7874.2295 8562.6826 L
--7874.0454 8562.6826 L
--7874.0454 8563.8594 -7868.7783 8565.1719 -7861.2202 8565.1719 c
--7853.6602 8565.1719 -7848.3921 8563.8594 -7848.3921 8562.6826 C
--7848.209 8562.6826 L
--7848.209 8561.9355 L
--7849.5088 8563.4473 -7855.5166 8564.2559 -7861.2202 8564.2559 c
-f
--7861.2202 8569.7168 m
--7866.9199 8569.7168 -7872.9287 8568.9072 -7874.2295 8567.3965 C
--7874.2295 8568.1426 L
--7874.0454 8568.1426 L
--7874.0454 8569.3203 -7868.7783 8570.6318 -7861.2202 8570.6318 c
--7853.6602 8570.6318 -7848.3921 8569.3203 -7848.3921 8568.1426 C
--7848.209 8568.1426 L
--7848.209 8567.3965 L
--7849.5088 8568.9072 -7855.5166 8569.7168 -7861.2202 8569.7168 c
-f
--7852.3521 8539.5498 m
--7853.7134 8539.6699 -7855.145 8539.7637 -7856.6279 8539.8262 c
--7858.1104 8539.8887 -7859.6465 8539.9229 -7861.2202 8539.9229 c
--7862.792 8539.9229 -7864.3271 8539.8887 -7865.8096 8539.8262 c
--7867.293 8539.7637 -7868.7231 8539.6699 -7870.0854 8539.5498 c
--7871.4497 8539.4307 -7872.7432 8539.2852 -7873.9561 8539.1143 c
--7874.0498 8539.1016 -7874.1362 8539.085 -7874.2295 8539.0713 C
--7874.2295 8539.4766 L
--7874.0454 8539.4766 L
--7874.0454 8540.6523 -7868.7783 8541.9648 -7861.2202 8541.9648 c
--7853.6602 8541.9648 -7848.3921 8540.6523 -7848.3921 8539.4766 C
--7848.209 8539.4766 L
--7848.209 8539.0723 L
--7848.3018 8539.085 -7848.3882 8539.1016 -7848.4814 8539.1143 c
--7849.6934 8539.2852 -7850.9897 8539.4307 -7852.3521 8539.5498 c
-f
--7861.2202 8542.415 m
--7866.9199 8542.415 -7872.9287 8541.6055 -7874.2295 8540.0938 C
--7874.2295 8540.8418 L
--7874.0454 8540.8418 L
--7874.0454 8542.0186 -7868.7783 8543.3301 -7861.2202 8543.3301 c
--7853.6602 8543.3301 -7848.3921 8542.0186 -7848.3921 8540.8418 C
--7848.209 8540.8418 L
--7848.209 8540.0938 L
--7849.5088 8541.6055 -7855.5166 8542.415 -7861.2202 8542.415 c
-f
--7861.2202 8575.1768 m
--7866.9199 8575.1768 -7872.9287 8574.3672 -7874.2295 8572.8555 C
--7874.2295 8574.0039 L
--7874.2295 8574.1914 -7874.1377 8574.373 -7873.9658 8574.5488 c
--7873.792 8574.7256 -7873.5361 8574.8945 -7873.2065 8575.0566 c
--7872.8774 8575.2197 -7872.4746 8575.373 -7872.0063 8575.5166 c
--7871.54 8575.6602 -7871.0063 8575.7949 -7870.418 8575.917 c
--7869.8306 8576.0391 -7869.1846 8576.1504 -7868.4927 8576.248 c
--7867.8008 8576.3447 -7867.061 8576.4277 -7866.2822 8576.4961 c
--7865.5049 8576.5645 -7864.687 8576.6191 -7863.8408 8576.6543 c
--7862.9946 8576.6895 -7862.1162 8576.709 -7861.2192 8576.709 c
--7860.3218 8576.709 -7859.4438 8576.6895 -7858.5967 8576.6543 c
--7857.749 8576.6191 -7856.9326 8576.5645 -7856.1543 8576.4961 c
--7855.376 8576.4277 -7854.6377 8576.3447 -7853.9438 8576.248 c
--7853.2529 8576.1504 -7852.6079 8576.0391 -7852.0186 8575.917 c
--7851.4302 8575.7949 -7850.8984 8575.6602 -7850.4302 8575.5166 c
--7849.9639 8575.373 -7849.5615 8575.2197 -7849.231 8575.0566 c
--7848.9014 8574.8945 -7848.6455 8574.7256 -7848.4736 8574.5488 c
--7848.2998 8574.373 -7848.209 8574.1914 -7848.209 8574.0039 C
--7848.209 8572.8555 L
--7849.5088 8574.3672 -7855.5166 8575.1768 -7861.2202 8575.1768 c
-f
--7874.0454 8572.2383 m
--7874.0454 8573.415 -7868.7783 8574.7266 -7861.2202 8574.7266 c
--7853.6602 8574.7266 -7848.3921 8573.415 -7848.3921 8572.2383 C
--7848.209 8572.2383 L
--7848.209 8571.4912 L
--7849.5088 8573.002 -7855.5166 8573.8125 -7861.2202 8573.8125 c
--7866.9199 8573.8125 -7872.9287 8573.002 -7874.2295 8571.4912 C
--7874.2295 8572.2383 L
--7874.0454 8572.2383 L
-f
-0.15 g
--7861.2202 8541.9648 m
--7868.7783 8541.9648 -7874.0454 8540.6523 -7874.0454 8539.4766 C
--7874.2295 8539.4766 L
--7874.4961 8539.4766 L
--7874.4961 8539.6943 -7874.3975 8539.8994 -7874.2295 8540.0938 c
--7872.9287 8541.6055 -7866.9199 8542.415 -7861.2202 8542.415 c
--7855.5166 8542.415 -7849.5088 8541.6055 -7848.209 8540.0938 c
--7848.041 8539.8994 -7847.9424 8539.6943 -7847.9424 8539.4766 C
--7848.209 8539.4766 L
--7848.3921 8539.4766 L
--7848.3921 8540.6523 -7853.6602 8541.9648 -7861.2202 8541.9648 c
-f
--7861.2202 8543.3301 m
--7868.7783 8543.3301 -7874.0454 8542.0186 -7874.0454 8540.8418 C
--7874.2295 8540.8418 L
--7874.4961 8540.8418 L
--7874.4961 8541.0586 -7874.3975 8541.2637 -7874.2295 8541.459 c
--7872.9287 8542.9707 -7866.9199 8543.7803 -7861.2202 8543.7803 c
--7855.5166 8543.7803 -7849.5088 8542.9707 -7848.209 8541.459 c
--7848.041 8541.2637 -7847.9424 8541.0586 -7847.9424 8540.8418 C
--7848.209 8540.8418 L
--7848.3921 8540.8418 L
--7848.3921 8542.0186 -7853.6602 8543.3301 -7861.2202 8543.3301 c
-f
--7861.2202 8544.6953 m
--7868.7783 8544.6953 -7874.0454 8543.3828 -7874.0454 8542.2061 C
--7874.2295 8542.2061 L
--7874.4961 8542.2061 L
--7874.4961 8542.4238 -7874.3975 8542.6289 -7874.2295 8542.8242 c
--7872.9287 8544.3359 -7866.9199 8545.1445 -7861.2202 8545.1445 c
--7855.5166 8545.1445 -7849.5088 8544.3359 -7848.209 8542.8242 c
--7848.041 8542.6289 -7847.9424 8542.4238 -7847.9424 8542.2061 C
--7848.209 8542.2061 L
--7848.3921 8542.2061 L
--7848.3921 8543.3828 -7853.6602 8544.6953 -7861.2202 8544.6953 c
-f
--7861.2202 8546.0605 m
--7868.7783 8546.0605 -7874.0454 8544.748 -7874.0454 8543.5723 C
--7874.2295 8543.5723 L
--7874.4961 8543.5723 L
--7874.4961 8543.79 -7874.3975 8543.9951 -7874.2295 8544.1895 c
--7872.9287 8545.7012 -7866.9199 8546.5098 -7861.2202 8546.5098 c
--7855.5166 8546.5098 -7849.5088 8545.7012 -7848.209 8544.1895 c
--7848.041 8543.9951 -7847.9424 8543.79 -7847.9424 8543.5723 C
--7848.209 8543.5723 L
--7848.3921 8543.5723 L
--7848.3921 8544.748 -7853.6602 8546.0605 -7861.2202 8546.0605 c
-f
--7861.2202 8547.4248 m
--7868.7783 8547.4248 -7874.0454 8546.1133 -7874.0454 8544.9375 C
--7874.2295 8544.9375 L
--7874.4961 8544.9375 L
--7874.4961 8545.1543 -7874.3975 8545.3594 -7874.2295 8545.5547 c
--7872.9287 8547.0654 -7866.9199 8547.875 -7861.2202 8547.875 c
--7855.5166 8547.875 -7849.5088 8547.0654 -7848.209 8545.5547 c
--7848.041 8545.3594 -7847.9424 8545.1543 -7847.9424 8544.9375 C
--7848.209 8544.9375 L
--7848.3921 8544.9375 L
--7848.3921 8546.1133 -7853.6602 8547.4248 -7861.2202 8547.4248 c
-f
--7861.2202 8548.791 m
--7868.7783 8548.791 -7874.0454 8547.4785 -7874.0454 8546.3008 C
--7874.2295 8546.3008 L
--7874.4961 8546.3008 L
--7874.4961 8546.5195 -7874.3975 8546.7246 -7874.2295 8546.9199 c
--7872.9287 8548.4307 -7866.9199 8549.2402 -7861.2202 8549.2402 c
--7855.5166 8549.2402 -7849.5088 8548.4307 -7848.209 8546.9199 c
--7848.041 8546.7246 -7847.9424 8546.5195 -7847.9424 8546.3008 C
--7848.209 8546.3008 L
--7848.3921 8546.3008 L
--7848.3921 8547.4785 -7853.6602 8548.791 -7861.2202 8548.791 c
-f
--7861.2202 8550.1563 m
--7868.7783 8550.1563 -7874.0454 8548.8438 -7874.0454 8547.666 C
--7874.2295 8547.666 L
--7874.4961 8547.666 L
--7874.4961 8547.8848 -7874.3975 8548.0898 -7874.2295 8548.2852 c
--7872.9287 8549.7959 -7866.9199 8550.6055 -7861.2202 8550.6055 c
--7855.5166 8550.6055 -7849.5088 8549.7959 -7848.209 8548.2852 c
--7848.041 8548.0898 -7847.9424 8547.8848 -7847.9424 8547.666 C
--7848.209 8547.666 L
--7848.3921 8547.666 L
--7848.3921 8548.8438 -7853.6602 8550.1563 -7861.2202 8550.1563 c
-f
--7861.2202 8551.5205 m
--7868.7783 8551.5205 -7874.0454 8550.209 -7874.0454 8549.0322 C
--7874.2295 8549.0322 L
--7874.4961 8549.0322 L
--7874.4961 8549.25 -7874.3975 8549.4551 -7874.2295 8549.6504 c
--7872.9287 8551.1611 -7866.9199 8551.9707 -7861.2202 8551.9707 c
--7855.5166 8551.9707 -7849.5088 8551.1611 -7848.209 8549.6504 c
--7848.041 8549.4551 -7847.9424 8549.25 -7847.9424 8549.0322 C
--7848.209 8549.0322 L
--7848.3921 8549.0322 L
--7848.3921 8550.209 -7853.6602 8551.5205 -7861.2202 8551.5205 c
-f
--7861.2202 8552.8857 m
--7868.7783 8552.8857 -7874.0454 8551.5742 -7874.0454 8550.3965 C
--7874.2295 8550.3965 L
--7874.4961 8550.3965 L
--7874.4961 8550.6152 -7874.3975 8550.8203 -7874.2295 8551.0146 c
--7872.9287 8552.5254 -7866.9199 8553.3359 -7861.2202 8553.3359 c
--7855.5166 8553.3359 -7849.5088 8552.5254 -7848.209 8551.0146 c
--7848.041 8550.8203 -7847.9424 8550.6152 -7847.9424 8550.3965 C
--7848.209 8550.3965 L
--7848.3921 8550.3965 L
--7848.3921 8551.5742 -7853.6602 8552.8857 -7861.2202 8552.8857 c
-f
--7861.2202 8554.25 m
--7868.7783 8554.25 -7874.0454 8552.9395 -7874.0454 8551.7617 C
--7874.2295 8551.7617 L
--7874.4961 8551.7617 L
--7874.4961 8551.9795 -7874.3975 8552.1846 -7874.2295 8552.3789 c
--7872.9287 8553.8906 -7866.9199 8554.7012 -7861.2202 8554.7012 c
--7855.5166 8554.7012 -7849.5088 8553.8906 -7848.209 8552.3789 c
--7848.041 8552.1846 -7847.9424 8551.9795 -7847.9424 8551.7617 C
--7848.209 8551.7617 L
--7848.3921 8551.7617 L
--7848.3921 8552.9395 -7853.6602 8554.25 -7861.2202 8554.25 c
-f
--7861.2202 8555.6162 m
--7868.7783 8555.6162 -7874.0454 8554.3047 -7874.0454 8553.127 C
--7874.2295 8553.127 L
--7874.4961 8553.127 L
--7874.4961 8553.3457 -7874.3975 8553.5508 -7874.2295 8553.7451 c
--7872.9287 8555.2559 -7866.9199 8556.0664 -7861.2202 8556.0664 c
--7855.5166 8556.0664 -7849.5088 8555.2559 -7848.209 8553.7451 c
--7848.041 8553.5508 -7847.9424 8553.3457 -7847.9424 8553.127 C
--7848.209 8553.127 L
--7848.3921 8553.127 L
--7848.3921 8554.3047 -7853.6602 8555.6162 -7861.2202 8555.6162 c
-f
--7861.2202 8556.9805 m
--7868.7783 8556.9805 -7874.0454 8555.6689 -7874.0454 8554.4922 C
--7874.2295 8554.4922 L
--7874.4961 8554.4922 L
--7874.4961 8554.7109 -7874.3975 8554.916 -7874.2295 8555.1104 c
--7872.9287 8556.6211 -7866.9199 8557.4316 -7861.2202 8557.4316 c
--7855.5166 8557.4316 -7849.5088 8556.6211 -7848.209 8555.1104 c
--7848.041 8554.916 -7847.9424 8554.7109 -7847.9424 8554.4922 C
--7848.209 8554.4922 L
--7848.3921 8554.4922 L
--7848.3921 8555.6689 -7853.6602 8556.9805 -7861.2202 8556.9805 c
-f
--7861.2202 8558.3457 m
--7868.7783 8558.3457 -7874.0454 8557.0342 -7874.0454 8555.8574 C
--7874.2295 8555.8574 L
--7874.4961 8555.8574 L
--7874.4961 8556.0752 -7874.3975 8556.2803 -7874.2295 8556.4746 c
--7872.9287 8557.9863 -7866.9199 8558.7959 -7861.2202 8558.7959 c
--7855.5166 8558.7959 -7849.5088 8557.9863 -7848.209 8556.4746 c
--7848.041 8556.2803 -7847.9424 8556.0752 -7847.9424 8555.8574 C
--7848.209 8555.8574 L
--7848.3921 8555.8574 L
--7848.3921 8557.0342 -7853.6602 8558.3457 -7861.2202 8558.3457 c
-f
--7861.2202 8559.7109 m
--7868.7783 8559.7109 -7874.0454 8558.3994 -7874.0454 8557.2227 C
--7874.2295 8557.2227 L
--7874.4961 8557.2227 L
--7874.4961 8557.4395 -7874.3975 8557.6455 -7874.2295 8557.8398 c
--7872.9287 8559.3516 -7866.9199 8560.1611 -7861.2202 8560.1611 c
--7855.5166 8560.1611 -7849.5088 8559.3516 -7848.209 8557.8398 c
--7848.041 8557.6455 -7847.9424 8557.4395 -7847.9424 8557.2227 C
--7848.209 8557.2227 L
--7848.3921 8557.2227 L
--7848.3921 8558.3994 -7853.6602 8559.7109 -7861.2202 8559.7109 c
-f
--7861.2202 8561.0762 m
--7868.7783 8561.0762 -7874.0454 8559.7646 -7874.0454 8558.5879 C
--7874.2295 8558.5879 L
--7874.4961 8558.5879 L
--7874.4961 8558.8057 -7874.3975 8559.0107 -7874.2295 8559.2051 c
--7872.9287 8560.7168 -7866.9199 8561.5264 -7861.2202 8561.5264 c
--7855.5166 8561.5264 -7849.5088 8560.7168 -7848.209 8559.2051 c
--7848.041 8559.0107 -7847.9424 8558.8057 -7847.9424 8558.5879 C
--7848.209 8558.5879 L
--7848.3921 8558.5879 L
--7848.3921 8559.7646 -7853.6602 8561.0762 -7861.2202 8561.0762 c
-f
--7861.2202 8562.4414 m
--7868.7783 8562.4414 -7874.0454 8561.1299 -7874.0454 8559.9531 C
--7874.2295 8559.9531 L
--7874.4961 8559.9531 L
--7874.4961 8560.1709 -7874.3975 8560.376 -7874.2295 8560.5703 c
--7872.9287 8562.082 -7866.9199 8562.8906 -7861.2202 8562.8906 c
--7855.5166 8562.8906 -7849.5088 8562.082 -7848.209 8560.5703 c
--7848.041 8560.376 -7847.9424 8560.1709 -7847.9424 8559.9531 C
--7848.209 8559.9531 L
--7848.3921 8559.9531 L
--7848.3921 8561.1299 -7853.6602 8562.4414 -7861.2202 8562.4414 c
-f
--7861.2202 8563.8066 m
--7868.7783 8563.8066 -7874.0454 8562.4941 -7874.0454 8561.3184 C
--7874.2295 8561.3184 L
--7874.4961 8561.3184 L
--7874.4961 8561.5352 -7874.3975 8561.7412 -7874.2295 8561.9355 c
--7872.9287 8563.4473 -7866.9199 8564.2559 -7861.2202 8564.2559 c
--7855.5166 8564.2559 -7849.5088 8563.4473 -7848.209 8561.9355 c
--7848.041 8561.7412 -7847.9424 8561.5352 -7847.9424 8561.3184 C
--7848.209 8561.3184 L
--7848.3921 8561.3184 L
--7848.3921 8562.4941 -7853.6602 8563.8066 -7861.2202 8563.8066 c
-f
--7861.2202 8565.1719 m
--7868.7783 8565.1719 -7874.0454 8563.8594 -7874.0454 8562.6826 C
--7874.2295 8562.6826 L
--7874.4961 8562.6826 L
--7874.4961 8562.9004 -7874.3975 8563.1055 -7874.2295 8563.3008 c
--7872.9287 8564.8115 -7866.9199 8565.6211 -7861.2202 8565.6211 c
--7855.5166 8565.6211 -7849.5088 8564.8115 -7848.209 8563.3008 c
--7848.041 8563.1055 -7847.9424 8562.9004 -7847.9424 8562.6826 C
--7848.209 8562.6826 L
--7848.3921 8562.6826 L
--7848.3921 8563.8594 -7853.6602 8565.1719 -7861.2202 8565.1719 c
-f
--7861.2202 8566.5371 m
--7868.7783 8566.5371 -7874.0454 8565.2246 -7874.0454 8564.0479 C
--7874.2295 8564.0479 L
--7874.4961 8564.0479 L
--7874.4961 8564.2656 -7874.3975 8564.4707 -7874.2295 8564.666 c
--7872.9287 8566.1768 -7866.9199 8566.9863 -7861.2202 8566.9863 c
--7855.5166 8566.9863 -7849.5088 8566.1768 -7848.209 8564.666 c
--7848.041 8564.4707 -7847.9424 8564.2656 -7847.9424 8564.0479 C
--7848.209 8564.0479 L
--7848.3921 8564.0479 L
--7848.3921 8565.2246 -7853.6602 8566.5371 -7861.2202 8566.5371 c
-f
--7861.2202 8567.9023 m
--7868.7783 8567.9023 -7874.0454 8566.5898 -7874.0454 8565.4131 C
--7874.2295 8565.4131 L
--7874.4961 8565.4131 L
--7874.4961 8565.6309 -7874.3975 8565.8359 -7874.2295 8566.0313 c
--7872.9287 8567.543 -7866.9199 8568.3516 -7861.2202 8568.3516 c
--7855.5166 8568.3516 -7849.5088 8567.543 -7848.209 8566.0313 c
--7848.041 8565.8359 -7847.9424 8565.6309 -7847.9424 8565.4131 C
--7848.209 8565.4131 L
--7848.3921 8565.4131 L
--7848.3921 8566.5898 -7853.6602 8567.9023 -7861.2202 8567.9023 c
-f
--7861.2202 8569.2666 m
--7868.7783 8569.2666 -7874.0454 8567.9551 -7874.0454 8566.7783 C
--7874.2295 8566.7783 L
--7874.4961 8566.7783 L
--7874.4961 8566.9961 -7874.3975 8567.2012 -7874.2295 8567.3965 c
--7872.9287 8568.9072 -7866.9199 8569.7168 -7861.2202 8569.7168 c
--7855.5166 8569.7168 -7849.5088 8568.9072 -7848.209 8567.3965 c
--7848.041 8567.2012 -7847.9424 8566.9961 -7847.9424 8566.7783 C
--7848.209 8566.7783 L
--7848.3921 8566.7783 L
--7848.3921 8567.9551 -7853.6602 8569.2666 -7861.2202 8569.2666 c
-f
--7861.2202 8570.6318 m
--7868.7783 8570.6318 -7874.0454 8569.3203 -7874.0454 8568.1426 C
--7874.2295 8568.1426 L
--7874.4961 8568.1426 L
--7874.4961 8568.3613 -7874.3975 8568.5664 -7874.2295 8568.7607 c
--7872.9287 8570.2715 -7866.9199 8571.082 -7861.2202 8571.082 c
--7855.5166 8571.082 -7849.5088 8570.2715 -7848.209 8568.7607 c
--7848.041 8568.5664 -7847.9424 8568.3613 -7847.9424 8568.1426 C
--7848.209 8568.1426 L
--7848.3921 8568.1426 L
--7848.3921 8569.3203 -7853.6602 8570.6318 -7861.2202 8570.6318 c
-f
--7861.2202 8571.998 m
--7868.7783 8571.998 -7874.0454 8570.6855 -7874.0454 8569.5078 C
--7874.2295 8569.5078 L
--7874.4961 8569.5078 L
--7874.4961 8569.7266 -7874.3975 8569.9316 -7874.2295 8570.127 c
--7872.9287 8571.6377 -7866.9199 8572.4473 -7861.2202 8572.4473 c
--7855.5166 8572.4473 -7849.5088 8571.6377 -7848.209 8570.127 c
--7848.041 8569.9316 -7847.9424 8569.7266 -7847.9424 8569.5078 C
--7848.209 8569.5078 L
--7848.3921 8569.5078 L
--7848.3921 8570.6855 -7853.6602 8571.998 -7861.2202 8571.998 c
-f
--7861.2202 8573.3623 m
--7868.7783 8573.3623 -7874.0454 8572.0508 -7874.0454 8570.873 C
--7874.2295 8570.873 L
--7874.4961 8570.873 L
--7874.4961 8571.0391 -7874.4282 8571.1953 -7874.3286 8571.3486 c
--7874.2974 8571.3965 -7874.2695 8571.4453 -7874.2295 8571.4912 c
--7872.9287 8573.002 -7866.9199 8573.8125 -7861.2202 8573.8125 c
--7855.5166 8573.8125 -7849.5088 8573.002 -7848.209 8571.4912 c
--7848.1689 8571.4453 -7848.1392 8571.3965 -7848.1104 8571.3486 c
--7848.0103 8571.1953 -7847.9424 8571.0391 -7847.9424 8570.873 C
--7848.209 8570.873 L
--7848.3921 8570.873 L
--7848.3921 8572.0508 -7853.6602 8573.3623 -7861.2202 8573.3623 c
-f
--7861.2202 8574.7266 m
--7868.7783 8574.7266 -7874.0454 8573.415 -7874.0454 8572.2383 C
--7874.2295 8572.2383 L
--7874.4961 8572.2383 L
--7874.4961 8572.4561 -7874.3975 8572.6621 -7874.2295 8572.8555 c
--7872.9287 8574.3672 -7866.9199 8575.1768 -7861.2202 8575.1768 c
--7855.5166 8575.1768 -7849.5088 8574.3672 -7848.209 8572.8555 c
--7848.041 8572.6621 -7847.9424 8572.4561 -7847.9424 8572.2383 C
--7848.209 8572.2383 L
--7848.3921 8572.2383 L
--7848.3921 8573.415 -7853.6602 8574.7266 -7861.2202 8574.7266 c
-f
-0.8 g
--7839.0342 8530.2168 m
--7839.3311 8530.4834 -7839.7271 8530.7402 -7840.229 8530.9863 c
--7840.231 8530.9883 -7840.2334 8530.9893 -7840.2358 8530.9902 c
--7840.5225 8531.1309 -7840.8394 8531.2676 -7841.187 8531.4004 c
--7841.187 8531.4004 l
--7841.8857 8531.668 -7842.7026 8531.9189 -7843.626 8532.1523 c
--7843.6362 8532.1543 -7843.647 8532.1572 -7843.6582 8532.1602 c
--7845.501 8532.623 -7847.7583 8533.0117 -7850.313 8533.3018 c
--7850.3457 8533.3047 -7850.3774 8533.3086 -7850.4111 8533.3125 c
--7851.6626 8533.4531 -7852.9834 8533.5703 -7854.3599 8533.6602 c
--7854.4209 8533.6641 -7854.4785 8533.668 -7854.5366 8533.6719 c
--7855.1743 8533.7119 -7855.8232 8533.7461 -7856.4824 8533.7754 c
--7856.5313 8533.7773 -7856.5791 8533.7813 -7856.6279 8533.7832 c
--7856.6758 8533.7852 -7856.7246 8533.7861 -7856.7729 8533.7881 c
--7857.4561 8533.8164 -7858.1514 8533.8379 -7858.856 8533.8535 c
--7858.8774 8533.8535 -7858.8994 8533.8545 -7858.9209 8533.8545 c
--7859.6768 8533.8711 -7860.4424 8533.8789 -7861.2202 8533.8789 c
--7861.9951 8533.8789 -7862.7607 8533.8711 -7863.5166 8533.8545 c
--7863.5391 8533.8545 -7863.5601 8533.8535 -7863.582 8533.8535 c
--7864.2871 8533.8379 -7864.9814 8533.8164 -7865.667 8533.7881 c
--7865.7134 8533.7861 -7865.7642 8533.7852 -7865.8096 8533.7832 c
--7865.8608 8533.7813 -7865.9058 8533.7773 -7865.9561 8533.7754 c
--7866.6162 8533.7461 -7867.2666 8533.7119 -7867.9038 8533.6709 c
--7867.9609 8533.668 -7868.0166 8533.6641 -7868.0718 8533.6602 c
--7869.4526 8533.5703 -7870.7783 8533.4531 -7872.0322 8533.3125 c
--7872.0615 8533.3086 -7872.0898 8533.3057 -7872.1201 8533.3027 c
--7874.6768 8533.0117 -7876.9385 8532.623 -7878.7822 8532.1592 c
--7878.792 8532.1572 -7878.8018 8532.1543 -7878.811 8532.1523 c
--7880.1934 8531.8027 -7881.3408 8531.4121 -7882.2026 8530.9902 c
--7882.2041 8530.9893 -7882.208 8530.9883 -7882.21 8530.9863 c
--7882.4639 8530.8613 -7882.6904 8530.7324 -7882.8936 8530.6016 c
--7883.3799 8530.29 -7883.7178 8529.9639 -7883.8818 8529.627 c
--7883.96 8529.4688 -7884 8529.3066 -7884 8529.1426 C
--7884 8535.1855 L
--7884 8535.5137 -7883.8408 8535.832 -7883.5361 8536.1406 c
--7883.2334 8536.4492 -7882.7866 8536.7461 -7882.21 8537.0303 c
--7881.6328 8537.3125 -7880.9287 8537.583 -7880.1089 8537.834 c
--7879.29 8538.0859 -7878.3584 8538.3203 -7877.3271 8538.5352 c
--7876.377 8538.7324 -7875.335 8538.9121 -7874.2295 8539.0713 c
--7874.1362 8539.085 -7874.0498 8539.1016 -7873.9561 8539.1143 c
--7872.7432 8539.2852 -7871.4497 8539.4307 -7870.0854 8539.5498 c
--7868.7231 8539.6699 -7867.293 8539.7637 -7865.8096 8539.8262 c
--7864.3271 8539.8887 -7862.792 8539.9229 -7861.2202 8539.9229 c
--7859.6465 8539.9229 -7858.1104 8539.8887 -7856.6279 8539.8262 c
--7855.145 8539.7637 -7853.7134 8539.6699 -7852.3521 8539.5498 c
--7850.9897 8539.4307 -7849.6934 8539.2852 -7848.4814 8539.1143 c
--7848.3882 8539.1016 -7848.3018 8539.085 -7848.209 8539.0723 c
--7847.105 8538.9121 -7846.0615 8538.7324 -7845.1104 8538.5352 c
--7844.0801 8538.3203 -7843.147 8538.0859 -7842.3286 8537.834 c
--7841.5103 8537.583 -7840.8042 8537.3125 -7840.229 8537.0303 c
--7839.6514 8536.7461 -7839.2041 8536.4492 -7838.9009 8536.1406 c
--7838.5967 8535.832 -7838.4385 8535.5137 -7838.4385 8535.1855 C
--7838.4385 8529.1426 L
--7838.4385 8529.3887 -7838.5278 8529.6289 -7838.7002 8529.8643 c
--7838.7881 8529.9834 -7838.9038 8530.1016 -7839.0342 8530.2168 c
-f
-0.5 g
--7845.9463 8525.6279 m
--7847.4521 8528.6533 -7849.7656 8530.1738 -7849.8774 8530.2461 C
--7849.9346 8530.2813 L
--7873.333 8530.2813 L
--7873.3887 8529.8389 L
--7873.3638 8529.832 -7871.0127 8529.166 -7868.5498 8524.6582 C
--7877.5342 8525.293 -7884 8527.0605 -7884 8529.1426 c
--7884 8529.3066 -7883.96 8529.4688 -7883.8818 8529.627 c
--7883.7178 8529.9639 -7883.3799 8530.29 -7882.8936 8530.6016 c
--7882.687 8530.7344 -7882.46 8530.8633 -7882.2026 8530.9902 c
--7881.3408 8531.4121 -7880.1934 8531.8027 -7878.811 8532.1523 c
--7878.8018 8532.1543 -7878.792 8532.1572 -7878.7822 8532.1592 c
--7876.9385 8532.623 -7874.6768 8533.0117 -7872.1201 8533.3027 c
--7872.0898 8533.3057 -7872.0615 8533.3086 -7872.0322 8533.3125 c
--7870.7783 8533.4531 -7869.4526 8533.5703 -7868.0718 8533.6602 c
--7868.0166 8533.6641 -7867.9609 8533.668 -7867.9038 8533.6709 c
--7867.2666 8533.7119 -7866.6162 8533.7461 -7865.9561 8533.7754 c
--7865.8594 8533.7793 -7865.7642 8533.7842 -7865.667 8533.7881 c
--7864.9814 8533.8164 -7864.2871 8533.8379 -7863.582 8533.8535 c
--7863.5601 8533.8535 -7863.5391 8533.8545 -7863.5166 8533.8545 c
--7862.7607 8533.8711 -7861.9951 8533.8789 -7861.2202 8533.8789 c
--7860.4424 8533.8789 -7859.6768 8533.8711 -7858.9209 8533.8545 c
--7858.8994 8533.8545 -7858.8774 8533.8535 -7858.856 8533.8535 c
--7858.1514 8533.8379 -7857.4561 8533.8164 -7856.7729 8533.7881 c
--7856.6758 8533.7842 -7856.5791 8533.7793 -7856.4824 8533.7754 c
--7855.8232 8533.7461 -7855.1743 8533.7119 -7854.5366 8533.6719 c
--7854.4785 8533.668 -7854.4209 8533.6641 -7854.3599 8533.6602 c
--7852.9834 8533.5703 -7851.6626 8533.4531 -7850.4111 8533.3125 c
--7850.3774 8533.3086 -7850.3457 8533.3047 -7850.313 8533.3018 c
--7847.7583 8533.0117 -7845.501 8532.623 -7843.6582 8532.1602 c
--7843.647 8532.1572 -7843.6362 8532.1543 -7843.626 8532.1523 c
--7842.7026 8531.9189 -7841.8857 8531.668 -7841.187 8531.4004 C
--7841.187 8531.4004 L
--7840.8394 8531.2676 -7840.5225 8531.1309 -7840.2358 8530.9902 c
--7839.731 8530.7432 -7839.332 8530.4844 -7839.0342 8530.2168 c
--7838.9038 8530.1016 -7838.7881 8529.9834 -7838.7002 8529.8643 c
--7838.5278 8529.6289 -7838.4385 8529.3887 -7838.4385 8529.1426 c
--7838.4385 8527.748 -7841.3359 8526.4951 -7845.9463 8525.6279 C
-f
-*u
-1 g
-1 D
--7867.7471 8524.0996 m
--7866.8584 8522.3203 -7866.5679 8520.6797 -7866.5679 8519.0811 c
--7866.5679 8517.6328 -7866.8057 8516.2178 -7867.0498 8514.7646 c
--7867.2959 8513.2949 -7867.5498 8511.7852 -7867.5498 8510.1855 c
--7867.5498 8509.792 -7867.5352 8509.3926 -7867.5 8508.9863 c
--7867.0518 8503.7461 -7861.4072 8501.1475 -7861.3506 8501.1221 C
--7840.5649 8501.1396 -7839.0386 8501.1406 V
--7840.1807 8501.8877 -7842.5088 8503.7266 -7844.8066 8507.5039 c
--7845.8433 8509.2051 -7846.1567 8511.1133 -7846.1567 8513.041 c
--7846.1567 8514.5996 -7845.9512 8516.1699 -7845.7578 8517.6523 c
--7845.5791 8519.0303 -7845.4038 8520.3633 -7845.4038 8521.5723 c
--7845.4038 8522.4287 -7845.4912 8523.2236 -7845.7256 8523.9277 c
--7846.9727 8527.6641 -7849.792 8529.6445 -7850.0713 8529.832 C
--7850.2046 8529.832 -7870.5674 8529.832 -7872.3569 8529.832 C
--7871.3154 8529.1973 -7869.5391 8527.6836 -7867.7471 8524.0996 c
-f
-0 D
--7850.8975 8526.2422 m
--7865.9287 8526.2422 L
--7865.9287 8526.6914 L
--7850.8975 8526.6914 L
--7850.8975 8526.2422 L
-f
--7849.1025 8512.1074 m
--7863.9087 8512.1074 L
--7863.9087 8512.5566 L
--7849.1025 8512.5566 L
--7849.1025 8512.1074 L
-f
--7863.4609 8517.7168 m
--7863.4609 8518.166 L
--7848.4297 8518.166 L
--7848.4297 8517.7168 L
--7863.4609 8517.7168 L
-f
--7863.6855 8515.9219 m
--7850.001 8515.9219 L
--7850.001 8515.4727 L
--7863.6855 8515.4727 L
--7863.6855 8515.9219 L
-f
--7863.4609 8521.3076 m
--7848.6538 8521.3076 L
--7848.6538 8520.8574 L
--7863.4609 8520.8574 L
--7863.4609 8521.3076 L
-f
--7861.2178 8503.583 m
--7845.7378 8503.583 L
--7845.7378 8503.1328 L
--7861.2178 8503.1328 L
--7861.2178 8503.583 L
-f
--7862.7881 8505.3779 m
--7850.4497 8505.3779 L
--7850.4497 8504.9277 L
--7862.7881 8504.9277 L
--7862.7881 8505.3779 L
-f
--7863.9087 8507.8457 m
--7848.2041 8507.8457 L
--7848.2041 8507.3945 L
--7863.9087 8507.3945 L
--7863.9087 8507.8457 L
-f
--7864.3584 8510.3135 m
--7848.6538 8510.3135 L
--7848.6538 8509.8633 L
--7864.3584 8509.8633 L
--7864.3584 8510.3135 L
-f
--7864.3584 8524 m
--7849.7754 8524 L
--7849.7754 8523.5488 L
--7864.3584 8523.5488 L
--7864.3584 8524 L
-f
-*U
-*u
-0 g
-1 D
--7868.5498 8524.6582 m
--7868.417 8524.4141 -7868.2832 8524.166 -7868.1494 8523.8984 c
--7866.519 8520.6387 -7866.9937 8517.8213 -7867.4946 8514.8389 c
--7867.8057 8512.9785 -7868.1294 8511.0557 -7867.9482 8508.9473 c
--7867.4766 8503.4404 -7861.5938 8500.7383 -7861.4424 8500.6914 C
--7838.2168 8500.6914 L
--7838.1201 8501.1191 L
--7838.1514 8501.1348 -7841.3599 8502.7051 -7844.4238 8507.7373 c
--7846.2144 8510.6797 -7845.7559 8514.1953 -7845.311 8517.5947 c
--7844.9966 8520.002 -7844.7007 8522.2754 -7845.2993 8524.0703 c
--7845.4858 8524.6289 -7845.707 8525.1465 -7845.9463 8525.6279 c
--7847.4521 8528.6533 -7849.7656 8530.1738 -7849.8774 8530.2461 C
--7849.9346 8530.2813 L
--7873.333 8530.2813 L
--7873.3887 8529.8389 L
--7873.3638 8529.832 -7871.0127 8529.166 -7868.5498 8524.6582 c
-f
-0 D
--7867.7471 8524.0996 m
--7869.5391 8527.6836 -7871.3154 8529.1973 -7872.3569 8529.832 C
--7870.5674 8529.832 -7850.2046 8529.832 -7850.0713 8529.832 C
--7849.792 8529.6445 -7846.9727 8527.6641 -7845.7256 8523.9277 c
--7845.4912 8523.2236 -7845.4038 8522.4287 -7845.4038 8521.5723 c
--7845.4038 8520.3633 -7845.5791 8519.0303 -7845.7578 8517.6523 c
--7845.9512 8516.1699 -7846.1567 8514.5996 -7846.1567 8513.041 c
--7846.1567 8511.1133 -7845.8433 8509.2051 -7844.8066 8507.5039 c
--7842.5088 8503.7266 -7840.1807 8501.8877 -7839.0386 8501.1406 C
--7840.5649 8501.1396 -7861.3506 8501.1221 Y
--7861.4072 8501.1475 -7867.0518 8503.7461 -7867.5 8508.9863 c
--7867.5352 8509.3926 -7867.5498 8509.792 -7867.5498 8510.1855 c
--7867.5498 8511.7852 -7867.2959 8513.2949 -7867.0498 8514.7646 c
--7866.8057 8516.2178 -7866.5679 8517.6328 -7866.5679 8519.0811 c
--7866.5679 8520.6797 -7866.8584 8522.3203 -7867.7471 8524.0996 c
-f
-*U
--7845.7378 8503.1328 m
--7861.2178 8503.1328 L
--7861.2178 8503.583 L
--7845.7378 8503.583 L
--7845.7378 8503.1328 L
-f
--7850.4497 8504.9277 m
--7862.7881 8504.9277 L
--7862.7881 8505.3779 L
--7850.4497 8505.3779 L
--7850.4497 8504.9277 L
-f
--7848.2041 8507.3945 m
--7863.9087 8507.3945 L
--7863.9087 8507.8457 L
--7848.2041 8507.8457 L
--7848.2041 8507.3945 L
-f
--7848.6538 8509.8633 m
--7864.3584 8509.8633 L
--7864.3584 8510.3135 L
--7848.6538 8510.3135 L
--7848.6538 8509.8633 L
-f
--7863.9087 8512.5566 m
--7849.1025 8512.5566 L
--7849.1025 8512.1074 L
--7863.9087 8512.1074 L
--7863.9087 8512.5566 L
-f
--7850.001 8515.4727 m
--7863.6855 8515.4727 L
--7863.6855 8515.9219 L
--7850.001 8515.9219 L
--7850.001 8515.4727 L
-f
--7863.4609 8518.166 m
--7848.4297 8518.166 L
--7848.4297 8517.7168 L
--7863.4609 8517.7168 L
--7863.4609 8518.166 L
-f
--7848.6538 8520.8574 m
--7863.4609 8520.8574 L
--7863.4609 8521.3076 L
--7848.6538 8521.3076 L
--7848.6538 8520.8574 L
-f
--7849.7754 8523.5488 m
--7864.3584 8523.5488 L
--7864.3584 8524 L
--7849.7754 8524 L
--7849.7754 8523.5488 L
-f
--7865.9287 8526.6914 m
--7850.8975 8526.6914 L
--7850.8975 8526.2422 L
--7865.9287 8526.2422 L
--7865.9287 8526.6914 L
-f
-U
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 9)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7883.25 8585.25 m
--7840.7246 8585.25 L
--7840.7246 8555.5381 L
--7883.25 8555.5381 L
--7883.25 8585.25 L
-n
-u
-u
-0 O
-0.7 g
--7872.457 8555.7881 m
--7868.6582 8555.7881 -7864.9199 8555.7881 v
--7861.1826 8555.7881 -7861.8242 8558.8838 y
--7845.9258 8558.8838 -7843.4502 8558.8838 v
--7840.9761 8558.8838 -7840.9761 8561.3594 y
--7840.9761 8578.542 l
--7876.541 8578.542 l
--7876.541 8558.9004 l
--7875.3906 8558.9004 l
--7875.439 8555.7881 -7872.457 8555.7881 v
-f
-0 R
-0.9 G
-0.5 w
--7861.8242 8558.8838 m
--7845.9258 8558.8838 -7843.4502 8558.8838 v
-S
-0.5 G
--7862.8594 8556.2715 m
--7861.4634 8557.1426 -7861.8242 8558.8838 y
-S
-0.7 G
--7864.9199 8555.7881 m
--7863.9858 8555.7881 -7863.3247 8555.9814 -7862.8594 8556.2715 c
-S
-0.9 G
--7876.541 8578.542 m
--7876.541 8558.9004 l
--7875.3906 8558.9004 l
--7875.439 8555.7881 -7872.457 8555.7881 v
--7868.6582 8555.7881 -7864.9199 8555.7881 v
-S
-0.25 G
--7840.9761 8561.3594 m
--7840.9761 8578.542 l
--7876.541 8578.542 l
-S
-0.5 G
--7842.019 8559.2715 m
--7840.9761 8559.9668 -7840.9761 8561.3594 y
-S
-0.7 G
--7843.4502 8558.8838 m
--7842.8306 8558.8838 -7842.3672 8559.0391 -7842.019 8559.2715 c
-S
-U
-u
-0 O
-0.7 g
-1 w
--7874.0718 8557.4023 m
--7870.2729 8557.4023 -7866.5342 8557.4023 v
--7862.7954 8557.4023 -7863.439 8560.498 y
--7847.541 8560.498 -7845.0649 8560.498 v
--7842.5903 8560.498 -7842.5903 8562.9727 y
--7842.5903 8580.1563 l
--7878.1558 8580.1563 l
--7878.1558 8560.5146 l
--7877.0054 8560.5146 l
--7877.0542 8557.4023 -7874.0718 8557.4023 v
-f
-0 R
-0.9 G
-0.5 w
--7863.439 8560.498 m
--7847.541 8560.498 -7845.0649 8560.498 v
-S
-0.5 G
--7864.4746 8557.8867 m
--7863.0767 8558.7578 -7863.439 8560.498 y
-S
-0.7 G
--7866.5342 8557.4023 m
--7865.6006 8557.4023 -7864.9409 8557.5957 -7864.4746 8557.8867 c
-S
-0.9 G
--7878.1558 8580.1563 m
--7878.1558 8560.5146 l
--7877.0054 8560.5146 l
--7877.0542 8557.4023 -7874.0718 8557.4023 v
--7870.2729 8557.4023 -7866.5342 8557.4023 v
-S
-0.25 G
--7842.5903 8562.9727 m
--7842.5903 8580.1563 l
--7878.1558 8580.1563 l
-S
-0.5 G
--7843.6338 8560.8848 m
--7842.5903 8561.5811 -7842.5903 8562.9727 y
-S
-0.7 G
--7845.0649 8560.498 m
--7844.4458 8560.498 -7843.981 8560.6533 -7843.6338 8560.8848 c
-S
-U
-u
-0 O
-0.7 g
-1 w
--7875.6846 8559.0176 m
--7871.8882 8559.0176 -7868.1489 8559.0176 v
--7864.4111 8559.0176 -7865.0527 8562.1123 y
--7849.1538 8562.1123 -7846.6802 8562.1123 v
--7844.2046 8562.1123 -7844.2046 8564.5879 y
--7844.2046 8581.7715 l
--7879.771 8581.7715 l
--7879.771 8562.1289 l
--7878.6191 8562.1289 l
--7878.6689 8559.0176 -7875.6846 8559.0176 v
-f
-0 R
-0.9 G
-0.5 w
--7865.0527 8562.1123 m
--7849.1538 8562.1123 -7846.6802 8562.1123 v
-S
-0.5 G
--7866.0898 8559.5 m
--7864.6929 8560.3711 -7865.0527 8562.1123 y
-S
-0.7 G
--7868.1489 8559.0176 m
--7867.2144 8559.0176 -7866.5542 8559.21 -7866.0898 8559.5 c
-S
-0.9 G
--7879.771 8581.7715 m
--7879.771 8562.1289 l
--7878.6191 8562.1289 l
--7878.6689 8559.0176 -7875.6846 8559.0176 v
--7871.8882 8559.0176 -7868.1489 8559.0176 v
-S
-0.25 G
--7844.2046 8564.5879 m
--7844.2046 8581.7715 l
--7879.771 8581.7715 l
-S
-0.5 G
--7845.249 8562.5 m
--7844.2046 8563.1953 -7844.2046 8564.5879 y
-S
-0.7 G
--7846.6802 8562.1123 m
--7846.061 8562.1123 -7845.5962 8562.2676 -7845.249 8562.5 c
-S
-U
-u
-0 O
-0.7 g
-1 w
--7877.2993 8560.6318 m
--7873.5034 8560.6318 -7869.7642 8560.6318 v
--7866.0254 8560.6318 -7866.667 8563.7275 y
--7850.769 8563.7275 -7848.2935 8563.7275 v
--7845.8193 8563.7275 -7845.8193 8566.2031 y
--7845.8193 8583.3867 l
--7881.3857 8583.3867 l
--7881.3857 8563.7441 l
--7880.2334 8563.7441 l
--7880.2842 8560.6318 -7877.2993 8560.6318 v
-f
-0 R
-0.9 G
-0.5 w
--7866.667 8563.7275 m
--7850.769 8563.7275 -7848.2935 8563.7275 v
-S
-0.5 G
--7867.7046 8561.1152 m
--7866.3071 8561.9863 -7866.667 8563.7275 y
-S
-0.7 G
--7869.7642 8560.6318 m
--7868.8286 8560.6318 -7868.1689 8560.8252 -7867.7046 8561.1152 c
-S
-0.9 G
--7881.3857 8583.3867 m
--7881.3857 8563.7441 l
--7880.2334 8563.7441 l
--7880.2842 8560.6318 -7877.2993 8560.6318 v
--7873.5034 8560.6318 -7869.7642 8560.6318 v
-S
-0.25 G
--7845.8193 8566.2031 m
--7845.8193 8583.3867 l
--7881.3857 8583.3867 l
-S
-0.5 G
--7846.8638 8564.1143 m
--7845.8193 8564.8105 -7845.8193 8566.2031 y
-S
-0.7 G
--7848.2935 8563.7275 m
--7847.6753 8563.7275 -7847.2114 8563.8828 -7846.8638 8564.1143 c
-S
-U
-u
-0 O
-0.8 g
-1 w
--7878.9146 8562.2461 m
--7875.1167 8562.2461 -7871.3794 8562.2461 v
--7867.6401 8562.2461 -7868.2817 8565.3418 y
--7852.3838 8565.3418 -7849.9087 8565.3418 v
--7847.4346 8565.3418 -7847.4346 8567.8174 y
--7847.4346 8585 l
--7883.001 8585 l
--7883.001 8565.3574 l
--7881.8481 8565.3574 l
--7881.8994 8562.2461 -7878.9146 8562.2461 v
-f
-0 R
-0.9 G
-0.5 w
--7868.2817 8565.3418 m
--7852.3838 8565.3418 -7849.9087 8565.3418 v
-S
-0.5 G
--7869.3184 8562.7295 m
--7867.9214 8563.6006 -7868.2817 8565.3418 y
-S
-0.7 G
--7871.3794 8562.2461 m
--7870.4438 8562.2461 -7869.7842 8562.4395 -7869.3184 8562.7295 c
-S
-0.9 G
--7883.001 8585 m
--7883.001 8565.3574 l
--7881.8481 8565.3574 l
--7881.8994 8562.2461 -7878.9146 8562.2461 v
--7875.1167 8562.2461 -7871.3794 8562.2461 v
-S
-0.25 G
--7847.4346 8567.8174 m
--7847.4346 8585 l
--7883.001 8585 l
-S
-0.5 G
--7848.4785 8565.7285 m
--7847.4346 8566.4238 -7847.4346 8567.8174 y
-S
-0.7 G
--7849.9087 8565.3418 m
--7849.29 8565.3418 -7848.8262 8565.4971 -7848.4785 8565.7285 c
-S
-U
-U
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 10)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7883.25 8585.25 m
--7815.2593 8585.25 L
--7815.2593 8557.0195 L
--7883.25 8557.0195 L
--7883.25 8585.25 L
-n
-0 O
-0.8 g
--7835.5234 8580.209 m
--7815.4785 8573.3516 l
--7817.0591 8570.4502 l
--7829.7202 8574.4063 l
--7835.7866 8570.4502 l
--7835.5234 8580.209 l
-f
-0 R
-0.9 G
-0.5 w
--7816.7871 8570.3242 m
--7829.7202 8574.4063 l
-S
-0.5 G
--7815.4785 8573.3516 m
--7817.0591 8570.4502 l
-S
-0.25 G
--7835.5234 8580.209 m
--7815.4785 8573.3516 l
-S
-0.5 G
--7829.7202 8574.4063 m
--7835.7866 8570.4502 l
-S
-0 O
-0.8 g
-1 w
--7855.5679 8562.7998 m
--7843.437 8557.5254 l
--7840.0073 8561.7441 l
--7855.5679 8562.7998 l
-f
-1 Ap
-0.57 g
--7835.2598 8582.0547 m
--7881.6802 8582.0547 L
--7881.6802 8584.9551 L
--7835.2598 8584.9551 L
--7835.2598 8582.0547 L
-f
-0 Ap
-0 R
-0.5 G
-0.5 w
--7843.437 8557.5254 m
--7840.0073 8561.7441 l
-S
-0.9 G
--7855.5679 8562.7998 m
--7842.875 8557.248 l
-S
-0 O
-0.8 g
-1 w
--7883.001 8560.7627 m
--7883.001 8582.0859 l
--7834.2046 8582.0859 l
--7834.2046 8564.9121 l
--7837.6338 8560.8223 l
--7883.001 8560.7627 l
-f
-0 R
-0.5 G
-0.5 w
--7883.001 8576.5166 m
--7834.2046 8576.5166 l
-S
--7880.0986 8564.1191 m
--7870.6025 8564.1191 l
-S
--7880.0986 8565.7676 m
--7870.6025 8565.7676 l
-S
--7880.0986 8567.415 m
--7870.6025 8567.415 l
-S
--7880.0986 8569.0635 m
--7870.6025 8569.0635 l
-S
--7880.0986 8570.7109 m
--7870.6025 8570.7109 l
-S
--7834.2046 8564.9121 m
--7837.6338 8560.8223 l
-S
-0.25 G
--7883.001 8582.0859 m
--7834.2046 8582.0859 l
--7834.2046 8564.9121 l
-S
-0.9 G
--7837.6338 8560.793 m
--7883.001 8560.793 l
--7883.001 8582.3555 l
-S
-0.25 G
--7835.2598 8582.0859 m
--7835.2598 8585 l
--7881.6714 8585 l
-S
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 19)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7883.25 8585.25 m
--7836.6338 8585.25 L
--7836.6338 8549.6348 L
--7883.25 8549.6348 L
--7883.25 8585.25 L
-n
-u
-u
-0 O
-0.7495 g
-0 R
-0.25 G
-1 j 0.5 w 2 M
--7836.9722 8585 m
--7836.9722 8582.9805 l
--7843.333 8579.5479 l
--7859.8857 8579.5479 L
--7876.439 8579.5479 l
--7883.001 8582.9805 l
--7883.001 8585 l
--7836.9722 8585 l
-b
-0.8748 G
-2 J 0 j
--7859.8857 8579.5479 m
--7876.439 8579.5479 l
--7883.001 8582.9805 l
--7883.001 8585 l
-S
--7836.9722 8582.9805 m
--7843.333 8579.5479 l
--7859.8857 8579.5479 L
-S
-0 O
-0.9 g
-0.25 G
-0 J 1 j
--7876.3394 8580.7598 m
--7880.377 8582.9805 l
--7839.7993 8582.9805 l
--7843.2319 8580.7598 l
--7876.3394 8580.7598 l
-b
-U
-u
-u
-0.7 g
-0 j 1 w 4 M
--7871.125 8576.6523 m
--7868.8462 8576.6094 L
--7859.7446 8575.041 L
--7850.4634 8576.6094 L
--7848.6694 8576.6094 L
--7848.729 8578.4512 L
--7871.125 8578.4512 L
--7871.125 8576.6523 L
-f
-0 R
-0.25 G
-0.5 w
--7848.6978 8576.6523 m
--7848.7905 8578.4512 L
--7871.1567 8578.4512 L
-S
-0.9 G
--7850.498 8576.6523 m
--7848.6978 8576.6523 L
-S
-0.25 G
--7859.8042 8575.041 m
--7850.498 8576.6523 L
-S
-0.9 G
--7871.1567 8578.4512 m
--7871.1567 8576.6523 L
--7868.9033 8576.6523 L
--7859.8042 8575.041 L
-S
-U
-u
-0 O
-0.7 g
-1 w
--7873.3672 8573.5781 m
--7864.0703 8573.5313 L
--7859.7119 8571.8047 L
--7855.1343 8573.5313 L
--7846.4214 8573.5313 L
--7846.4927 8575.5557 L
--7873.3672 8575.5557 L
--7873.3672 8573.5781 L
-f
-0 R
-0.25 G
-0.5 w
--7846.4546 8573.5781 m
--7846.5649 8575.5557 L
--7873.4038 8575.5557 L
-S
-0.9 G
--7855.1758 8573.5781 m
--7846.4546 8573.5781 L
-S
-0.25 G
--7859.7817 8571.8047 m
--7855.1758 8573.5781 L
-S
-0.9 G
--7873.4038 8575.5557 m
--7873.4038 8573.5781 L
--7864.1406 8573.5781 L
--7859.7817 8571.8047 L
-S
-U
-u
-0 O
-0.7495 g
-0.25 G
-2 J 2 M
--7874.8838 8572.75 m
--7874.8911 8550.8809 l
--7873.9082 8549.8848 L
--7845.9302 8549.9121 L
--7844.9922 8551.0508 L
--7844.9922 8572.4648 L
--7845.8022 8573.6045 L
--7874.0366 8573.6045 l
--7874.8838 8572.75 L
-b
-/BBAccumRotation (4.712389) XT
-0.8748 G
--7874.0366 8573.6045 m
--7874.8838 8572.75 L
--7874.8911 8550.8809 l
--7873.9082 8549.8848 L
--7845.9302 8549.9121 L
-S
-/BBAccumRotation (4.712389) XT
-0 O
-0.9 g
-0.25 G
--7848.0239 8570.7168 m
--7848.0054 8552.7617 L
--7871.8994 8552.7617 L
--7871.9014 8570.7148 L
--7848.0239 8570.7168 L
-b
-/BBAccumRotation (4.712389) XT
-U
-U
-u
-0.15 G
-0 J 4 M
--7843.333 8579.5479 m
--7859.8857 8579.5479 L
--7876.439 8579.5479 L
--7883.001 8582.9805 L
--7883.001 8585 L
--7836.9722 8585 L
--7836.9722 8582.9805 L
--7843.333 8579.5479 L
-s
--7874.0366 8573.6045 m
--7873.4038 8573.6045 L
--7873.4038 8575.5557 L
--7873.3672 8575.5449 L
--7873.3672 8575.5527 L
--7873.4038 8575.5557 L
--7873.3672 8575.5557 L
--7862.731 8575.5557 L
--7868.8462 8576.6094 L
--7871.125 8576.6523 L
--7871.1567 8576.6523 L
--7871.1567 8578.4512 L
--7871.125 8578.4414 L
--7871.125 8578.4482 L
--7871.1567 8578.4512 L
--7871.125 8578.4512 L
--7848.7905 8578.4512 L
--7848.729 8578.4512 L
--7848.6694 8576.6094 L
--7850.4634 8576.6094 L
--7856.7002 8575.5557 L
--7846.5649 8575.5557 L
--7846.4927 8575.5557 L
--7846.4233 8573.6045 L
--7845.8022 8573.6045 L
--7844.9922 8572.4648 L
--7844.9922 8551.0508 L
--7845.9302 8549.9121 L
--7873.9082 8549.8848 L
--7874.8911 8550.8809 L
--7874.8838 8572.75 L
--7874.0366 8573.6045 L
-s
-U
-U
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 21)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7883.3184 8585.3184 m
--7804.0449 8585.3184 L
--7804.0449 8559.5566 L
--7883.3184 8559.5566 L
--7883.3184 8585.3184 L
-n
-u
-0 O
-0.8158 g
-0 R
-0 G
-0.5 w 3.8636 M
--7882.8638 8562.8213 m
--7804.4961 8562.8213 L
--7804.4961 8576.9053 L
--7882.8638 8576.9053 L
--7882.8638 8562.8213 L
-b
--7843.6792 8569.8633 m
-B
-U
-u
--7880.4233 8576.9053 m
--7806.939 8576.9053 L
--7805.4766 8576.9053 -7804.2954 8578.0908 -7804.2954 8579.5498 c
--7804.2954 8580.9951 L
--7804.2954 8582.4561 -7805.4766 8583.6416 -7806.939 8583.6416 c
--7880.4233 8583.6416 L
--7881.8838 8583.6416 -7883.0688 8582.4561 -7883.0688 8580.9951 c
--7883.0688 8579.5498 L
--7883.0688 8578.0908 -7881.8838 8576.9053 -7880.4233 8576.9053 c
--7880.4233 8576.9053 L
-b
--7843.6802 8580.2744 m
-B
-U
-0 g
--7878.374 8583.6396 m
--7873.8838 8583.6396 L
--7874.7007 8585.0684 L
--7877.251 8585.0684 L
--7878.374 8583.6396 L
-b
--7814.293 8583.6396 m
--7809.8022 8583.6396 L
--7810.6191 8585.0684 L
--7813.1714 8585.0684 L
--7814.293 8583.6396 L
-b
-0.61 G
-1 w
--7875.9258 8562.8574 m
--7875.9258 8574.4893 L
-S
--7873.8838 8562.8574 m
--7873.8838 8574.4893 L
-S
-u
-0 O
-0 g
-0 G
-0.5 w
--7826.7417 8566.7002 m
--7813.0679 8566.7002 L
--7813.0679 8568.9463 L
--7826.7417 8568.9463 L
--7826.7417 8566.7002 L
-b
--7819.9038 8567.8223 m
-B
-U
-1 J
--7814.3066 8577.9297 m
--7813.8906 8578.3682 -7813.6362 8578.9561 -7813.6362 8579.6064 C
--7813.6362 8580.9355 L
--7813.6362 8581.5859 -7813.8906 8582.1758 -7814.3066 8582.6123 C
-S
--7816.1978 8577.9297 m
--7815.7842 8578.3682 -7815.5288 8578.9561 -7815.5288 8579.6064 C
--7815.5288 8580.9355 L
--7815.5288 8581.5859 -7815.7842 8582.1758 -7816.1978 8582.6123 C
-S
--7818.0913 8577.9297 m
--7817.6758 8578.3682 -7817.4214 8578.9561 -7817.4214 8579.6064 C
--7817.4214 8580.9355 L
--7817.4214 8581.5859 -7817.6758 8582.1758 -7818.0913 8582.6123 C
-S
--7819.9839 8577.9297 m
--7819.5698 8578.3682 -7819.314 8578.9561 -7819.314 8579.6064 C
--7819.314 8580.9355 L
--7819.314 8581.5859 -7819.5698 8582.1758 -7819.9839 8582.6123 C
-S
--7821.8774 8577.9297 m
--7821.4614 8578.3682 -7821.207 8578.9561 -7821.207 8579.6064 C
--7821.207 8580.9355 L
--7821.207 8581.5859 -7821.4614 8582.1758 -7821.8774 8582.6123 C
-S
--7823.769 8577.9297 m
--7823.354 8578.3682 -7823.1001 8578.9561 -7823.1001 8579.6064 C
--7823.1001 8580.9355 L
--7823.1001 8581.5859 -7823.354 8582.1758 -7823.769 8582.6123 C
-S
--7825.6616 8577.9297 m
--7825.248 8578.3682 -7824.9922 8578.9561 -7824.9922 8579.6064 C
--7824.9922 8580.9355 L
--7824.9922 8581.5859 -7825.248 8582.1758 -7825.6616 8582.6123 C
-S
--7827.5542 8577.9297 m
--7827.1401 8578.3682 -7826.8857 8578.9561 -7826.8857 8579.6064 C
--7826.8857 8580.9355 L
--7826.8857 8581.5859 -7827.1401 8582.1758 -7827.5542 8582.6123 C
-S
--7829.4463 8577.9297 m
--7829.0322 8578.3682 -7828.7769 8578.9561 -7828.7769 8579.6064 C
--7828.7769 8580.9355 L
--7828.7769 8581.5859 -7829.0322 8582.1758 -7829.4463 8582.6123 C
-S
--7831.3374 8577.9297 m
--7830.9258 8578.3682 -7830.6694 8578.9561 -7830.6694 8579.6064 C
--7830.6694 8580.9355 L
--7830.6694 8581.5859 -7830.9258 8582.1758 -7831.3374 8582.6123 C
-S
--7833.231 8577.9297 m
--7832.8159 8578.3682 -7832.563 8578.9561 -7832.563 8579.6064 C
--7832.563 8580.9355 L
--7832.563 8581.5859 -7832.8159 8582.1758 -7833.231 8582.6123 C
-S
--7835.125 8577.9297 m
--7834.7095 8578.3682 -7834.4546 8578.9561 -7834.4546 8579.6064 C
--7834.4546 8580.9355 L
--7834.4546 8581.5859 -7834.7095 8582.1758 -7835.125 8582.6123 C
-S
--7837.0151 8577.9297 m
--7836.6006 8578.3682 -7836.3472 8578.9561 -7836.3472 8579.6064 C
--7836.3472 8580.9355 L
--7836.3472 8581.5859 -7836.6006 8582.1758 -7837.0151 8582.6123 C
-S
--7838.9102 8577.9297 m
--7838.4937 8578.3682 -7838.2407 8578.9561 -7838.2407 8579.6064 C
--7838.2407 8580.9355 L
--7838.2407 8581.5859 -7838.4937 8582.1758 -7838.9102 8582.6123 C
-S
--7840.8022 8577.9297 m
--7840.3872 8578.3682 -7840.1318 8578.9561 -7840.1318 8579.6064 C
--7840.1318 8580.9355 L
--7840.1318 8581.5859 -7840.3872 8582.1758 -7840.8022 8582.6123 C
-S
-0 O
-0.4385 g
-0 J 1 j
--7873.8838 8559.8066 m
--7813.8838 8559.8066 L
--7804.4961 8562.8213 L
--7882.8638 8562.8213 L
--7873.8838 8559.8066 L
-b
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 22)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7876.001 8578.6211 m
--7827.9502 8578.6211 L
--7827.9502 8497.4414 L
--7876.001 8497.4414 L
--7876.001 8578.6211 L
-n
-u
-u
-u
-0 O
-0.7 g
--7869.2202 8497.6914 m
--7835.2578 8497.6914 L
--7834.7935 8497.7441 L
--7834.3569 8497.9102 L
--7834.0791 8498.2148 L
--7834.0034 8498.543 L
--7834.0034 8562.8496 L
--7834.0791 8563.1855 L
--7834.3569 8563.4355 L
--7834.7935 8563.6504 L
--7835.2578 8563.707 L
--7869.2202 8563.707 L
--7869.6855 8563.6504 L
--7870.0361 8563.4355 L
--7870.3618 8563.1855 L
--7870.4399 8562.8496 L
--7870.4399 8498.543 L
--7870.3618 8498.2148 L
--7870.0361 8497.9102 L
--7869.6855 8497.7441 L
--7869.2202 8497.6914 L
-f
-0 R
-0.25 G
-0.5 w
--7834.0034 8498.543 m
--7834.0034 8562.8496 L
--7834.0791 8563.1855 L
--7834.3569 8563.4355 L
--7834.7935 8563.6504 L
--7835.2578 8563.707 L
--7869.2202 8563.707 L
--7869.6855 8563.6504 L
--7870.0361 8563.4355 L
--7870.3618 8563.1855 L
--7870.4399 8562.8496 L
-S
-0.9 G
--7870.4399 8562.8496 m
--7870.4399 8498.543 L
--7870.3618 8498.2148 L
--7870.0361 8497.9102 L
--7869.6855 8497.7441 L
--7869.2202 8497.6914 L
--7835.2578 8497.6914 L
--7834.7935 8497.7441 L
--7834.3569 8497.9102 L
--7834.0791 8498.2148 L
--7834.0034 8498.543 L
-S
-1 Ap
-0 O
-0.8 g
-0.25 G
-2 J 2 M
--7838.79 8507.9629 m
--7865.4775 8507.9629 L
--7865.4775 8560.2607 L
--7838.79 8560.2607 L
--7838.79 8507.9629 L
-b
-u
--7838.79 8523.8691 m
--7865.4736 8523.8691 L
--7865.4736 8520.0957 L
--7838.79 8520.0957 L
--7838.79 8523.8691 L
-b
--7838.79 8520.0615 m
--7865.4736 8520.0615 L
--7865.4736 8516.2871 L
--7838.79 8516.2871 L
--7838.79 8520.0615 L
-b
-U
-0 Ap
-0.25 g
-0 J 1 w 4 M
--7842.3818 8509.4375 m
--7843.2319 8509.4375 L
--7862.2729 8509.4375 L
--7862.2729 8510.3271 L
--7855.8018 8510.3271 L
--7855.8018 8510.9629 L
--7848.8486 8510.9629 L
--7848.8486 8510.3271 L
--7842.3818 8510.3271 L
--7842.3818 8509.4375 L
-f
-1 Ap
-0.6 g
-0 R
-0.25 G
-2 J 0.5 w 2 M
--7842.8271 8511.3691 m
--7846.8706 8511.3691 L
--7846.8706 8510.7324 L
--7842.8271 8510.7324 L
--7842.8271 8511.3691 L
-b
-u
-0.8 g
--7840.8057 8514.5547 m
--7863.4463 8514.5547 L
--7863.4463 8513.0664 L
--7840.8057 8513.0664 L
--7840.8057 8514.5547 L
-b
--7863.4463 8514.5547 m
--7863.4463 8513.0664 L
--7840.8057 8513.0664 L
-S
-0.9 G
--7840.8057 8513.0664 m
--7840.8057 8514.5547 L
--7863.4463 8514.5547 L
-S
-U
-0 O
-0.7 g
-0 J 1 w 4 M
--7841.1318 8515.6172 m
--7845.1743 8515.6172 L
--7845.1743 8514.9805 L
--7841.1318 8514.9805 L
--7841.1318 8515.6172 L
-f
-0 R
-0.25 G
-2 J 0.5 w 2 M
--7841.1318 8514.9805 m
--7841.1318 8515.6172 L
--7845.1743 8515.6172 L
-S
-u
-u
--7861.5903 8500.6797 m
--7861.5903 8503.7402 L
--7866.9287 8503.7402 L
-S
--7861.5903 8503.7393 m
--7861.5903 8506.7578 L
--7866.9287 8506.7578 L
-S
-U
-u
-0.9 G
--7866.9287 8503.7129 m
--7866.9287 8500.6934 L
--7861.5903 8500.6934 L
-S
--7866.9287 8506.7578 m
--7866.9287 8503.7393 L
--7861.5903 8503.7393 L
-S
-U
-U
-u
-u
-0.25 G
--7837.7178 8500.6797 m
--7837.7178 8503.7402 L
--7843.0542 8503.7402 L
-S
--7837.7178 8503.7393 m
--7837.7178 8506.7578 L
--7843.0542 8506.7578 L
-S
-U
-u
-0.9 G
--7843.0542 8503.7129 m
--7843.0542 8500.6934 L
--7837.7178 8500.6934 L
-S
--7843.0542 8506.7578 m
--7843.0542 8503.7393 L
--7837.7178 8503.7393 L
-S
-U
-U
-0 O
-0.8 g
-0 J 1 w 4 M
--7832.144 8564.9395 m
--7872.3799 8564.9395 L
--7870.6865 8562.6406 L
--7833.8359 8562.6406 L
--7832.144 8564.9395 L
-f
-0 R
-0.9 G
-0.5 w
--7870.4072 8562.4785 m
--7872.3799 8564.9395 L
--7869.9111 8564.9395 l
-S
-0.25 G
--7834.083 8562.3672 m
--7832.144 8564.9395 L
--7872.0337 8564.9395 l
-S
-U
-0 Ap
-0.15 G
--7833.8359 8562.6406 m
--7833.874 8562.6406 L
--7834.0034 8562.4727 L
--7834.0034 8498.543 L
--7834.0791 8498.2148 L
--7834.3569 8497.9102 L
--7834.7935 8497.7441 L
--7835.2578 8497.6914 L
--7869.2202 8497.6914 L
--7869.6855 8497.7441 L
--7870.0361 8497.9102 L
--7870.3618 8498.2148 L
--7870.4399 8498.543 L
--7870.4399 8562.5195 L
--7870.5386 8562.6406 L
--7870.6865 8562.6406 L
--7872.3799 8564.9395 L
--7872.0337 8564.9395 L
--7869.9111 8564.9395 L
--7832.144 8564.9395 L
--7833.8359 8562.6406 L
-s
--7870.4399 8562.5195 m
--7833.8359 8562.5195 l
-S
-U
-U
-0 To
-1 0 0 -1 -7851.9761 8576.5957 0 Tp
-0 Tv
-TP
--24.0247 0 Td
-0 Tr
-0 O
-0 g
-1 w
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
-0 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-36 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 0 0 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
-0 Tc
-0 Tw
-(DNS Ser) Tx 1 -30 Tk
-(v) Tx 1 25 Tk
-(er) Tx 1 0 Tk
-(\r) TX
-TO
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 23)
-0 A
-u
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7878.9351 8565.3359 m
--7830.6465 8565.3359 L
--7830.6465 8506.8223 L
--7878.9351 8506.8223 L
--7878.9351 8565.3359 L
-n
-0 O
-0.64 g
--7830.6465 8513.9863 m
--7832.5977 8506.8223 L
--7849.127 8506.8223 L
--7851.001 8513.9863 L
--7858.666 8513.9863 L
--7860.7529 8506.8223 L
--7877.0625 8506.8223 L
--7878.9351 8513.9863 L
--7878.9351 8514.0137 L
--7830.6465 8514.0137 L
--7830.6465 8513.9863 L
-f
-0.92 g
--7878.9351 8514.0137 m
--7878.9351 8565.3164 L
--7870.5898 8565.3164 L
--7870.5898 8561.6152 L
--7870.5386 8561.6152 L
--7870.5386 8514.0137 L
--7878.9351 8514.0137 L
-f
--7830.6465 8514.0137 m
--7838.7871 8514.0137 L
--7838.7871 8565.3359 L
--7830.6465 8565.3359 L
--7830.6465 8514.0137 L
-f
-0.8158 g
--7870.5386 8514.0137 m
--7870.5386 8561.6152 L
--7838.8442 8561.6152 L
--7838.8442 8565.3359 L
--7838.7871 8565.3359 L
--7838.7871 8514.0137 L
--7870.5386 8514.0137 L
-f
-0 R
-0.67 G
-0.5 w 3.8635 M
--7858.666 8513.9863 m
--7858.6582 8561.6152 L
-S
--7857.8145 8513.9863 m
--7857.8066 8561.6152 L
-S
--7856.9634 8513.9863 m
--7856.9551 8561.6152 L
-S
--7856.1113 8513.9863 m
--7856.103 8561.6152 L
-S
--7855.2598 8513.9863 m
--7855.252 8561.6152 L
-S
--7854.4082 8513.9863 m
--7854.3999 8561.6152 L
-S
--7853.5566 8513.9863 m
--7853.5488 8561.6152 L
-S
--7853.5718 8513.9863 m
--7853.563 8561.6152 L
-S
--7852.7202 8513.9863 m
--7852.7114 8561.6152 L
-S
--7851.8682 8513.9863 m
--7851.8594 8561.6152 L
-S
--7851.0161 8513.9863 m
--7851.0078 8561.6152 L
-S
-U
-0 To
-1 0 0 -1 -7854.791 8576.5957 0 Tp
-0 Tv
-TP
--21.2094 0 Td
-0 Tr
-0 O
-0 g
-1 w 4 M
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
-0 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-53.0468 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 0 0 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 4 Tl
-0 Tc
-0 Tw
-(Mainfr) Tx 1 10 Tk
-(ame) Tx 1 0 Tk
-(\r) TX
-TO
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 40)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7884 8586 m
--7835.7114 8586 L
--7835.7114 8500.1016 L
--7884 8500.1016 L
--7884 8586 L
-n
-0 O
-0.64 g
--7835.7114 8507.2656 m
--7837.6626 8500.1016 L
--7854.1919 8500.1016 L
--7856.0654 8507.2656 L
--7863.7305 8507.2656 L
--7865.8174 8500.1016 L
--7882.127 8500.1016 L
--7884 8507.2656 L
--7884 8507.293 L
--7835.7114 8507.293 L
--7835.7114 8507.2656 L
-f
-0.92 g
--7884 8507.293 m
--7884 8585.9805 L
--7875.6543 8585.9805 L
--7875.6543 8582.2793 L
--7875.6025 8582.2793 L
--7875.6025 8507.293 L
--7884 8507.293 L
-f
--7835.7114 8507.293 m
--7843.8511 8507.293 L
--7843.8511 8586 L
--7835.7114 8586 L
--7835.7114 8507.293 L
-f
-0.8158 g
--7875.6025 8507.293 m
--7875.6025 8582.2793 L
--7843.9087 8582.2793 L
--7843.9087 8586 L
--7843.8511 8586 L
--7843.8511 8507.293 L
--7875.6025 8507.293 L
-f
-0 R
-0.67 G
-0.5 w 3.8635 M
--7863.7305 8507.2656 m
--7863.7222 8582.2793 L
-S
--7862.8794 8507.2656 m
--7862.8711 8582.2793 L
-S
--7862.0273 8507.2656 m
--7862.019 8582.2793 L
-S
--7861.1758 8507.2656 m
--7861.168 8582.2793 L
-S
--7860.3242 8507.2656 m
--7860.3169 8582.2793 L
-S
--7859.4727 8507.2656 m
--7859.4648 8582.2793 L
-S
--7858.6206 8507.2656 m
--7858.6138 8582.2793 L
-S
--7858.6362 8507.2656 m
--7858.6279 8582.2793 L
-S
--7857.7842 8507.2656 m
--7857.7754 8582.2793 L
-S
--7856.9326 8507.2656 m
--7856.9238 8582.2793 L
-S
--7856.0801 8507.2656 m
--7856.0718 8582.2793 L
-S
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 43)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7883.749 8585.8232 m
--7870.9414 8585.8232 L
--7870.9414 8557.1563 L
--7883.749 8557.1563 L
--7883.749 8585.8232 L
-n
-0 O
-0.3 g
--7870.9414 8574.5498 m
--7875.1558 8563.2031 L
--7875.3862 8562.5801 -7876.0439 8562.2598 -7876.6719 8562.4141 C
--7876.8018 8562.3506 -7876.9473 8562.3359 -7877.0889 8562.3164 C
--7875.771 8562.1797 -7874.7358 8561.1084 -7874.7358 8559.7627 c
--7874.7358 8558.3184 -7875.9009 8557.1563 -7877.3447 8557.1563 c
--7878.7842 8557.1563 -7879.9482 8558.3184 -7879.9482 8559.7627 c
--7879.9482 8561.1084 -7878.916 8562.1797 -7877.6016 8562.3164 C
--7877.7441 8562.3359 -7877.8809 8562.3506 -7878.0186 8562.4141 C
--7878.645 8562.2598 -7879.3018 8562.5801 -7879.5313 8563.2031 C
--7883.749 8574.5498 L
--7884 8575.2168 -7883.6543 8575.9688 -7882.9834 8576.2188 c
--7882.313 8576.4658 -7881.5664 8576.123 -7881.3193 8575.4531 C
--7880.1289 8572.2441 L
--7880.0054 8572.6758 -7879.876 8573.0762 -7879.7119 8573.4385 C
--7882.4902 8584.2402 L
--7882.668 8584.9375 -7882.252 8585.6416 -7881.5586 8585.8232 c
--7880.8657 8586 -7880.1626 8585.583 -7879.9766 8584.8867 C
--7877.5918 8575.5967 L
--7877.5049 8575.6084 -7877.4282 8575.6494 -7877.3447 8575.6494 c
--7877.2617 8575.6494 -7877.1855 8575.6084 -7877.0991 8575.5967 C
--7874.7129 8584.8867 L
--7874.5303 8585.583 -7873.8242 8586 -7873.1318 8585.8232 c
--7872.4385 8585.6416 -7872.0215 8584.9375 -7872.1978 8584.2402 C
--7874.9766 8573.4385 L
--7874.8154 8573.0762 -7874.6846 8572.6758 -7874.5625 8572.2441 C
--7873.3711 8575.4531 L
--7873.125 8576.123 -7872.3799 8576.4658 -7871.707 8576.2188 c
--7871.0391 8575.9688 -7870.6914 8575.2168 -7870.9414 8574.5498 C
-f
-U
-%AI8_EndBrushPattern
-%AI5_End_NonPrinting--
-%AI5_BeginPalette
-0 0 Pb
-1 1 1 1 ([Registration]) 0 Xs
-([Registration]) Pc
-0 0 0 0.15 (15%) 0 0 Xk
-(15%) Pc
-0 0 0 0.3 (30%) 0 0 Xk
-(30%) Pc
-0 0 0 0.5 (50%) 0 0 Xk
-(50%) Pc
-0 0 0 0.75 (75%) 0 0 Xk
-(75%) Pc
-(horizontal rules) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(horizontal rules) Pc
-(bi-direction diagonals) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(bi-direction diagonals) Pc
-(one direction diagonals) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(one direction diagonals) Pc
-(white dots) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(white dots) Pc
-(black dots) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(black dots) Pc
-PB
-%AI5_EndPalette
-%AI5_Begin_NonPrinting
-Np
-%AI8_BeginPluginObject
-(Adobe Brush Manager Order)
-(Adobe Brush Manager Order)
-( Adobe Scatter Brush Tool/ Scatter Brush 1/ Adobe Scatter Brush Tool/ ) -
-(Mainframe/ Adobe Scatter Brush Tool/ Client/ Adobe Scatter Brush Tool/) -
-( person/ Adobe Scatter Brush Tool/ Print spooler/ Adobe Scatter Brush ) -
-(Tool/ Folders/ Adobe Scatter Brush Tool/ Printer/ Adobe Scatter Brush ) -
-(Tool/ Client 1/ Adobe Scatter Brush Tool/ Mainframe 1/ Adobe Scatter B) -
-(rush Tool/ Fax server/) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Client)
-(1 /New Pattern 19/ 0 0.0784314 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Client 1)
-(1 /New Pattern 19/ 0 0.0784314 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Fax server)
-(1 /New Pattern 21/ 0 0.184314 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Folders)
-(1 /New Pattern 9/ 0 0.160784 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Mainframe)
-(1 /New Pattern 23/ 0 0.184314 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Mainframe 1)
-(1 /New Pattern 40/ 0 0.184314 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(person)
-(1 /New Pattern 43/ 0 0.701961 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Print spooler)
-(1 /New Pattern 2/ 0 0.854902 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Printer)
-(1 /New Pattern 10/ 0 0.160784 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Scatter Brush 1)
-(1 /New Pattern 22/ 0 0.2 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI5_End_NonPrinting--
-%AI5_Begin_NonPrinting
-Np
-%AI8_PluginGroupInfo
-(Adobe Path Blends) (Adobe Blends Plugin) (Live Blends)
-%AI8_PluginGroupInfo
-(Adobe PatternOnPath Brush Tool) (Adobe Pattern Brush Plugin) (Art Brush Tool)
-%AI8_PluginGroupInfo
-(Adobe ArtOnPath Brush Tool) (Adobe Art Brush Plugin) (Art Brush Tool)
-%AI8_PluginGroupInfo
-(Adobe Calligraphic Brush Tool) (Undo New Calligraphic Brush) (Calligraphic Brush Tool)
-%AI8_PluginGroupInfo
-(Adobe Scatter Brush Tool) (Adobe Scatter Brush Plugin) (Scatter Brush Tool)
-%AI5_End_NonPrinting--
-%%EndSetup
-%AI5_BeginLayer
-1 1 1 1 0 0 1 0 79 128 255 0 50 Lb
-(Layer 1) Ln
-0 A
-1 Ap
-0 O
-0.95 g
-0 R
-0 G
-800 Ar
-0 J 0 j 0.5 w 4 M []0 d
-%AI3_Note:
-0 D
-1 XR
-501.71 169.1504 m
-153.71 169.1504 L
-153.71 589.1504 L
-501.71 589.1504 L
-501.71 169.1504 L
-(b) *
-0 To
-1 0 0 1 236.4463 332.1426 0 Tp
-0 Tv
-TP
--14.7797 0 Td
-0 Tr
-0 g
-1 w
-0 XR
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
--4.5 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-23.6196 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 3.2805 3.2805 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
-0 Tc
-0 Tw
-(P) Tx 1 40 Tk
-(ar) Tx 1 10 Tk
-(allel\r) Tx 1 0 Tk
-3.1148 -11 Td
-(Cab) Tx 1 20 Tk
-(le) Tx 1 0 Tk
-(\r) TX
-TO
-0 Ap
-0 R
-0 G
-0.5 w
-184.8491 350.9229 m
-197.9233 350.9199 210.9907 351.3887 224.0674 351.2979 c
-227.6689 351.2725 249.1094 354.4385 250.6377 348.4697 c
-251.6982 344.3271 238.7969 344.8301 237.2236 340.9258 C
-241.8062 337.6826 254.5508 340.2188 259.3149 340.2549 c
-269.4844 340.3301 279.0869 337.2725 289.0425 336.8418 c
-S
-u
-%_1 w
-%_283.2539 343.2559 m
-%_S
-%_U
-%_0 Ap
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-283.2539 343.2559 m
-N
-u
-u
-u
-0 O
-0.7495 g
-0 R
-0.25 G
-1 j 0.5 w 2 M
-306.2246 325.6982 m
-306.2246 327.7178 l
-299.8633 331.1504 l
-283.3105 331.1504 L
-266.7578 331.1504 l
-260.1953 327.7178 l
-260.1953 325.6982 l
-306.2246 325.6982 l
-b
-0.8748 G
-2 J 0 j
-283.3105 331.1504 m
-266.7578 331.1504 l
-260.1953 327.7178 l
-260.1953 325.6982 l
-S
-306.2246 327.7178 m
-299.8633 331.1504 l
-283.3105 331.1504 L
-S
-0 O
-0.9 g
-0.25 G
-0 J 1 j
-266.8574 329.9385 m
-262.8193 327.7178 l
-303.3965 327.7178 l
-299.9648 329.9385 l
-266.8574 329.9385 l
-b
-U
-u
-u
-0.7 g
-0 j 1 w 4 M
-272.0713 334.0459 m
-274.3496 334.0889 L
-283.4512 335.6572 L
-292.7324 334.0889 L
-294.5273 334.0889 L
-294.4668 332.2471 L
-272.0713 332.2471 L
-272.0713 334.0459 L
-f
-0 R
-0.25 G
-0.5 w
-294.498 334.0459 m
-294.4063 332.2471 L
-272.0391 332.2471 L
-S
-0.9 G
-292.6982 334.0459 m
-294.498 334.0459 L
-S
-0.25 G
-283.3926 335.6572 m
-292.6982 334.0459 L
-S
-0.9 G
-272.0391 332.2471 m
-272.0391 334.0459 L
-274.293 334.0459 L
-283.3926 335.6572 L
-S
-U
-u
-0 O
-0.7 g
-1 w
-269.8291 337.1201 m
-279.126 337.167 L
-283.4844 338.8936 L
-288.0625 337.167 L
-296.7754 337.167 L
-296.7031 335.1426 L
-269.8291 335.1426 L
-269.8291 337.1201 L
-f
-0 R
-0.25 G
-0.5 w
-296.7422 337.1201 m
-296.6309 335.1426 L
-269.793 335.1426 L
-S
-0.9 G
-288.0205 337.1201 m
-296.7422 337.1201 L
-S
-0.25 G
-283.4141 338.8936 m
-288.0205 337.1201 L
-S
-0.9 G
-269.793 335.1426 m
-269.793 337.1201 L
-279.0557 337.1201 L
-283.4141 338.8936 L
-S
-U
-u
-0 O
-0.7495 g
-0.25 G
-2 J 2 M
-268.3125 337.9482 m
-268.3047 359.8174 l
-269.2881 360.8135 L
-297.2656 360.7861 L
-298.2041 359.6475 L
-298.2041 338.2334 L
-297.3945 337.0938 L
-269.1602 337.0938 l
-268.3125 337.9482 L
-b
-/BBAccumRotation (4.712389) XT
-0.8748 G
-269.1602 337.0938 m
-268.3125 337.9482 L
-268.3047 359.8174 l
-269.2881 360.8135 L
-297.2656 360.7861 L
-S
-/BBAccumRotation (4.712389) XT
-0 O
-0.9 g
-0.25 G
-295.1719 339.9814 m
-295.1914 357.9365 L
-271.2969 357.9365 L
-271.2949 339.9834 L
-295.1719 339.9814 L
-b
-/BBAccumRotation (4.712389) XT
-U
-U
-u
-0.15 G
-0 J 4 M
-299.8633 331.1504 m
-283.3105 331.1504 L
-266.7578 331.1504 L
-260.1953 327.7178 L
-260.1953 325.6982 L
-306.2246 325.6982 L
-306.2246 327.7178 L
-299.8633 331.1504 L
-s
-269.1602 337.0938 m
-269.793 337.0938 L
-269.793 335.1426 L
-269.8291 335.1533 L
-269.8291 335.1455 L
-269.793 335.1426 L
-269.8291 335.1426 L
-280.4648 335.1426 L
-274.3496 334.0889 L
-272.0713 334.0459 L
-272.0391 334.0459 L
-272.0391 332.2471 L
-272.0713 332.2568 L
-272.0713 332.25 L
-272.0391 332.2471 L
-272.0713 332.2471 L
-294.4063 332.2471 L
-294.4668 332.2471 L
-294.5273 334.0889 L
-292.7324 334.0889 L
-286.4961 335.1426 L
-296.6309 335.1426 L
-296.7031 335.1426 L
-296.7734 337.0938 L
-297.3945 337.0938 L
-298.2041 338.2334 L
-298.2041 359.6475 L
-297.2656 360.7861 L
-269.2881 360.8135 L
-268.3047 359.8174 L
-268.3125 337.9482 L
-269.1602 337.0938 L
-s
-U
-U
-U
-U
-(Adobe Scatter Brush Tool) 1 0 56 XP
-%010203043F8000003F8000003F8000003F80000000000000000000000000
-%000000000000000000000000000000000F36436C69656E742031
-/Adobe_Brushed_Path () XT
-u
-%_0 G
-%_385.5439 280.833 m
-%_S
-%_U
-%_0 Ap
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-385.5439 280.833 m
-N
-u
-u
-u
-0 O
-0.7495 g
-0 R
-0.25 G
-1 j 0.25 w 2 M
-397.0293 272.0547 m
-397.0293 273.0645 l
-393.8486 274.7803 l
-385.5723 274.7803 L
-377.2959 274.7803 l
-374.0146 273.0645 l
-374.0146 272.0547 l
-397.0293 272.0547 l
-b
-0.8748 G
-2 J 0 j
-385.5723 274.7803 m
-377.2959 274.7803 l
-374.0146 273.0645 l
-374.0146 272.0547 l
-S
-397.0293 273.0645 m
-393.8486 274.7803 l
-385.5723 274.7803 L
-S
-0 O
-0.9 g
-0.25 G
-0 J 1 j
-377.3457 274.1738 m
-375.3271 273.0645 l
-395.6152 273.0645 l
-393.8994 274.1738 l
-377.3457 274.1738 l
-b
-U
-u
-u
-0.7 g
-0 j 1 w 4 M
-379.9521 276.2285 m
-381.0918 276.25 L
-385.6426 277.0332 L
-390.2832 276.25 L
-391.1807 276.25 L
-391.1504 275.3281 L
-379.9521 275.3281 L
-379.9521 276.2285 L
-f
-0 R
-0.25 G
-0.25 w
-391.166 276.2285 m
-391.1201 275.3281 L
-379.9365 275.3281 L
-S
-0.9 G
-390.2666 276.2285 m
-391.166 276.2285 L
-S
-0.25 G
-385.6133 277.0332 m
-390.2666 276.2285 L
-S
-0.9 G
-379.9365 275.3281 m
-379.9365 276.2285 L
-381.0635 276.2285 L
-385.6133 277.0332 L
-S
-U
-u
-0 O
-0.7 g
-1 w
-378.8311 277.7656 m
-383.4795 277.7891 L
-385.6592 278.6523 L
-387.9482 277.7891 L
-392.3047 277.7891 L
-392.2686 276.7764 L
-378.8311 276.7764 L
-378.8311 277.7656 L
-f
-0 R
-0.25 G
-0.25 w
-392.2881 277.7656 m
-392.2324 276.7764 L
-378.8135 276.7764 L
-S
-0.9 G
-387.9268 277.7656 m
-392.2881 277.7656 L
-S
-0.25 G
-385.624 278.6523 m
-387.9268 277.7656 L
-S
-0.9 G
-378.8135 276.7764 m
-378.8135 277.7656 L
-383.4443 277.7656 L
-385.624 278.6523 L
-S
-U
-u
-0 O
-0.7495 g
-0.25 G
-2 J 2 M
-378.0732 278.1797 m
-378.0693 289.1133 l
-378.5615 289.6113 L
-392.5498 289.5977 L
-393.0186 289.0293 L
-393.0186 278.3223 L
-392.6143 277.752 L
-378.4971 277.752 l
-378.0732 278.1797 L
-b
-/BBAccumRotation (4.712389) XT
-0.8748 G
-378.4971 277.752 m
-378.0732 278.1797 L
-378.0693 289.1133 l
-378.5615 289.6113 L
-392.5498 289.5977 L
-S
-/BBAccumRotation (4.712389) XT
-0 O
-0.9 g
-0.25 G
-391.5029 279.1953 m
-391.5127 288.1738 L
-379.5654 288.1738 L
-379.5645 279.1973 L
-391.5029 279.1953 L
-b
-/BBAccumRotation (4.712389) XT
-U
-U
-u
-0.15 G
-0 J 4 M
-393.8486 274.7803 m
-385.5723 274.7803 L
-377.2959 274.7803 L
-374.0146 273.0645 L
-374.0146 272.0547 L
-397.0293 272.0547 L
-397.0293 273.0645 L
-393.8486 274.7803 L
-s
-378.4971 277.752 m
-378.8135 277.752 L
-378.8135 276.7764 L
-378.8311 276.7813 L
-378.8311 276.7773 L
-378.8135 276.7764 L
-378.8311 276.7764 L
-384.1494 276.7764 L
-381.0918 276.25 L
-379.9521 276.2285 L
-379.9365 276.2285 L
-379.9365 275.3281 L
-379.9521 275.334 L
-379.9521 275.3301 L
-379.9365 275.3281 L
-379.9521 275.3281 L
-391.1201 275.3281 L
-391.1504 275.3281 L
-391.1807 276.25 L
-390.2832 276.25 L
-387.165 276.7764 L
-392.2324 276.7764 L
-392.2686 276.7764 L
-392.3037 277.752 L
-392.6143 277.752 L
-393.0186 278.3223 L
-393.0186 289.0293 L
-392.5498 289.5977 L
-378.5615 289.6113 L
-378.0693 289.1133 L
-378.0732 278.1797 L
-378.4971 277.752 L
-s
-U
-U
-U
-U
-(Adobe Scatter Brush Tool) 1 0 56 XP
-%010203043F8000003F8000003F8000003F80000000000000000000000000
-%000000000000000000000000000000000F36436C69656E742031
-/Adobe_Brushed_Path () XT
-0 To
-1 0 0 1 282.8003 319.2734 0 Tp
-0 Tv
-TP
--21.8418 0 Td
-0 Tr
-0 O
-0 g
-1 w
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
--4.5 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-23.6196 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 3.2805 3.2805 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
-0 Tc
-0 Tw
-(Pr) Tx 1 -15 Tk
-(intser) Tx 1 -30 Tk
-(v) Tx 1 25 Tk
-(er) Tx 1 0 Tk
-(\r) TX
-TO
-0 To
-1 0 0 1 282.8003 350.0479 0 Tp
-0 Tv
-TP
--6.2504 0 Td
-0 Tr
-(PC) Tx 1 0 Tk
-(\r) TX
-TO
-0 To
-1 0 0 1 415.3008 280.3564 0 Tp
-0 Tv
-TP
--8.5004 0 Td
-0 Tr
-(PCs) Tx 1 0 Tk
-(\r) TX
-TO
-0 To
-1 0 0 1 373.9746 316.4063 0 Tp
-0 Tv
-TP
--16.5244 0 Td
-0 Tr
-(Netw) Tx 1 10 Tk
-(or) Tx 1 -15 Tk
-(k) Tx 1 0 Tk
-(\r) TX
-TO
-0 To
-1 0 0 1 176.1445 369.5293 0 Tp
-0 Tv
-TP
--12.7793 0 Td
-0 Tr
--20 Tt
--0.18 Tc
-(Pr) Tx 1 -15 Tk
-(inter) Tx 1 0 Tk
-(\r) TX
-TO
-u
-%_1 g
-%_0 R
-%_0.67 G
-%_1 M
-%_184.939 348.2959 m
-%_B
-%_U
-%_0 Ap
-0 A
-u
-0 O
-1 g
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-184.939 348.2959 m
-F
-u
-0.8 g
-198.6704 339.2217 m
-218.7153 346.0791 l
-217.1348 348.9805 l
-204.4736 345.0244 l
-198.4072 348.9805 l
-198.6704 339.2217 l
-f
-0 R
-0.9 G
-0.5 w
-217.4067 349.1064 m
-204.4736 345.0244 l
-S
-0.5 G
-218.7153 346.0791 m
-217.1348 348.9805 l
-S
-0.25 G
-198.6704 339.2217 m
-218.7153 346.0791 l
-S
-0.5 G
-204.4736 345.0244 m
-198.4072 348.9805 l
-S
-0 O
-0.8 g
-1 w
-178.626 356.6309 m
-190.7568 361.9053 l
-194.1865 357.6865 l
-178.626 356.6309 l
-f
-1 Ap
-0.57 g
-198.9341 337.376 m
-152.5137 337.376 L
-152.5137 334.4756 L
-198.9341 334.4756 L
-198.9341 337.376 L
-f
-0 Ap
-0 R
-0.5 G
-0.5 w
-190.7568 361.9053 m
-194.1865 357.6865 l
-S
-0.9 G
-178.626 356.6309 m
-191.3188 362.1826 l
-S
-0 O
-0.8 g
-1 w
-151.1929 358.668 m
-151.1929 337.3447 l
-199.9893 337.3447 l
-199.9893 354.5186 l
-196.5601 358.6084 l
-151.1929 358.668 l
-f
-0 R
-0.5 G
-0.5 w
-151.1929 342.9141 m
-199.9893 342.9141 l
-S
-154.0952 355.3115 m
-163.5913 355.3115 l
-S
-154.0952 353.6631 m
-163.5913 353.6631 l
-S
-154.0952 352.0156 m
-163.5913 352.0156 l
-S
-154.0952 350.3672 m
-163.5913 350.3672 l
-S
-154.0952 348.7197 m
-163.5913 348.7197 l
-S
-199.9893 354.5186 m
-196.5601 358.6084 l
-S
-0.25 G
-151.1929 337.3447 m
-199.9893 337.3447 l
-199.9893 354.5186 l
-S
-0.9 G
-196.5601 358.6377 m
-151.1929 358.6377 l
-151.1929 337.0752 l
-S
-0.25 G
-198.9341 337.3447 m
-198.9341 334.4307 l
-152.5225 334.4307 l
-S
-U
-U
-(Adobe Scatter Brush Tool) 1 0 55 XP
-%010203043F8000003F8000003F8000003F80000000000000000000000000
-%0000000000000000000000000000000007995072696E746572
-/Adobe_Brushed_Path () XT
-0 G
-368.3398 266.2295 m
-349.9629 278.8408 l
-349.9629 330.7295 349.9629 333.9727 v
-350.0488 345.1484 338.7871 345.1484 v
-327.5254 345.1484 298.0693 345.1484 y
-S
-349.9629 291.9287 m
-368.3398 279.3174 l
-S
-349.9629 305.0166 m
-368.3398 292.4053 l
-S
-0 To
-1 0 0 1 369.2402 389.2676 0 Tp
-0 Tv
-TP
--19.7722 0 Td
-0 Tr
-0 O
-0 g
-1 w
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
-0 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-23.6196 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 3.2805 3.2805 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
-0 Tc
-0 Tw
-(Fileser) Tx 1 -30 Tk
-(v) Tx 1 25 Tk
-(er) Tx 1 0 Tk
-(\r) TX
-TO
-u
-%_0 R
-%_0 G
-%_0.65 w
-%_368.8516 374.7744 m
-%_S
-%_U
-%_0 Ap
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-368.8516 374.7744 m
-N
-u
-u
-0 O
-0.8158 g
-0 R
-0 G
-0.325 w 3.8636 M
-343.3828 381.0254 m
-394.3223 381.0254 L
-394.3223 371.8701 L
-343.3828 371.8701 L
-343.3828 381.0254 L
-b
-368.8535 376.4473 m
-B
-U
-u
-344.9697 371.8701 m
-392.7344 371.8701 L
-393.6855 371.8701 394.4531 371.0996 394.4531 370.1514 c
-394.4531 369.2119 L
-394.4531 368.2617 393.6855 367.4922 392.7344 367.4922 c
-344.9697 367.4922 L
-344.0205 367.4922 343.25 368.2617 343.25 369.2119 c
-343.25 370.1514 L
-343.25 371.0996 344.0205 371.8701 344.9697 371.8701 c
-344.9697 371.8701 L
-b
-368.8525 369.6797 m
-B
-U
-0 g
-346.3018 367.4922 m
-349.2207 367.4922 L
-348.6895 366.5645 L
-347.0313 366.5645 L
-346.3018 367.4922 L
-b
-387.9551 367.4922 m
-390.873 367.4922 L
-390.3418 366.5645 L
-388.6836 366.5645 L
-387.9551 367.4922 L
-b
-0.61 G
-0.65 w
-347.8926 381.002 m
-347.8926 373.4404 L
-S
-349.2207 381.002 m
-349.2207 373.4404 L
-S
-u
-0 O
-0 g
-0 G
-0.325 w
-379.8633 378.5039 m
-388.75 378.5039 L
-388.75 377.043 L
-379.8633 377.043 L
-379.8633 378.5039 L
-b
-384.3066 377.7734 m
-B
-U
-1 J
-387.9453 371.2041 m
-388.2158 370.9199 388.3809 370.5371 388.3809 370.1143 C
-388.3809 369.25 L
-388.3809 368.8281 388.2158 368.4443 387.9453 368.1602 C
-S
-386.7168 371.2041 m
-386.9844 370.9199 387.1504 370.5371 387.1504 370.1143 C
-387.1504 369.25 L
-387.1504 368.8281 386.9844 368.4443 386.7168 368.1602 C
-S
-385.4854 371.2041 m
-385.7559 370.9199 385.9209 370.5371 385.9209 370.1143 C
-385.9209 369.25 L
-385.9209 368.8281 385.7559 368.4443 385.4854 368.1602 C
-S
-384.2559 371.2041 m
-384.5244 370.9199 384.6914 370.5371 384.6914 370.1143 C
-384.6914 369.25 L
-384.6914 368.8281 384.5244 368.4443 384.2559 368.1602 C
-S
-383.0244 371.2041 m
-383.2949 370.9199 383.4609 370.5371 383.4609 370.1143 C
-383.4609 369.25 L
-383.4609 368.8281 383.2949 368.4443 383.0244 368.1602 C
-S
-381.7949 371.2041 m
-382.0645 370.9199 382.2305 370.5371 382.2305 370.1143 C
-382.2305 369.25 L
-382.2305 368.8281 382.0645 368.4443 381.7949 368.1602 C
-S
-380.5645 371.2041 m
-380.834 370.9199 381 370.5371 381 370.1143 C
-381 369.25 L
-381 368.8281 380.834 368.4443 380.5645 368.1602 C
-S
-379.334 371.2041 m
-379.6035 370.9199 379.7695 370.5371 379.7695 370.1143 C
-379.7695 369.25 L
-379.7695 368.8281 379.6035 368.4443 379.334 368.1602 C
-S
-378.1045 371.2041 m
-378.374 370.9199 378.54 370.5371 378.54 370.1143 C
-378.54 369.25 L
-378.54 368.8281 378.374 368.4443 378.1045 368.1602 C
-S
-376.875 371.2041 m
-377.1426 370.9199 377.3096 370.5371 377.3096 370.1143 C
-377.3096 369.25 L
-377.3096 368.8281 377.1426 368.4443 376.875 368.1602 C
-S
-375.6445 371.2041 m
-375.9141 370.9199 376.0791 370.5371 376.0791 370.1143 C
-376.0791 369.25 L
-376.0791 368.8281 375.9141 368.4443 375.6445 368.1602 C
-S
-374.4141 371.2041 m
-374.6836 370.9199 374.8496 370.5371 374.8496 370.1143 C
-374.8496 369.25 L
-374.8496 368.8281 374.6836 368.4443 374.4141 368.1602 C
-S
-373.1855 371.2041 m
-373.4551 370.9199 373.6191 370.5371 373.6191 370.1143 C
-373.6191 369.25 L
-373.6191 368.8281 373.4551 368.4443 373.1855 368.1602 C
-S
-371.9531 371.2041 m
-372.2246 370.9199 372.3887 370.5371 372.3887 370.1143 C
-372.3887 369.25 L
-372.3887 368.8281 372.2246 368.4443 371.9531 368.1602 C
-S
-370.7227 371.2041 m
-370.9932 370.9199 371.1592 370.5371 371.1592 370.1143 C
-371.1592 369.25 L
-371.1592 368.8281 370.9932 368.4443 370.7227 368.1602 C
-S
-0 O
-0.4385 g
-0 J 1 j
-349.2207 382.9844 m
-388.2207 382.9844 L
-394.3223 381.0254 L
-343.3828 381.0254 L
-349.2207 382.9844 L
-b
-U
-U
-(Adobe Scatter Brush Tool) 1 0 58 XP
-%010203043F8000003F8000003F8000003F80000000000000000000000000
-%0000000000000000000000000000000041C646617820736572766572
-/Adobe_Brushed_Path () XT
-0 j 0.5 w 4 M
-342.4727 375.2129 m
-327.0859 375.2129 l
-327.0859 345.3223 l
-S
-LB
-%AI5_EndLayer--
-%%PageTrailer
-gsave annotatepage grestore showpage
-%%Trailer
-Adobe_Illustrator_AI5 /terminate get exec
-Adobe_shading_AI8 /terminate get exec
-Adobe_ColorImage_AI6 /terminate get exec
-Adobe_typography_AI5 /terminate get exec
-Adobe_cshow /terminate get exec
-Adobe_level2_AI5 /terminate get exec
-%%EOF
diff --git a/en_US.ISO8859-1/books/corp-net-guide/08-03.eps b/en_US.ISO8859-1/books/corp-net-guide/08-03.eps
deleted file mode 100644
index 381023e0f7..0000000000
--- a/en_US.ISO8859-1/books/corp-net-guide/08-03.eps
+++ /dev/null
@@ -1,8489 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: Adobe Illustrator(R) 8.0
-%%AI8_CreatorVersion: 8.0.1
-%%For: (William B Brownville) (PDPS)
-%%Title: (08-03 3594)
-%%CreationDate: (11/21/00) (8:55 AM)
-%%BoundingBox: 150 266 424 397
-%%HiResBoundingBox: 150.9429 266.0234 423.8008 396.3271
-%%DocumentProcessColors: Black
-%%DocumentFonts: Helvetica
-%%DocumentNeededFonts: Helvetica
-%%DocumentSuppliedResources: procset Adobe_level2_AI5 1.2 0
-%%+ procset Adobe_typography_AI5 1.0 1
-%%+ procset Adobe_ColorImage_AI6 1.3 0
-%%+ procset Adobe_Illustrator_AI5 1.3 0
-%%+ procset Adobe_cshow 2.0 8
-%%+ procset Adobe_shading_AI8 1.0 0
-%AI5_FileFormat 4.0
-%AI3_ColorUsage: Black&White
-%AI3_IncludePlacedImages
-%AI7_ImageSettings: 1
-%%CMYKProcessColor: 0 0 0 0.15 (15%)
-%%+ 0 0 0 0.3 (30%)
-%%+ 0 0 0 0.5 (50%)
-%%+ 0 0 0 0.75 (75%)
-%%+ 1 1 1 1 ([Registration])
-%%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set)
-%%+ Options: 1 16 0 1 0 1 1 1 0 1 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 2 3 4
-%%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 ()
-%AI3_TemplateBox: 306.5 395.5 306.5 395.5
-%AI3_TileBox: 12 14 600 782
-%AI3_DocumentPreview: Macintosh_ColorPic
-%AI5_ArtSize: 612 792
-%AI5_RulerUnits: 3
-%AI5_ArtFlags: 1 0 0 1 0 0 1 0 0
-%AI5_TargetResolution: 800
-%AI5_NumLayers: 1
-%AI8_OpenToView: 127.5986 435.8184 3.81 1137 777 18 0 1 7 40 0 0
-%AI5_OpenViewLayers: 7
-%%PageOrigin:12 14
-%%AI3_PaperRect:-12 782 600 -10
-%%AI3_Margin:12 -14 -12 10
-%AI7_GridSettings: 12 3 12 3 1 0 0.29 1 1 0.65 1 1
-%%EndComments
-%%BeginProlog
-%%BeginResource: procset Adobe_level2_AI5 1.2 0
-%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation)
-%%Version: 1.2 0
-%%CreationDate: (04/10/93) ()
-%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved)
-userdict /Adobe_level2_AI5 26 dict dup begin
- put
- /packedarray where not
- {
- userdict begin
- /packedarray
- {
- array astore readonly
- } bind def
- /setpacking /pop load def
- /currentpacking false def
- end
- 0
- } if
- pop
- userdict /defaultpacking currentpacking put true setpacking
- /initialize
- {
- Adobe_level2_AI5 begin
- } bind def
- /terminate
- {
- currentdict Adobe_level2_AI5 eq
- {
- end
- } if
- } bind def
- mark
- /setcustomcolor where not
- {
- /findcmykcustomcolor
- {
- (AI8_CMYK_CustomColor)
- 6 packedarray
- } bind def
- /findrgbcustomcolor
- {
- (AI8_RGB_CustomColor)
- 5 packedarray
- } bind def
- /setcustomcolor
- {
- exch
- aload pop dup
- (AI8_CMYK_CustomColor) eq
- {
- pop pop
- 4
- {
- 4 index mul
- 4 1 roll
- } repeat
- 5 -1 roll pop
- setcmykcolor
- }
- {
- dup (AI8_RGB_CustomColor) eq
- {
- pop pop
- 3
- {
- 1 exch sub
- 3 index mul
- 1 exch sub
- 3 1 roll
- } repeat
- 4 -1 roll pop
- setrgbcolor
- }
- {
- pop
- 4
- {
- 4 index mul 4 1 roll
- } repeat
- 5 -1 roll pop
- setcmykcolor
- } ifelse
- } ifelse
- }
- def
- } if
- /setAIseparationgray
- {
- false setoverprint
- 0 setgray
- /setseparationgray where{
- pop setseparationgray
- }{
- /setcolorspace where{
- pop
- [/Separation (All) /DeviceCMYK {dup dup dup}] setcolorspace
- 1 exch sub setcolor
- }{
- setgray
- }ifelse
- }ifelse
- } def
-
- /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def
- userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put
- userdict /level2?
- systemdict /languagelevel known dup
- {
- pop systemdict /languagelevel get 2 ge
- } if
- put
-/level2ScreenFreq
-{
- begin
- 60
- HalftoneType 1 eq
- {
- pop Frequency
- } if
- HalftoneType 2 eq
- {
- pop GrayFrequency
- } if
- HalftoneType 5 eq
- {
- pop Default level2ScreenFreq
- } if
- end
-} bind def
-userdict /currentScreenFreq
- level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put
-level2? not
- {
- /setcmykcolor where not
- {
- /setcmykcolor
- {
- exch .11 mul add exch .59 mul add exch .3 mul add
- 1 exch sub setgray
- } def
- } if
- /currentcmykcolor where not
- {
- /currentcmykcolor
- {
- 0 0 0 1 currentgray sub
- } def
- } if
- /setoverprint where not
- {
- /setoverprint /pop load def
- } if
- /selectfont where not
- {
- /selectfont
- {
- exch findfont exch
- dup type /arraytype eq
- {
- makefont
- }
- {
- scalefont
- } ifelse
- setfont
- } bind def
- } if
- /cshow where not
- {
- /cshow
- {
- [
- 0 0 5 -1 roll aload pop
- ] cvx bind forall
- } bind def
- } if
- } if
- cleartomark
- /anyColor?
- {
- add add add 0 ne
- } bind def
- /testColor
- {
- gsave
- setcmykcolor currentcmykcolor
- grestore
- } bind def
- /testCMYKColorThrough
- {
- testColor anyColor?
- } bind def
- userdict /composite?
- 1 0 0 0 testCMYKColorThrough
- 0 1 0 0 testCMYKColorThrough
- 0 0 1 0 testCMYKColorThrough
- 0 0 0 1 testCMYKColorThrough
- and and and
- put
- composite? not
- {
- userdict begin
- gsave
- /cyan? 1 0 0 0 testCMYKColorThrough def
- /magenta? 0 1 0 0 testCMYKColorThrough def
- /yellow? 0 0 1 0 testCMYKColorThrough def
- /black? 0 0 0 1 testCMYKColorThrough def
- grestore
- /isCMYKSep? cyan? magenta? yellow? black? or or or def
- /customColor? isCMYKSep? not def
- end
- } if
- end defaultpacking setpacking
-%%EndResource
-%%BeginResource: procset Adobe_typography_AI5 1.0 1
-%%Title: (Typography Operators)
-%%Version: 1.0 1
-%%CreationDate:(6/10/1996) ()
-%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved)
-currentpacking true setpacking
-userdict /Adobe_typography_AI5 68 dict dup begin
-put
-/initialize
-{
- begin
- begin
- Adobe_typography_AI5 begin
- Adobe_typography_AI5
- {
- dup xcheck
- {
- bind
- } if
- pop pop
- } forall
- end
- end
- end
- Adobe_typography_AI5 begin
-} def
-/terminate
-{
- currentdict Adobe_typography_AI5 eq
- {
- end
- } if
-} def
-/modifyEncoding
-{
- /_tempEncode exch ddef
- /_pntr 0 ddef
- {
- counttomark -1 roll
- dup type dup /marktype eq
- {
- pop pop exit
- }
- {
- /nametype eq
- {
- _tempEncode /_pntr dup load dup 3 1 roll 1 add ddef 3 -1 roll
- put
- }
- {
- /_pntr exch ddef
- } ifelse
- } ifelse
- } loop
- _tempEncode
-} def
-/havefont
-{
- systemdict /languagelevel known
- {
- /Font resourcestatus dup
- { exch pop exch pop }
- if
- }
- {
- systemdict /FontDirectory get 1 index known
- { pop true }
- {
- systemdict /fileposition known
- {
- dup length 6 add exch
- Ss 6 250 getinterval
- cvs pop
- Ss exch 0 exch getinterval
- status
- { pop pop pop pop true }
- { false }
- ifelse
- }
- {
- pop false
- }
- ifelse
- }
- ifelse
- }
- ifelse
-} def
-/TE
-{
- StandardEncoding 256 array copy modifyEncoding
- /_nativeEncoding exch def
-} def
-/subststring {
- exch 2 index exch search
- {
- exch pop
- exch dup () eq
- {
- pop exch concatstring
- }
- {
- 3 -1 roll
- exch concatstring
- concatstring
- } ifelse
- exch pop true
- }
- {
- pop pop false
- } ifelse
-} def
-/concatstring {
- 1 index length 1 index length
- 1 index add
- string
- dup 0 5 index putinterval
- dup 2 index 4 index putinterval
- 4 1 roll pop pop pop
-} def
-%
-/TZ
-{
- dup type /arraytype eq
- {
- /_wv exch def
- }
- {
- /_wv 0 def
- } ifelse
- /_useNativeEncoding exch def
- 2 index havefont
- {
- 3 index
- 255 string
- cvs
-
- dup
- (_Symbol_)
- eq
- {
- pop
- 2 index
- findfont
-
- }
- {
- 1 index 0 eq
- {
- dup length 1 sub
- 1 exch
- getinterval
-
- cvn
- findfont
- }
- {
- pop 2 index findfont
- } ifelse
- } ifelse
- }
- {
- dup 1 eq
- {
- 2 index 64 string cvs
- dup (-90pv-RKSJ-) (-83pv-RKSJ-) subststring
- {
- exch pop dup havefont
- {
- findfont false
- }
- {
- pop true
- } ifelse
- }
- {
- pop dup
- (-90ms-RKSJ-) (-Ext-RKSJ-) subststring
- {
- exch pop dup havefont
- {
- findfont false
- }
- {
- pop true
- } ifelse
- }
- {
- pop pop true
- } ifelse
- } ifelse
- {
- 1 index 1 eq
- {
- /Ryumin-Light-Ext-RKSJ-V havefont
- {/Ryumin-Light-Ext-RKSJ-V}
- {/Courier}
- ifelse
- }
- {
- /Ryumin-Light-83pv-RKSJ-H havefont
- {/Ryumin-Light-83pv-RKSJ-H}
- {/Courier}
- ifelse
- } ifelse
- findfont
- [1 0 0.5 1 0 0] makefont
- } if
- }
- {
- /Courier findfont
- } ifelse
- } ifelse
- _wv type /arraytype eq
- {
- _wv makeblendedfont
- } if
- dup length 10 add dict
- begin
- mark exch
- {
- 1 index /FID ne
- {
- def
- } if
- cleartomark mark
- } forall
- pop
- /FontScript exch def
- /FontDirection exch def
- /FontRequest exch def
- /FontName exch def
- counttomark 0 eq
- {
- 1 _useNativeEncoding eq
- {
- /Encoding _nativeEncoding def
- } if
- cleartomark
- }
- {
- /Encoding load 256 array copy
- modifyEncoding /Encoding exch def
- } ifelse
- FontName currentdict
- end
- definefont pop
-} def
-/tr
-{
- _ax _ay 3 2 roll
-} def
-/trj
-{
- _cx _cy _sp _ax _ay 6 5 roll
-} def
-/a0
-{
- /Tx
- {
- dup
- currentpoint 3 2 roll
- tr _psf
- newpath moveto
- tr _ctm _pss
- } ddef
- /Tj
- {
- dup
- currentpoint 3 2 roll
- trj _pjsf
- newpath moveto
- trj _ctm _pjss
- } ddef
-} def
-/a1
-{
-W B
-} def
-/e0
-{
- /Tx
- {
- tr _psf
- } ddef
- /Tj
- {
- trj _pjsf
- } ddef
-} def
-/e1
-{
-W F
-} def
-/i0
-{
- /Tx
- {
- tr sp
- } ddef
- /Tj
- {
- trj jsp
- } ddef
-} def
-/i1
-{
- W N
-} def
-/o0
-{
- /Tx
- {
- tr sw rmoveto
- } ddef
- /Tj
- {
- trj swj rmoveto
- } ddef
-} def
-/r0
-{
- /Tx
- {
- tr _ctm _pss
- } ddef
- /Tj
- {
- trj _ctm _pjss
- } ddef
-} def
-/r1
-{
-W S
-} def
-/To
-{
- pop _ctm currentmatrix pop
-} def
-/TO
-{
- iTe _ctm setmatrix newpath
-} def
-/Tp
-{
- pop _tm astore pop _ctm setmatrix
- _tDict begin
- /W
- {
- } def
- /h
- {
- } def
-} def
-/TP
-{
- end
- iTm 0 0 moveto
-} def
-/Tr
-{
- _render 3 le
- {
- currentpoint newpath moveto
- } if
- dup 8 eq
- {
- pop 0
- }
- {
- dup 9 eq
- {
- pop 1
- } if
- } ifelse
- dup /_render exch ddef
- _renderStart exch get load exec
-} def
-/iTm
-{
- _ctm setmatrix _tm concat
- _shift aload pop _lineorientation 1 eq { exch } if translate
- _scale aload pop _lineorientation 1 eq _yokoorientation 1 eq or { exch } if scale
-} def
-/Tm
-{
- _tm astore pop iTm 0 0 moveto
-} def
-/Td
-{
- _mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto
-} def
-/iTe
-{
- _render -1 eq
- {
- }
- {
- _renderEnd _render get dup null ne
- {
- load exec
- }
- {
- pop
- } ifelse
- } ifelse
- /_render -1 ddef
-} def
-/Ta
-{
- pop
-} def
-/Tf
-{
- 1 index type /nametype eq
- {
- dup 0.75 mul 1 index 0.25 mul neg
- } if
- /_fontDescent exch ddef
- /_fontAscent exch ddef
- /_fontSize exch ddef
- /_fontRotateAdjust _fontAscent _fontDescent add 2 div neg ddef
- /_fontHeight _fontSize ddef
- findfont _fontSize scalefont setfont
-} def
-/Tl
-{
- pop neg 0 exch
- _leading astore pop
-} def
-/Tt
-{
- pop
-} def
-/TW
-{
- 3 npop
-} def
-/Tw
-{
- /_cx exch ddef
-} def
-/TC
-{
- 3 npop
-} def
-/Tc
-{
- /_ax exch ddef
-} def
-/Ts
-{
- 0 exch
- _shift astore pop
- currentpoint
- iTm
- moveto
-} def
-/Ti
-{
- 3 npop
-} def
-/Tz
-{
- count 1 eq { 100 } if
- 100 div exch 100 div exch
- _scale astore pop
- iTm
-} def
-/TA
-{
- pop
-} def
-/Tq
-{
- pop
-} def
-/Tg
-{
- pop
-} def
-/TG
-{
- pop
-} def
-/Tv
-{
- /_lineorientation exch ddef
-} def
-/TV
-{
- /_charorientation exch ddef
-} def
-/Ty
-{
- dup /_yokoorientation exch ddef 1 sub neg Tv
-} def
-/TY
-{
- pop
-} def
-/T~
-{
- Tx
-} def
-/Th
-{
- pop pop pop pop pop
-} def
-/TX
-{
- pop
-} def
-/Tk
-{
- _fontSize mul 1000 div
- _lineorientation 0 eq { neg 0 } { 0 exch } ifelse
- rmoveto
- pop
-} def
-/TK
-{
- 2 npop
-} def
-/T*
-{
- _leading aload pop
- _lineorientation 0 ne { exch } if
- Td
-} def
-/T*-
-{
- _leading aload pop
- _lineorientation 0 ne { exch } if
- exch neg exch neg
- Td
-} def
-/T-
-{
- _ax neg 0 rmoveto
- _lineorientation 1 eq _charorientation 0 eq and { 1 TV _hyphen Tx 0 TV } { _hyphen Tx } ifelse
-} def
-/T+
-{
-} def
-/TR
-{
- _ctm currentmatrix pop
- _tm astore pop
- iTm 0 0 moveto
-} def
-/TS
-{
- currentfont 3 1 roll
- /_Symbol_ findfont _fontSize scalefont setfont
-
- 0 eq
- {
- Tx
- }
- {
- Tj
- } ifelse
- setfont
-} def
-/Xb
-{
- pop pop
-} def
-/Tb /Xb load def
-/Xe
-{
- pop pop pop pop
-} def
-/Te /Xe load def
-/XB
-{
-} def
-/TB /XB load def
-currentdict readonly pop
-end
-setpacking
-%
-/X^
-{
- currentfont 5 1 roll
- dup havefont
- {
- findfont _fontSize scalefont setfont
- }
- {
- pop
- exch
- } ifelse
- 2 index 0 eq
- {
- Tx
- }
- {
- Tj
- } ifelse
- pop pop
- setfont
-} def
-/T^ /X^ load def
-%%EndResource
-%%BeginProcSet: Adobe_ColorImage_AI6 1.3 0
-userdict /Adobe_ColorImage_AI6 known not
-{
- userdict /Adobe_ColorImage_AI6 53 dict put
-} if
-userdict /Adobe_ColorImage_AI6 get begin
-/initialize {
- Adobe_ColorImage_AI6 begin
- Adobe_ColorImage_AI6 {
- dup type /arraytype eq {
- dup xcheck {
- bind
- } if
- } if
- pop pop
- } forall
-} def
-/terminate { end } def
-currentdict /Adobe_ColorImage_AI6_Vars known not {
- /Adobe_ColorImage_AI6_Vars 41 dict def
-} if
-Adobe_ColorImage_AI6_Vars begin
- /plateindex -1 def
- /_newproc null def
- /_proc1 null def
- /_proc2 null def
- /sourcearray 4 array def
- /_ptispace null def
- /_ptiname null def
- /_pti0 0 def
- /_pti1 0 def
- /_ptiproc null def
- /_ptiscale 0 def
- /_pticomps 0 def
- /_ptibuf 0 string def
- /_gtigray 0 def
- /_cticmyk null def
- /_rtirgb null def
- /XIEnable true def
- /XIType 0 def
- /XIEncoding 0 def
- /XICompression 0 def
- /XIChannelCount 0 def
- /XIBitsPerPixel 0 def
- /XIImageHeight 0 def
- /XIImageWidth 0 def
- /XIImageMatrix null def
- /XIRowBytes 0 def
- /XIFile null def
- /XIBuffer1 null def
- /XIBuffer2 null def
- /XIBuffer3 null def
- /XIDataProc null def
- /XIColorSpace /DeviceGray def
- /XIColorValues 0 def
- /XIPlateList false def
-end
-/ci6colorimage /colorimage where {/colorimage get}{null} ifelse def
-/ci6image systemdict /image get def
-/ci6curtransfer systemdict /currenttransfer get def
-/ci6curoverprint /currentoverprint where {/currentoverprint get}{{_of}} ifelse def
-/ci6foureq {
- 4 index ne {
- pop pop pop false
- }{
- 4 index ne {
- pop pop false
- }{
- 4 index ne {
- pop false
- }{
- 4 index eq
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6testplate {
- Adobe_ColorImage_AI6_Vars begin
- /plateindex -1 def
- /setcmykcolor where {
- pop
- gsave
- 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub
- 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub
- 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub
- 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub
- grestore
- 1 0 0 0 ci6foureq {
- /plateindex 0 def
- }{
- 0 1 0 0 ci6foureq {
- /plateindex 1 def
- }{
- 0 0 1 0 ci6foureq {
- /plateindex 2 def
- }{
- 0 0 0 1 ci6foureq {
- /plateindex 3 def
- }{
- 0 0 0 0 ci6foureq {
- /plateindex 5 def
- } if
- } ifelse
- } ifelse
- } ifelse
- } ifelse
- pop pop pop pop
- } if
- plateindex
- end
-} def
-/ci6concatprocs {
- /packedarray where {
- pop dup type /packedarraytype eq 2 index type
- /packedarraytype eq or
- }{
- false
- } ifelse
- {
- /_proc2 exch cvlit def
- /_proc1 exch cvlit def
- _proc1 aload pop
- _proc2 aload pop
- _proc1 length
- _proc2 length add
- packedarray cvx
- }{
- /_proc2 exch cvlit def
- /_proc1 exch cvlit def
- /_newproc _proc1 length _proc2 length add array def
- _newproc 0 _proc1 putinterval
- _newproc _proc1 length _proc2 putinterval
- _newproc cvx
- } ifelse
-} def
-/ci6istint {
- type /arraytype eq
-} def
-/ci6isspot {
- dup type /arraytype eq {
- dup length 1 sub get /Separation eq
- }{
- pop false
- } ifelse
-} def
-/ci6spotname {
- dup ci6isspot {dup length 2 sub get}{pop ()} ifelse
-} def
-/ci6altspace {
- aload pop pop pop ci6colormake
-} def
-/ci6numcomps {
- dup /DeviceGray eq {
- pop 1
- }{
- dup /DeviceRGB eq {
- pop 3
- }{
- /DeviceCMYK eq {
- 4
- }{
- 1
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6marksplate {
- dup /DeviceGray eq {
- pop plateindex 3 eq
- }{
- dup /DeviceRGB eq {
- pop plateindex 5 ne
- }{
- dup /DeviceCMYK eq {
- pop plateindex 5 ne
- }{
- dup ci6isspot {
- /findcmykcustomcolor where {
- pop
- dup length 2 sub get
- 0.1 0.1 0.1 0.1 5 -1 roll
- findcmykcustomcolor 1 setcustomcolor
- systemdict /currentgray get exec
- 1 ne
- }{
- pop plateindex 5 ne
- } ifelse
- }{
- pop plateindex 5 ne
- } ifelse
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6colormake {
- dup ci6numcomps
- exch 1 index 2 add 1 roll
- dup 1 eq {pop}{array astore} ifelse
- exch
-} def
-/ci6colorexpand {
- dup ci6spotname exch
- dup ci6istint {
- ci6altspace
- exch 4 1 roll
- }{
- 1 3 1 roll
- } ifelse
-} def
-/ci6colortint {
- dup /DeviceGray eq {
- 3 1 roll 1 exch sub mul 1 exch sub exch
- }{
- dup /DeviceRGB eq {
- 3 1 roll {1 exch sub 1 index mul 1 exch sub exch} forall pop 3 array astore exch
- }{
- dup /DeviceCMYK eq {
- 3 1 roll {1 index mul exch} forall pop 4 array astore exch
- }{
- 3 1 roll mul exch
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6colortocmyk {
- dup /DeviceGray eq {
- pop 1 exch sub 0 0 0 4 -1 roll 4 array astore
- }{
- dup /DeviceRGB eq {
- pop aload pop _rgbtocmyk 4 array astore
- }{
- dup /DeviceCMYK eq {
- pop
- }{
- ci6altspace ci6colortint ci6colortocmyk
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6makeimagedict {
- 7 dict begin
- /ImageType 1 def
- /Decode exch def
- /DataSource exch def
- /ImageMatrix exch def
- /BitsPerComponent exch def
- /Height exch def
- /Width exch def
- currentdict end
-} def
-/ci6stringinvert {
- 0 1 2 index length 1 sub {
- dup 2 index exch get 255 exch sub 2 index 3 1 roll put
- } for
-} def
-/ci6stringknockout {
- 0 1 2 index length 1 sub {
- 255 2 index 3 1 roll put
- } for
-} def
-/ci6stringapply {
- 0 1 4 index length 1 sub {
- dup
- 4 index exch get
- 3 index 3 1 roll
- 3 index exec
- } for
- pop exch pop
-} def
-/ci6walkrgbstring {
- 0 3 index
- dup length 1 sub 0 3 3 -1 roll {
- 3 getinterval {} forall
- 5 index exec
- 3 index
- } for
-
- 5 {pop} repeat
-} def
-/ci6walkcmykstring
-{
- 0 3 index
- dup length 1 sub 0 4 3 -1 roll {
- 4 getinterval {} forall
-
- 6 index exec
-
- 3 index
-
- } for
-
- 5 { pop } repeat
-
-} def
-/ci6putrgbtograystr
-{
- .11 mul exch
-
- .59 mul add exch
-
- .3 mul add
-
- cvi 3 copy put
-
- pop 1 add
-} def
-/ci6putcmyktograystr
-{
- exch .11 mul add
-
- exch .59 mul add
-
- exch .3 mul add
-
- dup 255 gt { pop 255 } if
-
- 255 exch sub cvi 3 copy put
-
- pop 1 add
-} def
-/ci6rgbtograyproc {
- Adobe_ColorImage_AI6_Vars begin
- sourcearray 0 get exec
- XIBuffer3
- dup 3 1 roll
-
- /ci6putrgbtograystr load exch
- ci6walkrgbstring
- end
-} def
-/ci6cmyktograyproc {
- Adobe_ColorImage_AI6_Vars begin
- sourcearray 0 get exec
- XIBuffer3
- dup 3 1 roll
-
- /ci6putcmyktograystr load exch
- ci6walkcmykstring
- end
-} def
-/ci6separatecmykproc {
- Adobe_ColorImage_AI6_Vars begin
- sourcearray 0 get exec
-
- XIBuffer3
-
- 0 2 index
-
- plateindex 4 2 index length 1 sub {
- get 255 exch sub
-
- 3 copy put pop 1 add
-
- 2 index
- } for
- pop pop exch pop
- end
-} def
-
-/ci6compositeimage {
- dup 1 eq {
- pop pop image
- }{
- /ci6colorimage load null ne {
- ci6colorimage
- }{
- 3 1 roll pop
- sourcearray 0 3 -1 roll put
- 3 eq {/ci6rgbtograyproc}{/ci6cmyktograyproc} ifelse load
- image
- } ifelse
- } ifelse
-} def
-/ci6knockoutimage {
- gsave
- 0 ci6curtransfer exec 1 ci6curtransfer exec
- eq {
- 0 ci6curtransfer exec 0.5 lt
- }{
- 0 ci6curtransfer exec 1 ci6curtransfer exec gt
- } ifelse
- {{pop 0}}{{pop 1}} ifelse
- systemdict /settransfer get exec
- ci6compositeimage
- grestore
-} def
-/ci6drawimage {
- ci6testplate -1 eq {
- pop ci6compositeimage
- }{
- dup type /arraytype eq {
- dup length plateindex gt {plateindex get}{pop false} ifelse
- }{
- {
- true
- }{
- dup 1 eq {plateindex 3 eq}{plateindex 3 le} ifelse
- } ifelse
- } ifelse
- {
- dup 1 eq {
- pop pop ci6image
- }{
- dup 3 eq {
- ci6compositeimage
- }{
- pop pop
- sourcearray 0 3 -1 roll put
- /ci6separatecmykproc load
- ci6image
- } ifelse
- } ifelse
- }{
- ci6curoverprint {
- 7 {pop} repeat
- }{
- ci6knockoutimage
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6proctintimage {
- /_ptispace exch store /_ptiname exch store /_pti1 exch store /_pti0 exch store /_ptiproc exch store
- /_pticomps _ptispace ci6numcomps store
- /_ptiscale _pti1 _pti0 sub store
- level2? {
- _ptiname length 0 gt version cvr 2012 ge and {
- [/Separation _ptiname _ptispace {_ptiproc}] setcolorspace
- [_pti0 _pti1] ci6makeimagedict ci6image
- }{
- [/Indexed _ptispace 255 {255 div _ptiscale mul _pti0 add _ptiproc}] setcolorspace
- [0 255] ci6makeimagedict ci6image
- } ifelse
- }{
- _pticomps 1 eq {
- {
- dup
- {
- 255 div _ptiscale mul _pti0 add _ptiproc 255 mul cvi put
- } ci6stringapply
- } ci6concatprocs ci6image
- }{
- {
- dup length _pticomps mul dup _ptibuf length ne {/_ptibuf exch string store}{pop} ifelse
- _ptibuf {
- exch _pticomps mul exch 255 div _ptiscale mul _pti0 add _ptiproc
- _pticomps 2 add -2 roll
- _pticomps 1 sub -1 0 {
- 1 index add 2 index exch
- 5 -1 roll
- 255 mul cvi put
- } for
- pop pop
- } ci6stringapply
- } ci6concatprocs false _pticomps
- /ci6colorimage load null eq {7 {pop} repeat}{ci6colorimage} ifelse
- } ifelse
- } ifelse
-} def
-/ci6graytintimage {
- /_gtigray 5 -1 roll store
- {1 _gtigray sub mul 1 exch sub} 4 1 roll
- /DeviceGray ci6proctintimage
-} def
-/ci6cmyktintimage {
- /_cticmyk 5 -1 roll store
- {_cticmyk {1 index mul exch} forall pop} 4 1 roll
- /DeviceCMYK ci6proctintimage
-} def
-/ci6rgbtintimage {
- /_rtirgb 5 -1 roll store
- {_rtirgb {1 exch sub 1 index mul 1 exch sub exch} forall pop} 4 1 roll
- /DeviceRGB ci6proctintimage
-} def
-/ci6tintimage {
- ci6testplate -1 eq {
- ci6colorexpand
- 3 -1 roll 5 -1 roll {0}{0 exch} ifelse 4 2 roll
- dup /DeviceGray eq {
- pop ci6graytintimage
- }{
- dup /DeviceRGB eq {
- pop ci6rgbtintimage
- }{
- pop ci6cmyktintimage
- } ifelse
- } ifelse
- }{
- dup ci6marksplate {
- plateindex 5 lt {
- ci6colortocmyk plateindex get
- dup 0 eq ci6curoverprint and {
- 7 {pop} repeat
- }{
- 1 exch sub
- exch {1 0}{0 1} ifelse () ci6graytintimage
- } ifelse
- }{
- pop exch {0}{0 exch} ifelse 0 3 1 roll () ci6graytintimage
- } ifelse
- }{
- ci6curoverprint {
- 8 {pop} repeat
- }{
- pop pop pop
- {pop 1} 0 1 () /DeviceGray ci6proctintimage
- } ifelse
- } ifelse
- } ifelse
-} def
-/XINullImage {
-} def
-/XIImageMask {
- XIImageWidth XIImageHeight false
- [XIImageWidth 0 0 XIImageHeight neg 0 0]
- /XIDataProc load
- imagemask
-} def
-/XIImageTint {
- XIImageWidth XIImageHeight XIBitsPerPixel
- [XIImageWidth 0 0 XIImageHeight neg 0 0]
- /XIDataProc load
- XIType 3 eq XIColorValues XIColorSpace ci6tintimage
-} def
-/XIImage {
- XIImageWidth XIImageHeight XIBitsPerPixel
- [XIImageWidth 0 0 XIImageHeight neg 0 0]
- /XIDataProc load
- false XIChannelCount XIPlateList ci6drawimage
-} def
-/XG {
- pop pop
-} def
-/XF {
- 13 {pop} repeat
-} def
-/Xh {
- Adobe_ColorImage_AI6_Vars begin
- gsave
- /XIType exch def
- /XIImageHeight exch def
- /XIImageWidth exch def
- /XIImageMatrix exch def
- 0 0 moveto
- XIImageMatrix concat
- XIImageWidth XIImageHeight scale
-
- /_lp /null ddef
- _fc
- /_lp /imagemask ddef
- end
-} def
-/XH {
- Adobe_ColorImage_AI6_Vars begin
- grestore
- end
-} def
-/XIEnable {
- Adobe_ColorImage_AI6_Vars /XIEnable 3 -1 roll put
-} def
-/XC {
- Adobe_ColorImage_AI6_Vars begin
- ci6colormake
- /XIColorSpace exch def
- /XIColorValues exch def
- end
-} def
-/XIPlates {
- Adobe_ColorImage_AI6_Vars begin
- /XIPlateList exch def
- end
-} def
-/XI
-{
- Adobe_ColorImage_AI6_Vars begin
- gsave
- /XIType exch def
- cvi dup
- 256 idiv /XICompression exch store
- 256 mod /XIEncoding exch store
- pop pop
- /XIChannelCount exch def
- /XIBitsPerPixel exch def
- /XIImageHeight exch def
- /XIImageWidth exch def
- pop pop pop pop
- /XIImageMatrix exch def
- XIBitsPerPixel 1 eq {
- XIImageWidth 8 div ceiling cvi
- }{
- XIImageWidth XIChannelCount mul
- } ifelse
- /XIRowBytes exch def
- XIEnable {
- /XIBuffer3 XIImageWidth string def
- XICompression 0 eq {
- /XIBuffer1 XIRowBytes string def
- XIEncoding 0 eq {
- {currentfile XIBuffer1 readhexstring pop}
- }{
- {currentfile XIBuffer1 readstring pop}
- } ifelse
- }{
- /XIBuffer1 256 string def
- /XIBuffer2 XIRowBytes string def
- {currentfile XIBuffer1 readline pop (%) anchorsearch {pop} if}
- /ASCII85Decode filter /DCTDecode filter
- /XIFile exch def
- {XIFile XIBuffer2 readstring pop}
- } ifelse
- /XIDataProc exch def
-
- XIType 1 ne {
- 0 setgray
- } if
- XIType 1 eq {
- XIImageMask
- }{
- XIType 2 eq XIType 3 eq or {
- XIImageTint
- }{
- XIImage
- } ifelse
- } ifelse
- }{
- XINullImage
- } ifelse
- /XIPlateList false def
- grestore
- end
-} def
-end
-%%EndProcSet
-%%BeginResource: procset Adobe_Illustrator_AI5 1.3 0
-%%Title: (Adobe Illustrator (R) Version 8.0 Full Prolog)
-%%Version: 1.3 0
-%%CreationDate: (3/7/1994) ()
-%%Copyright: ((C) 1987-1998 Adobe Systems Incorporated All Rights Reserved)
-currentpacking true setpacking
-userdict /Adobe_Illustrator_AI5_vars 112 dict dup begin
-put
-/_?cmyk false def
-/_eo false def
-/_lp /none def
-/_pf
-{
-} def
-/_ps
-{
-} def
-/_psf
-{
-} def
-/_pss
-{
-} def
-/_pjsf
-{
-} def
-/_pjss
-{
-} def
-/_pola 0 def
-/_doClip 0 def
-/cf currentflat def
-/_lineorientation 0 def
-/_charorientation 0 def
-/_yokoorientation 0 def
-/_tm matrix def
-/_renderStart
-[
-/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0
-] def
-/_renderEnd
-[
-null null null null /i1 /i1 /i1 /i1
-] def
-/_render -1 def
-/_shift [0 0] def
-/_ax 0 def
-/_ay 0 def
-/_cx 0 def
-/_cy 0 def
-/_leading
-[
-0 0
-] def
-/_ctm matrix def
-/_mtx matrix def
-/_sp 16#020 def
-/_hyphen (-) def
-/_fontSize 0 def
-/_fontAscent 0 def
-/_fontDescent 0 def
-/_fontHeight 0 def
-/_fontRotateAdjust 0 def
-/Ss 256 string def
-Ss 0 (fonts/) putinterval
-/_cnt 0 def
-/_scale [1 1] def
-/_nativeEncoding 0 def
-/_useNativeEncoding 0 def
-/_tempEncode 0 def
-/_pntr 0 def
-/_tDict 2 dict def
-/_hfname 100 string def
-/_hffound false def
-/Tx
-{
-} def
-/Tj
-{
-} def
-/CRender
-{
-} def
-/_AI3_savepage
-{
-} def
-/_gf null def
-/_cf 4 array def
-/_rgbf 3 array def
-/_if null def
-/_of false def
-/_fc
-{
-} def
-/_gs null def
-/_cs 4 array def
-/_rgbs 3 array def
-/_is null def
-/_os false def
-/_sc
-{
-} def
-/_pd 1 dict def
-/_ed 15 dict def
-/_pm matrix def
-/_fm null def
-/_fd null def
-/_fdd null def
-/_sm null def
-/_sd null def
-/_sdd null def
-/_i null def
-/_lobyte 0 def
-/_hibyte 0 def
-/_cproc null def
-/_cscript 0 def
-/_hvax 0 def
-/_hvay 0 def
-/_hvwb 0 def
-/_hvcx 0 def
-/_hvcy 0 def
-/_bitfont null def
-/_bitlobyte 0 def
-/_bithibyte 0 def
-/_bitkey null def
-/_bitdata null def
-/_bitindex 0 def
-/discardSave null def
-/buffer 256 string def
-/beginString null def
-/endString null def
-/endStringLength null def
-/layerCnt 1 def
-/layerCount 1 def
-/perCent (%) 0 get def
-/perCentSeen? false def
-/newBuff null def
-/newBuffButFirst null def
-/newBuffLast null def
-/clipForward? false def
-end
-userdict /Adobe_Illustrator_AI5 known not {
- userdict /Adobe_Illustrator_AI5 100 dict put
-} if
-userdict /Adobe_Illustrator_AI5 get begin
-/initialize
-{
- Adobe_Illustrator_AI5 dup begin
- Adobe_Illustrator_AI5_vars begin
- /_aicmykps where {pop /_?cmyk _aicmykps def}if
- discardDict
- {
- bind pop pop
- } forall
- dup /nc get begin
- {
- dup xcheck 1 index type /operatortype ne and
- {
- bind
- } if
- pop pop
- } forall
- end
- newpath
-} def
-/terminate
-{
- end
- end
-} def
-/_
-null def
-/ddef
-{
- Adobe_Illustrator_AI5_vars 3 1 roll put
-} def
-/xput
-{
- dup load dup length exch maxlength eq
- {
- dup dup load dup
- length 2 mul dict copy def
- } if
- load begin
- def
- end
-} def
-/npop
-{
- {
- pop
- } repeat
-} def
-/hswj
-{
- dup stringwidth 3 2 roll
- {
- _hvwb eq { exch _hvcx add exch _hvcy add } if
- exch _hvax add exch _hvay add
- } cforall
-} def
-/vswj
-{
- 0 0 3 -1 roll
- {
- dup 255 le
- _charorientation 1 eq
- and
- {
- dup cstring stringwidth 5 2 roll
- _hvwb eq { exch _hvcy sub exch _hvcx sub } if
- exch _hvay sub exch _hvax sub
- 4 -1 roll sub exch
- 3 -1 roll sub exch
- }
- {
- _hvwb eq { exch _hvcy sub exch _hvcx sub } if
- exch _hvay sub exch _hvax sub
- _fontHeight sub
- } ifelse
- } cforall
-} def
-/swj
-{
- 6 1 roll
- /_hvay exch ddef
- /_hvax exch ddef
- /_hvwb exch ddef
- /_hvcy exch ddef
- /_hvcx exch ddef
- _lineorientation 0 eq { hswj } { vswj } ifelse
-} def
-/sw
-{
- 0 0 0 6 3 roll swj
-} def
-/vjss
-{
- 4 1 roll
- {
- dup cstring
- dup length 1 eq
- _charorientation 1 eq
- and
- {
- -90 rotate
- currentpoint
- _fontRotateAdjust add
- moveto
- gsave
- false charpath currentpoint
- 5 index setmatrix stroke
- grestore
- _fontRotateAdjust sub
- moveto
- _sp eq
- {
- 5 index 5 index rmoveto
- } if
- 2 copy rmoveto
- 90 rotate
- }
- {
- currentpoint
- _fontHeight sub
- 5 index sub
- 3 index _sp eq
- {
- 9 index sub
- } if
-
- currentpoint
- exch 4 index stringwidth pop 2 div sub
- exch _fontAscent sub
- moveto
-
- gsave
- 2 index false charpath
- 6 index setmatrix stroke
- grestore
-
- moveto pop pop
- } ifelse
- } cforall
- 6 npop
-} def
-/hjss
-{
- 4 1 roll
- {
- dup cstring
- gsave
- false charpath currentpoint
- 5 index setmatrix stroke
- grestore
- moveto
- _sp eq
- {
- 5 index 5 index rmoveto
- } if
- 2 copy rmoveto
- } cforall
- 6 npop
-} def
-/jss
-{
- _lineorientation 0 eq { hjss } { vjss } ifelse
-} def
-/ss
-{
- 0 0 0 7 3 roll jss
-} def
-/vjsp
-{
- 4 1 roll
- {
- dup cstring
- dup length 1 eq
- _charorientation 1 eq
- and
- {
- -90 rotate
- currentpoint
- _fontRotateAdjust add
- moveto
- false charpath
- currentpoint
- _fontRotateAdjust sub
- moveto
- _sp eq
- {
- 5 index 5 index rmoveto
- } if
- 2 copy rmoveto
- 90 rotate
- }
- {
- currentpoint
- _fontHeight sub
- 5 index sub
- 3 index _sp eq
- {
- 9 index sub
- } if
-
- currentpoint
- exch 4 index stringwidth pop 2 div sub
- exch _fontAscent sub
- moveto
-
- 2 index false charpath
-
- moveto pop pop
- } ifelse
- } cforall
- 6 npop
-} def
-/hjsp
-{
- 4 1 roll
- {
- dup cstring
- false charpath
- _sp eq
- {
- 5 index 5 index rmoveto
- } if
- 2 copy rmoveto
- } cforall
- 6 npop
-} def
-/jsp
-{
- matrix currentmatrix
- _lineorientation 0 eq {hjsp} {vjsp} ifelse
-} def
-/sp
-{
- matrix currentmatrix
- 0 0 0 7 3 roll
- _lineorientation 0 eq {hjsp} {vjsp} ifelse
-} def
-/pl
-{
- transform
- 0.25 sub round 0.25 add exch
- 0.25 sub round 0.25 add exch
- itransform
-} def
-/setstrokeadjust where
-{
- pop true setstrokeadjust
- /c
- {
- curveto
- } def
- /C
- /c load def
- /v
- {
- currentpoint 6 2 roll curveto
- } def
- /V
- /v load def
- /y
- {
- 2 copy curveto
- } def
- /Y
- /y load def
- /l
- {
- lineto
- } def
- /L
- /l load def
- /m
- {
- moveto
- } def
-}
-{
- /c
- {
- pl curveto
- } def
- /C
- /c load def
- /v
- {
- currentpoint 6 2 roll pl curveto
- } def
- /V
- /v load def
- /y
- {
- pl 2 copy curveto
- } def
- /Y
- /y load def
- /l
- {
- pl lineto
- } def
- /L
- /l load def
- /m
- {
- pl moveto
- } def
-} ifelse
-/d
-{
- setdash
-} def
-/cf
-{
-} def
-/i
-{
- dup 0 eq
- {
- pop cf
- } if
- setflat
-} def
-/j
-{
- setlinejoin
-} def
-/J
-{
- setlinecap
-} def
-/M
-{
- setmiterlimit
-} def
-/w
-{
- setlinewidth
-} def
-/XR
-{
- 0 ne
- /_eo exch ddef
-} def
-/H
-{
-} def
-/h
-{
- closepath
-} def
-/N
-{
- _pola 0 eq
- {
- _doClip 1 eq
- {
- _eo {eoclip} {clip} ifelse /_doClip 0 ddef
- } if
- newpath
- }
- {
- /CRender
- {
- N
- } ddef
- } ifelse
-} def
-/n
-{
- N
-} def
-/F
-{
- _pola 0 eq
- {
- _doClip 1 eq
- {
- gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc
- /_doClip 0 ddef
- }
- {
- _pf
- } ifelse
- }
- {
- /CRender
- {
- F
- } ddef
- } ifelse
-} def
-/f
-{
- closepath
- F
-} def
-/S
-{
- _pola 0 eq
- {
- _doClip 1 eq
- {
- gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc
- /_doClip 0 ddef
- }
- {
- _ps
- } ifelse
- }
- {
- /CRender
- {
- S
- } ddef
- } ifelse
-} def
-/s
-{
- closepath
- S
-} def
-/B
-{
- _pola 0 eq
- {
- _doClip 1 eq
- gsave F grestore
- {
- gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc
- /_doClip 0 ddef
- }
- {
- S
- } ifelse
- }
- {
- /CRender
- {
- B
- } ddef
- } ifelse
-} def
-/b
-{
- closepath
- B
-} def
-/W
-{
- /_doClip 1 ddef
-} def
-/*
-{
- count 0 ne
- {
- dup type /stringtype eq
- {
- pop
- } if
- } if
- newpath
-} def
-/u
-{
-} def
-/U
-{
-} def
-/q
-{
- _pola 0 eq
- {
- gsave
- } if
-} def
-/Q
-{
- _pola 0 eq
- {
- grestore
- } if
-} def
-/*u
-{
- _pola 1 add /_pola exch ddef
-} def
-/*U
-{
- _pola 1 sub /_pola exch ddef
- _pola 0 eq
- {
- CRender
- } if
-} def
-/D
-{
- pop
-} def
-/*w
-{
-} def
-/*W
-{
-} def
-/`
-{
- /_i save ddef
- clipForward?
- {
- nulldevice
- } if
- 6 1 roll 4 npop
- concat pop
- userdict begin
- /showpage
- {
- } def
- 0 setgray
- 0 setlinecap
- 1 setlinewidth
- 0 setlinejoin
- 10 setmiterlimit
- [] 0 setdash
- /setstrokeadjust where {pop false setstrokeadjust} if
- newpath
- 0 setgray
- false setoverprint
-} def
-/~
-{
- end
- _i restore
-} def
-/_rgbtocmyk
-{
- 3
- {
- 1 exch sub 3 1 roll
- } repeat
- 3 copy 1 4 1 roll
- 3
- {
- 3 index 2 copy gt
- {
- exch
- } if
- pop 4 1 roll
- } repeat
- pop pop pop
- 4 1 roll
- 3
- {
- 3 index sub
- 3 1 roll
- } repeat
- 4 -1 roll
-} def
-/setrgbfill
-{
- _rgbf astore pop
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _rgbf aload pop setrgbcolor
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/setrgbstroke
-{
- _rgbs astore pop
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _rgbs aload pop setrgbcolor
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/O
-{
- 0 ne
- /_of exch ddef
- /_lp /none ddef
-} def
-/R
-{
- 0 ne
- /_os exch ddef
- /_lp /none ddef
-} def
-/g
-{
- /_gf exch ddef
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _gf setgray
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/G
-{
- /_gs exch ddef
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _gs setgray
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/k
-{
- _cf astore pop
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _cf aload pop setcmykcolor
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/K
-{
- _cs astore pop
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _cs aload pop setcmykcolor
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/Xa
-{
- _?cmyk {
- 3 npop k
- }{
- setrgbfill 4 npop
- } ifelse
-} def
-/XA
-{
- _?cmyk {
- 3 npop K
- }{
- setrgbstroke 4 npop
- } ifelse
-} def
-/Xs
-{
- /_gf exch ddef
- 5 npop
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _gf setAIseparationgray
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/XS
-{
- /_gs exch ddef
- 5 npop
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _gs setAIseparationgray
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/Xx
-{
- exch
- /_gf exch ddef
- 0 eq {
- findcmykcustomcolor
- }{
- _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse
- {
- 4 1 roll 3 npop
- findcmykcustomcolor
- }{
- 8 -4 roll 4 npop
- findrgbcustomcolor
- } ifelse
- } ifelse
- /_if exch ddef
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _if _gf 1 exch sub setcustomcolor
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/XX
-{
- exch
- /_gs exch ddef
- 0 eq {
- findcmykcustomcolor
- }{
- _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse
- {
- 4 1 roll 3 npop
- findcmykcustomcolor
- }{
- 8 -4 roll 4 npop
- findrgbcustomcolor
- } ifelse
- } ifelse
- /_is exch ddef
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _is _gs 1 exch sub setcustomcolor
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/x
-{
- /_gf exch ddef
- findcmykcustomcolor
- /_if exch ddef
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _if _gf 1 exch sub setcustomcolor
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/X
-{
- /_gs exch ddef
- findcmykcustomcolor
- /_is exch ddef
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _is _gs 1 exch sub setcustomcolor
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/XK
-{
- 3 -1 roll pop
- 0 eq
- {
- 1 exch sub
- 3 {dup 3 1 roll mul 5 1 roll} repeat
- mul 4 1 roll
- K
- }
- {
- 1 exch sub 4 1 roll
- 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat
- 4 -1 roll pop
- XA
- } ifelse
-} def
-/Xk
-{
- 3 -1 roll pop
- 0 eq
- {
- 1 exch sub
- 3 {dup 3 1 roll mul 5 1 roll} repeat
- mul 4 1 roll
- k
- }
- {
- 1 exch sub 4 1 roll
- 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat
- 4 -1 roll pop
- Xa
- } ifelse
-} def
-/A
-{
- pop
-} def
-/annotatepage
-{
-userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse
-} def
-/XT {
- pop pop
-} def
-/Xt {
- pop
-} def
-/discard
-{
- save /discardSave exch store
- discardDict begin
- /endString exch store
- gt38?
- {
- 2 add
- } if
- load
- stopped
- pop
- end
- discardSave restore
-} bind def
-userdict /discardDict 7 dict dup begin
-put
-/pre38Initialize
-{
- /endStringLength endString length store
- /newBuff buffer 0 endStringLength getinterval store
- /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store
- /newBuffLast newBuff endStringLength 1 sub 1 getinterval store
-} def
-/shiftBuffer
-{
- newBuff 0 newBuffButFirst putinterval
- newBuffLast 0
- currentfile read not
- {
- stop
- } if
- put
-} def
-0
-{
- pre38Initialize
- mark
- currentfile newBuff readstring exch pop
- {
- {
- newBuff endString eq
- {
- cleartomark stop
- } if
- shiftBuffer
- } loop
- }
- {
- stop
- } ifelse
-} def
-1
-{
- pre38Initialize
- /beginString exch store
- mark
- currentfile newBuff readstring exch pop
- {
- {
- newBuff beginString eq
- {
- /layerCount dup load 1 add store
- }
- {
- newBuff endString eq
- {
- /layerCount dup load 1 sub store
- layerCount 0 eq
- {
- cleartomark stop
- } if
- } if
- } ifelse
- shiftBuffer
- } loop
- } if
-} def
-2
-{
- mark
- {
- currentfile buffer {readline} stopped {
- % assume error was due to overfilling the buffer
- }{
- not
- {
- stop
- } if
- endString eq {
- cleartomark stop
- } if
- }ifelse
- } loop
-} def
-3
-{
- /beginString exch store
- /layerCnt 1 store
- mark
- {
- currentfile buffer {readline} stopped {
- % assume error was due to overfilling the buffer
- }{
- not
- {
- stop
- } if
- dup beginString eq
- {
- pop /layerCnt dup load 1 add store
- }
- {
- endString eq
- {
- layerCnt 1 eq
- {
- cleartomark stop
- }
- {
- /layerCnt dup load 1 sub store
- } ifelse
- } if
- } ifelse
- }ifelse
- } loop
-} def
-end
-userdict /clipRenderOff 15 dict dup begin
-put
-{
- /n /N /s /S /f /F /b /B
-}
-{
- {
- _doClip 1 eq
- {
- /_doClip 0 ddef _eo {eoclip} {clip} ifelse
- } if
- newpath
- } def
-} forall
-/Tr /pop load def
-/Bb {} def
-/BB /pop load def
-/Bg {12 npop} def
-/Bm {6 npop} def
-/Bc /Bm load def
-/Bh {4 npop} def
-end
-/Lb
-{
- 6 npop
- 7 2 roll
- 5 npop
- 0 eq
- {
- 0 eq
- {
- (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard
- }
- {
-
- /clipForward? true def
-
- /Tx /pop load def
- /Tj /pop load def
-
- currentdict end clipRenderOff begin begin
- } ifelse
- }
- {
- 0 eq
- {
- save /discardSave exch store
- } if
- } ifelse
-} bind def
-/LB
-{
- discardSave dup null ne
- {
- restore
- }
- {
- pop
- clipForward?
- {
- currentdict
- end
- end
- begin
-
- /clipForward? false ddef
- } if
- } ifelse
-} bind def
-/Pb
-{
- pop pop
- 0 (%AI5_EndPalette) discard
-} bind def
-/Np
-{
- 0 (%AI5_End_NonPrinting--) discard
-} bind def
-/Ln /pop load def
-/Ap
-/pop load def
-/Ar
-{
- 72 exch div
- 0 dtransform dup mul exch dup mul add sqrt
- dup 1 lt
- {
- pop 1
- } if
- setflat
-} def
-/Mb
-{
- q
-} def
-/Md
-{
-} def
-/MB
-{
- Q
-} def
-/nc 4 dict def
-nc begin
-/setgray
-{
- pop
-} bind def
-/setcmykcolor
-{
- 4 npop
-} bind def
-/setrgbcolor
-{
- 3 npop
-} bind def
-/setcustomcolor
-{
- 2 npop
-} bind def
-currentdict readonly pop
-end
-/XP
-{
- 4 npop
-} bind def
-/XD
-{
- pop
-} bind def
-end
-setpacking
-%%EndResource
-%%BeginResource: procset Adobe_cshow 2.0 8
-%%Title: (Writing System Operators)
-%%Version: 2.0 8
-%%CreationDate: (1/23/89) ()
-%%Copyright: ((C) 1992-1996 Adobe Systems Incorporated All Rights Reserved)
-currentpacking true setpacking
-userdict /Adobe_cshow 14 dict dup begin put
-/initialize
-{
- Adobe_cshow begin
- Adobe_cshow
- {
- dup xcheck
- {
- bind
- } if
- pop pop
- } forall
- end
- Adobe_cshow begin
-} def
-/terminate
-{
-currentdict Adobe_cshow eq
- {
- end
- } if
-} def
-/cforall
-{
- /_lobyte 0 ddef
- /_hibyte 0 ddef
- /_cproc exch ddef
- /_cscript currentfont /FontScript known { currentfont /FontScript get } { -1 } ifelse ddef
- {
- /_lobyte exch ddef
- _hibyte 0 eq
- _cscript 1 eq
- _lobyte 129 ge _lobyte 159 le and
- _lobyte 224 ge _lobyte 252 le and or and
- _cscript 2 eq
- _lobyte 161 ge _lobyte 254 le and and
- _cscript 3 eq
- _lobyte 161 ge _lobyte 254 le and and
- _cscript 25 eq
- _lobyte 161 ge _lobyte 254 le and and
- _cscript -1 eq
- or or or or and
- {
- /_hibyte _lobyte ddef
- }
- {
- _hibyte 256 mul _lobyte add
- _cproc
- /_hibyte 0 ddef
- } ifelse
- } forall
-} def
-/cstring
-{
- dup 256 lt
- {
- (s) dup 0 4 3 roll put
- }
- {
- dup 256 idiv exch 256 mod
- (hl) dup dup 0 6 5 roll put 1 4 3 roll put
- } ifelse
-} def
-/clength
-{
- 0 exch
- { 256 lt { 1 } { 2 } ifelse add } cforall
-} def
-/hawidthshow
-{
- {
- dup cstring
- show
- _hvax _hvay rmoveto
- _hvwb eq { _hvcx _hvcy rmoveto } if
- } cforall
-} def
-/vawidthshow
-{
- {
- dup 255 le
- _charorientation 1 eq
- and
- {
- -90 rotate
- 0 _fontRotateAdjust rmoveto
- cstring
- _hvcx _hvcy _hvwb _hvax _hvay 6 -1 roll awidthshow
- 0 _fontRotateAdjust neg rmoveto
- 90 rotate
- }
- {
- currentpoint
- _fontHeight sub
- exch _hvay sub exch _hvax sub
- 2 index _hvwb eq { exch _hvcy sub exch _hvcx sub } if
- 3 2 roll
- cstring
- dup stringwidth pop 2 div neg _fontAscent neg rmoveto
- show
- moveto
- } ifelse
- } cforall
-} def
-/hvawidthshow
-{
- 6 1 roll
- /_hvay exch ddef
- /_hvax exch ddef
- /_hvwb exch ddef
- /_hvcy exch ddef
- /_hvcx exch ddef
- _lineorientation 0 eq { hawidthshow } { vawidthshow } ifelse
-} def
-/hvwidthshow
-{
- 0 0 3 -1 roll hvawidthshow
-} def
-/hvashow
-{
- 0 0 0 6 -3 roll hvawidthshow
-} def
-/hvshow
-{
- 0 0 0 0 0 6 -1 roll hvawidthshow
-} def
-currentdict readonly pop end
-setpacking
-%%EndResource
-%%BeginResource: procset Adobe_shading_AI8 1.0 0
-%%Title: (Adobe Illustrator 8 Shading Procset)
-%%Version: 1.0 0
-%%CreationDate: (12/17/97) ()
-%%Copyright: ((C) 1987-1997 Adobe Systems Incorporated All Rights Reserved)
-userdict /defaultpacking currentpacking put true setpacking
-userdict /Adobe_shading_AI8 10 dict dup begin put
-/initialize {
- Adobe_shading_AI8 begin
- Adobe_shading_AI8 bdprocs
- Mesh /initialize get exec
-} def
-/terminate {
- currentdict Adobe_shading_AI8 eq {
- end
- } if
-} def
-/bdprocs {
- {
- dup xcheck 1 index type /arraytype eq and {
- bind
- } if
- pop pop
- } forall
-} def
-/X! {pop} def
-/X# {pop pop} def
-/Mesh 40 dict def
-Mesh begin
-/initialize {
- Mesh bdprocs
- Mesh begin
- /emulate? /AI8MeshEmulation where {
- pop AI8MeshEmulation
- }{
- systemdict /shfill known not
- } ifelse def
- end
-} def
-/bd {
- shadingdict begin
-} def
-/paint {
- emulate? {
- end
- }{
- /_lp /none ddef _fc /_lp /none ddef
-
- /AIColorSpace AIColorSpace tocolorspace store
- /ColorSpace AIColorSpace topsspace store
-
- version_ge_3010.106 not systemdict /setsmoothness known and {
- 0.0001 setsmoothness
- } if
-
- composite? {
- /DataSource getdatasrc def
- Matrix concat
- currentdict end
- shfill
- }{
- AIColorSpace makesmarks AIPlateList markingplate and not isoverprint and {
- end
- }{
- /ColorSpace /DeviceGray store
- /Decode [0 1 0 1 0 1] store
- /DataSource getplatesrc def
- Matrix concat
- currentdict end
- shfill
- } ifelse
- } ifelse
- } ifelse
-} def
-/shadingdict 12 dict def
-shadingdict begin
- /ShadingType 6 def
- /BitsPerCoordinate 16 def
- /BitsPerComponent 8 def
- /BitsPerFlag 8 def
-end
-/datafile null def
-/databuf 256 string def
-/dataptr 0 def
-/srcspace null def
-/srcchannels 0 def
-/dstchannels 0 def
-/dstplate 0 def
-/srctodstcolor null def
-/getplatesrc {
- /srcspace AIColorSpace store
- /srcchannels AIColorSpace getnchannels store
- /dstchannels 1 store
- /dstplate getplateindex store
- /srctodstcolor srcspace makesmarks {
- dstplate 4 eq {
- {1 exch sub}
- }{
- {srcspace tocmyk 3 dstplate sub index 1 exch sub 5 1 roll 4 {pop} repeat}
- } ifelse
- }{
- {srcchannels {pop} repeat 1}
- } ifelse store
- /datafile getdatasrc store
- /rdpatch168 load DataLength () /SubFileDecode filter
-} def
-/getdatasrc {
- /rdcmntline load /ASCII85Decode filter
-} def
-/rdpatch168 {
- /dataptr 0 store
- 49 rdcount
- 4 {
- dup {pop srcchannels getint8} if
- dup {pop srctodstcolor dstchannels putint8 true} if
- } repeat
- {databuf 0 dataptr getinterval}{()} ifelse
-} def
-/rdpatch3216 {
- /dataptr 0 store
- 97 rdcount
- 4 {
- dup {pop srcchannels getint16} if
- dup {pop srctodstcolor dstchannels putint16 true} if
- } repeat
- {databuf 0 dataptr getinterval}{()} ifelse
-} def
-/rdcount {
- dup 0 gt {
- datafile databuf dataptr 4 -1 roll getinterval readstring
- exch length dataptr add /dataptr exch store
- }{
- true
- } ifelse
-} def
-/getint8 {
- mark true 3 -1 roll
- {
- dup {pop datafile read} if
- dup {pop 255 div true} if
- } repeat
- {
- counttomark 1 add -1 roll pop true
- }{
- cleartomark false
- } ifelse
-} def
-/putint8 {
- dup dataptr add /dataptr exch store
- dataptr exch
- {
- 1 sub exch
- 255 mul cvi
- databuf 2 index
- 3 -1 roll put
- } repeat
- pop
-} def
-/getint16 {
- mark true 3 -1 roll
- {
- dup {pop datafile read} if
- dup {pop 256 mul datafile read} if
- dup {pop add 65535 div true} if
- } repeat
- {
- counttomark 1 add -1 roll pop true
- }{
- cleartomark false
- } ifelse
-} def
-/putint16 {
- dup 2 mul dataptr add /dataptr exch store
- dataptr exch
- {
- 2 sub exch
- 65535 mul cvi dup
- 256 idiv databuf 3 index 3 -1 roll put
- 256 mod databuf 2 index 1 add 3 -1 roll put
- } repeat
- pop
-} def
-/srcbuf 256 string def
-/rdcmntline {
- currentfile srcbuf readline pop
- (%) anchorsearch {pop} if
-} def
-/getplateindex {
- 0 [cyan? magenta? yellow? black? customColor?] {{exit} if 1 add} forall
-} def
-/aicsarray 4 array def
-/aicsaltvals 4 array def
-/aicsaltcolr aicsaltvals def
-/tocolorspace {
- dup type /arraytype eq {
- mark exch aload pop
- aicsarray 0 3 -1 roll put
- aicsarray 1 3 -1 roll put
- dup aicsarray 2 3 -1 roll put
- gettintxform aicsarray 3 3 -1 roll put
- counttomark aicsaltvals 0 3 -1 roll getinterval /aicsaltcolr exch store
- aicsaltcolr astore pop pop
- aicsarray
- } if
-} def
-/subtintxform {aicsaltcolr {1 index mul exch} forall pop} def
-/addtintxform {aicsaltcolr {1 sub 1 index mul 1 add exch} forall pop} def
-/gettintxform {
- /DeviceRGB eq {/addtintxform}{/subtintxform} ifelse load
-} def
-/getnchannels {
- dup type /arraytype eq {0 get} if
- colorspacedict exch get begin Channels end
-} def
-/makesmarks {
- composite? {
- pop true
- }{
- dup dup type /arraytype eq {0 get} if
- colorspacedict exch get begin MarksPlate end
- } ifelse
-} def
-/markingplate {
- composite? {
- pop true
- }{
- dup type /arraytype eq {
- dup length getplateindex gt {getplateindex get}{pop false} ifelse
- } if
- } ifelse
-} def
-/tocmyk {
- dup dup type /arraytype eq {0 get} if
- colorspacedict exch get begin ToCMYK end
-} def
-/topsspace {
- dup dup type /arraytype eq {0 get} if
- colorspacedict exch get begin ToPSSpace end
-} def
-/colorspacedict 5 dict dup begin
- /DeviceGray 4 dict dup begin
- /Channels 1 def
- /MarksPlate {pop black?} def
- /ToCMYK {pop 1 exch sub 0 0 0 4 -1 roll} def
- /ToPSSpace {} def
- end def
- /DeviceRGB 4 dict dup begin
- /Channels 3 def
- /MarksPlate {pop isCMYKSep?} def
- /ToCMYK {pop _rgbtocmyk} def
- /ToPSSpace {} def
- end def
- /DeviceCMYK 4 dict dup begin
- /Channels 4 def
- /MarksPlate {pop isCMYKSep?} def
- /ToCMYK {pop} def
- /ToPSSpace {} def
- end def
- /Separation 4 dict dup begin
- /Channels 1 def
- /MarksPlate {
- /findcmykcustomcolor where {
- pop dup 1 exch ToCMYK 5 -1 roll 1 get
- findcmykcustomcolor 1 setcustomcolor
- systemdict /currentgray get exec
- 1 ne
- }{
- pop false
- } ifelse
- } def
- /ToCMYK {
- dup 2 get mark exch 4 2 roll
- 3 get exec
- counttomark -1 roll tocmyk
- 5 -1 roll pop
- } def
- /ToPSSpace {} def
- end def
- /Process 4 dict dup begin
- /Channels 1 def
- /MarksPlate {
- isCMYKSep? {
- 1 exch ToCMYK 4 array astore getplateindex get 0 ne
- }{
- pop false
- } ifelse
- } def
- /ToCMYK {
- dup 2 get mark exch 4 2 roll
- 3 get exec
- counttomark -1 roll tocmyk
- 5 -1 roll pop
- } def
- /ToPSSpace {
- 4 array copy dup 0 /Separation put
- } def
- end def
-end def
-/isoverprint {
- /currentoverprint where {pop currentoverprint}{_of} ifelse
-} def
-/version_ge_3010.106 {
- version {cvr} stopped {
- pop
- false
- }{
- 3010.106 ge
- } ifelse
-} def
-end
-end
-defaultpacking setpacking
-%%EndResource
-%%EndProlog
-%%BeginSetup
-%%IncludeFont: Helvetica
-userdict /_useSmoothShade false put
-userdict /_aicmykps true put
-userdict /_forceToCMYK true put
-Adobe_level2_AI5 /initialize get exec
-Adobe_cshow /initialize get exec
-Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 Adobe_typography_AI5 /initialize get exec
-Adobe_ColorImage_AI6 /initialize get exec
-Adobe_shading_AI8 /initialize get exec
-Adobe_Illustrator_AI5 /initialize get exec
-[
-39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis
-/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute
-/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde
-/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex
-/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
-/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash
-/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef
-/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash
-/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef
-/guillemotleft/guillemotright/ellipsis/space/Agrave/Atilde/Otilde/OE/oe
-/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide
-/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright
-/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand
-/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex
-/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex
-/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla
-/hungarumlaut/ogonek/caron
-TE
-%AI55J_Tsume: None
-%AI3_BeginEncoding: _Helvetica Helvetica
-[/_Helvetica/Helvetica 0 0 1 TZ
-%AI3_EndEncoding AdobeType
-[161/degree 173/notequal 176/infinity/plusminus/lessequal/greaterequal
-181/mu/partialdiff/summation/product/pi/integral 189/Omega
-195/radical 197/approxequal 198/Delta 214/divide/lozenge 240/apple
-/_Symbol_/Symbol 0 0 0 TZ
-%AI5_Begin_NonPrinting
-Np
-%AI3_BeginPattern: (bi-direction diagonals)
-(bi-direction diagonals) 24.2119 0.2119 96.2124 72.2119 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-2 J 2 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-8.2119 6.2119 m
-14.2119 0.2119 L
-F
-8.2119 0.2119 m
-14.2119 6.2119 L
-F
-%AI6_EndPatternLayer
-) &
-(0 O 0 R 0 0 0 1 k
- 0 0 0 1 K
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-2 J 2 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-24.2119 72.2119 m
-96.2124 0.2119 L
-S
-21.2109 69.2129 m
-90.2124 0.2119 L
-S
-21.207 63.2168 m
-84.2124 0.2119 L
-S
-21.2031 57.2207 m
-78.2124 0.2119 L
-S
-21.1987 51.2246 m
-72.2124 0.2119 L
-S
-21.1958 45.2275 m
-66.2119 0.2119 L
-S
-21.1919 39.2314 m
-60.2119 0.2119 L
-S
-21.188 33.2363 m
-54.2119 0.2119 L
-S
-21.1851 27.2402 m
-48.2119 0.2119 L
-S
-21.1812 21.2432 m
-42.2119 0.2119 L
-S
-21.1768 15.2471 m
-36.2119 0.2119 L
-S
-21.1729 9.251 m
-30.2119 0.2119 L
-S
-21.1699 3.2549 m
-24.2119 0.2119 L
-S
-30.2119 72.2119 m
-99.2134 3.21 L
-S
-36.2119 72.2119 m
-99.2173 9.2061 L
-S
-42.2119 72.2119 m
-99.2212 15.2021 L
-S
-48.2119 72.2119 m
-99.2251 21.1992 L
-S
-54.2119 72.2119 m
-99.228 27.1953 L
-S
-60.2119 72.2119 m
-99.2319 33.1904 L
-S
-66.2119 72.2119 m
-99.2358 39.1865 L
-S
-72.2124 72.2119 m
-99.2397 45.1836 L
-S
-78.2124 72.2119 m
-99.2427 51.1797 L
-S
-84.2124 72.2119 m
-99.2466 57.1758 L
-S
-90.2124 72.2119 m
-99.2505 63.1719 L
-S
-96.2124 72.2119 m
-99.2554 69.1689 L
-S
-0.2119 68.7119 m
-10.2119 58.7119 L
-S
-96.2124 72.2119 m
-24.2119 0.2119 L
-S
-90.2124 72.2119 m
-21.2109 3.21 L
-S
-84.2124 72.2119 m
-21.207 9.2061 L
-S
-78.2124 72.2119 m
-21.2031 15.2021 L
-S
-72.2124 72.2119 m
-21.1987 21.1982 L
-S
-66.2119 72.2119 m
-21.1958 27.1953 L
-S
-60.2119 72.2119 m
-21.1919 33.1904 L
-S
-54.2119 72.2119 m
-21.188 39.1865 L
-S
-48.2119 72.2119 m
-21.1851 45.1826 L
-S
-42.2119 72.2119 m
-21.1812 51.1797 L
-S
-36.2119 72.2119 m
-21.1768 57.1758 L
-S
-30.2119 72.2119 m
-21.1729 63.1719 L
-S
-24.2119 72.2119 m
-21.1699 69.168 L
-S
-99.2134 69.2129 m
-30.2119 0.2119 L
-S
-99.2173 63.2168 m
-36.2119 0.2119 L
-S
-99.2212 57.2207 m
-42.2119 0.2119 L
-S
-99.2251 51.2246 m
-48.2119 0.2119 L
-S
-99.228 45.2275 m
-54.2119 0.2119 L
-S
-99.2319 39.2314 m
-60.2119 0.2119 L
-S
-99.2358 33.2363 m
-66.2119 0.2119 L
-S
-99.2397 27.2393 m
-72.2124 0.2119 L
-S
-99.2427 21.2432 m
-78.2124 0.2119 L
-S
-99.2466 15.2471 m
-84.2124 0.2119 L
-S
-99.2505 9.251 m
-90.2124 0.2119 L
-S
-99.2554 3.2539 m
-96.2124 0.2119 L
-S
-0.2119 58.7119 m
-10.2119 68.7119 L
-S
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI3_BeginPattern: (black dots)
-(black dots) 16 0.6885 88 72.6885 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-1 J 0 j 0.75 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-0 6.6885 m
-6 0.6885 L
-F
-0 0.6885 m
-6 6.6885 L
-F
-%AI6_EndPatternLayer
-) &
-(0 O 0 R 0 0 0 1 k
- 0 0 0 1 K
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-1 J 0 j 0.75 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-28.9365 3.1885 m
-28.9365 3.1885 l
-S
-17.125 3.375 m
-17.125 3.375 l
-S
-26.5 4.6885 m
-26.5 4.6885 l
-S
-35.6865 5.8135 m
-35.6865 5.8135 l
-S
-19.75 0.9385 m
-19.75 0.9385 l
-S
-23.125 7.3135 m
-23.125 7.3135 l
-S
-40.5615 2.4385 m
-40.5615 2.4385 l
-S
-43 1.125 m
-43 1.125 l
-S
-45.0615 5.4385 m
-45.0615 5.4385 l
-S
-56.875 6.375 m
-56.875 6.375 l
-S
-65.3115 5.0635 m
-65.3115 5.0635 l
-S
-51.0615 6.9385 m
-51.0615 6.9385 l
-S
-40.5615 6.9385 m
-40.5615 6.9385 l
-S
-31.1865 6.9385 m
-31.1865 6.9385 l
-S
-59.875 9.5635 m
-59.875 9.5635 l
-S
-62.6865 1.3135 m
-62.6865 1.3135 l
-S
-34.5615 0.9385 m
-34.5615 0.9385 l
-S
-48.4365 2.25 m
-48.4365 2.25 l
-S
-56.3115 0.75 m
-56.3115 0.75 l
-S
-66.625 24.5635 m
-66.625 24.5635 l
-S
-74.3115 24.9385 m
-74.3115 24.9385 l
-S
-78.8115 24.375 m
-78.8115 24.375 l
-S
-82.9365 2.0635 m
-82.9365 2.0635 l
-S
-68.3115 11.8135 m
-68.3115 11.8135 l
-S
-86.5 17.8135 m
-86.5 17.8135 l
-S
-87.0615 4.6885 m
-87.0615 4.6885 l
-S
-79.9365 19.875 m
-79.9365 19.875 l
-S
-77.875 1.125 m
-77.875 1.125 l
-S
-69.625 20.25 m
-69.625 20.25 l
-S
-67.75 6 m
-67.75 6 l
-S
-73.375 17.625 m
-73.375 17.625 l
-S
-76.9365 16.875 m
-76.9365 16.875 l
-S
-72.4365 3.375 m
-72.4365 3.375 l
-S
-77.3115 9.5635 m
-77.3115 9.5635 l
-S
-73.9365 11.25 m
-73.9365 11.25 l
-S
-83.125 7.875 m
-83.125 7.875 l
-S
-85.1865 12.75 m
-85.1865 12.75 l
-S
-81.0615 13.875 m
-81.0615 13.875 l
-S
-17.6865 16.125 m
-17.6865 16.125 l
-S
-45.25 10.3135 m
-45.25 10.3135 l
-S
-31.5615 21.375 m
-31.5615 21.375 l
-S
-20.875 11.8135 m
-20.875 11.8135 l
-S
-34.75 18.5635 m
-34.75 18.5635 l
-S
-25.75 21.9385 m
-25.75 21.9385 l
-S
-34.5615 24.5635 m
-34.5615 24.5635 l
-S
-37.375 16.3135 m
-37.375 16.3135 l
-S
-36.625 12.75 m
-36.625 12.75 l
-S
-23.125 17.25 m
-23.125 17.25 l
-S
-29.3115 12.375 m
-29.3115 12.375 l
-S
-31 15.75 m
-31 15.75 l
-S
-46.1865 22.875 m
-46.1865 22.875 l
-S
-52 15.375 m
-52 15.375 l
-S
-58.375 13.3135 m
-58.375 13.3135 l
-S
-62.6865 20.0635 m
-62.6865 20.0635 l
-S
-62.875 14.0635 m
-62.875 14.0635 l
-S
-44.6865 20.4385 m
-44.6865 20.4385 l
-S
-46.75 15.1885 m
-46.75 15.1885 l
-S
-42.0615 17.0635 m
-42.0615 17.0635 l
-S
-55.1865 17.4385 m
-55.1865 17.4385 l
-S
-58.9365 23.25 m
-58.9365 23.25 l
-S
-60.0615 17.4385 m
-60.0615 17.4385 l
-S
-42.4365 25.125 m
-42.4365 25.125 l
-S
-65.3115 20.625 m
-65.3115 20.625 l
-S
-51.625 24.5635 m
-51.625 24.5635 l
-S
-52 20.625 m
-52 20.625 l
-S
-18.8115 24 m
-18.8115 24 l
-S
-21.25 24.9385 m
-21.25 24.9385 l
-S
-19.375 70.875 m
-19.375 70.875 l
-S
-26.125 66.5635 m
-26.125 66.5635 l
-S
-20.125 66.375 m
-20.125 66.375 l
-S
-38.5 69 m
-38.5 69 l
-S
-47.125 71.625 m
-47.125 71.625 l
-S
-62.875 68.0635 m
-62.875 68.0635 l
-S
-49.75 67.5 m
-49.75 67.5 l
-S
-38.875 65.625 m
-38.875 65.625 l
-S
-29.3115 70.3135 m
-29.3115 70.3135 l
-S
-31.9365 67.5 m
-31.9365 67.5 l
-S
-57.25 65.4385 m
-57.25 65.4385 l
-S
-23.5 69.1885 m
-23.5 69.1885 l
-S
-45.625 65.25 m
-45.625 65.25 l
-S
-26.6865 63.9385 m
-26.6865 63.9385 l
-S
-50.5 63.75 m
-50.5 63.75 l
-S
-32.6865 72 m
-32.6865 72 l
-S
-52.9365 71.4385 m
-52.9365 71.4385 l
-S
-57.8115 69.375 m
-57.8115 69.375 l
-S
-61 64.3135 m
-61 64.3135 l
-S
-28.9365 48.1885 m
-28.9365 48.1885 l
-S
-17.125 48.375 m
-17.125 48.375 l
-S
-21.4365 42.375 m
-21.4365 42.375 l
-S
-19.375 36 m
-19.375 36 l
-S
-26.125 31.6885 m
-26.125 31.6885 l
-S
-20.125 31.5 m
-20.125 31.5 l
-S
-26.5 49.6885 m
-26.5 49.6885 l
-S
-35.6865 50.8135 m
-35.6865 50.8135 l
-S
-19.75 45.9385 m
-19.75 45.9385 l
-S
-23.125 52.3135 m
-23.125 52.3135 l
-S
-40.5615 47.4385 m
-40.5615 47.4385 l
-S
-43 46.125 m
-43 46.125 l
-S
-23.5 39.1885 m
-23.5 39.1885 l
-S
-38.5 34.125 m
-38.5 34.125 l
-S
-47.125 36.75 m
-47.125 36.75 l
-S
-45.0615 50.4385 m
-45.0615 50.4385 l
-S
-56.875 51.375 m
-56.875 51.375 l
-S
-42.8115 39.375 m
-42.8115 39.375 l
-S
-62.875 33.1885 m
-62.875 33.1885 l
-S
-49.75 32.625 m
-49.75 32.625 l
-S
-38.875 30.75 m
-38.875 30.75 l
-S
-29.3115 35.4385 m
-29.3115 35.4385 l
-S
-31.9365 32.625 m
-31.9365 32.625 l
-S
-54.75 30.1885 m
-54.75 30.1885 l
-S
-64.9365 39.75 m
-64.9365 39.75 l
-S
-46.1865 41.8135 m
-46.1865 41.8135 l
-S
-65.3115 50.0635 m
-65.3115 50.0635 l
-S
-51.0615 51.9385 m
-51.0615 51.9385 l
-S
-23.5 34.3135 m
-23.5 34.3135 l
-S
-40.5615 51.9385 m
-40.5615 51.9385 l
-S
-31.1865 51.9385 m
-31.1865 51.9385 l
-S
-45.625 30.375 m
-45.625 30.375 l
-S
-26.6865 29.0635 m
-26.6865 29.0635 l
-S
-59.875 54.5635 m
-59.875 54.5635 l
-S
-50.5 28.875 m
-50.5 28.875 l
-S
-60.75 47.6885 m
-60.75 47.6885 l
-S
-30.625 42.75 m
-30.625 42.75 l
-S
-26.6865 42.375 m
-26.6865 42.375 l
-S
-36.8115 40.125 m
-36.8115 40.125 l
-S
-37.75 43.5 m
-37.75 43.5 l
-S
-34.5615 45.9385 m
-34.5615 45.9385 l
-S
-32.6865 37.125 m
-32.6865 37.125 l
-S
-61.9365 42.75 m
-61.9365 42.75 l
-S
-48.4365 47.25 m
-48.4365 47.25 l
-S
-54.625 42.375 m
-54.625 42.375 l
-S
-56.3115 45.75 m
-56.3115 45.75 l
-S
-52.9365 36.5635 m
-52.9365 36.5635 l
-S
-57.8115 34.5 m
-57.8115 34.5 l
-S
-58.9365 38.625 m
-58.9365 38.625 l
-S
-61 29.4385 m
-61 29.4385 l
-S
-65.875 29.625 m
-65.875 29.625 l
-S
-70.5615 27.75 m
-70.5615 27.75 l
-S
-71.5 52.875 m
-71.5 52.875 l
-S
-69.8115 34.3135 m
-69.8115 34.3135 l
-S
-76.375 27.375 m
-76.375 27.375 l
-S
-71.3115 41.0635 m
-71.3115 41.0635 l
-S
-77.3115 45.375 m
-77.3115 45.375 l
-S
-82 28.6885 m
-82 28.6885 l
-S
-88.1865 27.5635 m
-88.1865 27.5635 l
-S
-83.6865 43.3135 m
-83.6865 43.3135 l
-S
-88 50.0635 m
-88 50.0635 l
-S
-88.1865 44.0635 m
-88.1865 44.0635 l
-S
-88.1865 33.1885 m
-88.1865 33.1885 l
-S
-70 50.4385 m
-70 50.4385 l
-S
-68.875 59.625 m
-68.875 59.625 l
-S
-66.8115 38.25 m
-66.8115 38.25 l
-S
-74.75 42.1885 m
-74.75 42.1885 l
-S
-67.375 47.0635 m
-67.375 47.0635 l
-S
-72.25 64.5 m
-72.25 64.5 l
-S
-73.5615 66.9385 m
-73.5615 66.9385 l
-S
-80.5 47.4385 m
-80.5 47.4385 l
-S
-85.5615 62.4385 m
-85.5615 62.4385 l
-S
-82.9365 71.0635 m
-82.9365 71.0635 l
-S
-69.25 69 m
-69.25 69 l
-S
-80.3115 66.75 m
-80.3115 66.75 l
-S
-84.25 53.25 m
-84.25 53.25 l
-S
-87.0615 55.875 m
-87.0615 55.875 l
-S
-77.875 70.125 m
-77.875 70.125 l
-S
-85.375 47.4385 m
-85.375 47.4385 l
-S
-67.75 64.5 m
-67.75 64.5 l
-S
-67.75 55.125 m
-67.75 55.125 l
-S
-81.625 31.125 m
-81.625 31.125 l
-S
-79.375 39 m
-79.375 39 l
-S
-75.8115 33 m
-75.8115 33 l
-S
-84.4365 37.3135 m
-84.4365 37.3135 l
-S
-76.9365 54.5635 m
-76.9365 54.5635 l
-S
-77.3115 50.625 m
-77.3115 50.625 l
-S
-79.5615 60.75 m
-79.5615 60.75 l
-S
-76.1865 61.6885 m
-76.1865 61.6885 l
-S
-73.75 58.5 m
-73.75 58.5 l
-S
-82.5615 56.625 m
-82.5615 56.625 l
-S
-72.4365 72.375 m
-72.4365 72.375 l
-S
-61.75 25.875 m
-61.75 25.875 l
-S
-57.25 26.625 m
-57.25 26.625 l
-S
-25.75 60.75 m
-25.75 60.75 l
-S
-34.1865 59.4385 m
-34.1865 59.4385 l
-S
-19.9365 61.3135 m
-19.9365 61.3135 l
-S
-31.5615 55.6885 m
-31.5615 55.6885 l
-S
-17.3115 56.625 m
-17.3115 56.625 l
-S
-25.1865 55.125 m
-25.1865 55.125 l
-S
-40.375 62.25 m
-40.375 62.25 l
-S
-46.1865 54.75 m
-46.1865 54.75 l
-S
-56.875 59.4385 m
-56.875 59.4385 l
-S
-40.25 58.1885 m
-40.25 58.1885 l
-S
-36.25 56.4385 m
-36.25 56.4385 l
-S
-49.375 56.8135 m
-49.375 56.8135 l
-S
-53.125 62.625 m
-53.125 62.625 l
-S
-54.25 56.8135 m
-54.25 56.8135 l
-S
-59.5 60 m
-59.5 60 l
-S
-46.1865 60 m
-46.1865 60 l
-S
-30.8115 28.5 m
-30.8115 28.5 l
-S
-19.75 72.9385 m
-19.75 72.9385 l
-S
-43 73.125 m
-43 73.125 l
-S
-34.5615 72.9385 m
-34.5615 72.9385 l
-S
-56.3115 72.75 m
-56.3115 72.75 l
-S
-77.875 73.125 m
-77.875 73.125 l
-S
-72.4365 0.375 m
-72.4365 0.375 l
-S
-16.1865 27.5635 m
-16.1865 27.5635 l
-S
-16 50.0635 m
-16 50.0635 l
-S
-16.1865 44.0635 m
-16.1865 44.0635 l
-S
-16.1865 33.1885 m
-16.1865 33.1885 l
-S
-6 62.3135 m
-6.208 62.3135 6.375 62.4805 6.375 62.6885 c
-6.375 62.8945 6.208 63.0635 6 63.0635 c
-5.793 63.0635 5.625 62.8945 5.625 62.6885 c
-5.625 62.4805 5.793 62.3135 6 62.3135 c
-s
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI3_BeginPattern: (horizontal rules)
-(horizontal rules) 16 0 88 73.9463 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-2 J 0 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-0 6 m
-6 0 L
-F
-0 0 m
-6 6 L
-F
-%AI6_EndPatternLayer
-) &
-(0 O 0 R 0 0 0 1 k
- 0 0 0 1 K
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-2 J 0 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-88 72.9727 m
-16 72.9727 l
-S
-88 71.0273 m
-16 71.0273 L
-S
-88 67.1357 m
-16 67.1357 L
-S
-88 65.1904 m
-16 65.1904 L
-S
-88 63.2441 m
-16 63.2441 L
-S
-88 61.2979 m
-16 61.2979 L
-S
-88 57.4072 m
-16 57.4072 L
-S
-88 55.4609 m
-16 55.4609 L
-S
-88 53.5156 m
-16 53.5156 L
-S
-88 51.5703 m
-16 51.5703 L
-S
-88 49.624 m
-16 49.624 L
-S
-88 47.6787 m
-16 47.6787 L
-S
-88 45.7334 m
-16 45.7334 L
-S
-88 43.7871 m
-16 43.7871 L
-S
-88 39.8965 m
-16 39.8965 L
-S
-88 37.9502 m
-16 37.9502 L
-S
-88 36.0049 m
-16 36.0049 L
-S
-88 34.0586 m
-16 34.0586 L
-S
-88 32.1133 m
-16 32.1133 L
-S
-88 30.168 m
-16 30.168 L
-S
-88 26.2764 m
-16 26.2764 L
-S
-88 22.3848 m
-16 22.3848 L
-S
-88 20.4395 m
-16 20.4395 L
-S
-88 18.4941 m
-16 18.4941 L
-S
-88 16.5479 m
-16 16.5479 L
-S
-88 14.6016 m
-16 14.6016 L
-S
-88 12.6572 m
-16 12.6572 L
-S
-88 8.7646 m
-16 8.7646 L
-S
-88 6.8193 m
-16 6.8193 L
-S
-88 4.874 m
-16 4.874 L
-S
-88 0.9727 m
-16 0.9727 l
-S
-88 2.9277 m
-16 2.9277 L
-S
-88 69.0811 m
-16 69.0811 L
-S
-88 59.3525 m
-16 59.3525 L
-S
-88 41.8418 m
-16 41.8418 L
-S
-88 28.2217 m
-16 28.2217 L
-S
-88 24.3311 m
-16 24.3311 L
-S
-88 10.7109 m
-16 10.7109 L
-S
-6 69.0811 m
-2 69.0811 l
-S
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI3_BeginPattern: (one direction diagonals)
-(one direction diagonals) 28.856 4.6211 100.855 76.6211 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-0 J 2 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-5.106 10.6211 m
-11.106 4.6211 L
-F
-5.106 4.6211 m
-11.106 10.6211 L
-F
-%AI6_EndPatternLayer
-) &
-(0 O 0 R 0 0 0 1 k
- 0 0 0 1 K
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-0 J 1 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-21.3716 66.1055 m
-39.3706 84.1055 l
-S
-21.3716 60.1055 m
-45.3706 84.1055 l
-S
-21.3716 54.1055 m
-51.3706 84.1055 l
-S
-21.3716 48.1055 m
-57.3706 84.1055 l
-S
-21.3716 42.1055 m
-63.3706 84.1055 l
-S
-21.3716 36.1055 m
-69.3706 84.1055 l
-S
-21.3716 30.1055 m
-75.3706 84.1055 l
-S
-21.3716 24.1055 m
-81.3706 84.1055 l
-S
-21.3716 18.1055 m
-87.3706 84.1055 l
-S
-21.3716 12.1055 m
-93.3706 84.1055 l
-S
-21.3716 6.1055 m
-99.3706 84.1055 l
-S
-21.3716 0.1064 m
-105.3706 84.1055 l
-S
-27.3716 0.1064 m
-105.3706 78.1055 l
-S
-33.3706 0.1064 m
-105.3706 72.1055 l
-S
-39.3706 0.1064 m
-105.3706 66.1055 l
-S
-45.3706 0.1064 m
-105.3706 60.1055 l
-S
-51.3706 0.1064 m
-105.3706 54.1055 l
-S
-57.3706 0.1064 m
-105.3706 48.1055 l
-S
-63.3706 0.1064 m
-105.3706 42.1055 l
-S
-69.3706 0.1064 m
-105.3706 36.1055 l
-S
-75.3706 0.1064 m
-105.3706 30.1055 l
-S
-81.3706 0.1064 m
-105.3706 24.1055 l
-S
-87.3706 0.1064 m
-105.3706 18.1055 l
-S
-93.3706 0.1064 m
-105.3706 12.1055 l
-S
-2 j
-0.106 63.1211 m
-10.106 73.1211 L
-S
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI3_BeginPattern: (white dots)
-(white dots) 0.375 0.6885 72.375 72.6885 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-1 J 0 j 0.75 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-13.3115 3.1885 m
-13.3115 3.1885 l
-S
-1.5 3.375 m
-1.5 3.375 l
-S
-10.875 4.6885 m
-10.875 4.6885 l
-S
-20.0615 5.8135 m
-20.0615 5.8135 l
-S
-4.125 0.9385 m
-4.125 0.9385 l
-S
-7.5 7.3135 m
-7.5 7.3135 l
-S
-24.9365 2.4385 m
-24.9365 2.4385 l
-S
-27.375 1.125 m
-27.375 1.125 l
-S
-29.4365 5.4385 m
-29.4365 5.4385 l
-S
-41.25 6.375 m
-41.25 6.375 l
-S
-49.6865 5.0635 m
-49.6865 5.0635 l
-S
-35.4365 6.9385 m
-35.4365 6.9385 l
-S
-24.9365 6.9385 m
-24.9365 6.9385 l
-S
-15.5615 6.9385 m
-15.5615 6.9385 l
-S
-44.25 9.5635 m
-44.25 9.5635 l
-S
-47.0615 1.3135 m
-47.0615 1.3135 l
-S
-18.9365 0.9385 m
-18.9365 0.9385 l
-S
-32.8115 2.25 m
-32.8115 2.25 l
-S
-40.6865 0.75 m
-40.6865 0.75 l
-S
-51 24.5635 m
-51 24.5635 l
-S
-58.6865 24.9385 m
-58.6865 24.9385 l
-S
-63.1865 24.375 m
-63.1865 24.375 l
-S
-67.3115 2.0635 m
-67.3115 2.0635 l
-S
-52.6865 11.8135 m
-52.6865 11.8135 l
-S
-70.875 17.8135 m
-70.875 17.8135 l
-S
-71.4365 4.6885 m
-71.4365 4.6885 l
-S
-64.3115 19.875 m
-64.3115 19.875 l
-S
-62.25 1.125 m
-62.25 1.125 l
-S
-54 20.25 m
-54 20.25 l
-S
-52.125 6 m
-52.125 6 l
-S
-57.75 17.625 m
-57.75 17.625 l
-S
-61.3115 16.875 m
-61.3115 16.875 l
-S
-56.8115 3.375 m
-56.8115 3.375 l
-S
-61.6865 9.5635 m
-61.6865 9.5635 l
-S
-58.3115 11.25 m
-58.3115 11.25 l
-S
-67.5 7.875 m
-67.5 7.875 l
-S
-69.5615 12.75 m
-69.5615 12.75 l
-S
-65.4365 13.875 m
-65.4365 13.875 l
-S
-2.0615 16.125 m
-2.0615 16.125 l
-S
-29.625 10.3135 m
-29.625 10.3135 l
-S
-15.9365 21.375 m
-15.9365 21.375 l
-S
-5.25 11.8135 m
-5.25 11.8135 l
-S
-19.125 18.5635 m
-19.125 18.5635 l
-S
-10.125 21.9385 m
-10.125 21.9385 l
-S
-18.9365 24.5635 m
-18.9365 24.5635 l
-S
-21.75 16.3135 m
-21.75 16.3135 l
-S
-21 12.75 m
-21 12.75 l
-S
-7.5 17.25 m
-7.5 17.25 l
-S
-13.6865 12.375 m
-13.6865 12.375 l
-S
-15.375 15.75 m
-15.375 15.75 l
-S
-30.5615 22.875 m
-30.5615 22.875 l
-S
-36.375 15.375 m
-36.375 15.375 l
-S
-42.75 13.3135 m
-42.75 13.3135 l
-S
-47.0615 20.0635 m
-47.0615 20.0635 l
-S
-47.25 14.0635 m
-47.25 14.0635 l
-S
-29.0615 20.4385 m
-29.0615 20.4385 l
-S
-31.125 15.1885 m
-31.125 15.1885 l
-S
-26.4365 17.0635 m
-26.4365 17.0635 l
-S
-39.5615 17.4385 m
-39.5615 17.4385 l
-S
-43.3115 23.25 m
-43.3115 23.25 l
-S
-44.4365 17.4385 m
-44.4365 17.4385 l
-S
-26.8115 25.125 m
-26.8115 25.125 l
-S
-49.6865 20.625 m
-49.6865 20.625 l
-S
-36 24.5635 m
-36 24.5635 l
-S
-36.375 20.625 m
-36.375 20.625 l
-S
-3.1865 24 m
-3.1865 24 l
-S
-5.625 24.9385 m
-5.625 24.9385 l
-S
-3.75 70.875 m
-3.75 70.875 l
-S
-10.5 66.5635 m
-10.5 66.5635 l
-S
-4.5 66.375 m
-4.5 66.375 l
-S
-22.875 69 m
-22.875 69 l
-S
-31.5 71.625 m
-31.5 71.625 l
-S
-47.25 68.0635 m
-47.25 68.0635 l
-S
-34.125 67.5 m
-34.125 67.5 l
-S
-23.25 65.625 m
-23.25 65.625 l
-S
-13.6865 70.3135 m
-13.6865 70.3135 l
-S
-16.3115 67.5 m
-16.3115 67.5 l
-S
-41.625 65.4385 m
-41.625 65.4385 l
-S
-7.875 69.1885 m
-7.875 69.1885 l
-S
-30 65.25 m
-30 65.25 l
-S
-11.0615 63.9385 m
-11.0615 63.9385 l
-S
-34.875 63.75 m
-34.875 63.75 l
-S
-17.0615 72 m
-17.0615 72 l
-S
-37.3115 71.4385 m
-37.3115 71.4385 l
-S
-42.1865 69.375 m
-42.1865 69.375 l
-S
-45.375 64.3135 m
-45.375 64.3135 l
-S
-13.3115 48.1885 m
-13.3115 48.1885 l
-S
-1.5 48.375 m
-1.5 48.375 l
-S
-5.8115 42.375 m
-5.8115 42.375 l
-S
-3.75 36 m
-3.75 36 l
-S
-10.5 31.6885 m
-10.5 31.6885 l
-S
-4.5 31.5 m
-4.5 31.5 l
-S
-10.875 49.6885 m
-10.875 49.6885 l
-S
-20.0615 50.8135 m
-20.0615 50.8135 l
-S
-4.125 45.9385 m
-4.125 45.9385 l
-S
-7.5 52.3135 m
-7.5 52.3135 l
-S
-24.9365 47.4385 m
-24.9365 47.4385 l
-S
-27.375 46.125 m
-27.375 46.125 l
-S
-7.875 39.1885 m
-7.875 39.1885 l
-S
-22.875 34.125 m
-22.875 34.125 l
-S
-31.5 36.75 m
-31.5 36.75 l
-S
-29.4365 50.4385 m
-29.4365 50.4385 l
-S
-41.25 51.375 m
-41.25 51.375 l
-S
-27.1865 39.375 m
-27.1865 39.375 l
-S
-47.25 33.1885 m
-47.25 33.1885 l
-S
-34.125 32.625 m
-34.125 32.625 l
-S
-23.25 30.75 m
-23.25 30.75 l
-S
-13.6865 35.4385 m
-13.6865 35.4385 l
-S
-16.3115 32.625 m
-16.3115 32.625 l
-S
-39.125 30.1885 m
-39.125 30.1885 l
-S
-49.3115 39.75 m
-49.3115 39.75 l
-S
-30.5615 41.8135 m
-30.5615 41.8135 l
-S
-49.6865 50.0635 m
-49.6865 50.0635 l
-S
-35.4365 51.9385 m
-35.4365 51.9385 l
-S
-7.875 34.3135 m
-7.875 34.3135 l
-S
-24.9365 51.9385 m
-24.9365 51.9385 l
-S
-15.5615 51.9385 m
-15.5615 51.9385 l
-S
-30 30.375 m
-30 30.375 l
-S
-11.0615 29.0635 m
-11.0615 29.0635 l
-S
-44.25 54.5635 m
-44.25 54.5635 l
-S
-34.875 28.875 m
-34.875 28.875 l
-S
-45.125 47.6885 m
-45.125 47.6885 l
-S
-15 42.75 m
-15 42.75 l
-S
-11.0615 42.375 m
-11.0615 42.375 l
-S
-21.1865 40.125 m
-21.1865 40.125 l
-S
-22.125 43.5 m
-22.125 43.5 l
-S
-18.9365 45.9385 m
-18.9365 45.9385 l
-S
-17.0615 37.125 m
-17.0615 37.125 l
-S
-46.3115 42.75 m
-46.3115 42.75 l
-S
-32.8115 47.25 m
-32.8115 47.25 l
-S
-39 42.375 m
-39 42.375 l
-S
-40.6865 45.75 m
-40.6865 45.75 l
-S
-37.3115 36.5635 m
-37.3115 36.5635 l
-S
-42.1865 34.5 m
-42.1865 34.5 l
-S
-43.3115 38.625 m
-43.3115 38.625 l
-S
-45.375 29.4385 m
-45.375 29.4385 l
-S
-50.25 29.625 m
-50.25 29.625 l
-S
-54.9365 27.75 m
-54.9365 27.75 l
-S
-55.875 52.875 m
-55.875 52.875 l
-S
-54.1865 34.3135 m
-54.1865 34.3135 l
-S
-60.75 27.375 m
-60.75 27.375 l
-S
-55.6865 41.0635 m
-55.6865 41.0635 l
-S
-61.6865 45.375 m
-61.6865 45.375 l
-S
-66.375 28.6885 m
-66.375 28.6885 l
-S
-72.5615 27.5635 m
-72.5615 27.5635 l
-S
-68.0615 43.3135 m
-68.0615 43.3135 l
-S
-72.375 50.0635 m
-72.375 50.0635 l
-S
-72.5615 44.0635 m
-72.5615 44.0635 l
-S
-72.5615 33.1885 m
-72.5615 33.1885 l
-S
-54.375 50.4385 m
-54.375 50.4385 l
-S
-53.25 59.625 m
-53.25 59.625 l
-S
-51.1865 38.25 m
-51.1865 38.25 l
-S
-59.125 42.1885 m
-59.125 42.1885 l
-S
-51.75 47.0635 m
-51.75 47.0635 l
-S
-56.625 64.5 m
-56.625 64.5 l
-S
-57.9365 66.9385 m
-57.9365 66.9385 l
-S
-64.875 47.4385 m
-64.875 47.4385 l
-S
-69.9365 62.4385 m
-69.9365 62.4385 l
-S
-67.3115 71.0635 m
-67.3115 71.0635 l
-S
-53.625 69 m
-53.625 69 l
-S
-64.6865 66.75 m
-64.6865 66.75 l
-S
-68.625 53.25 m
-68.625 53.25 l
-S
-71.4365 55.875 m
-71.4365 55.875 l
-S
-62.25 70.125 m
-62.25 70.125 l
-S
-69.75 47.4385 m
-69.75 47.4385 l
-S
-52.125 64.5 m
-52.125 64.5 l
-S
-52.125 55.125 m
-52.125 55.125 l
-S
-66 31.125 m
-66 31.125 l
-S
-63.75 39 m
-63.75 39 l
-S
-60.1865 33 m
-60.1865 33 l
-S
-68.8115 37.3135 m
-68.8115 37.3135 l
-S
-61.3115 54.5635 m
-61.3115 54.5635 l
-S
-61.6865 50.625 m
-61.6865 50.625 l
-S
-63.9365 60.75 m
-63.9365 60.75 l
-S
-60.5615 61.6885 m
-60.5615 61.6885 l
-S
-58.125 58.5 m
-58.125 58.5 l
-S
-66.9365 56.625 m
-66.9365 56.625 l
-S
-56.8115 72.375 m
-56.8115 72.375 l
-S
-46.125 25.875 m
-46.125 25.875 l
-S
-41.625 26.625 m
-41.625 26.625 l
-S
-10.125 60.75 m
-10.125 60.75 l
-S
-18.5615 59.4385 m
-18.5615 59.4385 l
-S
-4.3115 61.3135 m
-4.3115 61.3135 l
-S
-15.9365 55.6885 m
-15.9365 55.6885 l
-S
-1.6865 56.625 m
-1.6865 56.625 l
-S
-9.5615 55.125 m
-9.5615 55.125 l
-S
-24.75 62.25 m
-24.75 62.25 l
-S
-30.5615 54.75 m
-30.5615 54.75 l
-S
-41.25 59.4385 m
-41.25 59.4385 l
-S
-24.625 58.1885 m
-24.625 58.1885 l
-S
-20.625 56.4385 m
-20.625 56.4385 l
-S
-33.75 56.8135 m
-33.75 56.8135 l
-S
-37.5 62.625 m
-37.5 62.625 l
-S
-38.625 56.8135 m
-38.625 56.8135 l
-S
-43.875 60 m
-43.875 60 l
-S
-30.5615 60 m
-30.5615 60 l
-S
-15.1865 28.5 m
-15.1865 28.5 l
-S
-4.125 72.9385 m
-4.125 72.9385 l
-S
-27.375 73.125 m
-27.375 73.125 l
-S
-18.9365 72.9385 m
-18.9365 72.9385 l
-S
-40.6865 72.75 m
-40.6865 72.75 l
-S
-62.25 73.125 m
-62.25 73.125 l
-S
-56.8115 0.375 m
-56.8115 0.375 l
-S
-0.5615 27.5635 m
-0.5615 27.5635 l
-S
-0.375 50.0635 m
-0.375 50.0635 l
-S
-0.5615 44.0635 m
-0.5615 44.0635 l
-S
-0.5615 33.1885 m
-0.5615 33.1885 l
-S
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI5_End_NonPrinting--
-%AI5_Begin_NonPrinting
-Np
-%AI8_BeginBrushPattern
-(New Pattern 2)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7884 8586 m
--7838.1201 8586 L
--7838.1201 8500.6914 L
--7884 8500.6914 L
--7884 8586 L
-n
-u
--7850.4111 8533.3125 m
--7850.3774 8533.3086 -7850.3457 8533.3047 -7850.313 8533.3018 c
--7850.3457 8533.3047 -7850.3774 8533.3086 -7850.4111 8533.3125 c
-n
--7843.6582 8532.1602 m
--7843.647 8532.1572 -7843.6362 8532.1543 -7843.626 8532.1523 c
--7843.6362 8532.1543 -7843.647 8532.1572 -7843.6582 8532.1602 c
-n
--7870.0361 8579.5879 m
--7870.0688 8579.5859 -7870.1006 8579.584 -7870.1318 8579.5801 c
--7870.1162 8579.582 -7870.1016 8579.584 -7870.0854 8579.585 c
--7870.0703 8579.5859 -7870.0527 8579.5879 -7870.0361 8579.5879 c
-n
--7854.5366 8533.6719 m
--7854.4785 8533.668 -7854.4209 8533.6641 -7854.3599 8533.6602 c
--7854.4209 8533.6641 -7854.4785 8533.668 -7854.5366 8533.6719 c
-n
--7839.1553 8576.4043 m
--7839.0625 8576.3281 -7838.9775 8576.252 -7838.9009 8576.1758 c
--7838.5967 8575.8672 -7838.4385 8575.5469 -7838.4385 8575.2207 c
--7838.4385 8575.6289 -7838.689 8576.0254 -7839.1553 8576.4043 c
-n
--7877.3232 8578.5703 m
--7877.3247 8578.5703 -7877.3281 8578.5693 -7877.3311 8578.5684 c
--7877.3306 8578.5693 -7877.3281 8578.5693 -7877.3271 8578.5703 c
--7877.3247 8578.5703 -7877.3247 8578.5703 -7877.3232 8578.5703 c
-n
--7882.21 8577.0645 m
--7882.21 8577.0645 L
--7882.21 8577.0645 L
--7882.21 8577.0645 L
-n
--7858.9209 8533.8545 m
--7858.8994 8533.8545 -7858.8774 8533.8535 -7858.856 8533.8535 c
--7858.8774 8533.8535 -7858.8994 8533.8545 -7858.9209 8533.8545 c
-n
--7863.582 8533.8535 m
--7863.5601 8533.8535 -7863.5391 8533.8545 -7863.5166 8533.8545 c
--7863.5391 8533.8545 -7863.5601 8533.8535 -7863.582 8533.8535 c
-n
--7865.667 8533.7881 m
--7865.7642 8533.7842 -7865.8594 8533.7793 -7865.9561 8533.7754 c
--7865.9058 8533.7773 -7865.8608 8533.7813 -7865.8096 8533.7832 c
--7865.7642 8533.7852 -7865.7134 8533.7861 -7865.667 8533.7881 c
-n
--7884 8529.1426 m
--7884 8529.3066 -7883.96 8529.4688 -7883.8818 8529.627 c
--7883.96 8529.4688 -7884 8529.3066 -7884 8529.1426 c
-n
--7868.0718 8533.6602 m
--7868.0166 8533.6641 -7867.9609 8533.668 -7867.9038 8533.6709 c
--7867.9609 8533.668 -7868.0166 8533.6641 -7868.0718 8533.6602 c
-n
--7878.811 8532.1523 m
--7878.8018 8532.1543 -7878.792 8532.1572 -7878.7822 8532.1592 c
--7878.792 8532.1572 -7878.8018 8532.1543 -7878.811 8532.1523 c
-n
--7872.1201 8533.3027 m
--7872.0898 8533.3057 -7872.0615 8533.3086 -7872.0322 8533.3125 c
--7872.0615 8533.3086 -7872.0898 8533.3057 -7872.1201 8533.3027 c
-n
--7838.4385 8529.1426 m
--7838.4385 8529.3887 -7838.5278 8529.6289 -7838.7002 8529.8643 c
--7838.5278 8529.6289 -7838.4385 8529.3887 -7838.4385 8529.1426 c
-n
--7839.0342 8530.2168 m
--7839.332 8530.4844 -7839.731 8530.7432 -7840.2358 8530.9902 c
--7840.2334 8530.9893 -7840.231 8530.9883 -7840.229 8530.9863 c
--7839.7271 8530.7402 -7839.3311 8530.4834 -7839.0342 8530.2168 c
-n
--7841.187 8531.4004 m
--7841.187 8531.4004 L
--7841.187 8531.4004 L
-n
--7884 8575.2207 m
--7884 8575.5 -7883.876 8575.7754 -7883.6514 8576.042 c
--7883.876 8575.7754 -7884 8575.501 -7884 8575.2207 c
-n
--7856.4824 8533.7754 m
--7856.5791 8533.7793 -7856.6758 8533.7842 -7856.7729 8533.7881 c
--7856.7246 8533.7861 -7856.6758 8533.7852 -7856.6279 8533.7832 c
--7856.5791 8533.7813 -7856.5313 8533.7773 -7856.4824 8533.7754 c
-n
--7872.0942 8579.3828 m
--7872.083 8579.3848 -7872.0698 8579.3867 -7872.0562 8579.3877 c
--7872.0698 8579.3867 -7872.083 8579.3848 -7872.0942 8579.3828 c
-n
--7882.2026 8530.9902 m
--7882.46 8530.8633 -7882.687 8530.7344 -7882.8936 8530.6016 c
--7882.6904 8530.7324 -7882.4639 8530.8613 -7882.21 8530.9863 c
--7882.208 8530.9883 -7882.2041 8530.9893 -7882.2026 8530.9902 c
-n
--7854.4766 8579.7461 m
--7854.4561 8579.7441 -7854.4346 8579.7432 -7854.4146 8579.7422 c
--7854.4346 8579.7432 -7854.4561 8579.7441 -7854.4766 8579.7461 c
-n
--7840.229 8577.0645 m
--7840.229 8577.0645 L
--7840.229 8577.0645 L
--7840.229 8577.0645 L
-n
--7852.2998 8579.5801 m
--7852.335 8579.583 -7852.3706 8579.5859 -7852.4072 8579.5898 c
--7852.3882 8579.5879 -7852.3706 8579.5869 -7852.3521 8579.585 c
--7852.334 8579.584 -7852.3174 8579.582 -7852.2998 8579.5801 c
-n
--7856.5601 8579.8574 m
--7856.6055 8579.8594 -7856.6514 8579.8613 -7856.6958 8579.8633 c
--7856.6738 8579.8623 -7856.6494 8579.8613 -7856.6279 8579.8613 c
--7856.6055 8579.8604 -7856.583 8579.8584 -7856.5601 8579.8574 c
-n
--7868.0186 8579.7422 m
--7868.001 8579.7432 -7867.9834 8579.7441 -7867.9658 8579.7461 c
--7867.9834 8579.7441 -7868.001 8579.7432 -7868.0186 8579.7422 c
-n
--7850.3882 8579.3887 m
--7850.3706 8579.3867 -7850.3535 8579.3848 -7850.3369 8579.3828 c
--7850.3535 8579.3848 -7850.3706 8579.3867 -7850.3882 8579.3887 c
-n
--7865.7422 8579.8633 m
--7865.7881 8579.8613 -7865.833 8579.8594 -7865.8774 8579.8574 c
--7865.8545 8579.8584 -7865.833 8579.8604 -7865.8096 8579.8613 c
--7865.7881 8579.8613 -7865.7646 8579.8623 -7865.7422 8579.8633 c
-n
-0 O
-0.8 g
--7839.1553 8576.4043 m
--7839.437 8576.6309 -7839.7959 8576.8516 -7840.229 8577.0645 C
--7840.229 8577.0645 L
--7840.229 8577.0645 L
--7842.2422 8578.0547 -7845.8286 8578.8721 -7850.3369 8579.3828 c
--7850.3535 8579.3848 -7850.3706 8579.3867 -7850.3882 8579.3887 c
--7851.0088 8579.458 -7851.6465 8579.5215 -7852.2998 8579.5801 c
--7852.3174 8579.582 -7852.334 8579.584 -7852.3521 8579.585 c
--7852.3706 8579.5869 -7852.3882 8579.5879 -7852.4072 8579.5898 c
--7853.0615 8579.6465 -7853.7305 8579.6973 -7854.4146 8579.7422 c
--7854.4346 8579.7432 -7854.4561 8579.7441 -7854.4766 8579.7461 c
--7855.1567 8579.79 -7855.853 8579.8262 -7856.5601 8579.8574 c
--7856.583 8579.8584 -7856.6055 8579.8604 -7856.6279 8579.8613 c
--7856.6494 8579.8613 -7856.6738 8579.8623 -7856.6958 8579.8633 c
--7858.1567 8579.9238 -7859.6694 8579.957 -7861.2202 8579.957 c
--7862.769 8579.957 -7864.2798 8579.9238 -7865.7422 8579.8633 c
--7865.7646 8579.8623 -7865.7881 8579.8613 -7865.8096 8579.8613 c
--7865.833 8579.8604 -7865.8545 8579.8584 -7865.8774 8579.8574 c
--7866.5854 8579.8262 -7867.2832 8579.7891 -7867.9658 8579.7461 c
--7867.9834 8579.7441 -7868.001 8579.7432 -7868.0186 8579.7422 c
--7868.7065 8579.6973 -7869.3799 8579.6465 -7870.0361 8579.5879 c
--7870.0527 8579.5879 -7870.0703 8579.5859 -7870.0854 8579.585 c
--7870.1016 8579.584 -7870.1162 8579.582 -7870.1318 8579.5801 c
--7870.7886 8579.5225 -7871.4321 8579.458 -7872.0562 8579.3877 c
--7872.0698 8579.3867 -7872.083 8579.3848 -7872.0942 8579.3828 c
--7874.0234 8579.165 -7875.7832 8578.8906 -7877.3232 8578.5703 c
--7877.3247 8578.5703 -7877.3247 8578.5703 -7877.3271 8578.5703 c
--7877.3281 8578.5693 -7877.3306 8578.5693 -7877.3311 8578.5684 c
--7879.3896 8578.1406 -7881.0576 8577.6309 -7882.21 8577.0645 C
--7882.21 8577.0645 L
--7882.21 8577.0645 L
--7882.8682 8576.7402 -7883.353 8576.3984 -7883.6514 8576.042 c
--7883.876 8575.7754 -7884 8575.5 -7884 8575.2207 C
--7884 8581.2637 L
--7884 8581.5908 -7883.8408 8581.9102 -7883.5361 8582.2188 c
--7883.2334 8582.5273 -7882.7866 8582.8242 -7882.21 8583.1074 c
--7881.6328 8583.3906 -7880.9287 8583.6602 -7880.1089 8583.9121 c
--7879.29 8584.1641 -7878.3584 8584.3984 -7877.3271 8584.6133 c
--7876.2959 8584.8281 -7875.168 8585.0215 -7873.9561 8585.1914 c
--7872.7432 8585.3623 -7871.4497 8585.5088 -7870.0854 8585.6279 c
--7868.7231 8585.749 -7867.293 8585.8418 -7865.8096 8585.9043 c
--7864.3271 8585.9668 -7862.792 8586 -7861.2202 8586 c
--7859.6465 8586 -7858.1104 8585.9668 -7856.6279 8585.9043 c
--7855.145 8585.8418 -7853.7134 8585.749 -7852.3521 8585.6279 c
--7850.9897 8585.5088 -7849.6934 8585.3623 -7848.4814 8585.1914 c
--7847.2695 8585.0215 -7846.1416 8584.8281 -7845.1104 8584.6133 c
--7844.0801 8584.3984 -7843.147 8584.1641 -7842.3286 8583.9121 c
--7841.5103 8583.6602 -7840.8042 8583.3906 -7840.229 8583.1074 c
--7839.6514 8582.8242 -7839.2041 8582.5273 -7838.9009 8582.2188 c
--7838.5967 8581.9102 -7838.4385 8581.5908 -7838.4385 8581.2637 C
--7838.4385 8575.2207 L
--7838.4385 8575.5469 -7838.5967 8575.8672 -7838.9009 8576.1758 c
--7838.9775 8576.252 -7839.0625 8576.3281 -7839.1553 8576.4043 c
-f
-0.5 g
--7848.209 8572.2383 m
--7847.9424 8572.2383 L
--7847.9424 8572.4561 -7848.041 8572.6621 -7848.209 8572.8555 C
--7848.209 8574.0039 L
--7848.209 8574.1914 -7848.2998 8574.373 -7848.4736 8574.5488 c
--7848.6455 8574.7256 -7848.9014 8574.8945 -7849.231 8575.0566 c
--7849.5615 8575.2197 -7849.9639 8575.373 -7850.4302 8575.5166 c
--7850.8984 8575.6602 -7851.4302 8575.7949 -7852.0186 8575.917 c
--7852.6079 8576.0391 -7853.2529 8576.1504 -7853.9438 8576.248 c
--7854.6377 8576.3447 -7855.376 8576.4277 -7856.1543 8576.4961 c
--7856.9326 8576.5645 -7857.749 8576.6191 -7858.5967 8576.6543 c
--7859.4438 8576.6895 -7860.3218 8576.709 -7861.2192 8576.709 c
--7862.1162 8576.709 -7862.9946 8576.6895 -7863.8408 8576.6543 c
--7864.687 8576.6191 -7865.5049 8576.5645 -7866.2822 8576.4961 c
--7867.061 8576.4277 -7867.8008 8576.3447 -7868.4927 8576.248 c
--7869.1846 8576.1504 -7869.8306 8576.0391 -7870.418 8575.917 c
--7871.0063 8575.7949 -7871.54 8575.6602 -7872.0063 8575.5166 c
--7872.4746 8575.373 -7872.8774 8575.2197 -7873.2065 8575.0566 c
--7873.5361 8574.8945 -7873.792 8574.7256 -7873.9658 8574.5488 c
--7874.1377 8574.373 -7874.2295 8574.1914 -7874.2295 8574.0039 C
--7874.2295 8572.8555 L
--7874.3975 8572.6621 -7874.4961 8572.4561 -7874.4961 8572.2383 C
--7874.2295 8572.2383 L
--7874.2295 8571.4912 L
--7874.2695 8571.4453 -7874.2974 8571.3965 -7874.3286 8571.3486 C
--7880.1768 8572.2051 -7884 8573.6191 -7884 8575.2207 c
--7884 8575.501 -7883.876 8575.7754 -7883.6514 8576.042 c
--7883.353 8576.3984 -7882.8682 8576.7402 -7882.21 8577.0645 C
--7882.21 8577.0645 L
--7881.0576 8577.6309 -7879.3896 8578.1406 -7877.3311 8578.5684 c
--7877.3281 8578.5693 -7877.3247 8578.5703 -7877.3232 8578.5703 c
--7875.7832 8578.8906 -7874.0234 8579.165 -7872.0942 8579.3828 c
--7872.083 8579.3848 -7872.0698 8579.3867 -7872.0562 8579.3877 c
--7871.4321 8579.458 -7870.7886 8579.5225 -7870.1318 8579.5801 c
--7870.1006 8579.584 -7870.0688 8579.5859 -7870.0361 8579.5879 c
--7869.3799 8579.6465 -7868.7065 8579.6973 -7868.0186 8579.7422 c
--7868.001 8579.7432 -7867.9834 8579.7441 -7867.9658 8579.7461 c
--7867.2832 8579.7891 -7866.5854 8579.8262 -7865.8774 8579.8574 c
--7865.833 8579.8594 -7865.7881 8579.8613 -7865.7422 8579.8633 c
--7864.2798 8579.9238 -7862.769 8579.957 -7861.2202 8579.957 c
--7859.6694 8579.957 -7858.1567 8579.9238 -7856.6958 8579.8633 c
--7856.6514 8579.8613 -7856.6055 8579.8594 -7856.5601 8579.8574 c
--7855.853 8579.8262 -7855.1567 8579.79 -7854.4766 8579.7461 c
--7854.4561 8579.7441 -7854.4346 8579.7432 -7854.4146 8579.7422 c
--7853.7305 8579.6973 -7853.0615 8579.6465 -7852.4072 8579.5898 c
--7852.3706 8579.5859 -7852.335 8579.583 -7852.2998 8579.5801 c
--7851.6465 8579.5215 -7851.0088 8579.458 -7850.3882 8579.3887 c
--7850.3706 8579.3867 -7850.3535 8579.3848 -7850.3369 8579.3828 c
--7845.8286 8578.8721 -7842.2422 8578.0547 -7840.229 8577.0645 C
--7840.229 8577.0645 L
--7839.7959 8576.8516 -7839.437 8576.6309 -7839.1553 8576.4043 c
--7838.689 8576.0254 -7838.4385 8575.6289 -7838.4385 8575.2207 c
--7838.4385 8573.6191 -7842.2617 8572.2051 -7848.1104 8571.3486 C
--7848.1392 8571.3965 -7848.1689 8571.4453 -7848.209 8571.4912 C
--7848.209 8572.2383 L
-f
-0.55 g
--7861.2202 8558.7959 m
--7866.9199 8558.7959 -7872.9287 8557.9863 -7874.2295 8556.4746 C
--7874.2295 8557.2227 L
--7874.0454 8557.2227 L
--7874.0454 8558.3994 -7868.7783 8559.7109 -7861.2202 8559.7109 c
--7853.6602 8559.7109 -7848.3921 8558.3994 -7848.3921 8557.2227 C
--7848.209 8557.2227 L
--7848.209 8556.4746 L
--7849.5088 8557.9863 -7855.5166 8558.7959 -7861.2202 8558.7959 c
-f
--7861.2202 8549.2402 m
--7866.9199 8549.2402 -7872.9287 8548.4307 -7874.2295 8546.9199 C
--7874.2295 8547.666 L
--7874.0454 8547.666 L
--7874.0454 8548.8438 -7868.7783 8550.1563 -7861.2202 8550.1563 c
--7853.6602 8550.1563 -7848.3921 8548.8438 -7848.3921 8547.666 C
--7848.209 8547.666 L
--7848.209 8546.9199 L
--7849.5088 8548.4307 -7855.5166 8549.2402 -7861.2202 8549.2402 c
-f
--7861.2202 8560.1611 m
--7866.9199 8560.1611 -7872.9287 8559.3516 -7874.2295 8557.8398 C
--7874.2295 8558.5879 L
--7874.0454 8558.5879 L
--7874.0454 8559.7646 -7868.7783 8561.0762 -7861.2202 8561.0762 c
--7853.6602 8561.0762 -7848.3921 8559.7646 -7848.3921 8558.5879 C
--7848.209 8558.5879 L
--7848.209 8557.8398 L
--7849.5088 8559.3516 -7855.5166 8560.1611 -7861.2202 8560.1611 c
-f
--7861.2202 8561.5264 m
--7866.9199 8561.5264 -7872.9287 8560.7168 -7874.2295 8559.2051 C
--7874.2295 8559.9531 L
--7874.0454 8559.9531 L
--7874.0454 8561.1299 -7868.7783 8562.4414 -7861.2202 8562.4414 c
--7853.6602 8562.4414 -7848.3921 8561.1299 -7848.3921 8559.9531 C
--7848.209 8559.9531 L
--7848.209 8559.2051 L
--7849.5088 8560.7168 -7855.5166 8561.5264 -7861.2202 8561.5264 c
-f
--7861.2202 8550.6055 m
--7866.9199 8550.6055 -7872.9287 8549.7959 -7874.2295 8548.2852 C
--7874.2295 8549.0322 L
--7874.0454 8549.0322 L
--7874.0454 8550.209 -7868.7783 8551.5205 -7861.2202 8551.5205 c
--7853.6602 8551.5205 -7848.3921 8550.209 -7848.3921 8549.0322 C
--7848.209 8549.0322 L
--7848.209 8548.2852 L
--7849.5088 8549.7959 -7855.5166 8550.6055 -7861.2202 8550.6055 c
-f
--7861.2202 8554.7012 m
--7866.9199 8554.7012 -7872.9287 8553.8906 -7874.2295 8552.3789 C
--7874.2295 8553.127 L
--7874.0454 8553.127 L
--7874.0454 8554.3047 -7868.7783 8555.6162 -7861.2202 8555.6162 c
--7853.6602 8555.6162 -7848.3921 8554.3047 -7848.3921 8553.127 C
--7848.209 8553.127 L
--7848.209 8552.3789 L
--7849.5088 8553.8906 -7855.5166 8554.7012 -7861.2202 8554.7012 c
-f
--7861.2202 8557.4316 m
--7866.9199 8557.4316 -7872.9287 8556.6211 -7874.2295 8555.1104 C
--7874.2295 8555.8574 L
--7874.0454 8555.8574 L
--7874.0454 8557.0342 -7868.7783 8558.3457 -7861.2202 8558.3457 c
--7853.6602 8558.3457 -7848.3921 8557.0342 -7848.3921 8555.8574 C
--7848.209 8555.8574 L
--7848.209 8555.1104 L
--7849.5088 8556.6211 -7855.5166 8557.4316 -7861.2202 8557.4316 c
-f
--7861.2202 8553.3359 m
--7866.9199 8553.3359 -7872.9287 8552.5254 -7874.2295 8551.0146 C
--7874.2295 8551.7617 L
--7874.0454 8551.7617 L
--7874.0454 8552.9395 -7868.7783 8554.25 -7861.2202 8554.25 c
--7853.6602 8554.25 -7848.3921 8552.9395 -7848.3921 8551.7617 C
--7848.209 8551.7617 L
--7848.209 8551.0146 L
--7849.5088 8552.5254 -7855.5166 8553.3359 -7861.2202 8553.3359 c
-f
--7861.2202 8543.7803 m
--7866.9199 8543.7803 -7872.9287 8542.9707 -7874.2295 8541.459 C
--7874.2295 8542.2061 L
--7874.0454 8542.2061 L
--7874.0454 8543.3828 -7868.7783 8544.6953 -7861.2202 8544.6953 c
--7853.6602 8544.6953 -7848.3921 8543.3828 -7848.3921 8542.2061 C
--7848.209 8542.2061 L
--7848.209 8541.459 L
--7849.5088 8542.9707 -7855.5166 8543.7803 -7861.2202 8543.7803 c
-f
--7861.2202 8546.5098 m
--7866.9199 8546.5098 -7872.9287 8545.7012 -7874.2295 8544.1895 C
--7874.2295 8544.9375 L
--7874.0454 8544.9375 L
--7874.0454 8546.1133 -7868.7783 8547.4248 -7861.2202 8547.4248 c
--7853.6602 8547.4248 -7848.3921 8546.1133 -7848.3921 8544.9375 C
--7848.209 8544.9375 L
--7848.209 8544.1895 L
--7849.5088 8545.7012 -7855.5166 8546.5098 -7861.2202 8546.5098 c
-f
--7861.2202 8556.0664 m
--7866.9199 8556.0664 -7872.9287 8555.2559 -7874.2295 8553.7451 C
--7874.2295 8554.4922 L
--7874.0454 8554.4922 L
--7874.0454 8555.6689 -7868.7783 8556.9805 -7861.2202 8556.9805 c
--7853.6602 8556.9805 -7848.3921 8555.6689 -7848.3921 8554.4922 C
--7848.209 8554.4922 L
--7848.209 8553.7451 L
--7849.5088 8555.2559 -7855.5166 8556.0664 -7861.2202 8556.0664 c
-f
--7861.2202 8551.9707 m
--7866.9199 8551.9707 -7872.9287 8551.1611 -7874.2295 8549.6504 C
--7874.2295 8550.3965 L
--7874.0454 8550.3965 L
--7874.0454 8551.5742 -7868.7783 8552.8857 -7861.2202 8552.8857 c
--7853.6602 8552.8857 -7848.3921 8551.5742 -7848.3921 8550.3965 C
--7848.209 8550.3965 L
--7848.209 8549.6504 L
--7849.5088 8551.1611 -7855.5166 8551.9707 -7861.2202 8551.9707 c
-f
--7861.2202 8545.1445 m
--7866.9199 8545.1445 -7872.9287 8544.3359 -7874.2295 8542.8242 C
--7874.2295 8543.5723 L
--7874.0454 8543.5723 L
--7874.0454 8544.748 -7868.7783 8546.0605 -7861.2202 8546.0605 c
--7853.6602 8546.0605 -7848.3921 8544.748 -7848.3921 8543.5723 C
--7848.209 8543.5723 L
--7848.209 8542.8242 L
--7849.5088 8544.3359 -7855.5166 8545.1445 -7861.2202 8545.1445 c
-f
--7861.2202 8547.875 m
--7866.9199 8547.875 -7872.9287 8547.0654 -7874.2295 8545.5547 C
--7874.2295 8546.3008 L
--7874.0454 8546.3008 L
--7874.0454 8547.4785 -7868.7783 8548.791 -7861.2202 8548.791 c
--7853.6602 8548.791 -7848.3921 8547.4785 -7848.3921 8546.3008 C
--7848.209 8546.3008 L
--7848.209 8545.5547 L
--7849.5088 8547.0654 -7855.5166 8547.875 -7861.2202 8547.875 c
-f
--7861.2202 8568.3516 m
--7866.9199 8568.3516 -7872.9287 8567.543 -7874.2295 8566.0313 C
--7874.2295 8566.7783 L
--7874.0454 8566.7783 L
--7874.0454 8567.9551 -7868.7783 8569.2666 -7861.2202 8569.2666 c
--7853.6602 8569.2666 -7848.3921 8567.9551 -7848.3921 8566.7783 C
--7848.209 8566.7783 L
--7848.209 8566.0313 L
--7849.5088 8567.543 -7855.5166 8568.3516 -7861.2202 8568.3516 c
-f
--7861.2202 8572.4473 m
--7866.9199 8572.4473 -7872.9287 8571.6377 -7874.2295 8570.127 C
--7874.2295 8570.873 L
--7874.0454 8570.873 L
--7874.0454 8572.0508 -7868.7783 8573.3623 -7861.2202 8573.3623 c
--7853.6602 8573.3623 -7848.3921 8572.0508 -7848.3921 8570.873 C
--7848.209 8570.873 L
--7848.209 8570.127 L
--7849.5088 8571.6377 -7855.5166 8572.4473 -7861.2202 8572.4473 c
-f
--7861.2202 8571.082 m
--7866.9199 8571.082 -7872.9287 8570.2715 -7874.2295 8568.7607 C
--7874.2295 8569.5078 L
--7874.0454 8569.5078 L
--7874.0454 8570.6855 -7868.7783 8571.998 -7861.2202 8571.998 c
--7853.6602 8571.998 -7848.3921 8570.6855 -7848.3921 8569.5078 C
--7848.209 8569.5078 L
--7848.209 8568.7607 L
--7849.5088 8570.2715 -7855.5166 8571.082 -7861.2202 8571.082 c
-f
--7861.2202 8562.8906 m
--7866.9199 8562.8906 -7872.9287 8562.082 -7874.2295 8560.5703 C
--7874.2295 8561.3184 L
--7874.0454 8561.3184 L
--7874.0454 8562.4941 -7868.7783 8563.8066 -7861.2202 8563.8066 c
--7853.6602 8563.8066 -7848.3921 8562.4941 -7848.3921 8561.3184 C
--7848.209 8561.3184 L
--7848.209 8560.5703 L
--7849.5088 8562.082 -7855.5166 8562.8906 -7861.2202 8562.8906 c
-f
--7861.2202 8566.9863 m
--7866.9199 8566.9863 -7872.9287 8566.1768 -7874.2295 8564.666 C
--7874.2295 8565.4131 L
--7874.0454 8565.4131 L
--7874.0454 8566.5898 -7868.7783 8567.9023 -7861.2202 8567.9023 c
--7853.6602 8567.9023 -7848.3921 8566.5898 -7848.3921 8565.4131 C
--7848.209 8565.4131 L
--7848.209 8564.666 L
--7849.5088 8566.1768 -7855.5166 8566.9863 -7861.2202 8566.9863 c
-f
--7861.2202 8565.6211 m
--7866.9199 8565.6211 -7872.9287 8564.8115 -7874.2295 8563.3008 C
--7874.2295 8564.0479 L
--7874.0454 8564.0479 L
--7874.0454 8565.2246 -7868.7783 8566.5371 -7861.2202 8566.5371 c
--7853.6602 8566.5371 -7848.3921 8565.2246 -7848.3921 8564.0479 C
--7848.209 8564.0479 L
--7848.209 8563.3008 L
--7849.5088 8564.8115 -7855.5166 8565.6211 -7861.2202 8565.6211 c
-f
--7861.2202 8564.2559 m
--7866.9199 8564.2559 -7872.9287 8563.4473 -7874.2295 8561.9355 C
--7874.2295 8562.6826 L
--7874.0454 8562.6826 L
--7874.0454 8563.8594 -7868.7783 8565.1719 -7861.2202 8565.1719 c
--7853.6602 8565.1719 -7848.3921 8563.8594 -7848.3921 8562.6826 C
--7848.209 8562.6826 L
--7848.209 8561.9355 L
--7849.5088 8563.4473 -7855.5166 8564.2559 -7861.2202 8564.2559 c
-f
--7861.2202 8569.7168 m
--7866.9199 8569.7168 -7872.9287 8568.9072 -7874.2295 8567.3965 C
--7874.2295 8568.1426 L
--7874.0454 8568.1426 L
--7874.0454 8569.3203 -7868.7783 8570.6318 -7861.2202 8570.6318 c
--7853.6602 8570.6318 -7848.3921 8569.3203 -7848.3921 8568.1426 C
--7848.209 8568.1426 L
--7848.209 8567.3965 L
--7849.5088 8568.9072 -7855.5166 8569.7168 -7861.2202 8569.7168 c
-f
--7852.3521 8539.5498 m
--7853.7134 8539.6699 -7855.145 8539.7637 -7856.6279 8539.8262 c
--7858.1104 8539.8887 -7859.6465 8539.9229 -7861.2202 8539.9229 c
--7862.792 8539.9229 -7864.3271 8539.8887 -7865.8096 8539.8262 c
--7867.293 8539.7637 -7868.7231 8539.6699 -7870.0854 8539.5498 c
--7871.4497 8539.4307 -7872.7432 8539.2852 -7873.9561 8539.1143 c
--7874.0498 8539.1016 -7874.1362 8539.085 -7874.2295 8539.0713 C
--7874.2295 8539.4766 L
--7874.0454 8539.4766 L
--7874.0454 8540.6523 -7868.7783 8541.9648 -7861.2202 8541.9648 c
--7853.6602 8541.9648 -7848.3921 8540.6523 -7848.3921 8539.4766 C
--7848.209 8539.4766 L
--7848.209 8539.0723 L
--7848.3018 8539.085 -7848.3882 8539.1016 -7848.4814 8539.1143 c
--7849.6934 8539.2852 -7850.9897 8539.4307 -7852.3521 8539.5498 c
-f
--7861.2202 8542.415 m
--7866.9199 8542.415 -7872.9287 8541.6055 -7874.2295 8540.0938 C
--7874.2295 8540.8418 L
--7874.0454 8540.8418 L
--7874.0454 8542.0186 -7868.7783 8543.3301 -7861.2202 8543.3301 c
--7853.6602 8543.3301 -7848.3921 8542.0186 -7848.3921 8540.8418 C
--7848.209 8540.8418 L
--7848.209 8540.0938 L
--7849.5088 8541.6055 -7855.5166 8542.415 -7861.2202 8542.415 c
-f
--7861.2202 8575.1768 m
--7866.9199 8575.1768 -7872.9287 8574.3672 -7874.2295 8572.8555 C
--7874.2295 8574.0039 L
--7874.2295 8574.1914 -7874.1377 8574.373 -7873.9658 8574.5488 c
--7873.792 8574.7256 -7873.5361 8574.8945 -7873.2065 8575.0566 c
--7872.8774 8575.2197 -7872.4746 8575.373 -7872.0063 8575.5166 c
--7871.54 8575.6602 -7871.0063 8575.7949 -7870.418 8575.917 c
--7869.8306 8576.0391 -7869.1846 8576.1504 -7868.4927 8576.248 c
--7867.8008 8576.3447 -7867.061 8576.4277 -7866.2822 8576.4961 c
--7865.5049 8576.5645 -7864.687 8576.6191 -7863.8408 8576.6543 c
--7862.9946 8576.6895 -7862.1162 8576.709 -7861.2192 8576.709 c
--7860.3218 8576.709 -7859.4438 8576.6895 -7858.5967 8576.6543 c
--7857.749 8576.6191 -7856.9326 8576.5645 -7856.1543 8576.4961 c
--7855.376 8576.4277 -7854.6377 8576.3447 -7853.9438 8576.248 c
--7853.2529 8576.1504 -7852.6079 8576.0391 -7852.0186 8575.917 c
--7851.4302 8575.7949 -7850.8984 8575.6602 -7850.4302 8575.5166 c
--7849.9639 8575.373 -7849.5615 8575.2197 -7849.231 8575.0566 c
--7848.9014 8574.8945 -7848.6455 8574.7256 -7848.4736 8574.5488 c
--7848.2998 8574.373 -7848.209 8574.1914 -7848.209 8574.0039 C
--7848.209 8572.8555 L
--7849.5088 8574.3672 -7855.5166 8575.1768 -7861.2202 8575.1768 c
-f
--7874.0454 8572.2383 m
--7874.0454 8573.415 -7868.7783 8574.7266 -7861.2202 8574.7266 c
--7853.6602 8574.7266 -7848.3921 8573.415 -7848.3921 8572.2383 C
--7848.209 8572.2383 L
--7848.209 8571.4912 L
--7849.5088 8573.002 -7855.5166 8573.8125 -7861.2202 8573.8125 c
--7866.9199 8573.8125 -7872.9287 8573.002 -7874.2295 8571.4912 C
--7874.2295 8572.2383 L
--7874.0454 8572.2383 L
-f
-0.15 g
--7861.2202 8541.9648 m
--7868.7783 8541.9648 -7874.0454 8540.6523 -7874.0454 8539.4766 C
--7874.2295 8539.4766 L
--7874.4961 8539.4766 L
--7874.4961 8539.6943 -7874.3975 8539.8994 -7874.2295 8540.0938 c
--7872.9287 8541.6055 -7866.9199 8542.415 -7861.2202 8542.415 c
--7855.5166 8542.415 -7849.5088 8541.6055 -7848.209 8540.0938 c
--7848.041 8539.8994 -7847.9424 8539.6943 -7847.9424 8539.4766 C
--7848.209 8539.4766 L
--7848.3921 8539.4766 L
--7848.3921 8540.6523 -7853.6602 8541.9648 -7861.2202 8541.9648 c
-f
--7861.2202 8543.3301 m
--7868.7783 8543.3301 -7874.0454 8542.0186 -7874.0454 8540.8418 C
--7874.2295 8540.8418 L
--7874.4961 8540.8418 L
--7874.4961 8541.0586 -7874.3975 8541.2637 -7874.2295 8541.459 c
--7872.9287 8542.9707 -7866.9199 8543.7803 -7861.2202 8543.7803 c
--7855.5166 8543.7803 -7849.5088 8542.9707 -7848.209 8541.459 c
--7848.041 8541.2637 -7847.9424 8541.0586 -7847.9424 8540.8418 C
--7848.209 8540.8418 L
--7848.3921 8540.8418 L
--7848.3921 8542.0186 -7853.6602 8543.3301 -7861.2202 8543.3301 c
-f
--7861.2202 8544.6953 m
--7868.7783 8544.6953 -7874.0454 8543.3828 -7874.0454 8542.2061 C
--7874.2295 8542.2061 L
--7874.4961 8542.2061 L
--7874.4961 8542.4238 -7874.3975 8542.6289 -7874.2295 8542.8242 c
--7872.9287 8544.3359 -7866.9199 8545.1445 -7861.2202 8545.1445 c
--7855.5166 8545.1445 -7849.5088 8544.3359 -7848.209 8542.8242 c
--7848.041 8542.6289 -7847.9424 8542.4238 -7847.9424 8542.2061 C
--7848.209 8542.2061 L
--7848.3921 8542.2061 L
--7848.3921 8543.3828 -7853.6602 8544.6953 -7861.2202 8544.6953 c
-f
--7861.2202 8546.0605 m
--7868.7783 8546.0605 -7874.0454 8544.748 -7874.0454 8543.5723 C
--7874.2295 8543.5723 L
--7874.4961 8543.5723 L
--7874.4961 8543.79 -7874.3975 8543.9951 -7874.2295 8544.1895 c
--7872.9287 8545.7012 -7866.9199 8546.5098 -7861.2202 8546.5098 c
--7855.5166 8546.5098 -7849.5088 8545.7012 -7848.209 8544.1895 c
--7848.041 8543.9951 -7847.9424 8543.79 -7847.9424 8543.5723 C
--7848.209 8543.5723 L
--7848.3921 8543.5723 L
--7848.3921 8544.748 -7853.6602 8546.0605 -7861.2202 8546.0605 c
-f
--7861.2202 8547.4248 m
--7868.7783 8547.4248 -7874.0454 8546.1133 -7874.0454 8544.9375 C
--7874.2295 8544.9375 L
--7874.4961 8544.9375 L
--7874.4961 8545.1543 -7874.3975 8545.3594 -7874.2295 8545.5547 c
--7872.9287 8547.0654 -7866.9199 8547.875 -7861.2202 8547.875 c
--7855.5166 8547.875 -7849.5088 8547.0654 -7848.209 8545.5547 c
--7848.041 8545.3594 -7847.9424 8545.1543 -7847.9424 8544.9375 C
--7848.209 8544.9375 L
--7848.3921 8544.9375 L
--7848.3921 8546.1133 -7853.6602 8547.4248 -7861.2202 8547.4248 c
-f
--7861.2202 8548.791 m
--7868.7783 8548.791 -7874.0454 8547.4785 -7874.0454 8546.3008 C
--7874.2295 8546.3008 L
--7874.4961 8546.3008 L
--7874.4961 8546.5195 -7874.3975 8546.7246 -7874.2295 8546.9199 c
--7872.9287 8548.4307 -7866.9199 8549.2402 -7861.2202 8549.2402 c
--7855.5166 8549.2402 -7849.5088 8548.4307 -7848.209 8546.9199 c
--7848.041 8546.7246 -7847.9424 8546.5195 -7847.9424 8546.3008 C
--7848.209 8546.3008 L
--7848.3921 8546.3008 L
--7848.3921 8547.4785 -7853.6602 8548.791 -7861.2202 8548.791 c
-f
--7861.2202 8550.1563 m
--7868.7783 8550.1563 -7874.0454 8548.8438 -7874.0454 8547.666 C
--7874.2295 8547.666 L
--7874.4961 8547.666 L
--7874.4961 8547.8848 -7874.3975 8548.0898 -7874.2295 8548.2852 c
--7872.9287 8549.7959 -7866.9199 8550.6055 -7861.2202 8550.6055 c
--7855.5166 8550.6055 -7849.5088 8549.7959 -7848.209 8548.2852 c
--7848.041 8548.0898 -7847.9424 8547.8848 -7847.9424 8547.666 C
--7848.209 8547.666 L
--7848.3921 8547.666 L
--7848.3921 8548.8438 -7853.6602 8550.1563 -7861.2202 8550.1563 c
-f
--7861.2202 8551.5205 m
--7868.7783 8551.5205 -7874.0454 8550.209 -7874.0454 8549.0322 C
--7874.2295 8549.0322 L
--7874.4961 8549.0322 L
--7874.4961 8549.25 -7874.3975 8549.4551 -7874.2295 8549.6504 c
--7872.9287 8551.1611 -7866.9199 8551.9707 -7861.2202 8551.9707 c
--7855.5166 8551.9707 -7849.5088 8551.1611 -7848.209 8549.6504 c
--7848.041 8549.4551 -7847.9424 8549.25 -7847.9424 8549.0322 C
--7848.209 8549.0322 L
--7848.3921 8549.0322 L
--7848.3921 8550.209 -7853.6602 8551.5205 -7861.2202 8551.5205 c
-f
--7861.2202 8552.8857 m
--7868.7783 8552.8857 -7874.0454 8551.5742 -7874.0454 8550.3965 C
--7874.2295 8550.3965 L
--7874.4961 8550.3965 L
--7874.4961 8550.6152 -7874.3975 8550.8203 -7874.2295 8551.0146 c
--7872.9287 8552.5254 -7866.9199 8553.3359 -7861.2202 8553.3359 c
--7855.5166 8553.3359 -7849.5088 8552.5254 -7848.209 8551.0146 c
--7848.041 8550.8203 -7847.9424 8550.6152 -7847.9424 8550.3965 C
--7848.209 8550.3965 L
--7848.3921 8550.3965 L
--7848.3921 8551.5742 -7853.6602 8552.8857 -7861.2202 8552.8857 c
-f
--7861.2202 8554.25 m
--7868.7783 8554.25 -7874.0454 8552.9395 -7874.0454 8551.7617 C
--7874.2295 8551.7617 L
--7874.4961 8551.7617 L
--7874.4961 8551.9795 -7874.3975 8552.1846 -7874.2295 8552.3789 c
--7872.9287 8553.8906 -7866.9199 8554.7012 -7861.2202 8554.7012 c
--7855.5166 8554.7012 -7849.5088 8553.8906 -7848.209 8552.3789 c
--7848.041 8552.1846 -7847.9424 8551.9795 -7847.9424 8551.7617 C
--7848.209 8551.7617 L
--7848.3921 8551.7617 L
--7848.3921 8552.9395 -7853.6602 8554.25 -7861.2202 8554.25 c
-f
--7861.2202 8555.6162 m
--7868.7783 8555.6162 -7874.0454 8554.3047 -7874.0454 8553.127 C
--7874.2295 8553.127 L
--7874.4961 8553.127 L
--7874.4961 8553.3457 -7874.3975 8553.5508 -7874.2295 8553.7451 c
--7872.9287 8555.2559 -7866.9199 8556.0664 -7861.2202 8556.0664 c
--7855.5166 8556.0664 -7849.5088 8555.2559 -7848.209 8553.7451 c
--7848.041 8553.5508 -7847.9424 8553.3457 -7847.9424 8553.127 C
--7848.209 8553.127 L
--7848.3921 8553.127 L
--7848.3921 8554.3047 -7853.6602 8555.6162 -7861.2202 8555.6162 c
-f
--7861.2202 8556.9805 m
--7868.7783 8556.9805 -7874.0454 8555.6689 -7874.0454 8554.4922 C
--7874.2295 8554.4922 L
--7874.4961 8554.4922 L
--7874.4961 8554.7109 -7874.3975 8554.916 -7874.2295 8555.1104 c
--7872.9287 8556.6211 -7866.9199 8557.4316 -7861.2202 8557.4316 c
--7855.5166 8557.4316 -7849.5088 8556.6211 -7848.209 8555.1104 c
--7848.041 8554.916 -7847.9424 8554.7109 -7847.9424 8554.4922 C
--7848.209 8554.4922 L
--7848.3921 8554.4922 L
--7848.3921 8555.6689 -7853.6602 8556.9805 -7861.2202 8556.9805 c
-f
--7861.2202 8558.3457 m
--7868.7783 8558.3457 -7874.0454 8557.0342 -7874.0454 8555.8574 C
--7874.2295 8555.8574 L
--7874.4961 8555.8574 L
--7874.4961 8556.0752 -7874.3975 8556.2803 -7874.2295 8556.4746 c
--7872.9287 8557.9863 -7866.9199 8558.7959 -7861.2202 8558.7959 c
--7855.5166 8558.7959 -7849.5088 8557.9863 -7848.209 8556.4746 c
--7848.041 8556.2803 -7847.9424 8556.0752 -7847.9424 8555.8574 C
--7848.209 8555.8574 L
--7848.3921 8555.8574 L
--7848.3921 8557.0342 -7853.6602 8558.3457 -7861.2202 8558.3457 c
-f
--7861.2202 8559.7109 m
--7868.7783 8559.7109 -7874.0454 8558.3994 -7874.0454 8557.2227 C
--7874.2295 8557.2227 L
--7874.4961 8557.2227 L
--7874.4961 8557.4395 -7874.3975 8557.6455 -7874.2295 8557.8398 c
--7872.9287 8559.3516 -7866.9199 8560.1611 -7861.2202 8560.1611 c
--7855.5166 8560.1611 -7849.5088 8559.3516 -7848.209 8557.8398 c
--7848.041 8557.6455 -7847.9424 8557.4395 -7847.9424 8557.2227 C
--7848.209 8557.2227 L
--7848.3921 8557.2227 L
--7848.3921 8558.3994 -7853.6602 8559.7109 -7861.2202 8559.7109 c
-f
--7861.2202 8561.0762 m
--7868.7783 8561.0762 -7874.0454 8559.7646 -7874.0454 8558.5879 C
--7874.2295 8558.5879 L
--7874.4961 8558.5879 L
--7874.4961 8558.8057 -7874.3975 8559.0107 -7874.2295 8559.2051 c
--7872.9287 8560.7168 -7866.9199 8561.5264 -7861.2202 8561.5264 c
--7855.5166 8561.5264 -7849.5088 8560.7168 -7848.209 8559.2051 c
--7848.041 8559.0107 -7847.9424 8558.8057 -7847.9424 8558.5879 C
--7848.209 8558.5879 L
--7848.3921 8558.5879 L
--7848.3921 8559.7646 -7853.6602 8561.0762 -7861.2202 8561.0762 c
-f
--7861.2202 8562.4414 m
--7868.7783 8562.4414 -7874.0454 8561.1299 -7874.0454 8559.9531 C
--7874.2295 8559.9531 L
--7874.4961 8559.9531 L
--7874.4961 8560.1709 -7874.3975 8560.376 -7874.2295 8560.5703 c
--7872.9287 8562.082 -7866.9199 8562.8906 -7861.2202 8562.8906 c
--7855.5166 8562.8906 -7849.5088 8562.082 -7848.209 8560.5703 c
--7848.041 8560.376 -7847.9424 8560.1709 -7847.9424 8559.9531 C
--7848.209 8559.9531 L
--7848.3921 8559.9531 L
--7848.3921 8561.1299 -7853.6602 8562.4414 -7861.2202 8562.4414 c
-f
--7861.2202 8563.8066 m
--7868.7783 8563.8066 -7874.0454 8562.4941 -7874.0454 8561.3184 C
--7874.2295 8561.3184 L
--7874.4961 8561.3184 L
--7874.4961 8561.5352 -7874.3975 8561.7412 -7874.2295 8561.9355 c
--7872.9287 8563.4473 -7866.9199 8564.2559 -7861.2202 8564.2559 c
--7855.5166 8564.2559 -7849.5088 8563.4473 -7848.209 8561.9355 c
--7848.041 8561.7412 -7847.9424 8561.5352 -7847.9424 8561.3184 C
--7848.209 8561.3184 L
--7848.3921 8561.3184 L
--7848.3921 8562.4941 -7853.6602 8563.8066 -7861.2202 8563.8066 c
-f
--7861.2202 8565.1719 m
--7868.7783 8565.1719 -7874.0454 8563.8594 -7874.0454 8562.6826 C
--7874.2295 8562.6826 L
--7874.4961 8562.6826 L
--7874.4961 8562.9004 -7874.3975 8563.1055 -7874.2295 8563.3008 c
--7872.9287 8564.8115 -7866.9199 8565.6211 -7861.2202 8565.6211 c
--7855.5166 8565.6211 -7849.5088 8564.8115 -7848.209 8563.3008 c
--7848.041 8563.1055 -7847.9424 8562.9004 -7847.9424 8562.6826 C
--7848.209 8562.6826 L
--7848.3921 8562.6826 L
--7848.3921 8563.8594 -7853.6602 8565.1719 -7861.2202 8565.1719 c
-f
--7861.2202 8566.5371 m
--7868.7783 8566.5371 -7874.0454 8565.2246 -7874.0454 8564.0479 C
--7874.2295 8564.0479 L
--7874.4961 8564.0479 L
--7874.4961 8564.2656 -7874.3975 8564.4707 -7874.2295 8564.666 c
--7872.9287 8566.1768 -7866.9199 8566.9863 -7861.2202 8566.9863 c
--7855.5166 8566.9863 -7849.5088 8566.1768 -7848.209 8564.666 c
--7848.041 8564.4707 -7847.9424 8564.2656 -7847.9424 8564.0479 C
--7848.209 8564.0479 L
--7848.3921 8564.0479 L
--7848.3921 8565.2246 -7853.6602 8566.5371 -7861.2202 8566.5371 c
-f
--7861.2202 8567.9023 m
--7868.7783 8567.9023 -7874.0454 8566.5898 -7874.0454 8565.4131 C
--7874.2295 8565.4131 L
--7874.4961 8565.4131 L
--7874.4961 8565.6309 -7874.3975 8565.8359 -7874.2295 8566.0313 c
--7872.9287 8567.543 -7866.9199 8568.3516 -7861.2202 8568.3516 c
--7855.5166 8568.3516 -7849.5088 8567.543 -7848.209 8566.0313 c
--7848.041 8565.8359 -7847.9424 8565.6309 -7847.9424 8565.4131 C
--7848.209 8565.4131 L
--7848.3921 8565.4131 L
--7848.3921 8566.5898 -7853.6602 8567.9023 -7861.2202 8567.9023 c
-f
--7861.2202 8569.2666 m
--7868.7783 8569.2666 -7874.0454 8567.9551 -7874.0454 8566.7783 C
--7874.2295 8566.7783 L
--7874.4961 8566.7783 L
--7874.4961 8566.9961 -7874.3975 8567.2012 -7874.2295 8567.3965 c
--7872.9287 8568.9072 -7866.9199 8569.7168 -7861.2202 8569.7168 c
--7855.5166 8569.7168 -7849.5088 8568.9072 -7848.209 8567.3965 c
--7848.041 8567.2012 -7847.9424 8566.9961 -7847.9424 8566.7783 C
--7848.209 8566.7783 L
--7848.3921 8566.7783 L
--7848.3921 8567.9551 -7853.6602 8569.2666 -7861.2202 8569.2666 c
-f
--7861.2202 8570.6318 m
--7868.7783 8570.6318 -7874.0454 8569.3203 -7874.0454 8568.1426 C
--7874.2295 8568.1426 L
--7874.4961 8568.1426 L
--7874.4961 8568.3613 -7874.3975 8568.5664 -7874.2295 8568.7607 c
--7872.9287 8570.2715 -7866.9199 8571.082 -7861.2202 8571.082 c
--7855.5166 8571.082 -7849.5088 8570.2715 -7848.209 8568.7607 c
--7848.041 8568.5664 -7847.9424 8568.3613 -7847.9424 8568.1426 C
--7848.209 8568.1426 L
--7848.3921 8568.1426 L
--7848.3921 8569.3203 -7853.6602 8570.6318 -7861.2202 8570.6318 c
-f
--7861.2202 8571.998 m
--7868.7783 8571.998 -7874.0454 8570.6855 -7874.0454 8569.5078 C
--7874.2295 8569.5078 L
--7874.4961 8569.5078 L
--7874.4961 8569.7266 -7874.3975 8569.9316 -7874.2295 8570.127 c
--7872.9287 8571.6377 -7866.9199 8572.4473 -7861.2202 8572.4473 c
--7855.5166 8572.4473 -7849.5088 8571.6377 -7848.209 8570.127 c
--7848.041 8569.9316 -7847.9424 8569.7266 -7847.9424 8569.5078 C
--7848.209 8569.5078 L
--7848.3921 8569.5078 L
--7848.3921 8570.6855 -7853.6602 8571.998 -7861.2202 8571.998 c
-f
--7861.2202 8573.3623 m
--7868.7783 8573.3623 -7874.0454 8572.0508 -7874.0454 8570.873 C
--7874.2295 8570.873 L
--7874.4961 8570.873 L
--7874.4961 8571.0391 -7874.4282 8571.1953 -7874.3286 8571.3486 c
--7874.2974 8571.3965 -7874.2695 8571.4453 -7874.2295 8571.4912 c
--7872.9287 8573.002 -7866.9199 8573.8125 -7861.2202 8573.8125 c
--7855.5166 8573.8125 -7849.5088 8573.002 -7848.209 8571.4912 c
--7848.1689 8571.4453 -7848.1392 8571.3965 -7848.1104 8571.3486 c
--7848.0103 8571.1953 -7847.9424 8571.0391 -7847.9424 8570.873 C
--7848.209 8570.873 L
--7848.3921 8570.873 L
--7848.3921 8572.0508 -7853.6602 8573.3623 -7861.2202 8573.3623 c
-f
--7861.2202 8574.7266 m
--7868.7783 8574.7266 -7874.0454 8573.415 -7874.0454 8572.2383 C
--7874.2295 8572.2383 L
--7874.4961 8572.2383 L
--7874.4961 8572.4561 -7874.3975 8572.6621 -7874.2295 8572.8555 c
--7872.9287 8574.3672 -7866.9199 8575.1768 -7861.2202 8575.1768 c
--7855.5166 8575.1768 -7849.5088 8574.3672 -7848.209 8572.8555 c
--7848.041 8572.6621 -7847.9424 8572.4561 -7847.9424 8572.2383 C
--7848.209 8572.2383 L
--7848.3921 8572.2383 L
--7848.3921 8573.415 -7853.6602 8574.7266 -7861.2202 8574.7266 c
-f
-0.8 g
--7839.0342 8530.2168 m
--7839.3311 8530.4834 -7839.7271 8530.7402 -7840.229 8530.9863 c
--7840.231 8530.9883 -7840.2334 8530.9893 -7840.2358 8530.9902 c
--7840.5225 8531.1309 -7840.8394 8531.2676 -7841.187 8531.4004 c
--7841.187 8531.4004 l
--7841.8857 8531.668 -7842.7026 8531.9189 -7843.626 8532.1523 c
--7843.6362 8532.1543 -7843.647 8532.1572 -7843.6582 8532.1602 c
--7845.501 8532.623 -7847.7583 8533.0117 -7850.313 8533.3018 c
--7850.3457 8533.3047 -7850.3774 8533.3086 -7850.4111 8533.3125 c
--7851.6626 8533.4531 -7852.9834 8533.5703 -7854.3599 8533.6602 c
--7854.4209 8533.6641 -7854.4785 8533.668 -7854.5366 8533.6719 c
--7855.1743 8533.7119 -7855.8232 8533.7461 -7856.4824 8533.7754 c
--7856.5313 8533.7773 -7856.5791 8533.7813 -7856.6279 8533.7832 c
--7856.6758 8533.7852 -7856.7246 8533.7861 -7856.7729 8533.7881 c
--7857.4561 8533.8164 -7858.1514 8533.8379 -7858.856 8533.8535 c
--7858.8774 8533.8535 -7858.8994 8533.8545 -7858.9209 8533.8545 c
--7859.6768 8533.8711 -7860.4424 8533.8789 -7861.2202 8533.8789 c
--7861.9951 8533.8789 -7862.7607 8533.8711 -7863.5166 8533.8545 c
--7863.5391 8533.8545 -7863.5601 8533.8535 -7863.582 8533.8535 c
--7864.2871 8533.8379 -7864.9814 8533.8164 -7865.667 8533.7881 c
--7865.7134 8533.7861 -7865.7642 8533.7852 -7865.8096 8533.7832 c
--7865.8608 8533.7813 -7865.9058 8533.7773 -7865.9561 8533.7754 c
--7866.6162 8533.7461 -7867.2666 8533.7119 -7867.9038 8533.6709 c
--7867.9609 8533.668 -7868.0166 8533.6641 -7868.0718 8533.6602 c
--7869.4526 8533.5703 -7870.7783 8533.4531 -7872.0322 8533.3125 c
--7872.0615 8533.3086 -7872.0898 8533.3057 -7872.1201 8533.3027 c
--7874.6768 8533.0117 -7876.9385 8532.623 -7878.7822 8532.1592 c
--7878.792 8532.1572 -7878.8018 8532.1543 -7878.811 8532.1523 c
--7880.1934 8531.8027 -7881.3408 8531.4121 -7882.2026 8530.9902 c
--7882.2041 8530.9893 -7882.208 8530.9883 -7882.21 8530.9863 c
--7882.4639 8530.8613 -7882.6904 8530.7324 -7882.8936 8530.6016 c
--7883.3799 8530.29 -7883.7178 8529.9639 -7883.8818 8529.627 c
--7883.96 8529.4688 -7884 8529.3066 -7884 8529.1426 C
--7884 8535.1855 L
--7884 8535.5137 -7883.8408 8535.832 -7883.5361 8536.1406 c
--7883.2334 8536.4492 -7882.7866 8536.7461 -7882.21 8537.0303 c
--7881.6328 8537.3125 -7880.9287 8537.583 -7880.1089 8537.834 c
--7879.29 8538.0859 -7878.3584 8538.3203 -7877.3271 8538.5352 c
--7876.377 8538.7324 -7875.335 8538.9121 -7874.2295 8539.0713 c
--7874.1362 8539.085 -7874.0498 8539.1016 -7873.9561 8539.1143 c
--7872.7432 8539.2852 -7871.4497 8539.4307 -7870.0854 8539.5498 c
--7868.7231 8539.6699 -7867.293 8539.7637 -7865.8096 8539.8262 c
--7864.3271 8539.8887 -7862.792 8539.9229 -7861.2202 8539.9229 c
--7859.6465 8539.9229 -7858.1104 8539.8887 -7856.6279 8539.8262 c
--7855.145 8539.7637 -7853.7134 8539.6699 -7852.3521 8539.5498 c
--7850.9897 8539.4307 -7849.6934 8539.2852 -7848.4814 8539.1143 c
--7848.3882 8539.1016 -7848.3018 8539.085 -7848.209 8539.0723 c
--7847.105 8538.9121 -7846.0615 8538.7324 -7845.1104 8538.5352 c
--7844.0801 8538.3203 -7843.147 8538.0859 -7842.3286 8537.834 c
--7841.5103 8537.583 -7840.8042 8537.3125 -7840.229 8537.0303 c
--7839.6514 8536.7461 -7839.2041 8536.4492 -7838.9009 8536.1406 c
--7838.5967 8535.832 -7838.4385 8535.5137 -7838.4385 8535.1855 C
--7838.4385 8529.1426 L
--7838.4385 8529.3887 -7838.5278 8529.6289 -7838.7002 8529.8643 c
--7838.7881 8529.9834 -7838.9038 8530.1016 -7839.0342 8530.2168 c
-f
-0.5 g
--7845.9463 8525.6279 m
--7847.4521 8528.6533 -7849.7656 8530.1738 -7849.8774 8530.2461 C
--7849.9346 8530.2813 L
--7873.333 8530.2813 L
--7873.3887 8529.8389 L
--7873.3638 8529.832 -7871.0127 8529.166 -7868.5498 8524.6582 C
--7877.5342 8525.293 -7884 8527.0605 -7884 8529.1426 c
--7884 8529.3066 -7883.96 8529.4688 -7883.8818 8529.627 c
--7883.7178 8529.9639 -7883.3799 8530.29 -7882.8936 8530.6016 c
--7882.687 8530.7344 -7882.46 8530.8633 -7882.2026 8530.9902 c
--7881.3408 8531.4121 -7880.1934 8531.8027 -7878.811 8532.1523 c
--7878.8018 8532.1543 -7878.792 8532.1572 -7878.7822 8532.1592 c
--7876.9385 8532.623 -7874.6768 8533.0117 -7872.1201 8533.3027 c
--7872.0898 8533.3057 -7872.0615 8533.3086 -7872.0322 8533.3125 c
--7870.7783 8533.4531 -7869.4526 8533.5703 -7868.0718 8533.6602 c
--7868.0166 8533.6641 -7867.9609 8533.668 -7867.9038 8533.6709 c
--7867.2666 8533.7119 -7866.6162 8533.7461 -7865.9561 8533.7754 c
--7865.8594 8533.7793 -7865.7642 8533.7842 -7865.667 8533.7881 c
--7864.9814 8533.8164 -7864.2871 8533.8379 -7863.582 8533.8535 c
--7863.5601 8533.8535 -7863.5391 8533.8545 -7863.5166 8533.8545 c
--7862.7607 8533.8711 -7861.9951 8533.8789 -7861.2202 8533.8789 c
--7860.4424 8533.8789 -7859.6768 8533.8711 -7858.9209 8533.8545 c
--7858.8994 8533.8545 -7858.8774 8533.8535 -7858.856 8533.8535 c
--7858.1514 8533.8379 -7857.4561 8533.8164 -7856.7729 8533.7881 c
--7856.6758 8533.7842 -7856.5791 8533.7793 -7856.4824 8533.7754 c
--7855.8232 8533.7461 -7855.1743 8533.7119 -7854.5366 8533.6719 c
--7854.4785 8533.668 -7854.4209 8533.6641 -7854.3599 8533.6602 c
--7852.9834 8533.5703 -7851.6626 8533.4531 -7850.4111 8533.3125 c
--7850.3774 8533.3086 -7850.3457 8533.3047 -7850.313 8533.3018 c
--7847.7583 8533.0117 -7845.501 8532.623 -7843.6582 8532.1602 c
--7843.647 8532.1572 -7843.6362 8532.1543 -7843.626 8532.1523 c
--7842.7026 8531.9189 -7841.8857 8531.668 -7841.187 8531.4004 C
--7841.187 8531.4004 L
--7840.8394 8531.2676 -7840.5225 8531.1309 -7840.2358 8530.9902 c
--7839.731 8530.7432 -7839.332 8530.4844 -7839.0342 8530.2168 c
--7838.9038 8530.1016 -7838.7881 8529.9834 -7838.7002 8529.8643 c
--7838.5278 8529.6289 -7838.4385 8529.3887 -7838.4385 8529.1426 c
--7838.4385 8527.748 -7841.3359 8526.4951 -7845.9463 8525.6279 C
-f
-*u
-1 g
-1 D
--7867.7471 8524.0996 m
--7866.8584 8522.3203 -7866.5679 8520.6797 -7866.5679 8519.0811 c
--7866.5679 8517.6328 -7866.8057 8516.2178 -7867.0498 8514.7646 c
--7867.2959 8513.2949 -7867.5498 8511.7852 -7867.5498 8510.1855 c
--7867.5498 8509.792 -7867.5352 8509.3926 -7867.5 8508.9863 c
--7867.0518 8503.7461 -7861.4072 8501.1475 -7861.3506 8501.1221 C
--7840.5649 8501.1396 -7839.0386 8501.1406 V
--7840.1807 8501.8877 -7842.5088 8503.7266 -7844.8066 8507.5039 c
--7845.8433 8509.2051 -7846.1567 8511.1133 -7846.1567 8513.041 c
--7846.1567 8514.5996 -7845.9512 8516.1699 -7845.7578 8517.6523 c
--7845.5791 8519.0303 -7845.4038 8520.3633 -7845.4038 8521.5723 c
--7845.4038 8522.4287 -7845.4912 8523.2236 -7845.7256 8523.9277 c
--7846.9727 8527.6641 -7849.792 8529.6445 -7850.0713 8529.832 C
--7850.2046 8529.832 -7870.5674 8529.832 -7872.3569 8529.832 C
--7871.3154 8529.1973 -7869.5391 8527.6836 -7867.7471 8524.0996 c
-f
-0 D
--7850.8975 8526.2422 m
--7865.9287 8526.2422 L
--7865.9287 8526.6914 L
--7850.8975 8526.6914 L
--7850.8975 8526.2422 L
-f
--7849.1025 8512.1074 m
--7863.9087 8512.1074 L
--7863.9087 8512.5566 L
--7849.1025 8512.5566 L
--7849.1025 8512.1074 L
-f
--7863.4609 8517.7168 m
--7863.4609 8518.166 L
--7848.4297 8518.166 L
--7848.4297 8517.7168 L
--7863.4609 8517.7168 L
-f
--7863.6855 8515.9219 m
--7850.001 8515.9219 L
--7850.001 8515.4727 L
--7863.6855 8515.4727 L
--7863.6855 8515.9219 L
-f
--7863.4609 8521.3076 m
--7848.6538 8521.3076 L
--7848.6538 8520.8574 L
--7863.4609 8520.8574 L
--7863.4609 8521.3076 L
-f
--7861.2178 8503.583 m
--7845.7378 8503.583 L
--7845.7378 8503.1328 L
--7861.2178 8503.1328 L
--7861.2178 8503.583 L
-f
--7862.7881 8505.3779 m
--7850.4497 8505.3779 L
--7850.4497 8504.9277 L
--7862.7881 8504.9277 L
--7862.7881 8505.3779 L
-f
--7863.9087 8507.8457 m
--7848.2041 8507.8457 L
--7848.2041 8507.3945 L
--7863.9087 8507.3945 L
--7863.9087 8507.8457 L
-f
--7864.3584 8510.3135 m
--7848.6538 8510.3135 L
--7848.6538 8509.8633 L
--7864.3584 8509.8633 L
--7864.3584 8510.3135 L
-f
--7864.3584 8524 m
--7849.7754 8524 L
--7849.7754 8523.5488 L
--7864.3584 8523.5488 L
--7864.3584 8524 L
-f
-*U
-*u
-0 g
-1 D
--7868.5498 8524.6582 m
--7868.417 8524.4141 -7868.2832 8524.166 -7868.1494 8523.8984 c
--7866.519 8520.6387 -7866.9937 8517.8213 -7867.4946 8514.8389 c
--7867.8057 8512.9785 -7868.1294 8511.0557 -7867.9482 8508.9473 c
--7867.4766 8503.4404 -7861.5938 8500.7383 -7861.4424 8500.6914 C
--7838.2168 8500.6914 L
--7838.1201 8501.1191 L
--7838.1514 8501.1348 -7841.3599 8502.7051 -7844.4238 8507.7373 c
--7846.2144 8510.6797 -7845.7559 8514.1953 -7845.311 8517.5947 c
--7844.9966 8520.002 -7844.7007 8522.2754 -7845.2993 8524.0703 c
--7845.4858 8524.6289 -7845.707 8525.1465 -7845.9463 8525.6279 c
--7847.4521 8528.6533 -7849.7656 8530.1738 -7849.8774 8530.2461 C
--7849.9346 8530.2813 L
--7873.333 8530.2813 L
--7873.3887 8529.8389 L
--7873.3638 8529.832 -7871.0127 8529.166 -7868.5498 8524.6582 c
-f
-0 D
--7867.7471 8524.0996 m
--7869.5391 8527.6836 -7871.3154 8529.1973 -7872.3569 8529.832 C
--7870.5674 8529.832 -7850.2046 8529.832 -7850.0713 8529.832 C
--7849.792 8529.6445 -7846.9727 8527.6641 -7845.7256 8523.9277 c
--7845.4912 8523.2236 -7845.4038 8522.4287 -7845.4038 8521.5723 c
--7845.4038 8520.3633 -7845.5791 8519.0303 -7845.7578 8517.6523 c
--7845.9512 8516.1699 -7846.1567 8514.5996 -7846.1567 8513.041 c
--7846.1567 8511.1133 -7845.8433 8509.2051 -7844.8066 8507.5039 c
--7842.5088 8503.7266 -7840.1807 8501.8877 -7839.0386 8501.1406 C
--7840.5649 8501.1396 -7861.3506 8501.1221 Y
--7861.4072 8501.1475 -7867.0518 8503.7461 -7867.5 8508.9863 c
--7867.5352 8509.3926 -7867.5498 8509.792 -7867.5498 8510.1855 c
--7867.5498 8511.7852 -7867.2959 8513.2949 -7867.0498 8514.7646 c
--7866.8057 8516.2178 -7866.5679 8517.6328 -7866.5679 8519.0811 c
--7866.5679 8520.6797 -7866.8584 8522.3203 -7867.7471 8524.0996 c
-f
-*U
--7845.7378 8503.1328 m
--7861.2178 8503.1328 L
--7861.2178 8503.583 L
--7845.7378 8503.583 L
--7845.7378 8503.1328 L
-f
--7850.4497 8504.9277 m
--7862.7881 8504.9277 L
--7862.7881 8505.3779 L
--7850.4497 8505.3779 L
--7850.4497 8504.9277 L
-f
--7848.2041 8507.3945 m
--7863.9087 8507.3945 L
--7863.9087 8507.8457 L
--7848.2041 8507.8457 L
--7848.2041 8507.3945 L
-f
--7848.6538 8509.8633 m
--7864.3584 8509.8633 L
--7864.3584 8510.3135 L
--7848.6538 8510.3135 L
--7848.6538 8509.8633 L
-f
--7863.9087 8512.5566 m
--7849.1025 8512.5566 L
--7849.1025 8512.1074 L
--7863.9087 8512.1074 L
--7863.9087 8512.5566 L
-f
--7850.001 8515.4727 m
--7863.6855 8515.4727 L
--7863.6855 8515.9219 L
--7850.001 8515.9219 L
--7850.001 8515.4727 L
-f
--7863.4609 8518.166 m
--7848.4297 8518.166 L
--7848.4297 8517.7168 L
--7863.4609 8517.7168 L
--7863.4609 8518.166 L
-f
--7848.6538 8520.8574 m
--7863.4609 8520.8574 L
--7863.4609 8521.3076 L
--7848.6538 8521.3076 L
--7848.6538 8520.8574 L
-f
--7849.7754 8523.5488 m
--7864.3584 8523.5488 L
--7864.3584 8524 L
--7849.7754 8524 L
--7849.7754 8523.5488 L
-f
--7865.9287 8526.6914 m
--7850.8975 8526.6914 L
--7850.8975 8526.2422 L
--7865.9287 8526.2422 L
--7865.9287 8526.6914 L
-f
-U
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 9)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7883.25 8585.25 m
--7840.7246 8585.25 L
--7840.7246 8555.5381 L
--7883.25 8555.5381 L
--7883.25 8585.25 L
-n
-u
-u
-0 O
-0.7 g
--7872.457 8555.7881 m
--7868.6582 8555.7881 -7864.9199 8555.7881 v
--7861.1826 8555.7881 -7861.8242 8558.8838 y
--7845.9258 8558.8838 -7843.4502 8558.8838 v
--7840.9761 8558.8838 -7840.9761 8561.3594 y
--7840.9761 8578.542 l
--7876.541 8578.542 l
--7876.541 8558.9004 l
--7875.3906 8558.9004 l
--7875.439 8555.7881 -7872.457 8555.7881 v
-f
-0 R
-0.9 G
-0.5 w
--7861.8242 8558.8838 m
--7845.9258 8558.8838 -7843.4502 8558.8838 v
-S
-0.5 G
--7862.8594 8556.2715 m
--7861.4634 8557.1426 -7861.8242 8558.8838 y
-S
-0.7 G
--7864.9199 8555.7881 m
--7863.9858 8555.7881 -7863.3247 8555.9814 -7862.8594 8556.2715 c
-S
-0.9 G
--7876.541 8578.542 m
--7876.541 8558.9004 l
--7875.3906 8558.9004 l
--7875.439 8555.7881 -7872.457 8555.7881 v
--7868.6582 8555.7881 -7864.9199 8555.7881 v
-S
-0.25 G
--7840.9761 8561.3594 m
--7840.9761 8578.542 l
--7876.541 8578.542 l
-S
-0.5 G
--7842.019 8559.2715 m
--7840.9761 8559.9668 -7840.9761 8561.3594 y
-S
-0.7 G
--7843.4502 8558.8838 m
--7842.8306 8558.8838 -7842.3672 8559.0391 -7842.019 8559.2715 c
-S
-U
-u
-0 O
-0.7 g
-1 w
--7874.0718 8557.4023 m
--7870.2729 8557.4023 -7866.5342 8557.4023 v
--7862.7954 8557.4023 -7863.439 8560.498 y
--7847.541 8560.498 -7845.0649 8560.498 v
--7842.5903 8560.498 -7842.5903 8562.9727 y
--7842.5903 8580.1563 l
--7878.1558 8580.1563 l
--7878.1558 8560.5146 l
--7877.0054 8560.5146 l
--7877.0542 8557.4023 -7874.0718 8557.4023 v
-f
-0 R
-0.9 G
-0.5 w
--7863.439 8560.498 m
--7847.541 8560.498 -7845.0649 8560.498 v
-S
-0.5 G
--7864.4746 8557.8867 m
--7863.0767 8558.7578 -7863.439 8560.498 y
-S
-0.7 G
--7866.5342 8557.4023 m
--7865.6006 8557.4023 -7864.9409 8557.5957 -7864.4746 8557.8867 c
-S
-0.9 G
--7878.1558 8580.1563 m
--7878.1558 8560.5146 l
--7877.0054 8560.5146 l
--7877.0542 8557.4023 -7874.0718 8557.4023 v
--7870.2729 8557.4023 -7866.5342 8557.4023 v
-S
-0.25 G
--7842.5903 8562.9727 m
--7842.5903 8580.1563 l
--7878.1558 8580.1563 l
-S
-0.5 G
--7843.6338 8560.8848 m
--7842.5903 8561.5811 -7842.5903 8562.9727 y
-S
-0.7 G
--7845.0649 8560.498 m
--7844.4458 8560.498 -7843.981 8560.6533 -7843.6338 8560.8848 c
-S
-U
-u
-0 O
-0.7 g
-1 w
--7875.6846 8559.0176 m
--7871.8882 8559.0176 -7868.1489 8559.0176 v
--7864.4111 8559.0176 -7865.0527 8562.1123 y
--7849.1538 8562.1123 -7846.6802 8562.1123 v
--7844.2046 8562.1123 -7844.2046 8564.5879 y
--7844.2046 8581.7715 l
--7879.771 8581.7715 l
--7879.771 8562.1289 l
--7878.6191 8562.1289 l
--7878.6689 8559.0176 -7875.6846 8559.0176 v
-f
-0 R
-0.9 G
-0.5 w
--7865.0527 8562.1123 m
--7849.1538 8562.1123 -7846.6802 8562.1123 v
-S
-0.5 G
--7866.0898 8559.5 m
--7864.6929 8560.3711 -7865.0527 8562.1123 y
-S
-0.7 G
--7868.1489 8559.0176 m
--7867.2144 8559.0176 -7866.5542 8559.21 -7866.0898 8559.5 c
-S
-0.9 G
--7879.771 8581.7715 m
--7879.771 8562.1289 l
--7878.6191 8562.1289 l
--7878.6689 8559.0176 -7875.6846 8559.0176 v
--7871.8882 8559.0176 -7868.1489 8559.0176 v
-S
-0.25 G
--7844.2046 8564.5879 m
--7844.2046 8581.7715 l
--7879.771 8581.7715 l
-S
-0.5 G
--7845.249 8562.5 m
--7844.2046 8563.1953 -7844.2046 8564.5879 y
-S
-0.7 G
--7846.6802 8562.1123 m
--7846.061 8562.1123 -7845.5962 8562.2676 -7845.249 8562.5 c
-S
-U
-u
-0 O
-0.7 g
-1 w
--7877.2993 8560.6318 m
--7873.5034 8560.6318 -7869.7642 8560.6318 v
--7866.0254 8560.6318 -7866.667 8563.7275 y
--7850.769 8563.7275 -7848.2935 8563.7275 v
--7845.8193 8563.7275 -7845.8193 8566.2031 y
--7845.8193 8583.3867 l
--7881.3857 8583.3867 l
--7881.3857 8563.7441 l
--7880.2334 8563.7441 l
--7880.2842 8560.6318 -7877.2993 8560.6318 v
-f
-0 R
-0.9 G
-0.5 w
--7866.667 8563.7275 m
--7850.769 8563.7275 -7848.2935 8563.7275 v
-S
-0.5 G
--7867.7046 8561.1152 m
--7866.3071 8561.9863 -7866.667 8563.7275 y
-S
-0.7 G
--7869.7642 8560.6318 m
--7868.8286 8560.6318 -7868.1689 8560.8252 -7867.7046 8561.1152 c
-S
-0.9 G
--7881.3857 8583.3867 m
--7881.3857 8563.7441 l
--7880.2334 8563.7441 l
--7880.2842 8560.6318 -7877.2993 8560.6318 v
--7873.5034 8560.6318 -7869.7642 8560.6318 v
-S
-0.25 G
--7845.8193 8566.2031 m
--7845.8193 8583.3867 l
--7881.3857 8583.3867 l
-S
-0.5 G
--7846.8638 8564.1143 m
--7845.8193 8564.8105 -7845.8193 8566.2031 y
-S
-0.7 G
--7848.2935 8563.7275 m
--7847.6753 8563.7275 -7847.2114 8563.8828 -7846.8638 8564.1143 c
-S
-U
-u
-0 O
-0.8 g
-1 w
--7878.9146 8562.2461 m
--7875.1167 8562.2461 -7871.3794 8562.2461 v
--7867.6401 8562.2461 -7868.2817 8565.3418 y
--7852.3838 8565.3418 -7849.9087 8565.3418 v
--7847.4346 8565.3418 -7847.4346 8567.8174 y
--7847.4346 8585 l
--7883.001 8585 l
--7883.001 8565.3574 l
--7881.8481 8565.3574 l
--7881.8994 8562.2461 -7878.9146 8562.2461 v
-f
-0 R
-0.9 G
-0.5 w
--7868.2817 8565.3418 m
--7852.3838 8565.3418 -7849.9087 8565.3418 v
-S
-0.5 G
--7869.3184 8562.7295 m
--7867.9214 8563.6006 -7868.2817 8565.3418 y
-S
-0.7 G
--7871.3794 8562.2461 m
--7870.4438 8562.2461 -7869.7842 8562.4395 -7869.3184 8562.7295 c
-S
-0.9 G
--7883.001 8585 m
--7883.001 8565.3574 l
--7881.8481 8565.3574 l
--7881.8994 8562.2461 -7878.9146 8562.2461 v
--7875.1167 8562.2461 -7871.3794 8562.2461 v
-S
-0.25 G
--7847.4346 8567.8174 m
--7847.4346 8585 l
--7883.001 8585 l
-S
-0.5 G
--7848.4785 8565.7285 m
--7847.4346 8566.4238 -7847.4346 8567.8174 y
-S
-0.7 G
--7849.9087 8565.3418 m
--7849.29 8565.3418 -7848.8262 8565.4971 -7848.4785 8565.7285 c
-S
-U
-U
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 10)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7883.25 8585.25 m
--7815.2593 8585.25 L
--7815.2593 8557.0195 L
--7883.25 8557.0195 L
--7883.25 8585.25 L
-n
-0 O
-0.8 g
--7835.5234 8580.209 m
--7815.4785 8573.3516 l
--7817.0591 8570.4502 l
--7829.7202 8574.4063 l
--7835.7866 8570.4502 l
--7835.5234 8580.209 l
-f
-0 R
-0.9 G
-0.5 w
--7816.7871 8570.3242 m
--7829.7202 8574.4063 l
-S
-0.5 G
--7815.4785 8573.3516 m
--7817.0591 8570.4502 l
-S
-0.25 G
--7835.5234 8580.209 m
--7815.4785 8573.3516 l
-S
-0.5 G
--7829.7202 8574.4063 m
--7835.7866 8570.4502 l
-S
-0 O
-0.8 g
-1 w
--7855.5679 8562.7998 m
--7843.437 8557.5254 l
--7840.0073 8561.7441 l
--7855.5679 8562.7998 l
-f
-1 Ap
-0.57 g
--7835.2598 8582.0547 m
--7881.6802 8582.0547 L
--7881.6802 8584.9551 L
--7835.2598 8584.9551 L
--7835.2598 8582.0547 L
-f
-0 Ap
-0 R
-0.5 G
-0.5 w
--7843.437 8557.5254 m
--7840.0073 8561.7441 l
-S
-0.9 G
--7855.5679 8562.7998 m
--7842.875 8557.248 l
-S
-0 O
-0.8 g
-1 w
--7883.001 8560.7627 m
--7883.001 8582.0859 l
--7834.2046 8582.0859 l
--7834.2046 8564.9121 l
--7837.6338 8560.8223 l
--7883.001 8560.7627 l
-f
-0 R
-0.5 G
-0.5 w
--7883.001 8576.5166 m
--7834.2046 8576.5166 l
-S
--7880.0986 8564.1191 m
--7870.6025 8564.1191 l
-S
--7880.0986 8565.7676 m
--7870.6025 8565.7676 l
-S
--7880.0986 8567.415 m
--7870.6025 8567.415 l
-S
--7880.0986 8569.0635 m
--7870.6025 8569.0635 l
-S
--7880.0986 8570.7109 m
--7870.6025 8570.7109 l
-S
--7834.2046 8564.9121 m
--7837.6338 8560.8223 l
-S
-0.25 G
--7883.001 8582.0859 m
--7834.2046 8582.0859 l
--7834.2046 8564.9121 l
-S
-0.9 G
--7837.6338 8560.793 m
--7883.001 8560.793 l
--7883.001 8582.3555 l
-S
-0.25 G
--7835.2598 8582.0859 m
--7835.2598 8585 l
--7881.6714 8585 l
-S
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 19)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7883.25 8585.25 m
--7836.6338 8585.25 L
--7836.6338 8549.6348 L
--7883.25 8549.6348 L
--7883.25 8585.25 L
-n
-u
-u
-0 O
-0.7495 g
-0 R
-0.25 G
-1 j 0.5 w 2 M
--7836.9722 8585 m
--7836.9722 8582.9805 l
--7843.333 8579.5479 l
--7859.8857 8579.5479 L
--7876.439 8579.5479 l
--7883.001 8582.9805 l
--7883.001 8585 l
--7836.9722 8585 l
-b
-0.8748 G
-2 J 0 j
--7859.8857 8579.5479 m
--7876.439 8579.5479 l
--7883.001 8582.9805 l
--7883.001 8585 l
-S
--7836.9722 8582.9805 m
--7843.333 8579.5479 l
--7859.8857 8579.5479 L
-S
-0 O
-0.9 g
-0.25 G
-0 J 1 j
--7876.3394 8580.7598 m
--7880.377 8582.9805 l
--7839.7993 8582.9805 l
--7843.2319 8580.7598 l
--7876.3394 8580.7598 l
-b
-U
-u
-u
-0.7 g
-0 j 1 w 4 M
--7871.125 8576.6523 m
--7868.8462 8576.6094 L
--7859.7446 8575.041 L
--7850.4634 8576.6094 L
--7848.6694 8576.6094 L
--7848.729 8578.4512 L
--7871.125 8578.4512 L
--7871.125 8576.6523 L
-f
-0 R
-0.25 G
-0.5 w
--7848.6978 8576.6523 m
--7848.7905 8578.4512 L
--7871.1567 8578.4512 L
-S
-0.9 G
--7850.498 8576.6523 m
--7848.6978 8576.6523 L
-S
-0.25 G
--7859.8042 8575.041 m
--7850.498 8576.6523 L
-S
-0.9 G
--7871.1567 8578.4512 m
--7871.1567 8576.6523 L
--7868.9033 8576.6523 L
--7859.8042 8575.041 L
-S
-U
-u
-0 O
-0.7 g
-1 w
--7873.3672 8573.5781 m
--7864.0703 8573.5313 L
--7859.7119 8571.8047 L
--7855.1343 8573.5313 L
--7846.4214 8573.5313 L
--7846.4927 8575.5557 L
--7873.3672 8575.5557 L
--7873.3672 8573.5781 L
-f
-0 R
-0.25 G
-0.5 w
--7846.4546 8573.5781 m
--7846.5649 8575.5557 L
--7873.4038 8575.5557 L
-S
-0.9 G
--7855.1758 8573.5781 m
--7846.4546 8573.5781 L
-S
-0.25 G
--7859.7817 8571.8047 m
--7855.1758 8573.5781 L
-S
-0.9 G
--7873.4038 8575.5557 m
--7873.4038 8573.5781 L
--7864.1406 8573.5781 L
--7859.7817 8571.8047 L
-S
-U
-u
-0 O
-0.7495 g
-0.25 G
-2 J 2 M
--7874.8838 8572.75 m
--7874.8911 8550.8809 l
--7873.9082 8549.8848 L
--7845.9302 8549.9121 L
--7844.9922 8551.0508 L
--7844.9922 8572.4648 L
--7845.8022 8573.6045 L
--7874.0366 8573.6045 l
--7874.8838 8572.75 L
-b
-/BBAccumRotation (4.712389) XT
-0.8748 G
--7874.0366 8573.6045 m
--7874.8838 8572.75 L
--7874.8911 8550.8809 l
--7873.9082 8549.8848 L
--7845.9302 8549.9121 L
-S
-/BBAccumRotation (4.712389) XT
-0 O
-0.9 g
-0.25 G
--7848.0239 8570.7168 m
--7848.0054 8552.7617 L
--7871.8994 8552.7617 L
--7871.9014 8570.7148 L
--7848.0239 8570.7168 L
-b
-/BBAccumRotation (4.712389) XT
-U
-U
-u
-0.15 G
-0 J 4 M
--7843.333 8579.5479 m
--7859.8857 8579.5479 L
--7876.439 8579.5479 L
--7883.001 8582.9805 L
--7883.001 8585 L
--7836.9722 8585 L
--7836.9722 8582.9805 L
--7843.333 8579.5479 L
-s
--7874.0366 8573.6045 m
--7873.4038 8573.6045 L
--7873.4038 8575.5557 L
--7873.3672 8575.5449 L
--7873.3672 8575.5527 L
--7873.4038 8575.5557 L
--7873.3672 8575.5557 L
--7862.731 8575.5557 L
--7868.8462 8576.6094 L
--7871.125 8576.6523 L
--7871.1567 8576.6523 L
--7871.1567 8578.4512 L
--7871.125 8578.4414 L
--7871.125 8578.4482 L
--7871.1567 8578.4512 L
--7871.125 8578.4512 L
--7848.7905 8578.4512 L
--7848.729 8578.4512 L
--7848.6694 8576.6094 L
--7850.4634 8576.6094 L
--7856.7002 8575.5557 L
--7846.5649 8575.5557 L
--7846.4927 8575.5557 L
--7846.4233 8573.6045 L
--7845.8022 8573.6045 L
--7844.9922 8572.4648 L
--7844.9922 8551.0508 L
--7845.9302 8549.9121 L
--7873.9082 8549.8848 L
--7874.8911 8550.8809 L
--7874.8838 8572.75 L
--7874.0366 8573.6045 L
-s
-U
-U
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 21)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7883.3184 8585.3184 m
--7804.0449 8585.3184 L
--7804.0449 8559.5566 L
--7883.3184 8559.5566 L
--7883.3184 8585.3184 L
-n
-u
-0 O
-0.8158 g
-0 R
-0 G
-0.5 w 3.8636 M
--7882.8638 8562.8213 m
--7804.4961 8562.8213 L
--7804.4961 8576.9053 L
--7882.8638 8576.9053 L
--7882.8638 8562.8213 L
-b
--7843.6792 8569.8633 m
-B
-U
-u
--7880.4233 8576.9053 m
--7806.939 8576.9053 L
--7805.4766 8576.9053 -7804.2954 8578.0908 -7804.2954 8579.5498 c
--7804.2954 8580.9951 L
--7804.2954 8582.4561 -7805.4766 8583.6416 -7806.939 8583.6416 c
--7880.4233 8583.6416 L
--7881.8838 8583.6416 -7883.0688 8582.4561 -7883.0688 8580.9951 c
--7883.0688 8579.5498 L
--7883.0688 8578.0908 -7881.8838 8576.9053 -7880.4233 8576.9053 c
--7880.4233 8576.9053 L
-b
--7843.6802 8580.2744 m
-B
-U
-0 g
--7878.374 8583.6396 m
--7873.8838 8583.6396 L
--7874.7007 8585.0684 L
--7877.251 8585.0684 L
--7878.374 8583.6396 L
-b
--7814.293 8583.6396 m
--7809.8022 8583.6396 L
--7810.6191 8585.0684 L
--7813.1714 8585.0684 L
--7814.293 8583.6396 L
-b
-0.61 G
-1 w
--7875.9258 8562.8574 m
--7875.9258 8574.4893 L
-S
--7873.8838 8562.8574 m
--7873.8838 8574.4893 L
-S
-u
-0 O
-0 g
-0 G
-0.5 w
--7826.7417 8566.7002 m
--7813.0679 8566.7002 L
--7813.0679 8568.9463 L
--7826.7417 8568.9463 L
--7826.7417 8566.7002 L
-b
--7819.9038 8567.8223 m
-B
-U
-1 J
--7814.3066 8577.9297 m
--7813.8906 8578.3682 -7813.6362 8578.9561 -7813.6362 8579.6064 C
--7813.6362 8580.9355 L
--7813.6362 8581.5859 -7813.8906 8582.1758 -7814.3066 8582.6123 C
-S
--7816.1978 8577.9297 m
--7815.7842 8578.3682 -7815.5288 8578.9561 -7815.5288 8579.6064 C
--7815.5288 8580.9355 L
--7815.5288 8581.5859 -7815.7842 8582.1758 -7816.1978 8582.6123 C
-S
--7818.0913 8577.9297 m
--7817.6758 8578.3682 -7817.4214 8578.9561 -7817.4214 8579.6064 C
--7817.4214 8580.9355 L
--7817.4214 8581.5859 -7817.6758 8582.1758 -7818.0913 8582.6123 C
-S
--7819.9839 8577.9297 m
--7819.5698 8578.3682 -7819.314 8578.9561 -7819.314 8579.6064 C
--7819.314 8580.9355 L
--7819.314 8581.5859 -7819.5698 8582.1758 -7819.9839 8582.6123 C
-S
--7821.8774 8577.9297 m
--7821.4614 8578.3682 -7821.207 8578.9561 -7821.207 8579.6064 C
--7821.207 8580.9355 L
--7821.207 8581.5859 -7821.4614 8582.1758 -7821.8774 8582.6123 C
-S
--7823.769 8577.9297 m
--7823.354 8578.3682 -7823.1001 8578.9561 -7823.1001 8579.6064 C
--7823.1001 8580.9355 L
--7823.1001 8581.5859 -7823.354 8582.1758 -7823.769 8582.6123 C
-S
--7825.6616 8577.9297 m
--7825.248 8578.3682 -7824.9922 8578.9561 -7824.9922 8579.6064 C
--7824.9922 8580.9355 L
--7824.9922 8581.5859 -7825.248 8582.1758 -7825.6616 8582.6123 C
-S
--7827.5542 8577.9297 m
--7827.1401 8578.3682 -7826.8857 8578.9561 -7826.8857 8579.6064 C
--7826.8857 8580.9355 L
--7826.8857 8581.5859 -7827.1401 8582.1758 -7827.5542 8582.6123 C
-S
--7829.4463 8577.9297 m
--7829.0322 8578.3682 -7828.7769 8578.9561 -7828.7769 8579.6064 C
--7828.7769 8580.9355 L
--7828.7769 8581.5859 -7829.0322 8582.1758 -7829.4463 8582.6123 C
-S
--7831.3374 8577.9297 m
--7830.9258 8578.3682 -7830.6694 8578.9561 -7830.6694 8579.6064 C
--7830.6694 8580.9355 L
--7830.6694 8581.5859 -7830.9258 8582.1758 -7831.3374 8582.6123 C
-S
--7833.231 8577.9297 m
--7832.8159 8578.3682 -7832.563 8578.9561 -7832.563 8579.6064 C
--7832.563 8580.9355 L
--7832.563 8581.5859 -7832.8159 8582.1758 -7833.231 8582.6123 C
-S
--7835.125 8577.9297 m
--7834.7095 8578.3682 -7834.4546 8578.9561 -7834.4546 8579.6064 C
--7834.4546 8580.9355 L
--7834.4546 8581.5859 -7834.7095 8582.1758 -7835.125 8582.6123 C
-S
--7837.0151 8577.9297 m
--7836.6006 8578.3682 -7836.3472 8578.9561 -7836.3472 8579.6064 C
--7836.3472 8580.9355 L
--7836.3472 8581.5859 -7836.6006 8582.1758 -7837.0151 8582.6123 C
-S
--7838.9102 8577.9297 m
--7838.4937 8578.3682 -7838.2407 8578.9561 -7838.2407 8579.6064 C
--7838.2407 8580.9355 L
--7838.2407 8581.5859 -7838.4937 8582.1758 -7838.9102 8582.6123 C
-S
--7840.8022 8577.9297 m
--7840.3872 8578.3682 -7840.1318 8578.9561 -7840.1318 8579.6064 C
--7840.1318 8580.9355 L
--7840.1318 8581.5859 -7840.3872 8582.1758 -7840.8022 8582.6123 C
-S
-0 O
-0.4385 g
-0 J 1 j
--7873.8838 8559.8066 m
--7813.8838 8559.8066 L
--7804.4961 8562.8213 L
--7882.8638 8562.8213 L
--7873.8838 8559.8066 L
-b
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 22)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7876.001 8578.6211 m
--7827.9502 8578.6211 L
--7827.9502 8497.4414 L
--7876.001 8497.4414 L
--7876.001 8578.6211 L
-n
-u
-u
-u
-0 O
-0.7 g
--7869.2202 8497.6914 m
--7835.2578 8497.6914 L
--7834.7935 8497.7441 L
--7834.3569 8497.9102 L
--7834.0791 8498.2148 L
--7834.0034 8498.543 L
--7834.0034 8562.8496 L
--7834.0791 8563.1855 L
--7834.3569 8563.4355 L
--7834.7935 8563.6504 L
--7835.2578 8563.707 L
--7869.2202 8563.707 L
--7869.6855 8563.6504 L
--7870.0361 8563.4355 L
--7870.3618 8563.1855 L
--7870.4399 8562.8496 L
--7870.4399 8498.543 L
--7870.3618 8498.2148 L
--7870.0361 8497.9102 L
--7869.6855 8497.7441 L
--7869.2202 8497.6914 L
-f
-0 R
-0.25 G
-0.5 w
--7834.0034 8498.543 m
--7834.0034 8562.8496 L
--7834.0791 8563.1855 L
--7834.3569 8563.4355 L
--7834.7935 8563.6504 L
--7835.2578 8563.707 L
--7869.2202 8563.707 L
--7869.6855 8563.6504 L
--7870.0361 8563.4355 L
--7870.3618 8563.1855 L
--7870.4399 8562.8496 L
-S
-0.9 G
--7870.4399 8562.8496 m
--7870.4399 8498.543 L
--7870.3618 8498.2148 L
--7870.0361 8497.9102 L
--7869.6855 8497.7441 L
--7869.2202 8497.6914 L
--7835.2578 8497.6914 L
--7834.7935 8497.7441 L
--7834.3569 8497.9102 L
--7834.0791 8498.2148 L
--7834.0034 8498.543 L
-S
-1 Ap
-0 O
-0.8 g
-0.25 G
-2 J 2 M
--7838.79 8507.9629 m
--7865.4775 8507.9629 L
--7865.4775 8560.2607 L
--7838.79 8560.2607 L
--7838.79 8507.9629 L
-b
-u
--7838.79 8523.8691 m
--7865.4736 8523.8691 L
--7865.4736 8520.0957 L
--7838.79 8520.0957 L
--7838.79 8523.8691 L
-b
--7838.79 8520.0615 m
--7865.4736 8520.0615 L
--7865.4736 8516.2871 L
--7838.79 8516.2871 L
--7838.79 8520.0615 L
-b
-U
-0 Ap
-0.25 g
-0 J 1 w 4 M
--7842.3818 8509.4375 m
--7843.2319 8509.4375 L
--7862.2729 8509.4375 L
--7862.2729 8510.3271 L
--7855.8018 8510.3271 L
--7855.8018 8510.9629 L
--7848.8486 8510.9629 L
--7848.8486 8510.3271 L
--7842.3818 8510.3271 L
--7842.3818 8509.4375 L
-f
-1 Ap
-0.6 g
-0 R
-0.25 G
-2 J 0.5 w 2 M
--7842.8271 8511.3691 m
--7846.8706 8511.3691 L
--7846.8706 8510.7324 L
--7842.8271 8510.7324 L
--7842.8271 8511.3691 L
-b
-u
-0.8 g
--7840.8057 8514.5547 m
--7863.4463 8514.5547 L
--7863.4463 8513.0664 L
--7840.8057 8513.0664 L
--7840.8057 8514.5547 L
-b
--7863.4463 8514.5547 m
--7863.4463 8513.0664 L
--7840.8057 8513.0664 L
-S
-0.9 G
--7840.8057 8513.0664 m
--7840.8057 8514.5547 L
--7863.4463 8514.5547 L
-S
-U
-0 O
-0.7 g
-0 J 1 w 4 M
--7841.1318 8515.6172 m
--7845.1743 8515.6172 L
--7845.1743 8514.9805 L
--7841.1318 8514.9805 L
--7841.1318 8515.6172 L
-f
-0 R
-0.25 G
-2 J 0.5 w 2 M
--7841.1318 8514.9805 m
--7841.1318 8515.6172 L
--7845.1743 8515.6172 L
-S
-u
-u
--7861.5903 8500.6797 m
--7861.5903 8503.7402 L
--7866.9287 8503.7402 L
-S
--7861.5903 8503.7393 m
--7861.5903 8506.7578 L
--7866.9287 8506.7578 L
-S
-U
-u
-0.9 G
--7866.9287 8503.7129 m
--7866.9287 8500.6934 L
--7861.5903 8500.6934 L
-S
--7866.9287 8506.7578 m
--7866.9287 8503.7393 L
--7861.5903 8503.7393 L
-S
-U
-U
-u
-u
-0.25 G
--7837.7178 8500.6797 m
--7837.7178 8503.7402 L
--7843.0542 8503.7402 L
-S
--7837.7178 8503.7393 m
--7837.7178 8506.7578 L
--7843.0542 8506.7578 L
-S
-U
-u
-0.9 G
--7843.0542 8503.7129 m
--7843.0542 8500.6934 L
--7837.7178 8500.6934 L
-S
--7843.0542 8506.7578 m
--7843.0542 8503.7393 L
--7837.7178 8503.7393 L
-S
-U
-U
-0 O
-0.8 g
-0 J 1 w 4 M
--7832.144 8564.9395 m
--7872.3799 8564.9395 L
--7870.6865 8562.6406 L
--7833.8359 8562.6406 L
--7832.144 8564.9395 L
-f
-0 R
-0.9 G
-0.5 w
--7870.4072 8562.4785 m
--7872.3799 8564.9395 L
--7869.9111 8564.9395 l
-S
-0.25 G
--7834.083 8562.3672 m
--7832.144 8564.9395 L
--7872.0337 8564.9395 l
-S
-U
-0 Ap
-0.15 G
--7833.8359 8562.6406 m
--7833.874 8562.6406 L
--7834.0034 8562.4727 L
--7834.0034 8498.543 L
--7834.0791 8498.2148 L
--7834.3569 8497.9102 L
--7834.7935 8497.7441 L
--7835.2578 8497.6914 L
--7869.2202 8497.6914 L
--7869.6855 8497.7441 L
--7870.0361 8497.9102 L
--7870.3618 8498.2148 L
--7870.4399 8498.543 L
--7870.4399 8562.5195 L
--7870.5386 8562.6406 L
--7870.6865 8562.6406 L
--7872.3799 8564.9395 L
--7872.0337 8564.9395 L
--7869.9111 8564.9395 L
--7832.144 8564.9395 L
--7833.8359 8562.6406 L
-s
--7870.4399 8562.5195 m
--7833.8359 8562.5195 l
-S
-U
-U
-0 To
-1 0 0 -1 -7851.9761 8576.5957 0 Tp
-0 Tv
-TP
--24.0247 0 Td
-0 Tr
-0 O
-0 g
-1 w
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
-0 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-36 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 0 0 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
-0 Tc
-0 Tw
-(DNS Ser) Tx 1 -30 Tk
-(v) Tx 1 25 Tk
-(er) Tx 1 0 Tk
-(\r) TX
-TO
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 23)
-0 A
-u
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7878.9351 8565.3359 m
--7830.6465 8565.3359 L
--7830.6465 8506.8223 L
--7878.9351 8506.8223 L
--7878.9351 8565.3359 L
-n
-0 O
-0.64 g
--7830.6465 8513.9863 m
--7832.5977 8506.8223 L
--7849.127 8506.8223 L
--7851.001 8513.9863 L
--7858.666 8513.9863 L
--7860.7529 8506.8223 L
--7877.0625 8506.8223 L
--7878.9351 8513.9863 L
--7878.9351 8514.0137 L
--7830.6465 8514.0137 L
--7830.6465 8513.9863 L
-f
-0.92 g
--7878.9351 8514.0137 m
--7878.9351 8565.3164 L
--7870.5898 8565.3164 L
--7870.5898 8561.6152 L
--7870.5386 8561.6152 L
--7870.5386 8514.0137 L
--7878.9351 8514.0137 L
-f
--7830.6465 8514.0137 m
--7838.7871 8514.0137 L
--7838.7871 8565.3359 L
--7830.6465 8565.3359 L
--7830.6465 8514.0137 L
-f
-0.8158 g
--7870.5386 8514.0137 m
--7870.5386 8561.6152 L
--7838.8442 8561.6152 L
--7838.8442 8565.3359 L
--7838.7871 8565.3359 L
--7838.7871 8514.0137 L
--7870.5386 8514.0137 L
-f
-0 R
-0.67 G
-0.5 w 3.8635 M
--7858.666 8513.9863 m
--7858.6582 8561.6152 L
-S
--7857.8145 8513.9863 m
--7857.8066 8561.6152 L
-S
--7856.9634 8513.9863 m
--7856.9551 8561.6152 L
-S
--7856.1113 8513.9863 m
--7856.103 8561.6152 L
-S
--7855.2598 8513.9863 m
--7855.252 8561.6152 L
-S
--7854.4082 8513.9863 m
--7854.3999 8561.6152 L
-S
--7853.5566 8513.9863 m
--7853.5488 8561.6152 L
-S
--7853.5718 8513.9863 m
--7853.563 8561.6152 L
-S
--7852.7202 8513.9863 m
--7852.7114 8561.6152 L
-S
--7851.8682 8513.9863 m
--7851.8594 8561.6152 L
-S
--7851.0161 8513.9863 m
--7851.0078 8561.6152 L
-S
-U
-0 To
-1 0 0 -1 -7854.791 8576.5957 0 Tp
-0 Tv
-TP
--21.2094 0 Td
-0 Tr
-0 O
-0 g
-1 w 4 M
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
-0 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-53.0468 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 0 0 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 4 Tl
-0 Tc
-0 Tw
-(Mainfr) Tx 1 10 Tk
-(ame) Tx 1 0 Tk
-(\r) TX
-TO
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 40)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7884 8586 m
--7835.7114 8586 L
--7835.7114 8500.1016 L
--7884 8500.1016 L
--7884 8586 L
-n
-0 O
-0.64 g
--7835.7114 8507.2656 m
--7837.6626 8500.1016 L
--7854.1919 8500.1016 L
--7856.0654 8507.2656 L
--7863.7305 8507.2656 L
--7865.8174 8500.1016 L
--7882.127 8500.1016 L
--7884 8507.2656 L
--7884 8507.293 L
--7835.7114 8507.293 L
--7835.7114 8507.2656 L
-f
-0.92 g
--7884 8507.293 m
--7884 8585.9805 L
--7875.6543 8585.9805 L
--7875.6543 8582.2793 L
--7875.6025 8582.2793 L
--7875.6025 8507.293 L
--7884 8507.293 L
-f
--7835.7114 8507.293 m
--7843.8511 8507.293 L
--7843.8511 8586 L
--7835.7114 8586 L
--7835.7114 8507.293 L
-f
-0.8158 g
--7875.6025 8507.293 m
--7875.6025 8582.2793 L
--7843.9087 8582.2793 L
--7843.9087 8586 L
--7843.8511 8586 L
--7843.8511 8507.293 L
--7875.6025 8507.293 L
-f
-0 R
-0.67 G
-0.5 w 3.8635 M
--7863.7305 8507.2656 m
--7863.7222 8582.2793 L
-S
--7862.8794 8507.2656 m
--7862.8711 8582.2793 L
-S
--7862.0273 8507.2656 m
--7862.019 8582.2793 L
-S
--7861.1758 8507.2656 m
--7861.168 8582.2793 L
-S
--7860.3242 8507.2656 m
--7860.3169 8582.2793 L
-S
--7859.4727 8507.2656 m
--7859.4648 8582.2793 L
-S
--7858.6206 8507.2656 m
--7858.6138 8582.2793 L
-S
--7858.6362 8507.2656 m
--7858.6279 8582.2793 L
-S
--7857.7842 8507.2656 m
--7857.7754 8582.2793 L
-S
--7856.9326 8507.2656 m
--7856.9238 8582.2793 L
-S
--7856.0801 8507.2656 m
--7856.0718 8582.2793 L
-S
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 43)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7883.749 8585.8232 m
--7870.9414 8585.8232 L
--7870.9414 8557.1563 L
--7883.749 8557.1563 L
--7883.749 8585.8232 L
-n
-0 O
-0.3 g
--7870.9414 8574.5498 m
--7875.1558 8563.2031 L
--7875.3862 8562.5801 -7876.0439 8562.2598 -7876.6719 8562.4141 C
--7876.8018 8562.3506 -7876.9473 8562.3359 -7877.0889 8562.3164 C
--7875.771 8562.1797 -7874.7358 8561.1084 -7874.7358 8559.7627 c
--7874.7358 8558.3184 -7875.9009 8557.1563 -7877.3447 8557.1563 c
--7878.7842 8557.1563 -7879.9482 8558.3184 -7879.9482 8559.7627 c
--7879.9482 8561.1084 -7878.916 8562.1797 -7877.6016 8562.3164 C
--7877.7441 8562.3359 -7877.8809 8562.3506 -7878.0186 8562.4141 C
--7878.645 8562.2598 -7879.3018 8562.5801 -7879.5313 8563.2031 C
--7883.749 8574.5498 L
--7884 8575.2168 -7883.6543 8575.9688 -7882.9834 8576.2188 c
--7882.313 8576.4658 -7881.5664 8576.123 -7881.3193 8575.4531 C
--7880.1289 8572.2441 L
--7880.0054 8572.6758 -7879.876 8573.0762 -7879.7119 8573.4385 C
--7882.4902 8584.2402 L
--7882.668 8584.9375 -7882.252 8585.6416 -7881.5586 8585.8232 c
--7880.8657 8586 -7880.1626 8585.583 -7879.9766 8584.8867 C
--7877.5918 8575.5967 L
--7877.5049 8575.6084 -7877.4282 8575.6494 -7877.3447 8575.6494 c
--7877.2617 8575.6494 -7877.1855 8575.6084 -7877.0991 8575.5967 C
--7874.7129 8584.8867 L
--7874.5303 8585.583 -7873.8242 8586 -7873.1318 8585.8232 c
--7872.4385 8585.6416 -7872.0215 8584.9375 -7872.1978 8584.2402 C
--7874.9766 8573.4385 L
--7874.8154 8573.0762 -7874.6846 8572.6758 -7874.5625 8572.2441 C
--7873.3711 8575.4531 L
--7873.125 8576.123 -7872.3799 8576.4658 -7871.707 8576.2188 c
--7871.0391 8575.9688 -7870.6914 8575.2168 -7870.9414 8574.5498 C
-f
-U
-%AI8_EndBrushPattern
-%AI5_End_NonPrinting--
-%AI5_BeginPalette
-0 0 Pb
-1 1 1 1 ([Registration]) 0 Xs
-([Registration]) Pc
-0 0 0 0.15 (15%) 0 0 Xk
-(15%) Pc
-0 0 0 0.3 (30%) 0 0 Xk
-(30%) Pc
-0 0 0 0.5 (50%) 0 0 Xk
-(50%) Pc
-0 0 0 0.75 (75%) 0 0 Xk
-(75%) Pc
-(horizontal rules) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(horizontal rules) Pc
-(bi-direction diagonals) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(bi-direction diagonals) Pc
-(one direction diagonals) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(one direction diagonals) Pc
-(white dots) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(white dots) Pc
-(black dots) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(black dots) Pc
-PB
-%AI5_EndPalette
-%AI5_Begin_NonPrinting
-Np
-%AI8_BeginPluginObject
-(Adobe Brush Manager Order)
-(Adobe Brush Manager Order)
-( Adobe Scatter Brush Tool/ Scatter Brush 1/ Adobe Scatter Brush Tool/ ) -
-(Mainframe/ Adobe Scatter Brush Tool/ Client/ Adobe Scatter Brush Tool/) -
-( person/ Adobe Scatter Brush Tool/ Print spooler/ Adobe Scatter Brush ) -
-(Tool/ Folders/ Adobe Scatter Brush Tool/ Printer/ Adobe Scatter Brush ) -
-(Tool/ Client 1/ Adobe Scatter Brush Tool/ Mainframe 1/ Adobe Scatter B) -
-(rush Tool/ Fax server/) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Client)
-(1 /New Pattern 19/ 0 0.0784314 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Client 1)
-(1 /New Pattern 19/ 0 0.0784314 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Fax server)
-(1 /New Pattern 21/ 0 0.184314 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Folders)
-(1 /New Pattern 9/ 0 0.160784 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Mainframe)
-(1 /New Pattern 23/ 0 0.184314 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Mainframe 1)
-(1 /New Pattern 40/ 0 0.184314 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(person)
-(1 /New Pattern 43/ 0 0.701961 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Print spooler)
-(1 /New Pattern 2/ 0 0.854902 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Printer)
-(1 /New Pattern 10/ 0 0.160784 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Scatter Brush 1)
-(1 /New Pattern 22/ 0 0.2 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI5_End_NonPrinting--
-%AI5_Begin_NonPrinting
-Np
-%AI8_PluginGroupInfo
-(Adobe Path Blends) (Adobe Blends Plugin) (Live Blends)
-%AI8_PluginGroupInfo
-(Adobe PatternOnPath Brush Tool) (Adobe Pattern Brush Plugin) (Art Brush Tool)
-%AI8_PluginGroupInfo
-(Adobe ArtOnPath Brush Tool) (Adobe Art Brush Plugin) (Art Brush Tool)
-%AI8_PluginGroupInfo
-(Adobe Calligraphic Brush Tool) (Undo New Calligraphic Brush) (Calligraphic Brush Tool)
-%AI8_PluginGroupInfo
-(Adobe Scatter Brush Tool) (Adobe Scatter Brush Plugin) (Scatter Brush Tool)
-%AI5_End_NonPrinting--
-%%EndSetup
-%AI5_BeginLayer
-1 1 1 1 0 0 1 0 79 128 255 0 50 Lb
-(Layer 1) Ln
-0 A
-0 R
-0 G
-800 Ar
-0 J 0 j 0.5 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-272.4243 340.377 m
-S
-1 Ap
-0 O
-0.95 g
-1 XR
-501.71 169.1504 m
-153.71 169.1504 L
-153.71 589.1504 L
-501.71 589.1504 L
-501.71 169.1504 L
-(b) *
-0 To
-1 0 0 1 236.4463 332.1426 0 Tp
-0 Tv
-TP
--14.7797 0 Td
-0 Tr
-0 g
-1 w
-0 XR
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
--4.5 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-23.6196 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 3.2805 3.2805 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
-0 Tc
-0 Tw
-(P) Tx 1 40 Tk
-(ar) Tx 1 10 Tk
-(allel\r) Tx 1 0 Tk
-3.1148 -11 Td
-(Cab) Tx 1 20 Tk
-(le) Tx 1 0 Tk
-(\r) TX
-TO
-0 Ap
-0 R
-0 G
-0.5 w
-184.8491 350.9229 m
-197.9233 350.9199 210.9907 351.3887 224.0674 351.2979 c
-227.6689 351.2725 249.1094 354.4385 250.6377 348.4697 c
-251.6982 344.3271 238.7969 344.8301 237.2236 340.9258 C
-241.8062 337.6826 254.5508 340.2188 259.3149 340.2549 c
-269.4844 340.3301 276.6069 336.6514 289.0425 336.8418 c
-301.478 337.0322 301.6904 338.085 308.3408 338.8457 c
-314.9912 339.6064 341.1025 338.8457 345.5137 338.8457 c
-349.9248 338.8457 349.9688 333.9688 Y
-349.9629 333.9727 L
-349.9629 330.7295 349.9629 278.8408 y
-368.3398 266.2295 l
-S
-u
-%_385.5439 280.833 m
-%_S
-%_U
-%_0 Ap
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-385.5439 280.833 m
-N
-u
-u
-u
-0 O
-0.7495 g
-0 R
-0.25 G
-1 j 0.25 w 2 M
-397.0293 272.0547 m
-397.0293 273.0645 l
-393.8486 274.7803 l
-385.5723 274.7803 L
-377.2959 274.7803 l
-374.0146 273.0645 l
-374.0146 272.0547 l
-397.0293 272.0547 l
-b
-0.8748 G
-2 J 0 j
-385.5723 274.7803 m
-377.2959 274.7803 l
-374.0146 273.0645 l
-374.0146 272.0547 l
-S
-397.0293 273.0645 m
-393.8486 274.7803 l
-385.5723 274.7803 L
-S
-0 O
-0.9 g
-0.25 G
-0 J 1 j
-377.3457 274.1738 m
-375.3271 273.0645 l
-395.6152 273.0645 l
-393.8994 274.1738 l
-377.3457 274.1738 l
-b
-U
-u
-u
-0.7 g
-0 j 1 w 4 M
-379.9521 276.2285 m
-381.0918 276.25 L
-385.6426 277.0332 L
-390.2832 276.25 L
-391.1807 276.25 L
-391.1504 275.3281 L
-379.9521 275.3281 L
-379.9521 276.2285 L
-f
-0 R
-0.25 G
-0.25 w
-391.166 276.2285 m
-391.1201 275.3281 L
-379.9365 275.3281 L
-S
-0.9 G
-390.2666 276.2285 m
-391.166 276.2285 L
-S
-0.25 G
-385.6133 277.0332 m
-390.2666 276.2285 L
-S
-0.9 G
-379.9365 275.3281 m
-379.9365 276.2285 L
-381.0635 276.2285 L
-385.6133 277.0332 L
-S
-U
-u
-0 O
-0.7 g
-1 w
-378.8311 277.7656 m
-383.4795 277.7891 L
-385.6592 278.6523 L
-387.9482 277.7891 L
-392.3047 277.7891 L
-392.2686 276.7764 L
-378.8311 276.7764 L
-378.8311 277.7656 L
-f
-0 R
-0.25 G
-0.25 w
-392.2881 277.7656 m
-392.2324 276.7764 L
-378.8135 276.7764 L
-S
-0.9 G
-387.9268 277.7656 m
-392.2881 277.7656 L
-S
-0.25 G
-385.624 278.6523 m
-387.9268 277.7656 L
-S
-0.9 G
-378.8135 276.7764 m
-378.8135 277.7656 L
-383.4443 277.7656 L
-385.624 278.6523 L
-S
-U
-u
-0 O
-0.7495 g
-0.25 G
-2 J 2 M
-378.0732 278.1797 m
-378.0693 289.1133 l
-378.5615 289.6113 L
-392.5498 289.5977 L
-393.0186 289.0293 L
-393.0186 278.3223 L
-392.6143 277.752 L
-378.4971 277.752 l
-378.0732 278.1797 L
-b
-/BBAccumRotation (4.712389) XT
-0.8748 G
-378.4971 277.752 m
-378.0732 278.1797 L
-378.0693 289.1133 l
-378.5615 289.6113 L
-392.5498 289.5977 L
-S
-/BBAccumRotation (4.712389) XT
-0 O
-0.9 g
-0.25 G
-391.5029 279.1953 m
-391.5127 288.1738 L
-379.5654 288.1738 L
-379.5645 279.1973 L
-391.5029 279.1953 L
-b
-/BBAccumRotation (4.712389) XT
-U
-U
-u
-0.15 G
-0 J 4 M
-393.8486 274.7803 m
-385.5723 274.7803 L
-377.2959 274.7803 L
-374.0146 273.0645 L
-374.0146 272.0547 L
-397.0293 272.0547 L
-397.0293 273.0645 L
-393.8486 274.7803 L
-s
-378.4971 277.752 m
-378.8135 277.752 L
-378.8135 276.7764 L
-378.8311 276.7813 L
-378.8311 276.7773 L
-378.8135 276.7764 L
-378.8311 276.7764 L
-384.1494 276.7764 L
-381.0918 276.25 L
-379.9521 276.2285 L
-379.9365 276.2285 L
-379.9365 275.3281 L
-379.9521 275.334 L
-379.9521 275.3301 L
-379.9365 275.3281 L
-379.9521 275.3281 L
-391.1201 275.3281 L
-391.1504 275.3281 L
-391.1807 276.25 L
-390.2832 276.25 L
-387.165 276.7764 L
-392.2324 276.7764 L
-392.2686 276.7764 L
-392.3037 277.752 L
-392.6143 277.752 L
-393.0186 278.3223 L
-393.0186 289.0293 L
-392.5498 289.5977 L
-378.5615 289.6113 L
-378.0693 289.1133 L
-378.0732 278.1797 L
-378.4971 277.752 L
-s
-U
-U
-U
-U
-(Adobe Scatter Brush Tool) 1 0 56 XP
-%010203043F8000003F8000003F8000003F80000000000000000000000000
-%000000000000000000000000000000000F36436C69656E742031
-/Adobe_Brushed_Path () XT
-0 To
-1 0 0 1 291.1274 326.3594 0 Tp
-0 Tv
-TP
--21.8418 0 Td
-0 Tr
-0 O
-0 g
-1 w
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
--4.5 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-23.6196 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 3.2805 3.2805 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
-0 Tc
-0 Tw
-(Pr) Tx 1 -15 Tk
-(intser) Tx 1 -30 Tk
-(v) Tx 1 25 Tk
-(er) Tx 1 0 Tk
-(\r) TX
-TO
-0 To
-1 0 0 1 415.3008 280.3564 0 Tp
-0 Tv
-TP
--8.5004 0 Td
-0 Tr
-(PCs) Tx 1 0 Tk
-(\r) TX
-TO
-0 To
-1 0 0 1 176.1445 369.5293 0 Tp
-0 Tv
-TP
--12.7793 0 Td
-0 Tr
--20 Tt
--0.18 Tc
-(Pr) Tx 1 -15 Tk
-(inter) Tx 1 0 Tk
-(\r) TX
-TO
-u
-%_1 g
-%_0 R
-%_0.67 G
-%_1 M
-%_184.939 348.2959 m
-%_B
-%_U
-%_0 Ap
-0 A
-u
-0 O
-1 g
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-184.939 348.2959 m
-F
-u
-0.8 g
-198.6704 339.2217 m
-218.7153 346.0791 l
-217.1348 348.9805 l
-204.4736 345.0244 l
-198.4072 348.9805 l
-198.6704 339.2217 l
-f
-0 R
-0.9 G
-0.5 w
-217.4067 349.1064 m
-204.4736 345.0244 l
-S
-0.5 G
-218.7153 346.0791 m
-217.1348 348.9805 l
-S
-0.25 G
-198.6704 339.2217 m
-218.7153 346.0791 l
-S
-0.5 G
-204.4736 345.0244 m
-198.4072 348.9805 l
-S
-0 O
-0.8 g
-1 w
-178.626 356.6309 m
-190.7568 361.9053 l
-194.1865 357.6865 l
-178.626 356.6309 l
-f
-1 Ap
-0.57 g
-198.9341 337.376 m
-152.5137 337.376 L
-152.5137 334.4756 L
-198.9341 334.4756 L
-198.9341 337.376 L
-f
-0 Ap
-0 R
-0.5 G
-0.5 w
-190.7568 361.9053 m
-194.1865 357.6865 l
-S
-0.9 G
-178.626 356.6309 m
-191.3188 362.1826 l
-S
-0 O
-0.8 g
-1 w
-151.1929 358.668 m
-151.1929 337.3447 l
-199.9893 337.3447 l
-199.9893 354.5186 l
-196.5601 358.6084 l
-151.1929 358.668 l
-f
-0 R
-0.5 G
-0.5 w
-151.1929 342.9141 m
-199.9893 342.9141 l
-S
-154.0952 355.3115 m
-163.5913 355.3115 l
-S
-154.0952 353.6631 m
-163.5913 353.6631 l
-S
-154.0952 352.0156 m
-163.5913 352.0156 l
-S
-154.0952 350.3672 m
-163.5913 350.3672 l
-S
-154.0952 348.7197 m
-163.5913 348.7197 l
-S
-199.9893 354.5186 m
-196.5601 358.6084 l
-S
-0.25 G
-151.1929 337.3447 m
-199.9893 337.3447 l
-199.9893 354.5186 l
-S
-0.9 G
-196.5601 358.6377 m
-151.1929 358.6377 l
-151.1929 337.0752 l
-S
-0.25 G
-198.9341 337.3447 m
-198.9341 334.4307 l
-152.5225 334.4307 l
-S
-U
-U
-(Adobe Scatter Brush Tool) 1 0 55 XP
-%010203043F8000003F8000003F8000003F80000000000000000000000000
-%0000000000000000000000000000000007995072696E746572
-/Adobe_Brushed_Path () XT
-0 G
-349.9629 291.9287 m
-368.3398 279.3174 l
-S
-349.9629 305.0166 m
-368.3398 292.4053 l
-S
-0 O
-0 g
-0.25 w
-307.4824 346.4248 m
-B
-0.8158 g
-286.1353 350.4033 m
-B
-0.4385 g
-285.9966 380.4932 m
-B
-0 To
-1 0 0 1 366.6016 387.9482 0 Tp
-0 Tv
-TP
--19.7722 0 Td
-0 Tr
-0 g
-1 w
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
-0 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-23.6196 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 3.2805 3.2805 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
-0 Tc
-0 Tw
-(Fileser) Tx 1 -30 Tk
-(v) Tx 1 25 Tk
-(er) Tx 1 0 Tk
-(\r) TX
-TO
-u
-%_0 R
-%_0 G
-%_0.65 w
-%_366.2129 373.4551 m
-%_S
-%_U
-%_0 Ap
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-366.2129 373.4551 m
-N
-u
-u
-0 O
-0.8158 g
-0 R
-0 G
-0.325 w 3.8636 M
-340.7441 379.7061 m
-391.6836 379.7061 L
-391.6836 370.5508 L
-340.7441 370.5508 L
-340.7441 379.7061 L
-b
-366.2148 375.1279 m
-B
-U
-u
-342.3311 370.5508 m
-390.0957 370.5508 L
-391.0469 370.5508 391.8145 369.7803 391.8145 368.832 c
-391.8145 367.8926 L
-391.8145 366.9424 391.0469 366.1729 390.0957 366.1729 c
-342.3311 366.1729 L
-341.3818 366.1729 340.6113 366.9424 340.6113 367.8926 c
-340.6113 368.832 L
-340.6113 369.7803 341.3818 370.5508 342.3311 370.5508 c
-342.3311 370.5508 L
-b
-366.2139 368.3604 m
-B
-U
-0 g
-343.6631 366.1729 m
-346.582 366.1729 L
-346.0508 365.2451 L
-344.3926 365.2451 L
-343.6631 366.1729 L
-b
-385.3164 366.1729 m
-388.2344 366.1729 L
-387.7031 365.2451 L
-386.0449 365.2451 L
-385.3164 366.1729 L
-b
-0.61 G
-0.65 w
-345.2539 379.6826 m
-345.2539 372.1211 L
-S
-346.582 379.6826 m
-346.582 372.1211 L
-S
-u
-0 O
-0 g
-0 G
-0.325 w
-377.2246 377.1846 m
-386.1113 377.1846 L
-386.1113 375.7236 L
-377.2246 375.7236 L
-377.2246 377.1846 L
-b
-381.668 376.4541 m
-B
-U
-1 J
-385.3066 369.8848 m
-385.5771 369.6006 385.7422 369.2178 385.7422 368.7949 C
-385.7422 367.9307 L
-385.7422 367.5088 385.5771 367.125 385.3066 366.8408 C
-S
-384.0781 369.8848 m
-384.3457 369.6006 384.5117 369.2178 384.5117 368.7949 C
-384.5117 367.9307 L
-384.5117 367.5088 384.3457 367.125 384.0781 366.8408 C
-S
-382.8467 369.8848 m
-383.1172 369.6006 383.2822 369.2178 383.2822 368.7949 C
-383.2822 367.9307 L
-383.2822 367.5088 383.1172 367.125 382.8467 366.8408 C
-S
-381.6172 369.8848 m
-381.8857 369.6006 382.0527 369.2178 382.0527 368.7949 C
-382.0527 367.9307 L
-382.0527 367.5088 381.8857 367.125 381.6172 366.8408 C
-S
-380.3857 369.8848 m
-380.6563 369.6006 380.8223 369.2178 380.8223 368.7949 C
-380.8223 367.9307 L
-380.8223 367.5088 380.6563 367.125 380.3857 366.8408 C
-S
-379.1563 369.8848 m
-379.4258 369.6006 379.5918 369.2178 379.5918 368.7949 C
-379.5918 367.9307 L
-379.5918 367.5088 379.4258 367.125 379.1563 366.8408 C
-S
-377.9258 369.8848 m
-378.1953 369.6006 378.3613 369.2178 378.3613 368.7949 C
-378.3613 367.9307 L
-378.3613 367.5088 378.1953 367.125 377.9258 366.8408 C
-S
-376.6953 369.8848 m
-376.9648 369.6006 377.1309 369.2178 377.1309 368.7949 C
-377.1309 367.9307 L
-377.1309 367.5088 376.9648 367.125 376.6953 366.8408 C
-S
-375.4658 369.8848 m
-375.7354 369.6006 375.9014 369.2178 375.9014 368.7949 C
-375.9014 367.9307 L
-375.9014 367.5088 375.7354 367.125 375.4658 366.8408 C
-S
-374.2363 369.8848 m
-374.5039 369.6006 374.6709 369.2178 374.6709 368.7949 C
-374.6709 367.9307 L
-374.6709 367.5088 374.5039 367.125 374.2363 366.8408 C
-S
-373.0059 369.8848 m
-373.2754 369.6006 373.4404 369.2178 373.4404 368.7949 C
-373.4404 367.9307 L
-373.4404 367.5088 373.2754 367.125 373.0059 366.8408 C
-S
-371.7754 369.8848 m
-372.0449 369.6006 372.2109 369.2178 372.2109 368.7949 C
-372.2109 367.9307 L
-372.2109 367.5088 372.0449 367.125 371.7754 366.8408 C
-S
-370.5469 369.8848 m
-370.8164 369.6006 370.9805 369.2178 370.9805 368.7949 C
-370.9805 367.9307 L
-370.9805 367.5088 370.8164 367.125 370.5469 366.8408 C
-S
-369.3145 369.8848 m
-369.5859 369.6006 369.75 369.2178 369.75 368.7949 C
-369.75 367.9307 L
-369.75 367.5088 369.5859 367.125 369.3145 366.8408 C
-S
-368.084 369.8848 m
-368.3545 369.6006 368.5205 369.2178 368.5205 368.7949 C
-368.5205 367.9307 L
-368.5205 367.5088 368.3545 367.125 368.084 366.8408 C
-S
-0 O
-0.4385 g
-0 J 1 j
-346.582 381.665 m
-385.582 381.665 L
-391.6836 379.7061 L
-340.7441 379.7061 L
-346.582 381.665 L
-b
-U
-U
-(Adobe Scatter Brush Tool) 1 0 58 XP
-%010203043F8000003F8000003F8000003F80000000000000000000000000
-%0000000000000000000000000000000041C646617820736572766572
-/Adobe_Brushed_Path () XT
-0 To
-1 0 0 1 371.0703 322.457 0 Tp
-0 Tv
-TP
--16.5244 0 Td
-0 Tr
-0 g
-0 j 1 w 4 M
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
--4.5 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-23.6196 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 3.2805 3.2805 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
-0 Tc
-0 Tw
-(Netw) Tx 1 10 Tk
-(or) Tx 1 -15 Tk
-(k) Tx 1 0 Tk
-(\r) TX
-TO
-0 R
-0 G
-0.5 w
-340.6094 374.2686 m
-330.7031 374.2686 l
-330.7031 338.8955 l
-S
-1 Ap
-0 O
-0.8158 g
-0.325 w 3.8636 M
-306.7998 332.9063 m
-271.2852 332.9063 L
-271.2852 340.7783 L
-306.7998 340.7783 L
-306.7998 332.9063 L
-b
-302.9561 334.9072 m
-275.1289 334.9072 L
-275.1289 338.7764 L
-302.9561 338.7764 L
-302.9561 334.9072 L
-b
-LB
-%AI5_EndLayer--
-%%PageTrailer
-gsave annotatepage grestore showpage
-%%Trailer
-Adobe_Illustrator_AI5 /terminate get exec
-Adobe_shading_AI8 /terminate get exec
-Adobe_ColorImage_AI6 /terminate get exec
-Adobe_typography_AI5 /terminate get exec
-Adobe_cshow /terminate get exec
-Adobe_level2_AI5 /terminate get exec
-%%EOF
diff --git a/en_US.ISO8859-1/books/corp-net-guide/08-04.eps b/en_US.ISO8859-1/books/corp-net-guide/08-04.eps
deleted file mode 100644
index 5f3905ade9..0000000000
--- a/en_US.ISO8859-1/books/corp-net-guide/08-04.eps
+++ /dev/null
@@ -1,8386 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: Adobe Illustrator(R) 8.0
-%%AI8_CreatorVersion: 8.0.1
-%%For: (Mark G Bergeron) (PD&PS)
-%%Title: (08-04 3594)
-%%CreationDate: (10/10/00) (1:28 PM)
-%%BoundingBox: 150 267 366 405
-%%HiResBoundingBox: 150.9429 267.4053 365.0137 404.0498
-%%DocumentProcessColors: Black
-%%DocumentFonts: Helvetica
-%%DocumentNeededFonts: Helvetica
-%%DocumentSuppliedResources: procset Adobe_level2_AI5 1.2 0
-%%+ procset Adobe_typography_AI5 1.0 1
-%%+ procset Adobe_ColorImage_AI6 1.3 0
-%%+ procset Adobe_Illustrator_AI5 1.3 0
-%%+ procset Adobe_cshow 2.0 8
-%%+ procset Adobe_shading_AI8 1.0 0
-%AI5_FileFormat 4.0
-%AI3_ColorUsage: Black&White
-%AI3_IncludePlacedImages
-%AI7_ImageSettings: 1
-%%CMYKProcessColor: 0 0 0 0.15 (15%)
-%%+ 0 0 0 0.3 (30%)
-%%+ 0 0 0 0.5 (50%)
-%%+ 0 0 0 0.75 (75%)
-%%+ 1 1 1 1 ([Registration])
-%%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set)
-%%+ Options: 1 16 0 1 0 1 1 1 0 1 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 2 3 4
-%%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 ()
-%AI3_TemplateBox: 306.5 395.5 306.5 395.5
-%AI3_TileBox: 12 14 600 782
-%AI3_DocumentPreview: Macintosh_ColorPic
-%AI5_ArtSize: 612 792
-%AI5_RulerUnits: 3
-%AI5_ArtFlags: 1 0 0 1 0 0 1 0 0
-%AI5_TargetResolution: 800
-%AI5_NumLayers: 1
-%AI8_OpenToView: 262.5698 429.7842 7.4643 1060 751 18 0 1 7 40 0 0
-%AI5_OpenViewLayers: 7
-%%PageOrigin:12 14
-%%AI3_PaperRect:-12 782 600 -10
-%%AI3_Margin:12 -14 -12 10
-%AI7_GridSettings: 12 3 12 3 1 0 0.29 1 1 0.65 1 1
-%%EndComments
-%%BeginProlog
-%%BeginResource: procset Adobe_level2_AI5 1.2 0
-%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation)
-%%Version: 1.2 0
-%%CreationDate: (04/10/93) ()
-%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved)
-userdict /Adobe_level2_AI5 26 dict dup begin
- put
- /packedarray where not
- {
- userdict begin
- /packedarray
- {
- array astore readonly
- } bind def
- /setpacking /pop load def
- /currentpacking false def
- end
- 0
- } if
- pop
- userdict /defaultpacking currentpacking put true setpacking
- /initialize
- {
- Adobe_level2_AI5 begin
- } bind def
- /terminate
- {
- currentdict Adobe_level2_AI5 eq
- {
- end
- } if
- } bind def
- mark
- /setcustomcolor where not
- {
- /findcmykcustomcolor
- {
- (AI8_CMYK_CustomColor)
- 6 packedarray
- } bind def
- /findrgbcustomcolor
- {
- (AI8_RGB_CustomColor)
- 5 packedarray
- } bind def
- /setcustomcolor
- {
- exch
- aload pop dup
- (AI8_CMYK_CustomColor) eq
- {
- pop pop
- 4
- {
- 4 index mul
- 4 1 roll
- } repeat
- 5 -1 roll pop
- setcmykcolor
- }
- {
- dup (AI8_RGB_CustomColor) eq
- {
- pop pop
- 3
- {
- 1 exch sub
- 3 index mul
- 1 exch sub
- 3 1 roll
- } repeat
- 4 -1 roll pop
- setrgbcolor
- }
- {
- pop
- 4
- {
- 4 index mul 4 1 roll
- } repeat
- 5 -1 roll pop
- setcmykcolor
- } ifelse
- } ifelse
- }
- def
- } if
- /setAIseparationgray
- {
- false setoverprint
- 0 setgray
- /setseparationgray where{
- pop setseparationgray
- }{
- /setcolorspace where{
- pop
- [/Separation (All) /DeviceCMYK {dup dup dup}] setcolorspace
- 1 exch sub setcolor
- }{
- setgray
- }ifelse
- }ifelse
- } def
-
- /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def
- userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put
- userdict /level2?
- systemdict /languagelevel known dup
- {
- pop systemdict /languagelevel get 2 ge
- } if
- put
-/level2ScreenFreq
-{
- begin
- 60
- HalftoneType 1 eq
- {
- pop Frequency
- } if
- HalftoneType 2 eq
- {
- pop GrayFrequency
- } if
- HalftoneType 5 eq
- {
- pop Default level2ScreenFreq
- } if
- end
-} bind def
-userdict /currentScreenFreq
- level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put
-level2? not
- {
- /setcmykcolor where not
- {
- /setcmykcolor
- {
- exch .11 mul add exch .59 mul add exch .3 mul add
- 1 exch sub setgray
- } def
- } if
- /currentcmykcolor where not
- {
- /currentcmykcolor
- {
- 0 0 0 1 currentgray sub
- } def
- } if
- /setoverprint where not
- {
- /setoverprint /pop load def
- } if
- /selectfont where not
- {
- /selectfont
- {
- exch findfont exch
- dup type /arraytype eq
- {
- makefont
- }
- {
- scalefont
- } ifelse
- setfont
- } bind def
- } if
- /cshow where not
- {
- /cshow
- {
- [
- 0 0 5 -1 roll aload pop
- ] cvx bind forall
- } bind def
- } if
- } if
- cleartomark
- /anyColor?
- {
- add add add 0 ne
- } bind def
- /testColor
- {
- gsave
- setcmykcolor currentcmykcolor
- grestore
- } bind def
- /testCMYKColorThrough
- {
- testColor anyColor?
- } bind def
- userdict /composite?
- 1 0 0 0 testCMYKColorThrough
- 0 1 0 0 testCMYKColorThrough
- 0 0 1 0 testCMYKColorThrough
- 0 0 0 1 testCMYKColorThrough
- and and and
- put
- composite? not
- {
- userdict begin
- gsave
- /cyan? 1 0 0 0 testCMYKColorThrough def
- /magenta? 0 1 0 0 testCMYKColorThrough def
- /yellow? 0 0 1 0 testCMYKColorThrough def
- /black? 0 0 0 1 testCMYKColorThrough def
- grestore
- /isCMYKSep? cyan? magenta? yellow? black? or or or def
- /customColor? isCMYKSep? not def
- end
- } if
- end defaultpacking setpacking
-%%EndResource
-%%BeginResource: procset Adobe_typography_AI5 1.0 1
-%%Title: (Typography Operators)
-%%Version: 1.0 1
-%%CreationDate:(6/10/1996) ()
-%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved)
-currentpacking true setpacking
-userdict /Adobe_typography_AI5 68 dict dup begin
-put
-/initialize
-{
- begin
- begin
- Adobe_typography_AI5 begin
- Adobe_typography_AI5
- {
- dup xcheck
- {
- bind
- } if
- pop pop
- } forall
- end
- end
- end
- Adobe_typography_AI5 begin
-} def
-/terminate
-{
- currentdict Adobe_typography_AI5 eq
- {
- end
- } if
-} def
-/modifyEncoding
-{
- /_tempEncode exch ddef
- /_pntr 0 ddef
- {
- counttomark -1 roll
- dup type dup /marktype eq
- {
- pop pop exit
- }
- {
- /nametype eq
- {
- _tempEncode /_pntr dup load dup 3 1 roll 1 add ddef 3 -1 roll
- put
- }
- {
- /_pntr exch ddef
- } ifelse
- } ifelse
- } loop
- _tempEncode
-} def
-/havefont
-{
- systemdict /languagelevel known
- {
- /Font resourcestatus dup
- { exch pop exch pop }
- if
- }
- {
- systemdict /FontDirectory get 1 index known
- { pop true }
- {
- systemdict /fileposition known
- {
- dup length 6 add exch
- Ss 6 250 getinterval
- cvs pop
- Ss exch 0 exch getinterval
- status
- { pop pop pop pop true }
- { false }
- ifelse
- }
- {
- pop false
- }
- ifelse
- }
- ifelse
- }
- ifelse
-} def
-/TE
-{
- StandardEncoding 256 array copy modifyEncoding
- /_nativeEncoding exch def
-} def
-/subststring {
- exch 2 index exch search
- {
- exch pop
- exch dup () eq
- {
- pop exch concatstring
- }
- {
- 3 -1 roll
- exch concatstring
- concatstring
- } ifelse
- exch pop true
- }
- {
- pop pop false
- } ifelse
-} def
-/concatstring {
- 1 index length 1 index length
- 1 index add
- string
- dup 0 5 index putinterval
- dup 2 index 4 index putinterval
- 4 1 roll pop pop pop
-} def
-%
-/TZ
-{
- dup type /arraytype eq
- {
- /_wv exch def
- }
- {
- /_wv 0 def
- } ifelse
- /_useNativeEncoding exch def
- 2 index havefont
- {
- 3 index
- 255 string
- cvs
-
- dup
- (_Symbol_)
- eq
- {
- pop
- 2 index
- findfont
-
- }
- {
- 1 index 0 eq
- {
- dup length 1 sub
- 1 exch
- getinterval
-
- cvn
- findfont
- }
- {
- pop 2 index findfont
- } ifelse
- } ifelse
- }
- {
- dup 1 eq
- {
- 2 index 64 string cvs
- dup (-90pv-RKSJ-) (-83pv-RKSJ-) subststring
- {
- exch pop dup havefont
- {
- findfont false
- }
- {
- pop true
- } ifelse
- }
- {
- pop dup
- (-90ms-RKSJ-) (-Ext-RKSJ-) subststring
- {
- exch pop dup havefont
- {
- findfont false
- }
- {
- pop true
- } ifelse
- }
- {
- pop pop true
- } ifelse
- } ifelse
- {
- 1 index 1 eq
- {
- /Ryumin-Light-Ext-RKSJ-V havefont
- {/Ryumin-Light-Ext-RKSJ-V}
- {/Courier}
- ifelse
- }
- {
- /Ryumin-Light-83pv-RKSJ-H havefont
- {/Ryumin-Light-83pv-RKSJ-H}
- {/Courier}
- ifelse
- } ifelse
- findfont
- [1 0 0.5 1 0 0] makefont
- } if
- }
- {
- /Courier findfont
- } ifelse
- } ifelse
- _wv type /arraytype eq
- {
- _wv makeblendedfont
- } if
- dup length 10 add dict
- begin
- mark exch
- {
- 1 index /FID ne
- {
- def
- } if
- cleartomark mark
- } forall
- pop
- /FontScript exch def
- /FontDirection exch def
- /FontRequest exch def
- /FontName exch def
- counttomark 0 eq
- {
- 1 _useNativeEncoding eq
- {
- /Encoding _nativeEncoding def
- } if
- cleartomark
- }
- {
- /Encoding load 256 array copy
- modifyEncoding /Encoding exch def
- } ifelse
- FontName currentdict
- end
- definefont pop
-} def
-/tr
-{
- _ax _ay 3 2 roll
-} def
-/trj
-{
- _cx _cy _sp _ax _ay 6 5 roll
-} def
-/a0
-{
- /Tx
- {
- dup
- currentpoint 3 2 roll
- tr _psf
- newpath moveto
- tr _ctm _pss
- } ddef
- /Tj
- {
- dup
- currentpoint 3 2 roll
- trj _pjsf
- newpath moveto
- trj _ctm _pjss
- } ddef
-} def
-/a1
-{
-W B
-} def
-/e0
-{
- /Tx
- {
- tr _psf
- } ddef
- /Tj
- {
- trj _pjsf
- } ddef
-} def
-/e1
-{
-W F
-} def
-/i0
-{
- /Tx
- {
- tr sp
- } ddef
- /Tj
- {
- trj jsp
- } ddef
-} def
-/i1
-{
- W N
-} def
-/o0
-{
- /Tx
- {
- tr sw rmoveto
- } ddef
- /Tj
- {
- trj swj rmoveto
- } ddef
-} def
-/r0
-{
- /Tx
- {
- tr _ctm _pss
- } ddef
- /Tj
- {
- trj _ctm _pjss
- } ddef
-} def
-/r1
-{
-W S
-} def
-/To
-{
- pop _ctm currentmatrix pop
-} def
-/TO
-{
- iTe _ctm setmatrix newpath
-} def
-/Tp
-{
- pop _tm astore pop _ctm setmatrix
- _tDict begin
- /W
- {
- } def
- /h
- {
- } def
-} def
-/TP
-{
- end
- iTm 0 0 moveto
-} def
-/Tr
-{
- _render 3 le
- {
- currentpoint newpath moveto
- } if
- dup 8 eq
- {
- pop 0
- }
- {
- dup 9 eq
- {
- pop 1
- } if
- } ifelse
- dup /_render exch ddef
- _renderStart exch get load exec
-} def
-/iTm
-{
- _ctm setmatrix _tm concat
- _shift aload pop _lineorientation 1 eq { exch } if translate
- _scale aload pop _lineorientation 1 eq _yokoorientation 1 eq or { exch } if scale
-} def
-/Tm
-{
- _tm astore pop iTm 0 0 moveto
-} def
-/Td
-{
- _mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto
-} def
-/iTe
-{
- _render -1 eq
- {
- }
- {
- _renderEnd _render get dup null ne
- {
- load exec
- }
- {
- pop
- } ifelse
- } ifelse
- /_render -1 ddef
-} def
-/Ta
-{
- pop
-} def
-/Tf
-{
- 1 index type /nametype eq
- {
- dup 0.75 mul 1 index 0.25 mul neg
- } if
- /_fontDescent exch ddef
- /_fontAscent exch ddef
- /_fontSize exch ddef
- /_fontRotateAdjust _fontAscent _fontDescent add 2 div neg ddef
- /_fontHeight _fontSize ddef
- findfont _fontSize scalefont setfont
-} def
-/Tl
-{
- pop neg 0 exch
- _leading astore pop
-} def
-/Tt
-{
- pop
-} def
-/TW
-{
- 3 npop
-} def
-/Tw
-{
- /_cx exch ddef
-} def
-/TC
-{
- 3 npop
-} def
-/Tc
-{
- /_ax exch ddef
-} def
-/Ts
-{
- 0 exch
- _shift astore pop
- currentpoint
- iTm
- moveto
-} def
-/Ti
-{
- 3 npop
-} def
-/Tz
-{
- count 1 eq { 100 } if
- 100 div exch 100 div exch
- _scale astore pop
- iTm
-} def
-/TA
-{
- pop
-} def
-/Tq
-{
- pop
-} def
-/Tg
-{
- pop
-} def
-/TG
-{
- pop
-} def
-/Tv
-{
- /_lineorientation exch ddef
-} def
-/TV
-{
- /_charorientation exch ddef
-} def
-/Ty
-{
- dup /_yokoorientation exch ddef 1 sub neg Tv
-} def
-/TY
-{
- pop
-} def
-/T~
-{
- Tx
-} def
-/Th
-{
- pop pop pop pop pop
-} def
-/TX
-{
- pop
-} def
-/Tk
-{
- _fontSize mul 1000 div
- _lineorientation 0 eq { neg 0 } { 0 exch } ifelse
- rmoveto
- pop
-} def
-/TK
-{
- 2 npop
-} def
-/T*
-{
- _leading aload pop
- _lineorientation 0 ne { exch } if
- Td
-} def
-/T*-
-{
- _leading aload pop
- _lineorientation 0 ne { exch } if
- exch neg exch neg
- Td
-} def
-/T-
-{
- _ax neg 0 rmoveto
- _lineorientation 1 eq _charorientation 0 eq and { 1 TV _hyphen Tx 0 TV } { _hyphen Tx } ifelse
-} def
-/T+
-{
-} def
-/TR
-{
- _ctm currentmatrix pop
- _tm astore pop
- iTm 0 0 moveto
-} def
-/TS
-{
- currentfont 3 1 roll
- /_Symbol_ findfont _fontSize scalefont setfont
-
- 0 eq
- {
- Tx
- }
- {
- Tj
- } ifelse
- setfont
-} def
-/Xb
-{
- pop pop
-} def
-/Tb /Xb load def
-/Xe
-{
- pop pop pop pop
-} def
-/Te /Xe load def
-/XB
-{
-} def
-/TB /XB load def
-currentdict readonly pop
-end
-setpacking
-%
-/X^
-{
- currentfont 5 1 roll
- dup havefont
- {
- findfont _fontSize scalefont setfont
- }
- {
- pop
- exch
- } ifelse
- 2 index 0 eq
- {
- Tx
- }
- {
- Tj
- } ifelse
- pop pop
- setfont
-} def
-/T^ /X^ load def
-%%EndResource
-%%BeginProcSet: Adobe_ColorImage_AI6 1.3 0
-userdict /Adobe_ColorImage_AI6 known not
-{
- userdict /Adobe_ColorImage_AI6 53 dict put
-} if
-userdict /Adobe_ColorImage_AI6 get begin
-/initialize {
- Adobe_ColorImage_AI6 begin
- Adobe_ColorImage_AI6 {
- dup type /arraytype eq {
- dup xcheck {
- bind
- } if
- } if
- pop pop
- } forall
-} def
-/terminate { end } def
-currentdict /Adobe_ColorImage_AI6_Vars known not {
- /Adobe_ColorImage_AI6_Vars 41 dict def
-} if
-Adobe_ColorImage_AI6_Vars begin
- /plateindex -1 def
- /_newproc null def
- /_proc1 null def
- /_proc2 null def
- /sourcearray 4 array def
- /_ptispace null def
- /_ptiname null def
- /_pti0 0 def
- /_pti1 0 def
- /_ptiproc null def
- /_ptiscale 0 def
- /_pticomps 0 def
- /_ptibuf 0 string def
- /_gtigray 0 def
- /_cticmyk null def
- /_rtirgb null def
- /XIEnable true def
- /XIType 0 def
- /XIEncoding 0 def
- /XICompression 0 def
- /XIChannelCount 0 def
- /XIBitsPerPixel 0 def
- /XIImageHeight 0 def
- /XIImageWidth 0 def
- /XIImageMatrix null def
- /XIRowBytes 0 def
- /XIFile null def
- /XIBuffer1 null def
- /XIBuffer2 null def
- /XIBuffer3 null def
- /XIDataProc null def
- /XIColorSpace /DeviceGray def
- /XIColorValues 0 def
- /XIPlateList false def
-end
-/ci6colorimage /colorimage where {/colorimage get}{null} ifelse def
-/ci6image systemdict /image get def
-/ci6curtransfer systemdict /currenttransfer get def
-/ci6curoverprint /currentoverprint where {/currentoverprint get}{{_of}} ifelse def
-/ci6foureq {
- 4 index ne {
- pop pop pop false
- }{
- 4 index ne {
- pop pop false
- }{
- 4 index ne {
- pop false
- }{
- 4 index eq
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6testplate {
- Adobe_ColorImage_AI6_Vars begin
- /plateindex -1 def
- /setcmykcolor where {
- pop
- gsave
- 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub
- 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub
- 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub
- 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub
- grestore
- 1 0 0 0 ci6foureq {
- /plateindex 0 def
- }{
- 0 1 0 0 ci6foureq {
- /plateindex 1 def
- }{
- 0 0 1 0 ci6foureq {
- /plateindex 2 def
- }{
- 0 0 0 1 ci6foureq {
- /plateindex 3 def
- }{
- 0 0 0 0 ci6foureq {
- /plateindex 5 def
- } if
- } ifelse
- } ifelse
- } ifelse
- } ifelse
- pop pop pop pop
- } if
- plateindex
- end
-} def
-/ci6concatprocs {
- /packedarray where {
- pop dup type /packedarraytype eq 2 index type
- /packedarraytype eq or
- }{
- false
- } ifelse
- {
- /_proc2 exch cvlit def
- /_proc1 exch cvlit def
- _proc1 aload pop
- _proc2 aload pop
- _proc1 length
- _proc2 length add
- packedarray cvx
- }{
- /_proc2 exch cvlit def
- /_proc1 exch cvlit def
- /_newproc _proc1 length _proc2 length add array def
- _newproc 0 _proc1 putinterval
- _newproc _proc1 length _proc2 putinterval
- _newproc cvx
- } ifelse
-} def
-/ci6istint {
- type /arraytype eq
-} def
-/ci6isspot {
- dup type /arraytype eq {
- dup length 1 sub get /Separation eq
- }{
- pop false
- } ifelse
-} def
-/ci6spotname {
- dup ci6isspot {dup length 2 sub get}{pop ()} ifelse
-} def
-/ci6altspace {
- aload pop pop pop ci6colormake
-} def
-/ci6numcomps {
- dup /DeviceGray eq {
- pop 1
- }{
- dup /DeviceRGB eq {
- pop 3
- }{
- /DeviceCMYK eq {
- 4
- }{
- 1
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6marksplate {
- dup /DeviceGray eq {
- pop plateindex 3 eq
- }{
- dup /DeviceRGB eq {
- pop plateindex 5 ne
- }{
- dup /DeviceCMYK eq {
- pop plateindex 5 ne
- }{
- dup ci6isspot {
- /findcmykcustomcolor where {
- pop
- dup length 2 sub get
- 0.1 0.1 0.1 0.1 5 -1 roll
- findcmykcustomcolor 1 setcustomcolor
- systemdict /currentgray get exec
- 1 ne
- }{
- pop plateindex 5 ne
- } ifelse
- }{
- pop plateindex 5 ne
- } ifelse
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6colormake {
- dup ci6numcomps
- exch 1 index 2 add 1 roll
- dup 1 eq {pop}{array astore} ifelse
- exch
-} def
-/ci6colorexpand {
- dup ci6spotname exch
- dup ci6istint {
- ci6altspace
- exch 4 1 roll
- }{
- 1 3 1 roll
- } ifelse
-} def
-/ci6colortint {
- dup /DeviceGray eq {
- 3 1 roll 1 exch sub mul 1 exch sub exch
- }{
- dup /DeviceRGB eq {
- 3 1 roll {1 exch sub 1 index mul 1 exch sub exch} forall pop 3 array astore exch
- }{
- dup /DeviceCMYK eq {
- 3 1 roll {1 index mul exch} forall pop 4 array astore exch
- }{
- 3 1 roll mul exch
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6colortocmyk {
- dup /DeviceGray eq {
- pop 1 exch sub 0 0 0 4 -1 roll 4 array astore
- }{
- dup /DeviceRGB eq {
- pop aload pop _rgbtocmyk 4 array astore
- }{
- dup /DeviceCMYK eq {
- pop
- }{
- ci6altspace ci6colortint ci6colortocmyk
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6makeimagedict {
- 7 dict begin
- /ImageType 1 def
- /Decode exch def
- /DataSource exch def
- /ImageMatrix exch def
- /BitsPerComponent exch def
- /Height exch def
- /Width exch def
- currentdict end
-} def
-/ci6stringinvert {
- 0 1 2 index length 1 sub {
- dup 2 index exch get 255 exch sub 2 index 3 1 roll put
- } for
-} def
-/ci6stringknockout {
- 0 1 2 index length 1 sub {
- 255 2 index 3 1 roll put
- } for
-} def
-/ci6stringapply {
- 0 1 4 index length 1 sub {
- dup
- 4 index exch get
- 3 index 3 1 roll
- 3 index exec
- } for
- pop exch pop
-} def
-/ci6walkrgbstring {
- 0 3 index
- dup length 1 sub 0 3 3 -1 roll {
- 3 getinterval {} forall
- 5 index exec
- 3 index
- } for
-
- 5 {pop} repeat
-} def
-/ci6walkcmykstring
-{
- 0 3 index
- dup length 1 sub 0 4 3 -1 roll {
- 4 getinterval {} forall
-
- 6 index exec
-
- 3 index
-
- } for
-
- 5 { pop } repeat
-
-} def
-/ci6putrgbtograystr
-{
- .11 mul exch
-
- .59 mul add exch
-
- .3 mul add
-
- cvi 3 copy put
-
- pop 1 add
-} def
-/ci6putcmyktograystr
-{
- exch .11 mul add
-
- exch .59 mul add
-
- exch .3 mul add
-
- dup 255 gt { pop 255 } if
-
- 255 exch sub cvi 3 copy put
-
- pop 1 add
-} def
-/ci6rgbtograyproc {
- Adobe_ColorImage_AI6_Vars begin
- sourcearray 0 get exec
- XIBuffer3
- dup 3 1 roll
-
- /ci6putrgbtograystr load exch
- ci6walkrgbstring
- end
-} def
-/ci6cmyktograyproc {
- Adobe_ColorImage_AI6_Vars begin
- sourcearray 0 get exec
- XIBuffer3
- dup 3 1 roll
-
- /ci6putcmyktograystr load exch
- ci6walkcmykstring
- end
-} def
-/ci6separatecmykproc {
- Adobe_ColorImage_AI6_Vars begin
- sourcearray 0 get exec
-
- XIBuffer3
-
- 0 2 index
-
- plateindex 4 2 index length 1 sub {
- get 255 exch sub
-
- 3 copy put pop 1 add
-
- 2 index
- } for
- pop pop exch pop
- end
-} def
-
-/ci6compositeimage {
- dup 1 eq {
- pop pop image
- }{
- /ci6colorimage load null ne {
- ci6colorimage
- }{
- 3 1 roll pop
- sourcearray 0 3 -1 roll put
- 3 eq {/ci6rgbtograyproc}{/ci6cmyktograyproc} ifelse load
- image
- } ifelse
- } ifelse
-} def
-/ci6knockoutimage {
- gsave
- 0 ci6curtransfer exec 1 ci6curtransfer exec
- eq {
- 0 ci6curtransfer exec 0.5 lt
- }{
- 0 ci6curtransfer exec 1 ci6curtransfer exec gt
- } ifelse
- {{pop 0}}{{pop 1}} ifelse
- systemdict /settransfer get exec
- ci6compositeimage
- grestore
-} def
-/ci6drawimage {
- ci6testplate -1 eq {
- pop ci6compositeimage
- }{
- dup type /arraytype eq {
- dup length plateindex gt {plateindex get}{pop false} ifelse
- }{
- {
- true
- }{
- dup 1 eq {plateindex 3 eq}{plateindex 3 le} ifelse
- } ifelse
- } ifelse
- {
- dup 1 eq {
- pop pop ci6image
- }{
- dup 3 eq {
- ci6compositeimage
- }{
- pop pop
- sourcearray 0 3 -1 roll put
- /ci6separatecmykproc load
- ci6image
- } ifelse
- } ifelse
- }{
- ci6curoverprint {
- 7 {pop} repeat
- }{
- ci6knockoutimage
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6proctintimage {
- /_ptispace exch store /_ptiname exch store /_pti1 exch store /_pti0 exch store /_ptiproc exch store
- /_pticomps _ptispace ci6numcomps store
- /_ptiscale _pti1 _pti0 sub store
- level2? {
- _ptiname length 0 gt version cvr 2012 ge and {
- [/Separation _ptiname _ptispace {_ptiproc}] setcolorspace
- [_pti0 _pti1] ci6makeimagedict ci6image
- }{
- [/Indexed _ptispace 255 {255 div _ptiscale mul _pti0 add _ptiproc}] setcolorspace
- [0 255] ci6makeimagedict ci6image
- } ifelse
- }{
- _pticomps 1 eq {
- {
- dup
- {
- 255 div _ptiscale mul _pti0 add _ptiproc 255 mul cvi put
- } ci6stringapply
- } ci6concatprocs ci6image
- }{
- {
- dup length _pticomps mul dup _ptibuf length ne {/_ptibuf exch string store}{pop} ifelse
- _ptibuf {
- exch _pticomps mul exch 255 div _ptiscale mul _pti0 add _ptiproc
- _pticomps 2 add -2 roll
- _pticomps 1 sub -1 0 {
- 1 index add 2 index exch
- 5 -1 roll
- 255 mul cvi put
- } for
- pop pop
- } ci6stringapply
- } ci6concatprocs false _pticomps
- /ci6colorimage load null eq {7 {pop} repeat}{ci6colorimage} ifelse
- } ifelse
- } ifelse
-} def
-/ci6graytintimage {
- /_gtigray 5 -1 roll store
- {1 _gtigray sub mul 1 exch sub} 4 1 roll
- /DeviceGray ci6proctintimage
-} def
-/ci6cmyktintimage {
- /_cticmyk 5 -1 roll store
- {_cticmyk {1 index mul exch} forall pop} 4 1 roll
- /DeviceCMYK ci6proctintimage
-} def
-/ci6rgbtintimage {
- /_rtirgb 5 -1 roll store
- {_rtirgb {1 exch sub 1 index mul 1 exch sub exch} forall pop} 4 1 roll
- /DeviceRGB ci6proctintimage
-} def
-/ci6tintimage {
- ci6testplate -1 eq {
- ci6colorexpand
- 3 -1 roll 5 -1 roll {0}{0 exch} ifelse 4 2 roll
- dup /DeviceGray eq {
- pop ci6graytintimage
- }{
- dup /DeviceRGB eq {
- pop ci6rgbtintimage
- }{
- pop ci6cmyktintimage
- } ifelse
- } ifelse
- }{
- dup ci6marksplate {
- plateindex 5 lt {
- ci6colortocmyk plateindex get
- dup 0 eq ci6curoverprint and {
- 7 {pop} repeat
- }{
- 1 exch sub
- exch {1 0}{0 1} ifelse () ci6graytintimage
- } ifelse
- }{
- pop exch {0}{0 exch} ifelse 0 3 1 roll () ci6graytintimage
- } ifelse
- }{
- ci6curoverprint {
- 8 {pop} repeat
- }{
- pop pop pop
- {pop 1} 0 1 () /DeviceGray ci6proctintimage
- } ifelse
- } ifelse
- } ifelse
-} def
-/XINullImage {
-} def
-/XIImageMask {
- XIImageWidth XIImageHeight false
- [XIImageWidth 0 0 XIImageHeight neg 0 0]
- /XIDataProc load
- imagemask
-} def
-/XIImageTint {
- XIImageWidth XIImageHeight XIBitsPerPixel
- [XIImageWidth 0 0 XIImageHeight neg 0 0]
- /XIDataProc load
- XIType 3 eq XIColorValues XIColorSpace ci6tintimage
-} def
-/XIImage {
- XIImageWidth XIImageHeight XIBitsPerPixel
- [XIImageWidth 0 0 XIImageHeight neg 0 0]
- /XIDataProc load
- false XIChannelCount XIPlateList ci6drawimage
-} def
-/XG {
- pop pop
-} def
-/XF {
- 13 {pop} repeat
-} def
-/Xh {
- Adobe_ColorImage_AI6_Vars begin
- gsave
- /XIType exch def
- /XIImageHeight exch def
- /XIImageWidth exch def
- /XIImageMatrix exch def
- 0 0 moveto
- XIImageMatrix concat
- XIImageWidth XIImageHeight scale
-
- /_lp /null ddef
- _fc
- /_lp /imagemask ddef
- end
-} def
-/XH {
- Adobe_ColorImage_AI6_Vars begin
- grestore
- end
-} def
-/XIEnable {
- Adobe_ColorImage_AI6_Vars /XIEnable 3 -1 roll put
-} def
-/XC {
- Adobe_ColorImage_AI6_Vars begin
- ci6colormake
- /XIColorSpace exch def
- /XIColorValues exch def
- end
-} def
-/XIPlates {
- Adobe_ColorImage_AI6_Vars begin
- /XIPlateList exch def
- end
-} def
-/XI
-{
- Adobe_ColorImage_AI6_Vars begin
- gsave
- /XIType exch def
- cvi dup
- 256 idiv /XICompression exch store
- 256 mod /XIEncoding exch store
- pop pop
- /XIChannelCount exch def
- /XIBitsPerPixel exch def
- /XIImageHeight exch def
- /XIImageWidth exch def
- pop pop pop pop
- /XIImageMatrix exch def
- XIBitsPerPixel 1 eq {
- XIImageWidth 8 div ceiling cvi
- }{
- XIImageWidth XIChannelCount mul
- } ifelse
- /XIRowBytes exch def
- XIEnable {
- /XIBuffer3 XIImageWidth string def
- XICompression 0 eq {
- /XIBuffer1 XIRowBytes string def
- XIEncoding 0 eq {
- {currentfile XIBuffer1 readhexstring pop}
- }{
- {currentfile XIBuffer1 readstring pop}
- } ifelse
- }{
- /XIBuffer1 256 string def
- /XIBuffer2 XIRowBytes string def
- {currentfile XIBuffer1 readline pop (%) anchorsearch {pop} if}
- /ASCII85Decode filter /DCTDecode filter
- /XIFile exch def
- {XIFile XIBuffer2 readstring pop}
- } ifelse
- /XIDataProc exch def
-
- XIType 1 ne {
- 0 setgray
- } if
- XIType 1 eq {
- XIImageMask
- }{
- XIType 2 eq XIType 3 eq or {
- XIImageTint
- }{
- XIImage
- } ifelse
- } ifelse
- }{
- XINullImage
- } ifelse
- /XIPlateList false def
- grestore
- end
-} def
-end
-%%EndProcSet
-%%BeginResource: procset Adobe_Illustrator_AI5 1.3 0
-%%Title: (Adobe Illustrator (R) Version 8.0 Full Prolog)
-%%Version: 1.3 0
-%%CreationDate: (3/7/1994) ()
-%%Copyright: ((C) 1987-1998 Adobe Systems Incorporated All Rights Reserved)
-currentpacking true setpacking
-userdict /Adobe_Illustrator_AI5_vars 112 dict dup begin
-put
-/_?cmyk false def
-/_eo false def
-/_lp /none def
-/_pf
-{
-} def
-/_ps
-{
-} def
-/_psf
-{
-} def
-/_pss
-{
-} def
-/_pjsf
-{
-} def
-/_pjss
-{
-} def
-/_pola 0 def
-/_doClip 0 def
-/cf currentflat def
-/_lineorientation 0 def
-/_charorientation 0 def
-/_yokoorientation 0 def
-/_tm matrix def
-/_renderStart
-[
-/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0
-] def
-/_renderEnd
-[
-null null null null /i1 /i1 /i1 /i1
-] def
-/_render -1 def
-/_shift [0 0] def
-/_ax 0 def
-/_ay 0 def
-/_cx 0 def
-/_cy 0 def
-/_leading
-[
-0 0
-] def
-/_ctm matrix def
-/_mtx matrix def
-/_sp 16#020 def
-/_hyphen (-) def
-/_fontSize 0 def
-/_fontAscent 0 def
-/_fontDescent 0 def
-/_fontHeight 0 def
-/_fontRotateAdjust 0 def
-/Ss 256 string def
-Ss 0 (fonts/) putinterval
-/_cnt 0 def
-/_scale [1 1] def
-/_nativeEncoding 0 def
-/_useNativeEncoding 0 def
-/_tempEncode 0 def
-/_pntr 0 def
-/_tDict 2 dict def
-/_hfname 100 string def
-/_hffound false def
-/Tx
-{
-} def
-/Tj
-{
-} def
-/CRender
-{
-} def
-/_AI3_savepage
-{
-} def
-/_gf null def
-/_cf 4 array def
-/_rgbf 3 array def
-/_if null def
-/_of false def
-/_fc
-{
-} def
-/_gs null def
-/_cs 4 array def
-/_rgbs 3 array def
-/_is null def
-/_os false def
-/_sc
-{
-} def
-/_pd 1 dict def
-/_ed 15 dict def
-/_pm matrix def
-/_fm null def
-/_fd null def
-/_fdd null def
-/_sm null def
-/_sd null def
-/_sdd null def
-/_i null def
-/_lobyte 0 def
-/_hibyte 0 def
-/_cproc null def
-/_cscript 0 def
-/_hvax 0 def
-/_hvay 0 def
-/_hvwb 0 def
-/_hvcx 0 def
-/_hvcy 0 def
-/_bitfont null def
-/_bitlobyte 0 def
-/_bithibyte 0 def
-/_bitkey null def
-/_bitdata null def
-/_bitindex 0 def
-/discardSave null def
-/buffer 256 string def
-/beginString null def
-/endString null def
-/endStringLength null def
-/layerCnt 1 def
-/layerCount 1 def
-/perCent (%) 0 get def
-/perCentSeen? false def
-/newBuff null def
-/newBuffButFirst null def
-/newBuffLast null def
-/clipForward? false def
-end
-userdict /Adobe_Illustrator_AI5 known not {
- userdict /Adobe_Illustrator_AI5 100 dict put
-} if
-userdict /Adobe_Illustrator_AI5 get begin
-/initialize
-{
- Adobe_Illustrator_AI5 dup begin
- Adobe_Illustrator_AI5_vars begin
- /_aicmykps where {pop /_?cmyk _aicmykps def}if
- discardDict
- {
- bind pop pop
- } forall
- dup /nc get begin
- {
- dup xcheck 1 index type /operatortype ne and
- {
- bind
- } if
- pop pop
- } forall
- end
- newpath
-} def
-/terminate
-{
- end
- end
-} def
-/_
-null def
-/ddef
-{
- Adobe_Illustrator_AI5_vars 3 1 roll put
-} def
-/xput
-{
- dup load dup length exch maxlength eq
- {
- dup dup load dup
- length 2 mul dict copy def
- } if
- load begin
- def
- end
-} def
-/npop
-{
- {
- pop
- } repeat
-} def
-/hswj
-{
- dup stringwidth 3 2 roll
- {
- _hvwb eq { exch _hvcx add exch _hvcy add } if
- exch _hvax add exch _hvay add
- } cforall
-} def
-/vswj
-{
- 0 0 3 -1 roll
- {
- dup 255 le
- _charorientation 1 eq
- and
- {
- dup cstring stringwidth 5 2 roll
- _hvwb eq { exch _hvcy sub exch _hvcx sub } if
- exch _hvay sub exch _hvax sub
- 4 -1 roll sub exch
- 3 -1 roll sub exch
- }
- {
- _hvwb eq { exch _hvcy sub exch _hvcx sub } if
- exch _hvay sub exch _hvax sub
- _fontHeight sub
- } ifelse
- } cforall
-} def
-/swj
-{
- 6 1 roll
- /_hvay exch ddef
- /_hvax exch ddef
- /_hvwb exch ddef
- /_hvcy exch ddef
- /_hvcx exch ddef
- _lineorientation 0 eq { hswj } { vswj } ifelse
-} def
-/sw
-{
- 0 0 0 6 3 roll swj
-} def
-/vjss
-{
- 4 1 roll
- {
- dup cstring
- dup length 1 eq
- _charorientation 1 eq
- and
- {
- -90 rotate
- currentpoint
- _fontRotateAdjust add
- moveto
- gsave
- false charpath currentpoint
- 5 index setmatrix stroke
- grestore
- _fontRotateAdjust sub
- moveto
- _sp eq
- {
- 5 index 5 index rmoveto
- } if
- 2 copy rmoveto
- 90 rotate
- }
- {
- currentpoint
- _fontHeight sub
- 5 index sub
- 3 index _sp eq
- {
- 9 index sub
- } if
-
- currentpoint
- exch 4 index stringwidth pop 2 div sub
- exch _fontAscent sub
- moveto
-
- gsave
- 2 index false charpath
- 6 index setmatrix stroke
- grestore
-
- moveto pop pop
- } ifelse
- } cforall
- 6 npop
-} def
-/hjss
-{
- 4 1 roll
- {
- dup cstring
- gsave
- false charpath currentpoint
- 5 index setmatrix stroke
- grestore
- moveto
- _sp eq
- {
- 5 index 5 index rmoveto
- } if
- 2 copy rmoveto
- } cforall
- 6 npop
-} def
-/jss
-{
- _lineorientation 0 eq { hjss } { vjss } ifelse
-} def
-/ss
-{
- 0 0 0 7 3 roll jss
-} def
-/vjsp
-{
- 4 1 roll
- {
- dup cstring
- dup length 1 eq
- _charorientation 1 eq
- and
- {
- -90 rotate
- currentpoint
- _fontRotateAdjust add
- moveto
- false charpath
- currentpoint
- _fontRotateAdjust sub
- moveto
- _sp eq
- {
- 5 index 5 index rmoveto
- } if
- 2 copy rmoveto
- 90 rotate
- }
- {
- currentpoint
- _fontHeight sub
- 5 index sub
- 3 index _sp eq
- {
- 9 index sub
- } if
-
- currentpoint
- exch 4 index stringwidth pop 2 div sub
- exch _fontAscent sub
- moveto
-
- 2 index false charpath
-
- moveto pop pop
- } ifelse
- } cforall
- 6 npop
-} def
-/hjsp
-{
- 4 1 roll
- {
- dup cstring
- false charpath
- _sp eq
- {
- 5 index 5 index rmoveto
- } if
- 2 copy rmoveto
- } cforall
- 6 npop
-} def
-/jsp
-{
- matrix currentmatrix
- _lineorientation 0 eq {hjsp} {vjsp} ifelse
-} def
-/sp
-{
- matrix currentmatrix
- 0 0 0 7 3 roll
- _lineorientation 0 eq {hjsp} {vjsp} ifelse
-} def
-/pl
-{
- transform
- 0.25 sub round 0.25 add exch
- 0.25 sub round 0.25 add exch
- itransform
-} def
-/setstrokeadjust where
-{
- pop true setstrokeadjust
- /c
- {
- curveto
- } def
- /C
- /c load def
- /v
- {
- currentpoint 6 2 roll curveto
- } def
- /V
- /v load def
- /y
- {
- 2 copy curveto
- } def
- /Y
- /y load def
- /l
- {
- lineto
- } def
- /L
- /l load def
- /m
- {
- moveto
- } def
-}
-{
- /c
- {
- pl curveto
- } def
- /C
- /c load def
- /v
- {
- currentpoint 6 2 roll pl curveto
- } def
- /V
- /v load def
- /y
- {
- pl 2 copy curveto
- } def
- /Y
- /y load def
- /l
- {
- pl lineto
- } def
- /L
- /l load def
- /m
- {
- pl moveto
- } def
-} ifelse
-/d
-{
- setdash
-} def
-/cf
-{
-} def
-/i
-{
- dup 0 eq
- {
- pop cf
- } if
- setflat
-} def
-/j
-{
- setlinejoin
-} def
-/J
-{
- setlinecap
-} def
-/M
-{
- setmiterlimit
-} def
-/w
-{
- setlinewidth
-} def
-/XR
-{
- 0 ne
- /_eo exch ddef
-} def
-/H
-{
-} def
-/h
-{
- closepath
-} def
-/N
-{
- _pola 0 eq
- {
- _doClip 1 eq
- {
- _eo {eoclip} {clip} ifelse /_doClip 0 ddef
- } if
- newpath
- }
- {
- /CRender
- {
- N
- } ddef
- } ifelse
-} def
-/n
-{
- N
-} def
-/F
-{
- _pola 0 eq
- {
- _doClip 1 eq
- {
- gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc
- /_doClip 0 ddef
- }
- {
- _pf
- } ifelse
- }
- {
- /CRender
- {
- F
- } ddef
- } ifelse
-} def
-/f
-{
- closepath
- F
-} def
-/S
-{
- _pola 0 eq
- {
- _doClip 1 eq
- {
- gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc
- /_doClip 0 ddef
- }
- {
- _ps
- } ifelse
- }
- {
- /CRender
- {
- S
- } ddef
- } ifelse
-} def
-/s
-{
- closepath
- S
-} def
-/B
-{
- _pola 0 eq
- {
- _doClip 1 eq
- gsave F grestore
- {
- gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc
- /_doClip 0 ddef
- }
- {
- S
- } ifelse
- }
- {
- /CRender
- {
- B
- } ddef
- } ifelse
-} def
-/b
-{
- closepath
- B
-} def
-/W
-{
- /_doClip 1 ddef
-} def
-/*
-{
- count 0 ne
- {
- dup type /stringtype eq
- {
- pop
- } if
- } if
- newpath
-} def
-/u
-{
-} def
-/U
-{
-} def
-/q
-{
- _pola 0 eq
- {
- gsave
- } if
-} def
-/Q
-{
- _pola 0 eq
- {
- grestore
- } if
-} def
-/*u
-{
- _pola 1 add /_pola exch ddef
-} def
-/*U
-{
- _pola 1 sub /_pola exch ddef
- _pola 0 eq
- {
- CRender
- } if
-} def
-/D
-{
- pop
-} def
-/*w
-{
-} def
-/*W
-{
-} def
-/`
-{
- /_i save ddef
- clipForward?
- {
- nulldevice
- } if
- 6 1 roll 4 npop
- concat pop
- userdict begin
- /showpage
- {
- } def
- 0 setgray
- 0 setlinecap
- 1 setlinewidth
- 0 setlinejoin
- 10 setmiterlimit
- [] 0 setdash
- /setstrokeadjust where {pop false setstrokeadjust} if
- newpath
- 0 setgray
- false setoverprint
-} def
-/~
-{
- end
- _i restore
-} def
-/_rgbtocmyk
-{
- 3
- {
- 1 exch sub 3 1 roll
- } repeat
- 3 copy 1 4 1 roll
- 3
- {
- 3 index 2 copy gt
- {
- exch
- } if
- pop 4 1 roll
- } repeat
- pop pop pop
- 4 1 roll
- 3
- {
- 3 index sub
- 3 1 roll
- } repeat
- 4 -1 roll
-} def
-/setrgbfill
-{
- _rgbf astore pop
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _rgbf aload pop setrgbcolor
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/setrgbstroke
-{
- _rgbs astore pop
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _rgbs aload pop setrgbcolor
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/O
-{
- 0 ne
- /_of exch ddef
- /_lp /none ddef
-} def
-/R
-{
- 0 ne
- /_os exch ddef
- /_lp /none ddef
-} def
-/g
-{
- /_gf exch ddef
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _gf setgray
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/G
-{
- /_gs exch ddef
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _gs setgray
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/k
-{
- _cf astore pop
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _cf aload pop setcmykcolor
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/K
-{
- _cs astore pop
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _cs aload pop setcmykcolor
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/Xa
-{
- _?cmyk {
- 3 npop k
- }{
- setrgbfill 4 npop
- } ifelse
-} def
-/XA
-{
- _?cmyk {
- 3 npop K
- }{
- setrgbstroke 4 npop
- } ifelse
-} def
-/Xs
-{
- /_gf exch ddef
- 5 npop
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _gf setAIseparationgray
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/XS
-{
- /_gs exch ddef
- 5 npop
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _gs setAIseparationgray
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/Xx
-{
- exch
- /_gf exch ddef
- 0 eq {
- findcmykcustomcolor
- }{
- _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse
- {
- 4 1 roll 3 npop
- findcmykcustomcolor
- }{
- 8 -4 roll 4 npop
- findrgbcustomcolor
- } ifelse
- } ifelse
- /_if exch ddef
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _if _gf 1 exch sub setcustomcolor
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/XX
-{
- exch
- /_gs exch ddef
- 0 eq {
- findcmykcustomcolor
- }{
- _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse
- {
- 4 1 roll 3 npop
- findcmykcustomcolor
- }{
- 8 -4 roll 4 npop
- findrgbcustomcolor
- } ifelse
- } ifelse
- /_is exch ddef
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _is _gs 1 exch sub setcustomcolor
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/x
-{
- /_gf exch ddef
- findcmykcustomcolor
- /_if exch ddef
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _if _gf 1 exch sub setcustomcolor
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/X
-{
- /_gs exch ddef
- findcmykcustomcolor
- /_is exch ddef
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _is _gs 1 exch sub setcustomcolor
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/XK
-{
- 3 -1 roll pop
- 0 eq
- {
- 1 exch sub
- 3 {dup 3 1 roll mul 5 1 roll} repeat
- mul 4 1 roll
- K
- }
- {
- 1 exch sub 4 1 roll
- 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat
- 4 -1 roll pop
- XA
- } ifelse
-} def
-/Xk
-{
- 3 -1 roll pop
- 0 eq
- {
- 1 exch sub
- 3 {dup 3 1 roll mul 5 1 roll} repeat
- mul 4 1 roll
- k
- }
- {
- 1 exch sub 4 1 roll
- 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat
- 4 -1 roll pop
- Xa
- } ifelse
-} def
-/A
-{
- pop
-} def
-/annotatepage
-{
-userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse
-} def
-/XT {
- pop pop
-} def
-/Xt {
- pop
-} def
-/discard
-{
- save /discardSave exch store
- discardDict begin
- /endString exch store
- gt38?
- {
- 2 add
- } if
- load
- stopped
- pop
- end
- discardSave restore
-} bind def
-userdict /discardDict 7 dict dup begin
-put
-/pre38Initialize
-{
- /endStringLength endString length store
- /newBuff buffer 0 endStringLength getinterval store
- /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store
- /newBuffLast newBuff endStringLength 1 sub 1 getinterval store
-} def
-/shiftBuffer
-{
- newBuff 0 newBuffButFirst putinterval
- newBuffLast 0
- currentfile read not
- {
- stop
- } if
- put
-} def
-0
-{
- pre38Initialize
- mark
- currentfile newBuff readstring exch pop
- {
- {
- newBuff endString eq
- {
- cleartomark stop
- } if
- shiftBuffer
- } loop
- }
- {
- stop
- } ifelse
-} def
-1
-{
- pre38Initialize
- /beginString exch store
- mark
- currentfile newBuff readstring exch pop
- {
- {
- newBuff beginString eq
- {
- /layerCount dup load 1 add store
- }
- {
- newBuff endString eq
- {
- /layerCount dup load 1 sub store
- layerCount 0 eq
- {
- cleartomark stop
- } if
- } if
- } ifelse
- shiftBuffer
- } loop
- } if
-} def
-2
-{
- mark
- {
- currentfile buffer {readline} stopped {
- % assume error was due to overfilling the buffer
- }{
- not
- {
- stop
- } if
- endString eq {
- cleartomark stop
- } if
- }ifelse
- } loop
-} def
-3
-{
- /beginString exch store
- /layerCnt 1 store
- mark
- {
- currentfile buffer {readline} stopped {
- % assume error was due to overfilling the buffer
- }{
- not
- {
- stop
- } if
- dup beginString eq
- {
- pop /layerCnt dup load 1 add store
- }
- {
- endString eq
- {
- layerCnt 1 eq
- {
- cleartomark stop
- }
- {
- /layerCnt dup load 1 sub store
- } ifelse
- } if
- } ifelse
- }ifelse
- } loop
-} def
-end
-userdict /clipRenderOff 15 dict dup begin
-put
-{
- /n /N /s /S /f /F /b /B
-}
-{
- {
- _doClip 1 eq
- {
- /_doClip 0 ddef _eo {eoclip} {clip} ifelse
- } if
- newpath
- } def
-} forall
-/Tr /pop load def
-/Bb {} def
-/BB /pop load def
-/Bg {12 npop} def
-/Bm {6 npop} def
-/Bc /Bm load def
-/Bh {4 npop} def
-end
-/Lb
-{
- 6 npop
- 7 2 roll
- 5 npop
- 0 eq
- {
- 0 eq
- {
- (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard
- }
- {
-
- /clipForward? true def
-
- /Tx /pop load def
- /Tj /pop load def
-
- currentdict end clipRenderOff begin begin
- } ifelse
- }
- {
- 0 eq
- {
- save /discardSave exch store
- } if
- } ifelse
-} bind def
-/LB
-{
- discardSave dup null ne
- {
- restore
- }
- {
- pop
- clipForward?
- {
- currentdict
- end
- end
- begin
-
- /clipForward? false ddef
- } if
- } ifelse
-} bind def
-/Pb
-{
- pop pop
- 0 (%AI5_EndPalette) discard
-} bind def
-/Np
-{
- 0 (%AI5_End_NonPrinting--) discard
-} bind def
-/Ln /pop load def
-/Ap
-/pop load def
-/Ar
-{
- 72 exch div
- 0 dtransform dup mul exch dup mul add sqrt
- dup 1 lt
- {
- pop 1
- } if
- setflat
-} def
-/Mb
-{
- q
-} def
-/Md
-{
-} def
-/MB
-{
- Q
-} def
-/nc 4 dict def
-nc begin
-/setgray
-{
- pop
-} bind def
-/setcmykcolor
-{
- 4 npop
-} bind def
-/setrgbcolor
-{
- 3 npop
-} bind def
-/setcustomcolor
-{
- 2 npop
-} bind def
-currentdict readonly pop
-end
-/XP
-{
- 4 npop
-} bind def
-/XD
-{
- pop
-} bind def
-end
-setpacking
-%%EndResource
-%%BeginResource: procset Adobe_cshow 2.0 8
-%%Title: (Writing System Operators)
-%%Version: 2.0 8
-%%CreationDate: (1/23/89) ()
-%%Copyright: ((C) 1992-1996 Adobe Systems Incorporated All Rights Reserved)
-currentpacking true setpacking
-userdict /Adobe_cshow 14 dict dup begin put
-/initialize
-{
- Adobe_cshow begin
- Adobe_cshow
- {
- dup xcheck
- {
- bind
- } if
- pop pop
- } forall
- end
- Adobe_cshow begin
-} def
-/terminate
-{
-currentdict Adobe_cshow eq
- {
- end
- } if
-} def
-/cforall
-{
- /_lobyte 0 ddef
- /_hibyte 0 ddef
- /_cproc exch ddef
- /_cscript currentfont /FontScript known { currentfont /FontScript get } { -1 } ifelse ddef
- {
- /_lobyte exch ddef
- _hibyte 0 eq
- _cscript 1 eq
- _lobyte 129 ge _lobyte 159 le and
- _lobyte 224 ge _lobyte 252 le and or and
- _cscript 2 eq
- _lobyte 161 ge _lobyte 254 le and and
- _cscript 3 eq
- _lobyte 161 ge _lobyte 254 le and and
- _cscript 25 eq
- _lobyte 161 ge _lobyte 254 le and and
- _cscript -1 eq
- or or or or and
- {
- /_hibyte _lobyte ddef
- }
- {
- _hibyte 256 mul _lobyte add
- _cproc
- /_hibyte 0 ddef
- } ifelse
- } forall
-} def
-/cstring
-{
- dup 256 lt
- {
- (s) dup 0 4 3 roll put
- }
- {
- dup 256 idiv exch 256 mod
- (hl) dup dup 0 6 5 roll put 1 4 3 roll put
- } ifelse
-} def
-/clength
-{
- 0 exch
- { 256 lt { 1 } { 2 } ifelse add } cforall
-} def
-/hawidthshow
-{
- {
- dup cstring
- show
- _hvax _hvay rmoveto
- _hvwb eq { _hvcx _hvcy rmoveto } if
- } cforall
-} def
-/vawidthshow
-{
- {
- dup 255 le
- _charorientation 1 eq
- and
- {
- -90 rotate
- 0 _fontRotateAdjust rmoveto
- cstring
- _hvcx _hvcy _hvwb _hvax _hvay 6 -1 roll awidthshow
- 0 _fontRotateAdjust neg rmoveto
- 90 rotate
- }
- {
- currentpoint
- _fontHeight sub
- exch _hvay sub exch _hvax sub
- 2 index _hvwb eq { exch _hvcy sub exch _hvcx sub } if
- 3 2 roll
- cstring
- dup stringwidth pop 2 div neg _fontAscent neg rmoveto
- show
- moveto
- } ifelse
- } cforall
-} def
-/hvawidthshow
-{
- 6 1 roll
- /_hvay exch ddef
- /_hvax exch ddef
- /_hvwb exch ddef
- /_hvcy exch ddef
- /_hvcx exch ddef
- _lineorientation 0 eq { hawidthshow } { vawidthshow } ifelse
-} def
-/hvwidthshow
-{
- 0 0 3 -1 roll hvawidthshow
-} def
-/hvashow
-{
- 0 0 0 6 -3 roll hvawidthshow
-} def
-/hvshow
-{
- 0 0 0 0 0 6 -1 roll hvawidthshow
-} def
-currentdict readonly pop end
-setpacking
-%%EndResource
-%%BeginResource: procset Adobe_shading_AI8 1.0 0
-%%Title: (Adobe Illustrator 8 Shading Procset)
-%%Version: 1.0 0
-%%CreationDate: (12/17/97) ()
-%%Copyright: ((C) 1987-1997 Adobe Systems Incorporated All Rights Reserved)
-userdict /defaultpacking currentpacking put true setpacking
-userdict /Adobe_shading_AI8 10 dict dup begin put
-/initialize {
- Adobe_shading_AI8 begin
- Adobe_shading_AI8 bdprocs
- Mesh /initialize get exec
-} def
-/terminate {
- currentdict Adobe_shading_AI8 eq {
- end
- } if
-} def
-/bdprocs {
- {
- dup xcheck 1 index type /arraytype eq and {
- bind
- } if
- pop pop
- } forall
-} def
-/X! {pop} def
-/X# {pop pop} def
-/Mesh 40 dict def
-Mesh begin
-/initialize {
- Mesh bdprocs
- Mesh begin
- /emulate? /AI8MeshEmulation where {
- pop AI8MeshEmulation
- }{
- systemdict /shfill known not
- } ifelse def
- end
-} def
-/bd {
- shadingdict begin
-} def
-/paint {
- emulate? {
- end
- }{
- /_lp /none ddef _fc /_lp /none ddef
-
- /AIColorSpace AIColorSpace tocolorspace store
- /ColorSpace AIColorSpace topsspace store
-
- version_ge_3010.106 not systemdict /setsmoothness known and {
- 0.0001 setsmoothness
- } if
-
- composite? {
- /DataSource getdatasrc def
- Matrix concat
- currentdict end
- shfill
- }{
- AIColorSpace makesmarks AIPlateList markingplate and not isoverprint and {
- end
- }{
- /ColorSpace /DeviceGray store
- /Decode [0 1 0 1 0 1] store
- /DataSource getplatesrc def
- Matrix concat
- currentdict end
- shfill
- } ifelse
- } ifelse
- } ifelse
-} def
-/shadingdict 12 dict def
-shadingdict begin
- /ShadingType 6 def
- /BitsPerCoordinate 16 def
- /BitsPerComponent 8 def
- /BitsPerFlag 8 def
-end
-/datafile null def
-/databuf 256 string def
-/dataptr 0 def
-/srcspace null def
-/srcchannels 0 def
-/dstchannels 0 def
-/dstplate 0 def
-/srctodstcolor null def
-/getplatesrc {
- /srcspace AIColorSpace store
- /srcchannels AIColorSpace getnchannels store
- /dstchannels 1 store
- /dstplate getplateindex store
- /srctodstcolor srcspace makesmarks {
- dstplate 4 eq {
- {1 exch sub}
- }{
- {srcspace tocmyk 3 dstplate sub index 1 exch sub 5 1 roll 4 {pop} repeat}
- } ifelse
- }{
- {srcchannels {pop} repeat 1}
- } ifelse store
- /datafile getdatasrc store
- /rdpatch168 load DataLength () /SubFileDecode filter
-} def
-/getdatasrc {
- /rdcmntline load /ASCII85Decode filter
-} def
-/rdpatch168 {
- /dataptr 0 store
- 49 rdcount
- 4 {
- dup {pop srcchannels getint8} if
- dup {pop srctodstcolor dstchannels putint8 true} if
- } repeat
- {databuf 0 dataptr getinterval}{()} ifelse
-} def
-/rdpatch3216 {
- /dataptr 0 store
- 97 rdcount
- 4 {
- dup {pop srcchannels getint16} if
- dup {pop srctodstcolor dstchannels putint16 true} if
- } repeat
- {databuf 0 dataptr getinterval}{()} ifelse
-} def
-/rdcount {
- dup 0 gt {
- datafile databuf dataptr 4 -1 roll getinterval readstring
- exch length dataptr add /dataptr exch store
- }{
- true
- } ifelse
-} def
-/getint8 {
- mark true 3 -1 roll
- {
- dup {pop datafile read} if
- dup {pop 255 div true} if
- } repeat
- {
- counttomark 1 add -1 roll pop true
- }{
- cleartomark false
- } ifelse
-} def
-/putint8 {
- dup dataptr add /dataptr exch store
- dataptr exch
- {
- 1 sub exch
- 255 mul cvi
- databuf 2 index
- 3 -1 roll put
- } repeat
- pop
-} def
-/getint16 {
- mark true 3 -1 roll
- {
- dup {pop datafile read} if
- dup {pop 256 mul datafile read} if
- dup {pop add 65535 div true} if
- } repeat
- {
- counttomark 1 add -1 roll pop true
- }{
- cleartomark false
- } ifelse
-} def
-/putint16 {
- dup 2 mul dataptr add /dataptr exch store
- dataptr exch
- {
- 2 sub exch
- 65535 mul cvi dup
- 256 idiv databuf 3 index 3 -1 roll put
- 256 mod databuf 2 index 1 add 3 -1 roll put
- } repeat
- pop
-} def
-/srcbuf 256 string def
-/rdcmntline {
- currentfile srcbuf readline pop
- (%) anchorsearch {pop} if
-} def
-/getplateindex {
- 0 [cyan? magenta? yellow? black? customColor?] {{exit} if 1 add} forall
-} def
-/aicsarray 4 array def
-/aicsaltvals 4 array def
-/aicsaltcolr aicsaltvals def
-/tocolorspace {
- dup type /arraytype eq {
- mark exch aload pop
- aicsarray 0 3 -1 roll put
- aicsarray 1 3 -1 roll put
- dup aicsarray 2 3 -1 roll put
- gettintxform aicsarray 3 3 -1 roll put
- counttomark aicsaltvals 0 3 -1 roll getinterval /aicsaltcolr exch store
- aicsaltcolr astore pop pop
- aicsarray
- } if
-} def
-/subtintxform {aicsaltcolr {1 index mul exch} forall pop} def
-/addtintxform {aicsaltcolr {1 sub 1 index mul 1 add exch} forall pop} def
-/gettintxform {
- /DeviceRGB eq {/addtintxform}{/subtintxform} ifelse load
-} def
-/getnchannels {
- dup type /arraytype eq {0 get} if
- colorspacedict exch get begin Channels end
-} def
-/makesmarks {
- composite? {
- pop true
- }{
- dup dup type /arraytype eq {0 get} if
- colorspacedict exch get begin MarksPlate end
- } ifelse
-} def
-/markingplate {
- composite? {
- pop true
- }{
- dup type /arraytype eq {
- dup length getplateindex gt {getplateindex get}{pop false} ifelse
- } if
- } ifelse
-} def
-/tocmyk {
- dup dup type /arraytype eq {0 get} if
- colorspacedict exch get begin ToCMYK end
-} def
-/topsspace {
- dup dup type /arraytype eq {0 get} if
- colorspacedict exch get begin ToPSSpace end
-} def
-/colorspacedict 5 dict dup begin
- /DeviceGray 4 dict dup begin
- /Channels 1 def
- /MarksPlate {pop black?} def
- /ToCMYK {pop 1 exch sub 0 0 0 4 -1 roll} def
- /ToPSSpace {} def
- end def
- /DeviceRGB 4 dict dup begin
- /Channels 3 def
- /MarksPlate {pop isCMYKSep?} def
- /ToCMYK {pop _rgbtocmyk} def
- /ToPSSpace {} def
- end def
- /DeviceCMYK 4 dict dup begin
- /Channels 4 def
- /MarksPlate {pop isCMYKSep?} def
- /ToCMYK {pop} def
- /ToPSSpace {} def
- end def
- /Separation 4 dict dup begin
- /Channels 1 def
- /MarksPlate {
- /findcmykcustomcolor where {
- pop dup 1 exch ToCMYK 5 -1 roll 1 get
- findcmykcustomcolor 1 setcustomcolor
- systemdict /currentgray get exec
- 1 ne
- }{
- pop false
- } ifelse
- } def
- /ToCMYK {
- dup 2 get mark exch 4 2 roll
- 3 get exec
- counttomark -1 roll tocmyk
- 5 -1 roll pop
- } def
- /ToPSSpace {} def
- end def
- /Process 4 dict dup begin
- /Channels 1 def
- /MarksPlate {
- isCMYKSep? {
- 1 exch ToCMYK 4 array astore getplateindex get 0 ne
- }{
- pop false
- } ifelse
- } def
- /ToCMYK {
- dup 2 get mark exch 4 2 roll
- 3 get exec
- counttomark -1 roll tocmyk
- 5 -1 roll pop
- } def
- /ToPSSpace {
- 4 array copy dup 0 /Separation put
- } def
- end def
-end def
-/isoverprint {
- /currentoverprint where {pop currentoverprint}{_of} ifelse
-} def
-/version_ge_3010.106 {
- version {cvr} stopped {
- pop
- false
- }{
- 3010.106 ge
- } ifelse
-} def
-end
-end
-defaultpacking setpacking
-%%EndResource
-%%EndProlog
-%%BeginSetup
-%%IncludeFont: Helvetica
-userdict /_useSmoothShade false put
-userdict /_aicmykps false put
-userdict /_forceToCMYK false put
-Adobe_level2_AI5 /initialize get exec
-Adobe_cshow /initialize get exec
-Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 Adobe_typography_AI5 /initialize get exec
-Adobe_ColorImage_AI6 /initialize get exec
-Adobe_shading_AI8 /initialize get exec
-Adobe_Illustrator_AI5 /initialize get exec
-[
-39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis
-/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute
-/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde
-/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex
-/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
-/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash
-/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef
-/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash
-/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef
-/guillemotleft/guillemotright/ellipsis/space/Agrave/Atilde/Otilde/OE/oe
-/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide
-/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright
-/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand
-/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex
-/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex
-/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla
-/hungarumlaut/ogonek/caron
-TE
-%AI55J_Tsume: None
-%AI3_BeginEncoding: _Helvetica Helvetica
-[/_Helvetica/Helvetica 0 0 1 TZ
-%AI3_EndEncoding AdobeType
-[161/degree 173/notequal 176/infinity/plusminus/lessequal/greaterequal
-181/mu/partialdiff/summation/product/pi/integral 189/Omega
-195/radical 197/approxequal 198/Delta 214/divide/lozenge 240/apple
-/_Symbol_/Symbol 0 0 0 TZ
-%AI5_Begin_NonPrinting
-Np
-%AI3_BeginPattern: (bi-direction diagonals)
-(bi-direction diagonals) 24.2119 0.2119 96.2124 72.2119 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-2 J 2 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-8.2119 6.2119 m
-14.2119 0.2119 L
-F
-8.2119 0.2119 m
-14.2119 6.2119 L
-F
-%AI6_EndPatternLayer
-) &
-(0 O 0 R 0 0 0 1 k
- 0 0 0 1 K
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-2 J 2 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-24.2119 72.2119 m
-96.2124 0.2119 L
-S
-21.2109 69.2129 m
-90.2124 0.2119 L
-S
-21.207 63.2168 m
-84.2124 0.2119 L
-S
-21.2031 57.2207 m
-78.2124 0.2119 L
-S
-21.1987 51.2246 m
-72.2124 0.2119 L
-S
-21.1958 45.2275 m
-66.2119 0.2119 L
-S
-21.1919 39.2314 m
-60.2119 0.2119 L
-S
-21.188 33.2363 m
-54.2119 0.2119 L
-S
-21.1851 27.2402 m
-48.2119 0.2119 L
-S
-21.1812 21.2432 m
-42.2119 0.2119 L
-S
-21.1768 15.2471 m
-36.2119 0.2119 L
-S
-21.1729 9.251 m
-30.2119 0.2119 L
-S
-21.1699 3.2549 m
-24.2119 0.2119 L
-S
-30.2119 72.2119 m
-99.2134 3.21 L
-S
-36.2119 72.2119 m
-99.2173 9.2061 L
-S
-42.2119 72.2119 m
-99.2212 15.2021 L
-S
-48.2119 72.2119 m
-99.2251 21.1992 L
-S
-54.2119 72.2119 m
-99.228 27.1953 L
-S
-60.2119 72.2119 m
-99.2319 33.1904 L
-S
-66.2119 72.2119 m
-99.2358 39.1865 L
-S
-72.2124 72.2119 m
-99.2397 45.1836 L
-S
-78.2124 72.2119 m
-99.2427 51.1797 L
-S
-84.2124 72.2119 m
-99.2466 57.1758 L
-S
-90.2124 72.2119 m
-99.2505 63.1719 L
-S
-96.2124 72.2119 m
-99.2554 69.1689 L
-S
-0.2119 68.7119 m
-10.2119 58.7119 L
-S
-96.2124 72.2119 m
-24.2119 0.2119 L
-S
-90.2124 72.2119 m
-21.2109 3.21 L
-S
-84.2124 72.2119 m
-21.207 9.2061 L
-S
-78.2124 72.2119 m
-21.2031 15.2021 L
-S
-72.2124 72.2119 m
-21.1987 21.1982 L
-S
-66.2119 72.2119 m
-21.1958 27.1953 L
-S
-60.2119 72.2119 m
-21.1919 33.1904 L
-S
-54.2119 72.2119 m
-21.188 39.1865 L
-S
-48.2119 72.2119 m
-21.1851 45.1826 L
-S
-42.2119 72.2119 m
-21.1812 51.1797 L
-S
-36.2119 72.2119 m
-21.1768 57.1758 L
-S
-30.2119 72.2119 m
-21.1729 63.1719 L
-S
-24.2119 72.2119 m
-21.1699 69.168 L
-S
-99.2134 69.2129 m
-30.2119 0.2119 L
-S
-99.2173 63.2168 m
-36.2119 0.2119 L
-S
-99.2212 57.2207 m
-42.2119 0.2119 L
-S
-99.2251 51.2246 m
-48.2119 0.2119 L
-S
-99.228 45.2275 m
-54.2119 0.2119 L
-S
-99.2319 39.2314 m
-60.2119 0.2119 L
-S
-99.2358 33.2363 m
-66.2119 0.2119 L
-S
-99.2397 27.2393 m
-72.2124 0.2119 L
-S
-99.2427 21.2432 m
-78.2124 0.2119 L
-S
-99.2466 15.2471 m
-84.2124 0.2119 L
-S
-99.2505 9.251 m
-90.2124 0.2119 L
-S
-99.2554 3.2539 m
-96.2124 0.2119 L
-S
-0.2119 58.7119 m
-10.2119 68.7119 L
-S
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI3_BeginPattern: (black dots)
-(black dots) 16 0.6885 88 72.6885 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-1 J 0 j 0.75 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-0 6.6885 m
-6 0.6885 L
-F
-0 0.6885 m
-6 6.6885 L
-F
-%AI6_EndPatternLayer
-) &
-(0 O 0 R 0 0 0 1 k
- 0 0 0 1 K
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-1 J 0 j 0.75 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-28.9365 3.1885 m
-28.9365 3.1885 l
-S
-17.125 3.375 m
-17.125 3.375 l
-S
-26.5 4.6885 m
-26.5 4.6885 l
-S
-35.6865 5.8135 m
-35.6865 5.8135 l
-S
-19.75 0.9385 m
-19.75 0.9385 l
-S
-23.125 7.3135 m
-23.125 7.3135 l
-S
-40.5615 2.4385 m
-40.5615 2.4385 l
-S
-43 1.125 m
-43 1.125 l
-S
-45.0615 5.4385 m
-45.0615 5.4385 l
-S
-56.875 6.375 m
-56.875 6.375 l
-S
-65.3115 5.0635 m
-65.3115 5.0635 l
-S
-51.0615 6.9385 m
-51.0615 6.9385 l
-S
-40.5615 6.9385 m
-40.5615 6.9385 l
-S
-31.1865 6.9385 m
-31.1865 6.9385 l
-S
-59.875 9.5635 m
-59.875 9.5635 l
-S
-62.6865 1.3135 m
-62.6865 1.3135 l
-S
-34.5615 0.9385 m
-34.5615 0.9385 l
-S
-48.4365 2.25 m
-48.4365 2.25 l
-S
-56.3115 0.75 m
-56.3115 0.75 l
-S
-66.625 24.5635 m
-66.625 24.5635 l
-S
-74.3115 24.9385 m
-74.3115 24.9385 l
-S
-78.8115 24.375 m
-78.8115 24.375 l
-S
-82.9365 2.0635 m
-82.9365 2.0635 l
-S
-68.3115 11.8135 m
-68.3115 11.8135 l
-S
-86.5 17.8135 m
-86.5 17.8135 l
-S
-87.0615 4.6885 m
-87.0615 4.6885 l
-S
-79.9365 19.875 m
-79.9365 19.875 l
-S
-77.875 1.125 m
-77.875 1.125 l
-S
-69.625 20.25 m
-69.625 20.25 l
-S
-67.75 6 m
-67.75 6 l
-S
-73.375 17.625 m
-73.375 17.625 l
-S
-76.9365 16.875 m
-76.9365 16.875 l
-S
-72.4365 3.375 m
-72.4365 3.375 l
-S
-77.3115 9.5635 m
-77.3115 9.5635 l
-S
-73.9365 11.25 m
-73.9365 11.25 l
-S
-83.125 7.875 m
-83.125 7.875 l
-S
-85.1865 12.75 m
-85.1865 12.75 l
-S
-81.0615 13.875 m
-81.0615 13.875 l
-S
-17.6865 16.125 m
-17.6865 16.125 l
-S
-45.25 10.3135 m
-45.25 10.3135 l
-S
-31.5615 21.375 m
-31.5615 21.375 l
-S
-20.875 11.8135 m
-20.875 11.8135 l
-S
-34.75 18.5635 m
-34.75 18.5635 l
-S
-25.75 21.9385 m
-25.75 21.9385 l
-S
-34.5615 24.5635 m
-34.5615 24.5635 l
-S
-37.375 16.3135 m
-37.375 16.3135 l
-S
-36.625 12.75 m
-36.625 12.75 l
-S
-23.125 17.25 m
-23.125 17.25 l
-S
-29.3115 12.375 m
-29.3115 12.375 l
-S
-31 15.75 m
-31 15.75 l
-S
-46.1865 22.875 m
-46.1865 22.875 l
-S
-52 15.375 m
-52 15.375 l
-S
-58.375 13.3135 m
-58.375 13.3135 l
-S
-62.6865 20.0635 m
-62.6865 20.0635 l
-S
-62.875 14.0635 m
-62.875 14.0635 l
-S
-44.6865 20.4385 m
-44.6865 20.4385 l
-S
-46.75 15.1885 m
-46.75 15.1885 l
-S
-42.0615 17.0635 m
-42.0615 17.0635 l
-S
-55.1865 17.4385 m
-55.1865 17.4385 l
-S
-58.9365 23.25 m
-58.9365 23.25 l
-S
-60.0615 17.4385 m
-60.0615 17.4385 l
-S
-42.4365 25.125 m
-42.4365 25.125 l
-S
-65.3115 20.625 m
-65.3115 20.625 l
-S
-51.625 24.5635 m
-51.625 24.5635 l
-S
-52 20.625 m
-52 20.625 l
-S
-18.8115 24 m
-18.8115 24 l
-S
-21.25 24.9385 m
-21.25 24.9385 l
-S
-19.375 70.875 m
-19.375 70.875 l
-S
-26.125 66.5635 m
-26.125 66.5635 l
-S
-20.125 66.375 m
-20.125 66.375 l
-S
-38.5 69 m
-38.5 69 l
-S
-47.125 71.625 m
-47.125 71.625 l
-S
-62.875 68.0635 m
-62.875 68.0635 l
-S
-49.75 67.5 m
-49.75 67.5 l
-S
-38.875 65.625 m
-38.875 65.625 l
-S
-29.3115 70.3135 m
-29.3115 70.3135 l
-S
-31.9365 67.5 m
-31.9365 67.5 l
-S
-57.25 65.4385 m
-57.25 65.4385 l
-S
-23.5 69.1885 m
-23.5 69.1885 l
-S
-45.625 65.25 m
-45.625 65.25 l
-S
-26.6865 63.9385 m
-26.6865 63.9385 l
-S
-50.5 63.75 m
-50.5 63.75 l
-S
-32.6865 72 m
-32.6865 72 l
-S
-52.9365 71.4385 m
-52.9365 71.4385 l
-S
-57.8115 69.375 m
-57.8115 69.375 l
-S
-61 64.3135 m
-61 64.3135 l
-S
-28.9365 48.1885 m
-28.9365 48.1885 l
-S
-17.125 48.375 m
-17.125 48.375 l
-S
-21.4365 42.375 m
-21.4365 42.375 l
-S
-19.375 36 m
-19.375 36 l
-S
-26.125 31.6885 m
-26.125 31.6885 l
-S
-20.125 31.5 m
-20.125 31.5 l
-S
-26.5 49.6885 m
-26.5 49.6885 l
-S
-35.6865 50.8135 m
-35.6865 50.8135 l
-S
-19.75 45.9385 m
-19.75 45.9385 l
-S
-23.125 52.3135 m
-23.125 52.3135 l
-S
-40.5615 47.4385 m
-40.5615 47.4385 l
-S
-43 46.125 m
-43 46.125 l
-S
-23.5 39.1885 m
-23.5 39.1885 l
-S
-38.5 34.125 m
-38.5 34.125 l
-S
-47.125 36.75 m
-47.125 36.75 l
-S
-45.0615 50.4385 m
-45.0615 50.4385 l
-S
-56.875 51.375 m
-56.875 51.375 l
-S
-42.8115 39.375 m
-42.8115 39.375 l
-S
-62.875 33.1885 m
-62.875 33.1885 l
-S
-49.75 32.625 m
-49.75 32.625 l
-S
-38.875 30.75 m
-38.875 30.75 l
-S
-29.3115 35.4385 m
-29.3115 35.4385 l
-S
-31.9365 32.625 m
-31.9365 32.625 l
-S
-54.75 30.1885 m
-54.75 30.1885 l
-S
-64.9365 39.75 m
-64.9365 39.75 l
-S
-46.1865 41.8135 m
-46.1865 41.8135 l
-S
-65.3115 50.0635 m
-65.3115 50.0635 l
-S
-51.0615 51.9385 m
-51.0615 51.9385 l
-S
-23.5 34.3135 m
-23.5 34.3135 l
-S
-40.5615 51.9385 m
-40.5615 51.9385 l
-S
-31.1865 51.9385 m
-31.1865 51.9385 l
-S
-45.625 30.375 m
-45.625 30.375 l
-S
-26.6865 29.0635 m
-26.6865 29.0635 l
-S
-59.875 54.5635 m
-59.875 54.5635 l
-S
-50.5 28.875 m
-50.5 28.875 l
-S
-60.75 47.6885 m
-60.75 47.6885 l
-S
-30.625 42.75 m
-30.625 42.75 l
-S
-26.6865 42.375 m
-26.6865 42.375 l
-S
-36.8115 40.125 m
-36.8115 40.125 l
-S
-37.75 43.5 m
-37.75 43.5 l
-S
-34.5615 45.9385 m
-34.5615 45.9385 l
-S
-32.6865 37.125 m
-32.6865 37.125 l
-S
-61.9365 42.75 m
-61.9365 42.75 l
-S
-48.4365 47.25 m
-48.4365 47.25 l
-S
-54.625 42.375 m
-54.625 42.375 l
-S
-56.3115 45.75 m
-56.3115 45.75 l
-S
-52.9365 36.5635 m
-52.9365 36.5635 l
-S
-57.8115 34.5 m
-57.8115 34.5 l
-S
-58.9365 38.625 m
-58.9365 38.625 l
-S
-61 29.4385 m
-61 29.4385 l
-S
-65.875 29.625 m
-65.875 29.625 l
-S
-70.5615 27.75 m
-70.5615 27.75 l
-S
-71.5 52.875 m
-71.5 52.875 l
-S
-69.8115 34.3135 m
-69.8115 34.3135 l
-S
-76.375 27.375 m
-76.375 27.375 l
-S
-71.3115 41.0635 m
-71.3115 41.0635 l
-S
-77.3115 45.375 m
-77.3115 45.375 l
-S
-82 28.6885 m
-82 28.6885 l
-S
-88.1865 27.5635 m
-88.1865 27.5635 l
-S
-83.6865 43.3135 m
-83.6865 43.3135 l
-S
-88 50.0635 m
-88 50.0635 l
-S
-88.1865 44.0635 m
-88.1865 44.0635 l
-S
-88.1865 33.1885 m
-88.1865 33.1885 l
-S
-70 50.4385 m
-70 50.4385 l
-S
-68.875 59.625 m
-68.875 59.625 l
-S
-66.8115 38.25 m
-66.8115 38.25 l
-S
-74.75 42.1885 m
-74.75 42.1885 l
-S
-67.375 47.0635 m
-67.375 47.0635 l
-S
-72.25 64.5 m
-72.25 64.5 l
-S
-73.5615 66.9385 m
-73.5615 66.9385 l
-S
-80.5 47.4385 m
-80.5 47.4385 l
-S
-85.5615 62.4385 m
-85.5615 62.4385 l
-S
-82.9365 71.0635 m
-82.9365 71.0635 l
-S
-69.25 69 m
-69.25 69 l
-S
-80.3115 66.75 m
-80.3115 66.75 l
-S
-84.25 53.25 m
-84.25 53.25 l
-S
-87.0615 55.875 m
-87.0615 55.875 l
-S
-77.875 70.125 m
-77.875 70.125 l
-S
-85.375 47.4385 m
-85.375 47.4385 l
-S
-67.75 64.5 m
-67.75 64.5 l
-S
-67.75 55.125 m
-67.75 55.125 l
-S
-81.625 31.125 m
-81.625 31.125 l
-S
-79.375 39 m
-79.375 39 l
-S
-75.8115 33 m
-75.8115 33 l
-S
-84.4365 37.3135 m
-84.4365 37.3135 l
-S
-76.9365 54.5635 m
-76.9365 54.5635 l
-S
-77.3115 50.625 m
-77.3115 50.625 l
-S
-79.5615 60.75 m
-79.5615 60.75 l
-S
-76.1865 61.6885 m
-76.1865 61.6885 l
-S
-73.75 58.5 m
-73.75 58.5 l
-S
-82.5615 56.625 m
-82.5615 56.625 l
-S
-72.4365 72.375 m
-72.4365 72.375 l
-S
-61.75 25.875 m
-61.75 25.875 l
-S
-57.25 26.625 m
-57.25 26.625 l
-S
-25.75 60.75 m
-25.75 60.75 l
-S
-34.1865 59.4385 m
-34.1865 59.4385 l
-S
-19.9365 61.3135 m
-19.9365 61.3135 l
-S
-31.5615 55.6885 m
-31.5615 55.6885 l
-S
-17.3115 56.625 m
-17.3115 56.625 l
-S
-25.1865 55.125 m
-25.1865 55.125 l
-S
-40.375 62.25 m
-40.375 62.25 l
-S
-46.1865 54.75 m
-46.1865 54.75 l
-S
-56.875 59.4385 m
-56.875 59.4385 l
-S
-40.25 58.1885 m
-40.25 58.1885 l
-S
-36.25 56.4385 m
-36.25 56.4385 l
-S
-49.375 56.8135 m
-49.375 56.8135 l
-S
-53.125 62.625 m
-53.125 62.625 l
-S
-54.25 56.8135 m
-54.25 56.8135 l
-S
-59.5 60 m
-59.5 60 l
-S
-46.1865 60 m
-46.1865 60 l
-S
-30.8115 28.5 m
-30.8115 28.5 l
-S
-19.75 72.9385 m
-19.75 72.9385 l
-S
-43 73.125 m
-43 73.125 l
-S
-34.5615 72.9385 m
-34.5615 72.9385 l
-S
-56.3115 72.75 m
-56.3115 72.75 l
-S
-77.875 73.125 m
-77.875 73.125 l
-S
-72.4365 0.375 m
-72.4365 0.375 l
-S
-16.1865 27.5635 m
-16.1865 27.5635 l
-S
-16 50.0635 m
-16 50.0635 l
-S
-16.1865 44.0635 m
-16.1865 44.0635 l
-S
-16.1865 33.1885 m
-16.1865 33.1885 l
-S
-6 62.3135 m
-6.208 62.3135 6.375 62.4805 6.375 62.6885 c
-6.375 62.8945 6.208 63.0635 6 63.0635 c
-5.793 63.0635 5.625 62.8945 5.625 62.6885 c
-5.625 62.4805 5.793 62.3135 6 62.3135 c
-s
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI3_BeginPattern: (horizontal rules)
-(horizontal rules) 16 0 88 73.9463 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-2 J 0 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-0 6 m
-6 0 L
-F
-0 0 m
-6 6 L
-F
-%AI6_EndPatternLayer
-) &
-(0 O 0 R 0 0 0 1 k
- 0 0 0 1 K
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-2 J 0 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-88 72.9727 m
-16 72.9727 l
-S
-88 71.0273 m
-16 71.0273 L
-S
-88 67.1357 m
-16 67.1357 L
-S
-88 65.1904 m
-16 65.1904 L
-S
-88 63.2441 m
-16 63.2441 L
-S
-88 61.2979 m
-16 61.2979 L
-S
-88 57.4072 m
-16 57.4072 L
-S
-88 55.4609 m
-16 55.4609 L
-S
-88 53.5156 m
-16 53.5156 L
-S
-88 51.5703 m
-16 51.5703 L
-S
-88 49.624 m
-16 49.624 L
-S
-88 47.6787 m
-16 47.6787 L
-S
-88 45.7334 m
-16 45.7334 L
-S
-88 43.7871 m
-16 43.7871 L
-S
-88 39.8965 m
-16 39.8965 L
-S
-88 37.9502 m
-16 37.9502 L
-S
-88 36.0049 m
-16 36.0049 L
-S
-88 34.0586 m
-16 34.0586 L
-S
-88 32.1133 m
-16 32.1133 L
-S
-88 30.168 m
-16 30.168 L
-S
-88 26.2764 m
-16 26.2764 L
-S
-88 22.3848 m
-16 22.3848 L
-S
-88 20.4395 m
-16 20.4395 L
-S
-88 18.4941 m
-16 18.4941 L
-S
-88 16.5479 m
-16 16.5479 L
-S
-88 14.6016 m
-16 14.6016 L
-S
-88 12.6572 m
-16 12.6572 L
-S
-88 8.7646 m
-16 8.7646 L
-S
-88 6.8193 m
-16 6.8193 L
-S
-88 4.874 m
-16 4.874 L
-S
-88 0.9727 m
-16 0.9727 l
-S
-88 2.9277 m
-16 2.9277 L
-S
-88 69.0811 m
-16 69.0811 L
-S
-88 59.3525 m
-16 59.3525 L
-S
-88 41.8418 m
-16 41.8418 L
-S
-88 28.2217 m
-16 28.2217 L
-S
-88 24.3311 m
-16 24.3311 L
-S
-88 10.7109 m
-16 10.7109 L
-S
-6 69.0811 m
-2 69.0811 l
-S
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI3_BeginPattern: (one direction diagonals)
-(one direction diagonals) 28.856 4.6211 100.855 76.6211 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-0 J 2 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-5.106 10.6211 m
-11.106 4.6211 L
-F
-5.106 4.6211 m
-11.106 10.6211 L
-F
-%AI6_EndPatternLayer
-) &
-(0 O 0 R 0 0 0 1 k
- 0 0 0 1 K
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-0 J 1 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-21.3716 66.1055 m
-39.3706 84.1055 l
-S
-21.3716 60.1055 m
-45.3706 84.1055 l
-S
-21.3716 54.1055 m
-51.3706 84.1055 l
-S
-21.3716 48.1055 m
-57.3706 84.1055 l
-S
-21.3716 42.1055 m
-63.3706 84.1055 l
-S
-21.3716 36.1055 m
-69.3706 84.1055 l
-S
-21.3716 30.1055 m
-75.3706 84.1055 l
-S
-21.3716 24.1055 m
-81.3706 84.1055 l
-S
-21.3716 18.1055 m
-87.3706 84.1055 l
-S
-21.3716 12.1055 m
-93.3706 84.1055 l
-S
-21.3716 6.1055 m
-99.3706 84.1055 l
-S
-21.3716 0.1064 m
-105.3706 84.1055 l
-S
-27.3716 0.1064 m
-105.3706 78.1055 l
-S
-33.3706 0.1064 m
-105.3706 72.1055 l
-S
-39.3706 0.1064 m
-105.3706 66.1055 l
-S
-45.3706 0.1064 m
-105.3706 60.1055 l
-S
-51.3706 0.1064 m
-105.3706 54.1055 l
-S
-57.3706 0.1064 m
-105.3706 48.1055 l
-S
-63.3706 0.1064 m
-105.3706 42.1055 l
-S
-69.3706 0.1064 m
-105.3706 36.1055 l
-S
-75.3706 0.1064 m
-105.3706 30.1055 l
-S
-81.3706 0.1064 m
-105.3706 24.1055 l
-S
-87.3706 0.1064 m
-105.3706 18.1055 l
-S
-93.3706 0.1064 m
-105.3706 12.1055 l
-S
-2 j
-0.106 63.1211 m
-10.106 73.1211 L
-S
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI3_BeginPattern: (white dots)
-(white dots) 0.375 0.6885 72.375 72.6885 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-1 J 0 j 0.75 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-13.3115 3.1885 m
-13.3115 3.1885 l
-S
-1.5 3.375 m
-1.5 3.375 l
-S
-10.875 4.6885 m
-10.875 4.6885 l
-S
-20.0615 5.8135 m
-20.0615 5.8135 l
-S
-4.125 0.9385 m
-4.125 0.9385 l
-S
-7.5 7.3135 m
-7.5 7.3135 l
-S
-24.9365 2.4385 m
-24.9365 2.4385 l
-S
-27.375 1.125 m
-27.375 1.125 l
-S
-29.4365 5.4385 m
-29.4365 5.4385 l
-S
-41.25 6.375 m
-41.25 6.375 l
-S
-49.6865 5.0635 m
-49.6865 5.0635 l
-S
-35.4365 6.9385 m
-35.4365 6.9385 l
-S
-24.9365 6.9385 m
-24.9365 6.9385 l
-S
-15.5615 6.9385 m
-15.5615 6.9385 l
-S
-44.25 9.5635 m
-44.25 9.5635 l
-S
-47.0615 1.3135 m
-47.0615 1.3135 l
-S
-18.9365 0.9385 m
-18.9365 0.9385 l
-S
-32.8115 2.25 m
-32.8115 2.25 l
-S
-40.6865 0.75 m
-40.6865 0.75 l
-S
-51 24.5635 m
-51 24.5635 l
-S
-58.6865 24.9385 m
-58.6865 24.9385 l
-S
-63.1865 24.375 m
-63.1865 24.375 l
-S
-67.3115 2.0635 m
-67.3115 2.0635 l
-S
-52.6865 11.8135 m
-52.6865 11.8135 l
-S
-70.875 17.8135 m
-70.875 17.8135 l
-S
-71.4365 4.6885 m
-71.4365 4.6885 l
-S
-64.3115 19.875 m
-64.3115 19.875 l
-S
-62.25 1.125 m
-62.25 1.125 l
-S
-54 20.25 m
-54 20.25 l
-S
-52.125 6 m
-52.125 6 l
-S
-57.75 17.625 m
-57.75 17.625 l
-S
-61.3115 16.875 m
-61.3115 16.875 l
-S
-56.8115 3.375 m
-56.8115 3.375 l
-S
-61.6865 9.5635 m
-61.6865 9.5635 l
-S
-58.3115 11.25 m
-58.3115 11.25 l
-S
-67.5 7.875 m
-67.5 7.875 l
-S
-69.5615 12.75 m
-69.5615 12.75 l
-S
-65.4365 13.875 m
-65.4365 13.875 l
-S
-2.0615 16.125 m
-2.0615 16.125 l
-S
-29.625 10.3135 m
-29.625 10.3135 l
-S
-15.9365 21.375 m
-15.9365 21.375 l
-S
-5.25 11.8135 m
-5.25 11.8135 l
-S
-19.125 18.5635 m
-19.125 18.5635 l
-S
-10.125 21.9385 m
-10.125 21.9385 l
-S
-18.9365 24.5635 m
-18.9365 24.5635 l
-S
-21.75 16.3135 m
-21.75 16.3135 l
-S
-21 12.75 m
-21 12.75 l
-S
-7.5 17.25 m
-7.5 17.25 l
-S
-13.6865 12.375 m
-13.6865 12.375 l
-S
-15.375 15.75 m
-15.375 15.75 l
-S
-30.5615 22.875 m
-30.5615 22.875 l
-S
-36.375 15.375 m
-36.375 15.375 l
-S
-42.75 13.3135 m
-42.75 13.3135 l
-S
-47.0615 20.0635 m
-47.0615 20.0635 l
-S
-47.25 14.0635 m
-47.25 14.0635 l
-S
-29.0615 20.4385 m
-29.0615 20.4385 l
-S
-31.125 15.1885 m
-31.125 15.1885 l
-S
-26.4365 17.0635 m
-26.4365 17.0635 l
-S
-39.5615 17.4385 m
-39.5615 17.4385 l
-S
-43.3115 23.25 m
-43.3115 23.25 l
-S
-44.4365 17.4385 m
-44.4365 17.4385 l
-S
-26.8115 25.125 m
-26.8115 25.125 l
-S
-49.6865 20.625 m
-49.6865 20.625 l
-S
-36 24.5635 m
-36 24.5635 l
-S
-36.375 20.625 m
-36.375 20.625 l
-S
-3.1865 24 m
-3.1865 24 l
-S
-5.625 24.9385 m
-5.625 24.9385 l
-S
-3.75 70.875 m
-3.75 70.875 l
-S
-10.5 66.5635 m
-10.5 66.5635 l
-S
-4.5 66.375 m
-4.5 66.375 l
-S
-22.875 69 m
-22.875 69 l
-S
-31.5 71.625 m
-31.5 71.625 l
-S
-47.25 68.0635 m
-47.25 68.0635 l
-S
-34.125 67.5 m
-34.125 67.5 l
-S
-23.25 65.625 m
-23.25 65.625 l
-S
-13.6865 70.3135 m
-13.6865 70.3135 l
-S
-16.3115 67.5 m
-16.3115 67.5 l
-S
-41.625 65.4385 m
-41.625 65.4385 l
-S
-7.875 69.1885 m
-7.875 69.1885 l
-S
-30 65.25 m
-30 65.25 l
-S
-11.0615 63.9385 m
-11.0615 63.9385 l
-S
-34.875 63.75 m
-34.875 63.75 l
-S
-17.0615 72 m
-17.0615 72 l
-S
-37.3115 71.4385 m
-37.3115 71.4385 l
-S
-42.1865 69.375 m
-42.1865 69.375 l
-S
-45.375 64.3135 m
-45.375 64.3135 l
-S
-13.3115 48.1885 m
-13.3115 48.1885 l
-S
-1.5 48.375 m
-1.5 48.375 l
-S
-5.8115 42.375 m
-5.8115 42.375 l
-S
-3.75 36 m
-3.75 36 l
-S
-10.5 31.6885 m
-10.5 31.6885 l
-S
-4.5 31.5 m
-4.5 31.5 l
-S
-10.875 49.6885 m
-10.875 49.6885 l
-S
-20.0615 50.8135 m
-20.0615 50.8135 l
-S
-4.125 45.9385 m
-4.125 45.9385 l
-S
-7.5 52.3135 m
-7.5 52.3135 l
-S
-24.9365 47.4385 m
-24.9365 47.4385 l
-S
-27.375 46.125 m
-27.375 46.125 l
-S
-7.875 39.1885 m
-7.875 39.1885 l
-S
-22.875 34.125 m
-22.875 34.125 l
-S
-31.5 36.75 m
-31.5 36.75 l
-S
-29.4365 50.4385 m
-29.4365 50.4385 l
-S
-41.25 51.375 m
-41.25 51.375 l
-S
-27.1865 39.375 m
-27.1865 39.375 l
-S
-47.25 33.1885 m
-47.25 33.1885 l
-S
-34.125 32.625 m
-34.125 32.625 l
-S
-23.25 30.75 m
-23.25 30.75 l
-S
-13.6865 35.4385 m
-13.6865 35.4385 l
-S
-16.3115 32.625 m
-16.3115 32.625 l
-S
-39.125 30.1885 m
-39.125 30.1885 l
-S
-49.3115 39.75 m
-49.3115 39.75 l
-S
-30.5615 41.8135 m
-30.5615 41.8135 l
-S
-49.6865 50.0635 m
-49.6865 50.0635 l
-S
-35.4365 51.9385 m
-35.4365 51.9385 l
-S
-7.875 34.3135 m
-7.875 34.3135 l
-S
-24.9365 51.9385 m
-24.9365 51.9385 l
-S
-15.5615 51.9385 m
-15.5615 51.9385 l
-S
-30 30.375 m
-30 30.375 l
-S
-11.0615 29.0635 m
-11.0615 29.0635 l
-S
-44.25 54.5635 m
-44.25 54.5635 l
-S
-34.875 28.875 m
-34.875 28.875 l
-S
-45.125 47.6885 m
-45.125 47.6885 l
-S
-15 42.75 m
-15 42.75 l
-S
-11.0615 42.375 m
-11.0615 42.375 l
-S
-21.1865 40.125 m
-21.1865 40.125 l
-S
-22.125 43.5 m
-22.125 43.5 l
-S
-18.9365 45.9385 m
-18.9365 45.9385 l
-S
-17.0615 37.125 m
-17.0615 37.125 l
-S
-46.3115 42.75 m
-46.3115 42.75 l
-S
-32.8115 47.25 m
-32.8115 47.25 l
-S
-39 42.375 m
-39 42.375 l
-S
-40.6865 45.75 m
-40.6865 45.75 l
-S
-37.3115 36.5635 m
-37.3115 36.5635 l
-S
-42.1865 34.5 m
-42.1865 34.5 l
-S
-43.3115 38.625 m
-43.3115 38.625 l
-S
-45.375 29.4385 m
-45.375 29.4385 l
-S
-50.25 29.625 m
-50.25 29.625 l
-S
-54.9365 27.75 m
-54.9365 27.75 l
-S
-55.875 52.875 m
-55.875 52.875 l
-S
-54.1865 34.3135 m
-54.1865 34.3135 l
-S
-60.75 27.375 m
-60.75 27.375 l
-S
-55.6865 41.0635 m
-55.6865 41.0635 l
-S
-61.6865 45.375 m
-61.6865 45.375 l
-S
-66.375 28.6885 m
-66.375 28.6885 l
-S
-72.5615 27.5635 m
-72.5615 27.5635 l
-S
-68.0615 43.3135 m
-68.0615 43.3135 l
-S
-72.375 50.0635 m
-72.375 50.0635 l
-S
-72.5615 44.0635 m
-72.5615 44.0635 l
-S
-72.5615 33.1885 m
-72.5615 33.1885 l
-S
-54.375 50.4385 m
-54.375 50.4385 l
-S
-53.25 59.625 m
-53.25 59.625 l
-S
-51.1865 38.25 m
-51.1865 38.25 l
-S
-59.125 42.1885 m
-59.125 42.1885 l
-S
-51.75 47.0635 m
-51.75 47.0635 l
-S
-56.625 64.5 m
-56.625 64.5 l
-S
-57.9365 66.9385 m
-57.9365 66.9385 l
-S
-64.875 47.4385 m
-64.875 47.4385 l
-S
-69.9365 62.4385 m
-69.9365 62.4385 l
-S
-67.3115 71.0635 m
-67.3115 71.0635 l
-S
-53.625 69 m
-53.625 69 l
-S
-64.6865 66.75 m
-64.6865 66.75 l
-S
-68.625 53.25 m
-68.625 53.25 l
-S
-71.4365 55.875 m
-71.4365 55.875 l
-S
-62.25 70.125 m
-62.25 70.125 l
-S
-69.75 47.4385 m
-69.75 47.4385 l
-S
-52.125 64.5 m
-52.125 64.5 l
-S
-52.125 55.125 m
-52.125 55.125 l
-S
-66 31.125 m
-66 31.125 l
-S
-63.75 39 m
-63.75 39 l
-S
-60.1865 33 m
-60.1865 33 l
-S
-68.8115 37.3135 m
-68.8115 37.3135 l
-S
-61.3115 54.5635 m
-61.3115 54.5635 l
-S
-61.6865 50.625 m
-61.6865 50.625 l
-S
-63.9365 60.75 m
-63.9365 60.75 l
-S
-60.5615 61.6885 m
-60.5615 61.6885 l
-S
-58.125 58.5 m
-58.125 58.5 l
-S
-66.9365 56.625 m
-66.9365 56.625 l
-S
-56.8115 72.375 m
-56.8115 72.375 l
-S
-46.125 25.875 m
-46.125 25.875 l
-S
-41.625 26.625 m
-41.625 26.625 l
-S
-10.125 60.75 m
-10.125 60.75 l
-S
-18.5615 59.4385 m
-18.5615 59.4385 l
-S
-4.3115 61.3135 m
-4.3115 61.3135 l
-S
-15.9365 55.6885 m
-15.9365 55.6885 l
-S
-1.6865 56.625 m
-1.6865 56.625 l
-S
-9.5615 55.125 m
-9.5615 55.125 l
-S
-24.75 62.25 m
-24.75 62.25 l
-S
-30.5615 54.75 m
-30.5615 54.75 l
-S
-41.25 59.4385 m
-41.25 59.4385 l
-S
-24.625 58.1885 m
-24.625 58.1885 l
-S
-20.625 56.4385 m
-20.625 56.4385 l
-S
-33.75 56.8135 m
-33.75 56.8135 l
-S
-37.5 62.625 m
-37.5 62.625 l
-S
-38.625 56.8135 m
-38.625 56.8135 l
-S
-43.875 60 m
-43.875 60 l
-S
-30.5615 60 m
-30.5615 60 l
-S
-15.1865 28.5 m
-15.1865 28.5 l
-S
-4.125 72.9385 m
-4.125 72.9385 l
-S
-27.375 73.125 m
-27.375 73.125 l
-S
-18.9365 72.9385 m
-18.9365 72.9385 l
-S
-40.6865 72.75 m
-40.6865 72.75 l
-S
-62.25 73.125 m
-62.25 73.125 l
-S
-56.8115 0.375 m
-56.8115 0.375 l
-S
-0.5615 27.5635 m
-0.5615 27.5635 l
-S
-0.375 50.0635 m
-0.375 50.0635 l
-S
-0.5615 44.0635 m
-0.5615 44.0635 l
-S
-0.5615 33.1885 m
-0.5615 33.1885 l
-S
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI5_End_NonPrinting--
-%AI5_Begin_NonPrinting
-Np
-%AI8_BeginBrushPattern
-(New Pattern 2)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7884 8586 m
--7838.1201 8586 L
--7838.1201 8500.6914 L
--7884 8500.6914 L
--7884 8586 L
-n
-u
--7850.4111 8533.3125 m
--7850.3774 8533.3086 -7850.3457 8533.3047 -7850.313 8533.3018 c
--7850.3457 8533.3047 -7850.3774 8533.3086 -7850.4111 8533.3125 c
-n
--7843.6582 8532.1602 m
--7843.647 8532.1572 -7843.6362 8532.1543 -7843.626 8532.1523 c
--7843.6362 8532.1543 -7843.647 8532.1572 -7843.6582 8532.1602 c
-n
--7870.0361 8579.5879 m
--7870.0688 8579.5859 -7870.1006 8579.584 -7870.1318 8579.5801 c
--7870.1162 8579.582 -7870.1016 8579.584 -7870.0854 8579.585 c
--7870.0703 8579.5859 -7870.0527 8579.5879 -7870.0361 8579.5879 c
-n
--7854.5366 8533.6719 m
--7854.4785 8533.668 -7854.4209 8533.6641 -7854.3599 8533.6602 c
--7854.4209 8533.6641 -7854.4785 8533.668 -7854.5366 8533.6719 c
-n
--7839.1553 8576.4043 m
--7839.0625 8576.3281 -7838.9775 8576.252 -7838.9009 8576.1758 c
--7838.5967 8575.8672 -7838.4385 8575.5469 -7838.4385 8575.2207 c
--7838.4385 8575.6289 -7838.689 8576.0254 -7839.1553 8576.4043 c
-n
--7877.3232 8578.5703 m
--7877.3247 8578.5703 -7877.3281 8578.5693 -7877.3311 8578.5684 c
--7877.3306 8578.5693 -7877.3281 8578.5693 -7877.3271 8578.5703 c
--7877.3247 8578.5703 -7877.3247 8578.5703 -7877.3232 8578.5703 c
-n
--7882.21 8577.0645 m
--7882.21 8577.0645 L
--7882.21 8577.0645 L
--7882.21 8577.0645 L
-n
--7858.9209 8533.8545 m
--7858.8994 8533.8545 -7858.8774 8533.8535 -7858.856 8533.8535 c
--7858.8774 8533.8535 -7858.8994 8533.8545 -7858.9209 8533.8545 c
-n
--7863.582 8533.8535 m
--7863.5601 8533.8535 -7863.5391 8533.8545 -7863.5166 8533.8545 c
--7863.5391 8533.8545 -7863.5601 8533.8535 -7863.582 8533.8535 c
-n
--7865.667 8533.7881 m
--7865.7642 8533.7842 -7865.8594 8533.7793 -7865.9561 8533.7754 c
--7865.9058 8533.7773 -7865.8608 8533.7813 -7865.8096 8533.7832 c
--7865.7642 8533.7852 -7865.7134 8533.7861 -7865.667 8533.7881 c
-n
--7884 8529.1426 m
--7884 8529.3066 -7883.96 8529.4688 -7883.8818 8529.627 c
--7883.96 8529.4688 -7884 8529.3066 -7884 8529.1426 c
-n
--7868.0718 8533.6602 m
--7868.0166 8533.6641 -7867.9609 8533.668 -7867.9038 8533.6709 c
--7867.9609 8533.668 -7868.0166 8533.6641 -7868.0718 8533.6602 c
-n
--7878.811 8532.1523 m
--7878.8018 8532.1543 -7878.792 8532.1572 -7878.7822 8532.1592 c
--7878.792 8532.1572 -7878.8018 8532.1543 -7878.811 8532.1523 c
-n
--7872.1201 8533.3027 m
--7872.0898 8533.3057 -7872.0615 8533.3086 -7872.0322 8533.3125 c
--7872.0615 8533.3086 -7872.0898 8533.3057 -7872.1201 8533.3027 c
-n
--7838.4385 8529.1426 m
--7838.4385 8529.3887 -7838.5278 8529.6289 -7838.7002 8529.8643 c
--7838.5278 8529.6289 -7838.4385 8529.3887 -7838.4385 8529.1426 c
-n
--7839.0342 8530.2168 m
--7839.332 8530.4844 -7839.731 8530.7432 -7840.2358 8530.9902 c
--7840.2334 8530.9893 -7840.231 8530.9883 -7840.229 8530.9863 c
--7839.7271 8530.7402 -7839.3311 8530.4834 -7839.0342 8530.2168 c
-n
--7841.187 8531.4004 m
--7841.187 8531.4004 L
--7841.187 8531.4004 L
-n
--7884 8575.2207 m
--7884 8575.5 -7883.876 8575.7754 -7883.6514 8576.042 c
--7883.876 8575.7754 -7884 8575.501 -7884 8575.2207 c
-n
--7856.4824 8533.7754 m
--7856.5791 8533.7793 -7856.6758 8533.7842 -7856.7729 8533.7881 c
--7856.7246 8533.7861 -7856.6758 8533.7852 -7856.6279 8533.7832 c
--7856.5791 8533.7813 -7856.5313 8533.7773 -7856.4824 8533.7754 c
-n
--7872.0942 8579.3828 m
--7872.083 8579.3848 -7872.0698 8579.3867 -7872.0562 8579.3877 c
--7872.0698 8579.3867 -7872.083 8579.3848 -7872.0942 8579.3828 c
-n
--7882.2026 8530.9902 m
--7882.46 8530.8633 -7882.687 8530.7344 -7882.8936 8530.6016 c
--7882.6904 8530.7324 -7882.4639 8530.8613 -7882.21 8530.9863 c
--7882.208 8530.9883 -7882.2041 8530.9893 -7882.2026 8530.9902 c
-n
--7854.4766 8579.7461 m
--7854.4561 8579.7441 -7854.4346 8579.7432 -7854.4146 8579.7422 c
--7854.4346 8579.7432 -7854.4561 8579.7441 -7854.4766 8579.7461 c
-n
--7840.229 8577.0645 m
--7840.229 8577.0645 L
--7840.229 8577.0645 L
--7840.229 8577.0645 L
-n
--7852.2998 8579.5801 m
--7852.335 8579.583 -7852.3706 8579.5859 -7852.4072 8579.5898 c
--7852.3882 8579.5879 -7852.3706 8579.5869 -7852.3521 8579.585 c
--7852.334 8579.584 -7852.3174 8579.582 -7852.2998 8579.5801 c
-n
--7856.5601 8579.8574 m
--7856.6055 8579.8594 -7856.6514 8579.8613 -7856.6958 8579.8633 c
--7856.6738 8579.8623 -7856.6494 8579.8613 -7856.6279 8579.8613 c
--7856.6055 8579.8604 -7856.583 8579.8584 -7856.5601 8579.8574 c
-n
--7868.0186 8579.7422 m
--7868.001 8579.7432 -7867.9834 8579.7441 -7867.9658 8579.7461 c
--7867.9834 8579.7441 -7868.001 8579.7432 -7868.0186 8579.7422 c
-n
--7850.3882 8579.3887 m
--7850.3706 8579.3867 -7850.3535 8579.3848 -7850.3369 8579.3828 c
--7850.3535 8579.3848 -7850.3706 8579.3867 -7850.3882 8579.3887 c
-n
--7865.7422 8579.8633 m
--7865.7881 8579.8613 -7865.833 8579.8594 -7865.8774 8579.8574 c
--7865.8545 8579.8584 -7865.833 8579.8604 -7865.8096 8579.8613 c
--7865.7881 8579.8613 -7865.7646 8579.8623 -7865.7422 8579.8633 c
-n
-0 O
-0.8 g
--7839.1553 8576.4043 m
--7839.437 8576.6309 -7839.7959 8576.8516 -7840.229 8577.0645 C
--7840.229 8577.0645 L
--7840.229 8577.0645 L
--7842.2422 8578.0547 -7845.8286 8578.8721 -7850.3369 8579.3828 c
--7850.3535 8579.3848 -7850.3706 8579.3867 -7850.3882 8579.3887 c
--7851.0088 8579.458 -7851.6465 8579.5215 -7852.2998 8579.5801 c
--7852.3174 8579.582 -7852.334 8579.584 -7852.3521 8579.585 c
--7852.3706 8579.5869 -7852.3882 8579.5879 -7852.4072 8579.5898 c
--7853.0615 8579.6465 -7853.7305 8579.6973 -7854.4146 8579.7422 c
--7854.4346 8579.7432 -7854.4561 8579.7441 -7854.4766 8579.7461 c
--7855.1567 8579.79 -7855.853 8579.8262 -7856.5601 8579.8574 c
--7856.583 8579.8584 -7856.6055 8579.8604 -7856.6279 8579.8613 c
--7856.6494 8579.8613 -7856.6738 8579.8623 -7856.6958 8579.8633 c
--7858.1567 8579.9238 -7859.6694 8579.957 -7861.2202 8579.957 c
--7862.769 8579.957 -7864.2798 8579.9238 -7865.7422 8579.8633 c
--7865.7646 8579.8623 -7865.7881 8579.8613 -7865.8096 8579.8613 c
--7865.833 8579.8604 -7865.8545 8579.8584 -7865.8774 8579.8574 c
--7866.5854 8579.8262 -7867.2832 8579.7891 -7867.9658 8579.7461 c
--7867.9834 8579.7441 -7868.001 8579.7432 -7868.0186 8579.7422 c
--7868.7065 8579.6973 -7869.3799 8579.6465 -7870.0361 8579.5879 c
--7870.0527 8579.5879 -7870.0703 8579.5859 -7870.0854 8579.585 c
--7870.1016 8579.584 -7870.1162 8579.582 -7870.1318 8579.5801 c
--7870.7886 8579.5225 -7871.4321 8579.458 -7872.0562 8579.3877 c
--7872.0698 8579.3867 -7872.083 8579.3848 -7872.0942 8579.3828 c
--7874.0234 8579.165 -7875.7832 8578.8906 -7877.3232 8578.5703 c
--7877.3247 8578.5703 -7877.3247 8578.5703 -7877.3271 8578.5703 c
--7877.3281 8578.5693 -7877.3306 8578.5693 -7877.3311 8578.5684 c
--7879.3896 8578.1406 -7881.0576 8577.6309 -7882.21 8577.0645 C
--7882.21 8577.0645 L
--7882.21 8577.0645 L
--7882.8682 8576.7402 -7883.353 8576.3984 -7883.6514 8576.042 c
--7883.876 8575.7754 -7884 8575.5 -7884 8575.2207 C
--7884 8581.2637 L
--7884 8581.5908 -7883.8408 8581.9102 -7883.5361 8582.2188 c
--7883.2334 8582.5273 -7882.7866 8582.8242 -7882.21 8583.1074 c
--7881.6328 8583.3906 -7880.9287 8583.6602 -7880.1089 8583.9121 c
--7879.29 8584.1641 -7878.3584 8584.3984 -7877.3271 8584.6133 c
--7876.2959 8584.8281 -7875.168 8585.0215 -7873.9561 8585.1914 c
--7872.7432 8585.3623 -7871.4497 8585.5088 -7870.0854 8585.6279 c
--7868.7231 8585.749 -7867.293 8585.8418 -7865.8096 8585.9043 c
--7864.3271 8585.9668 -7862.792 8586 -7861.2202 8586 c
--7859.6465 8586 -7858.1104 8585.9668 -7856.6279 8585.9043 c
--7855.145 8585.8418 -7853.7134 8585.749 -7852.3521 8585.6279 c
--7850.9897 8585.5088 -7849.6934 8585.3623 -7848.4814 8585.1914 c
--7847.2695 8585.0215 -7846.1416 8584.8281 -7845.1104 8584.6133 c
--7844.0801 8584.3984 -7843.147 8584.1641 -7842.3286 8583.9121 c
--7841.5103 8583.6602 -7840.8042 8583.3906 -7840.229 8583.1074 c
--7839.6514 8582.8242 -7839.2041 8582.5273 -7838.9009 8582.2188 c
--7838.5967 8581.9102 -7838.4385 8581.5908 -7838.4385 8581.2637 C
--7838.4385 8575.2207 L
--7838.4385 8575.5469 -7838.5967 8575.8672 -7838.9009 8576.1758 c
--7838.9775 8576.252 -7839.0625 8576.3281 -7839.1553 8576.4043 c
-f
-0.5 g
--7848.209 8572.2383 m
--7847.9424 8572.2383 L
--7847.9424 8572.4561 -7848.041 8572.6621 -7848.209 8572.8555 C
--7848.209 8574.0039 L
--7848.209 8574.1914 -7848.2998 8574.373 -7848.4736 8574.5488 c
--7848.6455 8574.7256 -7848.9014 8574.8945 -7849.231 8575.0566 c
--7849.5615 8575.2197 -7849.9639 8575.373 -7850.4302 8575.5166 c
--7850.8984 8575.6602 -7851.4302 8575.7949 -7852.0186 8575.917 c
--7852.6079 8576.0391 -7853.2529 8576.1504 -7853.9438 8576.248 c
--7854.6377 8576.3447 -7855.376 8576.4277 -7856.1543 8576.4961 c
--7856.9326 8576.5645 -7857.749 8576.6191 -7858.5967 8576.6543 c
--7859.4438 8576.6895 -7860.3218 8576.709 -7861.2192 8576.709 c
--7862.1162 8576.709 -7862.9946 8576.6895 -7863.8408 8576.6543 c
--7864.687 8576.6191 -7865.5049 8576.5645 -7866.2822 8576.4961 c
--7867.061 8576.4277 -7867.8008 8576.3447 -7868.4927 8576.248 c
--7869.1846 8576.1504 -7869.8306 8576.0391 -7870.418 8575.917 c
--7871.0063 8575.7949 -7871.54 8575.6602 -7872.0063 8575.5166 c
--7872.4746 8575.373 -7872.8774 8575.2197 -7873.2065 8575.0566 c
--7873.5361 8574.8945 -7873.792 8574.7256 -7873.9658 8574.5488 c
--7874.1377 8574.373 -7874.2295 8574.1914 -7874.2295 8574.0039 C
--7874.2295 8572.8555 L
--7874.3975 8572.6621 -7874.4961 8572.4561 -7874.4961 8572.2383 C
--7874.2295 8572.2383 L
--7874.2295 8571.4912 L
--7874.2695 8571.4453 -7874.2974 8571.3965 -7874.3286 8571.3486 C
--7880.1768 8572.2051 -7884 8573.6191 -7884 8575.2207 c
--7884 8575.501 -7883.876 8575.7754 -7883.6514 8576.042 c
--7883.353 8576.3984 -7882.8682 8576.7402 -7882.21 8577.0645 C
--7882.21 8577.0645 L
--7881.0576 8577.6309 -7879.3896 8578.1406 -7877.3311 8578.5684 c
--7877.3281 8578.5693 -7877.3247 8578.5703 -7877.3232 8578.5703 c
--7875.7832 8578.8906 -7874.0234 8579.165 -7872.0942 8579.3828 c
--7872.083 8579.3848 -7872.0698 8579.3867 -7872.0562 8579.3877 c
--7871.4321 8579.458 -7870.7886 8579.5225 -7870.1318 8579.5801 c
--7870.1006 8579.584 -7870.0688 8579.5859 -7870.0361 8579.5879 c
--7869.3799 8579.6465 -7868.7065 8579.6973 -7868.0186 8579.7422 c
--7868.001 8579.7432 -7867.9834 8579.7441 -7867.9658 8579.7461 c
--7867.2832 8579.7891 -7866.5854 8579.8262 -7865.8774 8579.8574 c
--7865.833 8579.8594 -7865.7881 8579.8613 -7865.7422 8579.8633 c
--7864.2798 8579.9238 -7862.769 8579.957 -7861.2202 8579.957 c
--7859.6694 8579.957 -7858.1567 8579.9238 -7856.6958 8579.8633 c
--7856.6514 8579.8613 -7856.6055 8579.8594 -7856.5601 8579.8574 c
--7855.853 8579.8262 -7855.1567 8579.79 -7854.4766 8579.7461 c
--7854.4561 8579.7441 -7854.4346 8579.7432 -7854.4146 8579.7422 c
--7853.7305 8579.6973 -7853.0615 8579.6465 -7852.4072 8579.5898 c
--7852.3706 8579.5859 -7852.335 8579.583 -7852.2998 8579.5801 c
--7851.6465 8579.5215 -7851.0088 8579.458 -7850.3882 8579.3887 c
--7850.3706 8579.3867 -7850.3535 8579.3848 -7850.3369 8579.3828 c
--7845.8286 8578.8721 -7842.2422 8578.0547 -7840.229 8577.0645 C
--7840.229 8577.0645 L
--7839.7959 8576.8516 -7839.437 8576.6309 -7839.1553 8576.4043 c
--7838.689 8576.0254 -7838.4385 8575.6289 -7838.4385 8575.2207 c
--7838.4385 8573.6191 -7842.2617 8572.2051 -7848.1104 8571.3486 C
--7848.1392 8571.3965 -7848.1689 8571.4453 -7848.209 8571.4912 C
--7848.209 8572.2383 L
-f
-0.55 g
--7861.2202 8558.7959 m
--7866.9199 8558.7959 -7872.9287 8557.9863 -7874.2295 8556.4746 C
--7874.2295 8557.2227 L
--7874.0454 8557.2227 L
--7874.0454 8558.3994 -7868.7783 8559.7109 -7861.2202 8559.7109 c
--7853.6602 8559.7109 -7848.3921 8558.3994 -7848.3921 8557.2227 C
--7848.209 8557.2227 L
--7848.209 8556.4746 L
--7849.5088 8557.9863 -7855.5166 8558.7959 -7861.2202 8558.7959 c
-f
--7861.2202 8549.2402 m
--7866.9199 8549.2402 -7872.9287 8548.4307 -7874.2295 8546.9199 C
--7874.2295 8547.666 L
--7874.0454 8547.666 L
--7874.0454 8548.8438 -7868.7783 8550.1563 -7861.2202 8550.1563 c
--7853.6602 8550.1563 -7848.3921 8548.8438 -7848.3921 8547.666 C
--7848.209 8547.666 L
--7848.209 8546.9199 L
--7849.5088 8548.4307 -7855.5166 8549.2402 -7861.2202 8549.2402 c
-f
--7861.2202 8560.1611 m
--7866.9199 8560.1611 -7872.9287 8559.3516 -7874.2295 8557.8398 C
--7874.2295 8558.5879 L
--7874.0454 8558.5879 L
--7874.0454 8559.7646 -7868.7783 8561.0762 -7861.2202 8561.0762 c
--7853.6602 8561.0762 -7848.3921 8559.7646 -7848.3921 8558.5879 C
--7848.209 8558.5879 L
--7848.209 8557.8398 L
--7849.5088 8559.3516 -7855.5166 8560.1611 -7861.2202 8560.1611 c
-f
--7861.2202 8561.5264 m
--7866.9199 8561.5264 -7872.9287 8560.7168 -7874.2295 8559.2051 C
--7874.2295 8559.9531 L
--7874.0454 8559.9531 L
--7874.0454 8561.1299 -7868.7783 8562.4414 -7861.2202 8562.4414 c
--7853.6602 8562.4414 -7848.3921 8561.1299 -7848.3921 8559.9531 C
--7848.209 8559.9531 L
--7848.209 8559.2051 L
--7849.5088 8560.7168 -7855.5166 8561.5264 -7861.2202 8561.5264 c
-f
--7861.2202 8550.6055 m
--7866.9199 8550.6055 -7872.9287 8549.7959 -7874.2295 8548.2852 C
--7874.2295 8549.0322 L
--7874.0454 8549.0322 L
--7874.0454 8550.209 -7868.7783 8551.5205 -7861.2202 8551.5205 c
--7853.6602 8551.5205 -7848.3921 8550.209 -7848.3921 8549.0322 C
--7848.209 8549.0322 L
--7848.209 8548.2852 L
--7849.5088 8549.7959 -7855.5166 8550.6055 -7861.2202 8550.6055 c
-f
--7861.2202 8554.7012 m
--7866.9199 8554.7012 -7872.9287 8553.8906 -7874.2295 8552.3789 C
--7874.2295 8553.127 L
--7874.0454 8553.127 L
--7874.0454 8554.3047 -7868.7783 8555.6162 -7861.2202 8555.6162 c
--7853.6602 8555.6162 -7848.3921 8554.3047 -7848.3921 8553.127 C
--7848.209 8553.127 L
--7848.209 8552.3789 L
--7849.5088 8553.8906 -7855.5166 8554.7012 -7861.2202 8554.7012 c
-f
--7861.2202 8557.4316 m
--7866.9199 8557.4316 -7872.9287 8556.6211 -7874.2295 8555.1104 C
--7874.2295 8555.8574 L
--7874.0454 8555.8574 L
--7874.0454 8557.0342 -7868.7783 8558.3457 -7861.2202 8558.3457 c
--7853.6602 8558.3457 -7848.3921 8557.0342 -7848.3921 8555.8574 C
--7848.209 8555.8574 L
--7848.209 8555.1104 L
--7849.5088 8556.6211 -7855.5166 8557.4316 -7861.2202 8557.4316 c
-f
--7861.2202 8553.3359 m
--7866.9199 8553.3359 -7872.9287 8552.5254 -7874.2295 8551.0146 C
--7874.2295 8551.7617 L
--7874.0454 8551.7617 L
--7874.0454 8552.9395 -7868.7783 8554.25 -7861.2202 8554.25 c
--7853.6602 8554.25 -7848.3921 8552.9395 -7848.3921 8551.7617 C
--7848.209 8551.7617 L
--7848.209 8551.0146 L
--7849.5088 8552.5254 -7855.5166 8553.3359 -7861.2202 8553.3359 c
-f
--7861.2202 8543.7803 m
--7866.9199 8543.7803 -7872.9287 8542.9707 -7874.2295 8541.459 C
--7874.2295 8542.2061 L
--7874.0454 8542.2061 L
--7874.0454 8543.3828 -7868.7783 8544.6953 -7861.2202 8544.6953 c
--7853.6602 8544.6953 -7848.3921 8543.3828 -7848.3921 8542.2061 C
--7848.209 8542.2061 L
--7848.209 8541.459 L
--7849.5088 8542.9707 -7855.5166 8543.7803 -7861.2202 8543.7803 c
-f
--7861.2202 8546.5098 m
--7866.9199 8546.5098 -7872.9287 8545.7012 -7874.2295 8544.1895 C
--7874.2295 8544.9375 L
--7874.0454 8544.9375 L
--7874.0454 8546.1133 -7868.7783 8547.4248 -7861.2202 8547.4248 c
--7853.6602 8547.4248 -7848.3921 8546.1133 -7848.3921 8544.9375 C
--7848.209 8544.9375 L
--7848.209 8544.1895 L
--7849.5088 8545.7012 -7855.5166 8546.5098 -7861.2202 8546.5098 c
-f
--7861.2202 8556.0664 m
--7866.9199 8556.0664 -7872.9287 8555.2559 -7874.2295 8553.7451 C
--7874.2295 8554.4922 L
--7874.0454 8554.4922 L
--7874.0454 8555.6689 -7868.7783 8556.9805 -7861.2202 8556.9805 c
--7853.6602 8556.9805 -7848.3921 8555.6689 -7848.3921 8554.4922 C
--7848.209 8554.4922 L
--7848.209 8553.7451 L
--7849.5088 8555.2559 -7855.5166 8556.0664 -7861.2202 8556.0664 c
-f
--7861.2202 8551.9707 m
--7866.9199 8551.9707 -7872.9287 8551.1611 -7874.2295 8549.6504 C
--7874.2295 8550.3965 L
--7874.0454 8550.3965 L
--7874.0454 8551.5742 -7868.7783 8552.8857 -7861.2202 8552.8857 c
--7853.6602 8552.8857 -7848.3921 8551.5742 -7848.3921 8550.3965 C
--7848.209 8550.3965 L
--7848.209 8549.6504 L
--7849.5088 8551.1611 -7855.5166 8551.9707 -7861.2202 8551.9707 c
-f
--7861.2202 8545.1445 m
--7866.9199 8545.1445 -7872.9287 8544.3359 -7874.2295 8542.8242 C
--7874.2295 8543.5723 L
--7874.0454 8543.5723 L
--7874.0454 8544.748 -7868.7783 8546.0605 -7861.2202 8546.0605 c
--7853.6602 8546.0605 -7848.3921 8544.748 -7848.3921 8543.5723 C
--7848.209 8543.5723 L
--7848.209 8542.8242 L
--7849.5088 8544.3359 -7855.5166 8545.1445 -7861.2202 8545.1445 c
-f
--7861.2202 8547.875 m
--7866.9199 8547.875 -7872.9287 8547.0654 -7874.2295 8545.5547 C
--7874.2295 8546.3008 L
--7874.0454 8546.3008 L
--7874.0454 8547.4785 -7868.7783 8548.791 -7861.2202 8548.791 c
--7853.6602 8548.791 -7848.3921 8547.4785 -7848.3921 8546.3008 C
--7848.209 8546.3008 L
--7848.209 8545.5547 L
--7849.5088 8547.0654 -7855.5166 8547.875 -7861.2202 8547.875 c
-f
--7861.2202 8568.3516 m
--7866.9199 8568.3516 -7872.9287 8567.543 -7874.2295 8566.0313 C
--7874.2295 8566.7783 L
--7874.0454 8566.7783 L
--7874.0454 8567.9551 -7868.7783 8569.2666 -7861.2202 8569.2666 c
--7853.6602 8569.2666 -7848.3921 8567.9551 -7848.3921 8566.7783 C
--7848.209 8566.7783 L
--7848.209 8566.0313 L
--7849.5088 8567.543 -7855.5166 8568.3516 -7861.2202 8568.3516 c
-f
--7861.2202 8572.4473 m
--7866.9199 8572.4473 -7872.9287 8571.6377 -7874.2295 8570.127 C
--7874.2295 8570.873 L
--7874.0454 8570.873 L
--7874.0454 8572.0508 -7868.7783 8573.3623 -7861.2202 8573.3623 c
--7853.6602 8573.3623 -7848.3921 8572.0508 -7848.3921 8570.873 C
--7848.209 8570.873 L
--7848.209 8570.127 L
--7849.5088 8571.6377 -7855.5166 8572.4473 -7861.2202 8572.4473 c
-f
--7861.2202 8571.082 m
--7866.9199 8571.082 -7872.9287 8570.2715 -7874.2295 8568.7607 C
--7874.2295 8569.5078 L
--7874.0454 8569.5078 L
--7874.0454 8570.6855 -7868.7783 8571.998 -7861.2202 8571.998 c
--7853.6602 8571.998 -7848.3921 8570.6855 -7848.3921 8569.5078 C
--7848.209 8569.5078 L
--7848.209 8568.7607 L
--7849.5088 8570.2715 -7855.5166 8571.082 -7861.2202 8571.082 c
-f
--7861.2202 8562.8906 m
--7866.9199 8562.8906 -7872.9287 8562.082 -7874.2295 8560.5703 C
--7874.2295 8561.3184 L
--7874.0454 8561.3184 L
--7874.0454 8562.4941 -7868.7783 8563.8066 -7861.2202 8563.8066 c
--7853.6602 8563.8066 -7848.3921 8562.4941 -7848.3921 8561.3184 C
--7848.209 8561.3184 L
--7848.209 8560.5703 L
--7849.5088 8562.082 -7855.5166 8562.8906 -7861.2202 8562.8906 c
-f
--7861.2202 8566.9863 m
--7866.9199 8566.9863 -7872.9287 8566.1768 -7874.2295 8564.666 C
--7874.2295 8565.4131 L
--7874.0454 8565.4131 L
--7874.0454 8566.5898 -7868.7783 8567.9023 -7861.2202 8567.9023 c
--7853.6602 8567.9023 -7848.3921 8566.5898 -7848.3921 8565.4131 C
--7848.209 8565.4131 L
--7848.209 8564.666 L
--7849.5088 8566.1768 -7855.5166 8566.9863 -7861.2202 8566.9863 c
-f
--7861.2202 8565.6211 m
--7866.9199 8565.6211 -7872.9287 8564.8115 -7874.2295 8563.3008 C
--7874.2295 8564.0479 L
--7874.0454 8564.0479 L
--7874.0454 8565.2246 -7868.7783 8566.5371 -7861.2202 8566.5371 c
--7853.6602 8566.5371 -7848.3921 8565.2246 -7848.3921 8564.0479 C
--7848.209 8564.0479 L
--7848.209 8563.3008 L
--7849.5088 8564.8115 -7855.5166 8565.6211 -7861.2202 8565.6211 c
-f
--7861.2202 8564.2559 m
--7866.9199 8564.2559 -7872.9287 8563.4473 -7874.2295 8561.9355 C
--7874.2295 8562.6826 L
--7874.0454 8562.6826 L
--7874.0454 8563.8594 -7868.7783 8565.1719 -7861.2202 8565.1719 c
--7853.6602 8565.1719 -7848.3921 8563.8594 -7848.3921 8562.6826 C
--7848.209 8562.6826 L
--7848.209 8561.9355 L
--7849.5088 8563.4473 -7855.5166 8564.2559 -7861.2202 8564.2559 c
-f
--7861.2202 8569.7168 m
--7866.9199 8569.7168 -7872.9287 8568.9072 -7874.2295 8567.3965 C
--7874.2295 8568.1426 L
--7874.0454 8568.1426 L
--7874.0454 8569.3203 -7868.7783 8570.6318 -7861.2202 8570.6318 c
--7853.6602 8570.6318 -7848.3921 8569.3203 -7848.3921 8568.1426 C
--7848.209 8568.1426 L
--7848.209 8567.3965 L
--7849.5088 8568.9072 -7855.5166 8569.7168 -7861.2202 8569.7168 c
-f
--7852.3521 8539.5498 m
--7853.7134 8539.6699 -7855.145 8539.7637 -7856.6279 8539.8262 c
--7858.1104 8539.8887 -7859.6465 8539.9229 -7861.2202 8539.9229 c
--7862.792 8539.9229 -7864.3271 8539.8887 -7865.8096 8539.8262 c
--7867.293 8539.7637 -7868.7231 8539.6699 -7870.0854 8539.5498 c
--7871.4497 8539.4307 -7872.7432 8539.2852 -7873.9561 8539.1143 c
--7874.0498 8539.1016 -7874.1362 8539.085 -7874.2295 8539.0713 C
--7874.2295 8539.4766 L
--7874.0454 8539.4766 L
--7874.0454 8540.6523 -7868.7783 8541.9648 -7861.2202 8541.9648 c
--7853.6602 8541.9648 -7848.3921 8540.6523 -7848.3921 8539.4766 C
--7848.209 8539.4766 L
--7848.209 8539.0723 L
--7848.3018 8539.085 -7848.3882 8539.1016 -7848.4814 8539.1143 c
--7849.6934 8539.2852 -7850.9897 8539.4307 -7852.3521 8539.5498 c
-f
--7861.2202 8542.415 m
--7866.9199 8542.415 -7872.9287 8541.6055 -7874.2295 8540.0938 C
--7874.2295 8540.8418 L
--7874.0454 8540.8418 L
--7874.0454 8542.0186 -7868.7783 8543.3301 -7861.2202 8543.3301 c
--7853.6602 8543.3301 -7848.3921 8542.0186 -7848.3921 8540.8418 C
--7848.209 8540.8418 L
--7848.209 8540.0938 L
--7849.5088 8541.6055 -7855.5166 8542.415 -7861.2202 8542.415 c
-f
--7861.2202 8575.1768 m
--7866.9199 8575.1768 -7872.9287 8574.3672 -7874.2295 8572.8555 C
--7874.2295 8574.0039 L
--7874.2295 8574.1914 -7874.1377 8574.373 -7873.9658 8574.5488 c
--7873.792 8574.7256 -7873.5361 8574.8945 -7873.2065 8575.0566 c
--7872.8774 8575.2197 -7872.4746 8575.373 -7872.0063 8575.5166 c
--7871.54 8575.6602 -7871.0063 8575.7949 -7870.418 8575.917 c
--7869.8306 8576.0391 -7869.1846 8576.1504 -7868.4927 8576.248 c
--7867.8008 8576.3447 -7867.061 8576.4277 -7866.2822 8576.4961 c
--7865.5049 8576.5645 -7864.687 8576.6191 -7863.8408 8576.6543 c
--7862.9946 8576.6895 -7862.1162 8576.709 -7861.2192 8576.709 c
--7860.3218 8576.709 -7859.4438 8576.6895 -7858.5967 8576.6543 c
--7857.749 8576.6191 -7856.9326 8576.5645 -7856.1543 8576.4961 c
--7855.376 8576.4277 -7854.6377 8576.3447 -7853.9438 8576.248 c
--7853.2529 8576.1504 -7852.6079 8576.0391 -7852.0186 8575.917 c
--7851.4302 8575.7949 -7850.8984 8575.6602 -7850.4302 8575.5166 c
--7849.9639 8575.373 -7849.5615 8575.2197 -7849.231 8575.0566 c
--7848.9014 8574.8945 -7848.6455 8574.7256 -7848.4736 8574.5488 c
--7848.2998 8574.373 -7848.209 8574.1914 -7848.209 8574.0039 C
--7848.209 8572.8555 L
--7849.5088 8574.3672 -7855.5166 8575.1768 -7861.2202 8575.1768 c
-f
--7874.0454 8572.2383 m
--7874.0454 8573.415 -7868.7783 8574.7266 -7861.2202 8574.7266 c
--7853.6602 8574.7266 -7848.3921 8573.415 -7848.3921 8572.2383 C
--7848.209 8572.2383 L
--7848.209 8571.4912 L
--7849.5088 8573.002 -7855.5166 8573.8125 -7861.2202 8573.8125 c
--7866.9199 8573.8125 -7872.9287 8573.002 -7874.2295 8571.4912 C
--7874.2295 8572.2383 L
--7874.0454 8572.2383 L
-f
-0.15 g
--7861.2202 8541.9648 m
--7868.7783 8541.9648 -7874.0454 8540.6523 -7874.0454 8539.4766 C
--7874.2295 8539.4766 L
--7874.4961 8539.4766 L
--7874.4961 8539.6943 -7874.3975 8539.8994 -7874.2295 8540.0938 c
--7872.9287 8541.6055 -7866.9199 8542.415 -7861.2202 8542.415 c
--7855.5166 8542.415 -7849.5088 8541.6055 -7848.209 8540.0938 c
--7848.041 8539.8994 -7847.9424 8539.6943 -7847.9424 8539.4766 C
--7848.209 8539.4766 L
--7848.3921 8539.4766 L
--7848.3921 8540.6523 -7853.6602 8541.9648 -7861.2202 8541.9648 c
-f
--7861.2202 8543.3301 m
--7868.7783 8543.3301 -7874.0454 8542.0186 -7874.0454 8540.8418 C
--7874.2295 8540.8418 L
--7874.4961 8540.8418 L
--7874.4961 8541.0586 -7874.3975 8541.2637 -7874.2295 8541.459 c
--7872.9287 8542.9707 -7866.9199 8543.7803 -7861.2202 8543.7803 c
--7855.5166 8543.7803 -7849.5088 8542.9707 -7848.209 8541.459 c
--7848.041 8541.2637 -7847.9424 8541.0586 -7847.9424 8540.8418 C
--7848.209 8540.8418 L
--7848.3921 8540.8418 L
--7848.3921 8542.0186 -7853.6602 8543.3301 -7861.2202 8543.3301 c
-f
--7861.2202 8544.6953 m
--7868.7783 8544.6953 -7874.0454 8543.3828 -7874.0454 8542.2061 C
--7874.2295 8542.2061 L
--7874.4961 8542.2061 L
--7874.4961 8542.4238 -7874.3975 8542.6289 -7874.2295 8542.8242 c
--7872.9287 8544.3359 -7866.9199 8545.1445 -7861.2202 8545.1445 c
--7855.5166 8545.1445 -7849.5088 8544.3359 -7848.209 8542.8242 c
--7848.041 8542.6289 -7847.9424 8542.4238 -7847.9424 8542.2061 C
--7848.209 8542.2061 L
--7848.3921 8542.2061 L
--7848.3921 8543.3828 -7853.6602 8544.6953 -7861.2202 8544.6953 c
-f
--7861.2202 8546.0605 m
--7868.7783 8546.0605 -7874.0454 8544.748 -7874.0454 8543.5723 C
--7874.2295 8543.5723 L
--7874.4961 8543.5723 L
--7874.4961 8543.79 -7874.3975 8543.9951 -7874.2295 8544.1895 c
--7872.9287 8545.7012 -7866.9199 8546.5098 -7861.2202 8546.5098 c
--7855.5166 8546.5098 -7849.5088 8545.7012 -7848.209 8544.1895 c
--7848.041 8543.9951 -7847.9424 8543.79 -7847.9424 8543.5723 C
--7848.209 8543.5723 L
--7848.3921 8543.5723 L
--7848.3921 8544.748 -7853.6602 8546.0605 -7861.2202 8546.0605 c
-f
--7861.2202 8547.4248 m
--7868.7783 8547.4248 -7874.0454 8546.1133 -7874.0454 8544.9375 C
--7874.2295 8544.9375 L
--7874.4961 8544.9375 L
--7874.4961 8545.1543 -7874.3975 8545.3594 -7874.2295 8545.5547 c
--7872.9287 8547.0654 -7866.9199 8547.875 -7861.2202 8547.875 c
--7855.5166 8547.875 -7849.5088 8547.0654 -7848.209 8545.5547 c
--7848.041 8545.3594 -7847.9424 8545.1543 -7847.9424 8544.9375 C
--7848.209 8544.9375 L
--7848.3921 8544.9375 L
--7848.3921 8546.1133 -7853.6602 8547.4248 -7861.2202 8547.4248 c
-f
--7861.2202 8548.791 m
--7868.7783 8548.791 -7874.0454 8547.4785 -7874.0454 8546.3008 C
--7874.2295 8546.3008 L
--7874.4961 8546.3008 L
--7874.4961 8546.5195 -7874.3975 8546.7246 -7874.2295 8546.9199 c
--7872.9287 8548.4307 -7866.9199 8549.2402 -7861.2202 8549.2402 c
--7855.5166 8549.2402 -7849.5088 8548.4307 -7848.209 8546.9199 c
--7848.041 8546.7246 -7847.9424 8546.5195 -7847.9424 8546.3008 C
--7848.209 8546.3008 L
--7848.3921 8546.3008 L
--7848.3921 8547.4785 -7853.6602 8548.791 -7861.2202 8548.791 c
-f
--7861.2202 8550.1563 m
--7868.7783 8550.1563 -7874.0454 8548.8438 -7874.0454 8547.666 C
--7874.2295 8547.666 L
--7874.4961 8547.666 L
--7874.4961 8547.8848 -7874.3975 8548.0898 -7874.2295 8548.2852 c
--7872.9287 8549.7959 -7866.9199 8550.6055 -7861.2202 8550.6055 c
--7855.5166 8550.6055 -7849.5088 8549.7959 -7848.209 8548.2852 c
--7848.041 8548.0898 -7847.9424 8547.8848 -7847.9424 8547.666 C
--7848.209 8547.666 L
--7848.3921 8547.666 L
--7848.3921 8548.8438 -7853.6602 8550.1563 -7861.2202 8550.1563 c
-f
--7861.2202 8551.5205 m
--7868.7783 8551.5205 -7874.0454 8550.209 -7874.0454 8549.0322 C
--7874.2295 8549.0322 L
--7874.4961 8549.0322 L
--7874.4961 8549.25 -7874.3975 8549.4551 -7874.2295 8549.6504 c
--7872.9287 8551.1611 -7866.9199 8551.9707 -7861.2202 8551.9707 c
--7855.5166 8551.9707 -7849.5088 8551.1611 -7848.209 8549.6504 c
--7848.041 8549.4551 -7847.9424 8549.25 -7847.9424 8549.0322 C
--7848.209 8549.0322 L
--7848.3921 8549.0322 L
--7848.3921 8550.209 -7853.6602 8551.5205 -7861.2202 8551.5205 c
-f
--7861.2202 8552.8857 m
--7868.7783 8552.8857 -7874.0454 8551.5742 -7874.0454 8550.3965 C
--7874.2295 8550.3965 L
--7874.4961 8550.3965 L
--7874.4961 8550.6152 -7874.3975 8550.8203 -7874.2295 8551.0146 c
--7872.9287 8552.5254 -7866.9199 8553.3359 -7861.2202 8553.3359 c
--7855.5166 8553.3359 -7849.5088 8552.5254 -7848.209 8551.0146 c
--7848.041 8550.8203 -7847.9424 8550.6152 -7847.9424 8550.3965 C
--7848.209 8550.3965 L
--7848.3921 8550.3965 L
--7848.3921 8551.5742 -7853.6602 8552.8857 -7861.2202 8552.8857 c
-f
--7861.2202 8554.25 m
--7868.7783 8554.25 -7874.0454 8552.9395 -7874.0454 8551.7617 C
--7874.2295 8551.7617 L
--7874.4961 8551.7617 L
--7874.4961 8551.9795 -7874.3975 8552.1846 -7874.2295 8552.3789 c
--7872.9287 8553.8906 -7866.9199 8554.7012 -7861.2202 8554.7012 c
--7855.5166 8554.7012 -7849.5088 8553.8906 -7848.209 8552.3789 c
--7848.041 8552.1846 -7847.9424 8551.9795 -7847.9424 8551.7617 C
--7848.209 8551.7617 L
--7848.3921 8551.7617 L
--7848.3921 8552.9395 -7853.6602 8554.25 -7861.2202 8554.25 c
-f
--7861.2202 8555.6162 m
--7868.7783 8555.6162 -7874.0454 8554.3047 -7874.0454 8553.127 C
--7874.2295 8553.127 L
--7874.4961 8553.127 L
--7874.4961 8553.3457 -7874.3975 8553.5508 -7874.2295 8553.7451 c
--7872.9287 8555.2559 -7866.9199 8556.0664 -7861.2202 8556.0664 c
--7855.5166 8556.0664 -7849.5088 8555.2559 -7848.209 8553.7451 c
--7848.041 8553.5508 -7847.9424 8553.3457 -7847.9424 8553.127 C
--7848.209 8553.127 L
--7848.3921 8553.127 L
--7848.3921 8554.3047 -7853.6602 8555.6162 -7861.2202 8555.6162 c
-f
--7861.2202 8556.9805 m
--7868.7783 8556.9805 -7874.0454 8555.6689 -7874.0454 8554.4922 C
--7874.2295 8554.4922 L
--7874.4961 8554.4922 L
--7874.4961 8554.7109 -7874.3975 8554.916 -7874.2295 8555.1104 c
--7872.9287 8556.6211 -7866.9199 8557.4316 -7861.2202 8557.4316 c
--7855.5166 8557.4316 -7849.5088 8556.6211 -7848.209 8555.1104 c
--7848.041 8554.916 -7847.9424 8554.7109 -7847.9424 8554.4922 C
--7848.209 8554.4922 L
--7848.3921 8554.4922 L
--7848.3921 8555.6689 -7853.6602 8556.9805 -7861.2202 8556.9805 c
-f
--7861.2202 8558.3457 m
--7868.7783 8558.3457 -7874.0454 8557.0342 -7874.0454 8555.8574 C
--7874.2295 8555.8574 L
--7874.4961 8555.8574 L
--7874.4961 8556.0752 -7874.3975 8556.2803 -7874.2295 8556.4746 c
--7872.9287 8557.9863 -7866.9199 8558.7959 -7861.2202 8558.7959 c
--7855.5166 8558.7959 -7849.5088 8557.9863 -7848.209 8556.4746 c
--7848.041 8556.2803 -7847.9424 8556.0752 -7847.9424 8555.8574 C
--7848.209 8555.8574 L
--7848.3921 8555.8574 L
--7848.3921 8557.0342 -7853.6602 8558.3457 -7861.2202 8558.3457 c
-f
--7861.2202 8559.7109 m
--7868.7783 8559.7109 -7874.0454 8558.3994 -7874.0454 8557.2227 C
--7874.2295 8557.2227 L
--7874.4961 8557.2227 L
--7874.4961 8557.4395 -7874.3975 8557.6455 -7874.2295 8557.8398 c
--7872.9287 8559.3516 -7866.9199 8560.1611 -7861.2202 8560.1611 c
--7855.5166 8560.1611 -7849.5088 8559.3516 -7848.209 8557.8398 c
--7848.041 8557.6455 -7847.9424 8557.4395 -7847.9424 8557.2227 C
--7848.209 8557.2227 L
--7848.3921 8557.2227 L
--7848.3921 8558.3994 -7853.6602 8559.7109 -7861.2202 8559.7109 c
-f
--7861.2202 8561.0762 m
--7868.7783 8561.0762 -7874.0454 8559.7646 -7874.0454 8558.5879 C
--7874.2295 8558.5879 L
--7874.4961 8558.5879 L
--7874.4961 8558.8057 -7874.3975 8559.0107 -7874.2295 8559.2051 c
--7872.9287 8560.7168 -7866.9199 8561.5264 -7861.2202 8561.5264 c
--7855.5166 8561.5264 -7849.5088 8560.7168 -7848.209 8559.2051 c
--7848.041 8559.0107 -7847.9424 8558.8057 -7847.9424 8558.5879 C
--7848.209 8558.5879 L
--7848.3921 8558.5879 L
--7848.3921 8559.7646 -7853.6602 8561.0762 -7861.2202 8561.0762 c
-f
--7861.2202 8562.4414 m
--7868.7783 8562.4414 -7874.0454 8561.1299 -7874.0454 8559.9531 C
--7874.2295 8559.9531 L
--7874.4961 8559.9531 L
--7874.4961 8560.1709 -7874.3975 8560.376 -7874.2295 8560.5703 c
--7872.9287 8562.082 -7866.9199 8562.8906 -7861.2202 8562.8906 c
--7855.5166 8562.8906 -7849.5088 8562.082 -7848.209 8560.5703 c
--7848.041 8560.376 -7847.9424 8560.1709 -7847.9424 8559.9531 C
--7848.209 8559.9531 L
--7848.3921 8559.9531 L
--7848.3921 8561.1299 -7853.6602 8562.4414 -7861.2202 8562.4414 c
-f
--7861.2202 8563.8066 m
--7868.7783 8563.8066 -7874.0454 8562.4941 -7874.0454 8561.3184 C
--7874.2295 8561.3184 L
--7874.4961 8561.3184 L
--7874.4961 8561.5352 -7874.3975 8561.7412 -7874.2295 8561.9355 c
--7872.9287 8563.4473 -7866.9199 8564.2559 -7861.2202 8564.2559 c
--7855.5166 8564.2559 -7849.5088 8563.4473 -7848.209 8561.9355 c
--7848.041 8561.7412 -7847.9424 8561.5352 -7847.9424 8561.3184 C
--7848.209 8561.3184 L
--7848.3921 8561.3184 L
--7848.3921 8562.4941 -7853.6602 8563.8066 -7861.2202 8563.8066 c
-f
--7861.2202 8565.1719 m
--7868.7783 8565.1719 -7874.0454 8563.8594 -7874.0454 8562.6826 C
--7874.2295 8562.6826 L
--7874.4961 8562.6826 L
--7874.4961 8562.9004 -7874.3975 8563.1055 -7874.2295 8563.3008 c
--7872.9287 8564.8115 -7866.9199 8565.6211 -7861.2202 8565.6211 c
--7855.5166 8565.6211 -7849.5088 8564.8115 -7848.209 8563.3008 c
--7848.041 8563.1055 -7847.9424 8562.9004 -7847.9424 8562.6826 C
--7848.209 8562.6826 L
--7848.3921 8562.6826 L
--7848.3921 8563.8594 -7853.6602 8565.1719 -7861.2202 8565.1719 c
-f
--7861.2202 8566.5371 m
--7868.7783 8566.5371 -7874.0454 8565.2246 -7874.0454 8564.0479 C
--7874.2295 8564.0479 L
--7874.4961 8564.0479 L
--7874.4961 8564.2656 -7874.3975 8564.4707 -7874.2295 8564.666 c
--7872.9287 8566.1768 -7866.9199 8566.9863 -7861.2202 8566.9863 c
--7855.5166 8566.9863 -7849.5088 8566.1768 -7848.209 8564.666 c
--7848.041 8564.4707 -7847.9424 8564.2656 -7847.9424 8564.0479 C
--7848.209 8564.0479 L
--7848.3921 8564.0479 L
--7848.3921 8565.2246 -7853.6602 8566.5371 -7861.2202 8566.5371 c
-f
--7861.2202 8567.9023 m
--7868.7783 8567.9023 -7874.0454 8566.5898 -7874.0454 8565.4131 C
--7874.2295 8565.4131 L
--7874.4961 8565.4131 L
--7874.4961 8565.6309 -7874.3975 8565.8359 -7874.2295 8566.0313 c
--7872.9287 8567.543 -7866.9199 8568.3516 -7861.2202 8568.3516 c
--7855.5166 8568.3516 -7849.5088 8567.543 -7848.209 8566.0313 c
--7848.041 8565.8359 -7847.9424 8565.6309 -7847.9424 8565.4131 C
--7848.209 8565.4131 L
--7848.3921 8565.4131 L
--7848.3921 8566.5898 -7853.6602 8567.9023 -7861.2202 8567.9023 c
-f
--7861.2202 8569.2666 m
--7868.7783 8569.2666 -7874.0454 8567.9551 -7874.0454 8566.7783 C
--7874.2295 8566.7783 L
--7874.4961 8566.7783 L
--7874.4961 8566.9961 -7874.3975 8567.2012 -7874.2295 8567.3965 c
--7872.9287 8568.9072 -7866.9199 8569.7168 -7861.2202 8569.7168 c
--7855.5166 8569.7168 -7849.5088 8568.9072 -7848.209 8567.3965 c
--7848.041 8567.2012 -7847.9424 8566.9961 -7847.9424 8566.7783 C
--7848.209 8566.7783 L
--7848.3921 8566.7783 L
--7848.3921 8567.9551 -7853.6602 8569.2666 -7861.2202 8569.2666 c
-f
--7861.2202 8570.6318 m
--7868.7783 8570.6318 -7874.0454 8569.3203 -7874.0454 8568.1426 C
--7874.2295 8568.1426 L
--7874.4961 8568.1426 L
--7874.4961 8568.3613 -7874.3975 8568.5664 -7874.2295 8568.7607 c
--7872.9287 8570.2715 -7866.9199 8571.082 -7861.2202 8571.082 c
--7855.5166 8571.082 -7849.5088 8570.2715 -7848.209 8568.7607 c
--7848.041 8568.5664 -7847.9424 8568.3613 -7847.9424 8568.1426 C
--7848.209 8568.1426 L
--7848.3921 8568.1426 L
--7848.3921 8569.3203 -7853.6602 8570.6318 -7861.2202 8570.6318 c
-f
--7861.2202 8571.998 m
--7868.7783 8571.998 -7874.0454 8570.6855 -7874.0454 8569.5078 C
--7874.2295 8569.5078 L
--7874.4961 8569.5078 L
--7874.4961 8569.7266 -7874.3975 8569.9316 -7874.2295 8570.127 c
--7872.9287 8571.6377 -7866.9199 8572.4473 -7861.2202 8572.4473 c
--7855.5166 8572.4473 -7849.5088 8571.6377 -7848.209 8570.127 c
--7848.041 8569.9316 -7847.9424 8569.7266 -7847.9424 8569.5078 C
--7848.209 8569.5078 L
--7848.3921 8569.5078 L
--7848.3921 8570.6855 -7853.6602 8571.998 -7861.2202 8571.998 c
-f
--7861.2202 8573.3623 m
--7868.7783 8573.3623 -7874.0454 8572.0508 -7874.0454 8570.873 C
--7874.2295 8570.873 L
--7874.4961 8570.873 L
--7874.4961 8571.0391 -7874.4282 8571.1953 -7874.3286 8571.3486 c
--7874.2974 8571.3965 -7874.2695 8571.4453 -7874.2295 8571.4912 c
--7872.9287 8573.002 -7866.9199 8573.8125 -7861.2202 8573.8125 c
--7855.5166 8573.8125 -7849.5088 8573.002 -7848.209 8571.4912 c
--7848.1689 8571.4453 -7848.1392 8571.3965 -7848.1104 8571.3486 c
--7848.0103 8571.1953 -7847.9424 8571.0391 -7847.9424 8570.873 C
--7848.209 8570.873 L
--7848.3921 8570.873 L
--7848.3921 8572.0508 -7853.6602 8573.3623 -7861.2202 8573.3623 c
-f
--7861.2202 8574.7266 m
--7868.7783 8574.7266 -7874.0454 8573.415 -7874.0454 8572.2383 C
--7874.2295 8572.2383 L
--7874.4961 8572.2383 L
--7874.4961 8572.4561 -7874.3975 8572.6621 -7874.2295 8572.8555 c
--7872.9287 8574.3672 -7866.9199 8575.1768 -7861.2202 8575.1768 c
--7855.5166 8575.1768 -7849.5088 8574.3672 -7848.209 8572.8555 c
--7848.041 8572.6621 -7847.9424 8572.4561 -7847.9424 8572.2383 C
--7848.209 8572.2383 L
--7848.3921 8572.2383 L
--7848.3921 8573.415 -7853.6602 8574.7266 -7861.2202 8574.7266 c
-f
-0.8 g
--7839.0342 8530.2168 m
--7839.3311 8530.4834 -7839.7271 8530.7402 -7840.229 8530.9863 c
--7840.231 8530.9883 -7840.2334 8530.9893 -7840.2358 8530.9902 c
--7840.5225 8531.1309 -7840.8394 8531.2676 -7841.187 8531.4004 c
--7841.187 8531.4004 l
--7841.8857 8531.668 -7842.7026 8531.9189 -7843.626 8532.1523 c
--7843.6362 8532.1543 -7843.647 8532.1572 -7843.6582 8532.1602 c
--7845.501 8532.623 -7847.7583 8533.0117 -7850.313 8533.3018 c
--7850.3457 8533.3047 -7850.3774 8533.3086 -7850.4111 8533.3125 c
--7851.6626 8533.4531 -7852.9834 8533.5703 -7854.3599 8533.6602 c
--7854.4209 8533.6641 -7854.4785 8533.668 -7854.5366 8533.6719 c
--7855.1743 8533.7119 -7855.8232 8533.7461 -7856.4824 8533.7754 c
--7856.5313 8533.7773 -7856.5791 8533.7813 -7856.6279 8533.7832 c
--7856.6758 8533.7852 -7856.7246 8533.7861 -7856.7729 8533.7881 c
--7857.4561 8533.8164 -7858.1514 8533.8379 -7858.856 8533.8535 c
--7858.8774 8533.8535 -7858.8994 8533.8545 -7858.9209 8533.8545 c
--7859.6768 8533.8711 -7860.4424 8533.8789 -7861.2202 8533.8789 c
--7861.9951 8533.8789 -7862.7607 8533.8711 -7863.5166 8533.8545 c
--7863.5391 8533.8545 -7863.5601 8533.8535 -7863.582 8533.8535 c
--7864.2871 8533.8379 -7864.9814 8533.8164 -7865.667 8533.7881 c
--7865.7134 8533.7861 -7865.7642 8533.7852 -7865.8096 8533.7832 c
--7865.8608 8533.7813 -7865.9058 8533.7773 -7865.9561 8533.7754 c
--7866.6162 8533.7461 -7867.2666 8533.7119 -7867.9038 8533.6709 c
--7867.9609 8533.668 -7868.0166 8533.6641 -7868.0718 8533.6602 c
--7869.4526 8533.5703 -7870.7783 8533.4531 -7872.0322 8533.3125 c
--7872.0615 8533.3086 -7872.0898 8533.3057 -7872.1201 8533.3027 c
--7874.6768 8533.0117 -7876.9385 8532.623 -7878.7822 8532.1592 c
--7878.792 8532.1572 -7878.8018 8532.1543 -7878.811 8532.1523 c
--7880.1934 8531.8027 -7881.3408 8531.4121 -7882.2026 8530.9902 c
--7882.2041 8530.9893 -7882.208 8530.9883 -7882.21 8530.9863 c
--7882.4639 8530.8613 -7882.6904 8530.7324 -7882.8936 8530.6016 c
--7883.3799 8530.29 -7883.7178 8529.9639 -7883.8818 8529.627 c
--7883.96 8529.4688 -7884 8529.3066 -7884 8529.1426 C
--7884 8535.1855 L
--7884 8535.5137 -7883.8408 8535.832 -7883.5361 8536.1406 c
--7883.2334 8536.4492 -7882.7866 8536.7461 -7882.21 8537.0303 c
--7881.6328 8537.3125 -7880.9287 8537.583 -7880.1089 8537.834 c
--7879.29 8538.0859 -7878.3584 8538.3203 -7877.3271 8538.5352 c
--7876.377 8538.7324 -7875.335 8538.9121 -7874.2295 8539.0713 c
--7874.1362 8539.085 -7874.0498 8539.1016 -7873.9561 8539.1143 c
--7872.7432 8539.2852 -7871.4497 8539.4307 -7870.0854 8539.5498 c
--7868.7231 8539.6699 -7867.293 8539.7637 -7865.8096 8539.8262 c
--7864.3271 8539.8887 -7862.792 8539.9229 -7861.2202 8539.9229 c
--7859.6465 8539.9229 -7858.1104 8539.8887 -7856.6279 8539.8262 c
--7855.145 8539.7637 -7853.7134 8539.6699 -7852.3521 8539.5498 c
--7850.9897 8539.4307 -7849.6934 8539.2852 -7848.4814 8539.1143 c
--7848.3882 8539.1016 -7848.3018 8539.085 -7848.209 8539.0723 c
--7847.105 8538.9121 -7846.0615 8538.7324 -7845.1104 8538.5352 c
--7844.0801 8538.3203 -7843.147 8538.0859 -7842.3286 8537.834 c
--7841.5103 8537.583 -7840.8042 8537.3125 -7840.229 8537.0303 c
--7839.6514 8536.7461 -7839.2041 8536.4492 -7838.9009 8536.1406 c
--7838.5967 8535.832 -7838.4385 8535.5137 -7838.4385 8535.1855 C
--7838.4385 8529.1426 L
--7838.4385 8529.3887 -7838.5278 8529.6289 -7838.7002 8529.8643 c
--7838.7881 8529.9834 -7838.9038 8530.1016 -7839.0342 8530.2168 c
-f
-0.5 g
--7845.9463 8525.6279 m
--7847.4521 8528.6533 -7849.7656 8530.1738 -7849.8774 8530.2461 C
--7849.9346 8530.2813 L
--7873.333 8530.2813 L
--7873.3887 8529.8389 L
--7873.3638 8529.832 -7871.0127 8529.166 -7868.5498 8524.6582 C
--7877.5342 8525.293 -7884 8527.0605 -7884 8529.1426 c
--7884 8529.3066 -7883.96 8529.4688 -7883.8818 8529.627 c
--7883.7178 8529.9639 -7883.3799 8530.29 -7882.8936 8530.6016 c
--7882.687 8530.7344 -7882.46 8530.8633 -7882.2026 8530.9902 c
--7881.3408 8531.4121 -7880.1934 8531.8027 -7878.811 8532.1523 c
--7878.8018 8532.1543 -7878.792 8532.1572 -7878.7822 8532.1592 c
--7876.9385 8532.623 -7874.6768 8533.0117 -7872.1201 8533.3027 c
--7872.0898 8533.3057 -7872.0615 8533.3086 -7872.0322 8533.3125 c
--7870.7783 8533.4531 -7869.4526 8533.5703 -7868.0718 8533.6602 c
--7868.0166 8533.6641 -7867.9609 8533.668 -7867.9038 8533.6709 c
--7867.2666 8533.7119 -7866.6162 8533.7461 -7865.9561 8533.7754 c
--7865.8594 8533.7793 -7865.7642 8533.7842 -7865.667 8533.7881 c
--7864.9814 8533.8164 -7864.2871 8533.8379 -7863.582 8533.8535 c
--7863.5601 8533.8535 -7863.5391 8533.8545 -7863.5166 8533.8545 c
--7862.7607 8533.8711 -7861.9951 8533.8789 -7861.2202 8533.8789 c
--7860.4424 8533.8789 -7859.6768 8533.8711 -7858.9209 8533.8545 c
--7858.8994 8533.8545 -7858.8774 8533.8535 -7858.856 8533.8535 c
--7858.1514 8533.8379 -7857.4561 8533.8164 -7856.7729 8533.7881 c
--7856.6758 8533.7842 -7856.5791 8533.7793 -7856.4824 8533.7754 c
--7855.8232 8533.7461 -7855.1743 8533.7119 -7854.5366 8533.6719 c
--7854.4785 8533.668 -7854.4209 8533.6641 -7854.3599 8533.6602 c
--7852.9834 8533.5703 -7851.6626 8533.4531 -7850.4111 8533.3125 c
--7850.3774 8533.3086 -7850.3457 8533.3047 -7850.313 8533.3018 c
--7847.7583 8533.0117 -7845.501 8532.623 -7843.6582 8532.1602 c
--7843.647 8532.1572 -7843.6362 8532.1543 -7843.626 8532.1523 c
--7842.7026 8531.9189 -7841.8857 8531.668 -7841.187 8531.4004 C
--7841.187 8531.4004 L
--7840.8394 8531.2676 -7840.5225 8531.1309 -7840.2358 8530.9902 c
--7839.731 8530.7432 -7839.332 8530.4844 -7839.0342 8530.2168 c
--7838.9038 8530.1016 -7838.7881 8529.9834 -7838.7002 8529.8643 c
--7838.5278 8529.6289 -7838.4385 8529.3887 -7838.4385 8529.1426 c
--7838.4385 8527.748 -7841.3359 8526.4951 -7845.9463 8525.6279 C
-f
-*u
-1 g
-1 D
--7867.7471 8524.0996 m
--7866.8584 8522.3203 -7866.5679 8520.6797 -7866.5679 8519.0811 c
--7866.5679 8517.6328 -7866.8057 8516.2178 -7867.0498 8514.7646 c
--7867.2959 8513.2949 -7867.5498 8511.7852 -7867.5498 8510.1855 c
--7867.5498 8509.792 -7867.5352 8509.3926 -7867.5 8508.9863 c
--7867.0518 8503.7461 -7861.4072 8501.1475 -7861.3506 8501.1221 C
--7840.5649 8501.1396 -7839.0386 8501.1406 V
--7840.1807 8501.8877 -7842.5088 8503.7266 -7844.8066 8507.5039 c
--7845.8433 8509.2051 -7846.1567 8511.1133 -7846.1567 8513.041 c
--7846.1567 8514.5996 -7845.9512 8516.1699 -7845.7578 8517.6523 c
--7845.5791 8519.0303 -7845.4038 8520.3633 -7845.4038 8521.5723 c
--7845.4038 8522.4287 -7845.4912 8523.2236 -7845.7256 8523.9277 c
--7846.9727 8527.6641 -7849.792 8529.6445 -7850.0713 8529.832 C
--7850.2046 8529.832 -7870.5674 8529.832 -7872.3569 8529.832 C
--7871.3154 8529.1973 -7869.5391 8527.6836 -7867.7471 8524.0996 c
-f
-0 D
--7850.8975 8526.2422 m
--7865.9287 8526.2422 L
--7865.9287 8526.6914 L
--7850.8975 8526.6914 L
--7850.8975 8526.2422 L
-f
--7849.1025 8512.1074 m
--7863.9087 8512.1074 L
--7863.9087 8512.5566 L
--7849.1025 8512.5566 L
--7849.1025 8512.1074 L
-f
--7863.4609 8517.7168 m
--7863.4609 8518.166 L
--7848.4297 8518.166 L
--7848.4297 8517.7168 L
--7863.4609 8517.7168 L
-f
--7863.6855 8515.9219 m
--7850.001 8515.9219 L
--7850.001 8515.4727 L
--7863.6855 8515.4727 L
--7863.6855 8515.9219 L
-f
--7863.4609 8521.3076 m
--7848.6538 8521.3076 L
--7848.6538 8520.8574 L
--7863.4609 8520.8574 L
--7863.4609 8521.3076 L
-f
--7861.2178 8503.583 m
--7845.7378 8503.583 L
--7845.7378 8503.1328 L
--7861.2178 8503.1328 L
--7861.2178 8503.583 L
-f
--7862.7881 8505.3779 m
--7850.4497 8505.3779 L
--7850.4497 8504.9277 L
--7862.7881 8504.9277 L
--7862.7881 8505.3779 L
-f
--7863.9087 8507.8457 m
--7848.2041 8507.8457 L
--7848.2041 8507.3945 L
--7863.9087 8507.3945 L
--7863.9087 8507.8457 L
-f
--7864.3584 8510.3135 m
--7848.6538 8510.3135 L
--7848.6538 8509.8633 L
--7864.3584 8509.8633 L
--7864.3584 8510.3135 L
-f
--7864.3584 8524 m
--7849.7754 8524 L
--7849.7754 8523.5488 L
--7864.3584 8523.5488 L
--7864.3584 8524 L
-f
-*U
-*u
-0 g
-1 D
--7868.5498 8524.6582 m
--7868.417 8524.4141 -7868.2832 8524.166 -7868.1494 8523.8984 c
--7866.519 8520.6387 -7866.9937 8517.8213 -7867.4946 8514.8389 c
--7867.8057 8512.9785 -7868.1294 8511.0557 -7867.9482 8508.9473 c
--7867.4766 8503.4404 -7861.5938 8500.7383 -7861.4424 8500.6914 C
--7838.2168 8500.6914 L
--7838.1201 8501.1191 L
--7838.1514 8501.1348 -7841.3599 8502.7051 -7844.4238 8507.7373 c
--7846.2144 8510.6797 -7845.7559 8514.1953 -7845.311 8517.5947 c
--7844.9966 8520.002 -7844.7007 8522.2754 -7845.2993 8524.0703 c
--7845.4858 8524.6289 -7845.707 8525.1465 -7845.9463 8525.6279 c
--7847.4521 8528.6533 -7849.7656 8530.1738 -7849.8774 8530.2461 C
--7849.9346 8530.2813 L
--7873.333 8530.2813 L
--7873.3887 8529.8389 L
--7873.3638 8529.832 -7871.0127 8529.166 -7868.5498 8524.6582 c
-f
-0 D
--7867.7471 8524.0996 m
--7869.5391 8527.6836 -7871.3154 8529.1973 -7872.3569 8529.832 C
--7870.5674 8529.832 -7850.2046 8529.832 -7850.0713 8529.832 C
--7849.792 8529.6445 -7846.9727 8527.6641 -7845.7256 8523.9277 c
--7845.4912 8523.2236 -7845.4038 8522.4287 -7845.4038 8521.5723 c
--7845.4038 8520.3633 -7845.5791 8519.0303 -7845.7578 8517.6523 c
--7845.9512 8516.1699 -7846.1567 8514.5996 -7846.1567 8513.041 c
--7846.1567 8511.1133 -7845.8433 8509.2051 -7844.8066 8507.5039 c
--7842.5088 8503.7266 -7840.1807 8501.8877 -7839.0386 8501.1406 C
--7840.5649 8501.1396 -7861.3506 8501.1221 Y
--7861.4072 8501.1475 -7867.0518 8503.7461 -7867.5 8508.9863 c
--7867.5352 8509.3926 -7867.5498 8509.792 -7867.5498 8510.1855 c
--7867.5498 8511.7852 -7867.2959 8513.2949 -7867.0498 8514.7646 c
--7866.8057 8516.2178 -7866.5679 8517.6328 -7866.5679 8519.0811 c
--7866.5679 8520.6797 -7866.8584 8522.3203 -7867.7471 8524.0996 c
-f
-*U
--7845.7378 8503.1328 m
--7861.2178 8503.1328 L
--7861.2178 8503.583 L
--7845.7378 8503.583 L
--7845.7378 8503.1328 L
-f
--7850.4497 8504.9277 m
--7862.7881 8504.9277 L
--7862.7881 8505.3779 L
--7850.4497 8505.3779 L
--7850.4497 8504.9277 L
-f
--7848.2041 8507.3945 m
--7863.9087 8507.3945 L
--7863.9087 8507.8457 L
--7848.2041 8507.8457 L
--7848.2041 8507.3945 L
-f
--7848.6538 8509.8633 m
--7864.3584 8509.8633 L
--7864.3584 8510.3135 L
--7848.6538 8510.3135 L
--7848.6538 8509.8633 L
-f
--7863.9087 8512.5566 m
--7849.1025 8512.5566 L
--7849.1025 8512.1074 L
--7863.9087 8512.1074 L
--7863.9087 8512.5566 L
-f
--7850.001 8515.4727 m
--7863.6855 8515.4727 L
--7863.6855 8515.9219 L
--7850.001 8515.9219 L
--7850.001 8515.4727 L
-f
--7863.4609 8518.166 m
--7848.4297 8518.166 L
--7848.4297 8517.7168 L
--7863.4609 8517.7168 L
--7863.4609 8518.166 L
-f
--7848.6538 8520.8574 m
--7863.4609 8520.8574 L
--7863.4609 8521.3076 L
--7848.6538 8521.3076 L
--7848.6538 8520.8574 L
-f
--7849.7754 8523.5488 m
--7864.3584 8523.5488 L
--7864.3584 8524 L
--7849.7754 8524 L
--7849.7754 8523.5488 L
-f
--7865.9287 8526.6914 m
--7850.8975 8526.6914 L
--7850.8975 8526.2422 L
--7865.9287 8526.2422 L
--7865.9287 8526.6914 L
-f
-U
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 9)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7883.25 8585.25 m
--7840.7246 8585.25 L
--7840.7246 8555.5381 L
--7883.25 8555.5381 L
--7883.25 8585.25 L
-n
-u
-u
-0 O
-0.7 g
--7872.457 8555.7881 m
--7868.6582 8555.7881 -7864.9199 8555.7881 v
--7861.1826 8555.7881 -7861.8242 8558.8838 y
--7845.9258 8558.8838 -7843.4502 8558.8838 v
--7840.9761 8558.8838 -7840.9761 8561.3594 y
--7840.9761 8578.542 l
--7876.541 8578.542 l
--7876.541 8558.9004 l
--7875.3906 8558.9004 l
--7875.439 8555.7881 -7872.457 8555.7881 v
-f
-0 R
-0.9 G
-0.5 w
--7861.8242 8558.8838 m
--7845.9258 8558.8838 -7843.4502 8558.8838 v
-S
-0.5 G
--7862.8594 8556.2715 m
--7861.4634 8557.1426 -7861.8242 8558.8838 y
-S
-0.7 G
--7864.9199 8555.7881 m
--7863.9858 8555.7881 -7863.3247 8555.9814 -7862.8594 8556.2715 c
-S
-0.9 G
--7876.541 8578.542 m
--7876.541 8558.9004 l
--7875.3906 8558.9004 l
--7875.439 8555.7881 -7872.457 8555.7881 v
--7868.6582 8555.7881 -7864.9199 8555.7881 v
-S
-0.25 G
--7840.9761 8561.3594 m
--7840.9761 8578.542 l
--7876.541 8578.542 l
-S
-0.5 G
--7842.019 8559.2715 m
--7840.9761 8559.9668 -7840.9761 8561.3594 y
-S
-0.7 G
--7843.4502 8558.8838 m
--7842.8306 8558.8838 -7842.3672 8559.0391 -7842.019 8559.2715 c
-S
-U
-u
-0 O
-0.7 g
-1 w
--7874.0718 8557.4023 m
--7870.2729 8557.4023 -7866.5342 8557.4023 v
--7862.7954 8557.4023 -7863.439 8560.498 y
--7847.541 8560.498 -7845.0649 8560.498 v
--7842.5903 8560.498 -7842.5903 8562.9727 y
--7842.5903 8580.1563 l
--7878.1558 8580.1563 l
--7878.1558 8560.5146 l
--7877.0054 8560.5146 l
--7877.0542 8557.4023 -7874.0718 8557.4023 v
-f
-0 R
-0.9 G
-0.5 w
--7863.439 8560.498 m
--7847.541 8560.498 -7845.0649 8560.498 v
-S
-0.5 G
--7864.4746 8557.8867 m
--7863.0767 8558.7578 -7863.439 8560.498 y
-S
-0.7 G
--7866.5342 8557.4023 m
--7865.6006 8557.4023 -7864.9409 8557.5957 -7864.4746 8557.8867 c
-S
-0.9 G
--7878.1558 8580.1563 m
--7878.1558 8560.5146 l
--7877.0054 8560.5146 l
--7877.0542 8557.4023 -7874.0718 8557.4023 v
--7870.2729 8557.4023 -7866.5342 8557.4023 v
-S
-0.25 G
--7842.5903 8562.9727 m
--7842.5903 8580.1563 l
--7878.1558 8580.1563 l
-S
-0.5 G
--7843.6338 8560.8848 m
--7842.5903 8561.5811 -7842.5903 8562.9727 y
-S
-0.7 G
--7845.0649 8560.498 m
--7844.4458 8560.498 -7843.981 8560.6533 -7843.6338 8560.8848 c
-S
-U
-u
-0 O
-0.7 g
-1 w
--7875.6846 8559.0176 m
--7871.8882 8559.0176 -7868.1489 8559.0176 v
--7864.4111 8559.0176 -7865.0527 8562.1123 y
--7849.1538 8562.1123 -7846.6802 8562.1123 v
--7844.2046 8562.1123 -7844.2046 8564.5879 y
--7844.2046 8581.7715 l
--7879.771 8581.7715 l
--7879.771 8562.1289 l
--7878.6191 8562.1289 l
--7878.6689 8559.0176 -7875.6846 8559.0176 v
-f
-0 R
-0.9 G
-0.5 w
--7865.0527 8562.1123 m
--7849.1538 8562.1123 -7846.6802 8562.1123 v
-S
-0.5 G
--7866.0898 8559.5 m
--7864.6929 8560.3711 -7865.0527 8562.1123 y
-S
-0.7 G
--7868.1489 8559.0176 m
--7867.2144 8559.0176 -7866.5542 8559.21 -7866.0898 8559.5 c
-S
-0.9 G
--7879.771 8581.7715 m
--7879.771 8562.1289 l
--7878.6191 8562.1289 l
--7878.6689 8559.0176 -7875.6846 8559.0176 v
--7871.8882 8559.0176 -7868.1489 8559.0176 v
-S
-0.25 G
--7844.2046 8564.5879 m
--7844.2046 8581.7715 l
--7879.771 8581.7715 l
-S
-0.5 G
--7845.249 8562.5 m
--7844.2046 8563.1953 -7844.2046 8564.5879 y
-S
-0.7 G
--7846.6802 8562.1123 m
--7846.061 8562.1123 -7845.5962 8562.2676 -7845.249 8562.5 c
-S
-U
-u
-0 O
-0.7 g
-1 w
--7877.2993 8560.6318 m
--7873.5034 8560.6318 -7869.7642 8560.6318 v
--7866.0254 8560.6318 -7866.667 8563.7275 y
--7850.769 8563.7275 -7848.2935 8563.7275 v
--7845.8193 8563.7275 -7845.8193 8566.2031 y
--7845.8193 8583.3867 l
--7881.3857 8583.3867 l
--7881.3857 8563.7441 l
--7880.2334 8563.7441 l
--7880.2842 8560.6318 -7877.2993 8560.6318 v
-f
-0 R
-0.9 G
-0.5 w
--7866.667 8563.7275 m
--7850.769 8563.7275 -7848.2935 8563.7275 v
-S
-0.5 G
--7867.7046 8561.1152 m
--7866.3071 8561.9863 -7866.667 8563.7275 y
-S
-0.7 G
--7869.7642 8560.6318 m
--7868.8286 8560.6318 -7868.1689 8560.8252 -7867.7046 8561.1152 c
-S
-0.9 G
--7881.3857 8583.3867 m
--7881.3857 8563.7441 l
--7880.2334 8563.7441 l
--7880.2842 8560.6318 -7877.2993 8560.6318 v
--7873.5034 8560.6318 -7869.7642 8560.6318 v
-S
-0.25 G
--7845.8193 8566.2031 m
--7845.8193 8583.3867 l
--7881.3857 8583.3867 l
-S
-0.5 G
--7846.8638 8564.1143 m
--7845.8193 8564.8105 -7845.8193 8566.2031 y
-S
-0.7 G
--7848.2935 8563.7275 m
--7847.6753 8563.7275 -7847.2114 8563.8828 -7846.8638 8564.1143 c
-S
-U
-u
-0 O
-0.8 g
-1 w
--7878.9146 8562.2461 m
--7875.1167 8562.2461 -7871.3794 8562.2461 v
--7867.6401 8562.2461 -7868.2817 8565.3418 y
--7852.3838 8565.3418 -7849.9087 8565.3418 v
--7847.4346 8565.3418 -7847.4346 8567.8174 y
--7847.4346 8585 l
--7883.001 8585 l
--7883.001 8565.3574 l
--7881.8481 8565.3574 l
--7881.8994 8562.2461 -7878.9146 8562.2461 v
-f
-0 R
-0.9 G
-0.5 w
--7868.2817 8565.3418 m
--7852.3838 8565.3418 -7849.9087 8565.3418 v
-S
-0.5 G
--7869.3184 8562.7295 m
--7867.9214 8563.6006 -7868.2817 8565.3418 y
-S
-0.7 G
--7871.3794 8562.2461 m
--7870.4438 8562.2461 -7869.7842 8562.4395 -7869.3184 8562.7295 c
-S
-0.9 G
--7883.001 8585 m
--7883.001 8565.3574 l
--7881.8481 8565.3574 l
--7881.8994 8562.2461 -7878.9146 8562.2461 v
--7875.1167 8562.2461 -7871.3794 8562.2461 v
-S
-0.25 G
--7847.4346 8567.8174 m
--7847.4346 8585 l
--7883.001 8585 l
-S
-0.5 G
--7848.4785 8565.7285 m
--7847.4346 8566.4238 -7847.4346 8567.8174 y
-S
-0.7 G
--7849.9087 8565.3418 m
--7849.29 8565.3418 -7848.8262 8565.4971 -7848.4785 8565.7285 c
-S
-U
-U
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 10)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7883.25 8585.25 m
--7815.2593 8585.25 L
--7815.2593 8557.0195 L
--7883.25 8557.0195 L
--7883.25 8585.25 L
-n
-0 O
-0.8 g
--7835.5234 8580.209 m
--7815.4785 8573.3516 l
--7817.0591 8570.4502 l
--7829.7202 8574.4063 l
--7835.7866 8570.4502 l
--7835.5234 8580.209 l
-f
-0 R
-0.9 G
-0.5 w
--7816.7871 8570.3242 m
--7829.7202 8574.4063 l
-S
-0.5 G
--7815.4785 8573.3516 m
--7817.0591 8570.4502 l
-S
-0.25 G
--7835.5234 8580.209 m
--7815.4785 8573.3516 l
-S
-0.5 G
--7829.7202 8574.4063 m
--7835.7866 8570.4502 l
-S
-0 O
-0.8 g
-1 w
--7855.5679 8562.7998 m
--7843.437 8557.5254 l
--7840.0073 8561.7441 l
--7855.5679 8562.7998 l
-f
-1 Ap
-0.57 g
--7835.2598 8582.0547 m
--7881.6802 8582.0547 L
--7881.6802 8584.9551 L
--7835.2598 8584.9551 L
--7835.2598 8582.0547 L
-f
-0 Ap
-0 R
-0.5 G
-0.5 w
--7843.437 8557.5254 m
--7840.0073 8561.7441 l
-S
-0.9 G
--7855.5679 8562.7998 m
--7842.875 8557.248 l
-S
-0 O
-0.8 g
-1 w
--7883.001 8560.7627 m
--7883.001 8582.0859 l
--7834.2046 8582.0859 l
--7834.2046 8564.9121 l
--7837.6338 8560.8223 l
--7883.001 8560.7627 l
-f
-0 R
-0.5 G
-0.5 w
--7883.001 8576.5166 m
--7834.2046 8576.5166 l
-S
--7880.0986 8564.1191 m
--7870.6025 8564.1191 l
-S
--7880.0986 8565.7676 m
--7870.6025 8565.7676 l
-S
--7880.0986 8567.415 m
--7870.6025 8567.415 l
-S
--7880.0986 8569.0635 m
--7870.6025 8569.0635 l
-S
--7880.0986 8570.7109 m
--7870.6025 8570.7109 l
-S
--7834.2046 8564.9121 m
--7837.6338 8560.8223 l
-S
-0.25 G
--7883.001 8582.0859 m
--7834.2046 8582.0859 l
--7834.2046 8564.9121 l
-S
-0.9 G
--7837.6338 8560.793 m
--7883.001 8560.793 l
--7883.001 8582.3555 l
-S
-0.25 G
--7835.2598 8582.0859 m
--7835.2598 8585 l
--7881.6714 8585 l
-S
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 19)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7883.25 8585.25 m
--7836.6338 8585.25 L
--7836.6338 8549.6348 L
--7883.25 8549.6348 L
--7883.25 8585.25 L
-n
-u
-u
-0 O
-0.7495 g
-0 R
-0.25 G
-1 j 0.5 w 2 M
--7836.9722 8585 m
--7836.9722 8582.9805 l
--7843.333 8579.5479 l
--7859.8857 8579.5479 L
--7876.439 8579.5479 l
--7883.001 8582.9805 l
--7883.001 8585 l
--7836.9722 8585 l
-b
-0.8748 G
-2 J 0 j
--7859.8857 8579.5479 m
--7876.439 8579.5479 l
--7883.001 8582.9805 l
--7883.001 8585 l
-S
--7836.9722 8582.9805 m
--7843.333 8579.5479 l
--7859.8857 8579.5479 L
-S
-0 O
-0.9 g
-0.25 G
-0 J 1 j
--7876.3394 8580.7598 m
--7880.377 8582.9805 l
--7839.7993 8582.9805 l
--7843.2319 8580.7598 l
--7876.3394 8580.7598 l
-b
-U
-u
-u
-0.7 g
-0 j 1 w 4 M
--7871.125 8576.6523 m
--7868.8462 8576.6094 L
--7859.7446 8575.041 L
--7850.4634 8576.6094 L
--7848.6694 8576.6094 L
--7848.729 8578.4512 L
--7871.125 8578.4512 L
--7871.125 8576.6523 L
-f
-0 R
-0.25 G
-0.5 w
--7848.6978 8576.6523 m
--7848.7905 8578.4512 L
--7871.1567 8578.4512 L
-S
-0.9 G
--7850.498 8576.6523 m
--7848.6978 8576.6523 L
-S
-0.25 G
--7859.8042 8575.041 m
--7850.498 8576.6523 L
-S
-0.9 G
--7871.1567 8578.4512 m
--7871.1567 8576.6523 L
--7868.9033 8576.6523 L
--7859.8042 8575.041 L
-S
-U
-u
-0 O
-0.7 g
-1 w
--7873.3672 8573.5781 m
--7864.0703 8573.5313 L
--7859.7119 8571.8047 L
--7855.1343 8573.5313 L
--7846.4214 8573.5313 L
--7846.4927 8575.5557 L
--7873.3672 8575.5557 L
--7873.3672 8573.5781 L
-f
-0 R
-0.25 G
-0.5 w
--7846.4546 8573.5781 m
--7846.5649 8575.5557 L
--7873.4038 8575.5557 L
-S
-0.9 G
--7855.1758 8573.5781 m
--7846.4546 8573.5781 L
-S
-0.25 G
--7859.7817 8571.8047 m
--7855.1758 8573.5781 L
-S
-0.9 G
--7873.4038 8575.5557 m
--7873.4038 8573.5781 L
--7864.1406 8573.5781 L
--7859.7817 8571.8047 L
-S
-U
-u
-0 O
-0.7495 g
-0.25 G
-2 J 2 M
--7874.8838 8572.75 m
--7874.8911 8550.8809 l
--7873.9082 8549.8848 L
--7845.9302 8549.9121 L
--7844.9922 8551.0508 L
--7844.9922 8572.4648 L
--7845.8022 8573.6045 L
--7874.0366 8573.6045 l
--7874.8838 8572.75 L
-b
-/BBAccumRotation (4.712389) XT
-0.8748 G
--7874.0366 8573.6045 m
--7874.8838 8572.75 L
--7874.8911 8550.8809 l
--7873.9082 8549.8848 L
--7845.9302 8549.9121 L
-S
-/BBAccumRotation (4.712389) XT
-0 O
-0.9 g
-0.25 G
--7848.0239 8570.7168 m
--7848.0054 8552.7617 L
--7871.8994 8552.7617 L
--7871.9014 8570.7148 L
--7848.0239 8570.7168 L
-b
-/BBAccumRotation (4.712389) XT
-U
-U
-u
-0.15 G
-0 J 4 M
--7843.333 8579.5479 m
--7859.8857 8579.5479 L
--7876.439 8579.5479 L
--7883.001 8582.9805 L
--7883.001 8585 L
--7836.9722 8585 L
--7836.9722 8582.9805 L
--7843.333 8579.5479 L
-s
--7874.0366 8573.6045 m
--7873.4038 8573.6045 L
--7873.4038 8575.5557 L
--7873.3672 8575.5449 L
--7873.3672 8575.5527 L
--7873.4038 8575.5557 L
--7873.3672 8575.5557 L
--7862.731 8575.5557 L
--7868.8462 8576.6094 L
--7871.125 8576.6523 L
--7871.1567 8576.6523 L
--7871.1567 8578.4512 L
--7871.125 8578.4414 L
--7871.125 8578.4482 L
--7871.1567 8578.4512 L
--7871.125 8578.4512 L
--7848.7905 8578.4512 L
--7848.729 8578.4512 L
--7848.6694 8576.6094 L
--7850.4634 8576.6094 L
--7856.7002 8575.5557 L
--7846.5649 8575.5557 L
--7846.4927 8575.5557 L
--7846.4233 8573.6045 L
--7845.8022 8573.6045 L
--7844.9922 8572.4648 L
--7844.9922 8551.0508 L
--7845.9302 8549.9121 L
--7873.9082 8549.8848 L
--7874.8911 8550.8809 L
--7874.8838 8572.75 L
--7874.0366 8573.6045 L
-s
-U
-U
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 21)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7883.3184 8585.3184 m
--7804.0449 8585.3184 L
--7804.0449 8559.5566 L
--7883.3184 8559.5566 L
--7883.3184 8585.3184 L
-n
-u
-0 O
-0.8158 g
-0 R
-0 G
-0.5 w 3.8636 M
--7882.8638 8562.8213 m
--7804.4961 8562.8213 L
--7804.4961 8576.9053 L
--7882.8638 8576.9053 L
--7882.8638 8562.8213 L
-b
--7843.6792 8569.8633 m
-B
-U
-u
--7880.4233 8576.9053 m
--7806.939 8576.9053 L
--7805.4766 8576.9053 -7804.2954 8578.0908 -7804.2954 8579.5498 c
--7804.2954 8580.9951 L
--7804.2954 8582.4561 -7805.4766 8583.6416 -7806.939 8583.6416 c
--7880.4233 8583.6416 L
--7881.8838 8583.6416 -7883.0688 8582.4561 -7883.0688 8580.9951 c
--7883.0688 8579.5498 L
--7883.0688 8578.0908 -7881.8838 8576.9053 -7880.4233 8576.9053 c
--7880.4233 8576.9053 L
-b
--7843.6802 8580.2744 m
-B
-U
-0 g
--7878.374 8583.6396 m
--7873.8838 8583.6396 L
--7874.7007 8585.0684 L
--7877.251 8585.0684 L
--7878.374 8583.6396 L
-b
--7814.293 8583.6396 m
--7809.8022 8583.6396 L
--7810.6191 8585.0684 L
--7813.1714 8585.0684 L
--7814.293 8583.6396 L
-b
-0.61 G
-1 w
--7875.9258 8562.8574 m
--7875.9258 8574.4893 L
-S
--7873.8838 8562.8574 m
--7873.8838 8574.4893 L
-S
-u
-0 O
-0 g
-0 G
-0.5 w
--7826.7417 8566.7002 m
--7813.0679 8566.7002 L
--7813.0679 8568.9463 L
--7826.7417 8568.9463 L
--7826.7417 8566.7002 L
-b
--7819.9038 8567.8223 m
-B
-U
-1 J
--7814.3066 8577.9297 m
--7813.8906 8578.3682 -7813.6362 8578.9561 -7813.6362 8579.6064 C
--7813.6362 8580.9355 L
--7813.6362 8581.5859 -7813.8906 8582.1758 -7814.3066 8582.6123 C
-S
--7816.1978 8577.9297 m
--7815.7842 8578.3682 -7815.5288 8578.9561 -7815.5288 8579.6064 C
--7815.5288 8580.9355 L
--7815.5288 8581.5859 -7815.7842 8582.1758 -7816.1978 8582.6123 C
-S
--7818.0913 8577.9297 m
--7817.6758 8578.3682 -7817.4214 8578.9561 -7817.4214 8579.6064 C
--7817.4214 8580.9355 L
--7817.4214 8581.5859 -7817.6758 8582.1758 -7818.0913 8582.6123 C
-S
--7819.9839 8577.9297 m
--7819.5698 8578.3682 -7819.314 8578.9561 -7819.314 8579.6064 C
--7819.314 8580.9355 L
--7819.314 8581.5859 -7819.5698 8582.1758 -7819.9839 8582.6123 C
-S
--7821.8774 8577.9297 m
--7821.4614 8578.3682 -7821.207 8578.9561 -7821.207 8579.6064 C
--7821.207 8580.9355 L
--7821.207 8581.5859 -7821.4614 8582.1758 -7821.8774 8582.6123 C
-S
--7823.769 8577.9297 m
--7823.354 8578.3682 -7823.1001 8578.9561 -7823.1001 8579.6064 C
--7823.1001 8580.9355 L
--7823.1001 8581.5859 -7823.354 8582.1758 -7823.769 8582.6123 C
-S
--7825.6616 8577.9297 m
--7825.248 8578.3682 -7824.9922 8578.9561 -7824.9922 8579.6064 C
--7824.9922 8580.9355 L
--7824.9922 8581.5859 -7825.248 8582.1758 -7825.6616 8582.6123 C
-S
--7827.5542 8577.9297 m
--7827.1401 8578.3682 -7826.8857 8578.9561 -7826.8857 8579.6064 C
--7826.8857 8580.9355 L
--7826.8857 8581.5859 -7827.1401 8582.1758 -7827.5542 8582.6123 C
-S
--7829.4463 8577.9297 m
--7829.0322 8578.3682 -7828.7769 8578.9561 -7828.7769 8579.6064 C
--7828.7769 8580.9355 L
--7828.7769 8581.5859 -7829.0322 8582.1758 -7829.4463 8582.6123 C
-S
--7831.3374 8577.9297 m
--7830.9258 8578.3682 -7830.6694 8578.9561 -7830.6694 8579.6064 C
--7830.6694 8580.9355 L
--7830.6694 8581.5859 -7830.9258 8582.1758 -7831.3374 8582.6123 C
-S
--7833.231 8577.9297 m
--7832.8159 8578.3682 -7832.563 8578.9561 -7832.563 8579.6064 C
--7832.563 8580.9355 L
--7832.563 8581.5859 -7832.8159 8582.1758 -7833.231 8582.6123 C
-S
--7835.125 8577.9297 m
--7834.7095 8578.3682 -7834.4546 8578.9561 -7834.4546 8579.6064 C
--7834.4546 8580.9355 L
--7834.4546 8581.5859 -7834.7095 8582.1758 -7835.125 8582.6123 C
-S
--7837.0151 8577.9297 m
--7836.6006 8578.3682 -7836.3472 8578.9561 -7836.3472 8579.6064 C
--7836.3472 8580.9355 L
--7836.3472 8581.5859 -7836.6006 8582.1758 -7837.0151 8582.6123 C
-S
--7838.9102 8577.9297 m
--7838.4937 8578.3682 -7838.2407 8578.9561 -7838.2407 8579.6064 C
--7838.2407 8580.9355 L
--7838.2407 8581.5859 -7838.4937 8582.1758 -7838.9102 8582.6123 C
-S
--7840.8022 8577.9297 m
--7840.3872 8578.3682 -7840.1318 8578.9561 -7840.1318 8579.6064 C
--7840.1318 8580.9355 L
--7840.1318 8581.5859 -7840.3872 8582.1758 -7840.8022 8582.6123 C
-S
-0 O
-0.4385 g
-0 J 1 j
--7873.8838 8559.8066 m
--7813.8838 8559.8066 L
--7804.4961 8562.8213 L
--7882.8638 8562.8213 L
--7873.8838 8559.8066 L
-b
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 22)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7876.001 8578.6211 m
--7827.9502 8578.6211 L
--7827.9502 8497.4414 L
--7876.001 8497.4414 L
--7876.001 8578.6211 L
-n
-u
-u
-u
-0 O
-0.7 g
--7869.2202 8497.6914 m
--7835.2578 8497.6914 L
--7834.7935 8497.7441 L
--7834.3569 8497.9102 L
--7834.0791 8498.2148 L
--7834.0034 8498.543 L
--7834.0034 8562.8496 L
--7834.0791 8563.1855 L
--7834.3569 8563.4355 L
--7834.7935 8563.6504 L
--7835.2578 8563.707 L
--7869.2202 8563.707 L
--7869.6855 8563.6504 L
--7870.0361 8563.4355 L
--7870.3618 8563.1855 L
--7870.4399 8562.8496 L
--7870.4399 8498.543 L
--7870.3618 8498.2148 L
--7870.0361 8497.9102 L
--7869.6855 8497.7441 L
--7869.2202 8497.6914 L
-f
-0 R
-0.25 G
-0.5 w
--7834.0034 8498.543 m
--7834.0034 8562.8496 L
--7834.0791 8563.1855 L
--7834.3569 8563.4355 L
--7834.7935 8563.6504 L
--7835.2578 8563.707 L
--7869.2202 8563.707 L
--7869.6855 8563.6504 L
--7870.0361 8563.4355 L
--7870.3618 8563.1855 L
--7870.4399 8562.8496 L
-S
-0.9 G
--7870.4399 8562.8496 m
--7870.4399 8498.543 L
--7870.3618 8498.2148 L
--7870.0361 8497.9102 L
--7869.6855 8497.7441 L
--7869.2202 8497.6914 L
--7835.2578 8497.6914 L
--7834.7935 8497.7441 L
--7834.3569 8497.9102 L
--7834.0791 8498.2148 L
--7834.0034 8498.543 L
-S
-1 Ap
-0 O
-0.8 g
-0.25 G
-2 J 2 M
--7838.79 8507.9629 m
--7865.4775 8507.9629 L
--7865.4775 8560.2607 L
--7838.79 8560.2607 L
--7838.79 8507.9629 L
-b
-u
--7838.79 8523.8691 m
--7865.4736 8523.8691 L
--7865.4736 8520.0957 L
--7838.79 8520.0957 L
--7838.79 8523.8691 L
-b
--7838.79 8520.0615 m
--7865.4736 8520.0615 L
--7865.4736 8516.2871 L
--7838.79 8516.2871 L
--7838.79 8520.0615 L
-b
-U
-0 Ap
-0.25 g
-0 J 1 w 4 M
--7842.3818 8509.4375 m
--7843.2319 8509.4375 L
--7862.2729 8509.4375 L
--7862.2729 8510.3271 L
--7855.8018 8510.3271 L
--7855.8018 8510.9629 L
--7848.8486 8510.9629 L
--7848.8486 8510.3271 L
--7842.3818 8510.3271 L
--7842.3818 8509.4375 L
-f
-1 Ap
-0.6 g
-0 R
-0.25 G
-2 J 0.5 w 2 M
--7842.8271 8511.3691 m
--7846.8706 8511.3691 L
--7846.8706 8510.7324 L
--7842.8271 8510.7324 L
--7842.8271 8511.3691 L
-b
-u
-0.8 g
--7840.8057 8514.5547 m
--7863.4463 8514.5547 L
--7863.4463 8513.0664 L
--7840.8057 8513.0664 L
--7840.8057 8514.5547 L
-b
--7863.4463 8514.5547 m
--7863.4463 8513.0664 L
--7840.8057 8513.0664 L
-S
-0.9 G
--7840.8057 8513.0664 m
--7840.8057 8514.5547 L
--7863.4463 8514.5547 L
-S
-U
-0 O
-0.7 g
-0 J 1 w 4 M
--7841.1318 8515.6172 m
--7845.1743 8515.6172 L
--7845.1743 8514.9805 L
--7841.1318 8514.9805 L
--7841.1318 8515.6172 L
-f
-0 R
-0.25 G
-2 J 0.5 w 2 M
--7841.1318 8514.9805 m
--7841.1318 8515.6172 L
--7845.1743 8515.6172 L
-S
-u
-u
--7861.5903 8500.6797 m
--7861.5903 8503.7402 L
--7866.9287 8503.7402 L
-S
--7861.5903 8503.7393 m
--7861.5903 8506.7578 L
--7866.9287 8506.7578 L
-S
-U
-u
-0.9 G
--7866.9287 8503.7129 m
--7866.9287 8500.6934 L
--7861.5903 8500.6934 L
-S
--7866.9287 8506.7578 m
--7866.9287 8503.7393 L
--7861.5903 8503.7393 L
-S
-U
-U
-u
-u
-0.25 G
--7837.7178 8500.6797 m
--7837.7178 8503.7402 L
--7843.0542 8503.7402 L
-S
--7837.7178 8503.7393 m
--7837.7178 8506.7578 L
--7843.0542 8506.7578 L
-S
-U
-u
-0.9 G
--7843.0542 8503.7129 m
--7843.0542 8500.6934 L
--7837.7178 8500.6934 L
-S
--7843.0542 8506.7578 m
--7843.0542 8503.7393 L
--7837.7178 8503.7393 L
-S
-U
-U
-0 O
-0.8 g
-0 J 1 w 4 M
--7832.144 8564.9395 m
--7872.3799 8564.9395 L
--7870.6865 8562.6406 L
--7833.8359 8562.6406 L
--7832.144 8564.9395 L
-f
-0 R
-0.9 G
-0.5 w
--7870.4072 8562.4785 m
--7872.3799 8564.9395 L
--7869.9111 8564.9395 l
-S
-0.25 G
--7834.083 8562.3672 m
--7832.144 8564.9395 L
--7872.0337 8564.9395 l
-S
-U
-0 Ap
-0.15 G
--7833.8359 8562.6406 m
--7833.874 8562.6406 L
--7834.0034 8562.4727 L
--7834.0034 8498.543 L
--7834.0791 8498.2148 L
--7834.3569 8497.9102 L
--7834.7935 8497.7441 L
--7835.2578 8497.6914 L
--7869.2202 8497.6914 L
--7869.6855 8497.7441 L
--7870.0361 8497.9102 L
--7870.3618 8498.2148 L
--7870.4399 8498.543 L
--7870.4399 8562.5195 L
--7870.5386 8562.6406 L
--7870.6865 8562.6406 L
--7872.3799 8564.9395 L
--7872.0337 8564.9395 L
--7869.9111 8564.9395 L
--7832.144 8564.9395 L
--7833.8359 8562.6406 L
-s
--7870.4399 8562.5195 m
--7833.8359 8562.5195 l
-S
-U
-U
-0 To
-1 0 0 -1 -7851.9761 8576.5957 0 Tp
-0 Tv
-TP
--24.0247 0 Td
-0 Tr
-0 O
-0 g
-1 w
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
-0 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-36 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 0 0 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
-0 Tc
-0 Tw
-(DNS Ser) Tx 1 -30 Tk
-(v) Tx 1 25 Tk
-(er) Tx 1 0 Tk
-(\r) TX
-TO
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 23)
-0 A
-u
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7878.9351 8565.3359 m
--7830.6465 8565.3359 L
--7830.6465 8506.8223 L
--7878.9351 8506.8223 L
--7878.9351 8565.3359 L
-n
-0 O
-0.64 g
--7830.6465 8513.9863 m
--7832.5977 8506.8223 L
--7849.127 8506.8223 L
--7851.001 8513.9863 L
--7858.666 8513.9863 L
--7860.7529 8506.8223 L
--7877.0625 8506.8223 L
--7878.9351 8513.9863 L
--7878.9351 8514.0137 L
--7830.6465 8514.0137 L
--7830.6465 8513.9863 L
-f
-0.92 g
--7878.9351 8514.0137 m
--7878.9351 8565.3164 L
--7870.5898 8565.3164 L
--7870.5898 8561.6152 L
--7870.5386 8561.6152 L
--7870.5386 8514.0137 L
--7878.9351 8514.0137 L
-f
--7830.6465 8514.0137 m
--7838.7871 8514.0137 L
--7838.7871 8565.3359 L
--7830.6465 8565.3359 L
--7830.6465 8514.0137 L
-f
-0.8158 g
--7870.5386 8514.0137 m
--7870.5386 8561.6152 L
--7838.8442 8561.6152 L
--7838.8442 8565.3359 L
--7838.7871 8565.3359 L
--7838.7871 8514.0137 L
--7870.5386 8514.0137 L
-f
-0 R
-0.67 G
-0.5 w 3.8635 M
--7858.666 8513.9863 m
--7858.6582 8561.6152 L
-S
--7857.8145 8513.9863 m
--7857.8066 8561.6152 L
-S
--7856.9634 8513.9863 m
--7856.9551 8561.6152 L
-S
--7856.1113 8513.9863 m
--7856.103 8561.6152 L
-S
--7855.2598 8513.9863 m
--7855.252 8561.6152 L
-S
--7854.4082 8513.9863 m
--7854.3999 8561.6152 L
-S
--7853.5566 8513.9863 m
--7853.5488 8561.6152 L
-S
--7853.5718 8513.9863 m
--7853.563 8561.6152 L
-S
--7852.7202 8513.9863 m
--7852.7114 8561.6152 L
-S
--7851.8682 8513.9863 m
--7851.8594 8561.6152 L
-S
--7851.0161 8513.9863 m
--7851.0078 8561.6152 L
-S
-U
-0 To
-1 0 0 -1 -7854.791 8576.5957 0 Tp
-0 Tv
-TP
--21.2094 0 Td
-0 Tr
-0 O
-0 g
-1 w 4 M
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
-0 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-53.0468 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 0 0 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 4 Tl
-0 Tc
-0 Tw
-(Mainfr) Tx 1 10 Tk
-(ame) Tx 1 0 Tk
-(\r) TX
-TO
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 40)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7884 8586 m
--7835.7114 8586 L
--7835.7114 8500.1016 L
--7884 8500.1016 L
--7884 8586 L
-n
-0 O
-0.64 g
--7835.7114 8507.2656 m
--7837.6626 8500.1016 L
--7854.1919 8500.1016 L
--7856.0654 8507.2656 L
--7863.7305 8507.2656 L
--7865.8174 8500.1016 L
--7882.127 8500.1016 L
--7884 8507.2656 L
--7884 8507.293 L
--7835.7114 8507.293 L
--7835.7114 8507.2656 L
-f
-0.92 g
--7884 8507.293 m
--7884 8585.9805 L
--7875.6543 8585.9805 L
--7875.6543 8582.2793 L
--7875.6025 8582.2793 L
--7875.6025 8507.293 L
--7884 8507.293 L
-f
--7835.7114 8507.293 m
--7843.8511 8507.293 L
--7843.8511 8586 L
--7835.7114 8586 L
--7835.7114 8507.293 L
-f
-0.8158 g
--7875.6025 8507.293 m
--7875.6025 8582.2793 L
--7843.9087 8582.2793 L
--7843.9087 8586 L
--7843.8511 8586 L
--7843.8511 8507.293 L
--7875.6025 8507.293 L
-f
-0 R
-0.67 G
-0.5 w 3.8635 M
--7863.7305 8507.2656 m
--7863.7222 8582.2793 L
-S
--7862.8794 8507.2656 m
--7862.8711 8582.2793 L
-S
--7862.0273 8507.2656 m
--7862.019 8582.2793 L
-S
--7861.1758 8507.2656 m
--7861.168 8582.2793 L
-S
--7860.3242 8507.2656 m
--7860.3169 8582.2793 L
-S
--7859.4727 8507.2656 m
--7859.4648 8582.2793 L
-S
--7858.6206 8507.2656 m
--7858.6138 8582.2793 L
-S
--7858.6362 8507.2656 m
--7858.6279 8582.2793 L
-S
--7857.7842 8507.2656 m
--7857.7754 8582.2793 L
-S
--7856.9326 8507.2656 m
--7856.9238 8582.2793 L
-S
--7856.0801 8507.2656 m
--7856.0718 8582.2793 L
-S
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 43)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7883.749 8585.8232 m
--7870.9414 8585.8232 L
--7870.9414 8557.1563 L
--7883.749 8557.1563 L
--7883.749 8585.8232 L
-n
-0 O
-0.3 g
--7870.9414 8574.5498 m
--7875.1558 8563.2031 L
--7875.3862 8562.5801 -7876.0439 8562.2598 -7876.6719 8562.4141 C
--7876.8018 8562.3506 -7876.9473 8562.3359 -7877.0889 8562.3164 C
--7875.771 8562.1797 -7874.7358 8561.1084 -7874.7358 8559.7627 c
--7874.7358 8558.3184 -7875.9009 8557.1563 -7877.3447 8557.1563 c
--7878.7842 8557.1563 -7879.9482 8558.3184 -7879.9482 8559.7627 c
--7879.9482 8561.1084 -7878.916 8562.1797 -7877.6016 8562.3164 C
--7877.7441 8562.3359 -7877.8809 8562.3506 -7878.0186 8562.4141 C
--7878.645 8562.2598 -7879.3018 8562.5801 -7879.5313 8563.2031 C
--7883.749 8574.5498 L
--7884 8575.2168 -7883.6543 8575.9688 -7882.9834 8576.2188 c
--7882.313 8576.4658 -7881.5664 8576.123 -7881.3193 8575.4531 C
--7880.1289 8572.2441 L
--7880.0054 8572.6758 -7879.876 8573.0762 -7879.7119 8573.4385 C
--7882.4902 8584.2402 L
--7882.668 8584.9375 -7882.252 8585.6416 -7881.5586 8585.8232 c
--7880.8657 8586 -7880.1626 8585.583 -7879.9766 8584.8867 C
--7877.5918 8575.5967 L
--7877.5049 8575.6084 -7877.4282 8575.6494 -7877.3447 8575.6494 c
--7877.2617 8575.6494 -7877.1855 8575.6084 -7877.0991 8575.5967 C
--7874.7129 8584.8867 L
--7874.5303 8585.583 -7873.8242 8586 -7873.1318 8585.8232 c
--7872.4385 8585.6416 -7872.0215 8584.9375 -7872.1978 8584.2402 C
--7874.9766 8573.4385 L
--7874.8154 8573.0762 -7874.6846 8572.6758 -7874.5625 8572.2441 C
--7873.3711 8575.4531 L
--7873.125 8576.123 -7872.3799 8576.4658 -7871.707 8576.2188 c
--7871.0391 8575.9688 -7870.6914 8575.2168 -7870.9414 8574.5498 C
-f
-U
-%AI8_EndBrushPattern
-%AI5_End_NonPrinting--
-%AI5_BeginPalette
-0 0 Pb
-1 1 1 1 ([Registration]) 0 Xs
-([Registration]) Pc
-0 0 0 0.15 (15%) 0 0 Xk
-(15%) Pc
-0 0 0 0.3 (30%) 0 0 Xk
-(30%) Pc
-0 0 0 0.5 (50%) 0 0 Xk
-(50%) Pc
-0 0 0 0.75 (75%) 0 0 Xk
-(75%) Pc
-(horizontal rules) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(horizontal rules) Pc
-(bi-direction diagonals) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(bi-direction diagonals) Pc
-(one direction diagonals) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(one direction diagonals) Pc
-(white dots) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(white dots) Pc
-(black dots) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(black dots) Pc
-PB
-%AI5_EndPalette
-%AI5_Begin_NonPrinting
-Np
-%AI8_BeginPluginObject
-(Adobe Brush Manager Order)
-(Adobe Brush Manager Order)
-( Adobe Scatter Brush Tool/ Scatter Brush 1/ Adobe Scatter Brush Tool/ ) -
-(Mainframe/ Adobe Scatter Brush Tool/ Client/ Adobe Scatter Brush Tool/) -
-( person/ Adobe Scatter Brush Tool/ Print spooler/ Adobe Scatter Brush ) -
-(Tool/ Folders/ Adobe Scatter Brush Tool/ Printer/ Adobe Scatter Brush ) -
-(Tool/ Client 1/ Adobe Scatter Brush Tool/ Mainframe 1/ Adobe Scatter B) -
-(rush Tool/ Fax server/) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Client)
-(1 /New Pattern 19/ 0 0.0784314 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Client 1)
-(1 /New Pattern 19/ 0 0.0784314 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Fax server)
-(1 /New Pattern 21/ 0 0.184314 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Folders)
-(1 /New Pattern 9/ 0 0.160784 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Mainframe)
-(1 /New Pattern 23/ 0 0.184314 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Mainframe 1)
-(1 /New Pattern 40/ 0 0.184314 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(person)
-(1 /New Pattern 43/ 0 0.701961 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Print spooler)
-(1 /New Pattern 2/ 0 0.854902 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Printer)
-(1 /New Pattern 10/ 0 0.160784 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Scatter Brush 1)
-(1 /New Pattern 22/ 0 0.2 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI5_End_NonPrinting--
-%AI5_Begin_NonPrinting
-Np
-%AI8_PluginGroupInfo
-(Adobe Path Blends) (Adobe Blends Plugin) (Live Blends)
-%AI8_PluginGroupInfo
-(Adobe PatternOnPath Brush Tool) (Adobe Pattern Brush Plugin) (Art Brush Tool)
-%AI8_PluginGroupInfo
-(Adobe ArtOnPath Brush Tool) (Adobe Art Brush Plugin) (Art Brush Tool)
-%AI8_PluginGroupInfo
-(Adobe Calligraphic Brush Tool) (Undo New Calligraphic Brush) (Calligraphic Brush Tool)
-%AI8_PluginGroupInfo
-(Adobe Scatter Brush Tool) (Adobe Scatter Brush Plugin) (Scatter Brush Tool)
-%AI5_End_NonPrinting--
-%%EndSetup
-%AI5_BeginLayer
-1 1 1 1 0 0 1 0 79 128 255 0 50 Lb
-(Layer 1) Ln
-0 A
-1 Ap
-0 O
-0.95 g
-0 R
-0 G
-800 Ar
-0 J 0 j 0.5 w 4 M []0 d
-%AI3_Note:
-0 D
-1 XR
-501.71 169.1504 m
-153.71 169.1504 L
-153.71 589.1504 L
-501.71 589.1504 L
-501.71 169.1504 L
-(b) *
-u
-%_0 Ap
-%_0 XR
-%_326.7559 283.2148 m
-%_S
-%_U
-%_0 Ap
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-326.7559 283.2148 m
-N
-u
-u
-u
-0 O
-0.7495 g
-0 R
-0.25 G
-1 j 0.25 w 2 M
-338.2412 274.4355 m
-338.2412 275.4453 l
-335.0605 277.1621 l
-326.7842 277.1621 L
-318.5078 277.1621 l
-315.2266 275.4453 l
-315.2266 274.4355 l
-338.2412 274.4355 l
-b
-0.8748 G
-2 J 0 j
-326.7842 277.1621 m
-318.5078 277.1621 l
-315.2266 275.4453 l
-315.2266 274.4355 l
-S
-338.2412 275.4453 m
-335.0605 277.1621 l
-326.7842 277.1621 L
-S
-0 O
-0.9 g
-0.25 G
-0 J 1 j
-318.5576 276.5566 m
-316.5391 275.4453 l
-336.8271 275.4453 l
-335.1113 276.5566 l
-318.5576 276.5566 l
-b
-U
-u
-u
-0.7 g
-0 j 1 w 4 M
-321.1641 278.6094 m
-322.3037 278.6309 L
-326.8545 279.416 L
-331.4951 278.6309 L
-332.3926 278.6309 L
-332.3623 277.7109 L
-321.1641 277.7109 L
-321.1641 278.6094 L
-f
-0 R
-0.25 G
-0.25 w
-332.3779 278.6094 m
-332.332 277.7109 L
-321.1484 277.7109 L
-S
-0.9 G
-331.4785 278.6094 m
-332.3779 278.6094 L
-S
-0.25 G
-326.8252 279.416 m
-331.4785 278.6094 L
-S
-0.9 G
-321.1484 277.7109 m
-321.1484 278.6094 L
-322.2754 278.6094 L
-326.8252 279.416 L
-S
-U
-u
-0 O
-0.7 g
-1 w
-320.043 280.1465 m
-324.6914 280.1699 L
-326.8711 281.0332 L
-329.1602 280.1699 L
-333.5166 280.1699 L
-333.4805 279.1582 L
-320.043 279.1582 L
-320.043 280.1465 L
-f
-0 R
-0.25 G
-0.25 w
-333.5 280.1465 m
-333.4443 279.1582 L
-320.0254 279.1582 L
-S
-0.9 G
-329.1387 280.1465 m
-333.5 280.1465 L
-S
-0.25 G
-326.8359 281.0332 m
-329.1387 280.1465 L
-S
-0.9 G
-320.0254 279.1582 m
-320.0254 280.1465 L
-324.6563 280.1465 L
-326.8359 281.0332 L
-S
-U
-u
-0 O
-0.7495 g
-0.25 G
-2 J 2 M
-319.2852 280.5605 m
-319.2813 291.4961 l
-319.7734 291.9941 L
-333.7617 291.9805 L
-334.2305 291.4102 L
-334.2305 280.7031 L
-333.8262 280.1338 L
-319.709 280.1338 l
-319.2852 280.5605 L
-b
-/BBAccumRotation (4.712389) XT
-0.8748 G
-319.709 280.1338 m
-319.2852 280.5605 L
-319.2813 291.4961 l
-319.7734 291.9941 L
-333.7617 291.9805 L
-S
-/BBAccumRotation (4.712389) XT
-0 O
-0.9 g
-0.25 G
-332.7148 281.5781 m
-332.7246 290.5547 L
-320.7773 290.5547 L
-320.7764 281.5781 L
-332.7148 281.5781 L
-b
-/BBAccumRotation (4.712389) XT
-U
-U
-u
-0.15 G
-0 J 4 M
-335.0605 277.1621 m
-326.7842 277.1621 L
-318.5078 277.1621 L
-315.2266 275.4453 L
-315.2266 274.4355 L
-338.2412 274.4355 L
-338.2412 275.4453 L
-335.0605 277.1621 L
-s
-319.709 280.1338 m
-320.0254 280.1338 L
-320.0254 279.1582 L
-320.043 279.1641 L
-320.043 279.1602 L
-320.0254 279.1582 L
-320.043 279.1582 L
-325.3613 279.1582 L
-322.3037 278.6309 L
-321.1641 278.6094 L
-321.1484 278.6094 L
-321.1484 277.7109 L
-321.1641 277.7148 L
-321.1641 277.7119 L
-321.1484 277.7109 L
-321.1641 277.7109 L
-332.332 277.7109 L
-332.3623 277.7109 L
-332.3926 278.6309 L
-331.4951 278.6309 L
-328.377 279.1582 L
-333.4443 279.1582 L
-333.4805 279.1582 L
-333.5156 280.1338 L
-333.8262 280.1338 L
-334.2305 280.7031 L
-334.2305 291.4102 L
-333.7617 291.9805 L
-319.7734 291.9941 L
-319.2813 291.4961 L
-319.2852 280.5605 L
-319.709 280.1338 L
-s
-U
-U
-U
-U
-(Adobe Scatter Brush Tool) 1 0 56 XP
-%010203043F8000003F8000003F8000003F80000000000000000000000000
-%000000000000000000000000000000000F36436C69656E742031
-/Adobe_Brushed_Path () XT
-0 To
-1 0 0 1 356.5137 282.7383 0 Tp
-0 Tv
-TP
--8.5004 0 Td
-0 Tr
-0 O
-0 g
-1 w
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
--4.5 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-23.6196 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 3.2805 3.2805 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
-0 Tc
-0 Tw
-(PCs) Tx 1 0 Tk
-(\r) TX
-TO
-0 To
-1 0 0 1 176.1445 369.5293 0 Tp
-0 Tv
-TP
--12.7793 0 Td
-0 Tr
--20 Tt
--0.18 Tc
-(Pr) Tx 1 -15 Tk
-(inter) Tx 1 0 Tk
-(\r) TX
-TO
-u
-%_1 g
-%_0 R
-%_0.67 G
-%_1 M
-%_184.939 348.2959 m
-%_B
-%_U
-%_0 Ap
-0 A
-u
-0 O
-1 g
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-184.939 348.2959 m
-F
-u
-0.8 g
-198.6704 339.2217 m
-218.7153 346.0791 l
-217.1348 348.9805 l
-204.4736 345.0244 l
-198.4072 348.9805 l
-198.6704 339.2217 l
-f
-0 R
-0.9 G
-0.5 w
-217.4067 349.1064 m
-204.4736 345.0244 l
-S
-0.5 G
-218.7153 346.0791 m
-217.1348 348.9805 l
-S
-0.25 G
-198.6704 339.2217 m
-218.7153 346.0791 l
-S
-0.5 G
-204.4736 345.0244 m
-198.4072 348.9805 l
-S
-0 O
-0.8 g
-1 w
-178.626 356.6309 m
-190.7568 361.9053 l
-194.1865 357.6865 l
-178.626 356.6309 l
-f
-1 Ap
-0.57 g
-198.9341 337.376 m
-152.5137 337.376 L
-152.5137 334.4756 L
-198.9341 334.4756 L
-198.9341 337.376 L
-f
-0 Ap
-0 R
-0.5 G
-0.5 w
-190.7568 361.9053 m
-194.1865 357.6865 l
-S
-0.9 G
-178.626 356.6309 m
-191.3188 362.1826 l
-S
-0 O
-0.8 g
-1 w
-151.1929 358.668 m
-151.1929 337.3447 l
-199.9893 337.3447 l
-199.9893 354.5186 l
-196.5601 358.6084 l
-151.1929 358.668 l
-f
-0 R
-0.5 G
-0.5 w
-151.1929 342.9141 m
-199.9893 342.9141 l
-S
-154.0952 355.3115 m
-163.5913 355.3115 l
-S
-154.0952 353.6631 m
-163.5913 353.6631 l
-S
-154.0952 352.0156 m
-163.5913 352.0156 l
-S
-154.0952 350.3672 m
-163.5913 350.3672 l
-S
-154.0952 348.7197 m
-163.5913 348.7197 l
-S
-199.9893 354.5186 m
-196.5601 358.6084 l
-S
-0.25 G
-151.1929 337.3447 m
-199.9893 337.3447 l
-199.9893 354.5186 l
-S
-0.9 G
-196.5601 358.6377 m
-151.1929 358.6377 l
-151.1929 337.0752 l
-S
-0.25 G
-198.9341 337.3447 m
-198.9341 334.4307 l
-152.5225 334.4307 l
-S
-U
-U
-(Adobe Scatter Brush Tool) 1 0 55 XP
-%010203043F8000003F8000003F8000003F80000000000000000000000000
-%0000000000000000000000000000000007995072696E746572
-/Adobe_Brushed_Path () XT
-0 G
-291.1753 294.3105 m
-309.5527 281.6992 l
-S
-291.1753 307.3984 m
-309.5527 294.7871 l
-S
-0 To
-1 0 0 1 311.5088 324.3838 0 Tp
-0 Tv
-TP
--16.5244 0 Td
-0 Tr
-0 O
-0 g
-1 w
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
-0 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-23.6196 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 3.2805 3.2805 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
-0 Tc
-0 Tw
-(Netw) Tx 1 10 Tk
-(or) Tx 1 -15 Tk
-(k) Tx 1 0 Tk
-(\r) TX
-TO
-1 Ap
-0.99 g
-0 R
-0.25 G
-0.5 w
-198.752 338.9092 m
-186.9775 338.9092 L
-186.9775 341.7178 L
-198.752 341.7178 L
-198.752 338.9092 L
-b
-0 Ap
-0 G
-309.5527 267.6113 m
-291.1753 280.2227 l
-291.1753 332.1113 291.1753 335.3545 v
-291.0659 339.9316 286.5981 339.9316 v
-282.1304 339.9316 194.2432 339.9316 y
-S
-0 To
-1 0 0 1 315.0566 395.6709 0 Tp
-0 Tv
-TP
--19.7722 0 Td
-0 Tr
-0 O
-0 g
-1 w
-(Fileser) Tx 1 -30 Tk
-(v) Tx 1 25 Tk
-(er) Tx 1 0 Tk
-(\r) TX
-TO
-u
-%_0 R
-%_0 G
-%_0.65 w
-%_314.668 381.1777 m
-%_S
-%_U
-%_0 Ap
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-314.668 381.1777 m
-N
-u
-u
-0 O
-0.8158 g
-0 R
-0 G
-0.325 w 3.8636 M
-289.1997 387.4277 m
-340.1387 387.4277 L
-340.1387 378.2734 L
-289.1997 378.2734 L
-289.1997 387.4277 L
-b
-314.6699 382.8506 m
-B
-U
-u
-290.7861 378.2734 m
-338.5508 378.2734 L
-339.501 378.2734 340.2686 377.5029 340.2686 376.5547 c
-340.2686 375.6152 L
-340.2686 374.666 339.501 373.8945 338.5508 373.8945 c
-290.7861 373.8945 L
-289.8369 373.8945 289.0664 374.666 289.0664 375.6152 c
-289.0664 376.5547 L
-289.0664 377.5029 289.8369 378.2734 290.7861 378.2734 c
-290.7861 378.2734 L
-b
-314.6689 376.084 m
-B
-U
-0 g
-292.1182 373.8965 m
-295.0366 373.8965 L
-294.5059 372.9668 L
-292.8481 372.9668 L
-292.1182 373.8965 L
-b
-333.7705 373.8965 m
-336.6904 373.8965 L
-336.1592 372.9668 L
-334.5 372.9668 L
-333.7705 373.8965 L
-b
-0.61 G
-0.65 w
-293.7095 387.4043 m
-293.7095 379.8438 L
-S
-295.0366 387.4043 m
-295.0366 379.8438 L
-S
-u
-0 O
-0 g
-0 G
-0.325 w
-325.6787 384.9063 m
-334.5674 384.9063 L
-334.5674 383.4473 L
-325.6787 383.4473 L
-325.6787 384.9063 L
-b
-330.124 384.1777 m
-B
-U
-1 J
-333.7617 377.6074 m
-334.0322 377.3223 334.1982 376.9404 334.1982 376.5176 C
-334.1982 375.6543 L
-334.1982 375.2305 334.0322 374.8477 333.7617 374.5645 C
-S
-332.5322 377.6074 m
-332.8018 377.3223 332.9678 376.9404 332.9678 376.5176 C
-332.9678 375.6543 L
-332.9678 375.2305 332.8018 374.8477 332.5322 374.5645 C
-S
-331.3018 377.6074 m
-331.5713 377.3223 331.7373 376.9404 331.7373 376.5176 C
-331.7373 375.6543 L
-331.7373 375.2305 331.5713 374.8477 331.3018 374.5645 C
-S
-330.0713 377.6074 m
-330.3408 377.3223 330.5068 376.9404 330.5068 376.5176 C
-330.5068 375.6543 L
-330.5068 375.2305 330.3408 374.8477 330.0713 374.5645 C
-S
-328.8408 377.6074 m
-329.1113 377.3223 329.2764 376.9404 329.2764 376.5176 C
-329.2764 375.6543 L
-329.2764 375.2305 329.1113 374.8477 328.8408 374.5645 C
-S
-327.6113 377.6074 m
-327.8818 377.3223 328.0459 376.9404 328.0459 376.5176 C
-328.0459 375.6543 L
-328.0459 375.2305 327.8818 374.8477 327.6113 374.5645 C
-S
-326.3818 377.6074 m
-326.6494 377.3223 326.8164 376.9404 326.8164 376.5176 C
-326.8164 375.6543 L
-326.8164 375.2305 326.6494 374.8477 326.3818 374.5645 C
-S
-325.1514 377.6074 m
-325.4199 377.3223 325.585 376.9404 325.585 376.5176 C
-325.585 375.6543 L
-325.585 375.2305 325.4199 374.8477 325.1514 374.5645 C
-S
-323.9209 377.6074 m
-324.1904 377.3223 324.3564 376.9404 324.3564 376.5176 C
-324.3564 375.6543 L
-324.3564 375.2305 324.1904 374.8477 323.9209 374.5645 C
-S
-322.6924 377.6074 m
-322.96 377.3223 323.126 376.9404 323.126 376.5176 C
-323.126 375.6543 L
-323.126 375.2305 322.96 374.8477 322.6924 374.5645 C
-S
-321.4609 377.6074 m
-321.7314 377.3223 321.8955 376.9404 321.8955 376.5176 C
-321.8955 375.6543 L
-321.8955 375.2305 321.7314 374.8477 321.4609 374.5645 C
-S
-320.2295 377.6074 m
-320.5 377.3223 320.665 376.9404 320.665 376.5176 C
-320.665 375.6543 L
-320.665 375.2305 320.5 374.8477 320.2295 374.5645 C
-S
-319.001 377.6074 m
-319.2705 377.3223 319.4355 376.9404 319.4355 376.5176 C
-319.4355 375.6543 L
-319.4355 375.2305 319.2705 374.8477 319.001 374.5645 C
-S
-317.7695 377.6074 m
-318.04 377.3223 318.2041 376.9404 318.2041 376.5176 C
-318.2041 375.6543 L
-318.2041 375.2305 318.04 374.8477 317.7695 374.5645 C
-S
-316.5391 377.6074 m
-316.8096 377.3223 316.9756 376.9404 316.9756 376.5176 C
-316.9756 375.6543 L
-316.9756 375.2305 316.8096 374.8477 316.5391 374.5645 C
-S
-0 O
-0.4385 g
-0 J 1 j
-295.0366 389.3877 m
-334.0361 389.3877 L
-340.1387 387.4277 L
-289.1997 387.4277 L
-295.0366 389.3877 L
-b
-U
-U
-(Adobe Scatter Brush Tool) 1 0 58 XP
-%010203043F8000003F8000003F8000003F80000000000000000000000000
-%0000000000000000000000000000000041C646617820736572766572
-/Adobe_Brushed_Path () XT
-0 j 0.5 w 4 M
-289.0234 383.1641 m
-243.0117 383.1641 l
-243.0117 339.9492 l
-S
-LB
-%AI5_EndLayer--
-%%PageTrailer
-gsave annotatepage grestore showpage
-%%Trailer
-Adobe_Illustrator_AI5 /terminate get exec
-Adobe_shading_AI8 /terminate get exec
-Adobe_ColorImage_AI6 /terminate get exec
-Adobe_typography_AI5 /terminate get exec
-Adobe_cshow /terminate get exec
-Adobe_level2_AI5 /terminate get exec
-%%EOF
diff --git a/en_US.ISO8859-1/books/corp-net-guide/08-05.eps b/en_US.ISO8859-1/books/corp-net-guide/08-05.eps
deleted file mode 100644
index a44642b5ed..0000000000
--- a/en_US.ISO8859-1/books/corp-net-guide/08-05.eps
+++ /dev/null
@@ -1,12613 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: Adobe Illustrator(R) 8.0
-%%AI8_CreatorVersion: 8.0.1
-%%For: (Mark Bergeron) (PD&PS)
-%%Title: (08-05 3594)
-%%CreationDate: (11/21/00) (9:05 AM)
-%%BoundingBox: 153 278 439 551
-%%HiResBoundingBox: 153.7051 278.1367 438.7607 550.6758
-%%DocumentProcessColors: Black
-%%DocumentFonts: Helvetica
-%%+ Helvetica-Bold
-%%DocumentNeededFonts: Helvetica
-%%+ Helvetica-Bold
-%%DocumentSuppliedResources: procset Adobe_level2_AI5 1.2 0
-%%+ procset Adobe_typography_AI5 1.0 1
-%%+ procset Adobe_ColorImage_AI6 1.3 0
-%%+ procset Adobe_Illustrator_AI5 1.3 0
-%%+ procset Adobe_cshow 2.0 8
-%%+ procset Adobe_shading_AI8 1.0 0
-%AI5_FileFormat 4.0
-%AI3_ColorUsage: Black&White
-%AI3_IncludePlacedImages
-%AI7_ImageSettings: 1
-%%CMYKProcessColor: 0 0 0 0.15 (15%)
-%%+ 0 0 0 0.3 (30%)
-%%+ 0 0 0 0.5 (50%)
-%%+ 0 0 0 0.75 (75%)
-%%+ 1 1 1 1 ([Registration])
-%%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set)
-%%+ Options: 1 16 0 1 0 1 1 1 0 1 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 2 3 4
-%%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 ()
-%AI3_TemplateBox: 306.5 395.5 306.5 395.5
-%AI3_TileBox: 12 14 600 782
-%AI3_DocumentPreview: Macintosh_ColorPic
-%AI5_ArtSize: 612 792
-%AI5_RulerUnits: 3
-%AI5_ArtFlags: 1 0 0 1 0 0 1 0 0
-%AI5_TargetResolution: 800
-%AI5_NumLayers: 1
-%AI8_OpenToView: 19.1475 609.1196 1.6275 1060 751 18 1 1 7 40 0 0
-%AI5_OpenViewLayers: 7
-%%PageOrigin:12 14
-%%AI3_PaperRect:-12 782 600 -10
-%%AI3_Margin:12 -14 -12 10
-%AI7_GridSettings: 12 3 12 3 1 0 0.29 1 1 0.65 1 1
-%%EndComments
-%%BeginProlog
-%%BeginResource: procset Adobe_level2_AI5 1.2 0
-%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation)
-%%Version: 1.2 0
-%%CreationDate: (04/10/93) ()
-%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved)
-userdict /Adobe_level2_AI5 26 dict dup begin
- put
- /packedarray where not
- {
- userdict begin
- /packedarray
- {
- array astore readonly
- } bind def
- /setpacking /pop load def
- /currentpacking false def
- end
- 0
- } if
- pop
- userdict /defaultpacking currentpacking put true setpacking
- /initialize
- {
- Adobe_level2_AI5 begin
- } bind def
- /terminate
- {
- currentdict Adobe_level2_AI5 eq
- {
- end
- } if
- } bind def
- mark
- /setcustomcolor where not
- {
- /findcmykcustomcolor
- {
- (AI8_CMYK_CustomColor)
- 6 packedarray
- } bind def
- /findrgbcustomcolor
- {
- (AI8_RGB_CustomColor)
- 5 packedarray
- } bind def
- /setcustomcolor
- {
- exch
- aload pop dup
- (AI8_CMYK_CustomColor) eq
- {
- pop pop
- 4
- {
- 4 index mul
- 4 1 roll
- } repeat
- 5 -1 roll pop
- setcmykcolor
- }
- {
- dup (AI8_RGB_CustomColor) eq
- {
- pop pop
- 3
- {
- 1 exch sub
- 3 index mul
- 1 exch sub
- 3 1 roll
- } repeat
- 4 -1 roll pop
- setrgbcolor
- }
- {
- pop
- 4
- {
- 4 index mul 4 1 roll
- } repeat
- 5 -1 roll pop
- setcmykcolor
- } ifelse
- } ifelse
- }
- def
- } if
- /setAIseparationgray
- {
- false setoverprint
- 0 setgray
- /setseparationgray where{
- pop setseparationgray
- }{
- /setcolorspace where{
- pop
- [/Separation (All) /DeviceCMYK {dup dup dup}] setcolorspace
- 1 exch sub setcolor
- }{
- setgray
- }ifelse
- }ifelse
- } def
-
- /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def
- userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put
- userdict /level2?
- systemdict /languagelevel known dup
- {
- pop systemdict /languagelevel get 2 ge
- } if
- put
-/level2ScreenFreq
-{
- begin
- 60
- HalftoneType 1 eq
- {
- pop Frequency
- } if
- HalftoneType 2 eq
- {
- pop GrayFrequency
- } if
- HalftoneType 5 eq
- {
- pop Default level2ScreenFreq
- } if
- end
-} bind def
-userdict /currentScreenFreq
- level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put
-level2? not
- {
- /setcmykcolor where not
- {
- /setcmykcolor
- {
- exch .11 mul add exch .59 mul add exch .3 mul add
- 1 exch sub setgray
- } def
- } if
- /currentcmykcolor where not
- {
- /currentcmykcolor
- {
- 0 0 0 1 currentgray sub
- } def
- } if
- /setoverprint where not
- {
- /setoverprint /pop load def
- } if
- /selectfont where not
- {
- /selectfont
- {
- exch findfont exch
- dup type /arraytype eq
- {
- makefont
- }
- {
- scalefont
- } ifelse
- setfont
- } bind def
- } if
- /cshow where not
- {
- /cshow
- {
- [
- 0 0 5 -1 roll aload pop
- ] cvx bind forall
- } bind def
- } if
- } if
- cleartomark
- /anyColor?
- {
- add add add 0 ne
- } bind def
- /testColor
- {
- gsave
- setcmykcolor currentcmykcolor
- grestore
- } bind def
- /testCMYKColorThrough
- {
- testColor anyColor?
- } bind def
- userdict /composite?
- 1 0 0 0 testCMYKColorThrough
- 0 1 0 0 testCMYKColorThrough
- 0 0 1 0 testCMYKColorThrough
- 0 0 0 1 testCMYKColorThrough
- and and and
- put
- composite? not
- {
- userdict begin
- gsave
- /cyan? 1 0 0 0 testCMYKColorThrough def
- /magenta? 0 1 0 0 testCMYKColorThrough def
- /yellow? 0 0 1 0 testCMYKColorThrough def
- /black? 0 0 0 1 testCMYKColorThrough def
- grestore
- /isCMYKSep? cyan? magenta? yellow? black? or or or def
- /customColor? isCMYKSep? not def
- end
- } if
- end defaultpacking setpacking
-%%EndResource
-%%BeginResource: procset Adobe_typography_AI5 1.0 1
-%%Title: (Typography Operators)
-%%Version: 1.0 1
-%%CreationDate:(6/10/1996) ()
-%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved)
-currentpacking true setpacking
-userdict /Adobe_typography_AI5 68 dict dup begin
-put
-/initialize
-{
- begin
- begin
- Adobe_typography_AI5 begin
- Adobe_typography_AI5
- {
- dup xcheck
- {
- bind
- } if
- pop pop
- } forall
- end
- end
- end
- Adobe_typography_AI5 begin
-} def
-/terminate
-{
- currentdict Adobe_typography_AI5 eq
- {
- end
- } if
-} def
-/modifyEncoding
-{
- /_tempEncode exch ddef
- /_pntr 0 ddef
- {
- counttomark -1 roll
- dup type dup /marktype eq
- {
- pop pop exit
- }
- {
- /nametype eq
- {
- _tempEncode /_pntr dup load dup 3 1 roll 1 add ddef 3 -1 roll
- put
- }
- {
- /_pntr exch ddef
- } ifelse
- } ifelse
- } loop
- _tempEncode
-} def
-/havefont
-{
- systemdict /languagelevel known
- {
- /Font resourcestatus dup
- { exch pop exch pop }
- if
- }
- {
- systemdict /FontDirectory get 1 index known
- { pop true }
- {
- systemdict /fileposition known
- {
- dup length 6 add exch
- Ss 6 250 getinterval
- cvs pop
- Ss exch 0 exch getinterval
- status
- { pop pop pop pop true }
- { false }
- ifelse
- }
- {
- pop false
- }
- ifelse
- }
- ifelse
- }
- ifelse
-} def
-/TE
-{
- StandardEncoding 256 array copy modifyEncoding
- /_nativeEncoding exch def
-} def
-/subststring {
- exch 2 index exch search
- {
- exch pop
- exch dup () eq
- {
- pop exch concatstring
- }
- {
- 3 -1 roll
- exch concatstring
- concatstring
- } ifelse
- exch pop true
- }
- {
- pop pop false
- } ifelse
-} def
-/concatstring {
- 1 index length 1 index length
- 1 index add
- string
- dup 0 5 index putinterval
- dup 2 index 4 index putinterval
- 4 1 roll pop pop pop
-} def
-%
-/TZ
-{
- dup type /arraytype eq
- {
- /_wv exch def
- }
- {
- /_wv 0 def
- } ifelse
- /_useNativeEncoding exch def
- 2 index havefont
- {
- 3 index
- 255 string
- cvs
-
- dup
- (_Symbol_)
- eq
- {
- pop
- 2 index
- findfont
-
- }
- {
- 1 index 0 eq
- {
- dup length 1 sub
- 1 exch
- getinterval
-
- cvn
- findfont
- }
- {
- pop 2 index findfont
- } ifelse
- } ifelse
- }
- {
- dup 1 eq
- {
- 2 index 64 string cvs
- dup (-90pv-RKSJ-) (-83pv-RKSJ-) subststring
- {
- exch pop dup havefont
- {
- findfont false
- }
- {
- pop true
- } ifelse
- }
- {
- pop dup
- (-90ms-RKSJ-) (-Ext-RKSJ-) subststring
- {
- exch pop dup havefont
- {
- findfont false
- }
- {
- pop true
- } ifelse
- }
- {
- pop pop true
- } ifelse
- } ifelse
- {
- 1 index 1 eq
- {
- /Ryumin-Light-Ext-RKSJ-V havefont
- {/Ryumin-Light-Ext-RKSJ-V}
- {/Courier}
- ifelse
- }
- {
- /Ryumin-Light-83pv-RKSJ-H havefont
- {/Ryumin-Light-83pv-RKSJ-H}
- {/Courier}
- ifelse
- } ifelse
- findfont
- [1 0 0.5 1 0 0] makefont
- } if
- }
- {
- /Courier findfont
- } ifelse
- } ifelse
- _wv type /arraytype eq
- {
- _wv makeblendedfont
- } if
- dup length 10 add dict
- begin
- mark exch
- {
- 1 index /FID ne
- {
- def
- } if
- cleartomark mark
- } forall
- pop
- /FontScript exch def
- /FontDirection exch def
- /FontRequest exch def
- /FontName exch def
- counttomark 0 eq
- {
- 1 _useNativeEncoding eq
- {
- /Encoding _nativeEncoding def
- } if
- cleartomark
- }
- {
- /Encoding load 256 array copy
- modifyEncoding /Encoding exch def
- } ifelse
- FontName currentdict
- end
- definefont pop
-} def
-/tr
-{
- _ax _ay 3 2 roll
-} def
-/trj
-{
- _cx _cy _sp _ax _ay 6 5 roll
-} def
-/a0
-{
- /Tx
- {
- dup
- currentpoint 3 2 roll
- tr _psf
- newpath moveto
- tr _ctm _pss
- } ddef
- /Tj
- {
- dup
- currentpoint 3 2 roll
- trj _pjsf
- newpath moveto
- trj _ctm _pjss
- } ddef
-} def
-/a1
-{
-W B
-} def
-/e0
-{
- /Tx
- {
- tr _psf
- } ddef
- /Tj
- {
- trj _pjsf
- } ddef
-} def
-/e1
-{
-W F
-} def
-/i0
-{
- /Tx
- {
- tr sp
- } ddef
- /Tj
- {
- trj jsp
- } ddef
-} def
-/i1
-{
- W N
-} def
-/o0
-{
- /Tx
- {
- tr sw rmoveto
- } ddef
- /Tj
- {
- trj swj rmoveto
- } ddef
-} def
-/r0
-{
- /Tx
- {
- tr _ctm _pss
- } ddef
- /Tj
- {
- trj _ctm _pjss
- } ddef
-} def
-/r1
-{
-W S
-} def
-/To
-{
- pop _ctm currentmatrix pop
-} def
-/TO
-{
- iTe _ctm setmatrix newpath
-} def
-/Tp
-{
- pop _tm astore pop _ctm setmatrix
- _tDict begin
- /W
- {
- } def
- /h
- {
- } def
-} def
-/TP
-{
- end
- iTm 0 0 moveto
-} def
-/Tr
-{
- _render 3 le
- {
- currentpoint newpath moveto
- } if
- dup 8 eq
- {
- pop 0
- }
- {
- dup 9 eq
- {
- pop 1
- } if
- } ifelse
- dup /_render exch ddef
- _renderStart exch get load exec
-} def
-/iTm
-{
- _ctm setmatrix _tm concat
- _shift aload pop _lineorientation 1 eq { exch } if translate
- _scale aload pop _lineorientation 1 eq _yokoorientation 1 eq or { exch } if scale
-} def
-/Tm
-{
- _tm astore pop iTm 0 0 moveto
-} def
-/Td
-{
- _mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto
-} def
-/iTe
-{
- _render -1 eq
- {
- }
- {
- _renderEnd _render get dup null ne
- {
- load exec
- }
- {
- pop
- } ifelse
- } ifelse
- /_render -1 ddef
-} def
-/Ta
-{
- pop
-} def
-/Tf
-{
- 1 index type /nametype eq
- {
- dup 0.75 mul 1 index 0.25 mul neg
- } if
- /_fontDescent exch ddef
- /_fontAscent exch ddef
- /_fontSize exch ddef
- /_fontRotateAdjust _fontAscent _fontDescent add 2 div neg ddef
- /_fontHeight _fontSize ddef
- findfont _fontSize scalefont setfont
-} def
-/Tl
-{
- pop neg 0 exch
- _leading astore pop
-} def
-/Tt
-{
- pop
-} def
-/TW
-{
- 3 npop
-} def
-/Tw
-{
- /_cx exch ddef
-} def
-/TC
-{
- 3 npop
-} def
-/Tc
-{
- /_ax exch ddef
-} def
-/Ts
-{
- 0 exch
- _shift astore pop
- currentpoint
- iTm
- moveto
-} def
-/Ti
-{
- 3 npop
-} def
-/Tz
-{
- count 1 eq { 100 } if
- 100 div exch 100 div exch
- _scale astore pop
- iTm
-} def
-/TA
-{
- pop
-} def
-/Tq
-{
- pop
-} def
-/Tg
-{
- pop
-} def
-/TG
-{
- pop
-} def
-/Tv
-{
- /_lineorientation exch ddef
-} def
-/TV
-{
- /_charorientation exch ddef
-} def
-/Ty
-{
- dup /_yokoorientation exch ddef 1 sub neg Tv
-} def
-/TY
-{
- pop
-} def
-/T~
-{
- Tx
-} def
-/Th
-{
- pop pop pop pop pop
-} def
-/TX
-{
- pop
-} def
-/Tk
-{
- _fontSize mul 1000 div
- _lineorientation 0 eq { neg 0 } { 0 exch } ifelse
- rmoveto
- pop
-} def
-/TK
-{
- 2 npop
-} def
-/T*
-{
- _leading aload pop
- _lineorientation 0 ne { exch } if
- Td
-} def
-/T*-
-{
- _leading aload pop
- _lineorientation 0 ne { exch } if
- exch neg exch neg
- Td
-} def
-/T-
-{
- _ax neg 0 rmoveto
- _lineorientation 1 eq _charorientation 0 eq and { 1 TV _hyphen Tx 0 TV } { _hyphen Tx } ifelse
-} def
-/T+
-{
-} def
-/TR
-{
- _ctm currentmatrix pop
- _tm astore pop
- iTm 0 0 moveto
-} def
-/TS
-{
- currentfont 3 1 roll
- /_Symbol_ findfont _fontSize scalefont setfont
-
- 0 eq
- {
- Tx
- }
- {
- Tj
- } ifelse
- setfont
-} def
-/Xb
-{
- pop pop
-} def
-/Tb /Xb load def
-/Xe
-{
- pop pop pop pop
-} def
-/Te /Xe load def
-/XB
-{
-} def
-/TB /XB load def
-currentdict readonly pop
-end
-setpacking
-%
-/X^
-{
- currentfont 5 1 roll
- dup havefont
- {
- findfont _fontSize scalefont setfont
- }
- {
- pop
- exch
- } ifelse
- 2 index 0 eq
- {
- Tx
- }
- {
- Tj
- } ifelse
- pop pop
- setfont
-} def
-/T^ /X^ load def
-%%EndResource
-%%BeginProcSet: Adobe_ColorImage_AI6 1.3 0
-userdict /Adobe_ColorImage_AI6 known not
-{
- userdict /Adobe_ColorImage_AI6 53 dict put
-} if
-userdict /Adobe_ColorImage_AI6 get begin
-/initialize {
- Adobe_ColorImage_AI6 begin
- Adobe_ColorImage_AI6 {
- dup type /arraytype eq {
- dup xcheck {
- bind
- } if
- } if
- pop pop
- } forall
-} def
-/terminate { end } def
-currentdict /Adobe_ColorImage_AI6_Vars known not {
- /Adobe_ColorImage_AI6_Vars 41 dict def
-} if
-Adobe_ColorImage_AI6_Vars begin
- /plateindex -1 def
- /_newproc null def
- /_proc1 null def
- /_proc2 null def
- /sourcearray 4 array def
- /_ptispace null def
- /_ptiname null def
- /_pti0 0 def
- /_pti1 0 def
- /_ptiproc null def
- /_ptiscale 0 def
- /_pticomps 0 def
- /_ptibuf 0 string def
- /_gtigray 0 def
- /_cticmyk null def
- /_rtirgb null def
- /XIEnable true def
- /XIType 0 def
- /XIEncoding 0 def
- /XICompression 0 def
- /XIChannelCount 0 def
- /XIBitsPerPixel 0 def
- /XIImageHeight 0 def
- /XIImageWidth 0 def
- /XIImageMatrix null def
- /XIRowBytes 0 def
- /XIFile null def
- /XIBuffer1 null def
- /XIBuffer2 null def
- /XIBuffer3 null def
- /XIDataProc null def
- /XIColorSpace /DeviceGray def
- /XIColorValues 0 def
- /XIPlateList false def
-end
-/ci6colorimage /colorimage where {/colorimage get}{null} ifelse def
-/ci6image systemdict /image get def
-/ci6curtransfer systemdict /currenttransfer get def
-/ci6curoverprint /currentoverprint where {/currentoverprint get}{{_of}} ifelse def
-/ci6foureq {
- 4 index ne {
- pop pop pop false
- }{
- 4 index ne {
- pop pop false
- }{
- 4 index ne {
- pop false
- }{
- 4 index eq
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6testplate {
- Adobe_ColorImage_AI6_Vars begin
- /plateindex -1 def
- /setcmykcolor where {
- pop
- gsave
- 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub
- 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub
- 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub
- 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub
- grestore
- 1 0 0 0 ci6foureq {
- /plateindex 0 def
- }{
- 0 1 0 0 ci6foureq {
- /plateindex 1 def
- }{
- 0 0 1 0 ci6foureq {
- /plateindex 2 def
- }{
- 0 0 0 1 ci6foureq {
- /plateindex 3 def
- }{
- 0 0 0 0 ci6foureq {
- /plateindex 5 def
- } if
- } ifelse
- } ifelse
- } ifelse
- } ifelse
- pop pop pop pop
- } if
- plateindex
- end
-} def
-/ci6concatprocs {
- /packedarray where {
- pop dup type /packedarraytype eq 2 index type
- /packedarraytype eq or
- }{
- false
- } ifelse
- {
- /_proc2 exch cvlit def
- /_proc1 exch cvlit def
- _proc1 aload pop
- _proc2 aload pop
- _proc1 length
- _proc2 length add
- packedarray cvx
- }{
- /_proc2 exch cvlit def
- /_proc1 exch cvlit def
- /_newproc _proc1 length _proc2 length add array def
- _newproc 0 _proc1 putinterval
- _newproc _proc1 length _proc2 putinterval
- _newproc cvx
- } ifelse
-} def
-/ci6istint {
- type /arraytype eq
-} def
-/ci6isspot {
- dup type /arraytype eq {
- dup length 1 sub get /Separation eq
- }{
- pop false
- } ifelse
-} def
-/ci6spotname {
- dup ci6isspot {dup length 2 sub get}{pop ()} ifelse
-} def
-/ci6altspace {
- aload pop pop pop ci6colormake
-} def
-/ci6numcomps {
- dup /DeviceGray eq {
- pop 1
- }{
- dup /DeviceRGB eq {
- pop 3
- }{
- /DeviceCMYK eq {
- 4
- }{
- 1
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6marksplate {
- dup /DeviceGray eq {
- pop plateindex 3 eq
- }{
- dup /DeviceRGB eq {
- pop plateindex 5 ne
- }{
- dup /DeviceCMYK eq {
- pop plateindex 5 ne
- }{
- dup ci6isspot {
- /findcmykcustomcolor where {
- pop
- dup length 2 sub get
- 0.1 0.1 0.1 0.1 5 -1 roll
- findcmykcustomcolor 1 setcustomcolor
- systemdict /currentgray get exec
- 1 ne
- }{
- pop plateindex 5 ne
- } ifelse
- }{
- pop plateindex 5 ne
- } ifelse
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6colormake {
- dup ci6numcomps
- exch 1 index 2 add 1 roll
- dup 1 eq {pop}{array astore} ifelse
- exch
-} def
-/ci6colorexpand {
- dup ci6spotname exch
- dup ci6istint {
- ci6altspace
- exch 4 1 roll
- }{
- 1 3 1 roll
- } ifelse
-} def
-/ci6colortint {
- dup /DeviceGray eq {
- 3 1 roll 1 exch sub mul 1 exch sub exch
- }{
- dup /DeviceRGB eq {
- 3 1 roll {1 exch sub 1 index mul 1 exch sub exch} forall pop 3 array astore exch
- }{
- dup /DeviceCMYK eq {
- 3 1 roll {1 index mul exch} forall pop 4 array astore exch
- }{
- 3 1 roll mul exch
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6colortocmyk {
- dup /DeviceGray eq {
- pop 1 exch sub 0 0 0 4 -1 roll 4 array astore
- }{
- dup /DeviceRGB eq {
- pop aload pop _rgbtocmyk 4 array astore
- }{
- dup /DeviceCMYK eq {
- pop
- }{
- ci6altspace ci6colortint ci6colortocmyk
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6makeimagedict {
- 7 dict begin
- /ImageType 1 def
- /Decode exch def
- /DataSource exch def
- /ImageMatrix exch def
- /BitsPerComponent exch def
- /Height exch def
- /Width exch def
- currentdict end
-} def
-/ci6stringinvert {
- 0 1 2 index length 1 sub {
- dup 2 index exch get 255 exch sub 2 index 3 1 roll put
- } for
-} def
-/ci6stringknockout {
- 0 1 2 index length 1 sub {
- 255 2 index 3 1 roll put
- } for
-} def
-/ci6stringapply {
- 0 1 4 index length 1 sub {
- dup
- 4 index exch get
- 3 index 3 1 roll
- 3 index exec
- } for
- pop exch pop
-} def
-/ci6walkrgbstring {
- 0 3 index
- dup length 1 sub 0 3 3 -1 roll {
- 3 getinterval {} forall
- 5 index exec
- 3 index
- } for
-
- 5 {pop} repeat
-} def
-/ci6walkcmykstring
-{
- 0 3 index
- dup length 1 sub 0 4 3 -1 roll {
- 4 getinterval {} forall
-
- 6 index exec
-
- 3 index
-
- } for
-
- 5 { pop } repeat
-
-} def
-/ci6putrgbtograystr
-{
- .11 mul exch
-
- .59 mul add exch
-
- .3 mul add
-
- cvi 3 copy put
-
- pop 1 add
-} def
-/ci6putcmyktograystr
-{
- exch .11 mul add
-
- exch .59 mul add
-
- exch .3 mul add
-
- dup 255 gt { pop 255 } if
-
- 255 exch sub cvi 3 copy put
-
- pop 1 add
-} def
-/ci6rgbtograyproc {
- Adobe_ColorImage_AI6_Vars begin
- sourcearray 0 get exec
- XIBuffer3
- dup 3 1 roll
-
- /ci6putrgbtograystr load exch
- ci6walkrgbstring
- end
-} def
-/ci6cmyktograyproc {
- Adobe_ColorImage_AI6_Vars begin
- sourcearray 0 get exec
- XIBuffer3
- dup 3 1 roll
-
- /ci6putcmyktograystr load exch
- ci6walkcmykstring
- end
-} def
-/ci6separatecmykproc {
- Adobe_ColorImage_AI6_Vars begin
- sourcearray 0 get exec
-
- XIBuffer3
-
- 0 2 index
-
- plateindex 4 2 index length 1 sub {
- get 255 exch sub
-
- 3 copy put pop 1 add
-
- 2 index
- } for
- pop pop exch pop
- end
-} def
-
-/ci6compositeimage {
- dup 1 eq {
- pop pop image
- }{
- /ci6colorimage load null ne {
- ci6colorimage
- }{
- 3 1 roll pop
- sourcearray 0 3 -1 roll put
- 3 eq {/ci6rgbtograyproc}{/ci6cmyktograyproc} ifelse load
- image
- } ifelse
- } ifelse
-} def
-/ci6knockoutimage {
- gsave
- 0 ci6curtransfer exec 1 ci6curtransfer exec
- eq {
- 0 ci6curtransfer exec 0.5 lt
- }{
- 0 ci6curtransfer exec 1 ci6curtransfer exec gt
- } ifelse
- {{pop 0}}{{pop 1}} ifelse
- systemdict /settransfer get exec
- ci6compositeimage
- grestore
-} def
-/ci6drawimage {
- ci6testplate -1 eq {
- pop ci6compositeimage
- }{
- dup type /arraytype eq {
- dup length plateindex gt {plateindex get}{pop false} ifelse
- }{
- {
- true
- }{
- dup 1 eq {plateindex 3 eq}{plateindex 3 le} ifelse
- } ifelse
- } ifelse
- {
- dup 1 eq {
- pop pop ci6image
- }{
- dup 3 eq {
- ci6compositeimage
- }{
- pop pop
- sourcearray 0 3 -1 roll put
- /ci6separatecmykproc load
- ci6image
- } ifelse
- } ifelse
- }{
- ci6curoverprint {
- 7 {pop} repeat
- }{
- ci6knockoutimage
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6proctintimage {
- /_ptispace exch store /_ptiname exch store /_pti1 exch store /_pti0 exch store /_ptiproc exch store
- /_pticomps _ptispace ci6numcomps store
- /_ptiscale _pti1 _pti0 sub store
- level2? {
- _ptiname length 0 gt version cvr 2012 ge and {
- [/Separation _ptiname _ptispace {_ptiproc}] setcolorspace
- [_pti0 _pti1] ci6makeimagedict ci6image
- }{
- [/Indexed _ptispace 255 {255 div _ptiscale mul _pti0 add _ptiproc}] setcolorspace
- [0 255] ci6makeimagedict ci6image
- } ifelse
- }{
- _pticomps 1 eq {
- {
- dup
- {
- 255 div _ptiscale mul _pti0 add _ptiproc 255 mul cvi put
- } ci6stringapply
- } ci6concatprocs ci6image
- }{
- {
- dup length _pticomps mul dup _ptibuf length ne {/_ptibuf exch string store}{pop} ifelse
- _ptibuf {
- exch _pticomps mul exch 255 div _ptiscale mul _pti0 add _ptiproc
- _pticomps 2 add -2 roll
- _pticomps 1 sub -1 0 {
- 1 index add 2 index exch
- 5 -1 roll
- 255 mul cvi put
- } for
- pop pop
- } ci6stringapply
- } ci6concatprocs false _pticomps
- /ci6colorimage load null eq {7 {pop} repeat}{ci6colorimage} ifelse
- } ifelse
- } ifelse
-} def
-/ci6graytintimage {
- /_gtigray 5 -1 roll store
- {1 _gtigray sub mul 1 exch sub} 4 1 roll
- /DeviceGray ci6proctintimage
-} def
-/ci6cmyktintimage {
- /_cticmyk 5 -1 roll store
- {_cticmyk {1 index mul exch} forall pop} 4 1 roll
- /DeviceCMYK ci6proctintimage
-} def
-/ci6rgbtintimage {
- /_rtirgb 5 -1 roll store
- {_rtirgb {1 exch sub 1 index mul 1 exch sub exch} forall pop} 4 1 roll
- /DeviceRGB ci6proctintimage
-} def
-/ci6tintimage {
- ci6testplate -1 eq {
- ci6colorexpand
- 3 -1 roll 5 -1 roll {0}{0 exch} ifelse 4 2 roll
- dup /DeviceGray eq {
- pop ci6graytintimage
- }{
- dup /DeviceRGB eq {
- pop ci6rgbtintimage
- }{
- pop ci6cmyktintimage
- } ifelse
- } ifelse
- }{
- dup ci6marksplate {
- plateindex 5 lt {
- ci6colortocmyk plateindex get
- dup 0 eq ci6curoverprint and {
- 7 {pop} repeat
- }{
- 1 exch sub
- exch {1 0}{0 1} ifelse () ci6graytintimage
- } ifelse
- }{
- pop exch {0}{0 exch} ifelse 0 3 1 roll () ci6graytintimage
- } ifelse
- }{
- ci6curoverprint {
- 8 {pop} repeat
- }{
- pop pop pop
- {pop 1} 0 1 () /DeviceGray ci6proctintimage
- } ifelse
- } ifelse
- } ifelse
-} def
-/XINullImage {
-} def
-/XIImageMask {
- XIImageWidth XIImageHeight false
- [XIImageWidth 0 0 XIImageHeight neg 0 0]
- /XIDataProc load
- imagemask
-} def
-/XIImageTint {
- XIImageWidth XIImageHeight XIBitsPerPixel
- [XIImageWidth 0 0 XIImageHeight neg 0 0]
- /XIDataProc load
- XIType 3 eq XIColorValues XIColorSpace ci6tintimage
-} def
-/XIImage {
- XIImageWidth XIImageHeight XIBitsPerPixel
- [XIImageWidth 0 0 XIImageHeight neg 0 0]
- /XIDataProc load
- false XIChannelCount XIPlateList ci6drawimage
-} def
-/XG {
- pop pop
-} def
-/XF {
- 13 {pop} repeat
-} def
-/Xh {
- Adobe_ColorImage_AI6_Vars begin
- gsave
- /XIType exch def
- /XIImageHeight exch def
- /XIImageWidth exch def
- /XIImageMatrix exch def
- 0 0 moveto
- XIImageMatrix concat
- XIImageWidth XIImageHeight scale
-
- /_lp /null ddef
- _fc
- /_lp /imagemask ddef
- end
-} def
-/XH {
- Adobe_ColorImage_AI6_Vars begin
- grestore
- end
-} def
-/XIEnable {
- Adobe_ColorImage_AI6_Vars /XIEnable 3 -1 roll put
-} def
-/XC {
- Adobe_ColorImage_AI6_Vars begin
- ci6colormake
- /XIColorSpace exch def
- /XIColorValues exch def
- end
-} def
-/XIPlates {
- Adobe_ColorImage_AI6_Vars begin
- /XIPlateList exch def
- end
-} def
-/XI
-{
- Adobe_ColorImage_AI6_Vars begin
- gsave
- /XIType exch def
- cvi dup
- 256 idiv /XICompression exch store
- 256 mod /XIEncoding exch store
- pop pop
- /XIChannelCount exch def
- /XIBitsPerPixel exch def
- /XIImageHeight exch def
- /XIImageWidth exch def
- pop pop pop pop
- /XIImageMatrix exch def
- XIBitsPerPixel 1 eq {
- XIImageWidth 8 div ceiling cvi
- }{
- XIImageWidth XIChannelCount mul
- } ifelse
- /XIRowBytes exch def
- XIEnable {
- /XIBuffer3 XIImageWidth string def
- XICompression 0 eq {
- /XIBuffer1 XIRowBytes string def
- XIEncoding 0 eq {
- {currentfile XIBuffer1 readhexstring pop}
- }{
- {currentfile XIBuffer1 readstring pop}
- } ifelse
- }{
- /XIBuffer1 256 string def
- /XIBuffer2 XIRowBytes string def
- {currentfile XIBuffer1 readline pop (%) anchorsearch {pop} if}
- /ASCII85Decode filter /DCTDecode filter
- /XIFile exch def
- {XIFile XIBuffer2 readstring pop}
- } ifelse
- /XIDataProc exch def
-
- XIType 1 ne {
- 0 setgray
- } if
- XIType 1 eq {
- XIImageMask
- }{
- XIType 2 eq XIType 3 eq or {
- XIImageTint
- }{
- XIImage
- } ifelse
- } ifelse
- }{
- XINullImage
- } ifelse
- /XIPlateList false def
- grestore
- end
-} def
-end
-%%EndProcSet
-%%BeginResource: procset Adobe_Illustrator_AI5 1.3 0
-%%Title: (Adobe Illustrator (R) Version 8.0 Full Prolog)
-%%Version: 1.3 0
-%%CreationDate: (3/7/1994) ()
-%%Copyright: ((C) 1987-1998 Adobe Systems Incorporated All Rights Reserved)
-currentpacking true setpacking
-userdict /Adobe_Illustrator_AI5_vars 112 dict dup begin
-put
-/_?cmyk false def
-/_eo false def
-/_lp /none def
-/_pf
-{
-} def
-/_ps
-{
-} def
-/_psf
-{
-} def
-/_pss
-{
-} def
-/_pjsf
-{
-} def
-/_pjss
-{
-} def
-/_pola 0 def
-/_doClip 0 def
-/cf currentflat def
-/_lineorientation 0 def
-/_charorientation 0 def
-/_yokoorientation 0 def
-/_tm matrix def
-/_renderStart
-[
-/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0
-] def
-/_renderEnd
-[
-null null null null /i1 /i1 /i1 /i1
-] def
-/_render -1 def
-/_shift [0 0] def
-/_ax 0 def
-/_ay 0 def
-/_cx 0 def
-/_cy 0 def
-/_leading
-[
-0 0
-] def
-/_ctm matrix def
-/_mtx matrix def
-/_sp 16#020 def
-/_hyphen (-) def
-/_fontSize 0 def
-/_fontAscent 0 def
-/_fontDescent 0 def
-/_fontHeight 0 def
-/_fontRotateAdjust 0 def
-/Ss 256 string def
-Ss 0 (fonts/) putinterval
-/_cnt 0 def
-/_scale [1 1] def
-/_nativeEncoding 0 def
-/_useNativeEncoding 0 def
-/_tempEncode 0 def
-/_pntr 0 def
-/_tDict 2 dict def
-/_hfname 100 string def
-/_hffound false def
-/Tx
-{
-} def
-/Tj
-{
-} def
-/CRender
-{
-} def
-/_AI3_savepage
-{
-} def
-/_gf null def
-/_cf 4 array def
-/_rgbf 3 array def
-/_if null def
-/_of false def
-/_fc
-{
-} def
-/_gs null def
-/_cs 4 array def
-/_rgbs 3 array def
-/_is null def
-/_os false def
-/_sc
-{
-} def
-/_pd 1 dict def
-/_ed 15 dict def
-/_pm matrix def
-/_fm null def
-/_fd null def
-/_fdd null def
-/_sm null def
-/_sd null def
-/_sdd null def
-/_i null def
-/_lobyte 0 def
-/_hibyte 0 def
-/_cproc null def
-/_cscript 0 def
-/_hvax 0 def
-/_hvay 0 def
-/_hvwb 0 def
-/_hvcx 0 def
-/_hvcy 0 def
-/_bitfont null def
-/_bitlobyte 0 def
-/_bithibyte 0 def
-/_bitkey null def
-/_bitdata null def
-/_bitindex 0 def
-/discardSave null def
-/buffer 256 string def
-/beginString null def
-/endString null def
-/endStringLength null def
-/layerCnt 1 def
-/layerCount 1 def
-/perCent (%) 0 get def
-/perCentSeen? false def
-/newBuff null def
-/newBuffButFirst null def
-/newBuffLast null def
-/clipForward? false def
-end
-userdict /Adobe_Illustrator_AI5 known not {
- userdict /Adobe_Illustrator_AI5 100 dict put
-} if
-userdict /Adobe_Illustrator_AI5 get begin
-/initialize
-{
- Adobe_Illustrator_AI5 dup begin
- Adobe_Illustrator_AI5_vars begin
- /_aicmykps where {pop /_?cmyk _aicmykps def}if
- discardDict
- {
- bind pop pop
- } forall
- dup /nc get begin
- {
- dup xcheck 1 index type /operatortype ne and
- {
- bind
- } if
- pop pop
- } forall
- end
- newpath
-} def
-/terminate
-{
- end
- end
-} def
-/_
-null def
-/ddef
-{
- Adobe_Illustrator_AI5_vars 3 1 roll put
-} def
-/xput
-{
- dup load dup length exch maxlength eq
- {
- dup dup load dup
- length 2 mul dict copy def
- } if
- load begin
- def
- end
-} def
-/npop
-{
- {
- pop
- } repeat
-} def
-/hswj
-{
- dup stringwidth 3 2 roll
- {
- _hvwb eq { exch _hvcx add exch _hvcy add } if
- exch _hvax add exch _hvay add
- } cforall
-} def
-/vswj
-{
- 0 0 3 -1 roll
- {
- dup 255 le
- _charorientation 1 eq
- and
- {
- dup cstring stringwidth 5 2 roll
- _hvwb eq { exch _hvcy sub exch _hvcx sub } if
- exch _hvay sub exch _hvax sub
- 4 -1 roll sub exch
- 3 -1 roll sub exch
- }
- {
- _hvwb eq { exch _hvcy sub exch _hvcx sub } if
- exch _hvay sub exch _hvax sub
- _fontHeight sub
- } ifelse
- } cforall
-} def
-/swj
-{
- 6 1 roll
- /_hvay exch ddef
- /_hvax exch ddef
- /_hvwb exch ddef
- /_hvcy exch ddef
- /_hvcx exch ddef
- _lineorientation 0 eq { hswj } { vswj } ifelse
-} def
-/sw
-{
- 0 0 0 6 3 roll swj
-} def
-/vjss
-{
- 4 1 roll
- {
- dup cstring
- dup length 1 eq
- _charorientation 1 eq
- and
- {
- -90 rotate
- currentpoint
- _fontRotateAdjust add
- moveto
- gsave
- false charpath currentpoint
- 5 index setmatrix stroke
- grestore
- _fontRotateAdjust sub
- moveto
- _sp eq
- {
- 5 index 5 index rmoveto
- } if
- 2 copy rmoveto
- 90 rotate
- }
- {
- currentpoint
- _fontHeight sub
- 5 index sub
- 3 index _sp eq
- {
- 9 index sub
- } if
-
- currentpoint
- exch 4 index stringwidth pop 2 div sub
- exch _fontAscent sub
- moveto
-
- gsave
- 2 index false charpath
- 6 index setmatrix stroke
- grestore
-
- moveto pop pop
- } ifelse
- } cforall
- 6 npop
-} def
-/hjss
-{
- 4 1 roll
- {
- dup cstring
- gsave
- false charpath currentpoint
- 5 index setmatrix stroke
- grestore
- moveto
- _sp eq
- {
- 5 index 5 index rmoveto
- } if
- 2 copy rmoveto
- } cforall
- 6 npop
-} def
-/jss
-{
- _lineorientation 0 eq { hjss } { vjss } ifelse
-} def
-/ss
-{
- 0 0 0 7 3 roll jss
-} def
-/vjsp
-{
- 4 1 roll
- {
- dup cstring
- dup length 1 eq
- _charorientation 1 eq
- and
- {
- -90 rotate
- currentpoint
- _fontRotateAdjust add
- moveto
- false charpath
- currentpoint
- _fontRotateAdjust sub
- moveto
- _sp eq
- {
- 5 index 5 index rmoveto
- } if
- 2 copy rmoveto
- 90 rotate
- }
- {
- currentpoint
- _fontHeight sub
- 5 index sub
- 3 index _sp eq
- {
- 9 index sub
- } if
-
- currentpoint
- exch 4 index stringwidth pop 2 div sub
- exch _fontAscent sub
- moveto
-
- 2 index false charpath
-
- moveto pop pop
- } ifelse
- } cforall
- 6 npop
-} def
-/hjsp
-{
- 4 1 roll
- {
- dup cstring
- false charpath
- _sp eq
- {
- 5 index 5 index rmoveto
- } if
- 2 copy rmoveto
- } cforall
- 6 npop
-} def
-/jsp
-{
- matrix currentmatrix
- _lineorientation 0 eq {hjsp} {vjsp} ifelse
-} def
-/sp
-{
- matrix currentmatrix
- 0 0 0 7 3 roll
- _lineorientation 0 eq {hjsp} {vjsp} ifelse
-} def
-/pl
-{
- transform
- 0.25 sub round 0.25 add exch
- 0.25 sub round 0.25 add exch
- itransform
-} def
-/setstrokeadjust where
-{
- pop true setstrokeadjust
- /c
- {
- curveto
- } def
- /C
- /c load def
- /v
- {
- currentpoint 6 2 roll curveto
- } def
- /V
- /v load def
- /y
- {
- 2 copy curveto
- } def
- /Y
- /y load def
- /l
- {
- lineto
- } def
- /L
- /l load def
- /m
- {
- moveto
- } def
-}
-{
- /c
- {
- pl curveto
- } def
- /C
- /c load def
- /v
- {
- currentpoint 6 2 roll pl curveto
- } def
- /V
- /v load def
- /y
- {
- pl 2 copy curveto
- } def
- /Y
- /y load def
- /l
- {
- pl lineto
- } def
- /L
- /l load def
- /m
- {
- pl moveto
- } def
-} ifelse
-/d
-{
- setdash
-} def
-/cf
-{
-} def
-/i
-{
- dup 0 eq
- {
- pop cf
- } if
- setflat
-} def
-/j
-{
- setlinejoin
-} def
-/J
-{
- setlinecap
-} def
-/M
-{
- setmiterlimit
-} def
-/w
-{
- setlinewidth
-} def
-/XR
-{
- 0 ne
- /_eo exch ddef
-} def
-/H
-{
-} def
-/h
-{
- closepath
-} def
-/N
-{
- _pola 0 eq
- {
- _doClip 1 eq
- {
- _eo {eoclip} {clip} ifelse /_doClip 0 ddef
- } if
- newpath
- }
- {
- /CRender
- {
- N
- } ddef
- } ifelse
-} def
-/n
-{
- N
-} def
-/F
-{
- _pola 0 eq
- {
- _doClip 1 eq
- {
- gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc
- /_doClip 0 ddef
- }
- {
- _pf
- } ifelse
- }
- {
- /CRender
- {
- F
- } ddef
- } ifelse
-} def
-/f
-{
- closepath
- F
-} def
-/S
-{
- _pola 0 eq
- {
- _doClip 1 eq
- {
- gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc
- /_doClip 0 ddef
- }
- {
- _ps
- } ifelse
- }
- {
- /CRender
- {
- S
- } ddef
- } ifelse
-} def
-/s
-{
- closepath
- S
-} def
-/B
-{
- _pola 0 eq
- {
- _doClip 1 eq
- gsave F grestore
- {
- gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc
- /_doClip 0 ddef
- }
- {
- S
- } ifelse
- }
- {
- /CRender
- {
- B
- } ddef
- } ifelse
-} def
-/b
-{
- closepath
- B
-} def
-/W
-{
- /_doClip 1 ddef
-} def
-/*
-{
- count 0 ne
- {
- dup type /stringtype eq
- {
- pop
- } if
- } if
- newpath
-} def
-/u
-{
-} def
-/U
-{
-} def
-/q
-{
- _pola 0 eq
- {
- gsave
- } if
-} def
-/Q
-{
- _pola 0 eq
- {
- grestore
- } if
-} def
-/*u
-{
- _pola 1 add /_pola exch ddef
-} def
-/*U
-{
- _pola 1 sub /_pola exch ddef
- _pola 0 eq
- {
- CRender
- } if
-} def
-/D
-{
- pop
-} def
-/*w
-{
-} def
-/*W
-{
-} def
-/`
-{
- /_i save ddef
- clipForward?
- {
- nulldevice
- } if
- 6 1 roll 4 npop
- concat pop
- userdict begin
- /showpage
- {
- } def
- 0 setgray
- 0 setlinecap
- 1 setlinewidth
- 0 setlinejoin
- 10 setmiterlimit
- [] 0 setdash
- /setstrokeadjust where {pop false setstrokeadjust} if
- newpath
- 0 setgray
- false setoverprint
-} def
-/~
-{
- end
- _i restore
-} def
-/_rgbtocmyk
-{
- 3
- {
- 1 exch sub 3 1 roll
- } repeat
- 3 copy 1 4 1 roll
- 3
- {
- 3 index 2 copy gt
- {
- exch
- } if
- pop 4 1 roll
- } repeat
- pop pop pop
- 4 1 roll
- 3
- {
- 3 index sub
- 3 1 roll
- } repeat
- 4 -1 roll
-} def
-/setrgbfill
-{
- _rgbf astore pop
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _rgbf aload pop setrgbcolor
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/setrgbstroke
-{
- _rgbs astore pop
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _rgbs aload pop setrgbcolor
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/O
-{
- 0 ne
- /_of exch ddef
- /_lp /none ddef
-} def
-/R
-{
- 0 ne
- /_os exch ddef
- /_lp /none ddef
-} def
-/g
-{
- /_gf exch ddef
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _gf setgray
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/G
-{
- /_gs exch ddef
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _gs setgray
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/k
-{
- _cf astore pop
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _cf aload pop setcmykcolor
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/K
-{
- _cs astore pop
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _cs aload pop setcmykcolor
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/Xa
-{
- _?cmyk {
- 3 npop k
- }{
- setrgbfill 4 npop
- } ifelse
-} def
-/XA
-{
- _?cmyk {
- 3 npop K
- }{
- setrgbstroke 4 npop
- } ifelse
-} def
-/Xs
-{
- /_gf exch ddef
- 5 npop
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _gf setAIseparationgray
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/XS
-{
- /_gs exch ddef
- 5 npop
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _gs setAIseparationgray
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/Xx
-{
- exch
- /_gf exch ddef
- 0 eq {
- findcmykcustomcolor
- }{
- _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse
- {
- 4 1 roll 3 npop
- findcmykcustomcolor
- }{
- 8 -4 roll 4 npop
- findrgbcustomcolor
- } ifelse
- } ifelse
- /_if exch ddef
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _if _gf 1 exch sub setcustomcolor
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/XX
-{
- exch
- /_gs exch ddef
- 0 eq {
- findcmykcustomcolor
- }{
- _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse
- {
- 4 1 roll 3 npop
- findcmykcustomcolor
- }{
- 8 -4 roll 4 npop
- findrgbcustomcolor
- } ifelse
- } ifelse
- /_is exch ddef
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _is _gs 1 exch sub setcustomcolor
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/x
-{
- /_gf exch ddef
- findcmykcustomcolor
- /_if exch ddef
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _if _gf 1 exch sub setcustomcolor
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/X
-{
- /_gs exch ddef
- findcmykcustomcolor
- /_is exch ddef
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _is _gs 1 exch sub setcustomcolor
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/XK
-{
- 3 -1 roll pop
- 0 eq
- {
- 1 exch sub
- 3 {dup 3 1 roll mul 5 1 roll} repeat
- mul 4 1 roll
- K
- }
- {
- 1 exch sub 4 1 roll
- 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat
- 4 -1 roll pop
- XA
- } ifelse
-} def
-/Xk
-{
- 3 -1 roll pop
- 0 eq
- {
- 1 exch sub
- 3 {dup 3 1 roll mul 5 1 roll} repeat
- mul 4 1 roll
- k
- }
- {
- 1 exch sub 4 1 roll
- 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat
- 4 -1 roll pop
- Xa
- } ifelse
-} def
-/A
-{
- pop
-} def
-/annotatepage
-{
-userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse
-} def
-/XT {
- pop pop
-} def
-/Xt {
- pop
-} def
-/discard
-{
- save /discardSave exch store
- discardDict begin
- /endString exch store
- gt38?
- {
- 2 add
- } if
- load
- stopped
- pop
- end
- discardSave restore
-} bind def
-userdict /discardDict 7 dict dup begin
-put
-/pre38Initialize
-{
- /endStringLength endString length store
- /newBuff buffer 0 endStringLength getinterval store
- /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store
- /newBuffLast newBuff endStringLength 1 sub 1 getinterval store
-} def
-/shiftBuffer
-{
- newBuff 0 newBuffButFirst putinterval
- newBuffLast 0
- currentfile read not
- {
- stop
- } if
- put
-} def
-0
-{
- pre38Initialize
- mark
- currentfile newBuff readstring exch pop
- {
- {
- newBuff endString eq
- {
- cleartomark stop
- } if
- shiftBuffer
- } loop
- }
- {
- stop
- } ifelse
-} def
-1
-{
- pre38Initialize
- /beginString exch store
- mark
- currentfile newBuff readstring exch pop
- {
- {
- newBuff beginString eq
- {
- /layerCount dup load 1 add store
- }
- {
- newBuff endString eq
- {
- /layerCount dup load 1 sub store
- layerCount 0 eq
- {
- cleartomark stop
- } if
- } if
- } ifelse
- shiftBuffer
- } loop
- } if
-} def
-2
-{
- mark
- {
- currentfile buffer {readline} stopped {
- % assume error was due to overfilling the buffer
- }{
- not
- {
- stop
- } if
- endString eq {
- cleartomark stop
- } if
- }ifelse
- } loop
-} def
-3
-{
- /beginString exch store
- /layerCnt 1 store
- mark
- {
- currentfile buffer {readline} stopped {
- % assume error was due to overfilling the buffer
- }{
- not
- {
- stop
- } if
- dup beginString eq
- {
- pop /layerCnt dup load 1 add store
- }
- {
- endString eq
- {
- layerCnt 1 eq
- {
- cleartomark stop
- }
- {
- /layerCnt dup load 1 sub store
- } ifelse
- } if
- } ifelse
- }ifelse
- } loop
-} def
-end
-userdict /clipRenderOff 15 dict dup begin
-put
-{
- /n /N /s /S /f /F /b /B
-}
-{
- {
- _doClip 1 eq
- {
- /_doClip 0 ddef _eo {eoclip} {clip} ifelse
- } if
- newpath
- } def
-} forall
-/Tr /pop load def
-/Bb {} def
-/BB /pop load def
-/Bg {12 npop} def
-/Bm {6 npop} def
-/Bc /Bm load def
-/Bh {4 npop} def
-end
-/Lb
-{
- 6 npop
- 7 2 roll
- 5 npop
- 0 eq
- {
- 0 eq
- {
- (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard
- }
- {
-
- /clipForward? true def
-
- /Tx /pop load def
- /Tj /pop load def
-
- currentdict end clipRenderOff begin begin
- } ifelse
- }
- {
- 0 eq
- {
- save /discardSave exch store
- } if
- } ifelse
-} bind def
-/LB
-{
- discardSave dup null ne
- {
- restore
- }
- {
- pop
- clipForward?
- {
- currentdict
- end
- end
- begin
-
- /clipForward? false ddef
- } if
- } ifelse
-} bind def
-/Pb
-{
- pop pop
- 0 (%AI5_EndPalette) discard
-} bind def
-/Np
-{
- 0 (%AI5_End_NonPrinting--) discard
-} bind def
-/Ln /pop load def
-/Ap
-/pop load def
-/Ar
-{
- 72 exch div
- 0 dtransform dup mul exch dup mul add sqrt
- dup 1 lt
- {
- pop 1
- } if
- setflat
-} def
-/Mb
-{
- q
-} def
-/Md
-{
-} def
-/MB
-{
- Q
-} def
-/nc 4 dict def
-nc begin
-/setgray
-{
- pop
-} bind def
-/setcmykcolor
-{
- 4 npop
-} bind def
-/setrgbcolor
-{
- 3 npop
-} bind def
-/setcustomcolor
-{
- 2 npop
-} bind def
-currentdict readonly pop
-end
-/XP
-{
- 4 npop
-} bind def
-/XD
-{
- pop
-} bind def
-end
-setpacking
-%%EndResource
-%%BeginResource: procset Adobe_cshow 2.0 8
-%%Title: (Writing System Operators)
-%%Version: 2.0 8
-%%CreationDate: (1/23/89) ()
-%%Copyright: ((C) 1992-1996 Adobe Systems Incorporated All Rights Reserved)
-currentpacking true setpacking
-userdict /Adobe_cshow 14 dict dup begin put
-/initialize
-{
- Adobe_cshow begin
- Adobe_cshow
- {
- dup xcheck
- {
- bind
- } if
- pop pop
- } forall
- end
- Adobe_cshow begin
-} def
-/terminate
-{
-currentdict Adobe_cshow eq
- {
- end
- } if
-} def
-/cforall
-{
- /_lobyte 0 ddef
- /_hibyte 0 ddef
- /_cproc exch ddef
- /_cscript currentfont /FontScript known { currentfont /FontScript get } { -1 } ifelse ddef
- {
- /_lobyte exch ddef
- _hibyte 0 eq
- _cscript 1 eq
- _lobyte 129 ge _lobyte 159 le and
- _lobyte 224 ge _lobyte 252 le and or and
- _cscript 2 eq
- _lobyte 161 ge _lobyte 254 le and and
- _cscript 3 eq
- _lobyte 161 ge _lobyte 254 le and and
- _cscript 25 eq
- _lobyte 161 ge _lobyte 254 le and and
- _cscript -1 eq
- or or or or and
- {
- /_hibyte _lobyte ddef
- }
- {
- _hibyte 256 mul _lobyte add
- _cproc
- /_hibyte 0 ddef
- } ifelse
- } forall
-} def
-/cstring
-{
- dup 256 lt
- {
- (s) dup 0 4 3 roll put
- }
- {
- dup 256 idiv exch 256 mod
- (hl) dup dup 0 6 5 roll put 1 4 3 roll put
- } ifelse
-} def
-/clength
-{
- 0 exch
- { 256 lt { 1 } { 2 } ifelse add } cforall
-} def
-/hawidthshow
-{
- {
- dup cstring
- show
- _hvax _hvay rmoveto
- _hvwb eq { _hvcx _hvcy rmoveto } if
- } cforall
-} def
-/vawidthshow
-{
- {
- dup 255 le
- _charorientation 1 eq
- and
- {
- -90 rotate
- 0 _fontRotateAdjust rmoveto
- cstring
- _hvcx _hvcy _hvwb _hvax _hvay 6 -1 roll awidthshow
- 0 _fontRotateAdjust neg rmoveto
- 90 rotate
- }
- {
- currentpoint
- _fontHeight sub
- exch _hvay sub exch _hvax sub
- 2 index _hvwb eq { exch _hvcy sub exch _hvcx sub } if
- 3 2 roll
- cstring
- dup stringwidth pop 2 div neg _fontAscent neg rmoveto
- show
- moveto
- } ifelse
- } cforall
-} def
-/hvawidthshow
-{
- 6 1 roll
- /_hvay exch ddef
- /_hvax exch ddef
- /_hvwb exch ddef
- /_hvcy exch ddef
- /_hvcx exch ddef
- _lineorientation 0 eq { hawidthshow } { vawidthshow } ifelse
-} def
-/hvwidthshow
-{
- 0 0 3 -1 roll hvawidthshow
-} def
-/hvashow
-{
- 0 0 0 6 -3 roll hvawidthshow
-} def
-/hvshow
-{
- 0 0 0 0 0 6 -1 roll hvawidthshow
-} def
-currentdict readonly pop end
-setpacking
-%%EndResource
-%%BeginResource: procset Adobe_shading_AI8 1.0 0
-%%Title: (Adobe Illustrator 8 Shading Procset)
-%%Version: 1.0 0
-%%CreationDate: (12/17/97) ()
-%%Copyright: ((C) 1987-1997 Adobe Systems Incorporated All Rights Reserved)
-userdict /defaultpacking currentpacking put true setpacking
-userdict /Adobe_shading_AI8 10 dict dup begin put
-/initialize {
- Adobe_shading_AI8 begin
- Adobe_shading_AI8 bdprocs
- Mesh /initialize get exec
-} def
-/terminate {
- currentdict Adobe_shading_AI8 eq {
- end
- } if
-} def
-/bdprocs {
- {
- dup xcheck 1 index type /arraytype eq and {
- bind
- } if
- pop pop
- } forall
-} def
-/X! {pop} def
-/X# {pop pop} def
-/Mesh 40 dict def
-Mesh begin
-/initialize {
- Mesh bdprocs
- Mesh begin
- /emulate? /AI8MeshEmulation where {
- pop AI8MeshEmulation
- }{
- systemdict /shfill known not
- } ifelse def
- end
-} def
-/bd {
- shadingdict begin
-} def
-/paint {
- emulate? {
- end
- }{
- /_lp /none ddef _fc /_lp /none ddef
-
- /AIColorSpace AIColorSpace tocolorspace store
- /ColorSpace AIColorSpace topsspace store
-
- version_ge_3010.106 not systemdict /setsmoothness known and {
- 0.0001 setsmoothness
- } if
-
- composite? {
- /DataSource getdatasrc def
- Matrix concat
- currentdict end
- shfill
- }{
- AIColorSpace makesmarks AIPlateList markingplate and not isoverprint and {
- end
- }{
- /ColorSpace /DeviceGray store
- /Decode [0 1 0 1 0 1] store
- /DataSource getplatesrc def
- Matrix concat
- currentdict end
- shfill
- } ifelse
- } ifelse
- } ifelse
-} def
-/shadingdict 12 dict def
-shadingdict begin
- /ShadingType 6 def
- /BitsPerCoordinate 16 def
- /BitsPerComponent 8 def
- /BitsPerFlag 8 def
-end
-/datafile null def
-/databuf 256 string def
-/dataptr 0 def
-/srcspace null def
-/srcchannels 0 def
-/dstchannels 0 def
-/dstplate 0 def
-/srctodstcolor null def
-/getplatesrc {
- /srcspace AIColorSpace store
- /srcchannels AIColorSpace getnchannels store
- /dstchannels 1 store
- /dstplate getplateindex store
- /srctodstcolor srcspace makesmarks {
- dstplate 4 eq {
- {1 exch sub}
- }{
- {srcspace tocmyk 3 dstplate sub index 1 exch sub 5 1 roll 4 {pop} repeat}
- } ifelse
- }{
- {srcchannels {pop} repeat 1}
- } ifelse store
- /datafile getdatasrc store
- /rdpatch168 load DataLength () /SubFileDecode filter
-} def
-/getdatasrc {
- /rdcmntline load /ASCII85Decode filter
-} def
-/rdpatch168 {
- /dataptr 0 store
- 49 rdcount
- 4 {
- dup {pop srcchannels getint8} if
- dup {pop srctodstcolor dstchannels putint8 true} if
- } repeat
- {databuf 0 dataptr getinterval}{()} ifelse
-} def
-/rdpatch3216 {
- /dataptr 0 store
- 97 rdcount
- 4 {
- dup {pop srcchannels getint16} if
- dup {pop srctodstcolor dstchannels putint16 true} if
- } repeat
- {databuf 0 dataptr getinterval}{()} ifelse
-} def
-/rdcount {
- dup 0 gt {
- datafile databuf dataptr 4 -1 roll getinterval readstring
- exch length dataptr add /dataptr exch store
- }{
- true
- } ifelse
-} def
-/getint8 {
- mark true 3 -1 roll
- {
- dup {pop datafile read} if
- dup {pop 255 div true} if
- } repeat
- {
- counttomark 1 add -1 roll pop true
- }{
- cleartomark false
- } ifelse
-} def
-/putint8 {
- dup dataptr add /dataptr exch store
- dataptr exch
- {
- 1 sub exch
- 255 mul cvi
- databuf 2 index
- 3 -1 roll put
- } repeat
- pop
-} def
-/getint16 {
- mark true 3 -1 roll
- {
- dup {pop datafile read} if
- dup {pop 256 mul datafile read} if
- dup {pop add 65535 div true} if
- } repeat
- {
- counttomark 1 add -1 roll pop true
- }{
- cleartomark false
- } ifelse
-} def
-/putint16 {
- dup 2 mul dataptr add /dataptr exch store
- dataptr exch
- {
- 2 sub exch
- 65535 mul cvi dup
- 256 idiv databuf 3 index 3 -1 roll put
- 256 mod databuf 2 index 1 add 3 -1 roll put
- } repeat
- pop
-} def
-/srcbuf 256 string def
-/rdcmntline {
- currentfile srcbuf readline pop
- (%) anchorsearch {pop} if
-} def
-/getplateindex {
- 0 [cyan? magenta? yellow? black? customColor?] {{exit} if 1 add} forall
-} def
-/aicsarray 4 array def
-/aicsaltvals 4 array def
-/aicsaltcolr aicsaltvals def
-/tocolorspace {
- dup type /arraytype eq {
- mark exch aload pop
- aicsarray 0 3 -1 roll put
- aicsarray 1 3 -1 roll put
- dup aicsarray 2 3 -1 roll put
- gettintxform aicsarray 3 3 -1 roll put
- counttomark aicsaltvals 0 3 -1 roll getinterval /aicsaltcolr exch store
- aicsaltcolr astore pop pop
- aicsarray
- } if
-} def
-/subtintxform {aicsaltcolr {1 index mul exch} forall pop} def
-/addtintxform {aicsaltcolr {1 sub 1 index mul 1 add exch} forall pop} def
-/gettintxform {
- /DeviceRGB eq {/addtintxform}{/subtintxform} ifelse load
-} def
-/getnchannels {
- dup type /arraytype eq {0 get} if
- colorspacedict exch get begin Channels end
-} def
-/makesmarks {
- composite? {
- pop true
- }{
- dup dup type /arraytype eq {0 get} if
- colorspacedict exch get begin MarksPlate end
- } ifelse
-} def
-/markingplate {
- composite? {
- pop true
- }{
- dup type /arraytype eq {
- dup length getplateindex gt {getplateindex get}{pop false} ifelse
- } if
- } ifelse
-} def
-/tocmyk {
- dup dup type /arraytype eq {0 get} if
- colorspacedict exch get begin ToCMYK end
-} def
-/topsspace {
- dup dup type /arraytype eq {0 get} if
- colorspacedict exch get begin ToPSSpace end
-} def
-/colorspacedict 5 dict dup begin
- /DeviceGray 4 dict dup begin
- /Channels 1 def
- /MarksPlate {pop black?} def
- /ToCMYK {pop 1 exch sub 0 0 0 4 -1 roll} def
- /ToPSSpace {} def
- end def
- /DeviceRGB 4 dict dup begin
- /Channels 3 def
- /MarksPlate {pop isCMYKSep?} def
- /ToCMYK {pop _rgbtocmyk} def
- /ToPSSpace {} def
- end def
- /DeviceCMYK 4 dict dup begin
- /Channels 4 def
- /MarksPlate {pop isCMYKSep?} def
- /ToCMYK {pop} def
- /ToPSSpace {} def
- end def
- /Separation 4 dict dup begin
- /Channels 1 def
- /MarksPlate {
- /findcmykcustomcolor where {
- pop dup 1 exch ToCMYK 5 -1 roll 1 get
- findcmykcustomcolor 1 setcustomcolor
- systemdict /currentgray get exec
- 1 ne
- }{
- pop false
- } ifelse
- } def
- /ToCMYK {
- dup 2 get mark exch 4 2 roll
- 3 get exec
- counttomark -1 roll tocmyk
- 5 -1 roll pop
- } def
- /ToPSSpace {} def
- end def
- /Process 4 dict dup begin
- /Channels 1 def
- /MarksPlate {
- isCMYKSep? {
- 1 exch ToCMYK 4 array astore getplateindex get 0 ne
- }{
- pop false
- } ifelse
- } def
- /ToCMYK {
- dup 2 get mark exch 4 2 roll
- 3 get exec
- counttomark -1 roll tocmyk
- 5 -1 roll pop
- } def
- /ToPSSpace {
- 4 array copy dup 0 /Separation put
- } def
- end def
-end def
-/isoverprint {
- /currentoverprint where {pop currentoverprint}{_of} ifelse
-} def
-/version_ge_3010.106 {
- version {cvr} stopped {
- pop
- false
- }{
- 3010.106 ge
- } ifelse
-} def
-end
-end
-defaultpacking setpacking
-%%EndResource
-%%EndProlog
-%%BeginSetup
-%%IncludeFont: Helvetica
-%%IncludeFont: Helvetica-Bold
-userdict /_useSmoothShade false put
-userdict /_aicmykps false put
-userdict /_forceToCMYK false put
-Adobe_level2_AI5 /initialize get exec
-Adobe_cshow /initialize get exec
-Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 Adobe_typography_AI5 /initialize get exec
-Adobe_ColorImage_AI6 /initialize get exec
-Adobe_shading_AI8 /initialize get exec
-Adobe_Illustrator_AI5 /initialize get exec
-[
-39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis
-/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute
-/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde
-/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex
-/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
-/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash
-/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef
-/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash
-/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef
-/guillemotleft/guillemotright/ellipsis/space/Agrave/Atilde/Otilde/OE/oe
-/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide
-/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright
-/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand
-/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex
-/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex
-/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla
-/hungarumlaut/ogonek/caron
-TE
-%AI55J_Tsume: None
-%AI3_BeginEncoding: _Helvetica Helvetica
-[/_Helvetica/Helvetica 0 0 1 TZ
-%AI3_EndEncoding AdobeType
-%AI55J_Tsume: None
-%AI3_BeginEncoding: _Helvetica-Bold Helvetica-Bold
-[/_Helvetica-Bold/Helvetica-Bold 0 0 1 TZ
-%AI3_EndEncoding AdobeType
-[161/degree 173/notequal 176/infinity/plusminus/lessequal/greaterequal
-181/mu/partialdiff/summation/product/pi/integral 189/Omega
-195/radical 197/approxequal 198/Delta 214/divide/lozenge 240/apple
-/_Symbol_/Symbol 0 0 0 TZ
-%AI5_Begin_NonPrinting
-Np
-%AI3_BeginPattern: (bi-direction diagonals)
-(bi-direction diagonals) 24.2119 0.2119 96.2124 72.2119 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-2 J 2 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-8.2119 6.2119 m
-14.2119 0.2119 L
-F
-8.2119 0.2119 m
-14.2119 6.2119 L
-F
-%AI6_EndPatternLayer
-) &
-(0 O 0 R 0 0 0 1 k
- 0 0 0 1 K
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-2 J 2 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-24.2119 72.2119 m
-96.2124 0.2119 L
-S
-21.2109 69.2129 m
-90.2124 0.2119 L
-S
-21.207 63.2168 m
-84.2124 0.2119 L
-S
-21.2031 57.2207 m
-78.2124 0.2119 L
-S
-21.1987 51.2246 m
-72.2124 0.2119 L
-S
-21.1958 45.2275 m
-66.2119 0.2119 L
-S
-21.1919 39.2314 m
-60.2119 0.2119 L
-S
-21.188 33.2363 m
-54.2119 0.2119 L
-S
-21.1851 27.2402 m
-48.2119 0.2119 L
-S
-21.1812 21.2432 m
-42.2119 0.2119 L
-S
-21.1768 15.2471 m
-36.2119 0.2119 L
-S
-21.1729 9.251 m
-30.2119 0.2119 L
-S
-21.1699 3.2549 m
-24.2119 0.2119 L
-S
-30.2119 72.2119 m
-99.2134 3.21 L
-S
-36.2119 72.2119 m
-99.2173 9.2061 L
-S
-42.2119 72.2119 m
-99.2212 15.2021 L
-S
-48.2119 72.2119 m
-99.2251 21.1992 L
-S
-54.2119 72.2119 m
-99.228 27.1953 L
-S
-60.2119 72.2119 m
-99.2319 33.1904 L
-S
-66.2119 72.2119 m
-99.2358 39.1865 L
-S
-72.2124 72.2119 m
-99.2397 45.1836 L
-S
-78.2124 72.2119 m
-99.2427 51.1797 L
-S
-84.2124 72.2119 m
-99.2466 57.1758 L
-S
-90.2124 72.2119 m
-99.2505 63.1719 L
-S
-96.2124 72.2119 m
-99.2554 69.1689 L
-S
-0.2119 68.7119 m
-10.2119 58.7119 L
-S
-96.2124 72.2119 m
-24.2119 0.2119 L
-S
-90.2124 72.2119 m
-21.2109 3.21 L
-S
-84.2124 72.2119 m
-21.207 9.2061 L
-S
-78.2124 72.2119 m
-21.2031 15.2021 L
-S
-72.2124 72.2119 m
-21.1987 21.1982 L
-S
-66.2119 72.2119 m
-21.1958 27.1953 L
-S
-60.2119 72.2119 m
-21.1919 33.1904 L
-S
-54.2119 72.2119 m
-21.188 39.1865 L
-S
-48.2119 72.2119 m
-21.1851 45.1826 L
-S
-42.2119 72.2119 m
-21.1812 51.1797 L
-S
-36.2119 72.2119 m
-21.1768 57.1758 L
-S
-30.2119 72.2119 m
-21.1729 63.1719 L
-S
-24.2119 72.2119 m
-21.1699 69.168 L
-S
-99.2134 69.2129 m
-30.2119 0.2119 L
-S
-99.2173 63.2168 m
-36.2119 0.2119 L
-S
-99.2212 57.2207 m
-42.2119 0.2119 L
-S
-99.2251 51.2246 m
-48.2119 0.2119 L
-S
-99.228 45.2275 m
-54.2119 0.2119 L
-S
-99.2319 39.2314 m
-60.2119 0.2119 L
-S
-99.2358 33.2363 m
-66.2119 0.2119 L
-S
-99.2397 27.2393 m
-72.2124 0.2119 L
-S
-99.2427 21.2432 m
-78.2124 0.2119 L
-S
-99.2466 15.2471 m
-84.2124 0.2119 L
-S
-99.2505 9.251 m
-90.2124 0.2119 L
-S
-99.2554 3.2539 m
-96.2124 0.2119 L
-S
-0.2119 58.7119 m
-10.2119 68.7119 L
-S
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI3_BeginPattern: (black dots)
-(black dots) 16 0.6885 88 72.6885 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-1 J 0 j 0.75 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-0 6.6885 m
-6 0.6885 L
-F
-0 0.6885 m
-6 6.6885 L
-F
-%AI6_EndPatternLayer
-) &
-(0 O 0 R 0 0 0 1 k
- 0 0 0 1 K
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-1 J 0 j 0.75 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-28.9365 3.1885 m
-28.9365 3.1885 l
-S
-17.125 3.375 m
-17.125 3.375 l
-S
-26.5 4.6885 m
-26.5 4.6885 l
-S
-35.6865 5.8135 m
-35.6865 5.8135 l
-S
-19.75 0.9385 m
-19.75 0.9385 l
-S
-23.125 7.3135 m
-23.125 7.3135 l
-S
-40.5615 2.4385 m
-40.5615 2.4385 l
-S
-43 1.125 m
-43 1.125 l
-S
-45.0615 5.4385 m
-45.0615 5.4385 l
-S
-56.875 6.375 m
-56.875 6.375 l
-S
-65.3115 5.0635 m
-65.3115 5.0635 l
-S
-51.0615 6.9385 m
-51.0615 6.9385 l
-S
-40.5615 6.9385 m
-40.5615 6.9385 l
-S
-31.1865 6.9385 m
-31.1865 6.9385 l
-S
-59.875 9.5635 m
-59.875 9.5635 l
-S
-62.6865 1.3135 m
-62.6865 1.3135 l
-S
-34.5615 0.9385 m
-34.5615 0.9385 l
-S
-48.4365 2.25 m
-48.4365 2.25 l
-S
-56.3115 0.75 m
-56.3115 0.75 l
-S
-66.625 24.5635 m
-66.625 24.5635 l
-S
-74.3115 24.9385 m
-74.3115 24.9385 l
-S
-78.8115 24.375 m
-78.8115 24.375 l
-S
-82.9365 2.0635 m
-82.9365 2.0635 l
-S
-68.3115 11.8135 m
-68.3115 11.8135 l
-S
-86.5 17.8135 m
-86.5 17.8135 l
-S
-87.0615 4.6885 m
-87.0615 4.6885 l
-S
-79.9365 19.875 m
-79.9365 19.875 l
-S
-77.875 1.125 m
-77.875 1.125 l
-S
-69.625 20.25 m
-69.625 20.25 l
-S
-67.75 6 m
-67.75 6 l
-S
-73.375 17.625 m
-73.375 17.625 l
-S
-76.9365 16.875 m
-76.9365 16.875 l
-S
-72.4365 3.375 m
-72.4365 3.375 l
-S
-77.3115 9.5635 m
-77.3115 9.5635 l
-S
-73.9365 11.25 m
-73.9365 11.25 l
-S
-83.125 7.875 m
-83.125 7.875 l
-S
-85.1865 12.75 m
-85.1865 12.75 l
-S
-81.0615 13.875 m
-81.0615 13.875 l
-S
-17.6865 16.125 m
-17.6865 16.125 l
-S
-45.25 10.3135 m
-45.25 10.3135 l
-S
-31.5615 21.375 m
-31.5615 21.375 l
-S
-20.875 11.8135 m
-20.875 11.8135 l
-S
-34.75 18.5635 m
-34.75 18.5635 l
-S
-25.75 21.9385 m
-25.75 21.9385 l
-S
-34.5615 24.5635 m
-34.5615 24.5635 l
-S
-37.375 16.3135 m
-37.375 16.3135 l
-S
-36.625 12.75 m
-36.625 12.75 l
-S
-23.125 17.25 m
-23.125 17.25 l
-S
-29.3115 12.375 m
-29.3115 12.375 l
-S
-31 15.75 m
-31 15.75 l
-S
-46.1865 22.875 m
-46.1865 22.875 l
-S
-52 15.375 m
-52 15.375 l
-S
-58.375 13.3135 m
-58.375 13.3135 l
-S
-62.6865 20.0635 m
-62.6865 20.0635 l
-S
-62.875 14.0635 m
-62.875 14.0635 l
-S
-44.6865 20.4385 m
-44.6865 20.4385 l
-S
-46.75 15.1885 m
-46.75 15.1885 l
-S
-42.0615 17.0635 m
-42.0615 17.0635 l
-S
-55.1865 17.4385 m
-55.1865 17.4385 l
-S
-58.9365 23.25 m
-58.9365 23.25 l
-S
-60.0615 17.4385 m
-60.0615 17.4385 l
-S
-42.4365 25.125 m
-42.4365 25.125 l
-S
-65.3115 20.625 m
-65.3115 20.625 l
-S
-51.625 24.5635 m
-51.625 24.5635 l
-S
-52 20.625 m
-52 20.625 l
-S
-18.8115 24 m
-18.8115 24 l
-S
-21.25 24.9385 m
-21.25 24.9385 l
-S
-19.375 70.875 m
-19.375 70.875 l
-S
-26.125 66.5635 m
-26.125 66.5635 l
-S
-20.125 66.375 m
-20.125 66.375 l
-S
-38.5 69 m
-38.5 69 l
-S
-47.125 71.625 m
-47.125 71.625 l
-S
-62.875 68.0635 m
-62.875 68.0635 l
-S
-49.75 67.5 m
-49.75 67.5 l
-S
-38.875 65.625 m
-38.875 65.625 l
-S
-29.3115 70.3135 m
-29.3115 70.3135 l
-S
-31.9365 67.5 m
-31.9365 67.5 l
-S
-57.25 65.4385 m
-57.25 65.4385 l
-S
-23.5 69.1885 m
-23.5 69.1885 l
-S
-45.625 65.25 m
-45.625 65.25 l
-S
-26.6865 63.9385 m
-26.6865 63.9385 l
-S
-50.5 63.75 m
-50.5 63.75 l
-S
-32.6865 72 m
-32.6865 72 l
-S
-52.9365 71.4385 m
-52.9365 71.4385 l
-S
-57.8115 69.375 m
-57.8115 69.375 l
-S
-61 64.3135 m
-61 64.3135 l
-S
-28.9365 48.1885 m
-28.9365 48.1885 l
-S
-17.125 48.375 m
-17.125 48.375 l
-S
-21.4365 42.375 m
-21.4365 42.375 l
-S
-19.375 36 m
-19.375 36 l
-S
-26.125 31.6885 m
-26.125 31.6885 l
-S
-20.125 31.5 m
-20.125 31.5 l
-S
-26.5 49.6885 m
-26.5 49.6885 l
-S
-35.6865 50.8135 m
-35.6865 50.8135 l
-S
-19.75 45.9385 m
-19.75 45.9385 l
-S
-23.125 52.3135 m
-23.125 52.3135 l
-S
-40.5615 47.4385 m
-40.5615 47.4385 l
-S
-43 46.125 m
-43 46.125 l
-S
-23.5 39.1885 m
-23.5 39.1885 l
-S
-38.5 34.125 m
-38.5 34.125 l
-S
-47.125 36.75 m
-47.125 36.75 l
-S
-45.0615 50.4385 m
-45.0615 50.4385 l
-S
-56.875 51.375 m
-56.875 51.375 l
-S
-42.8115 39.375 m
-42.8115 39.375 l
-S
-62.875 33.1885 m
-62.875 33.1885 l
-S
-49.75 32.625 m
-49.75 32.625 l
-S
-38.875 30.75 m
-38.875 30.75 l
-S
-29.3115 35.4385 m
-29.3115 35.4385 l
-S
-31.9365 32.625 m
-31.9365 32.625 l
-S
-54.75 30.1885 m
-54.75 30.1885 l
-S
-64.9365 39.75 m
-64.9365 39.75 l
-S
-46.1865 41.8135 m
-46.1865 41.8135 l
-S
-65.3115 50.0635 m
-65.3115 50.0635 l
-S
-51.0615 51.9385 m
-51.0615 51.9385 l
-S
-23.5 34.3135 m
-23.5 34.3135 l
-S
-40.5615 51.9385 m
-40.5615 51.9385 l
-S
-31.1865 51.9385 m
-31.1865 51.9385 l
-S
-45.625 30.375 m
-45.625 30.375 l
-S
-26.6865 29.0635 m
-26.6865 29.0635 l
-S
-59.875 54.5635 m
-59.875 54.5635 l
-S
-50.5 28.875 m
-50.5 28.875 l
-S
-60.75 47.6885 m
-60.75 47.6885 l
-S
-30.625 42.75 m
-30.625 42.75 l
-S
-26.6865 42.375 m
-26.6865 42.375 l
-S
-36.8115 40.125 m
-36.8115 40.125 l
-S
-37.75 43.5 m
-37.75 43.5 l
-S
-34.5615 45.9385 m
-34.5615 45.9385 l
-S
-32.6865 37.125 m
-32.6865 37.125 l
-S
-61.9365 42.75 m
-61.9365 42.75 l
-S
-48.4365 47.25 m
-48.4365 47.25 l
-S
-54.625 42.375 m
-54.625 42.375 l
-S
-56.3115 45.75 m
-56.3115 45.75 l
-S
-52.9365 36.5635 m
-52.9365 36.5635 l
-S
-57.8115 34.5 m
-57.8115 34.5 l
-S
-58.9365 38.625 m
-58.9365 38.625 l
-S
-61 29.4385 m
-61 29.4385 l
-S
-65.875 29.625 m
-65.875 29.625 l
-S
-70.5615 27.75 m
-70.5615 27.75 l
-S
-71.5 52.875 m
-71.5 52.875 l
-S
-69.8115 34.3135 m
-69.8115 34.3135 l
-S
-76.375 27.375 m
-76.375 27.375 l
-S
-71.3115 41.0635 m
-71.3115 41.0635 l
-S
-77.3115 45.375 m
-77.3115 45.375 l
-S
-82 28.6885 m
-82 28.6885 l
-S
-88.1865 27.5635 m
-88.1865 27.5635 l
-S
-83.6865 43.3135 m
-83.6865 43.3135 l
-S
-88 50.0635 m
-88 50.0635 l
-S
-88.1865 44.0635 m
-88.1865 44.0635 l
-S
-88.1865 33.1885 m
-88.1865 33.1885 l
-S
-70 50.4385 m
-70 50.4385 l
-S
-68.875 59.625 m
-68.875 59.625 l
-S
-66.8115 38.25 m
-66.8115 38.25 l
-S
-74.75 42.1885 m
-74.75 42.1885 l
-S
-67.375 47.0635 m
-67.375 47.0635 l
-S
-72.25 64.5 m
-72.25 64.5 l
-S
-73.5615 66.9385 m
-73.5615 66.9385 l
-S
-80.5 47.4385 m
-80.5 47.4385 l
-S
-85.5615 62.4385 m
-85.5615 62.4385 l
-S
-82.9365 71.0635 m
-82.9365 71.0635 l
-S
-69.25 69 m
-69.25 69 l
-S
-80.3115 66.75 m
-80.3115 66.75 l
-S
-84.25 53.25 m
-84.25 53.25 l
-S
-87.0615 55.875 m
-87.0615 55.875 l
-S
-77.875 70.125 m
-77.875 70.125 l
-S
-85.375 47.4385 m
-85.375 47.4385 l
-S
-67.75 64.5 m
-67.75 64.5 l
-S
-67.75 55.125 m
-67.75 55.125 l
-S
-81.625 31.125 m
-81.625 31.125 l
-S
-79.375 39 m
-79.375 39 l
-S
-75.8115 33 m
-75.8115 33 l
-S
-84.4365 37.3135 m
-84.4365 37.3135 l
-S
-76.9365 54.5635 m
-76.9365 54.5635 l
-S
-77.3115 50.625 m
-77.3115 50.625 l
-S
-79.5615 60.75 m
-79.5615 60.75 l
-S
-76.1865 61.6885 m
-76.1865 61.6885 l
-S
-73.75 58.5 m
-73.75 58.5 l
-S
-82.5615 56.625 m
-82.5615 56.625 l
-S
-72.4365 72.375 m
-72.4365 72.375 l
-S
-61.75 25.875 m
-61.75 25.875 l
-S
-57.25 26.625 m
-57.25 26.625 l
-S
-25.75 60.75 m
-25.75 60.75 l
-S
-34.1865 59.4385 m
-34.1865 59.4385 l
-S
-19.9365 61.3135 m
-19.9365 61.3135 l
-S
-31.5615 55.6885 m
-31.5615 55.6885 l
-S
-17.3115 56.625 m
-17.3115 56.625 l
-S
-25.1865 55.125 m
-25.1865 55.125 l
-S
-40.375 62.25 m
-40.375 62.25 l
-S
-46.1865 54.75 m
-46.1865 54.75 l
-S
-56.875 59.4385 m
-56.875 59.4385 l
-S
-40.25 58.1885 m
-40.25 58.1885 l
-S
-36.25 56.4385 m
-36.25 56.4385 l
-S
-49.375 56.8135 m
-49.375 56.8135 l
-S
-53.125 62.625 m
-53.125 62.625 l
-S
-54.25 56.8135 m
-54.25 56.8135 l
-S
-59.5 60 m
-59.5 60 l
-S
-46.1865 60 m
-46.1865 60 l
-S
-30.8115 28.5 m
-30.8115 28.5 l
-S
-19.75 72.9385 m
-19.75 72.9385 l
-S
-43 73.125 m
-43 73.125 l
-S
-34.5615 72.9385 m
-34.5615 72.9385 l
-S
-56.3115 72.75 m
-56.3115 72.75 l
-S
-77.875 73.125 m
-77.875 73.125 l
-S
-72.4365 0.375 m
-72.4365 0.375 l
-S
-16.1865 27.5635 m
-16.1865 27.5635 l
-S
-16 50.0635 m
-16 50.0635 l
-S
-16.1865 44.0635 m
-16.1865 44.0635 l
-S
-16.1865 33.1885 m
-16.1865 33.1885 l
-S
-6 62.3135 m
-6.208 62.3135 6.375 62.4805 6.375 62.6885 c
-6.375 62.8945 6.208 63.0635 6 63.0635 c
-5.793 63.0635 5.625 62.8945 5.625 62.6885 c
-5.625 62.4805 5.793 62.3135 6 62.3135 c
-s
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI3_BeginPattern: (horizontal rules)
-(horizontal rules) 16 0 88 73.9463 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-2 J 0 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-0 6 m
-6 0 L
-F
-0 0 m
-6 6 L
-F
-%AI6_EndPatternLayer
-) &
-(0 O 0 R 0 0 0 1 k
- 0 0 0 1 K
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-2 J 0 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-88 72.9727 m
-16 72.9727 l
-S
-88 71.0273 m
-16 71.0273 L
-S
-88 67.1357 m
-16 67.1357 L
-S
-88 65.1904 m
-16 65.1904 L
-S
-88 63.2441 m
-16 63.2441 L
-S
-88 61.2979 m
-16 61.2979 L
-S
-88 57.4072 m
-16 57.4072 L
-S
-88 55.4609 m
-16 55.4609 L
-S
-88 53.5156 m
-16 53.5156 L
-S
-88 51.5703 m
-16 51.5703 L
-S
-88 49.624 m
-16 49.624 L
-S
-88 47.6787 m
-16 47.6787 L
-S
-88 45.7334 m
-16 45.7334 L
-S
-88 43.7871 m
-16 43.7871 L
-S
-88 39.8965 m
-16 39.8965 L
-S
-88 37.9502 m
-16 37.9502 L
-S
-88 36.0049 m
-16 36.0049 L
-S
-88 34.0586 m
-16 34.0586 L
-S
-88 32.1133 m
-16 32.1133 L
-S
-88 30.168 m
-16 30.168 L
-S
-88 26.2764 m
-16 26.2764 L
-S
-88 22.3848 m
-16 22.3848 L
-S
-88 20.4395 m
-16 20.4395 L
-S
-88 18.4941 m
-16 18.4941 L
-S
-88 16.5479 m
-16 16.5479 L
-S
-88 14.6016 m
-16 14.6016 L
-S
-88 12.6572 m
-16 12.6572 L
-S
-88 8.7646 m
-16 8.7646 L
-S
-88 6.8193 m
-16 6.8193 L
-S
-88 4.874 m
-16 4.874 L
-S
-88 0.9727 m
-16 0.9727 l
-S
-88 2.9277 m
-16 2.9277 L
-S
-88 69.0811 m
-16 69.0811 L
-S
-88 59.3525 m
-16 59.3525 L
-S
-88 41.8418 m
-16 41.8418 L
-S
-88 28.2217 m
-16 28.2217 L
-S
-88 24.3311 m
-16 24.3311 L
-S
-88 10.7109 m
-16 10.7109 L
-S
-6 69.0811 m
-2 69.0811 l
-S
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI3_BeginPattern: (one direction diagonals)
-(one direction diagonals) 28.856 4.6211 100.855 76.6211 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-0 J 2 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-5.106 10.6211 m
-11.106 4.6211 L
-F
-5.106 4.6211 m
-11.106 10.6211 L
-F
-%AI6_EndPatternLayer
-) &
-(0 O 0 R 0 0 0 1 k
- 0 0 0 1 K
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-0 J 1 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-21.3716 66.1055 m
-39.3706 84.1055 l
-S
-21.3716 60.1055 m
-45.3706 84.1055 l
-S
-21.3716 54.1055 m
-51.3706 84.1055 l
-S
-21.3716 48.1055 m
-57.3706 84.1055 l
-S
-21.3716 42.1055 m
-63.3706 84.1055 l
-S
-21.3716 36.1055 m
-69.3706 84.1055 l
-S
-21.3716 30.1055 m
-75.3706 84.1055 l
-S
-21.3716 24.1055 m
-81.3706 84.1055 l
-S
-21.3716 18.1055 m
-87.3706 84.1055 l
-S
-21.3716 12.1055 m
-93.3706 84.1055 l
-S
-21.3716 6.1055 m
-99.3706 84.1055 l
-S
-21.3716 0.1064 m
-105.3706 84.1055 l
-S
-27.3716 0.1064 m
-105.3706 78.1055 l
-S
-33.3706 0.1064 m
-105.3706 72.1055 l
-S
-39.3706 0.1064 m
-105.3706 66.1055 l
-S
-45.3706 0.1064 m
-105.3706 60.1055 l
-S
-51.3706 0.1064 m
-105.3706 54.1055 l
-S
-57.3706 0.1064 m
-105.3706 48.1055 l
-S
-63.3706 0.1064 m
-105.3706 42.1055 l
-S
-69.3706 0.1064 m
-105.3706 36.1055 l
-S
-75.3706 0.1064 m
-105.3706 30.1055 l
-S
-81.3706 0.1064 m
-105.3706 24.1055 l
-S
-87.3706 0.1064 m
-105.3706 18.1055 l
-S
-93.3706 0.1064 m
-105.3706 12.1055 l
-S
-2 j
-0.106 63.1211 m
-10.106 73.1211 L
-S
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI3_BeginPattern: (white dots)
-(white dots) 0.375 0.6885 72.375 72.6885 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-1 J 0 j 0.75 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-13.3115 3.1885 m
-13.3115 3.1885 l
-S
-1.5 3.375 m
-1.5 3.375 l
-S
-10.875 4.6885 m
-10.875 4.6885 l
-S
-20.0615 5.8135 m
-20.0615 5.8135 l
-S
-4.125 0.9385 m
-4.125 0.9385 l
-S
-7.5 7.3135 m
-7.5 7.3135 l
-S
-24.9365 2.4385 m
-24.9365 2.4385 l
-S
-27.375 1.125 m
-27.375 1.125 l
-S
-29.4365 5.4385 m
-29.4365 5.4385 l
-S
-41.25 6.375 m
-41.25 6.375 l
-S
-49.6865 5.0635 m
-49.6865 5.0635 l
-S
-35.4365 6.9385 m
-35.4365 6.9385 l
-S
-24.9365 6.9385 m
-24.9365 6.9385 l
-S
-15.5615 6.9385 m
-15.5615 6.9385 l
-S
-44.25 9.5635 m
-44.25 9.5635 l
-S
-47.0615 1.3135 m
-47.0615 1.3135 l
-S
-18.9365 0.9385 m
-18.9365 0.9385 l
-S
-32.8115 2.25 m
-32.8115 2.25 l
-S
-40.6865 0.75 m
-40.6865 0.75 l
-S
-51 24.5635 m
-51 24.5635 l
-S
-58.6865 24.9385 m
-58.6865 24.9385 l
-S
-63.1865 24.375 m
-63.1865 24.375 l
-S
-67.3115 2.0635 m
-67.3115 2.0635 l
-S
-52.6865 11.8135 m
-52.6865 11.8135 l
-S
-70.875 17.8135 m
-70.875 17.8135 l
-S
-71.4365 4.6885 m
-71.4365 4.6885 l
-S
-64.3115 19.875 m
-64.3115 19.875 l
-S
-62.25 1.125 m
-62.25 1.125 l
-S
-54 20.25 m
-54 20.25 l
-S
-52.125 6 m
-52.125 6 l
-S
-57.75 17.625 m
-57.75 17.625 l
-S
-61.3115 16.875 m
-61.3115 16.875 l
-S
-56.8115 3.375 m
-56.8115 3.375 l
-S
-61.6865 9.5635 m
-61.6865 9.5635 l
-S
-58.3115 11.25 m
-58.3115 11.25 l
-S
-67.5 7.875 m
-67.5 7.875 l
-S
-69.5615 12.75 m
-69.5615 12.75 l
-S
-65.4365 13.875 m
-65.4365 13.875 l
-S
-2.0615 16.125 m
-2.0615 16.125 l
-S
-29.625 10.3135 m
-29.625 10.3135 l
-S
-15.9365 21.375 m
-15.9365 21.375 l
-S
-5.25 11.8135 m
-5.25 11.8135 l
-S
-19.125 18.5635 m
-19.125 18.5635 l
-S
-10.125 21.9385 m
-10.125 21.9385 l
-S
-18.9365 24.5635 m
-18.9365 24.5635 l
-S
-21.75 16.3135 m
-21.75 16.3135 l
-S
-21 12.75 m
-21 12.75 l
-S
-7.5 17.25 m
-7.5 17.25 l
-S
-13.6865 12.375 m
-13.6865 12.375 l
-S
-15.375 15.75 m
-15.375 15.75 l
-S
-30.5615 22.875 m
-30.5615 22.875 l
-S
-36.375 15.375 m
-36.375 15.375 l
-S
-42.75 13.3135 m
-42.75 13.3135 l
-S
-47.0615 20.0635 m
-47.0615 20.0635 l
-S
-47.25 14.0635 m
-47.25 14.0635 l
-S
-29.0615 20.4385 m
-29.0615 20.4385 l
-S
-31.125 15.1885 m
-31.125 15.1885 l
-S
-26.4365 17.0635 m
-26.4365 17.0635 l
-S
-39.5615 17.4385 m
-39.5615 17.4385 l
-S
-43.3115 23.25 m
-43.3115 23.25 l
-S
-44.4365 17.4385 m
-44.4365 17.4385 l
-S
-26.8115 25.125 m
-26.8115 25.125 l
-S
-49.6865 20.625 m
-49.6865 20.625 l
-S
-36 24.5635 m
-36 24.5635 l
-S
-36.375 20.625 m
-36.375 20.625 l
-S
-3.1865 24 m
-3.1865 24 l
-S
-5.625 24.9385 m
-5.625 24.9385 l
-S
-3.75 70.875 m
-3.75 70.875 l
-S
-10.5 66.5635 m
-10.5 66.5635 l
-S
-4.5 66.375 m
-4.5 66.375 l
-S
-22.875 69 m
-22.875 69 l
-S
-31.5 71.625 m
-31.5 71.625 l
-S
-47.25 68.0635 m
-47.25 68.0635 l
-S
-34.125 67.5 m
-34.125 67.5 l
-S
-23.25 65.625 m
-23.25 65.625 l
-S
-13.6865 70.3135 m
-13.6865 70.3135 l
-S
-16.3115 67.5 m
-16.3115 67.5 l
-S
-41.625 65.4385 m
-41.625 65.4385 l
-S
-7.875 69.1885 m
-7.875 69.1885 l
-S
-30 65.25 m
-30 65.25 l
-S
-11.0615 63.9385 m
-11.0615 63.9385 l
-S
-34.875 63.75 m
-34.875 63.75 l
-S
-17.0615 72 m
-17.0615 72 l
-S
-37.3115 71.4385 m
-37.3115 71.4385 l
-S
-42.1865 69.375 m
-42.1865 69.375 l
-S
-45.375 64.3135 m
-45.375 64.3135 l
-S
-13.3115 48.1885 m
-13.3115 48.1885 l
-S
-1.5 48.375 m
-1.5 48.375 l
-S
-5.8115 42.375 m
-5.8115 42.375 l
-S
-3.75 36 m
-3.75 36 l
-S
-10.5 31.6885 m
-10.5 31.6885 l
-S
-4.5 31.5 m
-4.5 31.5 l
-S
-10.875 49.6885 m
-10.875 49.6885 l
-S
-20.0615 50.8135 m
-20.0615 50.8135 l
-S
-4.125 45.9385 m
-4.125 45.9385 l
-S
-7.5 52.3135 m
-7.5 52.3135 l
-S
-24.9365 47.4385 m
-24.9365 47.4385 l
-S
-27.375 46.125 m
-27.375 46.125 l
-S
-7.875 39.1885 m
-7.875 39.1885 l
-S
-22.875 34.125 m
-22.875 34.125 l
-S
-31.5 36.75 m
-31.5 36.75 l
-S
-29.4365 50.4385 m
-29.4365 50.4385 l
-S
-41.25 51.375 m
-41.25 51.375 l
-S
-27.1865 39.375 m
-27.1865 39.375 l
-S
-47.25 33.1885 m
-47.25 33.1885 l
-S
-34.125 32.625 m
-34.125 32.625 l
-S
-23.25 30.75 m
-23.25 30.75 l
-S
-13.6865 35.4385 m
-13.6865 35.4385 l
-S
-16.3115 32.625 m
-16.3115 32.625 l
-S
-39.125 30.1885 m
-39.125 30.1885 l
-S
-49.3115 39.75 m
-49.3115 39.75 l
-S
-30.5615 41.8135 m
-30.5615 41.8135 l
-S
-49.6865 50.0635 m
-49.6865 50.0635 l
-S
-35.4365 51.9385 m
-35.4365 51.9385 l
-S
-7.875 34.3135 m
-7.875 34.3135 l
-S
-24.9365 51.9385 m
-24.9365 51.9385 l
-S
-15.5615 51.9385 m
-15.5615 51.9385 l
-S
-30 30.375 m
-30 30.375 l
-S
-11.0615 29.0635 m
-11.0615 29.0635 l
-S
-44.25 54.5635 m
-44.25 54.5635 l
-S
-34.875 28.875 m
-34.875 28.875 l
-S
-45.125 47.6885 m
-45.125 47.6885 l
-S
-15 42.75 m
-15 42.75 l
-S
-11.0615 42.375 m
-11.0615 42.375 l
-S
-21.1865 40.125 m
-21.1865 40.125 l
-S
-22.125 43.5 m
-22.125 43.5 l
-S
-18.9365 45.9385 m
-18.9365 45.9385 l
-S
-17.0615 37.125 m
-17.0615 37.125 l
-S
-46.3115 42.75 m
-46.3115 42.75 l
-S
-32.8115 47.25 m
-32.8115 47.25 l
-S
-39 42.375 m
-39 42.375 l
-S
-40.6865 45.75 m
-40.6865 45.75 l
-S
-37.3115 36.5635 m
-37.3115 36.5635 l
-S
-42.1865 34.5 m
-42.1865 34.5 l
-S
-43.3115 38.625 m
-43.3115 38.625 l
-S
-45.375 29.4385 m
-45.375 29.4385 l
-S
-50.25 29.625 m
-50.25 29.625 l
-S
-54.9365 27.75 m
-54.9365 27.75 l
-S
-55.875 52.875 m
-55.875 52.875 l
-S
-54.1865 34.3135 m
-54.1865 34.3135 l
-S
-60.75 27.375 m
-60.75 27.375 l
-S
-55.6865 41.0635 m
-55.6865 41.0635 l
-S
-61.6865 45.375 m
-61.6865 45.375 l
-S
-66.375 28.6885 m
-66.375 28.6885 l
-S
-72.5615 27.5635 m
-72.5615 27.5635 l
-S
-68.0615 43.3135 m
-68.0615 43.3135 l
-S
-72.375 50.0635 m
-72.375 50.0635 l
-S
-72.5615 44.0635 m
-72.5615 44.0635 l
-S
-72.5615 33.1885 m
-72.5615 33.1885 l
-S
-54.375 50.4385 m
-54.375 50.4385 l
-S
-53.25 59.625 m
-53.25 59.625 l
-S
-51.1865 38.25 m
-51.1865 38.25 l
-S
-59.125 42.1885 m
-59.125 42.1885 l
-S
-51.75 47.0635 m
-51.75 47.0635 l
-S
-56.625 64.5 m
-56.625 64.5 l
-S
-57.9365 66.9385 m
-57.9365 66.9385 l
-S
-64.875 47.4385 m
-64.875 47.4385 l
-S
-69.9365 62.4385 m
-69.9365 62.4385 l
-S
-67.3115 71.0635 m
-67.3115 71.0635 l
-S
-53.625 69 m
-53.625 69 l
-S
-64.6865 66.75 m
-64.6865 66.75 l
-S
-68.625 53.25 m
-68.625 53.25 l
-S
-71.4365 55.875 m
-71.4365 55.875 l
-S
-62.25 70.125 m
-62.25 70.125 l
-S
-69.75 47.4385 m
-69.75 47.4385 l
-S
-52.125 64.5 m
-52.125 64.5 l
-S
-52.125 55.125 m
-52.125 55.125 l
-S
-66 31.125 m
-66 31.125 l
-S
-63.75 39 m
-63.75 39 l
-S
-60.1865 33 m
-60.1865 33 l
-S
-68.8115 37.3135 m
-68.8115 37.3135 l
-S
-61.3115 54.5635 m
-61.3115 54.5635 l
-S
-61.6865 50.625 m
-61.6865 50.625 l
-S
-63.9365 60.75 m
-63.9365 60.75 l
-S
-60.5615 61.6885 m
-60.5615 61.6885 l
-S
-58.125 58.5 m
-58.125 58.5 l
-S
-66.9365 56.625 m
-66.9365 56.625 l
-S
-56.8115 72.375 m
-56.8115 72.375 l
-S
-46.125 25.875 m
-46.125 25.875 l
-S
-41.625 26.625 m
-41.625 26.625 l
-S
-10.125 60.75 m
-10.125 60.75 l
-S
-18.5615 59.4385 m
-18.5615 59.4385 l
-S
-4.3115 61.3135 m
-4.3115 61.3135 l
-S
-15.9365 55.6885 m
-15.9365 55.6885 l
-S
-1.6865 56.625 m
-1.6865 56.625 l
-S
-9.5615 55.125 m
-9.5615 55.125 l
-S
-24.75 62.25 m
-24.75 62.25 l
-S
-30.5615 54.75 m
-30.5615 54.75 l
-S
-41.25 59.4385 m
-41.25 59.4385 l
-S
-24.625 58.1885 m
-24.625 58.1885 l
-S
-20.625 56.4385 m
-20.625 56.4385 l
-S
-33.75 56.8135 m
-33.75 56.8135 l
-S
-37.5 62.625 m
-37.5 62.625 l
-S
-38.625 56.8135 m
-38.625 56.8135 l
-S
-43.875 60 m
-43.875 60 l
-S
-30.5615 60 m
-30.5615 60 l
-S
-15.1865 28.5 m
-15.1865 28.5 l
-S
-4.125 72.9385 m
-4.125 72.9385 l
-S
-27.375 73.125 m
-27.375 73.125 l
-S
-18.9365 72.9385 m
-18.9365 72.9385 l
-S
-40.6865 72.75 m
-40.6865 72.75 l
-S
-62.25 73.125 m
-62.25 73.125 l
-S
-56.8115 0.375 m
-56.8115 0.375 l
-S
-0.5615 27.5635 m
-0.5615 27.5635 l
-S
-0.375 50.0635 m
-0.375 50.0635 l
-S
-0.5615 44.0635 m
-0.5615 44.0635 l
-S
-0.5615 33.1885 m
-0.5615 33.1885 l
-S
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI5_End_NonPrinting--
-%AI5_Begin_NonPrinting
-Np
-%AI8_BeginBrushPattern
-(New Pattern 10)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7883.25 8585.25 m
--7815.2593 8585.25 L
--7815.2593 8557.0195 L
--7883.25 8557.0195 L
--7883.25 8585.25 L
-n
-0 O
-0.8 g
--7835.5234 8580.209 m
--7815.4785 8573.3516 l
--7817.0591 8570.4502 l
--7829.7202 8574.4063 l
--7835.7866 8570.4502 l
--7835.5234 8580.209 l
-f
-0 R
-0.9 G
-0.5 w
--7816.7871 8570.3242 m
--7829.7202 8574.4063 l
-S
-0.5 G
--7815.4785 8573.3516 m
--7817.0591 8570.4502 l
-S
-0.25 G
--7835.5234 8580.209 m
--7815.4785 8573.3516 l
-S
-0.5 G
--7829.7202 8574.4063 m
--7835.7866 8570.4502 l
-S
-0 O
-0.8 g
-1 w
--7855.5679 8562.7998 m
--7843.437 8557.5254 l
--7840.0073 8561.7441 l
--7855.5679 8562.7998 l
-f
-1 Ap
-0.57 g
--7835.2598 8582.0547 m
--7881.6802 8582.0547 L
--7881.6802 8584.9551 L
--7835.2598 8584.9551 L
--7835.2598 8582.0547 L
-f
-0 Ap
-0 R
-0.5 G
-0.5 w
--7843.437 8557.5254 m
--7840.0073 8561.7441 l
-S
-0.9 G
--7855.5679 8562.7998 m
--7842.875 8557.248 l
-S
-0 O
-0.8 g
-1 w
--7883.001 8560.7627 m
--7883.001 8582.0859 l
--7834.2046 8582.0859 l
--7834.2046 8564.9121 l
--7837.6338 8560.8223 l
--7883.001 8560.7627 l
-f
-0 R
-0.5 G
-0.5 w
--7883.001 8576.5166 m
--7834.2046 8576.5166 l
-S
--7880.0986 8564.1191 m
--7870.6025 8564.1191 l
-S
--7880.0986 8565.7676 m
--7870.6025 8565.7676 l
-S
--7880.0986 8567.415 m
--7870.6025 8567.415 l
-S
--7880.0986 8569.0635 m
--7870.6025 8569.0635 l
-S
--7880.0986 8570.7109 m
--7870.6025 8570.7109 l
-S
--7834.2046 8564.9121 m
--7837.6338 8560.8223 l
-S
-0.25 G
--7883.001 8582.0859 m
--7834.2046 8582.0859 l
--7834.2046 8564.9121 l
-S
-0.9 G
--7837.6338 8560.793 m
--7883.001 8560.793 l
--7883.001 8582.3555 l
-S
-0.25 G
--7835.2598 8582.0859 m
--7835.2598 8585 l
--7881.6714 8585 l
-S
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 19)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7883.25 8585.25 m
--7836.6338 8585.25 L
--7836.6338 8549.6348 L
--7883.25 8549.6348 L
--7883.25 8585.25 L
-n
-u
-u
-0 O
-0.7495 g
-0 R
-0.25 G
-1 j 0.5 w 2 M
--7836.9722 8585 m
--7836.9722 8582.9805 l
--7843.333 8579.5479 l
--7859.8857 8579.5479 L
--7876.439 8579.5479 l
--7883.001 8582.9805 l
--7883.001 8585 l
--7836.9722 8585 l
-b
-0.8748 G
-2 J 0 j
--7859.8857 8579.5479 m
--7876.439 8579.5479 l
--7883.001 8582.9805 l
--7883.001 8585 l
-S
--7836.9722 8582.9805 m
--7843.333 8579.5479 l
--7859.8857 8579.5479 L
-S
-0 O
-0.9 g
-0.25 G
-0 J 1 j
--7876.3394 8580.7598 m
--7880.377 8582.9805 l
--7839.7993 8582.9805 l
--7843.2319 8580.7598 l
--7876.3394 8580.7598 l
-b
-U
-u
-u
-0.7 g
-0 j 1 w 4 M
--7871.125 8576.6523 m
--7868.8462 8576.6094 L
--7859.7446 8575.041 L
--7850.4634 8576.6094 L
--7848.6694 8576.6094 L
--7848.729 8578.4512 L
--7871.125 8578.4512 L
--7871.125 8576.6523 L
-f
-0 R
-0.25 G
-0.5 w
--7848.6978 8576.6523 m
--7848.7905 8578.4512 L
--7871.1567 8578.4512 L
-S
-0.9 G
--7850.498 8576.6523 m
--7848.6978 8576.6523 L
-S
-0.25 G
--7859.8042 8575.041 m
--7850.498 8576.6523 L
-S
-0.9 G
--7871.1567 8578.4512 m
--7871.1567 8576.6523 L
--7868.9033 8576.6523 L
--7859.8042 8575.041 L
-S
-U
-u
-0 O
-0.7 g
-1 w
--7873.3672 8573.5781 m
--7864.0703 8573.5313 L
--7859.7119 8571.8047 L
--7855.1343 8573.5313 L
--7846.4214 8573.5313 L
--7846.4927 8575.5557 L
--7873.3672 8575.5557 L
--7873.3672 8573.5781 L
-f
-0 R
-0.25 G
-0.5 w
--7846.4546 8573.5781 m
--7846.5649 8575.5557 L
--7873.4038 8575.5557 L
-S
-0.9 G
--7855.1758 8573.5781 m
--7846.4546 8573.5781 L
-S
-0.25 G
--7859.7817 8571.8047 m
--7855.1758 8573.5781 L
-S
-0.9 G
--7873.4038 8575.5557 m
--7873.4038 8573.5781 L
--7864.1406 8573.5781 L
--7859.7817 8571.8047 L
-S
-U
-u
-0 O
-0.7495 g
-0.25 G
-2 J 2 M
--7874.8838 8572.75 m
--7874.8911 8550.8809 l
--7873.9082 8549.8848 L
--7845.9302 8549.9121 L
--7844.9922 8551.0508 L
--7844.9922 8572.4648 L
--7845.8022 8573.6045 L
--7874.0366 8573.6045 l
--7874.8838 8572.75 L
-b
-/BBAccumRotation (4.712389) XT
-0.8748 G
--7874.0366 8573.6045 m
--7874.8838 8572.75 L
--7874.8911 8550.8809 l
--7873.9082 8549.8848 L
--7845.9302 8549.9121 L
-S
-/BBAccumRotation (4.712389) XT
-0 O
-0.9 g
-0.25 G
--7848.0239 8570.7168 m
--7848.0054 8552.7617 L
--7871.8994 8552.7617 L
--7871.9014 8570.7148 L
--7848.0239 8570.7168 L
-b
-/BBAccumRotation (4.712389) XT
-U
-U
-u
-0.15 G
-0 J 4 M
--7843.333 8579.5479 m
--7859.8857 8579.5479 L
--7876.439 8579.5479 L
--7883.001 8582.9805 L
--7883.001 8585 L
--7836.9722 8585 L
--7836.9722 8582.9805 L
--7843.333 8579.5479 L
-s
--7874.0366 8573.6045 m
--7873.4038 8573.6045 L
--7873.4038 8575.5557 L
--7873.3672 8575.5449 L
--7873.3672 8575.5527 L
--7873.4038 8575.5557 L
--7873.3672 8575.5557 L
--7862.731 8575.5557 L
--7868.8462 8576.6094 L
--7871.125 8576.6523 L
--7871.1567 8576.6523 L
--7871.1567 8578.4512 L
--7871.125 8578.4414 L
--7871.125 8578.4482 L
--7871.1567 8578.4512 L
--7871.125 8578.4512 L
--7848.7905 8578.4512 L
--7848.729 8578.4512 L
--7848.6694 8576.6094 L
--7850.4634 8576.6094 L
--7856.7002 8575.5557 L
--7846.5649 8575.5557 L
--7846.4927 8575.5557 L
--7846.4233 8573.6045 L
--7845.8022 8573.6045 L
--7844.9922 8572.4648 L
--7844.9922 8551.0508 L
--7845.9302 8549.9121 L
--7873.9082 8549.8848 L
--7874.8911 8550.8809 L
--7874.8838 8572.75 L
--7874.0366 8573.6045 L
-s
-U
-U
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 21)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7883.3184 8585.3184 m
--7804.0449 8585.3184 L
--7804.0449 8559.5566 L
--7883.3184 8559.5566 L
--7883.3184 8585.3184 L
-n
-u
-0 O
-0.8158 g
-0 R
-0 G
-0.5 w 3.8636 M
--7882.8638 8562.8213 m
--7804.4961 8562.8213 L
--7804.4961 8576.9053 L
--7882.8638 8576.9053 L
--7882.8638 8562.8213 L
-b
--7843.6792 8569.8633 m
-B
-U
-u
--7880.4233 8576.9053 m
--7806.939 8576.9053 L
--7805.4766 8576.9053 -7804.2954 8578.0908 -7804.2954 8579.5498 c
--7804.2954 8580.9951 L
--7804.2954 8582.4561 -7805.4766 8583.6416 -7806.939 8583.6416 c
--7880.4233 8583.6416 L
--7881.8838 8583.6416 -7883.0688 8582.4561 -7883.0688 8580.9951 c
--7883.0688 8579.5498 L
--7883.0688 8578.0908 -7881.8838 8576.9053 -7880.4233 8576.9053 c
--7880.4233 8576.9053 L
-b
--7843.6802 8580.2744 m
-B
-U
-0 g
--7878.374 8583.6396 m
--7873.8838 8583.6396 L
--7874.7007 8585.0684 L
--7877.251 8585.0684 L
--7878.374 8583.6396 L
-b
--7814.293 8583.6396 m
--7809.8022 8583.6396 L
--7810.6191 8585.0684 L
--7813.1714 8585.0684 L
--7814.293 8583.6396 L
-b
-0.61 G
-1 w
--7875.9258 8562.8574 m
--7875.9258 8574.4893 L
-S
--7873.8838 8562.8574 m
--7873.8838 8574.4893 L
-S
-u
-0 O
-0 g
-0 G
-0.5 w
--7826.7417 8566.7002 m
--7813.0679 8566.7002 L
--7813.0679 8568.9463 L
--7826.7417 8568.9463 L
--7826.7417 8566.7002 L
-b
--7819.9038 8567.8223 m
-B
-U
-1 J
--7814.3066 8577.9297 m
--7813.8906 8578.3682 -7813.6362 8578.9561 -7813.6362 8579.6064 C
--7813.6362 8580.9355 L
--7813.6362 8581.5859 -7813.8906 8582.1758 -7814.3066 8582.6123 C
-S
--7816.1978 8577.9297 m
--7815.7842 8578.3682 -7815.5288 8578.9561 -7815.5288 8579.6064 C
--7815.5288 8580.9355 L
--7815.5288 8581.5859 -7815.7842 8582.1758 -7816.1978 8582.6123 C
-S
--7818.0913 8577.9297 m
--7817.6758 8578.3682 -7817.4214 8578.9561 -7817.4214 8579.6064 C
--7817.4214 8580.9355 L
--7817.4214 8581.5859 -7817.6758 8582.1758 -7818.0913 8582.6123 C
-S
--7819.9839 8577.9297 m
--7819.5698 8578.3682 -7819.314 8578.9561 -7819.314 8579.6064 C
--7819.314 8580.9355 L
--7819.314 8581.5859 -7819.5698 8582.1758 -7819.9839 8582.6123 C
-S
--7821.8774 8577.9297 m
--7821.4614 8578.3682 -7821.207 8578.9561 -7821.207 8579.6064 C
--7821.207 8580.9355 L
--7821.207 8581.5859 -7821.4614 8582.1758 -7821.8774 8582.6123 C
-S
--7823.769 8577.9297 m
--7823.354 8578.3682 -7823.1001 8578.9561 -7823.1001 8579.6064 C
--7823.1001 8580.9355 L
--7823.1001 8581.5859 -7823.354 8582.1758 -7823.769 8582.6123 C
-S
--7825.6616 8577.9297 m
--7825.248 8578.3682 -7824.9922 8578.9561 -7824.9922 8579.6064 C
--7824.9922 8580.9355 L
--7824.9922 8581.5859 -7825.248 8582.1758 -7825.6616 8582.6123 C
-S
--7827.5542 8577.9297 m
--7827.1401 8578.3682 -7826.8857 8578.9561 -7826.8857 8579.6064 C
--7826.8857 8580.9355 L
--7826.8857 8581.5859 -7827.1401 8582.1758 -7827.5542 8582.6123 C
-S
--7829.4463 8577.9297 m
--7829.0322 8578.3682 -7828.7769 8578.9561 -7828.7769 8579.6064 C
--7828.7769 8580.9355 L
--7828.7769 8581.5859 -7829.0322 8582.1758 -7829.4463 8582.6123 C
-S
--7831.3374 8577.9297 m
--7830.9258 8578.3682 -7830.6694 8578.9561 -7830.6694 8579.6064 C
--7830.6694 8580.9355 L
--7830.6694 8581.5859 -7830.9258 8582.1758 -7831.3374 8582.6123 C
-S
--7833.231 8577.9297 m
--7832.8159 8578.3682 -7832.563 8578.9561 -7832.563 8579.6064 C
--7832.563 8580.9355 L
--7832.563 8581.5859 -7832.8159 8582.1758 -7833.231 8582.6123 C
-S
--7835.125 8577.9297 m
--7834.7095 8578.3682 -7834.4546 8578.9561 -7834.4546 8579.6064 C
--7834.4546 8580.9355 L
--7834.4546 8581.5859 -7834.7095 8582.1758 -7835.125 8582.6123 C
-S
--7837.0151 8577.9297 m
--7836.6006 8578.3682 -7836.3472 8578.9561 -7836.3472 8579.6064 C
--7836.3472 8580.9355 L
--7836.3472 8581.5859 -7836.6006 8582.1758 -7837.0151 8582.6123 C
-S
--7838.9102 8577.9297 m
--7838.4937 8578.3682 -7838.2407 8578.9561 -7838.2407 8579.6064 C
--7838.2407 8580.9355 L
--7838.2407 8581.5859 -7838.4937 8582.1758 -7838.9102 8582.6123 C
-S
--7840.8022 8577.9297 m
--7840.3872 8578.3682 -7840.1318 8578.9561 -7840.1318 8579.6064 C
--7840.1318 8580.9355 L
--7840.1318 8581.5859 -7840.3872 8582.1758 -7840.8022 8582.6123 C
-S
-0 O
-0.4385 g
-0 J 1 j
--7873.8838 8559.8066 m
--7813.8838 8559.8066 L
--7804.4961 8562.8213 L
--7882.8638 8562.8213 L
--7873.8838 8559.8066 L
-b
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 42)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7875.999 8578.6211 m
--7852.9873 8578.6211 L
--7852.9873 8540.5439 L
--7875.999 8540.5439 L
--7875.999 8578.6211 L
-n
-*u
-0 R
-1 G
-1 D
--7858.4966 8549.5801 m
--7858.4966 8551.3926 L
--7858.4966 8551.4912 -7858.5439 8551.5869 -7858.6362 8551.6787 c
--7858.7266 8551.7715 -7858.8608 8551.8604 -7859.0342 8551.9463 c
--7859.2065 8552.0303 -7859.418 8552.1123 -7859.6641 8552.1875 c
--7859.9087 8552.2627 -7860.1895 8552.333 -7860.498 8552.3975 c
--7860.7842 8552.457 -7861.0967 8552.5107 -7861.4282 8552.5586 C
--7861.4282 8552.6797 L
--7861.3481 8552.6797 L
--7861.3481 8552.7451 -7861.3774 8552.8066 -7861.4282 8552.8652 C
--7861.4282 8553.0898 L
--7861.3481 8553.0898 L
--7861.3481 8553.1543 -7861.3774 8553.2158 -7861.4282 8553.2744 C
--7861.4282 8553.499 L
--7861.3481 8553.499 L
--7861.3481 8553.5645 -7861.3774 8553.626 -7861.4282 8553.6846 C
--7861.4282 8553.9092 L
--7861.3481 8553.9092 L
--7861.3481 8553.9736 -7861.3774 8554.0361 -7861.4282 8554.0938 C
--7861.4282 8554.3184 L
--7861.3481 8554.3184 L
--7861.3481 8554.3838 -7861.3774 8554.4443 -7861.4282 8554.5029 C
--7861.4282 8554.7275 L
--7861.3481 8554.7275 L
--7861.3481 8554.793 -7861.3774 8554.8545 -7861.4282 8554.9131 C
--7861.4282 8555.1367 L
--7861.3481 8555.1367 L
--7861.3481 8555.2021 -7861.3774 8555.2637 -7861.4282 8555.3223 C
--7861.4282 8555.5469 L
--7861.3481 8555.5469 L
--7861.3481 8555.6123 -7861.3774 8555.6738 -7861.4282 8555.7324 C
--7861.4282 8555.9561 L
--7861.3481 8555.9561 L
--7861.3481 8556.0215 -7861.3774 8556.083 -7861.4282 8556.1416 C
--7861.4282 8556.3652 L
--7861.3481 8556.3652 L
--7861.3481 8556.4307 -7861.3774 8556.4922 -7861.4282 8556.5508 C
--7861.4282 8556.7754 L
--7861.3481 8556.7754 L
--7861.3481 8556.8408 -7861.3774 8556.9023 -7861.4282 8556.96 C
--7861.4282 8557.1846 L
--7861.3481 8557.1846 L
--7861.3481 8557.25 -7861.3774 8557.3115 -7861.4282 8557.3701 C
--7861.4282 8557.5947 L
--7861.3481 8557.5947 L
--7861.3481 8557.6592 -7861.3774 8557.7217 -7861.4282 8557.7793 C
--7861.4282 8558.0039 L
--7861.3481 8558.0039 L
--7861.3481 8558.0693 -7861.3774 8558.1309 -7861.4282 8558.1885 C
--7861.4282 8558.4131 L
--7861.3481 8558.4131 L
--7861.3481 8558.4785 -7861.3774 8558.54 -7861.4282 8558.5986 C
--7861.4282 8558.8232 L
--7861.3481 8558.8232 L
--7861.3481 8558.8877 -7861.3774 8558.9502 -7861.4282 8559.0078 C
--7861.4282 8559.2324 L
--7861.3481 8559.2324 L
--7861.3481 8559.2979 -7861.3774 8559.3594 -7861.4282 8559.418 C
--7861.4282 8559.6416 L
--7861.3481 8559.6416 L
--7861.3481 8559.707 -7861.3774 8559.7686 -7861.4282 8559.8271 C
--7861.4282 8560.0518 L
--7861.3481 8560.0518 L
--7861.3481 8560.1162 -7861.3774 8560.1787 -7861.4282 8560.2373 C
--7861.4282 8560.4609 L
--7861.3481 8560.4609 L
--7861.3481 8560.5264 -7861.3774 8560.5879 -7861.4282 8560.6465 C
--7861.4282 8560.8701 L
--7861.3481 8560.8701 L
--7861.3481 8560.9355 -7861.3774 8560.9971 -7861.4282 8561.0557 C
--7861.4282 8561.2803 L
--7861.3481 8561.2803 L
--7861.3481 8561.3457 -7861.3774 8561.4072 -7861.4282 8561.4658 C
--7861.4282 8561.6895 L
--7861.3481 8561.6895 L
--7861.3481 8561.7549 -7861.3774 8561.8164 -7861.4282 8561.875 C
--7861.4282 8562.0986 L
--7861.3481 8562.0986 L
--7861.3481 8562.1484 -7861.3682 8562.1953 -7861.3984 8562.2412 C
--7859.6431 8562.499 -7858.4966 8562.9229 -7858.4966 8563.4033 c
--7858.4966 8563.459 -7858.5166 8563.5146 -7858.5474 8563.5693 c
--7858.5166 8563.5146 -7858.4966 8563.459 -7858.4966 8563.4033 C
--7858.4966 8565.2158 L
--7858.4966 8565.3145 -7858.5439 8565.4102 -7858.6362 8565.5029 c
--7858.7266 8565.5947 -7858.8608 8565.6846 -7859.0342 8565.7695 c
--7859.2065 8565.8545 -7859.418 8565.9346 -7859.6641 8566.0107 c
--7859.9087 8566.0859 -7860.1895 8566.1563 -7860.498 8566.2207 c
--7860.8081 8566.2852 -7861.1455 8566.3438 -7861.5098 8566.3945 c
--7861.873 8566.4463 -7862.2622 8566.4893 -7862.6714 8566.5254 c
--7863.0791 8566.5615 -7863.5088 8566.5898 -7863.9546 8566.6084 c
--7864.3984 8566.627 -7864.8594 8566.6367 -7865.3311 8566.6367 c
--7865.8022 8566.6367 -7866.2642 8566.627 -7866.708 8566.6084 c
--7867.1538 8566.5898 -7867.582 8566.5615 -7867.9912 8566.5254 c
--7868.3999 8566.4893 -7868.7881 8566.4463 -7869.1519 8566.3945 c
--7869.5151 8566.3438 -7869.8545 8566.2852 -7870.1631 8566.2207 c
--7870.4727 8566.1563 -7870.752 8566.0859 -7870.998 8566.0107 c
--7871.2441 8565.9346 -7871.4551 8565.8545 -7871.6279 8565.7695 c
--7871.8018 8565.6846 -7871.9351 8565.5947 -7872.0264 8565.5029 c
--7872.1167 8565.4102 -7872.165 8565.3145 -7872.165 8565.2158 C
--7872.165 8563.4033 L
--7872.165 8562.9229 -7871.0186 8562.499 -7869.2642 8562.2412 C
--7869.2935 8562.1953 -7869.3135 8562.1484 -7869.3135 8562.0986 C
--7869.2344 8562.0986 L
--7869.2344 8561.875 L
--7869.2842 8561.8164 -7869.3135 8561.7549 -7869.3135 8561.6895 C
--7869.2344 8561.6895 L
--7869.2344 8561.4658 L
--7869.2842 8561.4072 -7869.3135 8561.3457 -7869.3135 8561.2803 C
--7869.2344 8561.2803 L
--7869.2344 8561.0557 L
--7869.2842 8560.9971 -7869.3135 8560.9355 -7869.3135 8560.8701 C
--7869.2344 8560.8701 L
--7869.2344 8560.6465 L
--7869.2842 8560.5879 -7869.3135 8560.5264 -7869.3135 8560.4609 C
--7869.2344 8560.4609 L
--7869.2344 8560.2373 L
--7869.2842 8560.1787 -7869.3135 8560.1162 -7869.3135 8560.0518 C
--7869.2344 8560.0518 L
--7869.2344 8559.8271 L
--7869.2842 8559.7686 -7869.3135 8559.707 -7869.3135 8559.6416 C
--7869.2344 8559.6416 L
--7869.2344 8559.418 L
--7869.2842 8559.3594 -7869.3135 8559.2979 -7869.3135 8559.2324 C
--7869.2344 8559.2324 L
--7869.2344 8559.0078 L
--7869.2842 8558.9502 -7869.3135 8558.8877 -7869.3135 8558.8232 C
--7869.2344 8558.8232 L
--7869.2344 8558.5986 L
--7869.2842 8558.54 -7869.3135 8558.4785 -7869.3135 8558.4131 C
--7869.2344 8558.4131 L
--7869.2344 8558.1885 L
--7869.2842 8558.1309 -7869.3135 8558.0693 -7869.3135 8558.0039 C
--7869.2344 8558.0039 L
--7869.2344 8557.7793 L
--7869.2842 8557.7217 -7869.3135 8557.6592 -7869.3135 8557.5947 C
--7869.2344 8557.5947 L
--7869.2344 8557.3701 L
--7869.2842 8557.3115 -7869.3135 8557.25 -7869.3135 8557.1846 C
--7869.2344 8557.1846 L
--7869.2344 8556.96 L
--7869.2842 8556.9023 -7869.3135 8556.8408 -7869.3135 8556.7754 C
--7869.2344 8556.7754 L
--7869.2344 8556.5508 L
--7869.2842 8556.4922 -7869.3135 8556.4307 -7869.3135 8556.3652 C
--7869.2344 8556.3652 L
--7869.2344 8556.1416 L
--7869.2842 8556.083 -7869.3135 8556.0215 -7869.3135 8555.9561 C
--7869.2344 8555.9561 L
--7869.2344 8555.7324 L
--7869.2842 8555.6738 -7869.3135 8555.6123 -7869.3135 8555.5469 C
--7869.2344 8555.5469 L
--7869.2344 8555.3223 L
--7869.2842 8555.2637 -7869.3135 8555.2021 -7869.3135 8555.1367 C
--7869.2344 8555.1367 L
--7869.2344 8554.9131 L
--7869.2842 8554.8545 -7869.3135 8554.793 -7869.3135 8554.7275 C
--7869.2344 8554.7275 L
--7869.2344 8554.5029 L
--7869.2842 8554.4443 -7869.3135 8554.3838 -7869.3135 8554.3184 C
--7869.2344 8554.3184 L
--7869.2344 8554.0938 L
--7869.2842 8554.0361 -7869.3135 8553.9736 -7869.3135 8553.9092 C
--7869.2344 8553.9092 L
--7869.2344 8553.6846 L
--7869.2842 8553.626 -7869.3135 8553.5645 -7869.3135 8553.499 C
--7869.2344 8553.499 L
--7869.2344 8553.2744 L
--7869.2842 8553.2158 -7869.3135 8553.1543 -7869.3135 8553.0898 C
--7869.2344 8553.0898 L
--7869.2344 8552.8652 L
--7869.2842 8552.8066 -7869.3135 8552.7451 -7869.3135 8552.6797 C
--7869.2344 8552.6797 L
--7869.2344 8552.5586 L
--7869.5654 8552.5107 -7869.8774 8552.457 -7870.1631 8552.3975 c
--7870.4727 8552.333 -7870.752 8552.2627 -7870.998 8552.1875 c
--7871.2441 8552.1123 -7871.4551 8552.0303 -7871.6279 8551.9463 c
--7871.8018 8551.8604 -7871.9351 8551.7715 -7872.0264 8551.6787 c
--7872.1167 8551.5869 -7872.165 8551.4912 -7872.165 8551.3926 C
--7872.165 8549.5801 L
--7872.165 8548.9551 -7870.2256 8548.4248 -7867.5303 8548.2344 C
--7867.4902 8548.1611 -7867.4502 8548.0869 -7867.4102 8548.0068 c
--7866.9209 8547.0283 -7867.063 8546.1836 -7867.2134 8545.2881 c
--7867.3066 8544.7305 -7867.4038 8544.1533 -7867.3496 8543.5215 c
--7867.208 8541.8691 -7865.4434 8541.0586 -7865.3975 8541.0439 C
--7858.4302 8541.0439 L
--7858.4014 8541.1729 L
--7858.4111 8541.1777 -7859.373 8541.6484 -7860.292 8543.1582 c
--7860.8286 8544.041 -7860.6929 8545.0957 -7860.5586 8546.1152 c
--7860.4639 8546.8379 -7860.376 8547.5195 -7860.5542 8548.0576 c
--7860.6104 8548.2256 -7860.6768 8548.3809 -7860.749 8548.5254 C
--7859.3662 8548.7861 -7858.4966 8549.1611 -7858.4966 8549.5801 C
-s
-0 D
--7871.626 8550.1338 m
--7871.7031 8550.0957 -7871.771 8550.0576 -7871.833 8550.0176 c
--7871.7729 8550.0566 -7871.7041 8550.0957 -7871.6279 8550.1328 C
--7871.6279 8550.1338 -7871.626 8550.1338 Y
-s
-1 D
--7870.1626 8564.4082 m
--7870.1631 8564.4082 -7870.1631 8564.4072 -7870.165 8564.4072 c
--7870.1641 8564.4072 -7870.1631 8564.4072 -7870.1631 8564.4082 C
--7870.1631 8564.4082 -7870.1626 8564.4082 v
-s
--7866.687 8564.7959 m
--7866.7026 8564.7959 -7866.7153 8564.7949 -7866.729 8564.7939 C
--7866.7217 8564.7939 -7866.7153 8564.7949 -7866.708 8564.7959 C
--7866.7026 8564.7959 -7866.6943 8564.7959 -7866.687 8564.7959 c
-s
--7863.9326 8564.7939 m
--7863.9463 8564.7949 -7863.9609 8564.7959 -7863.9736 8564.7959 c
--7863.9678 8564.7959 -7863.96 8564.7959 -7863.9546 8564.7959 C
--7863.9463 8564.7949 -7863.9409 8564.7939 -7863.9326 8564.7939 C
-s
-0 D
--7858.7119 8563.7588 m
--7858.6831 8563.7354 -7858.6582 8563.7129 -7858.6362 8563.6895 c
--7858.6138 8563.667 -7858.6016 8563.6426 -7858.585 8563.6201 c
--7858.6191 8563.667 -7858.6558 8563.7129 -7858.7119 8563.7588 c
-s
--7858.6758 8549.9023 m
--7858.7646 8549.9824 -7858.8848 8550.0596 -7859.0361 8550.1338 C
--7859.0352 8550.1338 -7859.0342 8550.1338 -7859.0342 8550.1328 C
--7858.8838 8550.0596 -7858.7646 8549.9814 -7858.6758 8549.9023 c
-s
-*U
-u
-0 O
-0 g
--7865.2832 8553.8408 m
-F
-u
-u
-0.67 g
--7858.7119 8563.7588 m
--7858.7959 8563.8262 -7858.9038 8563.8926 -7859.0342 8563.9561 C
--7859.0342 8563.9561 L
--7859.0342 8563.9561 L
--7859.6377 8564.2529 -7860.7134 8564.499 -7862.0664 8564.6514 c
--7862.0713 8564.6523 -7862.0762 8564.6533 -7862.0806 8564.6533 c
--7862.2671 8564.6748 -7862.459 8564.6934 -7862.6553 8564.7109 c
--7862.6602 8564.7119 -7862.665 8564.7119 -7862.6714 8564.7119 c
--7862.6768 8564.7129 -7862.6816 8564.7139 -7862.687 8564.7139 c
--7862.8838 8564.7314 -7863.084 8564.7461 -7863.29 8564.7598 c
--7863.2959 8564.7598 -7863.3018 8564.7607 -7863.3071 8564.7607 c
--7863.5127 8564.7744 -7863.7217 8564.7852 -7863.9326 8564.7939 c
--7863.9409 8564.7939 -7863.9463 8564.7949 -7863.9546 8564.7959 c
--7863.96 8564.7959 -7863.9678 8564.7959 -7863.9736 8564.7959 c
--7864.4121 8564.8145 -7864.8662 8564.8242 -7865.3311 8564.8242 c
--7865.7959 8564.8242 -7866.249 8564.8145 -7866.687 8564.7959 c
--7866.6943 8564.7959 -7866.7026 8564.7959 -7866.708 8564.7959 c
--7866.7153 8564.7949 -7866.7217 8564.7939 -7866.729 8564.7939 c
--7866.9409 8564.7852 -7867.1504 8564.7734 -7867.3545 8564.7607 c
--7867.3599 8564.7607 -7867.3647 8564.7598 -7867.3711 8564.7598 c
--7867.5767 8564.7461 -7867.7793 8564.7314 -7867.9761 8564.7139 c
--7867.9814 8564.7139 -7867.9863 8564.7129 -7867.9912 8564.7119 c
--7867.9951 8564.7119 -7868 8564.7119 -7868.0049 8564.7109 c
--7868.2026 8564.6943 -7868.3945 8564.6748 -7868.582 8564.6533 c
--7868.5854 8564.6533 -7868.5898 8564.6523 -7868.5938 8564.6514 c
--7869.1719 8564.5869 -7869.7002 8564.5039 -7870.1626 8564.4082 c
--7870.1631 8564.4082 -7870.1631 8564.4082 y
--7870.1631 8564.4072 -7870.1641 8564.4072 -7870.165 8564.4072 c
--7870.7822 8564.2793 -7871.2822 8564.126 -7871.6279 8563.9561 C
--7871.6279 8563.9561 L
--7871.6279 8563.9561 L
--7871.8257 8563.8594 -7871.9722 8563.7568 -7872.061 8563.6494 c
--7872.1279 8563.5693 -7872.165 8563.4873 -7872.165 8563.4033 C
--7872.165 8565.2158 L
--7872.165 8565.3145 -7872.1167 8565.4102 -7872.0264 8565.5029 c
--7871.9351 8565.5947 -7871.8018 8565.6846 -7871.6279 8565.7695 c
--7871.4551 8565.8545 -7871.2441 8565.9346 -7870.998 8566.0107 c
--7870.752 8566.0859 -7870.4727 8566.1563 -7870.1631 8566.2207 c
--7869.8545 8566.2852 -7869.5151 8566.3438 -7869.1519 8566.3945 c
--7868.7881 8566.4463 -7868.3999 8566.4893 -7867.9912 8566.5254 c
--7867.582 8566.5615 -7867.1538 8566.5898 -7866.708 8566.6084 c
--7866.2642 8566.627 -7865.8022 8566.6367 -7865.3311 8566.6367 c
--7864.8594 8566.6367 -7864.3984 8566.627 -7863.9546 8566.6084 c
--7863.5088 8566.5898 -7863.0791 8566.5615 -7862.6714 8566.5254 c
--7862.2622 8566.4893 -7861.873 8566.4463 -7861.5098 8566.3945 c
--7861.1455 8566.3438 -7860.8081 8566.2852 -7860.498 8566.2207 c
--7860.1895 8566.1563 -7859.9087 8566.0859 -7859.6641 8566.0107 c
--7859.418 8565.9346 -7859.2065 8565.8545 -7859.0342 8565.7695 c
--7858.8608 8565.6846 -7858.7266 8565.5947 -7858.6362 8565.5029 c
--7858.5439 8565.4102 -7858.4966 8565.3145 -7858.4966 8565.2158 C
--7858.4966 8563.4033 L
--7858.4966 8563.501 -7858.5439 8563.5967 -7858.6362 8563.6895 c
--7858.6582 8563.7129 -7858.6831 8563.7354 -7858.7119 8563.7588 c
-f
-0.39 g
--7861.4282 8562.5088 m
--7861.3481 8562.5088 L
--7861.3481 8562.5732 -7861.3774 8562.6357 -7861.4282 8562.6934 C
--7861.4282 8563.0381 L
--7861.4282 8563.0947 -7861.4551 8563.1494 -7861.5073 8563.2021 c
--7861.5586 8563.2549 -7861.6362 8563.3057 -7861.7344 8563.3545 c
--7861.834 8563.4033 -7861.9546 8563.4492 -7862.0942 8563.4922 c
--7862.2344 8563.5352 -7862.3945 8563.5752 -7862.5713 8563.6123 c
--7862.7471 8563.6484 -7862.9414 8563.6826 -7863.1489 8563.7119 c
--7863.3569 8563.7402 -7863.5786 8563.7656 -7863.811 8563.7861 c
--7864.0449 8563.8066 -7864.29 8563.8232 -7864.5439 8563.833 c
--7864.7974 8563.8438 -7865.0615 8563.8496 -7865.3311 8563.8496 c
--7865.6006 8563.8496 -7865.8633 8563.8438 -7866.1167 8563.833 c
--7866.3711 8563.8232 -7866.6162 8563.8066 -7866.8496 8563.7861 c
--7867.083 8563.7656 -7867.3057 8563.7402 -7867.5127 8563.7119 c
--7867.7207 8563.6826 -7867.9146 8563.6484 -7868.0913 8563.6123 c
--7868.2666 8563.5752 -7868.4272 8563.5352 -7868.5674 8563.4922 c
--7868.708 8563.4492 -7868.8281 8563.4033 -7868.9263 8563.3545 c
--7869.0264 8563.3057 -7869.1025 8563.2549 -7869.1553 8563.2021 c
--7869.2065 8563.1494 -7869.2344 8563.0947 -7869.2344 8563.0381 C
--7869.2344 8562.6934 L
--7869.2842 8562.6357 -7869.3135 8562.5732 -7869.3135 8562.5088 C
--7869.2344 8562.5088 L
--7869.2344 8562.2842 L
--7869.2466 8562.2705 -7869.2554 8562.2559 -7869.2642 8562.2412 C
--7871.0186 8562.499 -7872.165 8562.9229 -7872.165 8563.4033 c
--7872.165 8563.4873 -7872.1279 8563.5693 -7872.061 8563.6494 c
--7871.9722 8563.7568 -7871.8257 8563.8594 -7871.6279 8563.9561 C
--7871.6279 8563.9561 L
--7871.2822 8564.126 -7870.7822 8564.2793 -7870.165 8564.4072 c
--7870.1631 8564.4072 -7870.1631 8564.4082 -7870.1626 8564.4082 c
--7869.7002 8564.5039 -7869.1719 8564.5869 -7868.5938 8564.6514 c
--7868.5898 8564.6523 -7868.5854 8564.6533 -7868.582 8564.6533 c
--7868.3945 8564.6748 -7868.2026 8564.6943 -7868.0049 8564.7109 c
--7867.9951 8564.7119 -7867.9858 8564.7129 -7867.9761 8564.7139 c
--7867.7793 8564.7314 -7867.5767 8564.7461 -7867.3711 8564.7598 c
--7867.3647 8564.7598 -7867.3599 8564.7607 -7867.3545 8564.7607 c
--7867.1504 8564.7734 -7866.9409 8564.7852 -7866.729 8564.7939 c
--7866.7153 8564.7949 -7866.7026 8564.7959 -7866.687 8564.7959 c
--7866.249 8564.8145 -7865.7959 8564.8242 -7865.3311 8564.8242 c
--7864.8662 8564.8242 -7864.4121 8564.8145 -7863.9736 8564.7959 c
--7863.9609 8564.7959 -7863.9463 8564.7949 -7863.9326 8564.7939 c
--7863.7217 8564.7852 -7863.5127 8564.7744 -7863.3071 8564.7607 c
--7863.3018 8564.7607 -7863.2959 8564.7598 -7863.29 8564.7598 c
--7863.084 8564.7461 -7862.8838 8564.7314 -7862.687 8564.7139 c
--7862.6768 8564.7129 -7862.666 8564.7119 -7862.6553 8564.7109 c
--7862.459 8564.6934 -7862.2671 8564.6748 -7862.0806 8564.6533 c
--7862.0762 8564.6533 -7862.0713 8564.6523 -7862.0664 8564.6514 c
--7860.7134 8564.499 -7859.6377 8564.2529 -7859.0342 8563.9561 C
--7859.0342 8563.9561 L
--7858.9038 8563.8926 -7858.7959 8563.8262 -7858.7119 8563.7588 c
--7858.5713 8563.6445 -7858.4966 8563.5254 -7858.4966 8563.4033 c
--7858.4966 8562.9229 -7859.6431 8562.499 -7861.3984 8562.2412 C
--7861.4072 8562.2559 -7861.416 8562.2705 -7861.4282 8562.2842 C
--7861.4282 8562.5088 L
-f
-0.55 g
--7865.3311 8558.4756 m
--7867.041 8558.4756 -7868.8442 8558.2334 -7869.2344 8557.7793 C
--7869.2344 8558.0039 L
--7869.1782 8558.0039 L
--7869.1782 8558.3564 -7867.5986 8558.75 -7865.3311 8558.75 c
--7863.063 8558.75 -7861.4834 8558.3564 -7861.4834 8558.0039 C
--7861.4282 8558.0039 L
--7861.4282 8557.7793 L
--7861.8174 8558.2334 -7863.6201 8558.4756 -7865.3311 8558.4756 c
-f
--7865.3311 8555.6094 m
--7867.041 8555.6094 -7868.8442 8555.3662 -7869.2344 8554.9131 C
--7869.2344 8555.1367 L
--7869.1782 8555.1367 L
--7869.1782 8555.4902 -7867.5986 8555.8838 -7865.3311 8555.8838 c
--7863.063 8555.8838 -7861.4834 8555.4902 -7861.4834 8555.1367 C
--7861.4282 8555.1367 L
--7861.4282 8554.9131 L
--7861.8174 8555.3662 -7863.6201 8555.6094 -7865.3311 8555.6094 c
-f
--7865.3311 8558.8857 m
--7867.041 8558.8857 -7868.8442 8558.6426 -7869.2344 8558.1885 C
--7869.2344 8558.4131 L
--7869.1782 8558.4131 L
--7869.1782 8558.7666 -7867.5986 8559.1602 -7865.3311 8559.1602 c
--7863.063 8559.1602 -7861.4834 8558.7666 -7861.4834 8558.4131 C
--7861.4282 8558.4131 L
--7861.4282 8558.1885 L
--7861.8174 8558.6426 -7863.6201 8558.8857 -7865.3311 8558.8857 c
-f
--7865.3311 8559.2949 m
--7867.041 8559.2949 -7868.8442 8559.0518 -7869.2344 8558.5986 C
--7869.2344 8558.8232 L
--7869.1782 8558.8232 L
--7869.1782 8559.1758 -7867.5986 8559.5693 -7865.3311 8559.5693 c
--7863.063 8559.5693 -7861.4834 8559.1758 -7861.4834 8558.8232 C
--7861.4282 8558.8232 L
--7861.4282 8558.5986 L
--7861.8174 8559.0518 -7863.6201 8559.2949 -7865.3311 8559.2949 c
-f
--7865.3311 8556.0186 m
--7867.041 8556.0186 -7868.8442 8555.7764 -7869.2344 8555.3223 C
--7869.2344 8555.5469 L
--7869.1782 8555.5469 L
--7869.1782 8555.8994 -7867.5986 8556.293 -7865.3311 8556.293 c
--7863.063 8556.293 -7861.4834 8555.8994 -7861.4834 8555.5469 C
--7861.4282 8555.5469 L
--7861.4282 8555.3223 L
--7861.8174 8555.7764 -7863.6201 8556.0186 -7865.3311 8556.0186 c
-f
--7865.3311 8557.2471 m
--7867.041 8557.2471 -7868.8442 8557.0039 -7869.2344 8556.5508 C
--7869.2344 8556.7754 L
--7869.1782 8556.7754 L
--7869.1782 8557.1279 -7867.5986 8557.5225 -7865.3311 8557.5225 c
--7863.063 8557.5225 -7861.4834 8557.1279 -7861.4834 8556.7754 C
--7861.4282 8556.7754 L
--7861.4282 8556.5508 L
--7861.8174 8557.0039 -7863.6201 8557.2471 -7865.3311 8557.2471 c
-f
--7865.3311 8558.0664 m
--7867.041 8558.0664 -7868.8442 8557.8232 -7869.2344 8557.3701 C
--7869.2344 8557.5947 L
--7869.1782 8557.5947 L
--7869.1782 8557.9473 -7867.5986 8558.3408 -7865.3311 8558.3408 c
--7863.063 8558.3408 -7861.4834 8557.9473 -7861.4834 8557.5947 C
--7861.4282 8557.5947 L
--7861.4282 8557.3701 L
--7861.8174 8557.8232 -7863.6201 8558.0664 -7865.3311 8558.0664 c
-f
--7865.3311 8556.8379 m
--7867.041 8556.8379 -7868.8442 8556.5947 -7869.2344 8556.1416 C
--7869.2344 8556.3652 L
--7869.1782 8556.3652 L
--7869.1782 8556.7188 -7867.5986 8557.1123 -7865.3311 8557.1123 c
--7863.063 8557.1123 -7861.4834 8556.7188 -7861.4834 8556.3652 C
--7861.4282 8556.3652 L
--7861.4282 8556.1416 L
--7861.8174 8556.5947 -7863.6201 8556.8379 -7865.3311 8556.8379 c
-f
--7865.3311 8553.9717 m
--7867.041 8553.9717 -7868.8442 8553.7285 -7869.2344 8553.2744 C
--7869.2344 8553.499 L
--7869.1782 8553.499 L
--7869.1782 8553.8516 -7867.5986 8554.2451 -7865.3311 8554.2451 c
--7863.063 8554.2451 -7861.4834 8553.8516 -7861.4834 8553.499 C
--7861.4282 8553.499 L
--7861.4282 8553.2744 L
--7861.8174 8553.7285 -7863.6201 8553.9717 -7865.3311 8553.9717 c
-f
--7865.3311 8554.79 m
--7867.041 8554.79 -7868.8442 8554.5479 -7869.2344 8554.0938 C
--7869.2344 8554.3184 L
--7869.1782 8554.3184 L
--7869.1782 8554.6709 -7867.5986 8555.0645 -7865.3311 8555.0645 c
--7863.063 8555.0645 -7861.4834 8554.6709 -7861.4834 8554.3184 C
--7861.4282 8554.3184 L
--7861.4282 8554.0938 L
--7861.8174 8554.5479 -7863.6201 8554.79 -7865.3311 8554.79 c
-f
--7865.3311 8557.6572 m
--7867.041 8557.6572 -7868.8442 8557.4141 -7869.2344 8556.96 C
--7869.2344 8557.1846 L
--7869.1782 8557.1846 L
--7869.1782 8557.5381 -7867.5986 8557.9307 -7865.3311 8557.9307 c
--7863.063 8557.9307 -7861.4834 8557.5381 -7861.4834 8557.1846 C
--7861.4282 8557.1846 L
--7861.4282 8556.96 L
--7861.8174 8557.4141 -7863.6201 8557.6572 -7865.3311 8557.6572 c
-f
--7865.3311 8556.4287 m
--7867.041 8556.4287 -7868.8442 8556.1855 -7869.2344 8555.7324 C
--7869.2344 8555.9561 L
--7869.1782 8555.9561 L
--7869.1782 8556.3096 -7867.5986 8556.7021 -7865.3311 8556.7021 c
--7863.063 8556.7021 -7861.4834 8556.3096 -7861.4834 8555.9561 C
--7861.4282 8555.9561 L
--7861.4282 8555.7324 L
--7861.8174 8556.1855 -7863.6201 8556.4287 -7865.3311 8556.4287 c
-f
--7865.3311 8554.3799 m
--7867.041 8554.3799 -7868.8442 8554.1377 -7869.2344 8553.6846 C
--7869.2344 8553.9092 L
--7869.1782 8553.9092 L
--7869.1782 8554.2617 -7867.5986 8554.6553 -7865.3311 8554.6553 c
--7863.063 8554.6553 -7861.4834 8554.2617 -7861.4834 8553.9092 C
--7861.4282 8553.9092 L
--7861.4282 8553.6846 L
--7861.8174 8554.1377 -7863.6201 8554.3799 -7865.3311 8554.3799 c
-f
--7865.3311 8555.1992 m
--7867.041 8555.1992 -7868.8442 8554.9561 -7869.2344 8554.5029 C
--7869.2344 8554.7275 L
--7869.1782 8554.7275 L
--7869.1782 8555.0811 -7867.5986 8555.4746 -7865.3311 8555.4746 c
--7863.063 8555.4746 -7861.4834 8555.0811 -7861.4834 8554.7275 C
--7861.4282 8554.7275 L
--7861.4282 8554.5029 L
--7861.8174 8554.9561 -7863.6201 8555.1992 -7865.3311 8555.1992 c
-f
--7865.3311 8561.3428 m
--7867.041 8561.3428 -7868.8442 8561.0996 -7869.2344 8560.6465 C
--7869.2344 8560.8701 L
--7869.1782 8560.8701 L
--7869.1782 8561.2236 -7867.5986 8561.6172 -7865.3311 8561.6172 c
--7863.063 8561.6172 -7861.4834 8561.2236 -7861.4834 8560.8701 C
--7861.4282 8560.8701 L
--7861.4282 8560.6465 L
--7861.8174 8561.0996 -7863.6201 8561.3428 -7865.3311 8561.3428 c
-f
--7865.3311 8562.5713 m
--7867.041 8562.5713 -7868.8442 8562.3281 -7869.2344 8561.875 C
--7869.2344 8562.0986 L
--7869.1782 8562.0986 L
--7869.1782 8562.4521 -7867.5986 8562.8457 -7865.3311 8562.8457 c
--7863.063 8562.8457 -7861.4834 8562.4521 -7861.4834 8562.0986 C
--7861.4282 8562.0986 L
--7861.4282 8561.875 L
--7861.8174 8562.3281 -7863.6201 8562.5713 -7865.3311 8562.5713 c
-f
--7865.3311 8562.1611 m
--7867.041 8562.1611 -7868.8442 8561.9189 -7869.2344 8561.4658 C
--7869.2344 8561.6895 L
--7869.1782 8561.6895 L
--7869.1782 8562.043 -7867.5986 8562.4365 -7865.3311 8562.4365 c
--7863.063 8562.4365 -7861.4834 8562.043 -7861.4834 8561.6895 C
--7861.4282 8561.6895 L
--7861.4282 8561.4658 L
--7861.8174 8561.9189 -7863.6201 8562.1611 -7865.3311 8562.1611 c
-f
--7865.3311 8559.7041 m
--7867.041 8559.7041 -7868.8442 8559.4619 -7869.2344 8559.0078 C
--7869.2344 8559.2324 L
--7869.1782 8559.2324 L
--7869.1782 8559.585 -7867.5986 8559.9795 -7865.3311 8559.9795 c
--7863.063 8559.9795 -7861.4834 8559.585 -7861.4834 8559.2324 C
--7861.4282 8559.2324 L
--7861.4282 8559.0078 L
--7861.8174 8559.4619 -7863.6201 8559.7041 -7865.3311 8559.7041 c
-f
--7865.3311 8560.9326 m
--7867.041 8560.9326 -7868.8442 8560.6904 -7869.2344 8560.2373 C
--7869.2344 8560.4609 L
--7869.1782 8560.4609 L
--7869.1782 8560.8135 -7867.5986 8561.208 -7865.3311 8561.208 c
--7863.063 8561.208 -7861.4834 8560.8135 -7861.4834 8560.4609 C
--7861.4282 8560.4609 L
--7861.4282 8560.2373 L
--7861.8174 8560.6904 -7863.6201 8560.9326 -7865.3311 8560.9326 c
-f
--7865.3311 8560.5234 m
--7867.041 8560.5234 -7868.8442 8560.2803 -7869.2344 8559.8271 C
--7869.2344 8560.0518 L
--7869.1782 8560.0518 L
--7869.1782 8560.4043 -7867.5986 8560.7979 -7865.3311 8560.7979 c
--7863.063 8560.7979 -7861.4834 8560.4043 -7861.4834 8560.0518 C
--7861.4282 8560.0518 L
--7861.4282 8559.8271 L
--7861.8174 8560.2803 -7863.6201 8560.5234 -7865.3311 8560.5234 c
-f
--7865.3311 8560.1143 m
--7867.041 8560.1143 -7868.8442 8559.8711 -7869.2344 8559.418 C
--7869.2344 8559.6416 L
--7869.1782 8559.6416 L
--7869.1782 8559.9951 -7867.5986 8560.3887 -7865.3311 8560.3887 c
--7863.063 8560.3887 -7861.4834 8559.9951 -7861.4834 8559.6416 C
--7861.4282 8559.6416 L
--7861.4282 8559.418 L
--7861.8174 8559.8711 -7863.6201 8560.1143 -7865.3311 8560.1143 c
-f
--7865.3311 8561.752 m
--7867.041 8561.752 -7868.8442 8561.5088 -7869.2344 8561.0557 C
--7869.2344 8561.2803 L
--7869.1782 8561.2803 L
--7869.1782 8561.6328 -7867.5986 8562.0264 -7865.3311 8562.0264 c
--7863.063 8562.0264 -7861.4834 8561.6328 -7861.4834 8561.2803 C
--7861.4282 8561.2803 L
--7861.4282 8561.0557 L
--7861.8174 8561.5088 -7863.6201 8561.752 -7865.3311 8561.752 c
-f
--7862.6714 8552.7021 m
--7863.0791 8552.7383 -7863.5088 8552.7666 -7863.9546 8552.7852 c
--7864.3984 8552.8037 -7864.8594 8552.8135 -7865.3311 8552.8135 c
--7865.8022 8552.8135 -7866.2642 8552.8037 -7866.708 8552.7852 c
--7867.1538 8552.7666 -7867.582 8552.7383 -7867.9912 8552.7021 c
--7868.3999 8552.666 -7868.7881 8552.6221 -7869.1519 8552.5713 c
--7869.1807 8552.5674 -7869.2065 8552.5625 -7869.2344 8552.5586 C
--7869.2344 8552.6797 L
--7869.1782 8552.6797 L
--7869.1782 8553.0322 -7867.5986 8553.4268 -7865.3311 8553.4268 c
--7863.063 8553.4268 -7861.4834 8553.0322 -7861.4834 8552.6797 C
--7861.4282 8552.6797 L
--7861.4282 8552.5586 L
--7861.4561 8552.5625 -7861.4814 8552.5674 -7861.5098 8552.5713 c
--7861.873 8552.6221 -7862.2622 8552.666 -7862.6714 8552.7021 c
-f
--7865.3311 8553.5615 m
--7867.041 8553.5615 -7868.8442 8553.3184 -7869.2344 8552.8652 C
--7869.2344 8553.0898 L
--7869.1782 8553.0898 L
--7869.1782 8553.4424 -7867.5986 8553.8359 -7865.3311 8553.8359 c
--7863.063 8553.8359 -7861.4834 8553.4424 -7861.4834 8553.0898 C
--7861.4282 8553.0898 L
--7861.4282 8552.8652 L
--7861.8174 8553.3184 -7863.6201 8553.5615 -7865.3311 8553.5615 c
-f
--7865.3311 8563.3896 m
--7867.041 8563.3896 -7868.8442 8563.1475 -7869.2344 8562.6934 C
--7869.2344 8563.0381 L
--7869.2344 8563.0947 -7869.2065 8563.1494 -7869.1553 8563.2021 c
--7869.1025 8563.2549 -7869.0264 8563.3057 -7868.9263 8563.3545 c
--7868.8281 8563.4033 -7868.708 8563.4492 -7868.5674 8563.4922 c
--7868.4272 8563.5352 -7868.2666 8563.5752 -7868.0913 8563.6123 c
--7867.9146 8563.6484 -7867.7207 8563.6826 -7867.5127 8563.7119 c
--7867.3057 8563.7402 -7867.083 8563.7656 -7866.8496 8563.7861 c
--7866.6162 8563.8066 -7866.3711 8563.8232 -7866.1167 8563.833 c
--7865.8633 8563.8438 -7865.6006 8563.8496 -7865.3311 8563.8496 c
--7865.0615 8563.8496 -7864.7974 8563.8438 -7864.5439 8563.833 c
--7864.29 8563.8232 -7864.0449 8563.8066 -7863.811 8563.7861 c
--7863.5786 8563.7656 -7863.3569 8563.7402 -7863.1489 8563.7119 c
--7862.9414 8563.6826 -7862.7471 8563.6484 -7862.5713 8563.6123 c
--7862.3945 8563.5752 -7862.2344 8563.5352 -7862.0942 8563.4922 c
--7861.9546 8563.4492 -7861.834 8563.4033 -7861.7344 8563.3545 c
--7861.6362 8563.3057 -7861.5586 8563.2549 -7861.5073 8563.2021 c
--7861.4551 8563.1494 -7861.4282 8563.0947 -7861.4282 8563.0381 C
--7861.4282 8562.6934 L
--7861.8174 8563.1475 -7863.6201 8563.3896 -7865.3311 8563.3896 c
-f
--7869.1782 8562.5088 m
--7869.1782 8562.8613 -7867.5986 8563.2549 -7865.3311 8563.2549 c
--7863.063 8563.2549 -7861.4834 8562.8613 -7861.4834 8562.5088 C
--7861.4282 8562.5088 L
--7861.4282 8562.2842 L
--7861.8174 8562.7373 -7863.6201 8562.9805 -7865.3311 8562.9805 c
--7867.041 8562.9805 -7868.8442 8562.7373 -7869.2344 8562.2842 C
--7869.2344 8562.5088 L
--7869.1782 8562.5088 L
-f
-0.15 g
--7865.3311 8553.4268 m
--7867.5986 8553.4268 -7869.1782 8553.0322 -7869.1782 8552.6797 C
--7869.2344 8552.6797 L
--7869.3135 8552.6797 L
--7869.3135 8552.7451 -7869.2842 8552.8066 -7869.2344 8552.8652 c
--7868.8442 8553.3184 -7867.041 8553.5615 -7865.3311 8553.5615 c
--7863.6201 8553.5615 -7861.8174 8553.3184 -7861.4282 8552.8652 c
--7861.3774 8552.8066 -7861.3481 8552.7451 -7861.3481 8552.6797 C
--7861.4282 8552.6797 L
--7861.4834 8552.6797 L
--7861.4834 8553.0322 -7863.063 8553.4268 -7865.3311 8553.4268 c
-f
--7865.3311 8553.8359 m
--7867.5986 8553.8359 -7869.1782 8553.4424 -7869.1782 8553.0898 C
--7869.2344 8553.0898 L
--7869.3135 8553.0898 L
--7869.3135 8553.1543 -7869.2842 8553.2158 -7869.2344 8553.2744 c
--7868.8442 8553.7285 -7867.041 8553.9717 -7865.3311 8553.9717 c
--7863.6201 8553.9717 -7861.8174 8553.7285 -7861.4282 8553.2744 c
--7861.3774 8553.2158 -7861.3481 8553.1543 -7861.3481 8553.0898 C
--7861.4282 8553.0898 L
--7861.4834 8553.0898 L
--7861.4834 8553.4424 -7863.063 8553.8359 -7865.3311 8553.8359 c
-f
--7865.3311 8554.2451 m
--7867.5986 8554.2451 -7869.1782 8553.8516 -7869.1782 8553.499 C
--7869.2344 8553.499 L
--7869.3135 8553.499 L
--7869.3135 8553.5645 -7869.2842 8553.626 -7869.2344 8553.6846 c
--7868.8442 8554.1377 -7867.041 8554.3799 -7865.3311 8554.3799 c
--7863.6201 8554.3799 -7861.8174 8554.1377 -7861.4282 8553.6846 c
--7861.3774 8553.626 -7861.3481 8553.5645 -7861.3481 8553.499 C
--7861.4282 8553.499 L
--7861.4834 8553.499 L
--7861.4834 8553.8516 -7863.063 8554.2451 -7865.3311 8554.2451 c
-f
--7865.3311 8554.6553 m
--7867.5986 8554.6553 -7869.1782 8554.2617 -7869.1782 8553.9092 C
--7869.2344 8553.9092 L
--7869.3135 8553.9092 L
--7869.3135 8553.9736 -7869.2842 8554.0361 -7869.2344 8554.0938 c
--7868.8442 8554.5479 -7867.041 8554.79 -7865.3311 8554.79 c
--7863.6201 8554.79 -7861.8174 8554.5479 -7861.4282 8554.0938 c
--7861.3774 8554.0361 -7861.3481 8553.9736 -7861.3481 8553.9092 C
--7861.4282 8553.9092 L
--7861.4834 8553.9092 L
--7861.4834 8554.2617 -7863.063 8554.6553 -7865.3311 8554.6553 c
-f
--7865.3311 8555.0645 m
--7867.5986 8555.0645 -7869.1782 8554.6709 -7869.1782 8554.3184 C
--7869.2344 8554.3184 L
--7869.3135 8554.3184 L
--7869.3135 8554.3838 -7869.2842 8554.4443 -7869.2344 8554.5029 c
--7868.8442 8554.9561 -7867.041 8555.1992 -7865.3311 8555.1992 c
--7863.6201 8555.1992 -7861.8174 8554.9561 -7861.4282 8554.5029 c
--7861.3774 8554.4443 -7861.3481 8554.3838 -7861.3481 8554.3184 C
--7861.4282 8554.3184 L
--7861.4834 8554.3184 L
--7861.4834 8554.6709 -7863.063 8555.0645 -7865.3311 8555.0645 c
-f
--7865.3311 8555.4746 m
--7867.5986 8555.4746 -7869.1782 8555.0811 -7869.1782 8554.7275 C
--7869.2344 8554.7275 L
--7869.3135 8554.7275 L
--7869.3135 8554.793 -7869.2842 8554.8545 -7869.2344 8554.9131 c
--7868.8442 8555.3662 -7867.041 8555.6094 -7865.3311 8555.6094 c
--7863.6201 8555.6094 -7861.8174 8555.3662 -7861.4282 8554.9131 c
--7861.3774 8554.8545 -7861.3481 8554.793 -7861.3481 8554.7275 C
--7861.4282 8554.7275 L
--7861.4834 8554.7275 L
--7861.4834 8555.0811 -7863.063 8555.4746 -7865.3311 8555.4746 c
-f
--7865.3311 8555.8838 m
--7867.5986 8555.8838 -7869.1782 8555.4902 -7869.1782 8555.1367 C
--7869.2344 8555.1367 L
--7869.3135 8555.1367 L
--7869.3135 8555.2021 -7869.2842 8555.2637 -7869.2344 8555.3223 c
--7868.8442 8555.7764 -7867.041 8556.0186 -7865.3311 8556.0186 c
--7863.6201 8556.0186 -7861.8174 8555.7764 -7861.4282 8555.3223 c
--7861.3774 8555.2637 -7861.3481 8555.2021 -7861.3481 8555.1367 C
--7861.4282 8555.1367 L
--7861.4834 8555.1367 L
--7861.4834 8555.4902 -7863.063 8555.8838 -7865.3311 8555.8838 c
-f
--7865.3311 8556.293 m
--7867.5986 8556.293 -7869.1782 8555.8994 -7869.1782 8555.5469 C
--7869.2344 8555.5469 L
--7869.3135 8555.5469 L
--7869.3135 8555.6123 -7869.2842 8555.6738 -7869.2344 8555.7324 c
--7868.8442 8556.1855 -7867.041 8556.4287 -7865.3311 8556.4287 c
--7863.6201 8556.4287 -7861.8174 8556.1855 -7861.4282 8555.7324 c
--7861.3774 8555.6738 -7861.3481 8555.6123 -7861.3481 8555.5469 C
--7861.4282 8555.5469 L
--7861.4834 8555.5469 L
--7861.4834 8555.8994 -7863.063 8556.293 -7865.3311 8556.293 c
-f
--7865.3311 8556.7021 m
--7867.5986 8556.7021 -7869.1782 8556.3096 -7869.1782 8555.9561 C
--7869.2344 8555.9561 L
--7869.3135 8555.9561 L
--7869.3135 8556.0215 -7869.2842 8556.083 -7869.2344 8556.1416 c
--7868.8442 8556.5947 -7867.041 8556.8379 -7865.3311 8556.8379 c
--7863.6201 8556.8379 -7861.8174 8556.5947 -7861.4282 8556.1416 c
--7861.3774 8556.083 -7861.3481 8556.0215 -7861.3481 8555.9561 C
--7861.4282 8555.9561 L
--7861.4834 8555.9561 L
--7861.4834 8556.3096 -7863.063 8556.7021 -7865.3311 8556.7021 c
-f
--7865.3311 8557.1123 m
--7867.5986 8557.1123 -7869.1782 8556.7188 -7869.1782 8556.3652 C
--7869.2344 8556.3652 L
--7869.3135 8556.3652 L
--7869.3135 8556.4307 -7869.2842 8556.4922 -7869.2344 8556.5508 c
--7868.8442 8557.0039 -7867.041 8557.2471 -7865.3311 8557.2471 c
--7863.6201 8557.2471 -7861.8174 8557.0039 -7861.4282 8556.5508 c
--7861.3774 8556.4922 -7861.3481 8556.4307 -7861.3481 8556.3652 C
--7861.4282 8556.3652 L
--7861.4834 8556.3652 L
--7861.4834 8556.7188 -7863.063 8557.1123 -7865.3311 8557.1123 c
-f
--7865.3311 8557.5225 m
--7867.5986 8557.5225 -7869.1782 8557.1279 -7869.1782 8556.7754 C
--7869.2344 8556.7754 L
--7869.3135 8556.7754 L
--7869.3135 8556.8408 -7869.2842 8556.9023 -7869.2344 8556.96 c
--7868.8442 8557.4141 -7867.041 8557.6572 -7865.3311 8557.6572 c
--7863.6201 8557.6572 -7861.8174 8557.4141 -7861.4282 8556.96 c
--7861.3774 8556.9023 -7861.3481 8556.8408 -7861.3481 8556.7754 C
--7861.4282 8556.7754 L
--7861.4834 8556.7754 L
--7861.4834 8557.1279 -7863.063 8557.5225 -7865.3311 8557.5225 c
-f
--7865.3311 8557.9307 m
--7867.5986 8557.9307 -7869.1782 8557.5381 -7869.1782 8557.1846 C
--7869.2344 8557.1846 L
--7869.3135 8557.1846 L
--7869.3135 8557.25 -7869.2842 8557.3115 -7869.2344 8557.3701 c
--7868.8442 8557.8232 -7867.041 8558.0664 -7865.3311 8558.0664 c
--7863.6201 8558.0664 -7861.8174 8557.8232 -7861.4282 8557.3701 c
--7861.3774 8557.3115 -7861.3481 8557.25 -7861.3481 8557.1846 C
--7861.4282 8557.1846 L
--7861.4834 8557.1846 L
--7861.4834 8557.5381 -7863.063 8557.9307 -7865.3311 8557.9307 c
-f
--7865.3311 8558.3408 m
--7867.5986 8558.3408 -7869.1782 8557.9473 -7869.1782 8557.5947 C
--7869.2344 8557.5947 L
--7869.3135 8557.5947 L
--7869.3135 8557.6592 -7869.2842 8557.7217 -7869.2344 8557.7793 c
--7868.8442 8558.2334 -7867.041 8558.4756 -7865.3311 8558.4756 c
--7863.6201 8558.4756 -7861.8174 8558.2334 -7861.4282 8557.7793 c
--7861.3774 8557.7217 -7861.3481 8557.6592 -7861.3481 8557.5947 C
--7861.4282 8557.5947 L
--7861.4834 8557.5947 L
--7861.4834 8557.9473 -7863.063 8558.3408 -7865.3311 8558.3408 c
-f
--7865.3311 8558.75 m
--7867.5986 8558.75 -7869.1782 8558.3564 -7869.1782 8558.0039 C
--7869.2344 8558.0039 L
--7869.3135 8558.0039 L
--7869.3135 8558.0693 -7869.2842 8558.1309 -7869.2344 8558.1885 c
--7868.8442 8558.6426 -7867.041 8558.8857 -7865.3311 8558.8857 c
--7863.6201 8558.8857 -7861.8174 8558.6426 -7861.4282 8558.1885 c
--7861.3774 8558.1309 -7861.3481 8558.0693 -7861.3481 8558.0039 C
--7861.4282 8558.0039 L
--7861.4834 8558.0039 L
--7861.4834 8558.3564 -7863.063 8558.75 -7865.3311 8558.75 c
-f
--7865.3311 8559.1602 m
--7867.5986 8559.1602 -7869.1782 8558.7666 -7869.1782 8558.4131 C
--7869.2344 8558.4131 L
--7869.3135 8558.4131 L
--7869.3135 8558.4785 -7869.2842 8558.54 -7869.2344 8558.5986 c
--7868.8442 8559.0518 -7867.041 8559.2949 -7865.3311 8559.2949 c
--7863.6201 8559.2949 -7861.8174 8559.0518 -7861.4282 8558.5986 c
--7861.3774 8558.54 -7861.3481 8558.4785 -7861.3481 8558.4131 C
--7861.4282 8558.4131 L
--7861.4834 8558.4131 L
--7861.4834 8558.7666 -7863.063 8559.1602 -7865.3311 8559.1602 c
-f
--7865.3311 8559.5693 m
--7867.5986 8559.5693 -7869.1782 8559.1758 -7869.1782 8558.8232 C
--7869.2344 8558.8232 L
--7869.3135 8558.8232 L
--7869.3135 8558.8877 -7869.2842 8558.9502 -7869.2344 8559.0078 c
--7868.8442 8559.4619 -7867.041 8559.7041 -7865.3311 8559.7041 c
--7863.6201 8559.7041 -7861.8174 8559.4619 -7861.4282 8559.0078 c
--7861.3774 8558.9502 -7861.3481 8558.8877 -7861.3481 8558.8232 C
--7861.4282 8558.8232 L
--7861.4834 8558.8232 L
--7861.4834 8559.1758 -7863.063 8559.5693 -7865.3311 8559.5693 c
-f
--7865.3311 8559.9795 m
--7867.5986 8559.9795 -7869.1782 8559.585 -7869.1782 8559.2324 C
--7869.2344 8559.2324 L
--7869.3135 8559.2324 L
--7869.3135 8559.2979 -7869.2842 8559.3594 -7869.2344 8559.418 c
--7868.8442 8559.8711 -7867.041 8560.1143 -7865.3311 8560.1143 c
--7863.6201 8560.1143 -7861.8174 8559.8711 -7861.4282 8559.418 c
--7861.3774 8559.3594 -7861.3481 8559.2979 -7861.3481 8559.2324 C
--7861.4282 8559.2324 L
--7861.4834 8559.2324 L
--7861.4834 8559.585 -7863.063 8559.9795 -7865.3311 8559.9795 c
-f
--7865.3311 8560.3887 m
--7867.5986 8560.3887 -7869.1782 8559.9951 -7869.1782 8559.6416 C
--7869.2344 8559.6416 L
--7869.3135 8559.6416 L
--7869.3135 8559.707 -7869.2842 8559.7686 -7869.2344 8559.8271 c
--7868.8442 8560.2803 -7867.041 8560.5234 -7865.3311 8560.5234 c
--7863.6201 8560.5234 -7861.8174 8560.2803 -7861.4282 8559.8271 c
--7861.3774 8559.7686 -7861.3481 8559.707 -7861.3481 8559.6416 C
--7861.4282 8559.6416 L
--7861.4834 8559.6416 L
--7861.4834 8559.9951 -7863.063 8560.3887 -7865.3311 8560.3887 c
-f
--7865.3311 8560.7979 m
--7867.5986 8560.7979 -7869.1782 8560.4043 -7869.1782 8560.0518 C
--7869.2344 8560.0518 L
--7869.3135 8560.0518 L
--7869.3135 8560.1162 -7869.2842 8560.1787 -7869.2344 8560.2373 c
--7868.8442 8560.6904 -7867.041 8560.9326 -7865.3311 8560.9326 c
--7863.6201 8560.9326 -7861.8174 8560.6904 -7861.4282 8560.2373 c
--7861.3774 8560.1787 -7861.3481 8560.1162 -7861.3481 8560.0518 C
--7861.4282 8560.0518 L
--7861.4834 8560.0518 L
--7861.4834 8560.4043 -7863.063 8560.7979 -7865.3311 8560.7979 c
-f
--7865.3311 8561.208 m
--7867.5986 8561.208 -7869.1782 8560.8135 -7869.1782 8560.4609 C
--7869.2344 8560.4609 L
--7869.3135 8560.4609 L
--7869.3135 8560.5264 -7869.2842 8560.5879 -7869.2344 8560.6465 c
--7868.8442 8561.0996 -7867.041 8561.3428 -7865.3311 8561.3428 c
--7863.6201 8561.3428 -7861.8174 8561.0996 -7861.4282 8560.6465 c
--7861.3774 8560.5879 -7861.3481 8560.5264 -7861.3481 8560.4609 C
--7861.4282 8560.4609 L
--7861.4834 8560.4609 L
--7861.4834 8560.8135 -7863.063 8561.208 -7865.3311 8561.208 c
-f
--7865.3311 8561.6172 m
--7867.5986 8561.6172 -7869.1782 8561.2236 -7869.1782 8560.8701 C
--7869.2344 8560.8701 L
--7869.3135 8560.8701 L
--7869.3135 8560.9355 -7869.2842 8560.9971 -7869.2344 8561.0557 c
--7868.8442 8561.5088 -7867.041 8561.752 -7865.3311 8561.752 c
--7863.6201 8561.752 -7861.8174 8561.5088 -7861.4282 8561.0557 c
--7861.3774 8560.9971 -7861.3481 8560.9355 -7861.3481 8560.8701 C
--7861.4282 8560.8701 L
--7861.4834 8560.8701 L
--7861.4834 8561.2236 -7863.063 8561.6172 -7865.3311 8561.6172 c
-f
--7865.3311 8562.0264 m
--7867.5986 8562.0264 -7869.1782 8561.6328 -7869.1782 8561.2803 C
--7869.2344 8561.2803 L
--7869.3135 8561.2803 L
--7869.3135 8561.3457 -7869.2842 8561.4072 -7869.2344 8561.4658 c
--7868.8442 8561.9189 -7867.041 8562.1611 -7865.3311 8562.1611 c
--7863.6201 8562.1611 -7861.8174 8561.9189 -7861.4282 8561.4658 c
--7861.3774 8561.4072 -7861.3481 8561.3457 -7861.3481 8561.2803 C
--7861.4282 8561.2803 L
--7861.4834 8561.2803 L
--7861.4834 8561.6328 -7863.063 8562.0264 -7865.3311 8562.0264 c
-f
--7865.3311 8562.4365 m
--7867.5986 8562.4365 -7869.1782 8562.043 -7869.1782 8561.6895 C
--7869.2344 8561.6895 L
--7869.3135 8561.6895 L
--7869.3135 8561.7549 -7869.2842 8561.8164 -7869.2344 8561.875 c
--7868.8442 8562.3281 -7867.041 8562.5713 -7865.3311 8562.5713 c
--7863.6201 8562.5713 -7861.8174 8562.3281 -7861.4282 8561.875 c
--7861.3774 8561.8164 -7861.3481 8561.7549 -7861.3481 8561.6895 C
--7861.4282 8561.6895 L
--7861.4834 8561.6895 L
--7861.4834 8562.043 -7863.063 8562.4365 -7865.3311 8562.4365 c
-f
--7865.3311 8562.8457 m
--7867.5986 8562.8457 -7869.1782 8562.4521 -7869.1782 8562.0986 C
--7869.2344 8562.0986 L
--7869.3135 8562.0986 L
--7869.3135 8562.1484 -7869.2935 8562.1953 -7869.2642 8562.2412 c
--7869.2554 8562.2559 -7869.2466 8562.2705 -7869.2344 8562.2842 c
--7868.8442 8562.7373 -7867.041 8562.9805 -7865.3311 8562.9805 c
--7863.6201 8562.9805 -7861.8174 8562.7373 -7861.4282 8562.2842 c
--7861.416 8562.2705 -7861.4072 8562.2559 -7861.3984 8562.2412 c
--7861.3682 8562.1953 -7861.3481 8562.1484 -7861.3481 8562.0986 C
--7861.4282 8562.0986 L
--7861.4834 8562.0986 L
--7861.4834 8562.4521 -7863.063 8562.8457 -7865.3311 8562.8457 c
-f
--7865.3311 8563.2549 m
--7867.5986 8563.2549 -7869.1782 8562.8613 -7869.1782 8562.5088 C
--7869.2344 8562.5088 L
--7869.3135 8562.5088 L
--7869.3135 8562.5732 -7869.2842 8562.6357 -7869.2344 8562.6934 c
--7868.8442 8563.1475 -7867.041 8563.3896 -7865.3311 8563.3896 c
--7863.6201 8563.3896 -7861.8174 8563.1475 -7861.4282 8562.6934 c
--7861.3774 8562.6357 -7861.3481 8562.5732 -7861.3481 8562.5088 C
--7861.4282 8562.5088 L
--7861.4834 8562.5088 L
--7861.4834 8562.8613 -7863.063 8563.2549 -7865.3311 8563.2549 c
-f
-0.67 g
--7858.6758 8549.9023 m
--7858.7646 8549.9814 -7858.8838 8550.0596 -7859.0342 8550.1328 c
--7859.0342 8550.1338 -7859.0352 8550.1338 -7859.0361 8550.1338 c
--7859.1226 8550.1768 -7859.2168 8550.2178 -7859.3218 8550.2568 c
--7859.3218 8550.2568 l
--7859.5313 8550.3369 -7859.7759 8550.4131 -7860.0527 8550.4824 c
--7860.0562 8550.4834 -7860.0591 8550.4844 -7860.0625 8550.4854 c
--7860.6152 8550.624 -7861.293 8550.7402 -7862.0591 8550.8271 c
--7862.0698 8550.8281 -7862.0786 8550.8291 -7862.0889 8550.8311 c
--7862.4639 8550.873 -7862.8608 8550.9082 -7863.2734 8550.9346 c
--7863.292 8550.9365 -7863.3086 8550.9375 -7863.3262 8550.9385 c
--7863.5176 8550.9502 -7863.7119 8550.9609 -7863.9102 8550.9697 c
--7863.9248 8550.9697 -7863.9385 8550.9717 -7863.9546 8550.9717 c
--7863.9678 8550.9727 -7863.9824 8550.9727 -7863.9966 8550.9736 c
--7864.2026 8550.9814 -7864.4111 8550.9883 -7864.6226 8550.9932 c
--7864.6279 8550.9932 -7864.6353 8550.9932 -7864.6416 8550.9932 c
--7864.8682 8550.998 -7865.0977 8551.001 -7865.3311 8551.001 c
--7865.563 8551.001 -7865.7935 8550.998 -7866.021 8550.9932 c
--7866.0264 8550.9932 -7866.0337 8550.9932 -7866.04 8550.9932 c
--7866.251 8550.9883 -7866.46 8550.9814 -7866.665 8550.9736 c
--7866.6782 8550.9727 -7866.6943 8550.9727 -7866.708 8550.9717 c
--7866.7231 8550.9717 -7866.7378 8550.9697 -7866.752 8550.9697 c
--7866.9502 8550.9609 -7867.1455 8550.9502 -7867.3369 8550.9385 c
--7867.3535 8550.9375 -7867.3706 8550.9365 -7867.3862 8550.9346 c
--7867.8008 8550.9082 -7868.1982 8550.873 -7868.5752 8550.8311 c
--7868.584 8550.8291 -7868.5918 8550.8291 -7868.6016 8550.8281 c
--7869.3682 8550.7402 -7870.0474 8550.624 -7870.6001 8550.4854 c
--7870.6025 8550.4844 -7870.6055 8550.4834 -7870.6079 8550.4824 c
--7871.0234 8550.3779 -7871.3672 8550.2607 -7871.626 8550.1338 c
--7871.6279 8550.1338 -7871.6279 8550.1328 v
--7871.7041 8550.0957 -7871.7729 8550.0566 -7871.833 8550.0176 c
--7871.979 8549.9238 -7872.0806 8549.8262 -7872.1294 8549.7256 c
--7872.1538 8549.6777 -7872.165 8549.6289 -7872.165 8549.5801 C
--7872.165 8551.3926 L
--7872.165 8551.4912 -7872.1167 8551.5869 -7872.0264 8551.6787 c
--7871.9351 8551.7715 -7871.8018 8551.8604 -7871.6279 8551.9463 c
--7871.4551 8552.0303 -7871.2441 8552.1123 -7870.998 8552.1875 c
--7870.752 8552.2627 -7870.4727 8552.333 -7870.1631 8552.3975 c
--7869.8774 8552.457 -7869.5654 8552.5107 -7869.2344 8552.5586 c
--7869.2065 8552.5625 -7869.1807 8552.5674 -7869.1519 8552.5713 c
--7868.7881 8552.6221 -7868.3999 8552.666 -7867.9912 8552.7021 c
--7867.582 8552.7383 -7867.1538 8552.7666 -7866.708 8552.7852 c
--7866.2642 8552.8037 -7865.8022 8552.8135 -7865.3311 8552.8135 c
--7864.8594 8552.8135 -7864.3984 8552.8037 -7863.9546 8552.7852 c
--7863.5088 8552.7666 -7863.0791 8552.7383 -7862.6714 8552.7021 c
--7862.2622 8552.666 -7861.873 8552.6221 -7861.5098 8552.5713 c
--7861.4814 8552.5674 -7861.4561 8552.5625 -7861.4282 8552.5586 c
--7861.0967 8552.5107 -7860.7842 8552.457 -7860.498 8552.3975 c
--7860.1895 8552.333 -7859.9087 8552.2627 -7859.6641 8552.1875 c
--7859.418 8552.1123 -7859.2065 8552.0303 -7859.0342 8551.9463 c
--7858.8608 8551.8604 -7858.7266 8551.7715 -7858.6362 8551.6787 c
--7858.5439 8551.5869 -7858.4966 8551.4912 -7858.4966 8551.3926 C
--7858.4966 8549.5801 L
--7858.4966 8549.6533 -7858.5234 8549.7256 -7858.5752 8549.7959 c
--7858.6016 8549.832 -7858.6362 8549.8672 -7858.6758 8549.9023 c
-f
-0.39 g
--7860.749 8548.5254 m
--7861.2017 8549.4326 -7861.8945 8549.8896 -7861.9287 8549.9111 C
--7861.9458 8549.9209 L
--7868.9648 8549.9209 L
--7868.9814 8549.7881 L
--7868.9746 8549.7861 -7868.269 8549.5869 -7867.5303 8548.2344 C
--7870.2256 8548.4248 -7872.165 8548.9551 -7872.165 8549.5801 c
--7872.165 8549.6289 -7872.1538 8549.6777 -7872.1294 8549.7256 c
--7872.0806 8549.8262 -7871.979 8549.9238 -7871.833 8550.0176 c
--7871.771 8550.0576 -7871.7031 8550.0957 -7871.626 8550.1338 c
--7871.3672 8550.2607 -7871.0234 8550.3779 -7870.6079 8550.4824 c
--7870.6055 8550.4834 -7870.6025 8550.4844 -7870.6001 8550.4854 c
--7870.0474 8550.624 -7869.3682 8550.7402 -7868.6016 8550.8281 c
--7868.5918 8550.8291 -7868.584 8550.8291 -7868.5752 8550.8311 c
--7868.1982 8550.873 -7867.8008 8550.9082 -7867.3862 8550.9346 c
--7867.3706 8550.9365 -7867.3535 8550.9375 -7867.3369 8550.9385 c
--7867.1455 8550.9502 -7866.9502 8550.9609 -7866.752 8550.9697 c
--7866.7222 8550.9707 -7866.6943 8550.9717 -7866.665 8550.9736 c
--7866.46 8550.9814 -7866.251 8550.9883 -7866.04 8550.9932 c
--7866.0337 8550.9932 -7866.0264 8550.9932 -7866.021 8550.9932 c
--7865.7935 8550.998 -7865.563 8551.001 -7865.3311 8551.001 c
--7865.0977 8551.001 -7864.8682 8550.998 -7864.6416 8550.9932 c
--7864.6353 8550.9932 -7864.6279 8550.9932 -7864.6226 8550.9932 c
--7864.4111 8550.9883 -7864.2026 8550.9814 -7863.9966 8550.9736 c
--7863.9678 8550.9717 -7863.9385 8550.9707 -7863.9102 8550.9697 c
--7863.7119 8550.9609 -7863.5176 8550.9502 -7863.3262 8550.9385 c
--7863.3086 8550.9375 -7863.292 8550.9365 -7863.2734 8550.9346 c
--7862.8608 8550.9082 -7862.4639 8550.873 -7862.0889 8550.8311 c
--7862.0786 8550.8291 -7862.0698 8550.8281 -7862.0591 8550.8271 c
--7861.293 8550.7402 -7860.6152 8550.624 -7860.0625 8550.4854 c
--7860.0591 8550.4844 -7860.0562 8550.4834 -7860.0527 8550.4824 c
--7859.7759 8550.4131 -7859.5313 8550.3369 -7859.3218 8550.2568 C
--7859.3218 8550.2568 L
--7859.2168 8550.2178 -7859.1226 8550.1768 -7859.0361 8550.1338 c
--7858.8848 8550.0596 -7858.7646 8549.9824 -7858.6758 8549.9023 c
--7858.6362 8549.8672 -7858.6016 8549.832 -7858.5752 8549.7959 c
--7858.5234 8549.7256 -7858.4966 8549.6533 -7858.4966 8549.5801 c
--7858.4966 8549.1611 -7859.3662 8548.7861 -7860.749 8548.5254 C
-f
-*u
-1 g
--7868.6729 8549.7861 m
--7868.1362 8549.7861 -7862.0264 8549.7861 -7861.9863 8549.7861 C
--7861.9033 8549.7305 -7861.0566 8549.1357 -7860.6826 8548.0156 c
--7860.6118 8547.8037 -7860.5874 8547.5654 -7860.5874 8547.3086 c
--7860.5874 8546.9463 -7860.6382 8546.5459 -7860.6929 8546.1328 c
--7860.751 8545.6885 -7860.813 8545.2168 -7860.813 8544.749 c
--7860.813 8544.1709 -7860.7178 8543.5986 -7860.4072 8543.0879 c
--7859.7178 8541.9551 -7859.019 8541.4033 -7858.6768 8541.1787 C
--7859.1343 8541.1787 -7865.3706 8541.1738 Y
--7865.3882 8541.1807 -7867.0806 8541.9609 -7867.2144 8543.5332 c
--7867.2256 8543.6553 -7867.2305 8543.7744 -7867.2305 8543.8926 c
--7867.2305 8544.3721 -7867.1543 8544.8252 -7867.0801 8545.2666 c
--7867.0063 8545.7021 -7866.9351 8546.127 -7866.9351 8546.5615 c
--7866.9351 8547.041 -7867.0225 8547.5332 -7867.2886 8548.0674 c
--7867.8271 8549.1416 -7868.3599 8549.5967 -7868.6729 8549.7861 C
-f
-1 D
--7862.2344 8548.8447 m
--7866.7441 8548.8447 L
--7866.7441 8548.71 L
--7862.2344 8548.71 L
--7862.2344 8548.8447 L
-f
--7861.6958 8544.6045 m
--7866.1377 8544.6045 L
--7866.1377 8544.4697 L
--7861.6958 8544.4697 L
--7861.6958 8544.6045 L
-f
-0 D
--7861.4946 8546.1523 m
--7861.4946 8546.2871 L
--7866.0034 8546.2871 L
--7866.0034 8546.1523 L
--7861.4946 8546.1523 L
-f
--7866.0713 8545.4785 m
--7861.9658 8545.4785 L
--7861.9658 8545.6133 L
--7866.0713 8545.6133 L
--7866.0713 8545.4785 L
-f
-1 D
--7866.0034 8547.0947 m
--7861.5615 8547.0947 L
--7861.5615 8547.2295 L
--7866.0034 8547.2295 L
--7866.0034 8547.0947 L
-f
--7865.3311 8541.7764 m
--7860.6865 8541.7764 L
--7860.6865 8541.9121 L
--7865.3311 8541.9121 L
--7865.3311 8541.7764 L
-f
--7865.8018 8542.3154 m
--7862.1006 8542.3154 L
--7862.1006 8542.4502 L
--7865.8018 8542.4502 L
--7865.8018 8542.3154 L
-f
--7866.1377 8543.0557 m
--7861.4272 8543.0557 L
--7861.4272 8543.1904 L
--7866.1377 8543.1904 L
--7866.1377 8543.0557 L
-f
--7866.2729 8543.7959 m
--7861.5615 8543.7959 L
--7861.5615 8543.9307 L
--7866.2729 8543.9307 L
--7866.2729 8543.7959 L
-f
-0 D
--7866.2729 8547.9014 m
--7861.8975 8547.9014 L
--7861.8975 8548.0371 L
--7866.2729 8548.0371 L
--7866.2729 8547.9014 L
-f
-*U
-*u
-0 g
--7868.9814 8549.7881 m
--7868.9648 8549.9209 L
--7861.9458 8549.9209 L
--7861.9287 8549.9111 L
--7861.8945 8549.8896 -7861.2017 8549.4326 -7860.749 8548.5254 c
--7860.6768 8548.3809 -7860.6104 8548.2256 -7860.5542 8548.0576 c
--7860.376 8547.5195 -7860.4639 8546.8379 -7860.5586 8546.1152 c
--7860.6929 8545.0957 -7860.8286 8544.041 -7860.292 8543.1582 c
--7859.373 8541.6484 -7858.4111 8541.1777 -7858.4014 8541.1729 C
--7858.4302 8541.0439 L
--7865.3975 8541.0439 L
--7865.4434 8541.0586 -7867.208 8541.8691 -7867.3496 8543.5215 c
--7867.4038 8544.1533 -7867.3066 8544.7305 -7867.2134 8545.2881 c
--7867.063 8546.1836 -7866.9209 8547.0283 -7867.4102 8548.0068 c
--7867.4502 8548.0869 -7867.4902 8548.1611 -7867.5303 8548.2344 c
--7868.269 8549.5869 -7868.9746 8549.7861 -7868.9814 8549.7881 C
-f
-1 D
--7866.9351 8546.5615 m
--7866.9351 8546.127 -7867.0063 8545.7021 -7867.0801 8545.2666 c
--7867.1543 8544.8252 -7867.2305 8544.3721 -7867.2305 8543.8926 c
--7867.2305 8543.7744 -7867.2256 8543.6553 -7867.2144 8543.5332 c
--7867.0806 8541.9609 -7865.3882 8541.1807 -7865.3706 8541.1738 C
--7859.1343 8541.1787 -7858.6768 8541.1787 V
--7859.019 8541.4033 -7859.7178 8541.9551 -7860.4072 8543.0879 c
--7860.7178 8543.5986 -7860.813 8544.1709 -7860.813 8544.749 c
--7860.813 8545.2168 -7860.751 8545.6885 -7860.6929 8546.1328 c
--7860.6382 8546.5459 -7860.5874 8546.9463 -7860.5874 8547.3086 c
--7860.5874 8547.5654 -7860.6118 8547.8037 -7860.6826 8548.0156 c
--7861.0566 8549.1357 -7861.9033 8549.7305 -7861.9863 8549.7861 C
--7862.0264 8549.7861 -7868.1362 8549.7861 -7868.6729 8549.7861 C
--7868.3599 8549.5967 -7867.8271 8549.1416 -7867.2886 8548.0674 c
--7867.0225 8547.5332 -7866.9351 8547.041 -7866.9351 8546.5615 c
-f
-*U
-0 D
--7860.6865 8541.7764 m
--7865.3311 8541.7764 L
--7865.3311 8541.9121 L
--7860.6865 8541.9121 L
--7860.6865 8541.7764 L
-f
--7862.1006 8542.3154 m
--7865.8018 8542.3154 L
--7865.8018 8542.4502 L
--7862.1006 8542.4502 L
--7862.1006 8542.3154 L
-f
--7861.4272 8543.0557 m
--7866.1377 8543.0557 L
--7866.1377 8543.1904 L
--7861.4272 8543.1904 L
--7861.4272 8543.0557 L
-f
--7861.5615 8543.7959 m
--7866.2729 8543.7959 L
--7866.2729 8543.9307 L
--7861.5615 8543.9307 L
--7861.5615 8543.7959 L
-f
--7866.1377 8544.6045 m
--7861.6958 8544.6045 L
--7861.6958 8544.4697 L
--7866.1377 8544.4697 L
--7866.1377 8544.6045 L
-f
--7861.9658 8545.4785 m
--7866.0713 8545.4785 L
--7866.0713 8545.6133 L
--7861.9658 8545.6133 L
--7861.9658 8545.4785 L
-f
--7866.0034 8546.2871 m
--7861.4946 8546.2871 L
--7861.4946 8546.1523 L
--7866.0034 8546.1523 L
--7866.0034 8546.2871 L
-f
--7861.5615 8547.0947 m
--7866.0034 8547.0947 L
--7866.0034 8547.2295 L
--7861.5615 8547.2295 L
--7861.5615 8547.0947 L
-f
--7861.8975 8547.9014 m
--7866.2729 8547.9014 L
--7866.2729 8548.0371 L
--7861.8975 8548.0371 L
--7861.8975 8547.9014 L
-f
--7866.7441 8548.8447 m
--7862.2344 8548.8447 L
--7862.2344 8548.71 L
--7866.7441 8548.71 L
--7866.7441 8548.8447 L
-f
-U
-U
-U
-0 To
-1 0 0 -1 -7864.4927 8576.5957 0 Tp
-0 Tv
-TP
--11.5064 0 Td
-0 Tr
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
-0 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-23.6196 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 3.2805 3.2805 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
-0 Tc
-0 Tw
-(Spool) Tx 1 0 Tk
-(\r) TX
-TO
-U
-%AI8_EndBrushPattern
-%AI5_End_NonPrinting--
-%AI5_BeginPalette
-0 0 Pb
-1 1 1 1 ([Registration]) 0 Xs
-([Registration]) Pc
-0 0 0 0.15 (15%) 0 0 Xk
-(15%) Pc
-0 0 0 0.3 (30%) 0 0 Xk
-(30%) Pc
-0 0 0 0.5 (50%) 0 0 Xk
-(50%) Pc
-0 0 0 0.75 (75%) 0 0 Xk
-(75%) Pc
-(horizontal rules) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(horizontal rules) Pc
-(bi-direction diagonals) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(bi-direction diagonals) Pc
-(one direction diagonals) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(one direction diagonals) Pc
-(white dots) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(white dots) Pc
-(black dots) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(black dots) Pc
-PB
-%AI5_EndPalette
-%AI5_Begin_NonPrinting
-Np
-%AI8_BeginPluginObject
-(Adobe Brush Manager Order)
-(Adobe Brush Manager Order)
-( Adobe Scatter Brush Tool/ Print spooler/ Adobe Scatter Brush Tool/ Pr) -
-(inter/ Adobe Scatter Brush Tool/ Client 1/ Adobe Scatter Brush Tool/ F) -
-(ile Server/) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Client 1)
-(1 /New Pattern 19/ 0 0.0784314 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(File Server)
-(1 /New Pattern 21/ 0 0.184314 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Print spooler)
-(1 /New Pattern 42/ 0 1 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Printer)
-(1 /New Pattern 10/ 0 0.160784 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI5_End_NonPrinting--
-%AI5_Begin_NonPrinting
-Np
-%AI8_PluginGroupInfo
-(Adobe Path Blends) (Adobe Blends Plugin) (Live Blends)
-%AI8_PluginGroupInfo
-(Adobe PatternOnPath Brush Tool) (Adobe Pattern Brush Plugin) (Art Brush Tool)
-%AI8_PluginGroupInfo
-(Adobe ArtOnPath Brush Tool) (Adobe Art Brush Plugin) (Art Brush Tool)
-%AI8_PluginGroupInfo
-(Adobe Calligraphic Brush Tool) (Undo New Calligraphic Brush) (Calligraphic Brush Tool)
-%AI8_PluginGroupInfo
-(Adobe Scatter Brush Tool) (Adobe Scatter Brush Plugin) (Scatter Brush Tool)
-%AI5_End_NonPrinting--
-%%EndSetup
-%AI5_BeginLayer
-1 1 1 1 0 0 1 0 79 128 255 0 50 Lb
-(Layer 1) Ln
-0 A
-0 R
-0 G
-800 Ar
-0 J 0 j 0.5 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-194.0713 301.835 m
-197.3433 301.833 200.6157 301.9365 203.8794 302.1709 c
-208.9277 302.5342 213.9385 303.2334 218.9448 303.96 c
-226.5107 305.0596 265.4395 308.9443 273.3052 307.7568 c
-273.0552 307.7939 396.9258 296.8955 409.877 309.8467 C
-S
-0 To
-1 0 0 1 178.9067 526.6191 0 Tp
-0 Tv
-TP
--12.7793 0 Td
-0 Tr
-0 O
-0 g
-1 w
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
--4.5 Ts
-100 100 Tz
--20 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-23.6196 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 3.2805 3.2805 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
--0.18 Tc
-0 Tw
-(Pr) Tx 1 -15 Tk
-(inter) Tx 1 0 Tk
-(\r) TX
-TO
-u
-%_1 g
-%_0 R
-%_0.67 G
-%_1 M
-%_187.7012 503.2959 m
-%_B
-%_U
-%_0 Ap
-0 A
-u
-0 O
-1 g
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-187.7012 503.2959 m
-F
-u
-0.8 g
-201.4326 494.2217 m
-221.4771 501.0791 l
-219.897 503.9805 l
-207.2358 500.0244 l
-201.1694 503.9805 l
-201.4326 494.2217 l
-f
-0 R
-0.9 G
-0.5 w
-220.1689 504.1064 m
-207.2358 500.0244 l
-S
-0.5 G
-221.4771 501.0791 m
-219.897 503.9805 l
-S
-0.25 G
-201.4326 494.2217 m
-221.4771 501.0791 l
-S
-0.5 G
-207.2358 500.0244 m
-201.1694 503.9805 l
-S
-0 O
-0.8 g
-1 w
-181.3882 511.6309 m
-193.519 516.9053 l
-196.9487 512.6865 l
-181.3882 511.6309 l
-f
-1 Ap
-0.57 g
-201.6963 492.376 m
-155.2759 492.376 L
-155.2759 489.4756 L
-201.6963 489.4756 L
-201.6963 492.376 L
-f
-0 Ap
-0 R
-0.5 G
-0.5 w
-193.519 516.9053 m
-196.9487 512.6865 l
-S
-0.9 G
-181.3882 511.6309 m
-194.0811 517.1826 l
-S
-0 O
-0.8 g
-1 w
-153.9551 513.668 m
-153.9551 492.3447 l
-202.7515 492.3447 l
-202.7515 509.5186 l
-199.3223 513.6084 l
-153.9551 513.668 l
-f
-0 R
-0.5 G
-0.5 w
-153.9551 497.9141 m
-202.7515 497.9141 l
-S
-156.8574 510.3115 m
-166.3535 510.3115 l
-S
-156.8574 508.6631 m
-166.3535 508.6631 l
-S
-156.8574 507.0156 m
-166.3535 507.0156 l
-S
-156.8574 505.3672 m
-166.3535 505.3672 l
-S
-156.8574 503.7197 m
-166.3535 503.7197 l
-S
-202.7515 509.5186 m
-199.3223 513.6084 l
-S
-0.25 G
-153.9551 492.3447 m
-202.7515 492.3447 l
-202.7515 509.5186 l
-S
-0.9 G
-199.3223 513.6377 m
-153.9551 513.6377 l
-153.9551 492.0752 l
-S
-0.25 G
-201.6963 492.3447 m
-201.6963 489.4307 l
-155.2847 489.4307 l
-S
-U
-U
-(Adobe Scatter Brush Tool) 1 0 55 XP
-%010203043F8000003F8000003F8000003F80000000000000000000000000
-%0000000000000000000000000000000007995072696E746572
-/Adobe_Brushed_Path () XT
-1 Ap
-0 O
-0.99 g
-201.5142 493.9092 m
-189.7397 493.9092 L
-189.7397 496.7178 L
-201.5142 496.7178 L
-201.5142 493.9092 L
-b
-0 Ap
-0 G
-193.917 495.4238 m
-197.189 495.4229 200.4614 495.5264 203.7251 495.7607 c
-208.7734 496.123 213.7842 496.8223 218.7905 497.5498 c
-226.356 498.6494 248.2603 502.5342 256.1255 501.3457 c
-266.688 499.75 299.4917 492.1152 310.8125 503.4355 C
-S
-u
-%_0 O
-%_0 g
-%_1 w 1 M
-%_316.3848 505.874 m
-%_B
-%_U
-%_0 Ap
-0 A
-u
-0 O
-0 g
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-316.3848 505.874 m
-F
-u
-u
-u
-0.7495 g
-0 R
-0.25 G
-1 j 0.5 w 2 M
-339.3555 488.3164 m
-339.3555 490.3359 l
-332.9941 493.7686 l
-316.4414 493.7686 L
-299.8892 493.7686 l
-293.3267 490.3359 l
-293.3267 488.3164 l
-339.3555 488.3164 l
-b
-0.8748 G
-2 J 0 j
-316.4414 493.7686 m
-299.8892 493.7686 l
-293.3267 490.3359 l
-293.3267 488.3164 l
-S
-339.3555 490.3359 m
-332.9941 493.7686 l
-316.4414 493.7686 L
-S
-0 O
-0.9 g
-0.25 G
-0 J 1 j
-299.9888 492.5566 m
-295.9507 490.3359 l
-336.5273 490.3359 l
-333.0957 492.5566 l
-299.9888 492.5566 l
-b
-U
-u
-u
-0.7 g
-0 j 1 w 4 M
-305.2031 496.6641 m
-307.4805 496.707 L
-316.582 498.2754 L
-325.8633 496.707 L
-327.6582 496.707 L
-327.5977 494.8652 L
-305.2031 494.8652 L
-305.2031 496.6641 L
-f
-0 R
-0.25 G
-0.5 w
-327.6289 496.6641 m
-327.5371 494.8652 L
-305.1699 494.8652 L
-S
-0.9 G
-325.8301 496.6641 m
-327.6289 496.6641 L
-S
-0.25 G
-316.5234 498.2754 m
-325.8301 496.6641 L
-S
-0.9 G
-305.1699 494.8652 m
-305.1699 496.6641 L
-307.4238 496.6641 L
-316.5234 498.2754 L
-S
-U
-u
-0 O
-0.7 g
-1 w
-302.9604 499.7383 m
-312.2578 499.7852 L
-316.6152 501.5117 L
-321.1934 499.7852 L
-329.9063 499.7852 L
-329.834 497.7607 L
-302.9604 497.7607 L
-302.9604 499.7383 L
-f
-0 R
-0.25 G
-0.5 w
-329.873 499.7383 m
-329.7617 497.7607 L
-302.9243 497.7607 L
-S
-0.9 G
-321.1523 499.7383 m
-329.873 499.7383 L
-S
-0.25 G
-316.5449 501.5117 m
-321.1523 499.7383 L
-S
-0.9 G
-302.9243 497.7607 m
-302.9243 499.7383 L
-312.1875 499.7383 L
-316.5449 501.5117 L
-S
-U
-u
-0 O
-0.7495 g
-0.25 G
-2 J 2 M
-301.4438 500.5664 m
-301.436 522.4355 l
-302.4194 523.4316 L
-330.3965 523.4043 L
-331.3359 522.2656 L
-331.3359 500.8516 L
-330.5254 499.7119 L
-302.2915 499.7119 l
-301.4438 500.5664 L
-b
-/BBAccumRotation (4.712389) XT
-0.8748 G
-302.2915 499.7119 m
-301.4438 500.5664 L
-301.436 522.4355 l
-302.4194 523.4316 L
-330.3965 523.4043 L
-S
-/BBAccumRotation (4.712389) XT
-0 O
-0.9 g
-0.25 G
-328.3027 502.5996 m
-328.3223 520.5547 L
-304.4277 520.5547 L
-304.4258 502.6016 L
-328.3027 502.5996 L
-b
-/BBAccumRotation (4.712389) XT
-U
-U
-u
-0.15 G
-0 J 4 M
-332.9941 493.7686 m
-316.4414 493.7686 L
-299.8892 493.7686 L
-293.3267 490.3359 L
-293.3267 488.3164 L
-339.3555 488.3164 L
-339.3555 490.3359 L
-332.9941 493.7686 L
-s
-302.2915 499.7119 m
-302.9243 499.7119 L
-302.9243 497.7607 L
-302.9604 497.7715 L
-302.9604 497.7637 L
-302.9243 497.7607 L
-302.9604 497.7607 L
-313.5957 497.7607 L
-307.4805 496.707 L
-305.2031 496.6641 L
-305.1699 496.6641 L
-305.1699 494.8652 L
-305.2031 494.875 L
-305.2031 494.8682 L
-305.1699 494.8652 L
-305.2031 494.8652 L
-327.5371 494.8652 L
-327.5977 494.8652 L
-327.6582 496.707 L
-325.8633 496.707 L
-319.627 497.7607 L
-329.7617 497.7607 L
-329.834 497.7607 L
-329.9043 499.7119 L
-330.5254 499.7119 L
-331.3359 500.8516 L
-331.3359 522.2656 L
-330.3965 523.4043 L
-302.4194 523.4316 L
-301.436 522.4355 L
-301.4438 500.5664 L
-302.2915 499.7119 L
-s
-U
-U
-U
-U
-(Adobe Scatter Brush Tool) 1 0 56 XP
-%010203043F8000003F8000003F8000003F80000000000000000000000000
-%000000000000000000000000000000002043436C69656E742031
-/Adobe_Brushed_Path () XT
-0 To
-1 0 0 1 317.4297 527.9204 0 Tp
-0 Tv
-TP
--6.2504 0 Td
-0 Tr
-0 O
-0 g
-1 w
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
-0 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-23.6196 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 3.2805 3.2805 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
-0 Tc
-0 Tw
-(PC) Tx 1 0 Tk
-(\r) TX
-TO
-0 To
-1 0 0 1 245.729 542.0176 0 Tp
-0 Tv
-TP
--12.5009 0 Td
-0 Tr
-/_Helvetica-Bold 9 8.6581 -2.052 Tf
-(Client) Tx 1 0 Tk
-(\r) TX
-TO
-0 To
-1 0 0 1 179.0386 427.9668 0 Tp
-0 Tv
-TP
--12.7793 0 Td
-0 Tr
-/_Helvetica 9 8.379 -2.0251 Tf
--4.5 Ts
--20 Tt
-%_ -- XL
--0.18 Tc
-(Pr) Tx 1 -15 Tk
-(inter) Tx 1 0 Tk
-(\r) Tx 1 0 Tk
-TO
-u
-%_1 g
-%_0 R
-%_0.67 G
-%_1 M
-%_187.833 404.6426 m
-%_B
-%_U
-%_0 Ap
-0 A
-u
-0 O
-1 g
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-187.833 404.6426 m
-F
-u
-0.8 g
-201.5645 395.5684 m
-221.6094 402.4258 l
-220.0288 405.3271 l
-207.3677 401.3711 l
-201.3013 405.3271 l
-201.5645 395.5684 l
-f
-0 R
-0.9 G
-0.5 w
-220.3008 405.4531 m
-207.3677 401.3711 l
-S
-0.5 G
-221.6094 402.4258 m
-220.0288 405.3271 l
-S
-0.25 G
-201.5645 395.5684 m
-221.6094 402.4258 l
-S
-0.5 G
-207.3677 401.3711 m
-201.3013 405.3271 l
-S
-0 O
-0.8 g
-1 w
-181.52 412.9775 m
-193.6509 418.252 l
-197.0806 414.0332 l
-181.52 412.9775 l
-f
-1 Ap
-0.57 g
-201.8281 393.7227 m
-155.4077 393.7227 L
-155.4077 390.8223 L
-201.8281 390.8223 L
-201.8281 393.7227 L
-f
-0 Ap
-0 R
-0.5 G
-0.5 w
-193.6509 418.252 m
-197.0806 414.0332 l
-S
-0.9 G
-181.52 412.9775 m
-194.2129 418.5293 l
-S
-0 O
-0.8 g
-1 w
-154.0869 415.0146 m
-154.0869 393.6914 l
-202.8833 393.6914 l
-202.8833 410.8652 l
-199.4541 414.9551 l
-154.0869 415.0146 l
-f
-0 R
-0.5 G
-0.5 w
-154.0869 399.2607 m
-202.8833 399.2607 l
-S
-156.9893 411.6582 m
-166.4854 411.6582 l
-S
-156.9893 410.0098 m
-166.4854 410.0098 l
-S
-156.9893 408.3623 m
-166.4854 408.3623 l
-S
-156.9893 406.7139 m
-166.4854 406.7139 l
-S
-156.9893 405.0664 m
-166.4854 405.0664 l
-S
-202.8833 410.8652 m
-199.4541 414.9551 l
-S
-0.25 G
-154.0869 393.6914 m
-202.8833 393.6914 l
-202.8833 410.8652 l
-S
-0.9 G
-199.4541 414.9844 m
-154.0869 414.9844 l
-154.0869 393.4219 l
-S
-0.25 G
-201.8281 393.6914 m
-201.8281 390.7773 l
-155.4165 390.7773 l
-S
-U
-U
-(Adobe Scatter Brush Tool) 1 0 55 XP
-%010203043F8000003F8000003F8000003F80000000000000000000000000
-%0000000000000000000000000000000007995072696E746572
-/Adobe_Brushed_Path () XT
-1 Ap
-0 O
-0.99 g
-201.646 395.2559 m
-189.8716 395.2559 L
-189.8716 398.0645 L
-201.646 398.0645 L
-201.646 395.2559 L
-b
-0 Ap
-0 G
-194.0488 396.7715 m
-197.3208 396.7695 200.5933 396.873 203.8569 397.1074 c
-208.9053 397.4707 213.916 398.1699 218.9224 398.8965 c
-226.4883 399.9961 248.3921 403.8809 256.2573 402.6929 c
-266.8198 401.0972 330.748 393.4629 342.0684 404.7832 C
-S
-u
-%_0 O
-%_0 g
-%_1 w 1 M
-%_347.6406 407.2207 m
-%_B
-%_U
-%_0 Ap
-0 A
-u
-0 O
-0 g
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-347.6406 407.2207 m
-F
-u
-u
-u
-0.7495 g
-0 R
-0.25 G
-1 j 0.5 w 2 M
-370.6113 389.6631 m
-370.6113 391.6826 l
-364.25 395.1152 l
-347.6973 395.1152 L
-331.1445 395.1152 l
-324.582 391.6826 l
-324.582 389.6631 l
-370.6113 389.6631 l
-b
-0.8748 G
-2 J 0 j
-347.6973 395.1152 m
-331.1445 395.1152 l
-324.582 391.6826 l
-324.582 389.6631 l
-S
-370.6113 391.6826 m
-364.25 395.1152 l
-347.6973 395.1152 L
-S
-0 O
-0.9 g
-0.25 G
-0 J 1 j
-331.2441 393.9033 m
-327.2061 391.6826 l
-367.7832 391.6826 l
-364.3516 393.9033 l
-331.2441 393.9033 l
-b
-U
-u
-u
-0.7 g
-0 j 1 w 4 M
-336.458 398.0107 m
-338.7363 398.0537 L
-347.8379 399.6221 L
-357.1191 398.0537 L
-358.9141 398.0537 L
-358.8535 396.2119 L
-336.458 396.2119 L
-336.458 398.0107 L
-f
-0 R
-0.25 G
-0.5 w
-358.8848 398.0107 m
-358.793 396.2119 L
-336.4258 396.2119 L
-S
-0.9 G
-357.085 398.0107 m
-358.8848 398.0107 L
-S
-0.25 G
-347.7793 399.6221 m
-357.085 398.0107 L
-S
-0.9 G
-336.4258 396.2119 m
-336.4258 398.0107 L
-338.6797 398.0107 L
-347.7793 399.6221 L
-S
-U
-u
-0 O
-0.7 g
-1 w
-334.2158 401.085 m
-343.5127 401.1318 L
-347.8711 402.8584 L
-352.4492 401.1318 L
-361.1621 401.1318 L
-361.0898 399.1074 L
-334.2158 399.1074 L
-334.2158 401.085 L
-f
-0 R
-0.25 G
-0.5 w
-361.1289 401.085 m
-361.0176 399.1074 L
-334.1797 399.1074 L
-S
-0.9 G
-352.4072 401.085 m
-361.1289 401.085 L
-S
-0.25 G
-347.8008 402.8584 m
-352.4072 401.085 L
-S
-0.9 G
-334.1797 399.1074 m
-334.1797 401.085 L
-343.4424 401.085 L
-347.8008 402.8584 L
-S
-U
-u
-0 O
-0.7495 g
-0.25 G
-2 J 2 M
-332.6992 401.9131 m
-332.6914 423.7822 l
-333.6748 424.7783 L
-361.6523 424.751 L
-362.5908 423.6123 L
-362.5908 402.1982 L
-361.7813 401.0586 L
-333.5469 401.0586 l
-332.6992 401.9131 L
-b
-/BBAccumRotation (4.712389) XT
-0.8748 G
-333.5469 401.0586 m
-332.6992 401.9131 L
-332.6914 423.7822 l
-333.6748 424.7783 L
-361.6523 424.751 L
-S
-/BBAccumRotation (4.712389) XT
-0 O
-0.9 g
-0.25 G
-359.5586 403.9463 m
-359.5781 421.9014 L
-335.6836 421.9014 L
-335.6816 403.9482 L
-359.5586 403.9463 L
-b
-/BBAccumRotation (4.712389) XT
-U
-U
-u
-0.15 G
-0 J 4 M
-364.25 395.1152 m
-347.6973 395.1152 L
-331.1445 395.1152 L
-324.582 391.6826 L
-324.582 389.6631 L
-370.6113 389.6631 L
-370.6113 391.6826 L
-364.25 395.1152 L
-s
-333.5469 401.0586 m
-334.1797 401.0586 L
-334.1797 399.1074 L
-334.2158 399.1182 L
-334.2158 399.1104 L
-334.1797 399.1074 L
-334.2158 399.1074 L
-344.8516 399.1074 L
-338.7363 398.0537 L
-336.458 398.0107 L
-336.4258 398.0107 L
-336.4258 396.2119 L
-336.458 396.2217 L
-336.458 396.2148 L
-336.4258 396.2119 L
-336.458 396.2119 L
-358.793 396.2119 L
-358.8535 396.2119 L
-358.9141 398.0537 L
-357.1191 398.0537 L
-350.8828 399.1074 L
-361.0176 399.1074 L
-361.0898 399.1074 L
-361.1602 401.0586 L
-361.7813 401.0586 L
-362.5908 402.1982 L
-362.5908 423.6123 L
-361.6523 424.751 L
-333.6748 424.7783 L
-332.6914 423.7822 L
-332.6992 401.9131 L
-333.5469 401.0586 L
-s
-U
-U
-U
-U
-(Adobe Scatter Brush Tool) 1 0 56 XP
-%010203043F8000003F8000003F8000003F80000000000000000000000000
-%000000000000000000000000000000002043436C69656E742031
-/Adobe_Brushed_Path () XT
-0 To
-1 0 0 1 348.6855 430.2109 0 Tp
-0 Tv
-TP
--6.2504 0 Td
-0 Tr
-0 O
-0 g
-1 w
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
-0 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ -- XL
-0 TY
-0 TV
-23.6196 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 3.2805 3.2805 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
-0 Tc
-0 Tw
-(PC) Tx 1 0 Tk
-(\r) Tx 1 0 Tk
-TO
-0 To
-1 0 0 1 265.6528 451.4365 0 Tp
-0 Tv
-TP
--23.8037 0 Td
-0 Tr
-/_Helvetica-Bold 9 8.658 -2.052 Tf
-(Printser) Tx 1 -10 Tk
-(ver) Tx 1 0 Tk
-(\r) Tx 1 0 Tk
-TO
-u
-281.5698 398.6543 m
-F
-u
-u
-0 R
-0 G
-0.25 w
-297.9858 400.9424 m
-B
-0.9 g
-293.0542 398.5264 m
-293.0542 396.6377 L
-298.7534 396.6377 L
-293.0542 398.5264 L
-b
-0.65 g
-293.0542 396.6377 m
-293.0542 387.4463 L
-298.7534 387.4463 L
-298.7534 396.6377 L
-293.0542 396.6377 L
-b
-0.9 g
-293.0542 407.165 m
-293.0542 406.1494 L
-299.7944 406.1494 L
-293.0542 407.165 L
-b
-0.65 g
-293.0542 406.1494 m
-293.0542 404.1113 L
-299.7944 404.1113 L
-299.7944 406.1494 L
-293.0542 406.1494 L
-b
-0.9 g
-293.0542 403.418 m
-293.0542 401.9395 L
-302.9194 401.9395 L
-293.0542 403.418 L
-b
-0.65 g
-293.0542 401.9395 m
-293.0542 399.9443 L
-302.9194 399.9443 L
-302.9194 401.9395 L
-293.0542 401.9395 L
-b
-0.8158 g
-293.0542 406.1494 m
-293.0542 429.1064 L
-260.2212 429.1064 L
-260.2212 380.7354 L
-293.0542 380.7354 L
-293.0542 396.6377 L
-293.0542 401.9395 L
-293.0542 406.1494 L
-b
-276.6382 404.9209 m
-B
-0.4385 g
-260.2212 440.917 m
-293.0542 440.917 L
-293.0542 429.1064 L
-260.2212 429.1064 L
-260.2212 440.917 L
-b
-276.4995 435.0107 m
-B
-1 g
-280.0073 427.0225 m
-289.3804 427.0225 L
-289.3804 424.9385 L
-280.0073 424.9385 L
-280.0073 427.0225 L
-b
-284.6929 425.9814 m
-B
-260.1577 422.3652 m
-292.8999 422.3652 L
-S
-260.1577 398.3535 m
-293.0542 398.3535 L
-S
-0 O
-0 g
-296.4253 405.1299 m
-B
-295.9067 392.042 m
-B
-0.31 g
-269.019 440.917 m
-293.0542 440.917 L
-293.0542 438.7344 L
-274.7456 438.7344 L
-272.6304 436.6182 L
-272.6304 429.0674 L
-269.019 429.0674 L
-269.019 440.917 L
-b
-U
-U
-U
-0 To
-1 0 0 1 179.061 333.0303 0 Tp
-0 Tv
-TP
--12.7793 0 Td
-0 Tr
-0 g
-1 w
-/_Helvetica 9 8.379 -2.0251 Tf
--4.5 Ts
--20 Tt
--0.18 Tc
-(Pr) Tx 1 -15 Tk
-(inter) Tx 1 0 Tk
-(\r) Tx 1 0 Tk
-TO
-u
-%_1 g
-%_0 R
-%_0.67 G
-%_1 M
-%_187.8555 309.7061 m
-%_B
-%_U
-%_0 Ap
-0 A
-u
-0 O
-1 g
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-187.8555 309.7061 m
-F
-u
-0.8 g
-201.5869 300.6318 m
-221.6318 307.4893 l
-220.0513 310.3906 l
-207.3901 306.4346 l
-201.3237 310.3906 l
-201.5869 300.6318 l
-f
-0 R
-0.9 G
-0.5 w
-220.3232 310.5166 m
-207.3901 306.4346 l
-S
-0.5 G
-221.6318 307.4893 m
-220.0513 310.3906 l
-S
-0.25 G
-201.5869 300.6318 m
-221.6318 307.4893 l
-S
-0.5 G
-207.3901 306.4346 m
-201.3237 310.3906 l
-S
-0 O
-0.8 g
-1 w
-181.5425 318.041 m
-193.6733 323.3154 l
-197.103 319.0967 l
-181.5425 318.041 l
-f
-1 Ap
-0.57 g
-201.8506 298.7861 m
-155.4302 298.7861 L
-155.4302 295.8857 L
-201.8506 295.8857 L
-201.8506 298.7861 L
-f
-0 Ap
-0 R
-0.5 G
-0.5 w
-193.6733 323.3154 m
-197.103 319.0967 l
-S
-0.9 G
-181.5425 318.041 m
-194.2354 323.5928 l
-S
-0 O
-0.8 g
-1 w
-154.1094 320.0781 m
-154.1094 298.7549 l
-202.9058 298.7549 l
-202.9058 315.9287 l
-199.4766 320.0186 l
-154.1094 320.0781 l
-f
-0 R
-0.5 G
-0.5 w
-154.1094 304.3242 m
-202.9058 304.3242 l
-S
-157.0117 316.7217 m
-166.5078 316.7217 l
-S
-157.0117 315.0732 m
-166.5078 315.0732 l
-S
-157.0117 313.4258 m
-166.5078 313.4258 l
-S
-157.0117 311.7773 m
-166.5078 311.7773 l
-S
-157.0117 310.1299 m
-166.5078 310.1299 l
-S
-202.9058 315.9287 m
-199.4766 320.0186 l
-S
-0.25 G
-154.1094 298.7549 m
-202.9058 298.7549 l
-202.9058 315.9287 l
-S
-0.9 G
-199.4766 320.0479 m
-154.1094 320.0479 l
-154.1094 298.4854 l
-S
-0.25 G
-201.8506 298.7549 m
-201.8506 295.8408 l
-155.439 295.8408 l
-S
-U
-U
-(Adobe Scatter Brush Tool) 1 0 55 XP
-%010203043F8000003F8000003F8000003F80000000000000000000000000
-%0000000000000000000000000000000007995072696E746572
-/Adobe_Brushed_Path () XT
-1 Ap
-0 O
-0.99 g
-201.6685 300.3193 m
-189.894 300.3193 L
-189.894 303.1279 L
-201.6685 303.1279 L
-201.6685 300.3193 L
-b
-u
-%_0 Ap
-%_0 g
-%_0 G
-%_1 w 1 M
-%_415.4512 312.2842 m
-%_B
-%_U
-%_0 Ap
-0 A
-u
-0 O
-0 g
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-415.4512 312.2842 m
-F
-u
-u
-u
-0.7495 g
-0 R
-0.25 G
-1 j 0.5 w 2 M
-438.4219 294.7266 m
-438.4219 296.7461 l
-432.0605 300.1787 l
-415.5078 300.1787 L
-398.9551 300.1787 l
-392.3926 296.7461 l
-392.3926 294.7266 l
-438.4219 294.7266 l
-b
-0.8748 G
-2 J 0 j
-415.5078 300.1787 m
-398.9551 300.1787 l
-392.3926 296.7461 l
-392.3926 294.7266 l
-S
-438.4219 296.7461 m
-432.0605 300.1787 l
-415.5078 300.1787 L
-S
-0 O
-0.9 g
-0.25 G
-0 J 1 j
-399.0547 298.9668 m
-395.0166 296.7461 l
-435.5938 296.7461 l
-432.1621 298.9668 l
-399.0547 298.9668 l
-b
-U
-u
-u
-0.7 g
-0 j 1 w 4 M
-404.2686 303.0742 m
-406.5469 303.1172 L
-415.6484 304.6855 L
-424.9297 303.1172 L
-426.7246 303.1172 L
-426.6641 301.2754 L
-404.2686 301.2754 L
-404.2686 303.0742 L
-f
-0 R
-0.25 G
-0.5 w
-426.6953 303.0742 m
-426.6035 301.2754 L
-404.2363 301.2754 L
-S
-0.9 G
-424.8955 303.0742 m
-426.6953 303.0742 L
-S
-0.25 G
-415.5898 304.6855 m
-424.8955 303.0742 L
-S
-0.9 G
-404.2363 301.2754 m
-404.2363 303.0742 L
-406.4902 303.0742 L
-415.5898 304.6855 L
-S
-U
-u
-0 O
-0.7 g
-1 w
-402.0264 306.1484 m
-411.3232 306.1953 L
-415.6816 307.9219 L
-420.2598 306.1953 L
-428.9727 306.1953 L
-428.9004 304.1709 L
-402.0264 304.1709 L
-402.0264 306.1484 L
-f
-0 R
-0.25 G
-0.5 w
-428.9395 306.1484 m
-428.8281 304.1709 L
-401.9902 304.1709 L
-S
-0.9 G
-420.2178 306.1484 m
-428.9395 306.1484 L
-S
-0.25 G
-415.6113 307.9219 m
-420.2178 306.1484 L
-S
-0.9 G
-401.9902 304.1709 m
-401.9902 306.1484 L
-411.2529 306.1484 L
-415.6113 307.9219 L
-S
-U
-u
-0 O
-0.7495 g
-0.25 G
-2 J 2 M
-400.5098 306.9766 m
-400.502 328.8457 l
-401.4854 329.8418 L
-429.4629 329.8145 L
-430.4014 328.6758 L
-430.4014 307.2617 L
-429.5918 306.1221 L
-401.3574 306.1221 l
-400.5098 306.9766 L
-b
-/BBAccumRotation (4.712389) XT
-0.8748 G
-401.3574 306.1221 m
-400.5098 306.9766 L
-400.502 328.8457 l
-401.4854 329.8418 L
-429.4629 329.8145 L
-S
-/BBAccumRotation (4.712389) XT
-0 O
-0.9 g
-0.25 G
-427.3691 309.0098 m
-427.3887 326.9648 L
-403.4941 326.9648 L
-403.4922 309.0117 L
-427.3691 309.0098 L
-b
-/BBAccumRotation (4.712389) XT
-U
-U
-u
-0.15 G
-0 J 4 M
-432.0605 300.1787 m
-415.5078 300.1787 L
-398.9551 300.1787 L
-392.3926 296.7461 L
-392.3926 294.7266 L
-438.4219 294.7266 L
-438.4219 296.7461 L
-432.0605 300.1787 L
-s
-401.3574 306.1221 m
-401.9902 306.1221 L
-401.9902 304.1709 L
-402.0264 304.1816 L
-402.0264 304.1738 L
-401.9902 304.1709 L
-402.0264 304.1709 L
-412.6621 304.1709 L
-406.5469 303.1172 L
-404.2686 303.0742 L
-404.2363 303.0742 L
-404.2363 301.2754 L
-404.2686 301.2852 L
-404.2686 301.2783 L
-404.2363 301.2754 L
-404.2686 301.2754 L
-426.6035 301.2754 L
-426.6641 301.2754 L
-426.7246 303.1172 L
-424.9297 303.1172 L
-418.6934 304.1709 L
-428.8281 304.1709 L
-428.9004 304.1709 L
-428.9707 306.1221 L
-429.5918 306.1221 L
-430.4014 307.2617 L
-430.4014 328.6758 L
-429.4629 329.8145 L
-401.4854 329.8418 L
-400.502 328.8457 L
-400.5098 306.9766 L
-401.3574 306.1221 L
-s
-U
-U
-U
-U
-(Adobe Scatter Brush Tool) 1 0 56 XP
-%010203043F8000003F8000003F8000003F80000000000000000000000000
-%000000000000000000000000000000002043436C69656E742031
-/Adobe_Brushed_Path () XT
-0 To
-1 0 0 1 416.4961 335.2744 0 Tp
-0 Tv
-TP
--6.2504 0 Td
-0 Tr
-0 O
-0 g
-1 w
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
-0 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ -- XL
-0 TY
-0 TV
-23.6196 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 3.2805 3.2805 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
-0 Tc
-0 Tw
-(PC) Tx 1 0 Tk
-(\r) Tx 1 0 Tk
-TO
-0 To
-1 0 0 1 294.9165 342.126 0 Tp
-0 Tv
-TP
--21.3063 0 Td
-0 Tr
-/_Helvetica-Bold 9 8.658 -2.052 Tf
-(Fileser) Tx 1 -10 Tk
-(ver) Tx 1 0 Tk
-(\r) Tx 1 0 Tk
-TO
-u
-u
-0 To
-1 0 0 1 272.2954 291.0332 0 Tp
-0 Tv
-TP
--21.8418 0 Td
-0 Tr
-/_Helvetica 9 8.379 -2.0251 Tf
--4.5 Ts
-(Pr) Tx 1 -15 Tk
-(intser) Tx 1 -30 Tk
-(v) Tx 1 25 Tk
-(er) Tx 1 0 Tk
-(\r) Tx 1 0 Tk
-TO
-U
-U
-u
-%_0 R
-%_0 G
-%_277.3394 406.5059 m
-%_B
-%_U
-%_0 Ap
-0 A
-u
-0 O
-0 g
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-277.3394 406.5059 m
-F
-u
-*u
-0 R
-1 G
-283.3354 416.5078 m
-283.3354 414.6953 L
-283.3354 414.5967 283.2881 414.501 283.1958 414.4092 c
-283.1055 414.3164 282.9712 414.2275 282.7979 414.1416 c
-282.6255 414.0576 282.4141 413.9756 282.168 413.9004 c
-281.9233 413.8252 281.6426 413.7549 281.334 413.6904 c
-281.0479 413.6309 280.7354 413.5771 280.4038 413.5293 C
-280.4038 413.4082 L
-280.4839 413.4082 L
-280.4839 413.3428 280.4546 413.2813 280.4038 413.2227 C
-280.4038 412.998 L
-280.4839 412.998 L
-280.4839 412.9336 280.4546 412.8721 280.4038 412.8135 C
-280.4038 412.5889 L
-280.4839 412.5889 L
-280.4839 412.5234 280.4546 412.4619 280.4038 412.4033 C
-280.4038 412.1787 L
-280.4839 412.1787 L
-280.4839 412.1143 280.4546 412.0518 280.4038 411.9941 C
-280.4038 411.7695 L
-280.4839 411.7695 L
-280.4839 411.7041 280.4546 411.6436 280.4038 411.585 C
-280.4038 411.3604 L
-280.4839 411.3604 L
-280.4839 411.2949 280.4546 411.2334 280.4038 411.1748 C
-280.4038 410.9512 L
-280.4839 410.9512 L
-280.4839 410.8857 280.4546 410.8242 280.4038 410.7656 C
-280.4038 410.541 L
-280.4839 410.541 L
-280.4839 410.4756 280.4546 410.4141 280.4038 410.3555 C
-280.4038 410.1318 L
-280.4839 410.1318 L
-280.4839 410.0664 280.4546 410.0049 280.4038 409.9463 C
-280.4038 409.7227 L
-280.4839 409.7227 L
-280.4839 409.6572 280.4546 409.5957 280.4038 409.5371 C
-280.4038 409.3125 L
-280.4839 409.3125 L
-280.4839 409.2471 280.4546 409.1855 280.4038 409.1279 C
-280.4038 408.9033 L
-280.4839 408.9033 L
-280.4839 408.8379 280.4546 408.7764 280.4038 408.7178 C
-280.4038 408.4932 L
-280.4839 408.4932 L
-280.4839 408.4287 280.4546 408.3662 280.4038 408.3086 C
-280.4038 408.084 L
-280.4839 408.084 L
-280.4839 408.0186 280.4546 407.957 280.4038 407.8994 C
-280.4038 407.6748 L
-280.4839 407.6748 L
-280.4839 407.6094 280.4546 407.5479 280.4038 407.4893 C
-280.4038 407.2646 L
-280.4839 407.2646 L
-280.4839 407.2002 280.4546 407.1377 280.4038 407.0801 C
-280.4038 406.8555 L
-280.4839 406.8555 L
-280.4839 406.79 280.4546 406.7285 280.4038 406.6699 C
-280.4038 406.4463 L
-280.4839 406.4463 L
-280.4839 406.3809 280.4546 406.3193 280.4038 406.2607 C
-280.4038 406.0361 L
-280.4839 406.0361 L
-280.4839 405.9717 280.4546 405.9092 280.4038 405.8506 C
-280.4038 405.627 L
-280.4839 405.627 L
-280.4839 405.5615 280.4546 405.5 280.4038 405.4414 C
-280.4038 405.2178 L
-280.4839 405.2178 L
-280.4839 405.1523 280.4546 405.0908 280.4038 405.0322 C
-280.4038 404.8076 L
-280.4839 404.8076 L
-280.4839 404.7422 280.4546 404.6807 280.4038 404.6221 C
-280.4038 404.3984 L
-280.4839 404.3984 L
-280.4839 404.333 280.4546 404.2715 280.4038 404.2129 C
-280.4038 403.9893 L
-280.4839 403.9893 L
-280.4839 403.9395 280.4639 403.8926 280.4336 403.8467 C
-282.189 403.5889 283.3354 403.165 283.3354 402.6846 c
-283.3354 402.6289 283.3154 402.5732 283.2847 402.5186 c
-283.3154 402.5732 283.3354 402.6289 283.3354 402.6846 C
-283.3354 400.8721 L
-283.3354 400.7734 283.2881 400.6777 283.1958 400.585 c
-283.1055 400.4932 282.9712 400.4033 282.7979 400.3184 c
-282.6255 400.2334 282.4141 400.1533 282.168 400.0771 c
-281.9233 400.002 281.6426 399.9316 281.334 399.8672 c
-281.0239 399.8027 280.6865 399.7441 280.3223 399.6934 c
-279.959 399.6416 279.5698 399.5986 279.1606 399.5625 c
-278.7529 399.5264 278.3232 399.498 277.8774 399.4795 c
-277.4336 399.4609 276.9727 399.4512 276.501 399.4512 c
-276.0298 399.4512 275.5679 399.4609 275.124 399.4795 c
-274.6782 399.498 274.25 399.5264 273.8408 399.5625 c
-273.4321 399.5986 273.0439 399.6416 272.6802 399.6934 c
-272.3169 399.7441 271.9775 399.8027 271.6689 399.8672 c
-271.3594 399.9316 271.0801 400.002 270.834 400.0771 c
-270.5879 400.1533 270.377 400.2334 270.2041 400.3184 c
-270.0303 400.4033 269.897 400.4932 269.8057 400.585 c
-269.7153 400.6777 269.667 400.7734 269.667 400.8721 C
-269.667 402.6846 L
-269.667 403.165 270.8135 403.5889 272.5679 403.8467 C
-272.5386 403.8926 272.5186 403.9395 272.5186 403.9893 C
-272.5977 403.9893 L
-272.5977 404.2129 L
-272.5479 404.2715 272.5186 404.333 272.5186 404.3984 C
-272.5977 404.3984 L
-272.5977 404.6221 L
-272.5479 404.6807 272.5186 404.7422 272.5186 404.8076 C
-272.5977 404.8076 L
-272.5977 405.0322 L
-272.5479 405.0908 272.5186 405.1523 272.5186 405.2178 C
-272.5977 405.2178 L
-272.5977 405.4414 L
-272.5479 405.5 272.5186 405.5615 272.5186 405.627 C
-272.5977 405.627 L
-272.5977 405.8506 L
-272.5479 405.9092 272.5186 405.9717 272.5186 406.0361 C
-272.5977 406.0361 L
-272.5977 406.2607 L
-272.5479 406.3193 272.5186 406.3809 272.5186 406.4463 C
-272.5977 406.4463 L
-272.5977 406.6699 L
-272.5479 406.7285 272.5186 406.79 272.5186 406.8555 C
-272.5977 406.8555 L
-272.5977 407.0801 L
-272.5479 407.1377 272.5186 407.2002 272.5186 407.2646 C
-272.5977 407.2646 L
-272.5977 407.4893 L
-272.5479 407.5479 272.5186 407.6094 272.5186 407.6748 C
-272.5977 407.6748 L
-272.5977 407.8994 L
-272.5479 407.957 272.5186 408.0186 272.5186 408.084 C
-272.5977 408.084 L
-272.5977 408.3086 L
-272.5479 408.3662 272.5186 408.4287 272.5186 408.4932 C
-272.5977 408.4932 L
-272.5977 408.7178 L
-272.5479 408.7764 272.5186 408.8379 272.5186 408.9033 C
-272.5977 408.9033 L
-272.5977 409.1279 L
-272.5479 409.1855 272.5186 409.2471 272.5186 409.3125 C
-272.5977 409.3125 L
-272.5977 409.5371 L
-272.5479 409.5957 272.5186 409.6572 272.5186 409.7227 C
-272.5977 409.7227 L
-272.5977 409.9463 L
-272.5479 410.0049 272.5186 410.0664 272.5186 410.1318 C
-272.5977 410.1318 L
-272.5977 410.3555 L
-272.5479 410.4141 272.5186 410.4756 272.5186 410.541 C
-272.5977 410.541 L
-272.5977 410.7656 L
-272.5479 410.8242 272.5186 410.8857 272.5186 410.9512 C
-272.5977 410.9512 L
-272.5977 411.1748 L
-272.5479 411.2334 272.5186 411.2949 272.5186 411.3604 C
-272.5977 411.3604 L
-272.5977 411.585 L
-272.5479 411.6436 272.5186 411.7041 272.5186 411.7695 C
-272.5977 411.7695 L
-272.5977 411.9941 L
-272.5479 412.0518 272.5186 412.1143 272.5186 412.1787 C
-272.5977 412.1787 L
-272.5977 412.4033 L
-272.5479 412.4619 272.5186 412.5234 272.5186 412.5889 C
-272.5977 412.5889 L
-272.5977 412.8135 L
-272.5479 412.8721 272.5186 412.9336 272.5186 412.998 C
-272.5977 412.998 L
-272.5977 413.2227 L
-272.5479 413.2813 272.5186 413.3428 272.5186 413.4082 C
-272.5977 413.4082 L
-272.5977 413.5293 L
-272.2666 413.5771 271.9546 413.6309 271.6689 413.6904 c
-271.3594 413.7549 271.0801 413.8252 270.834 413.9004 c
-270.5879 413.9756 270.377 414.0576 270.2041 414.1416 c
-270.0303 414.2275 269.897 414.3164 269.8057 414.4092 c
-269.7153 414.501 269.667 414.5967 269.667 414.6953 C
-269.667 416.5078 L
-269.667 417.1328 271.6064 417.6631 274.3018 417.8535 C
-274.3418 417.9268 274.3818 418.001 274.4219 418.0811 c
-274.9111 419.0596 274.769 419.9043 274.6187 420.7998 c
-274.5254 421.3574 274.4282 421.9346 274.4824 422.5664 c
-274.624 424.2188 276.3887 425.0293 276.4346 425.0439 C
-283.4019 425.0439 L
-283.4307 424.915 L
-283.4209 424.9102 282.459 424.4395 281.54 422.9297 c
-281.0034 422.0469 281.1392 420.9922 281.2734 419.9727 c
-281.3682 419.25 281.4561 418.5684 281.2778 418.0303 c
-281.2217 417.8623 281.1553 417.707 281.083 417.5625 C
-282.4658 417.3018 283.3354 416.9268 283.3354 416.5078 C
-s
-1 D
-270.2061 415.9541 m
-270.1289 415.9922 270.061 416.0303 269.999 416.0703 c
-270.0591 416.0313 270.1279 415.9922 270.2041 415.9551 C
-270.2041 415.9541 270.2061 415.9541 Y
-s
-0 D
-271.6694 401.6797 m
-271.6689 401.6797 271.6689 401.6807 271.667 401.6807 c
-271.668 401.6807 271.6689 401.6807 271.6689 401.6797 C
-271.6689 401.6797 271.6694 401.6797 v
-s
-275.145 401.292 m
-275.1294 401.292 275.1167 401.293 275.103 401.2939 C
-275.1104 401.2939 275.1167 401.293 275.124 401.292 C
-275.1294 401.292 275.1377 401.292 275.145 401.292 c
-s
-1 D
-277.8994 401.2939 m
-277.8857 401.293 277.8711 401.292 277.8584 401.292 c
-277.8643 401.292 277.8721 401.292 277.8774 401.292 C
-277.8857 401.293 277.8911 401.2939 277.8994 401.2939 C
-s
-283.1201 402.3291 m
-283.1489 402.3525 283.1738 402.375 283.1958 402.3984 c
-283.2183 402.4209 283.2305 402.4453 283.2471 402.4678 c
-283.2129 402.4209 283.1763 402.375 283.1201 402.3291 c
-s
-283.1563 416.1855 m
-283.0674 416.1055 282.9473 416.0283 282.7959 415.9541 C
-282.7969 415.9541 282.7979 415.9541 282.7979 415.9551 C
-282.9482 416.0283 283.0674 416.1064 283.1563 416.1855 c
-s
-*U
-u
-0 O
-0 g
-0 D
-276.5488 412.2471 m
-F
-u
-u
-0.67 g
-283.1201 402.3291 m
-283.0361 402.2617 282.9282 402.1953 282.7979 402.1318 C
-282.7979 402.1318 L
-282.7979 402.1318 L
-282.1943 401.835 281.1187 401.5889 279.7656 401.4365 c
-279.7607 401.4355 279.7559 401.4346 279.7515 401.4346 c
-279.5649 401.4131 279.373 401.3945 279.1768 401.377 c
-279.1719 401.376 279.167 401.376 279.1606 401.376 c
-279.1553 401.375 279.1504 401.374 279.145 401.374 c
-278.9482 401.3564 278.748 401.3418 278.542 401.3281 c
-278.5361 401.3281 278.5303 401.3271 278.5249 401.3271 c
-278.3193 401.3135 278.1104 401.3027 277.8994 401.2939 c
-277.8911 401.2939 277.8857 401.293 277.8774 401.292 c
-277.8721 401.292 277.8643 401.292 277.8584 401.292 c
-277.4199 401.2734 276.9658 401.2637 276.501 401.2637 c
-276.0361 401.2637 275.583 401.2734 275.145 401.292 c
-275.1377 401.292 275.1294 401.292 275.124 401.292 c
-275.1167 401.293 275.1104 401.2939 275.103 401.2939 c
-274.8911 401.3027 274.6816 401.3145 274.4775 401.3271 c
-274.4722 401.3271 274.4673 401.3281 274.4609 401.3281 c
-274.2554 401.3418 274.0527 401.3564 273.856 401.374 c
-273.8506 401.374 273.8457 401.375 273.8408 401.376 c
-273.8369 401.376 273.832 401.376 273.8271 401.377 c
-273.6294 401.3936 273.4375 401.4131 273.25 401.4346 c
-273.2466 401.4346 273.2422 401.4355 273.2383 401.4365 c
-272.6602 401.501 272.1318 401.584 271.6694 401.6797 c
-271.6689 401.6797 271.6689 401.6797 y
-271.6689 401.6807 271.668 401.6807 271.667 401.6807 c
-271.0498 401.8086 270.5498 401.9619 270.2041 402.1318 C
-270.2041 402.1318 L
-270.2041 402.1318 L
-270.0063 402.2285 269.8599 402.3311 269.771 402.4385 c
-269.7041 402.5186 269.667 402.6006 269.667 402.6846 C
-269.667 400.8721 L
-269.667 400.7734 269.7153 400.6777 269.8057 400.585 c
-269.897 400.4932 270.0303 400.4033 270.2041 400.3184 c
-270.377 400.2334 270.5879 400.1533 270.834 400.0771 c
-271.0801 400.002 271.3594 399.9316 271.6689 399.8672 c
-271.9775 399.8027 272.3169 399.7441 272.6802 399.6934 c
-273.0439 399.6416 273.4321 399.5986 273.8408 399.5625 c
-274.25 399.5264 274.6782 399.498 275.124 399.4795 c
-275.5679 399.4609 276.0298 399.4512 276.501 399.4512 c
-276.9727 399.4512 277.4336 399.4609 277.8774 399.4795 c
-278.3232 399.498 278.7529 399.5264 279.1606 399.5625 c
-279.5698 399.5986 279.959 399.6416 280.3223 399.6934 c
-280.6865 399.7441 281.0239 399.8027 281.334 399.8672 c
-281.6426 399.9316 281.9233 400.002 282.168 400.0771 c
-282.4141 400.1533 282.6255 400.2334 282.7979 400.3184 c
-282.9712 400.4033 283.1055 400.4932 283.1958 400.585 c
-283.2881 400.6777 283.3354 400.7734 283.3354 400.8721 C
-283.3354 402.6846 L
-283.3354 402.5869 283.2881 402.4912 283.1958 402.3984 c
-283.1738 402.375 283.1489 402.3525 283.1201 402.3291 c
-f
-0.39 g
-280.4038 403.5791 m
-280.4839 403.5791 L
-280.4839 403.5146 280.4546 403.4521 280.4038 403.3945 C
-280.4038 403.0498 L
-280.4038 402.9932 280.377 402.9385 280.3247 402.8857 c
-280.2734 402.833 280.1958 402.7822 280.0977 402.7334 c
-279.998 402.6846 279.8774 402.6387 279.7378 402.5957 c
-279.5977 402.5527 279.4375 402.5127 279.2607 402.4756 c
-279.085 402.4395 278.8906 402.4053 278.6831 402.376 c
-278.4751 402.3477 278.2534 402.3223 278.021 402.3018 c
-277.7871 402.2813 277.542 402.2646 277.2881 402.2549 c
-277.0347 402.2441 276.7705 402.2383 276.501 402.2383 c
-276.2314 402.2383 275.9688 402.2441 275.7153 402.2549 c
-275.4609 402.2646 275.2158 402.2813 274.9824 402.3018 c
-274.749 402.3223 274.5264 402.3477 274.3193 402.376 c
-274.1113 402.4053 273.9175 402.4395 273.7407 402.4756 c
-273.5654 402.5127 273.4048 402.5527 273.2646 402.5957 c
-273.124 402.6387 273.0039 402.6846 272.9058 402.7334 c
-272.8057 402.7822 272.7295 402.833 272.6768 402.8857 c
-272.6255 402.9385 272.5977 402.9932 272.5977 403.0498 C
-272.5977 403.3945 L
-272.5479 403.4521 272.5186 403.5146 272.5186 403.5791 C
-272.5977 403.5791 L
-272.5977 403.8037 L
-272.5854 403.8174 272.5767 403.832 272.5679 403.8467 C
-270.8135 403.5889 269.667 403.165 269.667 402.6846 c
-269.667 402.6006 269.7041 402.5186 269.771 402.4385 c
-269.8599 402.3311 270.0063 402.2285 270.2041 402.1318 C
-270.2041 402.1318 L
-270.5498 401.9619 271.0498 401.8086 271.667 401.6807 c
-271.6689 401.6807 271.6689 401.6797 271.6694 401.6797 c
-272.1318 401.584 272.6602 401.501 273.2383 401.4365 c
-273.2422 401.4355 273.2466 401.4346 273.25 401.4346 c
-273.4375 401.4131 273.6294 401.3936 273.8271 401.377 c
-273.8369 401.376 273.8462 401.375 273.856 401.374 c
-274.0527 401.3564 274.2554 401.3418 274.4609 401.3281 c
-274.4673 401.3281 274.4722 401.3271 274.4775 401.3271 c
-274.6816 401.3145 274.8911 401.3027 275.103 401.2939 c
-275.1167 401.293 275.1294 401.292 275.145 401.292 c
-275.583 401.2734 276.0361 401.2637 276.501 401.2637 c
-276.9658 401.2637 277.4199 401.2734 277.8584 401.292 c
-277.8711 401.292 277.8857 401.293 277.8994 401.2939 c
-278.1104 401.3027 278.3193 401.3135 278.5249 401.3271 c
-278.5303 401.3271 278.5361 401.3281 278.542 401.3281 c
-278.748 401.3418 278.9482 401.3564 279.145 401.374 c
-279.1553 401.375 279.166 401.376 279.1768 401.377 c
-279.373 401.3945 279.5649 401.4131 279.7515 401.4346 c
-279.7559 401.4346 279.7607 401.4355 279.7656 401.4365 c
-281.1187 401.5889 282.1943 401.835 282.7979 402.1318 C
-282.7979 402.1318 L
-282.9282 402.1953 283.0361 402.2617 283.1201 402.3291 c
-283.2607 402.4434 283.3354 402.5625 283.3354 402.6846 c
-283.3354 403.165 282.189 403.5889 280.4336 403.8467 C
-280.4248 403.832 280.416 403.8174 280.4038 403.8037 C
-280.4038 403.5791 L
-f
-0.55 g
-276.501 407.6123 m
-274.791 407.6123 272.9878 407.8545 272.5977 408.3086 C
-272.5977 408.084 L
-272.6538 408.084 L
-272.6538 407.7314 274.2334 407.3379 276.501 407.3379 c
-278.769 407.3379 280.3486 407.7314 280.3486 408.084 C
-280.4038 408.084 L
-280.4038 408.3086 L
-280.0146 407.8545 278.2119 407.6123 276.501 407.6123 c
-f
-276.501 410.4785 m
-274.791 410.4785 272.9878 410.7217 272.5977 411.1748 C
-272.5977 410.9512 L
-272.6538 410.9512 L
-272.6538 410.5977 274.2334 410.2041 276.501 410.2041 c
-278.769 410.2041 280.3486 410.5977 280.3486 410.9512 C
-280.4038 410.9512 L
-280.4038 411.1748 L
-280.0146 410.7217 278.2119 410.4785 276.501 410.4785 c
-f
-276.501 407.2021 m
-274.791 407.2021 272.9878 407.4453 272.5977 407.8994 C
-272.5977 407.6748 L
-272.6538 407.6748 L
-272.6538 407.3213 274.2334 406.9277 276.501 406.9277 c
-278.769 406.9277 280.3486 407.3213 280.3486 407.6748 C
-280.4038 407.6748 L
-280.4038 407.8994 L
-280.0146 407.4453 278.2119 407.2021 276.501 407.2021 c
-f
-276.501 406.793 m
-274.791 406.793 272.9878 407.0361 272.5977 407.4893 C
-272.5977 407.2646 L
-272.6538 407.2646 L
-272.6538 406.9121 274.2334 406.5186 276.501 406.5186 c
-278.769 406.5186 280.3486 406.9121 280.3486 407.2646 C
-280.4038 407.2646 L
-280.4038 407.4893 L
-280.0146 407.0361 278.2119 406.793 276.501 406.793 c
-f
-276.501 410.0693 m
-274.791 410.0693 272.9878 410.3115 272.5977 410.7656 C
-272.5977 410.541 L
-272.6538 410.541 L
-272.6538 410.1885 274.2334 409.7949 276.501 409.7949 c
-278.769 409.7949 280.3486 410.1885 280.3486 410.541 C
-280.4038 410.541 L
-280.4038 410.7656 L
-280.0146 410.3115 278.2119 410.0693 276.501 410.0693 c
-f
-276.501 408.8408 m
-274.791 408.8408 272.9878 409.084 272.5977 409.5371 C
-272.5977 409.3125 L
-272.6538 409.3125 L
-272.6538 408.96 274.2334 408.5654 276.501 408.5654 c
-278.769 408.5654 280.3486 408.96 280.3486 409.3125 C
-280.4038 409.3125 L
-280.4038 409.5371 L
-280.0146 409.084 278.2119 408.8408 276.501 408.8408 c
-f
-276.501 408.0215 m
-274.791 408.0215 272.9878 408.2646 272.5977 408.7178 C
-272.5977 408.4932 L
-272.6538 408.4932 L
-272.6538 408.1406 274.2334 407.7471 276.501 407.7471 c
-278.769 407.7471 280.3486 408.1406 280.3486 408.4932 C
-280.4038 408.4932 L
-280.4038 408.7178 L
-280.0146 408.2646 278.2119 408.0215 276.501 408.0215 c
-f
-276.501 409.25 m
-274.791 409.25 272.9878 409.4932 272.5977 409.9463 C
-272.5977 409.7227 L
-272.6538 409.7227 L
-272.6538 409.3691 274.2334 408.9756 276.501 408.9756 c
-278.769 408.9756 280.3486 409.3691 280.3486 409.7227 C
-280.4038 409.7227 L
-280.4038 409.9463 L
-280.0146 409.4932 278.2119 409.25 276.501 409.25 c
-f
-276.501 412.1162 m
-274.791 412.1162 272.9878 412.3594 272.5977 412.8135 C
-272.5977 412.5889 L
-272.6538 412.5889 L
-272.6538 412.2363 274.2334 411.8428 276.501 411.8428 c
-278.769 411.8428 280.3486 412.2363 280.3486 412.5889 C
-280.4038 412.5889 L
-280.4038 412.8135 L
-280.0146 412.3594 278.2119 412.1162 276.501 412.1162 c
-f
-276.501 411.2979 m
-274.791 411.2979 272.9878 411.54 272.5977 411.9941 C
-272.5977 411.7695 L
-272.6538 411.7695 L
-272.6538 411.417 274.2334 411.0234 276.501 411.0234 c
-278.769 411.0234 280.3486 411.417 280.3486 411.7695 C
-280.4038 411.7695 L
-280.4038 411.9941 L
-280.0146 411.54 278.2119 411.2979 276.501 411.2979 c
-f
-276.501 408.4307 m
-274.791 408.4307 272.9878 408.6738 272.5977 409.1279 C
-272.5977 408.9033 L
-272.6538 408.9033 L
-272.6538 408.5498 274.2334 408.1572 276.501 408.1572 c
-278.769 408.1572 280.3486 408.5498 280.3486 408.9033 C
-280.4038 408.9033 L
-280.4038 409.1279 L
-280.0146 408.6738 278.2119 408.4307 276.501 408.4307 c
-f
-276.501 409.6592 m
-274.791 409.6592 272.9878 409.9023 272.5977 410.3555 C
-272.5977 410.1318 L
-272.6538 410.1318 L
-272.6538 409.7783 274.2334 409.3857 276.501 409.3857 c
-278.769 409.3857 280.3486 409.7783 280.3486 410.1318 C
-280.4038 410.1318 L
-280.4038 410.3555 L
-280.0146 409.9023 278.2119 409.6592 276.501 409.6592 c
-f
-276.501 411.708 m
-274.791 411.708 272.9878 411.9502 272.5977 412.4033 C
-272.5977 412.1787 L
-272.6538 412.1787 L
-272.6538 411.8262 274.2334 411.4326 276.501 411.4326 c
-278.769 411.4326 280.3486 411.8262 280.3486 412.1787 C
-280.4038 412.1787 L
-280.4038 412.4033 L
-280.0146 411.9502 278.2119 411.708 276.501 411.708 c
-f
-276.501 410.8887 m
-274.791 410.8887 272.9878 411.1318 272.5977 411.585 C
-272.5977 411.3604 L
-272.6538 411.3604 L
-272.6538 411.0068 274.2334 410.6133 276.501 410.6133 c
-278.769 410.6133 280.3486 411.0068 280.3486 411.3604 C
-280.4038 411.3604 L
-280.4038 411.585 L
-280.0146 411.1318 278.2119 410.8887 276.501 410.8887 c
-f
-276.501 404.7451 m
-274.791 404.7451 272.9878 404.9883 272.5977 405.4414 C
-272.5977 405.2178 L
-272.6538 405.2178 L
-272.6538 404.8643 274.2334 404.4707 276.501 404.4707 c
-278.769 404.4707 280.3486 404.8643 280.3486 405.2178 C
-280.4038 405.2178 L
-280.4038 405.4414 L
-280.0146 404.9883 278.2119 404.7451 276.501 404.7451 c
-f
-276.501 403.5166 m
-274.791 403.5166 272.9878 403.7598 272.5977 404.2129 C
-272.5977 403.9893 L
-272.6538 403.9893 L
-272.6538 403.6357 274.2334 403.2422 276.501 403.2422 c
-278.769 403.2422 280.3486 403.6357 280.3486 403.9893 C
-280.4038 403.9893 L
-280.4038 404.2129 L
-280.0146 403.7598 278.2119 403.5166 276.501 403.5166 c
-f
-276.501 403.9268 m
-274.791 403.9268 272.9878 404.1689 272.5977 404.6221 C
-272.5977 404.3984 L
-272.6538 404.3984 L
-272.6538 404.0449 274.2334 403.6514 276.501 403.6514 c
-278.769 403.6514 280.3486 404.0449 280.3486 404.3984 C
-280.4038 404.3984 L
-280.4038 404.6221 L
-280.0146 404.1689 278.2119 403.9268 276.501 403.9268 c
-f
-276.501 406.3838 m
-274.791 406.3838 272.9878 406.626 272.5977 407.0801 C
-272.5977 406.8555 L
-272.6538 406.8555 L
-272.6538 406.5029 274.2334 406.1084 276.501 406.1084 c
-278.769 406.1084 280.3486 406.5029 280.3486 406.8555 C
-280.4038 406.8555 L
-280.4038 407.0801 L
-280.0146 406.626 278.2119 406.3838 276.501 406.3838 c
-f
-276.501 405.1553 m
-274.791 405.1553 272.9878 405.3975 272.5977 405.8506 C
-272.5977 405.627 L
-272.6538 405.627 L
-272.6538 405.2744 274.2334 404.8799 276.501 404.8799 c
-278.769 404.8799 280.3486 405.2744 280.3486 405.627 C
-280.4038 405.627 L
-280.4038 405.8506 L
-280.0146 405.3975 278.2119 405.1553 276.501 405.1553 c
-f
-276.501 405.5645 m
-274.791 405.5645 272.9878 405.8076 272.5977 406.2607 C
-272.5977 406.0361 L
-272.6538 406.0361 L
-272.6538 405.6836 274.2334 405.29 276.501 405.29 c
-278.769 405.29 280.3486 405.6836 280.3486 406.0361 C
-280.4038 406.0361 L
-280.4038 406.2607 L
-280.0146 405.8076 278.2119 405.5645 276.501 405.5645 c
-f
-276.501 405.9736 m
-274.791 405.9736 272.9878 406.2168 272.5977 406.6699 C
-272.5977 406.4463 L
-272.6538 406.4463 L
-272.6538 406.0928 274.2334 405.6992 276.501 405.6992 c
-278.769 405.6992 280.3486 406.0928 280.3486 406.4463 C
-280.4038 406.4463 L
-280.4038 406.6699 L
-280.0146 406.2168 278.2119 405.9736 276.501 405.9736 c
-f
-276.501 404.3359 m
-274.791 404.3359 272.9878 404.5791 272.5977 405.0322 C
-272.5977 404.8076 L
-272.6538 404.8076 L
-272.6538 404.4551 274.2334 404.0615 276.501 404.0615 c
-278.769 404.0615 280.3486 404.4551 280.3486 404.8076 C
-280.4038 404.8076 L
-280.4038 405.0322 L
-280.0146 404.5791 278.2119 404.3359 276.501 404.3359 c
-f
-279.1606 413.3857 m
-278.7529 413.3496 278.3232 413.3213 277.8774 413.3027 c
-277.4336 413.2842 276.9727 413.2744 276.501 413.2744 c
-276.0298 413.2744 275.5679 413.2842 275.124 413.3027 c
-274.6782 413.3213 274.25 413.3496 273.8408 413.3857 c
-273.4321 413.4219 273.0439 413.4658 272.6802 413.5166 c
-272.6514 413.5205 272.6255 413.5254 272.5977 413.5293 C
-272.5977 413.4082 L
-272.6538 413.4082 L
-272.6538 413.0557 274.2334 412.6611 276.501 412.6611 c
-278.769 412.6611 280.3486 413.0557 280.3486 413.4082 C
-280.4038 413.4082 L
-280.4038 413.5293 L
-280.376 413.5254 280.3506 413.5205 280.3223 413.5166 c
-279.959 413.4658 279.5698 413.4219 279.1606 413.3857 c
-f
-276.501 412.5264 m
-274.791 412.5264 272.9878 412.7695 272.5977 413.2227 C
-272.5977 412.998 L
-272.6538 412.998 L
-272.6538 412.6455 274.2334 412.252 276.501 412.252 c
-278.769 412.252 280.3486 412.6455 280.3486 412.998 C
-280.4038 412.998 L
-280.4038 413.2227 L
-280.0146 412.7695 278.2119 412.5264 276.501 412.5264 c
-f
-276.501 402.6982 m
-274.791 402.6982 272.9878 402.9404 272.5977 403.3945 C
-272.5977 403.0498 L
-272.5977 402.9932 272.6255 402.9385 272.6768 402.8857 c
-272.7295 402.833 272.8057 402.7822 272.9058 402.7334 c
-273.0039 402.6846 273.124 402.6387 273.2646 402.5957 c
-273.4048 402.5527 273.5654 402.5127 273.7407 402.4756 c
-273.9175 402.4395 274.1113 402.4053 274.3193 402.376 c
-274.5264 402.3477 274.749 402.3223 274.9824 402.3018 c
-275.2158 402.2813 275.4609 402.2646 275.7153 402.2549 c
-275.9688 402.2441 276.2314 402.2383 276.501 402.2383 c
-276.7705 402.2383 277.0347 402.2441 277.2881 402.2549 c
-277.542 402.2646 277.7871 402.2813 278.021 402.3018 c
-278.2534 402.3223 278.4751 402.3477 278.6831 402.376 c
-278.8906 402.4053 279.085 402.4395 279.2607 402.4756 c
-279.4375 402.5127 279.5977 402.5527 279.7378 402.5957 c
-279.8774 402.6387 279.998 402.6846 280.0977 402.7334 c
-280.1958 402.7822 280.2734 402.833 280.3247 402.8857 c
-280.377 402.9385 280.4038 402.9932 280.4038 403.0498 C
-280.4038 403.3945 L
-280.0146 402.9404 278.2119 402.6982 276.501 402.6982 c
-f
-272.6538 403.5791 m
-272.6538 403.2266 274.2334 402.833 276.501 402.833 c
-278.769 402.833 280.3486 403.2266 280.3486 403.5791 C
-280.4038 403.5791 L
-280.4038 403.8037 L
-280.0146 403.3506 278.2119 403.1074 276.501 403.1074 c
-274.791 403.1074 272.9878 403.3506 272.5977 403.8037 C
-272.5977 403.5791 L
-272.6538 403.5791 L
-f
-0.15 g
-276.501 412.6611 m
-274.2334 412.6611 272.6538 413.0557 272.6538 413.4082 C
-272.5977 413.4082 L
-272.5186 413.4082 L
-272.5186 413.3428 272.5479 413.2813 272.5977 413.2227 c
-272.9878 412.7695 274.791 412.5264 276.501 412.5264 c
-278.2119 412.5264 280.0146 412.7695 280.4038 413.2227 c
-280.4546 413.2813 280.4839 413.3428 280.4839 413.4082 C
-280.4038 413.4082 L
-280.3486 413.4082 L
-280.3486 413.0557 278.769 412.6611 276.501 412.6611 c
-f
-276.501 412.252 m
-274.2334 412.252 272.6538 412.6455 272.6538 412.998 C
-272.5977 412.998 L
-272.5186 412.998 L
-272.5186 412.9336 272.5479 412.8721 272.5977 412.8135 c
-272.9878 412.3594 274.791 412.1162 276.501 412.1162 c
-278.2119 412.1162 280.0146 412.3594 280.4038 412.8135 c
-280.4546 412.8721 280.4839 412.9336 280.4839 412.998 C
-280.4038 412.998 L
-280.3486 412.998 L
-280.3486 412.6455 278.769 412.252 276.501 412.252 c
-f
-276.501 411.8428 m
-274.2334 411.8428 272.6538 412.2363 272.6538 412.5889 C
-272.5977 412.5889 L
-272.5186 412.5889 L
-272.5186 412.5234 272.5479 412.4619 272.5977 412.4033 c
-272.9878 411.9502 274.791 411.708 276.501 411.708 c
-278.2119 411.708 280.0146 411.9502 280.4038 412.4033 c
-280.4546 412.4619 280.4839 412.5234 280.4839 412.5889 C
-280.4038 412.5889 L
-280.3486 412.5889 L
-280.3486 412.2363 278.769 411.8428 276.501 411.8428 c
-f
-276.501 411.4326 m
-274.2334 411.4326 272.6538 411.8262 272.6538 412.1787 C
-272.5977 412.1787 L
-272.5186 412.1787 L
-272.5186 412.1143 272.5479 412.0518 272.5977 411.9941 c
-272.9878 411.54 274.791 411.2979 276.501 411.2979 c
-278.2119 411.2979 280.0146 411.54 280.4038 411.9941 c
-280.4546 412.0518 280.4839 412.1143 280.4839 412.1787 C
-280.4038 412.1787 L
-280.3486 412.1787 L
-280.3486 411.8262 278.769 411.4326 276.501 411.4326 c
-f
-276.501 411.0234 m
-274.2334 411.0234 272.6538 411.417 272.6538 411.7695 C
-272.5977 411.7695 L
-272.5186 411.7695 L
-272.5186 411.7041 272.5479 411.6436 272.5977 411.585 c
-272.9878 411.1318 274.791 410.8887 276.501 410.8887 c
-278.2119 410.8887 280.0146 411.1318 280.4038 411.585 c
-280.4546 411.6436 280.4839 411.7041 280.4839 411.7695 C
-280.4038 411.7695 L
-280.3486 411.7695 L
-280.3486 411.417 278.769 411.0234 276.501 411.0234 c
-f
-276.501 410.6133 m
-274.2334 410.6133 272.6538 411.0068 272.6538 411.3604 C
-272.5977 411.3604 L
-272.5186 411.3604 L
-272.5186 411.2949 272.5479 411.2334 272.5977 411.1748 c
-272.9878 410.7217 274.791 410.4785 276.501 410.4785 c
-278.2119 410.4785 280.0146 410.7217 280.4038 411.1748 c
-280.4546 411.2334 280.4839 411.2949 280.4839 411.3604 C
-280.4038 411.3604 L
-280.3486 411.3604 L
-280.3486 411.0068 278.769 410.6133 276.501 410.6133 c
-f
-276.501 410.2041 m
-274.2334 410.2041 272.6538 410.5977 272.6538 410.9512 C
-272.5977 410.9512 L
-272.5186 410.9512 L
-272.5186 410.8857 272.5479 410.8242 272.5977 410.7656 c
-272.9878 410.3115 274.791 410.0693 276.501 410.0693 c
-278.2119 410.0693 280.0146 410.3115 280.4038 410.7656 c
-280.4546 410.8242 280.4839 410.8857 280.4839 410.9512 C
-280.4038 410.9512 L
-280.3486 410.9512 L
-280.3486 410.5977 278.769 410.2041 276.501 410.2041 c
-f
-276.501 409.7949 m
-274.2334 409.7949 272.6538 410.1885 272.6538 410.541 C
-272.5977 410.541 L
-272.5186 410.541 L
-272.5186 410.4756 272.5479 410.4141 272.5977 410.3555 c
-272.9878 409.9023 274.791 409.6592 276.501 409.6592 c
-278.2119 409.6592 280.0146 409.9023 280.4038 410.3555 c
-280.4546 410.4141 280.4839 410.4756 280.4839 410.541 C
-280.4038 410.541 L
-280.3486 410.541 L
-280.3486 410.1885 278.769 409.7949 276.501 409.7949 c
-f
-276.501 409.3857 m
-274.2334 409.3857 272.6538 409.7783 272.6538 410.1318 C
-272.5977 410.1318 L
-272.5186 410.1318 L
-272.5186 410.0664 272.5479 410.0049 272.5977 409.9463 c
-272.9878 409.4932 274.791 409.25 276.501 409.25 c
-278.2119 409.25 280.0146 409.4932 280.4038 409.9463 c
-280.4546 410.0049 280.4839 410.0664 280.4839 410.1318 C
-280.4038 410.1318 L
-280.3486 410.1318 L
-280.3486 409.7783 278.769 409.3857 276.501 409.3857 c
-f
-276.501 408.9756 m
-274.2334 408.9756 272.6538 409.3691 272.6538 409.7227 C
-272.5977 409.7227 L
-272.5186 409.7227 L
-272.5186 409.6572 272.5479 409.5957 272.5977 409.5371 c
-272.9878 409.084 274.791 408.8408 276.501 408.8408 c
-278.2119 408.8408 280.0146 409.084 280.4038 409.5371 c
-280.4546 409.5957 280.4839 409.6572 280.4839 409.7227 C
-280.4038 409.7227 L
-280.3486 409.7227 L
-280.3486 409.3691 278.769 408.9756 276.501 408.9756 c
-f
-276.501 408.5654 m
-274.2334 408.5654 272.6538 408.96 272.6538 409.3125 C
-272.5977 409.3125 L
-272.5186 409.3125 L
-272.5186 409.2471 272.5479 409.1855 272.5977 409.1279 c
-272.9878 408.6738 274.791 408.4307 276.501 408.4307 c
-278.2119 408.4307 280.0146 408.6738 280.4038 409.1279 c
-280.4546 409.1855 280.4839 409.2471 280.4839 409.3125 C
-280.4038 409.3125 L
-280.3486 409.3125 L
-280.3486 408.96 278.769 408.5654 276.501 408.5654 c
-f
-276.501 408.1572 m
-274.2334 408.1572 272.6538 408.5498 272.6538 408.9033 C
-272.5977 408.9033 L
-272.5186 408.9033 L
-272.5186 408.8379 272.5479 408.7764 272.5977 408.7178 c
-272.9878 408.2646 274.791 408.0215 276.501 408.0215 c
-278.2119 408.0215 280.0146 408.2646 280.4038 408.7178 c
-280.4546 408.7764 280.4839 408.8379 280.4839 408.9033 C
-280.4038 408.9033 L
-280.3486 408.9033 L
-280.3486 408.5498 278.769 408.1572 276.501 408.1572 c
-f
-276.501 407.7471 m
-274.2334 407.7471 272.6538 408.1406 272.6538 408.4932 C
-272.5977 408.4932 L
-272.5186 408.4932 L
-272.5186 408.4287 272.5479 408.3662 272.5977 408.3086 c
-272.9878 407.8545 274.791 407.6123 276.501 407.6123 c
-278.2119 407.6123 280.0146 407.8545 280.4038 408.3086 c
-280.4546 408.3662 280.4839 408.4287 280.4839 408.4932 C
-280.4038 408.4932 L
-280.3486 408.4932 L
-280.3486 408.1406 278.769 407.7471 276.501 407.7471 c
-f
-276.501 407.3379 m
-274.2334 407.3379 272.6538 407.7314 272.6538 408.084 C
-272.5977 408.084 L
-272.5186 408.084 L
-272.5186 408.0186 272.5479 407.957 272.5977 407.8994 c
-272.9878 407.4453 274.791 407.2021 276.501 407.2021 c
-278.2119 407.2021 280.0146 407.4453 280.4038 407.8994 c
-280.4546 407.957 280.4839 408.0186 280.4839 408.084 C
-280.4038 408.084 L
-280.3486 408.084 L
-280.3486 407.7314 278.769 407.3379 276.501 407.3379 c
-f
-276.501 406.9277 m
-274.2334 406.9277 272.6538 407.3213 272.6538 407.6748 C
-272.5977 407.6748 L
-272.5186 407.6748 L
-272.5186 407.6094 272.5479 407.5479 272.5977 407.4893 c
-272.9878 407.0361 274.791 406.793 276.501 406.793 c
-278.2119 406.793 280.0146 407.0361 280.4038 407.4893 c
-280.4546 407.5479 280.4839 407.6094 280.4839 407.6748 C
-280.4038 407.6748 L
-280.3486 407.6748 L
-280.3486 407.3213 278.769 406.9277 276.501 406.9277 c
-f
-276.501 406.5186 m
-274.2334 406.5186 272.6538 406.9121 272.6538 407.2646 C
-272.5977 407.2646 L
-272.5186 407.2646 L
-272.5186 407.2002 272.5479 407.1377 272.5977 407.0801 c
-272.9878 406.626 274.791 406.3838 276.501 406.3838 c
-278.2119 406.3838 280.0146 406.626 280.4038 407.0801 c
-280.4546 407.1377 280.4839 407.2002 280.4839 407.2646 C
-280.4038 407.2646 L
-280.3486 407.2646 L
-280.3486 406.9121 278.769 406.5186 276.501 406.5186 c
-f
-276.501 406.1084 m
-274.2334 406.1084 272.6538 406.5029 272.6538 406.8555 C
-272.5977 406.8555 L
-272.5186 406.8555 L
-272.5186 406.79 272.5479 406.7285 272.5977 406.6699 c
-272.9878 406.2168 274.791 405.9736 276.501 405.9736 c
-278.2119 405.9736 280.0146 406.2168 280.4038 406.6699 c
-280.4546 406.7285 280.4839 406.79 280.4839 406.8555 C
-280.4038 406.8555 L
-280.3486 406.8555 L
-280.3486 406.5029 278.769 406.1084 276.501 406.1084 c
-f
-276.501 405.6992 m
-274.2334 405.6992 272.6538 406.0928 272.6538 406.4463 C
-272.5977 406.4463 L
-272.5186 406.4463 L
-272.5186 406.3809 272.5479 406.3193 272.5977 406.2607 c
-272.9878 405.8076 274.791 405.5645 276.501 405.5645 c
-278.2119 405.5645 280.0146 405.8076 280.4038 406.2607 c
-280.4546 406.3193 280.4839 406.3809 280.4839 406.4463 C
-280.4038 406.4463 L
-280.3486 406.4463 L
-280.3486 406.0928 278.769 405.6992 276.501 405.6992 c
-f
-276.501 405.29 m
-274.2334 405.29 272.6538 405.6836 272.6538 406.0361 C
-272.5977 406.0361 L
-272.5186 406.0361 L
-272.5186 405.9717 272.5479 405.9092 272.5977 405.8506 c
-272.9878 405.3975 274.791 405.1553 276.501 405.1553 c
-278.2119 405.1553 280.0146 405.3975 280.4038 405.8506 c
-280.4546 405.9092 280.4839 405.9717 280.4839 406.0361 C
-280.4038 406.0361 L
-280.3486 406.0361 L
-280.3486 405.6836 278.769 405.29 276.501 405.29 c
-f
-276.501 404.8799 m
-274.2334 404.8799 272.6538 405.2744 272.6538 405.627 C
-272.5977 405.627 L
-272.5186 405.627 L
-272.5186 405.5615 272.5479 405.5 272.5977 405.4414 c
-272.9878 404.9883 274.791 404.7451 276.501 404.7451 c
-278.2119 404.7451 280.0146 404.9883 280.4038 405.4414 c
-280.4546 405.5 280.4839 405.5615 280.4839 405.627 C
-280.4038 405.627 L
-280.3486 405.627 L
-280.3486 405.2744 278.769 404.8799 276.501 404.8799 c
-f
-276.501 404.4707 m
-274.2334 404.4707 272.6538 404.8643 272.6538 405.2178 C
-272.5977 405.2178 L
-272.5186 405.2178 L
-272.5186 405.1523 272.5479 405.0908 272.5977 405.0322 c
-272.9878 404.5791 274.791 404.3359 276.501 404.3359 c
-278.2119 404.3359 280.0146 404.5791 280.4038 405.0322 c
-280.4546 405.0908 280.4839 405.1523 280.4839 405.2178 C
-280.4038 405.2178 L
-280.3486 405.2178 L
-280.3486 404.8643 278.769 404.4707 276.501 404.4707 c
-f
-276.501 404.0615 m
-274.2334 404.0615 272.6538 404.4551 272.6538 404.8076 C
-272.5977 404.8076 L
-272.5186 404.8076 L
-272.5186 404.7422 272.5479 404.6807 272.5977 404.6221 c
-272.9878 404.1689 274.791 403.9268 276.501 403.9268 c
-278.2119 403.9268 280.0146 404.1689 280.4038 404.6221 c
-280.4546 404.6807 280.4839 404.7422 280.4839 404.8076 C
-280.4038 404.8076 L
-280.3486 404.8076 L
-280.3486 404.4551 278.769 404.0615 276.501 404.0615 c
-f
-276.501 403.6514 m
-274.2334 403.6514 272.6538 404.0449 272.6538 404.3984 C
-272.5977 404.3984 L
-272.5186 404.3984 L
-272.5186 404.333 272.5479 404.2715 272.5977 404.2129 c
-272.9878 403.7598 274.791 403.5166 276.501 403.5166 c
-278.2119 403.5166 280.0146 403.7598 280.4038 404.2129 c
-280.4546 404.2715 280.4839 404.333 280.4839 404.3984 C
-280.4038 404.3984 L
-280.3486 404.3984 L
-280.3486 404.0449 278.769 403.6514 276.501 403.6514 c
-f
-276.501 403.2422 m
-274.2334 403.2422 272.6538 403.6357 272.6538 403.9893 C
-272.5977 403.9893 L
-272.5186 403.9893 L
-272.5186 403.9395 272.5386 403.8926 272.5679 403.8467 c
-272.5767 403.832 272.5854 403.8174 272.5977 403.8037 c
-272.9878 403.3506 274.791 403.1074 276.501 403.1074 c
-278.2119 403.1074 280.0146 403.3506 280.4038 403.8037 c
-280.416 403.8174 280.4248 403.832 280.4336 403.8467 c
-280.4639 403.8926 280.4839 403.9395 280.4839 403.9893 C
-280.4038 403.9893 L
-280.3486 403.9893 L
-280.3486 403.6357 278.769 403.2422 276.501 403.2422 c
-f
-276.501 402.833 m
-274.2334 402.833 272.6538 403.2266 272.6538 403.5791 C
-272.5977 403.5791 L
-272.5186 403.5791 L
-272.5186 403.5146 272.5479 403.4521 272.5977 403.3945 c
-272.9878 402.9404 274.791 402.6982 276.501 402.6982 c
-278.2119 402.6982 280.0146 402.9404 280.4038 403.3945 c
-280.4546 403.4521 280.4839 403.5146 280.4839 403.5791 C
-280.4038 403.5791 L
-280.3486 403.5791 L
-280.3486 403.2266 278.769 402.833 276.501 402.833 c
-f
-0.67 g
-283.1563 416.1855 m
-283.0674 416.1064 282.9482 416.0283 282.7979 415.9551 c
-282.7979 415.9541 282.7969 415.9541 282.7959 415.9541 c
-282.7095 415.9111 282.6152 415.8701 282.5103 415.8311 c
-282.5103 415.8311 l
-282.3008 415.751 282.0562 415.6748 281.7793 415.6055 c
-281.7759 415.6045 281.7729 415.6035 281.7695 415.6025 c
-281.2168 415.4639 280.5391 415.3477 279.7729 415.2607 c
-279.7622 415.2598 279.7534 415.2588 279.7432 415.2568 c
-279.3682 415.2148 278.9712 415.1797 278.5586 415.1533 c
-278.54 415.1514 278.5234 415.1504 278.5059 415.1494 c
-278.3145 415.1377 278.1201 415.127 277.9219 415.1182 c
-277.9072 415.1182 277.8936 415.1162 277.8774 415.1162 c
-277.8643 415.1152 277.8496 415.1152 277.8354 415.1143 c
-277.6294 415.1064 277.4209 415.0996 277.2095 415.0947 c
-277.2041 415.0947 277.1968 415.0947 277.1904 415.0947 c
-276.9639 415.0898 276.7344 415.0869 276.501 415.0869 c
-276.269 415.0869 276.0386 415.0898 275.811 415.0947 c
-275.8057 415.0947 275.7983 415.0947 275.792 415.0947 c
-275.5811 415.0996 275.3721 415.1064 275.167 415.1143 c
-275.1538 415.1152 275.1377 415.1152 275.124 415.1162 c
-275.1089 415.1162 275.0942 415.1182 275.0801 415.1182 c
-274.8818 415.127 274.6865 415.1377 274.4951 415.1494 c
-274.4785 415.1504 274.4614 415.1514 274.4458 415.1533 c
-274.0313 415.1797 273.6338 415.2148 273.2568 415.2568 c
-273.248 415.2588 273.2402 415.2588 273.2305 415.2598 c
-272.4639 415.3477 271.7847 415.4639 271.2319 415.6025 c
-271.2295 415.6035 271.2266 415.6045 271.2241 415.6055 c
-270.8086 415.71 270.4648 415.8271 270.2061 415.9541 c
-270.2041 415.9541 270.2041 415.9551 v
-270.1279 415.9922 270.0591 416.0313 269.999 416.0703 c
-269.853 416.1641 269.7515 416.2617 269.7026 416.3623 c
-269.6782 416.4102 269.667 416.459 269.667 416.5078 C
-269.667 414.6953 L
-269.667 414.5967 269.7153 414.501 269.8057 414.4092 c
-269.897 414.3164 270.0303 414.2275 270.2041 414.1416 c
-270.377 414.0576 270.5879 413.9756 270.834 413.9004 c
-271.0801 413.8252 271.3594 413.7549 271.6689 413.6904 c
-271.9546 413.6309 272.2666 413.5771 272.5977 413.5293 c
-272.6255 413.5254 272.6514 413.5205 272.6802 413.5166 c
-273.0439 413.4658 273.4321 413.4219 273.8408 413.3857 c
-274.25 413.3496 274.6782 413.3213 275.124 413.3027 c
-275.5679 413.2842 276.0298 413.2744 276.501 413.2744 c
-276.9727 413.2744 277.4336 413.2842 277.8774 413.3027 c
-278.3232 413.3213 278.7529 413.3496 279.1606 413.3857 c
-279.5698 413.4219 279.959 413.4658 280.3223 413.5166 c
-280.3506 413.5205 280.376 413.5254 280.4038 413.5293 c
-280.7354 413.5771 281.0479 413.6309 281.334 413.6904 c
-281.6426 413.7549 281.9233 413.8252 282.168 413.9004 c
-282.4141 413.9756 282.6255 414.0576 282.7979 414.1416 c
-282.9712 414.2275 283.1055 414.3164 283.1958 414.4092 c
-283.2881 414.501 283.3354 414.5967 283.3354 414.6953 C
-283.3354 416.5078 L
-283.3354 416.4346 283.3086 416.3623 283.2568 416.292 c
-283.2305 416.2559 283.1958 416.2207 283.1563 416.1855 c
-f
-0.39 g
-281.083 417.5625 m
-280.6304 416.6553 279.9375 416.1982 279.9033 416.1768 C
-279.8862 416.167 L
-272.8672 416.167 L
-272.8506 416.2998 L
-272.8574 416.3018 273.563 416.501 274.3018 417.8535 C
-271.6064 417.6631 269.667 417.1328 269.667 416.5078 c
-269.667 416.459 269.6782 416.4102 269.7026 416.3623 c
-269.7515 416.2617 269.853 416.1641 269.999 416.0703 c
-270.061 416.0303 270.1289 415.9922 270.2061 415.9541 c
-270.4648 415.8271 270.8086 415.71 271.2241 415.6055 c
-271.2266 415.6045 271.2295 415.6035 271.2319 415.6025 c
-271.7847 415.4639 272.4639 415.3477 273.2305 415.2598 c
-273.2402 415.2588 273.248 415.2588 273.2568 415.2568 c
-273.6338 415.2148 274.0313 415.1797 274.4458 415.1533 c
-274.4614 415.1514 274.4785 415.1504 274.4951 415.1494 c
-274.6865 415.1377 274.8818 415.127 275.0801 415.1182 c
-275.1099 415.1172 275.1377 415.1162 275.167 415.1143 c
-275.3721 415.1064 275.5811 415.0996 275.792 415.0947 c
-275.7983 415.0947 275.8057 415.0947 275.811 415.0947 c
-276.0386 415.0898 276.269 415.0869 276.501 415.0869 c
-276.7344 415.0869 276.9639 415.0898 277.1904 415.0947 c
-277.1968 415.0947 277.2041 415.0947 277.2095 415.0947 c
-277.4209 415.0996 277.6294 415.1064 277.8354 415.1143 c
-277.8643 415.1162 277.8936 415.1172 277.9219 415.1182 c
-278.1201 415.127 278.3145 415.1377 278.5059 415.1494 c
-278.5234 415.1504 278.54 415.1514 278.5586 415.1533 c
-278.9712 415.1797 279.3682 415.2148 279.7432 415.2568 c
-279.7534 415.2588 279.7622 415.2598 279.7729 415.2607 c
-280.5391 415.3477 281.2168 415.4639 281.7695 415.6025 c
-281.7729 415.6035 281.7759 415.6045 281.7793 415.6055 c
-282.0562 415.6748 282.3008 415.751 282.5103 415.8311 C
-282.5103 415.8311 L
-282.6152 415.8701 282.7095 415.9111 282.7959 415.9541 c
-282.9473 416.0283 283.0674 416.1055 283.1563 416.1855 c
-283.1958 416.2207 283.2305 416.2559 283.2568 416.292 c
-283.3086 416.3623 283.3354 416.4346 283.3354 416.5078 c
-283.3354 416.9268 282.4658 417.3018 281.083 417.5625 C
-f
-*u
-1 g
-1 D
-273.1592 416.3018 m
-273.6958 416.3018 279.8057 416.3018 279.8457 416.3018 C
-279.9287 416.3574 280.7754 416.9521 281.1494 418.0723 c
-281.2202 418.2842 281.2446 418.5225 281.2446 418.7793 c
-281.2446 419.1416 281.1938 419.542 281.1392 419.9551 c
-281.0811 420.3994 281.019 420.8711 281.019 421.3389 c
-281.019 421.917 281.1143 422.4893 281.4248 423 c
-282.1143 424.1328 282.813 424.6846 283.1553 424.9092 C
-282.6978 424.9092 276.4614 424.9141 Y
-276.4438 424.9072 274.7515 424.127 274.6177 422.5547 c
-274.6064 422.4326 274.6016 422.3135 274.6016 422.1953 c
-274.6016 421.7158 274.6777 421.2627 274.752 420.8213 c
-274.8257 420.3857 274.897 419.9609 274.897 419.5264 c
-274.897 419.0469 274.8096 418.5547 274.5435 418.0205 c
-274.0049 416.9463 273.4722 416.4912 273.1592 416.3018 C
-f
-0 D
-279.5977 417.2432 m
-275.0879 417.2432 L
-275.0879 417.3779 L
-279.5977 417.3779 L
-279.5977 417.2432 L
-f
-280.1362 421.4834 m
-275.6943 421.4834 L
-275.6943 421.6182 L
-280.1362 421.6182 L
-280.1362 421.4834 L
-f
-280.3374 419.9355 m
-280.3374 419.8008 L
-275.8286 419.8008 L
-275.8286 419.9355 L
-280.3374 419.9355 L
-f
-1 D
-275.7607 420.6094 m
-279.8662 420.6094 L
-279.8662 420.4746 L
-275.7607 420.4746 L
-275.7607 420.6094 L
-f
-0 D
-275.8286 418.9932 m
-280.2705 418.9932 L
-280.2705 418.8584 L
-275.8286 418.8584 L
-275.8286 418.9932 L
-f
-276.501 424.3115 m
-281.1455 424.3115 L
-281.1455 424.1758 L
-276.501 424.1758 L
-276.501 424.3115 L
-f
-1 D
-276.0303 423.7725 m
-279.7314 423.7725 L
-279.7314 423.6377 L
-276.0303 423.6377 L
-276.0303 423.7725 L
-f
-0 D
-275.6943 423.0322 m
-280.4048 423.0322 L
-280.4048 422.8975 L
-275.6943 422.8975 L
-275.6943 423.0322 L
-f
-275.5591 422.292 m
-280.2705 422.292 L
-280.2705 422.1572 L
-275.5591 422.1572 L
-275.5591 422.292 L
-f
-275.5591 418.1865 m
-279.9346 418.1865 L
-279.9346 418.0508 L
-275.5591 418.0508 L
-275.5591 418.1865 L
-f
-*U
-*u
-0 g
-1 D
-272.8506 416.2998 m
-272.8672 416.167 L
-279.8862 416.167 L
-279.9033 416.1768 L
-279.9375 416.1982 280.6304 416.6553 281.083 417.5625 c
-281.1553 417.707 281.2217 417.8623 281.2778 418.0303 c
-281.4561 418.5684 281.3682 419.25 281.2734 419.9727 c
-281.1392 420.9922 281.0034 422.0469 281.54 422.9297 c
-282.459 424.4395 283.4209 424.9102 283.4307 424.915 C
-283.4019 425.0439 L
-276.4346 425.0439 L
-276.3887 425.0293 274.624 424.2188 274.4824 422.5664 c
-274.4282 421.9346 274.5254 421.3574 274.6187 420.7998 c
-274.769 419.9043 274.9111 419.0596 274.4219 418.0811 c
-274.3818 418.001 274.3418 417.9268 274.3018 417.8535 c
-273.563 416.501 272.8574 416.3018 272.8506 416.2998 C
-f
-0 D
-274.897 419.5264 m
-274.897 419.9609 274.8257 420.3857 274.752 420.8213 c
-274.6777 421.2627 274.6016 421.7158 274.6016 422.1953 c
-274.6016 422.3135 274.6064 422.4326 274.6177 422.5547 c
-274.7515 424.127 276.4438 424.9072 276.4614 424.9141 C
-282.6978 424.9092 283.1553 424.9092 V
-282.813 424.6846 282.1143 424.1328 281.4248 423 c
-281.1143 422.4893 281.019 421.917 281.019 421.3389 c
-281.019 420.8711 281.0811 420.3994 281.1392 419.9551 c
-281.1938 419.542 281.2446 419.1416 281.2446 418.7793 c
-281.2446 418.5225 281.2202 418.2842 281.1494 418.0723 c
-280.7754 416.9521 279.9287 416.3574 279.8457 416.3018 C
-279.8057 416.3018 273.6958 416.3018 273.1592 416.3018 C
-273.4722 416.4912 274.0049 416.9463 274.5435 418.0205 c
-274.8096 418.5547 274.897 419.0469 274.897 419.5264 c
-f
-*U
-281.1455 424.3115 m
-276.501 424.3115 L
-276.501 424.1758 L
-281.1455 424.1758 L
-281.1455 424.3115 L
-f
-279.7314 423.7725 m
-276.0303 423.7725 L
-276.0303 423.6377 L
-279.7314 423.6377 L
-279.7314 423.7725 L
-f
-280.4048 423.0322 m
-275.6943 423.0322 L
-275.6943 422.8975 L
-280.4048 422.8975 L
-280.4048 423.0322 L
-f
-280.2705 422.292 m
-275.5591 422.292 L
-275.5591 422.1572 L
-280.2705 422.1572 L
-280.2705 422.292 L
-f
-275.6943 421.4834 m
-280.1362 421.4834 L
-280.1362 421.6182 L
-275.6943 421.6182 L
-275.6943 421.4834 L
-f
-279.8662 420.6094 m
-275.7607 420.6094 L
-275.7607 420.4746 L
-279.8662 420.4746 L
-279.8662 420.6094 L
-f
-275.8286 419.8008 m
-280.3374 419.8008 L
-280.3374 419.9355 L
-275.8286 419.9355 L
-275.8286 419.8008 L
-f
-280.2705 418.9932 m
-275.8286 418.9932 L
-275.8286 418.8584 L
-280.2705 418.8584 L
-280.2705 418.9932 L
-f
-279.9346 418.1865 m
-275.5591 418.1865 L
-275.5591 418.0508 L
-279.9346 418.0508 L
-279.9346 418.1865 L
-f
-275.0879 417.2432 m
-279.5977 417.2432 L
-279.5977 417.3779 L
-275.0879 417.3779 L
-275.0879 417.2432 L
-f
-U
-U
-U
-0 To
-1 0 0 1 277.3394 389.4922 0 Tp
-0 Tv
-TP
--11.5064 0 Td
-0 Tr
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
-0 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ -- XL
-0 TY
-0 TV
-23.6196 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 3.2805 3.2805 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
-0 Tc
-0 Tw
-(Spool) Tx 1 0 Tk
-(\r) Tx 1 0 Tk
-TO
-U
-U
-(Adobe Scatter Brush Tool) 1 0 61 XP
-%010203043F8000003F8000003F8000003F80000000000000000000000000
-%0000000000000000000000000000000033FA5072696E742073706F6F6C65
-%72
-/Adobe_Brushed_Path () XT
-u
-%_0 R
-%_0 G
-%_1 M
-%_316.5801 491.5308 m
-%_B
-%_U
-%_0 Ap
-0 A
-u
-0 O
-0 g
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-316.5801 491.5308 m
-F
-u
-*u
-0 R
-1 G
-322.5762 501.5332 m
-322.5762 499.7207 L
-322.5762 499.6221 322.5293 499.5264 322.4365 499.4346 c
-322.3457 499.3418 322.2119 499.2529 322.0391 499.167 c
-321.8662 499.083 321.6543 499.001 321.4082 498.9258 c
-321.1641 498.8506 320.8828 498.7803 320.5742 498.7158 c
-320.2891 498.6563 319.9766 498.6025 319.6445 498.5547 C
-319.6445 498.4336 L
-319.7246 498.4336 L
-319.7246 498.3682 319.6953 498.3066 319.6445 498.248 C
-319.6445 498.0234 L
-319.7246 498.0234 L
-319.7246 497.959 319.6953 497.8975 319.6445 497.8389 C
-319.6445 497.6143 L
-319.7246 497.6143 L
-319.7246 497.5488 319.6953 497.4873 319.6445 497.4287 C
-319.6445 497.2041 L
-319.7246 497.2041 L
-319.7246 497.1396 319.6953 497.0771 319.6445 497.0195 C
-319.6445 496.7949 L
-319.7246 496.7949 L
-319.7246 496.7295 319.6953 496.6689 319.6445 496.6104 C
-319.6445 496.3857 L
-319.7246 496.3857 L
-319.7246 496.3203 319.6953 496.2588 319.6445 496.2002 C
-319.6445 495.9766 L
-319.7246 495.9766 L
-319.7246 495.9111 319.6953 495.8496 319.6445 495.791 C
-319.6445 495.5664 L
-319.7246 495.5664 L
-319.7246 495.501 319.6953 495.4395 319.6445 495.3809 C
-319.6445 495.1572 L
-319.7246 495.1572 L
-319.7246 495.0918 319.6953 495.0303 319.6445 494.9717 C
-319.6445 494.748 L
-319.7246 494.748 L
-319.7246 494.6826 319.6953 494.6211 319.6445 494.5625 C
-319.6445 494.3379 L
-319.7246 494.3379 L
-319.7246 494.2725 319.6953 494.2109 319.6445 494.1533 C
-319.6445 493.9287 L
-319.7246 493.9287 L
-319.7246 493.8633 319.6953 493.8018 319.6445 493.7432 C
-319.6445 493.5186 L
-319.7246 493.5186 L
-319.7246 493.4541 319.6953 493.3916 319.6445 493.334 C
-319.6445 493.1094 L
-319.7246 493.1094 L
-319.7246 493.0439 319.6953 492.9824 319.6445 492.9248 C
-319.6445 492.7002 L
-319.7246 492.7002 L
-319.7246 492.6348 319.6953 492.5732 319.6445 492.5146 C
-319.6445 492.29 L
-319.7246 492.29 L
-319.7246 492.2256 319.6953 492.1631 319.6445 492.1055 C
-319.6445 491.8809 L
-319.7246 491.8809 L
-319.7246 491.8154 319.6953 491.7539 319.6445 491.6953 C
-319.6445 491.4717 L
-319.7246 491.4717 L
-319.7246 491.4063 319.6953 491.3447 319.6445 491.2861 C
-319.6445 491.0615 L
-319.7246 491.0615 L
-319.7246 490.9971 319.6953 490.9346 319.6445 490.876 C
-319.6445 490.6523 L
-319.7246 490.6523 L
-319.7246 490.5869 319.6953 490.5254 319.6445 490.4668 C
-319.6445 490.2432 L
-319.7246 490.2432 L
-319.7246 490.1777 319.6953 490.1162 319.6445 490.0576 C
-319.6445 489.833 L
-319.7246 489.833 L
-319.7246 489.7676 319.6953 489.7061 319.6445 489.6475 C
-319.6445 489.4238 L
-319.7246 489.4238 L
-319.7246 489.3584 319.6953 489.2969 319.6445 489.2383 C
-319.6445 489.0146 L
-319.7246 489.0146 L
-319.7246 488.9648 319.7051 488.918 319.6738 488.8721 C
-321.4297 488.6143 322.5762 488.1904 322.5762 487.71 c
-322.5762 487.6543 322.5566 487.5986 322.5254 487.5439 c
-322.5566 487.5986 322.5762 487.6543 322.5762 487.71 C
-322.5762 485.8975 L
-322.5762 485.7988 322.5293 485.7031 322.4365 485.6104 c
-322.3457 485.5186 322.2119 485.4287 322.0391 485.3438 c
-321.8662 485.2588 321.6543 485.1787 321.4082 485.1025 c
-321.1641 485.0273 320.8828 484.957 320.5742 484.8926 c
-320.2646 484.8281 319.9277 484.7695 319.5625 484.7188 c
-319.1992 484.667 318.8105 484.624 318.4014 484.5879 c
-317.9941 484.5518 317.5645 484.5234 317.1182 484.5049 c
-316.6738 484.4863 316.2129 484.4766 315.7422 484.4766 c
-315.2705 484.4766 314.8086 484.4863 314.3652 484.5049 c
-313.9189 484.5234 313.4902 484.5518 313.082 484.5879 c
-312.6729 484.624 312.2852 484.667 311.9209 484.7188 c
-311.5576 484.7695 311.2188 484.8281 310.9102 484.8926 c
-310.5996 484.957 310.3203 485.0273 310.0742 485.1025 c
-309.8281 485.1787 309.6172 485.2588 309.4453 485.3438 c
-309.2715 485.4287 309.1377 485.5186 309.0469 485.6104 c
-308.9561 485.7031 308.9082 485.7988 308.9082 485.8975 C
-308.9082 487.71 L
-308.9082 488.1904 310.0547 488.6143 311.8086 488.8721 C
-311.7793 488.918 311.7598 488.9648 311.7598 489.0146 C
-311.8379 489.0146 L
-311.8379 489.2383 L
-311.7891 489.2969 311.7598 489.3584 311.7598 489.4238 C
-311.8379 489.4238 L
-311.8379 489.6475 L
-311.7891 489.7061 311.7598 489.7676 311.7598 489.833 C
-311.8379 489.833 L
-311.8379 490.0576 L
-311.7891 490.1162 311.7598 490.1777 311.7598 490.2432 C
-311.8379 490.2432 L
-311.8379 490.4668 L
-311.7891 490.5254 311.7598 490.5869 311.7598 490.6523 C
-311.8379 490.6523 L
-311.8379 490.876 L
-311.7891 490.9346 311.7598 490.9971 311.7598 491.0615 C
-311.8379 491.0615 L
-311.8379 491.2861 L
-311.7891 491.3447 311.7598 491.4063 311.7598 491.4717 C
-311.8379 491.4717 L
-311.8379 491.6953 L
-311.7891 491.7539 311.7598 491.8154 311.7598 491.8809 C
-311.8379 491.8809 L
-311.8379 492.1055 L
-311.7891 492.1631 311.7598 492.2256 311.7598 492.29 C
-311.8379 492.29 L
-311.8379 492.5146 L
-311.7891 492.5732 311.7598 492.6348 311.7598 492.7002 C
-311.8379 492.7002 L
-311.8379 492.9248 L
-311.7891 492.9824 311.7598 493.0439 311.7598 493.1094 C
-311.8379 493.1094 L
-311.8379 493.334 L
-311.7891 493.3916 311.7598 493.4541 311.7598 493.5186 C
-311.8379 493.5186 L
-311.8379 493.7432 L
-311.7891 493.8018 311.7598 493.8633 311.7598 493.9287 C
-311.8379 493.9287 L
-311.8379 494.1533 L
-311.7891 494.2109 311.7598 494.2725 311.7598 494.3379 C
-311.8379 494.3379 L
-311.8379 494.5625 L
-311.7891 494.6211 311.7598 494.6826 311.7598 494.748 C
-311.8379 494.748 L
-311.8379 494.9717 L
-311.7891 495.0303 311.7598 495.0918 311.7598 495.1572 C
-311.8379 495.1572 L
-311.8379 495.3809 L
-311.7891 495.4395 311.7598 495.501 311.7598 495.5664 C
-311.8379 495.5664 L
-311.8379 495.791 L
-311.7891 495.8496 311.7598 495.9111 311.7598 495.9766 C
-311.8379 495.9766 L
-311.8379 496.2002 L
-311.7891 496.2588 311.7598 496.3203 311.7598 496.3857 C
-311.8379 496.3857 L
-311.8379 496.6104 L
-311.7891 496.6689 311.7598 496.7295 311.7598 496.7949 C
-311.8379 496.7949 L
-311.8379 497.0195 L
-311.7891 497.0771 311.7598 497.1396 311.7598 497.2041 C
-311.8379 497.2041 L
-311.8379 497.4287 L
-311.7891 497.4873 311.7598 497.5488 311.7598 497.6143 C
-311.8379 497.6143 L
-311.8379 497.8389 L
-311.7891 497.8975 311.7598 497.959 311.7598 498.0234 C
-311.8379 498.0234 L
-311.8379 498.248 L
-311.7891 498.3066 311.7598 498.3682 311.7598 498.4336 C
-311.8379 498.4336 L
-311.8379 498.5547 L
-311.5078 498.6025 311.1953 498.6563 310.9102 498.7158 c
-310.5996 498.7803 310.3203 498.8506 310.0742 498.9258 c
-309.8281 499.001 309.6172 499.083 309.4453 499.167 c
-309.2715 499.2529 309.1377 499.3418 309.0469 499.4346 c
-308.9561 499.5264 308.9082 499.6221 308.9082 499.7207 C
-308.9082 501.5332 L
-308.9082 502.1582 310.8477 502.6885 313.543 502.8789 C
-313.582 502.9521 313.623 503.0264 313.6621 503.1064 c
-314.1523 504.085 314.0098 504.9297 313.8594 505.8252 c
-313.7656 506.3828 313.6689 506.96 313.7227 507.5918 c
-313.8652 509.2441 315.6289 510.0547 315.6758 510.0693 C
-322.6426 510.0693 L
-322.6719 509.9404 L
-322.6621 509.9355 321.6992 509.4648 320.7813 507.9551 c
-320.2441 507.0723 320.3799 506.0176 320.5137 504.998 c
-320.6094 504.2754 320.6973 503.5938 320.5186 503.0557 c
-320.4629 502.8877 320.3965 502.7324 320.3242 502.5879 C
-321.707 502.3271 322.5762 501.9521 322.5762 501.5332 C
-s
-1 D
-309.4473 500.9795 m
-309.3691 501.0176 309.3018 501.0557 309.2402 501.0957 c
-309.2998 501.0566 309.3691 501.0176 309.4453 500.9805 C
-309.4453 500.9795 309.4473 500.9795 Y
-s
-0 D
-310.9102 486.7051 m
-310.9102 486.7061 310.9082 486.7061 v
-310.9102 486.7061 310.9102 486.7051 V
-310.9102 486.7051 l
-s
-314.3857 486.3174 m
-314.3701 486.3174 314.3574 486.3184 314.3438 486.3193 C
-314.3516 486.3193 314.3574 486.3184 314.3652 486.3174 C
-314.3701 486.3174 314.3789 486.3174 314.3857 486.3174 c
-s
-317.1406 486.3193 m
-317.127 486.3184 317.1113 486.3174 317.0996 486.3174 c
-317.1055 486.3174 317.1133 486.3174 317.1182 486.3174 C
-317.127 486.3184 317.1318 486.3193 317.1406 486.3193 C
-s
-1 D
-322.3613 487.3545 m
-322.3896 487.3779 322.4141 487.4004 322.4365 487.4238 c
-322.459 487.4463 322.4707 487.4707 322.4883 487.4932 c
-322.4531 487.4463 322.417 487.4004 322.3613 487.3545 c
-s
-322.3965 501.2109 m
-322.3086 501.1309 322.1875 501.0537 322.0371 500.9795 C
-322.0391 500.9795 322.0391 500.9805 V
-322.1895 501.0537 322.3086 501.1318 322.3965 501.2109 c
-s
-*U
-u
-0 O
-0 g
-0 D
-315.7891 497.2725 m
-F
-u
-u
-0.67 g
-322.3613 487.3545 m
-322.2773 487.2871 322.1689 487.2207 322.0391 487.1572 C
-322.0391 487.1572 L
-322.0391 487.1572 L
-321.4355 486.8604 320.3594 486.6143 319.0059 486.4619 c
-319.002 486.4609 318.9961 486.46 318.9922 486.46 c
-318.8057 486.4385 318.6133 486.4199 318.418 486.4023 c
-318.4121 486.4014 318.4082 486.4014 318.4014 486.4014 c
-318.3965 486.4004 318.3906 486.3994 318.3857 486.3994 c
-318.1895 486.3818 317.9883 486.3672 317.7832 486.3535 c
-317.7773 486.3535 317.7715 486.3525 317.7656 486.3525 c
-317.5605 486.3389 317.3516 486.3281 317.1406 486.3193 c
-317.1318 486.3193 317.127 486.3184 317.1182 486.3174 c
-317.1133 486.3174 317.1055 486.3174 317.0996 486.3174 c
-316.6602 486.2988 316.207 486.2891 315.7422 486.2891 c
-315.2773 486.2891 314.8242 486.2988 314.3857 486.3174 c
-314.3789 486.3174 314.3701 486.3174 314.3652 486.3174 c
-314.3574 486.3184 314.3516 486.3193 314.3438 486.3193 c
-314.1318 486.3281 313.9219 486.3398 313.7188 486.3525 c
-313.7129 486.3525 313.708 486.3535 313.7012 486.3535 c
-313.4961 486.3672 313.293 486.3818 313.0967 486.3994 c
-313.0918 486.3994 313.0859 486.4004 313.082 486.4014 c
-313.0781 486.4014 313.0723 486.4014 313.0684 486.4023 c
-312.8701 486.4189 312.6777 486.4385 312.4902 486.46 c
-312.4873 486.46 312.4824 486.4609 312.4785 486.4619 c
-311.9004 486.5264 311.373 486.6094 310.9102 486.7051 c
-310.9102 486.7051 l
-310.9102 486.7061 310.9082 486.7061 y
-310.291 486.834 309.791 486.9873 309.4453 487.1572 C
-309.4453 487.1572 L
-309.4453 487.1572 L
-309.2471 487.2539 309.1006 487.3564 309.0117 487.4639 c
-308.9453 487.5439 308.9082 487.626 308.9082 487.71 C
-308.9082 485.8975 L
-308.9082 485.7988 308.9561 485.7031 309.0469 485.6104 c
-309.1377 485.5186 309.2715 485.4287 309.4453 485.3438 c
-309.6172 485.2588 309.8281 485.1787 310.0742 485.1025 c
-310.3203 485.0273 310.5996 484.957 310.9102 484.8926 c
-311.2188 484.8281 311.5576 484.7695 311.9209 484.7188 c
-312.2852 484.667 312.6729 484.624 313.082 484.5879 c
-313.4902 484.5518 313.9189 484.5234 314.3652 484.5049 c
-314.8086 484.4863 315.2705 484.4766 315.7422 484.4766 c
-316.2129 484.4766 316.6738 484.4863 317.1182 484.5049 c
-317.5645 484.5234 317.9941 484.5518 318.4014 484.5879 c
-318.8105 484.624 319.1992 484.667 319.5625 484.7188 c
-319.9277 484.7695 320.2646 484.8281 320.5742 484.8926 c
-320.8828 484.957 321.1641 485.0273 321.4082 485.1025 c
-321.6543 485.1787 321.8662 485.2588 322.0391 485.3438 c
-322.2119 485.4287 322.3457 485.5186 322.4365 485.6104 c
-322.5293 485.7031 322.5762 485.7988 322.5762 485.8975 C
-322.5762 487.71 L
-322.5762 487.6123 322.5293 487.5166 322.4365 487.4238 c
-322.4141 487.4004 322.3896 487.3779 322.3613 487.3545 c
-f
-0.39 g
-319.6445 488.6045 m
-319.7246 488.6045 L
-319.7246 488.54 319.6953 488.4775 319.6445 488.4199 C
-319.6445 488.0752 L
-319.6445 488.0186 319.6172 487.9639 319.5654 487.9111 c
-319.5137 487.8584 319.4365 487.8076 319.3379 487.7588 c
-319.2383 487.71 319.1182 487.6641 318.9785 487.6211 c
-318.8379 487.5781 318.6777 487.5381 318.502 487.501 c
-318.3262 487.4648 318.1309 487.4307 317.9238 487.4014 c
-317.7158 487.373 317.4941 487.3477 317.2617 487.3271 c
-317.0273 487.3066 316.7832 487.29 316.5293 487.2803 c
-316.2754 487.2695 316.0117 487.2637 315.7422 487.2637 c
-315.4727 487.2637 315.209 487.2695 314.9561 487.2803 c
-314.7012 487.29 314.457 487.3066 314.2227 487.3271 c
-313.9902 487.3477 313.7676 487.373 313.5605 487.4014 c
-313.3516 487.4307 313.1582 487.4648 312.9814 487.501 c
-312.8066 487.5381 312.6455 487.5781 312.5059 487.6211 c
-312.3652 487.6641 312.2441 487.71 312.1465 487.7588 c
-312.0469 487.8076 311.9707 487.8584 311.918 487.9111 c
-311.8662 487.9639 311.8379 488.0186 311.8379 488.0752 C
-311.8379 488.4199 L
-311.7891 488.4775 311.7598 488.54 311.7598 488.6045 C
-311.8379 488.6045 L
-311.8379 488.8291 L
-311.8262 488.8428 311.8174 488.8574 311.8086 488.8721 C
-310.0547 488.6143 308.9082 488.1904 308.9082 487.71 c
-308.9082 487.626 308.9453 487.5439 309.0117 487.4639 c
-309.1006 487.3564 309.2471 487.2539 309.4453 487.1572 C
-309.4453 487.1572 L
-309.791 486.9873 310.291 486.834 310.9082 486.7061 c
-310.9102 486.7061 310.9102 486.7051 y
-311.373 486.6094 311.9004 486.5264 312.4785 486.4619 c
-312.4824 486.4609 312.4873 486.46 312.4902 486.46 c
-312.6777 486.4385 312.8701 486.4189 313.0684 486.4023 c
-313.0781 486.4014 313.0869 486.4004 313.0967 486.3994 c
-313.293 486.3818 313.4961 486.3672 313.7012 486.3535 c
-313.708 486.3535 313.7129 486.3525 313.7188 486.3525 c
-313.9219 486.3398 314.1318 486.3281 314.3438 486.3193 c
-314.3574 486.3184 314.3701 486.3174 314.3857 486.3174 c
-314.8242 486.2988 315.2773 486.2891 315.7422 486.2891 c
-316.207 486.2891 316.6602 486.2988 317.0996 486.3174 c
-317.1113 486.3174 317.127 486.3184 317.1406 486.3193 c
-317.3516 486.3281 317.5605 486.3389 317.7656 486.3525 c
-317.7715 486.3525 317.7773 486.3535 317.7832 486.3535 c
-317.9883 486.3672 318.1895 486.3818 318.3857 486.3994 c
-318.3965 486.4004 318.4063 486.4014 318.418 486.4023 c
-318.6133 486.4199 318.8057 486.4385 318.9922 486.46 c
-318.9961 486.46 319.002 486.4609 319.0059 486.4619 c
-320.3594 486.6143 321.4355 486.8604 322.0391 487.1572 C
-322.0391 487.1572 L
-322.1689 487.2207 322.2773 487.2871 322.3613 487.3545 c
-322.502 487.4688 322.5762 487.5879 322.5762 487.71 c
-322.5762 488.1904 321.4297 488.6143 319.6738 488.8721 C
-319.666 488.8574 319.6563 488.8428 319.6445 488.8291 C
-319.6445 488.6045 L
-f
-0.55 g
-315.7422 492.6377 m
-314.0313 492.6377 312.2285 492.8799 311.8379 493.334 C
-311.8379 493.1094 L
-311.8945 493.1094 L
-311.8945 492.7568 313.4746 492.3633 315.7422 492.3633 c
-318.0098 492.3633 319.5898 492.7568 319.5898 493.1094 C
-319.6445 493.1094 L
-319.6445 493.334 L
-319.2559 492.8799 317.4531 492.6377 315.7422 492.6377 c
-f
-315.7422 495.5039 m
-314.0313 495.5039 312.2285 495.7471 311.8379 496.2002 C
-311.8379 495.9766 L
-311.8945 495.9766 L
-311.8945 495.623 313.4746 495.2295 315.7422 495.2295 c
-318.0098 495.2295 319.5898 495.623 319.5898 495.9766 C
-319.6445 495.9766 L
-319.6445 496.2002 L
-319.2559 495.7471 317.4531 495.5039 315.7422 495.5039 c
-f
-315.7422 492.2275 m
-314.0313 492.2275 312.2285 492.4707 311.8379 492.9248 C
-311.8379 492.7002 L
-311.8945 492.7002 L
-311.8945 492.3467 313.4746 491.9531 315.7422 491.9531 c
-318.0098 491.9531 319.5898 492.3467 319.5898 492.7002 C
-319.6445 492.7002 L
-319.6445 492.9248 L
-319.2559 492.4707 317.4531 492.2275 315.7422 492.2275 c
-f
-315.7422 491.8184 m
-314.0313 491.8184 312.2285 492.0615 311.8379 492.5146 C
-311.8379 492.29 L
-311.8945 492.29 L
-311.8945 491.9375 313.4746 491.5439 315.7422 491.5439 c
-318.0098 491.5439 319.5898 491.9375 319.5898 492.29 C
-319.6445 492.29 L
-319.6445 492.5146 L
-319.2559 492.0615 317.4531 491.8184 315.7422 491.8184 c
-f
-315.7422 495.0947 m
-314.0313 495.0947 312.2285 495.3369 311.8379 495.791 C
-311.8379 495.5664 L
-311.8945 495.5664 L
-311.8945 495.2139 313.4746 494.8203 315.7422 494.8203 c
-318.0098 494.8203 319.5898 495.2139 319.5898 495.5664 C
-319.6445 495.5664 L
-319.6445 495.791 L
-319.2559 495.3369 317.4531 495.0947 315.7422 495.0947 c
-f
-315.7422 493.8662 m
-314.0313 493.8662 312.2285 494.1094 311.8379 494.5625 C
-311.8379 494.3379 L
-311.8945 494.3379 L
-311.8945 493.9854 313.4746 493.5908 315.7422 493.5908 c
-318.0098 493.5908 319.5898 493.9854 319.5898 494.3379 C
-319.6445 494.3379 L
-319.6445 494.5625 L
-319.2559 494.1094 317.4531 493.8662 315.7422 493.8662 c
-f
-315.7422 493.0469 m
-314.0313 493.0469 312.2285 493.29 311.8379 493.7432 C
-311.8379 493.5186 L
-311.8945 493.5186 L
-311.8945 493.166 313.4746 492.7725 315.7422 492.7725 c
-318.0098 492.7725 319.5898 493.166 319.5898 493.5186 C
-319.6445 493.5186 L
-319.6445 493.7432 L
-319.2559 493.29 317.4531 493.0469 315.7422 493.0469 c
-f
-315.7422 494.2754 m
-314.0313 494.2754 312.2285 494.5186 311.8379 494.9717 C
-311.8379 494.748 L
-311.8945 494.748 L
-311.8945 494.3945 313.4746 494.001 315.7422 494.001 c
-318.0098 494.001 319.5898 494.3945 319.5898 494.748 C
-319.6445 494.748 L
-319.6445 494.9717 L
-319.2559 494.5186 317.4531 494.2754 315.7422 494.2754 c
-f
-315.7422 497.1416 m
-314.0313 497.1416 312.2285 497.3848 311.8379 497.8389 C
-311.8379 497.6143 L
-311.8945 497.6143 L
-311.8945 497.2617 313.4746 496.8682 315.7422 496.8682 c
-318.0098 496.8682 319.5898 497.2617 319.5898 497.6143 C
-319.6445 497.6143 L
-319.6445 497.8389 L
-319.2559 497.3848 317.4531 497.1416 315.7422 497.1416 c
-f
-315.7422 496.3232 m
-314.0313 496.3232 312.2285 496.5654 311.8379 497.0195 C
-311.8379 496.7949 L
-311.8945 496.7949 L
-311.8945 496.4424 313.4746 496.0488 315.7422 496.0488 c
-318.0098 496.0488 319.5898 496.4424 319.5898 496.7949 C
-319.6445 496.7949 L
-319.6445 497.0195 L
-319.2559 496.5654 317.4531 496.3232 315.7422 496.3232 c
-f
-315.7422 493.4561 m
-314.0313 493.4561 312.2285 493.6992 311.8379 494.1533 C
-311.8379 493.9287 L
-311.8945 493.9287 L
-311.8945 493.5752 313.4746 493.1826 315.7422 493.1826 c
-318.0098 493.1826 319.5898 493.5752 319.5898 493.9287 C
-319.6445 493.9287 L
-319.6445 494.1533 L
-319.2559 493.6992 317.4531 493.4561 315.7422 493.4561 c
-f
-315.7422 494.6846 m
-314.0313 494.6846 312.2285 494.9277 311.8379 495.3809 C
-311.8379 495.1572 L
-311.8945 495.1572 L
-311.8945 494.8037 313.4746 494.4111 315.7422 494.4111 c
-318.0098 494.4111 319.5898 494.8037 319.5898 495.1572 C
-319.6445 495.1572 L
-319.6445 495.3809 L
-319.2559 494.9277 317.4531 494.6846 315.7422 494.6846 c
-f
-315.7422 496.7334 m
-314.0313 496.7334 312.2285 496.9756 311.8379 497.4287 C
-311.8379 497.2041 L
-311.8945 497.2041 L
-311.8945 496.8516 313.4746 496.458 315.7422 496.458 c
-318.0098 496.458 319.5898 496.8516 319.5898 497.2041 C
-319.6445 497.2041 L
-319.6445 497.4287 L
-319.2559 496.9756 317.4531 496.7334 315.7422 496.7334 c
-f
-315.7422 495.9141 m
-314.0313 495.9141 312.2285 496.1572 311.8379 496.6104 C
-311.8379 496.3857 L
-311.8945 496.3857 L
-311.8945 496.0322 313.4746 495.6387 315.7422 495.6387 c
-318.0098 495.6387 319.5898 496.0322 319.5898 496.3857 C
-319.6445 496.3857 L
-319.6445 496.6104 L
-319.2559 496.1572 317.4531 495.9141 315.7422 495.9141 c
-f
-315.7422 489.7705 m
-314.0313 489.7705 312.2285 490.0137 311.8379 490.4668 C
-311.8379 490.2432 L
-311.8945 490.2432 L
-311.8945 489.8896 313.4746 489.4961 315.7422 489.4961 c
-318.0098 489.4961 319.5898 489.8896 319.5898 490.2432 C
-319.6445 490.2432 L
-319.6445 490.4668 L
-319.2559 490.0137 317.4531 489.7705 315.7422 489.7705 c
-f
-315.7422 488.542 m
-314.0313 488.542 312.2285 488.7852 311.8379 489.2383 C
-311.8379 489.0146 L
-311.8945 489.0146 L
-311.8945 488.6611 313.4746 488.2676 315.7422 488.2676 c
-318.0098 488.2676 319.5898 488.6611 319.5898 489.0146 C
-319.6445 489.0146 L
-319.6445 489.2383 L
-319.2559 488.7852 317.4531 488.542 315.7422 488.542 c
-f
-315.7422 488.9521 m
-314.0313 488.9521 312.2285 489.1943 311.8379 489.6475 C
-311.8379 489.4238 L
-311.8945 489.4238 L
-311.8945 489.0703 313.4746 488.6768 315.7422 488.6768 c
-318.0098 488.6768 319.5898 489.0703 319.5898 489.4238 C
-319.6445 489.4238 L
-319.6445 489.6475 L
-319.2559 489.1943 317.4531 488.9521 315.7422 488.9521 c
-f
-315.7422 491.4092 m
-314.0313 491.4092 312.2285 491.6514 311.8379 492.1055 C
-311.8379 491.8809 L
-311.8945 491.8809 L
-311.8945 491.5283 313.4746 491.1338 315.7422 491.1338 c
-318.0098 491.1338 319.5898 491.5283 319.5898 491.8809 C
-319.6445 491.8809 L
-319.6445 492.1055 L
-319.2559 491.6514 317.4531 491.4092 315.7422 491.4092 c
-f
-315.7422 490.1807 m
-314.0313 490.1807 312.2285 490.4229 311.8379 490.876 C
-311.8379 490.6523 L
-311.8945 490.6523 L
-311.8945 490.2998 313.4746 489.9053 315.7422 489.9053 c
-318.0098 489.9053 319.5898 490.2998 319.5898 490.6523 C
-319.6445 490.6523 L
-319.6445 490.876 L
-319.2559 490.4229 317.4531 490.1807 315.7422 490.1807 c
-f
-315.7422 490.5898 m
-314.0313 490.5898 312.2285 490.833 311.8379 491.2861 C
-311.8379 491.0615 L
-311.8945 491.0615 L
-311.8945 490.709 313.4746 490.3154 315.7422 490.3154 c
-318.0098 490.3154 319.5898 490.709 319.5898 491.0615 C
-319.6445 491.0615 L
-319.6445 491.2861 L
-319.2559 490.833 317.4531 490.5898 315.7422 490.5898 c
-f
-315.7422 490.999 m
-314.0313 490.999 312.2285 491.2422 311.8379 491.6953 C
-311.8379 491.4717 L
-311.8945 491.4717 L
-311.8945 491.1182 313.4746 490.7246 315.7422 490.7246 c
-318.0098 490.7246 319.5898 491.1182 319.5898 491.4717 C
-319.6445 491.4717 L
-319.6445 491.6953 L
-319.2559 491.2422 317.4531 490.999 315.7422 490.999 c
-f
-315.7422 489.3613 m
-314.0313 489.3613 312.2285 489.6045 311.8379 490.0576 C
-311.8379 489.833 L
-311.8945 489.833 L
-311.8945 489.4805 313.4746 489.0869 315.7422 489.0869 c
-318.0098 489.0869 319.5898 489.4805 319.5898 489.833 C
-319.6445 489.833 L
-319.6445 490.0576 L
-319.2559 489.6045 317.4531 489.3613 315.7422 489.3613 c
-f
-318.4014 498.4111 m
-317.9941 498.375 317.5645 498.3467 317.1182 498.3281 c
-316.6738 498.3096 316.2129 498.2998 315.7422 498.2998 c
-315.2705 498.2998 314.8086 498.3096 314.3652 498.3281 c
-313.9189 498.3467 313.4902 498.375 313.082 498.4111 c
-312.6729 498.4473 312.2852 498.4912 311.9209 498.542 c
-311.8926 498.5459 311.8662 498.5508 311.8379 498.5547 C
-311.8379 498.4336 L
-311.8945 498.4336 L
-311.8945 498.0811 313.4746 497.6865 315.7422 497.6865 c
-318.0098 497.6865 319.5898 498.0811 319.5898 498.4336 C
-319.6445 498.4336 L
-319.6445 498.5547 L
-319.6172 498.5508 319.5918 498.5459 319.5625 498.542 c
-319.1992 498.4912 318.8105 498.4473 318.4014 498.4111 c
-f
-315.7422 497.5518 m
-314.0313 497.5518 312.2285 497.7949 311.8379 498.248 C
-311.8379 498.0234 L
-311.8945 498.0234 L
-311.8945 497.6709 313.4746 497.2773 315.7422 497.2773 c
-318.0098 497.2773 319.5898 497.6709 319.5898 498.0234 C
-319.6445 498.0234 L
-319.6445 498.248 L
-319.2559 497.7949 317.4531 497.5518 315.7422 497.5518 c
-f
-315.7422 487.7236 m
-314.0313 487.7236 312.2285 487.9658 311.8379 488.4199 C
-311.8379 488.0752 L
-311.8379 488.0186 311.8662 487.9639 311.918 487.9111 c
-311.9707 487.8584 312.0469 487.8076 312.1465 487.7588 c
-312.2441 487.71 312.3652 487.6641 312.5059 487.6211 c
-312.6455 487.5781 312.8066 487.5381 312.9814 487.501 c
-313.1582 487.4648 313.3516 487.4307 313.5605 487.4014 c
-313.7676 487.373 313.9902 487.3477 314.2227 487.3271 c
-314.457 487.3066 314.7012 487.29 314.9561 487.2803 c
-315.209 487.2695 315.4727 487.2637 315.7422 487.2637 c
-316.0117 487.2637 316.2754 487.2695 316.5293 487.2803 c
-316.7832 487.29 317.0273 487.3066 317.2617 487.3271 c
-317.4941 487.3477 317.7158 487.373 317.9238 487.4014 c
-318.1309 487.4307 318.3262 487.4648 318.502 487.501 c
-318.6777 487.5381 318.8379 487.5781 318.9785 487.6211 c
-319.1182 487.6641 319.2383 487.71 319.3379 487.7588 c
-319.4365 487.8076 319.5137 487.8584 319.5654 487.9111 c
-319.6172 487.9639 319.6445 488.0186 319.6445 488.0752 C
-319.6445 488.4199 L
-319.2559 487.9658 317.4531 487.7236 315.7422 487.7236 c
-f
-311.8945 488.6045 m
-311.8945 488.252 313.4746 487.8584 315.7422 487.8584 c
-318.0098 487.8584 319.5898 488.252 319.5898 488.6045 C
-319.6445 488.6045 L
-319.6445 488.8291 L
-319.2559 488.376 317.4531 488.1328 315.7422 488.1328 c
-314.0313 488.1328 312.2285 488.376 311.8379 488.8291 C
-311.8379 488.6045 L
-311.8945 488.6045 L
-f
-0.15 g
-315.7422 497.6865 m
-313.4746 497.6865 311.8945 498.0811 311.8945 498.4336 C
-311.8379 498.4336 L
-311.7598 498.4336 L
-311.7598 498.3682 311.7891 498.3066 311.8379 498.248 c
-312.2285 497.7949 314.0313 497.5518 315.7422 497.5518 c
-317.4531 497.5518 319.2559 497.7949 319.6445 498.248 c
-319.6953 498.3066 319.7246 498.3682 319.7246 498.4336 C
-319.6445 498.4336 L
-319.5898 498.4336 L
-319.5898 498.0811 318.0098 497.6865 315.7422 497.6865 c
-f
-315.7422 497.2773 m
-313.4746 497.2773 311.8945 497.6709 311.8945 498.0234 C
-311.8379 498.0234 L
-311.7598 498.0234 L
-311.7598 497.959 311.7891 497.8975 311.8379 497.8389 c
-312.2285 497.3848 314.0313 497.1416 315.7422 497.1416 c
-317.4531 497.1416 319.2559 497.3848 319.6445 497.8389 c
-319.6953 497.8975 319.7246 497.959 319.7246 498.0234 C
-319.6445 498.0234 L
-319.5898 498.0234 L
-319.5898 497.6709 318.0098 497.2773 315.7422 497.2773 c
-f
-315.7422 496.8682 m
-313.4746 496.8682 311.8945 497.2617 311.8945 497.6143 C
-311.8379 497.6143 L
-311.7598 497.6143 L
-311.7598 497.5488 311.7891 497.4873 311.8379 497.4287 c
-312.2285 496.9756 314.0313 496.7334 315.7422 496.7334 c
-317.4531 496.7334 319.2559 496.9756 319.6445 497.4287 c
-319.6953 497.4873 319.7246 497.5488 319.7246 497.6143 C
-319.6445 497.6143 L
-319.5898 497.6143 L
-319.5898 497.2617 318.0098 496.8682 315.7422 496.8682 c
-f
-315.7422 496.458 m
-313.4746 496.458 311.8945 496.8516 311.8945 497.2041 C
-311.8379 497.2041 L
-311.7598 497.2041 L
-311.7598 497.1396 311.7891 497.0771 311.8379 497.0195 c
-312.2285 496.5654 314.0313 496.3232 315.7422 496.3232 c
-317.4531 496.3232 319.2559 496.5654 319.6445 497.0195 c
-319.6953 497.0771 319.7246 497.1396 319.7246 497.2041 C
-319.6445 497.2041 L
-319.5898 497.2041 L
-319.5898 496.8516 318.0098 496.458 315.7422 496.458 c
-f
-315.7422 496.0488 m
-313.4746 496.0488 311.8945 496.4424 311.8945 496.7949 C
-311.8379 496.7949 L
-311.7598 496.7949 L
-311.7598 496.7295 311.7891 496.6689 311.8379 496.6104 c
-312.2285 496.1572 314.0313 495.9141 315.7422 495.9141 c
-317.4531 495.9141 319.2559 496.1572 319.6445 496.6104 c
-319.6953 496.6689 319.7246 496.7295 319.7246 496.7949 C
-319.6445 496.7949 L
-319.5898 496.7949 L
-319.5898 496.4424 318.0098 496.0488 315.7422 496.0488 c
-f
-315.7422 495.6387 m
-313.4746 495.6387 311.8945 496.0322 311.8945 496.3857 C
-311.8379 496.3857 L
-311.7598 496.3857 L
-311.7598 496.3203 311.7891 496.2588 311.8379 496.2002 c
-312.2285 495.7471 314.0313 495.5039 315.7422 495.5039 c
-317.4531 495.5039 319.2559 495.7471 319.6445 496.2002 c
-319.6953 496.2588 319.7246 496.3203 319.7246 496.3857 C
-319.6445 496.3857 L
-319.5898 496.3857 L
-319.5898 496.0322 318.0098 495.6387 315.7422 495.6387 c
-f
-315.7422 495.2295 m
-313.4746 495.2295 311.8945 495.623 311.8945 495.9766 C
-311.8379 495.9766 L
-311.7598 495.9766 L
-311.7598 495.9111 311.7891 495.8496 311.8379 495.791 c
-312.2285 495.3369 314.0313 495.0947 315.7422 495.0947 c
-317.4531 495.0947 319.2559 495.3369 319.6445 495.791 c
-319.6953 495.8496 319.7246 495.9111 319.7246 495.9766 C
-319.6445 495.9766 L
-319.5898 495.9766 L
-319.5898 495.623 318.0098 495.2295 315.7422 495.2295 c
-f
-315.7422 494.8203 m
-313.4746 494.8203 311.8945 495.2139 311.8945 495.5664 C
-311.8379 495.5664 L
-311.7598 495.5664 L
-311.7598 495.501 311.7891 495.4395 311.8379 495.3809 c
-312.2285 494.9277 314.0313 494.6846 315.7422 494.6846 c
-317.4531 494.6846 319.2559 494.9277 319.6445 495.3809 c
-319.6953 495.4395 319.7246 495.501 319.7246 495.5664 C
-319.6445 495.5664 L
-319.5898 495.5664 L
-319.5898 495.2139 318.0098 494.8203 315.7422 494.8203 c
-f
-315.7422 494.4111 m
-313.4746 494.4111 311.8945 494.8037 311.8945 495.1572 C
-311.8379 495.1572 L
-311.7598 495.1572 L
-311.7598 495.0918 311.7891 495.0303 311.8379 494.9717 c
-312.2285 494.5186 314.0313 494.2754 315.7422 494.2754 c
-317.4531 494.2754 319.2559 494.5186 319.6445 494.9717 c
-319.6953 495.0303 319.7246 495.0918 319.7246 495.1572 C
-319.6445 495.1572 L
-319.5898 495.1572 L
-319.5898 494.8037 318.0098 494.4111 315.7422 494.4111 c
-f
-315.7422 494.001 m
-313.4746 494.001 311.8945 494.3945 311.8945 494.748 C
-311.8379 494.748 L
-311.7598 494.748 L
-311.7598 494.6826 311.7891 494.6211 311.8379 494.5625 c
-312.2285 494.1094 314.0313 493.8662 315.7422 493.8662 c
-317.4531 493.8662 319.2559 494.1094 319.6445 494.5625 c
-319.6953 494.6211 319.7246 494.6826 319.7246 494.748 C
-319.6445 494.748 L
-319.5898 494.748 L
-319.5898 494.3945 318.0098 494.001 315.7422 494.001 c
-f
-315.7422 493.5908 m
-313.4746 493.5908 311.8945 493.9854 311.8945 494.3379 C
-311.8379 494.3379 L
-311.7598 494.3379 L
-311.7598 494.2725 311.7891 494.2109 311.8379 494.1533 c
-312.2285 493.6992 314.0313 493.4561 315.7422 493.4561 c
-317.4531 493.4561 319.2559 493.6992 319.6445 494.1533 c
-319.6953 494.2109 319.7246 494.2725 319.7246 494.3379 C
-319.6445 494.3379 L
-319.5898 494.3379 L
-319.5898 493.9854 318.0098 493.5908 315.7422 493.5908 c
-f
-315.7422 493.1826 m
-313.4746 493.1826 311.8945 493.5752 311.8945 493.9287 C
-311.8379 493.9287 L
-311.7598 493.9287 L
-311.7598 493.8633 311.7891 493.8018 311.8379 493.7432 c
-312.2285 493.29 314.0313 493.0469 315.7422 493.0469 c
-317.4531 493.0469 319.2559 493.29 319.6445 493.7432 c
-319.6953 493.8018 319.7246 493.8633 319.7246 493.9287 C
-319.6445 493.9287 L
-319.5898 493.9287 L
-319.5898 493.5752 318.0098 493.1826 315.7422 493.1826 c
-f
-315.7422 492.7725 m
-313.4746 492.7725 311.8945 493.166 311.8945 493.5186 C
-311.8379 493.5186 L
-311.7598 493.5186 L
-311.7598 493.4541 311.7891 493.3916 311.8379 493.334 c
-312.2285 492.8799 314.0313 492.6377 315.7422 492.6377 c
-317.4531 492.6377 319.2559 492.8799 319.6445 493.334 c
-319.6953 493.3916 319.7246 493.4541 319.7246 493.5186 C
-319.6445 493.5186 L
-319.5898 493.5186 L
-319.5898 493.166 318.0098 492.7725 315.7422 492.7725 c
-f
-315.7422 492.3633 m
-313.4746 492.3633 311.8945 492.7568 311.8945 493.1094 C
-311.8379 493.1094 L
-311.7598 493.1094 L
-311.7598 493.0439 311.7891 492.9824 311.8379 492.9248 c
-312.2285 492.4707 314.0313 492.2275 315.7422 492.2275 c
-317.4531 492.2275 319.2559 492.4707 319.6445 492.9248 c
-319.6953 492.9824 319.7246 493.0439 319.7246 493.1094 C
-319.6445 493.1094 L
-319.5898 493.1094 L
-319.5898 492.7568 318.0098 492.3633 315.7422 492.3633 c
-f
-315.7422 491.9531 m
-313.4746 491.9531 311.8945 492.3467 311.8945 492.7002 C
-311.8379 492.7002 L
-311.7598 492.7002 L
-311.7598 492.6348 311.7891 492.5732 311.8379 492.5146 c
-312.2285 492.0615 314.0313 491.8184 315.7422 491.8184 c
-317.4531 491.8184 319.2559 492.0615 319.6445 492.5146 c
-319.6953 492.5732 319.7246 492.6348 319.7246 492.7002 C
-319.6445 492.7002 L
-319.5898 492.7002 L
-319.5898 492.3467 318.0098 491.9531 315.7422 491.9531 c
-f
-315.7422 491.5439 m
-313.4746 491.5439 311.8945 491.9375 311.8945 492.29 C
-311.8379 492.29 L
-311.7598 492.29 L
-311.7598 492.2256 311.7891 492.1631 311.8379 492.1055 c
-312.2285 491.6514 314.0313 491.4092 315.7422 491.4092 c
-317.4531 491.4092 319.2559 491.6514 319.6445 492.1055 c
-319.6953 492.1631 319.7246 492.2256 319.7246 492.29 C
-319.6445 492.29 L
-319.5898 492.29 L
-319.5898 491.9375 318.0098 491.5439 315.7422 491.5439 c
-f
-315.7422 491.1338 m
-313.4746 491.1338 311.8945 491.5283 311.8945 491.8809 C
-311.8379 491.8809 L
-311.7598 491.8809 L
-311.7598 491.8154 311.7891 491.7539 311.8379 491.6953 c
-312.2285 491.2422 314.0313 490.999 315.7422 490.999 c
-317.4531 490.999 319.2559 491.2422 319.6445 491.6953 c
-319.6953 491.7539 319.7246 491.8154 319.7246 491.8809 C
-319.6445 491.8809 L
-319.5898 491.8809 L
-319.5898 491.5283 318.0098 491.1338 315.7422 491.1338 c
-f
-315.7422 490.7246 m
-313.4746 490.7246 311.8945 491.1182 311.8945 491.4717 C
-311.8379 491.4717 L
-311.7598 491.4717 L
-311.7598 491.4063 311.7891 491.3447 311.8379 491.2861 c
-312.2285 490.833 314.0313 490.5898 315.7422 490.5898 c
-317.4531 490.5898 319.2559 490.833 319.6445 491.2861 c
-319.6953 491.3447 319.7246 491.4063 319.7246 491.4717 C
-319.6445 491.4717 L
-319.5898 491.4717 L
-319.5898 491.1182 318.0098 490.7246 315.7422 490.7246 c
-f
-315.7422 490.3154 m
-313.4746 490.3154 311.8945 490.709 311.8945 491.0615 C
-311.8379 491.0615 L
-311.7598 491.0615 L
-311.7598 490.9971 311.7891 490.9346 311.8379 490.876 c
-312.2285 490.4229 314.0313 490.1807 315.7422 490.1807 c
-317.4531 490.1807 319.2559 490.4229 319.6445 490.876 c
-319.6953 490.9346 319.7246 490.9971 319.7246 491.0615 C
-319.6445 491.0615 L
-319.5898 491.0615 L
-319.5898 490.709 318.0098 490.3154 315.7422 490.3154 c
-f
-315.7422 489.9053 m
-313.4746 489.9053 311.8945 490.2998 311.8945 490.6523 C
-311.8379 490.6523 L
-311.7598 490.6523 L
-311.7598 490.5869 311.7891 490.5254 311.8379 490.4668 c
-312.2285 490.0137 314.0313 489.7705 315.7422 489.7705 c
-317.4531 489.7705 319.2559 490.0137 319.6445 490.4668 c
-319.6953 490.5254 319.7246 490.5869 319.7246 490.6523 C
-319.6445 490.6523 L
-319.5898 490.6523 L
-319.5898 490.2998 318.0098 489.9053 315.7422 489.9053 c
-f
-315.7422 489.4961 m
-313.4746 489.4961 311.8945 489.8896 311.8945 490.2432 C
-311.8379 490.2432 L
-311.7598 490.2432 L
-311.7598 490.1777 311.7891 490.1162 311.8379 490.0576 c
-312.2285 489.6045 314.0313 489.3613 315.7422 489.3613 c
-317.4531 489.3613 319.2559 489.6045 319.6445 490.0576 c
-319.6953 490.1162 319.7246 490.1777 319.7246 490.2432 C
-319.6445 490.2432 L
-319.5898 490.2432 L
-319.5898 489.8896 318.0098 489.4961 315.7422 489.4961 c
-f
-315.7422 489.0869 m
-313.4746 489.0869 311.8945 489.4805 311.8945 489.833 C
-311.8379 489.833 L
-311.7598 489.833 L
-311.7598 489.7676 311.7891 489.7061 311.8379 489.6475 c
-312.2285 489.1943 314.0313 488.9521 315.7422 488.9521 c
-317.4531 488.9521 319.2559 489.1943 319.6445 489.6475 c
-319.6953 489.7061 319.7246 489.7676 319.7246 489.833 C
-319.6445 489.833 L
-319.5898 489.833 L
-319.5898 489.4805 318.0098 489.0869 315.7422 489.0869 c
-f
-315.7422 488.6768 m
-313.4746 488.6768 311.8945 489.0703 311.8945 489.4238 C
-311.8379 489.4238 L
-311.7598 489.4238 L
-311.7598 489.3584 311.7891 489.2969 311.8379 489.2383 c
-312.2285 488.7852 314.0313 488.542 315.7422 488.542 c
-317.4531 488.542 319.2559 488.7852 319.6445 489.2383 c
-319.6953 489.2969 319.7246 489.3584 319.7246 489.4238 C
-319.6445 489.4238 L
-319.5898 489.4238 L
-319.5898 489.0703 318.0098 488.6768 315.7422 488.6768 c
-f
-315.7422 488.2676 m
-313.4746 488.2676 311.8945 488.6611 311.8945 489.0146 C
-311.8379 489.0146 L
-311.7598 489.0146 L
-311.7598 488.9648 311.7793 488.918 311.8086 488.8721 c
-311.8174 488.8574 311.8262 488.8428 311.8379 488.8291 c
-312.2285 488.376 314.0313 488.1328 315.7422 488.1328 c
-317.4531 488.1328 319.2559 488.376 319.6445 488.8291 c
-319.6563 488.8428 319.666 488.8574 319.6738 488.8721 c
-319.7051 488.918 319.7246 488.9648 319.7246 489.0146 C
-319.6445 489.0146 L
-319.5898 489.0146 L
-319.5898 488.6611 318.0098 488.2676 315.7422 488.2676 c
-f
-315.7422 487.8584 m
-313.4746 487.8584 311.8945 488.252 311.8945 488.6045 C
-311.8379 488.6045 L
-311.7598 488.6045 L
-311.7598 488.54 311.7891 488.4775 311.8379 488.4199 c
-312.2285 487.9658 314.0313 487.7236 315.7422 487.7236 c
-317.4531 487.7236 319.2559 487.9658 319.6445 488.4199 c
-319.6953 488.4775 319.7246 488.54 319.7246 488.6045 C
-319.6445 488.6045 L
-319.5898 488.6045 L
-319.5898 488.252 318.0098 487.8584 315.7422 487.8584 c
-f
-0.67 g
-322.3965 501.2109 m
-322.3086 501.1318 322.1895 501.0537 322.0391 500.9805 c
-322.0391 500.9795 322.0371 500.9795 y
-321.9502 500.9365 321.8555 500.8955 321.751 500.8564 c
-321.751 500.8564 l
-321.541 500.7764 321.2969 500.7002 321.0195 500.6309 c
-321.0166 500.6299 321.0137 500.6289 321.0098 500.6279 c
-320.457 500.4893 319.7793 500.373 319.0137 500.2861 c
-319.0029 500.2852 318.9941 500.2842 318.9844 500.2822 c
-318.6094 500.2402 318.2119 500.2051 317.7988 500.1787 c
-317.7813 500.1768 317.7637 500.1758 317.7461 500.1748 c
-317.5547 500.1631 317.3613 500.1523 317.1621 500.1436 c
-317.1484 500.1436 317.1348 500.1416 317.1182 500.1416 c
-317.1055 500.1406 317.0898 500.1406 317.0762 500.1396 c
-316.8701 500.1318 316.6621 500.125 316.4502 500.1201 c
-316.4453 500.1201 316.4375 500.1201 316.4316 500.1201 c
-316.2051 500.1152 315.9746 500.1123 315.7422 500.1123 c
-315.5098 500.1123 315.2793 500.1152 315.0518 500.1201 c
-315.0469 500.1201 315.0391 500.1201 315.0332 500.1201 c
-314.8223 500.125 314.6133 500.1318 314.4082 500.1396 c
-314.3945 500.1406 314.3789 500.1406 314.3652 500.1416 c
-314.3496 500.1416 314.335 500.1436 314.3203 500.1436 c
-314.123 500.1523 313.9277 500.1631 313.7363 500.1748 c
-313.7188 500.1758 313.7021 500.1768 313.6865 500.1787 c
-313.2715 500.2051 312.875 500.2402 312.498 500.2822 c
-312.4883 500.2842 312.4805 500.2842 312.4707 500.2852 c
-311.7051 500.373 311.0254 500.4893 310.4727 500.6279 c
-310.4707 500.6289 310.4668 500.6299 310.4648 500.6309 c
-310.0488 500.7354 309.7051 500.8525 309.4473 500.9795 c
-309.4453 500.9795 309.4453 500.9805 v
-309.3691 501.0176 309.2998 501.0566 309.2402 501.0957 c
-309.0938 501.1895 308.9922 501.2871 308.9434 501.3877 c
-308.9189 501.4355 308.9082 501.4844 308.9082 501.5332 C
-308.9082 499.7207 L
-308.9082 499.6221 308.9561 499.5264 309.0469 499.4346 c
-309.1377 499.3418 309.2715 499.2529 309.4453 499.167 c
-309.6172 499.083 309.8281 499.001 310.0742 498.9258 c
-310.3203 498.8506 310.5996 498.7803 310.9102 498.7158 c
-311.1953 498.6563 311.5078 498.6025 311.8379 498.5547 c
-311.8662 498.5508 311.8926 498.5459 311.9209 498.542 c
-312.2852 498.4912 312.6729 498.4473 313.082 498.4111 c
-313.4902 498.375 313.9189 498.3467 314.3652 498.3281 c
-314.8086 498.3096 315.2705 498.2998 315.7422 498.2998 c
-316.2129 498.2998 316.6738 498.3096 317.1182 498.3281 c
-317.5645 498.3467 317.9941 498.375 318.4014 498.4111 c
-318.8105 498.4473 319.1992 498.4912 319.5625 498.542 c
-319.5918 498.5459 319.6172 498.5508 319.6445 498.5547 c
-319.9766 498.6025 320.2891 498.6563 320.5742 498.7158 c
-320.8828 498.7803 321.1641 498.8506 321.4082 498.9258 c
-321.6543 499.001 321.8662 499.083 322.0391 499.167 c
-322.2119 499.2529 322.3457 499.3418 322.4365 499.4346 c
-322.5293 499.5264 322.5762 499.6221 322.5762 499.7207 C
-322.5762 501.5332 L
-322.5762 501.46 322.5488 501.3877 322.498 501.3174 c
-322.4707 501.2813 322.4365 501.2461 322.3965 501.2109 c
-f
-0.39 g
-320.3242 502.5879 m
-319.8711 501.6807 319.1777 501.2236 319.1445 501.2021 C
-319.127 501.1924 L
-312.1074 501.1924 L
-312.0918 501.3252 L
-312.0977 501.3271 312.8037 501.5264 313.543 502.8789 C
-310.8477 502.6885 308.9082 502.1582 308.9082 501.5332 c
-308.9082 501.4844 308.9189 501.4355 308.9434 501.3877 c
-308.9922 501.2871 309.0938 501.1895 309.2402 501.0957 c
-309.3018 501.0557 309.3691 501.0176 309.4473 500.9795 c
-309.7051 500.8525 310.0488 500.7354 310.4648 500.6309 c
-310.4668 500.6299 310.4707 500.6289 310.4727 500.6279 c
-311.0254 500.4893 311.7051 500.373 312.4707 500.2852 c
-312.4805 500.2842 312.4883 500.2842 312.498 500.2822 c
-312.875 500.2402 313.2715 500.2051 313.6865 500.1787 c
-313.7021 500.1768 313.7188 500.1758 313.7363 500.1748 c
-313.9277 500.1631 314.123 500.1523 314.3203 500.1436 c
-314.3506 500.1426 314.3789 500.1416 314.4082 500.1396 c
-314.6133 500.1318 314.8223 500.125 315.0332 500.1201 c
-315.0391 500.1201 315.0469 500.1201 315.0518 500.1201 c
-315.2793 500.1152 315.5098 500.1123 315.7422 500.1123 c
-315.9746 500.1123 316.2051 500.1152 316.4316 500.1201 c
-316.4375 500.1201 316.4453 500.1201 316.4502 500.1201 c
-316.6621 500.125 316.8701 500.1318 317.0762 500.1396 c
-317.1055 500.1416 317.1348 500.1426 317.1621 500.1436 c
-317.3613 500.1523 317.5547 500.1631 317.7461 500.1748 c
-317.7637 500.1758 317.7813 500.1768 317.7988 500.1787 c
-318.2119 500.2051 318.6094 500.2402 318.9844 500.2822 c
-318.9941 500.2842 319.0029 500.2852 319.0137 500.2861 c
-319.7793 500.373 320.457 500.4893 321.0098 500.6279 c
-321.0137 500.6289 321.0166 500.6299 321.0195 500.6309 c
-321.2969 500.7002 321.541 500.7764 321.751 500.8564 C
-321.751 500.8564 L
-321.8555 500.8955 321.9502 500.9365 322.0371 500.9795 c
-322.1875 501.0537 322.3086 501.1309 322.3965 501.2109 c
-322.4365 501.2461 322.4707 501.2813 322.498 501.3174 c
-322.5488 501.3877 322.5762 501.46 322.5762 501.5332 c
-322.5762 501.9521 321.707 502.3271 320.3242 502.5879 C
-f
-*u
-1 g
-1 D
-312.4004 501.3271 m
-312.9365 501.3271 319.0469 501.3271 319.0859 501.3271 C
-319.1699 501.3828 320.0156 501.9775 320.3906 503.0977 c
-320.4609 503.3096 320.4854 503.5479 320.4854 503.8047 c
-320.4854 504.167 320.4346 504.5674 320.3799 504.9805 c
-320.3223 505.4248 320.2598 505.8965 320.2598 506.3643 c
-320.2598 506.9424 320.3555 507.5146 320.666 508.0254 c
-321.3555 509.1582 322.0537 509.71 322.3965 509.9346 C
-321.9385 509.9346 315.7021 509.9395 Y
-315.6846 509.9326 313.9922 509.1523 313.8584 507.5801 c
-313.8477 507.458 313.8418 507.3389 313.8418 507.2207 c
-313.8418 506.7412 313.918 506.2881 313.9922 505.8467 c
-314.0664 505.4111 314.1377 504.9863 314.1377 504.5518 c
-314.1377 504.0723 314.0508 503.5801 313.7842 503.0459 c
-313.2461 501.9717 312.7129 501.5166 312.4004 501.3271 C
-f
-0 D
-318.8379 502.2686 m
-314.3281 502.2686 L
-314.3281 502.4033 L
-318.8379 502.4033 L
-318.8379 502.2686 L
-f
-1 D
-319.377 506.5088 m
-314.9355 506.5088 L
-314.9355 506.6436 L
-319.377 506.6436 L
-319.377 506.5088 L
-f
-0 D
-319.5781 504.9609 m
-319.5781 504.8262 L
-315.0693 504.8262 L
-315.0693 504.9609 L
-319.5781 504.9609 L
-f
-315.002 505.6348 m
-319.1074 505.6348 L
-319.1074 505.5 L
-315.002 505.5 L
-315.002 505.6348 L
-f
-315.0693 504.0186 m
-319.5117 504.0186 L
-319.5117 503.8838 L
-315.0693 503.8838 L
-315.0693 504.0186 L
-f
-315.7422 509.3369 m
-320.3867 509.3369 L
-320.3867 509.2012 L
-315.7422 509.2012 L
-315.7422 509.3369 L
-f
-315.2715 508.7979 m
-318.9727 508.7979 L
-318.9727 508.6631 L
-315.2715 508.6631 L
-315.2715 508.7979 L
-f
-1 D
-314.9355 508.0576 m
-319.6455 508.0576 L
-319.6455 507.9229 L
-314.9355 507.9229 L
-314.9355 508.0576 L
-f
-0 D
-314.7998 507.3174 m
-319.5117 507.3174 L
-319.5117 507.1826 L
-314.7998 507.1826 L
-314.7998 507.3174 L
-f
-314.7998 503.2119 m
-319.1758 503.2119 L
-319.1758 503.0762 L
-314.7998 503.0762 L
-314.7998 503.2119 L
-f
-*U
-*u
-0 g
-1 D
-312.0918 501.3252 m
-312.1074 501.1924 L
-319.127 501.1924 L
-319.1445 501.2021 L
-319.1777 501.2236 319.8711 501.6807 320.3242 502.5879 c
-320.3965 502.7324 320.4629 502.8877 320.5186 503.0557 c
-320.6973 503.5938 320.6094 504.2754 320.5137 504.998 c
-320.3799 506.0176 320.2441 507.0723 320.7813 507.9551 c
-321.6992 509.4648 322.6621 509.9355 322.6719 509.9404 C
-322.6426 510.0693 L
-315.6758 510.0693 L
-315.6289 510.0547 313.8652 509.2441 313.7227 507.5918 c
-313.6689 506.96 313.7656 506.3828 313.8594 505.8252 c
-314.0098 504.9297 314.1523 504.085 313.6621 503.1064 c
-313.623 503.0264 313.582 502.9521 313.543 502.8789 c
-312.8037 501.5264 312.0977 501.3271 312.0918 501.3252 C
-f
-0 D
-314.1377 504.5518 m
-314.1377 504.9863 314.0664 505.4111 313.9922 505.8467 c
-313.918 506.2881 313.8418 506.7412 313.8418 507.2207 c
-313.8418 507.3389 313.8477 507.458 313.8584 507.5801 c
-313.9922 509.1523 315.6846 509.9326 315.7021 509.9395 C
-321.9385 509.9346 322.3965 509.9346 V
-322.0537 509.71 321.3555 509.1582 320.666 508.0254 c
-320.3555 507.5146 320.2598 506.9424 320.2598 506.3643 c
-320.2598 505.8965 320.3223 505.4248 320.3799 504.9805 c
-320.4346 504.5674 320.4854 504.167 320.4854 503.8047 c
-320.4854 503.5479 320.4609 503.3096 320.3906 503.0977 c
-320.0156 501.9775 319.1699 501.3828 319.0859 501.3271 C
-319.0469 501.3271 312.9365 501.3271 312.4004 501.3271 C
-312.7129 501.5166 313.2461 501.9717 313.7842 503.0459 c
-314.0508 503.5801 314.1377 504.0723 314.1377 504.5518 c
-f
-*U
-320.3867 509.3369 m
-315.7422 509.3369 L
-315.7422 509.2012 L
-320.3867 509.2012 L
-320.3867 509.3369 L
-f
-318.9727 508.7979 m
-315.2715 508.7979 L
-315.2715 508.6631 L
-318.9727 508.6631 L
-318.9727 508.7979 L
-f
-319.6455 508.0576 m
-314.9355 508.0576 L
-314.9355 507.9229 L
-319.6455 507.9229 L
-319.6455 508.0576 L
-f
-319.5117 507.3174 m
-314.7998 507.3174 L
-314.7998 507.1826 L
-319.5117 507.1826 L
-319.5117 507.3174 L
-f
-314.9355 506.5088 m
-319.377 506.5088 L
-319.377 506.6436 L
-314.9355 506.6436 L
-314.9355 506.5088 L
-f
-319.1074 505.6348 m
-315.002 505.6348 L
-315.002 505.5 L
-319.1074 505.5 L
-319.1074 505.6348 L
-f
-315.0693 504.8262 m
-319.5781 504.8262 L
-319.5781 504.9609 L
-315.0693 504.9609 L
-315.0693 504.8262 L
-f
-319.5117 504.0186 m
-315.0693 504.0186 L
-315.0693 503.8838 L
-319.5117 503.8838 L
-319.5117 504.0186 L
-f
-319.1758 503.2119 m
-314.7998 503.2119 L
-314.7998 503.0762 L
-319.1758 503.0762 L
-319.1758 503.2119 L
-f
-314.3281 502.2686 m
-318.8379 502.2686 L
-318.8379 502.4033 L
-314.3281 502.4033 L
-314.3281 502.2686 L
-f
-U
-U
-U
-0 To
-1 0 0 1 316.5801 474.5176 0 Tp
-0 Tv
-TP
--11.5064 0 Td
-0 Tr
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
-0 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ -- XL
-0 TY
-0 TV
-23.6196 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 3.2805 3.2805 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
-0 Tc
-0 Tw
-(Spool) Tx 1 0 Tk
-(\r) Tx 1 0 Tk
-TO
-U
-U
-(Adobe Scatter Brush Tool) 1 0 61 XP
-%010203043F8000003F8000003F8000003F80000000000000000000000000
-%000000000000000000000000000000006FBE5072696E742073706F6F6C65
-%72
-/Adobe_Brushed_Path () XT
-0 To
-1 0 0 1 349.9512 322.2725 0 Tp
-0 Tv
-TP
--19.7722 0 Td
-0 Tr
-/_Helvetica 9 8.379 -2.0251 Tf
-(Fileser) Tx 1 -30 Tk
-(v) Tx 1 25 Tk
-(er) Tx 1 0 Tk
-(\r) Tx 1 0 Tk
-TO
-u
-%_0 R
-%_0 G
-%_0.65 w
-%_349.5625 307.7793 m
-%_S
-%_U
-%_0 Ap
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-349.5625 307.7793 m
-N
-u
-u
-0 O
-0.8158 g
-0 R
-0 G
-0.325 w 3.8636 M
-324.0938 314.0293 m
-375.0332 314.0293 L
-375.0332 304.875 L
-324.0938 304.875 L
-324.0938 314.0293 L
-b
-349.5645 309.4521 m
-B
-U
-u
-325.6807 304.875 m
-373.4453 304.875 L
-374.3965 304.875 375.1641 304.1045 375.1641 303.1563 c
-375.1641 302.2168 L
-375.1641 301.2676 374.3965 300.4961 373.4453 300.4961 c
-325.6807 300.4961 L
-324.7314 300.4961 323.9609 301.2676 323.9609 302.2168 c
-323.9609 303.1563 L
-323.9609 304.1045 324.7314 304.875 325.6807 304.875 c
-325.6807 304.875 L
-b
-349.5635 302.6855 m
-B
-U
-0 g
-327.0127 300.498 m
-329.9316 300.498 L
-329.4004 299.5684 L
-327.7422 299.5684 L
-327.0127 300.498 L
-b
-368.666 300.498 m
-371.584 300.498 L
-371.0527 299.5684 L
-369.3945 299.5684 L
-368.666 300.498 L
-b
-0.61 G
-0.65 w
-328.6035 314.0059 m
-328.6035 306.4453 L
-S
-329.9316 314.0059 m
-329.9316 306.4453 L
-S
-u
-0 O
-0 g
-0 G
-0.325 w
-360.5742 311.5078 m
-369.4609 311.5078 L
-369.4609 310.0488 L
-360.5742 310.0488 L
-360.5742 311.5078 L
-b
-365.0176 310.7793 m
-B
-U
-1 J
-368.6563 304.209 m
-368.9268 303.9238 369.0918 303.542 369.0918 303.1191 C
-369.0918 302.2559 L
-369.0918 301.832 368.9268 301.4492 368.6563 301.166 C
-S
-367.4277 304.209 m
-367.6953 303.9238 367.8613 303.542 367.8613 303.1191 C
-367.8613 302.2559 L
-367.8613 301.832 367.6953 301.4492 367.4277 301.166 C
-S
-366.1963 304.209 m
-366.4668 303.9238 366.6318 303.542 366.6318 303.1191 C
-366.6318 302.2559 L
-366.6318 301.832 366.4668 301.4492 366.1963 301.166 C
-S
-364.9668 304.209 m
-365.2354 303.9238 365.4023 303.542 365.4023 303.1191 C
-365.4023 302.2559 L
-365.4023 301.832 365.2354 301.4492 364.9668 301.166 C
-S
-363.7354 304.209 m
-364.0059 303.9238 364.1719 303.542 364.1719 303.1191 C
-364.1719 302.2559 L
-364.1719 301.832 364.0059 301.4492 363.7354 301.166 C
-S
-362.5059 304.209 m
-362.7754 303.9238 362.9414 303.542 362.9414 303.1191 C
-362.9414 302.2559 L
-362.9414 301.832 362.7754 301.4492 362.5059 301.166 C
-S
-361.2754 304.209 m
-361.5449 303.9238 361.7109 303.542 361.7109 303.1191 C
-361.7109 302.2559 L
-361.7109 301.832 361.5449 301.4492 361.2754 301.166 C
-S
-360.0449 304.209 m
-360.3145 303.9238 360.4805 303.542 360.4805 303.1191 C
-360.4805 302.2559 L
-360.4805 301.832 360.3145 301.4492 360.0449 301.166 C
-S
-358.8154 304.209 m
-359.085 303.9238 359.251 303.542 359.251 303.1191 C
-359.251 302.2559 L
-359.251 301.832 359.085 301.4492 358.8154 301.166 C
-S
-357.5859 304.209 m
-357.8535 303.9238 358.0205 303.542 358.0205 303.1191 C
-358.0205 302.2559 L
-358.0205 301.832 357.8535 301.4492 357.5859 301.166 C
-S
-356.3555 304.209 m
-356.625 303.9238 356.79 303.542 356.79 303.1191 C
-356.79 302.2559 L
-356.79 301.832 356.625 301.4492 356.3555 301.166 C
-S
-355.125 304.209 m
-355.3945 303.9238 355.5605 303.542 355.5605 303.1191 C
-355.5605 302.2559 L
-355.5605 301.832 355.3945 301.4492 355.125 301.166 C
-S
-353.8965 304.209 m
-354.166 303.9238 354.3301 303.542 354.3301 303.1191 C
-354.3301 302.2559 L
-354.3301 301.832 354.166 301.4492 353.8965 301.166 C
-S
-352.6641 304.209 m
-352.9355 303.9238 353.0996 303.542 353.0996 303.1191 C
-353.0996 302.2559 L
-353.0996 301.832 352.9355 301.4492 352.6641 301.166 C
-S
-351.4336 304.209 m
-351.7041 303.9238 351.8701 303.542 351.8701 303.1191 C
-351.8701 302.2559 L
-351.8701 301.832 351.7041 301.4492 351.4336 301.166 C
-S
-0 O
-0.4385 g
-0 J 1 j
-329.9316 315.9893 m
-368.9316 315.9893 L
-375.0332 314.0293 L
-324.0938 314.0293 L
-329.9316 315.9893 L
-b
-U
-U
-(Adobe Scatter Brush Tool) 1 0 59 XP
-%010203043F8000003F8000003F8000003F80000000000000000000000000
-%0000000000000000000000000000000041C646696C6520536572766572
-/Adobe_Brushed_Path () XT
-u
-%_0 g
-%_0 j 1 w 4 M
-%_336.6777 297.1758 m
-%_B
-%_U
-%_0 Ap
-0 A
-u
-0 O
-0 g
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-336.6777 297.1758 m
-F
-u
-*u
-0 R
-1 G
-342.6738 307.1777 m
-342.6738 305.3652 L
-342.6738 305.2666 342.626 305.1709 342.5332 305.0791 c
-342.4434 304.9863 342.3086 304.8975 342.1357 304.8115 c
-341.9629 304.7275 341.752 304.6455 341.5059 304.5703 c
-341.2617 304.4951 340.9805 304.4248 340.6719 304.3604 c
-340.3857 304.3008 340.0732 304.2471 339.7422 304.1992 C
-339.7422 304.0781 L
-339.8223 304.0781 L
-339.8223 304.0127 339.793 303.9512 339.7422 303.8926 C
-339.7422 303.668 L
-339.8223 303.668 L
-339.8223 303.6035 339.793 303.542 339.7422 303.4834 C
-339.7422 303.2588 L
-339.8223 303.2588 L
-339.8223 303.1934 339.793 303.1318 339.7422 303.0732 C
-339.7422 302.8486 L
-339.8223 302.8486 L
-339.8223 302.7842 339.793 302.7217 339.7422 302.6641 C
-339.7422 302.4395 L
-339.8223 302.4395 L
-339.8223 302.374 339.793 302.3135 339.7422 302.2549 C
-339.7422 302.0303 L
-339.8223 302.0303 L
-339.8223 301.9648 339.793 301.9033 339.7422 301.8447 C
-339.7422 301.6211 L
-339.8223 301.6211 L
-339.8223 301.5557 339.793 301.4941 339.7422 301.4355 C
-339.7422 301.2109 L
-339.8223 301.2109 L
-339.8223 301.1455 339.793 301.084 339.7422 301.0254 C
-339.7422 300.8018 L
-339.8223 300.8018 L
-339.8223 300.7363 339.793 300.6748 339.7422 300.6162 C
-339.7422 300.3926 L
-339.8223 300.3926 L
-339.8223 300.3271 339.793 300.2656 339.7422 300.207 C
-339.7422 299.9824 L
-339.8223 299.9824 L
-339.8223 299.917 339.793 299.8555 339.7422 299.7979 C
-339.7422 299.5732 L
-339.8223 299.5732 L
-339.8223 299.5078 339.793 299.4463 339.7422 299.3877 C
-339.7422 299.1631 L
-339.8223 299.1631 L
-339.8223 299.0986 339.793 299.0361 339.7422 298.9785 C
-339.7422 298.7539 L
-339.8223 298.7539 L
-339.8223 298.6885 339.793 298.627 339.7422 298.5693 C
-339.7422 298.3447 L
-339.8223 298.3447 L
-339.8223 298.2793 339.793 298.2178 339.7422 298.1592 C
-339.7422 297.9346 L
-339.8223 297.9346 L
-339.8223 297.8701 339.793 297.8076 339.7422 297.75 C
-339.7422 297.5254 L
-339.8223 297.5254 L
-339.8223 297.46 339.793 297.3984 339.7422 297.3398 C
-339.7422 297.1162 L
-339.8223 297.1162 L
-339.8223 297.0508 339.793 296.9893 339.7422 296.9307 C
-339.7422 296.7061 L
-339.8223 296.7061 L
-339.8223 296.6416 339.793 296.5791 339.7422 296.5205 C
-339.7422 296.2969 L
-339.8223 296.2969 L
-339.8223 296.2314 339.793 296.1699 339.7422 296.1113 C
-339.7422 295.8877 L
-339.8223 295.8877 L
-339.8223 295.8223 339.793 295.7607 339.7422 295.7021 C
-339.7422 295.4775 L
-339.8223 295.4775 L
-339.8223 295.4121 339.793 295.3506 339.7422 295.292 C
-339.7422 295.0684 L
-339.8223 295.0684 L
-339.8223 295.0029 339.793 294.9414 339.7422 294.8828 C
-339.7422 294.6592 L
-339.8223 294.6592 L
-339.8223 294.6094 339.8018 294.5625 339.7715 294.5166 C
-341.5273 294.2588 342.6738 293.835 342.6738 293.3545 c
-342.6738 293.2988 342.6533 293.2432 342.623 293.1885 c
-342.6533 293.2432 342.6738 293.2988 342.6738 293.3545 C
-342.6738 291.542 L
-342.6738 291.4434 342.626 291.3477 342.5332 291.2549 c
-342.4434 291.1631 342.3086 291.0732 342.1357 290.9883 c
-341.9629 290.9033 341.752 290.8232 341.5059 290.7471 c
-341.2617 290.6719 340.9805 290.6016 340.6719 290.5371 c
-340.3613 290.4727 340.0244 290.4141 339.6602 290.3633 c
-339.2969 290.3115 338.9082 290.2686 338.498 290.2324 c
-338.0908 290.1963 337.6611 290.168 337.2148 290.1494 c
-336.7715 290.1309 336.3105 290.1211 335.8389 290.1211 c
-335.3672 290.1211 334.9063 290.1309 334.4619 290.1494 c
-334.0156 290.168 333.5879 290.1963 333.1787 290.2324 c
-332.7695 290.2686 332.3818 290.3115 332.0176 290.3633 c
-331.6543 290.4141 331.3154 290.4727 331.0068 290.5371 c
-330.6973 290.6016 330.418 290.6719 330.1719 290.7471 c
-329.9258 290.8232 329.7148 290.9033 329.542 290.9883 c
-329.3682 291.0732 329.2344 291.1631 329.1436 291.2549 c
-329.0527 291.3477 329.0049 291.4434 329.0049 291.542 C
-329.0049 293.3545 L
-329.0049 293.835 330.1514 294.2588 331.9063 294.5166 C
-331.877 294.5625 331.8564 294.6094 331.8564 294.6592 C
-331.9355 294.6592 L
-331.9355 294.8828 L
-331.8857 294.9414 331.8564 295.0029 331.8564 295.0684 C
-331.9355 295.0684 L
-331.9355 295.292 L
-331.8857 295.3506 331.8564 295.4121 331.8564 295.4775 C
-331.9355 295.4775 L
-331.9355 295.7021 L
-331.8857 295.7607 331.8564 295.8223 331.8564 295.8877 C
-331.9355 295.8877 L
-331.9355 296.1113 L
-331.8857 296.1699 331.8564 296.2314 331.8564 296.2969 C
-331.9355 296.2969 L
-331.9355 296.5205 L
-331.8857 296.5791 331.8564 296.6416 331.8564 296.7061 C
-331.9355 296.7061 L
-331.9355 296.9307 L
-331.8857 296.9893 331.8564 297.0508 331.8564 297.1162 C
-331.9355 297.1162 L
-331.9355 297.3398 L
-331.8857 297.3984 331.8564 297.46 331.8564 297.5254 C
-331.9355 297.5254 L
-331.9355 297.75 L
-331.8857 297.8076 331.8564 297.8701 331.8564 297.9346 C
-331.9355 297.9346 L
-331.9355 298.1592 L
-331.8857 298.2178 331.8564 298.2793 331.8564 298.3447 C
-331.9355 298.3447 L
-331.9355 298.5693 L
-331.8857 298.627 331.8564 298.6885 331.8564 298.7539 C
-331.9355 298.7539 L
-331.9355 298.9785 L
-331.8857 299.0361 331.8564 299.0986 331.8564 299.1631 C
-331.9355 299.1631 L
-331.9355 299.3877 L
-331.8857 299.4463 331.8564 299.5078 331.8564 299.5732 C
-331.9355 299.5732 L
-331.9355 299.7979 L
-331.8857 299.8555 331.8564 299.917 331.8564 299.9824 C
-331.9355 299.9824 L
-331.9355 300.207 L
-331.8857 300.2656 331.8564 300.3271 331.8564 300.3926 C
-331.9355 300.3926 L
-331.9355 300.6162 L
-331.8857 300.6748 331.8564 300.7363 331.8564 300.8018 C
-331.9355 300.8018 L
-331.9355 301.0254 L
-331.8857 301.084 331.8564 301.1455 331.8564 301.2109 C
-331.9355 301.2109 L
-331.9355 301.4355 L
-331.8857 301.4941 331.8564 301.5557 331.8564 301.6211 C
-331.9355 301.6211 L
-331.9355 301.8447 L
-331.8857 301.9033 331.8564 301.9648 331.8564 302.0303 C
-331.9355 302.0303 L
-331.9355 302.2549 L
-331.8857 302.3135 331.8564 302.374 331.8564 302.4395 C
-331.9355 302.4395 L
-331.9355 302.6641 L
-331.8857 302.7217 331.8564 302.7842 331.8564 302.8486 C
-331.9355 302.8486 L
-331.9355 303.0732 L
-331.8857 303.1318 331.8564 303.1934 331.8564 303.2588 C
-331.9355 303.2588 L
-331.9355 303.4834 L
-331.8857 303.542 331.8564 303.6035 331.8564 303.668 C
-331.9355 303.668 L
-331.9355 303.8926 L
-331.8857 303.9512 331.8564 304.0127 331.8564 304.0781 C
-331.9355 304.0781 L
-331.9355 304.1992 L
-331.6045 304.2471 331.293 304.3008 331.0068 304.3604 c
-330.6973 304.4248 330.418 304.4951 330.1719 304.5703 c
-329.9258 304.6455 329.7148 304.7275 329.542 304.8115 c
-329.3682 304.8975 329.2344 304.9863 329.1436 305.0791 c
-329.0527 305.1709 329.0049 305.2666 329.0049 305.3652 C
-329.0049 307.1777 L
-329.0049 307.8027 330.9443 308.333 333.6396 308.5234 C
-333.6797 308.5967 333.7197 308.6709 333.7598 308.751 c
-334.249 309.7295 334.1074 310.5742 333.957 311.4697 c
-333.8633 312.0273 333.7656 312.6045 333.8203 313.2363 c
-333.9619 314.8887 335.7266 315.6992 335.7725 315.7139 C
-342.7402 315.7139 L
-342.7686 315.585 L
-342.7588 315.5801 341.7969 315.1094 340.8779 313.5996 c
-340.3418 312.7168 340.4766 311.6621 340.6113 310.6426 c
-340.7061 309.9199 340.7939 309.2383 340.6152 308.7002 c
-340.5596 308.5322 340.4932 308.377 340.4209 308.2324 C
-341.8037 307.9717 342.6738 307.5967 342.6738 307.1777 C
-s
-1 D
-329.5439 306.624 m
-329.4668 306.6621 329.3984 306.7002 329.3369 306.7402 c
-329.3965 306.7012 329.4658 306.6621 329.542 306.625 C
-329.542 306.624 329.5439 306.624 Y
-s
-0 D
-331.0078 292.3496 m
-331.0068 292.3496 331.0068 292.3506 331.0049 292.3506 c
-331.0059 292.3506 331.0068 292.3506 331.0068 292.3496 C
-331.0068 292.3496 331.0078 292.3496 v
-s
-334.4824 291.9619 m
-334.4668 291.9619 334.4551 291.9629 334.4414 291.9639 C
-334.4482 291.9639 334.4551 291.9629 334.4619 291.9619 C
-334.4668 291.9619 334.4756 291.9619 334.4824 291.9619 c
-s
-337.2373 291.9639 m
-337.2236 291.9629 337.209 291.9619 337.1963 291.9619 c
-337.2021 291.9619 337.21 291.9619 337.2148 291.9619 C
-337.2236 291.9629 337.2285 291.9639 337.2373 291.9639 C
-s
-342.458 292.999 m
-342.4863 293.0225 342.5117 293.0449 342.5332 293.0684 c
-342.5566 293.0908 342.5684 293.1152 342.585 293.1377 c
-342.5508 293.0908 342.5137 293.0449 342.458 292.999 c
-s
-342.4941 306.8555 m
-342.4053 306.7754 342.2852 306.6982 342.1338 306.624 C
-342.1348 306.624 342.1357 306.624 342.1357 306.625 C
-342.2861 306.6982 342.4053 306.7764 342.4941 306.8555 c
-s
-*U
-u
-0 O
-0 g
-335.8867 302.917 m
-F
-u
-u
-0.67 g
-342.458 292.999 m
-342.374 292.9316 342.2656 292.8652 342.1357 292.8018 C
-342.1357 292.8018 L
-342.1357 292.8018 L
-341.5322 292.5049 340.457 292.2588 339.1035 292.1064 c
-339.0986 292.1055 339.0938 292.1045 339.0898 292.1045 c
-338.9023 292.083 338.7109 292.0645 338.5146 292.0469 c
-338.5098 292.0459 338.5049 292.0459 338.498 292.0459 c
-338.4932 292.0449 338.4883 292.0439 338.4824 292.0439 c
-338.2861 292.0264 338.0859 292.0117 337.8799 291.998 c
-337.874 291.998 337.8682 291.9971 337.8633 291.9971 c
-337.6572 291.9834 337.4482 291.9727 337.2373 291.9639 c
-337.2285 291.9639 337.2236 291.9629 337.2148 291.9619 c
-337.21 291.9619 337.2021 291.9619 337.1963 291.9619 c
-336.7578 291.9434 336.3037 291.9336 335.8389 291.9336 c
-335.374 291.9336 334.9209 291.9434 334.4824 291.9619 c
-334.4756 291.9619 334.4668 291.9619 334.4619 291.9619 c
-334.4551 291.9629 334.4482 291.9639 334.4414 291.9639 c
-334.2285 291.9727 334.0195 291.9844 333.8154 291.9971 c
-333.8105 291.9971 333.8047 291.998 333.7988 291.998 c
-333.5938 292.0117 333.3906 292.0264 333.1934 292.0439 c
-333.1885 292.0439 333.1836 292.0449 333.1787 292.0459 c
-333.1748 292.0459 333.1699 292.0459 333.165 292.0469 c
-332.9668 292.0635 332.7754 292.083 332.5879 292.1045 c
-332.584 292.1045 332.5801 292.1055 332.5762 292.1064 c
-331.998 292.1709 331.4697 292.2539 331.0078 292.3496 c
-331.0068 292.3496 331.0068 292.3496 y
-331.0068 292.3506 331.0059 292.3506 331.0049 292.3506 c
-330.3877 292.4785 329.8877 292.6318 329.542 292.8018 C
-329.542 292.8018 L
-329.542 292.8018 L
-329.3438 292.8984 329.1973 293.001 329.1094 293.1084 c
-329.042 293.1885 329.0049 293.2705 329.0049 293.3545 C
-329.0049 291.542 L
-329.0049 291.4434 329.0527 291.3477 329.1436 291.2549 c
-329.2344 291.1631 329.3682 291.0732 329.542 290.9883 c
-329.7148 290.9033 329.9258 290.8232 330.1719 290.7471 c
-330.418 290.6719 330.6973 290.6016 331.0068 290.5371 c
-331.3154 290.4727 331.6543 290.4141 332.0176 290.3633 c
-332.3818 290.3115 332.7695 290.2686 333.1787 290.2324 c
-333.5879 290.1963 334.0156 290.168 334.4619 290.1494 c
-334.9063 290.1309 335.3672 290.1211 335.8389 290.1211 c
-336.3105 290.1211 336.7715 290.1309 337.2148 290.1494 c
-337.6611 290.168 338.0908 290.1963 338.498 290.2324 c
-338.9082 290.2686 339.2969 290.3115 339.6602 290.3633 c
-340.0244 290.4141 340.3613 290.4727 340.6719 290.5371 c
-340.9805 290.6016 341.2617 290.6719 341.5059 290.7471 c
-341.752 290.8232 341.9629 290.9033 342.1357 290.9883 c
-342.3086 291.0732 342.4434 291.1631 342.5332 291.2549 c
-342.626 291.3477 342.6738 291.4434 342.6738 291.542 C
-342.6738 293.3545 L
-342.6738 293.2568 342.626 293.1611 342.5332 293.0684 c
-342.5117 293.0449 342.4863 293.0225 342.458 292.999 c
-f
-0.39 g
-339.7422 294.249 m
-339.8223 294.249 L
-339.8223 294.1846 339.793 294.1221 339.7422 294.0645 C
-339.7422 293.7197 L
-339.7422 293.6631 339.7148 293.6084 339.6621 293.5557 c
-339.6113 293.5029 339.5332 293.4521 339.4355 293.4033 c
-339.3359 293.3545 339.2148 293.3086 339.0762 293.2656 c
-338.9355 293.2227 338.7754 293.1826 338.5986 293.1455 c
-338.4229 293.1094 338.2285 293.0752 338.0215 293.0459 c
-337.8125 293.0176 337.5918 292.9922 337.3594 292.9717 c
-337.125 292.9512 336.8799 292.9346 336.626 292.9248 c
-336.373 292.9141 336.1084 292.9082 335.8389 292.9082 c
-335.5693 292.9082 335.3066 292.9141 335.0527 292.9248 c
-334.7988 292.9346 334.5537 292.9512 334.3203 292.9717 c
-334.0869 292.9922 333.8643 293.0176 333.6572 293.0459 c
-333.4492 293.0752 333.2559 293.1094 333.0781 293.1455 c
-332.9033 293.1826 332.7422 293.2227 332.6025 293.2656 c
-332.4619 293.3086 332.3418 293.3545 332.2441 293.4033 c
-332.1436 293.4521 332.0674 293.5029 332.0146 293.5557 c
-331.9629 293.6084 331.9355 293.6631 331.9355 293.7197 C
-331.9355 294.0645 L
-331.8857 294.1221 331.8564 294.1846 331.8564 294.249 C
-331.9355 294.249 L
-331.9355 294.4736 L
-331.9238 294.4873 331.9141 294.502 331.9063 294.5166 C
-330.1514 294.2588 329.0049 293.835 329.0049 293.3545 c
-329.0049 293.2705 329.042 293.1885 329.1094 293.1084 c
-329.1973 293.001 329.3438 292.8984 329.542 292.8018 C
-329.542 292.8018 L
-329.8877 292.6318 330.3877 292.4785 331.0049 292.3506 c
-331.0068 292.3506 331.0068 292.3496 331.0078 292.3496 c
-331.4697 292.2539 331.998 292.1709 332.5762 292.1064 c
-332.5801 292.1055 332.584 292.1045 332.5879 292.1045 c
-332.7754 292.083 332.9668 292.0635 333.165 292.0469 c
-333.1748 292.0459 333.1836 292.0449 333.1934 292.0439 c
-333.3906 292.0264 333.5938 292.0117 333.7988 291.998 c
-333.8047 291.998 333.8105 291.9971 333.8154 291.9971 c
-334.0195 291.9844 334.2285 291.9727 334.4414 291.9639 c
-334.4551 291.9629 334.4668 291.9619 334.4824 291.9619 c
-334.9209 291.9434 335.374 291.9336 335.8389 291.9336 c
-336.3037 291.9336 336.7578 291.9434 337.1963 291.9619 c
-337.209 291.9619 337.2236 291.9629 337.2373 291.9639 c
-337.4482 291.9727 337.6572 291.9834 337.8633 291.9971 c
-337.8682 291.9971 337.874 291.998 337.8799 291.998 c
-338.0859 292.0117 338.2861 292.0264 338.4824 292.0439 c
-338.4932 292.0449 338.5039 292.0459 338.5146 292.0469 c
-338.7109 292.0645 338.9023 292.083 339.0898 292.1045 c
-339.0938 292.1045 339.0986 292.1055 339.1035 292.1064 c
-340.457 292.2588 341.5322 292.5049 342.1357 292.8018 C
-342.1357 292.8018 L
-342.2656 292.8652 342.374 292.9316 342.458 292.999 c
-342.5986 293.1133 342.6738 293.2324 342.6738 293.3545 c
-342.6738 293.835 341.5273 294.2588 339.7715 294.5166 C
-339.7627 294.502 339.7539 294.4873 339.7422 294.4736 C
-339.7422 294.249 L
-f
-0.55 g
-335.8389 298.2822 m
-334.1289 298.2822 332.3262 298.5244 331.9355 298.9785 C
-331.9355 298.7539 L
-331.9922 298.7539 L
-331.9922 298.4014 333.5713 298.0078 335.8389 298.0078 c
-338.1074 298.0078 339.6865 298.4014 339.6865 298.7539 C
-339.7422 298.7539 L
-339.7422 298.9785 L
-339.3525 298.5244 337.5498 298.2822 335.8389 298.2822 c
-f
-335.8389 301.1484 m
-334.1289 301.1484 332.3262 301.3916 331.9355 301.8447 C
-331.9355 301.6211 L
-331.9922 301.6211 L
-331.9922 301.2676 333.5713 300.874 335.8389 300.874 c
-338.1074 300.874 339.6865 301.2676 339.6865 301.6211 C
-339.7422 301.6211 L
-339.7422 301.8447 L
-339.3525 301.3916 337.5498 301.1484 335.8389 301.1484 c
-f
-335.8389 297.8721 m
-334.1289 297.8721 332.3262 298.1152 331.9355 298.5693 C
-331.9355 298.3447 L
-331.9922 298.3447 L
-331.9922 297.9912 333.5713 297.5977 335.8389 297.5977 c
-338.1074 297.5977 339.6865 297.9912 339.6865 298.3447 C
-339.7422 298.3447 L
-339.7422 298.5693 L
-339.3525 298.1152 337.5498 297.8721 335.8389 297.8721 c
-f
-335.8389 297.4629 m
-334.1289 297.4629 332.3262 297.7061 331.9355 298.1592 C
-331.9355 297.9346 L
-331.9922 297.9346 L
-331.9922 297.582 333.5713 297.1885 335.8389 297.1885 c
-338.1074 297.1885 339.6865 297.582 339.6865 297.9346 C
-339.7422 297.9346 L
-339.7422 298.1592 L
-339.3525 297.7061 337.5498 297.4629 335.8389 297.4629 c
-f
-335.8389 300.7393 m
-334.1289 300.7393 332.3262 300.9814 331.9355 301.4355 C
-331.9355 301.2109 L
-331.9922 301.2109 L
-331.9922 300.8584 333.5713 300.4648 335.8389 300.4648 c
-338.1074 300.4648 339.6865 300.8584 339.6865 301.2109 C
-339.7422 301.2109 L
-339.7422 301.4355 L
-339.3525 300.9814 337.5498 300.7393 335.8389 300.7393 c
-f
-335.8389 299.5107 m
-334.1289 299.5107 332.3262 299.7539 331.9355 300.207 C
-331.9355 299.9824 L
-331.9922 299.9824 L
-331.9922 299.6299 333.5713 299.2354 335.8389 299.2354 c
-338.1074 299.2354 339.6865 299.6299 339.6865 299.9824 C
-339.7422 299.9824 L
-339.7422 300.207 L
-339.3525 299.7539 337.5498 299.5107 335.8389 299.5107 c
-f
-335.8389 298.6914 m
-334.1289 298.6914 332.3262 298.9346 331.9355 299.3877 C
-331.9355 299.1631 L
-331.9922 299.1631 L
-331.9922 298.8105 333.5713 298.417 335.8389 298.417 c
-338.1074 298.417 339.6865 298.8105 339.6865 299.1631 C
-339.7422 299.1631 L
-339.7422 299.3877 L
-339.3525 298.9346 337.5498 298.6914 335.8389 298.6914 c
-f
-335.8389 299.9199 m
-334.1289 299.9199 332.3262 300.1631 331.9355 300.6162 C
-331.9355 300.3926 L
-331.9922 300.3926 L
-331.9922 300.0391 333.5713 299.6455 335.8389 299.6455 c
-338.1074 299.6455 339.6865 300.0391 339.6865 300.3926 C
-339.7422 300.3926 L
-339.7422 300.6162 L
-339.3525 300.1631 337.5498 299.9199 335.8389 299.9199 c
-f
-335.8389 302.7861 m
-334.1289 302.7861 332.3262 303.0293 331.9355 303.4834 C
-331.9355 303.2588 L
-331.9922 303.2588 L
-331.9922 302.9063 333.5713 302.5127 335.8389 302.5127 c
-338.1074 302.5127 339.6865 302.9063 339.6865 303.2588 C
-339.7422 303.2588 L
-339.7422 303.4834 L
-339.3525 303.0293 337.5498 302.7861 335.8389 302.7861 c
-f
-335.8389 301.9678 m
-334.1289 301.9678 332.3262 302.21 331.9355 302.6641 C
-331.9355 302.4395 L
-331.9922 302.4395 L
-331.9922 302.0869 333.5713 301.6934 335.8389 301.6934 c
-338.1074 301.6934 339.6865 302.0869 339.6865 302.4395 C
-339.7422 302.4395 L
-339.7422 302.6641 L
-339.3525 302.21 337.5498 301.9678 335.8389 301.9678 c
-f
-335.8389 299.1006 m
-334.1289 299.1006 332.3262 299.3438 331.9355 299.7979 C
-331.9355 299.5732 L
-331.9922 299.5732 L
-331.9922 299.2197 333.5713 298.8271 335.8389 298.8271 c
-338.1074 298.8271 339.6865 299.2197 339.6865 299.5732 C
-339.7422 299.5732 L
-339.7422 299.7979 L
-339.3525 299.3438 337.5498 299.1006 335.8389 299.1006 c
-f
-335.8389 300.3291 m
-334.1289 300.3291 332.3262 300.5723 331.9355 301.0254 C
-331.9355 300.8018 L
-331.9922 300.8018 L
-331.9922 300.4482 333.5713 300.0557 335.8389 300.0557 c
-338.1074 300.0557 339.6865 300.4482 339.6865 300.8018 C
-339.7422 300.8018 L
-339.7422 301.0254 L
-339.3525 300.5723 337.5498 300.3291 335.8389 300.3291 c
-f
-335.8389 302.3779 m
-334.1289 302.3779 332.3262 302.6201 331.9355 303.0732 C
-331.9355 302.8486 L
-331.9922 302.8486 L
-331.9922 302.4961 333.5713 302.1025 335.8389 302.1025 c
-338.1074 302.1025 339.6865 302.4961 339.6865 302.8486 C
-339.7422 302.8486 L
-339.7422 303.0732 L
-339.3525 302.6201 337.5498 302.3779 335.8389 302.3779 c
-f
-335.8389 301.5586 m
-334.1289 301.5586 332.3262 301.8018 331.9355 302.2549 C
-331.9355 302.0303 L
-331.9922 302.0303 L
-331.9922 301.6768 333.5713 301.2832 335.8389 301.2832 c
-338.1074 301.2832 339.6865 301.6768 339.6865 302.0303 C
-339.7422 302.0303 L
-339.7422 302.2549 L
-339.3525 301.8018 337.5498 301.5586 335.8389 301.5586 c
-f
-335.8389 295.415 m
-334.1289 295.415 332.3262 295.6582 331.9355 296.1113 C
-331.9355 295.8877 L
-331.9922 295.8877 L
-331.9922 295.5342 333.5713 295.1406 335.8389 295.1406 c
-338.1074 295.1406 339.6865 295.5342 339.6865 295.8877 C
-339.7422 295.8877 L
-339.7422 296.1113 L
-339.3525 295.6582 337.5498 295.415 335.8389 295.415 c
-f
-335.8389 294.1865 m
-334.1289 294.1865 332.3262 294.4297 331.9355 294.8828 C
-331.9355 294.6592 L
-331.9922 294.6592 L
-331.9922 294.3057 333.5713 293.9121 335.8389 293.9121 c
-338.1074 293.9121 339.6865 294.3057 339.6865 294.6592 C
-339.7422 294.6592 L
-339.7422 294.8828 L
-339.3525 294.4297 337.5498 294.1865 335.8389 294.1865 c
-f
-335.8389 294.5967 m
-334.1289 294.5967 332.3262 294.8389 331.9355 295.292 C
-331.9355 295.0684 L
-331.9922 295.0684 L
-331.9922 294.7148 333.5713 294.3213 335.8389 294.3213 c
-338.1074 294.3213 339.6865 294.7148 339.6865 295.0684 C
-339.7422 295.0684 L
-339.7422 295.292 L
-339.3525 294.8389 337.5498 294.5967 335.8389 294.5967 c
-f
-335.8389 297.0537 m
-334.1289 297.0537 332.3262 297.2959 331.9355 297.75 C
-331.9355 297.5254 L
-331.9922 297.5254 L
-331.9922 297.1729 333.5713 296.7783 335.8389 296.7783 c
-338.1074 296.7783 339.6865 297.1729 339.6865 297.5254 C
-339.7422 297.5254 L
-339.7422 297.75 L
-339.3525 297.2959 337.5498 297.0537 335.8389 297.0537 c
-f
-335.8389 295.8252 m
-334.1289 295.8252 332.3262 296.0674 331.9355 296.5205 C
-331.9355 296.2969 L
-331.9922 296.2969 L
-331.9922 295.9443 333.5713 295.5498 335.8389 295.5498 c
-338.1074 295.5498 339.6865 295.9443 339.6865 296.2969 C
-339.7422 296.2969 L
-339.7422 296.5205 L
-339.3525 296.0674 337.5498 295.8252 335.8389 295.8252 c
-f
-335.8389 296.2344 m
-334.1289 296.2344 332.3262 296.4775 331.9355 296.9307 C
-331.9355 296.7061 L
-331.9922 296.7061 L
-331.9922 296.3535 333.5713 295.96 335.8389 295.96 c
-338.1074 295.96 339.6865 296.3535 339.6865 296.7061 C
-339.7422 296.7061 L
-339.7422 296.9307 L
-339.3525 296.4775 337.5498 296.2344 335.8389 296.2344 c
-f
-335.8389 296.6436 m
-334.1289 296.6436 332.3262 296.8867 331.9355 297.3398 C
-331.9355 297.1162 L
-331.9922 297.1162 L
-331.9922 296.7627 333.5713 296.3691 335.8389 296.3691 c
-338.1074 296.3691 339.6865 296.7627 339.6865 297.1162 C
-339.7422 297.1162 L
-339.7422 297.3398 L
-339.3525 296.8867 337.5498 296.6436 335.8389 296.6436 c
-f
-335.8389 295.0059 m
-334.1289 295.0059 332.3262 295.249 331.9355 295.7021 C
-331.9355 295.4775 L
-331.9922 295.4775 L
-331.9922 295.125 333.5713 294.7314 335.8389 294.7314 c
-338.1074 294.7314 339.6865 295.125 339.6865 295.4775 C
-339.7422 295.4775 L
-339.7422 295.7021 L
-339.3525 295.249 337.5498 295.0059 335.8389 295.0059 c
-f
-338.498 304.0557 m
-338.0908 304.0195 337.6611 303.9912 337.2148 303.9727 c
-336.7715 303.9541 336.3105 303.9443 335.8389 303.9443 c
-335.3672 303.9443 334.9063 303.9541 334.4619 303.9727 c
-334.0156 303.9912 333.5879 304.0195 333.1787 304.0557 c
-332.7695 304.0918 332.3818 304.1357 332.0176 304.1865 c
-331.9893 304.1904 331.9629 304.1953 331.9355 304.1992 C
-331.9355 304.0781 L
-331.9922 304.0781 L
-331.9922 303.7256 333.5713 303.3311 335.8389 303.3311 c
-338.1074 303.3311 339.6865 303.7256 339.6865 304.0781 C
-339.7422 304.0781 L
-339.7422 304.1992 L
-339.7139 304.1953 339.6885 304.1904 339.6602 304.1865 c
-339.2969 304.1357 338.9082 304.0918 338.498 304.0557 c
-f
-335.8389 303.1963 m
-334.1289 303.1963 332.3262 303.4395 331.9355 303.8926 C
-331.9355 303.668 L
-331.9922 303.668 L
-331.9922 303.3154 333.5713 302.9219 335.8389 302.9219 c
-338.1074 302.9219 339.6865 303.3154 339.6865 303.668 C
-339.7422 303.668 L
-339.7422 303.8926 L
-339.3525 303.4395 337.5498 303.1963 335.8389 303.1963 c
-f
-335.8389 293.3682 m
-334.1289 293.3682 332.3262 293.6104 331.9355 294.0645 C
-331.9355 293.7197 L
-331.9355 293.6631 331.9629 293.6084 332.0146 293.5557 c
-332.0674 293.5029 332.1436 293.4521 332.2441 293.4033 c
-332.3418 293.3545 332.4619 293.3086 332.6025 293.2656 c
-332.7422 293.2227 332.9033 293.1826 333.0781 293.1455 c
-333.2559 293.1094 333.4492 293.0752 333.6572 293.0459 c
-333.8643 293.0176 334.0869 292.9922 334.3203 292.9717 c
-334.5537 292.9512 334.7988 292.9346 335.0527 292.9248 c
-335.3066 292.9141 335.5693 292.9082 335.8389 292.9082 c
-336.1084 292.9082 336.373 292.9141 336.626 292.9248 c
-336.8799 292.9346 337.125 292.9512 337.3594 292.9717 c
-337.5918 292.9922 337.8125 293.0176 338.0215 293.0459 c
-338.2285 293.0752 338.4229 293.1094 338.5986 293.1455 c
-338.7754 293.1826 338.9355 293.2227 339.0762 293.2656 c
-339.2148 293.3086 339.3359 293.3545 339.4355 293.4033 c
-339.5332 293.4521 339.6113 293.5029 339.6621 293.5557 c
-339.7148 293.6084 339.7422 293.6631 339.7422 293.7197 C
-339.7422 294.0645 L
-339.3525 293.6104 337.5498 293.3682 335.8389 293.3682 c
-f
-331.9922 294.249 m
-331.9922 293.8965 333.5713 293.5029 335.8389 293.5029 c
-338.1074 293.5029 339.6865 293.8965 339.6865 294.249 C
-339.7422 294.249 L
-339.7422 294.4736 L
-339.3525 294.0205 337.5498 293.7773 335.8389 293.7773 c
-334.1289 293.7773 332.3262 294.0205 331.9355 294.4736 C
-331.9355 294.249 L
-331.9922 294.249 L
-f
-0.15 g
-335.8389 303.3311 m
-333.5713 303.3311 331.9922 303.7256 331.9922 304.0781 C
-331.9355 304.0781 L
-331.8564 304.0781 L
-331.8564 304.0127 331.8857 303.9512 331.9355 303.8926 c
-332.3262 303.4395 334.1289 303.1963 335.8389 303.1963 c
-337.5498 303.1963 339.3525 303.4395 339.7422 303.8926 c
-339.793 303.9512 339.8223 304.0127 339.8223 304.0781 C
-339.7422 304.0781 L
-339.6865 304.0781 L
-339.6865 303.7256 338.1074 303.3311 335.8389 303.3311 c
-f
-335.8389 302.9219 m
-333.5713 302.9219 331.9922 303.3154 331.9922 303.668 C
-331.9355 303.668 L
-331.8564 303.668 L
-331.8564 303.6035 331.8857 303.542 331.9355 303.4834 c
-332.3262 303.0293 334.1289 302.7861 335.8389 302.7861 c
-337.5498 302.7861 339.3525 303.0293 339.7422 303.4834 c
-339.793 303.542 339.8223 303.6035 339.8223 303.668 C
-339.7422 303.668 L
-339.6865 303.668 L
-339.6865 303.3154 338.1074 302.9219 335.8389 302.9219 c
-f
-335.8389 302.5127 m
-333.5713 302.5127 331.9922 302.9063 331.9922 303.2588 C
-331.9355 303.2588 L
-331.8564 303.2588 L
-331.8564 303.1934 331.8857 303.1318 331.9355 303.0732 c
-332.3262 302.6201 334.1289 302.3779 335.8389 302.3779 c
-337.5498 302.3779 339.3525 302.6201 339.7422 303.0732 c
-339.793 303.1318 339.8223 303.1934 339.8223 303.2588 C
-339.7422 303.2588 L
-339.6865 303.2588 L
-339.6865 302.9063 338.1074 302.5127 335.8389 302.5127 c
-f
-335.8389 302.1025 m
-333.5713 302.1025 331.9922 302.4961 331.9922 302.8486 C
-331.9355 302.8486 L
-331.8564 302.8486 L
-331.8564 302.7842 331.8857 302.7217 331.9355 302.6641 c
-332.3262 302.21 334.1289 301.9678 335.8389 301.9678 c
-337.5498 301.9678 339.3525 302.21 339.7422 302.6641 c
-339.793 302.7217 339.8223 302.7842 339.8223 302.8486 C
-339.7422 302.8486 L
-339.6865 302.8486 L
-339.6865 302.4961 338.1074 302.1025 335.8389 302.1025 c
-f
-335.8389 301.6934 m
-333.5713 301.6934 331.9922 302.0869 331.9922 302.4395 C
-331.9355 302.4395 L
-331.8564 302.4395 L
-331.8564 302.374 331.8857 302.3135 331.9355 302.2549 c
-332.3262 301.8018 334.1289 301.5586 335.8389 301.5586 c
-337.5498 301.5586 339.3525 301.8018 339.7422 302.2549 c
-339.793 302.3135 339.8223 302.374 339.8223 302.4395 C
-339.7422 302.4395 L
-339.6865 302.4395 L
-339.6865 302.0869 338.1074 301.6934 335.8389 301.6934 c
-f
-335.8389 301.2832 m
-333.5713 301.2832 331.9922 301.6768 331.9922 302.0303 C
-331.9355 302.0303 L
-331.8564 302.0303 L
-331.8564 301.9648 331.8857 301.9033 331.9355 301.8447 c
-332.3262 301.3916 334.1289 301.1484 335.8389 301.1484 c
-337.5498 301.1484 339.3525 301.3916 339.7422 301.8447 c
-339.793 301.9033 339.8223 301.9648 339.8223 302.0303 C
-339.7422 302.0303 L
-339.6865 302.0303 L
-339.6865 301.6768 338.1074 301.2832 335.8389 301.2832 c
-f
-335.8389 300.874 m
-333.5713 300.874 331.9922 301.2676 331.9922 301.6211 C
-331.9355 301.6211 L
-331.8564 301.6211 L
-331.8564 301.5557 331.8857 301.4941 331.9355 301.4355 c
-332.3262 300.9814 334.1289 300.7393 335.8389 300.7393 c
-337.5498 300.7393 339.3525 300.9814 339.7422 301.4355 c
-339.793 301.4941 339.8223 301.5557 339.8223 301.6211 C
-339.7422 301.6211 L
-339.6865 301.6211 L
-339.6865 301.2676 338.1074 300.874 335.8389 300.874 c
-f
-335.8389 300.4648 m
-333.5713 300.4648 331.9922 300.8584 331.9922 301.2109 C
-331.9355 301.2109 L
-331.8564 301.2109 L
-331.8564 301.1455 331.8857 301.084 331.9355 301.0254 c
-332.3262 300.5723 334.1289 300.3291 335.8389 300.3291 c
-337.5498 300.3291 339.3525 300.5723 339.7422 301.0254 c
-339.793 301.084 339.8223 301.1455 339.8223 301.2109 C
-339.7422 301.2109 L
-339.6865 301.2109 L
-339.6865 300.8584 338.1074 300.4648 335.8389 300.4648 c
-f
-335.8389 300.0557 m
-333.5713 300.0557 331.9922 300.4482 331.9922 300.8018 C
-331.9355 300.8018 L
-331.8564 300.8018 L
-331.8564 300.7363 331.8857 300.6748 331.9355 300.6162 c
-332.3262 300.1631 334.1289 299.9199 335.8389 299.9199 c
-337.5498 299.9199 339.3525 300.1631 339.7422 300.6162 c
-339.793 300.6748 339.8223 300.7363 339.8223 300.8018 C
-339.7422 300.8018 L
-339.6865 300.8018 L
-339.6865 300.4482 338.1074 300.0557 335.8389 300.0557 c
-f
-335.8389 299.6455 m
-333.5713 299.6455 331.9922 300.0391 331.9922 300.3926 C
-331.9355 300.3926 L
-331.8564 300.3926 L
-331.8564 300.3271 331.8857 300.2656 331.9355 300.207 c
-332.3262 299.7539 334.1289 299.5107 335.8389 299.5107 c
-337.5498 299.5107 339.3525 299.7539 339.7422 300.207 c
-339.793 300.2656 339.8223 300.3271 339.8223 300.3926 C
-339.7422 300.3926 L
-339.6865 300.3926 L
-339.6865 300.0391 338.1074 299.6455 335.8389 299.6455 c
-f
-335.8389 299.2354 m
-333.5713 299.2354 331.9922 299.6299 331.9922 299.9824 C
-331.9355 299.9824 L
-331.8564 299.9824 L
-331.8564 299.917 331.8857 299.8555 331.9355 299.7979 c
-332.3262 299.3438 334.1289 299.1006 335.8389 299.1006 c
-337.5498 299.1006 339.3525 299.3438 339.7422 299.7979 c
-339.793 299.8555 339.8223 299.917 339.8223 299.9824 C
-339.7422 299.9824 L
-339.6865 299.9824 L
-339.6865 299.6299 338.1074 299.2354 335.8389 299.2354 c
-f
-335.8389 298.8271 m
-333.5713 298.8271 331.9922 299.2197 331.9922 299.5732 C
-331.9355 299.5732 L
-331.8564 299.5732 L
-331.8564 299.5078 331.8857 299.4463 331.9355 299.3877 c
-332.3262 298.9346 334.1289 298.6914 335.8389 298.6914 c
-337.5498 298.6914 339.3525 298.9346 339.7422 299.3877 c
-339.793 299.4463 339.8223 299.5078 339.8223 299.5732 C
-339.7422 299.5732 L
-339.6865 299.5732 L
-339.6865 299.2197 338.1074 298.8271 335.8389 298.8271 c
-f
-335.8389 298.417 m
-333.5713 298.417 331.9922 298.8105 331.9922 299.1631 C
-331.9355 299.1631 L
-331.8564 299.1631 L
-331.8564 299.0986 331.8857 299.0361 331.9355 298.9785 c
-332.3262 298.5244 334.1289 298.2822 335.8389 298.2822 c
-337.5498 298.2822 339.3525 298.5244 339.7422 298.9785 c
-339.793 299.0361 339.8223 299.0986 339.8223 299.1631 C
-339.7422 299.1631 L
-339.6865 299.1631 L
-339.6865 298.8105 338.1074 298.417 335.8389 298.417 c
-f
-335.8389 298.0078 m
-333.5713 298.0078 331.9922 298.4014 331.9922 298.7539 C
-331.9355 298.7539 L
-331.8564 298.7539 L
-331.8564 298.6885 331.8857 298.627 331.9355 298.5693 c
-332.3262 298.1152 334.1289 297.8721 335.8389 297.8721 c
-337.5498 297.8721 339.3525 298.1152 339.7422 298.5693 c
-339.793 298.627 339.8223 298.6885 339.8223 298.7539 C
-339.7422 298.7539 L
-339.6865 298.7539 L
-339.6865 298.4014 338.1074 298.0078 335.8389 298.0078 c
-f
-335.8389 297.5977 m
-333.5713 297.5977 331.9922 297.9912 331.9922 298.3447 C
-331.9355 298.3447 L
-331.8564 298.3447 L
-331.8564 298.2793 331.8857 298.2178 331.9355 298.1592 c
-332.3262 297.7061 334.1289 297.4629 335.8389 297.4629 c
-337.5498 297.4629 339.3525 297.7061 339.7422 298.1592 c
-339.793 298.2178 339.8223 298.2793 339.8223 298.3447 C
-339.7422 298.3447 L
-339.6865 298.3447 L
-339.6865 297.9912 338.1074 297.5977 335.8389 297.5977 c
-f
-335.8389 297.1885 m
-333.5713 297.1885 331.9922 297.582 331.9922 297.9346 C
-331.9355 297.9346 L
-331.8564 297.9346 L
-331.8564 297.8701 331.8857 297.8076 331.9355 297.75 c
-332.3262 297.2959 334.1289 297.0537 335.8389 297.0537 c
-337.5498 297.0537 339.3525 297.2959 339.7422 297.75 c
-339.793 297.8076 339.8223 297.8701 339.8223 297.9346 C
-339.7422 297.9346 L
-339.6865 297.9346 L
-339.6865 297.582 338.1074 297.1885 335.8389 297.1885 c
-f
-335.8389 296.7783 m
-333.5713 296.7783 331.9922 297.1729 331.9922 297.5254 C
-331.9355 297.5254 L
-331.8564 297.5254 L
-331.8564 297.46 331.8857 297.3984 331.9355 297.3398 c
-332.3262 296.8867 334.1289 296.6436 335.8389 296.6436 c
-337.5498 296.6436 339.3525 296.8867 339.7422 297.3398 c
-339.793 297.3984 339.8223 297.46 339.8223 297.5254 C
-339.7422 297.5254 L
-339.6865 297.5254 L
-339.6865 297.1729 338.1074 296.7783 335.8389 296.7783 c
-f
-335.8389 296.3691 m
-333.5713 296.3691 331.9922 296.7627 331.9922 297.1162 C
-331.9355 297.1162 L
-331.8564 297.1162 L
-331.8564 297.0508 331.8857 296.9893 331.9355 296.9307 c
-332.3262 296.4775 334.1289 296.2344 335.8389 296.2344 c
-337.5498 296.2344 339.3525 296.4775 339.7422 296.9307 c
-339.793 296.9893 339.8223 297.0508 339.8223 297.1162 C
-339.7422 297.1162 L
-339.6865 297.1162 L
-339.6865 296.7627 338.1074 296.3691 335.8389 296.3691 c
-f
-335.8389 295.96 m
-333.5713 295.96 331.9922 296.3535 331.9922 296.7061 C
-331.9355 296.7061 L
-331.8564 296.7061 L
-331.8564 296.6416 331.8857 296.5791 331.9355 296.5205 c
-332.3262 296.0674 334.1289 295.8252 335.8389 295.8252 c
-337.5498 295.8252 339.3525 296.0674 339.7422 296.5205 c
-339.793 296.5791 339.8223 296.6416 339.8223 296.7061 C
-339.7422 296.7061 L
-339.6865 296.7061 L
-339.6865 296.3535 338.1074 295.96 335.8389 295.96 c
-f
-335.8389 295.5498 m
-333.5713 295.5498 331.9922 295.9443 331.9922 296.2969 C
-331.9355 296.2969 L
-331.8564 296.2969 L
-331.8564 296.2314 331.8857 296.1699 331.9355 296.1113 c
-332.3262 295.6582 334.1289 295.415 335.8389 295.415 c
-337.5498 295.415 339.3525 295.6582 339.7422 296.1113 c
-339.793 296.1699 339.8223 296.2314 339.8223 296.2969 C
-339.7422 296.2969 L
-339.6865 296.2969 L
-339.6865 295.9443 338.1074 295.5498 335.8389 295.5498 c
-f
-335.8389 295.1406 m
-333.5713 295.1406 331.9922 295.5342 331.9922 295.8877 C
-331.9355 295.8877 L
-331.8564 295.8877 L
-331.8564 295.8223 331.8857 295.7607 331.9355 295.7021 c
-332.3262 295.249 334.1289 295.0059 335.8389 295.0059 c
-337.5498 295.0059 339.3525 295.249 339.7422 295.7021 c
-339.793 295.7607 339.8223 295.8223 339.8223 295.8877 C
-339.7422 295.8877 L
-339.6865 295.8877 L
-339.6865 295.5342 338.1074 295.1406 335.8389 295.1406 c
-f
-335.8389 294.7314 m
-333.5713 294.7314 331.9922 295.125 331.9922 295.4775 C
-331.9355 295.4775 L
-331.8564 295.4775 L
-331.8564 295.4121 331.8857 295.3506 331.9355 295.292 c
-332.3262 294.8389 334.1289 294.5967 335.8389 294.5967 c
-337.5498 294.5967 339.3525 294.8389 339.7422 295.292 c
-339.793 295.3506 339.8223 295.4121 339.8223 295.4775 C
-339.7422 295.4775 L
-339.6865 295.4775 L
-339.6865 295.125 338.1074 294.7314 335.8389 294.7314 c
-f
-335.8389 294.3213 m
-333.5713 294.3213 331.9922 294.7148 331.9922 295.0684 C
-331.9355 295.0684 L
-331.8564 295.0684 L
-331.8564 295.0029 331.8857 294.9414 331.9355 294.8828 c
-332.3262 294.4297 334.1289 294.1865 335.8389 294.1865 c
-337.5498 294.1865 339.3525 294.4297 339.7422 294.8828 c
-339.793 294.9414 339.8223 295.0029 339.8223 295.0684 C
-339.7422 295.0684 L
-339.6865 295.0684 L
-339.6865 294.7148 338.1074 294.3213 335.8389 294.3213 c
-f
-335.8389 293.9121 m
-333.5713 293.9121 331.9922 294.3057 331.9922 294.6592 C
-331.9355 294.6592 L
-331.8564 294.6592 L
-331.8564 294.6094 331.877 294.5625 331.9063 294.5166 c
-331.9141 294.502 331.9238 294.4873 331.9355 294.4736 c
-332.3262 294.0205 334.1289 293.7773 335.8389 293.7773 c
-337.5498 293.7773 339.3525 294.0205 339.7422 294.4736 c
-339.7539 294.4873 339.7627 294.502 339.7715 294.5166 c
-339.8018 294.5625 339.8223 294.6094 339.8223 294.6592 C
-339.7422 294.6592 L
-339.6865 294.6592 L
-339.6865 294.3057 338.1074 293.9121 335.8389 293.9121 c
-f
-335.8389 293.5029 m
-333.5713 293.5029 331.9922 293.8965 331.9922 294.249 C
-331.9355 294.249 L
-331.8564 294.249 L
-331.8564 294.1846 331.8857 294.1221 331.9355 294.0645 c
-332.3262 293.6104 334.1289 293.3682 335.8389 293.3682 c
-337.5498 293.3682 339.3525 293.6104 339.7422 294.0645 c
-339.793 294.1221 339.8223 294.1846 339.8223 294.249 C
-339.7422 294.249 L
-339.6865 294.249 L
-339.6865 293.8965 338.1074 293.5029 335.8389 293.5029 c
-f
-0.67 g
-342.4941 306.8555 m
-342.4053 306.7764 342.2861 306.6982 342.1357 306.625 c
-342.1357 306.624 342.1348 306.624 342.1338 306.624 c
-342.0469 306.5811 341.9531 306.54 341.8477 306.501 c
-341.8477 306.501 l
-341.6387 306.4209 341.3945 306.3447 341.1172 306.2754 c
-341.1133 306.2744 341.1113 306.2734 341.1074 306.2725 c
-340.5547 306.1338 339.877 306.0176 339.1113 305.9307 c
-339.0996 305.9297 339.0918 305.9287 339.0811 305.9268 c
-338.7061 305.8848 338.3086 305.8496 337.8965 305.8232 c
-337.8779 305.8213 337.8613 305.8203 337.8438 305.8193 c
-337.6523 305.8076 337.458 305.7969 337.2598 305.7881 c
-337.2451 305.7881 337.2314 305.7861 337.2148 305.7861 c
-337.2021 305.7852 337.1875 305.7852 337.1738 305.7842 c
-336.9668 305.7764 336.7588 305.7695 336.5469 305.7646 c
-336.542 305.7646 336.5352 305.7646 336.5283 305.7646 c
-336.3018 305.7598 336.0723 305.7568 335.8389 305.7568 c
-335.6074 305.7568 335.377 305.7598 335.1484 305.7646 c
-335.1436 305.7646 335.1367 305.7646 335.1299 305.7646 c
-334.9189 305.7695 334.71 305.7764 334.5049 305.7842 c
-334.4922 305.7852 334.4756 305.7852 334.4619 305.7861 c
-334.4473 305.7861 334.4316 305.7881 334.418 305.7881 c
-334.2197 305.7969 334.0244 305.8076 333.833 305.8193 c
-333.8164 305.8203 333.7988 305.8213 333.7832 305.8232 c
-333.3691 305.8496 332.9717 305.8848 332.5947 305.9268 c
-332.5859 305.9287 332.5781 305.9287 332.5684 305.9297 c
-331.8018 306.0176 331.123 306.1338 330.5703 306.2725 c
-330.5674 306.2734 330.5645 306.2744 330.5625 306.2754 c
-330.1465 306.3799 329.8027 306.4971 329.5439 306.624 c
-329.542 306.624 329.542 306.625 v
-329.4658 306.6621 329.3965 306.7012 329.3369 306.7402 c
-329.1914 306.834 329.0898 306.9316 329.041 307.0322 c
-329.0156 307.0801 329.0049 307.1289 329.0049 307.1777 C
-329.0049 305.3652 L
-329.0049 305.2666 329.0527 305.1709 329.1436 305.0791 c
-329.2344 304.9863 329.3682 304.8975 329.542 304.8115 c
-329.7148 304.7275 329.9258 304.6455 330.1719 304.5703 c
-330.418 304.4951 330.6973 304.4248 331.0068 304.3604 c
-331.293 304.3008 331.6045 304.2471 331.9355 304.1992 c
-331.9629 304.1953 331.9893 304.1904 332.0176 304.1865 c
-332.3818 304.1357 332.7695 304.0918 333.1787 304.0557 c
-333.5879 304.0195 334.0156 303.9912 334.4619 303.9727 c
-334.9063 303.9541 335.3672 303.9443 335.8389 303.9443 c
-336.3105 303.9443 336.7715 303.9541 337.2148 303.9727 c
-337.6611 303.9912 338.0908 304.0195 338.498 304.0557 c
-338.9082 304.0918 339.2969 304.1357 339.6602 304.1865 c
-339.6885 304.1904 339.7139 304.1953 339.7422 304.1992 c
-340.0732 304.2471 340.3857 304.3008 340.6719 304.3604 c
-340.9805 304.4248 341.2617 304.4951 341.5059 304.5703 c
-341.752 304.6455 341.9629 304.7275 342.1357 304.8115 c
-342.3086 304.8975 342.4434 304.9863 342.5332 305.0791 c
-342.626 305.1709 342.6738 305.2666 342.6738 305.3652 C
-342.6738 307.1777 L
-342.6738 307.1045 342.6465 307.0322 342.5947 306.9619 c
-342.5684 306.9258 342.5332 306.8906 342.4941 306.8555 c
-f
-0.39 g
-340.4209 308.2324 m
-339.9688 307.3252 339.2754 306.8682 339.2412 306.8467 C
-339.2246 306.8369 L
-332.2051 306.8369 L
-332.1885 306.9697 L
-332.1953 306.9717 332.9004 307.1709 333.6396 308.5234 C
-330.9443 308.333 329.0049 307.8027 329.0049 307.1777 c
-329.0049 307.1289 329.0156 307.0801 329.041 307.0322 c
-329.0898 306.9316 329.1914 306.834 329.3369 306.7402 c
-329.3984 306.7002 329.4668 306.6621 329.5439 306.624 c
-329.8027 306.4971 330.1465 306.3799 330.5625 306.2754 c
-330.5645 306.2744 330.5674 306.2734 330.5703 306.2725 c
-331.123 306.1338 331.8018 306.0176 332.5684 305.9297 c
-332.5781 305.9287 332.5859 305.9287 332.5947 305.9268 c
-332.9717 305.8848 333.3691 305.8496 333.7832 305.8232 c
-333.7988 305.8213 333.8164 305.8203 333.833 305.8193 c
-334.0244 305.8076 334.2197 305.7969 334.418 305.7881 c
-334.4473 305.7871 334.4756 305.7861 334.5049 305.7842 c
-334.71 305.7764 334.9189 305.7695 335.1299 305.7646 c
-335.1367 305.7646 335.1436 305.7646 335.1484 305.7646 c
-335.377 305.7598 335.6074 305.7568 335.8389 305.7568 c
-336.0723 305.7568 336.3018 305.7598 336.5283 305.7646 c
-336.5352 305.7646 336.542 305.7646 336.5469 305.7646 c
-336.7588 305.7695 336.9668 305.7764 337.1738 305.7842 c
-337.2021 305.7861 337.2314 305.7871 337.2598 305.7881 c
-337.458 305.7969 337.6523 305.8076 337.8438 305.8193 c
-337.8613 305.8203 337.8779 305.8213 337.8965 305.8232 c
-338.3086 305.8496 338.7061 305.8848 339.0811 305.9268 c
-339.0918 305.9287 339.0996 305.9297 339.1113 305.9307 c
-339.877 306.0176 340.5547 306.1338 341.1074 306.2725 c
-341.1113 306.2734 341.1133 306.2744 341.1172 306.2754 c
-341.3945 306.3447 341.6387 306.4209 341.8477 306.501 C
-341.8477 306.501 L
-341.9531 306.54 342.0469 306.5811 342.1338 306.624 c
-342.2852 306.6982 342.4053 306.7754 342.4941 306.8555 c
-342.5332 306.8906 342.5684 306.9258 342.5947 306.9619 c
-342.6465 307.0322 342.6738 307.1045 342.6738 307.1777 c
-342.6738 307.5967 341.8037 307.9717 340.4209 308.2324 C
-f
-*u
-1 g
-1 D
-332.4971 306.9717 m
-333.0332 306.9717 339.1436 306.9717 339.1836 306.9717 C
-339.2666 307.0273 340.1133 307.6221 340.4873 308.7422 c
-340.5586 308.9541 340.582 309.1924 340.582 309.4492 c
-340.582 309.8115 340.5313 310.2119 340.4766 310.625 c
-340.4189 311.0693 340.3574 311.541 340.3574 312.0088 c
-340.3574 312.5869 340.4521 313.1592 340.7627 313.6699 c
-341.4521 314.8027 342.1504 315.3545 342.4932 315.5791 C
-342.0352 315.5791 335.7988 315.584 Y
-335.7813 315.5771 334.0898 314.7969 333.9551 313.2246 c
-333.9443 313.1025 333.9395 312.9834 333.9395 312.8652 c
-333.9395 312.3857 334.0156 311.9326 334.0898 311.4912 c
-334.1641 311.0557 334.2344 310.6309 334.2344 310.1963 c
-334.2344 309.7168 334.1475 309.2246 333.8809 308.6904 c
-333.3428 307.6162 332.8105 307.1611 332.4971 306.9717 C
-f
-338.9355 307.9131 m
-334.4258 307.9131 L
-334.4258 308.0479 L
-338.9355 308.0479 L
-338.9355 307.9131 L
-f
-0 D
-339.4746 312.1533 m
-335.0322 312.1533 L
-335.0322 312.2881 L
-339.4746 312.2881 L
-339.4746 312.1533 L
-f
-1 D
-339.6758 310.6055 m
-339.6758 310.4707 L
-335.166 310.4707 L
-335.166 310.6055 L
-339.6758 310.6055 L
-f
-335.0986 311.2793 m
-339.2041 311.2793 L
-339.2041 311.1445 L
-335.0986 311.1445 L
-335.0986 311.2793 L
-f
-335.166 309.6631 m
-339.6084 309.6631 L
-339.6084 309.5283 L
-335.166 309.5283 L
-335.166 309.6631 L
-f
-335.8389 314.9814 m
-340.4834 314.9814 L
-340.4834 314.8457 L
-335.8389 314.8457 L
-335.8389 314.9814 L
-f
-0 D
-335.3682 314.4424 m
-339.0693 314.4424 L
-339.0693 314.3076 L
-335.3682 314.3076 L
-335.3682 314.4424 L
-f
-335.0322 313.7021 m
-339.7422 313.7021 L
-339.7422 313.5674 L
-335.0322 313.5674 L
-335.0322 313.7021 L
-f
-334.8965 312.9619 m
-339.6084 312.9619 L
-339.6084 312.8271 L
-334.8965 312.8271 L
-334.8965 312.9619 L
-f
-1 D
-334.8965 308.8564 m
-339.2725 308.8564 L
-339.2725 308.7207 L
-334.8965 308.7207 L
-334.8965 308.8564 L
-f
-*U
-*u
-0 g
-332.1885 306.9697 m
-332.2051 306.8369 L
-339.2246 306.8369 L
-339.2412 306.8467 L
-339.2754 306.8682 339.9688 307.3252 340.4209 308.2324 c
-340.4932 308.377 340.5596 308.5322 340.6152 308.7002 c
-340.7939 309.2383 340.7061 309.9199 340.6113 310.6426 c
-340.4766 311.6621 340.3418 312.7168 340.8779 313.5996 c
-341.7969 315.1094 342.7588 315.5801 342.7686 315.585 C
-342.7402 315.7139 L
-335.7725 315.7139 L
-335.7266 315.6992 333.9619 314.8887 333.8203 313.2363 c
-333.7656 312.6045 333.8633 312.0273 333.957 311.4697 c
-334.1074 310.5742 334.249 309.7295 333.7598 308.751 c
-333.7197 308.6709 333.6797 308.5967 333.6396 308.5234 c
-332.9004 307.1709 332.1953 306.9717 332.1885 306.9697 C
-f
-0 D
-334.2344 310.1963 m
-334.2344 310.6309 334.1641 311.0557 334.0898 311.4912 c
-334.0156 311.9326 333.9395 312.3857 333.9395 312.8652 c
-333.9395 312.9834 333.9443 313.1025 333.9551 313.2246 c
-334.0898 314.7969 335.7813 315.5771 335.7988 315.584 C
-342.0352 315.5791 342.4932 315.5791 V
-342.1504 315.3545 341.4521 314.8027 340.7627 313.6699 c
-340.4521 313.1592 340.3574 312.5869 340.3574 312.0088 c
-340.3574 311.541 340.4189 311.0693 340.4766 310.625 c
-340.5313 310.2119 340.582 309.8115 340.582 309.4492 c
-340.582 309.1924 340.5586 308.9541 340.4873 308.7422 c
-340.1133 307.6221 339.2666 307.0273 339.1836 306.9717 C
-339.1436 306.9717 333.0332 306.9717 332.4971 306.9717 C
-332.8105 307.1611 333.3428 307.6162 333.8809 308.6904 c
-334.1475 309.2246 334.2344 309.7168 334.2344 310.1963 c
-f
-*U
-340.4834 314.9814 m
-335.8389 314.9814 L
-335.8389 314.8457 L
-340.4834 314.8457 L
-340.4834 314.9814 L
-f
-339.0693 314.4424 m
-335.3682 314.4424 L
-335.3682 314.3076 L
-339.0693 314.3076 L
-339.0693 314.4424 L
-f
-339.7422 313.7021 m
-335.0322 313.7021 L
-335.0322 313.5674 L
-339.7422 313.5674 L
-339.7422 313.7021 L
-f
-339.6084 312.9619 m
-334.8965 312.9619 L
-334.8965 312.8271 L
-339.6084 312.8271 L
-339.6084 312.9619 L
-f
-335.0322 312.1533 m
-339.4746 312.1533 L
-339.4746 312.2881 L
-335.0322 312.2881 L
-335.0322 312.1533 L
-f
-339.2041 311.2793 m
-335.0986 311.2793 L
-335.0986 311.1445 L
-339.2041 311.1445 L
-339.2041 311.2793 L
-f
-335.166 310.4707 m
-339.6758 310.4707 L
-339.6758 310.6055 L
-335.166 310.6055 L
-335.166 310.4707 L
-f
-339.6084 309.6631 m
-335.166 309.6631 L
-335.166 309.5283 L
-339.6084 309.5283 L
-339.6084 309.6631 L
-f
-339.2725 308.8564 m
-334.8965 308.8564 L
-334.8965 308.7207 L
-339.2725 308.7207 L
-339.2725 308.8564 L
-f
-334.4258 307.9131 m
-338.9355 307.9131 L
-338.9355 308.0479 L
-334.4258 308.0479 L
-334.4258 307.9131 L
-f
-U
-U
-U
-0 To
-1 0 0 1 336.6777 280.1621 0 Tp
-0 Tv
-TP
--11.5064 0 Td
-0 Tr
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
-0 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ -- XL
-0 TY
-0 TV
-23.6196 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 3.2805 3.2805 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
-0 Tc
-0 Tw
-(Spool) Tx 1 0 Tk
-(\r) Tx 1 0 Tk
-TO
-U
-U
-(Adobe Scatter Brush Tool) 1 0 61 XP
-%010203043F8000003F8000003F8000003F80000000000000000000000000
-%0000000000000000000000000000000033FA5072696E742073706F6F6C65
-%72
-/Adobe_Brushed_Path () XT
-u
-%_0.8158 g
-%_0 R
-%_0 G
-%_0.65 w 3.8636 M
-%_271.9199 306.0703 m
-%_B
-%_U
-%_0 Ap
-0 A
-u
-0 O
-0.8158 g
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-271.9199 306.0703 m
-F
-u
-u
-0 R
-0 G
-0.325 w 3.8636 M
-246.4517 312.3203 m
-297.3906 312.3203 L
-297.3906 303.166 L
-246.4517 303.166 L
-246.4517 312.3203 L
-b
-271.9219 307.7432 m
-B
-U
-u
-248.0381 303.166 m
-295.8027 303.166 L
-296.7534 303.166 297.521 302.3955 297.521 301.4473 c
-297.521 300.5078 L
-297.521 299.5586 296.7534 298.7871 295.8027 298.7871 c
-248.0381 298.7871 L
-247.0889 298.7871 246.3184 299.5586 246.3184 300.5078 c
-246.3184 301.4473 L
-246.3184 302.3955 247.0889 303.166 248.0381 303.166 c
-248.0381 303.166 L
-b
-271.9209 300.9766 m
-B
-U
-0 g
-249.3701 298.7891 m
-252.2886 298.7891 L
-251.7578 297.8594 L
-250.1001 297.8594 L
-249.3701 298.7891 L
-b
-291.0229 298.7891 m
-293.9419 298.7891 L
-293.4106 297.8594 L
-291.752 297.8594 L
-291.0229 298.7891 L
-b
-0.61 G
-0.65 w
-250.9614 312.2969 m
-250.9614 304.7363 L
-S
-252.2886 312.2969 m
-252.2886 304.7363 L
-S
-u
-0 O
-0 g
-0 G
-0.325 w
-282.9312 309.7988 m
-291.8188 309.7988 L
-291.8188 308.3398 L
-282.9312 308.3398 L
-282.9312 309.7988 L
-b
-287.3755 309.0703 m
-B
-U
-1 J
-291.0137 302.5 m
-291.2842 302.2148 291.4497 301.833 291.4497 301.4102 C
-291.4497 300.5469 L
-291.4497 300.123 291.2842 299.7402 291.0137 299.457 C
-S
-289.7847 302.5 m
-290.0532 302.2148 290.2192 301.833 290.2192 301.4102 C
-290.2192 300.5469 L
-290.2192 300.123 290.0532 299.7402 289.7847 299.457 C
-S
-288.5537 302.5 m
-288.8237 302.2148 288.9893 301.833 288.9893 301.4102 C
-288.9893 300.5469 L
-288.9893 300.123 288.8237 299.7402 288.5537 299.457 C
-S
-287.3237 302.5 m
-287.5928 302.2148 287.7593 301.833 287.7593 301.4102 C
-287.7593 300.5469 L
-287.7593 300.123 287.5928 299.7402 287.3237 299.457 C
-S
-286.0928 302.5 m
-286.3633 302.2148 286.5288 301.833 286.5288 301.4102 C
-286.5288 300.5469 L
-286.5288 300.123 286.3633 299.7402 286.0928 299.457 C
-S
-284.8633 302.5 m
-285.1333 302.2148 285.2983 301.833 285.2983 301.4102 C
-285.2983 300.5469 L
-285.2983 300.123 285.1333 299.7402 284.8633 299.457 C
-S
-283.6333 302.5 m
-283.9019 302.2148 284.0684 301.833 284.0684 301.4102 C
-284.0684 300.5469 L
-284.0684 300.123 283.9019 299.7402 283.6333 299.457 C
-S
-282.4028 302.5 m
-282.6719 302.2148 282.8374 301.833 282.8374 301.4102 C
-282.8374 300.5469 L
-282.8374 300.123 282.6719 299.7402 282.4028 299.457 C
-S
-281.1729 302.5 m
-281.4424 302.2148 281.6084 301.833 281.6084 301.4102 C
-281.6084 300.5469 L
-281.6084 300.123 281.4424 299.7402 281.1729 299.457 C
-S
-279.9438 302.5 m
-280.2114 302.2148 280.3779 301.833 280.3779 301.4102 C
-280.3779 300.5469 L
-280.3779 300.123 280.2114 299.7402 279.9438 299.457 C
-S
-278.7129 302.5 m
-278.9829 302.2148 279.1475 301.833 279.1475 301.4102 C
-279.1475 300.5469 L
-279.1475 300.123 278.9829 299.7402 278.7129 299.457 C
-S
-277.4819 302.5 m
-277.752 302.2148 277.9175 301.833 277.9175 301.4102 C
-277.9175 300.5469 L
-277.9175 300.123 277.752 299.7402 277.4819 299.457 C
-S
-276.2534 302.5 m
-276.5229 302.2148 276.6875 301.833 276.6875 301.4102 C
-276.6875 300.5469 L
-276.6875 300.123 276.5229 299.7402 276.2534 299.457 C
-S
-275.0215 302.5 m
-275.2925 302.2148 275.4565 301.833 275.4565 301.4102 C
-275.4565 300.5469 L
-275.4565 300.123 275.2925 299.7402 275.0215 299.457 C
-S
-273.7915 302.5 m
-274.0615 302.2148 274.2275 301.833 274.2275 301.4102 C
-274.2275 300.5469 L
-274.2275 300.123 274.0615 299.7402 273.7915 299.457 C
-S
-0 O
-0.4385 g
-0 J 1 j
-252.2886 314.2803 m
-291.2886 314.2803 L
-297.3906 312.3203 L
-246.4517 312.3203 L
-252.2886 314.2803 L
-b
-U
-U
-(Adobe Scatter Brush Tool) 1 0 59 XP
-%010203043F8000003F8000003F8000003F80000000000000000000000000
-%0000000000000000000000000000000031DF46696C6520536572766572
-/Adobe_Brushed_Path () XT
-LB
-%AI5_EndLayer--
-%%PageTrailer
-gsave annotatepage grestore showpage
-%%Trailer
-Adobe_Illustrator_AI5 /terminate get exec
-Adobe_shading_AI8 /terminate get exec
-Adobe_ColorImage_AI6 /terminate get exec
-Adobe_typography_AI5 /terminate get exec
-Adobe_cshow /terminate get exec
-Adobe_level2_AI5 /terminate get exec
-%%EOF
diff --git a/en_US.ISO8859-1/books/corp-net-guide/08-06.eps b/en_US.ISO8859-1/books/corp-net-guide/08-06.eps
deleted file mode 100644
index 5ef3c1f999..0000000000
--- a/en_US.ISO8859-1/books/corp-net-guide/08-06.eps
+++ /dev/null
@@ -1,8457 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: Adobe Illustrator(R) 8.0
-%%AI8_CreatorVersion: 8.0.1
-%%For: (William B Brownville) (PDPS)
-%%Title: (08-06 3594)
-%%CreationDate: (9/28/00) (4:18 PM)
-%%BoundingBox: 188 366 413 476
-%%HiResBoundingBox: 188.0039 366.5078 412.8252 475.7046
-%%DocumentProcessColors: Black
-%%DocumentFonts: Helvetica
-%%DocumentNeededFonts: Helvetica
-%%DocumentSuppliedResources: procset Adobe_level2_AI5 1.2 0
-%%+ procset Adobe_typography_AI5 1.0 1
-%%+ procset Adobe_ColorImage_AI6 1.3 0
-%%+ procset Adobe_Illustrator_AI5 1.3 0
-%%+ procset Adobe_cshow 2.0 8
-%%+ procset Adobe_shading_AI8 1.0 0
-%AI5_FileFormat 4.0
-%AI3_ColorUsage: Black&White
-%AI3_IncludePlacedImages
-%AI7_ImageSettings: 1
-%%CMYKProcessColor: 0 0 0 0.15 (15%)
-%%+ 0 0 0 0.3 (30%)
-%%+ 0 0 0 0.5 (50%)
-%%+ 0 0 0 0.75 (75%)
-%%+ 1 1 1 1 ([Registration])
-%%AI6_ColorSeparationSet: 1 1 (AI6 Default Color Separation Set)
-%%+ Options: 1 16 0 1 0 1 1 1 0 1 1 1 1 18 0 0 0 0 0 0 0 0 -1 -1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 2 3 4
-%%+ PPD: 1 21 0 0 60 45 2 2 1 0 0 1 0 0 0 0 0 0 0 0 0 0 ()
-%AI3_TemplateBox: 306.5 395.5 306.5 395.5
-%AI3_TileBox: 12 14 600 782
-%AI3_DocumentPreview: Macintosh_ColorPic
-%AI5_ArtSize: 612 792
-%AI5_RulerUnits: 3
-%AI5_ArtFlags: 1 0 0 1 0 0 1 0 0
-%AI5_TargetResolution: 800
-%AI5_NumLayers: 1
-%AI8_OpenToView: 91.3892 559.3486 2.3409 1060 751 18 1 1 7 40 0 0
-%AI5_OpenViewLayers: 7
-%%PageOrigin:12 14
-%%AI3_PaperRect:-12 782 600 -10
-%%AI3_Margin:12 -14 -12 10
-%AI7_GridSettings: 12 3 12 3 1 0 0.29 1 1 0.65 1 1
-%%EndComments
-%%BeginProlog
-%%BeginResource: procset Adobe_level2_AI5 1.2 0
-%%Title: (Adobe Illustrator (R) Version 5.0 Level 2 Emulation)
-%%Version: 1.2 0
-%%CreationDate: (04/10/93) ()
-%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved)
-userdict /Adobe_level2_AI5 26 dict dup begin
- put
- /packedarray where not
- {
- userdict begin
- /packedarray
- {
- array astore readonly
- } bind def
- /setpacking /pop load def
- /currentpacking false def
- end
- 0
- } if
- pop
- userdict /defaultpacking currentpacking put true setpacking
- /initialize
- {
- Adobe_level2_AI5 begin
- } bind def
- /terminate
- {
- currentdict Adobe_level2_AI5 eq
- {
- end
- } if
- } bind def
- mark
- /setcustomcolor where not
- {
- /findcmykcustomcolor
- {
- (AI8_CMYK_CustomColor)
- 6 packedarray
- } bind def
- /findrgbcustomcolor
- {
- (AI8_RGB_CustomColor)
- 5 packedarray
- } bind def
- /setcustomcolor
- {
- exch
- aload pop dup
- (AI8_CMYK_CustomColor) eq
- {
- pop pop
- 4
- {
- 4 index mul
- 4 1 roll
- } repeat
- 5 -1 roll pop
- setcmykcolor
- }
- {
- dup (AI8_RGB_CustomColor) eq
- {
- pop pop
- 3
- {
- 1 exch sub
- 3 index mul
- 1 exch sub
- 3 1 roll
- } repeat
- 4 -1 roll pop
- setrgbcolor
- }
- {
- pop
- 4
- {
- 4 index mul 4 1 roll
- } repeat
- 5 -1 roll pop
- setcmykcolor
- } ifelse
- } ifelse
- }
- def
- } if
- /setAIseparationgray
- {
- false setoverprint
- 0 setgray
- /setseparationgray where{
- pop setseparationgray
- }{
- /setcolorspace where{
- pop
- [/Separation (All) /DeviceCMYK {dup dup dup}] setcolorspace
- 1 exch sub setcolor
- }{
- setgray
- }ifelse
- }ifelse
- } def
-
- /gt38? mark {version cvr cvx exec} stopped {cleartomark true} {38 gt exch pop} ifelse def
- userdict /deviceDPI 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt put
- userdict /level2?
- systemdict /languagelevel known dup
- {
- pop systemdict /languagelevel get 2 ge
- } if
- put
-/level2ScreenFreq
-{
- begin
- 60
- HalftoneType 1 eq
- {
- pop Frequency
- } if
- HalftoneType 2 eq
- {
- pop GrayFrequency
- } if
- HalftoneType 5 eq
- {
- pop Default level2ScreenFreq
- } if
- end
-} bind def
-userdict /currentScreenFreq
- level2? {currenthalftone level2ScreenFreq} {currentscreen pop pop} ifelse put
-level2? not
- {
- /setcmykcolor where not
- {
- /setcmykcolor
- {
- exch .11 mul add exch .59 mul add exch .3 mul add
- 1 exch sub setgray
- } def
- } if
- /currentcmykcolor where not
- {
- /currentcmykcolor
- {
- 0 0 0 1 currentgray sub
- } def
- } if
- /setoverprint where not
- {
- /setoverprint /pop load def
- } if
- /selectfont where not
- {
- /selectfont
- {
- exch findfont exch
- dup type /arraytype eq
- {
- makefont
- }
- {
- scalefont
- } ifelse
- setfont
- } bind def
- } if
- /cshow where not
- {
- /cshow
- {
- [
- 0 0 5 -1 roll aload pop
- ] cvx bind forall
- } bind def
- } if
- } if
- cleartomark
- /anyColor?
- {
- add add add 0 ne
- } bind def
- /testColor
- {
- gsave
- setcmykcolor currentcmykcolor
- grestore
- } bind def
- /testCMYKColorThrough
- {
- testColor anyColor?
- } bind def
- userdict /composite?
- 1 0 0 0 testCMYKColorThrough
- 0 1 0 0 testCMYKColorThrough
- 0 0 1 0 testCMYKColorThrough
- 0 0 0 1 testCMYKColorThrough
- and and and
- put
- composite? not
- {
- userdict begin
- gsave
- /cyan? 1 0 0 0 testCMYKColorThrough def
- /magenta? 0 1 0 0 testCMYKColorThrough def
- /yellow? 0 0 1 0 testCMYKColorThrough def
- /black? 0 0 0 1 testCMYKColorThrough def
- grestore
- /isCMYKSep? cyan? magenta? yellow? black? or or or def
- /customColor? isCMYKSep? not def
- end
- } if
- end defaultpacking setpacking
-%%EndResource
-%%BeginResource: procset Adobe_typography_AI5 1.0 1
-%%Title: (Typography Operators)
-%%Version: 1.0 1
-%%CreationDate:(6/10/1996) ()
-%%Copyright: ((C) 1987-1996 Adobe Systems Incorporated All Rights Reserved)
-currentpacking true setpacking
-userdict /Adobe_typography_AI5 68 dict dup begin
-put
-/initialize
-{
- begin
- begin
- Adobe_typography_AI5 begin
- Adobe_typography_AI5
- {
- dup xcheck
- {
- bind
- } if
- pop pop
- } forall
- end
- end
- end
- Adobe_typography_AI5 begin
-} def
-/terminate
-{
- currentdict Adobe_typography_AI5 eq
- {
- end
- } if
-} def
-/modifyEncoding
-{
- /_tempEncode exch ddef
- /_pntr 0 ddef
- {
- counttomark -1 roll
- dup type dup /marktype eq
- {
- pop pop exit
- }
- {
- /nametype eq
- {
- _tempEncode /_pntr dup load dup 3 1 roll 1 add ddef 3 -1 roll
- put
- }
- {
- /_pntr exch ddef
- } ifelse
- } ifelse
- } loop
- _tempEncode
-} def
-/havefont
-{
- systemdict /languagelevel known
- {
- /Font resourcestatus dup
- { exch pop exch pop }
- if
- }
- {
- systemdict /FontDirectory get 1 index known
- { pop true }
- {
- systemdict /fileposition known
- {
- dup length 6 add exch
- Ss 6 250 getinterval
- cvs pop
- Ss exch 0 exch getinterval
- status
- { pop pop pop pop true }
- { false }
- ifelse
- }
- {
- pop false
- }
- ifelse
- }
- ifelse
- }
- ifelse
-} def
-/TE
-{
- StandardEncoding 256 array copy modifyEncoding
- /_nativeEncoding exch def
-} def
-/subststring {
- exch 2 index exch search
- {
- exch pop
- exch dup () eq
- {
- pop exch concatstring
- }
- {
- 3 -1 roll
- exch concatstring
- concatstring
- } ifelse
- exch pop true
- }
- {
- pop pop false
- } ifelse
-} def
-/concatstring {
- 1 index length 1 index length
- 1 index add
- string
- dup 0 5 index putinterval
- dup 2 index 4 index putinterval
- 4 1 roll pop pop pop
-} def
-%
-/TZ
-{
- dup type /arraytype eq
- {
- /_wv exch def
- }
- {
- /_wv 0 def
- } ifelse
- /_useNativeEncoding exch def
- 2 index havefont
- {
- 3 index
- 255 string
- cvs
-
- dup
- (_Symbol_)
- eq
- {
- pop
- 2 index
- findfont
-
- }
- {
- 1 index 0 eq
- {
- dup length 1 sub
- 1 exch
- getinterval
-
- cvn
- findfont
- }
- {
- pop 2 index findfont
- } ifelse
- } ifelse
- }
- {
- dup 1 eq
- {
- 2 index 64 string cvs
- dup (-90pv-RKSJ-) (-83pv-RKSJ-) subststring
- {
- exch pop dup havefont
- {
- findfont false
- }
- {
- pop true
- } ifelse
- }
- {
- pop dup
- (-90ms-RKSJ-) (-Ext-RKSJ-) subststring
- {
- exch pop dup havefont
- {
- findfont false
- }
- {
- pop true
- } ifelse
- }
- {
- pop pop true
- } ifelse
- } ifelse
- {
- 1 index 1 eq
- {
- /Ryumin-Light-Ext-RKSJ-V havefont
- {/Ryumin-Light-Ext-RKSJ-V}
- {/Courier}
- ifelse
- }
- {
- /Ryumin-Light-83pv-RKSJ-H havefont
- {/Ryumin-Light-83pv-RKSJ-H}
- {/Courier}
- ifelse
- } ifelse
- findfont
- [1 0 0.5 1 0 0] makefont
- } if
- }
- {
- /Courier findfont
- } ifelse
- } ifelse
- _wv type /arraytype eq
- {
- _wv makeblendedfont
- } if
- dup length 10 add dict
- begin
- mark exch
- {
- 1 index /FID ne
- {
- def
- } if
- cleartomark mark
- } forall
- pop
- /FontScript exch def
- /FontDirection exch def
- /FontRequest exch def
- /FontName exch def
- counttomark 0 eq
- {
- 1 _useNativeEncoding eq
- {
- /Encoding _nativeEncoding def
- } if
- cleartomark
- }
- {
- /Encoding load 256 array copy
- modifyEncoding /Encoding exch def
- } ifelse
- FontName currentdict
- end
- definefont pop
-} def
-/tr
-{
- _ax _ay 3 2 roll
-} def
-/trj
-{
- _cx _cy _sp _ax _ay 6 5 roll
-} def
-/a0
-{
- /Tx
- {
- dup
- currentpoint 3 2 roll
- tr _psf
- newpath moveto
- tr _ctm _pss
- } ddef
- /Tj
- {
- dup
- currentpoint 3 2 roll
- trj _pjsf
- newpath moveto
- trj _ctm _pjss
- } ddef
-} def
-/a1
-{
-W B
-} def
-/e0
-{
- /Tx
- {
- tr _psf
- } ddef
- /Tj
- {
- trj _pjsf
- } ddef
-} def
-/e1
-{
-W F
-} def
-/i0
-{
- /Tx
- {
- tr sp
- } ddef
- /Tj
- {
- trj jsp
- } ddef
-} def
-/i1
-{
- W N
-} def
-/o0
-{
- /Tx
- {
- tr sw rmoveto
- } ddef
- /Tj
- {
- trj swj rmoveto
- } ddef
-} def
-/r0
-{
- /Tx
- {
- tr _ctm _pss
- } ddef
- /Tj
- {
- trj _ctm _pjss
- } ddef
-} def
-/r1
-{
-W S
-} def
-/To
-{
- pop _ctm currentmatrix pop
-} def
-/TO
-{
- iTe _ctm setmatrix newpath
-} def
-/Tp
-{
- pop _tm astore pop _ctm setmatrix
- _tDict begin
- /W
- {
- } def
- /h
- {
- } def
-} def
-/TP
-{
- end
- iTm 0 0 moveto
-} def
-/Tr
-{
- _render 3 le
- {
- currentpoint newpath moveto
- } if
- dup 8 eq
- {
- pop 0
- }
- {
- dup 9 eq
- {
- pop 1
- } if
- } ifelse
- dup /_render exch ddef
- _renderStart exch get load exec
-} def
-/iTm
-{
- _ctm setmatrix _tm concat
- _shift aload pop _lineorientation 1 eq { exch } if translate
- _scale aload pop _lineorientation 1 eq _yokoorientation 1 eq or { exch } if scale
-} def
-/Tm
-{
- _tm astore pop iTm 0 0 moveto
-} def
-/Td
-{
- _mtx translate _tm _tm concatmatrix pop iTm 0 0 moveto
-} def
-/iTe
-{
- _render -1 eq
- {
- }
- {
- _renderEnd _render get dup null ne
- {
- load exec
- }
- {
- pop
- } ifelse
- } ifelse
- /_render -1 ddef
-} def
-/Ta
-{
- pop
-} def
-/Tf
-{
- 1 index type /nametype eq
- {
- dup 0.75 mul 1 index 0.25 mul neg
- } if
- /_fontDescent exch ddef
- /_fontAscent exch ddef
- /_fontSize exch ddef
- /_fontRotateAdjust _fontAscent _fontDescent add 2 div neg ddef
- /_fontHeight _fontSize ddef
- findfont _fontSize scalefont setfont
-} def
-/Tl
-{
- pop neg 0 exch
- _leading astore pop
-} def
-/Tt
-{
- pop
-} def
-/TW
-{
- 3 npop
-} def
-/Tw
-{
- /_cx exch ddef
-} def
-/TC
-{
- 3 npop
-} def
-/Tc
-{
- /_ax exch ddef
-} def
-/Ts
-{
- 0 exch
- _shift astore pop
- currentpoint
- iTm
- moveto
-} def
-/Ti
-{
- 3 npop
-} def
-/Tz
-{
- count 1 eq { 100 } if
- 100 div exch 100 div exch
- _scale astore pop
- iTm
-} def
-/TA
-{
- pop
-} def
-/Tq
-{
- pop
-} def
-/Tg
-{
- pop
-} def
-/TG
-{
- pop
-} def
-/Tv
-{
- /_lineorientation exch ddef
-} def
-/TV
-{
- /_charorientation exch ddef
-} def
-/Ty
-{
- dup /_yokoorientation exch ddef 1 sub neg Tv
-} def
-/TY
-{
- pop
-} def
-/T~
-{
- Tx
-} def
-/Th
-{
- pop pop pop pop pop
-} def
-/TX
-{
- pop
-} def
-/Tk
-{
- _fontSize mul 1000 div
- _lineorientation 0 eq { neg 0 } { 0 exch } ifelse
- rmoveto
- pop
-} def
-/TK
-{
- 2 npop
-} def
-/T*
-{
- _leading aload pop
- _lineorientation 0 ne { exch } if
- Td
-} def
-/T*-
-{
- _leading aload pop
- _lineorientation 0 ne { exch } if
- exch neg exch neg
- Td
-} def
-/T-
-{
- _ax neg 0 rmoveto
- _lineorientation 1 eq _charorientation 0 eq and { 1 TV _hyphen Tx 0 TV } { _hyphen Tx } ifelse
-} def
-/T+
-{
-} def
-/TR
-{
- _ctm currentmatrix pop
- _tm astore pop
- iTm 0 0 moveto
-} def
-/TS
-{
- currentfont 3 1 roll
- /_Symbol_ findfont _fontSize scalefont setfont
-
- 0 eq
- {
- Tx
- }
- {
- Tj
- } ifelse
- setfont
-} def
-/Xb
-{
- pop pop
-} def
-/Tb /Xb load def
-/Xe
-{
- pop pop pop pop
-} def
-/Te /Xe load def
-/XB
-{
-} def
-/TB /XB load def
-currentdict readonly pop
-end
-setpacking
-%
-/X^
-{
- currentfont 5 1 roll
- dup havefont
- {
- findfont _fontSize scalefont setfont
- }
- {
- pop
- exch
- } ifelse
- 2 index 0 eq
- {
- Tx
- }
- {
- Tj
- } ifelse
- pop pop
- setfont
-} def
-/T^ /X^ load def
-%%EndResource
-%%BeginProcSet: Adobe_ColorImage_AI6 1.3 0
-userdict /Adobe_ColorImage_AI6 known not
-{
- userdict /Adobe_ColorImage_AI6 53 dict put
-} if
-userdict /Adobe_ColorImage_AI6 get begin
-/initialize {
- Adobe_ColorImage_AI6 begin
- Adobe_ColorImage_AI6 {
- dup type /arraytype eq {
- dup xcheck {
- bind
- } if
- } if
- pop pop
- } forall
-} def
-/terminate { end } def
-currentdict /Adobe_ColorImage_AI6_Vars known not {
- /Adobe_ColorImage_AI6_Vars 41 dict def
-} if
-Adobe_ColorImage_AI6_Vars begin
- /plateindex -1 def
- /_newproc null def
- /_proc1 null def
- /_proc2 null def
- /sourcearray 4 array def
- /_ptispace null def
- /_ptiname null def
- /_pti0 0 def
- /_pti1 0 def
- /_ptiproc null def
- /_ptiscale 0 def
- /_pticomps 0 def
- /_ptibuf 0 string def
- /_gtigray 0 def
- /_cticmyk null def
- /_rtirgb null def
- /XIEnable true def
- /XIType 0 def
- /XIEncoding 0 def
- /XICompression 0 def
- /XIChannelCount 0 def
- /XIBitsPerPixel 0 def
- /XIImageHeight 0 def
- /XIImageWidth 0 def
- /XIImageMatrix null def
- /XIRowBytes 0 def
- /XIFile null def
- /XIBuffer1 null def
- /XIBuffer2 null def
- /XIBuffer3 null def
- /XIDataProc null def
- /XIColorSpace /DeviceGray def
- /XIColorValues 0 def
- /XIPlateList false def
-end
-/ci6colorimage /colorimage where {/colorimage get}{null} ifelse def
-/ci6image systemdict /image get def
-/ci6curtransfer systemdict /currenttransfer get def
-/ci6curoverprint /currentoverprint where {/currentoverprint get}{{_of}} ifelse def
-/ci6foureq {
- 4 index ne {
- pop pop pop false
- }{
- 4 index ne {
- pop pop false
- }{
- 4 index ne {
- pop false
- }{
- 4 index eq
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6testplate {
- Adobe_ColorImage_AI6_Vars begin
- /plateindex -1 def
- /setcmykcolor where {
- pop
- gsave
- 1 0 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub
- 0 1 0 0 setcmykcolor systemdict /currentgray get exec 1 exch sub
- 0 0 1 0 setcmykcolor systemdict /currentgray get exec 1 exch sub
- 0 0 0 1 setcmykcolor systemdict /currentgray get exec 1 exch sub
- grestore
- 1 0 0 0 ci6foureq {
- /plateindex 0 def
- }{
- 0 1 0 0 ci6foureq {
- /plateindex 1 def
- }{
- 0 0 1 0 ci6foureq {
- /plateindex 2 def
- }{
- 0 0 0 1 ci6foureq {
- /plateindex 3 def
- }{
- 0 0 0 0 ci6foureq {
- /plateindex 5 def
- } if
- } ifelse
- } ifelse
- } ifelse
- } ifelse
- pop pop pop pop
- } if
- plateindex
- end
-} def
-/ci6concatprocs {
- /packedarray where {
- pop dup type /packedarraytype eq 2 index type
- /packedarraytype eq or
- }{
- false
- } ifelse
- {
- /_proc2 exch cvlit def
- /_proc1 exch cvlit def
- _proc1 aload pop
- _proc2 aload pop
- _proc1 length
- _proc2 length add
- packedarray cvx
- }{
- /_proc2 exch cvlit def
- /_proc1 exch cvlit def
- /_newproc _proc1 length _proc2 length add array def
- _newproc 0 _proc1 putinterval
- _newproc _proc1 length _proc2 putinterval
- _newproc cvx
- } ifelse
-} def
-/ci6istint {
- type /arraytype eq
-} def
-/ci6isspot {
- dup type /arraytype eq {
- dup length 1 sub get /Separation eq
- }{
- pop false
- } ifelse
-} def
-/ci6spotname {
- dup ci6isspot {dup length 2 sub get}{pop ()} ifelse
-} def
-/ci6altspace {
- aload pop pop pop ci6colormake
-} def
-/ci6numcomps {
- dup /DeviceGray eq {
- pop 1
- }{
- dup /DeviceRGB eq {
- pop 3
- }{
- /DeviceCMYK eq {
- 4
- }{
- 1
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6marksplate {
- dup /DeviceGray eq {
- pop plateindex 3 eq
- }{
- dup /DeviceRGB eq {
- pop plateindex 5 ne
- }{
- dup /DeviceCMYK eq {
- pop plateindex 5 ne
- }{
- dup ci6isspot {
- /findcmykcustomcolor where {
- pop
- dup length 2 sub get
- 0.1 0.1 0.1 0.1 5 -1 roll
- findcmykcustomcolor 1 setcustomcolor
- systemdict /currentgray get exec
- 1 ne
- }{
- pop plateindex 5 ne
- } ifelse
- }{
- pop plateindex 5 ne
- } ifelse
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6colormake {
- dup ci6numcomps
- exch 1 index 2 add 1 roll
- dup 1 eq {pop}{array astore} ifelse
- exch
-} def
-/ci6colorexpand {
- dup ci6spotname exch
- dup ci6istint {
- ci6altspace
- exch 4 1 roll
- }{
- 1 3 1 roll
- } ifelse
-} def
-/ci6colortint {
- dup /DeviceGray eq {
- 3 1 roll 1 exch sub mul 1 exch sub exch
- }{
- dup /DeviceRGB eq {
- 3 1 roll {1 exch sub 1 index mul 1 exch sub exch} forall pop 3 array astore exch
- }{
- dup /DeviceCMYK eq {
- 3 1 roll {1 index mul exch} forall pop 4 array astore exch
- }{
- 3 1 roll mul exch
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6colortocmyk {
- dup /DeviceGray eq {
- pop 1 exch sub 0 0 0 4 -1 roll 4 array astore
- }{
- dup /DeviceRGB eq {
- pop aload pop _rgbtocmyk 4 array astore
- }{
- dup /DeviceCMYK eq {
- pop
- }{
- ci6altspace ci6colortint ci6colortocmyk
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6makeimagedict {
- 7 dict begin
- /ImageType 1 def
- /Decode exch def
- /DataSource exch def
- /ImageMatrix exch def
- /BitsPerComponent exch def
- /Height exch def
- /Width exch def
- currentdict end
-} def
-/ci6stringinvert {
- 0 1 2 index length 1 sub {
- dup 2 index exch get 255 exch sub 2 index 3 1 roll put
- } for
-} def
-/ci6stringknockout {
- 0 1 2 index length 1 sub {
- 255 2 index 3 1 roll put
- } for
-} def
-/ci6stringapply {
- 0 1 4 index length 1 sub {
- dup
- 4 index exch get
- 3 index 3 1 roll
- 3 index exec
- } for
- pop exch pop
-} def
-/ci6walkrgbstring {
- 0 3 index
- dup length 1 sub 0 3 3 -1 roll {
- 3 getinterval {} forall
- 5 index exec
- 3 index
- } for
-
- 5 {pop} repeat
-} def
-/ci6walkcmykstring
-{
- 0 3 index
- dup length 1 sub 0 4 3 -1 roll {
- 4 getinterval {} forall
-
- 6 index exec
-
- 3 index
-
- } for
-
- 5 { pop } repeat
-
-} def
-/ci6putrgbtograystr
-{
- .11 mul exch
-
- .59 mul add exch
-
- .3 mul add
-
- cvi 3 copy put
-
- pop 1 add
-} def
-/ci6putcmyktograystr
-{
- exch .11 mul add
-
- exch .59 mul add
-
- exch .3 mul add
-
- dup 255 gt { pop 255 } if
-
- 255 exch sub cvi 3 copy put
-
- pop 1 add
-} def
-/ci6rgbtograyproc {
- Adobe_ColorImage_AI6_Vars begin
- sourcearray 0 get exec
- XIBuffer3
- dup 3 1 roll
-
- /ci6putrgbtograystr load exch
- ci6walkrgbstring
- end
-} def
-/ci6cmyktograyproc {
- Adobe_ColorImage_AI6_Vars begin
- sourcearray 0 get exec
- XIBuffer3
- dup 3 1 roll
-
- /ci6putcmyktograystr load exch
- ci6walkcmykstring
- end
-} def
-/ci6separatecmykproc {
- Adobe_ColorImage_AI6_Vars begin
- sourcearray 0 get exec
-
- XIBuffer3
-
- 0 2 index
-
- plateindex 4 2 index length 1 sub {
- get 255 exch sub
-
- 3 copy put pop 1 add
-
- 2 index
- } for
- pop pop exch pop
- end
-} def
-
-/ci6compositeimage {
- dup 1 eq {
- pop pop image
- }{
- /ci6colorimage load null ne {
- ci6colorimage
- }{
- 3 1 roll pop
- sourcearray 0 3 -1 roll put
- 3 eq {/ci6rgbtograyproc}{/ci6cmyktograyproc} ifelse load
- image
- } ifelse
- } ifelse
-} def
-/ci6knockoutimage {
- gsave
- 0 ci6curtransfer exec 1 ci6curtransfer exec
- eq {
- 0 ci6curtransfer exec 0.5 lt
- }{
- 0 ci6curtransfer exec 1 ci6curtransfer exec gt
- } ifelse
- {{pop 0}}{{pop 1}} ifelse
- systemdict /settransfer get exec
- ci6compositeimage
- grestore
-} def
-/ci6drawimage {
- ci6testplate -1 eq {
- pop ci6compositeimage
- }{
- dup type /arraytype eq {
- dup length plateindex gt {plateindex get}{pop false} ifelse
- }{
- {
- true
- }{
- dup 1 eq {plateindex 3 eq}{plateindex 3 le} ifelse
- } ifelse
- } ifelse
- {
- dup 1 eq {
- pop pop ci6image
- }{
- dup 3 eq {
- ci6compositeimage
- }{
- pop pop
- sourcearray 0 3 -1 roll put
- /ci6separatecmykproc load
- ci6image
- } ifelse
- } ifelse
- }{
- ci6curoverprint {
- 7 {pop} repeat
- }{
- ci6knockoutimage
- } ifelse
- } ifelse
- } ifelse
-} def
-/ci6proctintimage {
- /_ptispace exch store /_ptiname exch store /_pti1 exch store /_pti0 exch store /_ptiproc exch store
- /_pticomps _ptispace ci6numcomps store
- /_ptiscale _pti1 _pti0 sub store
- level2? {
- _ptiname length 0 gt version cvr 2012 ge and {
- [/Separation _ptiname _ptispace {_ptiproc}] setcolorspace
- [_pti0 _pti1] ci6makeimagedict ci6image
- }{
- [/Indexed _ptispace 255 {255 div _ptiscale mul _pti0 add _ptiproc}] setcolorspace
- [0 255] ci6makeimagedict ci6image
- } ifelse
- }{
- _pticomps 1 eq {
- {
- dup
- {
- 255 div _ptiscale mul _pti0 add _ptiproc 255 mul cvi put
- } ci6stringapply
- } ci6concatprocs ci6image
- }{
- {
- dup length _pticomps mul dup _ptibuf length ne {/_ptibuf exch string store}{pop} ifelse
- _ptibuf {
- exch _pticomps mul exch 255 div _ptiscale mul _pti0 add _ptiproc
- _pticomps 2 add -2 roll
- _pticomps 1 sub -1 0 {
- 1 index add 2 index exch
- 5 -1 roll
- 255 mul cvi put
- } for
- pop pop
- } ci6stringapply
- } ci6concatprocs false _pticomps
- /ci6colorimage load null eq {7 {pop} repeat}{ci6colorimage} ifelse
- } ifelse
- } ifelse
-} def
-/ci6graytintimage {
- /_gtigray 5 -1 roll store
- {1 _gtigray sub mul 1 exch sub} 4 1 roll
- /DeviceGray ci6proctintimage
-} def
-/ci6cmyktintimage {
- /_cticmyk 5 -1 roll store
- {_cticmyk {1 index mul exch} forall pop} 4 1 roll
- /DeviceCMYK ci6proctintimage
-} def
-/ci6rgbtintimage {
- /_rtirgb 5 -1 roll store
- {_rtirgb {1 exch sub 1 index mul 1 exch sub exch} forall pop} 4 1 roll
- /DeviceRGB ci6proctintimage
-} def
-/ci6tintimage {
- ci6testplate -1 eq {
- ci6colorexpand
- 3 -1 roll 5 -1 roll {0}{0 exch} ifelse 4 2 roll
- dup /DeviceGray eq {
- pop ci6graytintimage
- }{
- dup /DeviceRGB eq {
- pop ci6rgbtintimage
- }{
- pop ci6cmyktintimage
- } ifelse
- } ifelse
- }{
- dup ci6marksplate {
- plateindex 5 lt {
- ci6colortocmyk plateindex get
- dup 0 eq ci6curoverprint and {
- 7 {pop} repeat
- }{
- 1 exch sub
- exch {1 0}{0 1} ifelse () ci6graytintimage
- } ifelse
- }{
- pop exch {0}{0 exch} ifelse 0 3 1 roll () ci6graytintimage
- } ifelse
- }{
- ci6curoverprint {
- 8 {pop} repeat
- }{
- pop pop pop
- {pop 1} 0 1 () /DeviceGray ci6proctintimage
- } ifelse
- } ifelse
- } ifelse
-} def
-/XINullImage {
-} def
-/XIImageMask {
- XIImageWidth XIImageHeight false
- [XIImageWidth 0 0 XIImageHeight neg 0 0]
- /XIDataProc load
- imagemask
-} def
-/XIImageTint {
- XIImageWidth XIImageHeight XIBitsPerPixel
- [XIImageWidth 0 0 XIImageHeight neg 0 0]
- /XIDataProc load
- XIType 3 eq XIColorValues XIColorSpace ci6tintimage
-} def
-/XIImage {
- XIImageWidth XIImageHeight XIBitsPerPixel
- [XIImageWidth 0 0 XIImageHeight neg 0 0]
- /XIDataProc load
- false XIChannelCount XIPlateList ci6drawimage
-} def
-/XG {
- pop pop
-} def
-/XF {
- 13 {pop} repeat
-} def
-/Xh {
- Adobe_ColorImage_AI6_Vars begin
- gsave
- /XIType exch def
- /XIImageHeight exch def
- /XIImageWidth exch def
- /XIImageMatrix exch def
- 0 0 moveto
- XIImageMatrix concat
- XIImageWidth XIImageHeight scale
-
- /_lp /null ddef
- _fc
- /_lp /imagemask ddef
- end
-} def
-/XH {
- Adobe_ColorImage_AI6_Vars begin
- grestore
- end
-} def
-/XIEnable {
- Adobe_ColorImage_AI6_Vars /XIEnable 3 -1 roll put
-} def
-/XC {
- Adobe_ColorImage_AI6_Vars begin
- ci6colormake
- /XIColorSpace exch def
- /XIColorValues exch def
- end
-} def
-/XIPlates {
- Adobe_ColorImage_AI6_Vars begin
- /XIPlateList exch def
- end
-} def
-/XI
-{
- Adobe_ColorImage_AI6_Vars begin
- gsave
- /XIType exch def
- cvi dup
- 256 idiv /XICompression exch store
- 256 mod /XIEncoding exch store
- pop pop
- /XIChannelCount exch def
- /XIBitsPerPixel exch def
- /XIImageHeight exch def
- /XIImageWidth exch def
- pop pop pop pop
- /XIImageMatrix exch def
- XIBitsPerPixel 1 eq {
- XIImageWidth 8 div ceiling cvi
- }{
- XIImageWidth XIChannelCount mul
- } ifelse
- /XIRowBytes exch def
- XIEnable {
- /XIBuffer3 XIImageWidth string def
- XICompression 0 eq {
- /XIBuffer1 XIRowBytes string def
- XIEncoding 0 eq {
- {currentfile XIBuffer1 readhexstring pop}
- }{
- {currentfile XIBuffer1 readstring pop}
- } ifelse
- }{
- /XIBuffer1 256 string def
- /XIBuffer2 XIRowBytes string def
- {currentfile XIBuffer1 readline pop (%) anchorsearch {pop} if}
- /ASCII85Decode filter /DCTDecode filter
- /XIFile exch def
- {XIFile XIBuffer2 readstring pop}
- } ifelse
- /XIDataProc exch def
-
- XIType 1 ne {
- 0 setgray
- } if
- XIType 1 eq {
- XIImageMask
- }{
- XIType 2 eq XIType 3 eq or {
- XIImageTint
- }{
- XIImage
- } ifelse
- } ifelse
- }{
- XINullImage
- } ifelse
- /XIPlateList false def
- grestore
- end
-} def
-end
-%%EndProcSet
-%%BeginResource: procset Adobe_Illustrator_AI5 1.3 0
-%%Title: (Adobe Illustrator (R) Version 8.0 Full Prolog)
-%%Version: 1.3 0
-%%CreationDate: (3/7/1994) ()
-%%Copyright: ((C) 1987-1998 Adobe Systems Incorporated All Rights Reserved)
-currentpacking true setpacking
-userdict /Adobe_Illustrator_AI5_vars 112 dict dup begin
-put
-/_?cmyk false def
-/_eo false def
-/_lp /none def
-/_pf
-{
-} def
-/_ps
-{
-} def
-/_psf
-{
-} def
-/_pss
-{
-} def
-/_pjsf
-{
-} def
-/_pjss
-{
-} def
-/_pola 0 def
-/_doClip 0 def
-/cf currentflat def
-/_lineorientation 0 def
-/_charorientation 0 def
-/_yokoorientation 0 def
-/_tm matrix def
-/_renderStart
-[
-/e0 /r0 /a0 /o0 /e1 /r1 /a1 /i0
-] def
-/_renderEnd
-[
-null null null null /i1 /i1 /i1 /i1
-] def
-/_render -1 def
-/_shift [0 0] def
-/_ax 0 def
-/_ay 0 def
-/_cx 0 def
-/_cy 0 def
-/_leading
-[
-0 0
-] def
-/_ctm matrix def
-/_mtx matrix def
-/_sp 16#020 def
-/_hyphen (-) def
-/_fontSize 0 def
-/_fontAscent 0 def
-/_fontDescent 0 def
-/_fontHeight 0 def
-/_fontRotateAdjust 0 def
-/Ss 256 string def
-Ss 0 (fonts/) putinterval
-/_cnt 0 def
-/_scale [1 1] def
-/_nativeEncoding 0 def
-/_useNativeEncoding 0 def
-/_tempEncode 0 def
-/_pntr 0 def
-/_tDict 2 dict def
-/_hfname 100 string def
-/_hffound false def
-/Tx
-{
-} def
-/Tj
-{
-} def
-/CRender
-{
-} def
-/_AI3_savepage
-{
-} def
-/_gf null def
-/_cf 4 array def
-/_rgbf 3 array def
-/_if null def
-/_of false def
-/_fc
-{
-} def
-/_gs null def
-/_cs 4 array def
-/_rgbs 3 array def
-/_is null def
-/_os false def
-/_sc
-{
-} def
-/_pd 1 dict def
-/_ed 15 dict def
-/_pm matrix def
-/_fm null def
-/_fd null def
-/_fdd null def
-/_sm null def
-/_sd null def
-/_sdd null def
-/_i null def
-/_lobyte 0 def
-/_hibyte 0 def
-/_cproc null def
-/_cscript 0 def
-/_hvax 0 def
-/_hvay 0 def
-/_hvwb 0 def
-/_hvcx 0 def
-/_hvcy 0 def
-/_bitfont null def
-/_bitlobyte 0 def
-/_bithibyte 0 def
-/_bitkey null def
-/_bitdata null def
-/_bitindex 0 def
-/discardSave null def
-/buffer 256 string def
-/beginString null def
-/endString null def
-/endStringLength null def
-/layerCnt 1 def
-/layerCount 1 def
-/perCent (%) 0 get def
-/perCentSeen? false def
-/newBuff null def
-/newBuffButFirst null def
-/newBuffLast null def
-/clipForward? false def
-end
-userdict /Adobe_Illustrator_AI5 known not {
- userdict /Adobe_Illustrator_AI5 100 dict put
-} if
-userdict /Adobe_Illustrator_AI5 get begin
-/initialize
-{
- Adobe_Illustrator_AI5 dup begin
- Adobe_Illustrator_AI5_vars begin
- /_aicmykps where {pop /_?cmyk _aicmykps def}if
- discardDict
- {
- bind pop pop
- } forall
- dup /nc get begin
- {
- dup xcheck 1 index type /operatortype ne and
- {
- bind
- } if
- pop pop
- } forall
- end
- newpath
-} def
-/terminate
-{
- end
- end
-} def
-/_
-null def
-/ddef
-{
- Adobe_Illustrator_AI5_vars 3 1 roll put
-} def
-/xput
-{
- dup load dup length exch maxlength eq
- {
- dup dup load dup
- length 2 mul dict copy def
- } if
- load begin
- def
- end
-} def
-/npop
-{
- {
- pop
- } repeat
-} def
-/hswj
-{
- dup stringwidth 3 2 roll
- {
- _hvwb eq { exch _hvcx add exch _hvcy add } if
- exch _hvax add exch _hvay add
- } cforall
-} def
-/vswj
-{
- 0 0 3 -1 roll
- {
- dup 255 le
- _charorientation 1 eq
- and
- {
- dup cstring stringwidth 5 2 roll
- _hvwb eq { exch _hvcy sub exch _hvcx sub } if
- exch _hvay sub exch _hvax sub
- 4 -1 roll sub exch
- 3 -1 roll sub exch
- }
- {
- _hvwb eq { exch _hvcy sub exch _hvcx sub } if
- exch _hvay sub exch _hvax sub
- _fontHeight sub
- } ifelse
- } cforall
-} def
-/swj
-{
- 6 1 roll
- /_hvay exch ddef
- /_hvax exch ddef
- /_hvwb exch ddef
- /_hvcy exch ddef
- /_hvcx exch ddef
- _lineorientation 0 eq { hswj } { vswj } ifelse
-} def
-/sw
-{
- 0 0 0 6 3 roll swj
-} def
-/vjss
-{
- 4 1 roll
- {
- dup cstring
- dup length 1 eq
- _charorientation 1 eq
- and
- {
- -90 rotate
- currentpoint
- _fontRotateAdjust add
- moveto
- gsave
- false charpath currentpoint
- 5 index setmatrix stroke
- grestore
- _fontRotateAdjust sub
- moveto
- _sp eq
- {
- 5 index 5 index rmoveto
- } if
- 2 copy rmoveto
- 90 rotate
- }
- {
- currentpoint
- _fontHeight sub
- 5 index sub
- 3 index _sp eq
- {
- 9 index sub
- } if
-
- currentpoint
- exch 4 index stringwidth pop 2 div sub
- exch _fontAscent sub
- moveto
-
- gsave
- 2 index false charpath
- 6 index setmatrix stroke
- grestore
-
- moveto pop pop
- } ifelse
- } cforall
- 6 npop
-} def
-/hjss
-{
- 4 1 roll
- {
- dup cstring
- gsave
- false charpath currentpoint
- 5 index setmatrix stroke
- grestore
- moveto
- _sp eq
- {
- 5 index 5 index rmoveto
- } if
- 2 copy rmoveto
- } cforall
- 6 npop
-} def
-/jss
-{
- _lineorientation 0 eq { hjss } { vjss } ifelse
-} def
-/ss
-{
- 0 0 0 7 3 roll jss
-} def
-/vjsp
-{
- 4 1 roll
- {
- dup cstring
- dup length 1 eq
- _charorientation 1 eq
- and
- {
- -90 rotate
- currentpoint
- _fontRotateAdjust add
- moveto
- false charpath
- currentpoint
- _fontRotateAdjust sub
- moveto
- _sp eq
- {
- 5 index 5 index rmoveto
- } if
- 2 copy rmoveto
- 90 rotate
- }
- {
- currentpoint
- _fontHeight sub
- 5 index sub
- 3 index _sp eq
- {
- 9 index sub
- } if
-
- currentpoint
- exch 4 index stringwidth pop 2 div sub
- exch _fontAscent sub
- moveto
-
- 2 index false charpath
-
- moveto pop pop
- } ifelse
- } cforall
- 6 npop
-} def
-/hjsp
-{
- 4 1 roll
- {
- dup cstring
- false charpath
- _sp eq
- {
- 5 index 5 index rmoveto
- } if
- 2 copy rmoveto
- } cforall
- 6 npop
-} def
-/jsp
-{
- matrix currentmatrix
- _lineorientation 0 eq {hjsp} {vjsp} ifelse
-} def
-/sp
-{
- matrix currentmatrix
- 0 0 0 7 3 roll
- _lineorientation 0 eq {hjsp} {vjsp} ifelse
-} def
-/pl
-{
- transform
- 0.25 sub round 0.25 add exch
- 0.25 sub round 0.25 add exch
- itransform
-} def
-/setstrokeadjust where
-{
- pop true setstrokeadjust
- /c
- {
- curveto
- } def
- /C
- /c load def
- /v
- {
- currentpoint 6 2 roll curveto
- } def
- /V
- /v load def
- /y
- {
- 2 copy curveto
- } def
- /Y
- /y load def
- /l
- {
- lineto
- } def
- /L
- /l load def
- /m
- {
- moveto
- } def
-}
-{
- /c
- {
- pl curveto
- } def
- /C
- /c load def
- /v
- {
- currentpoint 6 2 roll pl curveto
- } def
- /V
- /v load def
- /y
- {
- pl 2 copy curveto
- } def
- /Y
- /y load def
- /l
- {
- pl lineto
- } def
- /L
- /l load def
- /m
- {
- pl moveto
- } def
-} ifelse
-/d
-{
- setdash
-} def
-/cf
-{
-} def
-/i
-{
- dup 0 eq
- {
- pop cf
- } if
- setflat
-} def
-/j
-{
- setlinejoin
-} def
-/J
-{
- setlinecap
-} def
-/M
-{
- setmiterlimit
-} def
-/w
-{
- setlinewidth
-} def
-/XR
-{
- 0 ne
- /_eo exch ddef
-} def
-/H
-{
-} def
-/h
-{
- closepath
-} def
-/N
-{
- _pola 0 eq
- {
- _doClip 1 eq
- {
- _eo {eoclip} {clip} ifelse /_doClip 0 ddef
- } if
- newpath
- }
- {
- /CRender
- {
- N
- } ddef
- } ifelse
-} def
-/n
-{
- N
-} def
-/F
-{
- _pola 0 eq
- {
- _doClip 1 eq
- {
- gsave _pf grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _fc
- /_doClip 0 ddef
- }
- {
- _pf
- } ifelse
- }
- {
- /CRender
- {
- F
- } ddef
- } ifelse
-} def
-/f
-{
- closepath
- F
-} def
-/S
-{
- _pola 0 eq
- {
- _doClip 1 eq
- {
- gsave _ps grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc
- /_doClip 0 ddef
- }
- {
- _ps
- } ifelse
- }
- {
- /CRender
- {
- S
- } ddef
- } ifelse
-} def
-/s
-{
- closepath
- S
-} def
-/B
-{
- _pola 0 eq
- {
- _doClip 1 eq
- gsave F grestore
- {
- gsave S grestore _eo {eoclip} {clip} ifelse newpath /_lp /none ddef _sc
- /_doClip 0 ddef
- }
- {
- S
- } ifelse
- }
- {
- /CRender
- {
- B
- } ddef
- } ifelse
-} def
-/b
-{
- closepath
- B
-} def
-/W
-{
- /_doClip 1 ddef
-} def
-/*
-{
- count 0 ne
- {
- dup type /stringtype eq
- {
- pop
- } if
- } if
- newpath
-} def
-/u
-{
-} def
-/U
-{
-} def
-/q
-{
- _pola 0 eq
- {
- gsave
- } if
-} def
-/Q
-{
- _pola 0 eq
- {
- grestore
- } if
-} def
-/*u
-{
- _pola 1 add /_pola exch ddef
-} def
-/*U
-{
- _pola 1 sub /_pola exch ddef
- _pola 0 eq
- {
- CRender
- } if
-} def
-/D
-{
- pop
-} def
-/*w
-{
-} def
-/*W
-{
-} def
-/`
-{
- /_i save ddef
- clipForward?
- {
- nulldevice
- } if
- 6 1 roll 4 npop
- concat pop
- userdict begin
- /showpage
- {
- } def
- 0 setgray
- 0 setlinecap
- 1 setlinewidth
- 0 setlinejoin
- 10 setmiterlimit
- [] 0 setdash
- /setstrokeadjust where {pop false setstrokeadjust} if
- newpath
- 0 setgray
- false setoverprint
-} def
-/~
-{
- end
- _i restore
-} def
-/_rgbtocmyk
-{
- 3
- {
- 1 exch sub 3 1 roll
- } repeat
- 3 copy 1 4 1 roll
- 3
- {
- 3 index 2 copy gt
- {
- exch
- } if
- pop 4 1 roll
- } repeat
- pop pop pop
- 4 1 roll
- 3
- {
- 3 index sub
- 3 1 roll
- } repeat
- 4 -1 roll
-} def
-/setrgbfill
-{
- _rgbf astore pop
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _rgbf aload pop setrgbcolor
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/setrgbstroke
-{
- _rgbs astore pop
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _rgbs aload pop setrgbcolor
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/O
-{
- 0 ne
- /_of exch ddef
- /_lp /none ddef
-} def
-/R
-{
- 0 ne
- /_os exch ddef
- /_lp /none ddef
-} def
-/g
-{
- /_gf exch ddef
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _gf setgray
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/G
-{
- /_gs exch ddef
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _gs setgray
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/k
-{
- _cf astore pop
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _cf aload pop setcmykcolor
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/K
-{
- _cs astore pop
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _cs aload pop setcmykcolor
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/Xa
-{
- _?cmyk {
- 3 npop k
- }{
- setrgbfill 4 npop
- } ifelse
-} def
-/XA
-{
- _?cmyk {
- 3 npop K
- }{
- setrgbstroke 4 npop
- } ifelse
-} def
-/Xs
-{
- /_gf exch ddef
- 5 npop
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _gf setAIseparationgray
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/XS
-{
- /_gs exch ddef
- 5 npop
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _gs setAIseparationgray
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/Xx
-{
- exch
- /_gf exch ddef
- 0 eq {
- findcmykcustomcolor
- }{
- _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse
- {
- 4 1 roll 3 npop
- findcmykcustomcolor
- }{
- 8 -4 roll 4 npop
- findrgbcustomcolor
- } ifelse
- } ifelse
- /_if exch ddef
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _if _gf 1 exch sub setcustomcolor
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/XX
-{
- exch
- /_gs exch ddef
- 0 eq {
- findcmykcustomcolor
- }{
- _?cmyk {true}{/findrgbcustomcolor where{pop false}{true}ifelse}ifelse
- {
- 4 1 roll 3 npop
- findcmykcustomcolor
- }{
- 8 -4 roll 4 npop
- findrgbcustomcolor
- } ifelse
- } ifelse
- /_is exch ddef
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _is _gs 1 exch sub setcustomcolor
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/x
-{
- /_gf exch ddef
- findcmykcustomcolor
- /_if exch ddef
- /_fc
- {
- _lp /fill ne
- {
- _of setoverprint
- _if _gf 1 exch sub setcustomcolor
- /_lp /fill ddef
- } if
- } ddef
- /_pf
- {
- _fc
- _eo {eofill} {fill} ifelse
- } ddef
- /_psf
- {
- _fc
- hvashow
- } ddef
- /_pjsf
- {
- _fc
- hvawidthshow
- } ddef
- /_lp /none ddef
-} def
-/X
-{
- /_gs exch ddef
- findcmykcustomcolor
- /_is exch ddef
- /_sc
- {
- _lp /stroke ne
- {
- _os setoverprint
- _is _gs 1 exch sub setcustomcolor
- /_lp /stroke ddef
- } if
- } ddef
- /_ps
- {
- _sc
- stroke
- } ddef
- /_pss
- {
- _sc
- ss
- } ddef
- /_pjss
- {
- _sc
- jss
- } ddef
- /_lp /none ddef
-} def
-/XK
-{
- 3 -1 roll pop
- 0 eq
- {
- 1 exch sub
- 3 {dup 3 1 roll mul 5 1 roll} repeat
- mul 4 1 roll
- K
- }
- {
- 1 exch sub 4 1 roll
- 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat
- 4 -1 roll pop
- XA
- } ifelse
-} def
-/Xk
-{
- 3 -1 roll pop
- 0 eq
- {
- 1 exch sub
- 3 {dup 3 1 roll mul 5 1 roll} repeat
- mul 4 1 roll
- k
- }
- {
- 1 exch sub 4 1 roll
- 3 {1 exch sub 3 index mul 1 exch sub 3 1 roll} repeat
- 4 -1 roll pop
- Xa
- } ifelse
-} def
-/A
-{
- pop
-} def
-/annotatepage
-{
-userdict /annotatepage 2 copy known {get exec} {pop pop} ifelse
-} def
-/XT {
- pop pop
-} def
-/Xt {
- pop
-} def
-/discard
-{
- save /discardSave exch store
- discardDict begin
- /endString exch store
- gt38?
- {
- 2 add
- } if
- load
- stopped
- pop
- end
- discardSave restore
-} bind def
-userdict /discardDict 7 dict dup begin
-put
-/pre38Initialize
-{
- /endStringLength endString length store
- /newBuff buffer 0 endStringLength getinterval store
- /newBuffButFirst newBuff 1 endStringLength 1 sub getinterval store
- /newBuffLast newBuff endStringLength 1 sub 1 getinterval store
-} def
-/shiftBuffer
-{
- newBuff 0 newBuffButFirst putinterval
- newBuffLast 0
- currentfile read not
- {
- stop
- } if
- put
-} def
-0
-{
- pre38Initialize
- mark
- currentfile newBuff readstring exch pop
- {
- {
- newBuff endString eq
- {
- cleartomark stop
- } if
- shiftBuffer
- } loop
- }
- {
- stop
- } ifelse
-} def
-1
-{
- pre38Initialize
- /beginString exch store
- mark
- currentfile newBuff readstring exch pop
- {
- {
- newBuff beginString eq
- {
- /layerCount dup load 1 add store
- }
- {
- newBuff endString eq
- {
- /layerCount dup load 1 sub store
- layerCount 0 eq
- {
- cleartomark stop
- } if
- } if
- } ifelse
- shiftBuffer
- } loop
- } if
-} def
-2
-{
- mark
- {
- currentfile buffer {readline} stopped {
- % assume error was due to overfilling the buffer
- }{
- not
- {
- stop
- } if
- endString eq {
- cleartomark stop
- } if
- }ifelse
- } loop
-} def
-3
-{
- /beginString exch store
- /layerCnt 1 store
- mark
- {
- currentfile buffer {readline} stopped {
- % assume error was due to overfilling the buffer
- }{
- not
- {
- stop
- } if
- dup beginString eq
- {
- pop /layerCnt dup load 1 add store
- }
- {
- endString eq
- {
- layerCnt 1 eq
- {
- cleartomark stop
- }
- {
- /layerCnt dup load 1 sub store
- } ifelse
- } if
- } ifelse
- }ifelse
- } loop
-} def
-end
-userdict /clipRenderOff 15 dict dup begin
-put
-{
- /n /N /s /S /f /F /b /B
-}
-{
- {
- _doClip 1 eq
- {
- /_doClip 0 ddef _eo {eoclip} {clip} ifelse
- } if
- newpath
- } def
-} forall
-/Tr /pop load def
-/Bb {} def
-/BB /pop load def
-/Bg {12 npop} def
-/Bm {6 npop} def
-/Bc /Bm load def
-/Bh {4 npop} def
-end
-/Lb
-{
- 6 npop
- 7 2 roll
- 5 npop
- 0 eq
- {
- 0 eq
- {
- (%AI5_BeginLayer) 1 (%AI5_EndLayer--) discard
- }
- {
-
- /clipForward? true def
-
- /Tx /pop load def
- /Tj /pop load def
-
- currentdict end clipRenderOff begin begin
- } ifelse
- }
- {
- 0 eq
- {
- save /discardSave exch store
- } if
- } ifelse
-} bind def
-/LB
-{
- discardSave dup null ne
- {
- restore
- }
- {
- pop
- clipForward?
- {
- currentdict
- end
- end
- begin
-
- /clipForward? false ddef
- } if
- } ifelse
-} bind def
-/Pb
-{
- pop pop
- 0 (%AI5_EndPalette) discard
-} bind def
-/Np
-{
- 0 (%AI5_End_NonPrinting--) discard
-} bind def
-/Ln /pop load def
-/Ap
-/pop load def
-/Ar
-{
- 72 exch div
- 0 dtransform dup mul exch dup mul add sqrt
- dup 1 lt
- {
- pop 1
- } if
- setflat
-} def
-/Mb
-{
- q
-} def
-/Md
-{
-} def
-/MB
-{
- Q
-} def
-/nc 4 dict def
-nc begin
-/setgray
-{
- pop
-} bind def
-/setcmykcolor
-{
- 4 npop
-} bind def
-/setrgbcolor
-{
- 3 npop
-} bind def
-/setcustomcolor
-{
- 2 npop
-} bind def
-currentdict readonly pop
-end
-/XP
-{
- 4 npop
-} bind def
-/XD
-{
- pop
-} bind def
-end
-setpacking
-%%EndResource
-%%BeginResource: procset Adobe_cshow 2.0 8
-%%Title: (Writing System Operators)
-%%Version: 2.0 8
-%%CreationDate: (1/23/89) ()
-%%Copyright: ((C) 1992-1996 Adobe Systems Incorporated All Rights Reserved)
-currentpacking true setpacking
-userdict /Adobe_cshow 14 dict dup begin put
-/initialize
-{
- Adobe_cshow begin
- Adobe_cshow
- {
- dup xcheck
- {
- bind
- } if
- pop pop
- } forall
- end
- Adobe_cshow begin
-} def
-/terminate
-{
-currentdict Adobe_cshow eq
- {
- end
- } if
-} def
-/cforall
-{
- /_lobyte 0 ddef
- /_hibyte 0 ddef
- /_cproc exch ddef
- /_cscript currentfont /FontScript known { currentfont /FontScript get } { -1 } ifelse ddef
- {
- /_lobyte exch ddef
- _hibyte 0 eq
- _cscript 1 eq
- _lobyte 129 ge _lobyte 159 le and
- _lobyte 224 ge _lobyte 252 le and or and
- _cscript 2 eq
- _lobyte 161 ge _lobyte 254 le and and
- _cscript 3 eq
- _lobyte 161 ge _lobyte 254 le and and
- _cscript 25 eq
- _lobyte 161 ge _lobyte 254 le and and
- _cscript -1 eq
- or or or or and
- {
- /_hibyte _lobyte ddef
- }
- {
- _hibyte 256 mul _lobyte add
- _cproc
- /_hibyte 0 ddef
- } ifelse
- } forall
-} def
-/cstring
-{
- dup 256 lt
- {
- (s) dup 0 4 3 roll put
- }
- {
- dup 256 idiv exch 256 mod
- (hl) dup dup 0 6 5 roll put 1 4 3 roll put
- } ifelse
-} def
-/clength
-{
- 0 exch
- { 256 lt { 1 } { 2 } ifelse add } cforall
-} def
-/hawidthshow
-{
- {
- dup cstring
- show
- _hvax _hvay rmoveto
- _hvwb eq { _hvcx _hvcy rmoveto } if
- } cforall
-} def
-/vawidthshow
-{
- {
- dup 255 le
- _charorientation 1 eq
- and
- {
- -90 rotate
- 0 _fontRotateAdjust rmoveto
- cstring
- _hvcx _hvcy _hvwb _hvax _hvay 6 -1 roll awidthshow
- 0 _fontRotateAdjust neg rmoveto
- 90 rotate
- }
- {
- currentpoint
- _fontHeight sub
- exch _hvay sub exch _hvax sub
- 2 index _hvwb eq { exch _hvcy sub exch _hvcx sub } if
- 3 2 roll
- cstring
- dup stringwidth pop 2 div neg _fontAscent neg rmoveto
- show
- moveto
- } ifelse
- } cforall
-} def
-/hvawidthshow
-{
- 6 1 roll
- /_hvay exch ddef
- /_hvax exch ddef
- /_hvwb exch ddef
- /_hvcy exch ddef
- /_hvcx exch ddef
- _lineorientation 0 eq { hawidthshow } { vawidthshow } ifelse
-} def
-/hvwidthshow
-{
- 0 0 3 -1 roll hvawidthshow
-} def
-/hvashow
-{
- 0 0 0 6 -3 roll hvawidthshow
-} def
-/hvshow
-{
- 0 0 0 0 0 6 -1 roll hvawidthshow
-} def
-currentdict readonly pop end
-setpacking
-%%EndResource
-%%BeginResource: procset Adobe_shading_AI8 1.0 0
-%%Title: (Adobe Illustrator 8 Shading Procset)
-%%Version: 1.0 0
-%%CreationDate: (12/17/97) ()
-%%Copyright: ((C) 1987-1997 Adobe Systems Incorporated All Rights Reserved)
-userdict /defaultpacking currentpacking put true setpacking
-userdict /Adobe_shading_AI8 10 dict dup begin put
-/initialize {
- Adobe_shading_AI8 begin
- Adobe_shading_AI8 bdprocs
- Mesh /initialize get exec
-} def
-/terminate {
- currentdict Adobe_shading_AI8 eq {
- end
- } if
-} def
-/bdprocs {
- {
- dup xcheck 1 index type /arraytype eq and {
- bind
- } if
- pop pop
- } forall
-} def
-/X! {pop} def
-/X# {pop pop} def
-/Mesh 40 dict def
-Mesh begin
-/initialize {
- Mesh bdprocs
- Mesh begin
- /emulate? /AI8MeshEmulation where {
- pop AI8MeshEmulation
- }{
- systemdict /shfill known not
- } ifelse def
- end
-} def
-/bd {
- shadingdict begin
-} def
-/paint {
- emulate? {
- end
- }{
- /_lp /none ddef _fc /_lp /none ddef
-
- /AIColorSpace AIColorSpace tocolorspace store
- /ColorSpace AIColorSpace topsspace store
-
- version_ge_3010.106 not systemdict /setsmoothness known and {
- 0.0001 setsmoothness
- } if
-
- composite? {
- /DataSource getdatasrc def
- Matrix concat
- currentdict end
- shfill
- }{
- AIColorSpace makesmarks AIPlateList markingplate and not isoverprint and {
- end
- }{
- /ColorSpace /DeviceGray store
- /Decode [0 1 0 1 0 1] store
- /DataSource getplatesrc def
- Matrix concat
- currentdict end
- shfill
- } ifelse
- } ifelse
- } ifelse
-} def
-/shadingdict 12 dict def
-shadingdict begin
- /ShadingType 6 def
- /BitsPerCoordinate 16 def
- /BitsPerComponent 8 def
- /BitsPerFlag 8 def
-end
-/datafile null def
-/databuf 256 string def
-/dataptr 0 def
-/srcspace null def
-/srcchannels 0 def
-/dstchannels 0 def
-/dstplate 0 def
-/srctodstcolor null def
-/getplatesrc {
- /srcspace AIColorSpace store
- /srcchannels AIColorSpace getnchannels store
- /dstchannels 1 store
- /dstplate getplateindex store
- /srctodstcolor srcspace makesmarks {
- dstplate 4 eq {
- {1 exch sub}
- }{
- {srcspace tocmyk 3 dstplate sub index 1 exch sub 5 1 roll 4 {pop} repeat}
- } ifelse
- }{
- {srcchannels {pop} repeat 1}
- } ifelse store
- /datafile getdatasrc store
- /rdpatch168 load DataLength () /SubFileDecode filter
-} def
-/getdatasrc {
- /rdcmntline load /ASCII85Decode filter
-} def
-/rdpatch168 {
- /dataptr 0 store
- 49 rdcount
- 4 {
- dup {pop srcchannels getint8} if
- dup {pop srctodstcolor dstchannels putint8 true} if
- } repeat
- {databuf 0 dataptr getinterval}{()} ifelse
-} def
-/rdpatch3216 {
- /dataptr 0 store
- 97 rdcount
- 4 {
- dup {pop srcchannels getint16} if
- dup {pop srctodstcolor dstchannels putint16 true} if
- } repeat
- {databuf 0 dataptr getinterval}{()} ifelse
-} def
-/rdcount {
- dup 0 gt {
- datafile databuf dataptr 4 -1 roll getinterval readstring
- exch length dataptr add /dataptr exch store
- }{
- true
- } ifelse
-} def
-/getint8 {
- mark true 3 -1 roll
- {
- dup {pop datafile read} if
- dup {pop 255 div true} if
- } repeat
- {
- counttomark 1 add -1 roll pop true
- }{
- cleartomark false
- } ifelse
-} def
-/putint8 {
- dup dataptr add /dataptr exch store
- dataptr exch
- {
- 1 sub exch
- 255 mul cvi
- databuf 2 index
- 3 -1 roll put
- } repeat
- pop
-} def
-/getint16 {
- mark true 3 -1 roll
- {
- dup {pop datafile read} if
- dup {pop 256 mul datafile read} if
- dup {pop add 65535 div true} if
- } repeat
- {
- counttomark 1 add -1 roll pop true
- }{
- cleartomark false
- } ifelse
-} def
-/putint16 {
- dup 2 mul dataptr add /dataptr exch store
- dataptr exch
- {
- 2 sub exch
- 65535 mul cvi dup
- 256 idiv databuf 3 index 3 -1 roll put
- 256 mod databuf 2 index 1 add 3 -1 roll put
- } repeat
- pop
-} def
-/srcbuf 256 string def
-/rdcmntline {
- currentfile srcbuf readline pop
- (%) anchorsearch {pop} if
-} def
-/getplateindex {
- 0 [cyan? magenta? yellow? black? customColor?] {{exit} if 1 add} forall
-} def
-/aicsarray 4 array def
-/aicsaltvals 4 array def
-/aicsaltcolr aicsaltvals def
-/tocolorspace {
- dup type /arraytype eq {
- mark exch aload pop
- aicsarray 0 3 -1 roll put
- aicsarray 1 3 -1 roll put
- dup aicsarray 2 3 -1 roll put
- gettintxform aicsarray 3 3 -1 roll put
- counttomark aicsaltvals 0 3 -1 roll getinterval /aicsaltcolr exch store
- aicsaltcolr astore pop pop
- aicsarray
- } if
-} def
-/subtintxform {aicsaltcolr {1 index mul exch} forall pop} def
-/addtintxform {aicsaltcolr {1 sub 1 index mul 1 add exch} forall pop} def
-/gettintxform {
- /DeviceRGB eq {/addtintxform}{/subtintxform} ifelse load
-} def
-/getnchannels {
- dup type /arraytype eq {0 get} if
- colorspacedict exch get begin Channels end
-} def
-/makesmarks {
- composite? {
- pop true
- }{
- dup dup type /arraytype eq {0 get} if
- colorspacedict exch get begin MarksPlate end
- } ifelse
-} def
-/markingplate {
- composite? {
- pop true
- }{
- dup type /arraytype eq {
- dup length getplateindex gt {getplateindex get}{pop false} ifelse
- } if
- } ifelse
-} def
-/tocmyk {
- dup dup type /arraytype eq {0 get} if
- colorspacedict exch get begin ToCMYK end
-} def
-/topsspace {
- dup dup type /arraytype eq {0 get} if
- colorspacedict exch get begin ToPSSpace end
-} def
-/colorspacedict 5 dict dup begin
- /DeviceGray 4 dict dup begin
- /Channels 1 def
- /MarksPlate {pop black?} def
- /ToCMYK {pop 1 exch sub 0 0 0 4 -1 roll} def
- /ToPSSpace {} def
- end def
- /DeviceRGB 4 dict dup begin
- /Channels 3 def
- /MarksPlate {pop isCMYKSep?} def
- /ToCMYK {pop _rgbtocmyk} def
- /ToPSSpace {} def
- end def
- /DeviceCMYK 4 dict dup begin
- /Channels 4 def
- /MarksPlate {pop isCMYKSep?} def
- /ToCMYK {pop} def
- /ToPSSpace {} def
- end def
- /Separation 4 dict dup begin
- /Channels 1 def
- /MarksPlate {
- /findcmykcustomcolor where {
- pop dup 1 exch ToCMYK 5 -1 roll 1 get
- findcmykcustomcolor 1 setcustomcolor
- systemdict /currentgray get exec
- 1 ne
- }{
- pop false
- } ifelse
- } def
- /ToCMYK {
- dup 2 get mark exch 4 2 roll
- 3 get exec
- counttomark -1 roll tocmyk
- 5 -1 roll pop
- } def
- /ToPSSpace {} def
- end def
- /Process 4 dict dup begin
- /Channels 1 def
- /MarksPlate {
- isCMYKSep? {
- 1 exch ToCMYK 4 array astore getplateindex get 0 ne
- }{
- pop false
- } ifelse
- } def
- /ToCMYK {
- dup 2 get mark exch 4 2 roll
- 3 get exec
- counttomark -1 roll tocmyk
- 5 -1 roll pop
- } def
- /ToPSSpace {
- 4 array copy dup 0 /Separation put
- } def
- end def
-end def
-/isoverprint {
- /currentoverprint where {pop currentoverprint}{_of} ifelse
-} def
-/version_ge_3010.106 {
- version {cvr} stopped {
- pop
- false
- }{
- 3010.106 ge
- } ifelse
-} def
-end
-end
-defaultpacking setpacking
-%%EndResource
-%%EndProlog
-%%BeginSetup
-%%IncludeFont: Helvetica
-userdict /_useSmoothShade false put
-userdict /_aicmykps true put
-userdict /_forceToCMYK true put
-Adobe_level2_AI5 /initialize get exec
-Adobe_cshow /initialize get exec
-Adobe_Illustrator_AI5_vars Adobe_Illustrator_AI5 Adobe_typography_AI5 /initialize get exec
-Adobe_ColorImage_AI6 /initialize get exec
-Adobe_shading_AI8 /initialize get exec
-Adobe_Illustrator_AI5 /initialize get exec
-[
-39/quotesingle 96/grave 128/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis
-/Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute
-/egrave/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde
-/oacute/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex
-/udieresis/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
-/registered/copyright/trademark/acute/dieresis/.notdef/AE/Oslash
-/.notdef/plusminus/.notdef/.notdef/yen/mu/.notdef/.notdef
-/.notdef/.notdef/.notdef/ordfeminine/ordmasculine/.notdef/ae/oslash
-/questiondown/exclamdown/logicalnot/.notdef/florin/.notdef/.notdef
-/guillemotleft/guillemotright/ellipsis/space/Agrave/Atilde/Otilde/OE/oe
-/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide
-/.notdef/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright
-/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand
-/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex
-/Idieresis/Igrave/Oacute/Ocircumflex/.notdef/Ograve/Uacute/Ucircumflex
-/Ugrave/dotlessi/circumflex/tilde/macron/breve/dotaccent/ring/cedilla
-/hungarumlaut/ogonek/caron
-TE
-%AI55J_Tsume: None
-%AI3_BeginEncoding: _Helvetica Helvetica
-[/_Helvetica/Helvetica 0 0 1 TZ
-%AI3_EndEncoding AdobeType
-[161/degree 173/notequal 176/infinity/plusminus/lessequal/greaterequal
-181/mu/partialdiff/summation/product/pi/integral 189/Omega
-195/radical 197/approxequal 198/Delta 214/divide/lozenge 240/apple
-/_Symbol_/Symbol 0 0 0 TZ
-%AI5_Begin_NonPrinting
-Np
-%AI3_BeginPattern: (bi-direction diagonals)
-(bi-direction diagonals) 24.2119 0.2119 96.2124 72.2119 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-2 J 2 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-8.2119 6.2119 m
-14.2119 0.2119 L
-F
-8.2119 0.2119 m
-14.2119 6.2119 L
-F
-%AI6_EndPatternLayer
-) &
-(0 O 0 R 0 0 0 1 k
- 0 0 0 1 K
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-2 J 2 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-24.2119 72.2119 m
-96.2124 0.2119 L
-S
-21.2109 69.2129 m
-90.2124 0.2119 L
-S
-21.207 63.2168 m
-84.2124 0.2119 L
-S
-21.2031 57.2207 m
-78.2124 0.2119 L
-S
-21.1987 51.2246 m
-72.2124 0.2119 L
-S
-21.1958 45.2275 m
-66.2119 0.2119 L
-S
-21.1919 39.2314 m
-60.2119 0.2119 L
-S
-21.188 33.2363 m
-54.2119 0.2119 L
-S
-21.1851 27.2402 m
-48.2119 0.2119 L
-S
-21.1812 21.2432 m
-42.2119 0.2119 L
-S
-21.1768 15.2471 m
-36.2119 0.2119 L
-S
-21.1729 9.251 m
-30.2119 0.2119 L
-S
-21.1699 3.2549 m
-24.2119 0.2119 L
-S
-30.2119 72.2119 m
-99.2134 3.21 L
-S
-36.2119 72.2119 m
-99.2173 9.2061 L
-S
-42.2119 72.2119 m
-99.2212 15.2021 L
-S
-48.2119 72.2119 m
-99.2251 21.1992 L
-S
-54.2119 72.2119 m
-99.228 27.1953 L
-S
-60.2119 72.2119 m
-99.2319 33.1904 L
-S
-66.2119 72.2119 m
-99.2358 39.1865 L
-S
-72.2124 72.2119 m
-99.2397 45.1836 L
-S
-78.2124 72.2119 m
-99.2427 51.1797 L
-S
-84.2124 72.2119 m
-99.2466 57.1758 L
-S
-90.2124 72.2119 m
-99.2505 63.1719 L
-S
-96.2124 72.2119 m
-99.2554 69.1689 L
-S
-0.2119 68.7119 m
-10.2119 58.7119 L
-S
-96.2124 72.2119 m
-24.2119 0.2119 L
-S
-90.2124 72.2119 m
-21.2109 3.21 L
-S
-84.2124 72.2119 m
-21.207 9.2061 L
-S
-78.2124 72.2119 m
-21.2031 15.2021 L
-S
-72.2124 72.2119 m
-21.1987 21.1982 L
-S
-66.2119 72.2119 m
-21.1958 27.1953 L
-S
-60.2119 72.2119 m
-21.1919 33.1904 L
-S
-54.2119 72.2119 m
-21.188 39.1865 L
-S
-48.2119 72.2119 m
-21.1851 45.1826 L
-S
-42.2119 72.2119 m
-21.1812 51.1797 L
-S
-36.2119 72.2119 m
-21.1768 57.1758 L
-S
-30.2119 72.2119 m
-21.1729 63.1719 L
-S
-24.2119 72.2119 m
-21.1699 69.168 L
-S
-99.2134 69.2129 m
-30.2119 0.2119 L
-S
-99.2173 63.2168 m
-36.2119 0.2119 L
-S
-99.2212 57.2207 m
-42.2119 0.2119 L
-S
-99.2251 51.2246 m
-48.2119 0.2119 L
-S
-99.228 45.2275 m
-54.2119 0.2119 L
-S
-99.2319 39.2314 m
-60.2119 0.2119 L
-S
-99.2358 33.2363 m
-66.2119 0.2119 L
-S
-99.2397 27.2393 m
-72.2124 0.2119 L
-S
-99.2427 21.2432 m
-78.2124 0.2119 L
-S
-99.2466 15.2471 m
-84.2124 0.2119 L
-S
-99.2505 9.251 m
-90.2124 0.2119 L
-S
-99.2554 3.2539 m
-96.2124 0.2119 L
-S
-0.2119 58.7119 m
-10.2119 68.7119 L
-S
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI3_BeginPattern: (black dots)
-(black dots) 16 0.6885 88 72.6885 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-1 J 0 j 0.75 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-0 6.6885 m
-6 0.6885 L
-F
-0 0.6885 m
-6 6.6885 L
-F
-%AI6_EndPatternLayer
-) &
-(0 O 0 R 0 0 0 1 k
- 0 0 0 1 K
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-1 J 0 j 0.75 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-28.9365 3.1885 m
-28.9365 3.1885 l
-S
-17.125 3.375 m
-17.125 3.375 l
-S
-26.5 4.6885 m
-26.5 4.6885 l
-S
-35.6865 5.8135 m
-35.6865 5.8135 l
-S
-19.75 0.9385 m
-19.75 0.9385 l
-S
-23.125 7.3135 m
-23.125 7.3135 l
-S
-40.5615 2.4385 m
-40.5615 2.4385 l
-S
-43 1.125 m
-43 1.125 l
-S
-45.0615 5.4385 m
-45.0615 5.4385 l
-S
-56.875 6.375 m
-56.875 6.375 l
-S
-65.3115 5.0635 m
-65.3115 5.0635 l
-S
-51.0615 6.9385 m
-51.0615 6.9385 l
-S
-40.5615 6.9385 m
-40.5615 6.9385 l
-S
-31.1865 6.9385 m
-31.1865 6.9385 l
-S
-59.875 9.5635 m
-59.875 9.5635 l
-S
-62.6865 1.3135 m
-62.6865 1.3135 l
-S
-34.5615 0.9385 m
-34.5615 0.9385 l
-S
-48.4365 2.25 m
-48.4365 2.25 l
-S
-56.3115 0.75 m
-56.3115 0.75 l
-S
-66.625 24.5635 m
-66.625 24.5635 l
-S
-74.3115 24.9385 m
-74.3115 24.9385 l
-S
-78.8115 24.375 m
-78.8115 24.375 l
-S
-82.9365 2.0635 m
-82.9365 2.0635 l
-S
-68.3115 11.8135 m
-68.3115 11.8135 l
-S
-86.5 17.8135 m
-86.5 17.8135 l
-S
-87.0615 4.6885 m
-87.0615 4.6885 l
-S
-79.9365 19.875 m
-79.9365 19.875 l
-S
-77.875 1.125 m
-77.875 1.125 l
-S
-69.625 20.25 m
-69.625 20.25 l
-S
-67.75 6 m
-67.75 6 l
-S
-73.375 17.625 m
-73.375 17.625 l
-S
-76.9365 16.875 m
-76.9365 16.875 l
-S
-72.4365 3.375 m
-72.4365 3.375 l
-S
-77.3115 9.5635 m
-77.3115 9.5635 l
-S
-73.9365 11.25 m
-73.9365 11.25 l
-S
-83.125 7.875 m
-83.125 7.875 l
-S
-85.1865 12.75 m
-85.1865 12.75 l
-S
-81.0615 13.875 m
-81.0615 13.875 l
-S
-17.6865 16.125 m
-17.6865 16.125 l
-S
-45.25 10.3135 m
-45.25 10.3135 l
-S
-31.5615 21.375 m
-31.5615 21.375 l
-S
-20.875 11.8135 m
-20.875 11.8135 l
-S
-34.75 18.5635 m
-34.75 18.5635 l
-S
-25.75 21.9385 m
-25.75 21.9385 l
-S
-34.5615 24.5635 m
-34.5615 24.5635 l
-S
-37.375 16.3135 m
-37.375 16.3135 l
-S
-36.625 12.75 m
-36.625 12.75 l
-S
-23.125 17.25 m
-23.125 17.25 l
-S
-29.3115 12.375 m
-29.3115 12.375 l
-S
-31 15.75 m
-31 15.75 l
-S
-46.1865 22.875 m
-46.1865 22.875 l
-S
-52 15.375 m
-52 15.375 l
-S
-58.375 13.3135 m
-58.375 13.3135 l
-S
-62.6865 20.0635 m
-62.6865 20.0635 l
-S
-62.875 14.0635 m
-62.875 14.0635 l
-S
-44.6865 20.4385 m
-44.6865 20.4385 l
-S
-46.75 15.1885 m
-46.75 15.1885 l
-S
-42.0615 17.0635 m
-42.0615 17.0635 l
-S
-55.1865 17.4385 m
-55.1865 17.4385 l
-S
-58.9365 23.25 m
-58.9365 23.25 l
-S
-60.0615 17.4385 m
-60.0615 17.4385 l
-S
-42.4365 25.125 m
-42.4365 25.125 l
-S
-65.3115 20.625 m
-65.3115 20.625 l
-S
-51.625 24.5635 m
-51.625 24.5635 l
-S
-52 20.625 m
-52 20.625 l
-S
-18.8115 24 m
-18.8115 24 l
-S
-21.25 24.9385 m
-21.25 24.9385 l
-S
-19.375 70.875 m
-19.375 70.875 l
-S
-26.125 66.5635 m
-26.125 66.5635 l
-S
-20.125 66.375 m
-20.125 66.375 l
-S
-38.5 69 m
-38.5 69 l
-S
-47.125 71.625 m
-47.125 71.625 l
-S
-62.875 68.0635 m
-62.875 68.0635 l
-S
-49.75 67.5 m
-49.75 67.5 l
-S
-38.875 65.625 m
-38.875 65.625 l
-S
-29.3115 70.3135 m
-29.3115 70.3135 l
-S
-31.9365 67.5 m
-31.9365 67.5 l
-S
-57.25 65.4385 m
-57.25 65.4385 l
-S
-23.5 69.1885 m
-23.5 69.1885 l
-S
-45.625 65.25 m
-45.625 65.25 l
-S
-26.6865 63.9385 m
-26.6865 63.9385 l
-S
-50.5 63.75 m
-50.5 63.75 l
-S
-32.6865 72 m
-32.6865 72 l
-S
-52.9365 71.4385 m
-52.9365 71.4385 l
-S
-57.8115 69.375 m
-57.8115 69.375 l
-S
-61 64.3135 m
-61 64.3135 l
-S
-28.9365 48.1885 m
-28.9365 48.1885 l
-S
-17.125 48.375 m
-17.125 48.375 l
-S
-21.4365 42.375 m
-21.4365 42.375 l
-S
-19.375 36 m
-19.375 36 l
-S
-26.125 31.6885 m
-26.125 31.6885 l
-S
-20.125 31.5 m
-20.125 31.5 l
-S
-26.5 49.6885 m
-26.5 49.6885 l
-S
-35.6865 50.8135 m
-35.6865 50.8135 l
-S
-19.75 45.9385 m
-19.75 45.9385 l
-S
-23.125 52.3135 m
-23.125 52.3135 l
-S
-40.5615 47.4385 m
-40.5615 47.4385 l
-S
-43 46.125 m
-43 46.125 l
-S
-23.5 39.1885 m
-23.5 39.1885 l
-S
-38.5 34.125 m
-38.5 34.125 l
-S
-47.125 36.75 m
-47.125 36.75 l
-S
-45.0615 50.4385 m
-45.0615 50.4385 l
-S
-56.875 51.375 m
-56.875 51.375 l
-S
-42.8115 39.375 m
-42.8115 39.375 l
-S
-62.875 33.1885 m
-62.875 33.1885 l
-S
-49.75 32.625 m
-49.75 32.625 l
-S
-38.875 30.75 m
-38.875 30.75 l
-S
-29.3115 35.4385 m
-29.3115 35.4385 l
-S
-31.9365 32.625 m
-31.9365 32.625 l
-S
-54.75 30.1885 m
-54.75 30.1885 l
-S
-64.9365 39.75 m
-64.9365 39.75 l
-S
-46.1865 41.8135 m
-46.1865 41.8135 l
-S
-65.3115 50.0635 m
-65.3115 50.0635 l
-S
-51.0615 51.9385 m
-51.0615 51.9385 l
-S
-23.5 34.3135 m
-23.5 34.3135 l
-S
-40.5615 51.9385 m
-40.5615 51.9385 l
-S
-31.1865 51.9385 m
-31.1865 51.9385 l
-S
-45.625 30.375 m
-45.625 30.375 l
-S
-26.6865 29.0635 m
-26.6865 29.0635 l
-S
-59.875 54.5635 m
-59.875 54.5635 l
-S
-50.5 28.875 m
-50.5 28.875 l
-S
-60.75 47.6885 m
-60.75 47.6885 l
-S
-30.625 42.75 m
-30.625 42.75 l
-S
-26.6865 42.375 m
-26.6865 42.375 l
-S
-36.8115 40.125 m
-36.8115 40.125 l
-S
-37.75 43.5 m
-37.75 43.5 l
-S
-34.5615 45.9385 m
-34.5615 45.9385 l
-S
-32.6865 37.125 m
-32.6865 37.125 l
-S
-61.9365 42.75 m
-61.9365 42.75 l
-S
-48.4365 47.25 m
-48.4365 47.25 l
-S
-54.625 42.375 m
-54.625 42.375 l
-S
-56.3115 45.75 m
-56.3115 45.75 l
-S
-52.9365 36.5635 m
-52.9365 36.5635 l
-S
-57.8115 34.5 m
-57.8115 34.5 l
-S
-58.9365 38.625 m
-58.9365 38.625 l
-S
-61 29.4385 m
-61 29.4385 l
-S
-65.875 29.625 m
-65.875 29.625 l
-S
-70.5615 27.75 m
-70.5615 27.75 l
-S
-71.5 52.875 m
-71.5 52.875 l
-S
-69.8115 34.3135 m
-69.8115 34.3135 l
-S
-76.375 27.375 m
-76.375 27.375 l
-S
-71.3115 41.0635 m
-71.3115 41.0635 l
-S
-77.3115 45.375 m
-77.3115 45.375 l
-S
-82 28.6885 m
-82 28.6885 l
-S
-88.1865 27.5635 m
-88.1865 27.5635 l
-S
-83.6865 43.3135 m
-83.6865 43.3135 l
-S
-88 50.0635 m
-88 50.0635 l
-S
-88.1865 44.0635 m
-88.1865 44.0635 l
-S
-88.1865 33.1885 m
-88.1865 33.1885 l
-S
-70 50.4385 m
-70 50.4385 l
-S
-68.875 59.625 m
-68.875 59.625 l
-S
-66.8115 38.25 m
-66.8115 38.25 l
-S
-74.75 42.1885 m
-74.75 42.1885 l
-S
-67.375 47.0635 m
-67.375 47.0635 l
-S
-72.25 64.5 m
-72.25 64.5 l
-S
-73.5615 66.9385 m
-73.5615 66.9385 l
-S
-80.5 47.4385 m
-80.5 47.4385 l
-S
-85.5615 62.4385 m
-85.5615 62.4385 l
-S
-82.9365 71.0635 m
-82.9365 71.0635 l
-S
-69.25 69 m
-69.25 69 l
-S
-80.3115 66.75 m
-80.3115 66.75 l
-S
-84.25 53.25 m
-84.25 53.25 l
-S
-87.0615 55.875 m
-87.0615 55.875 l
-S
-77.875 70.125 m
-77.875 70.125 l
-S
-85.375 47.4385 m
-85.375 47.4385 l
-S
-67.75 64.5 m
-67.75 64.5 l
-S
-67.75 55.125 m
-67.75 55.125 l
-S
-81.625 31.125 m
-81.625 31.125 l
-S
-79.375 39 m
-79.375 39 l
-S
-75.8115 33 m
-75.8115 33 l
-S
-84.4365 37.3135 m
-84.4365 37.3135 l
-S
-76.9365 54.5635 m
-76.9365 54.5635 l
-S
-77.3115 50.625 m
-77.3115 50.625 l
-S
-79.5615 60.75 m
-79.5615 60.75 l
-S
-76.1865 61.6885 m
-76.1865 61.6885 l
-S
-73.75 58.5 m
-73.75 58.5 l
-S
-82.5615 56.625 m
-82.5615 56.625 l
-S
-72.4365 72.375 m
-72.4365 72.375 l
-S
-61.75 25.875 m
-61.75 25.875 l
-S
-57.25 26.625 m
-57.25 26.625 l
-S
-25.75 60.75 m
-25.75 60.75 l
-S
-34.1865 59.4385 m
-34.1865 59.4385 l
-S
-19.9365 61.3135 m
-19.9365 61.3135 l
-S
-31.5615 55.6885 m
-31.5615 55.6885 l
-S
-17.3115 56.625 m
-17.3115 56.625 l
-S
-25.1865 55.125 m
-25.1865 55.125 l
-S
-40.375 62.25 m
-40.375 62.25 l
-S
-46.1865 54.75 m
-46.1865 54.75 l
-S
-56.875 59.4385 m
-56.875 59.4385 l
-S
-40.25 58.1885 m
-40.25 58.1885 l
-S
-36.25 56.4385 m
-36.25 56.4385 l
-S
-49.375 56.8135 m
-49.375 56.8135 l
-S
-53.125 62.625 m
-53.125 62.625 l
-S
-54.25 56.8135 m
-54.25 56.8135 l
-S
-59.5 60 m
-59.5 60 l
-S
-46.1865 60 m
-46.1865 60 l
-S
-30.8115 28.5 m
-30.8115 28.5 l
-S
-19.75 72.9385 m
-19.75 72.9385 l
-S
-43 73.125 m
-43 73.125 l
-S
-34.5615 72.9385 m
-34.5615 72.9385 l
-S
-56.3115 72.75 m
-56.3115 72.75 l
-S
-77.875 73.125 m
-77.875 73.125 l
-S
-72.4365 0.375 m
-72.4365 0.375 l
-S
-16.1865 27.5635 m
-16.1865 27.5635 l
-S
-16 50.0635 m
-16 50.0635 l
-S
-16.1865 44.0635 m
-16.1865 44.0635 l
-S
-16.1865 33.1885 m
-16.1865 33.1885 l
-S
-6 62.3135 m
-6.208 62.3135 6.375 62.4805 6.375 62.6885 c
-6.375 62.8945 6.208 63.0635 6 63.0635 c
-5.793 63.0635 5.625 62.8945 5.625 62.6885 c
-5.625 62.4805 5.793 62.3135 6 62.3135 c
-s
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI3_BeginPattern: (horizontal rules)
-(horizontal rules) 16 0 88 73.9463 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-2 J 0 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-0 6 m
-6 0 L
-F
-0 0 m
-6 6 L
-F
-%AI6_EndPatternLayer
-) &
-(0 O 0 R 0 0 0 1 k
- 0 0 0 1 K
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-2 J 0 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-88 72.9727 m
-16 72.9727 l
-S
-88 71.0273 m
-16 71.0273 L
-S
-88 67.1357 m
-16 67.1357 L
-S
-88 65.1904 m
-16 65.1904 L
-S
-88 63.2441 m
-16 63.2441 L
-S
-88 61.2979 m
-16 61.2979 L
-S
-88 57.4072 m
-16 57.4072 L
-S
-88 55.4609 m
-16 55.4609 L
-S
-88 53.5156 m
-16 53.5156 L
-S
-88 51.5703 m
-16 51.5703 L
-S
-88 49.624 m
-16 49.624 L
-S
-88 47.6787 m
-16 47.6787 L
-S
-88 45.7334 m
-16 45.7334 L
-S
-88 43.7871 m
-16 43.7871 L
-S
-88 39.8965 m
-16 39.8965 L
-S
-88 37.9502 m
-16 37.9502 L
-S
-88 36.0049 m
-16 36.0049 L
-S
-88 34.0586 m
-16 34.0586 L
-S
-88 32.1133 m
-16 32.1133 L
-S
-88 30.168 m
-16 30.168 L
-S
-88 26.2764 m
-16 26.2764 L
-S
-88 22.3848 m
-16 22.3848 L
-S
-88 20.4395 m
-16 20.4395 L
-S
-88 18.4941 m
-16 18.4941 L
-S
-88 16.5479 m
-16 16.5479 L
-S
-88 14.6016 m
-16 14.6016 L
-S
-88 12.6572 m
-16 12.6572 L
-S
-88 8.7646 m
-16 8.7646 L
-S
-88 6.8193 m
-16 6.8193 L
-S
-88 4.874 m
-16 4.874 L
-S
-88 0.9727 m
-16 0.9727 l
-S
-88 2.9277 m
-16 2.9277 L
-S
-88 69.0811 m
-16 69.0811 L
-S
-88 59.3525 m
-16 59.3525 L
-S
-88 41.8418 m
-16 41.8418 L
-S
-88 28.2217 m
-16 28.2217 L
-S
-88 24.3311 m
-16 24.3311 L
-S
-88 10.7109 m
-16 10.7109 L
-S
-6 69.0811 m
-2 69.0811 l
-S
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI3_BeginPattern: (one direction diagonals)
-(one direction diagonals) 28.856 4.6211 100.855 76.6211 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-0 J 2 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-5.106 10.6211 m
-11.106 4.6211 L
-F
-5.106 4.6211 m
-11.106 10.6211 L
-F
-%AI6_EndPatternLayer
-) &
-(0 O 0 R 0 0 0 1 k
- 0 0 0 1 K
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-0 J 1 j 0.3 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-21.3716 66.1055 m
-39.3706 84.1055 l
-S
-21.3716 60.1055 m
-45.3706 84.1055 l
-S
-21.3716 54.1055 m
-51.3706 84.1055 l
-S
-21.3716 48.1055 m
-57.3706 84.1055 l
-S
-21.3716 42.1055 m
-63.3706 84.1055 l
-S
-21.3716 36.1055 m
-69.3706 84.1055 l
-S
-21.3716 30.1055 m
-75.3706 84.1055 l
-S
-21.3716 24.1055 m
-81.3706 84.1055 l
-S
-21.3716 18.1055 m
-87.3706 84.1055 l
-S
-21.3716 12.1055 m
-93.3706 84.1055 l
-S
-21.3716 6.1055 m
-99.3706 84.1055 l
-S
-21.3716 0.1064 m
-105.3706 84.1055 l
-S
-27.3716 0.1064 m
-105.3706 78.1055 l
-S
-33.3706 0.1064 m
-105.3706 72.1055 l
-S
-39.3706 0.1064 m
-105.3706 66.1055 l
-S
-45.3706 0.1064 m
-105.3706 60.1055 l
-S
-51.3706 0.1064 m
-105.3706 54.1055 l
-S
-57.3706 0.1064 m
-105.3706 48.1055 l
-S
-63.3706 0.1064 m
-105.3706 42.1055 l
-S
-69.3706 0.1064 m
-105.3706 36.1055 l
-S
-75.3706 0.1064 m
-105.3706 30.1055 l
-S
-81.3706 0.1064 m
-105.3706 24.1055 l
-S
-87.3706 0.1064 m
-105.3706 18.1055 l
-S
-93.3706 0.1064 m
-105.3706 12.1055 l
-S
-2 j
-0.106 63.1211 m
-10.106 73.1211 L
-S
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI3_BeginPattern: (white dots)
-(white dots) 0.375 0.6885 72.375 72.6885 [
-%AI3_Tile
-(0 O 0 R 1 g
- 1 G
-) @
-(
-%AI6_BeginPatternLayer
-800 Ar
-1 J 0 j 0.75 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-13.3115 3.1885 m
-13.3115 3.1885 l
-S
-1.5 3.375 m
-1.5 3.375 l
-S
-10.875 4.6885 m
-10.875 4.6885 l
-S
-20.0615 5.8135 m
-20.0615 5.8135 l
-S
-4.125 0.9385 m
-4.125 0.9385 l
-S
-7.5 7.3135 m
-7.5 7.3135 l
-S
-24.9365 2.4385 m
-24.9365 2.4385 l
-S
-27.375 1.125 m
-27.375 1.125 l
-S
-29.4365 5.4385 m
-29.4365 5.4385 l
-S
-41.25 6.375 m
-41.25 6.375 l
-S
-49.6865 5.0635 m
-49.6865 5.0635 l
-S
-35.4365 6.9385 m
-35.4365 6.9385 l
-S
-24.9365 6.9385 m
-24.9365 6.9385 l
-S
-15.5615 6.9385 m
-15.5615 6.9385 l
-S
-44.25 9.5635 m
-44.25 9.5635 l
-S
-47.0615 1.3135 m
-47.0615 1.3135 l
-S
-18.9365 0.9385 m
-18.9365 0.9385 l
-S
-32.8115 2.25 m
-32.8115 2.25 l
-S
-40.6865 0.75 m
-40.6865 0.75 l
-S
-51 24.5635 m
-51 24.5635 l
-S
-58.6865 24.9385 m
-58.6865 24.9385 l
-S
-63.1865 24.375 m
-63.1865 24.375 l
-S
-67.3115 2.0635 m
-67.3115 2.0635 l
-S
-52.6865 11.8135 m
-52.6865 11.8135 l
-S
-70.875 17.8135 m
-70.875 17.8135 l
-S
-71.4365 4.6885 m
-71.4365 4.6885 l
-S
-64.3115 19.875 m
-64.3115 19.875 l
-S
-62.25 1.125 m
-62.25 1.125 l
-S
-54 20.25 m
-54 20.25 l
-S
-52.125 6 m
-52.125 6 l
-S
-57.75 17.625 m
-57.75 17.625 l
-S
-61.3115 16.875 m
-61.3115 16.875 l
-S
-56.8115 3.375 m
-56.8115 3.375 l
-S
-61.6865 9.5635 m
-61.6865 9.5635 l
-S
-58.3115 11.25 m
-58.3115 11.25 l
-S
-67.5 7.875 m
-67.5 7.875 l
-S
-69.5615 12.75 m
-69.5615 12.75 l
-S
-65.4365 13.875 m
-65.4365 13.875 l
-S
-2.0615 16.125 m
-2.0615 16.125 l
-S
-29.625 10.3135 m
-29.625 10.3135 l
-S
-15.9365 21.375 m
-15.9365 21.375 l
-S
-5.25 11.8135 m
-5.25 11.8135 l
-S
-19.125 18.5635 m
-19.125 18.5635 l
-S
-10.125 21.9385 m
-10.125 21.9385 l
-S
-18.9365 24.5635 m
-18.9365 24.5635 l
-S
-21.75 16.3135 m
-21.75 16.3135 l
-S
-21 12.75 m
-21 12.75 l
-S
-7.5 17.25 m
-7.5 17.25 l
-S
-13.6865 12.375 m
-13.6865 12.375 l
-S
-15.375 15.75 m
-15.375 15.75 l
-S
-30.5615 22.875 m
-30.5615 22.875 l
-S
-36.375 15.375 m
-36.375 15.375 l
-S
-42.75 13.3135 m
-42.75 13.3135 l
-S
-47.0615 20.0635 m
-47.0615 20.0635 l
-S
-47.25 14.0635 m
-47.25 14.0635 l
-S
-29.0615 20.4385 m
-29.0615 20.4385 l
-S
-31.125 15.1885 m
-31.125 15.1885 l
-S
-26.4365 17.0635 m
-26.4365 17.0635 l
-S
-39.5615 17.4385 m
-39.5615 17.4385 l
-S
-43.3115 23.25 m
-43.3115 23.25 l
-S
-44.4365 17.4385 m
-44.4365 17.4385 l
-S
-26.8115 25.125 m
-26.8115 25.125 l
-S
-49.6865 20.625 m
-49.6865 20.625 l
-S
-36 24.5635 m
-36 24.5635 l
-S
-36.375 20.625 m
-36.375 20.625 l
-S
-3.1865 24 m
-3.1865 24 l
-S
-5.625 24.9385 m
-5.625 24.9385 l
-S
-3.75 70.875 m
-3.75 70.875 l
-S
-10.5 66.5635 m
-10.5 66.5635 l
-S
-4.5 66.375 m
-4.5 66.375 l
-S
-22.875 69 m
-22.875 69 l
-S
-31.5 71.625 m
-31.5 71.625 l
-S
-47.25 68.0635 m
-47.25 68.0635 l
-S
-34.125 67.5 m
-34.125 67.5 l
-S
-23.25 65.625 m
-23.25 65.625 l
-S
-13.6865 70.3135 m
-13.6865 70.3135 l
-S
-16.3115 67.5 m
-16.3115 67.5 l
-S
-41.625 65.4385 m
-41.625 65.4385 l
-S
-7.875 69.1885 m
-7.875 69.1885 l
-S
-30 65.25 m
-30 65.25 l
-S
-11.0615 63.9385 m
-11.0615 63.9385 l
-S
-34.875 63.75 m
-34.875 63.75 l
-S
-17.0615 72 m
-17.0615 72 l
-S
-37.3115 71.4385 m
-37.3115 71.4385 l
-S
-42.1865 69.375 m
-42.1865 69.375 l
-S
-45.375 64.3135 m
-45.375 64.3135 l
-S
-13.3115 48.1885 m
-13.3115 48.1885 l
-S
-1.5 48.375 m
-1.5 48.375 l
-S
-5.8115 42.375 m
-5.8115 42.375 l
-S
-3.75 36 m
-3.75 36 l
-S
-10.5 31.6885 m
-10.5 31.6885 l
-S
-4.5 31.5 m
-4.5 31.5 l
-S
-10.875 49.6885 m
-10.875 49.6885 l
-S
-20.0615 50.8135 m
-20.0615 50.8135 l
-S
-4.125 45.9385 m
-4.125 45.9385 l
-S
-7.5 52.3135 m
-7.5 52.3135 l
-S
-24.9365 47.4385 m
-24.9365 47.4385 l
-S
-27.375 46.125 m
-27.375 46.125 l
-S
-7.875 39.1885 m
-7.875 39.1885 l
-S
-22.875 34.125 m
-22.875 34.125 l
-S
-31.5 36.75 m
-31.5 36.75 l
-S
-29.4365 50.4385 m
-29.4365 50.4385 l
-S
-41.25 51.375 m
-41.25 51.375 l
-S
-27.1865 39.375 m
-27.1865 39.375 l
-S
-47.25 33.1885 m
-47.25 33.1885 l
-S
-34.125 32.625 m
-34.125 32.625 l
-S
-23.25 30.75 m
-23.25 30.75 l
-S
-13.6865 35.4385 m
-13.6865 35.4385 l
-S
-16.3115 32.625 m
-16.3115 32.625 l
-S
-39.125 30.1885 m
-39.125 30.1885 l
-S
-49.3115 39.75 m
-49.3115 39.75 l
-S
-30.5615 41.8135 m
-30.5615 41.8135 l
-S
-49.6865 50.0635 m
-49.6865 50.0635 l
-S
-35.4365 51.9385 m
-35.4365 51.9385 l
-S
-7.875 34.3135 m
-7.875 34.3135 l
-S
-24.9365 51.9385 m
-24.9365 51.9385 l
-S
-15.5615 51.9385 m
-15.5615 51.9385 l
-S
-30 30.375 m
-30 30.375 l
-S
-11.0615 29.0635 m
-11.0615 29.0635 l
-S
-44.25 54.5635 m
-44.25 54.5635 l
-S
-34.875 28.875 m
-34.875 28.875 l
-S
-45.125 47.6885 m
-45.125 47.6885 l
-S
-15 42.75 m
-15 42.75 l
-S
-11.0615 42.375 m
-11.0615 42.375 l
-S
-21.1865 40.125 m
-21.1865 40.125 l
-S
-22.125 43.5 m
-22.125 43.5 l
-S
-18.9365 45.9385 m
-18.9365 45.9385 l
-S
-17.0615 37.125 m
-17.0615 37.125 l
-S
-46.3115 42.75 m
-46.3115 42.75 l
-S
-32.8115 47.25 m
-32.8115 47.25 l
-S
-39 42.375 m
-39 42.375 l
-S
-40.6865 45.75 m
-40.6865 45.75 l
-S
-37.3115 36.5635 m
-37.3115 36.5635 l
-S
-42.1865 34.5 m
-42.1865 34.5 l
-S
-43.3115 38.625 m
-43.3115 38.625 l
-S
-45.375 29.4385 m
-45.375 29.4385 l
-S
-50.25 29.625 m
-50.25 29.625 l
-S
-54.9365 27.75 m
-54.9365 27.75 l
-S
-55.875 52.875 m
-55.875 52.875 l
-S
-54.1865 34.3135 m
-54.1865 34.3135 l
-S
-60.75 27.375 m
-60.75 27.375 l
-S
-55.6865 41.0635 m
-55.6865 41.0635 l
-S
-61.6865 45.375 m
-61.6865 45.375 l
-S
-66.375 28.6885 m
-66.375 28.6885 l
-S
-72.5615 27.5635 m
-72.5615 27.5635 l
-S
-68.0615 43.3135 m
-68.0615 43.3135 l
-S
-72.375 50.0635 m
-72.375 50.0635 l
-S
-72.5615 44.0635 m
-72.5615 44.0635 l
-S
-72.5615 33.1885 m
-72.5615 33.1885 l
-S
-54.375 50.4385 m
-54.375 50.4385 l
-S
-53.25 59.625 m
-53.25 59.625 l
-S
-51.1865 38.25 m
-51.1865 38.25 l
-S
-59.125 42.1885 m
-59.125 42.1885 l
-S
-51.75 47.0635 m
-51.75 47.0635 l
-S
-56.625 64.5 m
-56.625 64.5 l
-S
-57.9365 66.9385 m
-57.9365 66.9385 l
-S
-64.875 47.4385 m
-64.875 47.4385 l
-S
-69.9365 62.4385 m
-69.9365 62.4385 l
-S
-67.3115 71.0635 m
-67.3115 71.0635 l
-S
-53.625 69 m
-53.625 69 l
-S
-64.6865 66.75 m
-64.6865 66.75 l
-S
-68.625 53.25 m
-68.625 53.25 l
-S
-71.4365 55.875 m
-71.4365 55.875 l
-S
-62.25 70.125 m
-62.25 70.125 l
-S
-69.75 47.4385 m
-69.75 47.4385 l
-S
-52.125 64.5 m
-52.125 64.5 l
-S
-52.125 55.125 m
-52.125 55.125 l
-S
-66 31.125 m
-66 31.125 l
-S
-63.75 39 m
-63.75 39 l
-S
-60.1865 33 m
-60.1865 33 l
-S
-68.8115 37.3135 m
-68.8115 37.3135 l
-S
-61.3115 54.5635 m
-61.3115 54.5635 l
-S
-61.6865 50.625 m
-61.6865 50.625 l
-S
-63.9365 60.75 m
-63.9365 60.75 l
-S
-60.5615 61.6885 m
-60.5615 61.6885 l
-S
-58.125 58.5 m
-58.125 58.5 l
-S
-66.9365 56.625 m
-66.9365 56.625 l
-S
-56.8115 72.375 m
-56.8115 72.375 l
-S
-46.125 25.875 m
-46.125 25.875 l
-S
-41.625 26.625 m
-41.625 26.625 l
-S
-10.125 60.75 m
-10.125 60.75 l
-S
-18.5615 59.4385 m
-18.5615 59.4385 l
-S
-4.3115 61.3135 m
-4.3115 61.3135 l
-S
-15.9365 55.6885 m
-15.9365 55.6885 l
-S
-1.6865 56.625 m
-1.6865 56.625 l
-S
-9.5615 55.125 m
-9.5615 55.125 l
-S
-24.75 62.25 m
-24.75 62.25 l
-S
-30.5615 54.75 m
-30.5615 54.75 l
-S
-41.25 59.4385 m
-41.25 59.4385 l
-S
-24.625 58.1885 m
-24.625 58.1885 l
-S
-20.625 56.4385 m
-20.625 56.4385 l
-S
-33.75 56.8135 m
-33.75 56.8135 l
-S
-37.5 62.625 m
-37.5 62.625 l
-S
-38.625 56.8135 m
-38.625 56.8135 l
-S
-43.875 60 m
-43.875 60 l
-S
-30.5615 60 m
-30.5615 60 l
-S
-15.1865 28.5 m
-15.1865 28.5 l
-S
-4.125 72.9385 m
-4.125 72.9385 l
-S
-27.375 73.125 m
-27.375 73.125 l
-S
-18.9365 72.9385 m
-18.9365 72.9385 l
-S
-40.6865 72.75 m
-40.6865 72.75 l
-S
-62.25 73.125 m
-62.25 73.125 l
-S
-56.8115 0.375 m
-56.8115 0.375 l
-S
-0.5615 27.5635 m
-0.5615 27.5635 l
-S
-0.375 50.0635 m
-0.375 50.0635 l
-S
-0.5615 44.0635 m
-0.5615 44.0635 l
-S
-0.5615 33.1885 m
-0.5615 33.1885 l
-S
-%AI6_EndPatternLayer
-) &
-] E
-%AI3_EndPattern
-%AI5_End_NonPrinting--
-%AI5_Begin_NonPrinting
-Np
-%AI8_BeginBrushPattern
-(New Pattern 9)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7883.25 8585.25 m
--7840.7246 8585.25 L
--7840.7246 8555.5381 L
--7883.25 8555.5381 L
--7883.25 8585.25 L
-n
-u
-u
-0 O
-0.7 g
--7872.457 8555.7881 m
--7868.6582 8555.7881 -7864.9199 8555.7881 v
--7861.1826 8555.7881 -7861.8242 8558.8838 y
--7845.9258 8558.8838 -7843.4502 8558.8838 v
--7840.9761 8558.8838 -7840.9761 8561.3594 y
--7840.9761 8578.542 l
--7876.541 8578.542 l
--7876.541 8558.9004 l
--7875.3906 8558.9004 l
--7875.439 8555.7881 -7872.457 8555.7881 v
-f
-0 R
-0.9 G
-0.5 w
--7861.8242 8558.8838 m
--7845.9258 8558.8838 -7843.4502 8558.8838 v
-S
-0.5 G
--7862.8594 8556.2715 m
--7861.4634 8557.1426 -7861.8242 8558.8838 y
-S
-0.7 G
--7864.9199 8555.7881 m
--7863.9858 8555.7881 -7863.3247 8555.9814 -7862.8594 8556.2715 c
-S
-0.9 G
--7876.541 8578.542 m
--7876.541 8558.9004 l
--7875.3906 8558.9004 l
--7875.439 8555.7881 -7872.457 8555.7881 v
--7868.6582 8555.7881 -7864.9199 8555.7881 v
-S
-0.25 G
--7840.9761 8561.3594 m
--7840.9761 8578.542 l
--7876.541 8578.542 l
-S
-0.5 G
--7842.019 8559.2715 m
--7840.9761 8559.9668 -7840.9761 8561.3594 y
-S
-0.7 G
--7843.4502 8558.8838 m
--7842.8306 8558.8838 -7842.3672 8559.0391 -7842.019 8559.2715 c
-S
-U
-u
-0 O
-0.7 g
-1 w
--7874.0718 8557.4023 m
--7870.2729 8557.4023 -7866.5342 8557.4023 v
--7862.7954 8557.4023 -7863.439 8560.498 y
--7847.541 8560.498 -7845.0649 8560.498 v
--7842.5903 8560.498 -7842.5903 8562.9727 y
--7842.5903 8580.1563 l
--7878.1558 8580.1563 l
--7878.1558 8560.5146 l
--7877.0054 8560.5146 l
--7877.0542 8557.4023 -7874.0718 8557.4023 v
-f
-0 R
-0.9 G
-0.5 w
--7863.439 8560.498 m
--7847.541 8560.498 -7845.0649 8560.498 v
-S
-0.5 G
--7864.4746 8557.8867 m
--7863.0767 8558.7578 -7863.439 8560.498 y
-S
-0.7 G
--7866.5342 8557.4023 m
--7865.6006 8557.4023 -7864.9409 8557.5957 -7864.4746 8557.8867 c
-S
-0.9 G
--7878.1558 8580.1563 m
--7878.1558 8560.5146 l
--7877.0054 8560.5146 l
--7877.0542 8557.4023 -7874.0718 8557.4023 v
--7870.2729 8557.4023 -7866.5342 8557.4023 v
-S
-0.25 G
--7842.5903 8562.9727 m
--7842.5903 8580.1563 l
--7878.1558 8580.1563 l
-S
-0.5 G
--7843.6338 8560.8848 m
--7842.5903 8561.5811 -7842.5903 8562.9727 y
-S
-0.7 G
--7845.0649 8560.498 m
--7844.4458 8560.498 -7843.981 8560.6533 -7843.6338 8560.8848 c
-S
-U
-u
-0 O
-0.7 g
-1 w
--7875.6846 8559.0176 m
--7871.8882 8559.0176 -7868.1489 8559.0176 v
--7864.4111 8559.0176 -7865.0527 8562.1123 y
--7849.1538 8562.1123 -7846.6802 8562.1123 v
--7844.2046 8562.1123 -7844.2046 8564.5879 y
--7844.2046 8581.7715 l
--7879.771 8581.7715 l
--7879.771 8562.1289 l
--7878.6191 8562.1289 l
--7878.6689 8559.0176 -7875.6846 8559.0176 v
-f
-0 R
-0.9 G
-0.5 w
--7865.0527 8562.1123 m
--7849.1538 8562.1123 -7846.6802 8562.1123 v
-S
-0.5 G
--7866.0898 8559.5 m
--7864.6929 8560.3711 -7865.0527 8562.1123 y
-S
-0.7 G
--7868.1489 8559.0176 m
--7867.2144 8559.0176 -7866.5542 8559.21 -7866.0898 8559.5 c
-S
-0.9 G
--7879.771 8581.7715 m
--7879.771 8562.1289 l
--7878.6191 8562.1289 l
--7878.6689 8559.0176 -7875.6846 8559.0176 v
--7871.8882 8559.0176 -7868.1489 8559.0176 v
-S
-0.25 G
--7844.2046 8564.5879 m
--7844.2046 8581.7715 l
--7879.771 8581.7715 l
-S
-0.5 G
--7845.249 8562.5 m
--7844.2046 8563.1953 -7844.2046 8564.5879 y
-S
-0.7 G
--7846.6802 8562.1123 m
--7846.061 8562.1123 -7845.5962 8562.2676 -7845.249 8562.5 c
-S
-U
-u
-0 O
-0.7 g
-1 w
--7877.2993 8560.6318 m
--7873.5034 8560.6318 -7869.7642 8560.6318 v
--7866.0254 8560.6318 -7866.667 8563.7275 y
--7850.769 8563.7275 -7848.2935 8563.7275 v
--7845.8193 8563.7275 -7845.8193 8566.2031 y
--7845.8193 8583.3867 l
--7881.3857 8583.3867 l
--7881.3857 8563.7441 l
--7880.2334 8563.7441 l
--7880.2842 8560.6318 -7877.2993 8560.6318 v
-f
-0 R
-0.9 G
-0.5 w
--7866.667 8563.7275 m
--7850.769 8563.7275 -7848.2935 8563.7275 v
-S
-0.5 G
--7867.7046 8561.1152 m
--7866.3071 8561.9863 -7866.667 8563.7275 y
-S
-0.7 G
--7869.7642 8560.6318 m
--7868.8286 8560.6318 -7868.1689 8560.8252 -7867.7046 8561.1152 c
-S
-0.9 G
--7881.3857 8583.3867 m
--7881.3857 8563.7441 l
--7880.2334 8563.7441 l
--7880.2842 8560.6318 -7877.2993 8560.6318 v
--7873.5034 8560.6318 -7869.7642 8560.6318 v
-S
-0.25 G
--7845.8193 8566.2031 m
--7845.8193 8583.3867 l
--7881.3857 8583.3867 l
-S
-0.5 G
--7846.8638 8564.1143 m
--7845.8193 8564.8105 -7845.8193 8566.2031 y
-S
-0.7 G
--7848.2935 8563.7275 m
--7847.6753 8563.7275 -7847.2114 8563.8828 -7846.8638 8564.1143 c
-S
-U
-u
-0 O
-0.8 g
-1 w
--7878.9146 8562.2461 m
--7875.1167 8562.2461 -7871.3794 8562.2461 v
--7867.6401 8562.2461 -7868.2817 8565.3418 y
--7852.3838 8565.3418 -7849.9087 8565.3418 v
--7847.4346 8565.3418 -7847.4346 8567.8174 y
--7847.4346 8585 l
--7883.001 8585 l
--7883.001 8565.3574 l
--7881.8481 8565.3574 l
--7881.8994 8562.2461 -7878.9146 8562.2461 v
-f
-0 R
-0.9 G
-0.5 w
--7868.2817 8565.3418 m
--7852.3838 8565.3418 -7849.9087 8565.3418 v
-S
-0.5 G
--7869.3184 8562.7295 m
--7867.9214 8563.6006 -7868.2817 8565.3418 y
-S
-0.7 G
--7871.3794 8562.2461 m
--7870.4438 8562.2461 -7869.7842 8562.4395 -7869.3184 8562.7295 c
-S
-0.9 G
--7883.001 8585 m
--7883.001 8565.3574 l
--7881.8481 8565.3574 l
--7881.8994 8562.2461 -7878.9146 8562.2461 v
--7875.1167 8562.2461 -7871.3794 8562.2461 v
-S
-0.25 G
--7847.4346 8567.8174 m
--7847.4346 8585 l
--7883.001 8585 l
-S
-0.5 G
--7848.4785 8565.7285 m
--7847.4346 8566.4238 -7847.4346 8567.8174 y
-S
-0.7 G
--7849.9087 8565.3418 m
--7849.29 8565.3418 -7848.8262 8565.4971 -7848.4785 8565.7285 c
-S
-U
-U
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 10)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7883.25 8585.25 m
--7815.2593 8585.25 L
--7815.2593 8557.0195 L
--7883.25 8557.0195 L
--7883.25 8585.25 L
-n
-0 O
-0.8 g
--7835.5234 8580.209 m
--7815.4785 8573.3516 l
--7817.0591 8570.4502 l
--7829.7202 8574.4063 l
--7835.7866 8570.4502 l
--7835.5234 8580.209 l
-f
-0 R
-0.9 G
-0.5 w
--7816.7871 8570.3242 m
--7829.7202 8574.4063 l
-S
-0.5 G
--7815.4785 8573.3516 m
--7817.0591 8570.4502 l
-S
-0.25 G
--7835.5234 8580.209 m
--7815.4785 8573.3516 l
-S
-0.5 G
--7829.7202 8574.4063 m
--7835.7866 8570.4502 l
-S
-0 O
-0.8 g
-1 w
--7855.5679 8562.7998 m
--7843.437 8557.5254 l
--7840.0073 8561.7441 l
--7855.5679 8562.7998 l
-f
-1 Ap
-0.57 g
--7835.2598 8582.0547 m
--7881.6802 8582.0547 L
--7881.6802 8584.9551 L
--7835.2598 8584.9551 L
--7835.2598 8582.0547 L
-f
-0 Ap
-0 R
-0.5 G
-0.5 w
--7843.437 8557.5254 m
--7840.0073 8561.7441 l
-S
-0.9 G
--7855.5679 8562.7998 m
--7842.875 8557.248 l
-S
-0 O
-0.8 g
-1 w
--7883.001 8560.7627 m
--7883.001 8582.0859 l
--7834.2046 8582.0859 l
--7834.2046 8564.9121 l
--7837.6338 8560.8223 l
--7883.001 8560.7627 l
-f
-0 R
-0.5 G
-0.5 w
--7883.001 8576.5166 m
--7834.2046 8576.5166 l
-S
--7880.0986 8564.1191 m
--7870.6025 8564.1191 l
-S
--7880.0986 8565.7676 m
--7870.6025 8565.7676 l
-S
--7880.0986 8567.415 m
--7870.6025 8567.415 l
-S
--7880.0986 8569.0635 m
--7870.6025 8569.0635 l
-S
--7880.0986 8570.7109 m
--7870.6025 8570.7109 l
-S
--7834.2046 8564.9121 m
--7837.6338 8560.8223 l
-S
-0.25 G
--7883.001 8582.0859 m
--7834.2046 8582.0859 l
--7834.2046 8564.9121 l
-S
-0.9 G
--7837.6338 8560.793 m
--7883.001 8560.793 l
--7883.001 8582.3555 l
-S
-0.25 G
--7835.2598 8582.0859 m
--7835.2598 8585 l
--7881.6714 8585 l
-S
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 19)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7883.25 8585.25 m
--7836.6338 8585.25 L
--7836.6338 8549.6348 L
--7883.25 8549.6348 L
--7883.25 8585.25 L
-n
-u
-u
-0 O
-0.7495 g
-0 R
-0.25 G
-1 j 0.5 w 2 M
--7836.9722 8585 m
--7836.9722 8582.9805 l
--7843.333 8579.5479 l
--7859.8857 8579.5479 L
--7876.439 8579.5479 l
--7883.001 8582.9805 l
--7883.001 8585 l
--7836.9722 8585 l
-b
-0.8748 G
-2 J 0 j
--7859.8857 8579.5479 m
--7876.439 8579.5479 l
--7883.001 8582.9805 l
--7883.001 8585 l
-S
--7836.9722 8582.9805 m
--7843.333 8579.5479 l
--7859.8857 8579.5479 L
-S
-0 O
-0.9 g
-0.25 G
-0 J 1 j
--7876.3394 8580.7598 m
--7880.377 8582.9805 l
--7839.7993 8582.9805 l
--7843.2319 8580.7598 l
--7876.3394 8580.7598 l
-b
-U
-u
-u
-0.7 g
-0 j 1 w 4 M
--7871.125 8576.6523 m
--7868.8462 8576.6094 L
--7859.7446 8575.041 L
--7850.4634 8576.6094 L
--7848.6694 8576.6094 L
--7848.729 8578.4512 L
--7871.125 8578.4512 L
--7871.125 8576.6523 L
-f
-0 R
-0.25 G
-0.5 w
--7848.6978 8576.6523 m
--7848.7905 8578.4512 L
--7871.1567 8578.4512 L
-S
-0.9 G
--7850.498 8576.6523 m
--7848.6978 8576.6523 L
-S
-0.25 G
--7859.8042 8575.041 m
--7850.498 8576.6523 L
-S
-0.9 G
--7871.1567 8578.4512 m
--7871.1567 8576.6523 L
--7868.9033 8576.6523 L
--7859.8042 8575.041 L
-S
-U
-u
-0 O
-0.7 g
-1 w
--7873.3672 8573.5781 m
--7864.0703 8573.5313 L
--7859.7119 8571.8047 L
--7855.1343 8573.5313 L
--7846.4214 8573.5313 L
--7846.4927 8575.5557 L
--7873.3672 8575.5557 L
--7873.3672 8573.5781 L
-f
-0 R
-0.25 G
-0.5 w
--7846.4546 8573.5781 m
--7846.5649 8575.5557 L
--7873.4038 8575.5557 L
-S
-0.9 G
--7855.1758 8573.5781 m
--7846.4546 8573.5781 L
-S
-0.25 G
--7859.7817 8571.8047 m
--7855.1758 8573.5781 L
-S
-0.9 G
--7873.4038 8575.5557 m
--7873.4038 8573.5781 L
--7864.1406 8573.5781 L
--7859.7817 8571.8047 L
-S
-U
-u
-0 O
-0.7495 g
-0.25 G
-2 J 2 M
--7874.8838 8572.75 m
--7874.8911 8550.8809 l
--7873.9082 8549.8848 L
--7845.9302 8549.9121 L
--7844.9922 8551.0508 L
--7844.9922 8572.4648 L
--7845.8022 8573.6045 L
--7874.0366 8573.6045 l
--7874.8838 8572.75 L
-b
-/BBAccumRotation (4.712389) XT
-0.8748 G
--7874.0366 8573.6045 m
--7874.8838 8572.75 L
--7874.8911 8550.8809 l
--7873.9082 8549.8848 L
--7845.9302 8549.9121 L
-S
-/BBAccumRotation (4.712389) XT
-0 O
-0.9 g
-0.25 G
--7848.0239 8570.7168 m
--7848.0054 8552.7617 L
--7871.8994 8552.7617 L
--7871.9014 8570.7148 L
--7848.0239 8570.7168 L
-b
-/BBAccumRotation (4.712389) XT
-U
-U
-u
-0.15 G
-0 J 4 M
--7843.333 8579.5479 m
--7859.8857 8579.5479 L
--7876.439 8579.5479 L
--7883.001 8582.9805 L
--7883.001 8585 L
--7836.9722 8585 L
--7836.9722 8582.9805 L
--7843.333 8579.5479 L
-s
--7874.0366 8573.6045 m
--7873.4038 8573.6045 L
--7873.4038 8575.5557 L
--7873.3672 8575.5449 L
--7873.3672 8575.5527 L
--7873.4038 8575.5557 L
--7873.3672 8575.5557 L
--7862.731 8575.5557 L
--7868.8462 8576.6094 L
--7871.125 8576.6523 L
--7871.1567 8576.6523 L
--7871.1567 8578.4512 L
--7871.125 8578.4414 L
--7871.125 8578.4482 L
--7871.1567 8578.4512 L
--7871.125 8578.4512 L
--7848.7905 8578.4512 L
--7848.729 8578.4512 L
--7848.6694 8576.6094 L
--7850.4634 8576.6094 L
--7856.7002 8575.5557 L
--7846.5649 8575.5557 L
--7846.4927 8575.5557 L
--7846.4233 8573.6045 L
--7845.8022 8573.6045 L
--7844.9922 8572.4648 L
--7844.9922 8551.0508 L
--7845.9302 8549.9121 L
--7873.9082 8549.8848 L
--7874.8911 8550.8809 L
--7874.8838 8572.75 L
--7874.0366 8573.6045 L
-s
-U
-U
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 21)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7879.2002 8578.6211 m
--7836.251 8578.6211 L
--7836.251 8493.8447 L
--7879.2002 8493.8447 L
--7879.2002 8578.6211 L
-n
-0 To
-1 0 0 -1 -7862.7256 8561.0957 0 Tp
-0 Tv
-TP
--9.3189 0 Td
-0 Tr
-0 O
-0 g
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
--4.5 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-23.6196 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 3.2805 3.2805 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
-0 Tc
-0 Tw
-(Pr) Tx 1 -15 Tk
-(int\r) Tx 1 0 Tk
--3.9555 -11 Td
-(Ser) Tx 1 -30 Tk
-(v) Tx 1 25 Tk
-(er) Tx 1 0 Tk
-(\r) TX
-TO
-u
-0 R
-0 G
-0.25 w
--7841.3096 8533.9443 m
-B
-0.9 g
--7846.2407 8536.3604 m
--7846.2407 8538.249 L
--7840.542 8538.249 L
--7846.2407 8536.3604 L
-b
-0.65 g
--7846.2407 8538.249 m
--7846.2407 8547.4404 L
--7840.542 8547.4404 L
--7840.542 8538.249 L
--7846.2407 8538.249 L
-b
-0.9 g
--7846.2407 8527.7217 m
--7846.2407 8528.7373 L
--7839.501 8528.7373 L
--7846.2407 8527.7217 L
-b
-0.65 g
--7846.2407 8528.7373 m
--7846.2407 8530.7754 L
--7839.501 8530.7754 L
--7839.501 8528.7373 L
--7846.2407 8528.7373 L
-b
-0.9 g
--7846.2407 8531.4688 m
--7846.2407 8532.9473 L
--7836.376 8532.9473 L
--7846.2407 8531.4688 L
-b
-0.65 g
--7846.2407 8532.9473 m
--7846.2407 8534.9424 L
--7836.376 8534.9424 L
--7836.376 8532.9473 L
--7846.2407 8532.9473 L
-b
-0.8158 g
--7846.2407 8528.7373 m
--7846.2407 8505.7803 L
--7879.0742 8505.7803 L
--7879.0742 8554.1514 L
--7846.2407 8554.1514 L
--7846.2407 8538.249 L
--7846.2407 8532.9473 L
--7846.2407 8528.7373 L
-b
--7862.6567 8529.9658 m
-B
-0.4385 g
--7879.0742 8493.9697 m
--7846.2407 8493.9697 L
--7846.2407 8505.7803 L
--7879.0742 8505.7803 L
--7879.0742 8493.9697 L
-b
--7862.7954 8499.876 m
-B
-1 g
--7859.2881 8507.8643 m
--7849.9146 8507.8643 L
--7849.9146 8509.9482 L
--7859.2881 8509.9482 L
--7859.2881 8507.8643 L
-b
--7854.6025 8508.9053 m
-B
--7879.1377 8512.5215 m
--7846.395 8512.5215 L
-S
--7879.1377 8536.5332 m
--7846.2407 8536.5332 L
-S
-0 O
-0 g
--7842.8706 8529.7568 m
-B
--7843.3887 8542.8447 m
-B
-0.31 g
--7870.2759 8493.9697 m
--7846.2407 8493.9697 L
--7846.2407 8496.1523 L
--7864.5498 8496.1523 L
--7866.665 8498.2686 L
--7866.665 8505.8193 L
--7870.2759 8505.8193 L
--7870.2759 8493.9697 L
-b
-U
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 22)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7876.001 8578.6211 m
--7827.9502 8578.6211 L
--7827.9502 8497.4414 L
--7876.001 8497.4414 L
--7876.001 8578.6211 L
-n
-u
-u
-u
-0 O
-0.7 g
--7869.2202 8497.6914 m
--7835.2578 8497.6914 L
--7834.7935 8497.7441 L
--7834.3569 8497.9102 L
--7834.0791 8498.2148 L
--7834.0034 8498.543 L
--7834.0034 8562.8496 L
--7834.0791 8563.1855 L
--7834.3569 8563.4355 L
--7834.7935 8563.6504 L
--7835.2578 8563.707 L
--7869.2202 8563.707 L
--7869.6855 8563.6504 L
--7870.0361 8563.4355 L
--7870.3618 8563.1855 L
--7870.4399 8562.8496 L
--7870.4399 8498.543 L
--7870.3618 8498.2148 L
--7870.0361 8497.9102 L
--7869.6855 8497.7441 L
--7869.2202 8497.6914 L
-f
-0 R
-0.25 G
-0.5 w
--7834.0034 8498.543 m
--7834.0034 8562.8496 L
--7834.0791 8563.1855 L
--7834.3569 8563.4355 L
--7834.7935 8563.6504 L
--7835.2578 8563.707 L
--7869.2202 8563.707 L
--7869.6855 8563.6504 L
--7870.0361 8563.4355 L
--7870.3618 8563.1855 L
--7870.4399 8562.8496 L
-S
-0.9 G
--7870.4399 8562.8496 m
--7870.4399 8498.543 L
--7870.3618 8498.2148 L
--7870.0361 8497.9102 L
--7869.6855 8497.7441 L
--7869.2202 8497.6914 L
--7835.2578 8497.6914 L
--7834.7935 8497.7441 L
--7834.3569 8497.9102 L
--7834.0791 8498.2148 L
--7834.0034 8498.543 L
-S
-1 Ap
-0 O
-0.8 g
-0.25 G
-2 J 2 M
--7838.79 8507.9629 m
--7865.4775 8507.9629 L
--7865.4775 8560.2607 L
--7838.79 8560.2607 L
--7838.79 8507.9629 L
-b
-u
--7838.79 8523.8691 m
--7865.4736 8523.8691 L
--7865.4736 8520.0957 L
--7838.79 8520.0957 L
--7838.79 8523.8691 L
-b
--7838.79 8520.0615 m
--7865.4736 8520.0615 L
--7865.4736 8516.2871 L
--7838.79 8516.2871 L
--7838.79 8520.0615 L
-b
-U
-0 Ap
-0.25 g
-0 J 1 w 4 M
--7842.3818 8509.4375 m
--7843.2319 8509.4375 L
--7862.2729 8509.4375 L
--7862.2729 8510.3271 L
--7855.8018 8510.3271 L
--7855.8018 8510.9629 L
--7848.8486 8510.9629 L
--7848.8486 8510.3271 L
--7842.3818 8510.3271 L
--7842.3818 8509.4375 L
-f
-1 Ap
-0.6 g
-0 R
-0.25 G
-2 J 0.5 w 2 M
--7842.8271 8511.3691 m
--7846.8706 8511.3691 L
--7846.8706 8510.7324 L
--7842.8271 8510.7324 L
--7842.8271 8511.3691 L
-b
-u
-0.8 g
--7840.8057 8514.5547 m
--7863.4463 8514.5547 L
--7863.4463 8513.0664 L
--7840.8057 8513.0664 L
--7840.8057 8514.5547 L
-b
--7863.4463 8514.5547 m
--7863.4463 8513.0664 L
--7840.8057 8513.0664 L
-S
-0.9 G
--7840.8057 8513.0664 m
--7840.8057 8514.5547 L
--7863.4463 8514.5547 L
-S
-U
-0 O
-0.7 g
-0 J 1 w 4 M
--7841.1318 8515.6172 m
--7845.1743 8515.6172 L
--7845.1743 8514.9805 L
--7841.1318 8514.9805 L
--7841.1318 8515.6172 L
-f
-0 R
-0.25 G
-2 J 0.5 w 2 M
--7841.1318 8514.9805 m
--7841.1318 8515.6172 L
--7845.1743 8515.6172 L
-S
-u
-u
--7861.5903 8500.6797 m
--7861.5903 8503.7402 L
--7866.9287 8503.7402 L
-S
--7861.5903 8503.7393 m
--7861.5903 8506.7578 L
--7866.9287 8506.7578 L
-S
-U
-u
-0.9 G
--7866.9287 8503.7129 m
--7866.9287 8500.6934 L
--7861.5903 8500.6934 L
-S
--7866.9287 8506.7578 m
--7866.9287 8503.7393 L
--7861.5903 8503.7393 L
-S
-U
-U
-u
-u
-0.25 G
--7837.7178 8500.6797 m
--7837.7178 8503.7402 L
--7843.0542 8503.7402 L
-S
--7837.7178 8503.7393 m
--7837.7178 8506.7578 L
--7843.0542 8506.7578 L
-S
-U
-u
-0.9 G
--7843.0542 8503.7129 m
--7843.0542 8500.6934 L
--7837.7178 8500.6934 L
-S
--7843.0542 8506.7578 m
--7843.0542 8503.7393 L
--7837.7178 8503.7393 L
-S
-U
-U
-0 O
-0.8 g
-0 J 1 w 4 M
--7832.144 8564.9395 m
--7872.3799 8564.9395 L
--7870.6865 8562.6406 L
--7833.8359 8562.6406 L
--7832.144 8564.9395 L
-f
-0 R
-0.9 G
-0.5 w
--7870.4072 8562.4785 m
--7872.3799 8564.9395 L
--7869.9111 8564.9395 l
-S
-0.25 G
--7834.083 8562.3672 m
--7832.144 8564.9395 L
--7872.0337 8564.9395 l
-S
-U
-0 Ap
-0.15 G
--7833.8359 8562.6406 m
--7833.874 8562.6406 L
--7834.0034 8562.4727 L
--7834.0034 8498.543 L
--7834.0791 8498.2148 L
--7834.3569 8497.9102 L
--7834.7935 8497.7441 L
--7835.2578 8497.6914 L
--7869.2202 8497.6914 L
--7869.6855 8497.7441 L
--7870.0361 8497.9102 L
--7870.3618 8498.2148 L
--7870.4399 8498.543 L
--7870.4399 8562.5195 L
--7870.5386 8562.6406 L
--7870.6865 8562.6406 L
--7872.3799 8564.9395 L
--7872.0337 8564.9395 L
--7869.9111 8564.9395 L
--7832.144 8564.9395 L
--7833.8359 8562.6406 L
-s
--7870.4399 8562.5195 m
--7833.8359 8562.5195 l
-S
-U
-U
-0 To
-1 0 0 -1 -7851.9761 8576.5957 0 Tp
-0 Tv
-TP
--24.0247 0 Td
-0 Tr
-0 O
-0 g
-1 w
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
-0 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-36 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 0 0 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
-0 Tc
-0 Tw
-(DNS Ser) Tx 1 -30 Tk
-(v) Tx 1 25 Tk
-(er) Tx 1 0 Tk
-(\r) TX
-TO
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 23)
-0 A
-u
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7878.9351 8565.3359 m
--7830.6465 8565.3359 L
--7830.6465 8506.8223 L
--7878.9351 8506.8223 L
--7878.9351 8565.3359 L
-n
-0 O
-0.64 g
--7830.6465 8513.9863 m
--7832.5977 8506.8223 L
--7849.127 8506.8223 L
--7851.001 8513.9863 L
--7858.666 8513.9863 L
--7860.7529 8506.8223 L
--7877.0625 8506.8223 L
--7878.9351 8513.9863 L
--7878.9351 8514.0137 L
--7830.6465 8514.0137 L
--7830.6465 8513.9863 L
-f
-0.92 g
--7878.9351 8514.0137 m
--7878.9351 8565.3164 L
--7870.5898 8565.3164 L
--7870.5898 8561.6152 L
--7870.5386 8561.6152 L
--7870.5386 8514.0137 L
--7878.9351 8514.0137 L
-f
--7830.6465 8514.0137 m
--7838.7871 8514.0137 L
--7838.7871 8565.3359 L
--7830.6465 8565.3359 L
--7830.6465 8514.0137 L
-f
-0.8158 g
--7870.5386 8514.0137 m
--7870.5386 8561.6152 L
--7838.8442 8561.6152 L
--7838.8442 8565.3359 L
--7838.7871 8565.3359 L
--7838.7871 8514.0137 L
--7870.5386 8514.0137 L
-f
-0 R
-0.67 G
-0.5 w 3.8635 M
--7858.666 8513.9863 m
--7858.6582 8561.6152 L
-S
--7857.8145 8513.9863 m
--7857.8066 8561.6152 L
-S
--7856.9634 8513.9863 m
--7856.9551 8561.6152 L
-S
--7856.1113 8513.9863 m
--7856.103 8561.6152 L
-S
--7855.2598 8513.9863 m
--7855.252 8561.6152 L
-S
--7854.4082 8513.9863 m
--7854.3999 8561.6152 L
-S
--7853.5566 8513.9863 m
--7853.5488 8561.6152 L
-S
--7853.5718 8513.9863 m
--7853.563 8561.6152 L
-S
--7852.7202 8513.9863 m
--7852.7114 8561.6152 L
-S
--7851.8682 8513.9863 m
--7851.8594 8561.6152 L
-S
--7851.0161 8513.9863 m
--7851.0078 8561.6152 L
-S
-U
-0 To
-1 0 0 -1 -7854.791 8576.5957 0 Tp
-0 Tv
-TP
--21.2094 0 Td
-0 Tr
-0 O
-0 g
-1 w 4 M
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
-0 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-53.0468 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 0 0 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 4 Tl
-0 Tc
-0 Tw
-(Mainfr) Tx 1 10 Tk
-(ame) Tx 1 0 Tk
-(\r) TX
-TO
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 40)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7884 8586 m
--7835.7114 8586 L
--7835.7114 8500.1016 L
--7884 8500.1016 L
--7884 8586 L
-n
-0 O
-0.64 g
--7835.7114 8507.2656 m
--7837.6626 8500.1016 L
--7854.1919 8500.1016 L
--7856.0654 8507.2656 L
--7863.7305 8507.2656 L
--7865.8174 8500.1016 L
--7882.127 8500.1016 L
--7884 8507.2656 L
--7884 8507.293 L
--7835.7114 8507.293 L
--7835.7114 8507.2656 L
-f
-0.92 g
--7884 8507.293 m
--7884 8585.9805 L
--7875.6543 8585.9805 L
--7875.6543 8582.2793 L
--7875.6025 8582.2793 L
--7875.6025 8507.293 L
--7884 8507.293 L
-f
--7835.7114 8507.293 m
--7843.8511 8507.293 L
--7843.8511 8586 L
--7835.7114 8586 L
--7835.7114 8507.293 L
-f
-0.8158 g
--7875.6025 8507.293 m
--7875.6025 8582.2793 L
--7843.9087 8582.2793 L
--7843.9087 8586 L
--7843.8511 8586 L
--7843.8511 8507.293 L
--7875.6025 8507.293 L
-f
-0 R
-0.67 G
-0.5 w 3.8635 M
--7863.7305 8507.2656 m
--7863.7222 8582.2793 L
-S
--7862.8794 8507.2656 m
--7862.8711 8582.2793 L
-S
--7862.0273 8507.2656 m
--7862.019 8582.2793 L
-S
--7861.1758 8507.2656 m
--7861.168 8582.2793 L
-S
--7860.3242 8507.2656 m
--7860.3169 8582.2793 L
-S
--7859.4727 8507.2656 m
--7859.4648 8582.2793 L
-S
--7858.6206 8507.2656 m
--7858.6138 8582.2793 L
-S
--7858.6362 8507.2656 m
--7858.6279 8582.2793 L
-S
--7857.7842 8507.2656 m
--7857.7754 8582.2793 L
-S
--7856.9326 8507.2656 m
--7856.9238 8582.2793 L
-S
--7856.0801 8507.2656 m
--7856.0718 8582.2793 L
-S
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 42)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7875.999 8578.6211 m
--7852.9873 8578.6211 L
--7852.9873 8540.5439 L
--7875.999 8540.5439 L
--7875.999 8578.6211 L
-n
-*u
-0 R
-1 G
-1 D
--7858.4966 8549.5801 m
--7858.4966 8551.3926 L
--7858.4966 8551.4912 -7858.5439 8551.5869 -7858.6362 8551.6787 c
--7858.7266 8551.7715 -7858.8608 8551.8604 -7859.0342 8551.9463 c
--7859.2065 8552.0303 -7859.418 8552.1123 -7859.6641 8552.1875 c
--7859.9087 8552.2627 -7860.1895 8552.333 -7860.498 8552.3975 c
--7860.7842 8552.457 -7861.0967 8552.5107 -7861.4282 8552.5586 C
--7861.4282 8552.6797 L
--7861.3481 8552.6797 L
--7861.3481 8552.7451 -7861.3774 8552.8066 -7861.4282 8552.8652 C
--7861.4282 8553.0898 L
--7861.3481 8553.0898 L
--7861.3481 8553.1543 -7861.3774 8553.2158 -7861.4282 8553.2744 C
--7861.4282 8553.499 L
--7861.3481 8553.499 L
--7861.3481 8553.5645 -7861.3774 8553.626 -7861.4282 8553.6846 C
--7861.4282 8553.9092 L
--7861.3481 8553.9092 L
--7861.3481 8553.9736 -7861.3774 8554.0361 -7861.4282 8554.0938 C
--7861.4282 8554.3184 L
--7861.3481 8554.3184 L
--7861.3481 8554.3838 -7861.3774 8554.4443 -7861.4282 8554.5029 C
--7861.4282 8554.7275 L
--7861.3481 8554.7275 L
--7861.3481 8554.793 -7861.3774 8554.8545 -7861.4282 8554.9131 C
--7861.4282 8555.1367 L
--7861.3481 8555.1367 L
--7861.3481 8555.2021 -7861.3774 8555.2637 -7861.4282 8555.3223 C
--7861.4282 8555.5469 L
--7861.3481 8555.5469 L
--7861.3481 8555.6123 -7861.3774 8555.6738 -7861.4282 8555.7324 C
--7861.4282 8555.9561 L
--7861.3481 8555.9561 L
--7861.3481 8556.0215 -7861.3774 8556.083 -7861.4282 8556.1416 C
--7861.4282 8556.3652 L
--7861.3481 8556.3652 L
--7861.3481 8556.4307 -7861.3774 8556.4922 -7861.4282 8556.5508 C
--7861.4282 8556.7754 L
--7861.3481 8556.7754 L
--7861.3481 8556.8408 -7861.3774 8556.9023 -7861.4282 8556.96 C
--7861.4282 8557.1846 L
--7861.3481 8557.1846 L
--7861.3481 8557.25 -7861.3774 8557.3115 -7861.4282 8557.3701 C
--7861.4282 8557.5947 L
--7861.3481 8557.5947 L
--7861.3481 8557.6592 -7861.3774 8557.7217 -7861.4282 8557.7793 C
--7861.4282 8558.0039 L
--7861.3481 8558.0039 L
--7861.3481 8558.0693 -7861.3774 8558.1309 -7861.4282 8558.1885 C
--7861.4282 8558.4131 L
--7861.3481 8558.4131 L
--7861.3481 8558.4785 -7861.3774 8558.54 -7861.4282 8558.5986 C
--7861.4282 8558.8232 L
--7861.3481 8558.8232 L
--7861.3481 8558.8877 -7861.3774 8558.9502 -7861.4282 8559.0078 C
--7861.4282 8559.2324 L
--7861.3481 8559.2324 L
--7861.3481 8559.2979 -7861.3774 8559.3594 -7861.4282 8559.418 C
--7861.4282 8559.6416 L
--7861.3481 8559.6416 L
--7861.3481 8559.707 -7861.3774 8559.7686 -7861.4282 8559.8271 C
--7861.4282 8560.0518 L
--7861.3481 8560.0518 L
--7861.3481 8560.1162 -7861.3774 8560.1787 -7861.4282 8560.2373 C
--7861.4282 8560.4609 L
--7861.3481 8560.4609 L
--7861.3481 8560.5264 -7861.3774 8560.5879 -7861.4282 8560.6465 C
--7861.4282 8560.8701 L
--7861.3481 8560.8701 L
--7861.3481 8560.9355 -7861.3774 8560.9971 -7861.4282 8561.0557 C
--7861.4282 8561.2803 L
--7861.3481 8561.2803 L
--7861.3481 8561.3457 -7861.3774 8561.4072 -7861.4282 8561.4658 C
--7861.4282 8561.6895 L
--7861.3481 8561.6895 L
--7861.3481 8561.7549 -7861.3774 8561.8164 -7861.4282 8561.875 C
--7861.4282 8562.0986 L
--7861.3481 8562.0986 L
--7861.3481 8562.1484 -7861.3682 8562.1953 -7861.3984 8562.2412 C
--7859.6431 8562.499 -7858.4966 8562.9229 -7858.4966 8563.4033 c
--7858.4966 8563.459 -7858.5166 8563.5146 -7858.5474 8563.5693 c
--7858.5166 8563.5146 -7858.4966 8563.459 -7858.4966 8563.4033 C
--7858.4966 8565.2158 L
--7858.4966 8565.3145 -7858.5439 8565.4102 -7858.6362 8565.5029 c
--7858.7266 8565.5947 -7858.8608 8565.6846 -7859.0342 8565.7695 c
--7859.2065 8565.8545 -7859.418 8565.9346 -7859.6641 8566.0107 c
--7859.9087 8566.0859 -7860.1895 8566.1563 -7860.498 8566.2207 c
--7860.8081 8566.2852 -7861.1455 8566.3438 -7861.5098 8566.3945 c
--7861.873 8566.4463 -7862.2622 8566.4893 -7862.6714 8566.5254 c
--7863.0791 8566.5615 -7863.5088 8566.5898 -7863.9546 8566.6084 c
--7864.3984 8566.627 -7864.8594 8566.6367 -7865.3311 8566.6367 c
--7865.8022 8566.6367 -7866.2642 8566.627 -7866.708 8566.6084 c
--7867.1538 8566.5898 -7867.582 8566.5615 -7867.9912 8566.5254 c
--7868.3999 8566.4893 -7868.7881 8566.4463 -7869.1519 8566.3945 c
--7869.5151 8566.3438 -7869.8545 8566.2852 -7870.1631 8566.2207 c
--7870.4727 8566.1563 -7870.752 8566.0859 -7870.998 8566.0107 c
--7871.2441 8565.9346 -7871.4551 8565.8545 -7871.6279 8565.7695 c
--7871.8018 8565.6846 -7871.9351 8565.5947 -7872.0264 8565.5029 c
--7872.1167 8565.4102 -7872.165 8565.3145 -7872.165 8565.2158 C
--7872.165 8563.4033 L
--7872.165 8562.9229 -7871.0186 8562.499 -7869.2642 8562.2412 C
--7869.2935 8562.1953 -7869.3135 8562.1484 -7869.3135 8562.0986 C
--7869.2344 8562.0986 L
--7869.2344 8561.875 L
--7869.2842 8561.8164 -7869.3135 8561.7549 -7869.3135 8561.6895 C
--7869.2344 8561.6895 L
--7869.2344 8561.4658 L
--7869.2842 8561.4072 -7869.3135 8561.3457 -7869.3135 8561.2803 C
--7869.2344 8561.2803 L
--7869.2344 8561.0557 L
--7869.2842 8560.9971 -7869.3135 8560.9355 -7869.3135 8560.8701 C
--7869.2344 8560.8701 L
--7869.2344 8560.6465 L
--7869.2842 8560.5879 -7869.3135 8560.5264 -7869.3135 8560.4609 C
--7869.2344 8560.4609 L
--7869.2344 8560.2373 L
--7869.2842 8560.1787 -7869.3135 8560.1162 -7869.3135 8560.0518 C
--7869.2344 8560.0518 L
--7869.2344 8559.8271 L
--7869.2842 8559.7686 -7869.3135 8559.707 -7869.3135 8559.6416 C
--7869.2344 8559.6416 L
--7869.2344 8559.418 L
--7869.2842 8559.3594 -7869.3135 8559.2979 -7869.3135 8559.2324 C
--7869.2344 8559.2324 L
--7869.2344 8559.0078 L
--7869.2842 8558.9502 -7869.3135 8558.8877 -7869.3135 8558.8232 C
--7869.2344 8558.8232 L
--7869.2344 8558.5986 L
--7869.2842 8558.54 -7869.3135 8558.4785 -7869.3135 8558.4131 C
--7869.2344 8558.4131 L
--7869.2344 8558.1885 L
--7869.2842 8558.1309 -7869.3135 8558.0693 -7869.3135 8558.0039 C
--7869.2344 8558.0039 L
--7869.2344 8557.7793 L
--7869.2842 8557.7217 -7869.3135 8557.6592 -7869.3135 8557.5947 C
--7869.2344 8557.5947 L
--7869.2344 8557.3701 L
--7869.2842 8557.3115 -7869.3135 8557.25 -7869.3135 8557.1846 C
--7869.2344 8557.1846 L
--7869.2344 8556.96 L
--7869.2842 8556.9023 -7869.3135 8556.8408 -7869.3135 8556.7754 C
--7869.2344 8556.7754 L
--7869.2344 8556.5508 L
--7869.2842 8556.4922 -7869.3135 8556.4307 -7869.3135 8556.3652 C
--7869.2344 8556.3652 L
--7869.2344 8556.1416 L
--7869.2842 8556.083 -7869.3135 8556.0215 -7869.3135 8555.9561 C
--7869.2344 8555.9561 L
--7869.2344 8555.7324 L
--7869.2842 8555.6738 -7869.3135 8555.6123 -7869.3135 8555.5469 C
--7869.2344 8555.5469 L
--7869.2344 8555.3223 L
--7869.2842 8555.2637 -7869.3135 8555.2021 -7869.3135 8555.1367 C
--7869.2344 8555.1367 L
--7869.2344 8554.9131 L
--7869.2842 8554.8545 -7869.3135 8554.793 -7869.3135 8554.7275 C
--7869.2344 8554.7275 L
--7869.2344 8554.5029 L
--7869.2842 8554.4443 -7869.3135 8554.3838 -7869.3135 8554.3184 C
--7869.2344 8554.3184 L
--7869.2344 8554.0938 L
--7869.2842 8554.0361 -7869.3135 8553.9736 -7869.3135 8553.9092 C
--7869.2344 8553.9092 L
--7869.2344 8553.6846 L
--7869.2842 8553.626 -7869.3135 8553.5645 -7869.3135 8553.499 C
--7869.2344 8553.499 L
--7869.2344 8553.2744 L
--7869.2842 8553.2158 -7869.3135 8553.1543 -7869.3135 8553.0898 C
--7869.2344 8553.0898 L
--7869.2344 8552.8652 L
--7869.2842 8552.8066 -7869.3135 8552.7451 -7869.3135 8552.6797 C
--7869.2344 8552.6797 L
--7869.2344 8552.5586 L
--7869.5654 8552.5107 -7869.8774 8552.457 -7870.1631 8552.3975 c
--7870.4727 8552.333 -7870.752 8552.2627 -7870.998 8552.1875 c
--7871.2441 8552.1123 -7871.4551 8552.0303 -7871.6279 8551.9463 c
--7871.8018 8551.8604 -7871.9351 8551.7715 -7872.0264 8551.6787 c
--7872.1167 8551.5869 -7872.165 8551.4912 -7872.165 8551.3926 C
--7872.165 8549.5801 L
--7872.165 8548.9551 -7870.2256 8548.4248 -7867.5303 8548.2344 C
--7867.4902 8548.1611 -7867.4502 8548.0869 -7867.4102 8548.0068 c
--7866.9209 8547.0283 -7867.063 8546.1836 -7867.2134 8545.2881 c
--7867.3066 8544.7305 -7867.4038 8544.1533 -7867.3496 8543.5215 c
--7867.208 8541.8691 -7865.4434 8541.0586 -7865.3975 8541.0439 C
--7858.4302 8541.0439 L
--7858.4014 8541.1729 L
--7858.4111 8541.1777 -7859.373 8541.6484 -7860.292 8543.1582 c
--7860.8286 8544.041 -7860.6929 8545.0957 -7860.5586 8546.1152 c
--7860.4639 8546.8379 -7860.376 8547.5195 -7860.5542 8548.0576 c
--7860.6104 8548.2256 -7860.6768 8548.3809 -7860.749 8548.5254 C
--7859.3662 8548.7861 -7858.4966 8549.1611 -7858.4966 8549.5801 C
-s
-0 D
--7871.626 8550.1338 m
--7871.7031 8550.0957 -7871.771 8550.0576 -7871.833 8550.0176 c
--7871.7729 8550.0566 -7871.7041 8550.0957 -7871.6279 8550.1328 C
--7871.6279 8550.1338 -7871.626 8550.1338 Y
-s
-1 D
--7870.1626 8564.4082 m
--7870.1631 8564.4082 -7870.1631 8564.4072 -7870.165 8564.4072 c
--7870.1641 8564.4072 -7870.1631 8564.4072 -7870.1631 8564.4082 C
--7870.1631 8564.4082 -7870.1626 8564.4082 v
-s
--7866.687 8564.7959 m
--7866.7026 8564.7959 -7866.7153 8564.7949 -7866.729 8564.7939 C
--7866.7217 8564.7939 -7866.7153 8564.7949 -7866.708 8564.7959 C
--7866.7026 8564.7959 -7866.6943 8564.7959 -7866.687 8564.7959 c
-s
--7863.9326 8564.7939 m
--7863.9463 8564.7949 -7863.9609 8564.7959 -7863.9736 8564.7959 c
--7863.9678 8564.7959 -7863.96 8564.7959 -7863.9546 8564.7959 C
--7863.9463 8564.7949 -7863.9409 8564.7939 -7863.9326 8564.7939 C
-s
-0 D
--7858.7119 8563.7588 m
--7858.6831 8563.7354 -7858.6582 8563.7129 -7858.6362 8563.6895 c
--7858.6138 8563.667 -7858.6016 8563.6426 -7858.585 8563.6201 c
--7858.6191 8563.667 -7858.6558 8563.7129 -7858.7119 8563.7588 c
-s
--7858.6758 8549.9023 m
--7858.7646 8549.9824 -7858.8848 8550.0596 -7859.0361 8550.1338 C
--7859.0352 8550.1338 -7859.0342 8550.1338 -7859.0342 8550.1328 C
--7858.8838 8550.0596 -7858.7646 8549.9814 -7858.6758 8549.9023 c
-s
-*U
-u
-0 O
-0 g
--7865.2832 8553.8408 m
-F
-u
-u
-0.67 g
--7858.7119 8563.7588 m
--7858.7959 8563.8262 -7858.9038 8563.8926 -7859.0342 8563.9561 C
--7859.0342 8563.9561 L
--7859.0342 8563.9561 L
--7859.6377 8564.2529 -7860.7134 8564.499 -7862.0664 8564.6514 c
--7862.0713 8564.6523 -7862.0762 8564.6533 -7862.0806 8564.6533 c
--7862.2671 8564.6748 -7862.459 8564.6934 -7862.6553 8564.7109 c
--7862.6602 8564.7119 -7862.665 8564.7119 -7862.6714 8564.7119 c
--7862.6768 8564.7129 -7862.6816 8564.7139 -7862.687 8564.7139 c
--7862.8838 8564.7314 -7863.084 8564.7461 -7863.29 8564.7598 c
--7863.2959 8564.7598 -7863.3018 8564.7607 -7863.3071 8564.7607 c
--7863.5127 8564.7744 -7863.7217 8564.7852 -7863.9326 8564.7939 c
--7863.9409 8564.7939 -7863.9463 8564.7949 -7863.9546 8564.7959 c
--7863.96 8564.7959 -7863.9678 8564.7959 -7863.9736 8564.7959 c
--7864.4121 8564.8145 -7864.8662 8564.8242 -7865.3311 8564.8242 c
--7865.7959 8564.8242 -7866.249 8564.8145 -7866.687 8564.7959 c
--7866.6943 8564.7959 -7866.7026 8564.7959 -7866.708 8564.7959 c
--7866.7153 8564.7949 -7866.7217 8564.7939 -7866.729 8564.7939 c
--7866.9409 8564.7852 -7867.1504 8564.7734 -7867.3545 8564.7607 c
--7867.3599 8564.7607 -7867.3647 8564.7598 -7867.3711 8564.7598 c
--7867.5767 8564.7461 -7867.7793 8564.7314 -7867.9761 8564.7139 c
--7867.9814 8564.7139 -7867.9863 8564.7129 -7867.9912 8564.7119 c
--7867.9951 8564.7119 -7868 8564.7119 -7868.0049 8564.7109 c
--7868.2026 8564.6943 -7868.3945 8564.6748 -7868.582 8564.6533 c
--7868.5854 8564.6533 -7868.5898 8564.6523 -7868.5938 8564.6514 c
--7869.1719 8564.5869 -7869.7002 8564.5039 -7870.1626 8564.4082 c
--7870.1631 8564.4082 -7870.1631 8564.4082 y
--7870.1631 8564.4072 -7870.1641 8564.4072 -7870.165 8564.4072 c
--7870.7822 8564.2793 -7871.2822 8564.126 -7871.6279 8563.9561 C
--7871.6279 8563.9561 L
--7871.6279 8563.9561 L
--7871.8257 8563.8594 -7871.9722 8563.7568 -7872.061 8563.6494 c
--7872.1279 8563.5693 -7872.165 8563.4873 -7872.165 8563.4033 C
--7872.165 8565.2158 L
--7872.165 8565.3145 -7872.1167 8565.4102 -7872.0264 8565.5029 c
--7871.9351 8565.5947 -7871.8018 8565.6846 -7871.6279 8565.7695 c
--7871.4551 8565.8545 -7871.2441 8565.9346 -7870.998 8566.0107 c
--7870.752 8566.0859 -7870.4727 8566.1563 -7870.1631 8566.2207 c
--7869.8545 8566.2852 -7869.5151 8566.3438 -7869.1519 8566.3945 c
--7868.7881 8566.4463 -7868.3999 8566.4893 -7867.9912 8566.5254 c
--7867.582 8566.5615 -7867.1538 8566.5898 -7866.708 8566.6084 c
--7866.2642 8566.627 -7865.8022 8566.6367 -7865.3311 8566.6367 c
--7864.8594 8566.6367 -7864.3984 8566.627 -7863.9546 8566.6084 c
--7863.5088 8566.5898 -7863.0791 8566.5615 -7862.6714 8566.5254 c
--7862.2622 8566.4893 -7861.873 8566.4463 -7861.5098 8566.3945 c
--7861.1455 8566.3438 -7860.8081 8566.2852 -7860.498 8566.2207 c
--7860.1895 8566.1563 -7859.9087 8566.0859 -7859.6641 8566.0107 c
--7859.418 8565.9346 -7859.2065 8565.8545 -7859.0342 8565.7695 c
--7858.8608 8565.6846 -7858.7266 8565.5947 -7858.6362 8565.5029 c
--7858.5439 8565.4102 -7858.4966 8565.3145 -7858.4966 8565.2158 C
--7858.4966 8563.4033 L
--7858.4966 8563.501 -7858.5439 8563.5967 -7858.6362 8563.6895 c
--7858.6582 8563.7129 -7858.6831 8563.7354 -7858.7119 8563.7588 c
-f
-0.39 g
--7861.4282 8562.5088 m
--7861.3481 8562.5088 L
--7861.3481 8562.5732 -7861.3774 8562.6357 -7861.4282 8562.6934 C
--7861.4282 8563.0381 L
--7861.4282 8563.0947 -7861.4551 8563.1494 -7861.5073 8563.2021 c
--7861.5586 8563.2549 -7861.6362 8563.3057 -7861.7344 8563.3545 c
--7861.834 8563.4033 -7861.9546 8563.4492 -7862.0942 8563.4922 c
--7862.2344 8563.5352 -7862.3945 8563.5752 -7862.5713 8563.6123 c
--7862.7471 8563.6484 -7862.9414 8563.6826 -7863.1489 8563.7119 c
--7863.3569 8563.7402 -7863.5786 8563.7656 -7863.811 8563.7861 c
--7864.0449 8563.8066 -7864.29 8563.8232 -7864.5439 8563.833 c
--7864.7974 8563.8438 -7865.0615 8563.8496 -7865.3311 8563.8496 c
--7865.6006 8563.8496 -7865.8633 8563.8438 -7866.1167 8563.833 c
--7866.3711 8563.8232 -7866.6162 8563.8066 -7866.8496 8563.7861 c
--7867.083 8563.7656 -7867.3057 8563.7402 -7867.5127 8563.7119 c
--7867.7207 8563.6826 -7867.9146 8563.6484 -7868.0913 8563.6123 c
--7868.2666 8563.5752 -7868.4272 8563.5352 -7868.5674 8563.4922 c
--7868.708 8563.4492 -7868.8281 8563.4033 -7868.9263 8563.3545 c
--7869.0264 8563.3057 -7869.1025 8563.2549 -7869.1553 8563.2021 c
--7869.2065 8563.1494 -7869.2344 8563.0947 -7869.2344 8563.0381 C
--7869.2344 8562.6934 L
--7869.2842 8562.6357 -7869.3135 8562.5732 -7869.3135 8562.5088 C
--7869.2344 8562.5088 L
--7869.2344 8562.2842 L
--7869.2466 8562.2705 -7869.2554 8562.2559 -7869.2642 8562.2412 C
--7871.0186 8562.499 -7872.165 8562.9229 -7872.165 8563.4033 c
--7872.165 8563.4873 -7872.1279 8563.5693 -7872.061 8563.6494 c
--7871.9722 8563.7568 -7871.8257 8563.8594 -7871.6279 8563.9561 C
--7871.6279 8563.9561 L
--7871.2822 8564.126 -7870.7822 8564.2793 -7870.165 8564.4072 c
--7870.1631 8564.4072 -7870.1631 8564.4082 -7870.1626 8564.4082 c
--7869.7002 8564.5039 -7869.1719 8564.5869 -7868.5938 8564.6514 c
--7868.5898 8564.6523 -7868.5854 8564.6533 -7868.582 8564.6533 c
--7868.3945 8564.6748 -7868.2026 8564.6943 -7868.0049 8564.7109 c
--7867.9951 8564.7119 -7867.9858 8564.7129 -7867.9761 8564.7139 c
--7867.7793 8564.7314 -7867.5767 8564.7461 -7867.3711 8564.7598 c
--7867.3647 8564.7598 -7867.3599 8564.7607 -7867.3545 8564.7607 c
--7867.1504 8564.7734 -7866.9409 8564.7852 -7866.729 8564.7939 c
--7866.7153 8564.7949 -7866.7026 8564.7959 -7866.687 8564.7959 c
--7866.249 8564.8145 -7865.7959 8564.8242 -7865.3311 8564.8242 c
--7864.8662 8564.8242 -7864.4121 8564.8145 -7863.9736 8564.7959 c
--7863.9609 8564.7959 -7863.9463 8564.7949 -7863.9326 8564.7939 c
--7863.7217 8564.7852 -7863.5127 8564.7744 -7863.3071 8564.7607 c
--7863.3018 8564.7607 -7863.2959 8564.7598 -7863.29 8564.7598 c
--7863.084 8564.7461 -7862.8838 8564.7314 -7862.687 8564.7139 c
--7862.6768 8564.7129 -7862.666 8564.7119 -7862.6553 8564.7109 c
--7862.459 8564.6934 -7862.2671 8564.6748 -7862.0806 8564.6533 c
--7862.0762 8564.6533 -7862.0713 8564.6523 -7862.0664 8564.6514 c
--7860.7134 8564.499 -7859.6377 8564.2529 -7859.0342 8563.9561 C
--7859.0342 8563.9561 L
--7858.9038 8563.8926 -7858.7959 8563.8262 -7858.7119 8563.7588 c
--7858.5713 8563.6445 -7858.4966 8563.5254 -7858.4966 8563.4033 c
--7858.4966 8562.9229 -7859.6431 8562.499 -7861.3984 8562.2412 C
--7861.4072 8562.2559 -7861.416 8562.2705 -7861.4282 8562.2842 C
--7861.4282 8562.5088 L
-f
-0.55 g
--7865.3311 8558.4756 m
--7867.041 8558.4756 -7868.8442 8558.2334 -7869.2344 8557.7793 C
--7869.2344 8558.0039 L
--7869.1782 8558.0039 L
--7869.1782 8558.3564 -7867.5986 8558.75 -7865.3311 8558.75 c
--7863.063 8558.75 -7861.4834 8558.3564 -7861.4834 8558.0039 C
--7861.4282 8558.0039 L
--7861.4282 8557.7793 L
--7861.8174 8558.2334 -7863.6201 8558.4756 -7865.3311 8558.4756 c
-f
--7865.3311 8555.6094 m
--7867.041 8555.6094 -7868.8442 8555.3662 -7869.2344 8554.9131 C
--7869.2344 8555.1367 L
--7869.1782 8555.1367 L
--7869.1782 8555.4902 -7867.5986 8555.8838 -7865.3311 8555.8838 c
--7863.063 8555.8838 -7861.4834 8555.4902 -7861.4834 8555.1367 C
--7861.4282 8555.1367 L
--7861.4282 8554.9131 L
--7861.8174 8555.3662 -7863.6201 8555.6094 -7865.3311 8555.6094 c
-f
--7865.3311 8558.8857 m
--7867.041 8558.8857 -7868.8442 8558.6426 -7869.2344 8558.1885 C
--7869.2344 8558.4131 L
--7869.1782 8558.4131 L
--7869.1782 8558.7666 -7867.5986 8559.1602 -7865.3311 8559.1602 c
--7863.063 8559.1602 -7861.4834 8558.7666 -7861.4834 8558.4131 C
--7861.4282 8558.4131 L
--7861.4282 8558.1885 L
--7861.8174 8558.6426 -7863.6201 8558.8857 -7865.3311 8558.8857 c
-f
--7865.3311 8559.2949 m
--7867.041 8559.2949 -7868.8442 8559.0518 -7869.2344 8558.5986 C
--7869.2344 8558.8232 L
--7869.1782 8558.8232 L
--7869.1782 8559.1758 -7867.5986 8559.5693 -7865.3311 8559.5693 c
--7863.063 8559.5693 -7861.4834 8559.1758 -7861.4834 8558.8232 C
--7861.4282 8558.8232 L
--7861.4282 8558.5986 L
--7861.8174 8559.0518 -7863.6201 8559.2949 -7865.3311 8559.2949 c
-f
--7865.3311 8556.0186 m
--7867.041 8556.0186 -7868.8442 8555.7764 -7869.2344 8555.3223 C
--7869.2344 8555.5469 L
--7869.1782 8555.5469 L
--7869.1782 8555.8994 -7867.5986 8556.293 -7865.3311 8556.293 c
--7863.063 8556.293 -7861.4834 8555.8994 -7861.4834 8555.5469 C
--7861.4282 8555.5469 L
--7861.4282 8555.3223 L
--7861.8174 8555.7764 -7863.6201 8556.0186 -7865.3311 8556.0186 c
-f
--7865.3311 8557.2471 m
--7867.041 8557.2471 -7868.8442 8557.0039 -7869.2344 8556.5508 C
--7869.2344 8556.7754 L
--7869.1782 8556.7754 L
--7869.1782 8557.1279 -7867.5986 8557.5225 -7865.3311 8557.5225 c
--7863.063 8557.5225 -7861.4834 8557.1279 -7861.4834 8556.7754 C
--7861.4282 8556.7754 L
--7861.4282 8556.5508 L
--7861.8174 8557.0039 -7863.6201 8557.2471 -7865.3311 8557.2471 c
-f
--7865.3311 8558.0664 m
--7867.041 8558.0664 -7868.8442 8557.8232 -7869.2344 8557.3701 C
--7869.2344 8557.5947 L
--7869.1782 8557.5947 L
--7869.1782 8557.9473 -7867.5986 8558.3408 -7865.3311 8558.3408 c
--7863.063 8558.3408 -7861.4834 8557.9473 -7861.4834 8557.5947 C
--7861.4282 8557.5947 L
--7861.4282 8557.3701 L
--7861.8174 8557.8232 -7863.6201 8558.0664 -7865.3311 8558.0664 c
-f
--7865.3311 8556.8379 m
--7867.041 8556.8379 -7868.8442 8556.5947 -7869.2344 8556.1416 C
--7869.2344 8556.3652 L
--7869.1782 8556.3652 L
--7869.1782 8556.7188 -7867.5986 8557.1123 -7865.3311 8557.1123 c
--7863.063 8557.1123 -7861.4834 8556.7188 -7861.4834 8556.3652 C
--7861.4282 8556.3652 L
--7861.4282 8556.1416 L
--7861.8174 8556.5947 -7863.6201 8556.8379 -7865.3311 8556.8379 c
-f
--7865.3311 8553.9717 m
--7867.041 8553.9717 -7868.8442 8553.7285 -7869.2344 8553.2744 C
--7869.2344 8553.499 L
--7869.1782 8553.499 L
--7869.1782 8553.8516 -7867.5986 8554.2451 -7865.3311 8554.2451 c
--7863.063 8554.2451 -7861.4834 8553.8516 -7861.4834 8553.499 C
--7861.4282 8553.499 L
--7861.4282 8553.2744 L
--7861.8174 8553.7285 -7863.6201 8553.9717 -7865.3311 8553.9717 c
-f
--7865.3311 8554.79 m
--7867.041 8554.79 -7868.8442 8554.5479 -7869.2344 8554.0938 C
--7869.2344 8554.3184 L
--7869.1782 8554.3184 L
--7869.1782 8554.6709 -7867.5986 8555.0645 -7865.3311 8555.0645 c
--7863.063 8555.0645 -7861.4834 8554.6709 -7861.4834 8554.3184 C
--7861.4282 8554.3184 L
--7861.4282 8554.0938 L
--7861.8174 8554.5479 -7863.6201 8554.79 -7865.3311 8554.79 c
-f
--7865.3311 8557.6572 m
--7867.041 8557.6572 -7868.8442 8557.4141 -7869.2344 8556.96 C
--7869.2344 8557.1846 L
--7869.1782 8557.1846 L
--7869.1782 8557.5381 -7867.5986 8557.9307 -7865.3311 8557.9307 c
--7863.063 8557.9307 -7861.4834 8557.5381 -7861.4834 8557.1846 C
--7861.4282 8557.1846 L
--7861.4282 8556.96 L
--7861.8174 8557.4141 -7863.6201 8557.6572 -7865.3311 8557.6572 c
-f
--7865.3311 8556.4287 m
--7867.041 8556.4287 -7868.8442 8556.1855 -7869.2344 8555.7324 C
--7869.2344 8555.9561 L
--7869.1782 8555.9561 L
--7869.1782 8556.3096 -7867.5986 8556.7021 -7865.3311 8556.7021 c
--7863.063 8556.7021 -7861.4834 8556.3096 -7861.4834 8555.9561 C
--7861.4282 8555.9561 L
--7861.4282 8555.7324 L
--7861.8174 8556.1855 -7863.6201 8556.4287 -7865.3311 8556.4287 c
-f
--7865.3311 8554.3799 m
--7867.041 8554.3799 -7868.8442 8554.1377 -7869.2344 8553.6846 C
--7869.2344 8553.9092 L
--7869.1782 8553.9092 L
--7869.1782 8554.2617 -7867.5986 8554.6553 -7865.3311 8554.6553 c
--7863.063 8554.6553 -7861.4834 8554.2617 -7861.4834 8553.9092 C
--7861.4282 8553.9092 L
--7861.4282 8553.6846 L
--7861.8174 8554.1377 -7863.6201 8554.3799 -7865.3311 8554.3799 c
-f
--7865.3311 8555.1992 m
--7867.041 8555.1992 -7868.8442 8554.9561 -7869.2344 8554.5029 C
--7869.2344 8554.7275 L
--7869.1782 8554.7275 L
--7869.1782 8555.0811 -7867.5986 8555.4746 -7865.3311 8555.4746 c
--7863.063 8555.4746 -7861.4834 8555.0811 -7861.4834 8554.7275 C
--7861.4282 8554.7275 L
--7861.4282 8554.5029 L
--7861.8174 8554.9561 -7863.6201 8555.1992 -7865.3311 8555.1992 c
-f
--7865.3311 8561.3428 m
--7867.041 8561.3428 -7868.8442 8561.0996 -7869.2344 8560.6465 C
--7869.2344 8560.8701 L
--7869.1782 8560.8701 L
--7869.1782 8561.2236 -7867.5986 8561.6172 -7865.3311 8561.6172 c
--7863.063 8561.6172 -7861.4834 8561.2236 -7861.4834 8560.8701 C
--7861.4282 8560.8701 L
--7861.4282 8560.6465 L
--7861.8174 8561.0996 -7863.6201 8561.3428 -7865.3311 8561.3428 c
-f
--7865.3311 8562.5713 m
--7867.041 8562.5713 -7868.8442 8562.3281 -7869.2344 8561.875 C
--7869.2344 8562.0986 L
--7869.1782 8562.0986 L
--7869.1782 8562.4521 -7867.5986 8562.8457 -7865.3311 8562.8457 c
--7863.063 8562.8457 -7861.4834 8562.4521 -7861.4834 8562.0986 C
--7861.4282 8562.0986 L
--7861.4282 8561.875 L
--7861.8174 8562.3281 -7863.6201 8562.5713 -7865.3311 8562.5713 c
-f
--7865.3311 8562.1611 m
--7867.041 8562.1611 -7868.8442 8561.9189 -7869.2344 8561.4658 C
--7869.2344 8561.6895 L
--7869.1782 8561.6895 L
--7869.1782 8562.043 -7867.5986 8562.4365 -7865.3311 8562.4365 c
--7863.063 8562.4365 -7861.4834 8562.043 -7861.4834 8561.6895 C
--7861.4282 8561.6895 L
--7861.4282 8561.4658 L
--7861.8174 8561.9189 -7863.6201 8562.1611 -7865.3311 8562.1611 c
-f
--7865.3311 8559.7041 m
--7867.041 8559.7041 -7868.8442 8559.4619 -7869.2344 8559.0078 C
--7869.2344 8559.2324 L
--7869.1782 8559.2324 L
--7869.1782 8559.585 -7867.5986 8559.9795 -7865.3311 8559.9795 c
--7863.063 8559.9795 -7861.4834 8559.585 -7861.4834 8559.2324 C
--7861.4282 8559.2324 L
--7861.4282 8559.0078 L
--7861.8174 8559.4619 -7863.6201 8559.7041 -7865.3311 8559.7041 c
-f
--7865.3311 8560.9326 m
--7867.041 8560.9326 -7868.8442 8560.6904 -7869.2344 8560.2373 C
--7869.2344 8560.4609 L
--7869.1782 8560.4609 L
--7869.1782 8560.8135 -7867.5986 8561.208 -7865.3311 8561.208 c
--7863.063 8561.208 -7861.4834 8560.8135 -7861.4834 8560.4609 C
--7861.4282 8560.4609 L
--7861.4282 8560.2373 L
--7861.8174 8560.6904 -7863.6201 8560.9326 -7865.3311 8560.9326 c
-f
--7865.3311 8560.5234 m
--7867.041 8560.5234 -7868.8442 8560.2803 -7869.2344 8559.8271 C
--7869.2344 8560.0518 L
--7869.1782 8560.0518 L
--7869.1782 8560.4043 -7867.5986 8560.7979 -7865.3311 8560.7979 c
--7863.063 8560.7979 -7861.4834 8560.4043 -7861.4834 8560.0518 C
--7861.4282 8560.0518 L
--7861.4282 8559.8271 L
--7861.8174 8560.2803 -7863.6201 8560.5234 -7865.3311 8560.5234 c
-f
--7865.3311 8560.1143 m
--7867.041 8560.1143 -7868.8442 8559.8711 -7869.2344 8559.418 C
--7869.2344 8559.6416 L
--7869.1782 8559.6416 L
--7869.1782 8559.9951 -7867.5986 8560.3887 -7865.3311 8560.3887 c
--7863.063 8560.3887 -7861.4834 8559.9951 -7861.4834 8559.6416 C
--7861.4282 8559.6416 L
--7861.4282 8559.418 L
--7861.8174 8559.8711 -7863.6201 8560.1143 -7865.3311 8560.1143 c
-f
--7865.3311 8561.752 m
--7867.041 8561.752 -7868.8442 8561.5088 -7869.2344 8561.0557 C
--7869.2344 8561.2803 L
--7869.1782 8561.2803 L
--7869.1782 8561.6328 -7867.5986 8562.0264 -7865.3311 8562.0264 c
--7863.063 8562.0264 -7861.4834 8561.6328 -7861.4834 8561.2803 C
--7861.4282 8561.2803 L
--7861.4282 8561.0557 L
--7861.8174 8561.5088 -7863.6201 8561.752 -7865.3311 8561.752 c
-f
--7862.6714 8552.7021 m
--7863.0791 8552.7383 -7863.5088 8552.7666 -7863.9546 8552.7852 c
--7864.3984 8552.8037 -7864.8594 8552.8135 -7865.3311 8552.8135 c
--7865.8022 8552.8135 -7866.2642 8552.8037 -7866.708 8552.7852 c
--7867.1538 8552.7666 -7867.582 8552.7383 -7867.9912 8552.7021 c
--7868.3999 8552.666 -7868.7881 8552.6221 -7869.1519 8552.5713 c
--7869.1807 8552.5674 -7869.2065 8552.5625 -7869.2344 8552.5586 C
--7869.2344 8552.6797 L
--7869.1782 8552.6797 L
--7869.1782 8553.0322 -7867.5986 8553.4268 -7865.3311 8553.4268 c
--7863.063 8553.4268 -7861.4834 8553.0322 -7861.4834 8552.6797 C
--7861.4282 8552.6797 L
--7861.4282 8552.5586 L
--7861.4561 8552.5625 -7861.4814 8552.5674 -7861.5098 8552.5713 c
--7861.873 8552.6221 -7862.2622 8552.666 -7862.6714 8552.7021 c
-f
--7865.3311 8553.5615 m
--7867.041 8553.5615 -7868.8442 8553.3184 -7869.2344 8552.8652 C
--7869.2344 8553.0898 L
--7869.1782 8553.0898 L
--7869.1782 8553.4424 -7867.5986 8553.8359 -7865.3311 8553.8359 c
--7863.063 8553.8359 -7861.4834 8553.4424 -7861.4834 8553.0898 C
--7861.4282 8553.0898 L
--7861.4282 8552.8652 L
--7861.8174 8553.3184 -7863.6201 8553.5615 -7865.3311 8553.5615 c
-f
--7865.3311 8563.3896 m
--7867.041 8563.3896 -7868.8442 8563.1475 -7869.2344 8562.6934 C
--7869.2344 8563.0381 L
--7869.2344 8563.0947 -7869.2065 8563.1494 -7869.1553 8563.2021 c
--7869.1025 8563.2549 -7869.0264 8563.3057 -7868.9263 8563.3545 c
--7868.8281 8563.4033 -7868.708 8563.4492 -7868.5674 8563.4922 c
--7868.4272 8563.5352 -7868.2666 8563.5752 -7868.0913 8563.6123 c
--7867.9146 8563.6484 -7867.7207 8563.6826 -7867.5127 8563.7119 c
--7867.3057 8563.7402 -7867.083 8563.7656 -7866.8496 8563.7861 c
--7866.6162 8563.8066 -7866.3711 8563.8232 -7866.1167 8563.833 c
--7865.8633 8563.8438 -7865.6006 8563.8496 -7865.3311 8563.8496 c
--7865.0615 8563.8496 -7864.7974 8563.8438 -7864.5439 8563.833 c
--7864.29 8563.8232 -7864.0449 8563.8066 -7863.811 8563.7861 c
--7863.5786 8563.7656 -7863.3569 8563.7402 -7863.1489 8563.7119 c
--7862.9414 8563.6826 -7862.7471 8563.6484 -7862.5713 8563.6123 c
--7862.3945 8563.5752 -7862.2344 8563.5352 -7862.0942 8563.4922 c
--7861.9546 8563.4492 -7861.834 8563.4033 -7861.7344 8563.3545 c
--7861.6362 8563.3057 -7861.5586 8563.2549 -7861.5073 8563.2021 c
--7861.4551 8563.1494 -7861.4282 8563.0947 -7861.4282 8563.0381 C
--7861.4282 8562.6934 L
--7861.8174 8563.1475 -7863.6201 8563.3896 -7865.3311 8563.3896 c
-f
--7869.1782 8562.5088 m
--7869.1782 8562.8613 -7867.5986 8563.2549 -7865.3311 8563.2549 c
--7863.063 8563.2549 -7861.4834 8562.8613 -7861.4834 8562.5088 C
--7861.4282 8562.5088 L
--7861.4282 8562.2842 L
--7861.8174 8562.7373 -7863.6201 8562.9805 -7865.3311 8562.9805 c
--7867.041 8562.9805 -7868.8442 8562.7373 -7869.2344 8562.2842 C
--7869.2344 8562.5088 L
--7869.1782 8562.5088 L
-f
-0.15 g
--7865.3311 8553.4268 m
--7867.5986 8553.4268 -7869.1782 8553.0322 -7869.1782 8552.6797 C
--7869.2344 8552.6797 L
--7869.3135 8552.6797 L
--7869.3135 8552.7451 -7869.2842 8552.8066 -7869.2344 8552.8652 c
--7868.8442 8553.3184 -7867.041 8553.5615 -7865.3311 8553.5615 c
--7863.6201 8553.5615 -7861.8174 8553.3184 -7861.4282 8552.8652 c
--7861.3774 8552.8066 -7861.3481 8552.7451 -7861.3481 8552.6797 C
--7861.4282 8552.6797 L
--7861.4834 8552.6797 L
--7861.4834 8553.0322 -7863.063 8553.4268 -7865.3311 8553.4268 c
-f
--7865.3311 8553.8359 m
--7867.5986 8553.8359 -7869.1782 8553.4424 -7869.1782 8553.0898 C
--7869.2344 8553.0898 L
--7869.3135 8553.0898 L
--7869.3135 8553.1543 -7869.2842 8553.2158 -7869.2344 8553.2744 c
--7868.8442 8553.7285 -7867.041 8553.9717 -7865.3311 8553.9717 c
--7863.6201 8553.9717 -7861.8174 8553.7285 -7861.4282 8553.2744 c
--7861.3774 8553.2158 -7861.3481 8553.1543 -7861.3481 8553.0898 C
--7861.4282 8553.0898 L
--7861.4834 8553.0898 L
--7861.4834 8553.4424 -7863.063 8553.8359 -7865.3311 8553.8359 c
-f
--7865.3311 8554.2451 m
--7867.5986 8554.2451 -7869.1782 8553.8516 -7869.1782 8553.499 C
--7869.2344 8553.499 L
--7869.3135 8553.499 L
--7869.3135 8553.5645 -7869.2842 8553.626 -7869.2344 8553.6846 c
--7868.8442 8554.1377 -7867.041 8554.3799 -7865.3311 8554.3799 c
--7863.6201 8554.3799 -7861.8174 8554.1377 -7861.4282 8553.6846 c
--7861.3774 8553.626 -7861.3481 8553.5645 -7861.3481 8553.499 C
--7861.4282 8553.499 L
--7861.4834 8553.499 L
--7861.4834 8553.8516 -7863.063 8554.2451 -7865.3311 8554.2451 c
-f
--7865.3311 8554.6553 m
--7867.5986 8554.6553 -7869.1782 8554.2617 -7869.1782 8553.9092 C
--7869.2344 8553.9092 L
--7869.3135 8553.9092 L
--7869.3135 8553.9736 -7869.2842 8554.0361 -7869.2344 8554.0938 c
--7868.8442 8554.5479 -7867.041 8554.79 -7865.3311 8554.79 c
--7863.6201 8554.79 -7861.8174 8554.5479 -7861.4282 8554.0938 c
--7861.3774 8554.0361 -7861.3481 8553.9736 -7861.3481 8553.9092 C
--7861.4282 8553.9092 L
--7861.4834 8553.9092 L
--7861.4834 8554.2617 -7863.063 8554.6553 -7865.3311 8554.6553 c
-f
--7865.3311 8555.0645 m
--7867.5986 8555.0645 -7869.1782 8554.6709 -7869.1782 8554.3184 C
--7869.2344 8554.3184 L
--7869.3135 8554.3184 L
--7869.3135 8554.3838 -7869.2842 8554.4443 -7869.2344 8554.5029 c
--7868.8442 8554.9561 -7867.041 8555.1992 -7865.3311 8555.1992 c
--7863.6201 8555.1992 -7861.8174 8554.9561 -7861.4282 8554.5029 c
--7861.3774 8554.4443 -7861.3481 8554.3838 -7861.3481 8554.3184 C
--7861.4282 8554.3184 L
--7861.4834 8554.3184 L
--7861.4834 8554.6709 -7863.063 8555.0645 -7865.3311 8555.0645 c
-f
--7865.3311 8555.4746 m
--7867.5986 8555.4746 -7869.1782 8555.0811 -7869.1782 8554.7275 C
--7869.2344 8554.7275 L
--7869.3135 8554.7275 L
--7869.3135 8554.793 -7869.2842 8554.8545 -7869.2344 8554.9131 c
--7868.8442 8555.3662 -7867.041 8555.6094 -7865.3311 8555.6094 c
--7863.6201 8555.6094 -7861.8174 8555.3662 -7861.4282 8554.9131 c
--7861.3774 8554.8545 -7861.3481 8554.793 -7861.3481 8554.7275 C
--7861.4282 8554.7275 L
--7861.4834 8554.7275 L
--7861.4834 8555.0811 -7863.063 8555.4746 -7865.3311 8555.4746 c
-f
--7865.3311 8555.8838 m
--7867.5986 8555.8838 -7869.1782 8555.4902 -7869.1782 8555.1367 C
--7869.2344 8555.1367 L
--7869.3135 8555.1367 L
--7869.3135 8555.2021 -7869.2842 8555.2637 -7869.2344 8555.3223 c
--7868.8442 8555.7764 -7867.041 8556.0186 -7865.3311 8556.0186 c
--7863.6201 8556.0186 -7861.8174 8555.7764 -7861.4282 8555.3223 c
--7861.3774 8555.2637 -7861.3481 8555.2021 -7861.3481 8555.1367 C
--7861.4282 8555.1367 L
--7861.4834 8555.1367 L
--7861.4834 8555.4902 -7863.063 8555.8838 -7865.3311 8555.8838 c
-f
--7865.3311 8556.293 m
--7867.5986 8556.293 -7869.1782 8555.8994 -7869.1782 8555.5469 C
--7869.2344 8555.5469 L
--7869.3135 8555.5469 L
--7869.3135 8555.6123 -7869.2842 8555.6738 -7869.2344 8555.7324 c
--7868.8442 8556.1855 -7867.041 8556.4287 -7865.3311 8556.4287 c
--7863.6201 8556.4287 -7861.8174 8556.1855 -7861.4282 8555.7324 c
--7861.3774 8555.6738 -7861.3481 8555.6123 -7861.3481 8555.5469 C
--7861.4282 8555.5469 L
--7861.4834 8555.5469 L
--7861.4834 8555.8994 -7863.063 8556.293 -7865.3311 8556.293 c
-f
--7865.3311 8556.7021 m
--7867.5986 8556.7021 -7869.1782 8556.3096 -7869.1782 8555.9561 C
--7869.2344 8555.9561 L
--7869.3135 8555.9561 L
--7869.3135 8556.0215 -7869.2842 8556.083 -7869.2344 8556.1416 c
--7868.8442 8556.5947 -7867.041 8556.8379 -7865.3311 8556.8379 c
--7863.6201 8556.8379 -7861.8174 8556.5947 -7861.4282 8556.1416 c
--7861.3774 8556.083 -7861.3481 8556.0215 -7861.3481 8555.9561 C
--7861.4282 8555.9561 L
--7861.4834 8555.9561 L
--7861.4834 8556.3096 -7863.063 8556.7021 -7865.3311 8556.7021 c
-f
--7865.3311 8557.1123 m
--7867.5986 8557.1123 -7869.1782 8556.7188 -7869.1782 8556.3652 C
--7869.2344 8556.3652 L
--7869.3135 8556.3652 L
--7869.3135 8556.4307 -7869.2842 8556.4922 -7869.2344 8556.5508 c
--7868.8442 8557.0039 -7867.041 8557.2471 -7865.3311 8557.2471 c
--7863.6201 8557.2471 -7861.8174 8557.0039 -7861.4282 8556.5508 c
--7861.3774 8556.4922 -7861.3481 8556.4307 -7861.3481 8556.3652 C
--7861.4282 8556.3652 L
--7861.4834 8556.3652 L
--7861.4834 8556.7188 -7863.063 8557.1123 -7865.3311 8557.1123 c
-f
--7865.3311 8557.5225 m
--7867.5986 8557.5225 -7869.1782 8557.1279 -7869.1782 8556.7754 C
--7869.2344 8556.7754 L
--7869.3135 8556.7754 L
--7869.3135 8556.8408 -7869.2842 8556.9023 -7869.2344 8556.96 c
--7868.8442 8557.4141 -7867.041 8557.6572 -7865.3311 8557.6572 c
--7863.6201 8557.6572 -7861.8174 8557.4141 -7861.4282 8556.96 c
--7861.3774 8556.9023 -7861.3481 8556.8408 -7861.3481 8556.7754 C
--7861.4282 8556.7754 L
--7861.4834 8556.7754 L
--7861.4834 8557.1279 -7863.063 8557.5225 -7865.3311 8557.5225 c
-f
--7865.3311 8557.9307 m
--7867.5986 8557.9307 -7869.1782 8557.5381 -7869.1782 8557.1846 C
--7869.2344 8557.1846 L
--7869.3135 8557.1846 L
--7869.3135 8557.25 -7869.2842 8557.3115 -7869.2344 8557.3701 c
--7868.8442 8557.8232 -7867.041 8558.0664 -7865.3311 8558.0664 c
--7863.6201 8558.0664 -7861.8174 8557.8232 -7861.4282 8557.3701 c
--7861.3774 8557.3115 -7861.3481 8557.25 -7861.3481 8557.1846 C
--7861.4282 8557.1846 L
--7861.4834 8557.1846 L
--7861.4834 8557.5381 -7863.063 8557.9307 -7865.3311 8557.9307 c
-f
--7865.3311 8558.3408 m
--7867.5986 8558.3408 -7869.1782 8557.9473 -7869.1782 8557.5947 C
--7869.2344 8557.5947 L
--7869.3135 8557.5947 L
--7869.3135 8557.6592 -7869.2842 8557.7217 -7869.2344 8557.7793 c
--7868.8442 8558.2334 -7867.041 8558.4756 -7865.3311 8558.4756 c
--7863.6201 8558.4756 -7861.8174 8558.2334 -7861.4282 8557.7793 c
--7861.3774 8557.7217 -7861.3481 8557.6592 -7861.3481 8557.5947 C
--7861.4282 8557.5947 L
--7861.4834 8557.5947 L
--7861.4834 8557.9473 -7863.063 8558.3408 -7865.3311 8558.3408 c
-f
--7865.3311 8558.75 m
--7867.5986 8558.75 -7869.1782 8558.3564 -7869.1782 8558.0039 C
--7869.2344 8558.0039 L
--7869.3135 8558.0039 L
--7869.3135 8558.0693 -7869.2842 8558.1309 -7869.2344 8558.1885 c
--7868.8442 8558.6426 -7867.041 8558.8857 -7865.3311 8558.8857 c
--7863.6201 8558.8857 -7861.8174 8558.6426 -7861.4282 8558.1885 c
--7861.3774 8558.1309 -7861.3481 8558.0693 -7861.3481 8558.0039 C
--7861.4282 8558.0039 L
--7861.4834 8558.0039 L
--7861.4834 8558.3564 -7863.063 8558.75 -7865.3311 8558.75 c
-f
--7865.3311 8559.1602 m
--7867.5986 8559.1602 -7869.1782 8558.7666 -7869.1782 8558.4131 C
--7869.2344 8558.4131 L
--7869.3135 8558.4131 L
--7869.3135 8558.4785 -7869.2842 8558.54 -7869.2344 8558.5986 c
--7868.8442 8559.0518 -7867.041 8559.2949 -7865.3311 8559.2949 c
--7863.6201 8559.2949 -7861.8174 8559.0518 -7861.4282 8558.5986 c
--7861.3774 8558.54 -7861.3481 8558.4785 -7861.3481 8558.4131 C
--7861.4282 8558.4131 L
--7861.4834 8558.4131 L
--7861.4834 8558.7666 -7863.063 8559.1602 -7865.3311 8559.1602 c
-f
--7865.3311 8559.5693 m
--7867.5986 8559.5693 -7869.1782 8559.1758 -7869.1782 8558.8232 C
--7869.2344 8558.8232 L
--7869.3135 8558.8232 L
--7869.3135 8558.8877 -7869.2842 8558.9502 -7869.2344 8559.0078 c
--7868.8442 8559.4619 -7867.041 8559.7041 -7865.3311 8559.7041 c
--7863.6201 8559.7041 -7861.8174 8559.4619 -7861.4282 8559.0078 c
--7861.3774 8558.9502 -7861.3481 8558.8877 -7861.3481 8558.8232 C
--7861.4282 8558.8232 L
--7861.4834 8558.8232 L
--7861.4834 8559.1758 -7863.063 8559.5693 -7865.3311 8559.5693 c
-f
--7865.3311 8559.9795 m
--7867.5986 8559.9795 -7869.1782 8559.585 -7869.1782 8559.2324 C
--7869.2344 8559.2324 L
--7869.3135 8559.2324 L
--7869.3135 8559.2979 -7869.2842 8559.3594 -7869.2344 8559.418 c
--7868.8442 8559.8711 -7867.041 8560.1143 -7865.3311 8560.1143 c
--7863.6201 8560.1143 -7861.8174 8559.8711 -7861.4282 8559.418 c
--7861.3774 8559.3594 -7861.3481 8559.2979 -7861.3481 8559.2324 C
--7861.4282 8559.2324 L
--7861.4834 8559.2324 L
--7861.4834 8559.585 -7863.063 8559.9795 -7865.3311 8559.9795 c
-f
--7865.3311 8560.3887 m
--7867.5986 8560.3887 -7869.1782 8559.9951 -7869.1782 8559.6416 C
--7869.2344 8559.6416 L
--7869.3135 8559.6416 L
--7869.3135 8559.707 -7869.2842 8559.7686 -7869.2344 8559.8271 c
--7868.8442 8560.2803 -7867.041 8560.5234 -7865.3311 8560.5234 c
--7863.6201 8560.5234 -7861.8174 8560.2803 -7861.4282 8559.8271 c
--7861.3774 8559.7686 -7861.3481 8559.707 -7861.3481 8559.6416 C
--7861.4282 8559.6416 L
--7861.4834 8559.6416 L
--7861.4834 8559.9951 -7863.063 8560.3887 -7865.3311 8560.3887 c
-f
--7865.3311 8560.7979 m
--7867.5986 8560.7979 -7869.1782 8560.4043 -7869.1782 8560.0518 C
--7869.2344 8560.0518 L
--7869.3135 8560.0518 L
--7869.3135 8560.1162 -7869.2842 8560.1787 -7869.2344 8560.2373 c
--7868.8442 8560.6904 -7867.041 8560.9326 -7865.3311 8560.9326 c
--7863.6201 8560.9326 -7861.8174 8560.6904 -7861.4282 8560.2373 c
--7861.3774 8560.1787 -7861.3481 8560.1162 -7861.3481 8560.0518 C
--7861.4282 8560.0518 L
--7861.4834 8560.0518 L
--7861.4834 8560.4043 -7863.063 8560.7979 -7865.3311 8560.7979 c
-f
--7865.3311 8561.208 m
--7867.5986 8561.208 -7869.1782 8560.8135 -7869.1782 8560.4609 C
--7869.2344 8560.4609 L
--7869.3135 8560.4609 L
--7869.3135 8560.5264 -7869.2842 8560.5879 -7869.2344 8560.6465 c
--7868.8442 8561.0996 -7867.041 8561.3428 -7865.3311 8561.3428 c
--7863.6201 8561.3428 -7861.8174 8561.0996 -7861.4282 8560.6465 c
--7861.3774 8560.5879 -7861.3481 8560.5264 -7861.3481 8560.4609 C
--7861.4282 8560.4609 L
--7861.4834 8560.4609 L
--7861.4834 8560.8135 -7863.063 8561.208 -7865.3311 8561.208 c
-f
--7865.3311 8561.6172 m
--7867.5986 8561.6172 -7869.1782 8561.2236 -7869.1782 8560.8701 C
--7869.2344 8560.8701 L
--7869.3135 8560.8701 L
--7869.3135 8560.9355 -7869.2842 8560.9971 -7869.2344 8561.0557 c
--7868.8442 8561.5088 -7867.041 8561.752 -7865.3311 8561.752 c
--7863.6201 8561.752 -7861.8174 8561.5088 -7861.4282 8561.0557 c
--7861.3774 8560.9971 -7861.3481 8560.9355 -7861.3481 8560.8701 C
--7861.4282 8560.8701 L
--7861.4834 8560.8701 L
--7861.4834 8561.2236 -7863.063 8561.6172 -7865.3311 8561.6172 c
-f
--7865.3311 8562.0264 m
--7867.5986 8562.0264 -7869.1782 8561.6328 -7869.1782 8561.2803 C
--7869.2344 8561.2803 L
--7869.3135 8561.2803 L
--7869.3135 8561.3457 -7869.2842 8561.4072 -7869.2344 8561.4658 c
--7868.8442 8561.9189 -7867.041 8562.1611 -7865.3311 8562.1611 c
--7863.6201 8562.1611 -7861.8174 8561.9189 -7861.4282 8561.4658 c
--7861.3774 8561.4072 -7861.3481 8561.3457 -7861.3481 8561.2803 C
--7861.4282 8561.2803 L
--7861.4834 8561.2803 L
--7861.4834 8561.6328 -7863.063 8562.0264 -7865.3311 8562.0264 c
-f
--7865.3311 8562.4365 m
--7867.5986 8562.4365 -7869.1782 8562.043 -7869.1782 8561.6895 C
--7869.2344 8561.6895 L
--7869.3135 8561.6895 L
--7869.3135 8561.7549 -7869.2842 8561.8164 -7869.2344 8561.875 c
--7868.8442 8562.3281 -7867.041 8562.5713 -7865.3311 8562.5713 c
--7863.6201 8562.5713 -7861.8174 8562.3281 -7861.4282 8561.875 c
--7861.3774 8561.8164 -7861.3481 8561.7549 -7861.3481 8561.6895 C
--7861.4282 8561.6895 L
--7861.4834 8561.6895 L
--7861.4834 8562.043 -7863.063 8562.4365 -7865.3311 8562.4365 c
-f
--7865.3311 8562.8457 m
--7867.5986 8562.8457 -7869.1782 8562.4521 -7869.1782 8562.0986 C
--7869.2344 8562.0986 L
--7869.3135 8562.0986 L
--7869.3135 8562.1484 -7869.2935 8562.1953 -7869.2642 8562.2412 c
--7869.2554 8562.2559 -7869.2466 8562.2705 -7869.2344 8562.2842 c
--7868.8442 8562.7373 -7867.041 8562.9805 -7865.3311 8562.9805 c
--7863.6201 8562.9805 -7861.8174 8562.7373 -7861.4282 8562.2842 c
--7861.416 8562.2705 -7861.4072 8562.2559 -7861.3984 8562.2412 c
--7861.3682 8562.1953 -7861.3481 8562.1484 -7861.3481 8562.0986 C
--7861.4282 8562.0986 L
--7861.4834 8562.0986 L
--7861.4834 8562.4521 -7863.063 8562.8457 -7865.3311 8562.8457 c
-f
--7865.3311 8563.2549 m
--7867.5986 8563.2549 -7869.1782 8562.8613 -7869.1782 8562.5088 C
--7869.2344 8562.5088 L
--7869.3135 8562.5088 L
--7869.3135 8562.5732 -7869.2842 8562.6357 -7869.2344 8562.6934 c
--7868.8442 8563.1475 -7867.041 8563.3896 -7865.3311 8563.3896 c
--7863.6201 8563.3896 -7861.8174 8563.1475 -7861.4282 8562.6934 c
--7861.3774 8562.6357 -7861.3481 8562.5732 -7861.3481 8562.5088 C
--7861.4282 8562.5088 L
--7861.4834 8562.5088 L
--7861.4834 8562.8613 -7863.063 8563.2549 -7865.3311 8563.2549 c
-f
-0.67 g
--7858.6758 8549.9023 m
--7858.7646 8549.9814 -7858.8838 8550.0596 -7859.0342 8550.1328 c
--7859.0342 8550.1338 -7859.0352 8550.1338 -7859.0361 8550.1338 c
--7859.1226 8550.1768 -7859.2168 8550.2178 -7859.3218 8550.2568 c
--7859.3218 8550.2568 l
--7859.5313 8550.3369 -7859.7759 8550.4131 -7860.0527 8550.4824 c
--7860.0562 8550.4834 -7860.0591 8550.4844 -7860.0625 8550.4854 c
--7860.6152 8550.624 -7861.293 8550.7402 -7862.0591 8550.8271 c
--7862.0698 8550.8281 -7862.0786 8550.8291 -7862.0889 8550.8311 c
--7862.4639 8550.873 -7862.8608 8550.9082 -7863.2734 8550.9346 c
--7863.292 8550.9365 -7863.3086 8550.9375 -7863.3262 8550.9385 c
--7863.5176 8550.9502 -7863.7119 8550.9609 -7863.9102 8550.9697 c
--7863.9248 8550.9697 -7863.9385 8550.9717 -7863.9546 8550.9717 c
--7863.9678 8550.9727 -7863.9824 8550.9727 -7863.9966 8550.9736 c
--7864.2026 8550.9814 -7864.4111 8550.9883 -7864.6226 8550.9932 c
--7864.6279 8550.9932 -7864.6353 8550.9932 -7864.6416 8550.9932 c
--7864.8682 8550.998 -7865.0977 8551.001 -7865.3311 8551.001 c
--7865.563 8551.001 -7865.7935 8550.998 -7866.021 8550.9932 c
--7866.0264 8550.9932 -7866.0337 8550.9932 -7866.04 8550.9932 c
--7866.251 8550.9883 -7866.46 8550.9814 -7866.665 8550.9736 c
--7866.6782 8550.9727 -7866.6943 8550.9727 -7866.708 8550.9717 c
--7866.7231 8550.9717 -7866.7378 8550.9697 -7866.752 8550.9697 c
--7866.9502 8550.9609 -7867.1455 8550.9502 -7867.3369 8550.9385 c
--7867.3535 8550.9375 -7867.3706 8550.9365 -7867.3862 8550.9346 c
--7867.8008 8550.9082 -7868.1982 8550.873 -7868.5752 8550.8311 c
--7868.584 8550.8291 -7868.5918 8550.8291 -7868.6016 8550.8281 c
--7869.3682 8550.7402 -7870.0474 8550.624 -7870.6001 8550.4854 c
--7870.6025 8550.4844 -7870.6055 8550.4834 -7870.6079 8550.4824 c
--7871.0234 8550.3779 -7871.3672 8550.2607 -7871.626 8550.1338 c
--7871.6279 8550.1338 -7871.6279 8550.1328 v
--7871.7041 8550.0957 -7871.7729 8550.0566 -7871.833 8550.0176 c
--7871.979 8549.9238 -7872.0806 8549.8262 -7872.1294 8549.7256 c
--7872.1538 8549.6777 -7872.165 8549.6289 -7872.165 8549.5801 C
--7872.165 8551.3926 L
--7872.165 8551.4912 -7872.1167 8551.5869 -7872.0264 8551.6787 c
--7871.9351 8551.7715 -7871.8018 8551.8604 -7871.6279 8551.9463 c
--7871.4551 8552.0303 -7871.2441 8552.1123 -7870.998 8552.1875 c
--7870.752 8552.2627 -7870.4727 8552.333 -7870.1631 8552.3975 c
--7869.8774 8552.457 -7869.5654 8552.5107 -7869.2344 8552.5586 c
--7869.2065 8552.5625 -7869.1807 8552.5674 -7869.1519 8552.5713 c
--7868.7881 8552.6221 -7868.3999 8552.666 -7867.9912 8552.7021 c
--7867.582 8552.7383 -7867.1538 8552.7666 -7866.708 8552.7852 c
--7866.2642 8552.8037 -7865.8022 8552.8135 -7865.3311 8552.8135 c
--7864.8594 8552.8135 -7864.3984 8552.8037 -7863.9546 8552.7852 c
--7863.5088 8552.7666 -7863.0791 8552.7383 -7862.6714 8552.7021 c
--7862.2622 8552.666 -7861.873 8552.6221 -7861.5098 8552.5713 c
--7861.4814 8552.5674 -7861.4561 8552.5625 -7861.4282 8552.5586 c
--7861.0967 8552.5107 -7860.7842 8552.457 -7860.498 8552.3975 c
--7860.1895 8552.333 -7859.9087 8552.2627 -7859.6641 8552.1875 c
--7859.418 8552.1123 -7859.2065 8552.0303 -7859.0342 8551.9463 c
--7858.8608 8551.8604 -7858.7266 8551.7715 -7858.6362 8551.6787 c
--7858.5439 8551.5869 -7858.4966 8551.4912 -7858.4966 8551.3926 C
--7858.4966 8549.5801 L
--7858.4966 8549.6533 -7858.5234 8549.7256 -7858.5752 8549.7959 c
--7858.6016 8549.832 -7858.6362 8549.8672 -7858.6758 8549.9023 c
-f
-0.39 g
--7860.749 8548.5254 m
--7861.2017 8549.4326 -7861.8945 8549.8896 -7861.9287 8549.9111 C
--7861.9458 8549.9209 L
--7868.9648 8549.9209 L
--7868.9814 8549.7881 L
--7868.9746 8549.7861 -7868.269 8549.5869 -7867.5303 8548.2344 C
--7870.2256 8548.4248 -7872.165 8548.9551 -7872.165 8549.5801 c
--7872.165 8549.6289 -7872.1538 8549.6777 -7872.1294 8549.7256 c
--7872.0806 8549.8262 -7871.979 8549.9238 -7871.833 8550.0176 c
--7871.771 8550.0576 -7871.7031 8550.0957 -7871.626 8550.1338 c
--7871.3672 8550.2607 -7871.0234 8550.3779 -7870.6079 8550.4824 c
--7870.6055 8550.4834 -7870.6025 8550.4844 -7870.6001 8550.4854 c
--7870.0474 8550.624 -7869.3682 8550.7402 -7868.6016 8550.8281 c
--7868.5918 8550.8291 -7868.584 8550.8291 -7868.5752 8550.8311 c
--7868.1982 8550.873 -7867.8008 8550.9082 -7867.3862 8550.9346 c
--7867.3706 8550.9365 -7867.3535 8550.9375 -7867.3369 8550.9385 c
--7867.1455 8550.9502 -7866.9502 8550.9609 -7866.752 8550.9697 c
--7866.7222 8550.9707 -7866.6943 8550.9717 -7866.665 8550.9736 c
--7866.46 8550.9814 -7866.251 8550.9883 -7866.04 8550.9932 c
--7866.0337 8550.9932 -7866.0264 8550.9932 -7866.021 8550.9932 c
--7865.7935 8550.998 -7865.563 8551.001 -7865.3311 8551.001 c
--7865.0977 8551.001 -7864.8682 8550.998 -7864.6416 8550.9932 c
--7864.6353 8550.9932 -7864.6279 8550.9932 -7864.6226 8550.9932 c
--7864.4111 8550.9883 -7864.2026 8550.9814 -7863.9966 8550.9736 c
--7863.9678 8550.9717 -7863.9385 8550.9707 -7863.9102 8550.9697 c
--7863.7119 8550.9609 -7863.5176 8550.9502 -7863.3262 8550.9385 c
--7863.3086 8550.9375 -7863.292 8550.9365 -7863.2734 8550.9346 c
--7862.8608 8550.9082 -7862.4639 8550.873 -7862.0889 8550.8311 c
--7862.0786 8550.8291 -7862.0698 8550.8281 -7862.0591 8550.8271 c
--7861.293 8550.7402 -7860.6152 8550.624 -7860.0625 8550.4854 c
--7860.0591 8550.4844 -7860.0562 8550.4834 -7860.0527 8550.4824 c
--7859.7759 8550.4131 -7859.5313 8550.3369 -7859.3218 8550.2568 C
--7859.3218 8550.2568 L
--7859.2168 8550.2178 -7859.1226 8550.1768 -7859.0361 8550.1338 c
--7858.8848 8550.0596 -7858.7646 8549.9824 -7858.6758 8549.9023 c
--7858.6362 8549.8672 -7858.6016 8549.832 -7858.5752 8549.7959 c
--7858.5234 8549.7256 -7858.4966 8549.6533 -7858.4966 8549.5801 c
--7858.4966 8549.1611 -7859.3662 8548.7861 -7860.749 8548.5254 C
-f
-*u
-1 g
--7868.6729 8549.7861 m
--7868.1362 8549.7861 -7862.0264 8549.7861 -7861.9863 8549.7861 C
--7861.9033 8549.7305 -7861.0566 8549.1357 -7860.6826 8548.0156 c
--7860.6118 8547.8037 -7860.5874 8547.5654 -7860.5874 8547.3086 c
--7860.5874 8546.9463 -7860.6382 8546.5459 -7860.6929 8546.1328 c
--7860.751 8545.6885 -7860.813 8545.2168 -7860.813 8544.749 c
--7860.813 8544.1709 -7860.7178 8543.5986 -7860.4072 8543.0879 c
--7859.7178 8541.9551 -7859.019 8541.4033 -7858.6768 8541.1787 C
--7859.1343 8541.1787 -7865.3706 8541.1738 Y
--7865.3882 8541.1807 -7867.0806 8541.9609 -7867.2144 8543.5332 c
--7867.2256 8543.6553 -7867.2305 8543.7744 -7867.2305 8543.8926 c
--7867.2305 8544.3721 -7867.1543 8544.8252 -7867.0801 8545.2666 c
--7867.0063 8545.7021 -7866.9351 8546.127 -7866.9351 8546.5615 c
--7866.9351 8547.041 -7867.0225 8547.5332 -7867.2886 8548.0674 c
--7867.8271 8549.1416 -7868.3599 8549.5967 -7868.6729 8549.7861 C
-f
-1 D
--7862.2344 8548.8447 m
--7866.7441 8548.8447 L
--7866.7441 8548.71 L
--7862.2344 8548.71 L
--7862.2344 8548.8447 L
-f
--7861.6958 8544.6045 m
--7866.1377 8544.6045 L
--7866.1377 8544.4697 L
--7861.6958 8544.4697 L
--7861.6958 8544.6045 L
-f
-0 D
--7861.4946 8546.1523 m
--7861.4946 8546.2871 L
--7866.0034 8546.2871 L
--7866.0034 8546.1523 L
--7861.4946 8546.1523 L
-f
--7866.0713 8545.4785 m
--7861.9658 8545.4785 L
--7861.9658 8545.6133 L
--7866.0713 8545.6133 L
--7866.0713 8545.4785 L
-f
-1 D
--7866.0034 8547.0947 m
--7861.5615 8547.0947 L
--7861.5615 8547.2295 L
--7866.0034 8547.2295 L
--7866.0034 8547.0947 L
-f
--7865.3311 8541.7764 m
--7860.6865 8541.7764 L
--7860.6865 8541.9121 L
--7865.3311 8541.9121 L
--7865.3311 8541.7764 L
-f
--7865.8018 8542.3154 m
--7862.1006 8542.3154 L
--7862.1006 8542.4502 L
--7865.8018 8542.4502 L
--7865.8018 8542.3154 L
-f
--7866.1377 8543.0557 m
--7861.4272 8543.0557 L
--7861.4272 8543.1904 L
--7866.1377 8543.1904 L
--7866.1377 8543.0557 L
-f
--7866.2729 8543.7959 m
--7861.5615 8543.7959 L
--7861.5615 8543.9307 L
--7866.2729 8543.9307 L
--7866.2729 8543.7959 L
-f
-0 D
--7866.2729 8547.9014 m
--7861.8975 8547.9014 L
--7861.8975 8548.0371 L
--7866.2729 8548.0371 L
--7866.2729 8547.9014 L
-f
-*U
-*u
-0 g
--7868.9814 8549.7881 m
--7868.9648 8549.9209 L
--7861.9458 8549.9209 L
--7861.9287 8549.9111 L
--7861.8945 8549.8896 -7861.2017 8549.4326 -7860.749 8548.5254 c
--7860.6768 8548.3809 -7860.6104 8548.2256 -7860.5542 8548.0576 c
--7860.376 8547.5195 -7860.4639 8546.8379 -7860.5586 8546.1152 c
--7860.6929 8545.0957 -7860.8286 8544.041 -7860.292 8543.1582 c
--7859.373 8541.6484 -7858.4111 8541.1777 -7858.4014 8541.1729 C
--7858.4302 8541.0439 L
--7865.3975 8541.0439 L
--7865.4434 8541.0586 -7867.208 8541.8691 -7867.3496 8543.5215 c
--7867.4038 8544.1533 -7867.3066 8544.7305 -7867.2134 8545.2881 c
--7867.063 8546.1836 -7866.9209 8547.0283 -7867.4102 8548.0068 c
--7867.4502 8548.0869 -7867.4902 8548.1611 -7867.5303 8548.2344 c
--7868.269 8549.5869 -7868.9746 8549.7861 -7868.9814 8549.7881 C
-f
-1 D
--7866.9351 8546.5615 m
--7866.9351 8546.127 -7867.0063 8545.7021 -7867.0801 8545.2666 c
--7867.1543 8544.8252 -7867.2305 8544.3721 -7867.2305 8543.8926 c
--7867.2305 8543.7744 -7867.2256 8543.6553 -7867.2144 8543.5332 c
--7867.0806 8541.9609 -7865.3882 8541.1807 -7865.3706 8541.1738 C
--7859.1343 8541.1787 -7858.6768 8541.1787 V
--7859.019 8541.4033 -7859.7178 8541.9551 -7860.4072 8543.0879 c
--7860.7178 8543.5986 -7860.813 8544.1709 -7860.813 8544.749 c
--7860.813 8545.2168 -7860.751 8545.6885 -7860.6929 8546.1328 c
--7860.6382 8546.5459 -7860.5874 8546.9463 -7860.5874 8547.3086 c
--7860.5874 8547.5654 -7860.6118 8547.8037 -7860.6826 8548.0156 c
--7861.0566 8549.1357 -7861.9033 8549.7305 -7861.9863 8549.7861 C
--7862.0264 8549.7861 -7868.1362 8549.7861 -7868.6729 8549.7861 C
--7868.3599 8549.5967 -7867.8271 8549.1416 -7867.2886 8548.0674 c
--7867.0225 8547.5332 -7866.9351 8547.041 -7866.9351 8546.5615 c
-f
-*U
-0 D
--7860.6865 8541.7764 m
--7865.3311 8541.7764 L
--7865.3311 8541.9121 L
--7860.6865 8541.9121 L
--7860.6865 8541.7764 L
-f
--7862.1006 8542.3154 m
--7865.8018 8542.3154 L
--7865.8018 8542.4502 L
--7862.1006 8542.4502 L
--7862.1006 8542.3154 L
-f
--7861.4272 8543.0557 m
--7866.1377 8543.0557 L
--7866.1377 8543.1904 L
--7861.4272 8543.1904 L
--7861.4272 8543.0557 L
-f
--7861.5615 8543.7959 m
--7866.2729 8543.7959 L
--7866.2729 8543.9307 L
--7861.5615 8543.9307 L
--7861.5615 8543.7959 L
-f
--7866.1377 8544.6045 m
--7861.6958 8544.6045 L
--7861.6958 8544.4697 L
--7866.1377 8544.4697 L
--7866.1377 8544.6045 L
-f
--7861.9658 8545.4785 m
--7866.0713 8545.4785 L
--7866.0713 8545.6133 L
--7861.9658 8545.6133 L
--7861.9658 8545.4785 L
-f
--7866.0034 8546.2871 m
--7861.4946 8546.2871 L
--7861.4946 8546.1523 L
--7866.0034 8546.1523 L
--7866.0034 8546.2871 L
-f
--7861.5615 8547.0947 m
--7866.0034 8547.0947 L
--7866.0034 8547.2295 L
--7861.5615 8547.2295 L
--7861.5615 8547.0947 L
-f
--7861.8975 8547.9014 m
--7866.2729 8547.9014 L
--7866.2729 8548.0371 L
--7861.8975 8548.0371 L
--7861.8975 8547.9014 L
-f
--7866.7441 8548.8447 m
--7862.2344 8548.8447 L
--7862.2344 8548.71 L
--7866.7441 8548.71 L
--7866.7441 8548.8447 L
-f
-U
-U
-U
-0 To
-1 0 0 -1 -7864.4927 8576.5957 0 Tp
-0 Tv
-TP
--11.5064 0 Td
-0 Tr
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
-0 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-23.6196 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 3.2805 3.2805 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
-0 Tc
-0 Tw
-(Spool) Tx 1 0 Tk
-(\r) TX
-TO
-U
-%AI8_EndBrushPattern
-%AI8_BeginBrushPattern
-(New Pattern 43)
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
--7883.749 8585.8232 m
--7870.9414 8585.8232 L
--7870.9414 8557.1563 L
--7883.749 8557.1563 L
--7883.749 8585.8232 L
-n
-0 O
-0.3 g
--7870.9414 8574.5498 m
--7875.1558 8563.2031 L
--7875.3862 8562.5801 -7876.0439 8562.2598 -7876.6719 8562.4141 C
--7876.8018 8562.3506 -7876.9473 8562.3359 -7877.0889 8562.3164 C
--7875.771 8562.1797 -7874.7358 8561.1084 -7874.7358 8559.7627 c
--7874.7358 8558.3184 -7875.9009 8557.1563 -7877.3447 8557.1563 c
--7878.7842 8557.1563 -7879.9482 8558.3184 -7879.9482 8559.7627 c
--7879.9482 8561.1084 -7878.916 8562.1797 -7877.6016 8562.3164 C
--7877.7441 8562.3359 -7877.8809 8562.3506 -7878.0186 8562.4141 C
--7878.645 8562.2598 -7879.3018 8562.5801 -7879.5313 8563.2031 C
--7883.749 8574.5498 L
--7884 8575.2168 -7883.6543 8575.9688 -7882.9834 8576.2188 c
--7882.313 8576.4658 -7881.5664 8576.123 -7881.3193 8575.4531 C
--7880.1289 8572.2441 L
--7880.0054 8572.6758 -7879.876 8573.0762 -7879.7119 8573.4385 C
--7882.4902 8584.2402 L
--7882.668 8584.9375 -7882.252 8585.6416 -7881.5586 8585.8232 c
--7880.8657 8586 -7880.1626 8585.583 -7879.9766 8584.8867 C
--7877.5918 8575.5967 L
--7877.5049 8575.6084 -7877.4282 8575.6494 -7877.3447 8575.6494 c
--7877.2617 8575.6494 -7877.1855 8575.6084 -7877.0991 8575.5967 C
--7874.7129 8584.8867 L
--7874.5303 8585.583 -7873.8242 8586 -7873.1318 8585.8232 c
--7872.4385 8585.6416 -7872.0215 8584.9375 -7872.1978 8584.2402 C
--7874.9766 8573.4385 L
--7874.8154 8573.0762 -7874.6846 8572.6758 -7874.5625 8572.2441 C
--7873.3711 8575.4531 L
--7873.125 8576.123 -7872.3799 8576.4658 -7871.707 8576.2188 c
--7871.0391 8575.9688 -7870.6914 8575.2168 -7870.9414 8574.5498 C
-f
-U
-%AI8_EndBrushPattern
-%AI5_End_NonPrinting--
-%AI5_BeginPalette
-0 0 Pb
-1 1 1 1 ([Registration]) 0 Xs
-([Registration]) Pc
-0 0 0 0.15 (15%) 0 0 Xk
-(15%) Pc
-0 0 0 0.3 (30%) 0 0 Xk
-(30%) Pc
-0 0 0 0.5 (50%) 0 0 Xk
-(50%) Pc
-0 0 0 0.75 (75%) 0 0 Xk
-(75%) Pc
-(horizontal rules) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(horizontal rules) Pc
-(bi-direction diagonals) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(bi-direction diagonals) Pc
-(one direction diagonals) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(one direction diagonals) Pc
-(white dots) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(white dots) Pc
-(black dots) 0 0 1 1 0 0 0 0 0 [1 0 0 1 0 0] p
-(black dots) Pc
-PB
-%AI5_EndPalette
-%AI5_Begin_NonPrinting
-Np
-%AI8_BeginPluginObject
-(Adobe Brush Manager Order)
-(Adobe Brush Manager Order)
-( Adobe Scatter Brush Tool/ Scatter Brush 1/ Adobe Scatter Brush Tool/ ) -
-(Mainframe/ Adobe Scatter Brush Tool/ Client/ Adobe Scatter Brush Tool/) -
-( person/ Adobe Scatter Brush Tool/ Print spooler/ Adobe Scatter Brush ) -
-(Tool/ Folders/ Adobe Scatter Brush Tool/ Printer/ Adobe Scatter Brush ) -
-(Tool/ Client 1/ Adobe Scatter Brush Tool/ Mainframe 1/ Adobe Scatter B) -
-(rush Tool/ Print Server/) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Client)
-(1 /New Pattern 19/ 0 0.0784314 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Client 1)
-(1 /New Pattern 19/ 0 0.0784314 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Folders)
-(1 /New Pattern 9/ 0 0.160784 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Mainframe)
-(1 /New Pattern 23/ 0 0.184314 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Mainframe 1)
-(1 /New Pattern 40/ 0 0.184314 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(person)
-(1 /New Pattern 43/ 0 0.701961 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Print Server)
-(1 /New Pattern 21/ 0 0.184314 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Print spooler)
-(1 /New Pattern 42/ 0 1 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Printer)
-(1 /New Pattern 10/ 0 0.160784 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI8_BeginPluginObject
-(Adobe Scatter Brush Tool)
-(Scatter Brush 1)
-(1 /New Pattern 22/ 0 0.2 / 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0) .
-%AI8_EndPluginObject
-%AI5_End_NonPrinting--
-%AI5_Begin_NonPrinting
-Np
-%AI8_PluginGroupInfo
-(Adobe Path Blends) (Adobe Blends Plugin) (Live Blends)
-%AI8_PluginGroupInfo
-(Adobe PatternOnPath Brush Tool) (Adobe Pattern Brush Plugin) (Art Brush Tool)
-%AI8_PluginGroupInfo
-(Adobe ArtOnPath Brush Tool) (Adobe Art Brush Plugin) (Art Brush Tool)
-%AI8_PluginGroupInfo
-(Adobe Calligraphic Brush Tool) (Undo New Calligraphic Brush) (Calligraphic Brush Tool)
-%AI8_PluginGroupInfo
-(Adobe Scatter Brush Tool) (Adobe Scatter Brush Plugin) (Scatter Brush Tool)
-%AI5_End_NonPrinting--
-%%EndSetup
-%AI5_BeginLayer
-1 1 1 1 0 0 1 0 79 128 255 0 50 Lb
-(Layer 1) Ln
-0 A
-1 Ap
-0 O
-0.95 g
-0 R
-0 G
-800 Ar
-0 J 0 j 0.5 w 4 M []0 d
-%AI3_Note:
-0 D
-1 XR
-501.71 169.1504 m
-153.71 169.1504 L
-153.71 589.1504 L
-501.71 589.1504 L
-501.71 169.1504 L
-(b) *
-0 Ap
-1 w
-0 XR
--7885 476.1484 m
-8498 476.1484 L
-(N) *
-u
-278.2988 366.5078 m
-326.5869 366.5078 L
-326.5869 452.4067 L
-278.2988 452.4067 L
-278.2988 366.5078 L
-n
-0 O
-0.64 g
-326.5869 445.2427 m
-324.6357 452.4067 L
-308.1064 452.4067 L
-306.2334 445.2427 L
-298.5684 445.2427 L
-296.4814 452.4067 L
-280.1719 452.4067 L
-278.2988 445.2427 L
-278.2988 445.2153 L
-326.5869 445.2153 L
-326.5869 445.2427 L
-f
-0.92 g
-278.2988 445.2153 m
-278.2988 366.5273 L
-286.6445 366.5273 L
-286.6445 370.2285 L
-286.6963 370.2285 L
-286.6963 445.2153 L
-278.2988 445.2153 L
-f
-326.5869 445.2153 m
-318.4482 445.2153 L
-318.4482 366.5078 L
-326.5869 366.5078 L
-326.5869 445.2153 L
-f
-0.8158 g
-286.6963 445.2153 m
-286.6963 370.2285 L
-318.3896 370.2285 L
-318.3896 366.5078 L
-318.4482 366.5078 L
-318.4482 445.2153 L
-286.6963 445.2153 L
-f
-0 R
-0.67 G
-0.5 w 3.8635 M
-298.5684 445.2427 m
-298.5771 370.2285 L
-S
-299.4189 445.2427 m
-299.4277 370.2285 L
-S
-300.2715 445.2427 m
-300.2803 370.2285 L
-S
-301.123 445.2427 m
-301.1309 370.2285 L
-S
-301.9746 445.2427 m
-301.9814 370.2285 L
-S
-302.8262 445.2427 m
-302.834 370.2285 L
-S
-303.6787 445.2427 m
-303.6846 370.2285 L
-S
-303.6631 445.2427 m
-303.6709 370.2285 L
-S
-304.5146 445.2427 m
-304.5234 370.2285 L
-S
-305.3662 445.2427 m
-305.375 370.2285 L
-S
-306.2188 445.2427 m
-306.2275 370.2285 L
-S
-U
-0 To
-1 0 0 1 303.8311 457.7568 0 Tp
-0 Tv
-TP
--32.827 0 Td
-0 Tr
-0 O
-0 g
-1 w 4 M
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
-0 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-23.6196 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 3.2805 3.2805 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-0 0 Tl
-0 Tc
-0 Tw
-(F) Tx 1 45 Tk
-(reeBSD Ser) Tx 1 -30 Tk
-(v) Tx 1 25 Tk
-(er) Tx 1 0 Tk
-(\r) TX
-TO
-0 To
-1 0 0 1 213.8311 386.7568 0 Tp
-0 Tv
-TP
--13.3193 0 Td
-0 Tr
-(Pr) Tx 1 -15 Tk
-(inter) Tx 1 0 Tk
-(\r) TX
-TO
-0 To
-1 0 0 1 390.3867 467.3257 0 Tp
-0 Tv
-TP
--6.2504 0 Td
-0 Tr
-(PC) Tx 1 0 Tk
-(\r) TX
-TO
-0 R
-0 G
-0.5 w
-217.0078 407.6445 m
-223.6318 406.6948 230.0293 408.6035 236.5386 407.7129 c
-242.2739 406.9282 251.585 409.6475 256.374 405.7373 c
-259.2319 403.4033 256.8335 403.853 255.4209 401.2061 c
-251.8193 394.4561 262.8799 392.4922 267.1919 391.708 c
-271.0522 391.0049 273.6836 390.2246 277.2637 388.5576 c
-281.0601 386.79 292.1436 381.0078 295.9917 383.6387 c
-299.3252 385.9189 298.2676 392.4941 298.7207 395.9209 c
-299.7368 403.6084 297.4468 409.623 303.6387 415.3564 c
-S
-u
-%_0 O
-%_0 g
-%_1 w 1 M
-%_222 413 m
-%_B
-%_U
-%_0 Ap
-0 A
-u
-0 O
-0 g
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-222 413 m
-F
-u
-0.8 g
-235.7314 403.9258 m
-255.7764 410.7832 l
-254.1958 413.6846 l
-241.5347 409.7285 l
-235.4683 413.6846 l
-235.7314 403.9258 l
-f
-0 R
-0.9 G
-0.5 w
-254.4678 413.8105 m
-241.5347 409.7285 l
-S
-0.5 G
-255.7764 410.7832 m
-254.1958 413.6846 l
-S
-0.25 G
-235.7314 403.9258 m
-255.7764 410.7832 l
-S
-0.5 G
-241.5347 409.7285 m
-235.4683 413.6846 l
-S
-0 O
-0.8 g
-1 w
-215.687 421.335 m
-227.8179 426.6094 l
-231.2476 422.3906 l
-215.687 421.335 l
-f
-1 Ap
-0.57 g
-235.9951 402.0801 m
-189.5747 402.0801 L
-189.5747 399.1797 L
-235.9951 399.1797 L
-235.9951 402.0801 L
-f
-0 Ap
-0 R
-0.5 G
-0.5 w
-227.8179 426.6094 m
-231.2476 422.3906 l
-S
-0.9 G
-215.687 421.335 m
-228.3799 426.8867 l
-S
-0 O
-0.8 g
-1 w
-188.2539 423.3721 m
-188.2539 402.0488 l
-237.0503 402.0488 l
-237.0503 419.2227 l
-233.6211 423.3125 l
-188.2539 423.3721 l
-f
-0 R
-0.5 G
-0.5 w
-188.2539 407.6182 m
-237.0503 407.6182 l
-S
-191.1563 420.0156 m
-200.6523 420.0156 l
-S
-191.1563 418.3672 m
-200.6523 418.3672 l
-S
-191.1563 416.7197 m
-200.6523 416.7197 l
-S
-191.1563 415.0713 m
-200.6523 415.0713 l
-S
-191.1563 413.4238 m
-200.6523 413.4238 l
-S
-237.0503 419.2227 m
-233.6211 423.3125 l
-S
-0.25 G
-188.2539 402.0488 m
-237.0503 402.0488 l
-237.0503 419.2227 l
-S
-0.9 G
-233.6211 423.3418 m
-188.2539 423.3418 l
-188.2539 401.7793 l
-S
-0.25 G
-235.9951 402.0488 m
-235.9951 399.1348 l
-189.5835 399.1348 l
-S
-U
-U
-(Adobe Scatter Brush Tool) 1 0 55 XP
-%010203043F8000003F8000003F8000003F80000000000000000000000000
-%0000000000000000000000000000000036A65072696E746572
-/Adobe_Brushed_Path () XT
-1 To
-1 0 0 1 281.519 400.9961 0 Tp
-0 Tv
-1 Ap
-0 O
-1 g
-0 G
-322.6641 377.0742 m
-281.519 377.0742 L
-281.519 400.9961 L
-322.6641 400.9961 L
-322.6641 377.0742 L
-b
-TP
-11.2536 -7.5 Td
-0 Tr
-0 g
-1 w
-%_ 0 50 XQ
-/_Helvetica 9 8.379 -2.0251 Tf
--2.5 Ts
-100 100 Tz
-0 Tt
-%_0 0 100 100 Xu
-%AI55J_GlyphSubst: GlyphSubstNone
-1 TA
-%_ 0 XL
-0 TY
-0 TV
-23.6196 0 Xb
-XB
-0 0 5 TC
-100 100 200 TW
-25 TG
-0 3.2805 3.2805 Ti
-1 Ta
-0 1 2 2 3 Th
-0 Tq
-240 Tg
-10 0 Tl
-0 Tc
-0 Tw
-(Pr) Tx 1 -15 Tk
-(int\r) Tx 1 0 Tk
--5.6841 -10 Td
-(System) Tx 1 0 Tk
-(\r) TX
-TO
-0 Ap
-0 R
-0 G
-0.5 w
-308.6152 430.79 m
-319.5049 432.8555 329.874 434.1938 341.0127 434.2627 c
-346.5908 434.2969 353.5547 433.0586 357.333 438.1875 c
-359.3633 440.9438 344.6357 443.0537 347.3252 444.3096 c
-352.249 446.6089 361.1465 445.8994 366.5117 446.0098 c
-369.8262 446.0776 373.1357 446.0195 376.4365 445.8389 c
-S
-1 To
-1 0 0 1 281.519 434.9224 0 Tp
-0 Tv
-1 Ap
-0 O
-1 g
-322.6641 411.0005 m
-281.519 411.0005 L
-281.519 434.9224 L
-322.6641 434.9224 L
-322.6641 411.0005 L
-b
-TP
-6.3166 -7.5 Td
-0 Tr
-0 g
-1 w
-(Samba\r) Tx 1 0 Tk
--0.747 -10 Td
-(System) Tx 1 0 Tk
-(\r) TX
-TO
-u
-%_0 Ap
-%_0 R
-%_0 G
-%_389.5166 445.5781 m
-%_S
-%_U
-%_0 Ap
-0 A
-u
-800 Ar
-0 J 0 j 1 w 4 M []0 d
-%AI3_Note:
-0 D
-0 XR
-389.5166 445.5781 m
-N
-u
-u
-u
-0 O
-0.7495 g
-0 R
-0.25 G
-1 j 0.5 w 2 M
-412.4863 428.0205 m
-412.4863 430.04 l
-406.126 433.4727 l
-389.5732 433.4727 L
-373.0195 433.4727 l
-366.458 430.04 l
-366.458 428.0205 l
-412.4863 428.0205 l
-b
-0.8748 G
-2 J 0 j
-389.5732 433.4727 m
-373.0195 433.4727 l
-366.458 430.04 l
-366.458 428.0205 l
-S
-412.4863 430.04 m
-406.126 433.4727 l
-389.5732 433.4727 L
-S
-0 O
-0.9 g
-0.25 G
-0 J 1 j
-373.1191 432.2607 m
-369.082 430.04 l
-409.6602 430.04 l
-406.2266 432.2607 l
-373.1191 432.2607 l
-b
-U
-u
-u
-0.7 g
-0 j 1 w 4 M
-378.334 436.3682 m
-380.6133 436.4111 L
-389.7148 437.9795 L
-398.9961 436.4111 L
-400.7891 436.4111 L
-400.7305 434.5693 L
-378.334 434.5693 L
-378.334 436.3682 L
-f
-0 R
-0.25 G
-0.5 w
-400.7617 436.3682 m
-400.668 434.5693 L
-378.3027 434.5693 L
-S
-0.9 G
-398.9609 436.3682 m
-400.7617 436.3682 L
-S
-0.25 G
-389.6543 437.9795 m
-398.9609 436.3682 L
-S
-0.9 G
-378.3027 434.5693 m
-378.3027 436.3682 L
-380.5557 436.3682 L
-389.6543 437.9795 L
-S
-U
-u
-0 O
-0.7 g
-1 w
-376.0918 439.4424 m
-385.3887 439.4893 L
-389.7471 441.2158 L
-394.3242 439.4893 L
-403.0371 439.4893 L
-402.9668 437.4648 L
-376.0918 437.4648 L
-376.0918 439.4424 L
-f
-0 R
-0.25 G
-0.5 w
-403.0039 439.4424 m
-402.8945 437.4648 L
-376.0547 437.4648 L
-S
-0.9 G
-394.2832 439.4424 m
-403.0039 439.4424 L
-S
-0.25 G
-389.6777 441.2158 m
-394.2832 439.4424 L
-S
-0.9 G
-376.0547 437.4648 m
-376.0547 439.4424 L
-385.3184 439.4424 L
-389.6777 441.2158 L
-S
-U
-u
-0 O
-0.7495 g
-0.25 G
-2 J 2 M
-374.5752 440.2705 m
-374.5684 462.1396 l
-375.5508 463.1357 L
-403.5293 463.1084 L
-404.4668 461.9697 L
-404.4668 440.5557 L
-403.6563 439.416 L
-375.4219 439.416 l
-374.5752 440.2705 L
-b
-/BBAccumRotation (4.712389) XT
-0.8748 G
-375.4219 439.416 m
-374.5752 440.2705 L
-374.5684 462.1396 l
-375.5508 463.1357 L
-403.5293 463.1084 L
-S
-/BBAccumRotation (4.712389) XT
-0 O
-0.9 g
-0.25 G
-401.4355 442.3037 m
-401.4531 460.2588 L
-377.5596 460.2588 L
-377.5576 442.3057 L
-401.4355 442.3037 L
-b
-/BBAccumRotation (4.712389) XT
-U
-U
-u
-0.15 G
-0 J 4 M
-406.126 433.4727 m
-389.5732 433.4727 L
-373.0195 433.4727 L
-366.458 430.04 L
-366.458 428.0205 L
-412.4863 428.0205 L
-412.4863 430.04 L
-406.126 433.4727 L
-s
-375.4219 439.416 m
-376.0547 439.416 L
-376.0547 437.4648 L
-376.0918 437.4756 L
-376.0918 437.4678 L
-376.0547 437.4648 L
-376.0918 437.4648 L
-386.7285 437.4648 L
-380.6133 436.4111 L
-378.334 436.3682 L
-378.3027 436.3682 L
-378.3027 434.5693 L
-378.334 434.5791 L
-378.334 434.5723 L
-378.3027 434.5693 L
-378.334 434.5693 L
-400.668 434.5693 L
-400.7305 434.5693 L
-400.7891 436.4111 L
-398.9961 436.4111 L
-392.7588 437.4648 L
-402.8945 437.4648 L
-402.9668 437.4648 L
-403.0352 439.416 L
-403.6563 439.416 L
-404.4668 440.5557 L
-404.4668 461.9697 L
-403.5293 463.1084 L
-375.5508 463.1357 L
-374.5684 462.1396 L
-374.5752 440.2705 L
-375.4219 439.416 L
-s
-U
-U
-U
-U
-(Adobe Scatter Brush Tool) 1 0 56 XP
-%010203043F8000003F8000003F8000003F80000000000000000000000000
-%0000000000000000000000000000000030E4436C69656E742031
-/Adobe_Brushed_Path () XT
-LB
-%AI5_EndLayer--
-%%PageTrailer
-gsave annotatepage grestore showpage
-%%Trailer
-Adobe_Illustrator_AI5 /terminate get exec
-Adobe_shading_AI8 /terminate get exec
-Adobe_ColorImage_AI6 /terminate get exec
-Adobe_typography_AI5 /terminate get exec
-Adobe_cshow /terminate get exec
-Adobe_level2_AI5 /terminate get exec
-%%EOF
diff --git a/en_US.ISO8859-1/books/corp-net-guide/Makefile b/en_US.ISO8859-1/books/corp-net-guide/Makefile
deleted file mode 100644
index f56c401d90..0000000000
--- a/en_US.ISO8859-1/books/corp-net-guide/Makefile
+++ /dev/null
@@ -1,25 +0,0 @@
-# $FreeBSD: doc/en_US.ISO_8859-1/books/design-44bsd/Makefile,v 1.2 2001/03/09 18:05:31 nik Exp $
-
-DOC?= book
-
-FORMATS?= html
-
-INSTALL_COMPRESSED?=gz
-INSTALL_ONLY_COMPRESSED?=
-
-SRCS= book.sgml
-
-IMAGES= 08-01.eps
-IMAGES+= 08-02.eps
-IMAGES+= 08-03.eps
-IMAGES+= 08-04.eps
-IMAGES+= 08-05.eps
-IMAGES+= 08-06.eps
-
-# Use the local DSSSL file
-DSLHTML?= ${.CURDIR}/freebsd.dsl
-DSLPRINT?= ${.CURDIR}/freebsd.dsl
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/books/corp-net-guide/book.sgml b/en_US.ISO8859-1/books/corp-net-guide/book.sgml
deleted file mode 100644
index b817f240f8..0000000000
--- a/en_US.ISO8859-1/books/corp-net-guide/book.sgml
+++ /dev/null
@@ -1,3213 +0,0 @@
-<!-- $FreeBSD: doc/en_US.ISO8859-1/books/corp-net-guide/book.sgml,v 1.2 2001/04/18 02:03:23 bmah Exp $ -->
-<!-- FreeBSD Documentation Project -->
-
-<!DOCTYPE book PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN">
-
-<book>
- <bookinfo>
- <title>The FreeBSD Corporate Networker's Guide</title>
-
- <author>
- <firstname>Ted</firstname>
- <surname>Mittelstaedt</surname>
- </author>
-
- <copyright>
- <year>2000</year>
- <holder>Addison-Wesley Longman, Inc</holder>
- </copyright>
-
- <isbn>ISBN: 0-201-70481-1</isbn>
-
- <legalnotice>
- <para>The eighth chapter of the book, <citetitle>The FreeBSD Corporate
- Networker's Guide</citetitle> is excerpted here with the permission
- of the publisher. No part of it may be further reproduced or
- distributed without the publisher's express written
- <email>Chanda.Leary-Coutu@awl.com</email>.
- The other chapters of
- <ulink url="http://www.awl.com/cseng/titles/0-201-70481-1">the
- book</ulink> covers topics such as system administration,
- fileserving, and e-mail delivery. More information about this book is
- available from the publisher, with whom you can also sign up to
- receive news of <ulink url="mailto:Chanda.Leary-Coutu@awl.com">related
- titles</ulink>. The author's web site for the book includes sample
- code, working examples,
- <ulink url="http://www.freebsd-corp-net-guide.com/errata.html">errata</ulink>
- and a Q&amp;A forum, and is available at
- <ulink url="http://www.freebsd-corp-net-guide.com/">http://www.freebsd-corp-net-guide.com/</ulink>.</para>
- </legalnotice>
- </bookinfo>
-
- <chapter label="8">
- <title>Printserving</title>
-
- <para>Printserving is a complicated topic. There are many different
- software interfaces to printers, as well as a wide variety of printer
- hardware interfaces. This chapter covers the basics of setting up a
- print queue, using Samba to print, and administering print queues and
- connections.</para>
-
- <sect1>
- <title>PC printing history</title>
-
- <para>In the early days of the personal computer, printing was simple.
- The PC owner bought a cheap printer, usually a dot matrix that barely
- supported ASCII, and plugged it into the computer with a parallel
- cable. Applications would either work with the printer or not, and
- most did because all they could do was output DOS or ASCII text. The
- few software applications that supported graphics generally could only
- output on specific makes and models of printers. Shared
- <emphasis>network</emphasis> printing, if it existed, was usually done
- by some type of serial port switchbox.</para>
-
- <para>This was the general state of affairs with the PC until the
- Windows operating system was released. All at once, application
- programmers were finally free of the restrictions of worrying about
- how some printer manufacturer would change printer control codes.
- Graphics printing, in the form of fonts and images, was added to most
- applications, and demand for it rapidly increased across the
- corporation. Large, high-capacity laser printers designed for office
- printing appeared on the scene. Printing went from 150 to 300 to
- 600dpi for the common desktop laser printer.</para>
-
- <para>Today organizational network printing is complex, and printers
- themselves are more complicated. Most organizations find that sharing
- a few high-quality laser printers is much more cost effective than
- buying many cheaper dot matrix units. Good network print serving is a
- necessity, and it can be very well provided by the FreeBSD UNIX
- system.</para>
- </sect1>
-
- <sect1>
- <title>Printer communication protocols and hardware</title>
-
- <para>Printers that don't use proprietary vendor codes communicate with
- computers using one or more of three major printing protocols. The
- communication is done over a hardware cable that can be a parallel
- connection (printer port) or a serial connection (COM port).</para>
-
- <sect2>
- <title>ASCII Printing Protocol</title>
-
- <para>The ASCII protocol is the simplest protocol used, as well as the
- oldest. ASCII is also used to represent text files internally in
- the DOS, UNIX, and Windows operating systems. Therefore, data taken
- from a text file or a directory listing generally requires little
- preparation before being sent to the printer, other than a
- newline-to-carriage return/linefeed conversion for UNIX. Printers
- usually follow the DOS text file convention of the print head
- requiring an explicit carriage return character followed by a
- linefeed character at the end of a line of text. Since UNIX uses
- only the linefeed character to terminate text, an additional
- carriage return character must be added to the end of each line in
- raw text print output; otherwise, text prints in a
- <emphasis>stairstep</emphasis> output. (Some printers have hardware
- or software switches to do the conversion)</para>
- </sect2>
-
- <sect2>
- <title>PostScript Printing Protocol</title>
-
- <para>Adobe introduced the PostScript language in 1985; it is used to
- enable the printout of high quality graphics and styled font text.
- PostScript is now the de-facto print standard in the UNIX community,
- and the only print standard in the Macintosh community. Numerous
- UNIX utilities exist to <emphasis>beautify</emphasis> and enhance
- text printing with PostScript. PostScript can be used to download
- font files into a printer as well as the data to be printed.
- PostScript commands can be sent to instruct the printer CPU to
- image, rotate, and scale complex graphics and images, thus freeing
- the host CPU. Scaling is particularly important with fonts since
- the document with the font has been produced on a computer screen
- with far lower resolution than the printer. For example, a 1024x768
- computer screen on a 17-inch monitor allows for a resolution of
- approximately 82dpi, a modern desktop printer prints at a resolution
- of 600dpi. Therefore, a font must be scaled at least seven times
- larger for WYSIWYG output!</para>
-
- <para>PostScript printers generally come with a number of resident
- fonts. For example, the NEC Silentwriter 95 contains Courier,
- Helvetica, ITC Avant Garde Gothic Book, ITC Bookman Light, New
- Century Schoolbook Roman, Palatino Roman, Times Roman, and several
- symbol fonts. These are stored in Read Only Memory (ROM) in the
- printer. When a page is printed from a Windows client that contains
- a font not in the printer, a font substitution table is used. If no
- substitute can be made, Courier is usually used. The user should be
- conscious of this when creating documents - documents with fonts not
- listed in the substitution table may cause other users problems when
- printing. Avoid use of strange fonts for documents that will be
- widely distributed.</para>
-
- <para>The user program can choose to download different fonts as
- outline fonts to the PostScript printer if desired. Fonts that are
- commonly used by the user are often downloaded to PostScript
- printers that are connected directly to the user's computer, the
- fonts are then available to successive print jobs until the printer
- is turned off. When PostScript printers are networked, the clients
- must download any fonts desired <emphasis>with each print
- job</emphasis>. Since jobs come from different clients, the
- clients cannot assume that downloaded fonts will still be in the
- printer.</para>
-
- <para>PostScript print jobs also contain a header that is sent
- describing the page layout, among other things. On a shared network
- printer, this header must also be downloaded with each print job.
- Although some PostScript drivers allow downloading of the header
- only once, this usually requires a bi-directional serial connection
- to the printer, instead of a unidirectional parallel
- connection.</para>
-
- <para>PostScript print jobs can be sent either as binary data or as
- ASCII. The main advantage of binary data transmission is that it is
- faster. However, not all PostScript printers support it. Also,
- fonts can generally not be downloaded in binary. When FreeBSD is
- used as a printserver, ASCII PostScript printing should be selected
- on the clients, this is generally the default with most PostScript
- drivers.</para>
-
- <para>The Adobe company licenses PostScript interpreters as well as
- resident fonts to printer manufacturers, and extracts a hefty
- license fee from any printer manufacturer who wants to use them in
- its printer. This presents both a benefit and a problem to the end
- user. Although a single company holding control over a standard can
- guarantee compliance, it does significantly raise the cost of the
- printer. As a result, PostScript has not met with much success in
- lower-end laser and inkjet Windows printing market, despite the fact
- that Adobe distributes PostScript software operating system drivers
- for free.</para>
-
- <para>One issue that is a concern when networking PostScript printers
- is the selection of banner page, (also known as header page, or
- <emphasis>burst page)</emphasis> printing. UNIX shared printing
- began with ASCII line printers, and since UNIX is a multiuser
- system, often many different user print jobs piled up in the printer
- output hopper. To separate these jobs the UNIX printing system
- programs support banner page printing if the client program that
- submits jobs asks for them. These pages print at the beginning or
- end of every print job and contain the username, submittal date, and
- so on.. By default, most clients, whether remote (e.g., a Windows
- LPR client) or local (e.g., the <command>/usr/bin/lpr</command>
- program) trigger a banner page to be printed. One problem is that
- some PostScript printers abort the entire job if they get
- unformatted ASCII text instead of PostScript. (In general,
- PostScript printers compatible with Hewlett-Packard Printer Control
- Language [HPPCL] handle banners without problems) Banner printing
- should be disabled for any printers with this problem, unless
- PostScript banner page printing is set up on the server.</para>
- </sect2>
-
- <sect2>
- <title>HPPCL Printing Protocol</title>
-
- <para>The Hewlett Packard company currently holds the largest market
- share of desktop inkjet and office laser printers. Back when
- Windows was released, HP decided to expand into the desktop laser
- jet market with the first LaserJet series of printers. At the time
- there was much pressure on Microsoft to use Adobe Type Manager for
- scaleable fonts within Windows, and to print PostScript to
- higher-end printers. Microsoft decided against doing this and used
- a technically inferior font standard, Truetype. They thought that
- it would be unlikely that the user would download fonts to the
- printer, since desktop Publishing was not being done on PC's at the
- time. Instead users would rasterize the entire page to the printer
- using whatever proprietary graphics printer codes the selected
- printer needed. HP devised HPPCL for their LaserJets, and make
- PostScript an add-on. The current revision of HPPCL now allows for
- many of the same scaling and font download commands that PostScript
- does. HP laser jet printers that support PostScript can be
- distinguished by the letter "M" in their model number. (M is for
- Macintosh, since Macintosh requires PostScript to print) For
- example, the HP 6MP has PostScript, the 6P doesn't.</para>
-
- <para>HPPCL has almost no support in the UNIX applications market, and
- it is very unlikely that any will appear soon. One big reason is
- the development of the free <application>Ghostscript</application>
- PostScript interpreter. <application>Ghostscript</application> can
- take a PostScript input stream and print it on a PCL printer under
- UNIX. Another reason is the UNIX community's dislike of reinventing
- the wheel. HPPCL has no advantage over PostScript, and in many ways
- there are fewer problems with PostScript. Considering that
- PostScript can be added to a printer, either by hardware or use of
- <application>Ghostscript</application>, what is the point of
- exchanging an existing working solution for a slightly technically
- inferior one? Over the life of the printer, taking into account the
- costs of toner, paper, and maintenance, the initial higher cost of
- PostScript support is infinitesimal.</para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Network Printing Basics</title>
-
- <para>The most common network printing implementation is a printserver
- accepting print jobs from clients tied to the server via a network
- cable.</para>
-
- <sect2>
- <title>Printservers</title>
-
- <para>The term "printserver" is one of those networking terms, like
- <emphasis>packet,</emphasis> that has been carelessly tossed around
- until it's meaning has become somewhat confusing and blurred. To be
- specific, a printserver is simply a program that arbitrates print
- data from multiple clients for a single printer. Printservers can
- be implemented in one of the four methods described in the following
- sections.</para>
-
- <sect3>
- <title>Printserver on the fileserver</title>
-
- <para>The printer can be physically cabled to the PC running the
- Network OS. Print jobs are submitted by clients to the
- printserver software on the fileserver, which sends them down the
- parallel or serial cable to the printer. The printer must be
- physically close to the fileserver. This kind of printserving is
- popular in smaller workgroup networks, in smaller offices.</para>
-
- <figure>
- <title>Printserver on the fileserver</title>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="08-01" format="EPS">
- </imageobject>
-
- <textobject>
- <literallayout class="monospaced"> ,---------.
- | ======= | Server
- | ======= | +---------------------+ ,-----.
-+-----------+ | +---------------+ | | |
-| Printer [ ]------------[ ] | Printserver | | |_____|
-+-----------+ Parallel | | Software | [ ]------_________
- Cable | +---------------+ | / ::::::: \
- +---------------------+ `---------'
- Network PC</literallayout>
- </textobject>
-
- <textobject>
- <phrase>Printer, connected to a network server running
- printserver software, with one or more network PCs printing
- through it.</phrase>
- </textobject>
- </mediaobject>
- </figure>
- </sect3>
-
- <sect3>
- <title>Printserver on a separate PC</title>
-
- <para>It is possible to run a print server program on a cheap PC
- that is located next to the printer and plugged into it via
- parallel cable. This program simply acts as a pass-through
- program, taking network packets from the network interface and
- passing them to the printer. This kind of server doesn't allow
- any manipulation of print jobs, jobs usually come from a central
- fileserver, where jobs are controlled.</para>
-
- <figure>
- <title>Printserver on a separate PC</title>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="08-02" format="EPS">
- </imageobject>
-
- <textobject>
- <literallayout class="monospaced"> Fileserver
- ,----------------.
- ,---------. .---| | === |
- | ======= | ,-----. | `----------======'
- | ======= | | | |
- +-----------+ |_____| |
- | Printer [ ]------------_________---------| Ethernet
- +-----------+ Parallel / ::::::: \ |
- Cable `---------' |
- Printserver | ,-----.
- | | |
- | |_____|
- `---------_________
- / ::::::: \
- `---------'
- Network PC</literallayout>
- </textobject>
-
- <textobject>
- <phrase>Printer connected to a printserver (typically running
- FreeBSD), with network files hosted on a separate machine,
- and a network PC, able to access both resources.</phrase>
- </textobject>
- </mediaobject>
- </figure>
- </sect3>
-
- <sect3>
- <title>Printserver on a separate hardware box</title>
-
- <para>A printserver on a separate hardware box is exemplified by
- network devices such as the Intel Netport, the HP JetDirect Ex,
- the Osicom/DPI NETPrint, and the Lexmark MarkNet. Basically, these
- are plastic boxes with an Ethernet connection on one side and a
- parallel port on the other. Like a printserver on a PC, these
- devices don't allow remote job manipulation, and merely pass
- packets from the network down the parallel port to the
- printer.</para>
-
- <figure>
- <title>Printserver on a separate hardware box</title>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="08-03" format="EPS">
- </imageobject>
-
- <textobject>
- <literallayout class="monospaced"> Fileserver
- ,----------------.
- ,---------. .---| | === |
- | ======= | | `----------======'
- | ======= | Printserver |
- +-----------+ ,--------. |
- | Printer [ ]-----------[ ] ooo [ ]-------| Ethernet
- +-----------+ Parallel `--------' |
- Cable |
- | ,-----.
- | | |
- | |_____|
- `---------_________
- / ::::::: \
- `---------'
- Network PC</literallayout>
- </textobject>
-
- <textobject>
- <phrase>Printer connected to a dedicated print server
- <quote>appliance</quote>.</phrase>
- </textobject>
- </mediaobject>
- </figure>
- </sect3>
-
- <sect3>
- <title>Printserver in the Printer</title>
-
- <para>The HP JetDirect Internal is the best known printserver of
- this type. It is inserted into a slot in the printer case, and it
- works identically to the external JetDirect units.</para>
-
- <figure>
- <title>Printeserver in the printer</title>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="08-04" format="EPS">
- </imageobject>
-
- <textobject>
- <literallayout class="monospaced"> Fileserver
- ,----------------.
- ,---------. .---| | === |
- | ======= | | `----------======'
- | ======= | |
- +-----------+ |
- | Printer [ ]------------------------------| Ethernet
- +-----------+ |
- |
- | ,-----.
- | | |
- | |_____|
- `---------_________
- / ::::::: \
- `---------'
- Network PC</literallayout>
- </textobject>
-
- <textobject>
- <phrase>Printer with an embedded print server, connecting
- directly to the local network.</phrase>
- </textobject>
- </mediaobject>
- </figure>
- </sect3>
- </sect2>
-
- <sect2>
- <title>Printspools</title>
-
- <para>Printspooling is an integral part of network printing. Since
- the PC can spit out data much faster than the printer can accept it,
- the data must be buffered in a spool at some location. In addition,
- because many clients share printers, when clients send print jobs at
- the same time, jobs must be placed on a queue so that one can be
- printed after the other.</para>
-
- <sect3>
- <title>Logical location of the print spool</title>
-
- <para>Printspooling can be implemented at one of three
- locations</para>
-
- <orderedlist>
- <listitem>
- <para>The client. Clients can be required to spool their own
- print jobs on their own disks. For example, when a Windows
- client application generates a print job the job must be
- placed on the local client's hard drive. Once the remote
- print server is free to accept the job it signals the client
- to start sending the job a bit at a time. Client spooling is
- popular in peer-to-peer networks with no defined central
- fileserver. However, it is impossible for a central
- administrator to perform advanced print job management tasks
- such as moving a particular print job ahead of another, or
- deleting jobs.</para>
- </listitem>
-
- <listitem>
- <para>The printserver. If each printer on the network is
- allocated their own combination print spooler-printserver,
- jobs can stack at the printer. Many of the larger printers
- with internal printservers have internal hard disks for this
- purpose. Although this enables basic job management, it still
- restricts the ability to move jobs from one printer to
- another.</para>
- </listitem>
-
- <listitem>
- <para><emphasis>A central print spooler on a
- fileserver</emphasis>. Print jobs are received from all
- clients on the network in the spool and then dispatched to the
- appropriate printer. This scheme is the best for locations
- with several busy printers and many clients. Administration
- is extremely simple because all print jobs are spooled on a
- central server, which is particularly important in bigger
- organizations. Many large organizations have standardized on
- PostScript printing for all printing; in the event that a
- particular printer fails and is offline, incoming PostScript
- print jobs can be rerouted automatically to another printer.
- Since all printers and clients are using PostScript, clients
- don't need to be reconfigured when this happens. Print jobs
- appear the same whether printed on a 4 page-per-minute NEC
- Silentwriter 95, or a 24 page-per-minute HP LaserJet 5SiMX if
- both printers are defined in the client as PostScript
- printers.</para>
- </listitem>
- </orderedlist>
-
- <figure>
- <title>Print spool locations</title>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="08-05" format="EPS">
- </imageobject>
-
- <textobject>
- <literallayout class="monospaced"> Client
- ,---------. PC
- | ======= | ,-----.
- | ======= | | |
- +-----------+ |_____|
- | Printer [ ]---------------------------------------------------_________
- +-----------+ / ::::::: \
- `---------'
- Spool
-
- Printserver
- ,---------. PC
- | ======= | ,-----.
- | ======= | | |
- +-----------+ ,----------------. |_____|
- | Printer [ ]--------------| | === |-------------------_________
- +-----------+ `----------======' / ::::::: \
- Spool `---------'
-
-
- Fileserver
- ,---------. PC
- | ======= | ,-----.
- | ======= | Printserver Fileserver | |
- +-----------+ ,----------------. ,----------------. |_____|
- | Printer [ ]----| | === |-----| | === |------_________
- +-----------+ `----------======' `----------======' / ::::::: \
- Spool `---------'</literallayout>
- </textobject>
-
- <textobject>
- <phrase>Possible locations for the print spool</phrase>
- </textobject>
- </mediaobject>
- </figure>
-
- <para>FreeBSD is an excellent platform to implement centralized
- printserving and print spooling. The rest of this chapter
- concentrates on the centralized print spooler model. Note that
- PostScript printing is not a requirement for this model--the HPPCL
- protocol can be the standard print protocol as well. For
- transparent printing between printers with HPPCL, however, the
- printer models must be similar.</para>
- </sect3>
-
- <sect3>
- <title>Physical location of the print spool</title>
-
- <para>In some companies, the central fileserver is often placed in a
- closet, locked away. Printers, on the other hand, are best
- located in high traffic areas for ease of use. Network printing
- works best when the printers are evenly distributed throughout the
- organization. Attempting to place all the major printers in one
- location, as technically advantageous as it may seem, merely
- provokes users to requisition smaller printers that are more
- convenient for that quick print job. The administrator may end up
- with a datacenter full of nice, expensive printers that are never
- used, while the smaller personal laser printers scattered
- throughout the plant bear most of the printing load.</para>
-
- <para>The big problem with this is that scattering printers through
- the organization makes it difficult to utilize the 3 possible
- parallel ports on the fileserver due to parallel port distance
- limitations. Although high-speed serial ports may extend the
- distance, not many printers have good serial ports on them. This
- is where the hardware network print server devices can come into
- play. I prefer using these devices because they are much cheaper
- and more reliable than a standalone PC running printserver
- software. For example, Castelle
- <ulink url="http://www.castelle.com">http://www.castelle.com</ulink>
- sells the LANpress 1P/10BT printserver for about $170.00. Using
- these devices a FreeBSD UNIX server can have dozens of print spools
- accepting print jobs and then route them back out over the network
- to these remote printserver boxes. If these hardware servers are
- used, they must support the Line Printer Daemon (LPD) print
- protocol.</para>
-
- <para>With a scheme like this it is important to have enough disk
- space on the spool to handle the print jobs. A single large
- PowerPoint presentation PostScript print job containing many
- graphics may be over 100MB. When many such jobs stack up in the
- print spool waiting to print, the print spooler should have
- several gigabytes of free disk space available.</para>
- </sect3>
-
- <sect3>
- <title>Network Printing to Remote Spools</title>
-
- <para>Although several proprietary network printing protocols such
- as Banyan Vines and NetWare, are tied to proprietary protocols,
- FreeBSD Unix can use two TCP/IP network printing protocols to
- print to remote print spools. The two print protocols available
- on TCP/IP with FreeBSD are the open LPD protocol and the
- NetBIOS-over-TCP/IP Server Messaging Block (SMB) print protocol
- first defined by Intel and Microsoft and later used by IBM and
- Microsoft.</para>
-
- <para>The LPD protocol is defined in RFC1179 This network protocol
- is the standard print protocol used on all UNIX systems. LPD
- client implementations exist for all Windows operating systems and
- DOS. Microsoft has written LPD for the Windows NT versions, the
- other Windows operating system implementations are provided by
- third parties.</para>
-
- <para>The Microsoft Networking network protocol that runs on top of
- SMB can use NetBIOS over TCP/IP as defined in RFC1001 and RFC1002.
- This protocol has a specification for printing that is the same
- print protocol used to send print jobs to NT Server by Microsoft
- clients. To implement this protocol on FreeBSD requires the
- installation of the Samba client suite of programs discussed in
- Chapter 7.</para>
- </sect3>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Setting up LPR on Windows clients</title>
-
- <para>The program clients use to print via LPD is the Line Printer
- Remote, or LPR program. The following instructions cover enabling
- this program on Windows clients.</para>
-
- <sect2>
- <title>Windows 3.1/Windows for Workgroups 3.11</title>
-
- <para>Several commercial TCP/IP stacks are available for Win31, that
- provide LPR client programs, in addition to the basic TCP/IP
- protocol to Win31. WfW has TCP/IP networking available for free
- from Microsoft, but it doesn't include an LPR client. Unfortunately,
- I have not come across a freeware implementation of a 16-bit Windows
- LPR client, so with the following instructions I use the Shareware
- program WLPRSPL available from <ulink
- url="http://www.winsite.com/info/pc/win3/winsock/wlprs41.zip">http://www.winsite.com/info/pc/win3/winsock/wlprs41.zip</ulink>.
- This program must be active during client printing, and is usually
- placed in the Startup group.</para>
-
- <para>Organizations that want to use UNIX as a printserver to a group
- of Win31 clients without using a commercial or shareware LPR program
- have another option. The Microsoft Networking client for DOS used
- underneath Win31 contains SMB-based printing which is covered later
- in the chapter. DOS networking client setup and use are covered in
- Chapter 2 and Chapter 7.</para>
-
- <para>If LPR-based client printing is desired and the organization
- doesn't want to upgrade to Win95, (which has several LPR clients
- available) the following instructions can be used. WLPRSPL needs a
- Winsock under Windows 3.1, so for the example I explain the setup of
- the Novell 16-bit TCP/IP client. The stack can be FTPed from
- Novell, and is easy to integrate into sites that already use the
- 16-bit NetWare networking client, usually NW 3.11 and 3.12. In most
- cases, however, sites that use NetWare + Win31 are probably best off
- printing through the NetWare server, then loading an LPR spooler as
- an Netware Loadable Module (NLM) to send the job over to
- FreeBSD.</para>
-
- <para>As an alternate, the Microsoft Networking DOS 16-bit TCP/IP
- client under Win31 contains a Winsock, as does Microsoft TCP/IP for
- WfW. The target machine used here is a Compaq Deskpro 386/33 with
- 12MB of ram with an operating version of Windows 3.1, and a 3com
- 3C579 EISA network card. The instructions assume an LPR printserver
- on the network, named <hostid>mainprinter.my.domain.com</hostid>
- with a print queue named RAW.</para>
-
- <para>Use the installation instructions in Exhibit 8.1 for a quick and
- dirty TCP/IP Winsock for Win31 systems. Administrators who already
- have the Novell IPX client installed should skip those steps.</para>
- </sect2>
-
- <sect2>
- <title>Installation of the Novell TCP/IP Winsock client</title>
-
- <procedure>
- <step>
- <para>Make sure that the machine has enough environment space
- (2048 bytes or more) by adding the following line to the
- <filename>config.sys</filename> file and rebooting:</para>
-
- <programlisting>SHELL=C:\COMMAND.COM /E:2048 /P</programlisting>
- </step>
-
- <step>
- <para>Obtain the <filename>TCP16.EXE</filename> file from
- <ulink url="ftp3.novell.com/pub/updates/eol/nweol/tcp16.exe">ftp3.novell.com/pub/updates/eol/nweol/tcp16.exe</ulink>.</para>
- </step>
-
- <step>
- <para>Obtain the Network Adapter support diskette for the network
- card in your machine. This should be supplied with the card, or
- available via FTP from the network adapter manufacturer's FTP
- site.</para>
- </step>
-
- <step>
- <para>Now you need the file <filename>LSL.COM</filename>. This is
- available on some Network Adapter Driver diskettes, it used to
- be available from the <filename>VLM121_2.EXE</filename> file
- from Novell but unfortunately this file is no longer publicly
- accessible from Novell.</para>
- </step>
-
- <step>
- <para>If you have <filename>vlm121_2.exe</filename> in a temporary
- directory, run it. This will extract a number of files.</para>
- </step>
-
- <step>
- <para>One of the files extracted is <filename>LSL.CO_</filename>
- extract this file with the command <command>nwunpack
- lsl.co_</command>.</para>
- </step>
-
- <step>
- <para>Create the directory <filename>c:\nwclient</filename>. Then,
- copy <filename>lsl.com</filename> from the temporary directory
- into the directory.</para>
- </step>
-
- <step>
- <para>Obtain and install the printer driver for the model of
- printer that you will be spooling to and point it to
- <devicename>LPT1:</devicename>. Win31 and WfW 3.11 have an
- incomplete printer driver list, so if you need a driver
- Microsoft has many Win16 printer drivers on their FTP site. A
- list is available at
- <ulink
- url="ftp://ftp.microsoft.com/Softlib/index.txt">ftp://ftp.microsoft.com/Softlib/index.txt</ulink>.
- In addition, if you are installing a PostScript printer driver
- for a printer supplied in Win31, it may be necessary to patch
- the driver. The Microsoft PostScript driver supplied in Win31
- is version 3.5. (The patch named
- <filename>PSCRIP.EXE</filename> which brought the PostScript
- driver to version 3.58 is no longer publicly available.) WfW
- already uses the more recent PostScript driver, as does Win31
- version A. Installing the Adobe Postscript driver for Win31 is
- also an option. (see
- <ulink url="http://www.adobe.com/support/downloads/pdrvwin.htm">http://www.adobe.com/support/downloads/pdrvwin.htm</ulink>
- for the version 3.1.2 Win31 PostScript driver).</para>
- </step>
-
- <step>
- <para>Look on the network adapter driver disk for the subdirectory
- <filename>nwclient/</filename> and then look for the ODI driver
- with the adapter card. For example, on the 3com 3C509/3C579
- adapter driver disk, the driver and location are
- <filename>\NWCLIENT\3C5X9.COM</filename>. Copy this driver to
- the <filename>c:\nwclient</filename> directory.</para>
- </step>
-
- <step>
- <para>Create a file called <filename>NET.CFG</filename> in the
- <filename>c:\nwclient</filename> directory. Often, the network
- card adapter driver diskette has a template for this file in the
- same location as the ODI driver. This can be modified, as can
- the following example:</para>
-
- <programlisting>LINK SUPPORT
-
-BUFFERS 4 1600
-
-MEMPOOL 8192
-
-LINK DRIVER
-3C5X9
-
-; PORT 300 (these are optional, if needed by card uncomment)
-
-; INT 10 (optional, uncomment and modify if needed)</programlisting>
- </step>
-
- <step>
- <para>Attempt to load the network card driver. First load
- <filename>lsl</filename>, then the ODI driver. With the 3com
- card the commands are:</para>
-
- <screen><userinput>lsl</userinput>
-<userinput>3c5x9</userinput></screen>
-
- <para>If the driver properly loads it will list the hardware port
- and interrupt settings for the network adapter. If it has
- loaded properly, unload the drivers in reverse order with the
- <option>/u</option> command:</para>
-
- <screen><userinput>3c5x9 /u</userinput>
-<userinput>lsl /u</userinput></screen>
- </step>
-
- <step>
- <para>Go to the temporary directory that contains the
- <filename>tcp16.exe</filename> file and extract it by running
- the program.</para>
- </step>
-
- <step>
- <para>Run the install batch file by typing
- <command>installr</command>. It should list <literal>New
- Installation detected</literal>. It will then copy a number
- of files into <filename>nwclient</filename>, add some
- commented-out sections to <filename>net.cfg</filename>, and call
- <command>edit</command> on <filename>net.cfg</filename>.</para>
- </step>
-
- <step>
- <para>Read the editing instructions and make the appropriate
- entries. The sample <filename>net.cfg</filename> file from
- above would look like this.</para>
-
- <programlisting>LINK SUPPORT
-
-BUFFERS 4 1600
-
-MEMPOOL 8192
-
-LINK DRIVER 3C5X9
-
-FRAME ETHERNET_II
-
-Protocol TCPIP
-
-PATH TCP_CFG c:\nwclient
-
-ip_address 192.168.1.54 LAN_NET
-
-ip_netmask 255.255.255.0 LAN_NET
-
-ip_router 192.168.1.1 LAN_NET
-
-Bind 3C5X9 #1 Ethernet_II LAN_NET</programlisting>
-
- <para>Save and exit, the Installer should list <literal>TCP16
- installation completed</literal>.</para>
- </step>
-
- <step>
- <para>Reload the client with the commands:</para>
-
- <screen><userinput>lsl</userinput>
-<userinput>3c5x9</userinput>
-<userinput>tcpip</userinput></screen>
-
- <para>The TCPIP driver should list the IP numbers and other
- information.</para>
- </step>
-
- <step>
- <para>Optionally, create either a <filename>HOSTS</filename> file,
- or a <filename>RESOLV.CFG</filename> file (pointing to a
- nameserver) in <filename>c:\nwclient</filename>. Check to see
- this is operating properly by pinging a hostname.</para>
-
- <para>Add the <filename>c:\nwclient</filename> directory to the
- <envar>PATH</envar>, as well as the 3 startup commands in step
- 15 in <filename>autoexec.bat</filename></para>
- </step>
- </procedure>
- </sect2>
-
- <sect2>
- <title>Installation of the LPR client on 16-bit Windows with a Winsock
- installed</title>
-
- <para>The following assumes a running Win31 installation with a
- Winsock or a running WfW installation with the 32-bit Microsoft
- TCP/IP protocol installed.</para>
-
- <procedure>
- <step>
- <para>Install the printer driver desired. See step 8 of the
- previous set of instructions.</para>
- </step>
-
- <step>
- <para>Obtain and extract into a temporary directory the
- <filename>wlprs41.zip</filename> file from the location
- mentioned above.</para>
- </step>
-
- <step>
- <para>Run <command>setup.exe</command> from the temporary
- directory containing the <filename>wlprs</filename> files
- are.</para>
- </step>
-
- <step>
- <para>In setup, accept default directory, and check Yes to add to
- its own group. Click <guibutton>Continue</guibutton> when asked
- for group name, and check whatever choice you want when asked to
- copy the <filename>doc</filename> files.</para>
- </step>
-
- <step>
- <para>Click <guibutton>No</guibutton> when asked to add the
- program to <literal>Startup</literal>.</para>
- </step>
-
- <step>
- <para>On the Unix FreeBSD print spooler, make sure that there is
- an entry in <filename>/etc/hosts.lpd</filename> or
- <filename>/etc/hosts.equiv</filename> for the client
- workstation, thereby allowing it to submit jobs.</para>
- </step>
-
- <step>
- <para>Double-click the Windows LPR Spooler icon in the Windows LPR
- Spooler group that is opened. When it asks for a valid spool
- directory, just select the <filename>c:\wlprspl</filename>
- directory that the program installed its files into.</para>
- </step>
-
- <step>
- <para>When asked for a valid Queue Definition File, just click
- <guibutton>OK</guibutton> to use the default filename. The
- program automatically creates a queue definition file.</para>
- </step>
-
- <step>
- <para>The program opens up with it's menu. Click
- <guibutton>Setup</guibutton> in the top menu, then select
- <guimenuitem>Define New Queue</guimenuitem>.</para>
- </step>
-
- <step>
- <para>For a local spool filename, just use the name of the remote
- queue (RAW) to which the client prints.</para>
- </step>
-
- <step>
- <para>For the remote printer name, use the same name as the remote
- queue (RAW) to which the client prints.</para>
- </step>
-
- <step>
- <para>For the remote hostname, use the machine name
- of the FreeBSD print spooler.
- <hostid role="fqdn"><replaceable>mainprinter.ayedomain.com</replaceable></hostid>.</para>
- </step>
-
- <step>
- <para>For the Description, enter a description such as
- <literal>3rd floor Marketing printer</literal>.</para>
- </step>
-
- <step>
- <para>For the protocol, leave the default of BSD LPR/LPD
- selected.</para>
- </step>
-
- <step>
- <para>Click on the <guimenuitem>Queue Properties</guimenuitem>,
- and make sure that the <guilabel>Print unfiltered</guilabel> is
- selected. If you're printing PostScript, then also click the
- <guibutton>Advanced options</guibutton> button. Make sure that
- <guilabel>Remove trailing Ctrl-D</guilabel> is
- <emphasis>unchecked</emphasis>, and that <guilabel>Remove
- Leading Ctrl-D</guilabel> is <emphasis>checked</emphasis>.
- Also with PostScript, if the printer cannot print ASCII, uncheck
- the <guilabel>Send header page</guilabel> box. (PostScript
- header/banner pages are discussed later in this chapter)</para>
- </step>
-
- <step>
- <para>Click <guibutton>OK</guibutton>. At the main menu of the
- program, click <guimenu>File</guimenu>, then <guimenu>Control
- Panel/Printers</guimenu> to bring up the Printers control
- panel of Windows.</para>
- </step>
-
- <step>
- <para>Make sure that the <guilabel>Use Print Manager</guilabel>
- button is checked, then highlight the printer driver and click
- the <guibutton>Connect</guibutton> button.</para>
- </step>
-
- <step>
- <para>Scroll down to the <guilabel>C:\WLPRSPL\RAW</guilabel> entry
- for the spool that was built and highlight this. Click
- <guibutton>OK</guibutton>.</para>
- </step>
-
- <step>
- <para>Minimize the Windows LPR Spooler. Copy the Windows LPR
- Spooler icon to the Startup group. Click
- <guimenu>File/Properties</guimenu> with the Windows LPR Spooler
- icon highlighted in the Startup group. Check the <guilabel>Run
- Minimized</guilabel> button.</para>
- </step>
-
- <step>
- <para>Exit Windows, and when the <guibutton>Save queue
- changes?</guibutton> button comes up, click
- <guibutton>Yes</guibutton>.</para>
- </step>
-
- <step>
- <para>Restart windows and make sure that the spooler starts
- up.</para>
- </step>
-
- <step>
- <para>Open the Control Panel and look for a new yellow icon named
- <guiicon>Set Username</guiicon> If you are running the Novell or
- other Winsock under Win31, click on this icon and put the
- username of the person using this computer into the space
- provided. If you are running WfW, this isn't necessary because
- Windows will supply the username.</para>
- </step>
-
- <step>
- <para>If the spooler is not started properly in some
- installations, there may be a bug. If placing the icon in the
- StartUp group doesen't actually start the spooler, the program
- name can be placed in the <literal>run=</literal> line of
- <filename>win.ini</filename>.</para>
- </step>
-
- <step>
- <para>Try printing a print job from an application such as
- Notepad. If everything goes properly, clicking on the
- <guimenuitem>Queues/Show remote printer status</guimenuitem>" in
- the Windows LPR menu should show the print job spooled and
- printing on the remote printserver.</para>
- </step>
- </procedure>
- </sect2>
-
- <sect2>
- <title>Installation of LPR client on Windows 95/98</title>
-
- <para>The <command>wlprspl</command> program also can be used under
- Windows 95, but as a 16-bit program, it is far from an optimal
- implementation on a 32-bit operating system. In addition, Win95 and
- it's derivatives fundamentally changed from Windows 3.1 in the
- printing subystem. For these reasons I use a different LPR client
- program for Win95/98 LPR printing instructions. It is a full 32-bit
- print program, and it installs as a <emphasis>Windows 32-bit
- printer</emphasis> <emphasis>port monitor</emphasis>. The program
- is called ACITS LPR Remote Printing for Windows 95 and it is located
- at <ulink
- url="http://shadowland.cc.utexas.edu/acitslpr.htm">http://shadowland.cc.utexas.edu/acitslpr.htm</ulink>.</para>
-
- <para>ACITS stands for Academic Computing and Instructional
- Technologies Services. The ACITS LPR client includes software
- developed by the University of Texas at Austin and its contributors,
- it was written by Glenn K. Smith, a systems analyst with the
- Networking Services group at the university. The filename of the
- archive in the original program was ACITSLPR95.EXE and as of version
- 1.4 it was free for individuals or organizations to use for their
- internal printing needs. Since that time, it has gotten so popular
- that the university has taken over the program, incremented the
- version number (to get out from under the free license) and is now
- charging a $35 per copy fee for commercial use for the newer
- versions. The older free version can still be found on overseas FTP
- servers, such as <ulink
- url="http://www.go.dlr.de/fresh/pc/src/winsock/acitslpr95.exe">http://www.go.dlr.de/fresh/pc/src/winsock/acitslpr95.exe</ulink>.</para>
-
- <para>It is likely that the cost of a shareware/commercial LPR program
- for Win95 plus the cost of Win95 itself will meet or exceed that of
- Win2K. As such, users wishing to print via LPR to FreeBSD UNIX
- systems will probably find it cheaper to simply upgrade to Windows
- NT Workstation or Win2K.</para>
-
- <para>ACITS LPR and Win95 have a few printing idosyncracies. Most
- Win95 programs, such as Microsoft Word, expect print output to be
- spooled on the local hard drive and then metered out to a printer
- that is plugged into the parallel port. Network printing, on the
- other hand, assumes that print output will go directly from the
- application to the remote print server. Under Win95, local ports
- have a setting under Properties, Details, Spool Settings labeled
- "Print directly to the printer". If this is checked, the
- application running on the desktop (such as Microsoft Word) will not
- create a little Printer icon with pages coming out of it or use
- other means of showing the progress of the job as it is built. This
- can be very disconcerting to the user of a network printer, so this
- option should be checked only with printers plugged directly into
- the parallel port. Worse, if this is checked with ACITS, it can
- cause the job to abort if the remote print spooler momentarily goes
- offline.</para>
-
- <para>Another local setting also should be changed. Generally, with
- local ports, Win95 builds the first page in the spooler and then
- starts printing it while the rest of the pages spool. If ACITS
- starts printing the first page while the rest of the pages are
- building, timeouts at the network layer can sometimes cause very
- large jobs to abort. The entire job should be set to completely
- spool before the LPR client passes it to the Unix spooler. The
- problem is partly the result of program design: because ACITS is
- implemented as a local printer port instead of being embedded into
- Win95 networking (and available in Network Neighborhood) the program
- acts like a local printer port in some ways.</para>
-
- <para>The LPR program can be set to deselect banner/burst page
- printing if a PostScript printer that cannot support ASCII is used.
- The burst pages referred to here are NOT generated by the Windows
- machine. Use the instructions in Exhibit 8.3 to install</para>
-
- <procedure>
- <title>LPR client on Win95/98 installation instructions</title>
-
- <step>
- <para>Obtain the <filename>ACITSLPR95.EXE</filename> file and
- place it in a temporary directory such as
- <filename>c:\temp1</filename>.</para>
- </step>
-
- <step>
- <para>Close all running programs on the desktop. The computer
- <emphasis>must</emphasis> be rebooted at completion of
- installation or the program will not work.</para>
- </step>
-
- <step>
- <para>Click <guibutton>Start</guibutton>,
- <guimenuitem>Run</guimenuitem> and type in
- <userinput>c:\temp1\acitslpr95</userinput> then click
- <guibutton>Yes</guibutton> at the InstallShield prompt.</para>
- </step>
-
- <step>
- <para>Click <guibutton>Next</guibutton>, then
- <guibutton>Yes</guibutton>. The program will run through some
- installation and then presents a Help screen that explains how
- to configure an LPR port.</para>
- </step>
-
- <step>
- <para>After the help screen closes, the program asks to reboot the
- system. Ensure that <guilabel>Yes</guilabel> is checked and
- click <guibutton>Finish</guibutton> to reboot.</para>
- </step>
-
- <step>
- <para>After the machine comes back up, install a Printer icon in
- the <guibutton>Start</guibutton>, <guimenu>Settings</guimenu>,
- <guimenuitem>Printers</guimenuitem> folder if one hasn't been
- created for the correct model of destination printer.</para>
- </step>
-
- <step>
- <para>With the Printers folder open, right-click over the printer
- icon that needs to use the LPR program and click on the
- <guilabel>Properties</guilabel> tab.</para>
- </step>
-
- <step>
- <para>Under the <guilabel>Details</guilabel> tab, click the
- <guilabel>Add Port</guilabel> tab, then click
- <guibutton>Other</guibutton>.</para>
- </step>
-
- <step>
- <para>Highlight the <guilabel>ACITS LPR Remote Printing</guilabel>
- line and click <guibutton>OK</guibutton>.</para>
- </step>
-
- <step>
- <para>The Add ACITS LPR screen opens. Type in the hostname of the
- UNIX system that the client spools through&mdash;
- <hostid role="fqdn"><replaceable>mainprinter.ayedomain.com</replaceable></hostid>.</para>
- </step>
-
- <step>
- <para>Type in the Printer/Queue name and click
- <guibutton>OK</guibutton>. (Some versions have a "Verify Printer
- Information" button.) The LPR program then contacts the UNIX
- host and makes sure that the selected printer is
- available.</para>
-
- <note>
- <para>If this fails the client machine name is probably not in
- the <filename>/etc/hosts.equiv</filename> or
- <filename>etc/hosts.lpd</filename> on the FreeBSD printserver.
- Most sites may simply decide to put a wildcard in
- <filename>hosts.equiv</filename> to allow printing, especially
- if DHCP is used, but many security-conscious sites may stick
- with individual entries in
- <filename>hosts.lpd</filename>.</para>
- </note>
- </step>
-
- <step>
- <para>If the printer is PostScript and cannot print ASCII, make
- sure that the "No banner page control flag" is checked to turn
- off banner pages. Accessible under Port settings, this flag is
- overridden if the <filename>/etc/printcap</filename>file
- specifies no banner pages.</para>
- </step>
-
- <step>
- <para>Review how the "send plain text control flag" is set. With
- this flag unchecked, the LPR code sent is L, (ie:, print
- unfiltered) meaning that the <literal>if</literal> filter gets
- called with the <option>-c</option> option. This is equivalent
- to the local invocation of <filename>/usr/bin/lpr -l</filename>.
- With the flag checked, the code is F, (formatted) meaning that
- the <literal>if</literal>filter gets called without the
- <option>-c</option> option. This is equivalent to the default
- invocation <filename>/usr/bin/lpr</filename>. (This is also an
- issue under Windows NT, which retypes the print job to text if
- this flag is checked. Some filters understand the
- <option>-c</option> flag, which is used to preserve control
- characters, so it should generally remain unchecked.</para>
- </step>
-
- <step>
- <para>Leave the "Send data file before control file" box
- unchecked. This option is used only in rare mainframe spooling
- circumstances.</para>
- </step>
-
- <step>
- <para>Click <guibutton>OK</guibutton>, then click the
- <guibutton>Spool Settings</guibutton> button at the properties
- page.</para>
- </step>
-
- <step>
- <para>Make sure that the "Spool print jobs so program finishes
- printing faster" box is checked.</para>
- </step>
-
- <step>
- <para>Make sure that "Start printing after last page is spooled"
- box is checked.</para>
- </step>
-
- <step>
- <para>Make sure that "Disable bi-directional support for this
- printer" is checked, or greyed out.</para>
- </step>
-
- <step>
- <para>Make sure that the "Spool data format" is set to RAW. Some
- printer drivers present a choice of EMF or RAW, such as the
- Generic Text driver, in this case select RAW.</para>
- </step>
-
- <step>
- <para>Click <guibutton>OK</guibutton>, then
- <guibutton>OK</guibutton> again to close the Printer Properties.
- The printer icon now spools through FreeBSD.</para>
- </step>
- </procedure>
- </sect2>
-
- <sect2>
- <title>Installation of LPR client on Windows NT</title>
-
- <para>Unlike WfW and Win95 TCP/IP, Windows NT&mdash;both server and
- workstation&mdash;includes an LPR client as well as an LPD program
- that allows incoming print jobs to be printed from LPR clients, such
- as UNIX systems.</para>
-
- <para>To install the LPR client and daemon program under Windows NT
- 3.51, use the following instructions. The TCP/IP protocol should be
- installed beforehand and you must be logged in to the NT system as
- Administrator. This can be done at any time after the NT system is
- installed, or during OS installation:</para>
-
- <procedure>
- <step>
- <para>Double-click on Main, Control Panel, then
- Network Settings.</para>
- </step>
-
- <step>
- <para>In the Installed Network Software window, "Microsoft TCP/IP
- Printing" should be listed as well as "TCP/IP Protocol".</para>
- </step>
-
- <step>
- <para>Click the <guibutton>Add Software</guibutton> button to get
- the Add Network Software dialog box</para>
- </step>
-
- <step>
- <para>Click the down arrow and select TCP/IP Protocol and related
- components. Click <guibutton>Continue</guibutton>.</para>
- </step>
-
- <step>
- <para>Check the "TCP/IP Network Printing Support" box and click
- <guibutton>Continue</guibutton>. LPR printing is now installed.
- Follow the instructions to reboot to save changes.</para>
- </step>
- </procedure>
-
- <para>To install the LPR client and daemon program under Windows NT 4,
- use the following instructions. The TCP/IP protocol should be
- installed beforehand and you must be logged in to the NT system as
- Administrator. This can be done at any time after the NT system is
- installed, or during OS installation:</para>
-
- <procedure>
- <step>
- <para>Click on <guibutton>Start</guibutton>,
- <guimenuitem>Settings</guimenuitem>, <guimenuitem>Control
- Panel</guimenuitem>, and double-click on
- <guiicon>Network</guiicon> to open it up.</para>
- </step>
-
- <step>
- <para>Click on the <guilabel>Services</guilabel> tab.
- <literal>Microsoft TCP/IP Printing</literal> should be listed.
- If not, continue steps 3 - 4.</para>
- </step>
-
- <step>
- <para>Click <guibutton>Add</guibutton>, then select
- <guilabel>Microsoft TCP/IP Printing</guilabel> and click
- <guibutton>OK</guibutton>.</para>
- </step>
-
- <step>
- <para>Click <guibutton>Close</guibutton>. Follow instructions to
- reboot to save changes.</para>
-
- <note>
- <para>Any NT Service Packs that were previously installed must
- be reapplied after these operations.</para>
- </note>
- </step>
- </procedure>
-
- <para>Once LPR printing has been installed, the Printer icon or icons
- must be created on the NT system so that applications can print.
- Since this printer driver does all job formatting before passing the
- printing to the FreeBSD printserver, the print queues specified
- should be raw queues on the FreeBSD system, which don't do any job
- formatting.</para>
-
- <para>To install the printer icon in Print Manager and set it to send
- print jobs to the FreeBSD UNIX system, use the following
- instructions under NT 3.51. You must be logged in to the NT system
- as Administrator. This can be done at any time after the NT system
- is installed, or during OS installation.</para>
-
- <procedure>
- <step>
- <para>Click on Main, and open it. Then click on Print Manager to
- open it.</para>
- </step>
-
- <step>
- <para>Click on <guiicon>Printer</guiicon>, <guibutton>Create
- Printer</guibutton>. Select the appropriate printer
- driver.</para>
- </step>
-
- <step>
- <para>Click the down arrow under Print To and select
- Other.</para>
- </step>
-
- <step>
- <para>In the Available Print Monitors window select
- LPR port and click <guibutton>OK</guibutton>.</para>
- </step>
-
- <step>
- <para>Enter the hostname of the FreeBSD printserver, and the name
- of the printer queue and click <guibutton>OK</guibutton></para>
- </step>
-
- <step>
- <para>Click <guibutton>OK</guibutton> to close the Create Printer
- window. The Printer icon is created.</para>
- </step>
- </procedure>
-
- <para>To install the printer icon in Print Manager and set it to send
- print jobs to the FreeBSD UNIX system, use the following
- instructions under NT 4. You must be logged in to the NT system as
- Administrator. This can be done at any time after the NT system is
- installed, or during OS installation:</para>
-
- <procedure>
- <step>
- <para>Click <guibutton>Start</guibutton>,
- <guimenuitem>Settings</guimenuitem>,
- <guimenuitem>Printers</guimenuitem> to open the printer
- folder.</para>
- </step>
-
- <step>
- <para>Double-click <guiicon>Add Printer</guiicon> to start the
- wizard.</para>
- </step>
-
- <step>
- <para>3) Select the My Computer radio button, not the Network
- Print Server button and click <guibutton>Next</guibutton>. (The
- printer <emphasis>is</emphasis> a networked printer, it is
- managed on the local NT system. Microsoft used confusing
- terminology here.</para>
- </step>
-
- <step>
- <para>Click <guibutton>Add Port</guibutton> and select LPR Port,
- then click <guibutton>New Port</guibutton>.</para>
- </step>
-
- <step>
- <para>Enter the hostname and print queue for the FreeBSD
- printserver and click <guibutton>OK</guibutton>.</para>
- </step>
-
- <step>
- <para>Click <guibutton>Next</guibutton> and select the correct
- printer driver. Continue until the printer is set up.</para>
- </step>
- </procedure>
-
- <para>The LPR client in Windows NT allows DOS print jobs originating
- in DOS boxes to be routed to the central UNIX print spooler. This
- is an advantage over the Win95 and WfW LPR programs.</para>
-
- <sect3>
- <title>Windows NT Registry Changes</title>
-
- <para>Using the LPR daemon program under Windows NT presents one
- problem. If the NT server is used as an LPR/LPD "relay", for
- example, to pass jobs from clients to LPR print queues on a UNIX
- system, to pass jobs from LPR programs on UNIX terminating at NT
- print queues, or to pass jobs from Appletalk clients to LPR
- printers, NT retypes the job if the type code is set to P (text).
- This can wreak havoc on PostScript files printed through HP
- LaserJet printers with internal MIO cards in them, if the job
- originates from the <filename>/usr/bin/lpr</filename> program
- under UNIX, which assigns a P type code. The printserver card
- treats PostScript jobs as text, and instead of the print job, the
- raw PostScript codes print. This problem often manifests in the
- following way: <filename>/usr/bin/lpr</filename> is used to print
- a PostScript file from UNIX directly to the remote printer
- printserver, which works fine, but spooling it through NT causes
- problems.</para>
-
- <para>A registry change that can override the NT Server formatting
- behavior is detailed in Microsoft Knowledge Base article ID
- Q150930. With Windows NT 3.51, and 4.0 up to service pack 1 the
- change is global. Starting with NT 4.0 Service pack 2 the change
- can be applied to specific print queues, (see Knowledge Base
- article ID Q168457).</para>
-
- <para>Under Windows NT 4.0, the change is:</para>
-
- <procedure>
- <step>
- <para>Run Registry Editor
- (<filename>REGEDT32.EXE</filename>)</para>
- </step>
-
- <step>
- <para>From the <literal>HKEY_LOCAL_MACHINE</literal> subtree, go
- to the following key:</para>
-
- <para><literal>\SYSTEM\CurrentControlSet\Services\LPDSVC\Parameters</literal></para>
- </step>
-
- <step>
- <para>On the <guimenu>Edit</guimenu> menu, click
- <guimenuitem>Add Value</guimenuitem>.</para>
- </step>
-
- <step>
- <para>Add the following:</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <tbody>
- <row>
- <entry>Value Name:</entry>
- <entry>SimulatePassThrough</entry>
- </row>
-
- <row>
- <entry>Data Type:</entry>
- <entry>REG_DWORD</entry>
- </row>
-
- <row>
- <entry>Data</entry>
- <entry>1</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <note>
- <para>The default value is 0, which informs LPD to assign
- datatypes according to the control commands.</para>
- </note>
- </step>
- </procedure>
-
- <para>Under Windows NT 3.51, the change is:</para>
-
- <procedure>
- <step>
- <para>Run Registry Editor
- (<filename>REGEDT32.EXE</filename>)</para>
- </step>
-
- <step>
- <para>From the <literal>HKEY_LOCAL_MACHINE</literal> subtree, go
- to the following key:</para>
-
- <para><literal>\SYSTEM\CurrentControlSet\Services\LPDSVC\Parameters</literal></para>
- </step>
-
- <step>
- <para>On the <guimenu>Edit</guimenu> menu, click
- <guimenuitem>Add Value</guimenuitem>.</para>
- </step>
-
- <step>
- <para>Add the following:</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <tbody>
- <row>
- <entry>Value Name:</entry>
- <entry>SimulatePassThrough</entry>
- </row>
-
- <row>
- <entry>Data Type:</entry>
- <entry>REG_DWORD</entry>
- </row>
-
- <row>
- <entry>Data</entry>
- <entry>1</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <note>
- <para>The default value is 0, which informs LPD to assign
- datatypes according to the control commands.</para>
- </note>
- </step>
-
- <step>
- <para>Create an LPD key at the same level as the LPDSVC
- key.</para>
- </step>
-
- <step>
- <para>Click the LPDSVC Key, click <guimenuitem>Save
- Key</guimenuitem> from the <guimenu>Registry</guimenu> menu,
- and then save the file as
- <filename>LPDSVC.KEY</filename></para>
- </step>
-
- <step>
- <para>Click the LPD key created in step 5.</para>
- </step>
-
- <step>
- <para>Click <guimenuitem>Restore</guimenuitem> on the
- <guimenu>Registry</guimenu> menu, click the file created in
- step 6, and then click <guibutton>OK</guibutton>.</para>
- </step>
-
- <step>
- <para>A warning message appears. Click
- <guibutton>OK</guibutton> and then quit the Registry
- Editor.</para>
- </step>
-
- <step>
- <para>At a command prompt window, type:</para>
-
- <screen><userinput>net stop lpdsvc</userinput>
-<userinput>net start lpdsvc</userinput></screen>
- </step>
- </procedure>
- </sect3>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Printing Postscript and DOS command files</title>
-
- <para>One problem with printing under Win31 and Win95 with the LPR
- methods discussed is the lack of a <quote>raw</quote>
- <devicename>LPT1:</devicename> device. This is annoying to the
- administrator who wants to print an occasional text file, such as a
- file full of printer control codes, without their being intercepted by
- the Windows printer driver. Of course this is also an issue with DOS
- programs, but a commercial site that runs significant DOS software and
- wants to print directly to UNIX with LPR really only has one
- option&mdash;to use a commercial TCP/IP stack containing a DOS LPR
- program.</para>
-
- <para>Normally, under Windows printing, virtually all graphical programs
- print through the Windows printer driver. This is true even of basic
- programs such as Notepad. For example, an administrator may have a
- DOS batch file named <filename>filename.txt</filename>containing the
- following line:</para>
-
- <programlisting>echo \033&amp;k2G &gt; lpt1:</programlisting>
-
- <para>This batch file switches a HP LasterJet from CR-LF, MS-DOS
- textfile printing into Newline termination UNIX textfile printing.
- Otherwise, raw text printed from UNIX on the HP prints with a
- stairstep effect.</para>
-
- <para>If the administrator opens this file with Notepad and prints it
- using a regular printer driver, such as an Epson LQ, the Windows
- printer driver encapsulates this print output into a series of
- printer-specific control codes that do things such as initialize the
- printer, install fonts, and so on. The printer won't interpret this
- output as control code input. Usually, if the printer is locally
- attached, the user can force a "raw text print" of the file by opening
- a DOS window and running:</para>
-
- <screen><userinput>copy filename.txt lpt1: /b</userinput></screen>
-
- <para>Since the LPR client program doesn't provide a DOS driver, it
- cannot reroute input from the <devicename>LPT1:</devicename> device
- ports. The solution is to use the Generic / Text Only printer driver
- in conjunction with Wordpad (under Win95); under Win31 use a different
- text editor. The Notepad editor supplied with Windows is unsuitable
- for this - it "helpfully" inserts a 1 inch margin of spaces around all
- printed output, as well as the filename title. Wordpad supplied with
- Win95, can be set to use margins of zero, and inserts no additions
- into the printed output. Also, make sure that banner pages are turned
- off, and the print type is set to raw.</para>
- </sect1>
-
- <sect1>
- <title>Checking PostScript Printer capabilities</title>
-
- <para>Following is a PostScript command file that can be used to get a
- PostScript printer to output a number of useful pieces of information
- that are needed to set up a printer icon under Windows properly. It
- was printed from Wordpad, in Win95, through the Generic / Text Only
- printer driver with the following instructions:</para>
-
- <procedure>
- <step>
- <para><guibutton>Start</guibutton>, <guimenuitem>Run</guimenuitem>,
- type in <userinput>Wordpad</userinput> and press
- <keycap>Enter</keycap>.</para>
- </step>
-
- <step>
- <para><guimenu>File</guimenu>, <guimenuitem>Open</guimenuitem>
- <filename>testps.txt</filename></para>
- </step>
-
- <step>
- <para><guimenu>File</guimenu>, <guimenuitem>Page
- Setup</guimenuitem>, <guimenuitem>Printer</guimenuitem>, select
- <guimenuitem>Generic / Text Only</guimenuitem>, click
- <guibutton>Properties</guibutton></para>
- </step>
-
- <step>
- <para>Click <guimenuitem>Device Options</guimenuitem>, select
- <guilabel>TTY custom</guilabel>, click
- <guibutton>OK</guibutton>.</para>
- </step>
-
- <step>
- <para>Click <guibutton>OK</guibutton>, then set all four margins to
- <literal>0</literal>; click <guibutton>OK</guibutton>.</para>
- </step>
-
- <step>
- <para>Click <guimenu>File</guimenu>,
- <guimenuitem>Print</guimenuitem>,
- <guibutton>OK</guibutton>.</para>
- </step>
- </procedure>
-
- <para>This could also have been printed with
- <filename>/usr/bin/lpr</filename> on a UNIX command prompt. The file
- prints <emphasis>Test Page</emphasis> and some printer statistics
- below that, as follows.</para>
-
- <programlisting>% filename: testps.txt
-% purpose: to verify proper host connection and function of PostScript
-% printers.
-/buf 10 string def
-/CM {
-save statusdict/product get (Postscript) anchorsearch
-exch pop {length 0 eq
-{1}{2}ifelse
-}
-{2}ifelse exch restore
-}bind def
-/isCM {
-CM 1 ge
-}bind def
-/Times-BoldItalic findfont 75 scalefont setfont
-150 500 moveto
-(Test Page) false charpath
-isCM{gsave 0.0 1.0 1.0 0.0 setcmykcolor fill grestore}if
-2 setlinewidth stroke
-/Times-Roman findfont 10 scalefont setfont
-150 400 moveto
-(Your PostScript printer is properly connected and operational.)show
-150 380 moveto
-(The border around the page indicates your printer's printable region.)show
-{ vmreclaim } stopped pop
-vmstatus exch sub exch pop
-150 360 moveto
-(Max Available Printer Virtual Memory (KB):)show
-150 340 moveto
-dup 1024 div truncate buf cvs show
-150 320 moveto
-(Calculated memory size used for PostScript printer icon properties:) show
-150 300 moveto
-0.85 mul 1024 div truncate buf cvs show
-150 280 moveto
-(Printer Model: )show
-statusdict begin product show end
-150 260 moveto
-(PostScript Level: )show
-/languagelevel where
-{ languagelevel 3 string cvs show pop }
-{(1) show } ifelse
-150 240 moveto
-(PostScript Version: )show
-statusdict begin
-version show (.)show
-revision 40 string cvs show end
-clippath stroke
-showpage</programlisting>
- </sect1>
-
- <sect1>
- <title>Setting up LPR/LPD on FreeBSD</title>
-
- <para>When a FreeBSD system is booted, it starts the LPD spooler control
- daemon program if the <filename>/etc/rc.conf</filename> file has
- <literal>lpd_enable="YES"</literal> set. If this is not set, attempts
- to print through and from the FreeBSD system will fail with an
- <errorname>lpr: connect: No such file or directory</errorname> error
- message.</para>
-
- <para>The LPD program manages all incoming print jobs, whether they come
- in from the network, or from local users on the UNIX system. It
- transfers print jobs to all locally attached parallel or serial
- printers, as well as defined remote printers. Several programs also
- are used to manipulate jobs in the print spools that LPD manages, as
- well as the user programs to submit them from the UNIX command prompt.
- All of these programs use the <filename>/etc/printcap</filename>file,
- which is the master control file for the printing system.</para>
-
- <para>Back when printing was mostly text, it was common to place
- printers on a serial connection that stretched for long distances.
- Often, 9600bps was used because it could work reliably up to a block
- away, which allowed printers to be located almost anywhere on an
- office high-rise floor. Modern office print jobs, on the other hand,
- are generally graphics-laden and tend to be rather large. These jobs
- would take hours to transfer over a slower 9600bps serial printer
- connection. Today, most printers that are not connected to a remote
- hardware print server box are directly connected to the server using
- parallel cables. All of the examples shown here are direct
- connections that are parallel connections.</para>
-
- <para>The <filename>printcap</filename> configuration file, like most
- UNIX configuration files, indicates comment lines starting with a hash
- character. Lines without a hash character are meant to be part of a
- printer queue description line. Each printer queue description line
- starts with a symbolic name, and ends with a newline. Since the
- description lines are often quite long, they are often written to span
- multiple lines by escaping intermediate newlines with the backslash
- (<literal>\</literal>) character. The
- <filename>/etc/printcap</filename>file, as supplied, defines a single
- printer queue, <literal>lp</literal>. The <literal>lp</literal>queue
- is the default queue. Most UNIX-supplied printing utilities send
- print output to this queue if no printer is specified by the user. It
- should be set to point to the most popular print queue with
- <emphasis>local</emphasis> UNIX print users, (i.e.: users that have
- shell accounts).</para>
-
- <para>The layout of <filename>/etc/printcap</filename>is covered in the
- manual page, which is reached by running the <userinput>man
- printcap</userinput> command. The stock
- <filename>/etc/printcap</filename> file at the line defining the spool
- <literal>lp</literal>shows:</para>
-
- <programlisting>#
-lp|local line printer:\
- :lp=/dev/lpt0:sd=/var/spool/output/lpd:lf=/var/log/lpd-errs:
-#</programlisting>
-
- <para>In this example the first line defines the names by which the
- printer is known, and ends with an escaped newline. The next line
- defines the physical device, the PC parallel port, by
- <filename>/dev/lpt0</filename>, and the directory in which the spool
- files are stored at <filename>/var/spool/output/lpd</filename>, and
- the error log file. Note that this particular error log file will not
- show all LPD errors, such as bad job submittals, it usually shows only
- the errors that originate within the printing system itself.</para>
-
- <para>In general, the administrator creates two print queues for every
- printer that is connected to the FreeBSD machine. The first queue
- entry contains whatever additional capabilities UNIX shell users on
- the server require. The second is a raw queue that performs no print
- processing on the incoming print job. This queue is used by remote
- clients, such as Windows clients, that format their own jobs.</para>
-
- <para>If the administrator is setting up the printer to allow incoming
- LPR jobs from network clients, such as other Windows or UNIX systems,
- those systems <emphasis>must</emphasis> be listed in
- <filename>/etc/hosts.lpd</filename>.</para>
-
- <sect2>
- <title>Creating the spools</title>
-
- <para>Building new print spools is merely a matter of making an entry
- in the <filename>/etc/printcap</filename> file, creating the spool
- directories, and setting the correct permissions on them. For
- example, the following additional line defines a PostScript printer
- named NEC (in addition to the <literal>lp</literal>
- definition):</para>
-
- <programlisting>#
-lp|local line printer:\
- :lp=/dev/lpt0:sd=/var/spool/output/lpd:lf=/var/log/lpd-errs:
-
-NEC|NEC Silentwriter 95 Postscript printer:\
- :lp=/dev/lpt0:sd=/var/spool/output/NEC:lf=/var/log/lpd-errs:
-#</programlisting>
-
- <para>Because UNIX is case sensitive, NEC is different from
- <literal>nec</literal> in both the name of the printer and the name
- of the Spool directory. With the print spooler LPD, the Spool
- directories <emphasis>must</emphasis> be different from each other,
- or the spooler gets confused and doesen't print.</para>
-
- <para>After the <filename>/etc/printcap</filename>is modified, the
- root user must create the <filename>/var/spool/output/NEC</filename>
- directory and assign ownership of it to the <username>bin</username>
- user, assign group ownership to <username>daemon</username>, and set
- permissions with the following commands:</para>
-
- <screen>&prompt.user; <userinput>su root</userinput>
-&prompt.root; <userinput>cd /var/spool/output</userinput>
-&prompt.root; <userinput>mkdir NEC</userinput>
-&prompt.root; <userinput>chown bin NEC</userinput>
-&prompt.root; <userinput>chgrp daemon NEC</userinput>
-&prompt.root; <userinput>chmod 755 NEC</userinput></screen>
- </sect2>
-
- <sect2>
- <title>Additional spool capabilities</title>
-
- <para>Because modern print jobs (especially PostScript) can sometimes
- reach hundreds of megabytes, the <literal>sd</literal> capability
- entry in the <filename>/etc/printcap</filename> file should always
- point to a Spool directory on a filesystem that has enough space.
- The <filename>/var</filename> directory on a default FreeBSD
- installation is generally set to a fairly small amount, which can
- easily overflow the spool. There are four ways to handle this
- problem:</para>
-
- <orderedlist>
- <listitem>
- <para>During FreeBSD installation, if the administrator knows a
- lot of print jobs are going to go through the spooler,
- <filename>/var</filename>should be set to a large
- amount of free space.</para>
- </listitem>
-
- <listitem>
- <para>Modify the <literal>sd</literal> capability in the
- <filename>/etc/printcap</filename> file to point to a spool
- directory in a different, larger filesystem, such as
- <filename>/usr/spool.</filename></para>
- </listitem>
-
- <listitem>
- <para>Use soft links to point the
- <filename>/var/spool/output</filename> directory to directories
- on a larger filesystem.</para>
- </listitem>
-
- <listitem>
- <para>Don't define a <filename>/var</filename> directory at all
- during FreeBSD installation; this would make the installer link
- <filename>/var</filename> to
- <filename>/usr/var</filename>.</para>
- </listitem>
- </orderedlist>
-
- <para>In addition to spools, the following other capabilities are
- usually placed in a production
- <filename>/etc/printcap</filename>file.</para>
-
- <para>The entry <literal>fo</literal> prints a form feed when the
- printer is opened. It is handy for HPPCL (HP LaserJets) or other
- non-PostScript printers that are located behind electronic print
- sharing devices. It can also be used for printers that accept input
- from multiple connections, such as a parallel port, serial port, and
- localtalk port. An example is an HP LaserJet with an MIO card in it
- plugged into both Ethernet and LocalTalk networks. It will clear
- any garbage out of the printer before the job is processed.</para>
-
- <para>The entry <literal>mx</literal> defines the maximum size of a
- print job, which is a must for modern print jobs that frequently
- grow far past the default print size of a megabyte. The original
- intent of this capability was to prevent errant programs from
- stuffing the spool with jobs so large that they would use up all
- paper in a printer.. Graphics-heavy print jobs have made it
- impossible to depend on this kind of space limitation, so
- <literal>mx</literal> is usually set to zero, which turns it
- off.</para>
-
- <para>The entry <literal>sh</literal> suppresses printing of banner
- pages in case the printer cannot handle ASCII and the client
- mistakenly requests them.</para>
-
- <para>The entry <literal>ct</literal> denotes a TCP Connection
- timeout. This is useful if the remote print server doesn't close
- the connection properly.</para>
-
- <note>
- <para>FreeBSD 2.2.5 contains a bug in the LPD system - as a
- workaround the <literal>ct</literal> capability needs to be set
- very large, such as 3600, or the appropriate patch installed and
- LPD recompiled. More recent versions of FreeBSD do not have this
- bug.</para>
- </note>
- </sect2>
-
- <sect2>
- <title>Printing to hardware print server boxes or remote print
- servers.</title>
-
- <para>Hardware print server boxes, such as the HP JetDirect internal
- and external cards, need some additional capabilities defined in the
- <filename>/etc/printcap</filename> entry; <literal>rp</literal>, for
- remote print spool, and <literal>rm</literal>for remote machine
- name.</para>
-
- <para>The <literal>rm</literal> capability is simply the DNS or
- <filename>/etc/hosts</filename> name of the IP number associated
- with the remote printserver device. Obviously, print server
- devices, such as the HP JetDirect, must not use a dynamic TCP/IP
- network numbering assignment. If they get their numbering via DHCP,
- the IP number should be assigned from the static pool; it should
- always be the same IP number.</para>
-
- <para>Determining the name used for <literal>rp</literal>, on the
- other hand, can be rather difficult. Here are some common
- names:</para>
-
- <para>Windows NT Server: Printer name of the printer icon created in
- Print Manager</para>
-
- <para>FreeBSD: Print queue name defined in
- <filename>/etc/printcap</filename></para>
-
- <para>HP JetDirect: Either the name <literal>TEXT</literal> or the
- name <literal>RAW</literal>. <literal>TEXT</literal> automatically
- converts incoming UNIX newline text to DOS-like CR/LF text that the
- printer can print. <literal>RAW</literal> should be used for
- PostScript, and HPPCL printing.</para>
-
- <para>HP JetDirect EX +3: External, 3 port version of the JetDirect.
- Use <literal>RAW1</literal>, <literal>RAW2</literal>,
- <literal>RAW3</literal>, <literal>TEXT1</literal>,
- <literal>TEXT2</literal>, or <literal>TEXT3</literal> depending on
- the port desired.</para>
-
- <para>Intel NetPort: Either use <literal>TEXT</literal> for UNIX text
- conversion printing or use <literal>PASSTHRU</literal> for normal
- printing.</para>
-
- <para>DPI: Use <literal>PORT1</literal> or <literal>PORT2</literal>
- depending on which port the printer is plugged into.</para>
-
- <para>For other manufacturer's print servers refer to the manuals
- supplied with those devices.</para>
-
- <para>The following is an example printcap that redefines the default
- <literal>lp</literal> print queue to send print jobs to the first
- parallel port on a remote HP LaserJet plugged into a JetDirect EX +3
- named <hostid role="fqdn">floor2hp4.biggy.com</hostid>.</para>
-
- <programlisting>#
-lp|local line printer:\
- :rm=floor2hp4.biggy.com:rp=RAW1:\
- :sd=/var/spool/output/lpd:\
- :lf=/var/log/lpd-errs:
-#</programlisting>
-
- <note>
- <para>The <literal>rp</literal> capability <emphasis>must</emphasis>
- be defined or the job goes to the default print queue on the
- remote host. If the remote device does not have a single print
- queue, such as another UNIX system, this causes problems. For
- example, if the remote device was a JetDirect EX + 3 and
- <literal>rp</literal> was omitted, all queues defined would print
- out of the first parallel port.</para>
- </note>
- </sect2>
-
- <sect2>
- <title>Filters</title>
-
- <para>The last two important printcap capabilities concern print
- filters, <literal>if</literal> (input filter) and
- <literal>of</literal> (output filter) If defined, incoming print
- jobs are run through the filters that these entries point to for
- further processing.</para>
-
- <para>Filters are the reason that the UNIX print spooling system is so
- much more powerful than any other commercial server operating
- system. Under FreeBSD, incoming print jobs are acted on by any
- filters specified in the <filename>/etc/printcap</filename>
- <emphasis>no matter where they originate</emphasis>. Incoming print
- jobs from remote Windows, Mac, NT, OS/2 or other clients can be
- intercepted and manipulated by any program specified as a filter.
- Want a PostScript Printer? There's a filter that adds PostScript
- capability to a non-PostScript printer. Want to make a cheap Epson
- MX 80 dot-matrix emulate an expensive Okidata Microline dot-matrix
- for some archaic mainframe application? Write a filter that will
- rewrite the print codes to do it. Want custom-built banner pages?
- Use a filter. Many UNIX <filename>/etc/printcap</filename> filters
- on many Internet sites can do a variety of interesting and unique
- things. Someone may have already written a filter that does what you
- want!</para>
-
- <sect3>
- <title>Types of filters</title>
-
- <para>Three types of filters can be defined in the
- <filename>/etc/printcap</filename> file. In this book all filter
- examples are for Input filters.</para>
-
- <sect4>
- <title>Input Filters</title>
-
- <para>Input filters are specified by the <literal>if</literal>
- capability. Every job that comes into the spool is acted on by
- any filter specified in the <literal>if</literal> entry for that
- spool. Virtually all filters that an administrator would use are
- specified here. These filters can be either shell scripts, or
- compiled programs.</para>
- </sect4>
-
- <sect4>
- <title>Fixed Filters</title>
-
- <para>Fixed filters are specified by separate capabilities, such
- as <literal>cf</literal>, <literal>df</literal>, and
- <literal>gf</literal>. Mostly, these exist for historical
- reasons. Originally, the idea of LPD was that incoming jobs
- would be submitted with the type fields set to trigger whatever
- filter was desired. However, type codes are confusing and
- annoying to the user, who has to remember which option is needed
- to trigger which type. It is much easier to set up multiple
- queues with different names, and this is what most sites do
- these days. For example, originally a DVI fixed filter might be
- specified in a spool for <literal>lp</literal>, triggered by the
- <option>-d</option> option passed to <command>lpr</command>.
- Jobs without this option aren't acted on by the DVI filter.
- However, the same thing can be done by creating a queue named
- <literal>lp</literal> that doesn't have a DVI filter, and a
- queue named <literal>lpdvi</literal> which has the DVI filter
- specified in the <literal>if</literal> capability. Users just
- need to remember which queue to print to, instead of what option
- needed for this or that program.</para>
- </sect4>
-
- <sect4>
- <title>Output Filters</title>
-
- <para>These are specified by the <literal>of</literal>capability.
- Output filters are much more complicated than input filters and
- are hardly ever used in normal circumstances. They also
- generally require a compiled program somewhere, either directly
- specified or wrapped in a shell script, since they have to do
- their own signal-handling.</para>
- </sect4>
- </sect3>
-
- <sect3>
- <title>Printing raw Unix text with a filter</title>
-
- <para>One of the first thing that a new Unix user will discover when
- plugging a standard LaserJet or impact printer into a UNIX system
- is the <emphasis>stairstep</emphasis> problem. The symptom is
- that the user dumps text to the printer, either through LPR or
- redirection (by catting it to the parallel device) and instead of
- receiving the expected Courier 10-point printout, gets a page with
- a single line of text, or two lines of text "stairstepped", text
- and nothing else.</para>
-
- <para>The problem is rooted in how printers and UNIX handle
- textfiles internally. Printers by and large follow the "MS-DOS
- Textfile" convention of requiring a carriage return, then a
- linefeed, at the end of every text line. This is a holdover from
- the early days when printers were mechanical devices, and the
- print head needed to return and the platen to advance to start a
- new line. UNIX uses only the linefeed character to terminate a
- text line. So, simply dumping raw text out the parallel port
- works on MS-DOS, but not on UNIX.</para>
-
- <para>If the printer is a PostScript printer, and doesn't support
- standard ASCII, then dumping UNIX text to it doesn't work. But
- then, neither would dumping MS-DOS text to it. (Raw text printing
- on PostScript printers is discussed later in this chapter) Note
- also that if the printer is connected over the network to an HP
- JetDirect hardware print server, internal or external, the TEXT
- queue on the hardware print automatically adds the extra Carriage
- Return character to the end of a text line.</para>
-
- <para>If the printer is the garden-variety HP LaserJet, DeskJet, or
- an impact printer, and under DOS the administrator is used to
- printing raw text from the command line for directory listings,
- there are two ways to fix stairstep. The first is to send a
- command to the printer to make it print in "unix textfile" mode,
- which makes the printer supply it's own carriage return. This
- solution is ugly in a printer environment with UNIX and Windows
- machines attempting to share use of the same printer. Switching
- the printer to work with Unix disrupts DOS/Windows raw text
- printouts.</para>
-
- <para>The better solution is to use a simple filter that converts
- incoming text from UNIX style to DOS style. The following filter
- posted on questions@freebsd.org and the sample
- <filename>/etc/printcap</filename> entry can be used to do
- this:</para>
-
- <programlisting>#!/bin/sh
-# /usr/local/libexec/crlfilter
-#
-# simple parlor trick to add CR to LF for printer
-# Every line of standard input is printed with CRLF
-# attached.
-#
-
-awk '{printf "%s\r\n", $0}' -</programlisting>
-
- <para>An alternative filter posted using sed could be written
- as:</para>
-
- <programlisting>#!/bin/sh
-# /usr/local/libexec/crlfilter
-#
-# Add CR to LF for printer
-# Every line of standard input is printed with CRLF
-# attached.
-#
-# Note, the ^M is a *real* ^M (^V^M if your typing in vi)
-#
-
-sed 's/$/^M/' -</programlisting>
-
- <para>Here is an example of a filter that triggers the printers
- automatic LF-to-CR/LF converter (this option is only useful on HP
- LaserJets that support this command):</para>
-
- <programlisting>#!/bin/sh
-# Simply copies stdin to stdout. Ignores all filter
-# arguments.
-# Tells printer to treat LF as CR+LF. Writes a form feed
-# character after printing job.
-
-printf "\033&amp;k2G" &amp;&amp; cat &amp;&amp; printf "\f" &amp;&amp; exit 0
-
-exit 2</programlisting>
-
- <para>The printcap file used to trigger the filter is:</para>
-
- <programlisting>#/etc/printcap
-# The trailer (tr) is used when the queue empties. I found that the
-# form feed (\f) was basically required for the HP to print properly.
-# Banners also need to be shut off.
-#
-
-lp|local line printer:\
- :lp=/dev/lpt0:sd=/var/spool/output/lpd:lf=/var/log/lpd-errs:
- :if=/usr/local/libexec/crlfilter:sh:tr=\f:mx#0:
-#</programlisting>
- </sect3>
-
- <sect3>
- <title>The pr filter</title>
-
- <para>Although most filters are built by scripts or programs and are
- added to the UNIX machine by the administrator, there is one
- filter that is supplied with the FreeBSD operating system is very
- useful for raw text files: the <literal>pr</literal>filter. It is
- most commonly used when printing from the UNIX command shell. The
- <literal>pr</literal> filter paginates and applies headers and
- footers to ASCII text files. It is automatically invoked with the
- <option>-p</option> option used with the <command>lpr</command>
- program at the UNIX command prompt.</para>
-
- <para>The pr filter is special - it runs <emphasis>in
- addition</emphasis> to any input filters specified for the print
- queue in <filename>/etc/printcap</filename>,
- <emphasis>if</emphasis> the user sets the option for a print job.
- This allows headers and pagination to be applied in addition to
- any special conversion, such as CR to LF that a specified input
- filter may apply.</para>
- </sect3>
-
- <sect3>
- <title>Printing PostScript banner pages with a Filter.</title>
-
- <para>Unfortunately, the canned banner page supplied in the LPD
- program prints only on a text-compatible printer. If the attached
- printer understands only PostScript and the administrator wants to
- print banner pages, it is possible to install a filterinto the
- <filename>/etc/printcap</filename>file to do this.</para>
-
- <para>The following filter is taken from the FreeBSD Handbook. I've
- slightly changed it's invocation for a couple of reasons. First,
- some PostScript printers have difficulty when two print files are
- sent within the same print job or they lack the trailing
- Control-D. Second is that the handbook invocation uses the LPRPS
- program, which requires a serial connection to the printer.</para>
-
- <para>The following filter shows another trick: calling LPR from
- within a filter program to spin off another print job.
- Unfortunately, the problem with using this trick is that the
- banner page always gets printed after the job. This is because
- the incoming job spools first, and then FreeBSD runs the filter
- against it, so the banner page generated by the filter always
- spools behind the existing job.</para>
-
- <para>There are two scripts, both should be put in the
- <filename>/usr/local/libexec</filename> directory, and the modes
- set to executable. The <filename>printcap</filename> also must be
- modified to create the nonbanner and banner versions of the print
- queue. Following the scripts is the
- <filename>/etc/printcap</filename> file showing how they are
- called. Notice that the <literal>sh</literal> parameter is turned
- on since the actual printed banner is being generated on the fly
- by the filter:</para>
-
- <programlisting>#!/bin/sh
-# Filename /usr/local/libexec/psbanner
-# parameter spacing comes from if= filter call template of:
-# if -c -w -l -i -n login -h host
-# parsing trickiness is to allow for the presence or absence of -c
-# sleep is in there for ickiness of some PostScript printers
-
-for dummy
-do
- case "$1" in
- -n) alogname="$2" ;;
- -h) ahostname="$2" ;;
- esac
- shift
-done
-
-/usr/local/libexec/make-ps-header $alogname $ahostname "PostScript" | \
- lpr -P lpnobanner
-
-sleep 10
-
-cat &amp;&amp; exit 0</programlisting>
-
- <para>Here is the <filename>make-ps-header</filename>listing.</para>
-
- <programlisting>#!/bin/sh
-# Filename /usr/local/libexec/make-ps-header
-#
-# These are PostScript units (72 to the inch). Modify for A4 or
-# whatever size paper you are using:
-#
-
-page_width=612
-page_height=792
-border=72
-
-#
-# Save these, mostly for readability in the PostScript, below.
-#
-
-user=$1
-host=$2
-job=$3
-date=`date`
-
-#
-# Send the PostScript code to stdout.
-#
-
-exec cat &lt;&lt;EOF
-%!PS
-%
-% Make sure we do not interfere with user's job that will follow
-%
-
-%
-% Make a thick, unpleasant border around the edge of the paper.
-%
-
-$border $border moveto
-$page_width $border 2 mul sub 0 rlineto
-0 $page_height $border 2 mul sub rlineto
-currentscreen 3 -1 roll pop 100 3 1 roll setscreen
-$border 2 mul $page_width sub 0 rlineto closepath
-0.8 setgray 10 setlinewidth stroke 0 setgray
-
-%
-% Display user's login name, nice and large and prominent
-%
-
-/Helvetica-Bold findfont 64 scalefont setfont
-$page_width ($user) stringwidth pop sub 2 div $page_height 200 sub moveto
-($user) show
-
-%
-% Now show the boring particulars
-%
-
-/Helvetica findfont 14 scalefont setfont
-/y 200 def
-[ (Job:) (Host:) (Date:) ] {
-200 y moveto show /y y 18 sub def
-} forall
-/Helvetica-Bold findfont 14 scalefont setfont
-/y 200 def
-[ ($job) ($host) ($date) ] {
-270 y moveto show /y y 18 sub def
-} forall
-
-%
-% That is it
-%
-
-showpage</programlisting>
-
- <para>Here is the <filename>/etc/printcap</filename> file.</para>
-
- <programlisting>#
-lp|local line printer, PostScript, banner:\
- :lp=/dev/lpt0:sd=/var/spool/output/lpd:lf=/var/log/lpd-errs:
- :if=/usr/local/libexec/psbanner:sh:mx#0:
-
-lpnobanner|local line printer, PostScript, no banner:\
- :lp=/dev/lpt0:sd=/var/spool/output/lpd-noban:\
- :lf=/var/log/lpd-errs:sh:mx#0:
-#</programlisting>
- </sect3>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Printer Accounting</title>
-
- <para>The FreeBSD print spooler can manage accounting statistics for
- printer usage. The spooler counts each page printed and generates
- totals for each user. In this manner departments or individuals can
- be charged money for their use of the printer.</para>
-
- <para>In the academic world, such as student computer labs, accounting
- is very political. Many schemes have been developed to attempt to
- gather statistics to charge people (generally students) for printing.
- Administrators in this environment who deal with printers can have
- almost as many accounting problems as printer problems. In the
- corporate environment, on the other hand, accounting is not as
- important. I strongly recommend against any corporation attempting to
- implement printer accounting on shared printers for a number of
- reasons:</para>
-
- <orderedlist>
- <listitem>
- <para>The entire UNIX accounting system is based on ASCII printouts.
- It is easy to count the number of ASCII pages, form feeds, or text
- lines in a print job. In corporations, however, PostScript and
- HPPCL are generally the order of the day. It is almost impossible
- to figure out by examining the datastream how many pages it will
- occupy, and even if this could be done accurately, it wastes
- significant computational resources.</para>
-
- <note>
- <para>It is possible to get some PostScript printers to count
- pages, but doing so requires a bidirectional connection to the
- printer and additional programming on the UNIX system. This
- task is beyond the scope of this book.</para>
- </note>
- </listitem>
-
- <listitem>
- <para>Banner pages aren't included in UNIX printer accounting
- counts. Therefore, someone submitting 20 two-page jobs uses much
- more paper than does someone submitting one 40 page job, yet both
- are charged the same amount.</para>
- </listitem>
-
- <listitem>
- <para>The username of the submitter can be easily forged, if the job
- is remotely submitted over the network from a client. (practically
- all jobs in a Windows client printing environment are remotely
- submitted) Although some LPR clients can be set to authenticate,
- and the <literal>rs</literal> capability can be set to enforce
- authentication, not all can, especially Windows LPR
- clients.</para>
- </listitem>
-
- <listitem>
- <para>It is more difficult for a submitter to hide the IP number or
- machine name of the remote client, but in a Windows environment
- there is no guarantee that someone was sitting at a particular
- desktop machine when the job was submitted.</para>
- </listitem>
-
- <listitem>
- <para>A business generates no revenue by monitoring printer usage.
- In the academic community, however, when a student lab charges for
- printouts the lab is actually extracting money from an entity (the
- student) that is separate from the lab. Within a corporation, the
- concept of department A getting revenue from user B is pointless
- and doesn't generate a net gain for the corporation as a
- whole.</para>
-
- <para>For my printer administration, I have found that I can save
- more money on printing costs by purchasing supplies wisely than by
- attempting to discourage printing through "chargebacks". What is
- the sense of being miserly with printing while spending double on
- toner cartridges because no one is willing to comparison shop, or
- signing a "lease" agreement that isn't beneficial for the printer?
- When you get down to it, corporate users don't care much for print
- sharing anyway, and they generally only agree to it because the
- administrator can buy a far bigger, faster, and fancier printer
- than they can requisition.</para>
- </listitem>
-
- <listitem>
- <para>Worse yet, if usage on a shared printer is charged, it
- encourages employees to look for other places to print.
- Inevitably, people run out buy cheap inkjet printers for their own
- use, and the business ends up spending more on paper and supplies
- for many poor-quality small printers, than it would for a few
- decent big ones. Moreover, the inferior output of these printers
- makes the organization as a whole look bad.</para>
- </listitem>
-
- <listitem>
- <para>The corporate spirit should be one of teamwork, not bickering.
- The surest way to kill a network in a corporation is to set up a
- situation that puts the administrator into the policeman position
- or pits one department against another.</para>
- </listitem>
- </orderedlist>
-
- <para>The only justification I've ever seen for running accounting on
- corporate printers is using the accounting system to automate
- reminders to the administrator to replace paper, or toner. Aside from
- this use, a corporation that implements accounting as a way of
- encouraging employees not to waste paper ends up defeating the purpose
- of turning on accounting.</para>
- </sect1>
-
- <sect1>
- <title>Microsoft Networking Client printing with Samba</title>
-
- <para>Although LPR is a time-tested and truly cross-platform printing
- solution, sites with a majority of Windows clients running Microsoft
- Networking have an alternate printing mechanism&mdash;Samba. Samba
- can provide print services to clients running SMB-compatible network
- clients. With a running Samba installation, the administrator may
- "share out" printers as well as filesystem directories from the
- FreeBSD system.</para>
-
- <para>Printers accessed with Samba must be defined both in the
- <filename>/etc/printcap</filename> file and the
- <filename>/usr/local/etc/smb.conf</filename> file. If the individual
- printers are defined in the <filename>smb.conf</filename> file with
- the <literal>printer driver=</literal> statement set to the exact
- model name of the printer, the "Auto printer driver install" feature
- of Windows NT and Win95/98 is activated. This automatically loads the
- correct printer driver if the user clicks on the print queue in
- Network Neighborhood under Windows 95 or NT 4.0 The restriction, of
- course, is that the printer model must be in the Windows client driver
- database.</para>
-
- <para>The <filename>smb.conf</filename> file also defines the
- <literal>print</literal> command used to pass jobs to the UNIX print
- spool. It is a good idea to redefine this via the <literal>print
- command</literal> option to <literal>lpr -s -P %p %s; rm
- %s</literal>. This turns on soft linking, so that large print jobs
- don't get truncated.</para>
-
- <para>In operation, the SMB-networking client builds the print job on
- itself and then transfers the entire job over the network to the Samba
- server. On the server, Samba has it's own temporary print spool
- directory to which the job is copied. Once the job has been
- completely received, it is then passed to the UNIX print
- spooler.</para>
-
- <figure>
- <title>Microsoft Networking Client printing with Samba</title>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="08-06" format="EPS">
- </imageobject>
-
- <textobject>
- <literallayout class="monospaced"> ,---------.
- | ======= | FreeBSD Server
- | ======= | +---------------------+ ,-----.
-+-----------+ | +---------------+ | | |
-| Printer [ ]------------[ ] | Samba | | |_____|
-+-----------+ Parallel | | Software | [ ]------_________
- Cable | +---------------+ | / ::::::: \
- | | `---------'
- | +---------------+ | Network PC
- | | Print | |
- | | Software | |
- | +---------------+ |
- +---------------------+</literallayout>
- </textobject>
-
- <textobject>
- <phrase>The Samba software and the print software run on the same
- host. Samba receives the print job, then hands it to the print
- spooler.</phrase>
- </textobject>
- </mediaobject>
- </figure>
-
- <sect2>
- <title>Client access issues</title>
-
- <para>Because a Windows client formats print jobs before sending them
- to the server, the administrator may want to hide some of the
- specialty print queues on the server. For example, the queue that
- converts LF to CRLF for UNIX text printouts would probably not be
- shared out. To make such queues invisible, the
- <literal>browseable=no</literal> option can be turned on in the
- <filename>smb.conf</filename> file. Also, the <literal>load
- printers</literal> option must be set to no to allow individual
- printer definitions.</para>
-
- <note>
- <para>In general, the only print queues that should be visible
- through Samba are the "raw" print queues that are set up by the
- administrator to allow incoming preformatted print jobs.</para>
- </note>
-
- <para>Windows clients that print to Samba print queues on the UNIX
- system can view and cancel print jobs in the print queue. They
- cannot pause them, however, which is a difference between Novell and
- Windows NT Server print queues. They also cannot prioritize print
- jobs from the print queue window, although the administrator can
- reprioritize print jobs that are in the queue from a command shell
- on the FreeBSD server.</para>
- </sect2>
-
- <sect2>
- <title>Printer entries in configuration files</title>
-
- <para>Following are listings of sample
- <filename>/etc/printcap</filename> file, and
- <filename>smb.conf</filename> files used on the system to provide
- print services. An explanation of the interaction of these files
- follows.</para>
-
- <example>
- <title><filename>/etc/printcap</filename></title>
-
- <programlisting>#
-#
-# The printer in lpt0 is a Postscript printer. The nec-crlf entry
-# is for testing the printer when it is switched into HP LaserJet III
-# mode.
-#
-
-lp|local line printer:\
- :lp=/dev/lpt0:sd=/var/spool/output/lpd:\
- :lf=/var/log/lpd-errs:sh:mx#0:
-
-#
-
-nec-crlf|NEC Silentwriter 95 in ASCII mode with Unix text filter:\
- :lp=/dev/lpt0:sd=/usr/lpdspool/nec-crlf:\
- :lf=/var/log/lpd-errs:sh:mx#0:\
- :if=/usr/local/libexec/crlfilter:tr=\f:
-
-#
-
-nec-raw|NEC Silentwriter 95 used for PostScript passthrough printing:\
- :lp=/dev/lpt0:sd=/usr/lpdspool/nec-raw:\
- :lf=/var/log/lpd-errs:sh:mx#0:
-
-#
-
-nec-ps-banner|NEC Silentwriter 95 with Postscript banner page created:\
- :lp=/dev/lpt0:sd=/usr/lpdspool/nec-ps-banner:\
- :lf=/var/log/lpd-errs:sh:mx#0:if=/usr/local/libexec/psbanner:
-
-#
-#</programlisting>
- </example>
-
- <example>
- <title><filename>/usr/local/etc/smb.conf</filename></title>
-
- <programlisting>[global]
-comment = FreeBSD - Samba %v
-log file = /var/log/samba.log
-dont descend = /dev,/proc,/root,/stand
-print command = lpr -s -P %p %s; rm %s
-interfaces = <replaceable>X.X.X.X</replaceable> (the system IP number goes here)
-printing = bsd
-map archive = no
-status = yes
-public = yes
-read only = no
-preserve case = yes
-strip dot = yes
-security = share
-guest ok = no
-password level = 1
-dead time = 15
-domain master = yes
-workgroup = WORKGROUP
-
-[homes]
-browseable = no
-comment = User Home Directory
-create mode = 0775
-public = no
-
-[printers]
-path = /var/spool
-comment = Printers
-create mode = 0700
-browseable = no
-read only = yes
-public = no
-
-[lp]
-printable = yes
-browseable = no
-
-[nec-raw]
-comment = Main Postscript printer driver for Windows clients
-printer driver = NEC SilentWriter 95
-printable = yes
-browseable = yes
-
-[wwwroot]
-path = /usr/local/www
-read only = no
-create mode = 0775
-comment = Internal Web Server</programlisting>
- </example>
- </sect2>
-
- <sect2>
- <title>Browsing output</title>
-
- <para>Following is the output of a <userinput>net view</userinput>
- command executed at a DOS prompt under Windows 95:</para>
-
- <screen>Shared resources at \\SERVER
-
-Sharename Type Comment
---------------------------------------------------------------------
-nec-crlf Print NEC Silentwriter 95 in ASCII mode
-nec-raw Print Main Postscript printer driver
-tedm Disk User Home Directory
-wwwroot Disk Internal Web Server
-
-The command was completed successfully.</screen>
-
- <para>In the <filename>/etc/printcap</filename> file four print queues
- are defined, all tied to the printer plugged into the parallel port
- on the FreeBSD server. The first is <literal>lp</literal>, the
- generic local line printer. Since this print queue generally has a
- filter placed on it to format jobs from the UNIX print queue
- properly, it should not be visible on the SMB network. (ie: visible
- in Network Neighborhood) The second queue,
- <literal>nec-crlf</literal>, has a filter that converts UNIX text to
- text that prints without stairstepping, so it also should be hidden
- from the SMB network. The third, <literal>nec-raw</literal>, should
- be visible on the network because this is the spool that the Windows
- clients use. The last queue, <literal>nec-ps-banner</literal>, is
- another specialty queue for UNIX local printing and thus should not
- be visible.</para>
-
- <para>When the <filename>smb.conf</filename> file is parsed, the
- default entry <literal>[printers]</literal> is first read and used
- as a set of defaults for printers that are going to be shared out.
- Next, the <filename>/etc/printcap</filename> file is read to get a
- list of all printers on the server. Last, each printer is checked
- for a service name in the <filename>smb.conf</filename>file that
- contains settings that override the set of defaults.</para>
-
- <para>In the listing of what resources are visible on the network,
- both <literal>nec-crlf</literal> and <literal>nec-raw</literal>
- print queues are visible, and <literal>lp</literal>and
- <literal>nec-ps-banner</literal> is not. <literal>lp</literal> is
- not visible because there is a specific entry,
- <literal>[lp]</literal> in the <filename>smb.conf</filename> file
- that blocks it. <literal>nec-ps-banner</literal> doesen't have such
- an entry, but because the print queue name is not a legal length for
- a SMB name, it isn't shared out either.</para>
-
- <para>The <literal>nec-crlf</literal> printer is visible so as to
- illustrate another point - comments. If a print queue has no entry
- in the <filename>smb.conf</filename> file and is built by scanning
- the <filename>/etc/printcap</filename> file and using the
- <literal>[printers]</literal> defaults, the comment is taken from
- the <filename>/etc/printcap</filename> file next to the queue
- definition name. Otherwise, if an entry is made for the printer in
- the <filename>smb.conf</filename> file the comment is taken from the
- entry in <filename>smb.conf</filename>.</para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Printing between NT Server/NetWare and FreeBSD.</title>
-
- <para>Up to this point in the chapter, our main concern has been FreeBSD
- and Windows NT printing interoperability with NT as a print client
- passing jobs to the FreeBSD system. What happens if the situation is
- reversed and the FreeBSD system is itself a printing client of another
- LPD server? This situation can arise in a mixed UNIX/Netware or
- UNIX/NT environment. The administrator may elect to forgo the use of
- Samba, and use an NT server to provide print services. Alternatively,
- the administrator may have existing DOS Novell IPX clients that they
- don't want to change, printing to an existing IPX Novell NetWare
- server. Many of the earlier hardware print servers, such as the Intel
- NetPort 1 and NetPort 2 were IPX only. A site with a large number of
- these hardware servers may wish to move the clients to TCP/IP, but
- leave the existing IPX-based printing network intact.</para>
-
- <para>With NetWare it is possible to load an LPD NetWare loadable module
- (NLM) on the NetWare server that takes incoming LPR print jobs and
- prints them on IPX print queues. Later versions of NetWare may
- include this NLM, it was an extra cost add-on with NetWare 3.X</para>
-
- <para>With Windows NT Server, loading the TCP/IP LPR printing support
- also loads the LPD print server on NT. By using LPR client programs
- on UNIX, it is possible to submit, view status, and remove jobs
- remotely from an NT server that has LPR installed as a port for it's
- printers.</para>
-
- <para>Following is a sample <filename>/etc/printcap</filename>file entry
- that defines a print queue named <literal>tank</literal>on the FreeBSD
- system pointed to an NT LPD server queue named
- <literal>sherman</literal> on a NT Server named
- <hostid role="fqdn">big.army.mil</hostid> in the DNS. This uses the
- <literal>rm</literal> printcap capability. Unlike the earlier
- examples, the output print jobs are sent out not by the PC parallel
- port but over the network to the NT server.</para>
-
- <programlisting>#
-tank|sample remote printer:\
- :rm=big.army.mil:rp=sherman:sd=/var/spool/output/lphost:\
- :lf=/var/log/lpd-errs:
-#</programlisting>
-
- <note>
- <para>When using an NT server as an LPD server it may be necessary to
- make the NT registry changes mentioned under Windows NT Registry
- Changes, earlier in the chapter.</para>
- </note>
- </sect1>
-
- <sect1>
- <title>Printing from Unix</title>
-
- <para>Two commands used at the FreeBSD command prompt are intended as
- general-purpose print commands: <command>lp</command> and
- <command>lpr.</command>.</para>
-
- <sect2>
- <title><command>lp</command></title>
-
- <para>The <command>lp</command> command is simply a front end command
- that calls the <command>lpr</command> command with appropriate
- options. It's main use is to allow the running of precompiled
- binary programs and scripts that assume that the
- <command>lp</command> command is the <emphasis>official</emphasis>
- printing command.</para>
- </sect2>
-
- <sect2>
- <title><command>lpr</command></title>
-
- <para>The <command>lpr</command> command is the main command that is
- used to print files from the command prompts under the FreeBSD
- operating system. It is frequently spawned off as a child program,
- or used in pipes. For example, when the Netscape web browser's
- Print button is clicked, Netscape may create the PostScript output,
- but the output goes through the <command>lpr</command>
- command.</para>
-
- <para>The <command>lpr</command> command, like many UNIX command-line
- printing programs, assumes that the default print queue name is
- <literal>lp</literal>. When the FreeBSD machine is set up, the
- administrator usually sets the <literal>lp</literal> queue to print
- through a filter that allows raw UNIX text sent to it to print
- properly. For example, if an HP LaserJet printer that doesn't have
- Postscript is connected to the server, the
- <literal>lp</literal>queue specifies in the
- <filename>/etc/printcap</filename> file the CRLF filter listed
- earlier. On the other hand, if an Apple Laserwriter that doesn't
- support ASCII is connected to the server, the
- <literal>a2ps</literal>filter would be specified in the
- <filename>/etc/printcap</filename> for the <literal>lp</literal>
- queue.</para>
-
- <para>When printing raw text files usually the <option>-p</option>
- option is specified to <command>lpr</command>. When printing
- preformatted files, such as PostScript files, the
- <option>-P</option> option is used, which selects whatever queue is
- used to handle these job types.</para>
- </sect2>
-
- <sect2>
- <title>Managing the Unix Print Queue</title>
-
- <para>Once the print jobs coming in from clients are received on the
- FreeBSD system and placed in the print spool, they are metered out
- at a slower rate to the various printers. If traffic activity is
- light, and few print jobs get sent through, the administrator can
- probably ignore the print queue as long as it continues to work.
- However, a busy network printer running at an optimal rate of speed
- usually has a backlog of unprinted jobs in the queue waiting for
- print time. To keep all users happy and to provide for the
- occasional rush print job, the Unix LPD/LPR printing system has
- several administration commands which are described here.</para>
-
- <sect3>
- <title>Viewing the queue</title>
-
- <para>On busy printers, and to troubleshoot stopped printers, users
- sometimes need to view the print jobs in the queue. Administrators
- also need to view the queue to see what jobs may need to be
- expedited. This can be done from the workstation that remotely
- submitted the job if the LPR client has the ability to do this.
- The Windows 3.1 LPR client discussed earlier has this capability.
- Unfortunately, many LPR clients don't, which means that the
- administrator must Telnet into the UNIX machine that the print
- queues are on and view them there.</para>
-
- <para>The UNIX shell command used to view the queue is the
- <command>lpq</command> command It is frequently run as
- <userinput>lpq -a</userinput> which shows jobs in all queues. The
- following is a sample output of the command:</para>
-
- <screen>&prompt.root; <userinput>lpq -a</userinput>
-nec-raw:
-Rank Owner Job Files Total Size
-1st tedm 19 C:/WLPRSPL/SPOOL/~LP00018.TMP 105221 bytes
-2nd tedm 20 C:/WLPRSPL/SPOOL/~LP00019.TMP 13488 bytes
-3rd root 3 hosts 1220 bytes
-4th tedm 1 Printer Test Page 765 bytes
-5th tedm 2 Microsoft Word - CHAPTE10.DOC 15411 bytes</screen>
-
- <para>The first two jobs and the last two jobs came from remote
- clients, the third came from the command prompt.</para>
- </sect3>
-
- <sect3>
- <title>Removing print jobs</title>
-
- <para>Deleting unwanted print jobs that haven't yet printed from the
- queue can be done by the remote workstations that submitted the
- job if their LPR implementations have the necessary commands. The
- Windows 3.1 LPR client I detailed earlier this capability. Many
- LPR clients don't, however, which means that the administrator
- must Telnet into the UNIX machine that the print queues are on and
- delete the jobs there.</para>
-
- <para>The administrator can delete any print jobs from any queues by
- running the <command>lprm</command> command followed by the
- specified print queue and the job number. Below is a sample
- output of the command:</para>
-
- <screen>&prompt.root; <userinput>lprm -P nec-raw 19</userinput>
-dfA019tedmitte dequeued
-cfA019dostest dequeued
-&prompt.root; <userinput>lprm -P nec-raw 3</userinput>
-dfA003toybox.placo.com dequeued
-cfA003toybox.placo.com dequeued</screen>
-
- <para>The <command>lprm</command> command is also used under UNIX to
- delete remote print jobs.</para>
- </sect3>
-
- <sect3>
- <title>Advanced management</title>
-
- <para>The administrator logged into the FreeBSD system as the root
- user can also perform several other operations that ordinary users
- cannot. These include turning the queues on and off, and moving
- print jobs within the print queues. The command used to do this
- is the <command>lpc</command> command.</para>
-
- <para><command>lpc</command> has two modes of operation. In the
- first mode, the command is run by itself, which puts the
- administrator into an <prompt>lpc</prompt> prompt. Some general
- help is available for the commands, such as the following sample
- output:</para>
-
- <screen>&prompt.root; <userinput>lpc</userinput>
-<prompt>lpc&gt;</prompt> <userinput>help</userinput>
-Commands may be abbreviated.
-Commands are:
-abort enable disable help restart status topq ?
-clean exit down quit start stop up
-<prompt>lpc&gt;</prompt> <userinput>help disable</userinput>
-disable turn a spooling queue off
-<prompt>lpc&gt;</prompt> <userinput>help status</userinput>
-status show status of daemon and queue
-<prompt>lpc&gt;</prompt> <userinput>exit</userinput></screen>
-
- <para>In the second mode of operation the <command>lpc</command>
- command is just run by itself, followed by the command and the
- print queue name. Following is a sample output:</para>
-
- <screen>&prompt.root; <userinput>lpc disable lp</userinput>
-lp:
-queuing disabled</screen>
-
- <para>Under FreeBSD, there is no command that specifically allows
- the administrator to move jobs from one queue to another. This
- can be done, however, by changing into the raw queue directory
- then rerunning the <command>lpr</command> command. Following is a
- sample run showing three print jobs moved from a dysfunctional
- queue to a good one:</para>
-
- <screen>&prompt.root; <userinput>lpq -a</userinput>
-lp:
-Warning: lp is down: printing disabled
-printing disabled
-Rank Owner Job Files Total Size
-1st root 51 hosts 1220 bytes
-2nd root 52 services 60767 bytes
-3rd root 53 printcap 2383 bytes
-&prompt.root; <userinput>cd /var/spool/output/lpd</userinput>
-&prompt.root; <userinput>ls</userinput>
-.seq cfA053toybox.placo.com dfA053toybox.placo.com
-cfA051toybox.placo.com dfA051toybox.placo.com lock
-cfA052toybox.placo.com dfA052toybox.placo.com status
-&prompt.root; <userinput>lpr -P nec-raw dfA051toybox.placo.com</userinput>
-&prompt.root; <userinput>lpr -P nec-raw dfA052toybox.placo.com</userinput>
-&prompt.root; <userinput>lpr -P nec-raw dfA053toybox.placo.com</userinput>
-&prompt.root; <userinput>lprm -P lp -</userinput>
-&prompt.root; <userinput>lpq -a</userinput>
-nec-raw:
-Warning: nec-raw is down: printing disabled
-Warning: no daemon present
-Rank Owner Job Files Total Size
-1st root 5 dfA051toybox.placo.com 1220 bytes
-2nd root 6 dfA052toybox.placo.com 60767 bytes
-3rd root 7 dfA053toybox.placo.com 2383 bytes</screen>
-
- <note>
- <para>Moving jobs from queue to queue is feasible only when all
- printers are similar, as when all printers support
- PostScript.</para>
- </note>
- </sect3>
-
- <sect3>
- <title>Remote Management</title>
-
- <para>Just as the root user can manipulate remotely submitted jobs
- in the print queue, print jobs can be remotely managed by regular
- users with the LPR clients that created them. Unfortunately, some
- LPR clients, such as Win95, don't have enough programming to be
- able to do this. Others, like the Win31 client, can manipulate
- the print jobs remotely.</para>
-
- <para>FreeBSD offers some level of protection against inadvertent
- deletion of print jobs from remote hosts by restricting
- manipulation of a job to the same host that originated it. Even
- if the owner of the job matches a local user account on the
- server, for an ordinary user to delete remotely submitted print
- jobs, the request still must come from the remote host.</para>
- </sect3>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Advanced Printing Topics</title>
-
- <para>The FreeBSD UNIX LPR/LPD printing system is very flexible, and,
- with the addition of filters, can be adapted to very unusual printing
- environments. To enhance this flexibility, several useful printing
- utilities are supplied on the FreeBSD CDROM which the administrator
- might wish to install.</para>
-
- <sect2>
- <title>Ghostscript</title>
-
- <para>The Ghostscript program, invoked as
- <filename>/usr/local/bin/gs</filename>, is one of the most useful
- printing utilities that have been developed for the free software
- community. Ghostscript reads incoming PostScript data, (or Adobe
- PDF files) interprets it, and outputs it as a raster image. This
- can be displayed on screen, for example, with the GhostView program
- under the X Window system, or printed on most graphics printers,
- such as Epson dot-matrix, HP DeskJet, or HP LaserJet. In effect, it
- is a way of adding PostScript printing capability to a printer that
- doesn't have PostScript firmware code. Ghostscript has been ported
- to numerous operating systems including Windows.</para>
-
- <para>The Ghostscript home page is located at
- <ulink url="http://www.cs.wisc.edu/~ghost/">http://www.cs.wisc.edu/~ghost/</ulink>
- and contains the most current version of the program. A prebuilt
- FreeBSD binary of Ghostscript located in the Packages section of the
- FreeBSD CDROM. This can be installed on the FreeBSD system by
- selecting the package from the prepackaged software list that is
- accessed through the <command>/stand/sysinstall</command>
- installation program. Many packaged programs on the CD depend on
- GhostScript, and so it may already be installed.</para>
-
- <para>Installation of the packaged version of GhostScript is
- recommended in the FreeBSD ports Section because it has been tested
- with the other packages that require it. The package creates a
- directory containing some documentation files in
- <filename>/usr/local/share/ghostscript/X.XX/doc</filename>.
- Unfortunately, because of the packaging process on the FreeBSD CDROM
- not all the useful installation files are copied into this location.
- So, if the package was version 5.03 (for example) the administrator
- will also want to get the file
- <ulink url="ftp://ftp.cs.wisc.edu/ghost/aladdin/gs502/ghostscript-5.02.tar.gz">ftp://ftp.cs.wisc.edu/ghost/aladdin/gs503/ghostscript-5.03.tar.gz</ulink>,
- and unzip and untar it into a temporary directory.</para>
-
- <para>Extracting the archive file creates a directory structure under
- the <filename>gs5.03</filename> subdirectory. To install
- ghostscript in the <filename>/etc/printcap</filename> file, read the
- <filename>gs5.03/devs.mak</filename> file to determine which printer
- driver definition works with your printer and then use the following
- instructions:</para>
-
- <procedure>
- <step>
- <para>Change to the root user with su.</para>
- </step>
-
- <step>
- <para>In the <filename>gs5.03</filename>directory, copy the
- <filename>lprsetup.sh</filename>,
- <filename>unix-lpr.txt</filename>, and
- <filename>unix-lpr.sh</filename> files to
- <filename>/usr/local/share/ghostscript/5.03</filename></para>
- </step>
-
- <step>
- <para>Change to the
- <filename>/usr/local/share/ghostscript/5.03</filename>
- directory. Edit <filename>lprsetup.sh</filename> with a text
- editor such as <command>vi</command>.</para>
- </step>
-
- <step>
- <para>Modify the <literal>DEVICES=</literal> entries
- to list your selected printer driver definitions per the
- instructions in <filename>unix-lpr.txt.</filename></para>
- </step>
-
- <step>
- <para>Modify the <literal>PRINTERDEV=</literal> to
- <literal>/dev/lpt0</literal>, and the <literal>GSDIR=</literal>
- to <literal>/usr/local/share/ghostscript</literal>, and the
- <literal>SPOOLDIR=</literal> to
- <literal>/var/spool/output</literal>. Save the file.</para>
- </step>
-
- <step>
- <para>Edit the <filename>unix-lpr.sh</filename> file and change
- the <literal>PSFILTERPATH=</literal> to
- <literal>/usr/local/share/ghostscript</literal>.</para>
- </step>
-
- <step>
- <para>If the printer that you defined in the
- <filename>lprsetup.sh</filename> file is a monochrome printer,
- remove the <literal>"-dBitsPerPixel=${bpp}"</literal>and
- <literal>"$colorspec"</literal> entries on the
- <literal>gs</literal> invocation line and save the file.
- Otherwise, if it is a color definition leave them in. For
- example, the following line is for a monochrome LaserJet:</para>
-
- <programlisting>") | gs -q -dNOPAUSE -sDEVICE=${device} \"</programlisting>
-
- <para>Don't remove anything else. Exit the editor, and save the
- <filename>unix-lpr.sh</filename> file.</para>
- </step>
-
- <step>
- <para>Copy the <filename>unix-lpr.sh</filename> file to the parent
- directory, <filename>/usr/local/share/ghostscript</filename> and
- set the execute bit on it.</para>
- </step>
-
- <step>
- <para>Set the execute bit on <filename>lprsetup.sh</filename> with
- chmod and run the file by typing
- <userinput>./lprsetup.sh</userinput></para>
- </step>
-
- <step>
- <para>Follow the instructions on creating the Spool directories.
- If you will be using accounting and a separate log file, run the
- <command>touch</command> command to create the empty files per
- directions in script output.</para>
- </step>
-
- <step>
- <para>The sample <command>/etc/printcap</command> is located in
- the current directory; the filename is
- <filename>printcap.insert</filename>. Use this as a template to
- modify the <filename>/etc/printcap</filename> file. A sample
- <filename>/etc/printcap</filename> file for a LaserJet 3 is
- below:</para>
-
- <programlisting>#
-#
-ljet3.raw|Raw output device ljet3 for Ghostscript:\
- :rm=big.army.mil:rp=sherman:sd=/var/spool/output/ljet3/raw:\
- :mx#0:sf:sh:rs:
-
-#
-
-ljet3|Ghostscript device ljet3 (output to ljet3.raw):\
- :lp=/dev/null:sd=/var/spool/output/ljet3:\
- :lf=/var/log/lpd-errs:mx#0:sf:sh:rs:\
- :if=/usr/local/share/ghostscript/filt/indirect/ljet3/gsif:\
- :af=/var/spool/output/ljet3/acct:
-
-#</programlisting>
- </step>
- </procedure>
- </sect2>
-
- <sect2>
- <title>a2ps filter</title>
-
- <para>Another handy utility is the <command>a2ps</command>, short for
- ASCII-to-PostScript. This program takes an incoming ASCII
- datastream and converts it into PostScript. It can also print
- multiple pages on a single sheet of paper by shrinking them down. It
- is a useful tool for a printer that cannot interpret ASCII, such as
- a PostScript-only printer.</para>
-
- <para><command>A2ps</command> is not installed in the FreeBSD system
- by default; it is located in the ports section
- <filename>/usr/ports/print/a2ps43</filename>. A prepackaged binary
- can be installed with <command>/stand/sysinstall</command> but I
- have had problems with that port. It is best to install it by
- running <command>make</command> in the a2ps43 ports directory. A
- printcap entry and filter using this follow:</para>
-
- <example>
- <title><filename>/etc/printcap</filename></title>
-
- <programlisting>#
-lp|local line printer with output dumped through a2ps for raw listings:\
- :lp=/dev/lpt0:sd=/var/spool/output/lpd:lf=/var/log/lpd-errs:sh:mx#0:\
- :if=/usr/local/libexec/ascii2postscript:
-#</programlisting>
- </example>
-
- <example>
- <title><filename>/usr/local/libexec/ascii2postscript</filename></title>
-
- <programlisting>#!/bin/sh
-#
-# Simple filter that converts ASCII to Postscript for basic stuff like
-# directory listings.
-#
-
-/usr/local/bin/a2ps &amp;&amp; exit 0
-
-exit 2</programlisting>
- </example>
-
- <para>Read the system manual page for <command>a2ps</command> to see
- the options available with this program, and remember to set the
- filter script <filename>ascii2postscript</filename>
- all-executable.</para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Miscellaneous</title>
-
- <para>The large number of other printing utilities cannot be covered
- here. Some add features such as automatic job type sensing, others
- handle bidirectional communication between the server and the printer.
- There are also a few other experimental LPR printing replacement
- systems. Commands such as ghostscript and <command>a2ps</command> can
- also be used in pipes that create pretty output on an ordinary impact
- printer.</para>
-
- <para>One last hint - the system manual pages can be printed with the
- <option>-t</option> option which turns their ordinary ASCII output to
- beautifully formatted PostScript. Try the command <command>man -t
- man</command> and send the output through GhostScript or a
- PostScript printer for easier to read manual pages.</para>
- </sect1>
- </chapter>
-</book>
diff --git a/en_US.ISO8859-1/books/corp-net-guide/freebsd.dsl b/en_US.ISO8859-1/books/corp-net-guide/freebsd.dsl
deleted file mode 100644
index ba9b0d542f..0000000000
--- a/en_US.ISO8859-1/books/corp-net-guide/freebsd.dsl
+++ /dev/null
@@ -1,18 +0,0 @@
-<!-- $FreeBSD: doc/en_US.ISO_8859-1/books/design-44bsd/freebsd.dsl,v 1.1 2001/03/09 18:05:31 nik Exp $ -->
-
-<!DOCTYPE style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN" [
-<!ENTITY freebsd.dsl SYSTEM "../../share/sgml/freebsd.dsl" CDATA DSSSL>
-]>
-
-<style-sheet>
- <style-specification use="docbook">
- <style-specification-body>
-
- ;; Keep the legalnotice together with the rest of the text
- (define %generate-legalnotice-link%
- #f)
- </style-specification-body>
- </style-specification>
-
- <external-specification id="docbook" document="freebsd.dsl">
-</style-sheet>
diff --git a/en_US.ISO8859-1/books/design-44bsd/Makefile b/en_US.ISO8859-1/books/design-44bsd/Makefile
deleted file mode 100644
index 14af09bcd2..0000000000
--- a/en_US.ISO8859-1/books/design-44bsd/Makefile
+++ /dev/null
@@ -1,20 +0,0 @@
-# $FreeBSD: doc/en_US.ISO_8859-1/books/design-44bsd/Makefile,v 1.1 2001/02/20 20:01:32 nik Exp $
-
-DOC?= book
-
-FORMATS?= html
-
-IMAGES= fig1.eps fig2.eps
-
-INSTALL_COMPRESSED?=gz
-INSTALL_ONLY_COMPRESSED?=
-
-SRCS= book.sgml
-
-# Use the local DSSSL file
-DSLHTML?= ${.CURDIR}/freebsd.dsl
-DSLPRINT?= ${.CURDIR}/freebsd.dsl
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/books/design-44bsd/book.sgml b/en_US.ISO8859-1/books/design-44bsd/book.sgml
deleted file mode 100644
index fb751ee429..0000000000
--- a/en_US.ISO8859-1/books/design-44bsd/book.sgml
+++ /dev/null
@@ -1,2858 +0,0 @@
-<!-- $FreeBSD: doc/en_US.ISO8859-1/books/design-44bsd/book.sgml,v 1.3 2001/03/09 18:05:31 nik Exp $ -->
-<!-- FreeBSD Documentation Project -->
-
-<!DOCTYPE book PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man;
-]>
-
-<book>
- <bookinfo>
- <title>The Design and Implementation of the 4.4BSD Operating System</title>
-
- <authorgroup>
- <author>
- <firstname>Marshall</firstname>
- <othername>Kirk</othername>
- <surname>McKusick</surname>
- </author>
-
- <author>
- <firstname>Keith</firstname>
- <surname>Bostic</surname>
- </author>
-
- <author>
- <firstname>Michael</firstname>
- <othername>J.</othername>
- <surname>Karels</surname>
- </author>
-
- <author>
- <firstname>John</firstname>
- <othername>S.</othername>
- <surname>Quarterman</surname>
- </author>
- </authorgroup>
-
- <copyright>
- <year>1996</year>
- <holder>Addison-Wesley Longman, Inc</holder>
- </copyright>
-
-<!-- I seem to recall the editor wanting this notice to be bold. In html, I'd
- use the _strong_ tag. What should I use instead? -->
-
- <legalnotice>
- <para>The second chapter of the book, <citetitle>The Design and
- Implementation of the 4.4BSD Operating System</citetitle> is
- excerpted here with the permission of the publisher. No part of it
- may be further reproduced or distributed without the publisher's
- express written
- <ulink url="mailto:peter.gordon@awl.com">permission</ulink>. The
- rest of
- <ulink url="http://cseng.aw.com/book/0,3828,0201549794,00.html">the
- book</ulink> explores the concepts introduced in this chapter in
- incredible detail and is an excellent reference for anyone with an
- interest in BSD UNIX. More information about this book is available
- from the publisher, with whom you can also sign up to receive news
- of <ulink url="mailto:curt.johnson@awl.com">related titles</ulink>.
- Information about <ulink url="http://www.mckusick.com/courses/">BSD
- courses</ulink> is available from Kirk McKusick.</para>
- </legalnotice>
- </bookinfo>
-
- <chapter label="2">
- <title>Design Overview of 4.4BSD</title>
-
- <sect1>
- <title>4.4BSD Facilities and the Kernel</title>
-
- <para>The 4.4BSD kernel provides four basic facilities:
- processes,
- a filesystem,
- communications, and
- system startup.
- This section outlines where each of these four basic services
- is described in this book.</para>
-
- <orderedlist>
- <listitem>
- <para>Processes constitute a thread of control in an address space.
- Mechanisms for creating, terminating, and otherwise
- controlling processes are described in
- Chapter 4.
- The system multiplexes separate virtual-address spaces
- for each process;
- this memory management is discussed in
- Chapter 5.</para>
- </listitem>
-
- <listitem>
- <para>The user interface to the filesystem and devices is similar;
- common aspects are discussed in
- Chapter 6.
- The filesystem is a set of named files, organized in a tree-structured
- hierarchy of directories, and of operations to manipulate them,
- as presented in
- Chapter 7.
- Files reside on physical media such as disks.
- 4.4BSD supports several organizations of data on the disk,
- as set forth in
- Chapter 8.
- Access to files on remote machines is the subject of
- Chapter 9.
- Terminals are used to access the system; their operation is
- the subject of
- Chapter 10.</para>
- </listitem>
-
- <listitem>
- <para>Communication mechanisms provided by traditional UNIX systems include
- simplex reliable byte streams between related processes (see pipes,
- Section 11.1),
- and notification of exceptional events (see signals,
- Section 4.7).
- 4.4BSD also has a general interprocess-communication facility.
- This facility, described in
- Chapter 11,
- uses access mechanisms distinct from those of the filesystem,
- but, once a connection is set up, a process can access it
- as though it were a pipe.
- There is a general networking framework,
- discussed in
- Chapter 12,
- that is normally used as a layer underlying the
- IPC
- facility.
- Chapter 13
- describes a particular networking implementation in detail.</para>
- </listitem>
-
- <listitem>
- <para>Any real operating system has operational issues, such as how to
- start it running.
- Startup and operational issues are described in
- Chapter 14.</para>
- </listitem>
- </orderedlist>
-
- <para>Sections 2.3 through 2.14 present introductory
- material related to Chapters 3 through 14.
- We shall define terms, mention basic system calls,
- and explore historical developments.
- Finally, we shall give the reasons for many major design decisions.</para>
-
- <sect2>
- <title>The Kernel</title>
-
- <para>The
- <emphasis>kernel</emphasis>
- is the part of the system that runs in protected mode and mediates
- access by all user programs to the underlying hardware (e.g.,
- CPU,
- disks, terminals, network links)
- and software constructs
- (e.g., filesystem, network protocols).
- The kernel provides the basic system facilities;
- it creates and manages processes,
- and provides functions to access the filesystem
- and communication facilities.
- These functions, called
- <emphasis>system calls</emphasis>
- appear to user processes as library subroutines.
- These system calls are the only interface
- that processes have to these facilities.
- Details of the system-call mechanism are given in
- Chapter 3,
- as are descriptions of several kernel mechanisms that do not execute
- as the direct result of a process doing a system call.</para>
-
- <para>A
- <emphasis>kernel</emphasis>
- in traditional operating-system terminology,
- is a small nucleus of software that
- provides only the minimal facilities necessary for implementing
- additional operating-system services.
- In contemporary research operating systems -- such as
- Chorus
- <xref linkend="biblio-rozier">,
- Mach
- <xref linkend="biblio-accetta">,
- Tunis
- <xref linkend="biblio-ewens">,
- and the
- V Kernel
- <xref linkend="biblio-cheriton"> --
- this division of functionality is more than just a logical one.
- Services such as filesystems and networking protocols are
- implemented as client application processes of the nucleus or kernel.</para>
-
- <para>The
- 4.4BSD kernel is not partitioned into multiple processes.
- This basic design decision was made in the earliest versions of UNIX.
- The first two implementations by
- Ken Thompson had no memory mapping,
- and thus made no hardware-enforced distinction
- between user and kernel space
- <xref linkend="biblio-ritchie">.
- A message-passing system could have been implemented as readily
- as the actually implemented model of kernel and user processes.
- The monolithic kernel was chosen for simplicity and performance.
- And the early kernels were small;
- the inclusion of facilities such as networking
- into the kernel has increased its size.
- The current trend in operating-systems research
- is to reduce the kernel size by placing
- such services in user space.</para>
-
- <para>Users ordinarily interact with the system through a command-language
- interpreter, called a
- <emphasis>shell</emphasis>,
- and perhaps through additional user application programs.
- Such programs and the shell are implemented with processes.
- Details of such programs are beyond the scope of this book,
- which instead concentrates almost exclusively on the kernel.</para>
-
- <para>Sections 2.3 and 2.4
- describe the services provided by the 4.4BSD kernel,
- and give an overview of the latter's design.
- Later chapters describe the detailed design and implementation of these
- services as they appear in 4.4BSD.</para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Kernel Organization</title>
-
- <para>In this section, we view the organization of the 4.4BSD
- kernel in two ways:</para>
-
- <orderedlist>
- <listitem>
- <para>As a static body of software,
- categorized by the functionality offered by the modules
- that make up the kernel</para>
- </listitem>
-
- <listitem>
- <para>By its dynamic operation,
- categorized according to the services provided to users</para>
- </listitem>
- </orderedlist>
-
- <para>The largest part of the kernel implements
- the system services that applications access through system calls.
- In 4.4BSD, this software has been organized according to the following:</para>
-
- <itemizedlist>
- <listitem>
- <para>Basic kernel facilities:
- timer and system-clock handling,
- descriptor management, and process management</para>
- </listitem>
-
- <listitem>
- <para>Memory-management support:
- paging and swapping</para>
- </listitem>
-
- <listitem>
- <para>Generic system interfaces:
- the I/O,
- control, and multiplexing operations performed on descriptors</para>
- </listitem>
-
- <listitem>
- <para>The filesystem:
- files, directories, pathname translation, file locking,
- and I/O buffer management</para>
- </listitem>
-
- <listitem>
- <para>Terminal-handling support:
- the terminal-interface driver and terminal
- line disciplines</para>
- </listitem>
-
- <listitem>
- <para>Interprocess-communication facilities:
- sockets</para>
- </listitem>
-
- <listitem>
- <para>Support for network communication:
- communication protocols and
- generic network facilities, such as routing</para>
- </listitem>
- </itemizedlist>
-
- <table frame="none" id="table-mach-indep">
- <title>Machine-independent software in the 4.4BSD kernel</title>
- <tgroup cols="3">
- <thead>
- <row>
- <entry>Category</entry>
- <entry>Lines of code</entry>
- <entry>Percentage of kernel</entry>
- </row>
- </thead>
-
- <tfoot>
- <row>
- <entry>total machine independent</entry>
- <entry>162,617</entry>
- <entry>80.4</entry>
- </row>
- </tfoot>
-
- <tbody>
- <row>
- <entry>headers</entry>
- <entry>9,393</entry>
- <entry>4.6</entry>
- </row>
-
- <row>
- <entry>initialization</entry>
- <entry>1,107</entry>
- <entry>0.6</entry>
- </row>
-
- <row>
- <entry>kernel facilities</entry>
- <entry>8,793</entry>
- <entry>4.4</entry>
- </row>
-
- <row>
- <entry>generic interfaces</entry>
- <entry>4,782</entry>
- <entry>2.4</entry>
- </row>
-
- <row>
- <entry>interprocess communication</entry>
- <entry>4,540</entry>
- <entry>2.2</entry>
- </row>
-
- <row>
- <entry>terminal handling</entry>
- <entry>3,911</entry>
- <entry>1.9</entry>
- </row>
-
- <row>
- <entry>virtual memory</entry>
- <entry>11,813</entry>
- <entry>5.8</entry>
- </row>
-
- <row>
- <entry>vnode management</entry>
- <entry>7,954</entry>
- <entry>3.9</entry>
- </row>
-
- <row>
- <entry>filesystem naming</entry>
- <entry>6,550</entry>
- <entry>3.2</entry>
- </row>
-
- <row>
- <entry>fast filestore</entry>
- <entry>4,365</entry>
- <entry>2.2</entry>
- </row>
-
- <row>
- <entry>log-structure filestore</entry>
- <entry>4,337</entry>
- <entry>2.1</entry>
- </row>
-
- <row>
- <entry>memory-based filestore</entry>
- <entry>645</entry>
- <entry>0.3</entry>
- </row>
-
- <row>
- <entry>cd9660 filesystem</entry>
- <entry>4,177</entry>
- <entry>2.1</entry>
- </row>
-
- <row>
- <entry>miscellaneous filesystems (10)</entry>
- <entry>12,695</entry>
- <entry>6.3</entry>
- </row>
-
- <row>
- <entry>network filesystem</entry>
- <entry>17,199</entry>
- <entry>8.5</entry>
- </row>
-
- <row>
- <entry>network communication</entry>
- <entry>8,630</entry>
- <entry>4.3</entry>
- </row>
-
- <row>
- <entry>internet protocols</entry>
- <entry>11,984</entry>
- <entry>5.9</entry>
- </row>
-
- <row>
- <entry>ISO protocols</entry>
- <entry>23,924</entry>
- <entry>11.8</entry>
- </row>
-
- <row>
- <entry>X.25 protocols</entry>
- <entry>10,626</entry>
- <entry>5.3</entry>
- </row>
-
- <row>
- <entry>XNS protocols</entry>
- <entry>5,192</entry>
- <entry>2.6</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <para>Most of the software in these categories is machine independent
- and is portable across different hardware architectures.</para>
-
- <para>The machine-dependent aspects of the kernel
- are isolated from the mainstream code.
- In particular, none of the machine-independent code contains
- conditional code for specific architecture.
- When an architecture-dependent action is needed,
- the machine-independent code calls an architecture-dependent
- function that is located in the machine-dependent code.
- The software that is machine dependent includes</para>
-
- <itemizedlist>
- <listitem>
- <para>Low-level system-startup actions</para>
- </listitem>
-
- <listitem>
- <para>Trap and fault handling</para>
- </listitem>
-
- <listitem>
- <para>Low-level manipulation of the run-time context of a
- process</para>
- </listitem>
-
- <listitem>
- <para>Configuration and initialization of hardware devices</para>
- </listitem>
-
- <listitem>
- <para>Run-time support for I/O devices</para>
- </listitem>
- </itemizedlist>
-
- <table frame="none" id="table-mach-dep">
- <title>Machine-dependent software for the HP300 in the 4.4BSD
- kernel</title>
-
- <tgroup cols="3">
- <thead>
- <row>
- <entry>Category</entry>
- <entry>Lines of code</entry>
- <entry>Percentage of kernel</entry>
- </row>
- </thead>
-
- <tfoot>
- <row>
- <entry>total machine dependent</entry>
- <entry>39,634</entry>
- <entry>19.6</entry>
- </row>
- </tfoot>
-
- <tbody>
- <row>
- <entry>machine dependent headers</entry>
- <entry>1,562</entry>
- <entry>0.8</entry>
- </row>
-
- <row>
- <entry>device driver headers</entry>
- <entry>3,495</entry>
- <entry>1.7</entry>
- </row>
-
- <row>
- <entry>device driver source</entry>
- <entry>17,506</entry>
- <entry>8.7</entry>
- </row>
-
- <row>
- <entry>virtual memory</entry>
- <entry>3,087</entry>
- <entry>1.5</entry>
- </row>
-
- <row>
- <entry>other machine dependent</entry>
- <entry>6,287</entry>
- <entry>3.1</entry>
- </row>
-
- <row>
- <entry>routines in assembly language</entry>
- <entry>3,014</entry>
- <entry>1.5</entry>
- </row>
-
- <row>
- <entry>HP/UX compatibility</entry>
- <entry>4,683</entry>
- <entry>2.3</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <para><xref linkend="table-mach-indep"> summarizes the machine-independent software that constitutes the
- 4.4BSD kernel for the HP300.
- The numbers in column 2 are for lines of C source code,
- header files, and assembly language.
- Virtually all the software in the kernel is written in the C
- programming language;
- less than 2 percent is written in
- assembly language.
- As the statistics in <xref linkend="table-mach-dep"> show,
- the machine-dependent software, excluding
- HP/UX
- and device support,
- accounts for a minuscule 6.9 percent of the kernel.</para>
-
- <para>Only a small part of the kernel is devoted to
- initializing the system.
- This code is used when the system is
- <emphasis>bootstrapped</emphasis>
- into operation and is responsible for setting up the kernel hardware
- and software environment
- (see
- Chapter 14).
- Some operating systems (especially those with limited physical memory)
- discard or
- <emphasis>overlay</emphasis>
- the software that performs these functions after that software has
- been executed.
- The 4.4BSD kernel does not reclaim the memory used by the
- startup code because that memory space is barely 0.5 percent
- of the kernel resources used on a typical machine.
- Also, the startup code does not appear in one place in the kernel -- it is
- scattered throughout, and it usually appears
- in places logically associated with what is being initialized.</para>
- </sect1>
-
- <sect1>
- <title>Kernel Services</title>
-
- <para>The boundary between the kernel- and user-level code is enforced by
- hardware-protection facilities provided by the underlying hardware.
- The kernel operates in a separate address space that is inaccessible to
- user processes.
- Privileged operations -- such as starting I/O
- and halting the central processing unit
- (CPU) --
- are available to only the kernel.
- Applications request services from the kernel with
- <emphasis>system calls</emphasis>
- System calls are used to cause the kernel to execute complicated
- operations, such as writing data to secondary storage,
- and simple operations, such as returning the current time of day.
- All system calls appear
- <emphasis>synchronous</emphasis>
- to applications:
- The application does not run while the kernel does the actions associated
- with a system call.
- The kernel may finish some operations associated with a system call
- after it has returned.
- For example, a
- <emphasis>write</emphasis>
- system call will copy the data to be written
- from the user process to a kernel buffer while the process waits,
- but will usually return from the system call
- before the kernel buffer is written to the disk.</para>
-
- <para>A system call usually is implemented as a hardware trap that changes the
- CPU's
- execution mode and the current address-space mapping.
- Parameters supplied by users in system calls are validated by the kernel
- before being used.
- Such checking ensures the integrity of the system.
- All parameters passed into the kernel are copied into the
- kernel's address space,
- to ensure that validated parameters are not changed
- as a side effect of the system call.
- System-call results are returned by the kernel,
- either in hardware registers or by their values
- being copied to user-specified memory addresses.
- Like parameters passed into the kernel,
- addresses used for
- the return of results must be validated to ensure that they are
- part of an application's address space.
- If the kernel encounters an error while processing a system call,
- it returns an error code to the user.
- For the
- C programming language, this error code
- is stored in the global variable
- <emphasis>errno</emphasis>,
- and the function that executed the system call returns the value -1.</para>
-
- <para>User applications and the kernel operate
- independently of each other.
- 4.4BSD does not store I/O control blocks or other
- operating-system-related
- data structures in the application's address space.
- Each user-level application is provided an independent address space in
- which it executes.
- The kernel makes most state changes,
- such as suspending a process while another is running,
- invisible to the processes involved.</para>
- </sect1>
-
- <sect1>
- <title>Process Management</title>
-
- <para>4.4BSD supports a multitasking environment.
- Each task or thread of execution is termed a
- <emphasis>process</emphasis>.
- The
- <emphasis>context</emphasis>
- of a 4.4BSD process consists of user-level state,
- including the contents of its address space
- and the run-time environment, and kernel-level state,
- which includes
- scheduling parameters,
- resource controls,
- and identification information.
- The context includes everything
- used by the kernel in providing services for the process.
- Users can create processes, control the processes' execution,
- and receive notification when the processes' execution status changes.
- Every process is assigned a unique value, termed a
- <emphasis>process identifier</emphasis>
- (PID).
- This value is used by the kernel to identify a process when reporting
- status changes to a user, and by a user when referencing a process
- in a system call.</para>
-
- <para>The kernel creates a process by duplicating the context of another process.
- The new process is termed a
- <emphasis>child process</emphasis>
- of the original
- <emphasis>parent process</emphasis>
- The context duplicated in process creation includes
- both the user-level execution state of the process and
- the process's system state managed by the kernel.
- Important components of the kernel state are described in
- Chapter 4.</para>
-
- <figure id="fig-process-lifecycle">
- <title>Process lifecycle</title>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="fig1" format="EPS">
- </imageobject>
-
- <textobject>
- <literallayout class="monospaced">+----------------+ wait +----------------+
-| parent process |--------------------------------->| parent process |--->
-+----------------+ +----------------+
- | ^
- | fork |
- V |
-+----------------+ execve +----------------+ wait +----------------+
-| child process |------->| child process |------->| zombie process |
-+----------------+ +----------------+ +----------------+</literallayout>
- </textobject>
-
- <textobject>
- <phrase>Process-management system calls</phrase>
- </textobject>
- </mediaobject>
- </figure>
-
- <para>The process lifecycle is depicted in <xref linkend="fig-process-lifecycle">.
- A process may create a new process that is a copy of the original
- by using the
- <emphasis>fork</emphasis>
- system call.
- The
- <emphasis>fork</emphasis>
- call returns twice: once in the parent process, where
- the return value is the process identifier of the child,
- and once in the child process, where the return value is 0.
- The parent-child relationship induces a hierarchical structure on
- the set of processes in the system.
- The new process shares all its parent's resources, such as
- file descriptors, signal-handling status, and memory layout.</para>
-
- <para>Although there are occasions when the new process is intended
- to be a copy of the parent,
- the loading and execution of a different program is
- a more useful and typical action.
- A process can overlay itself with the memory image of another program,
- passing to the newly created image a set of parameters,
- using the system call
- <emphasis>execve</emphasis>.
- One parameter is the name of a file whose contents are
- in a format recognized by the system -- either a binary-executable file
- or a file that causes
- the execution of a specified interpreter program to process its contents.</para>
-
- <para>A process may terminate by executing an
- <emphasis>exit</emphasis>
- system call, sending 8 bits of
- exit status to its parent.
- If a process wants to communicate more than a single byte of
- information with its parent,
- it must either set up an interprocess-communication channel
- using pipes or sockets,
- or use an intermediate file.
- Interprocess communication is discussed extensively in
- Chapter 11.</para>
-
- <para>A process can suspend execution until any of its child processes terminate
- using the
- <emphasis>wait</emphasis>
- system call, which returns the
- PID
- and
- exit status of the terminated child process.
- A parent process can arrange to be notified by a signal when
- a child process exits or terminates abnormally.
- Using the
- <emphasis>wait4</emphasis>
- system call, the parent can retrieve information about
- the event that caused termination of the child process
- and about resources consumed by the process during its lifetime.
- If a process is orphaned because its parent exits before it is finished,
- then the kernel arranges for the child's exit status to be passed back
- to a special system process
- <!-- FIXME, the emphasis is wrong -->
- <emphasis>init</emphasis>:
- see Sections 3.1 and 14.6).</para>
-
- <para>The details of how the kernel creates and destroys processes are given in
- Chapter 5.</para>
-
- <para>Processes are scheduled for execution according to a
- <emphasis>process-priority</emphasis>
- parameter.
- This priority is managed by a kernel-based scheduling algorithm.
- Users can influence the scheduling of a process by specifying
- a parameter
- (<emphasis>nice</emphasis>)
- that weights the overall scheduling priority,
- but are still obligated to share the underlying
- CPU
- resources according to the kernel's scheduling policy.</para>
-
- <sect2>
- <title>Signals</title>
-
- <para>The system defines a set of
- <emphasis>signals</emphasis>
- that may be delivered to a process.
- Signals in 4.4BSD are modeled after hardware interrupts.
- A process may specify a user-level subroutine to be a
- <emphasis>handler</emphasis>
- to which a signal should be delivered.
- When a signal is generated,
- it is blocked from further occurrence while it is being
- <emphasis>caught</emphasis>
- by the handler.
- Catching a signal involves saving the current process context
- and building a new one in which to run the handler.
- The signal is then delivered to the handler, which can either abort
- the process or return to the executing process
- (perhaps after setting a global variable).
- If the handler returns, the signal is unblocked
- and can be generated (and caught) again.</para>
-
- <para>Alternatively, a process may specify that a signal is to be
- <emphasis>ignored</emphasis>,
- or that a default action, as determined by the kernel, is to be taken.
- The default action of certain signals is to terminate the process.
- This termination may be accompanied by creation of a
- <emphasis>core file</emphasis>
- that contains the current memory image of the process for use
- in postmortem debugging.</para>
-
- <para>Some signals cannot be caught or ignored.
- These signals include
- <emphasis>SIGKILL</emphasis>,
- which kills runaway processes,
- and the
- job-control signal
- <emphasis>SIGSTOP</emphasis>.</para>
-
- <para>A process may choose to have signals delivered on a
- special stack so that sophisticated software stack manipulations
- are possible.
- For example, a language supporting
- coroutines needs to provide a stack for each coroutine.
- The language run-time system can allocate these stacks
- by dividing up the single stack provided by 4.4BSD.
- If the kernel does not support a separate signal stack,
- the space allocated for each coroutine must be expanded by the
- amount of space required to catch a signal.</para>
-
- <para>All signals have the same <emphasis>priority</emphasis>.
- If multiple signals are pending simultaneously, the order in which
- signals are delivered to a process is implementation specific.
- Signal handlers execute with the signal that caused their
- invocation to be blocked, but other signals may yet occur.
- Mechanisms are provided so that processes can protect critical sections
- of code against the occurrence of specified signals.</para>
-
- <para>The detailed design and implementation of signals is described in
- Section 4.7.</para>
- </sect2>
-
- <sect2>
- <title>Process Groups and Sessions</title>
-
- <para>Processes are organized into
- <emphasis>process groups</emphasis>.
- Process groups are used to control access to terminals
- and to provide a means of distributing signals to collections of
- related processes.
- A process inherits its process group from its parent process.
- Mechanisms are provided by the kernel to allow a process to
- alter its process group or the process group of its descendents.
- Creating a new process group is easy;
- the value of a new process group is ordinarily the
- process identifier of the creating process.</para>
-
- <para>The group of processes in a process group is sometimes
- referred to as a
- <emphasis>job</emphasis>
- and is manipulated by high-level system software, such as the shell.
- A common kind of job created by a shell is a
- <emphasis>pipeline</emphasis>
- of several processes connected by pipes, such that the output of the first
- process is the input of the second, the output of the second is the
- input of the third, and so forth.
- The shell creates such a job by forking a
- process for each stage of the pipeline,
- then putting all those processes into a separate process group.</para>
-
- <para>A user process can send a signal to each process in
- a process group, as well as to a single process.
- A process in a specific process group may receive
- software interrupts affecting the group, causing the group to
- suspend or resume execution, or to be interrupted or terminated.</para>
-
- <para>A terminal has a process-group identifier assigned to it.
- This identifier is normally set to the identifier of a process group
- associated with the terminal.
- A job-control shell may create a number of process groups
- associated with the same terminal; the terminal is the
- <emphasis>controlling terminal</emphasis>
- for each process in these groups.
- A process may read from a descriptor for its controlling terminal
- only if the terminal's process-group identifier
- matches that of the process.
- If the identifiers do not match,
- the process will be blocked if it attempts to read from the terminal.
- By changing the process-group identifier of the terminal,
- a shell can arbitrate a terminal among several different jobs.
- This arbitration is called
- <emphasis>job control</emphasis>
- and is described, with process groups, in
- Section 4.8.</para>
-
- <para>Just as a set of related processes can be collected into a process group,
- a set of process groups can be collected into a
- <emphasis>session</emphasis>.
- The main uses for sessions are to create an isolated environment for a
- daemon process and its children,
- and to collect together a user's login shell
- and the jobs that that shell spawns.</para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Memory Management</title>
-
- <para>Each process has its own private address space.
- The address space is initially divided into three logical segments:
- <emphasis>text</emphasis>,
- <emphasis>data</emphasis>,
- and
- <emphasis>stack</emphasis>.
- The text segment is read-only and contains the machine
- instructions of a program.
- The data and stack segments are both readable and writable.
- The data segment contains the
- initialized and uninitialized data portions of a program, whereas
- the stack segment holds the application's run-time stack.
- On most machines, the stack segment is extended automatically
- by the kernel as the process executes.
- A process can expand or contract its data segment by making a system call,
- whereas a process can change the size of its text segment
- only when the segment's contents are overlaid with data from the
- filesystem, or when debugging takes place.
- The initial contents of the segments of a child process
- are duplicates of the segments of a parent process.</para>
-
- <para>The entire contents of a process address space do not need to be resident
- for a process to execute.
- If a process references a part of its address space that is not
- resident in main memory, the system
- <emphasis>pages</emphasis>
- the necessary information into memory.
- When system resources are scarce, the system uses a two-level
- approach to maintain available resources.
- If a modest amount of memory is available, the system will take
- memory resources away from processes if these resources have not been
- used recently.
- Should there be a severe resource shortage, the system will resort to
- <emphasis>swapping</emphasis>
- the entire context of a process to secondary storage.
- The
- <emphasis>demand paging</emphasis>
- and
- <emphasis>swapping</emphasis>
- done by the system are effectively transparent to processes.
- A process may, however, advise the system
- about expected future memory utilization as a performance aid.</para>
-
- <sect2>
- <title>BSD Memory-Management Design Decisions</title>
-
- <para>The support of large sparse address spaces, mapped files,
- and shared memory was a requirement for 4.2BSD.
- An interface was specified, called
- <emphasis>mmap</emphasis>,
- that allowed unrelated processes to request a shared
- mapping of a file into their address spaces.
- If multiple processes mapped the same file into their address spaces,
- changes to the file's portion of an address space
- by one process would be reflected
- in the area mapped by the other processes, as well as in the file itself.
- Ultimately, 4.2BSD was shipped without the
- <emphasis>mmap</emphasis>
- interface, because of pressure to make other features, such as
- networking, available.</para>
-
- <para>Further development of the
- <emphasis>mmap</emphasis>
- interface continued during the work on 4.3BSD.
- Over 40 companies and research groups participated
- in the discussions leading to the revised architecture
- that was described in the Berkeley Software Architecture Manual
- <xref linkend="biblio-mckusick-1">.
- Several of the companies have implemented the revised interface
- <xref linkend="biblio-gingell">.</para>
-
- <para>Once again, time pressure prevented 4.3BSD from providing an
- implementation of the interface.
- Although the latter could have been built into the existing
- 4.3BSD virtual-memory system,
- the developers decided not to put it in because
- that implementation was nearly 10 years old.
- Furthermore, the original virtual-memory design was based
- on the assumption that computer
- memories were small and expensive, whereas disks were
- locally connected, fast, large, and inexpensive.
- Thus, the virtual-memory system was designed to be frugal
- with its use of memory at the expense of generating extra disk traffic.
- In addition, the
- 4.3BSD implementation was riddled with
- VAX
- memory-management hardware dependencies that impeded its portability
- to other computer architectures.
- Finally, the virtual-memory system was not designed
- to support the tightly coupled
- multiprocessors that are becoming
- increasingly common and important today.</para>
-
- <para>Attempts to improve the old implementation incrementally
- seemed doomed to failure.
- A completely new design,
- on the other hand,
- could take advantage of large memories,
- conserve disk transfers,
- and have the potential to run on multiprocessors.
- Consequently, the virtual-memory system was completely replaced in 4.4BSD.
- The 4.4BSD virtual-memory system
- is based on the Mach 2.0 VM system
- <xref linkend="biblio-tevanian">.
- with updates from Mach 2.5 and Mach 3.0.
- It features
- efficient support for sharing,
- a clean separation of machine-independent and machine-dependent features,
- as well as (currently unused) multiprocessor support.
- Processes can map files anywhere in their address space.
- They can share parts of their address space by
- doing a shared mapping of the same file.
- Changes made by one process are visible in the address space of
- the other process, and also are written back to the file itself.
- Processes can also request private mappings of a file, which prevents
- any changes that they make from being visible to other processes
- mapping the file or being written back to the file itself.</para>
-
- <para>Another issue with the virtual-memory system is the way that
- information is passed into the kernel when a system call is made.
- 4.4BSD always copies data from the process address space
- into a buffer in the kernel.
- For read or write operations
- that are transferring large quantities of data,
- doing the copy can be time consuming.
- An alternative to doing the copying is to remap the
- process memory into the kernel.
- The 4.4BSD kernel always copies the data for several reasons:</para>
-
- <itemizedlist>
- <listitem>
- <para>Often, the user data are not page aligned and are not a multiple of
- the hardware page length.</para>
- </listitem>
-
- <listitem>
- <para>If the page is taken away from the process,
- it will no longer be able to reference that page.
- Some programs depend on the data remaining in the
- buffer even after those data have been written.</para>
- </listitem>
-
- <listitem>
- <para>If the process is allowed to keep a copy of the page
- (as it is in current 4.4BSD semantics),
- the page must be made
- <emphasis>copy-on-write</emphasis>.
- A copy-on-write page is one that is protected against being written
- by being made read-only.
- If the process attempts to modify the page,
- the kernel gets a write fault.
- The kernel then makes a copy of the page that the process can modify.
- Unfortunately, the typical process will immediately
- try to write new data to its output buffer,
- forcing the data to be copied anyway.</para>
- </listitem>
-
- <listitem>
- <para>When pages are remapped to new virtual-memory addresses,
- most memory-management hardware requires that the hardware
- address-translation cache be purged selectively.
- The cache purges are often slow.
- The net effect is that remapping is slower than
- copying for blocks of data less than 4 to 8 Kbyte.</para>
- </listitem>
- </itemizedlist>
-
- <para>The biggest incentives for memory mapping are the needs for
- accessing big files and for passing large quantities of data
- between processes.
- The
- <emphasis>mmap</emphasis>
- interface provides a way for both of these tasks
- to be done without copying.</para>
- </sect2>
-
- <sect2>
- <title>Memory Management Inside the Kernel</title>
-
- <para>The kernel often does allocations of memory that are
- needed for only the duration of a single system call.
- In a user process, such short-term
- memory would be allocated on the run-time stack.
- Because the kernel has a limited run-time stack,
- it is not feasible to allocate even moderate-sized blocks of memory on it.
- Consequently, such memory must be allocated
- through a more dynamic mechanism.
- For example,
- when the system must translate a pathname,
- it must allocate a 1-Kbyte buffer to hold the name.
- Other blocks of memory must be more persistent than a single system call,
- and thus could not be allocated on the stack even if there was space.
- An example is protocol-control blocks that remain throughout
- the duration of a network connection.</para>
-
- <para>Demands for dynamic memory allocation in the kernel have increased
- as more services have been added.
- A generalized memory allocator reduces the complexity
- of writing code inside the kernel.
- Thus, the 4.4BSD kernel has a single memory allocator that can be
- used by any part of the system.
- It has an interface similar to the C library routines
- <emphasis>malloc</emphasis>
- and
- <emphasis>free</emphasis>
- that provide memory allocation to application programs
- <xref linkend="biblio-mckusick-2">.
- Like the C library interface,
- the allocation routine takes a parameter specifying the
- size of memory that is needed.
- The range of sizes for memory requests is not constrained;
- however, physical memory is allocated and is not paged.
- The free routine takes a pointer to the storage being freed,
- but does not require the size
- of the piece of memory being freed.</para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>I/O System</title>
-
- <para>The basic model of the UNIX
- I/O system is a sequence of bytes
- that can be accessed either randomly or sequentially.
- There are no
- <emphasis>access methods</emphasis>
- and no
- <emphasis>control blocks</emphasis>
- in a typical UNIX user process.</para>
-
- <para>Different programs expect various levels of structure,
- but the kernel does not impose structure on I/O.
- For instance, the convention for text files is lines of
- ASCII
- characters separated by a single newline character
- (the
- ASCII
- line-feed character),
- but the kernel knows nothing about this convention.
- For the purposes of most programs,
- the model is further simplified to being a stream of data bytes,
- or an
- <emphasis>I/O stream</emphasis>.
- It is this single common data form that makes the
- characteristic UNIX tool-based approach work
- <xref linkend="biblio-kernighan">.
- An I/O stream from one program can be fed as input
- to almost any other program.
- (This kind of traditional UNIX
- I/O stream should not be confused with the
- Eighth Edition stream I/O system or with the
- System V, Release 3
- STREAMS,
- both of which can be accessed as traditional I/O streams.)</para>
-
- <sect2>
- <title>Descriptors and I/O</title>
-
- <para>UNIX processes use
- <emphasis>descriptors</emphasis>
- to reference I/O streams.
- Descriptors are small unsigned integers obtained from the
- <emphasis>open</emphasis>
- and
- <emphasis>socket</emphasis>
- system calls.
- The
- <emphasis>open</emphasis>
- system call takes as arguments the name of a file and
- a permission mode to
- specify whether the file should be open for reading or for writing,
- or for both.
- This system call also can be used to create a new, empty file.
- A
- <emphasis>read</emphasis>
- or
- <emphasis>write</emphasis>
- system call can be applied to a descriptor to transfer data.
- The
- <emphasis>close</emphasis>
- system call can be used to deallocate any descriptor.</para>
-
- <para>Descriptors represent underlying objects supported by the kernel,
- and are created by system calls specific to the type of object.
- In 4.4BSD, three kinds of objects can be represented by descriptors:
- files, pipes, and sockets.</para>
-
- <itemizedlist>
- <listitem>
- <para>A
- <emphasis>file</emphasis>
- is a linear array of bytes with at least one name.
- A file exists until all its names are deleted explicitly
- and no process holds a descriptor for it.
- A process acquires a descriptor for a file
- by opening that file's name with the
- <emphasis>open</emphasis>
- system call.
- I/O devices are accessed as files.</para>
- </listitem>
-
- <listitem>
- <para>A
- <emphasis>pipe</emphasis>
- is a linear array of bytes, as is a file, but it is used solely
- as an I/O stream, and it is unidirectional.
- It also has no name,
- and thus cannot be opened with
- <emphasis>open</emphasis>.
- Instead, it is created by the
- <emphasis>pipe</emphasis>
- system call, which returns two descriptors,
- one of which accepts input that is sent to the other descriptor reliably,
- without duplication, and in order.
- The system also supports a named pipe or
- FIFO.
- A
- FIFO
- has properties identical to a pipe, except that it appears
- in the filesystem;
- thus, it can be opened using the
- <emphasis>open</emphasis>
- system call.
- Two processes that wish to communicate each open the
- FIFO:
- One opens it for reading, the other for writing.</para>
- </listitem>
-
- <listitem>
- <para>A
- <emphasis>socket</emphasis>
- is a transient object that is used for
- interprocess communication;
- it exists only as long as some process holds a descriptor
- referring to it.
- A socket is created by the
- <emphasis>socket</emphasis>
- system call, which returns a descriptor for it.
- There are different kinds of sockets that support various communication
- semantics, such as reliable delivery of data, preservation of
- message ordering, and preservation of message boundaries.</para>
- </listitem>
- </itemizedlist>
-
- <para>In systems before 4.2BSD, pipes were implemented using the filesystem;
- when sockets were introduced in 4.2BSD,
- pipes were reimplemented as sockets.</para>
-
- <para>The kernel keeps for each process a
- <emphasis>descriptor table</emphasis>,
- which is a table that the kernel uses
- to translate the external representation
- of a descriptor into an internal representation.
- (The descriptor is merely an index into this table.)
- The descriptor table of a process is inherited from that process's parent,
- and thus access to the objects
- to which the descriptors refer also is inherited.
- The main ways that a process can obtain a descriptor are by
- opening or creation of an object,
- and by inheritance from the parent process.
- In addition, socket
- IPC
- allows passing of descriptors in messages between unrelated processes
- on the same machine.</para>
-
- <para>Every valid descriptor has an associated
- <emphasis>file offset</emphasis>
- in bytes from the beginning of the object.
- Read and write operations start at this offset, which is
- updated after each data transfer.
- For objects that permit random access,
- the file offset also may be set with the
- <emphasis>lseek</emphasis>
- system call.
- Ordinary files permit random access, and some devices do, as well.
- Pipes and sockets do not.</para>
-
- <para>When a process terminates, the kernel
- reclaims all the descriptors that were in use by that process.
- If the process was holding the final reference to an object,
- the object's manager is notified so that it can do any
- necessary cleanup actions, such as final deletion of a file
- or deallocation of a socket.</para>
- </sect2>
-
- <sect2>
- <title>Descriptor Management</title>
-
- <para>Most processes expect three descriptors to be open already
- when they start running.
- These descriptors are 0, 1, 2, more commonly known as
- <emphasis>standard input</emphasis>,
- <emphasis>standard output</emphasis>,
- and
- <emphasis>standard error</emphasis>,
- respectively.
- Usually, all three are associated with the user's terminal
- by the login process
- (see
- Section 14.6)
- and are inherited through
- <emphasis>fork</emphasis>
- and
- <emphasis>exec</emphasis>
- by processes run by the user.
- Thus, a program can read what the user types by reading standard
- input, and the program can send output to the user's screen by
- writing to standard output.
- The standard error descriptor also is open for writing and is
- used for error output, whereas standard output is used for ordinary output.</para>
-
- <para>These (and other) descriptors can be mapped to objects other than
- the terminal;
- such mapping is called
- <emphasis>I/O redirection</emphasis>,
- and all the standard shells permit users to do it.
- The shell can direct the output of a program to a file
- by closing descriptor 1 (standard output) and opening
- the desired output file to produce a new descriptor 1.
- It can similarly redirect standard input to come from a file
- by closing descriptor 0 and opening the file.</para>
-
- <para>Pipes allow the output of one program to be input to another program
- without rewriting or even relinking of either program.
- Instead of descriptor 1 (standard output)
- of the source program being set up to write to the terminal,
- it is set up to be the input descriptor of a pipe.
- Similarly, descriptor 0 (standard input)
- of the sink program is set up to reference the output of the pipe,
- instead of the terminal keyboard.
- The resulting set of two processes and the connecting pipe is known as a
- <emphasis>pipeline</emphasis>.
- Pipelines can be arbitrarily long series of processes connected by pipes.</para>
-
- <para>The
- <emphasis>open</emphasis>,
- <emphasis>pipe</emphasis>,
- and
- <emphasis>socket</emphasis>
- system calls produce new descriptors with the lowest unused number
- usable for a descriptor.
- For pipelines to work,
- some mechanism must be provided to map such descriptors into 0 and 1.
- The
- <emphasis>dup</emphasis>
- system call creates a copy of a descriptor that
- points to the same file-table entry.
- The new descriptor is also the lowest unused one,
- but if the desired descriptor is closed first,
- <emphasis>dup</emphasis>
- can be used to do the desired mapping.
- Care is required, however: If descriptor 1 is desired,
- and descriptor 0 happens also to have been closed, descriptor 0
- will be the result.
- To avoid this problem, the system provides the
- <emphasis>dup2</emphasis>
- system call;
- it is like
- <emphasis>dup</emphasis>,
- but it takes an additional argument specifying
- the number of the desired descriptor
- (if the desired descriptor was already open,
- <emphasis>dup2</emphasis>
- closes it before reusing it).</para>
- </sect2>
-
- <sect2>
- <title>Devices</title>
-
- <para>Hardware devices have filenames, and may be
- accessed by the user via the same system calls used for regular files.
- The kernel can distinguish a
- <emphasis>device special file</emphasis>
- or
- <emphasis>special file</emphasis>,
- and can determine to what device it refers,
- but most processes do not need to make this determination.
- Terminals, printers, and tape drives are all accessed as though they
- were streams of bytes, like 4.4BSD disk files.
- Thus, device dependencies and peculiarities are kept in the kernel
- as much as possible, and even in the kernel most of them are segregated
- in the device drivers.</para>
-
- <para>Hardware devices can be categorized as either
- <emphasis>structured</emphasis>
- or
- <emphasis>unstructured</emphasis>;
- they are known as
- <emphasis>block</emphasis>
- or
- <emphasis>character</emphasis>
- devices, respectively.
- Processes typically access devices through
- <emphasis>special files</emphasis>
- in the filesystem.
- I/O operations to these files are handled by
- kernel-resident software modules termed
- <emphasis>device drivers</emphasis>.
- Most network-communication hardware devices are accessible through only
- the interprocess-communication facilities,
- and do not have special files in the filesystem name space,
- because the
- <emphasis>raw-socket</emphasis>
- interface provides a more natural interface than does a special file.</para>
-
- <para>Structured or block devices are typified by disks and magnetic tapes,
- and include most random-access devices.
- The kernel supports read-modify-write-type buffering actions
- on block-oriented structured devices to allow the latter
- to be read and written in a
- totally random byte-addressed fashion, like regular files.
- Filesystems are created on block devices.</para>
-
- <para>Unstructured devices are those devices that do not support a block
- structure.
- Familiar unstructured devices are communication lines, raster
- plotters, and unbuffered magnetic tapes and disks.
- Unstructured devices typically support large block I/O transfers.</para>
-
- <para>Unstructured files are called
- <emphasis>character devices</emphasis>
- because the first of these to be implemented were terminal device drivers.
- The kernel interface to the driver for these devices proved convenient
- for other devices that were not block structured.</para>
-
- <para>Device special files are created by the
- <emphasis>mknod</emphasis>
- system call.
- There is an additional system call,
- <emphasis>ioctl</emphasis>,
- for manipulating the underlying device parameters of special files.
- The operations that can be done differ for each device.
- This system call allows the special characteristics of devices to
- be accessed, rather than overloading the semantics of other system calls.
- For example, there is an
- <emphasis>ioctl</emphasis>
- on a tape drive to write an end-of-tape mark,
- instead of there being a special or modified version of
- <emphasis>write</emphasis>.</para>
- </sect2>
-
- <sect2>
- <title>Socket IPC</title>
-
- <para>The 4.2BSD kernel introduced an
- IPC
- mechanism more flexible than pipes, based on
- <emphasis>sockets</emphasis>.
- A socket is an endpoint of communication referred to by
- a descriptor, just like a file or a pipe.
- Two processes can each create a socket, and then connect those
- two endpoints to produce a reliable byte stream.
- Once connected, the descriptors for the sockets can be read or written
- by processes, just as the latter would do with a pipe.
- The transparency of sockets allows the kernel to redirect the output
- of one process to the input of another process residing on another machine.
- A major difference between pipes and sockets is that
- pipes require a common parent process to set up the
- communications channel.
- A connection between sockets can be set up by two unrelated processes,
- possibly residing on different machines.</para>
-
- <para>System V provides local interprocess communication through
- FIFOs
- (also known as
- <emphasis>named pipes</emphasis>).
- FIFOs
- appear as an object in the filesystem that unrelated
- processes can open and send data through in the same
- way as they would communicate through a pipe.
- Thus,
- FIFOs
- do not require a common parent to set them up;
- they can be connected after a pair of processes are up and running.
- Unlike sockets,
- FIFOs
- can be used on only a local machine;
- they cannot be used to communicate between processes on different machines.
- FIFOs
- are implemented in 4.4BSD only because they are required by the
- POSIX.1
- standard.
- Their functionality is a subset of the socket interface.</para>
-
- <para>The socket mechanism requires extensions to the traditional UNIX
- I/O system calls to provide the associated naming and connection semantics.
- Rather than overloading the existing interface,
- the developers used the existing interfaces to the extent that
- the latter worked without being changed,
- and designed new interfaces to handle the added semantics.
- The
- <emphasis>read</emphasis>
- and
- <emphasis>write</emphasis>
- system calls were used for byte-stream type connections,
- but six new system calls were added
- to allow sending and receiving addressed messages
- such as network datagrams.
- The system calls for writing messages include
- <emphasis>send</emphasis>,
- <emphasis>sendto</emphasis>,
- and
- <emphasis>sendmsg</emphasis>.
- The system calls for reading messages include
- <emphasis>recv</emphasis>,
- <emphasis>recvfrom</emphasis>,
- and
- <emphasis>recvmsg</emphasis>.
- In retrospect, the first two in each class are special cases of the others;
- <emphasis>recvfrom</emphasis>
- and
- <emphasis>sendto</emphasis>
- probably should have been added as library interfaces to
- <emphasis>recvmsg</emphasis>
- and
- <emphasis>sendmsg</emphasis>,
- respectively.</para>
- </sect2>
-
- <sect2>
- <title>Scatter/Gather I/O</title>
-
- <para>In addition to the traditional
- <emphasis>read</emphasis>
- and
- <emphasis>write</emphasis>
- system calls, 4.2BSD introduced the ability to do scatter/gather I/O.
- Scatter input uses the
- <emphasis>readv</emphasis>
- system call to allow a single read
- to be placed in several different buffers.
- Conversely, the
- <emphasis>writev</emphasis>
- system call allows several different buffers
- to be written in a single atomic write.
- Instead of passing a single buffer and length parameter, as is done with
- <emphasis>read</emphasis>
- and
- <emphasis>write</emphasis>,
- the process passes in a pointer to an array of buffers and lengths,
- along with a count describing the size of the array.</para>
-
- <para>This facility allows buffers in different parts of a process
- address space to be written atomically, without the
- need to copy them to a single contiguous buffer.
- Atomic writes are necessary in the case where the underlying
- abstraction is record based, such as tape drives that output a
- tape block on each write request.
- It is also convenient to be able to read a single request into
- several different buffers (such as a record header into one place
- and the data into another).
- Although an application can simulate the ability to scatter data
- by reading the data into a large buffer and then copying the pieces
- to their intended destinations,
- the cost of memory-to-memory copying in such cases often
- would more than double the running time of the affected application.</para>
-
- <para>Just as
- <emphasis>send</emphasis>
- and
- <emphasis>recv</emphasis>
- could have been implemented as library interfaces to
- <emphasis>sendto</emphasis>
- and
- <emphasis>recvfrom</emphasis>,
- it also would have been possible to simulate
- <emphasis>read</emphasis>
- with
- <emphasis>readv</emphasis>
- and
- <emphasis>write</emphasis>
- with
- <emphasis>writev</emphasis>.
- However,
- <emphasis>read</emphasis>
- and
- <emphasis>write</emphasis>
- are used so much more frequently that the added cost
- of simulating them would not have been worthwhile.</para>
- </sect2>
-
- <sect2>
- <title>Multiple Filesystem Support</title>
-
- <para>With the expansion of network computing,
- it became desirable to support both local and remote filesystems.
- To simplify the support of multiple filesystems,
- the developers added a new virtual node or
- <emphasis>vnode</emphasis>
- interface to the kernel.
- The set of operations exported from the vnode interface
- appear much like the filesystem operations previously supported
- by the local filesystem.
- However, they may be supported by a wide range of filesystem types:</para>
-
- <itemizedlist>
- <listitem>
- <para>Local disk-based filesystems</para>
- </listitem>
-
- <listitem>
- <para>Files imported using a variety of remote filesystem protocols</para>
- </listitem>
-
- <listitem>
- <para>Read-only
- CD-ROM
- filesystems</para>
- </listitem>
-
- <listitem>
- <para>Filesystems providing special-purpose interfaces -- for example, the
- <filename>/proc</filename>
- filesystem</para>
- </listitem>
- </itemizedlist>
-
- <para>A few variants of 4.4BSD, such as FreeBSD,
- allow filesystems to be loaded dynamically
- when the filesystems are first referenced by the
- <emphasis>mount</emphasis>
- system call.
- The vnode interface is described in
- Section 6.5;
- its ancillary support routines are described in
- Section 6.6;
- several of the special-purpose filesystems are described in
- Section 6.7.</para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Filesystems</title>
-
- <para>A regular file is a linear array of bytes,
- and can be read and written starting at any byte in the file.
- The kernel distinguishes no record boundaries in regular files, although
- many programs recognize line-feed characters as distinguishing
- the ends of lines, and other programs may impose other structure.
- No system-related information about a file is kept in the file itself,
- but the filesystem stores a small amount of ownership, protection,
- and usage information with each file.</para>
-
- <para>A
- <emphasis>filename</emphasis>
- component is a string of up to 255 characters.
- These filenames are stored in a type of file called a
- <emphasis>directory</emphasis>.
- The information in a directory about a file is called a
- <emphasis>directory entry</emphasis>
- and includes, in addition to the filename,
- a pointer to the file itself.
- Directory entries may refer to other directories, as well as to plain files.
- A hierarchy of directories and files is thus formed, and is called a
- <emphasis>filesystem</emphasis>;</para>
-
- <figure id="fig-small-fs">
- <title>A small filesystem</title>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="fig2" format="EPS">
- </imageobject>
-
- <textobject>
- <literallayout class="monospaced"> +-------+
- | |
- +-------+
- / \
- usr / \ vmunix
- |/ \|
- +-------+ +-------+
- | | | |
- +-------+ +-------+
- / | \
- staff / | \ bin
- |/ | tmp \|
- +-------+ V +-------+
- | | +-------+ | |
- +-------+ | | +-------+
- / | \ +-------+ / | \
- mckusick / | \| |/ | \ ls
- |/ | karels | vi \|
-+-------+ V V +-------+
-| | +-------+ +-------+ | |
-+-------+ | | | | +-------+
- +-------+ +-------+</literallayout>
- </textobject>
-
- <textobject>
- <phrase>A small filesystem tree</phrase>
- </textobject>
- </mediaobject>
- </figure>
-
- <para>a small one is shown in <xref linkend="fig-small-fs">.
- Directories may contain subdirectories, and there is no inherent
- limitation to the depth with which directory nesting may occur.
- To protect the consistency of the filesystem, the kernel
- does not permit processes to write directly into directories.
- A filesystem may include not only plain files and directories,
- but also references to other objects, such as devices and sockets.</para>
-
- <para>The filesystem forms a tree, the beginning of which is the
- <emphasis>root directory</emphasis>,
- sometimes referred to by the name
- <emphasis>slash</emphasis>,
- spelled with a single solidus character (/).
- The root directory contains files; in our example in Fig 2.2, it contains
- <filename>vmunix</filename>,
- a copy of the kernel-executable object file.
- It also contains directories; in this example, it contains the
- <filename>usr</filename>
- directory.
- Within the
- <filename>usr</filename>
- directory is the
- <filename>bin</filename>
- directory, which mostly contains executable object code of programs,
- such as the files
- <!-- FIXME -->
- <filename>ls</filename>
- and
- <filename>vi</filename>.</para>
-
- <para>A process identifies a file by specifying that file's
- <emphasis>pathname</emphasis>,
- which is a string composed of zero or more
- filenames separated by slash (/) characters.
- The kernel associates two directories with each process for use
- in interpreting pathnames.
- A process's
- <emphasis>root directory</emphasis>
- is the topmost point in the filesystem that the process can access;
- it is ordinarily set to the root directory of the entire filesystem.
- A pathname beginning with a slash is called an
- <emphasis>absolute pathname</emphasis>,
- and is interpreted by the kernel starting with the process's root directory.</para>
-
- <para>A pathname that does not begin with a slash is called a
- <emphasis>relative pathname</emphasis>,
- and is interpreted relative to the
- <emphasis>current working directory</emphasis>
- of the process.
- (This directory also is known by the shorter names
- <emphasis>current directory</emphasis>
- or
- <emphasis>working directory</emphasis>.)
- The current directory itself may be referred to directly by the name
- <emphasis>dot</emphasis>,
- spelled with a single period
- (<filename>.</filename>).
- The filename
- <emphasis>dot-dot</emphasis>
- (<filename>..</filename>)
- refers to a directory's parent directory.
- The root directory is its own parent.</para>
-
- <para>A process may set its root directory with the
- <emphasis>chroot</emphasis>
- system call,
- and its current directory with the
- <emphasis>chdir</emphasis>
- system call.
- Any process may do
- <emphasis>chdir</emphasis>
- at any time, but
- <emphasis>chroot</emphasis>
- is permitted only a process with superuser privileges.
- <emphasis>Chroot</emphasis>
- is normally used to set up restricted access to the system.</para>
-
- <para>Using the filesystem shown in Fig. 2.2,
- if a process has the root of the filesystem as its root directory, and has
- <filename>/usr</filename>
- as its current directory, it can refer to the file
- <filename>vi</filename>
- either from the root with the absolute pathname
- <filename>/usr/bin/vi</filename>,
- or from its current directory with the relative pathname
- <filename>bin/vi</filename>.</para>
-
- <para>System utilities and databases are kept in certain well-known directories.
- Part of the well-defined hierarchy includes a directory that contains the
- <emphasis>home directory</emphasis>
- for each user -- for example,
- <filename>/usr/staff/mckusick</filename>
- and
- <filename>/usr/staff/karels</filename>
- in Fig. 2.2.
- When users log in,
- the current working directory of their shell is set to the
- home directory.
- Within their home directories,
- users can create directories as easily as they can regular files.
- Thus, a user can build arbitrarily complex subhierarchies.</para>
-
- <para>The user usually knows of only one filesystem, but the system may
- know that this one virtual filesystem
- is really composed of several physical
- filesystems, each on a different device.
- A physical filesystem may not span multiple hardware devices.
- Since most physical disk devices are divided into several logical devices,
- there may be more than one filesystem per physical device,
- but there will be no more than one per logical device.
- One filesystem -- the filesystem that
- anchors all absolute pathnames -- is called the
- <emphasis>root filesystem</emphasis>,
- and is always available.
- Others may be mounted;
- that is, they may be integrated into the
- directory hierarchy of the root filesystem.
- References to a directory that has a filesystem mounted on it
- are converted transparently by the kernel
- into references to the root directory of the mounted filesystem.</para>
-
- <para>The
- <emphasis>link</emphasis>
- system call takes the name of an existing file and another name
- to create for that file.
- After a successful
- <emphasis>link</emphasis>,
- the file can be accessed by either filename.
- A filename can be removed with the
- <emphasis>unlink</emphasis>
- system call.
- When the final name for a file is removed (and the final process that
- has the file open closes it), the file is deleted.</para>
-
- <para>Files are organized hierarchically in
- <emphasis>directories</emphasis>.
- A directory is a type of file,
- but, in contrast to regular files,
- a directory has a structure imposed on it by the system.
- A process can read a directory as it would an ordinary file,
- but only the kernel is permitted to modify a directory.
- Directories are created by the
- <emphasis>mkdir</emphasis>
- system call and are removed by the
- <emphasis>rmdir</emphasis>
- system call.
- Before 4.2BSD, the
- <emphasis>mkdir</emphasis>
- and
- <emphasis>rmdir</emphasis>
- system calls were implemented by a series of
- <emphasis>link</emphasis>
- and
- <emphasis>unlink</emphasis>
- system calls being done.
- There were three reasons for adding systems calls
- explicitly to create and delete directories:</para>
-
- <orderedlist>
- <listitem>
- <para>The operation could be made atomic.
- If the system crashed,
- the directory would not be left half-constructed,
- as could happen when a series of link operations were used.</para>
- </listitem>
- <listitem>
- <para>When a
- networked filesystem is being run,
- the creation and deletion of files and directories need to be
- specified atomically so that they can be serialized.</para>
- </listitem>
- <listitem>
- <para>When supporting non-UNIX filesystems, such as an
- MS-DOS
- filesystem, on another partition of the disk,
- the other filesystem may not support link operations.
- Although other filesystems might support the concept of directories,
- they probably would not create and delete the directories with links,
- as the UNIX filesystem does.
- Consequently, they could create and delete directories only
- if explicit directory create and delete requests were presented.</para>
- </listitem>
- </orderedlist>
-
- <para>The
- <emphasis>chown</emphasis>
- system call sets the owner and group of a file, and
- <emphasis>chmod</emphasis>
- changes protection attributes.
- <emphasis>Stat</emphasis>
- applied to a filename can be used to read back such properties of a file.
- The
- <emphasis>fchown</emphasis>,
- <emphasis>fchmod</emphasis>,
- and
- <emphasis>fstat</emphasis>
- system calls are applied to a descriptor, instead of
- to a filename, to do the same set of operations.
- The
- <emphasis>rename</emphasis>
- system call can be used to give a file a new name in the filesystem,
- replacing one of the file's old names.
- Like the directory-creation and directory-deletion operations, the
- <emphasis>rename</emphasis>
- system call was added to 4.2BSD
- to provide atomicity to name changes in the local filesystem.
- Later, it proved useful explicitly to
- export renaming operations to foreign filesystems and over the network.</para>
-
- <para>The
- <emphasis>truncate</emphasis>
- system call was added to 4.2BSD to allow files to be shortened
- to an arbitrary offset.
- The call was added primarily in support of the Fortran
- run-time library,
- which has the semantics such that the end of a random-access
- file is set to be wherever the program most recently accessed that file.
- Without the
- <emphasis>truncate</emphasis>
- system call, the only way to shorten a file was to
- copy the part that was desired to a new file, to delete the old file,
- then to rename the copy to the original name.
- As well as this algorithm being slow,
- the library could potentially fail on a full filesystem.</para>
-
- <para>Once the filesystem had the ability to shorten files,
- the kernel took advantage of that ability
- to shorten large empty directories.
- The advantage of shortening empty directories is that it reduces the
- time spent in the kernel searching them
- when names are being created or deleted.</para>
-
- <para>Newly created files are assigned the user identifier of the process
- that created them and the group identifier of the directory
- in which they were created.
- A three-level access-control mechanism is provided for
- the protection of files.
- These three levels specify the accessibility of a file to</para>
-
- <orderedlist>
- <listitem>
- <para>The user who owns the file</para>
- </listitem>
- <listitem>
- <para>The group that owns the file</para>
- </listitem>
- <listitem>
- <para>Everyone else</para>
- </listitem>
- </orderedlist>
-
- <para>Each level of access has separate indicators for read permission,
- write permission, and execute permission.</para>
-
- <para>Files are created with zero length, and may grow when they are written.
- While a file is open, the system maintains a pointer into
- the file indicating the current location in
- the file associated with the descriptor.
- This pointer can be moved about in the file in a random-access fashion.
- Processes sharing a file descriptor through a
- <emphasis>fork</emphasis>
- or
- <emphasis>dup</emphasis>
- system call share the current location pointer.
- Descriptors created by separate
- <emphasis>open</emphasis>
- system calls have separate current location pointers.
- Files may have
- <emphasis>holes</emphasis>
- in them.
- Holes are void areas in the linear extent of the file where data have
- never been written.
- A process can create these holes by positioning
- the pointer past the current end-of-file and writing.
- When read, holes are treated by the system as zero-valued bytes.</para>
-
- <para>Earlier UNIX systems had a limit of 14 characters per filename component.
- This limitation was often a problem.
- For example,
- in addition to the natural desire of users
- to give files long descriptive names,
- a common way of forming filenames is as
- <filename><replaceable>basename</replaceable>.<replaceable>extension</replaceable></filename>,
- where the extension (indicating the kind of file, such as
- <literal>.c</literal>
- for C source or
- <literal>.o</literal>
- for intermediate binary object)
- is one to three characters,
- leaving 10 to 12 characters for the basename.
- Source-code\-control systems and editors usually take up another
- two characters, either as a prefix or a suffix, for their purposes,
- leaving eight to 10 characters.
- It is easy to use 10 or 12 characters in a single
- English word as a basename (e.g., ``multiplexer'').</para>
-
- <para>It is possible to keep within these limits,
- but it is inconvenient or even dangerous, because other UNIX
- systems accept strings longer than the limit when creating files,
- but then
- <emphasis>truncate</emphasis>
- to the limit.
- A C language source file named
- <filename>multiplexer.c</filename>
- (already 13 characters) might have a source-code-control file
- with
- <literal>s.</literal>
- prepended, producing a filename
- <filename>s.multiplexer</filename>
- that is indistinguishable from the source-code-control file for
- <filename>multiplexer.ms</filename>,
- a file containing
- <!-- FIXME -->
- <literal>troff</literal>
- source for documentation for the C program.
- The contents of the two original files could easily get confused
- with no warning from the source-code-control system.
- Careful coding can detect this problem, but the
- long filenames
- first introduced in 4.2BSD practically eliminate it.</para>
- </sect1>
-
- <sect1>
- <title>Filestores</title>
-
- <para>The operations defined for local filesystems are divided into two parts.
- Common to all local filesystems are hierarchical naming,
- locking, quotas, attribute management, and protection.
- These features are independent of how the data will be stored.
- 4.4BSD has a single implementation to provide these semantics.</para>
-
- <para>The other part of the local filesystem is the organization
- and management of the data on the storage media.
- Laying out the contents of files on the storage media is
- the responsibility of the filestore.
- 4.4BSD supports three different filestore layouts:</para>
-
- <itemizedlist>
- <listitem>
- <para>The traditional Berkeley Fast Filesystem</para>
- </listitem>
- <listitem>
- <para>The log-structured filesystem,
- based on the Sprite operating-system design
- <xref linkend="biblio-rosenblum"></para>
- </listitem>
- <listitem>
- <para>A memory-based filesystem</para>
- </listitem>
- </itemizedlist>
-
- <para>Although the organizations of these filestores are completely different,
- these differences are indistinguishable
- to the processes using the filestores.</para>
-
- <para>The Fast Filesystem organizes data into cylinder groups.
- Files that are likely to be accessed together,
- based on their locations in the filesystem hierarchy,
- are stored in the same cylinder group.
- Files that are not expected to accessed together are moved into
- different cylinder groups.
- Thus, files written at the same time may be placed far apart on the
- disk.</para>
-
- <para>The log-structured filesystem organizes data as a log.
- All data being written at any point in time are gathered together,
- and are written at the same disk location.
- Data are never overwritten;
- instead, a new copy of the file is written that replaces the old one.
- The old files are reclaimed by a garbage-collection process that runs
- when the filesystem becomes full and additional free space is needed.</para>
-
- <para>The memory-based filesystem is designed to store data in virtual memory.
- It is used for filesystems that need to support
- fast but temporary data, such as
- <filename>/tmp</filename>.
- The goal of the memory-based filesystem is to keep
- the storage packed as compactly as possible to minimize
- the usage of virtual-memory resources.</para>
- </sect1>
-
- <sect1>
- <title>Network Filesystem</title>
-
- <para>Initially, networking was used
- to transfer data from one machine to another.
- Later, it evolved to allowing users to log in remotely to another machine.
- The next logical step was to bring the data to the user,
- instead of having the user go to the data --
- and network filesystems were born.
- Users working locally
- do not experience the network delays on each keystroke,
- so they have a more responsive environment.</para>
-
- <para>Bringing the filesystem to a local machine was among the first
- of the major client-server applications.
- The
- <emphasis>server</emphasis>
- is the remote machine that exports one or more of its filesystems.
- The
- <emphasis>client</emphasis>
- is the local machine that imports those filesystems.
- From the local client's point of view,
- a remotely mounted filesystem appears in the file-tree name space
- just like any other locally mounted filesystem.
- Local clients can change into directories on the remote filesystem,
- and can read, write, and execute binaries within that remote filesystem
- identically to the way that they can do these operations
- on a local filesystem.</para>
-
- <para>When the local client does an operation on a remote filesystem,
- the request is packaged and is sent to the server.
- The server does the requested operation and
- returns either the requested information or an error
- indicating why the request was denied.
- To get reasonable performance,
- the client must cache frequently accessed data.
- The complexity of remote filesystems lies in maintaining cache
- consistency between the server and its many clients.</para>
-
- <para>Although many remote-filesystem protocols
- have been developed over the years,
- the most pervasive one in use among UNIX
- systems is the Network Filesystem
- (NFS),
- whose protocol and most widely used implementation were
- done by Sun Microsystems.
- The 4.4BSD kernel supports the
- NFS
- protocol, although the implementation was done independently
- from the protocol specification
- <xref linkend="biblio-macklem">.
- The
- NFS
- protocol is described in
- Chapter 9.
- </para>
- </sect1>
-
- <sect1>
- <title>Terminals</title>
-
- <para>Terminals support the standard system I/O operations, as well
- as a collection of terminal-specific operations to control input-character
- editing and output delays.
- At the lowest level are the terminal device drivers that control
- the hardware terminal ports.
- Terminal input is handled according to the underlying communication
- characteristics, such as baud rate,
- and according to a set of software-controllable
- parameters, such as parity checking.</para>
-
- <para>Layered above the terminal device drivers are line disciplines
- that provide various degrees of character processing.
- The default line discipline is selected when a port is being
- used for an interactive login.
- The line discipline is run in
- <emphasis>canonical mode</emphasis>;
- input is processed to provide standard line-oriented editing functions,
- and input is presented to a process on a line-by-line basis.</para>
-
-
- <para>Screen editors and programs that communicate with other computers
- generally run in
- <emphasis>noncanonical mode</emphasis>
- (also commonly referred to as
- <emphasis>raw mode</emphasis>
- or
- <emphasis>character-at-a-time mode</emphasis>).
- In this mode, input is passed through to the reading process immediately
- and without interpretation.
- All special-character input processing is disabled,
- no erase or other line editing processing is done,
- and all characters are passed to the program
- that is reading from the terminal.</para>
-
-
- <para>It is possible to configure the terminal in thousands
- of combinations between these two extremes.
- For example,
- a screen editor that wanted to receive user interrupts asynchronously
- might enable the special characters that
- generate signals and enable output flow control,
- but otherwise run in noncanonical mode;
- all other characters would be passed through to the process uninterpreted.</para>
-
- <para>On output, the terminal handler provides simple formatting services,
- including</para>
-
-
- <itemizedlist>
- <listitem>
- <para>Converting the line-feed character
- to the two-character carriage-return-line-feed sequence</para>
- </listitem>
-
- <listitem>
- <para>Inserting delays after certain standard control characters</para>
- </listitem>
-
- <listitem>
- <para>Expanding tabs</para>
- </listitem>
-
- <listitem>
- <para>Displaying echoed nongraphic
- ASCII
- characters as a two-character sequence of the
- form ``^C''
- (i.e., the
- ASCII
- caret character followed by the
- ASCII
- character that is the character's value offset from the
- ASCII
- ``@'' character).</para>
- </listitem>
- </itemizedlist>
-
- <para>Each of these formatting services can be disabled individually by
- a process through control requests.</para>
-
- </sect1>
-
- <sect1>
- <title>Interprocess Communication</title>
-
- <para>Interprocess communication in 4.4BSD is organized in
- <emphasis>communication domains</emphasis>.
- Domains currently supported include the
- <emphasis>local domain</emphasis>,
- for communication between processes executing on the same machine; the
- <emphasis>internet domain</emphasis>,
- for communication between processes using the
- TCP/IP
- protocol suite (perhaps within the Internet); the
- ISO/OSI
- protocol family for communication between sites required to run them;
- and the
- <emphasis>XNS domain</emphasis>,
- for communication between processes using the
- XEROX
- Network Systems
- (XNS)
- protocols.</para>
-
- <para>Within a domain, communication takes place between communication
- endpoints known as
- <emphasis>sockets</emphasis>.
- As mentioned in
- Section 2.6,
- the
- <emphasis>socket</emphasis>
- system call creates a socket and returns a descriptor;
- other
- IPC
- system calls are described in
- Chapter 11.
- Each socket has a type that defines its communications semantics;
- these semantics include properties such as reliability, ordering,
- and prevention of duplication of messages.</para>
-
- <para>Each socket has associated with it a
- <emphasis>communication protocol</emphasis>.
- This protocol provides the semantics required
- by the socket according to the latter's type.
- Applications may request a specific protocol when creating a socket, or
- may allow the system to select a protocol that is appropriate for the type
- of socket being created.</para>
-
- <para>Sockets may have addresses bound to them.
- The form and meaning of socket addresses are dependent on the
- communication domain in which the socket is created.
- Binding a name to a socket in the
- local domain causes a file to be created in the filesystem.</para>
-
- <para>Normal data transmitted and received through sockets are untyped.
- Data-representation issues are the responsibility of libraries built
- on top of the interprocess-communication facilities.
- In addition to transporting normal data, communication domains may
- support the transmission and reception of specially typed data, termed
- <emphasis>access rights</emphasis>.
- The local domain, for example,
- uses this facility to pass descriptors between processes.</para>
-
- <para>Networking implementations on UNIX before 4.2BSD
- usually worked by overloading the character-device interfaces.
- One goal of the socket interface was for naive
- programs to be able to work without change on stream-style connections.
- Such programs can work only if the
- <emphasis>read</emphasis>
- and
- <emphasis>write</emphasis>
- systems calls are unchanged.
- Consequently, the original interfaces were left intact,
- and were made to work on stream-type sockets.
- A new interface was added for more complicated sockets,
- such as those used to send datagrams, with which a destination address
- must be presented with each
- <emphasis>send</emphasis>
- call.</para>
-
- <para>Another benefit is that the new interface is highly portable.
- Shortly after a test release was available from Berkeley,
- the socket interface had been ported to System III
- by a UNIX vendor
- (although AT&amp;T did not support the socket interface
- until the release of System V Release 4,
- deciding instead to use the
- Eighth Edition stream mechanism).
- The socket interface was also ported to run in many
- Ethernet boards by vendors, such as Excelan and Interlan, that were
- selling into the PC market, where the machines were
- too small to run networking in the main processor.
- More recently, the socket interface was used as the basis for
- Microsoft's Winsock networking interface for Windows.</para>
- </sect1>
-
- <sect1>
- <title>Network Communication</title>
-
- <para>Some of the communication domains supported by the
- <emphasis>socket</emphasis>
- IPC
- mechanism provide access to network protocols.
- These protocols are implemented as a separate software
- layer logically below the socket software in the kernel.
- The kernel provides many ancillary services, such as
- buffer management, message routing, standardized interfaces
- to the protocols, and interfaces to the network interface drivers
- for the use of the various network protocols.</para>
-
- <para>At the time that 4.2BSD was being implemented,
- there were many networking protocols in use or under development,
- each with its own strengths and weaknesses.
- There was no clearly superior protocol or protocol suite.
- By supporting multiple protocols, 4.2BSD
- could provide interoperability and resource sharing
- among the diverse set of machines that was available
- in the Berkeley environment.
- Multiple-protocol support also provides for future changes.
- Today's protocols designed for 10- to 100-Mbit-per-second
- Ethernets are likely to be inadequate for
- tomorrow's 1- to 10-Gbit-per-second fiber-optic networks.
- Consequently, the network-communication layer is
- designed to support multiple protocols.
- New protocols are added to the kernel without
- the support for older protocols being affected.
- Older applications can continue to operate using the old protocol
- over the same physical network as is used by newer applications
- running with a newer network protocol.</para>
- </sect1>
-
- <sect1>
- <title>Network Implementation</title>
-
- <para>The first protocol suite implemented in 4.2BSD was
- DARPA's
- Transmission Control Protocol/Internet Protocol
- (TCP/IP).
- The
- CSRG
- chose
- TCP/IP
- as the first network to incorporate into the socket
- IPC
- framework,
- because a 4.1BSD-based implementation was publicly available from a
- DARPA-sponsored
- project at Bolt, Beranek, and Newman
- (BBN).
- That was an influential choice:
- The 4.2BSD implementation
- is the main reason for the extremely widespread use of this protocol suite.
- Later performance and capability improvements to the
- TCP/IP
- implementation have also been widely adopted.
- The
- TCP/IP
- implementation is described in detail in
- Chapter 13.</para>
-
- <para>The release of 4.3BSD added the Xerox Network Systems
- (XNS)
- protocol suite,
- partly building on work done at the
- University of Maryland and at
- Cornell University.
- This suite was needed to connect
- isolated machines that could not communicate using
- TCP/IP.</para>
-
- <para>The release of 4.4BSD added the
- ISO
- protocol suite because of the latter's increasing
- visibility both within and outside the United States.
- Because of the somewhat different semantics defined for the
- ISO
- protocols, some minor changes were required in the socket interface
- to accommodate these semantics.
- The changes were made such that they were invisible to clients
- of other existing protocols.
- The
- ISO
- protocols also required extensive addition to the two-level routing
- tables provided by the kernel in 4.3BSD.
- The greatly expanded routing capabilities of 4.4BSD include
- arbitrary levels of routing with variable-length addresses and
- network masks.</para>
- </sect1>
-
- <sect1>
- <title>System Operation</title>
-
- <para>Bootstrapping mechanisms are used to start the system running.
- First, the 4.4BSD
- kernel must be loaded into the main memory of the processor.
- Once loaded, it must go through an initialization phase to
- set the hardware into a known state.
- Next, the kernel must do
- autoconfiguration, a process that finds
- and configures the peripherals that are attached to the processor.
- The system begins running in single-user mode while a start-up script does
- disk checks and starts the accounting and quota checking.
- Finally, the start-up script starts the general system services
- and brings up
- the system to full multiuser operation.</para>
-
- <para>During multiuser operation, processes wait for login requests
- on the terminal lines and network ports that have been configured
- for user access.
- When a login request is detected,
- a login process is spawned and user validation is done.
- When the login validation is successful, a
- login shell is created from which
- the user can run additional processes.</para>
- </sect1>
-
- <bibliography>
- <title>References</title>
-
- <biblioentry id="biblio-accetta">
- <abbrev>Accetta et al, 1986</abbrev>
-
- <biblioset relation="article">
- <title>Mach: A New Kernel Foundation for UNIX Development"</title>
-
- <authorgroup>
- <author>
- <firstname>M. </firstname>
- <surname>Accetta</surname>
- </author>
- <author>
- <firstname>R.</firstname>
- <surname>Baron</surname>
- </author>
- <author>
- <firstname>W.</firstname>
- <surname>Bolosky</surname>
- </author>
- <author>
- <firstname>D.</firstname>
- <surname>Golub</surname>
- </author>
- <author>
- <firstname>R.</firstname>
- <surname>Rashid</surname>
- </author>
- <author>
- <firstname>A.</firstname>
- <surname>Tevanian</surname>
- </author>
- <author>
- <firstname>M.</firstname>
- <surname>Young</surname>
- </author>
- </authorgroup>
-
- <pagenums>93-113</pagenums>
- </biblioset>
-
- <biblioset relation="journal">
- <title>USENIX Association Conference Proceedings</title>
- <publishername>USENIX Association</publishername>
- <pubdate>June 1986</pubdate>
- </biblioset>
- </biblioentry>
-
- <biblioentry id="biblio-cheriton">
- <abbrev>Cheriton, 1988</abbrev>
-
- <biblioset relation="article">
- <title>The V Distributed System</title>
-
- <author>
- <firstname>D. R.</firstname>
- <surname>Cheriton</surname>
- </author>
-
- <pagenums>314-333</pagenums>
- </biblioset>
-
- <biblioset relation="journal">
- <title>Comm ACM, 31, 3</title>
-
- <pubdate>March 1988</pubdate>
- </biblioset>
- </biblioentry>
-
- <biblioentry id="biblio-ewens">
- <abbrev>Ewens et al, 1985</abbrev>
-
- <biblioset relation="article">
- <title>Tunis: A Distributed Multiprocessor Operating System</title>
-
- <authorgroup>
- <author>
- <firstname>P.</firstname>
- <surname>Ewens</surname>
- </author>
-
- <author>
- <firstname>D. R.</firstname>
- <surname>Blythe</surname>
- </author>
-
- <author>
- <firstname>M.</firstname>
- <surname>Funkenhauser</surname>
- </author>
-
- <author>
- <firstname>R. C.</firstname>
- <surname>Holt</surname>
- </author>
- </authorgroup>
-
- <pagenums>247-254</pagenums>
- </biblioset>
-
- <biblioset relation="journal">
- <title>USENIX Assocation Conference Proceedings</title>
- <publishername>USENIX Association</publishername>
- <pubdate>June 1985</pubdate>
- </biblioset>
- </biblioentry>
-
- <biblioentry id="biblio-gingell">
- <abbrev>Gingell et al, 1987</abbrev>
-
- <biblioset relation="article">
- <title>Virtual Memory Architecture in SunOS</title>
-
- <authorgroup>
- <author>
- <firstname>R.</firstname>
- <surname>Gingell</surname>
- </author>
-
- <author>
- <firstname>J.</firstname>
- <surname>Moran</surname>
- </author>
-
- <author>
- <firstname>W.</firstname>
- <surname>Shannon</surname>
- </author>
- </authorgroup>
-
- <pagenums>81-94</pagenums>
- </biblioset>
-
- <biblioset relation="journal">
- <title>USENIX Association Conference Proceedings</title>
- <publishername>USENIX Association</publishername>
- <pubdate>June 1987</pubdate>
- </biblioset>
- </biblioentry>
-
- <biblioentry id="biblio-kernighan">
- <abbrev>Kernighan & Pike, 1984</abbrev>
-
- <title>The UNIX Programming Environment</title>
-
- <authorgroup>
- <author>
- <firstname>B. W.</firstname>
- <surname>Kernighan</surname>
- </author>
-
- <author>
- <firstname>R.</firstname>
- <surname>Pike</surname>
- </author>
- </authorgroup>
-
- <publisher>
- <publishername>Prentice-Hall</publishername>
- <address>
- <city>Englewood Cliffs</city>
- <state>NJ</state>
- </address>
- </publisher>
-
- <pubdate>1984</pubdate>
- </biblioentry>
-
- <biblioentry id="biblio-macklem">
- <abbrev>Macklem, 1994</abbrev>
-
- <biblioset relation="chapter">
- <title>The 4.4BSD NFS Implementation</title>
-
- <author>
- <firstname>R.</firstname>
- <surname>Macklem</surname>
- </author>
-
- <pagenums>6:1-14</pagenums>
- </biblioset>
-
- <biblioset relation="book">
- <title>4.4BSD System Manager's Manual</title>
-
- <publisher>
- <publishername>O'Reilly &amp; Associates, Inc.</publishername>
- <address>
- <city>Sebastopol</city>
- <state>CA</state>
- </address>
- </publisher>
-
- <pubdate>1994</pubdate>
- </biblioset>
- </biblioentry>
-
- <biblioentry id="biblio-mckusick-2">
- <abbrev>McKusick & Karels, 1988</abbrev>
-
- <biblioset relation="article">
- <title>Design of a General Purpose Memory Allocator for the 4.3BSD
- UNIX Kernel</title>
-
- <authorgroup>
- <author>
- <firstname>M. K.</firstname>
- <surname>McKusick</surname>
- </author>
-
- <author>
- <firstname>M. J.</firstname>
- <surname>Karels</surname>
- </author>
- </authorgroup>
-
- <pagenums>295-304</pagenums>
- </biblioset>
-
- <biblioset relation="journal">
- <title>USENIX Assocation Conference Proceedings</title>
- <publishername>USENIX Assocation</publishername>
- <pubdate>June 1998</pubdate>
- </biblioset>
- </biblioentry>
-
- <biblioentry id="biblio-mckusick-1">
- <abbrev>McKusick et al, 1994</abbrev>
-
- <biblioset relation="manual">
- <title>Berkeley Software Architecture Manual, 4.4BSD Edition</title>
-
- <authorgroup>
- <author>
- <firstname>M. K.</firstname>
- <surname>McKusick</surname>
- </author>
-
- <author>
- <firstname>M. J.</firstname>
- <surname>Karels</surname>
- </author>
-
- <author>
- <firstname>S. J.</firstname>
- <surname>Leffler</surname>
- </author>
-
- <author>
- <firstname>W. N.</firstname>
- <surname>Joy</surname>
- </author>
-
- <author>
- <firstname>R. S.</firstname>
- <surname>Faber</surname>
- </author>
- </authorgroup>
-
- <pagenums>5:1-42</pagenums>
- </biblioset>
-
- <biblioset relation="book">
- <title>4.4BSD Programmer's Supplementary Documents</title>
-
- <publisher>
- <publishername>O'Reilly &amp; Associates, Inc.</publishername>
- <address>
- <city>Sebastopol</city>
- <state>CA</state>
- </address>
- </publisher>
-
- <pubdate>1994</pubdate>
- </biblioset>
- </biblioentry>
-
- <biblioentry id="biblio-ritchie">
- <abbrev>Ritchie, 1988</abbrev>
-
- <title>Early Kernel Design</title>
- <subtitle>private communication</subtitle>
-
- <author>
- <firstname>D. M.</firstname>
- <surname>Ritchie</surname>
- </author>
-
- <pubdate>March 1988</pubdate>
- </biblioentry>
-
- <biblioentry id="biblio-rosenblum">
- <abbrev>Rosenblum & Ousterhout, 1992</abbrev>
-
- <biblioset relation="article">
- <title>The Design and Implementation of a Log-Structured File
- System</title>
-
- <authorgroup>
- <author>
- <firstname>M.</firstname>
- <surname>Rosenblum</surname>
- </author>
-
- <author>
- <firstname>K.</firstname>
- <surname>Ousterhout</surname>
- </author>
- </authorgroup>
-
- <pagenums>26-52</pagenums>
- </biblioset>
-
- <biblioset relation="journal">
- <title>ACM Transactions on Computer Systems, 10, 1</title>
-
- <publishername>Association for Computing Machinery</publishername>
- <pubdate>February 1992</pubdate>
- </biblioset>
- </biblioentry>
-
- <biblioentry id="biblio-rozier">
- <abbrev>Rozier et al, 1988</abbrev>
-
- <biblioset relation="article">
- <title>Chorus Distributed Operating Systems</title>
-
- <authorgroup>
- <author>
- <firstname>M.</firstname>
- <surname>Rozier</surname>
- </author>
-
- <author>
- <firstname>V.</firstname>
- <surname>Abrossimov</surname>
- </author>
-
- <author>
- <firstname>F.</firstname>
- <surname>Armand</surname>
- </author>
-
- <author>
- <firstname>I.</firstname>
- <surname>Boule</surname>
- </author>
-
- <author>
- <firstname>M.</firstname>
- <surname>Gien</surname>
- </author>
-
- <author>
- <firstname>M.</firstname>
- <surname>Guillemont</surname>
- </author>
-
- <author>
- <firstname>F.</firstname>
- <surname>Herrmann</surname>
- </author>
-
- <author>
- <firstname>C.</firstname>
- <surname>Kaiser</surname>
- </author>
-
- <author>
- <firstname>S.</firstname>
- <surname>Langlois</surname>
- </author>
-
- <author>
- <firstname>P.</firstname>
- <surname>Leonard</surname>
- </author>
-
- <author>
- <firstname>W.</firstname>
- <surname>Neuhauser</surname>
- </author>
- </authorgroup>
-
- <pagenums>305-370</pagenums>
- </biblioset>
-
- <biblioset relation="journal">
- <title>USENIX Computing Systems, 1, 4</title>
- <pubdate>Fall 1988</pubdate>
- </biblioset>
- </biblioentry>
-
- <biblioentry id="biblio-tevanian">
- <abbrev>Tevanian, 1987</abbrev>
-
- <title>Architecture-Independent Virtual Memory Management for Parallel
- and Distributed Environments: The Mach Approach</title>
- <subtitle>Technical Report CMU-CS-88-106,</subtitle>
-
- <author>
- <firstname>A.</firstname>
- <surname>Tevanian</surname>
- </author>
-
- <publisher>
- <publishername>Department of Computer Science, Carnegie-Mellon
- University</publishername>
-
- <address>
- <city>Pittsburgh</city>
- <state>PA</state>
- </address>
- </publisher>
-
- <pubdate>December 1987</pubdate>
- </biblioentry>
- </bibliography>
- </chapter>
-</book>
diff --git a/en_US.ISO8859-1/books/design-44bsd/fig1.eps b/en_US.ISO8859-1/books/design-44bsd/fig1.eps
deleted file mode 100644
index d1b1976b14..0000000000
--- a/en_US.ISO8859-1/books/design-44bsd/fig1.eps
+++ /dev/null
@@ -1,340 +0,0 @@
-%!PS-Adobe-2.0 EPSF-1.2
-%%Title: fig1.ps
-%%Creator: groff version 1.15
-%%CreationDate: Fri Jun 30 09:50:25 2000
-%%For:sheldonh sheldonh
-%%Pages: 1
-%%DocumentFonts:
-%%BoundingBox: 71 687 446 781
-%%BeginPreview: 376 93 1 93
-% 0000000000003fffffe00000000000000000000000000000000000000000000000000000001ffffff8000000000000
-% 000000000007c000001f000000000000000000000000040000000000000000000000000003e0000007c00000000000
-% 00000000007800000000f0000000000000000000000000000000000000000000000000001c00000000380000000000
-% 000000000380000000000e00000000000000000000000180000000000000000000000000e000000000070000000000
-% 000000000c00000000000180000000000000000006496dc0000000000000000000000003000000000000e000000000
-% 000000003000000000000060000000000000000002ca6d0000000000000000000000000c0000000000001800000000
-% 0000000040000000002000100000000000000000035469000000000000000000000000300000000008000400000000
-% 00000001800080100860000c00000000000000000374c9000000000000000000000000400040040218000200000000
-% 000000020000f395ef600002000000000000000002674b000000000000000000000000800079c57bd8000100000000
-% 0000000400009893e9200001000000000000000000000000000000000000000000000100004c44fa48000080000000
-% 0000000800008a9309200001800000000000000000000000000000000000000000000200004544c248000040000000
-% 00000f0800008e932920000080000000000000000000000000000000000000000003c200004744ca480000400003c0
-% 00000fe80000f3d9c930000080000000000000000000000000000000000000000003fc000079e6724c0000200003fc
-% fffffff80000800000000000be7c78f9f1e3e7c78f9f1e3e7c78f9f1e3c7cf8f1f3ffc00004000000000003ffffffc
-% 00000c0800008000000000008000000000000000000000000000000000000000000384000040000000000020000380
-% 00000008000590000000000080000000000000000000000000000000000000000000020001c4000000000040000000
-% 00000008000795a79fef000080000000000000000000000000000000000000000000020001e569ef7f800040000000
-% 000000040004d2183f8c00010000000000000000000000000000000000000000000001000134861f66000080000000
-% 000000020004521830e70002000000000000000000000000000000000000000000000080011486183b800080000000
-% 000000010004533cb32900040000000000000000000000000000000000000000000000c00114cf394c800300000000
-% 00000000c00799e71def001800000000000000000000000000000000000000000000002001e679ce7f800400000000
-% 0000000030040000000000600000000000000000000000000000000000000000000000180100000000001800000000
-% 000000000c040000000001800000000000000000000000000000000000000000000000060100000000006000000000
-% 00000000030c000000000e00000000000000000000000000000000000000000000000001c300000000038000000000
-% 0000000000f000000000700000000000000000000000000000000000000000000000000038000000001c0000000000
-% 00000000000f00000007800000000000000000000000000000000000000000000000000007c0000003e00000000000
-% 000000000000ff800ff80000000000000000000000000000000000000000000000000000003fe007fc000000000000
-% 000000000000007ff000000000000000000000000000000000000000000000000000000000001ff800000000000000
-% 0000000000000008000000000000000000000000000000000000000000000000000000000000018000000000000000
-% 0000000000000008000000000000000000000000000000000000000000000000000000000000018000000000000000
-% 0000000000000008000000000000000000000000000000000000000000000000000000000000018000000000000000
-% 0000000000000008000000000000000000000000000000000000000000000000000000000000018000000000000000
-% 000000000000000800000000000000000000000000000000000000000000000000000000000003c000000000000000
-% 000000000000000800000000000000000000000000000000000000000000000000000000000003c000000000000000
-% 000000000000000800000000000000000000000000000000000000000000000000000000000003c000000000000000
-% 000000000000000800000000000000000000000000000000000000000000000000000000000003c000000000000000
-% 0000000000000008000000000000000000000000000000000000000000000000000000000000008000000000000000
-% 0000000000000008000000000000000000000000000000000000000000000000000000000000008000000000000000
-% 0000000000000008006000000000000000000000000000000000000000000000000000000000008000000000000000
-% 000000000000000800e002000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000008008002000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000008008007000000000000000000000000000000000000000000000000000000008000000000000000
-% 000000000000000803def7800000000000000000000000000000000000000000000000000000008000000000000000
-% 00000000000000080122c4000000000000000000000000000000000000000000000000000000008000000000000000
-% 00000000000000080146c6000000000000000000000000000000000000000000000000000000008000000000000000
-% 000000000000000801448f000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000008037889800000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000008020000000000000000000000000000000000000000000000000000000000008000000000000000
-% 00000000000000080a0000000000000000000000000000000000000000000000000000000000008000000000000000
-% 00000000000000080c0000000000000000000000000000000000000000000000000000000000008000000000000000
-% 0000000000000008000000000000000000000000000000000000000000000000000000000000008000000000000000
-% 0000000000000008000000000000000000000000000000000000000000000000000000000000008000000000000000
-% 0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000008000000000000000000000000000000000000000000000000000000000000008000000000000000
-% 0000000000000008000000000000000000000000000000000000000000000000000000000000008000000000000000
-% 000000000000003c000000000000000000000000000000000000000000000000000000000000008000000000000000
-% 000000000000003c000000000000000000000000000000000000000000000000000000000000008000000000000000
-% 000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 000000000000003c000000000000000000000000000000000000000000000000000000000000000000000000000000
-% 0000000000000018000000000000000000000000000000000000000000000000000000000000008000000000000000
-% 0000000000000018000000000000000000000000000000000000000000000000000000000000008000000000000000
-% 0000000000000018000000000000000000000000000000000000000000000000000000000000008000000000000000
-% 0000000000000018000000000000000000000000000000000000000000000000000000000000008000000000000000
-% 000000000000007fe000000000000000000000000000007fe0000000000000000000000000001ff800000000000000
-% 000000000000ff801ff0000000000000000000000000ff801ff000000000000080000000003fe007fc000000000000
-% 00000000000f0000000f80000000000000000000000f0000000f8000000000000000000007c0000003e00000000000
-% 0000000000f000000000700000000000000000000070000000007000000000003000000038000000001c0000000000
-% 000000000300000000000e000003bc73e47000000380000000000e000000073db8000001c000000000038000000000
-% 000000000c00008240800180000598b424b000000c0000824080018000000b19a00000060000002080006000000000
-% 000000003000008040800060000f19e839e00000300000804080006000001e19200000180000002000001800000000
-% 00000000c0000080408000180008190839000000c00000804080001800001019200000200000002000000400000000
-% 0000000100001ef647800004000f49ef11e0000100001ef64780000400001e49600000c0039a5fbd8f000300000000
-% 00000002000020924880000200000000000000020000209248800002000000000000008000a148a69f000080000000
-% 000000040000209248800001000000000000000400002092488000010000000000000100012148a298000080000000
-% 00000008000032924c8000008000000000000f88000032924c800000800000000003c200023348a699000040000000
-% 0000000800001c9267c000008000000000000ff800001c9267c00000800000000003fe0003deeebc8e000040000000
-% 000000080000000000000000bffffffffffffff80000000000000000be7cf1e7cf9ffc000000000000000020000000
-% 0000000800000000000000008000000000000e08000000000000000080000000000384000000000000000020000000
-% 0000000800041000000000008000000000000008000410000000000080000000000004000104000000000020000000
-% 00000008000795a79fef00008000000000000008000795a79fef0000800000000000020001e569ef7f800040000000
-% 000000080004d2183f8c000180000000000000080004d2183f8c000180000000000002000134861f66000040000000
-% 000000040004521830e7000100000000000000040004521830e700010000000000000100011486183b800080000000
-% 000000020004533cb329000200000000000000020004533cb329000200000000000000800114cf394c800100000000
-% 00000001000799e71def000c0000000000000001800799e71def000c000000000000004001e679ce7f800200000000
-% 00000000c0040000000000100000000000000000400400000000001000000000000000200100000000000400000000
-% 00000000300400000000006000000000000000003004000000000060000000000000001c0100000000001800000000
-% 000000000c0c00000000018000000000000000000c0c0000000001800000000000000003030000000000e000000000
-% 000000000380000000000e0000000000000000000380000000000e000000000000000000e000000000070000000000
-% 00000000007800000000f0000000000000000000007800000000f00000000000000000001c00000000380000000000
-% 0000000000078000001f0000000000000000000000078000001f0000000000000000000003e0000007c00000000000
-% 0000000000007ffdffe00000000000000000000000007ffdffe000000000000000000000001ffffff8000000000000
-% 0000000000000002000000000000000000000000000000020000000000000000000000000000000000000000000000
-%%EndImage
-%%EndPreview
-save
-countdictstack
-mark
-newpath
-/showpage {} def
-%%EndProlog
-%%Page 1 1
-%%+ font Times-Roman
-/setpacking where{
-pop
-currentpacking
-true setpacking
-}if
-/grops 120 dict dup begin
-/SC 32 def
-/A/show load def
-/B{0 SC 3 -1 roll widthshow}bind def
-/C{0 exch ashow}bind def
-/D{0 exch 0 SC 5 2 roll awidthshow}bind def
-/E{0 rmoveto show}bind def
-/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def
-/G{0 rmoveto 0 exch ashow}bind def
-/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/I{0 exch rmoveto show}bind def
-/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def
-/K{0 exch rmoveto 0 exch ashow}bind def
-/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/M{rmoveto show}bind def
-/N{rmoveto 0 SC 3 -1 roll widthshow}bind def
-/O{rmoveto 0 exch ashow}bind def
-/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/Q{moveto show}bind def
-/R{moveto 0 SC 3 -1 roll widthshow}bind def
-/S{moveto 0 exch ashow}bind def
-/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def
-/SF{
-findfont exch
-[exch dup 0 exch 0 exch neg 0 0]makefont
-dup setfont
-[exch/setfont cvx]cvx bind def
-}bind def
-/MF{
-findfont
-[5 2 roll
-0 3 1 roll
-neg 0 0]makefont
-dup setfont
-[exch/setfont cvx]cvx bind def
-}bind def
-/level0 0 def
-/RES 0 def
-/PL 0 def
-/LS 0 def
-/MANUAL{
-statusdict begin/manualfeed true store end
-}bind def
-/PLG{
-gsave newpath clippath pathbbox grestore
-exch pop add exch pop
-}bind def
-/BP{
-/level0 save def
-1 setlinecap
-1 setlinejoin
-72 RES div dup scale
-LS{
-90 rotate
-}{
-0 PL translate
-}ifelse
-1 -1 scale
-}bind def
-/EP{
-level0 restore
-showpage
-}bind def
-/DA{
-newpath arcn stroke
-}bind def
-/SN{
-transform
-.25 sub exch .25 sub exch
-round .25 add exch round .25 add exch
-itransform
-}bind def
-/DL{
-SN
-moveto
-SN
-lineto stroke
-}bind def
-/DC{
-newpath 0 360 arc closepath
-}bind def
-/TM matrix def
-/DE{
-TM currentmatrix pop
-translate scale newpath 0 0 .5 0 360 arc closepath
-TM setmatrix
-}bind def
-/RC/rcurveto load def
-/RL/rlineto load def
-/ST/stroke load def
-/MT/moveto load def
-/CL/closepath load def
-/FL{
-currentgray exch setgray fill setgray
-}bind def
-/BL/fill load def
-/LW/setlinewidth load def
-/RE{
-findfont
-dup maxlength 1 index/FontName known not{1 add}if dict begin
-{
-1 index/FID ne{def}{pop pop}ifelse
-}forall
-/Encoding exch def
-dup/FontName exch def
-currentdict end definefont pop
-}bind def
-/DEFS 0 def
-/EBEGIN{
-moveto
-DEFS begin
-}bind def
-/EEND/end load def
-/CNT 0 def
-/level1 0 def
-/PBEGIN{
-/level1 save def
-translate
-div 3 1 roll div exch scale
-neg exch neg exch translate
-0 setgray
-0 setlinecap
-1 setlinewidth
-0 setlinejoin
-10 setmiterlimit
-[]0 setdash
-/setstrokeadjust where{
-pop
-false setstrokeadjust
-}if
-/setoverprint where{
-pop
-false setoverprint
-}if
-newpath
-/CNT countdictstack def
-userdict begin
-/showpage{}def
-}bind def
-/PEND{
-clear
-countdictstack CNT sub{end}repeat
-level1 restore
-}bind def
-end def
-/setpacking where{
-pop
-setpacking
-}if
-grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72
-def/PL 792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron
-/scaron/zcaron/Ydieresis/trademark/quotesingle/.notdef/.notdef/.notdef
-/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
-/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
-/.notdef/.notdef/space/exclam/quotedbl/numbersign/dollar/percent
-/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen
-/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon
-/semicolon/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O
-/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright/circumflex
-/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y
-/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase/guillemotleft
-/guillemotright/bullet/florin/fraction/perthousand/dagger/daggerdbl
-/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut
-/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash
-/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen
-/brokenbar/section/dieresis/copyright/ordfeminine/guilsinglleft
-/logicalnot/minus/registered/macron/degree/plusminus/twosuperior
-/threesuperior/acute/mu/paragraph/periodcentered/cedilla/onesuperior
-/ordmasculine/guilsinglright/onequarter/onehalf/threequarters
-/questiondown/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE
-/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex
-/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis
-/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn
-/germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla
-/egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis
-/eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash
-/ugrave/uacute/ucircumflex/udieresis/yacute/thorn/ydieresis]def
-/Times-Roman@0 ENC0/Times-Roman RE/Times-Italic@0 ENC0/Times-Italic RE
-BP
-/F0 12/Times-Italic@0 SF(fork)141.534 58.984 Q 68.832 27.216 134.424
-90.408 DE .4 LW ST/F1 12/Times-Roman@0 SF(process)116.43 97.432 Q(child)
-121.632 89.368 Q 301.968 88.824 298.368 88.824 DL 308.808 88.824 305.208
-88.824 DL 315.576 88.824 311.976 88.824 DL 322.416 88.824 318.816 88.824
-DL 329.184 88.824 325.584 88.824 DL 336.024 88.824 332.424 88.824 DL
-342.792 88.824 339.192 88.824 DL 349.632 88.824 346.032 88.824 DL
-349.632 88.824 MT -7.2 1.8 RL 0 -3.6 RL CL BL 349.632 88.824 MT -7.2 1.8
-RL 0 -3.6 RL CL ST 68.832 27.216 262.44 90.408 DE ST(process)244.374
-97.432 Q(child)249.576 89.368 Q(process)365.982 97.432 Q(zombie)364.728
-89.368 Q 383.976 72.408 383.976 76.008 DL 383.976 65.928 383.976 69.528
-DL 383.976 59.448 383.976 63.048 DL 383.976 52.968 383.976 56.568 DL
-383.976 46.488 383.976 50.088 DL 383.976 40.008 383.976 43.608 DL
-383.976 40.008 MT 1.8 7.2 RL -3.6 0 RL CL BL 383.976 40.008 MT 1.8 7.2
-RL -3.6 0 RL CL ST 68.832 27.216 384.048 90.408 DE ST 72 24.816 99.216
-24.816 DL 99.216 24.816 MT -7.2 1.8 RL 0 -3.6 RL CL BL 99.216 24.816 MT
--7.2 1.8 RL 0 -3.6 RL CL ST 445.608 24.816 418.392 24.816 DL 445.608
-24.816 MT -7.2 1.8 RL 0 -3.6 RL CL BL 445.608 24.816 MT -7.2 1.8 RL 0
--3.6 RL CL ST 228.024 88.824 170.424 88.824 DL 228.024 88.824 MT -7.2
-1.8 RL 0 -3.6 RL CL BL 228.024 88.824 MT -7.2 1.8 RL 0 -3.6 RL CL ST F0
--.24(ex)180.12 84.616 S(ecve).24 E 174.024 24.816 170.424 24.816 DL
-181.296 24.816 177.696 24.816 DL 188.64 24.816 185.04 24.816 DL 195.984
-24.816 192.384 24.816 DL 203.256 24.816 199.656 24.816 DL 210.6 24.816
-207 24.816 DL 217.872 24.816 214.272 24.816 DL 225.216 24.816 221.616
-24.816 DL 232.56 24.816 228.96 24.816 DL 239.832 24.816 236.232 24.816
-DL 247.176 24.816 243.576 24.816 DL 254.448 24.816 250.848 24.816 DL
-261.792 24.816 258.192 24.816 DL 269.136 24.816 265.536 24.816 DL
-276.408 24.816 272.808 24.816 DL 283.752 24.816 280.152 24.816 DL
-291.096 24.816 287.496 24.816 DL 298.368 24.816 294.768 24.816 DL
-305.712 24.816 302.112 24.816 DL 312.984 24.816 309.384 24.816 DL
-320.328 24.816 316.728 24.816 DL 327.672 24.816 324.072 24.816 DL
-334.944 24.816 331.344 24.816 DL 342.288 24.816 338.688 24.816 DL
-349.632 24.816 346.032 24.816 DL 349.632 24.816 MT -7.2 1.8 RL 0 -3.6 RL
-CL BL 349.632 24.816 MT -7.2 1.8 RL 0 -3.6 RL CL ST(wait)236.838 20.608
-Q -.24(ex)315.456 84.616 S(it).24 E 131.976 76.008 131.976 40.008 DL
-131.976 76.008 MT -1.8 -7.2 RL 3.6 0 RL CL BL 131.976 76.008 MT -1.8
--7.2 RL 3.6 0 RL CL ST 68.832 27.216 134.424 25.608 DE ST F1(process)
-116.43 32.632 Q(parent)118.638 24.568 Q 68.832 27.216 384.048 25.608 DE
-ST(process)365.982 32.632 Q(parent)368.19 24.568 Q EP
-end
-%%Trailer
-cleartomark
-countdictstack exch sub { end } repeat
-restore
-%%EOF
diff --git a/en_US.ISO8859-1/books/design-44bsd/fig2.eps b/en_US.ISO8859-1/books/design-44bsd/fig2.eps
deleted file mode 100644
index 84581020db..0000000000
--- a/en_US.ISO8859-1/books/design-44bsd/fig2.eps
+++ /dev/null
@@ -1,1476 +0,0 @@
-%!PS-Adobe-2.0 EPSF-1.2
-%%Title: /b/archive/c02/fig2.test.ps
-%%Creator: XV Version 3.10a Rev: 12/29/94 (jp-extension 5.3.3 + PNG patch 1.2d) - by John Bradley
-%%CreationDate: Nov 2 22:04
-%%For:sheldonh sheldonh
-%%Pages: 1
-%%DocumentFonts:
-%%BoundingBox: 187 308 426 484
-%%BeginPreview: 239 176 1 176
-% 000000000000000000000000000000000000000000aa8000000000000000
-% 000000000000000000000000000000000000000004001000000000000000
-% 000000000000000000000000000000000000000008000800000000000000
-% 000000000000000000000000000000000000000020000200000000000000
-% 000000000000000000000000000000000000000080000080000000000000
-% 000000000000000000000000000000000000000080000080000000000000
-% 000000000000000000000000000000000000000200000000000000000000
-% 000000000000000000000000000000000000000200000000000000000000
-% 000000000000000000000000000000000000000200000020000000000000
-% 000000000000000000000000000000000000000400000010000000000000
-% 000000000000000000000000000000000000000800000000000000000000
-% 000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000800000008000000000000
-% 000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000800000008000000000000
-% 000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000800000008000000000000
-% 000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000800000008000000000000
-% 000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000800000008000000000000
-% 000000000000000000000000000000000000000000000000000000000000
-% 000000000000000000000000000000000000000800000000000000000000
-% 000000000000000000000000000000000000000400000010000000000000
-% 000000000000000000000000000000000000000200000020000000000000
-% 000000000000000000000000000000000000000000000000000000006000
-% 000000000000000000000000000000000000000200000000000000002000
-% 00000000000000000000000000000000076c7804000000001d75ddf4fd00
-% 00000000000000000000000000000000037a68088000008008be8dbe6800
-% 00000000000000000000000000000000037c6010000000100d36cdb66600
-% 00000000000000000000000000000000036e6020280008080636cdb66600
-% 0000000000000000000000000000000003726040040010040636cdb66700
-% 0000000000000000000000000000000003fae08002aa8002023eefbeeb80
-% 000000000000000000000000000000000000010000000001000000000000
-% 000000000000000000000000000000000000020000000000800000000000
-% 000000000000000000000000000000000000040000000000400000000000
-% 000000000000000000000000000000000000080000000000080000000000
-% 000000000000000000000000000000000000100000000000080000000000
-% 000000000000000000000000000000000000200000000000020000000000
-% 000000000000000000000000000000000000400000000000010000000000
-% 00000000000000000000000000000000000080000000000000a000aa8000
-% 00000000000000000000000000000000000000000000000000700c00c000
-% 000000000000000000000000000000000002000000000000007820002800
-% 000000000000000000000000000000000040000000000000007c40000400
-% 0000000000000000000000000000000000b8000000000000003e80000200
-% 000000000000000000000000000001d500f0000000000000000700000100
-% 00000000000000000000000000000a00a0e0000000000000000200000080
-% 0000000000000000000000000000100011c0000000000000000400000000
-% 000000000000000000000000000020000b80000000000000000800000000
-% 000000000000000000000000000080000200000000000000000800000000
-% 000000000000000000000000000000000000000000000000000800000020
-% 000000000000000000000000000000000000000000000000001000000000
-% 000000000000000000000000000200000080000000000000000000000000
-% 000000000000000000000000000400000040000000000000001000000010
-% 000000000000000000000000000800000020000000000000002000000000
-% 000000000000000000000000000000000000000000000000000000000010
-% 000000000000000000000000000800000000000000000000002000000000
-% 000000000000000000000000001000000010000000000000000000000010
-% 000000000000000000000000000000000000000000000000002000000000
-% 000000000000000000000000001000000010000000000000000000000010
-% 000000000000000000000000002000000008000000000000000000000000
-% 000000000000000000000000000000000000000000000000001000000010
-% 000000000000000000000000002000000008000000000000000000000020
-% 000000000000000000000000000000000010000000000000000000000000
-% 000000000000000000000000000000000000000000000000000800000000
-% 000000000000000000000000001000000010000000000000000400000040
-% 000000000000000000000000000000000000000000000000000200000080
-% 000000000000000000000000000000000000000000000000000200000100
-% 000000000000000000000000000800000020000000000000000080000200
-% 000000000000000000000000000000000020000000000000000080000400
-% 00000000000000000000000000020000000800e180000000000020000800
-% 00000000000000000000001dc00400000000006100000000000010001000
-% 00000000000000000000201ba00a00000082006bba00000000000a808000
-% 00000000000000000007f73fc00100000101006d9b0000000000005c0000
-% 0000000000000000000c6c99802080000200806d9b000000000000000000
-% 0000000000000000000e6599800040000400406d9b000000000000000000
-% 0000000000000000000b6b9980800800280020699b000000000000000000
-% 000000000000000000016d9980000501c00010799b000000000000000000
-% 0000000000000000000e2ebb880000aa0000080000000000000000000000
-% 000000000000000000000000000000100000040000000000000000000000
-% 000000000000000000000000200000000000020000000000000000000000
-% 000000000000000000000000000000100000010000000000000000000000
-% 000000000000000000000000800000008000008000000000000000000000
-% 000000000000000000000001000000118000000000000000000000000000
-% 00000000000000000000000200000003baee800800000000000000000000
-% 000000000000000000000004000000119b66c00800000000000000000000
-% 000000000000000000000008000000019b66c00200000000000000000000
-% 000000000000000000000010000000119b66c00000000000000000000000
-% 00000000000000000aa00020000000019b668000a00aa800000000000000
-% 0000000000000000401801c0000000119b778000e0100400000000000000
-% 0000000000000002000203800000002800060000e0a00080000000000000
-% 0000000000000004000007c0000000380006000071000040000000000000
-% 000000000000000800008f8000000038000e00003a000008000000000000
-% 000000000000001000000c0000000038000000000c000008000000000000
-% 000000000000002000000800000000380000000008000000000000000000
-% 000000000000004000000000000000100000000010000000000000000000
-% 000000000000008000000800000000100000000020000002000000000000
-% 0000000000000000000004000000015d0000000000000001000000000000
-% 00000000000000000000020000000a00a000000000000000800000000000
-% 000000000000010000000000000020001000000040000000000000000000
-% 000000000000000000000200000080000800000080000000800000000000
-% 000000000000000000000100000100000400000080000000000000000000
-% 000000000000020000000000000200000200000080000000800000000000
-% 000000000000000000000100000400000100000000000000400000000000
-% 000000000000020000000000000800000080000080000000000000000000
-% 000000000000000000000100000800000000000080000000400000000000
-% 000000000000020000000000000800000000000080000000000000000000
-% 000000000000000000000100001000000000000000000000000000000000
-% 000000000000020000000000000000000020000080000000800000000000
-% 000000000000010000000000000000000000000000000000800000000000
-% 000000000000000000000200002000000020000000000000800000000000
-% 000000000000010000000000000000000000000040000000000000000000
-% 0000c0003030008000000000002000000000000020000000000000000000
-% 0000c0003030000000000400000000000010000000000000000000000000
-% fa38ebee32b2008000000800002000000000000020000002003800000000
-% db64d36c35b4000000001400002000000010000050000004001800000000
-% db28e36e3cb8022000002000002000000020000088000008801b80000000
-% db60f3673c3c041000004000000000000000000004000010001e00000000
-% db22fb6b3e3e080a00008000002000000020000002000020201e00000000
-% dbbcdbe73736100100010040001000000000000400400040001b80000000
-% 0000000000002000a0080028000800000000000800280a80081880000000
-% 00000000000040001d40000000080000004000000005d800001f80000000
-% 000000000000800000000000000800000080000000000000020000000000
-% 000000000001000001000002000400000000004000004000000000000000
-% 000000000002000000000000800200000200008000000000008000000000
-% 000000000004000001000000000100000000010000004000000000000000
-% 0000000000080000003800003000800008000000000c0000002000000000
-% 0000000000100000011800003000400010000000000c4000001000000000
-% 0000000000200000001abba2ba002800a000080003ac0000000800000000
-% 0000000001400000011859e5bc00050100001000030c4000000500000000
-% 00000020038000000018898fbe0000aa00002000030c0000000380020000
-% 0000071403c00000011e598c3700000000000000018c40000007c0556000
-% 0000280283800000001ad98eb980000000008000008c0000000382800800
-% 0000c00047000000011bd9873f40000000000000011c40000001c4000100
-% 000280000e00000000000000002000000000000000000000000028000080
-% 000200000c00000001000000000000000000000000004000000030000040
-% 00080000000000000380000000000000000000000001e000000020000020
-% 00080000000000000780000000000000000000000001c000000000000010
-% 00080000000000000380000000000000000000000000c000000080000008
-% 00100000000000000300000000000000000000000000c000000100000000
-% 002000000080000003000000000000000000000000008000000000000008
-% 00000000000000000300000000000000000000000000c000000000000004
-% 00200000000000000aa000000000000000000000000aa000000200000002
-% 004000000040000010040000000000000000000000401400000000000000
-% 000000000000000080008000000000000000000000800280000000000002
-% 004000000000000100004000000000000000000004000080000400000000
-% 008000000020000200002000000000000000000008000020000000000002
-% 000000000000000800001000000000000000000010000010000400000000
-% 008000000020000800000800000000000000000020000008000000000002
-% 004000000000001000000400000000000000000040000000000400000000
-% 000000000000002000000200000000000000000080000000000200000002
-% 004000000040004000000000000000000000000000000004000000000000
-% 000000000000008000000000000000000000000080000002000200000000
-% 000000000000000000000100000000000000000100000000000000000004
-% 002000000080008000000080000000000000000000000002000200000008
-% 001000000000000000000000000000000000000100000001000100000000
-% 000800000000008000000080000000000000000200000000000080000008
-% 000800000000010000000080000000000000000100000001000000000010
-% 000800000200008000000080000000000000000200000000000020000020
-% 000400000400010000000000000000000000000000000001000020000040
-% 000080000800008000000080000000000000000200000000000008000080
-% 000080000000000000000000000000000000000000000001000004000100
-% 000020008000008000000080000000000000000200000000000002800a00
-% 000004040000000000000000000000000000000100000001000000407000
-% 000000a800000080000000800000000000000000800000020000000a8000
-% 000000000000000000000100000000000000000000000000000000000000
-% 000000000000000000000200000000000000000080000002000000000000
-% 000000000000000000000200000000000000000040000004000000000000
-% 000000000000002000000200000000000000000000000008000000000000
-% 000000000000001000000400000000000000000000000008000000000000
-% 000000000000000800000800000000000000000020000020000000000000
-% 000000000000000400001000000000000000000008000040000000000000
-% 00000000000000020000200000000000000000000a000080000000000000
-% 000000000000000180018000000000000000000001000100000000000000
-% 0000000000000000200a0000000000000000000000a00a00000000000000
-% 000000000000000005500000000000000000000000174000000000000000
-%%EndImage
-%%EndPreview
-save
-countdictstack
-mark
-newpath
-/showpage {} def
-/setpagedevice {pop} def
-%%EndProlog
-%%Page 1 1
-%%DocumentFonts:
-
-
-% remember original state
-/origstate save def
-
-% build a temporary dictionary
-20 dict begin
-
-% define string to hold a scanline's worth of data
-/pix 240 string def
-
-% define space for color conversions
-/grays 240 string def % space for gray scale line
-/npixls 0 def
-/rgbindx 0 def
-
-% lower left corner
-186 308 translate
-
-% size of image (on paper, in 1/72inch coords)
-239.97600 176.97600 scale
-
-240 177 8 % dimensions of data
-[240 0 0 -177 0 177] % mapping matrix
-{currentfile pix readhexstring pop}
-image
-
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbbbffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffdd8866777799bb9977777788dd
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffbb6688ddffffffffffffffffffdd88
-66ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffee7788ffffffffffffffffffffffffffff
-ee7777eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffcc55eeffffffffffffffffffffffffffffff
-ffffdd66ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffff9977ffffffffffffffffffffffffffffffffff
-ffffffee66ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffcc77ffffffffffffffffffffffffffffffffffff
-ffffffffff66ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffee55ffffffffffffffffffffffffffffffffffffff
-ffffffffffee66eeffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffff66eeffffffffffffffffffffffffffffffffffffff
-ffffffffffffdd77ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffbb99ffffffffffffffffffffffffffffffffffffffff
-ffffffffffffff77ddffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffff55ffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffee66ffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffcc99ffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffff88ddffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffff77eeffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffdd88ffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffbbaaffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffbbbbffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffff99ccffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffaabbffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffbbbbffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffbbbbffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffff99bbffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffbbaaffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffee77ffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffdd88ffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffaaaaffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffff88ddffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffff66ffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffff99aaffffffffffffffffffffffffffffffffffffffff
-ffffffffffffff88bbffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffff66eeffffffffffffffffffffffffffffffffffffff
-ffffffffffffee77ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffff1122ffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffff7b50ffffffffffffffffffffffffffffffffffffff
-ffffffffffff55eeffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffff4477ffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffff660000660000cc222288
-ff6600007711eeffffffffffffff6699aa88ffffffffffffffffffffffffffffffffffff
-ffffffffff77ccffffffffffffffffff550011cc22556600007711bb770088ff66000066
-0000660000770099ff550000550011991166ffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff00002200ffbb
-ffff00007700ccffffffffffff77bbffff9988ffffffffffffffffffffffffffffffffff
-ffffffff779966ccffffffffffffffffee1144ff99ddff0011dd0011cc0011ffff0000ff
-0000ff0011ee0011ffff0000dd1133ee77ffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff0000110055ee
-ffff0000ffffffffffffffff77ccffffffffaa77eeffffffffffffffffffffffffffffff
-ffffee55ccffee77aaffffffffffffffff6600dd88ffff0000ff0000ff0000ffff0000ff
-0000ff0000ff0000ffff0000ff880033eeffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff0000cc440033
-ffff0000ffffffffffffee44ccffffffffffffcc66aaffffffffffffffffffffffffffff
-ff9966eeffffffff8888ffffffffffffffdd0044bbffff0000ff0000ff0000ffff0000ff
-0000ff0000ff0000ffff0000ffff2200ccffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff000077ddcc00
-ffff0000ffffffffffee66ddffffffffffffffffff9966aaffffffffffffffffffffee99
-55bbffffffffffffffaa77eeffffffffffff4422ffffff0000ff0000ff0000ffff0000ff
-0000ff0000ff0000ffff0000ffaaaa1133ffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffff550044002233111166
-ffbb0000ddffffffdd66eeffffffffffffffffffffffffaa777777aabbbbbbaa777777cc
-ffffffffffffffffffffcc66eeffffffffffaa99ffffaa0000cc0000dd000055ff550044
-0022710000cc0000ccaa0000aa44ee440077ffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffcc44eeffffffffffffffffffffffffffffffffeebbbbaabbbbffffffff
-ffffffffffffffffffffffee55ccffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffcc77ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffff7799ffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffbb77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffff9977ffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffff9966ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffcc55eeffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffff9999ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffee66ccffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffff7799ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffee77aaffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ff7799ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffff8888ffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-77ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffaa77eebfbfffffffffffffffffffffcc
-776677666677776699eeffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee66
-ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffcc60161ceeffffffffffffee777799
-eeffffffffffffffcc7777bbffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee55cc
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffee27000028ffffffffff7777ddffff
-ffffffffffffffffffffff9966ccffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7b7bee66eeff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffdd300b00006dffffee66ccffffffff
-ffffffffffffffffffffffffee7799ffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd180929eeffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffaf300708bfcc55eeffffffffff
-ffffffffffffffffffffffffffff9977ffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffee997777776677777799eeffffffffffffff3000000dcfffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffaf2d0569ffffffffffffff
-ffffffffffffffffffffffffffffffcc77ffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffff996677ccffffffffffffffcc776699ffffffff6d00002058ffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffee46afffffffffffffff
-ffffffffffffffffffffffffffffffff9999ffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffbb55bbffffffffffffffffffffffffffbb55bbffdd0f0858eeffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffff55eeffffffffffffffff
-ffffffffffffffffffffffffffffffffff77bbffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffff7788ffffffffffffffffffffffffffffffffff8877191dddffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffbb99ffffffffffffffffff
-ffffffffffffffffffffffffffffffffffff66ffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffee55ccffffffffffffffffffffffffffffffffffffffcc32eeffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffff55ffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffff99aaffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffee66eeffffffffffffffffffffffffffffffffffffffffffee55ffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffaaaaffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffff66ffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffff77ccffffffffffffffffffffffffffffffffffffffffffffffcc77ffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffff88ddffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffff77bbffffffffffffffffffffffffffffffffffffffffffffffffffaa88ffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffdd88ffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffee77ffffffffffffffffffffffffffffffffffffffffffffffffffffff77eeffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffbbaaffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffff77ffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ff77ddffffffffffffffffffffffffffffffffffffffffffffffffffffffdd77ffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffaabbffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffff77ffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ee77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77eeffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffff77eeffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffff77ffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-99ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc99ffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffff77ffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffff77ffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffff77ddffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffff77ffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee
-77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffbbbbffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffff77ffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb
-bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99bbffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffcc99ffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffff66ffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb
-bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffcc99ffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb
-bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff77eeffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffff77eeffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb
-aaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88ccffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffcc99ffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffff77ffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee
-77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffff66eeffffffffffffffffff
-ffffffffffffffffffffffffffffffffffff77ccffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffdd77ffffffffffffffffff
-ffffffffffffffffffffffffffffffffffee77ffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffff77ccffffffffffffffff
-ffffffffffffffffffffffffffffffffff66ddffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-99bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaaaaffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffff55eeffffffffffffff
-ffffffffffffffffffffffffffffffff77ccffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ee77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffee66eeffffffffffff
-ffffffffffffffffffffffffffffff9999ffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ff77ddffffffffffffffffffffffffffffffffffffffffffffffffffffffbb30ddffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffee55ccffffffffff
-ffffffffffffffffffffffffffff7799ffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffee33aaffffffffffffffffffffffffffffffffffffffffffffffffffff66ee55ccffff
-ffffffffffffffffffbb0000ffffffff1122ffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7788ffffffff
-ffffffffffffffffffffffffdd66ccffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffff77ffffffffffffffff7700118877001188ffffffffffffffff
-ff776699ffffffffffffffffffffffffffffffffffffffffffffffffff99aaffff77bbff
-ffffffffffffffffffff0000ffffffff4477ffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb6699ffff
-ffffffffffffffffffffdd7777eeffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffff6600ffffffffffffffff0000889900008899ffffffffffffffff
-77bbff77ccffffffffffffffffffffffffffffffffffffffffffffffbb77ffffffff7799
-ffffffffffffffffffff00004422cc550000ff660000770099ffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb7777
-aaeeffffffffffcc886688eeffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffcc22228877000044ee550022aaff4400007744000077ffffffffffffffff77
-ccffffff66ccffffffffffffffffffffffffffffffffffffffffffcc77ffffffffffff99
-88ffffffffffffffffff0000dd0055ff0000ffff0011ee0011ffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-bb77777777777799ddffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffff2200ffbbff0000ff8822ff8811ffff0000ffff0000ffffffffffffffee55cc
-ffffffffff7799ffffffffffffffffffffffffffffffffffffff9977ffffffffffffffff
-9977ffffffffffffffff0000ff0000ff0000ffff0000ff0000ffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffff110055eeff0000ffcc77ff8800ffff0000ffff0000ffffffffffffee66ddff
-ffffffffffff9977eeffffffffffffffffffffffffffffffee7799ffffffffffffffffff
-ffcc77eeffffffffffff0000ff0000ff0000ffff0000ff0000ffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffcc440033ff0000ffee66aa0000ffff0000ffff0000ffffffffffee66eeffff
-ffffffffffffffdd7788ffffffffffffffffffffffffff7777ddffffffffffffffffffff
-ffffcc55eeffffffffff0000ee0044ff0000ffff0000ff0000ffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffff77ddcc00ff0000dd3300ff0000ffff0000ffff0000ffffffffcc55eeffffff
-ffffffffffffffffffbb777799eeffffffffffee997777ccffffffffffffffffffffffff
-ffffffee66ddffffffff44220022ccaa0000ffbb0000cc0000ccffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffff55111166ff330099440044660099bb000077bb000077ffffcc77eeffffffff
-ffffffffffffffffffffffffcc77776638667777ccffffffffffffffffffffffffffffff
-ffffffffee55ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc77ffffffffffff
-ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff
-ffffffffffff77bbffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffff9977ffffffffffffff
-ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff
-ffffffffffffff7799ffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffff9988ffffffffffffffff
-ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff
-ffffffffffffffff9988ffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffff9999ffffffffffffffffff
-ffffffffffffffffffffffffffffffff77ffffffff77ffffffffffffffffffffffffffff
-ffffffffffffffffff9977ffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff7799ffffffffffffffffffff
-ffffffffffffffffffffffffffffffff77ffffff6600ffffffffffffffffffffffffffff
-ffffffffffffffffffffcc77eeffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffff77bbffffffffffffffffffffff
-ffffffffffffffffffffffffffffffff77ffff770000446600007711bb770088ff660000
-4422ccffffffffffffffffcc55eeffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffff77ccffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffff77ffffff0000ffff0011dd0011cc0011ffff0022
-ee0055ffffffffffffffffffee66ddffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffee55ccffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffff77ffffff0000ffff0000ff0000ff0000ffff0000
-ff0000ffffffffffffffffffffee55ccffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffee66ddffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffff77ffffff0000ffff0000ff0000ff0000ffff0000
-ff0000ffffffffffffffffffffffff77bbffddffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee99777766
-667777aaeeffffffffffffffffffffff9fffee66eeffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffff77ffffff0000ddff0000ff0000ff0000ffff0000
-ee0033ffffffffffffffffffffffffff77730abfffffffffffffffffffdd997777777777
-77bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffee887777bbffffff
-ffffeeaa777799ffffffffffffffffaf083a55eeffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffff77ffffff330099aa0000cc0000dd000055ff0000
-3311ccffffffffffffffffffffffffffbf0f0022ffffffffffffee886688ccffffffffff
-eeaa7777bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffff9966ddffffffffffff
-ffffffffffffbb66bbffffffffffee2200005affffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffaf582a58ddffffffffffffffffffffffffffffff0000
-ffffffffffffffffffffffffffffffff3700000058ffffffee7777ddffffffffffffffff
-ffffffff9966bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffdd66bbffffffffffffffff
-ffffffffffffffff9966eeffffff5000001050ffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffaf00000accffffffffffffffffffffffffffffff0000
-ffffffffffffffffffffffffffffffffff85290008b3ffcc66ddffffffffffffffffffff
-ffffffffffff8877ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffcc66eeffffffffffffffffff
-ffffffffffffffffffdd66ccffaf060530ddffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffff180028ffffffffffffffffffffffffffffff550000
-ffffffffffffffffffffffffffffffffffffff641a0b8f77ffffffffffffffffffffffff
-ffffffffffffffcc55eeffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffbb66ffffffffffffffffffffff
-ffffffffffffffffffffee77bf0b1aafffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffff380040ffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffee3242ffffffffffffffffffffffffff
-ffffffffffffffffee66eeffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffdd66ffffffffffffffffffffffff
-ffffffffffffffffffffffee5366ffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffff500064ffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffcc77ffffffffffffffffffffffffffff
-ffffffffffffffffffee55ffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffee66eeffffffffffffffffffffffff
-ffffffffffffffffffffffffee66ffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffaf00ccffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffdd66ffffffffffffffffffffffffffffff
-ffffffffffffffffffffcc77ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffff77ddffffffffffffffffffffffffff
-ffffffffffffffffffffffffffaaaaffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffff04ffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffffff
-ffffffffffffffffffffff77ddffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffee77ffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffdd887777777741667777aaeeffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffcc77ffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffee55ffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffff77ddffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffbb99ffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffff996688ddffffffffffffffffaa7777ddffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffff99ccffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffff
-ffffffffffffbb55bbffffffffffffffffffffffffffee7777eeffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffee77ffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffee77ffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffcc99ffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffffffffffffff
-ffffffffff7788ffffffffffffffffffffffffffffffffffdd55ccffffffffffffffffff
-ffffffffffffffffffffffffffffffffff99ccffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffcc99ffffffffffffffffffffffffffffffffffffff
-ffffffee66ccffffffffffffffffffffffffffffffffffffffff77aaffffffffffffffff
-ffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffff99ccffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff
-ffffff66ccffffffffffffffffffffffffffffffffffffffffffff66ccffffffffffffff
-ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffbbbbffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff
-ffff77ccffffffffffffffffffffffffffffffffffffffffffffffff66ddffffffffffff
-ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffdd77ffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff
-ffbb88ffffffffffffffffffffffffffffffffffffffffffffffffffee55ffffffffffff
-ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff
-ff55ffffffffffffffffffffffffffffffffffffffffffffffffffffffbb99ffffffffff
-ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff
-99bbffffffffffffffffffffffffffffffffffffffffffffffffffffffff66ffffffffff
-ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffee77ffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff
-66ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb99ffffffff
-ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffbbaaffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffdd88ffffffffffffffffffffffffffffffffffffdd
-88ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffffff
-ffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffaabbffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffaaaaffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffff88ddffffffffffffffffffffffffffffffffffff88
-ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffffff
-ffffffffffffffffffffffffffffffffff88ddffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffff77
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaabbffffff
-ffffffffffffffffffffffffffffffffffdd88ffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffdd88ffffffffffffffffffffffffffffffffffffff77
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbaaffffff
-ffffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffaaaaffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffbb0000ffffffffffffffffffffffffffffffff11
-22ffffffffffbb0000ffffffffffffffffffffffdd77ffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffffffffffffff77
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff
-ffffffffffffffffffffffffffffffffffffaa99ffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffff55ffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffff44
-77ffffffffffff0000ffffffffffffffffffffffff77eeffffffffffffffffffffffffff
-ffffffffffffffffffffffffffbb77ffffffffffffffffffffffffffffffffffffffff77
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff
-ffffffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffff
-ffffffffffffffffffffff99bbffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-6600007711bb770088ffff77112299ffff0000dd8899600000660000ffcc222288ff5500
-00ff77112299ff0000dd8899eeffffffffffffff999477ffffffffffffffffffffffffff
-ffffffffffffffffffffffffee29bbffffffffffffffffffffffffffffffffffffffff77
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffff
-ffffffffffffffffffffffffffffffffffffee5850ffffffffffffffffffffffffffffff
-ffffffffffffffffffffee5566eeffffffffffffffffffbb0000ffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ff0011dd0011cc0011ff7700bb7711ffff0000ee77eeff0000ff0000ff2200ffbbffff00
-007700bb7711ff0000ee77eeffffffffffffff9999ffbb77ffffffffffffffffffffffff
-ffffffffffffffffffffffff77cc8877eeffffffffffffffffffffffffffffffffffff66
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd77ffffff
-ffffffffffffffffffffffffffffffffffbb66dd9999ffffffffffffffffffffffffffff
-ffffffffffffffffffff55eeee66eeffffffffffffffffff0000ffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ff0000ff0000ff0000ff2200ffeeaaffff000077eeffff0000ff0000ff110055eeffff00
-002200ffeeaaff000077eeffffffffffffff9977ffffff8899ffffffffffffffffffffff
-ffffffffffffffffffffff77aaffffddbbffffffffffffffffffffffffffffffffffff77
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbbffffff
-ffffffffffffffffffffffffffffffffff99ffffff77ccffffffffffffffffffffffffff
-ffffffffffffffffff77ccffffee44eeffffffffffffffff0000cc222288ffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ff0000ff0000ff0000ff0000eeffffffff00001144ffff0000ff0000ffcc440033ffff00
-000000eeffffff00001144ffffffffffffcc66ffffffffff8877ffffffffffffffffffff
-ffffffffffffffffffff77aaffffffffffffffffffffffffffffffffffffffffffffff77
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88ddffffff
-ffffffffffffffffffffffffffffffffffffffffffff7799ffffffffffffffffffffffff
-ffffffffffffffee55ccffffffffcc66ffffffffffffffff00002200ffbbffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ff0000ff0000ff0000ff440066ffeeeeff0000880077ff0000ff0000ff77ddcc00ffff00
-00440066ffeeee0000880077ffffffffcc77ffffffffffffffbb77eeffffffffffffffff
-ffffffffffffffffdd55ccffffffffffffffffffffffffffffffffffffffffffffffffaa
-aaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff66ffffffff
-ffffffffffffffffffffffffffffffffffffffffffffff9977eeffffffffffffffffffff
-ffffffffffffcc66eeffffffffffffcc77ffffffffffffff0000110055eeffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-aa0000cc0000dd000055ee55001177ffbb0011aa0000bb55004400229955111166ffaa00
-00ee55001177bb0011aa0000bbffffcc77ffffffffffffffffffdd7777eeffffffffffff
-ffffffffffffee7777eeffffffffffffffff66bbffffffffffffffffffffffffffffffee
-77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee77ffffffff
-ffffffffffffffffffffffffffff99aaffffffffffffffffcc6699ffffffffffffffffff
-ffffffffdd7777ffffffffffffffffffcc77ffffffffffff0000cc440033ffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffcc77ffffffffffffffffffffffffcc7777aaffffffff
-ffffffeeaa7777ddffffffffffffffffffffff8877eeffffffffffffffffffffffffffff
-77eeffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ddffffffff
-ffffffffffffffffffffffffff9999ffffffffffffffffffffffbb7777ccffffffffffff
-ffee997777eeffffffffffffffffffffffcc77ffffffffff000077ddcc00ffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffcc66ffffffffffffffffffffffffffffffffaa77777777
-30777777bbffffffffffffffffffffffffffffffddbbffffffffffffffffffffffffffff
-dd77ffffffffffffffffffffffffffffffffffffffffffffffffffffffee77ffffffffff
-ffffffffffffffffffffffffffaaffffffffffffffffffffffffffffee99667777663077
-6677ccffffffffffffffffffffffffffffffcc66ffffffaa000055111166ffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffee44eeffffffffffffffffffffffffffffffffffffffffff
-77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ff77ddffffffffffffffffffffffffffffffffffffffffffffffffffff77ddffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ff
-ffffffffffffffffffffffffffffffffffffff9977ffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffee66eeffffffffffffffffffffffffffffffffffffffffffff
-77ffffffffffffffffffffffffffffffffffffffffffff66eeffffffffffffffffffffff
-ffee55ffffffffffffffffffffffffffffffffffffffffffffffffffaa88ffffffffffff
-ffffffffffffffffff99aaffffffffffffffffffffffffffffffffffffffffffffff77ff
-ffffffffffffffffffffffffffffffffffffffff9999ffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffee66eeffffffffffffffffffffffffffffffffffffffffffffff
-77ffffffffffffffffffffffffffffffffffffffffffffee66eeffffffffffffffffffff
-ffffcc77ffffffffffffffffffffffffffffffffffffffffffffffcc77ffffffffffffff
-ffffffffffffffff9999ffffffffffffffffffffffffffffffffffffffffffffffff77ff
-ffffffffffffffffffffffffffffffffffffffffff9999ffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffee66eeffffffffffffffffffffffffffffffffffffffffffffffff
-77ffffffffffffffffffffffffffffffffffffffffffffffeebbffffffffffffffffffff
-ffffffaa66ffffffffffffffffffffffffffffffffffffffffffcc66eeffffffffffffff
-ffffffffffffffffaaffffffffffffffffffffffffffffffffffffffffffffffffff77ff
-ffffffffffffffffffffffffffffffffffffffffffff9999ffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffee66eeffffffffffffffffffffffffffffffffffffffffffffffffff
-77ffffbb0000ffffffffffffffffffffffffffffffffffffffffbb0000ffffffffffffff
-ffffffffcc66eeffffffffffffffffffffffffffffffffffffaa77eeffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1122ffffff77ff
-ffffffffffffffffffffffffffffffffffffffffffffff9999ffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffff44ccffffffffffffffffffffffffffffffffffffffffffffffffffff
-77ffffff0000ffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffff
-ffffffffffdd55bbffffffffffffffffffffffffffffffee7788ffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4477ffffff77ff
-ffffffffffffffffffffffffffffffffffffffffffffffff66aaffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffff77ccffffffffffffffffffffffffffffffffffffffffffffffffffffff
-77ffffff0000dd8899df550022aaff6600007711eeff770044eeff0000bf222288ffffff
-ffffffffffffff9966bbffffffffffffffffffffffee7777ddffffffffffffffffffffff
-ffffffff99aaffffffffffffffffffffffffffffffff550011cc2255550000ffffff77ff
-ffffffffffffffffffffffffffffffffffffffffffffffffff77ccffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffff7bee77ccffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-77ffffff0000ee77ee8822ff8811ffff00007700cc9900ee7755ff00000e00ffbbffffff
-ffffffffffffffffff997777aabbffffffddbb886677ddffffffffffffffffffffffffff
-ffffff9999ffffffffffffffffffffffffffffffffffee1144ff99ddff0000ffffff77ff
-ffffffffffffffffffffffffffffffffffffffffffffffffffff77cc88bfffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffddbbddffffffffffffffff
-ffffffbf100da4ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-77ffffff000077eeffcc77ff8800ffff0000ffffff6600000000ff0000100055eeffffff
-ffffffffffffffffffffffffbbaa77777777bbddffffffffffffffffffffffffffffffff
-ffffffaaffffffffffffffffffffffffffffffffffffff6600dd88ffff0000ffffff77ff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffff3a0930ffffffffffff
-ffffffffffffbbbbeeffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffee9977667777bb8877777788ddffffff
-ffffff3000000eddffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-77ffffff00001144ffee66aa0000ffff0000ffffff4400ffffffff0000cc440033ffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffdd0044bbffff0000ffffff77ff
-ffffffffffffffffffffffffffffffffffffffffffffffffffff880a000085ffffffffff
-ffcc7777777799aa77777766aaffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffdd7777ccffffffffffffffffffcc8866ddff
-ffff9400001058ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-77ffffff00008800773300ff0000ffff0000ffffff880099ffccff000077ddcc0066eeff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee
-77aaffffffffffffffffffffffffffffffffffffffffffff4422ffffff0000ffffff77ff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffdd280c0016eeffffff99
-6699eeffffffffffffffffffaa7777eeffffffffffffffff
-ffffffffffffffffffffffffffffffffee7777eeffffffffffffffffffffffffffee7777
-eeff150030ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-77ffffbb0011aa0000320044660099bb0000ddffffee66001199aa000055111166ee66ee
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb66
-ddffffffffffffffffffffffffffffffffffffffffffffffaa99ffffaa0000ffffff77ff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffff941a004bffcc66bb
-ffffffffffffffffffffffffffffcc66aaffffffffffffff
-ffffffffffffffffffffffffffffffee66ccffffffffffffffffffffffffffffffffffee
-552b0994ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-77ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeebb
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff99ff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee4b037577ffff
-ffffffffffffffffffffffffffffffff9977ffffffffffff
-ffffffffffffffffffffffffffffcc66eeffffffffffffffffffffffffffffffffffffff
-ff2b9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffccbb
-58ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbbbb58cc
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5448ffffff
-ffffffffffffffffffffffffffffffffffcc55eeffffffff
-ffffffffffffffffffffffffffdd66ffffffffffffffffffffffffffffffffffffffffff
-ffff77ccffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2200
-0030ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1100003e
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88aaffffffff
-ffffffffffffffffffffffffffffffffffffdd66ffffffff
-ffffffffffffffffffffffffee66eeffffffffffffffffffffffffffffffffffffffffff
-ffffff55eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffff4800
-0050ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff38000094
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa88ffffffffff
-ffffffffffffffffffffffffffffffffffffffcc77ffffff
-ffffffffffffffffffffffff77ccffffffffffffffffffffffffffffffffffffffffffff
-ffffffee55ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8500
-00afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff500008ee
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffee66ffffffffffff
-ffffffffffffffffffffffffffffffffffffffff88bbffff
-ffffffffffffffffffffffdd77ffffffffffffffffffffffffffffffffffffffffffffff
-ffffffff99bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd0a
-0cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaf0017ff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffff77ddffffffffffff
-ffffffffffffffffffffffffffffffffffffffffff66ffff
-ffffffffffffffffffffff77eeffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffff66ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff28
-1bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1822ff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffdd77ffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffbb99ff
-ffffffffffffffffffffdd77ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffff99ccffffffffffffffffffffffffffffffffffffffffffffffffffffffff40
-2affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2046ff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffff77eeffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffff66ff
-ffffffffffffffffffff99ccffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffee77ffffffffffffffffffffffffffffffffffffffffffffffffffffcc7746
-3c77777788ddffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffbb77777777335288
-ddffffffffffffffffffffffffffffffffffffffffffffffffffff77ffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffff77dd
-ffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffff66ffffffffffffffffffffffffffffffffffffffffffffffbb777799ddff
-ffffffffcc887777ddffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffbb777799ddffffffffffcc
-886677ddffffffffffffffffffffffffffffffffffffffffffffdd88ffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffcc99
-ffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffff77ffffffffffffffffffffffffffffffffffffffffffdd5599ffffffffff
-ffffffffffffffee7777eeffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffcc6699ffffffffffffffffffff
-ffffee7777eeffffffffffffffffffffffffffffffffffffffff88ccffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffff77
-ffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffaabbffffffffffffffffffffffffffffffffffffff7777eeffffffffffff
-ffffffffffffffffffdd66bbffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffff7777eeffffffffffffffffffffff
-ffffffffdd66ccffffffffffffffffffffffffffffffffffffff77ffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffff77
-ffffffffffffffffffcc99ffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffbbbbffffffffffffffffffffffffffffffffffee77bbffffffffffffffff
-ffffffffffffffffffffff7799ffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffee66ccffffffffffffffffffffffffff
-ffffffffffff7799ffffffffffffffffffffffffffffffffffff77ffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffff77
-ffffffffffffffffffbbbbffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffbbaaffffffffffffffffffffffffffffffffff55ccffffffffffffffffff
-ffffffffffffffffffffffff9977ffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffee66ddffffffffffffffffffffffffffff
-ffffffffffffff9988ffffffffffffffffffffffffffffffffff77ffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffff77
-ffffffffffffffffffbbaaffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffbbbbffffffffffffffffffffffffffffffff77ccffffffffffffffffffff
-ffffffffffffffffffffffffff9999ffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffff77ccffffffffffffffffffffffffffffff
-ffffffffffffffff88aaffffffffffffffffffffffffffffffff66ffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffff77
-ffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffaabbffffffffffffffffffffffffffffff88aaffffffffffffffffffffff
-ffffffffffffffffffffffffffff77ccffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffff77bbffffffffffffffffffffffffffffffff
-ffffffffffffffffff77ccffffffffffffffffffffffffffffff77ffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffff77
-ffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffff77eeffffffffffffffffffffffffffffee77ffffffffffffffffffffffff
-ffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffdd77ffffffffffffffffffffffffffffffffff
-ffffffffffffffffffee66ffffffffffffffffffffffffffffff77ddffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffff77
-ffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffff77ffffffffffffffffffffffffffffff77ddffffffffffffffffffffffff
-ffffffffffffffffffffffffffffff99bbffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffffffffff
-ffffffffffffffffffff99bbffffffffffffffffffffffffffffcc99ffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffdd88
-ffffffffffffffffffff88ddffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffff66ffffffffffffffffffffffffffffdd77ffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffdd77ffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffff66ffffffffffffffffffffffffffffff77ffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffff88dd
-ffffffffffffffffffffdd88ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffaaaaffffffffffffffffffffffffffff88ddffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffff88ccffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffff88ddffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffff88ddffffffffffffffffffffffffffff77ffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffff66ff
-ffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffff66ffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffdd88ffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffdd88ffffffffffffffffffffffffffffbb88ffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffcc77ff
-ffffffffffffffffffffffbb99ffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffbb99ffffffffffffffffffffffffffffee77ffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffdd88ffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffff77ffffffffffffffffffffffffffffff66eeffffffffffff
-ffffffffffffffffffffffffffffffffffffffffff66ffff
-ffffffffffffffffffffffff66eeffffffffffffffffffffffffffffffffffffffffffff
-ffffffff55ffffffffffffffffffffffffffffffbbbbffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffbbbbffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffff77ffffffffffffffffffffffffffffffdd77ffffffffffff
-ffffffffffffffffffffffffffffffffffffffffbb99ffff
-ffffffffffffffffffffffffee55ffffffffffffffffffffffffffffffffffffffffffff
-ffffff77ccffffffffffffffffffffffffffffffbbbbffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffaabbffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffff77ffffffffffffffffffffffffffffffff88aaffffffffff
-ffffffffffffffffffffffffffffffffffffffdd66ffffff
-ffffffffffffffffffffffffffcc77ffffffffffffffffffffffffffffffffffffffffff
-ffff88aaffffffffffffffffffffffffffffffff88ddffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffff88ddffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffff77ccffffffff
-ffffffffffffffffffffffffffffffffffffee66eeffffff
-ffffffffffffffffffffffffffff9977ffffffffffffffffffffffffffffffffffffffff
-ff9999ffffffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffff88ccffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffff77eeffffffffffffffffffffffffffffffffff55ccffffff
-ffffffffffffffffffffffffffffffffffee55ddffffffff
-ffffffffffffffffffffffffffffffcc66eeffffffffffffffffffffffffffffffffffff
-7799ffffffffffffffffffffffffffffffffffffbbbbffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffff99bbffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff7799ffff
-ffffffffffffffffffffffffffffffffcc55eeffffffffff
-ffffffffffffffffffffffffffffffffdd6699ffffffffffffffffffffffffffffffbb66
-ccffffffffffffffffffffffffffffffffffffffbbbbffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffbbbbffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffff9977dd
-ffffffffffffffffffffffffffffee7777ffffffffffffff
-ffffffffffffffffffffffffffffffffffffbb66aaffffffffffffffffffffffaa6699ff
-ffffffffffffffffffffffffffffffffffffffffdd88ffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffcc99ffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffffffffee77
-77ccffffffffffffffffffffdd8866ddffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffaa777777bbbbccbbbb887777aaffffff
-ffffffffffffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffee77ffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffee77ffffffffffffffffffffffffffffffffffffffffffffff
-dd99777799bbbbccbbaa776688ccffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffddbbbb77bbbbddffffffffffff
-ffffffffffffffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffff99ccffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffff77eeffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffff99ccffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffbbbb9988bbbbeeffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffcc99ffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffff77ffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffcc99ffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffff66eeffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffbb88ffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffbb99ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffcc77ffffffffffffffffffffffff
-ffffffffffffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffbb88ffffffffffffffffffffffffffffffffff
-ffffffffffffffffffff66ffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffff77ccffffffffffffffffffffff
-ffffffffffffffffffffffffffff99aaffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffff77ddffffffffffffffffffffffffffffffff
-ffffffffffffffffff88aaffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffee66eeffffffffffffffffffff
-ffffffffffffffffffffffffffcc77ffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffee66eeffffffffffffffffffffffffffffff
-ffffffffffffffffbb77ffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffee55eeffffffffffffffffff
-ffffffffffffffffffffffffcc66ffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffdd66ffffffffffffffffffffffffffffff
-ffffffffffffffcc77ffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffcc66eeffffffffffffffff
-ffffffffffffffffffffffbb77eeffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffcc55eeffffffffffffffffffffffffff
-ffffffffffffaa77ffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffee55bbffffffffffffff
-ffffffffffffffffffff8877ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffee55bbffffffffffffffffffffffff
-ffffffffff8888ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffff9966ddffffffffff
-ffffffffffffffffaa66bbffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffff9966ddffffffffffffffffffff
-ffffff9966bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee777788ddffff
-ffffffffffcc7766aaffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffee777799ddffffffffffffff
-cc7777bbffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd887777
-667777777799eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffcc8866776677777777
-99eeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff
-
-showpage
-
-% stop using temporary dictionary
-end
-
-% restore original state
-origstate restore
-
-%%Trailer
-cleartomark
-countdictstack exch sub { end } repeat
-restore
-%%EOF
diff --git a/en_US.ISO8859-1/books/design-44bsd/freebsd.dsl b/en_US.ISO8859-1/books/design-44bsd/freebsd.dsl
deleted file mode 100644
index ba9b0d542f..0000000000
--- a/en_US.ISO8859-1/books/design-44bsd/freebsd.dsl
+++ /dev/null
@@ -1,18 +0,0 @@
-<!-- $FreeBSD: doc/en_US.ISO_8859-1/books/design-44bsd/freebsd.dsl,v 1.1 2001/03/09 18:05:31 nik Exp $ -->
-
-<!DOCTYPE style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN" [
-<!ENTITY freebsd.dsl SYSTEM "../../share/sgml/freebsd.dsl" CDATA DSSSL>
-]>
-
-<style-sheet>
- <style-specification use="docbook">
- <style-specification-body>
-
- ;; Keep the legalnotice together with the rest of the text
- (define %generate-legalnotice-link%
- #f)
- </style-specification-body>
- </style-specification>
-
- <external-specification id="docbook" document="freebsd.dsl">
-</style-sheet>
diff --git a/en_US.ISO8859-1/books/developers-handbook/Makefile b/en_US.ISO8859-1/books/developers-handbook/Makefile
deleted file mode 100644
index 2c0e962d91..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/Makefile
+++ /dev/null
@@ -1,47 +0,0 @@
-#
-# $FreeBSD: doc/en_US.ISO8859-1/books/developers-handbook/Makefile,v 1.7 2001/07/19 22:06:05 murray Exp $
-#
-# Build the FreeBSD Developers' Handbook.
-#
-
-MAINTAINER=asmodai@FreeBSD.org
-
-DOC?= book
-
-FORMATS?= html-split
-
-INSTALL_COMPRESSED?= gz
-INSTALL_ONLY_COMPRESSED?=
-
-GEN_INDEX?= yes
-
-# Images
-IMAGES= sockets/layers.eps sockets/sain.eps sockets/sainfill.eps sockets/sainlsb.eps sockets/sainmsb.eps sockets/sainserv.eps sockets/serv.eps sockets/serv2.eps sockets/slayers.eps
-
-#
-# SRCS lists the individual SGML files that make up the document. Changes
-# to any of these files will force a rebuild
-#
-
-# SGML content
-SRCS= book.sgml
-SRCS+= introduction/chapter.sgml
-SRCS+= tools/chapter.sgml
-SRCS+= secure/chapter.sgml
-SRCS+= l10n/chapter.sgml
-SRCS+= locking/chapter.sgml
-SRCS+= sockets/chapter.sgml
-SRCS+= ipv6/chapter.sgml
-SRCS+= isa/chapter.sgml
-SRCS+= pci/chapter.sgml
-SRCS+= usb/chapter.sgml
-SRCS+= scsi/chapter.sgml
-SRCS+= x86/chapter.sgml
-SRCS+= vm/chapter.sgml
-SRCS+= dma/chapter.sgml
-SRCS+= kerneldebug/chapter.sgml
-
-# Entities
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/books/developers-handbook/book.sgml b/en_US.ISO8859-1/books/developers-handbook/book.sgml
deleted file mode 100644
index 8e47eb22ff..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/book.sgml
+++ /dev/null
@@ -1,312 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD: doc/en_US.ISO8859-1/books/developers-handbook/book.sgml,v 1.27 2001/09/02 21:19:03 murray Exp $
--->
-
-<!DOCTYPE BOOK PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-<!ENTITY % bookinfo PUBLIC "-//FreeBSD//ENTITIES DocBook BookInfo Entities//EN">
-%bookinfo;
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man;
-<!ENTITY % chapters SYSTEM "chapters.ent"> %chapters;
-<!ENTITY % authors PUBLIC "-//FreeBSD//ENTITIES DocBook Author Entities//EN"> %authors
-<!ENTITY % mailing-lists PUBLIC "-//FreeBSD//ENTITIES DocBook Mailing List Entities//EN"> %mailing-lists;
-]>
-
-<book>
- <bookinfo>
- <title>FreeBSD Developers' Handbook</title>
-
- <corpauthor>The FreeBSD Documentation Project</corpauthor>
-
- <pubdate>August 2000</pubdate>
-
- <copyright>
- <year>2000</year>
- <year>2001</year>
- <holder>The FreeBSD Documentation Project</holder>
- </copyright>
-
- &bookinfo.legalnotice;
-
- <abstract>
- <para>Welcome to the Developers' Handbook. This manual is a
- <emphasis>work in progress</emphasis> and is the work of many
- individuals. Many sections do not yet exist and some of those
- that do exist need to be updated. If you are interested in
- helping with this project, send email to the &a.doc;.</para>
-
- <para>The latest version of this document is always available
- from the <ulink URL="http://www.FreeBSD.org/">FreeBSD World
- Wide Web server</ulink>. It may also be downloaded in a
- variety of formats and compression options from the <ulink
- url="ftp://ftp.FreeBSD.org/pub/FreeBSD/doc">FreeBSD FTP
- server</ulink> or one of the numerous <ulink
- url="http://www.freebsd.org/handbook/mirrors-ftp.html">mirror
- sites</ulink>.</para>
- </abstract>
- </bookinfo>
-
- <part id="Basics">
- <title>Basics</title>
-
- &chap.introduction;
- &chap.tools;
- &chap.secure;
- &chap.l10n;
-
- </part>
-
- <part id="ipc">
- <title>Interprocess Communication</title>
-
- <chapter id="signals">
- <title>* Signals</title>
-
- <para>Signals, pipes, semaphores, message queues, shared memory,
- ports, sockets, doors</para>
-
- </chapter>
-
- &chap.sockets;
- &chap.ipv6;
-
- </part>
-
- <part id="kernel">
- <title>Kernel</title>
-
- <chapter id="kernelhistory">
- <title>* History of the Unix Kernel</title>
-
- <para>Some history of the Unix/BSD kernel, system calls, how do
- processes work, blocking, scheduling, threads (kernel),
- context switching, signals, interrupts, modules, etc.</para>
-
- <para></para>
- </chapter>
-
- &chap.locking;
- &chap.kobj;
- &chap.sysinit;
- &chap.vm;
- &chap.dma;
- &chap.kerneldebug;
-
- <chapter id="ufs">
- <title>* UFS</title>
-
- <para>UFS, FFS, Ext2FS, JFS, inodes, buffer cache, labeling,
- locking, metadata, soft-updates, LFS, portalfs, procfs,
- vnodes, memory sharing, memory objects, TLBs, caching</para>
-
- </chapter>
-
- <chapter id="afs">
- <title>* AFS</title>
-
- <para>AFS, NFS, SANs etc]</para>
-
- </chapter>
-
- <chapter id="syscons">
- <title>* Syscons</title>
-
- <para>Syscons, tty, PCVT, serial console, screen savers,
- etc</para>
-
- </chapter>
-
- <chapter id="compatibility">
- <title>* Compatibility Layers</title>
-
- <sect1 id="linux">
- <title>* Linux</title>
-
- <para>Linux, SVR4, etc</para>
- </sect1>
-
- </chapter>
- </part>
-
- <part id="devicedrivers">
- <title>Device Drivers</title>
-
- &chap.driverbasics;
- &chap.isa;
- &chap.pci;
- &chap.scsi;
- &chap.usb;
-
- <chapter id="newbus">
- <title>* NewBus</title>
-
- <para>This chapter will talk about the FreeBSD NewBus
- architecture.</para>
- </chapter>
-
- <chapter id="oss">
- <title>* Sound subsystem</title>
-
- <para>OSS, waveforms, etc</para>
-
- </chapter>
-
- </part>
-
- <part id="architectures">
- <title>Architectures</title>
-
- &chap.x86;
-
- <chapter id="alpha">
- <title>* Alpha</title>
-
- <para>Talk about the architectural specifics of
- FreeBSD/alpha.</para>
-
- <para>Explanation of allignment errors, how to fix, how to
- ignore.</para>
-
- <para>Example assembly language code for FreeBSD/alpha.</para>
- </chapter>
-
- <chapter id="ia64">
- <title>* IA-64</title>
-
- <para>Talk about the architectural specifics of
- FreeBSD/ia64.</para>
-
- </chapter>
- </part>
-
- <part id="appendices">
- <title>Appendices</title>
-
- <bibliography>
-
- <biblioentry id="COD" xreflabel="1">
- <authorgroup>
- <author>
- <firstname>Dave</firstname>
- <othername role="MI">A</othername>
- <surname>Patterson</surname>
- </author>
- <author>
- <firstname>John</firstname>
- <othername role="MI">L</othername>
- <surname>Hennessy</surname>
- </author>
- </authorgroup>
- <copyright><year>1998</year><holder>Morgan Kaufmann Publishers,
- Inc.</holder></copyright>
- <isbn>1-55860-428-6</isbn>
- <publisher>
- <publishername>Morgan Kaufmann Publishers, Inc.</publishername>
- </publisher>
- <title>Computer Organization and Design</title>
- <subtitle>The Hardware / Software Interface</subtitle>
- <pagenums>1-2</pagenums>
- </biblioentry>
-
- <biblioentry xreflabel="2">
- <authorgroup>
- <author>
- <firstname>W.</firstname>
- <othername role="Middle">Richard</othername>
- <surname>Stevens</surname>
- </author>
- </authorgroup>
- <copyright><year>1993</year><holder>Addison Wesley Longman,
- Inc.</holder></copyright>
- <isbn>0-201-56317-7</isbn>
- <publisher>
- <publishername>Addison Wesley Longman, Inc.</publishername>
- </publisher>
- <title>Advanced Programming in the Unix Environment</title>
- <pagenums>1-2</pagenums>
- </biblioentry>
-
- <biblioentry xreflabel="3">
- <authorgroup>
- <author>
- <firstname>Marshall</firstname>
- <othername role="Middle">Kirk</othername>
- <surname>McKusick</surname>
- </author>
- <author>
- <firstname>Keith</firstname>
- <surname>Bostic</surname>
- </author>
- <author>
- <firstname>Michael</firstname>
- <othername role="MI">J</othername>
- <surname>Karels</surname>
- </author>
- <author>
- <firstname>John</firstname>
- <othername role="MI">S</othername>
- <surname>Quarterman</surname>
- </author>
- </authorgroup>
- <copyright><year>1996</year><holder>Addison-Wesley Publishing Company,
- Inc.</holder></copyright>
- <isbn>0-201-54979-4</isbn>
- <publisher>
- <publishername>Addison-Wesley Publishing Company, Inc.</publishername>
- </publisher>
- <title>The Design and Implementation of the 4.4 BSD Operating System</title>
- <pagenums>1-2</pagenums>
- </biblioentry>
-
- <biblioentry id="Phrack" xreflabel="4">
- <authorgroup>
- <author>
- <firstname>Aleph</firstname>
- <surname>One</surname>
- </author>
- </authorgroup>
- <title>Phrack 49; "Smashing the Stack for Fun and Profit"</title>
- </biblioentry>
-
- <biblioentry id="StackGuard" xreflabel="5">
- <authorgroup>
- <author>
- <firstname>Chrispin</firstname>
- <surname>Cowan</surname>
- </author>
- <author>
- <firstname>Calton</firstname>
- <surname>Pu</surname>
- </author>
- <author>
- <firstname>Dave</firstname>
- <surname>Maier</surname>
- </author>
- </authorgroup>
- <title>StackGuard; Automatic Adaptive Detection and Prevention of
- Buffer-Overflow Attacks</title>
- </biblioentry>
-
- <biblioentry id="OpenBSD" xreflabel="6">
- <authorgroup>
- <author>
- <firstname>Todd</firstname>
- <surname>Miller</surname>
- </author>
- <author>
- <firstname>Theo</firstname>
- <surname>de Raadt</surname>
- </author>
- </authorgroup>
- <title>strlcpy and strlcat -- consistent, safe string copy and
- concatenation.</title>
- </biblioentry>
-
- </bibliography>
-
- &chap.index;
- </part>
-
-</book>
diff --git a/en_US.ISO8859-1/books/developers-handbook/chapters.ent b/en_US.ISO8859-1/books/developers-handbook/chapters.ent
deleted file mode 100644
index 16d4820d09..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/chapters.ent
+++ /dev/null
@@ -1,66 +0,0 @@
-<!--
- Creates entities for each chapter in the FreeBSD Developer's
- Handbook. Each entity is named chap.foo, where foo is the value
- of the id attribute on that chapter, and corresponds to the name of
- the directory in which that chapter's .sgml file is stored.
-
- Chapters should be listed in the order in which they are referenced.
-
- $FreeBSD: doc/en_US.ISO8859-1/books/developers-handbook/chapters.ent,v 1.12 2001/09/02 21:19:03 murray Exp $
--->
-
-<!-- Part one -->
-<!ENTITY chap.introduction SYSTEM "introduction/chapter.sgml">
-<!ENTITY chap.tools SYSTEM "tools/chapter.sgml">
-<!ENTITY chap.secure SYSTEM "secure/chapter.sgml">
-<!ENTITY chap.l10n SYSTEM "l10n/chapter.sgml">
-
-<!-- Part two -->
-<!ENTITY chap.kobj SYSTEM "kobj/chapter.sgml">
-<!ENTITY chap.sysinit SYSTEM "sysinit/chapter.sgml">
-<!ENTITY chap.locking SYSTEM "locking/chapter.sgml">
-
-<!-- Part three -->
-<!ENTITY chap.vm SYSTEM "vm/chapter.sgml">
-<!ENTITY chap.dma SYSTEM "dma/chapter.sgml">
-
-<!-- Part four -->
-<!-- No significant material yet, still in book.sgml -->
-
-<!-- Part five -->
-<!-- No significant material yet, still in book.sgml -->
-
-<!-- Part six -->
-<!ENTITY chap.sockets SYSTEM "sockets/chapter.sgml">
-<!ENTITY chap.ipv6 SYSTEM "ipv6/chapter.sgml">
-
-<!-- Part seven -->
-<!-- No significant material yet, still in book.sgml -->
-
-<!-- Part eight -->
-<!-- No significant material yet, still in book.sgml -->
-
-<!-- Part nine -->
-<!-- No significant material yet, still in book.sgml -->
-
-<!ENTITY chap.kerneldebug SYSTEM "kerneldebug/chapter.sgml">
-
-<!-- Part ten -->
-<!ENTITY chap.driverbasics SYSTEM "driverbasics/chapter.sgml">
-<!ENTITY chap.isa SYSTEM "isa/chapter.sgml">
-<!ENTITY chap.pci SYSTEM "pci/chapter.sgml">
-<!ENTITY chap.scsi SYSTEM "scsi/chapter.sgml">
-<!ENTITY chap.usb SYSTEM "usb/chapter.sgml">
-
-<!-- Part eleven -->
-<!ENTITY chap.x86 SYSTEM "x86/chapter.sgml">
-
-<!-- Part twelve -->
-<!-- No significant material yet, still in book.sgml -->
-
-<!-- Part thirteen -->
-<!-- No significant material yet, still in book.sgml -->
-
-<!-- Part fourteen (appendices) -->
-<!ENTITY chap.bibliography SYSTEM "bibliography/chapter.sgml">
-<!ENTITY chap.index SYSTEM "index.sgml">
diff --git a/en_US.ISO8859-1/books/developers-handbook/dma/chapter.sgml b/en_US.ISO8859-1/books/developers-handbook/dma/chapter.sgml
deleted file mode 100644
index 7bbb7d973d..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/dma/chapter.sgml
+++ /dev/null
@@ -1,1326 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD$
--->
-
-<chapter id="dma">
- <title>DMA</title>
-
- <sect1 id="dma-basics">
- <title>DMA: What it is and How it Works</title>
-
- <para><emphasis>Copyright &copy; 1995,1997 &a.uhclem;, All Rights
- Reserved. 10 December 1996. Last Update 8 October
- 1997.</emphasis></para>
-
- <para>Direct Memory Access (DMA) is a method of allowing data to be moved
- from one location to another in a computer without intervention from the
- central processor (CPU).</para>
-
- <para>The way that the DMA function is implemented varies between computer
- architectures, so this discussion will limit itself to the
- implementation and workings of the DMA subsystem on the IBM Personal
- Computer (PC), the IBM PC/AT and all of its successors and
- clones.</para>
-
- <para>The PC DMA subsystem is based on the Intel 8237 DMA controller. The
- 8237 contains four DMA channels that can be programmed independently and
- any one of the channels may be active at any moment. These channels are
- numbered 0, 1, 2 and 3. Starting with the PC/AT, IBM added a second
- 8237 chip, and numbered those channels 4, 5, 6 and 7.</para>
-
- <para>The original DMA controller (0, 1, 2 and 3) moves one byte in each
- transfer. The second DMA controller (4, 5, 6, and 7) moves 16-bits from
- two adjacent memory locations in each transfer, with the first byte
- always coming from an even-numbered address. The two controllers are
- identical components and the difference in transfer size is caused by
- the way the second controller is wired into the system.</para>
-
- <para>The 8237 has two electrical signals for each channel, named DRQ and
- -DACK. There are additional signals with the names HRQ (Hold Request),
- HLDA (Hold Acknowledge), -EOP (End of Process), and the bus control
- signals -MEMR (Memory Read), -MEMW (Memory Write), -IOR (I/O Read), and
- -IOW (I/O Write).</para>
-
- <para>The 8237 DMA is known as a <quote>fly-by</quote> DMA controller.
- This means that the data being moved from one location to another does
- not pass through the DMA chip and is not stored in the DMA chip.
- Subsequently, the DMA can only transfer data between an I/O port and a
- memory address, but not between two I/O ports or two memory
- locations.</para>
-
- <note>
- <para>The 8237 does allow two channels to be connected together to allow
- memory-to-memory DMA operations in a non-<quote>fly-by</quote> mode,
- but nobody in the PC industry uses this scarce resource this way since
- it is faster to move data between memory locations using the
- CPU.</para>
- </note>
-
- <para>In the PC architecture, each DMA channel is normally activated only
- when the hardware that uses a given DMA channel requests a transfer by
- asserting the DRQ line for that channel.</para>
-
- <sect2>
- <title>A Sample DMA transfer</title>
-
- <para>Here is an example of the steps that occur to cause and perform a
- DMA transfer. In this example, the floppy disk controller (FDC) has
- just read a byte from a diskette and wants the DMA to place it in
- memory at location 0x00123456. The process begins by the FDC
- asserting the DRQ2 signal (the DRQ line for DMA channel 2) to alert
- the DMA controller.</para>
-
- <para>The DMA controller will note that the DRQ2 signal is asserted. The
- DMA controller will then make sure that DMA channel 2 has been
- programmed and is unmasked (enabled). The DMA controller also makes
- sure that none of the other DMA channels are active or want to be
- active and have a higher priority. Once these checks are complete,
- the DMA asks the CPU to release the bus so that the DMA may use the
- bus. The DMA requests the bus by asserting the HRQ signal which goes
- to the CPU.</para>
-
- <para>The CPU detects the HRQ signal, and will complete executing the
- current instruction. Once the processor has reached a state where it
- can release the bus, it will. Now all of the signals normally
- generated by the CPU (-MEMR, -MEMW, -IOR, -IOW and a few others) are
- placed in a tri-stated condition (neither high or low) and then the
- CPU asserts the HLDA signal which tells the DMA controller that it is
- now in charge of the bus.</para>
-
- <para>Depending on the processor, the CPU may be able to execute a few
- additional instructions now that it no longer has the bus, but the CPU
- will eventually have to wait when it reaches an instruction that must
- read something from memory that is not in the internal processor cache
- or pipeline.</para>
-
- <para>Now that the DMA <quote>is in charge</quote>, the DMA activates its
- -MEMR, -MEMW, -IOR, -IOW output signals, and the address outputs from
- the DMA are set to 0x3456, which will be used to direct the byte that
- is about to transferred to a specific memory location.</para>
-
- <para>The DMA will then let the device that requested the DMA transfer
- know that the transfer is commencing. This is done by asserting the
- -DACK signal, or in the case of the floppy disk controller, -DACK2 is
- asserted.</para>
-
- <para>The floppy disk controller is now responsible for placing the byte
- to be transferred on the bus Data lines. Unless the floppy controller
- needs more time to get the data byte on the bus (and if the peripheral
- does need more time it alerts the DMA via the READY signal), the DMA
- will wait one DMA clock, and then de-assert the -MEMW and -IOR signals
- so that the memory will latch and store the byte that was on the bus,
- and the FDC will know that the byte has been transferred.</para>
-
- <para>Since the DMA cycle only transfers a single byte at a time, the
- FDC now drops the DRQ2 signal, so the DMA knows that it is no longer
- needed. The DMA will de-assert the -DACK2 signal, so that the FDC
- knows it must stop placing data on the bus.</para>
-
- <para>The DMA will now check to see if any of the other DMA channels
- have any work to do. If none of the channels have their DRQ lines
- asserted, the DMA controller has completed its work and will now
- tri-state the -MEMR, -MEMW, -IOR, -IOW and address signals.</para>
-
- <para>Finally, the DMA will de-assert the HRQ signal. The CPU sees
- this, and de-asserts the HOLDA signal. Now the CPU activates its
- -MEMR, -MEMW, -IOR, -IOW and address lines, and it resumes executing
- instructions and accessing main memory and the peripherals.</para>
-
- <para>For a typical floppy disk sector, the above process is repeated
- 512 times, once for each byte. Each time a byte is transferred, the
- address register in the DMA is incremented and the counter in the DMA
- that shows how many bytes are to be transferred is decremented.</para>
-
- <para>When the counter reaches zero, the DMA asserts the EOP signal,
- which indicates that the counter has reached zero and no more data
- will be transferred until the DMA controller is reprogrammed by the
- CPU. This event is also called the Terminal Count (TC). There is only
- one EOP signal, and since only DMA channel can be active at any
- instant, the DMA channel that is currently active must be the DMA
- channel that just completed its task.</para>
-
- <para>If a peripheral wants to generate an interrupt when the transfer
- of a buffer is complete, it can test for its -DACKn signal and the EOP
- signal both being asserted at the same time. When that happens, it
- means the DMA will not transfer any more information for that
- peripheral without intervention by the CPU. The peripheral can then
- assert one of the interrupt signals to get the processors' attention.
- In the PC architecture, the DMA chip itself is not capable of
- generating an interrupt. The peripheral and its associated hardware
- is responsible for generating any interrupt that occurs.
- Subsequently, it is possible to have a peripheral that uses DMA but
- does not use interrupts.</para>
-
- <para>It is important to understand that although the CPU always
- releases the bus to the DMA when the DMA makes the request, this
- action is invisible to both applications and the operating systems,
- except for slight changes in the amount of time the processor takes to
- execute instructions when the DMA is active. Subsequently, the
- processor must poll the peripheral, poll the registers in the DMA
- chip, or receive an interrupt from the peripheral to know for certain
- when a DMA transfer has completed.</para>
- </sect2>
-
- <sect2>
- <title>DMA Page Registers and 16Meg address space limitations</title>
-
- <para>You may have noticed earlier that instead of the DMA setting the
- address lines to 0x00123456 as we said earlier, the DMA only set
- 0x3456. The reason for this takes a bit of explaining.</para>
-
- <para>When the original IBM PC was designed, IBM elected to use both DMA
- and interrupt controller chips that were designed for use with the
- 8085, an 8-bit processor with an address space of 16 bits (64K).
- Since the IBM PC supported more than 64K of memory, something had to
- be done to allow the DMA to read or write memory locations above the
- 64K mark. What IBM did to solve this problem was to add an external
- data latch for each DMA channel that holds the upper bits of the
- address to be read to or written from. Whenever a DMA channel is
- active, the contents of that latch are written to the address bus and
- kept there until the DMA operation for the channel ends. IBM called
- these latches <quote>Page Registers</quote>.</para>
-
- <para>So for our example above, the DMA would put the 0x3456 part of the
- address on the bus, and the Page Register for DMA channel 2 would put
- 0x0012xxxx on the bus. Together, these two values form the complete
- address in memory that is to be accessed.</para>
-
- <para>Because the Page Register latch is independent of the DMA chip,
- the area of memory to be read or written must not span a 64K physical
- boundary. For example, if the DMA accesses memory location 0xffff,
- after that transfer the DMA will then increment the address register
- and the DMA will access the next byte at location 0x0000, not 0x10000.
- The results of letting this happen are probably not intended.</para>
-
- <note>
- <para><quote>Physical</quote> 64K boundaries should not be confused
- with 8086-mode 64K <quote>Segments</quote>, which are created by
- mathematically adding a segment register with an offset register.
- Page Registers have no address overlap and are mathematically OR-ed
- together.</para>
- </note>
-
- <para>To further complicate matters, the external DMA address latches on
- the PC/AT hold only eight bits, so that gives us 8+16=24 bits, which
- means that the DMA can only point at memory locations between 0 and
- 16Meg. For newer computers that allow more than 16Meg of memory, the
- standard PC-compatible DMA cannot access memory locations above
- 16Meg.</para>
-
- <para>To get around this restriction, operating systems will reserve a
- RAM buffer in an area below 16Meg that also does not span a physical
- 64K boundary. Then the DMA will be programmed to transfer data from
- the peripheral and into that buffer. Once the DMA has moved the data
- into this buffer, the operating system will then copy the data from
- the buffer to the address where the data is really supposed to be
- stored.</para>
-
- <para>When writing data from an address above 16Meg to a DMA-based
- peripheral, the data must be first copied from where it resides into a
- buffer located below 16Meg, and then the DMA can copy the data from
- the buffer to the hardware. In FreeBSD, these reserved buffers are
- called <quote>Bounce Buffers</quote>. In the MS-DOS world, they are
- sometimes called <quote>Smart Buffers</quote>.</para>
-
- <note>
- <para>A new implementation of the 8237, called the 82374, allows 16
- bits of page register to be specified, allows access to the entire
- 32 bit address space, without the use of bounce buffers.</para>
- </note>
- </sect2>
-
- <sect2>
- <title>DMA Operational Modes and Settings</title>
-
- <para>The 8237 DMA can be operated in several modes. The main ones
- are:</para>
-
- <variablelist>
- <varlistentry>
- <term>Single</term>
-
- <listitem>
- <para>A single byte (or word) is transferred. The DMA must
- release and re-acquire the bus for each additional byte. This is
- commonly-used by devices that cannot transfer the entire block
- of data immediately. The peripheral will request the DMA each
- time it is ready for another transfer.</para>
-
- <para>The standard PC-compatible floppy disk controller (NEC 765)
- only has a one-byte buffer, so it uses this mode.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Block/Demand</term>
-
- <listitem>
- <para>Once the DMA acquires the system bus, an entire block of
- data is transferred, up to a maximum of 64K. If the peripheral
- needs additional time, it can assert the READY signal to suspend
- the transfer briefly. READY should not be used excessively, and
- for slow peripheral transfers, the Single Transfer Mode should
- be used instead.</para>
-
- <para>The difference between Block and Demand is that once a Block
- transfer is started, it runs until the transfer count reaches
- zero. DRQ only needs to be asserted until -DACK is asserted.
- Demand Mode will transfer one more bytes until DRQ is
- de-asserted, at which point the DMA suspends the transfer and
- releases the bus back to the CPU. When DRQ is asserted later,
- the transfer resumes where it was suspended.</para>
-
- <para>Older hard disk controllers used Demand Mode until CPU
- speeds increased to the point that it was more efficient to
- transfer the data using the CPU, particularly if the memory
- locations used in the transfer were above the 16Meg mark.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Cascade</term>
-
- <listitem>
- <para>This mechanism allows a DMA channel to request the bus, but
- then the attached peripheral device is responsible for placing
- the addressing information on the bus instead of the DMA. This
- is also used to implement a technique known as <quote>Bus
- Mastering</quote>.</para>
-
- <para>When a DMA channel in Cascade Mode receives control of the
- bus, the DMA does not place addresses and I/O control signals on
- the bus like the DMA normally does when it is active. Instead,
- the DMA only asserts the -DACK signal for the active DMA
- channel.</para>
-
- <para>At this point it is up to the peripheral connected to that
- DMA channel to provide address and bus control signals. The
- peripheral has complete control over the system bus, and can do
- reads and/or writes to any address below 16Meg. When the
- peripheral is finished with the bus, it de-asserts the DRQ line,
- and the DMA controller can then return control to the CPU or to
- some other DMA channel.</para>
-
- <para>Cascade Mode can be used to chain multiple DMA controllers
- together, and this is exactly what DMA Channel 4 is used for in
- the PC architecture. When a peripheral requests the bus on DMA
- channels 0, 1, 2 or 3, the slave DMA controller asserts HLDREQ,
- but this wire is actually connected to DRQ4 on the primary DMA
- controller instead of to the CPU. The primary DMA controller,
- thinking it has work to do on Channel 4, requests the bus from
- the CPU using HLDREQ signal. Once the CPU grants the bus to the
- primary DMA controller, -DACK4 is asserted, and that wire is
- actually connected to the HLDA signal on the slave DMA
- controller. The slave DMA controller then transfers data for
- the DMA channel that requested it (0, 1, 2 or 3), or the slave
- DMA may grant the bus to a peripheral that wants to perform its
- own bus-mastering, such as a SCSI controller.</para>
-
- <para>Because of this wiring arrangement, only DMA channels 0, 1,
- 2, 3, 5, 6 and 7 are usable with peripherals on PC/AT
- systems.</para>
-
- <note>
- <para>DMA channel 0 was reserved for refresh operations in early
- IBM PC computers, but is generally available for use by
- peripherals in modern systems.</para>
- </note>
-
- <para>When a peripheral is performing Bus Mastering, it is
- important that the peripheral transmit data to or from memory
- constantly while it holds the system bus. If the peripheral
- cannot do this, it must release the bus frequently so that the
- system can perform refresh operations on main memory.</para>
-
- <para>The Dynamic RAM used in all PCs for main memory must be
- accessed frequently to keep the bits stored in the components
- <quote>charged</quote>. Dynamic RAM essentially consists of
- millions of capacitors with each one holding one bit of data.
- These capacitors are charged with power to represent a
- <literal>1</literal> or drained to represent a
- <literal>0</literal>. Because all capacitors leak, power must
- be added at regular intervals to keep the <literal>1</literal>
- values intact. The RAM chips actually handle the task of
- pumping power back into all of the appropriate locations in RAM,
- but they must be told when to do it by the rest of the computer
- so that the refresh activity won't interfere with the computer
- wanting to access RAM normally. If the computer is unable to
- refresh memory, the contents of memory will become corrupted in
- just a few milliseconds.</para>
-
- <para>Since memory read and write cycles <quote>count</quote> as
- refresh cycles (a dynamic RAM refresh cycle is actually an
- incomplete memory read cycle), as long as the peripheral
- controller continues reading or writing data to sequential
- memory locations, that action will refresh all of memory.</para>
-
- <para>Bus-mastering is found in some SCSI host interfaces and
- other high-performance peripheral controllers.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Autoinitialize</term>
-
- <listitem>
- <para>This mode causes the DMA to perform Byte, Block or Demand
- transfers, but when the DMA transfer counter reaches zero, the
- counter and address are set back to where they were when the DMA
- channel was originally programmed. This means that as long as
- the peripheral requests transfers, they will be granted. It is
- up to the CPU to move new data into the fixed buffer ahead of
- where the DMA is about to transfer it when doing output
- operations, and read new data out of the buffer behind where the
- DMA is writing when doing input operations.</para>
-
- <para>This technique is frequently used on audio devices that have
- small or no hardware <quote>sample</quote> buffers. There is
- additional CPU overhead to manage this <quote>circular</quote>
- buffer, but in some cases this may be the only way to eliminate
- the latency that occurs when the DMA counter reaches zero and
- the DMA stops transfers until it is reprogrammed.</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect2>
-
- <sect2>
- <title>Programming the DMA</title>
-
- <para>The DMA channel that is to be programmed should always be
- <quote>masked</quote> before loading any settings. This is because the
- hardware might unexpectedly assert the DRQ for that channel, and the
- DMA might respond, even though not all of the parameters have been
- loaded or updated.</para>
-
- <para>Once masked, the host must specify the direction of the transfer
- (memory-to-I/O or I/O-to-memory), what mode of DMA operation is to be
- used for the transfer (Single, Block, Demand, Cascade, etc), and
- finally the address and length of the transfer are loaded. The length
- that is loaded is one less than the amount you expect the DMA to
- transfer. The LSB and MSB of the address and length are written to
- the same 8-bit I/O port, so another port must be written to first to
- guarantee that the DMA accepts the first byte as the LSB and the
- second byte as the MSB of the length and address.</para>
-
- <para>Then, be sure to update the Page Register, which is external to
- the DMA and is accessed through a different set of I/O ports.</para>
-
- <para>Once all the settings are ready, the DMA channel can be un-masked.
- That DMA channel is now considered to be <quote>armed</quote>, and will
- respond when the DRQ line for that channel is asserted.</para>
-
- <para>Refer to a hardware data book for precise programming details for
- the 8237. You will also need to refer to the I/O port map for the PC
- system, which describes where the DMA and Page Register ports are
- located. A complete port map table is located below.</para>
- </sect2>
-
- <sect2>
- <title>DMA Port Map</title>
-
- <para>All systems based on the IBM-PC and PC/AT have the DMA hardware
- located at the same I/O ports. The complete list is provided below.
- Ports assigned to DMA Controller #2 are undefined on non-AT
- designs.</para>
-
- <sect3>
- <title>0x00&ndash;0x1f DMA Controller #1 (Channels 0, 1, 2 and
- 3)</title>
-
- <para>DMA Address and Count Registers</para>
-
- <informaltable frame="none">
- <tgroup cols="3">
- <tbody>
- <row>
- <entry>0x00</entry>
- <entry>write</entry>
- <entry>Channel 0 starting address</entry>
- </row>
-
- <row>
- <entry>0x00</entry>
- <entry>read</entry>
- <entry>Channel 0 current address</entry>
- </row>
-
- <row>
- <entry>0x01</entry>
- <entry>write</entry>
- <entry>Channel 0 starting word count</entry>
- </row>
-
- <row>
- <entry>0x01</entry>
- <entry>read</entry>
- <entry>Channel 0 remaining word count</entry>
- </row>
-
- <row>
- <entry>0x02</entry>
- <entry>write</entry>
- <entry>Channel 1 starting address</entry>
- </row>
-
- <row>
- <entry>0x02</entry>
- <entry>read</entry>
- <entry>Channel 1 current address</entry>
- </row>
-
- <row>
- <entry>0x03</entry>
- <entry>write</entry>
- <entry>Channel 1 starting word count</entry>
- </row>
-
- <row>
- <entry>0x03</entry>
- <entry>read</entry>
- <entry>Channel 1 remaining word count</entry>
- </row>
-
- <row>
- <entry>0x04</entry>
- <entry>write</entry>
- <entry>Channel 2 starting address</entry>
- </row>
-
- <row>
- <entry>0x04</entry>
- <entry>read</entry>
- <entry>Channel 2 current address</entry>
- </row>
-
- <row>
- <entry>0x05</entry>
- <entry>write</entry>
- <entry>Channel 2 starting word count</entry>
- </row>
-
- <row>
- <entry>0x05</entry>
- <entry>read</entry>
- <entry>Channel 2 remaining word count</entry>
- </row>
-
- <row>
- <entry>0x06</entry>
- <entry>write</entry>
- <entry>Channel 3 starting address</entry>
- </row>
-
- <row>
- <entry>0x06</entry>
- <entry>read</entry>
- <entry>Channel 3 current address</entry>
- </row>
-
- <row>
- <entry>0x07</entry>
- <entry>write</entry>
- <entry>Channel 3 starting word count</entry>
- </row>
-
- <row>
- <entry>0x07</entry>
- <entry>read</entry>
- <entry>Channel 3 remaining word count</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <para>DMA Command Registers</para>
-
- <informaltable frame="none">
- <tgroup cols="3">
- <tbody>
- <row>
- <entry>0x08</entry>
- <entry>write</entry>
- <entry>Command Register</entry>
- </row>
-
- <row>
- <entry>0x08</entry>
- <entry>read</entry>
- <entry>Status Register</entry>
- </row>
-
- <row>
- <entry>0x09</entry>
- <entry>write</entry>
- <entry>Request Register</entry>
- </row>
-
- <row>
- <entry>0x09</entry>
- <entry>read</entry>
- <entry>-</entry>
- </row>
-
- <row>
- <entry>0x0a</entry>
- <entry>write</entry>
- <entry>Single Mask Register Bit</entry>
- </row>
-
- <row>
- <entry>0x0a</entry>
- <entry>read</entry>
- <entry>-</entry>
- </row>
-
- <row>
- <entry>0x0b</entry>
- <entry>write</entry>
- <entry>Mode Register</entry>
- </row>
-
- <row>
- <entry>0x0b</entry>
- <entry>read</entry>
- <entry>-</entry>
- </row>
-
- <row>
- <entry>0x0c</entry>
- <entry>write</entry>
- <entry>Clear LSB/MSB Flip-Flop</entry>
- </row>
-
- <row>
- <entry>0x0c</entry>
- <entry>read</entry>
- <entry>-</entry>
- </row>
-
- <row>
- <entry>0x0d</entry>
- <entry>write</entry>
- <entry>Master Clear/Reset</entry>
- </row>
-
- <row>
- <entry>0x0d</entry>
- <entry>read</entry>
- <entry>Temporary Register (not available on newer
- versions)</entry>
- </row>
- <row>
- <entry>0x0e</entry>
- <entry>write</entry>
- <entry>Clear Mask Register</entry>
- </row>
-
- <row>
- <entry>0x0e</entry>
- <entry>read</entry>
- <entry>-</entry>
- </row>
-
- <row>
- <entry>0x0f</entry>
- <entry>write</entry>
- <entry>Write All Mask Register Bits</entry>
- </row>
-
- <row>
- <entry>0x0f</entry>
- <entry>read</entry>
- <entry>Read All Mask Register Bits (only in Intel
- 82374)</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </sect3>
-
- <sect3>
- <title>0xc0&ndash;0xdf DMA Controller #2 (Channels 4, 5, 6 and
- 7)</title>
-
- <para>DMA Address and Count Registers</para>
-
- <informaltable frame="none">
- <tgroup cols="3">
- <tbody>
- <row>
- <entry>0xc0</entry>
- <entry>write</entry>
- <entry>Channel 4 starting address</entry>
- </row>
-
- <row>
- <entry>0xc0</entry>
- <entry>read</entry>
- <entry>Channel 4 current address</entry>
- </row>
-
- <row>
- <entry>0xc2</entry>
- <entry>write</entry>
- <entry>Channel 4 starting word count</entry>
- </row>
-
- <row>
- <entry>0xc2</entry>
- <entry>read</entry>
- <entry>Channel 4 remaining word count</entry>
- </row>
-
- <row>
- <entry>0xc4</entry>
- <entry>write</entry>
- <entry>Channel 5 starting address</entry>
- </row>
-
- <row>
- <entry>0xc4</entry>
- <entry>read</entry>
- <entry>Channel 5 current address</entry>
- </row>
-
- <row>
- <entry>0xc6</entry>
- <entry>write</entry>
- <entry>Channel 5 starting word count</entry>
- </row>
-
- <row>
- <entry>0xc6</entry>
- <entry>read</entry>
- <entry>Channel 5 remaining word count</entry>
- </row>
-
- <row>
- <entry>0xc8</entry>
- <entry>write</entry>
- <entry>Channel 6 starting address</entry>
- </row>
-
- <row>
- <entry>0xc8</entry>
- <entry>read</entry>
- <entry>Channel 6 current address</entry>
- </row>
-
- <row>
- <entry>0xca</entry>
- <entry>write</entry>
- <entry>Channel 6 starting word count</entry>
- </row>
-
- <row>
- <entry>0xca</entry>
- <entry>read</entry>
- <entry>Channel 6 remaining word count</entry>
- </row>
-
- <row>
- <entry>0xcc</entry>
- <entry>write</entry>
- <entry>Channel 7 starting address</entry>
- </row>
-
- <row>
- <entry>0xcc</entry>
- <entry>read</entry>
- <entry>Channel 7 current address</entry>
- </row>
-
- <row>
- <entry>0xce</entry>
- <entry>write</entry>
- <entry>Channel 7 starting word count</entry>
- </row>
-
- <row>
- <entry>0xce</entry>
- <entry>read</entry>
- <entry>Channel 7 remaining word count</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <para>DMA Command Registers</para>
-
- <informaltable frame="none">
- <tgroup cols="3">
- <tbody>
- <row>
- <entry>0xd0</entry>
- <entry>write</entry>
- <entry>Command Register</entry>
- </row>
-
- <row>
- <entry>0xd0</entry>
- <entry>read</entry>
- <entry>Status Register</entry>
- </row>
-
- <row>
- <entry>0xd2</entry>
- <entry>write</entry>
- <entry>Request Register</entry>
- </row>
-
- <row>
- <entry>0xd2</entry>
- <entry>read</entry>
- <entry>-</entry>
- </row>
-
- <row>
- <entry>0xd4</entry>
- <entry>write</entry>
- <entry>Single Mask Register Bit</entry>
- </row>
-
- <row>
- <entry>0xd4</entry>
- <entry>read</entry>
- <entry>-</entry>
- </row>
-
- <row>
- <entry>0xd6</entry>
- <entry>write</entry>
- <entry>Mode Register</entry>
- </row>
-
- <row>
- <entry>0xd6</entry>
- <entry>read</entry>
- <entry>-</entry>
- </row>
-
- <row>
- <entry>0xd8</entry>
- <entry>write</entry>
- <entry>Clear LSB/MSB Flip-Flop</entry>
- </row>
-
- <row>
- <entry>0xd8</entry>
- <entry>read</entry>
- <entry>-</entry>
- </row>
-
-
-
- <row>
- <entry>0xda</entry>
- <entry>write</entry>
- <entry>Master Clear/Reset</entry>
- </row>
-
- <row>
- <entry>0xda</entry>
- <entry>read</entry>
- <entry>Temporary Register (not present in Intel
- 82374)</entry>
- </row>
-
- <row>
- <entry>0xdc</entry>
- <entry>write</entry>
- <entry>Clear Mask Register</entry>
- </row>
-
- <row>
- <entry>0xdc</entry>
- <entry>read</entry>
- <entry>-</entry>
- </row>
-
- <row>
- <entry>0xde</entry>
- <entry>write</entry>
- <entry>Write All Mask Register Bits</entry>
- </row>
-
- <row>
- <entry>0xdf</entry>
- <entry>read</entry>
- <entry>Read All Mask Register Bits (only in Intel
- 82374)</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </sect3>
-
- <sect3>
- <title>0x80&ndash;0x9f DMA Page Registers</title>
-
- <informaltable frame="none">
- <tgroup cols="3">
- <tbody>
- <row>
- <entry>0x87</entry>
- <entry>r/w</entry>
- <entry>Channel 0 Low byte (23-16) page Register</entry>
- </row>
-
- <row>
- <entry>0x83</entry>
- <entry>r/w</entry>
- <entry>Channel 1 Low byte (23-16) page Register</entry>
- </row>
-
- <row>
- <entry>0x81</entry>
- <entry>r/w</entry>
- <entry>Channel 2 Low byte (23-16) page Register</entry>
- </row>
-
- <row>
- <entry>0x82</entry>
- <entry>r/w</entry>
- <entry>Channel 3 Low byte (23-16) page Register</entry>
- </row>
-
- <row>
- <entry>0x8b</entry>
- <entry>r/w</entry>
- <entry>Channel 5 Low byte (23-16) page Register</entry>
- </row>
-
- <row>
- <entry>0x89</entry>
- <entry>r/w</entry>
- <entry>Channel 6 Low byte (23-16) page Register</entry>
- </row>
-
- <row>
- <entry>0x8a</entry>
- <entry>r/w</entry>
- <entry>Channel 7 Low byte (23-16) page Register</entry>
- </row>
-
- <row>
- <entry>0x8f</entry>
- <entry>r/w</entry>
- <entry>Low byte page Refresh</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </sect3>
-
- <sect3>
- <title>0x400&ndash;0x4ff 82374 Enhanced DMA Registers</title>
-
- <para>The Intel 82374 EISA System Component (ESC) was introduced in
- early 1996 and includes a DMA controller that provides a superset of
- 8237 functionality as well as other PC-compatible core peripheral
- components in a single package. This chip is targeted at both EISA
- and PCI platforms, and provides modern DMA features like
- scatter-gather, ring buffers as well as direct access by the system
- DMA to all 32 bits of address space.</para>
-
- <para>If these features are used, code should also be included to
- provide similar functionality in the previous 16 years worth of
- PC-compatible computers. For compatibility reasons, some of the
- 82374 registers must be programmed <emphasis>after</emphasis>
- programming the traditional 8237 registers for each transfer.
- Writing to a traditional 8237 register forces the contents of some
- of the 82374 enhanced registers to zero to provide backward software
- compatibility.</para>
-
- <informaltable frame="none">
- <tgroup cols="3">
- <tbody>
- <row>
- <entry>0x401</entry>
- <entry>r/w</entry>
- <entry>Channel 0 High byte (bits 23-16) word count</entry>
- </row>
-
- <row>
- <entry>0x403</entry>
- <entry>r/w</entry>
- <entry>Channel 1 High byte (bits 23-16) word count</entry>
- </row>
-
- <row>
- <entry>0x405</entry>
- <entry>r/w</entry>
- <entry>Channel 2 High byte (bits 23-16) word count</entry>
- </row>
-
- <row>
- <entry>0x407</entry>
- <entry>r/w</entry>
- <entry>Channel 3 High byte (bits 23-16) word count</entry>
- </row>
-
- <row>
- <entry>0x4c6</entry>
- <entry>r/w</entry>
- <entry>Channel 5 High byte (bits 23-16) word count</entry>
- </row>
-
- <row>
- <entry>0x4ca</entry>
- <entry>r/w</entry>
- <entry>Channel 6 High byte (bits 23-16) word count</entry>
- </row>
-
- <row>
- <entry>0x4ce</entry>
- <entry>r/w</entry>
- <entry>Channel 7 High byte (bits 23-16) word count</entry>
- </row>
-
- <row>
- <entry>0x487</entry>
- <entry>r/w</entry>
- <entry>Channel 0 High byte (bits 31-24) page Register</entry>
- </row>
-
- <row>
- <entry>0x483</entry>
- <entry>r/w</entry>
- <entry>Channel 1 High byte (bits 31-24) page Register</entry>
- </row>
-
- <row>
- <entry>0x481</entry>
- <entry>r/w</entry>
- <entry>Channel 2 High byte (bits 31-24) page Register</entry>
- </row>
-
- <row>
- <entry>0x482</entry>
- <entry>r/w</entry>
- <entry>Channel 3 High byte (bits 31-24) page Register</entry>
- </row>
-
- <row>
- <entry>0x48b</entry>
- <entry>r/w</entry>
- <entry>Channel 5 High byte (bits 31-24) page Register</entry>
- </row>
-
- <row>
- <entry>0x489</entry>
- <entry>r/w</entry>
- <entry>Channel 6 High byte (bits 31-24) page Register</entry>
- </row>
-
- <row>
- <entry>0x48a</entry>
- <entry>r/w</entry>
- <entry>Channel 6 High byte (bits 31-24) page Register</entry>
- </row>
-
- <row>
- <entry>0x48f</entry>
- <entry>r/w</entry>
- <entry>High byte page Refresh</entry>
- </row>
-
- <row>
- <entry>0x4e0</entry>
- <entry>r/w</entry>
- <entry>Channel 0 Stop Register (bits 7-2)</entry>
- </row>
-
- <row>
- <entry>0x4e1</entry>
- <entry>r/w</entry>
- <entry>Channel 0 Stop Register (bits 15-8)</entry>
- </row>
-
- <row>
- <entry>0x4e2</entry>
- <entry>r/w</entry>
- <entry>Channel 0 Stop Register (bits 23-16)</entry>
- </row>
-
- <row>
- <entry>0x4e4</entry>
- <entry>r/w</entry>
- <entry>Channel 1 Stop Register (bits 7-2)</entry>
- </row>
-
- <row>
- <entry>0x4e5</entry>
- <entry>r/w</entry>
- <entry>Channel 1 Stop Register (bits 15-8)</entry>
- </row>
-
- <row>
- <entry>0x4e6</entry>
- <entry>r/w</entry>
- <entry>Channel 1 Stop Register (bits 23-16)</entry>
- </row>
-
- <row>
- <entry>0x4e8</entry>
- <entry>r/w</entry>
- <entry>Channel 2 Stop Register (bits 7-2)</entry>
- </row>
-
- <row>
- <entry>0x4e9</entry>
- <entry>r/w</entry>
- <entry>Channel 2 Stop Register (bits 15-8)</entry>
- </row>
-
- <row>
- <entry>0x4ea</entry>
- <entry>r/w</entry>
- <entry>Channel 2 Stop Register (bits 23-16)</entry>
- </row>
-
- <row>
- <entry>0x4ec</entry>
- <entry>r/w</entry>
- <entry>Channel 3 Stop Register (bits 7-2)</entry>
- </row>
-
- <row>
- <entry>0x4ed</entry>
- <entry>r/w</entry>
- <entry>Channel 3 Stop Register (bits 15-8)</entry>
- </row>
-
- <row>
- <entry>0x4ee</entry>
- <entry>r/w</entry>
- <entry>Channel 3 Stop Register (bits 23-16)</entry>
- </row>
-
- <row>
- <entry>0x4f4</entry>
- <entry>r/w</entry>
- <entry>Channel 5 Stop Register (bits 7-2)</entry>
- </row>
-
- <row>
- <entry>0x4f5</entry>
- <entry>r/w</entry>
- <entry>Channel 5 Stop Register (bits 15-8)</entry>
- </row>
-
- <row>
- <entry>0x4f6</entry>
- <entry>r/w</entry>
- <entry>Channel 5 Stop Register (bits 23-16)</entry>
- </row>
-
- <row>
- <entry>0x4f8</entry>
- <entry>r/w</entry>
- <entry>Channel 6 Stop Register (bits 7-2)</entry>
- </row>
-
- <row>
- <entry>0x4f9</entry>
- <entry>r/w</entry>
- <entry>Channel 6 Stop Register (bits 15-8)</entry>
- </row>
-
- <row>
- <entry>0x4fa</entry>
- <entry>r/w</entry>
- <entry>Channel 6 Stop Register (bits 23-16)</entry>
- </row>
-
- <row>
- <entry>0x4fc</entry>
- <entry>r/w</entry>
- <entry>Channel 7 Stop Register (bits 7-2)</entry>
- </row>
-
- <row>
- <entry>0x4fd</entry>
- <entry>r/w</entry>
- <entry>Channel 7 Stop Register (bits 15-8)</entry>
- </row>
-
- <row>
- <entry>0x4fe</entry>
- <entry>r/w</entry>
- <entry>Channel 7 Stop Register (bits 23-16)</entry>
- </row>
-
- <row>
- <entry>0x40a</entry>
- <entry>write</entry>
- <entry>Channels 0-3 Chaining Mode Register</entry>
- </row>
-
- <row>
- <entry>0x40a</entry>
- <entry>read</entry>
- <entry>Channel Interrupt Status Register</entry>
- </row>
-
- <row>
- <entry>0x4d4</entry>
- <entry>write</entry>
- <entry>Channels 4-7 Chaining Mode Register</entry>
- </row>
-
- <row>
- <entry>0x4d4</entry>
- <entry>read</entry>
- <entry>Chaining Mode Status</entry>
- </row>
-
- <row>
- <entry>0x40c</entry>
- <entry>read</entry>
- <entry>Chain Buffer Expiration Control Register</entry>
- </row>
-
- <row>
- <entry>0x410</entry>
- <entry>write</entry>
- <entry>Channel 0 Scatter-Gather Command Register</entry>
- </row>
-
- <row>
- <entry>0x411</entry>
- <entry>write</entry>
- <entry>Channel 1 Scatter-Gather Command Register</entry>
- </row>
-
- <row>
- <entry>0x412</entry>
- <entry>write</entry>
- <entry>Channel 2 Scatter-Gather Command Register</entry>
- </row>
-
- <row>
- <entry>0x413</entry>
- <entry>write</entry>
- <entry>Channel 3 Scatter-Gather Command Register</entry>
- </row>
-
- <row>
- <entry>0x415</entry>
- <entry>write</entry>
- <entry>Channel 5 Scatter-Gather Command Register</entry>
- </row>
-
- <row>
- <entry>0x416</entry>
- <entry>write</entry>
- <entry>Channel 6 Scatter-Gather Command Register</entry>
- </row>
-
- <row>
- <entry>0x417</entry>
- <entry>write</entry>
- <entry>Channel 7 Scatter-Gather Command Register</entry>
- </row>
-
- <row>
- <entry>0x418</entry>
- <entry>read</entry>
- <entry>Channel 0 Scatter-Gather Status Register</entry>
- </row>
-
- <row>
- <entry>0x419</entry>
- <entry>read</entry>
- <entry>Channel 1 Scatter-Gather Status Register</entry>
- </row>
-
- <row>
- <entry>0x41a</entry>
- <entry>read</entry>
- <entry>Channel 2 Scatter-Gather Status Register</entry>
- </row>
-
- <row>
- <entry>0x41b</entry>
- <entry>read</entry>
- <entry>Channel 3 Scatter-Gather Status Register</entry>
- </row>
-
- <row>
- <entry>0x41d</entry>
- <entry>read</entry>
- <entry>Channel 5 Scatter-Gather Status Register</entry>
- </row>
-
- <row>
- <entry>0x41e</entry>
- <entry>read</entry>
- <entry>Channel 5 Scatter-Gather Status Register</entry>
- </row>
-
- <row>
- <entry>0x41f</entry>
- <entry>read</entry>
- <entry>Channel 7 Scatter-Gather Status Register</entry>
- </row>
-
- <row>
- <entry>0x420-0x423</entry>
- <entry>r/w</entry>
- <entry>Channel 0 Scatter-Gather Descriptor Table Pointer
- Register</entry>
- </row>
-
- <row>
- <entry>0x424-0x427</entry>
- <entry>r/w</entry>
- <entry>Channel 1 Scatter-Gather Descriptor Table Pointer
- Register</entry>
- </row>
-
- <row>
- <entry>0x428-0x42b</entry>
- <entry>r/w</entry>
- <entry>Channel 2 Scatter-Gather Descriptor Table Pointer
- Register</entry>
- </row>
-
- <row>
- <entry>0x42c-0x42f</entry>
- <entry>r/w</entry>
- <entry>Channel 3 Scatter-Gather Descriptor Table Pointer
- Register</entry>
- </row>
-
- <row>
- <entry>0x434-0x437</entry>
- <entry>r/w</entry>
- <entry>Channel 5 Scatter-Gather Descriptor Table Pointer
- Register</entry>
- </row>
-
- <row>
- <entry>0x438-0x43b</entry>
- <entry>r/w</entry>
- <entry>Channel 6 Scatter-Gather Descriptor Table Pointer
- Register</entry>
- </row>
-
- <row>
- <entry>0x43c-0x43f</entry>
- <entry>r/w</entry>
- <entry>Channel 7 Scatter-Gather Descriptor Table Pointer
- Register</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </sect3>
- </sect2>
- </sect1>
-
-</chapter> \ No newline at end of file
diff --git a/en_US.ISO8859-1/books/developers-handbook/driverbasics/chapter.sgml b/en_US.ISO8859-1/books/developers-handbook/driverbasics/chapter.sgml
deleted file mode 100644
index a65ec54238..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/driverbasics/chapter.sgml
+++ /dev/null
@@ -1,391 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD: doc/en_US.ISO8859-1/books/developers-handbook/driverbasics/chapter.sgml,v 1.8 2001/07/19 10:37:35 dd Exp $
--->
-
-<chapter id="driverbasics">
- <title>Writing FreeBSD Device Drivers</title>
-
- <para>This chapter was written by &a.murray; with selections from a
- variety of sources including the intro(4) man page by
- &a.joerg;.</para>
-
- <sect1>
- <title>Introduction</title>
- <para>This chapter provides a brief introduction to writing device
- drivers for FreeBSD. A device in this context is a term used
- mostly for hardware-related stuff that belongs to the system,
- like disks, printers, or a graphics display with its keyboard.
- A device driver is the software component of the operating
- system that controls a specific device. There are also
- so-called pseudo-devices where a device driver emulates the
- behaviour of a device in software without any particular
- underlying hardware. Device drivers can be compiled into the
- system statically or loaded on demand through the dynamic kernel
- linker facility `kld'.</para>
-
- <para>Most devices in a Unix-like operating system are accessed
- through device-nodes, sometimes also called special files.
- These files are usually located under the directory
- <filename>/dev</filename> in the file system hierarchy. Until
- devfs is fully integrated into FreeBSD, each device node must be
- created statically and independent of the existence of the
- associated device driver. Most device nodes on the system are
- created by running <command>MAKEDEV</command>.</para>
-
- <para>Device drivers can roughly be broken down into two
- categories; character and network device drivers.</para>
-
- </sect1>
-
- <sect1>
- <title>Dynamic Kernel Linker Facility - KLD</title>
-
- <para>The kld interface allows system administrators to
- dynamically add and remove functionality from a running system.
- This allows device driver writers to load their new changes into
- a running kernel without constantly rebooting to test
- changes.</para>
-
- <para>The kld interface is used through the following
- administrator commands :
-
- <itemizedlist>
- <listitem><simpara><command>kldload</command> - loads a new kernel
- module</simpara></listitem>
- <listitem><simpara><command>kldunload</command> - unloads a kernel
- module</simpara></listitem>
- <listitem><simpara><command>kldstat</command> - lists the currently loadded
- modules</simpara></listitem>
- </itemizedlist>
- </para>
-
- <para>Skeleton Layout of a kernel module</para>
-
-<programlisting>/*
- * KLD Skeleton
- * Inspired by Andrew Reiter's Daemonnews article
- */
-
-#include &lt;sys/types.h&gt;
-#include &lt;sys/module.h&gt;
-#include &lt;sys/systm.h&gt; /* uprintf */
-#include &lt;sys/errno.h&gt;
-#include &lt;sys/param.h&gt; /* defines used in kernel.h */
-#include &lt;sys/kernel.h&gt; /* types used in module initialization */
-
-/*
- * Load handler that deals with the loading and unloading of a KLD.
- */
-
-static int
-skel_loader(struct module *m, int what, void *arg)
-{
- int err = 0;
-
- switch (what) {
- case MOD_LOAD: /* kldload */
- uprintf("Skeleton KLD loaded.\n");
- break;
- case MOD_UNLOAD:
- uprintf("Skeleton KLD unloaded.\n");
- break;
- default:
- err = EINVAL;
- break;
- }
- return(err);
-}
-
-/* Declare this module to the rest of the kernel */
-
-static moduledata_t skel_mod = {
- "skel",
- skel_loader,
- NULL
-};
-
-DECLARE_MODULE(skeleton, skel_mod, SI_SUB_KLD, SI_ORDER_ANY);</programlisting>
-
-
- <sect2>
- <title>Makefile</title>
-
- <para>FreeBSD provides a makefile include that you can use to
- quickly compile your kernel addition.</para>
-
- <programlisting>SRCS=skeleton.c
-KMOD=skeleton
-
-.include &lt;bsd.kmod.mk&gt;</programlisting>
-
- <para>Simply running <command>make</command> with this makefile
- will create a file <filename>skeleton.ko</filename> that can
- be loaded into your system by typing :
-<screen> &prompt.root
- kldload -v ./skeleton.ko</screen>
- </para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Accessing a device driver</title>
-
- <para>Unix provides a common set of system calls for user
- applications to use. The upper layers of the kernel dispatch
- these calls to the corresponding device driver when a user
- accesses a device node. The <command>/dev/MAKEDEV</command>
- script makes most of the device nodes for your system but if you
- are doing your own driver development it may be necessary to
- create your own device nodes with <command>mknod</command>
- </para>
-
- <sect2>
- <title>Creating static device nodes</title>
-
- <para>The <command>mknod</command> command requires four
- arguments to create a device node. You must specify the name
- of this device node, the type of device, the major number of
- the device, and the minor number of the device.</para>
- </sect2>
-
- <sect2>
- <title>Dynamic device nodes</title>
-
- <para>The device filesystem, or devfs, provides access to the
- kernel's device namespace in the global filesystem namespace.
- This eliminates the problems of potentially having a device
- driver without a static device node, or a device node without
- an installed device driver. Devfs is still a work in
- progress, but it is already working quite nice.</para>
- </sect2>
-
- </sect1>
-
- <sect1>
- <title>Character Devices</title>
-
- <para>A character device driver is one that transfers data
- directly to and from a user process. This is the most common
- type of device driver and there are plenty of simple examples in
- the source tree.</para>
-
- <para>This simple example pseudo-device remembers whatever values
- you write to it and can then supply them back to you when you
- read from it.</para>
-
- <programlisting>/*
- * Simple `echo' pseudo-device KLD
- *
- * Murray Stokely
- */
-
-#define MIN(a,b) (((a) < (b)) ? (a) : (b))
-
-#include &lt;sys/types.h&gt;
-#include &lt;sys/module.h&gt;
-#include &lt;sys/systm.h&gt; /* uprintf */
-#include &lt;sys/errno.h&gt;
-#include &lt;sys/param.h&gt; /* defines used in kernel.h */
-#include &lt;sys/kernel.h&gt; /* types used in module initialization */
-#include &lt;sys/conf.h&gt; /* cdevsw struct */
-#include &lt;sys/uio.h&gt; /* uio struct */
-#include &lt;sys/malloc.h&gt;
-
-#define BUFFERSIZE 256
-
-/* Function prototypes */
-d_open_t echo_open;
-d_close_t echo_close;
-d_read_t echo_read;
-d_write_t echo_write;
-
-/* Character device entry points */
-static struct cdevsw echo_cdevsw = {
- echo_open,
- echo_close,
- echo_read,
- echo_write,
- noioctl,
- nopoll,
- nommap,
- nostrategy,
- "echo",
- 33, /* reserved for lkms - /usr/src/sys/conf/majors */
- nodump,
- nopsize,
- D_TTY,
- -1
-};
-
-typedef struct s_echo {
- char msg[BUFFERSIZE];
- int len;
-} t_echo;
-
-/* vars */
-static dev_t sdev;
-static int len;
-static int count;
-static t_echo *echomsg;
-
-MALLOC_DECLARE(M_ECHOBUF);
-MALLOC_DEFINE(M_ECHOBUF, "echobuffer", "buffer for echo module");
-
-/*
- * This function acts is called by the kld[un]load(2) system calls to
- * determine what actions to take when a module is loaded or unloaded.
- */
-
-static int
-echo_loader(struct module *m, int what, void *arg)
-{
- int err = 0;
-
- switch (what) {
- case MOD_LOAD: /* kldload */
- sdev = make_dev(<literal>&</literal>echo_cdevsw,
- 0,
- UID_ROOT,
- GID_WHEEL,
- 0600,
- "echo");
- /* kmalloc memory for use by this driver */
- /* malloc(256,M_ECHOBUF,M_WAITOK); */
- MALLOC(echomsg, t_echo *, sizeof(t_echo), M_ECHOBUF, M_WAITOK);
- printf("Echo device loaded.\n");
- break;
- case MOD_UNLOAD:
- destroy_dev(sdev);
- FREE(echomsg,M_ECHOBUF);
- printf("Echo device unloaded.\n");
- break;
- default:
- err = EINVAL;
- break;
- }
- return(err);
-}
-
-int
-echo_open(dev_t dev, int oflags, int devtype, struct proc *p)
-{
- int err = 0;
-
- uprintf("Opened device \"echo\" successfully.\n");
- return(err);
-}
-
-int
-echo_close(dev_t dev, int fflag, int devtype, struct proc *p)
-{
- uprintf("Closing device \"echo.\"\n");
- return(0);
-}
-
-/*
- * The read function just takes the buf that was saved via
- * echo_write() and returns it to userland for accessing.
- * uio(9)
- */
-
-int
-echo_read(dev_t dev, struct uio *uio, int ioflag)
-{
- int err = 0;
- int amt;
-
- /* How big is this read operation? Either as big as the user wants,
- or as big as the remaining data */
- amt = MIN(uio->uio_resid, (echomsg->len - uio->uio_offset > 0) ? echomsg->len - uio->uio_offset : 0);
- if ((err = uiomove(echomsg->msg + uio->uio_offset,amt,uio)) != 0) {
- uprintf("uiomove failed!\n");
- }
-
- return err;
-}
-
-/*
- * echo_write takes in a character string and saves it
- * to buf for later accessing.
- */
-
-int
-echo_write(dev_t dev, struct uio *uio, int ioflag)
-{
- int err = 0;
-
- /* Copy the string in from user memory to kernel memory */
- err = copyin(uio->uio_iov->iov_base, echomsg->msg, MIN(uio->uio_iov->iov_len,BUFFERSIZE));
-
- /* Now we need to null terminate */
- *(echomsg->msg + MIN(uio->uio_iov->iov_len,BUFFERSIZE)) = 0;
- /* Record the length */
- echomsg->len = MIN(uio->uio_iov->iov_len,BUFFERSIZE);
-
- if (err != 0) {
- uprintf("Write failed: bad address!\n");
- }
-
- count++;
- return(err);
-}
-
-DEV_MODULE(echo,echo_loader,NULL);</programlisting>
-
- <para>To install this driver you will first need to make a node on
- your filesystem with a command such as : </para>
-
- <screen>&prompt.root mknod /dev/echo c 33 0</screen>
-
- <para>With this driver loaded you should now be able to type
- something like :</para>
-
- <screen>&prompt.root echo -n "Test Data" > /dev/echo
-&prompt.root cat /dev/echo
-Test Data</screen>
-
- <para>Real hardware devices in the next chapter..</para>
-
- <para>Additional Resources
- <itemizedlist>
- <listitem><simpara><ulink
- url="http://www.daemonnews.org/200010/blueprints.html">Dynamic
- Kernel Linker (KLD) Facility Programming Tutorial</ulink> -
- <ulink url="http://www.daemonnews.org">Daemonnews</ulink> October 2000</simpara></listitem>
- <listitem><simpara><ulink
- url="http://www.daemonnews.org/200007/newbus-intro.html">How
- to Write Kernel Drivers with NEWBUS</ulink> - <ulink
- url="http://www.daemonnews.org">Daemonnews</ulink> July
- 2000</simpara></listitem>
- </itemizedlist>
- </para>
- </sect1>
-
- <sect1>
- <title>Network Drivers</title>
-
- <para>Drivers for network devices do not use device nodes in order
- to be accessed. Their selection is based on other decisions
- made inside the kernel and instead of calling open(), use of a
- network device is generally introduced by using the system call
- socket(2).</para>
-
- <para>man ifnet(), loopback device, Bill Paul's drivers,
- etc..</para>
-
- </sect1>
-
-</chapter>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-declaration: "../chapter.decl"
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- sgml-parent-document: ("../book.sgml" "part" "chapter")
- End:
--->
diff --git a/en_US.ISO8859-1/books/developers-handbook/introduction/chapter.sgml b/en_US.ISO8859-1/books/developers-handbook/introduction/chapter.sgml
deleted file mode 100644
index 9416e4c746..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/introduction/chapter.sgml
+++ /dev/null
@@ -1,226 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD: doc/en_US.ISO8859-1/books/developers-handbook/introduction/chapter.sgml,v 1.3 2001/08/13 06:38:59 jim Exp $
--->
-
-<chapter id="introduction">
- <chapterinfo>
- <authorgroup>
- <author>
- <firstname>Murray</firstname>
- <surname>Stokely</surname>
- <contrib>This chapter was written by </contrib>
- </author>
- <author>
- <firstname>Jeroen</firstname>
- <surname>Ruigrok van der Werven</surname>
- </author>
- </authorgroup>
- </chapterinfo>
- <title>Introduction</title>
-
- <sect1>
- <title>Developing on FreeBSD</title>
-
- <para>So here we are. System all installed and you are ready to
- start programming. But where to start? What does FreeBSD
- provide? What can it do for me, as a programmer?</para>
-
- <para>These are some questions which this chapter tries to answer.
- Of course, programming has different levels of proficiency like
- any other trade. For some it is a hobby, for others it is their
- profession. The information in this chapter might be more aimed
- towards the beginning programmer, but may also serve to be
- useful for the programmer setting her first steps on the FreeBSD
- platform.</para>
-
- </sect1>
-
- <sect1>
- <title>The BSD Vision</title>
-
- <para>To produce the best UNIX-like operating system package
- possible, with due respect to the original software tools
- ideology as well as useability, performance and
- stability.</para>
- </sect1>
-
- <sect1>
- <title>Architectural Guidelines</title>
-
- <para>Our idealogy can be described by the following
- guidelines</para>
-
- <itemizedlist>
-
- <listitem><para>Do not add new functionality unless an
- implementor cannot complete a real application without
- it.</para></listitem>
-
- <listitem><para>It is as important to decide what a system is
- not as to decide what it is. Do not serve all the world's
- needs; rather, make the system extensible so that additional
- needs can be met in an upwardly compatible
- fashion.</para></listitem>
-
- <listitem><para>The only thing worse than generalizing from one
- example is generalizing from no examples at
- all. </para></listitem>
-
- <listitem><para>If a problem is not completely understood, it is
- probably best to provide no solution at all.</para></listitem>
-
- <listitem><para>If you can get 90 percent of the desired effect
- for 10 percent of the work, use the simpler
- solution.</para></listitem>
-
- <listitem><para>Isolate complexity as much as
- possible.</para></listitem>
-
- <listitem><para>Provide mechanism, rather than policy. In
- particular, place user interface policy in the client's
- hands.</para></listitem>
-
- </itemizedlist>
-
- <para>From Scheifler & Gettys: "X Window System"</para>
-
- </sect1>
-
- <sect1>
- <title>The Layout of
- <filename class="directory">/usr/src</filename></title>
-
- <para>The complete source code to FreeBSD is available from our
- public CVS repository. The source code is normally installed in
- <filename class=directory>/usr/src</filename> which contains the
- following subdirectories.</para>
-
- <para>
- <informaltable frame="none">
- <tgroup cols="2">
- <thead>
- <row>
- <entry>Directory</entry>
- <entry>Description</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry><filename class=directory>bin/</filename></entry>
- <entry>Source for files in
- <filename>/bin</filename></entry>
- </row>
-
- <row>
- <entry><filename class=directory>contrib/</filename></entry>
- <entry>Source for files from contributed software.</entry>
- </row>
-
- <row>
- <entry><filename class=directory>crypto/</filename></entry>
- <entry>DES source</entry>
- </row>
-
- <row>
- <entry><filename class=directory>etc/</filename></entry>
- <entry>Source for files in <filename
- class=directory>/etc</filename></entry>
- </row>
-
- <row>
- <entry><filename class=directory>games/</filename></entry>
- <entry>Source for files in <filename
- class=directory>/usr/games</filename></entry>
- </row>
-
- <row>
- <entry><filename class=directory>gnu/</filename></entry>
- <entry>Utilities covered by the GNU Public License</entry>
- </row>
-
- <row>
- <entry><filename class=directory>include/</filename></entry>
- <entry>Source for files in <filename
- class=directory>/usr/include</filename></entry>
- </row>
-
- <row>
- <entry><filename
- class=directory>kerberosIV/</filename></entry>
- <entry>Source for Kerbereros version IV</entry>
- </row>
-
- <row>
- <entry><filename
- class=directory>kerberos5/</filename></entry>
- <entry>Source for Kerbereros version 5</entry>
- </row>
-
- <row>
- <entry><filename class=directory>lib/</filename></entry>
- <entry>Source for files in <filename
- class=directory>/usr/lib</filename></entry>
- </row>
-
- <row>
- <entry><filename class=directory>libexec/</filename></entry>
- <entry>Source for files in <filename
- class=directory>/usr/libexec</filename></entry>
- </row>
-
- <row>
- <entry><filename
- class=directory>release/</filename></entry>
- <entry>Files required to produce a FreeBSD release</entry>
- </row>
-
- <row>
- <entry><filename class=directory>sbin/</filename></entry>
- <entry>Source for files in <filename
- class=directory>/sbin</filename></entry>
- </row>
-
- <row>
- <entry><filename class=directory>secure/</filename></entry>
- <entry>FreeSec sources</entry>
- </row>
-
- <row>
- <entry><filename class=directory>share/</filename></entry>
- <entry>Source for files in <filename
- class=directory>/usr/share</filename></entry>
- </row>
-
- <row>
- <entry><filename class=directory>sys/</filename></entry>
- <entry>Kernel source files</entry>
- </row>
-
- <row>
- <entry><filename class=directory>tools/</filename></entry>
- <entry>Tools used for maintenance and testing of
- FreeBSD</entry>
- </row>
-
- <row>
- <entry><filename
- class=directory>usr.bin/</filename></entry>
- <entry>Source for files in <filename
- class=directory>/usr/bin</filename></entry>
- </row>
-
- <row>
- <entry><filename
- class=directory>usr.sbin/</filename></entry>
- <entry>Source for files in <filename
- class=directory>/usr/sbin</filename></entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </para>
- </sect1>
-</chapter>
diff --git a/en_US.ISO8859-1/books/developers-handbook/ipv6/chapter.sgml b/en_US.ISO8859-1/books/developers-handbook/ipv6/chapter.sgml
deleted file mode 100644
index 0210d7ab45..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/ipv6/chapter.sgml
+++ /dev/null
@@ -1,1587 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD: doc/en_US.ISO8859-1/books/developers-handbook/ipv6/chapter.sgml,v 1.3 2001/07/17 20:51:49 chern Exp $
--->
-
-<chapter id="ipv6">
- <title>IPv6 Internals</title>
-
- <sect1 id="ipv6-implementation">
- <title>IPv6/IPsec Implementation</title>
-
- <para><emphasis>Contributed by &a.shin;, 5 March
- 2000.</emphasis></para>
-
- <para>This section should explain IPv6 and IPsec related implementation
- internals. These functionalities are derived from <ulink
- url="http://www.kame.net">KAME project</ulink></para>
-
- <sect2 id="ipv6details">
- <title>IPv6</title>
-
- <sect3>
- <title>Conformance</title>
-
- <para>The IPv6 related functions conforms, or tries to conform to
- the latest set of IPv6 specifications. For future reference we list
- some of the relevant documents below (<emphasis>NOTE</emphasis>: this
- is not a complete list - this is too hard to maintain...).</para>
-
- <para>For details please refer to specific chapter in the document,
- RFCs, manpages, or comments in the source code.</para>
-
- <para>Conformance tests have been performed on the KAME STABLE kit
- at TAHI project. Results can be viewed at <ulink
- url="http://www.tahi.org/report/KAME/">http://www.tahi.org/report/KAME/
- </ulink>. We also attended Univ. of New Hampshire IOL tests (<ulink
- url="http://www.iol.unh.edu/">http://www.iol.unh.edu/</ulink>) in the
- past, with our past snapshots.</para>
-
- <itemizedlist>
- <listitem>
- <para>RFC1639: FTP Operation Over Big Address Records
- (FOOBAR)</para>
- <itemizedlist>
- <listitem>
- <para>RFC2428 is preferred over RFC1639. FTP clients will
- first try RFC2428, then RFC1639 if failed.</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para>RFC1886: DNS Extensions to support IPv6</para>
- </listitem>
-
- <listitem>
- <para>RFC1933: Transition Mechanisms for IPv6 Hosts and
- Routers</para>
- <itemizedlist>
- <listitem>
- <para>IPv4 compatible address is not supported.</para>
- </listitem>
- <listitem>
- <para>automatic tunneling (described in 4.3 of this RFC) is not
- supported.</para>
- </listitem>
- <listitem>
- <para>&man.gif.4; interface implements IPv[46]-over-IPv[46]
- tunnel in a generic way, and it covers "configured tunnel"
- described in the spec. See <link linkend="gif">23.5.1.5</link>
- in this document for details.</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para>RFC1981: Path MTU Discovery for IPv6</para>
- </listitem>
-
- <listitem>
- <para>RFC2080: RIPng for IPv6</para>
- <itemizedlist>
- <listitem>
- <para>usr.sbin/route6d support this.</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para>RFC2292: Advanced Sockets API for IPv6</para>
- <itemizedlist>
- <listitem>
- <para>For supported library functions/kernel APIs, see
- <filename>sys/netinet6/ADVAPI</filename>.</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para>RFC2362: Protocol Independent Multicast-Sparse
- Mode (PIM-SM)</para>
- <itemizedlist>
- <listitem>
- <para>RFC2362 defines packet formats for PIM-SM.
- <filename>draft-ietf-pim-ipv6-01.txt</filename> is
- written based on this.</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para>RFC2373: IPv6 Addressing Architecture</para>
- <itemizedlist>
- <listitem>
- <para>supports node required addresses, and conforms to
- the scope requirement.</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para>RFC2374: An IPv6 Aggregatable Global Unicast Address
- Format</para>
- <itemizedlist>
- <listitem>
- <para>supports 64-bit length of Interface ID.</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para>RFC2375: IPv6 Multicast Address Assignments</para>
- <itemizedlist>
- <listitem>
- <para>Userland applications use the well-known addresses
- assigned in the RFC.</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para>RFC2428: FTP Extensions for IPv6 and NATs</para>
- <itemizedlist>
- <listitem>
- <para>RFC2428 is preferred over RFC1639. FTP clients will
- first try RFC2428, then RFC1639 if failed.</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para>RFC2460: IPv6 specification</para>
- </listitem>
-
- <listitem>
- <para>RFC2461: Neighbor discovery for IPv6</para>
- <itemizedlist>
- <listitem>
- <para>See <link linkend="neighbor-discovery">23.5.1.2</link>
- in this document for details.</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para>RFC2462: IPv6 Stateless Address Autoconfiguration</para>
- <itemizedlist>
- <listitem>
- <para>See <link linkend="ipv6-pnp">23.5.1.4</link> in this
- document for details.</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para>RFC2463: ICMPv6 for IPv6 specification</para>
- <itemizedlist>
- <listitem>
- <para>See <link linkend="icmpv6">23.5.1.9</link> in this
- document for details.</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para>RFC2464: Transmission of IPv6 Packets over Ethernet
- Networks</para>
- </listitem>
-
- <listitem>
- <para>RFC2465: MIB for IPv6: Textual Conventions and General
- Group</para>
- <itemizedlist>
- <listitem>
- <para>Necessary statistics are gathered by the kernel. Actual
- IPv6 MIB support is provided as a patchkit for ucd-snmp.</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para>RFC2466: MIB for IPv6: ICMPv6 group</para>
- <itemizedlist>
- <listitem>
- <para>Necessary statistics are gathered by the kernel. Actual
- IPv6 MIB support is provided as patchkit for ucd-snmp.</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para>RFC2467: Transmission of IPv6 Packets over FDDI
- Networks</para>
- </listitem>
-
- <listitem>
- <para>RFC2497: Transmission of IPv6 packet over ARCnet
- Networks</para>
- </listitem>
-
- <listitem>
- <para>RFC2553: Basic Socket Interface Extensions for IPv6</para>
- <itemizedlist>
- <listitem>
- <para>IPv4 mapped address (3.7) and special behavior of IPv6
- wildcard bind socket (3.8) are supported. See <link
- linkend="ipv6-wildcard-socket">23.5.1.12</link>
- in this document for details.</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para>RFC2675: IPv6 Jumbograms</para>
- <itemizedlist>
- <listitem>
- <para>See <link linkend="ipv6-jumbo">23.5.1.7</link> in
- this document for details.</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para>RFC2710: Multicast Listener Discovery for IPv6</para>
- </listitem>
-
- <listitem>
- <para>RFC2711: IPv6 router alert option</para>
- </listitem>
-
- <listitem>
- <para><filename>draft-ietf-ipngwg-router-renum-08</filename>: Router
- renumbering for IPv6</para>
- </listitem>
-
- <listitem>
- <para><filename>draft-ietf-ipngwg-icmp-namelookups-02</filename>:
- IPv6 Name Lookups Through ICMP</para>
- </listitem>
-
- <listitem>
- <para><filename>draft-ietf-ipngwg-icmp-name-lookups-03</filename>:
- IPv6 Name Lookups Through ICMP</para>
- </listitem>
-
- <listitem>
- <para><filename>draft-ietf-pim-ipv6-01.txt</filename>:
- PIM for IPv6</para>
- <itemizedlist>
- <listitem>
- <para>&man.pim6dd.8; implements dense mode. &man.pim6sd.8;
- implements sparse mode.</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para><filename>draft-itojun-ipv6-tcp-to-anycast-00</filename>:
- Disconnecting TCP connection toward IPv6 anycast address</para>
- </listitem>
-
- <listitem>
- <para><filename>draft-yamamoto-wideipv6-comm-model-00</filename>
- </para>
- <itemizedlist>
- <listitem>
- <para>See <link linkend="ipv6-sas">23.5.1.6</link> in this
- document for details.</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para><filename>draft-ietf-ipngwg-scopedaddr-format-00.txt
- </filename>: An Extension of Format for IPv6 Scoped
- Addresses</para>
- </listitem>
- </itemizedlist>
- </sect3>
-
- <sect3 id="neighbor-discovery">
- <title>Neighbor Discovery</title>
-
- <para>Neighbor Discovery is fairly stable. Currently Address
- Resolution, Duplicated Address Detection, and Neighbor Unreachability
- Detection are supported. In the near future we will be adding Proxy
- Neighbor Advertisement support in the kernel and Unsolicited Neighbor
- Advertisement transmission command as admin tool.</para>
-
- <para>If DAD fails, the address will be marked "duplicated" and
- message will be generated to syslog (and usually to console). The
- "duplicated" mark can be checked with &man.ifconfig.8;. It is
- administrators' responsibility to check for and recover from DAD
- failures. The behavior should be improved in the near future.</para>
-
- <para>Some of the network driver loops multicast packets back to itself,
- even if instructed not to do so (especially in promiscuous mode).
- In such cases DAD may fail, because DAD engine sees inbound NS packet
- (actually from the node itself) and considers it as a sign of duplicate.
- You may want to look at #if condition marked "heuristics" in
- sys/netinet6/nd6_nbr.c:nd6_dad_timer() as workaround (note that the code
- fragment in "heuristics" section is not spec conformant).</para>
-
- <para>Neighbor Discovery specification (RFC2461) does not talk about
- neighbor cache handling in the following cases:</para>
-
- <orderedlist>
- <listitem>
- <para>when there was no neighbor cache entry, node
- received unsolicited RS/NS/NA/redirect packet without
- link-layer address</para>
- </listitem>
- <listitem>
- <para>neighbor cache handling on medium without link-layer
- address (we need a neighbor cache entry for IsRouter bit)</para>
- </listitem>
- </orderedlist>
-
- <para>For first case, we implemented workaround based on discussions
- on IETF ipngwg mailing list. For more details, see the comments in
- the source code and email thread started from (IPng 7155), dated
- Feb 6 1999.</para>
-
- <para>IPv6 on-link determination rule (RFC2461) is quite different
- from assumptions in BSD network code. At this moment, no on-link
- determination rule is supported where default router list is empty
- (RFC2461, section 5.2, last sentence in 2nd paragraph - note that
- the spec misuse the word "host" and "node" in several places in
- the section).</para>
-
- <para>To avoid possible DoS attacks and infinite loops, only 10
- options on ND packet is accepted now. Therefore, if you have 20
- prefix options attached to RA, only the first 10 prefixes will be
- recognized. If this troubles you, please ask it on FREEBSD-CURRENT
- mailing list and/or modify nd6_maxndopt in
- <filename>sys/netinet6/nd6.c</filename>. If there are high demands
- we may provide sysctl knob for the variable.</para>
- </sect3>
-
- <sect3 id="ipv6-scope-index">
- <title>Scope Index</title>
-
- <para>IPv6 uses scoped addresses. Therefore, it is very important to
- specify scope index (interface index for link-local address, or
- site index for site-local address) with an IPv6 address. Without
- scope index, scoped IPv6 address is ambiguous to the kernel, and
- kernel will not be able to determine the outbound interface for a
- packet.</para>
-
- <para>Ordinary userland applications should use advanced API
- (RFC2292) to specify scope index, or interface index. For similar
- purpose, sin6_scope_id member in sockaddr_in6 structure is defined
- in RFC2553. However, the semantics for sin6_scope_id is rather vague.
- If you care about portability of your application, we suggest you to
- use advanced API rather than sin6_scope_id.</para>
-
- <para>In the kernel, an interface index for link-local scoped address is
- embedded into 2nd 16bit-word (3rd and 4th byte) in IPv6 address. For
- example, you may see something like:
- </para>
-
- <screen> fe80:1::200:f8ff:fe01:6317
- </screen>
-
- <para>in the routing table and interface address structure (struct
- in6_ifaddr). The address above is a link-local unicast address
- which belongs to a network interface whose interface identifier is 1.
- The embedded index enables us to identify IPv6 link local
- addresses over multiple interfaces effectively and with only a
- little code change.</para>
-
- <para>Routing daemons and configuration programs, like &man.route6d.8;
- and &man.ifconfig.8;, will need to manipulate the "embedded" scope
- index. These programs use routing sockets and ioctls (like
- SIOCGIFADDR_IN6) and the kernel API will return IPv6 addresses with
- 2nd 16bit-word filled in. The APIs are for manipulating kernel
- internal structure. Programs that use these APIs have to be prepared
- about differences in kernels anyway.</para>
-
- <para>When you specify scoped address to the command line, NEVER write
- the embedded form (such as ff02:1::1 or fe80:2::fedc). This is not
- supposed to work. Always use standard form, like ff02::1 or
- fe80::fedc, with command line option for specifying interface (like
- <command>ping6 -I ne0 ff02::1</command>). In general, if a command
- does not have command line option to specify outgoing interface, that
- command is not ready to accept scoped address. This may seem to be
- opposite from IPv6's premise to support "dentist office" situation.
- We believe that specifications need some improvements for this.</para>
-
- <para>Some of the userland tools support extended numeric IPv6 syntax,
- as documented in
- <filename>draft-ietf-ipngwg-scopedaddr-format-00.txt</filename>. You
- can specify outgoing link, by using name of the outgoing interface
- like "fe80::1%ne0". This way you will be able to specify link-local
- scoped address without much trouble.</para>
-
- <para>To use this extension in your program, you'll need to use
- &man.getaddrinfo.3;, and &man.getnameinfo.3; with NI_WITHSCOPEID.
- The implementation currently assumes 1-to-1 relationship between a
- link and an interface, which is stronger than what specs say.</para>
- </sect3>
-
- <sect3 id="ipv6-pnp">
- <title>Plug and Play</title>
-
- <para>Most of the IPv6 stateless address autoconfiguration is implemented
- in the kernel. Neighbor Discovery functions are implemented in the
- kernel as a whole. Router Advertisement (RA) input for hosts is
- implemented in the kernel. Router Solicitation (RS) output for
- endhosts, RS input for routers, and RA output for routers are
- implemented in the userland.</para>
-
- <sect4>
- <title>Assignment of link-local, and special addresses</title>
-
- <para>IPv6 link-local address is generated from IEEE802 address
- (Ethernet MAC address). Each of interface is assigned an IPv6
- link-local address automatically, when the interface becomes up
- (IFF_UP). Also, direct route for the link-local address is added
- to routing table.</para>
-
- <para>Here is an output of netstat command:</para>
-
-<screen>Internet6:
-Destination Gateway Flags Netif Expire
-fe80:1::%ed0/64 link#1 UC ed0
-fe80:2::%ep0/64 link#2 UC ep0</screen>
-
- <para>Interfaces that has no IEEE802 address (pseudo interfaces
- like tunnel interfaces, or ppp interfaces) will borrow IEEE802
- address from other interfaces, such as Ethernet interfaces,
- whenever possible. If there is no IEEE802 hardware attached,
- last-resort pseudorandom value, which is from MD5(hostname), will
- be used as source of link-local address. If it is not suitable
- for your usage, you will need to configure the link-local address
- manually.</para>
-
- <para>If an interface is not capable of handling IPv6 (such as
- lack of multicast support), link-local address will not be
- assigned to that interface. See section 2 for details.</para>
-
- <para>Each interface joins the solicited multicast address and the
- link-local all-nodes multicast addresses (e.g. fe80::1:ff01:6317
- and ff02::1, respectively, on the link the interface is attached).
- In addition to a link-local address, the loopback address (::1)
- will be assigned to the loopback interface. Also, ::1/128 and
- ff01::/32 are automatically added to routing table, and loopback
- interface joins node-local multicast group ff01::1.</para>
- </sect4>
-
- <sect4>
- <title>Stateless address autoconfiguration on hosts</title>
-
- <para>In IPv6 specification, nodes are separated into two categories:
- <emphasis>routers</emphasis> and <emphasis>hosts</emphasis>. Routers
- forward packets addressed to others, hosts does not forward the
- packets. net.inet6.ip6.forwarding defines whether this node is
- router or host (router if it is 1, host if it is 0).</para>
-
- <para>When a host hears Router Advertisement from the router, a host
- may autoconfigure itself by stateless address autoconfiguration.
- This behavior can be controlled by net.inet6.ip6.accept_rtadv (host
- autoconfigures itself if it is set to 1). By autoconfiguration,
- network address prefix for the receiving interface (usually global
- address prefix) is added. Default route is also configured.
- Routers periodically generate Router Advertisement packets. To
- request an adjacent router to generate RA packet, a host can
- transmit Router Solicitation. To generate a RS packet at any time,
- use the <emphasis>rtsol</emphasis> command. &man.rtsold.8; daemon is
- also available. &man.rtsold.8; generates Router Solicitation whenever
- necessary, and it works great for nomadic usage (notebooks/laptops).
- If one wishes to ignore Router Advertisements, use sysctl to set
- net.inet6.ip6.accept_rtadv to 0.</para>
-
- <para>To generate Router Advertisement from a router, use the
- &man.rtadvd.8 daemon.</para>
-
- <para>Note that, IPv6 specification assumes the following items, and
- nonconforming cases are left unspecified:</para>
-
- <itemizedlist>
- <listitem>
- <para>Only hosts will listen to router advertisements</para>
- </listitem>
- <listitem>
- <para>Hosts have single network interface (except loopback)</para>
- </listitem>
- </itemizedlist>
-
- <para>Therefore, this is unwise to enable net.inet6.ip6.accept_rtadv
- on routers, or multi-interface host. A misconfigured node can
- behave strange (nonconforming configuration allowed for those who
- would like to do some experiments).</para>
-
- <para>To summarize the sysctl knob:</para>
-
- <screen> accept_rtadv forwarding role of the node
- --- --- ---
- 0 0 host (to be manually configured)
- 0 1 router
- 1 0 autoconfigured host
- (spec assumes that host has single
- interface only, autoconfigured host
- with multiple interface is
- out-of-scope)
- 1 1 invalid, or experimental
- (out-of-scope of spec)</screen>
-
- <para>RFC2462 has validation rule against incoming RA prefix
- information option, in 5.5.3 (e). This is to protect hosts from
- malicious (or misconfigured) routers that advertise very short
- prefix lifetime. There was an update from Jim Bound to ipngwg
- mailing list (look for "(ipng 6712)" in the archive) and it is
- implemented Jim's update.</para>
-
- <para>See <link linkend="neighbor-discovery">23.5.1.2</link> in
- the document for relationship between DAD and
- autoconfiguration.</para>
- </sect4>
- </sect3>
-
- <sect3 id="gif">
- <title>Generic tunnel interface</title>
-
- <para>GIF (Generic InterFace) is a pseudo interface for configured
- tunnel. Details are described in &man.gif.4;. Currently</para>
-
- <itemizedlist>
- <listitem>
- <para>v6 in v6</para>
- </listitem>
- <listitem>
- <para>v6 in v4</para>
- </listitem>
- <listitem>
- <para>v4 in v6</para>
- </listitem>
- <listitem>
- <para>v4 in v4</para>
- </listitem>
- </itemizedlist>
-
- <para>are available. Use &man.gifconfig.8; to assign physical (outer)
- source and destination address to gif interfaces. Configuration that
- uses same address family for inner and outer IP header (v4 in v4, or
- v6 in v6) is dangerous. It is very easy to configure interfaces and
- routing tables to perform infinite level of tunneling.
- <emphasis>Please be warned</emphasis>.</para>
-
- <para>gif can be configured to be ECN-friendly. See <link
- linkend="ipsec-ecn">23.5.4.5</link> for ECN-friendliness of
- tunnels, and &man.gif.4; for how to configure.</para>
-
- <para>If you would like to configure an IPv4-in-IPv6 tunnel with gif
- interface, read &man.gif.4; carefully. You will need to
- remove IPv6 link-local address automatically assigned to the gif
- interface.</para>
- </sect3>
-
- <sect3 id="ipv6-sas">
- <title>Source Address Selection</title>
-
- <para>Current source selection rule is scope oriented (there are some
- exceptions - see below). For a given destination, a source IPv6
- address is selected by the following rule:</para>
-
- <orderedlist>
- <listitem>
- <para>If the source address is explicitly specified by
- the user (e.g. via the advanced API), the specified address
- is used.</para>
- </listitem>
-
- <listitem>
- <para>If there is an address assigned to the outgoing
- interface (which is usually determined by looking up the
- routing table) that has the same scope as the destination
- address, the address is used.</para>
-
- <para>This is the most typical case.</para>
- </listitem>
-
- <listitem>
- <para>If there is no address that satisfies the above
- condition, choose a global address assigned to one of
- the interfaces on the sending node.</para>
- </listitem>
-
- <listitem>
- <para>If there is no address that satisfies the above condition,
- and destination address is site local scope, choose a site local
- address assigned to one of the interfaces on the sending node.
- </para>
- </listitem>
-
- <listitem>
- <para>If there is no address that satisfies the above condition,
- choose the address associated with the routing table entry for the
- destination. This is the last resort, which may cause scope
- violation.</para>
- </listitem>
- </orderedlist>
-
- <para>For instance, ::1 is selected for ff01::1,
- fe80:1::200:f8ff:fe01:6317 for fe80:1::2a0:24ff:feab:839b (note
- that embedded interface index - described in <link
- linkend="ipv6-scope-index">23.5.1.3</link> - helps us
- choose the right source address. Those embedded indices will not
- be on the wire). If the outgoing interface has multiple address for
- the scope, a source is selected longest match basis (rule 3). Suppose
- 3ffe:501:808:1:200:f8ff:fe01:6317 and 3ffe:2001:9:124:200:f8ff:fe01:6317
- are given to the outgoing interface. 3ffe:501:808:1:200:f8ff:fe01:6317
- is chosen as the source for the destination 3ffe:501:800::1.</para>
-
- <para>Note that the above rule is not documented in the IPv6 spec.
- It is considered "up to implementation" item. There are some cases
- where we do not use the above rule. One example is connected TCP
- session, and we use the address kept in tcb as the source. Another
- example is source address for Neighbor Advertisement. Under the spec
- (RFC2461 7.2.2) NA's source should be the target address of the
- corresponding NS's target. In this case we follow the spec rather
- than the above longest-match rule.</para>
-
- <para>For new connections (when rule 1 does not apply), deprecated
- addresses (addresses with preferred lifetime = 0) will not be chosen
- as source address if other choices are available. If no other choices
- are available, deprecated address will be used as a last resort. If
- there are multiple choice of deprecated addresses, the above scope
- rule will be used to choose from those deprecated addresses. If you
- would like to prohibit the use of deprecated address for some reason,
- configure net.inet6.ip6.use_deprecated to 0. The issue related to
- deprecated address is described in RFC2462 5.5.4 (NOTE: there is
- some debate underway in IETF ipngwg on how to use "deprecated"
- address).</para>
- </sect3>
-
- <sect3 id="ipv6-jumbo">
- <title>Jumbo Payload</title>
-
- <para>The Jumbo Payload hop-by-hop option is implemented and can
- be used to send IPv6 packets with payloads longer than 65,535 octets.
- But currently no physical interface whose MTU is more than 65,535 is
- supported, so such payloads can be seen only on the loopback
- interface (i.e. lo0).</para>
-
- <para>If you want to try jumbo payloads, you first have to reconfigure
- the kernel so that the MTU of the loopback interface is more than
- 65,535 bytes; add the following to the kernel configuration file:</para>
-
- <para><literal>
- options "LARGE_LOMTU" #To test jumbo payload
- </literal></para>
-
- <para>and recompile the new kernel.</para>
-
- <para>Then you can test jumbo payloads by the &man.ping6.8; command
- with -b and -s options. The -b option must be specified to enlarge
- the size of the socket buffer and the -s option specifies the length
- of the packet, which should be more than 65,535. For example,
- type as follows:</para>
-
- <para><userinput>
- &prompt.user; <command>ping6 -b 70000 -s 68000 ::1</command>
- </userinput></para>
-
- <para>The IPv6 specification requires that the Jumbo Payload option
- must not be used in a packet that carries a fragment header. If
- this condition is broken, an ICMPv6 Parameter Problem message must
- be sent to the sender. specification is followed, but you cannot
- usually see an ICMPv6 error caused by this requirement.</para>
-
- <para>When an IPv6 packet is received, the frame length is checked and
- compared to the length specified in the payload length field of the
- IPv6 header or in the value of the Jumbo Payload option, if any. If
- the former is shorter than the latter, the packet is discarded and
- statistics are incremented. You can see the statistics as output of
- &man.netstat.8; command with `-s -p ip6' option:</para>
-
- <screen> &prompt.user; <command>netstat -s -p ip6</command>
- ip6:
- (snip)
- 1 with data size < data length</screen>
-
- <para>So, kernel does not send an ICMPv6 error unless the erroneous
- packet is an actual Jumbo Payload, that is, its packet size is more
- than 65,535 bytes. As described above, currently no physical interface
- with such a huge MTU is supported, so it rarely returns an
- ICMPv6 error.</para>
-
- <para>TCP/UDP over jumbogram is not supported at this moment. This
- is because we have no medium (other than loopback) to test this.
- Contact us if you need this.</para>
-
- <para>IPsec does not work on jumbograms. This is due to some
- specification twists in supporting AH with jumbograms (AH header
- size influences payload length, and this makes it real hard to
- authenticate inbound packet with jumbo payload option as well as AH).
- </para>
-
- <para>There are fundamental issues in *BSD support for jumbograms.
- We would like to address those, but we need more time to finalize
- these. To name a few:</para>
-
- <itemizedlist>
- <listitem>
- <para>mbuf pkthdr.len field is typed as "int" in 4.4BSD, so
- it will not hold jumbogram with len &gt; 2G on 32bit architecture
- CPUs. If we would like to support jumbogram properly, the field
- must be expanded to hold 4G + IPv6 header + link-layer header.
- Therefore, it must be expanded to at least int64_t
- (u_int32_t is NOT enough).</para>
- </listitem>
-
- <listitem>
- <para>We mistakingly use "int" to hold packet length in many
- places. We need to convert them into larger integral type.
- It needs a great care, as we may experience overflow during
- packet length computation.</para>
- </listitem>
-
- <listitem>
- <para>We mistakingly check for ip6_plen field of IPv6 header
- for packet payload length in various places. We should be
- checking mbuf pkthdr.len instead. ip6_input() will perform
- sanity check on jumbo payload option on input, and we can
- safely use mbuf pkthdr.len afterwards.</para>
- </listitem>
-
- <listitem>
- <para>TCP code needs a careful update in bunch of places, of
- course.</para>
- </listitem>
- </itemizedlist>
- </sect3>
-
- <sect3>
- <title>Loop prevention in header processing</title>
-
- <para>IPv6 specification allows arbitrary number of extension headers
- to be placed onto packets. If we implement IPv6 packet processing
- code in the way BSD IPv4 code is implemented, kernel stack may
- overflow due to long function call chain. sys/netinet6 code
- is carefully designed to avoid kernel stack overflow. Because of
- this, sys/netinet6 code defines its own protocol switch
- structure, as "struct ip6protosw" (see
- <filename>netinet6/ip6protosw.h</filename>). There is no such
- update to IPv4 part (sys/netinet) for compatibility, but small
- change is added to its pr_input() prototype. So "struct ipprotosw"
- is also defined. Because of this, if you receive IPsec-over-IPv4
- packet with massive number of IPsec headers, kernel stack may blow
- up. IPsec-over-IPv6 is okay. (Off-course, for those all IPsec
- headers to be processed, each such IPsec header must pass each
- IPsec check. So an anonymous attacker won't be able to do such an
- attack.)</para>
- </sect3>
-
- <sect3 id="icmpv6">
- <title>ICMPv6</title>
-
- <para>After RFC2463 was published, IETF ipngwg has decided to
- disallow ICMPv6 error packet against ICMPv6 redirect, to prevent
- ICMPv6 storm on a network medium. This is already implemented
- into the kernel.</para>
- </sect3>
-
- <sect3>
- <title>Applications</title>
-
- <para>For userland programming, we support IPv6 socket API as
- specified in RFC2553, RFC2292 and upcoming Internet drafts.</para>
-
- <para>TCP/UDP over IPv6 is available and quite stable. You can
- enjoy &man.telnet.1;, &man.ftp.1;, &man.rlogin.1;, &man.rsh.1;,
- &man.ssh.1, etc. These applications are protocol independent.
- That is, they automatically chooses IPv4 or IPv6 according to DNS.
- </para>
- </sect3>
-
- <sect3>
- <title>Kernel Internals</title>
-
- <para>While ip_forward() calls ip_output(), ip6_forward() directly
- calls if_output() since routers must not divide IPv6 packets into
- fragments.</para>
-
- <para>ICMPv6 should contain the original packet as long as possible
- up to 1280. UDP6/IP6 port unreach, for instance, should contain
- all extension headers and the *unchanged* UDP6 and IP6 headers.
- So, all IP6 functions except TCP never convert network byte
- order into host byte order, to save the original packet.</para>
-
- <para>tcp_input(), udp6_input() and icmp6_input() can't assume that
- IP6 header is preceding the transport headers due to extension
- headers. So, in6_cksum() was implemented to handle packets whose IP6
- header and transport header is not continuous. TCP/IP6 nor UDP6/IP6
- header structure don't exist for checksum calculation.</para>
-
- <para>To process IP6 header, extension headers and transport headers
- easily, network drivers are now required to store packets in one
- internal mbuf or one or more external mbufs. A typical old driver
- prepares two internal mbufs for 96 - 204 bytes data, however, now
- such packet data is stored in one external mbuf.</para>
-
- <para><command>netstat -s -p ip6</command> tells you whether or not
- your driver conforms such requirement. In the following example,
- "cce0" violates the requirement. (For more information, refer to
- Section 2.)</para>
-
- <screen>Mbuf statistics:
- 317 one mbuf
- two or more mbuf::
- lo0 = 8
- cce0 = 10
- 3282 one ext mbuf
- 0 two or more ext mbuf
- </screen>
-
- <para>Each input function calls IP6_EXTHDR_CHECK in the beginning to
- check if the region between IP6 and its header is continuous.
- IP6_EXTHDR_CHECK calls m_pullup() only if the mbuf has M_LOOP flag,
- that is, the packet comes from the loopback interface. m_pullup()
- is never called for packets coming from physical network interfaces.
- </para>
-
- <para>Both IP and IP6 reassemble functions never call m_pullup().</para>
- </sect3>
-
- <sect3 id="ipv6-wildcard-socket">
- <title>IPv4 mapped address and IPv6 wildcard socket</title>
-
- <para>RFC2553 describes IPv4 mapped address (3.7) and special behavior
- of IPv6 wildcard bind socket (3.8). The spec allows you to:</para>
- <itemizedlist>
- <listitem>
- <para>Accept IPv4 connections by AF_INET6 wildcard bind
- socket.</para>
- </listitem>
- <listitem>
- <para>Transmit IPv4 packet over AF_INET6 socket by using
- special form of the address like ::ffff:10.1.1.1.</para>
- </listitem>
- </itemizedlist>
-
- <para>but the spec itself is very complicated and does not specify
- how the socket layer should behave. Here we call the former one
- "listening side" and the latter one "initiating side", for
- reference purposes.</para>
-
- <para>You can perform wildcard bind on both of the address families,
- on the same port.</para>
-
- <para>The following table show the behavior of FreeBSD 4.x.</para>
-
- <screen>listening side initiating side
- (AF_INET6 wildcard (connection to ::ffff:10.1.1.1)
- socket gets IPv4 conn.)
- --- ---
-FreeBSD 4.x configurable supported
- default: enabled
- </screen>
-
- <para>The following sections will give you more details, and how you can
- configure the behavior.</para>
-
- <para>Comments on listening side:</para>
-
- <para>It looks that RFC2553 talks too little on wildcard bind issue,
- especially on the port space issue, failure mode and relationship
- between AF_INET/INET6 wildcard bind. There can be several separate
- interpretation for this RFC which conform to it but behaves differently.
- So, to implement portable application you should assume nothing
- about the behavior in the kernel. Using &man.getaddrinfo.3; is the
- safest way. Port number space and wildcard bind issues were discussed
- in detail on ipv6imp mailing list, in mid March 1999 and it looks
- that there's no concrete consensus (means, up to implementers).
- You may want to check the mailing list archives.</para>
-
- <para>If a server application would like to accept IPv4 and IPv6
- connections, there will be two alternatives.</para>
-
- <para>One is using AF_INET and AF_INET6 socket (you'll need two
- sockets). Use &man.getaddrinfo.3; with AI_PASSIVE into ai_flags,
- and &man.socket.2; and &man.bind.2; to all the addresses returned.
- By opening multiple sockets, you can accept connections onto the
- socket with proper address family. IPv4 connections will be
- accepted by AF_INET socket, and IPv6 connections will be accepted
- by AF_INET6 socket.</para>
-
- <para>Another way is using one AF_INET6 wildcard bind socket. Use
- &man.getaddrinfo.3; with AI_PASSIVE into ai_flags and with
- AF_INET6 into ai_family, and set the 1st argument hostname to
- NULL. And &man.socket.2; and &man.bind.2; to the address returned.
- (should be IPv6 unspecified addr). You can accept either of IPv4
- and IPv6 packet via this one socket.</para>
-
- <para>To support only IPv6 traffic on AF_INET6 wildcard binded socket
- portably, always check the peer address when a connection is made
- toward AF_INET6 listening socket. If the address is IPv4 mapped
- address, you may want to reject the connection. You can check the
- condition by using IN6_IS_ADDR_V4MAPPED() macro.</para>
-
- <para>To resolve this issue more easily, there is system dependent
- &man.setsockopt.2; option, IPV6_BINDV6ONLY, used like below.</para>
-
- <screen> int on;
-
- setsockopt(s, IPPROTO_IPV6, IPV6_BINDV6ONLY,
- (char *)&amp;on, sizeof (on)) < 0));
- </screen>
-
- <para>When this call succeed, then this socket only receive IPv6
- packets.</para>
-
- <para>Comments on initiating side:</para>
-
- <para>Advise to application implementers: to implement a portable
- IPv6 application (which works on multiple IPv6 kernels), we believe
- that the following is the key to the success:</para>
-
- <itemizedlist>
- <listitem>
- <para>NEVER hardcode AF_INET nor AF_INET6.</para>
- </listitem>
-
- <listitem>
- <para>Use &man.getaddrinfo.3; and &man.getnameinfo.3;
- throughout the system. Never use gethostby*(), getaddrby*(),
- inet_*() or getipnodeby*(). (To update existing applications
- to be IPv6 aware easily, sometime getipnodeby*() will be
- useful. But if possible, try to rewrite the code to use
- &man.getaddrinfo.3; and &man.getnameinfo.3;.)</para>
- </listitem>
-
- <listitem>
- <para>If you would like to connect to destination, use
- &man.getaddrinfo.3; and try all the destination returned,
- like &man.telnet.1; does.</para>
- </listitem>
-
- <listitem>
- <para>Some of the IPv6 stack is shipped with buggy
- &man.getaddrinfo.3;. Ship a minimal working version with
- your application and use that as last resort.</para>
- </listitem>
- </itemizedlist>
-
- <para>If you would like to use AF_INET6 socket for both IPv4 and
- IPv6 outgoing connection, you will need to use &man.getipnodebyname.3;.
- When you would like to update your existing application to be IPv6
- aware with minimal effort, this approach might be chosen. But please
- note that it is a temporal solution, because &man.getipnodebyname.3;
- itself is not recommended as it does not handle scoped IPv6 addresses
- at all. For IPv6 name resolution, &man.getaddrinfo.3; is the
- preferred API. So you should rewrite your application to use
- &man.getaddrinfo.3;, when you get the time to do it.</para>
-
- <para>When writing applications that make outgoing connections,
- story goes much simpler if you treat AF_INET and AF_INET6 as totally
- separate address family. {set,get}sockopt issue goes simpler,
- DNS issue will be made simpler. We do not recommend you to rely
- upon IPv4 mapped address.</para>
-
- <sect4>
- <title>unified tcp and inpcb code</title>
-
- <para>FreeBSD 4.x uses shared tcp code between IPv4 and IPv6
- (from sys/netinet/tcp*) and separate udp4/6 code. It uses
- unified inpcb structure.</para>
-
- <para>The platform can be configured to support IPv4 mapped address.
- Kernel configuration is summarized as follows:</para>
-
- <itemizedlist>
- <listitem>
- <para>By default, AF_INET6 socket will grab IPv4
- connections in certain condition, and can initiate
- connection to IPv4 destination embedded in IPv4 mapped
- IPv6 address.</para>
- </listitem>
-
- <listitem>
- <para>You can disable it on entire system with sysctl like
- below.</para>
-
- <para>
- <command>sysctl -w net.inet6.ip6.mapped_addr=0</command>
- </para>
-
- </listitem>
- </itemizedlist>
-
- <sect5>
- <title>listening side</title>
-
- <para>Each socket can be configured to support special AF_INET6
- wildcard bind (enabled by default). You can disable it on
- each socket basis with &man.setsockopt.2; like below.</para>
-
- <screen> int on;
-
- setsockopt(s, IPPROTO_IPV6, IPV6_BINDV6ONLY,
- (char *)&amp;on, sizeof (on)) < 0));
- </screen>
-
- <para>Wildcard AF_INET6 socket grabs IPv4 connection if and only
- if the following conditions are satisfied:</para>
-
- <itemizedlist>
- <listitem>
- <para>there's no AF_INET socket that matches the IPv4
- connection</para>
- </listitem>
-
- <listitem>
- <para>the AF_INET6 socket is configured to accept IPv4
- traffic, i.e. getsockopt(IPV6_BINDV6ONLY) returns 0.</para>
- </listitem>
- </itemizedlist>
-
- <para>There's no problem with open/close ordering.</para>
- </sect5>
-
- <sect5>
- <title>initiating side</title>
-
- <para>FreeBSD 4.x supports outgoing connection to IPv4 mapped
- address (::ffff:10.1.1.1), if the node is configured to support
- IPv4 mapped address.</para>
- </sect5>
- </sect4>
- </sect3>
-
- <sect3>
- <title>sockaddr_storage</title>
-
- <para>When RFC2553 was about to be finalized, there was discussion on
- how struct sockaddr_storage members are named. One proposal is to
- prepend "__" to the members (like "__ss_len") as they should not be
- touched. The other proposal was that don't prepend it (like "ss_len")
- as we need to touch those members directly. There was no clear
- consensus on it.</para>
-
- <para>As a result, RFC2553 defines struct sockaddr_storage as
- follows:</para>
-
- <screen> struct sockaddr_storage {
- u_char __ss_len; /* address length */
- u_char __ss_family; /* address family */
- /* and bunch of padding */
- };
- </screen>
-
- <para>On the contrary, XNET draft defines as follows:</para>
-
- <screen> struct sockaddr_storage {
- u_char ss_len; /* address length */
- u_char ss_family; /* address family */
- /* and bunch of padding */
- };
- </screen>
-
- <para>In December 1999, it was agreed that RFC2553bis should pick
- the latter (XNET) definition.</para>
-
- <para>Current implementation conforms to XNET definition, based on
- RFC2553bis discussion.</para>
-
- <para>If you look at multiple IPv6 implementations, you will be able
- to see both definitions. As an userland programmer, the most
- portable way of dealing with it is to:</para>
-
- <orderedlist>
- <listitem>
- <para>ensure ss_family and/or ss_len are available on the
- platform, by using GNU autoconf,</para>
- </listitem>
-
- <listitem>
- <para>have -Dss_family=__ss_family to unify all occurrences
- (including header file) into __ss_family, or</para>
- </listitem>
-
- <listitem>
- <para>never touch __ss_family. cast to sockaddr * and use sa_family
- like:</para>
-
- <screen> struct sockaddr_storage ss;
- family = ((struct sockaddr *)&amp;ss)->sa_family
- </screen>
-
- </listitem>
- </orderedlist>
- </sect3>
- </sect2>
-
- <sect2>
- <title>Network Drivers</title>
-
- <para>Now following two items are required to be supported by standard
- drivers:</para>
-
- <orderedlist>
- <listitem>
- <para>mbuf clustering requirement. In this stable release, we
- changed MINCLSIZE into MHLEN+1 for all the operating systems
- in order to make all the drivers behave as we expect.</para>
- </listitem>
-
- <listitem>
- <para>multicast. If &man.ifmcstat.8; yields no multicast group for
- a interface, that interface has to be patched.</para>
- </listitem>
- </orderedlist>
-
- <para>If any of the driver don't support the requirements, then
- the driver can't be used for IPv6 and/or IPsec communication. If
- you find any problem with your card using IPv6/IPsec, then, please
- report it to <email>freebsd-bugs@FreeBSD.org</email>.</para>
-
- <para>(NOTE: In the past we required all PCMCIA drivers to have a
- call to in6_ifattach(). We have no such requirement any more)</para>
- </sect2>
-
- <sect2>
- <title>Translator</title>
-
- <para>We categorize IPv4/IPv6 translator into 4 types:</para>
-
- <itemizedlist>
- <listitem>
- <para><emphasis>Translator A</emphasis> --- It is used in the early
- stage of transition to make it possible to establish a
- connection from an IPv6 host in an IPv6 island to an IPv4 host
- in the IPv4 ocean.</para>
- </listitem>
-
- <listitem>
- <para><emphasis>Translator B</emphasis> --- It is used in the early
- stage of transition to make it possible to establish a connection
- from an IPv4 host in the IPv4 ocean to an IPv6 host in an
- IPv6 island.</para>
- </listitem>
-
- <listitem>
- <para><emphasis>Translator C</emphasis> --- It is used in the late
- stage of transition to make it possible to establish a
- connection from an IPv4 host in an IPv4 island to an IPv6 host
- in the IPv6 ocean.</para>
- </listitem>
-
- <listitem>
- <para><emphasis>Translator D</emphasis> --- It is used in the late
- stage of transition to make it possible to establish a
- connection from an IPv6 host in the IPv6 ocean to an IPv4 host
- in an IPv4 island.</para>
- </listitem>
- </itemizedlist>
-
- <para>TCP relay translator for category A is supported. This is called
- "FAITH". We also provide IP header translator for category A.
- (The latter is not yet put into FreeBSD 4.x yet.)</para>
-
- <sect3>
- <title>FAITH TCP relay translator</title>
-
- <para>FAITH system uses TCP relay daemon called &man.faithd.8; helped
- by the kernel. FAITH will reserve an IPv6 address prefix, and relay
- TCP connection toward that prefix to IPv4 destination.</para>
-
- <para>For example, if the reserved IPv6 prefix is
- 3ffe:0501:0200:ffff::, and the IPv6 destination for TCP connection
- is 3ffe:0501:0200:ffff::163.221.202.12, the connection will be
- relayed toward IPv4 destination 163.221.202.12.</para>
-
- <screen> destination IPv4 node (163.221.202.12)
- ^
- | IPv4 tcp toward 163.221.202.12
- FAITH-relay dual stack node
- ^
- | IPv6 TCP toward 3ffe:0501:0200:ffff::163.221.202.12
- source IPv6 node
- </screen>
-
- <para>&man.faithd.8; must be invoked on FAITH-relay dual stack
- node.</para>
-
- <para>For more details, consult
- <filename>src/usr.sbin/faithd/README</filename></para>
- </sect3>
- </sect2>
-
- <sect2 id="ipsec-implementation">
- <title>IPsec</title>
-
- <para>IPsec is mainly organized by three components.</para>
-
- <orderedlist>
- <listitem>
- <para>Policy Management</para>
- </listitem>
-
- <listitem>
- <para>Key Management</para>
- </listitem>
-
- <listitem>
- <para>AH and ESP handling</para>
- </listitem>
- </orderedlist>
-
- <sect3>
- <title>Policy Management</title>
-
- <para>The kernel implements experimental policy management code.
- There are two way to manage security policy. One is to configure
- per-socket policy using &man.setsockopt.2;. In this cases, policy
- configuration is described in &man.ipsec.set.policy.3;. The other
- is to configure kernel packet filter-based policy using PF_KEY
- interface, via &man.setkey.8;.</para>
-
- <para>The policy entry is not re-ordered with its
- indexes, so the order of entry when you add is very significant.</para>
- </sect3>
-
- <sect3>
- <title>Key Management</title>
-
- <para>The key management code implemented in this kit (sys/netkey)
- is a home-brew PFKEY v2 implementation. This conforms to RFC2367.
- </para>
-
- <para>The home-brew IKE daemon, "racoon" is included in the
- kit (kame/kame/racoon). Basically you'll need to run racoon as
- daemon, then setup a policy to require keys (like
- <command>ping -P 'out ipsec esp/transport//use'</command>).
- The kernel will contact racoon daemon as necessary to exchange
- keys.</para>
- </sect3>
-
- <sect3>
- <title>AH and ESP handling</title>
-
- <para>IPsec module is implemented as "hooks" to the standard IPv4/IPv6
- processing. When sending a packet, ip{,6}_output() checks if ESP/AH
- processing is required by checking if a matching SPD (Security
- Policy Database) is found. If ESP/AH is needed,
- {esp,ah}{4,6}_output() will be called and mbuf will be updated
- accordingly. When a packet is received, {esp,ah}4_input() will be
- called based on protocol number, i.e. (*inetsw[proto])().
- {esp,ah}4_input() will decrypt/check authenticity of the packet,
- and strips off daisy-chained header and padding for ESP/AH. It is
- safe to strip off the ESP/AH header on packet reception, since we
- will never use the received packet in "as is" form.</para>
-
- <para>By using ESP/AH, TCP4/6 effective data segment size will be
- affected by extra daisy-chained headers inserted by ESP/AH. Our
- code takes care of the case.</para>
-
- <para>Basic crypto functions can be found in directory "sys/crypto".
- ESP/AH transform are listed in {esp,ah}_core.c with wrapper functions.
- If you wish to add some algorithm, add wrapper function in
- {esp,ah}_core.c, and add your crypto algorithm code into
- sys/crypto.</para>
-
- <para>Tunnel mode is partially supported in this release, with the
- following restrictions:</para>
-
- <itemizedlist>
- <listitem>
- <para>IPsec tunnel is not combined with GIF generic tunneling
- interface. It needs a great care because we may create an
- infinite loop between ip_output() and tunnelifp->if_output().
- Opinion varies if it is better to unify them, or not.</para>
- </listitem>
-
- <listitem>
- <para>MTU and Don't Fragment bit (IPv4) considerations need more
- checking, but basically works fine.</para>
- </listitem>
-
- <listitem>
- <para>Authentication model for AH tunnel must be revisited.
- We'll need to improve the policy management engine,
- eventually.</para>
- </listitem>
- </itemizedlist>
- </sect3>
-
- <sect3>
- <title>Conformance to RFCs and IDs</title>
-
- <para>The IPsec code in the kernel conforms (or, tries to conform)
- to the following standards:</para>
-
- <para>"old IPsec" specification documented in
- <filename>rfc182[5-9].txt</filename></para>
-
- <para>"new IPsec" specification documented in
- <filename>rfc240[1-6].txt</filename>,
- <filename>rfc241[01].txt</filename>, <filename>rfc2451.txt</filename>
- and <filename>draft-mcdonald-simple-ipsec-api-01.txt</filename>
- (draft expired, but you can take from <ulink
- url="ftp://ftp.kame.net/pub/internet-drafts/">
- ftp://ftp.kame.net/pub/internet-drafts/</ulink>).
- (NOTE: IKE specifications, <filename>rfc241[7-9].txt</filename> are
- implemented in userland, as "racoon" IKE daemon)</para>
-
- <para>Currently supported algorithms are:</para>
- <itemizedlist>
- <listitem>
- <para>old IPsec AH</para>
- <itemizedlist>
- <listitem>
- <para>null crypto checksum (no document, just for
- debugging)</para>
- </listitem>
- <listitem>
- <para>keyed MD5 with 128bit crypto checksum
- (<filename>rfc1828.txt</filename>)</para>
- </listitem>
- <listitem>
- <para>keyed SHA1 with 128bit crypto checksum
- (no document)</para>
- </listitem>
- <listitem>
- <para>HMAC MD5 with 128bit crypto checksum
- (<filename>rfc2085.txt</filename>)</para>
- </listitem>
- <listitem>
- <para>HMAC SHA1 with 128bit crypto checksum
- (no document)</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para>old IPsec ESP</para>
- <itemizedlist>
- <listitem>
- <para>null encryption (no document, similar to
- <filename>rfc2410.txt</filename>)</para>
- </listitem>
- <listitem>
- <para>DES-CBC mode (<filename>rfc1829.txt</filename>)</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para>new IPsec AH</para>
- <itemizedlist>
- <listitem>
- <para>null crypto checksum (no document,
- just for debugging)</para>
- </listitem>
- <listitem>
- <para>keyed MD5 with 96bit crypto checksum
- (no document)</para>
- </listitem>
- <listitem>
- <para>keyed SHA1 with 96bit crypto checksum
- (no document)</para>
- </listitem>
- <listitem>
- <para>HMAC MD5 with 96bit crypto checksum
- (<filename>rfc2403.txt</filename>)</para>
- </listitem>
- <listitem>
- <para>HMAC SHA1 with 96bit crypto checksum
- (<filename>rfc2404.txt</filename>)</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para>new IPsec ESP</para>
- <itemizedlist>
- <listitem>
- <para>null encryption
- (<filename>rfc2410.txt</filename>)</para>
- </listitem>
- <listitem>
- <para>DES-CBC with derived IV
- (<filename>draft-ietf-ipsec-ciph-des-derived-01.txt</filename>,
- draft expired)</para>
- </listitem>
- <listitem>
- <para>DES-CBC with explicit IV
- (<filename>rfc2405.txt</filename>)</para>
- </listitem>
- <listitem>
- <para>3DES-CBC with explicit IV
- (<filename>rfc2451.txt</filename>)</para>
- </listitem>
- <listitem>
- <para>BLOWFISH CBC
- (<filename>rfc2451.txt</filename>)</para>
- </listitem>
- <listitem>
- <para>CAST128 CBC
- (<filename>rfc2451.txt</filename>)</para>
- </listitem>
- <listitem>
- <para>RC5 CBC
- (<filename>rfc2451.txt</filename>)</para>
- </listitem>
- <listitem>
- <para>each of the above can be combined with:</para>
- <itemizedlist>
- <listitem>
- <para>ESP authentication with HMAC-MD5(96bit)</para>
- </listitem>
- <listitem>
- <para>ESP authentication with HMAC-SHA1(96bit)</para>
- </listitem>
- </itemizedlist>
- </listitem>
- </itemizedlist>
- </listitem>
- </itemizedlist>
-
- <para>The following algorithms are NOT supported:</para>
- <itemizedlist>
- <listitem>
-
- <para>old IPsec AH</para>
-
- <itemizedlist>
- <listitem>
- <para>HMAC MD5 with 128bit crypto checksum + 64bit
- replay prevention (<filename>rfc2085.txt</filename>)</para>
- </listitem>
- <listitem>
- <para>keyed SHA1 with 160bit crypto checksum + 32bit padding
- (<filename>rfc1852.txt</filename>)</para>
- </listitem>
- </itemizedlist>
-
- </listitem>
- </itemizedlist>
-
- <para>IPsec (in kernel) and IKE (in userland as "racoon") has been
- tested at several interoperability test events, and it is known to
- interoperate with many other implementations well. Also, current
- IPsec implementation as quite wide coverage for IPsec crypto
- algorithms documented in RFC (we cover algorithms without intellectual
- property issues only).</para>
- </sect3>
-
- <sect3 id="ipsec-ecn">
- <title>ECN consideration on IPsec tunnels</title>
-
- <para>ECN-friendly IPsec tunnel is supported as described in
- <filename>draft-ipsec-ecn-00.txt</filename>.</para>
-
- <para>Normal IPsec tunnel is described in RFC2401. On encapsulation,
- IPv4 TOS field (or, IPv6 traffic class field) will be copied from inner
- IP header to outer IP header. On decapsulation outer IP header
- will be simply dropped. The decapsulation rule is not compatible
- with ECN, since ECN bit on the outer IP TOS/traffic class field will be
- lost.</para>
-
- <para>To make IPsec tunnel ECN-friendly, we should modify encapsulation
- and decapsulation procedure. This is described in <ulink
- url="http://www.aciri.org/floyd/papers/draft-ipsec-ecn-00.txt">
- http://www.aciri.org/floyd/papers/draft-ipsec-ecn-00.txt</ulink>,
- chapter 3.</para>
-
- <para>IPsec tunnel implementation can give you three behaviors, by
- setting net.inet.ipsec.ecn (or net.inet6.ipsec6.ecn) to some
- value:</para>
-
- <itemizedlist>
- <listitem>
- <para>RFC2401: no consideration for ECN (sysctl value -1)</para>
- </listitem>
- <listitem>
- <para>ECN forbidden (sysctl value 0)</para>
- </listitem>
- <listitem>
- <para>ECN allowed (sysctl value 1)</para>
- </listitem>
- </itemizedlist>
-
- <para>Note that the behavior is configurable in per-node manner,
- not per-SA manner (draft-ipsec-ecn-00 wants per-SA configuration,
- but it looks too much for me).</para>
-
- <para>The behavior is summarized as follows (see source code for
- more detail):</para>
-
- <screen>
- encapsulate decapsulate
- --- ---
-RFC2401 copy all TOS bits drop TOS bits on outer
- from inner to outer. (use inner TOS bits as is)
-
-ECN forbidden copy TOS bits except for ECN drop TOS bits on outer
- (masked with 0xfc) from inner (use inner TOS bits as is)
- to outer. set ECN bits to 0.
-
-ECN allowed copy TOS bits except for ECN use inner TOS bits with some
- CE (masked with 0xfe) from change. if outer ECN CE bit
- inner to outer. is 1, enable ECN CE bit on
- set ECN CE bit to 0. the inner.
-
- </screen>
-
- <para>General strategy for configuration is as follows:</para>
- <itemizedlist>
- <listitem>
- <para>if both IPsec tunnel endpoint are capable of ECN-friendly
- behavior, you'd better configure both end to "ECN allowed"
- (sysctl value 1).</para>
- </listitem>
- <listitem>
- <para>if the other end is very strict about TOS bit, use "RFC2401"
- (sysctl value -1).</para>
- </listitem>
- <listitem>
- <para>in other cases, use "ECN forbidden" (sysctl value 0).</para>
- </listitem>
- </itemizedlist>
-
- <para>The default behavior is "ECN forbidden" (sysctl value 0).</para>
-
- <para>For more information, please refer to:</para>
-
- <para><ulink
- url="http://www.aciri.org/floyd/papers/draft-ipsec-ecn-00.txt">
- http://www.aciri.org/floyd/papers/draft-ipsec-ecn-00.txt</ulink>,
- RFC2481 (Explicit Congestion Notification),
- src/sys/netinet6/{ah,esp}_input.c</para>
-
- <para>(Thanks goes to Kenjiro Cho <email>kjc@csl.sony.co.jp</email>
- for detailed analysis)</para>
- </sect3>
-
- <sect3>
- <title>Interoperability</title>
-
- <para>Here are (some of) platforms that KAME code have tested
- IPsec/IKE interoperability in the past. Note that both ends may
- have modified their implementation, so use the following list just
- for reference purposes.</para>
-
- <para>Altiga, Ashley-laurent (vpcom.com), Data Fellows (F-Secure),
- Ericsson ACC, FreeS/WAN, HITACHI, IBM AIX, IIJ, Intel,
- Microsoft WinNT, NIST (linux IPsec + plutoplus), Netscreen, OpenBSD,
- RedCreek, Routerware, SSH, Secure Computing, Soliton, Toshiba,
- VPNet, Yamaha RT100i</para>
- </sect3>
- </sect2>
- </sect1>
-</chapter>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-declaration: "../chapter.decl"
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- sgml-parent-document: ("../book.sgml" "part" "chapter")
- End:
--->
diff --git a/en_US.ISO8859-1/books/developers-handbook/isa/chapter.sgml b/en_US.ISO8859-1/books/developers-handbook/isa/chapter.sgml
deleted file mode 100644
index 96f68a88c5..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/isa/chapter.sgml
+++ /dev/null
@@ -1,2479 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD: doc/en_US.ISO8859-1/books/developers-handbook/isa/chapter.sgml,v 1.1 2001/05/02 01:56:01 murray Exp $
--->
-
-<chapter id="isa-driver">
- <title>ISA device drivers</title>
-
- <para>
- <emphasis>
- This chapter was written by &a.babkin; Modifications for the
- handbook made by &a.murray;, &a.wylie;, and &a.logo;.
- </emphasis>
- </para>
-
- <sect1>
- <title>Synopsis</title>
-
- <para>This chapter introduces the issues relevant to writing a
- driver for an ISA device. The pseudo-code presented here is
- rather detailed and reminiscent of the real code but is still
- only pseudo-code. It avoids the details irrelevant to the
- subject of the discussion. The real-life examples can be found
- in the source code of real drivers. In particular the drivers
- "ep" and "aha" are good sources of information.</para>
- </sect1>
-
- <sect1>
- <title>Basic information</title>
-
- <para>A typical ISA driver would need the following include
- files:</para>
-
-<programlisting>#include &lt;sys/module.h&gt;
-#include &lt;sys/bus.h&gt;
-#include &lt;machine/bus.h&gt;
-#include &lt;machine/resource.h&gt;
-#include &lt;sys/rman.h&gt;
-
-#include &lt;isa/isavar.h&gt;
-#include &lt;isa/pnpvar.h&gt;</programlisting>
-
- <para>They describe the things specific to the ISA and generic
- bus subsystem.</para>
-
- <para>The bus subsystem is implemented in an object-oriented
- fashion, its main structures are accessed by associated method
- functions.</para>
-
- <para>The list of bus methods implemented by an ISA driver is like
- one for any other bus. For a hypothetical driver named "xxx"
- they would be:</para>
-
- <itemizedlist>
- <listitem>
- <para><function>static void xxx_isa_identify (driver_t *,
- device_t);</function> Normally used for bus drivers, not
- device drivers. But for ISA devices this method may have
- special use: if the device provides some device-specific
- (non-PnP) way to auto-detect devices this routine may
- implement it.</para>
- </listitem>
-
- <listitem>
- <para><function>static int xxx_isa_probe (device_t
- dev);</function> Probe for a device at a known (or PnP)
- location. This routine can also accommodate device-specific
- auto-detection of parameters for partially configured
- devices.</para>
- </listitem>
-
- <listitem>
- <para><function>static int xxx_isa_attach (device_t
- dev);</function> Attach and initialize device.</para>
- </listitem>
-
- <listitem>
- <para><function>static int xxx_isa_detach (device_t
- dev);</function> Detach device before unloading the driver
- module.</para>
- </listitem>
-
- <listitem>
- <para><function>static int xxx_isa_shutdown (device_t
- dev);</function> Execute shutdown of the device before
- system shutdown.</para>
- </listitem>
-
- <listitem>
- <para><function>static int xxx_isa_suspend (device_t
- dev);</function> Suspend the device before the system goes
- to the power-save state. May also abort transition to the
- power-save state.</para>
- </listitem>
-
- <listitem>
- <para><function>static int xxx_isa_resume (device_t
- dev);</function> Resume the device activity after return
- from power-save state.</para>
- </listitem>
-
- </itemizedlist>
-
- <para><function>xxx_isa_probe()</function> and
- <function>xxx_isa_attach()</function> are mandatory, the rest of
- the routines are optional, depending on the device's
- needs.</para>
-
- <para>The driver is linked to the system with the following set of
- descriptions.</para>
-
-<programlisting> /* table of supported bus methods */
- static device_method_t xxx_isa_methods[] = {
- /* list all the bus method functions supported by the driver */
- /* omit the unsupported methods */
- DEVMETHOD(device_identify, xxx_isa_identify),
- DEVMETHOD(device_probe, xxx_isa_probe),
- DEVMETHOD(device_attach, xxx_isa_attach),
- DEVMETHOD(device_detach, xxx_isa_detach),
- DEVMETHOD(device_shutdown, xxx_isa_shutdown),
- DEVMETHOD(device_suspend, xxx_isa_suspend),
- DEVMETHOD(device_resume, xxx_isa_resume),
-
- { 0, 0 }
- };
-
- static driver_t xxx_isa_driver = {
- "xxx",
- xxx_isa_methods,
- sizeof(struct xxx_softc),
- };
-
-
- static devclass_t xxx_devclass;
-
- DRIVER_MODULE(xxx, isa, xxx_isa_driver, xxx_devclass,
- load_function, load_argument);</programlisting>
-
- <para>Here struct <structname>xxx_softc</structname> is a
- device-specific structure that contains private driver data
- and descriptors for the driver's resources. The bus code
- automatically allocates one softc descriptor per device as
- needed.</para>
-
- <para>If the driver is implemented as a loadable module then
- <function>load_function()</function> is called to do
- driver-specific initialization or clean-up when the driver is
- loaded or unloaded and load_argument is passed as one of its
- arguments. If the driver does not support dynamic loading (in
- other words it must always be linked into kernel) then these
- values should be set to 0 and the last definition would look
- like:</para>
-
- <programlisting> DRIVER_MODULE(xxx, isa, xxx_isa_driver,
- xxx_devclass, 0, 0);</programlisting>
-
- <para>If the driver is for a device which supports PnP then a
- table of supported PnP IDs must be defined. The table
- consists of a list of PnP IDs supported by this driver and
- human-readable descriptions of the hardware types and models
- having these IDs. It looks like:</para>
-
-<programlisting> static struct isa_pnp_id xxx_pnp_ids[] = {
- /* a line for each supported PnP ID */
- { 0x12345678, "Our device model 1234A" },
- { 0x12345679, "Our device model 1234B" },
- { 0, NULL }, /* end of table */
- };</programlisting>
-
- <para>If the driver does not support PnP devices it still needs
- an empty PnP ID table, like:</para>
-
-<programlisting> static struct isa_pnp_id xxx_pnp_ids[] = {
- { 0, NULL }, /* end of table */
- };</programlisting>
-
- </sect1>
-
- <sect1>
- <title>Device_t pointer</title>
-
- <para><structname>Device_t</structname> is the pointer type for
- the device structure. Here we consider only the methods
- interesting from the device driver writer's standpoint. The
- methods to manipulate values in the device structure
- are:</para>
-
- <itemizedlist>
-
- <listitem><para><function>device_t
- device_get_parent(dev)</function> Get the parent bus of a
- device.</para></listitem>
-
- <listitem><para><function>driver_t
- device_get_driver(dev)</function> Get pointer to its driver
- structure.</para></listitem>
-
- <listitem><para><function>char
- *device_get_name(dev)</function> Get the driver name, such
- as "xxx" for our example.</para></listitem>
-
- <listitem><para><function>int device_get_unit(dev)</function>
- Get the unit number (units are numbered from 0 for the
- devices associated with each driver).</para></listitem>
-
- <listitem><para><function>char
- *device_get_nameunit(dev)</function> Get the device name
- including the unit number, such as "xxx0" , "xxx1" and so
- on.</para></listitem>
-
- <listitem><para><function>char
- *device_get_desc(dev)</function> Get the device
- description. Normally it describes the exact model of device
- in human-readable form.</para></listitem>
-
- <listitem><para><function>device_set_desc(dev,
- desc)</function> Set the description. This makes the device
- description point to the string desc which may not be
- deallocated or changed after that.</para></listitem>
-
- <listitem><para><function>device_set_desc_copy(dev,
- desc)</function> Set the description. The description is
- copied into an internal dynamically allocated buffer, so the
- string desc may be changed afterwards without adverse
- effects.</para></listitem>
-
- <listitem><para><function>void
- *device_get_softc(dev)</function> Get pointer to the device
- descriptor (struct <structname>xxx_softc</structname>)
- associated with this device.</para></listitem>
-
- <listitem><para><function>u_int32_t
- device_get_flags(dev)</function> Get the flags specified for
- the device in the configuration file.</para></listitem>
-
- </itemizedlist>
-
- <para>A convenience function <function>device_printf(dev, fmt,
- ...)</function> may be used to print the messages from the
- device driver. It automatically prepends the unitname and
- colon to the message.</para>
-
- <para>The device_t methods are implemented in the file
- kern/bus_subr.c.</para>
-
- </sect1>
-
- <sect1>
- <title>Config file and the order of identifying and probing
- during auto-configuration</title>
-
- <para>The ISA devices are described in the kernel config file
- like:</para>
-
- <programlisting>device xxx0 at isa? port 0x300 irq 10 drq 5
- iomem 0xd0000 flags 0x1 sensitive</programlisting>
-
- <para>The values of port, IRQ and so on are converted to the
- resource values associated with the device. They are optional,
- depending on the device needs and abilities for
- auto-configuration. For example, some devices don't need DRQ
- at all and some allow the driver to read the IRQ setting from
- the device configuration ports. If a machine has multiple ISA
- buses the exact bus may be specified in the configuration
- line, like "isa0" or "isa1", otherwise the device would be
- searched for on all the ISA buses.</para>
-
- <para>"sensitive" is a resource requesting that this device must
- be probed before all non-sensitive devices. It is supported
- but does not seem to be used in any current driver.</para>
-
- <para>For legacy ISA devices in many cases the drivers are still
- able to detect the configuration parameters. But each device
- to be configured in the system must have a config line. If two
- devices of some type are installed in the system but there is
- only one configuration line for the corresponding driver, ie:
- <programlisting>device xxx0 at isa?</programlisting> then only
- one device will be configured.</para>
-
- <para>But for the devices supporting automatic identification by
- the means of Plug-n-Play or some proprietary protocol one
- configuration line is enough to configure all the devices in
- the system, like the one above or just simply:</para>
-
- <programlisting>device xxx at isa?</programlisting>
-
- <para>If a driver supports both auto-identified and legacy
- devices and both kinds are installed at once in one machine
- then it's enough to describe in the config file the legacy
- devices only. The auto-identified devices will be added
- automatically.</para>
-
- <para>When an ISA bus is auto-configured the events happen as
- follows:</para>
-
- <para>All the drivers' identify routines (including the PnP
- identify routine which identifies all the PnP devices) are
- called in random order. As they identify the devices they add
- them to the list on the ISA bus. Normally the drivers'
- identify routines associate their drivers with the new
- devices. The PnP identify routine does not know about the
- other drivers yet so it does not associate any with the new
- devices it adds.</para>
-
- <para>The PnP devices are put to sleep using the PnP protocol to
- prevent them from being probed as legacy devices.</para>
-
- <para>The probe routines of non-PnP devices marked as
- "sensitive" are called. If probe for a device went
- successfully, the attach routine is called for it.</para>
-
- <para>The probe and attach routines of all non-PNP devices are
- called likewise.</para>
-
- <para>The PnP devices are brought back from the sleep state and
- assigned the resources they request: I/O and memory address
- ranges, IRQs and DRQs, all of them not conflicting with the
- attached legacy devices.</para>
-
- <para>Then for each PnP device the probe routines of all the
- present ISA drivers are called. The first one that claims the
- device gets attached. It is possible that multiple drivers
- would claim the device with different priority, the
- highest-priority driver wins. The probe routines must call
- <function>ISA_PNP_PROBE()</function> to compare the actual PnP
- ID with the list of the IDs supported by the driver and if the
- ID is not in the table return failure. That means that
- absolutely every driver, even the ones not supporting any PnP
- devices must call <function>ISA_PNP_PROBE()</function>, at
- least with an empty PnP ID table to return failure on unknown
- PnP devices.</para>
-
- <para>The probe routine returns a positive value (the error
- code) on error, zero or negative value on success.</para>
-
- <para>The negative return values are used when a PnP device
- supports multiple interfaces. For example, an older
- compatibility interface and a newer advanced interface which
- are supported by different drivers. Then both drivers would
- detect the device. The driver which returns a higher value in
- the probe routine takes precedence (in other words, the driver
- returning 0 has highest precedence, returning -1 is next,
- returning -2 is after it and so on). In result the devices
- which support only the old interface will be handled by the
- old driver (which should return -1 from the probe routine)
- while the devices supporting the new interface as well will be
- handled by the new driver (which should return 0 from the
- probe routine). If multiple drivers return the same value then
- the one called first wins. So if a driver returns value 0 it
- may be sure that it won the priority arbitration.</para>
-
- <para>The device-specific identify routines can also assign not
- a driver but a class of drivers to the device. Then all the
- drivers in the class are probed for this device, like the case
- with PnP. This feature is not implemented in any existing
- driver and is not considered further in this document.</para>
-
- <para>Because the PnP devices are disabled when probing the
- legacy devices they will not be attached twice (once as legacy
- and once as PnP). But in case of device-dependent identify
- routines it's the responsibility of the driver to make sure
- that the same device won't be attached by the driver twice:
- once as legacy user-configured and once as
- auto-identified.</para>
-
- <para>Another practical consequence for the auto-identified
- devices (both PnP and device-specific) is that the flags can
- not be passed to them from the kernel configuration file. So
- they must either not use the flags at all or use the flags
- from the device unit 0 for all the auto-identified devices or
- use the sysctl interface instead of flags.</para>
-
- <para>Other unusual configurations may be accommodated by
- accessing the configuration resources directly with functions
- of families <function>resource_query_*()</function> and
- <function>resource_*_value()</function>. Their implementations
- are located in kern/subr_bus.h. The old IDE disk driver
- i386/isa/wd.c contains examples of such use. But the standard
- means of configuration must always be preferred. Leave parsing
- the configuration resources to the bus configuration
- code.</para>
-
- </sect1>
-
- <sect1>
- <title>Resources</title>
-
- <para>The information that a user enters into the kernel
- configuration file is processed and passed to the kernel as
- configuration resources. This information is parsed by the bus
- configuration code and transformed into a value of structure
- device_t and the bus resources associated with it. The drivers
- may access the configuration resources directly using
- functions resource_* for more complex cases of
- configuration. But generally it's not needed nor recommended,
- so this issue is not discussed further.</para>
-
- <para>The bus resources are associated with each device. They
- are identified by type and number within the type. For the ISA
- bus the following types are defined:</para>
-
- <itemizedlist>
- <listitem>
- <para><emphasis>SYS_RES_IRQ</emphasis> - interrupt
- number</para>
- </listitem>
-
- <listitem>
- <para><emphasis>SYS_RES_DRQ</emphasis> - ISA DMA channel
- number</para>
- </listitem>
-
- <listitem>
- <para><emphasis>SYS_RES_MEMORY</emphasis> - range of
- device memory mapped into the system memory space
- </para>
- </listitem>
-
- <listitem>
- <para><emphasis>SYS_RES_IOPORT</emphasis> - range of
- device I/O registers</para>
- </listitem>
- </itemizedlist>
-
- <para>The enumeration within types starts from 0, so if a device
- has two memory regions if would have resources of type
- SYS_RES_MEMORY numbered 0 and 1. The resource type has
- nothing to do with the C language type, all the resource
- values have the C language type "unsigned long" and must be
- cast as necessary. The resource numbers don't have to be
- contiguous although for ISA they normally would be. The
- permitted resource numbers for ISA devices are:</para>
-
- <programlisting> IRQ: 0-1
- DRQ: 0-1
- MEMORY: 0-3
- IOPORT: 0-7</programlisting>
-
- <para>All the resources are represented as ranges, with a start
- value and count. For IRQ and DRQ resources the count would be
- normally equal to 1. The values for memory refer to the
- physical addresses.</para>
-
- <para>Three types of activities can be performed on
- resources:</para>
-
- <itemizedlist>
- <listitem><para>set/get</para></listitem>
- <listitem><para>allocate/release</para></listitem>
- <listitem><para>activate/deactivate</para></listitem>
- </itemizedlist>
-
- <para>Setting sets the range used by the resource. Allocation
- reserves the requested range that no other driver would be
- able to reserve it (and checking that no other driver reserved
- this range already). Activation makes the resource accessible
- to the driver doing whatever is necessary for that (for
- example, for memory it would be mapping into the kernel
- virtual address space).</para>
-
- <para>The functions to manipulate resources are:</para>
-
- <itemizedlist>
- <listitem>
- <para><function>int bus_set_resource(device_t dev, int type,
- int rid, u_long start, u_long count)</function></para>
-
- <para>Set a range for a resource. Returns 0 if successful,
- error code otherwise. Normally the only reason this
- function would return an error is value of type, rid,
- start or count out of permitted range.</para>
-
- <itemizedlist>
- <listitem>
- <para> dev - driver's device</para>
- </listitem>
- <listitem>
- <para> type - type of resource, SYS_RES_* </para>
- </listitem>
- <listitem>
- <para> rid - resource number (ID) within type </para>
- </listitem>
- <listitem>
- <para> start, count - resource range </para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para><function>int bus_get_resource(device_t dev, int type,
- int rid, u_long *startp, u_long *countp)</function></para>
-
- <para>Get the range of resource. Returns 0 if successful,
- error code if the resource is not defined yet.</para>
- </listitem>
-
- <listitem>
- <para><function>u_long bus_get_resource_start(device_t dev,
- int type, int rid) u_long bus_get_resource_count (device_t
- dev, int type, int rid)</function></para>
-
- <para>Convenience functions to get only the start or
- count. Return 0 in case of error, so if the resource start
- has 0 among the legitimate values it would be impossible
- to tell if the value is 0 or an error occurred. Luckily,
- no ISA resources for add-on drivers may have a start value
- equal 0.</para>
- </listitem>
-
- <listitem>
- <para><function>void bus_delete_resource(device_t dev, int
- type, int rid)</function></para>
- <para> Delete a resource, make it undefined.</para>
- </listitem>
-
- <listitem>
- <para><function>struct resource *
- bus_alloc_resource(device_t dev, int type, int *rid,
- u_long start, u_long end, u_long count, u_int
- flags)</function></para>
-
- <para>Allocate a resource as a range of count values not
- allocated by anyone else, somewhere between start and
- end. Alas, alignment is not supported. If the resource
- was not set yet it's automatically created. The special
- values of start 0 and end ~0 (all ones) means that the
- fixed values previously set by
- <function>bus_set_resource()</function> must be used
- instead: start and count as themselves and
- end=(start+count), in this case if the resource was not
- defined before then an error is returned. Although rid is
- passed by reference it's not set anywhere by the resource
- allocation code of the ISA bus. (The other buses may use a
- different approach and modify it).</para>
- </listitem>
- </itemizedlist>
-
- <para>Flags are a bitmap, the flags interesting for the caller
- are:</para>
-
- <itemizedlist>
- <listitem>
- <para><emphasis>RF_ACTIVE</emphasis> - causes the resource
- to be automatically activated after allocation.</para>
- </listitem>
-
- <listitem>
- <para><emphasis>RF_SHAREABLE</emphasis> - resource may be
- shared at the same time by multiple drivers.</para>
- </listitem>
-
- <listitem>
- <para><emphasis>RF_TIMESHARE</emphasis> - resource may be
- time-shared by multiple drivers, i.e. allocated at the
- same time by many but activated only by one at any given
- moment of time.</para>
- </listitem>
-<!-- XXXDONT KNOW IT THESE SHOULD BE TWO SEPERATE LISTS OR NOT -->
- <listitem>
- <para>Returns 0 on error. The allocated values may be
- obtained from the returned handle using methods
- <function>rhand_*()</function>.</para>
- </listitem>
- <listitem>
- <para><function>int bus_release_resource(device_t dev, int
- type, int rid, struct resource *r)</function></para>
- </listitem>
-
- <listitem>
- <para>Release the resource, r is the handle returned by
- <function>bus_alloc_resource()</function>. Returns 0 on
- success, error code otherwise.</para>
- </listitem>
-
- <listitem>
- <para><function>int bus_activate_resource(device_t dev, int
- type, int rid, struct resource *r)</function>
- <function>int bus_deactivate_resource(device_t dev, int
- type, int rid, struct resource *r)</function></para>
- </listitem>
-
- <listitem>
- <para>Activate or deactivate resource. Return 0 on success,
- error code otherwise. If the resource is time-shared and
- currently activated by another driver then EBUSY is
- returned.</para>
- </listitem>
-
- <listitem>
- <para><function>int bus_setup_intr(device_t dev, struct
- resource *r, int flags, driver_intr_t *handler, void *arg,
- void **cookiep)</function> <function>int
- bus_teardown_intr(device_t dev, struct resource *r, void
- *cookie)</function></para>
- </listitem>
-
- <listitem>
- <para>Associate or de-associate the interrupt handler with a
- device. Return 0 on success, error code otherwise.</para>
- </listitem>
-
- <listitem>
- <para>r - the activated resource handler describing the
- IRQ</para>
- <para>flags - the interrupt priority level, one of:</para>
-
- <itemizedlist>
- <listitem>
- <para><function>INTR_TYPE_TTY</function> - terminals and
- other likewise character-type devices. To mask them
- use <function>spltty()</function>.</para>
- </listitem>
- <listitem>
- <para><function>(INTR_TYPE_TTY |
- INTR_TYPE_FAST)</function> - terminal type devices
- with small input buffer, critical to the data loss on
- input (such as the old-fashioned serial ports). To
- mask them use <function>spltty()</function>.</para>
- </listitem>
- <listitem>
- <para><function>INTR_TYPE_BIO</function> - block-type
- devices, except those on the CAM controllers. To mask
- them use <function>splbio()</function>.</para>
- </listitem>
- <listitem>
- <para><function>INTR_TYPE_CAM</function> - CAM (Common
- Access Method) bus controllers. To mask them use
- <function>splcam()</function>.</para>
- </listitem>
- <listitem>
- <para><function>INTR_TYPE_NET</function> - network
- interface controllers. To mask them use
- <function>splimp()</function>.</para>
- </listitem>
- <listitem>
- <para><function>INTR_TYPE_MISC</function> -
- miscellaneous devices. There is no other way to mask
- them than by <function>splhigh()</function> which
- masks all interrupts.</para>
- </listitem>
- </itemizedlist>
- </listitem>
- </itemizedlist>
-
- <para>When an interrupt handler executes all the other
- interrupts matching its priority level will be masked. The
- only exception is the MISC level for which no other interrupts
- are masked and which is not masked by any other
- interrupt.</para>
-
- <itemizedlist>
- <listitem>
- <para><emphasis>handler</emphasis> - pointer to the handler
- function, the type driver_intr_t is defined as "void
- driver_intr_t(void *)"</para>
- </listitem>
- <listitem>
- <para><emphasis>arg</emphasis> - the argument passed to the
- handler to identify this particular device. It is cast
- from void* to any real type by the handler. The old
- convention for the ISA interrupt handlers was to use the
- unit number as argument, the new (recommended) convention
- is using a pointer to the device softc structure.</para>
- </listitem>
- <listitem>
- <para><emphasis>cookie[p]</emphasis> - the value received
- from <function>setup()</function> is used to identify the
- handler when passed to
- <function>teardown()</function></para>
- </listitem>
- </itemizedlist>
-
- <para>A number of methods is defined to operate on the resource
- handlers (struct resource *). Those of interest to the device
- driver writers are:</para>
-
- <itemizedlist>
- <listitem>
- <para><function>u_long rman_get_start(r) u_long
- rman_get_end(r)</function> Get the start and end of
- allocated resource range.</para>
- </listitem>
- <listitem>
- <para><function>void *rman_get_virtual(r)</function> Get
- the virtual address of activated memory resource.</para>
- </listitem>
- </itemizedlist>
-
- </sect1>
-
- <sect1>
- <title>Bus memory mapping</title>
-
- <para>In many cases data is exchanged between the driver and the
- device through the memory. Two variants are possible:</para>
-
- <para>(a) memory is located on the device card</para>
- <para>(b) memory is the main memory of computer</para>
-
- <para>In the case (a) the driver always copies the data back and
- forth between the on-card memory and the main memory as
- necessary. To map the on-card memory into the kernel virtual
- address space the physical address and length of the on-card
- memory must be defined as a SYS_RES_MEMORY resource. That
- resource can then be allocated and activated, and its virtual
- address obtained using
- <function>rman_get_virtual()</function>. The older drivers
- used the function <function>pmap_mapdev()</function> for this
- purpose, which should not be used directly any more. Now it's
- one of the internal steps of resource activation.</para>
-
- <para>Most of the ISA cards will have their memory configured
- for physical location somewhere in range 640KB-1MB. Some of
- the ISA cards require larger memory ranges which should be
- placed somewhere under 16MB (because of the 24-bit address
- limitation on the ISA bus). In that case if the machine has
- more memory than the start address of the device memory (in
- other words, they overlap) a memory hole must be configured at
- the address range used by devices. Many BIOSes allow to
- configure a memory hole of 1MB starting at 14MB or
- 15MB. FreeBSD can handle the memory holes properly if the BIOS
- reports them properly (old BIOSes may have this feature
- broken).</para>
-
- <para>In the case (b) just the address of the data is sent to
- the device, and the device uses DMA to actually access the
- data in the main memory. Two limitations are present: First,
- ISA cards can only access memory below 16MB. Second, the
- contiguous pages in virtual address space may not be
- contiguous in physical address space, so the device may have
- to do scatter/gather operations. The bus subsystem provides
- ready solutions for some of these problems, the rest has to be
- done by the drivers themselves.</para>
-
- <para>Two structures are used for DMA memory allocation,
- bus_dma_tag_t and bus_dmamap_t. Tag describes the properties
- required for the DMA memory. Map represents a memory block
- allocated according to these properties. Multiple maps may be
- associated with the same tag.</para>
-
- <para>Tags are organized into a tree-like hierarchy with
- inheritance of the properties. A child tag inherits all the
- requirements of its parent tag or may make them more strict
- but never more loose.</para>
-
- <para>Normally one top-level tag (with no parent) is created for
- each device unit. If multiple memory areas with different
- requirements are needed for each device then a tag for each of
- them may be created as a child of the parent tag.</para>
-
- <para>The tags can be used to create a map in two ways.</para>
-
- <para>First, a chunk of contiguous memory conformant with the
- tag requirements may be allocated (and later may be
- freed). This is normally used to allocate relatively
- long-living areas of memory for communication with the
- device. Loading of such memory into a map is trivial: it's
- always considered as one chunk in the appropriate physical
- memory range.</para>
-
- <para>Second, an arbitrary area of virtual memory may be loaded
- into a map. Each page of this memory will be checked for
- conformance to the map requirement. If it conforms then it's
- left at it's original location. If it is not then a fresh
- conformant "bounce page" is allocated and used as intermediate
- storage. When writing the data from the non-conformant
- original pages they will be copied to their bounce pages first
- and then transferred from the bounce pages to the device. When
- reading the data would go from the device to the bounce pages
- and then copied to their non-conformant original pages. The
- process of copying between the original and bounce pages is
- called synchronization. This is normally used on per-transfer
- basis: buffer for each transfer would be loaded, transfer done
- and buffer unloaded.</para>
-
- <para>The functions working on the DMA memory are:</para>
-
- <itemizedlist>
- <listitem>
- <para><function>int bus_dma_tag_create(bus_dma_tag_t parent,
- bus_size_t alignment, bus_size_t boundary, bus_addr_t
- lowaddr, bus_addr_t highaddr, bus_dma_filter_t *filter, void
- *filterarg, bus_size_t maxsize, int nsegments, bus_size_t
- maxsegsz, int flags, bus_dma_tag_t *dmat)</function></para>
-
- <para>Create a new tag. Returns 0 on success, the error code
- otherwise.</para>
-
- <itemizedlist>
- <listitem>
- <para><emphasis>parent</emphasis> - parent tag, or NULL to
- create a top-level tag <emphasis>alignment</emphasis> -
- required physical alignment of the memory area to be
- allocated for this tag. Use value 1 for "no specific
- alignment". Applies only to the future
- <function>bus_dmamem_alloc()</function> but not
- <function>bus_dmamap_create()</function> calls.
- <emphasis>boundary</emphasis> - physical address
- boundary that must not be crossed when allocating the
- memory. Use value 0 for "no boundary". Applies only to
- the future <function>bus_dmamem_alloc()</function> but
- not <function>bus_dmamap_create()</function> calls.
- Must be power of 2. If the memory is planned to be used
- in non-cascaded DMA mode (i.e. the DMA addresses will be
- supplied not by the device itself but by the ISA DMA
- controller) then the boundary must be no larger than
- 64KB (64*1024) due to the limitations of the DMA
- hardware.</para>
- </listitem>
-
- <listitem>
- <para><emphasis>lowaddr, highaddr</emphasis> - the names
- are slighlty misleading; these values are used to limit
- the permitted range of physical addresses used to
- allocate the memory. The exact meaning varies depending
- on the planned future use:</para>
-
- <itemizedlist>
- <listitem>
- <para>For <function>bus_dmamem_alloc()</function> all
- the addresses from 0 to lowaddr-1 are considered
- permitted, the higher ones are forbidden.</para>
- </listitem>
-
- <listitem>
- <para>For <function>bus_dmamap_create()</function> all
- the addresses outside the inclusive range [lowaddr;
- highaddr] are considered accessible. The addresses
- of pages inside the range are passed to the filter
- function which decides if they are accessible. If no
- filter function is supplied then all the range is
- considered unaccessible.</para>
- </listitem>
-
- <listitem>
- <para>For the ISA devices the normal values (with no
- filter function) are:</para>
- <para>lowaddr = BUS_SPACE_MAXADDR_24BIT</para>
- <para>highaddr = BUS_SPACE_MAXADDR</para>
- </listitem>
- </itemizedlist>
-
- </listitem>
-
- <listitem>
- <para><emphasis>filter, filterarg</emphasis> - the filter
- function and its argument. If NULL is passed for filter
- then the whole range [lowaddr, highaddr] is considered
- unaccessible when doing
- <function>bus_dmamap_create()</function>. Otherwise the
- physical address of each attempted page in range
- [lowaddr; highaddr] is passed to the filter function
- which decides if it is accessible. The prototype of the
- filter function is: <function>int filterfunc(void *arg,
- bus_addr_t paddr)</function> It must return 0 if the
- page is accessible, non-zero otherwise.</para>
- </listitem>
-
- <listitem>
- <para><emphasis>maxsize</emphasis> - the maximal size of
- memory (in bytes) that may be allocated through this
- tag. In case it's difficult to estimate or could be
- arbitrarily big, the value for ISA devices would be
- BUS_SPACE_MAXSIZE_24BIT.</para>
- </listitem>
-
- <listitem>
- <para><emphasis>nsegments</emphasis> - maximal number of
- scatter-gather segments supported by the device. If
- unrestricted then the value BUS_SPACE_UNRESTRICTED
- should be used. This value is recommended for the parent
- tags, the actual restrictions would then be specified
- for the descendant tags. Tags with nsegments equal to
- BUS_SPACE_UNRESTRICTED may not be used to actually load
- maps, they may be used only as parent tags. The
- practical limit for nsegments seems to be about 250-300,
- higher values will cause kernel stack overflow. But
- anyway the hardware normally can't support that many
- scatter-gather buffers.</para>
- </listitem>
-
- <listitem>
- <para><emphasis>maxsegsz</emphasis> - maximal size of a
- scatter-gather segment supported by the device. The
- maximal value for ISA device would be
- BUS_SPACE_MAXSIZE_24BIT.</para>
- </listitem>
-
- <listitem>
- <para><emphasis>flags</emphasis> - a bitmap of flags. The
- only interesting flags are:</para>
-
- <itemizedlist>
- <listitem>
- <para><emphasis>BUS_DMA_ALLOCNOW</emphasis> - requests
- to allocate all the potentially needed bounce pages
- when creating the tag</para>
- </listitem>
-
- <listitem>
- <para><emphasis>BUS_DMA_ISA</emphasis> - mysterious
- flag used only on Alpha machines. It is not defined
- for the i386 machines. Probably it should be used
- by all the ISA drivers for Alpha machines but it
- looks like there are no such drivers yet.</para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem>
- <para><emphasis>dmat</emphasis> - pointer to the storage
- for the new tag to be returned</para>
- </listitem>
-
- </itemizedlist>
-
- </listitem>
-
- <listitem> <!-- Second entry in list alpha -->
- <para><function>int bus_dma_tag_destroy(bus_dma_tag_t
- dmat)</function></para>
-
- <para>Destroy a tag. Returns 0 on success, the error code
- otherwise.</para>
-
- <para>dmat - the tag to be destroyed</para>
-
- </listitem>
-
- <listitem> <!-- Third entry in list alpha -->
- <para><function>int bus_dmamem_alloc(bus_dma_tag_t dmat,
- void** vaddr, int flags, bus_dmamap_t
- *mapp)</function></para>
-
- <para>Allocate an area of contiguous memory described by the
- tag. The size of memory to be allocated is tag's maxsize.
- Returns 0 on success, the error code otherwise. The result
- still has to be loaded by
- <function>bus_dmamap_load()</function> before used to get
- the physical address of the memory.</para>
-
-<!-- XXX What it is Wylie, I got to here -->
-
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>dmat</emphasis> - the tag
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>vaddr</emphasis> - pointer to the storage
- for the kernel virtual address of the allocated area
- to be returned.
- </para>
- </listitem>
- <listitem>
- <para>
- flags - a bitmap of flags. The only interesting flag is:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>BUS_DMA_NOWAIT</emphasis> - if the
- memory is not immediately available return the
- error. If this flag is not set then the routine
- is allowed to sleep waiting until the memory
- will become available.
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
- <listitem>
- <para>
- <emphasis>mapp</emphasis> - pointer to the storage
- for the new map to be returned
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem> <!-- Fourth entry in list alpha -->
- <para>
- <function>void bus_dmamem_free(bus_dma_tag_t dmat, void
- *vaddr, bus_dmamap_t map)</function>
- </para>
- <para>
- Free the memory allocated by
- <function>bus_dmamem_alloc()</function>. As of now
- freeing of the memory allocated with ISA restrictions is
- not implemented. Because of this the recommended model
- of use is to keep and re-use the allocated areas for as
- long as possible. Do not lightly free some area and then
- shortly allocate it again. That does not mean that
- <function>bus_dmamem_free()</function> should not be
- used at all: hopefully it will be properly implemented
- soon.
- </para>
-
- <itemizedlist>
- <listitem>
- <para><emphasis>dmat</emphasis> - the tag
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>vaddr</emphasis> - the kernel virtual
- address of the memory
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>map</emphasis> - the map of the memory (as
- returned from
- <function>bus_dmamem_alloc()</function>)
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem> <!-- The fifth entry in list alpha -->
- <para>
- <function>int bus_dmamap_create(bus_dma_tag_t dmat, int
- flags, bus_dmamap_t *mapp)</function>
- </para>
- <para>
- Create a map for the tag, to be used in
- <function>bus_dmamap_load()</function> later. Returns 0
- on success, the error code otherwise.
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>dmat</emphasis> - the tag
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>flags</emphasis> - theoretically, a bit map
- of flags. But no flags are defined yet, so as of now
- it will be always 0.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>mapp</emphasis> - pointer to the storage
- for the new map to be returned
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem> <!-- Sixth entry in the alpha list -->
- <para>
- <function>int bus_dmamap_destroy(bus_dma_tag_t dmat,
- bus_dmamap_t map)</function>
- </para>
- <para>
- Destroy a map. Returns 0 on success, the error code otherwise.
- </para>
-
- <itemizedlist>
- <listitem>
- <para>
- dmat - the tag to which the map is associated
- </para>
- </listitem>
- <listitem>
- <para>
- map - the map to be destroyed
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
-
- <listitem> <!-- Seventh entry in list alpha -->
- <para>
- <function>int bus_dmamap_load(bus_dma_tag_t dmat,
- bus_dmamap_t map, void *buf, bus_size_t buflen,
- bus_dmamap_callback_t *callback, void *callback_arg, int
- flags)</function>
- </para>
- <para>
- Load a buffer into the map (the map must be previously
- created by <function>bus_dmamap_create()</function> or
- <function>bus_dmamem_alloc()</function>). All the pages
- of the buffer are checked for conformance to the tag
- requirements and for those not conformant the bounce
- pages are allocated. An array of physical segment
- descriptors is built and passed to the callback
- routine. This callback routine is then expected to
- handle it in some way. The number of bounce buffers in
- the system is limited, so if the bounce buffers are
- needed but not immediately available the request will be
- queued and the callback will be called when the bounce
- buffers will become available. Returns 0 if the callback
- was executed immediately or EINPROGRESS if the request
- was queued for future execution. In the latter case the
- synchronization with queued callback routine is the
- responsibility of the driver.
- </para>
- <!--<blockquote>-->
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>dmat</emphasis> - the tag
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>map</emphasis> - the map
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>buf</emphasis> - kernel virtual address of
- the buffer
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>buflen</emphasis> - length of the buffer
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>callback</emphasis>,<function>
- callback_arg</function> - the callback function and
- its argument
- </para>
- </listitem>
- </itemizedlist>
- <!--</blockquote>-->
- <para>
- The prototype of callback function is:
- </para>
- <para>
- <function>void callback(void *arg, bus_dma_segment_t
- *seg, int nseg, int error)</function>
- </para>
- <!-- <blockquote> -->
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>arg</emphasis> - the same as callback_arg
- passed to <function>bus_dmamap_load()</function>
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>seg</emphasis> - array of the segment
- descriptors
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>nseg</emphasis> - number of descriptors in
- array
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>error</emphasis> - indication of the
- segment number overflow: if it's set to EFBIG then
- the buffer did not fit into the maximal number of
- segments permitted by the tag. In this case only the
- permitted number of descriptors will be in the
- array. Handling of this situation is up to the
- driver: depending on the desired semantics it can
- either consider this an error or split the buffer in
- two and handle the second part separately
- </para>
- </listitem>
- </itemizedlist>
- <!-- </blockquote> -->
- <para>
- Each entry in the segments array contains the fields:
- </para>
-
- <!-- <blockquote> -->
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>ds_addr</emphasis> - physical bus address
- of the segment
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>ds_len</emphasis> - length of the segment
- </para>
- </listitem>
- </itemizedlist>
- <!-- </blockquote>-->
- </listitem>
-
- <listitem> <!-- Eighth entry in alpha list -->
- <para>
- <function>void bus_dmamap_unload(bus_dma_tag_t dmat,
- bus_dmamap_t map)</function>
- </para>
- <para>unload the map.
- </para>
- <!-- <blockquote> -->
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>dmat</emphasis> - tag
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>map</emphasis> - loaded map
- </para>
- </listitem>
- </itemizedlist>
- <!-- </blockquote> -->
- </listitem>
-
- <listitem> <!-- Ninth entry list alpha -->
- <para>
- <function>void bus_dmamap_sync (bus_dma_tag_t dmat,
- bus_dmamap_t map, bus_dmasync_op_t op)</function>
- </para>
- <para>
- Synchronise a loaded buffer with its bounce pages before
- and after physical transfer to or from device. This is
- the function that does all the necessary copying of data
- between the original buffer and its mapped version. The
- buffers must be synchronized both before and after doing
- the transfer.
- </para>
- <!-- <blockquote> -->
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>dmat</emphasis> - tag
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>map</emphasis> - loaded map
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>op</emphasis> - type of synchronization
- operation to perform:
- </para>
- </listitem>
- </itemizedlist>
- <!-- <blockquote> -->
- <itemizedlist>
- <listitem>
- <para>
- <function>BUS_DMASYNC_PREREAD</function> - before
- reading from device into buffer
- </para>
- </listitem>
- <listitem>
- <para>
- <function>BUS_DMASYNC_POSTREAD</function> - after
- reading from device into buffer
- </para>
- </listitem>
- <listitem>
- <para>
- <function>BUS_DMASYNC_PREWRITE</function> - before
- writing the buffer to device
- </para>
- </listitem>
- <listitem>
- <para>
- <function>BUS_DMASYNC_POSTWRITE</function> - after
- writing the buffer to device
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
- </itemizedlist> <!-- End of list alpha -->
-<!-- </blockquote>
-</blockquote> -->
-
- <para>
- As of now PREREAD and POSTWRITE are null operations but that
- may change in the future, so they must not be ignored in the
- driver. Synchronization is not needed for the memory
- obtained from <function>bus_dmamem_alloc()</function>.
- </para>
- <para>
- Before calling the callback function from
- <function>bus_dmamap_load()</function> the segment array is
- stored in the stack. And it gets pre-allocated for the
- maximal number of segments allowed by the tag. Because of
- this the practical limit for the number of segments on i386
- architecture is about 250-300 (the kernel stack is 4KB minus
- the size of the user structure, size of a segment array
- entry is 8 bytes, and some space must be left). Because the
- array is allocated based on the maximal number this value
- must not be set higher than really needed. Fortunately, for
- most of hardware the maximal supported number of segments is
- much lower. But if the driver wants to handle buffers with a
- very large number of scatter-gather segments it should do
- that in portions: load part of the buffer, transfer it to
- the device, load next part of the buffer, and so on.
- </para>
- <para>
- Another practical consequence is that the number of segments
- may limit the size of the buffer. If all the pages in the
- buffer happen to be physically non-contiguous then the
- maximal supported buffer size for that fragmented case would
- be (nsegments * page_size). For example, if a maximal number
- of 10 segments is supported then on i386 maximal guaranteed
- supported buffer size would be 40K. If a higher size is
- desired then special tricks should be used in the driver.
- </para>
- <para>
- If the hardware does not support scatter-gather at all or
- the driver wants to support some buffer size even if it's
- heavily fragmented then the solution is to allocate a
- contiguous buffer in the driver and use it as intermediate
- storage if the original buffer does not fit.
- </para>
- <para>
- Below are the typical call sequences when using a map depend
- on the use of the map. The characters -> are used to show
- the flow of time.
- </para>
- <para>
- For a buffer which stays practically fixed during all the
- time between attachment and detachment of a device:</para>
- <para>
- bus_dmamem_alloc -> bus_dmamap_load -> ...use buffer... ->
- -> bus_dmamap_unload -> bus_dmamem_free
- </para>
-
- <para>For a buffer that changes frequently and is passed from
- outside the driver:
-
- <!-- XXX is this correct? -->
- <programlisting> bus_dmamap_create ->
- -> bus_dmamap_load -> bus_dmamap_sync(PRE...) -> do transfer ->
- -> bus_dmamap_sync(POST...) -> bus_dmamap_unload ->
- ...
- -> bus_dmamap_load -> bus_dmamap_sync(PRE...) -> do transfer ->
- -> bus_dmamap_sync(POST...) -> bus_dmamap_unload ->
- -> bus_dmamap_destroy </programlisting>
-
- </para>
- <para>
- When loading a map created by
- <function>bus_dmamem_alloc()</function> the passed address
- and size of the buffer must be the same as used in
- <function>bus_dmamem_alloc()</function>. In this case it is
- guaranteed that the whole buffer will be mapped as one
- segment (so the callback may be based on this assumption)
- and the request will be executed immediately (EINPROGRESS
- will never be returned). All the callback needs to do in
- this case is to save the physical address.
- </para>
- <para>
- A typical example would be:
- </para>
-
- <programlisting> static void
- alloc_callback(void *arg, bus_dma_segment_t *seg, int nseg, int error)
- {
- *(bus_addr_t *)arg = seg[0].ds_addr;
- }
-
- ...
- int error;
- struct somedata {
- ....
- };
- struct somedata *vsomedata; /* virtual address */
- bus_addr_t psomedata; /* physical bus-relative address */
- bus_dma_tag_t tag_somedata;
- bus_dmamap_t map_somedata;
- ...
-
- error=bus_dma_tag_create(parent_tag, alignment,
- boundary, lowaddr, highaddr, /*filter*/ NULL, /*filterarg*/ NULL,
- /*maxsize*/ sizeof(struct somedata), /*nsegments*/ 1,
- /*maxsegsz*/ sizeof(struct somedata), /*flags*/ 0,
- &#38;tag_somedata);
- if(error)
- return error;
-
- error = bus_dmamem_alloc(tag_somedata, &#38;vsomedata, /* flags*/ 0,
- &#38;map_somedata);
- if(error)
- return error;
-
- bus_dmamap_load(tag_somedata, map_somedata, (void *)vsomedata,
- sizeof (struct somedata), alloc_callback,
- (void *) &#38;psomedata, /*flags*/0); </programlisting>
-
- <para>
- Looks a bit long and complicated but that's the way to do
- it. The practical consequence is: if multiple memory areas
- are allocated always together it would be a really good idea
- to combine them all into one structure and allocate as one
- (if the alignment and boundary limitations permit).
- </para>
- <para>
- When loading an arbitrary buffer into the map created by
- <function>bus_dmamap_create()</function> special measures
- must be taken to synchronize with the callback in case it
- would be delayed. The code would look like:
- </para>
-
- <programlisting> {
- int s;
- int error;
-
- s = splsoftvm();
- error = bus_dmamap_load(
- dmat,
- dmamap,
- buffer_ptr,
- buffer_len,
- callback,
- /*callback_arg*/ buffer_descriptor,
- /*flags*/0);
- if (error == EINPROGRESS) {
- /*
- * Do whatever is needed to ensure synchronization
- * with callback. Callback is guaranteed not to be started
- * until we do splx() or tsleep().
- */
- }
- splx(s);
- } </programlisting>
-
- <para>
- Two possible approaches for the processing of requests are:
- </para>
- <para>
- 1. If requests are completed by marking them explicitly as
- done (such as the CAM requests) then it would be simpler to
- put all the further processing into the callback driver
- which would mark the request when it's done. Then not much
- extra synchronization is needed. For the flow control
- reasons it may be a good idea to freeze the request queue
- until this request gets completed.
- </para>
- <para>
- 2. If requests are completed when the function returns (such
- as classic read or write requests on character devices) then
- a synchronization flag should be set in the buffer
- descriptor and <function>tsleep()</function> called. Later
- when the callback gets called it will do it's processing and
- check this synchronization flag. If it's set then the
- callback should issue a wakeup. In this approach the
- callback function could either do all the needed processing
- (just like the previous case) or simply save the segments
- array in the buffer descriptor. Then after callback
- completes the calling function could use this saved segments
- array and do all the processing.
-
- </para>
- </sect1>
-<!--_________________________________________________________________________-->
-<!--~~~~~~~~~~~~~~~~~~~~END OF SECTION~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-->
-
- <sect1>
- <title>DMA</title>
- <!-- Section Marked up by Wylie -->
- <para>
- The Direct Memory Access (DMA) is implemented in the ISA bus
- through the DMA controller (actually, two of them but that's
- an irrelevant detail). To make the early ISA devices simple
- and cheap the logic of the bus control and address
- generation was concentrated in the DMA controller.
- Fortunately, FreeBSD provides a set of functions that mostly
- hide the annoying details of the DMA controller from the
- device drivers.
- </para>
-
- <para>
- The simplest case is for the fairly intelligent
- devices. Like the bus master devices on PCI they can
- generate the bus cycles and memory addresses all by
- themselves. The only thing they really need from the DMA
- controller is bus arbitration. So for this purpose they
- pretend to be cascaded slave DMA controllers. And the only
- thing needed from the system DMA controller is to enable the
- cascaded mode on a DMA channel by calling the following
- function when attaching the driver:
- </para>
-
- <para>
- <function>void isa_dmacascade(int channel_number)</function>
- </para>
-
- <para>
- All the further activity is done by programming the
- device. When detaching the driver no DMA-related functions
- need to be called.
- </para>
-
- <para>
- For the simpler devices things get more complicated. The
- functions used are:
- </para>
-
- <itemizedlist>
-
- <listitem>
- <para>
- <function>int isa_dma_acquire(int chanel_number)</function>
- </para>
- <para>
- Reserve a DMA channel. Returns 0 on success or EBUSY
- if the channel was already reserved by this or a
- different driver. Most of the ISA devices are not able
- to share DMA channels anyway, so normally this
- function is called when attaching a device. This
- reservation was made redundant by the modern interface
- of bus resources but still must be used in addition to
- the latter. If not used then later, other DMA routines
- will panic.
- </para>
- </listitem>
-
- <listitem>
- <para>
- <function>int isa_dma_release(int chanel_number)</function>
- </para>
- <para>
- Release a previously reserved DMA channel. No
- transfers must be in progress when the channel is
- released (as well as the device must not try to
- initiate transfer after the channel is released).
- </para>
- </listitem>
-
- <listitem>
- <para>
- <function>void isa_dmainit(int chan, u_int
- bouncebufsize)</function>
- </para>
- <para>
- Allocate a bounce buffer for use with the specified
- channel. The requested size of the buffer can't exceed
- 64KB. This bounce buffer will be automatically used
- later if a transfer buffer happens to be not
- physically contiguous or outside of the memory
- accessible by the ISA bus or crossing the 64KB
- boundary. If the transfers will be always done from
- buffers which conform to these conditions (such as
- those allocated by
- <function>bus_dmamem_alloc()</function> with proper
- limitations) then <function>isa_dmainit()</function>
- does not have to be called. But it's quite convenient
- to transfer arbitrary data using the DMA controller.
- The bounce buffer will automatically care of the
- scatter-gather issues.
- </para>
- <!-- <blockquote> -->
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>chan</emphasis> - channel number
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>bouncebufsize</emphasis> - size of the
- bounce buffer in bytes
- </para>
- </listitem>
- </itemizedlist>
-<!-- </blockquote> -->
-<!--</para> -->
- </listitem>
-
- <listitem>
- <para>
- <function>void isa_dmastart(int flags, caddr_t addr, u_int
- nbytes, int chan)</function>
- </para>
- <para>
- Prepare to start a DMA transfer. This function must be
- called to set up the DMA controller before actually
- starting transfer on the device. It checks that the
- buffer is contiguous and falls into the ISA memory
- range, if not then the bounce buffer is automatically
- used. If bounce buffer is required but not set up by
- <function>isa_dmainit()</function> or too small for
- the requested transfer size then the system will
- panic. In case of a write request with bounce buffer
- the data will be automatically copied to the bounce
- buffer.
- </para>
- </listitem>
- <listitem>
- <para>flags - a bitmask determining the type of operation to
- be done. The direction bits B_READ and B_WRITE are mutually
- exclusive.
- </para>
- <!-- <blockquote> -->
- <itemizedlist>
- <listitem>
- <para>
- B_READ - read from the ISA bus into memory
- </para>
- </listitem>
- <listitem>
- <para>
- B_WRITE - write from the memory to the ISA bus
- </para>
- </listitem>
- <listitem>
- <para>
- B_RAW - if set then the DMA controller will remember
- the buffer and after the end of transfer will
- automatically re-initialize itself to repeat transfer
- of the same buffer again (of course, the driver may
- change the data in the buffer before initiating
- another transfer in the device). If not set then the
- parameters will work only for one transfer, and
- <function>isa_dmastart()</function> will have to be
- called again before initiating the next
- transfer. Using B_RAW makes sense only if the bounce
- buffer is not used.
- </para>
- </listitem>
- </itemizedlist>
-<!-- </blockquote> -->
- </listitem>
- <listitem>
- <para>
- addr - virtual address of the buffer
- </para>
- </listitem>
- <listitem>
- <para>
- nbytes - length of the buffer. Must be less or equal to
- 64KB. Length of 0 is not allowed: the DMA controller will
- understand it as 64KB while the kernel code will
- understand it as 0 and that would cause unpredictable
- effects. For channels number 4 and higher the length must
- be even because these channels transfer 2 bytes at a
- time. In case of an odd length the last byte will not be
- transferred.
- </para>
- </listitem>
- <listitem>
- <para>
- chan - channel number
- </para>
- </listitem>
-
- <listitem>
- <para>
- <function>void isa_dmadone(int flags, caddr_t addr, int
- nbytes, int chan)</function>
- </para>
- <para>
- Synchronize the memory after device reports that transfer
- is done. If that was a read operation with a bounce buffer
- then the data will be copied from the bounce buffer to the
- original buffer. Arguments are the same as for
- <function>isa_dmastart()</function>. Flag B_RAW is
- permitted but it does not affect
- <function>isa_dmadone()</function> in any way.
- </para>
- </listitem>
-
- <listitem>
- <para>
- <function>int isa_dmastatus(int channel_number)</function>
- </para>
- <para>
- Returns the number of bytes left in the current transfer
- to be transferred. In case the flag B_READ was set in
- <function>isa_dmastart()</function> the number returned
- will never be equal to zero. At the end of transfer it
- will be automatically reset back to the length of
- buffer. The normal use is to check the number of bytes
- left after the device signals that the transfer is
- completed. If the number of bytes is not 0 then probably
- something went wrong with that transfer.
- </para>
- </listitem>
-
- <listitem>
- <para>
- <function>int isa_dmastop(int channel_number)</function>
- </para>
- <para>
- Aborts the current transfer and returns the number of
- bytes left untransferred.
- </para>
- </listitem>
- </itemizedlist>
- </sect1>
-
- <sect1>
- <title>xxx_isa_probe</title>
- <!-- Section marked up by Wylie -->
-
- <para>
- This function probes if a device is present. If the driver
- supports auto-detection of some part of device configuration
- (such as interrupt vector or memory address) this
- auto-detection must be done in this routine.
- </para>
-
- <para>
- As for any other bus, if the device cannot be detected or
- is detected but failed the self-test or some other problem
- happened then it returns a positive value of error. The
- value ENXIO must be returned if the device is not
- present. Other error values may mean other conditions. Zero
- or negative values mean success. Most of the drivers return
- zero as success.
- </para>
-
- <para>
- The negative return values are used when a PnP device
- supports multiple interfaces. For example, an older
- compatibility interface and a newer advanced interface which
- are supported by different drivers. Then both drivers would
- detect the device. The driver which returns a higher value
- in the probe routine takes precedence (in other words, the
- driver returning 0 has highest precedence, one returning -1
- is next, one returning -2 is after it and so on). In result
- the devices which support only the old interface will be
- handled by the old driver (which should return -1 from the
- probe routine) while the devices supporting the new
- interface as well will be handled by the new driver (which
- should return 0 from the probe routine).
- </para>
-
- <para>
- The device descriptor struct xxx_softc is allocated by the
- system before calling the probe routine. If the probe
- routine returns an error the descriptor will be
- automatically deallocated by the system. So if a probing
- error occurs the driver must make sure that all the
- resources it used during probe are deallocated and that
- nothing keeps the descriptor from being safely
- deallocated. If the probe completes successfully the
- descriptor will be preserved by the system and later passed
- to the routine <function>xxx_isa_attach()</function>. If a
- driver returns a negative value it can't be sure that it
- will have the highest priority and its attach routine will
- be called. So in this case it also must release all the
- resources before returning and if necessary allocate them
- again in the attach routine. When
- <function>xxx_isa_probe()</function> returns 0 releasing the
- resources before returning is also a good idea, a
- well-behaved driver should do so. But in case if there is
- some problem with releasing the resources the driver is
- allowed to keep resources between returning 0 from the probe
- routine and execution of the attach routine.
- </para>
-
- <para>
- A typical probe routine starts with getting the device
- descriptor and unit:
- </para>
-
- <programlisting> struct xxx_softc *sc = device_get_softc(dev);
- int unit = device_get_unit(dev);
- int pnperror;
- int error = 0;
-
- sc->dev = dev; /* link it back */
- sc->unit = unit; </programlisting>
-
- <para>
- Then check for the PnP devices. The check is carried out by
- a table containing the list of PnP IDs supported by this
- driver and human-readable descriptions of the device models
- corresponding to these IDs.
- </para>
-
- <programlisting>
- pnperror=ISA_PNP_PROBE(device_get_parent(dev), dev,
- xxx_pnp_ids); if(pnperror == ENXIO) return ENXIO;
- </programlisting>
-
- <para>
- The logic of ISA_PNP_PROBE is the following: If this card
- (device unit) was not detected as PnP then ENOENT will be
- returned. If it was detected as PnP but its detected ID does
- not match any of the IDs in the table then ENXIO is
- returned. Finally, if it has PnP support and it matches on
- of the IDs in the table, 0 is returned and the appropriate
- description from the table is set by
- <function>device_set_desc()</function>.
- </para>
-
- <para>
- If a driver supports only PnP devices then the condition
- would look like:
- </para>
-
- <programlisting> if(pnperror != 0)
- return pnperror; </programlisting>
-
- <para>
- No special treatment is required for the drivers which don't
- support PnP because they pass an empty PnP ID table and will
- always get ENXIO if called on a PnP card.
- </para>
-
- <para>
- The probe routine normally needs at least some minimal set
- of resources, such as I/O port number to find the card and
- probe it. Depending on the hardware the driver may be able
- to discover the other necessary resources automatically. The
- PnP devices have all the resources pre-set by the PnP
- subsystem, so the driver does not need to discover them by
- itself.
- </para>
-
- <para>
- Typically the minimal information required to get access to
- the device is the I/O port number. Then some devices allow
- to get the rest of information from the device configuration
- registers (though not all devices do that). So first we try
- to get the port start value:
- </para>
-
- <programlisting> sc->port0 = bus_get_resource_start(dev,
- SYS_RES_IOPORT, 0 /*rid*/); if(sc->port0 == 0) return ENXIO;
- </programlisting>
-
- <para>
- The base port address is saved in the structure softc for
- future use. If it will be used very often then calling the
- resource function each time would be prohibitively slow. If
- we don't get a port we just return an error. Some device
- drivers can instead be clever and try to probe all the
- possible ports, like this:
- </para>
-
- <programlisting>
- /* table of all possible base I/O port addresses for this device */
- static struct xxx_allports {
- u_short port; /* port address */
- short used; /* flag: if this port is already used by some unit */
- } xxx_allports = {
- { 0x300, 0 },
- { 0x320, 0 },
- { 0x340, 0 },
- { 0, 0 } /* end of table */
- };
-
- ...
- int port, i;
- ...
-
- port = bus_get_resource_start(dev, SYS_RES_IOPORT, 0 /*rid*/);
- if(port !=0 ) {
- for(i=0; xxx_allports[i].port!=0; i++) {
- if(xxx_allports[i].used || xxx_allports[i].port != port)
- continue;
-
- /* found it */
- xxx_allports[i].used = 1;
- /* do probe on a known port */
- return xxx_really_probe(dev, port);
- }
- return ENXIO; /* port is unknown or already used */
- }
-
- /* we get here only if we need to guess the port */
- for(i=0; xxx_allports[i].port!=0; i++) {
- if(xxx_allports[i].used)
- continue;
-
- /* mark as used - even if we find nothing at this port
- * at least we won't probe it in future
- */
- xxx_allports[i].used = 1;
-
- error = xxx_really_probe(dev, xxx_allports[i].port);
- if(error == 0) /* found a device at that port */
- return 0;
- }
- /* probed all possible addresses, none worked */
- return ENXIO;</programlisting>
-
- <para>
- Of course, normally the driver's
- <function>identify()</function> routine should be used for
- such things. But there may be one valid reason why it may be
- better to be done in <function>probe()</function>: if this
- probe would drive some other sensitive device crazy. The
- probe routines are ordered with consideration of the
- "sensitive" flag: the sensitive devices get probed first and
- the rest of devices later. But the
- <function>identify()</function> routines are called before
- any probes, so they show no respect to the sensitive devices
- and may upset them.
- </para>
-
- <para>
- Now, after we got the starting port we need to set the port
- count (except for PnP devices) because the kernel does not
- have this information in the configuration file.
- </para>
-
- <programlisting>
- if(pnperror /* only for non-PnP devices */
- &#38;&#38; bus_set_resource(dev, SYS_RES_IOPORT, 0, sc->port0,
- XXX_PORT_COUNT)&lt;0)
- return ENXIO;</programlisting>
-
- <para>
- Finally allocate and activate a piece of port address space
- (special values of start and end mean "use those we set by
- <function>bus_set_resource()</function>"):
- </para>
-
- <programlisting>
- sc->port0_rid = 0;
- sc->port0_r = bus_alloc_resource(dev, SYS_RES_IOPORT,
- &#38;sc->port0_rid,
- /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE);
-
- if(sc->port0_r == NULL)
- return ENXIO;</programlisting>
-
- <para>
- Now having access to the port-mapped registers we can poke
- the device in some way and check if it reacts like it is
- expected to. If it does not then there is probably some
- other device or no device at all at this address.
- </para>
-
- <para>
- Normally drivers don't set up the interrupt handlers until
- the attach routine. Instead they do probes in the polling
- mode using the <function>DELAY()</function> function for
- timeout. The probe routine must never hang forever, all the
- waits for the device must be done with timeouts. If the
- device does not respond within the time it's probably broken
- or misconfigured and the driver must return error. When
- determining the timeout interval give the device some extra
- time to be on the safe side: although
- <function>DELAY()</function> is supposed to delay for the
- same amount of time on any machine it has some margin of
- error, depending on the exact CPU.
- </para>
-
- <para>
- If the probe routine really wants to check that the
- interrupts really work it may configure and probe the
- interrupts too. But that's not recommended.
- </para>
-
- <programlisting>
- /* implemented in some very device-specific way */
- if(error = xxx_probe_ports(sc))
- goto bad; /* will deallocate the resources before returning */
- </programlisting>
-
- <para>
- The fucntion <function>xxx_probe_ports()</function> may also
- set the device description depending on the exact model of
- device it discovers. But if there is only one supported
- device model this can be as well done in a hardcoded way.
- Of course, for the PnP devices the PnP support sets the
- description from the table automatically.
- </para>
-
-
- <programlisting> if(pnperror)
- device_set_desc(dev, "Our device model 1234");
- </programlisting>
-
- <para>
- Then the probe routine should either discover the ranges of
- all the resources by reading the device configuration
- registers or make sure that they were set explicitly by the
- user. We will consider it with an example of on-board
- memory. The probe routine should be as non-intrusive as
- possible, so allocation and check of functionality of the
- rest of resources (besides the ports) would be better left
- to the attach routine.
- </para>
-
- <para>
- The memory address may be specified in the kernel
- configuration file or on some devices it may be
- pre-configured in non-volatile configuration registers. If
- both sources are available and different, which one should
- be used? Probably if the user bothered to set the address
- explicitly in the kernel configuration file they know what
- they're doing and this one should take precedence. An
- example of implementation could be:
- </para>
- <programlisting>
- /* try to find out the config address first */
- sc->mem0_p = bus_get_resource_start(dev, SYS_RES_MEMORY, 0 /*rid*/);
- if(sc->mem0_p == 0) { /* nope, not specified by user */
- sc->mem0_p = xxx_read_mem0_from_device_config(sc);
-
-
- if(sc->mem0_p == 0)
- /* can't get it from device config registers either */
- goto bad;
- } else {
- if(xxx_set_mem0_address_on_device(sc) &lt; 0)
- goto bad; /* device does not support that address */
- }
-
- /* just like the port, set the memory size,
- * for some devices the memory size would not be constant
- * but should be read from the device configuration registers instead
- * to accommodate different models of devices. Another option would
- * be to let the user set the memory size as "msize" configuration
- * resource which will be automatically handled by the ISA bus.
- */
- if(pnperror) { /* only for non-PnP devices */
- sc->mem0_size = bus_get_resource_count(dev, SYS_RES_MEMORY, 0 /*rid*/);
- if(sc->mem0_size == 0) /* not specified by user */
- sc->mem0_size = xxx_read_mem0_size_from_device_config(sc);
-
- if(sc->mem0_size == 0) {
- /* suppose this is a very old model of device without
- * auto-configuration features and the user gave no preference,
- * so assume the minimalistic case
- * (of course, the real value will vary with the driver)
- */
- sc->mem0_size = 8*1024;
- }
-
- if(xxx_set_mem0_size_on_device(sc) &lt; 0)
- goto bad; /* device does not support that size */
-
- if(bus_set_resource(dev, SYS_RES_MEMORY, /*rid*/0,
- sc->mem0_p, sc->mem0_size)&lt;0)
- goto bad;
- } else {
- sc->mem0_size = bus_get_resource_count(dev, SYS_RES_MEMORY, 0 /*rid*/);
- } </programlisting>
-
- <para>
- Resources for IRQ and DRQ are easy to check by analogy.
- </para>
-
- <para>
- If all went well then release all the resources and return success.
- </para>
-
- <programlisting> xxx_free_resources(sc);
- return 0;</programlisting>
-
- <para>
- Finally, handle the troublesome situations. All the
- resources should be deallocated before returning. We make
- use of the fact that before the structure softc is passed to
- us it gets zeroed out, so we can find out if some resource
- was allocated: then its descriptor is non-zero.
- </para>
-
- <programlisting> bad:
-
- xxx_free_resources(sc);
- if(error)
- return error;
- else /* exact error is unknown */
- return ENXIO;</programlisting>
-
- <para>
- That would be all for the probe routine. Freeing of
- resources is done from multiple places, so it's moved to a
- function which may look like:
- </para>
-
-<programlisting>static void
- xxx_free_resources(sc)
- struct xxx_softc *sc;
- {
- /* check every resource and free if not zero */
-
- /* interrupt handler */
- if(sc->intr_r) {
- bus_teardown_intr(sc->dev, sc->intr_r, sc->intr_cookie);
- bus_release_resource(sc->dev, SYS_RES_IRQ, sc->intr_rid,
- sc->intr_r);
- sc->intr_r = 0;
- }
-
- /* all kinds of memory maps we could have allocated */
- if(sc->data_p) {
- bus_dmamap_unload(sc->data_tag, sc->data_map);
- sc->data_p = 0;
- }
- if(sc->data) { /* sc->data_map may be legitimately equal to 0 */
- /* the map will also be freed */
- bus_dmamem_free(sc->data_tag, sc->data, sc->data_map);
- sc->data = 0;
- }
- if(sc->data_tag) {
- bus_dma_tag_destroy(sc->data_tag);
- sc->data_tag = 0;
- }
-
- ... free other maps and tags if we have them ...
-
- if(sc->parent_tag) {
- bus_dma_tag_destroy(sc->parent_tag);
- sc->parent_tag = 0;
- }
-
- /* release all the bus resources */
- if(sc->mem0_r) {
- bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->mem0_rid,
- sc->mem0_r);
- sc->mem0_r = 0;
- }
- ...
- if(sc->port0_r) {
- bus_release_resource(sc->dev, SYS_RES_IOPORT, sc->port0_rid,
- sc->port0_r);
- sc->port0_r = 0;
- }
- }</programlisting>
-
- </sect1>
-
- <sect1>
- <title>xxx_isa_attach</title>
- <!-- Section Marked up by Wylie -->
-
- <para>The attach routine actually connects the driver to the
- system if the probe routine returned success and the system
- had chosen to attach that driver. If the probe routine
- returned 0 then the attach routine may expect to receive the
- device structure softc intact, as it was set by the probe
- routine. Also if the probe routine returns 0 it may expect
- that the attach routine for this device shall be called at
- some point in the future. If the probe routine returns a
- negative value then the driver may make none of these
- assumptions.
- </para>
-
- <para>The attach routine returns 0 if it completed successfully or
- error code otherwise.
- </para>
-
- <para>The attach routine starts just like the probe routine,
- with getting some frequently used data into more accessible
- variables.
- </para>
-
- <programlisting> struct xxx_softc *sc = device_get_softc(dev);
- int unit = device_get_unit(dev);
- int error = 0;</programlisting>
-
- <para>Then allocate and activate all the necessary
- resources. Because normally the port range will be released
- before returning from probe, it has to be allocated
- again. We expect that the probe routine had properly set all
- the resource ranges, as well as saved them in the structure
- softc. If the probe routine had left some resource allocated
- then it does not need to be allocated again (which would be
- considered an error).
- </para>
-
- <programlisting> sc->port0_rid = 0;
- sc->port0_r = bus_alloc_resource(dev, SYS_RES_IOPORT, &#38;sc->port0_rid,
- /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE);
-
- if(sc->port0_r == NULL)
- return ENXIO;
-
- /* on-board memory */
- sc->mem0_rid = 0;
- sc->mem0_r = bus_alloc_resource(dev, SYS_RES_MEMORY, &#38;sc->mem0_rid,
- /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE);
-
- if(sc->mem0_r == NULL)
- goto bad;
-
- /* get its virtual address */
- sc->mem0_v = rman_get_virtual(sc->mem0_r);</programlisting>
-
- <para>The DMA request channel (DRQ) is allocated likewise. To
- initialize it use functions of the
- <function>isa_dma*()</function> family. For example:
- </para>
-
- <para><function>isa_dmacascade(sc->drq0);</function></para>
-
- <para>The interrupt request line (IRQ) is a bit
- special. Besides allocation the driver's interrupt handler
- should be associated with it. Historically in the old ISA
- drivers the argument passed by the system to the interrupt
- handler was the device unit number. But in modern drivers
- the convention suggests passing the pointer to structure
- softc. The important reason is that when the structures
- softc are allocated dynamically then getting the unit number
- from softc is easy while getting softc from unit number is
- difficult. Also this convention makes the drivers for
- different buses look more uniform and allows them to share
- the code: each bus gets its own probe, attach, detach and
- other bus-specific routines while the bulk of the driver
- code may be shared among them.
- </para>
-
- <programlisting>
- sc->intr_rid = 0;
- sc->intr_r = bus_alloc_resource(dev, SYS_RES_MEMORY, &#38;sc->intr_rid,
- /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE);
-
- if(sc->intr_r == NULL)
- goto bad;
-
- /*
- * XXX_INTR_TYPE is supposed to be defined depending on the type of
- * the driver, for example as INTR_TYPE_CAM for a CAM driver
- */
- error = bus_setup_intr(dev, sc->intr_r, XXX_INTR_TYPE,
- (driver_intr_t *) xxx_intr, (void *) sc, &#38;sc->intr_cookie);
- if(error)
- goto bad;
-
- </programlisting>
-
-
- <para>If the device needs to make DMA to the main memory then
- this memory should be allocated like described before:
- </para>
-
- <programlisting> error=bus_dma_tag_create(NULL, /*alignment*/ 4,
- /*boundary*/ 0, /*lowaddr*/ BUS_SPACE_MAXADDR_24BIT,
- /*highaddr*/ BUS_SPACE_MAXADDR, /*filter*/ NULL, /*filterarg*/ NULL,
- /*maxsize*/ BUS_SPACE_MAXSIZE_24BIT,
- /*nsegments*/ BUS_SPACE_UNRESTRICTED,
- /*maxsegsz*/ BUS_SPACE_MAXSIZE_24BIT, /*flags*/ 0,
- &#38;sc->parent_tag);
- if(error)
- goto bad;
-
- /* many things get inherited from the parent tag
- * sc->data is supposed to point to the structure with the shared data,
- * for example for a ring buffer it could be:
- * struct {
- * u_short rd_pos;
- * u_short wr_pos;
- * char bf[XXX_RING_BUFFER_SIZE]
- * } *data;
- */
- error=bus_dma_tag_create(sc->parent_tag, 1,
- 0, BUS_SPACE_MAXADDR, 0, /*filter*/ NULL, /*filterarg*/ NULL,
- /*maxsize*/ sizeof(* sc->data), /*nsegments*/ 1,
- /*maxsegsz*/ sizeof(* sc->data), /*flags*/ 0,
- &#38;sc->data_tag);
- if(error)
- goto bad;
-
- error = bus_dmamem_alloc(sc->data_tag, &#38;sc->data, /* flags*/ 0,
- &#38;sc->data_map);
- if(error)
- goto bad;
-
- /* xxx_alloc_callback() just saves the physical address at
- * the pointer passed as its argument, in this case &#38;sc->data_p.
- * See details in the section on bus memory mapping.
- * It can be implemented like:
- *
- * static void
- * xxx_alloc_callback(void *arg, bus_dma_segment_t *seg,
- * int nseg, int error)
- * {
- * *(bus_addr_t *)arg = seg[0].ds_addr;
- * }
- */
- bus_dmamap_load(sc->data_tag, sc->data_map, (void *)sc->data,
- sizeof (* sc->data), xxx_alloc_callback, (void *) &#38;sc->data_p,
- /*flags*/0);</programlisting>
-
-
- <para>After all the necessary resources are allocated the
- device should be initialized. The initialization may include
- testing that all the expected features are functional.</para>
-
- <programlisting> if(xxx_initialize(sc) &lt; 0)
- goto bad; </programlisting>
-
-
- <para>The bus subsystem will automatically print on the
- console the device description set by probe. But if the
- driver wants to print some extra information about the
- device it may do so, for example:</para>
-
- <programlisting>
- device_printf(dev, "has on-card FIFO buffer of %d bytes\n", sc->fifosize);
- </programlisting>
-
- <para>If the initialization routine experiences any problems
- then printing messages about them before returning error is
- also recommended.</para>
-
- <para>The final step of the attach routine is attaching the
- device to its functional subsystem in the kernel. The exact
- way to do it depends on the type of the driver: a character
- device, a block device, a network device, a CAM SCSI bus
- device and so on.</para>
-
- <para>If all went well then return success.</para>
-
- <programlisting> error = xxx_attach_subsystem(sc);
- if(error)
- goto bad;
-
- return 0; </programlisting>
-
- <para>Finally, handle the troublesome situations. All the
- resources should be deallocated before returning an
- error. We make use of the fact that before the structure
- softc is passed to us it gets zeroed out, so we can find out
- if some resource was allocated: then its descriptor is
- non-zero.</para>
-
- <programlisting> bad:
-
- xxx_free_resources(sc);
- if(error)
- return error;
- else /* exact error is unknown */
- return ENXIO;</programlisting>
-
- <para>That would be all for the attach routine.</para>
-
- </sect1>
-
-
- <sect1>
- <title>xxx_isa_detach</title>
-
- <para>
- If this function is present in the driver and the driver is
- compiled as a loadable module then the driver gets the
- ability to be unloaded. This is an important feature if the
- hardware supports hot plug. But the ISA bus does not support
- hot plug, so this feature is not particularly important for
- the ISA devices. The ability to unload a driver may be
- useful when debugging it, but in many cases installation of
- the new version of the driver would be required only after
- the old version somehow wedges the system and reboot will be
- needed anyway, so the efforts spent on writing the detach
- routine may not be worth it. Another argument is that
- unloading would allow upgrading the drivers on a production
- machine seems to be mostly theoretical. Installing a new
- version of a driver is a dangerous operation which should
- never be performed on a production machine (and which is not
- permitted when the system is running in secure mode). Still
- the detach routine may be provided for the sake of
- completeness.
- </para>
-
- <para>
- The detach routine returns 0 if the driver was successfully
- detached or the error code otherwise.
- </para>
-
- <para>
- The logic of detach is a mirror of the attach. The first
- thing to do is to detach the driver from its kernel
- subsystem. If the device is currently open then the driver
- has two choices: refuse to be detached or forcibly close and
- proceed with detach. The choice used depends on the ability
- of the particular kernel subsystem to do a forced close and
- on the preferences of the driver's author. Generally the
- forced close seems to be the preferred alternative.
- <programlisting> struct xxx_softc *sc = device_get_softc(dev);
- int error;
-
- error = xxx_detach_subsystem(sc);
- if(error)
- return error;</programlisting>
- </para>
- <para>
- Next the driver may want to reset the hardware to some
- consistent state. That includes stopping any ongoing
- transfers, disabling the DMA channels and interrupts to
- avoid memory corruption by the device. For most of the
- drivers this is exactly what the shutdown routine does, so
- if it is included in the driver we can as well just call it.
- </para>
- <para><function>xxx_isa_shutdown(dev);</function></para>
-
- <para>
- And finally release all the resources and return success.
- <programlisting> xxx_free_resources(sc);
- return 0;</programlisting>
-
- </para>
- </sect1>
-
- <sect1>
- <title>xxx_isa_shutdown</title>
-
- <para>
- This routine is called when the system is about to be shut
- down. It is expected to bring the hardware to some
- consistent state. For most of the ISA devices no special
- action is required, so the function is not really necessary
- because the device will be re-initialized on reboot
- anyway. But some devices have to be shut down with a special
- procedure, to make sure that they will be properly detected
- after soft reboot (this is especially true for many devices
- with proprietary identification protocols). In any case
- disabling DMA and interrupts in the device registers and
- stopping any ongoing transfers is a good idea. The exact
- action depends on the hardware, so we don't consider it here
- in any details.
- </para>
-
- <para>
- xxx_intr
- </para>
-
- <para>
- The interrupt handler is called when an interrupt is
- received which may be from this particular device. The ISA
- bus does not support interrupt sharing (except some special
- cases) so in practice if the interrupt handler is called
- then the interrupt almost for sure came from its
- device. Still the interrupt handler must poll the device
- registers and make sure that the interrupt was generated by
- its device. If not it should just return.
- </para>
-
- <para>
- The old convention for the ISA drivers was getting the
- device unit number as an argument. It is obsolete, and the
- new drivers receive whatever argument was specified for them
- in the attach routine when calling
- <function>bus_setup_intr()</function>. By the new convention
- it should be the pointer to the structure softc. So the
- interrupt handler commonly starts as:
- </para>
-
- <programlisting>
- static void
- xxx_intr(struct xxx_softc *sc)
- {
-
- </programlisting>
-
- <para>
- It runs at the interrupt priority level specified by the
- interrupt type parameter of
- <function>bus_setup_intr()</function>. That means that all
- the other interrupts of the same type as well as all the
- software interrupts are disabled.
- </para>
-
- <para>
- To avoid races it is commonly written as a loop:
- </para>
-
- <programlisting>
- while(xxx_interrupt_pending(sc)) {
- xxx_process_interrupt(sc);
- xxx_acknowledge_interrupt(sc);
- } </programlisting>
-
- <para>
- The interrupt handler has to acknowledge interrupt to the
- device only but not to the interrupt controller, the system
- takes care of the latter.
- </para>
-
- </sect1>
-</chapter>
diff --git a/en_US.ISO8859-1/books/developers-handbook/kerneldebug/Makefile b/en_US.ISO8859-1/books/developers-handbook/kerneldebug/Makefile
deleted file mode 100644
index a6d190e942..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/kerneldebug/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-#
-# Build the Handbook with just the content from this chapter.
-#
-# $FreeBSD$
-#
-
-CHAPTERS= kerneldebug/chapter.sgml
-
-VPATH= ..
-
-MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
-
-DOC_PREFIX?= ${.CURDIR}/../../../..
-
-.include "../Makefile"
diff --git a/en_US.ISO8859-1/books/developers-handbook/kerneldebug/chapter.sgml b/en_US.ISO8859-1/books/developers-handbook/kerneldebug/chapter.sgml
deleted file mode 100644
index 83899a6654..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/kerneldebug/chapter.sgml
+++ /dev/null
@@ -1,640 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD: doc/en_US.ISO8859-1/books/developers-handbook/kerneldebug/chapter.sgml,v 1.33 2001/07/06 13:03:01 dd Exp $
--->
-
-<chapter id="kerneldebug">
- <title>Kernel Debugging</title>
-
- <para><emphasis>Contributed by &a.paul; and &a.joerg;</emphasis></para>
-
- <sect1>
- <title>Debugging a Kernel Crash Dump with <command>gdb</command></title>
-
- <para>Here are some instructions for getting kernel debugging
- working on a crash dump. They assume that you have enough swap
- space for a crash dump. If you have multiple swap partitions
- and the first one is too small to hold the dump, you can
- configure your kernel to use an alternate dump device (in the
- <literal>config kernel</literal> line), or you can specify an
- alternate using the &man.dumpon.8; command. The best way to use
- &man.dumpon.8; is to set the <literal>dumpdev</literal> variable
- in <filename>/etc/rc.conf</filename>. Typically you want to
- specify one of the swap devices specified in
- <filename>/etc/fstab</filename>. Dumps to non-swap devices,
- tapes for example, are currently not supported. Config your
- kernel using <command>config <option>-g</option></command>. See
- <ulink url="http://www.FreeBSD.org/handbook">The FreeBSD
- Handbook</ulink> for details on configuring the FreeBSD
- kernel.</para>
-
- <para>Use the &man.dumpon.8; command to tell the kernel where to dump to
- (note that this will have to be done after configuring the partition in
- question as swap space via &man.swapon.8;). This is normally arranged
- via <filename>/etc/rc.conf</filename> and <filename>/etc/rc</filename>.
- Alternatively, you can hard-code the dump device via the
- <literal>dump</literal> clause in the <literal>config</literal> line of
- your kernel config file. This is deprecated and should be used only if
- you want a crash dump from a kernel that crashes during booting.</para>
-
- <note>
- <para>In the following, the term <command>gdb</command> refers to
- the debugger <command>gdb</command> run in <quote>kernel debug
- mode</quote>. This can be accomplished by starting the
- <command>gdb</command> with the option <option>-k</option>. In
- kernel debug mode, <command>gdb</command> changes its prompt to
- <prompt>(kgdb)</prompt>.</para>
- </note>
-
- <tip>
- <para>If you are using FreeBSD 3 or earlier, you should make a stripped
- copy of the debug kernel, rather than installing the large debug
- kernel itself:</para>
-
- <screen>&prompt.root; <userinput>cp kernel kernel.debug</userinput>
-&prompt.root; <userinput>strip -g kernel</userinput></screen>
-
- <para>This stage isn't necessary, but it is recommended. (In
- FreeBSD 4 and later releases this step is performed automatically
- at the end of the kernel <command>make</command> process.)
- When the kernel has been stripped, either automatically or by
- using the commands above, you may install it as usual by typing
- <command>make install</command>.</para>
-
- <para>Note that older releases of FreeBSD (up to but not including
- 3.1) used a.out kernels by default, which must have their symbol
- tables permanently resident in physical memory. With the larger
- symbol table in an unstripped debug kernel, this is wasteful.
- Recent FreeBSD releases use ELF kernels where this is no longer a
- problem.</para>
- </tip>
-
- <para>If you are testing a new kernel, for example by typing the new
- kernel's name at the boot prompt, but need to boot a different one in
- order to get your system up and running again, boot it only into single
- user state using the <option>-s</option> flag at the boot prompt, and
- then perform the following steps:</para>
-
- <screen>&prompt.root; <userinput>fsck -p</userinput>
-&prompt.root; <userinput>mount -a -t ufs</userinput> # so your file system for /var/crash is writable
-&prompt.root; <userinput>savecore -N /kernel.panicked /var/crash</userinput>
-&prompt.root; <userinput>exit</userinput> # ...to multi-user</screen>
-
- <para>This instructs &man.savecore.8; to use another kernel for symbol
- name extraction. It would otherwise default to the currently running
- kernel and most likely not do anything at all since the crash dump and
- the kernel symbols differ.</para>
-
- <para>Now, after a crash dump, go to
- <filename>/sys/compile/WHATEVER</filename> and run
- <command>gdb <option>-k</option></command>. From <command>gdb</command> do:
-
- <screen><userinput>symbol-file kernel.debug</userinput>
-<userinput>exec-file /var/crash/kernel.0</userinput>
-<userinput>core-file /var/crash/vmcore.0</userinput></screen>
-
- and voila, you can debug the crash dump using the kernel sources just
- like you can for any other program.</para>
-
- <para>Here is a script log of a <command>gdb</command> session
- illustrating the procedure. Long lines have been folded to improve
- readability, and the lines are numbered for reference. Despite this, it
- is a real-world error trace taken during the development of the pcvt
- console driver.</para>
-
-<screen> 1:Script started on Fri Dec 30 23:15:22 1994
- 2:&prompt.root; <userinput>cd /sys/compile/URIAH</userinput>
- 3:&prompt.root; <userinput>gdb -k kernel /var/crash/vmcore.1</userinput>
- 4:Reading symbol data from /usr/src/sys/compile/URIAH/kernel
-...done.
- 5:IdlePTD 1f3000
- 6:panic: because you said to!
- 7:current pcb at 1e3f70
- 8:Reading in symbols for ../../i386/i386/machdep.c...done.
- 9:<prompt>(kgdb)</prompt> <userinput>where</userinput>
-10:#0 boot (arghowto=256) (../../i386/i386/machdep.c line 767)
-11:#1 0xf0115159 in panic ()
-12:#2 0xf01955bd in diediedie () (../../i386/i386/machdep.c line 698)
-13:#3 0xf010185e in db_fncall ()
-14:#4 0xf0101586 in db_command (-266509132, -266509516, -267381073)
-15:#5 0xf0101711 in db_command_loop ()
-16:#6 0xf01040a0 in db_trap ()
-17:#7 0xf0192976 in kdb_trap (12, 0, -272630436, -266743723)
-18:#8 0xf019d2eb in trap_fatal (...)
-19:#9 0xf019ce60 in trap_pfault (...)
-20:#10 0xf019cb2f in trap (...)
-21:#11 0xf01932a1 in exception:calltrap ()
-22:#12 0xf0191503 in cnopen (...)
-23:#13 0xf0132c34 in spec_open ()
-24:#14 0xf012d014 in vn_open ()
-25:#15 0xf012a183 in open ()
-26:#16 0xf019d4eb in syscall (...)
-27:<prompt>(kgdb)</prompt> <userinput>up 10</userinput>
-28:Reading in symbols for ../../i386/i386/trap.c...done.
-29:#10 0xf019cb2f in trap (frame={tf_es = -260440048, tf_ds = 16, tf_\
-30:edi = 3072, tf_esi = -266445372, tf_ebp = -272630356, tf_isp = -27\
-31:2630396, tf_ebx = -266427884, tf_edx = 12, tf_ecx = -266427884, tf\
-32:_eax = 64772224, tf_trapno = 12, tf_err = -272695296, tf_eip = -26\
-33:6672343, tf_cs = -266469368, tf_eflags = 66066, tf_esp = 3072, tf_\
-34:ss = -266427884}) (../../i386/i386/trap.c line 283)
-35:283 (void) trap_pfault(&amp;frame, FALSE);
-36:<prompt>(kgdb)</prompt> <userinput>frame frame-&gt;tf_ebp frame-&gt;tf_eip</userinput>
-37:Reading in symbols for ../../i386/isa/pcvt/pcvt_drv.c...done.
-38:#0 0xf01ae729 in pcopen (dev=3072, flag=3, mode=8192, p=(struct p\
-39:roc *) 0xf07c0c00) (../../i386/isa/pcvt/pcvt_drv.c line 403)
-40:403 return ((*linesw[tp-&gt;t_line].l_open)(dev, tp));
-41:<prompt>(kgdb)</prompt> <userinput>list</userinput>
-42:398
-43:399 tp-&gt;t_state |= TS_CARR_ON;
-44:400 tp-&gt;t_cflag |= CLOCAL; /* cannot be a modem (:-) */
-45:401
-46:402 #if PCVT_NETBSD || (PCVT_FREEBSD >= 200)
-47:403 return ((*linesw[tp-&gt;t_line].l_open)(dev, tp));
-48:404 #else
-49:405 return ((*linesw[tp-&gt;t_line].l_open)(dev, tp, flag));
-50:406 #endif /* PCVT_NETBSD || (PCVT_FREEBSD >= 200) */
-51:407 }
-52:<prompt>(kgdb)</prompt> <userinput>print tp</userinput>
-53:Reading in symbols for ../../i386/i386/cons.c...done.
-54:$1 = (struct tty *) 0x1bae
-55:<prompt>(kgdb)</prompt> <userinput>print tp-&gt;t_line</userinput>
-56:$2 = 1767990816
-57:<prompt>(kgdb)</prompt> <userinput>up</userinput>
-58:#1 0xf0191503 in cnopen (dev=0x00000000, flag=3, mode=8192, p=(st\
-59:ruct proc *) 0xf07c0c00) (../../i386/i386/cons.c line 126)
-60: return ((*cdevsw[major(dev)].d_open)(dev, flag, mode, p));
-61:<prompt>(kgdb)</prompt> <userinput>up</userinput>
-62:#2 0xf0132c34 in spec_open ()
-63:<prompt>(kgdb)</prompt> <userinput>up</userinput>
-64:#3 0xf012d014 in vn_open ()
-65:<prompt>(kgdb)</prompt> <userinput>up</userinput>
-66:#4 0xf012a183 in open ()
-67:<prompt>(kgdb)</prompt> <userinput>up</userinput>
-68:#5 0xf019d4eb in syscall (frame={tf_es = 39, tf_ds = 39, tf_edi =\
-69: 2158592, tf_esi = 0, tf_ebp = -272638436, tf_isp = -272629788, tf\
-70:_ebx = 7086, tf_edx = 1, tf_ecx = 0, tf_eax = 5, tf_trapno = 582, \
-71:tf_err = 582, tf_eip = 75749, tf_cs = 31, tf_eflags = 582, tf_esp \
-72:= -272638456, tf_ss = 39}) (../../i386/i386/trap.c line 673)
-73:673 error = (*callp-&gt;sy_call)(p, args, rval);
-74:<prompt>(kgdb)</prompt> <userinput>up</userinput>
-75:Initial frame selected; you cannot go up.
-76:<prompt>(kgdb)</prompt> <userinput>quit</userinput>
-77:&prompt.root; <userinput>exit</userinput>
-78:exit
-79:
-80:Script done on Fri Dec 30 23:18:04 1994</screen>
- <para>Comments to the above script:</para>
-
- <variablelist>
- <varlistentry>
- <term>line 6:</term>
-
- <listitem>
- <para>This is a dump taken from within DDB (see below), hence the
- panic comment <quote>because you said to!</quote>, and a rather
- long stack trace; the initial reason for going into DDB has been a
- page fault trap though.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>line 20:</term>
-
- <listitem>
- <para>This is the location of function <function>trap()</function>
- in the stack trace.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>line 36:</term>
-
- <listitem>
- <para>Force usage of a new stack frame; this is no longer necessary
- now. The stack frames are supposed to point to the right
- locations now, even in case of a trap.
- From looking at the code in source line 403, there is a
- high probability that either the pointer access for
- <quote>tp</quote> was messed up, or the array access was out of
- bounds.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>line 52:</term>
-
- <listitem>
- <para>The pointer looks suspicious, but happens to be a valid
- address.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>line 56:</term>
-
- <listitem>
- <para>However, it obviously points to garbage, so we have found our
- error! (For those unfamiliar with that particular piece of code:
- <literal>tp-&gt;t_line</literal> refers to the line discipline of
- the console device here, which must be a rather small integer
- number.)</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect1>
-
- <sect1>
- <title>Debugging a Crash Dump with DDD</title>
-
- <para>Examining a kernel crash dump with a graphical debugger like
- <command>ddd</command> is also possible. Add the <option>-k</option>
- option to the <command>ddd</command> command line you would use
- normally. For example;</para>
-
- <screen>&prompt.root; <userinput>ddd -k /var/crash/kernel.0 /var/crash/vmcore.0</userinput></screen>
-
- <para>You should then be able to go about looking at the crash dump using
- <command>ddd</command>'s graphical interface.</para>
- </sect1>
-
- <sect1>
- <title>Post-Mortem Analysis of a Dump</title>
-
- <para>What do you do if a kernel dumped core but you did not expect it,
- and it is therefore not compiled using <command>config -g</command>? Not
- everything is lost here. Do not panic!</para>
-
- <para>Of course, you still need to enable crash dumps. See above on the
- options you have to specify in order to do this.</para>
-
- <para>Go to your kernel config directory
- (<filename>/usr/src/sys/<replaceable>arch</replaceable>/conf</filename>)
- and edit your configuration file. Uncomment (or add, if it does not
- exist) the following line</para>
-
- <programlisting>makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols</programlisting>
-
- <para>Rebuild the kernel. Due to the time stamp change on the Makefile,
- there will be some other object files rebuild, for example
- <filename>trap.o</filename>. With a bit of luck, the added
- <option>-g</option> option will not change anything for the generated
- code, so you will finally get a new kernel with similar code to the
- faulting one but some debugging symbols. You should at least verify the
- old and new sizes with the &man.size.1; command. If there is a
- mismatch, you probably need to give up here.</para>
-
- <para>Go and examine the dump as described above. The debugging symbols
- might be incomplete for some places, as can be seen in the stack trace
- in the example above where some functions are displayed without line
- numbers and argument lists. If you need more debugging symbols, remove
- the appropriate object files and repeat the <command>gdb <option>-k</option></command>
- session until you know enough.</para>
-
- <para>All this is not guaranteed to work, but it will do it fine in most
- cases.</para>
- </sect1>
-
- <sect1>
- <title>On-Line Kernel Debugging Using DDB</title>
-
- <para>While <command>gdb <option>-k</option></command> as an off-line debugger provides a very
- high level of user interface, there are some things it cannot do. The
- most important ones being breakpointing and single-stepping kernel
- code.</para>
-
- <para>If you need to do low-level debugging on your kernel, there is an
- on-line debugger available called DDB. It allows to setting
- breakpoints, single-stepping kernel functions, examining and changing
- kernel variables, etc. However, it cannot access kernel source files,
- and only has access to the global and static symbols, not to the full
- debug information like <command>gdb</command>.</para>
-
- <para>To configure your kernel to include DDB, add the option line
-
- <programlisting>options DDB</programlisting>
-
- to your config file, and rebuild. (See <ulink
- url="http://www.FreeBSD.org/handbook">The FreeBSD Handbook</ulink> for details on
- configuring the FreeBSD kernel.</para>
-
- <note>
- <para>If you have an older version of the boot blocks, your
- debugger symbols might not be loaded at all. Update the boot blocks;
- the recent ones load the DDB symbols automagically.)</para>
- </note>
-
- <para>Once your DDB kernel is running, there are several ways to enter
- DDB. The first, and earliest way is to type the boot flag
- <option>-d</option> right at the boot prompt. The kernel will start up
- in debug mode and enter DDB prior to any device probing. Hence you can
- even debug the device probe/attach functions.</para>
-
- <para>The second scenario is a hot-key on the keyboard, usually
- Ctrl-Alt-ESC. For syscons, this can be remapped; some of the
- distributed maps do this, so watch out. There is an option available
- for serial consoles that allows the use of a serial line BREAK on the
- console line to enter DDB (<literal>options BREAK_TO_DEBUGGER</literal>
- in the kernel config file). It is not the default since there are a lot
- of crappy serial adapters around that gratuitously generate a BREAK
- condition, for example when pulling the cable.</para>
-
- <para>The third way is that any panic condition will branch to DDB if the
- kernel is configured to use it. For this reason, it is not wise to
- configure a kernel with DDB for a machine running unattended.</para>
-
- <para>The DDB commands roughly resemble some <command>gdb</command>
- commands. The first thing you probably need to do is to set a
- breakpoint:</para>
-
- <screen><userinput>b function-name</userinput>
-<userinput>b address</userinput></screen>
-
- <para>Numbers are taken hexadecimal by default, but to make them distinct
- from symbol names; hexadecimal numbers starting with the letters
- <literal>a-f</literal> need to be preceded with <literal>0x</literal>
- (this is optional for other numbers). Simple expressions are allowed,
- for example: <literal>function-name + 0x103</literal>.</para>
-
- <para>To continue the operation of an interrupted kernel, simply
- type:</para>
-
- <screen><userinput>c</userinput></screen>
-
- <para>To get a stack trace, use:</para>
-
- <screen><userinput>trace</userinput></screen>
-
- <note>
- <para>Note that when entering DDB via a hot-key, the kernel is currently
- servicing an interrupt, so the stack trace might be not of much use
- for you.</para>
- </note>
-
- <para>If you want to remove a breakpoint, use</para>
-
-
- <screen><userinput>del</userinput>
-<userinput>del address-expression</userinput></screen>
-
- <para>The first form will be accepted immediately after a breakpoint hit,
- and deletes the current breakpoint. The second form can remove any
- breakpoint, but you need to specify the exact address; this can be
- obtained from:</para>
-
- <screen><userinput>show b</userinput></screen>
-
- <para>To single-step the kernel, try:</para>
-
- <screen><userinput>s</userinput></screen>
-
- <para>This will step into functions, but you can make DDB trace them until
- the matching return statement is reached by:</para>
-
- <screen><userinput>n</userinput></screen>
-
- <note>
- <para>This is different from <command>gdb</command>'s
- <command>next</command> statement; it is like <command>gdb</command>'s
- <command>finish</command>.</para>
- </note>
-
- <para>To examine data from memory, use (for example):
-
- <screen><userinput>x/wx 0xf0133fe0,40</userinput>
-<userinput>x/hd db_symtab_space</userinput>
-<userinput>x/bc termbuf,10</userinput>
-<userinput>x/s stringbuf</userinput></screen>
-
- for word/halfword/byte access, and hexadecimal/decimal/character/ string
- display. The number after the comma is the object count. To display
- the next 0x10 items, simply use:</para>
-
- <screen><userinput>x ,10</userinput></screen>
-
- <para>Similarly, use
-
- <screen><userinput>x/ia foofunc,10</userinput></screen>
-
- to disassemble the first 0x10 instructions of
- <function>foofunc</function>, and display them along with their offset
- from the beginning of <function>foofunc</function>.</para>
-
- <para>To modify memory, use the write command:</para>
-
- <screen><userinput>w/b termbuf 0xa 0xb 0</userinput>
-<userinput>w/w 0xf0010030 0 0</userinput></screen>
-
- <para>The command modifier
- (<literal>b</literal>/<literal>h</literal>/<literal>w</literal>)
- specifies the size of the data to be written, the first following
- expression is the address to write to and the remainder is interpreted
- as data to write to successive memory locations.</para>
-
- <para>If you need to know the current registers, use:</para>
-
- <screen><userinput>show reg</userinput></screen>
-
- <para>Alternatively, you can display a single register value by e.g.
-
- <screen><userinput>p $eax</userinput></screen>
-
- and modify it by:</para>
-
- <screen><userinput>set $eax new-value</userinput></screen>
-
- <para>Should you need to call some kernel functions from DDB, simply
- say:</para>
-
- <screen><userinput>call func(arg1, arg2, ...)</userinput></screen>
-
- <para>The return value will be printed.</para>
-
- <para>For a &man.ps.1; style summary of all running processes, use:</para>
-
- <screen><userinput>ps</userinput></screen>
-
- <para>Now you have examined why your kernel failed, and you wish to
- reboot. Remember that, depending on the severity of previous
- malfunctioning, not all parts of the kernel might still be working as
- expected. Perform one of the following actions to shut down and reboot
- your system:</para>
-
- <screen><userinput>panic</userinput></screen>
-
- <para>This will cause your kernel to dump core and reboot, so you can
- later analyze the core on a higher level with <command>gdb</command>. This command
- usually must be followed by another <command>continue</command>
- statement.</para>
-
- <screen><userinput>call boot(0)</userinput></screen>
-
- <para>Which might be a good way to cleanly shut down the running system,
- <function>sync()</function> all disks, and finally reboot. As long as
- the disk and file system interfaces of the kernel are not damaged, this
- might be a good way for an almost clean shutdown.</para>
-
- <screen><userinput>call cpu_reset()</userinput></screen>
-
- <para>is the final way out of disaster and almost the same as hitting the
- Big Red Button.</para>
-
- <para>If you need a short command summary, simply type:</para>
-
- <screen><userinput>help</userinput></screen>
-
- <para>However, it is highly recommended to have a printed copy of the
- &man.ddb.4; manual page ready for a debugging
- session. Remember that it is hard to read the on-line manual while
- single-stepping the kernel.</para>
- </sect1>
-
- <sect1>
- <title>On-Line Kernel Debugging Using Remote GDB</title>
-
- <para>This feature has been supported since FreeBSD 2.2, and it is
- actually a very neat one.</para>
-
- <para>GDB has already supported <emphasis>remote debugging</emphasis> for
- a long time. This is done using a very simple protocol along a serial
- line. Unlike the other methods described above, you will need two
- machines for doing this. One is the host providing the debugging
- environment, including all the sources, and a copy of the kernel binary
- with all the symbols in it, and the other one is the target machine that
- simply runs a similar copy of the very same kernel (but stripped of the
- debugging information).</para>
-
- <para>You should configure the kernel in question with <command>config
- -g</command>, include <option>DDB</option> into the configuration, and
- compile it as usual. This gives a large blurb of a binary, due to the
- debugging information. Copy this kernel to the target machine, strip
- the debugging symbols off with <command>strip -x</command>, and boot it
- using the <option>-d</option> boot option. Connect the serial line
- of the target machine that has "flags 080" set on its sio device
- to any serial line of the debugging host.
- Now, on the debugging machine, go to the compile directory of the target
- kernel, and start <command>gdb</command>:</para>
-
- <screen>&prompt.user; <userinput>gdb -k kernel</userinput>
-GDB is free software and you are welcome to distribute copies of it
- under certain conditions; type "show copying" to see the conditions.
-There is absolutely no warranty for GDB; type "show warranty" for details.
-GDB 4.16 (i386-unknown-freebsd),
-Copyright 1996 Free Software Foundation, Inc...
-<prompt>(kgdb)</prompt> </screen>
-
- <para>Initialize the remote debugging session (assuming the first serial
- port is being used) by:</para>
-
- <screen><prompt>(kgdb)</prompt> <userinput>target remote /dev/cuaa0</userinput></screen>
-
- <para>Now, on the target host (the one that entered DDB right before even
- starting the device probe), type:</para>
-
- <screen>Debugger("Boot flags requested debugger")
-Stopped at Debugger+0x35: movb $0, edata+0x51bc
-<prompt>db&gt;</prompt> <userinput>gdb</userinput></screen>
-
- <para>DDB will respond with:</para>
-
- <screen>Next trap will enter GDB remote protocol mode</screen>
-
- <para>Every time you type <command>gdb</command>, the mode will be toggled
- between remote GDB and local DDB. In order to force a next trap
- immediately, simply type <command>s</command> (step). Your hosting GDB
- will now gain control over the target kernel:</para>
-
- <screen>Remote debugging using /dev/cuaa0
-Debugger (msg=0xf01b0383 "Boot flags requested debugger")
- at ../../i386/i386/db_interface.c:257
-<prompt>(kgdb)</prompt></screen>
-
- <para>You can use this session almost as any other GDB session, including
- full access to the source, running it in gud-mode inside an Emacs window
- (which gives you an automatic source code display in another Emacs
- window) etc.</para>
- </sect1>
-
- <sect1>
- <title>Debugging Loadable Modules Using GDB</title>
-
- <para>When debugging a panic that occurred within a module, or
- using remote GDB against a machine that uses dynamic modules,
- you need to tell GDB how to obtain symbol information for those
- modules.</para>
-
- <para>First, you need to build the module(s) with debugging
- information:</para>
-
- <screen>&prompt.root; <userinput>cd /sys/modules/linux</userinput>
-&prompt.root; <userinput>make clean; make COPTS=-g</userinput></screen>
-
- <para>If you are using remote GDB, you can run
- <command>kldstat</command> on the target machine to find out
- where the module was loaded:</para>
-
- <screen>&prompt.root; <userinput>kldstat</userinput>
-Id Refs Address Size Name
- 1 4 0xc0100000 1c1678 kernel
- 2 1 0xc0a9e000 6000 linprocfs.ko
- 3 1 0xc0ad7000 2000 warp_saver.ko
- 4 1 0xc0adc000 11000 linux.ko</screen>
-
- <para>If you are debugging a crash dump, you'll need to walk the
- <literal>linker_files</literal> list, starting at
- <literal>linker_files->tqh_first</literal> and following the
- <literal>link.tqe_next</literal> pointers until you find the
- entry with the <literal>filename</literal> you are looking for.
- The <literal>address</literal> member of that entry is the load
- address of the module.</para>
-
- <para>Next, you need to find out the offset of the text section
- within the module:</para>
-
- <screen>&prompt.root; <userinput>objdump --section-headers /sys/modules/linux/linux.ko | grep text</userinput>
- 3 .rel.text 000016e0 000038e0 000038e0 000038e0 2**2
- 10 .text 00007f34 000062d0 000062d0 000062d0 2**2</screen>
-
- <para>The one you want is the <literal>.text</literal> section,
- section 10 in the above example. The fourth hexadecimal field
- (sixth field overall) is the offset of the text section within
- the file. Add this offset to the load address of the module to
- obtain the relocation address for the module's code. In our
- example, we get 0xc0adc000 + 0x62d0 = 0xc0ae22d0. Use the
- <command>add-symbol-file</command> command in GDB to tell the
- debugger about the module:</para>
-
- <screen><prompt>(kgdb)</prompt> <userinput>add-symbol-file /sys/modules/linux/linux.ko 0xc0ae22d0</userinput>
-add symbol table from file "/sys/modules/linux/linux.ko" at text_addr = 0xc0ae22d0?
-(y or n) <userinput>y</userinput>
-Reading symbols from /sys/modules/linux/linux.ko...done.
-<prompt>(kgdb)</prompt></screen>
-
- <para>You should now have access to all the symbols in the
- module.</para>
- </sect1>
-
- <sect1>
- <title>Debugging a Console Driver</title>
-
- <para>Since you need a console driver to run DDB on, things are more
- complicated if the console driver itself is failing. You might remember
- the use of a serial console (either with modified boot blocks, or by
- specifying <option>-h</option> at the <prompt>Boot:</prompt> prompt),
- and hook up a standard terminal onto your first serial port. DDB works
- on any configured console driver, of course also on a serial
- console.</para>
- </sect1>
-</chapter>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-declaration: "../chapter.decl"
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- sgml-parent-document: ("../book.sgml" "part" "chapter")
- End:
--->
-
diff --git a/en_US.ISO8859-1/books/developers-handbook/kobj/chapter.sgml b/en_US.ISO8859-1/books/developers-handbook/kobj/chapter.sgml
deleted file mode 100644
index a9ea688b9a..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/kobj/chapter.sgml
+++ /dev/null
@@ -1,298 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD$
--->
-
-<chapter id="kernel-objects">
- <title>Kernel Objects</title>
-
- <para>Kernel Objects, or <firstterm>Kobj</firstterm> provides an
- object-oriented C programming system for the kernel. As such the
- data being operated on carries the description of how to operate
- on it. This allows operations to be added and removed from an
- interface at run time and without breaking binary
- compatibility.</para>
-
- <sect1>
- <title>Terminology</title>
-
- <variablelist>
- <varlistentry>
- <term>Object</term>
- <listitem><para>A set of data - data structure - data
- allocation.</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Method</term>
- <listitem>
- <para>An operation - function.</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Class</term>
- <listitem>
- <para>One or more methods.</para>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Interface</term>
- <listitem>
- <para>A standard set of one or more methods.</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect1>
-
- <sect1>
- <title>Kobj Operation</title>
-
- <para>Kobj works by generating descriptions of methods. Each
- description holds a unique id as well as a default function. The
- description's address is used to uniquely identify the method
- within a class' method table.</para>
-
- <para>A class is built by creating a method table associating one
- or more functions with method descriptions. Before use the class
- is compiled. The compilation allocates a cache and associates it
- with the class. A unique id is assigned to each method
- description within the method table of the class if not already
- done so by another referencing class compilation. For every
- method to be used a function is generated by script to qualify
- arguments and automatically reference the method description for
- a lookup. The generated function looks up the method by using
- the unique id associated with the method description as a hash
- into the cache associated with the object's class. If the method
- is not cached the generated function proceeds to use the class'
- table to find the method. If the method is found then the
- associated function within the class is used; otherwise, the
- default function associated with the method description is
- used.</para>
-
- <para>These indirections can be visualized as the
- following:</para>
-
- <programlisting>object->cache<->class</programlisting>
-
- </sect1>
-
- <sect1>
- <title>Using Kobj</title>
-
- <sect2>
- <title>Structures</title>
-
- <programlisting>struct kobj_method</programlisting>
- </sect2>
-
- <sect2>
- <title>Functions</title>
-
- <programlisting>void kobj_class_compile(kobj_class_t cls);
-void kobj_class_compile_static(kobj_class_t cls, kobj_ops_t ops);
-void kobj_class_free(kobj_class_t cls);
-kobj_t kobj_create(kobj_class_t cls, struct malloc_type *mtype, int mflags);
-void kobj_init(kobj_t obj, kobj_class_t cls);
-void kobj_delete(kobj_t obj, struct malloc_type *mtype);</programlisting>
- </sect2>
-
- <sect2>
- <title>Macros</title>
-
- <programlisting>KOBJ_CLASS_FIELDS
-KOBJ_FIELDS
-DEFINE_CLASS(name, methods, size)
-KOBJMETHOD(NAME, FUNC)</programlisting>
- </sect2>
-
- <sect2>
- <title>Headers</title>
-
- <programlisting>&lt;sys/param.h>
-&lt;sys/kobj.h></programlisting>
- </sect2>
-
- <sect2>
- <title>Creating an interface template</title>
-
- <para>The first step in using Kobj is to create an
- Interface. Creating the interface involves creating a template
- that the script
- <filename>src/sys/kern/makeobjops.pl</filename> can use to
- generate the header and code for the method declarations and
- method lookup functions.</para>
-
- <para>Within this template the following keywords are used:
- <literal>#include</literal>, <literal>INTERFACE</literal>,
- <literal>CODE</literal>, <literal>METHOD</literal>,
- <literal>STATICMETHOD</literal>, and
- <literal>DEFAULT</literal>.</para>
-
- <para>The <literal>#include</literal> statement and what follows
- it is copied verbatim to the head of the generated code
- file.</para>
-
- <para>For example:</para>
-
- <programlisting>#include &lt;sys/foo.h></programlisting>
-
- <para>The <literal>INTERFACE</literal> keyword is used to define
- the interface name. This name is concatenated with each method
- name as [interface name]_[method name]. It's syntax is
- INTERFACE [interface name];.</para>
-
- <para>For example:</para>
-
- <programlisting>INTERFACE foo;</programlisting>
-
- <para>The <literal>CODE</literal> keyword copies its arguments
- verbatim into the code file. It's syntax is
- <literal>CODE { [whatever] };</literal></para>
-
- <para>For example:</para>
-
- <programlisting>CODE {
- struct foo * foo_alloc_null(struct bar *)
- {
- return NULL;
-}
-};</programlisting>
-
- <para>The <literal>METHOD</literal> keyword describes a method. It's syntax is
- <literal>METHOD [return type] [method name] { [object [,
- arguments]] };</literal></para>
-
- <para>For example:</para>
-
- <programlisting>METHOD int bar {
- struct object *;
- struct foo *;
- struct bar;
-};</programlisting>
-
- <para>The <literal>DEFAULT</literal> keyword may follow the
- <literal>METHOD</literal> keyword. It extends the
- <literal>METHOD</literal> key word to include the default
- function for method. The extended syntax is
- <literal>METHOD [return type] [method name] {
- [object; [other arguments]] }DEFAULT [default
- function];</literal></para>
-
- <para>For example:</para>
-
- <programlisting>METHOD int bar {
- struct object *;
- struct foo *;
- int bar;
-} DEFAULT foo_hack;</programlisting>
-
- <para>The <literal>STATICMETHOD</literal> keyword is used like
- the <literal>METHOD</literal> keyword except the kobj data isn't
- at the head of the object structure so casting to kobj_t would
- be incorrect. Instead <literal>STATICMETHOD</literal> relies on the Kobj data being
- referenced as 'ops'. This is also useful for calling
- methods directly out of a class's method table.</para>
-
- <para>Other complete examples:</para>
-
- <programlisting>src/sys/kern/bus_if.m
-src/sys/kern/device_if.m</programlisting>
-
- </sect2>
-
- <sect2>
- <title>Creating a Class</title>
-
- <para>The second step in using Kobj is to create a class. A
- class consists of a name, a table of methods, and the size of
- objects if Kobj's object handling facilities are used. To
- create the class use the macro
- <function>DEFINE_CLASS()</function>. To create the method
- table create an array of kobj_method_t terminated by a NULL
- entry. Each non-NULL entry may be created using the macro
- <function>KOBJMETHOD()</function>.</para>
-
- <para>For example:</para>
-
- <programlisting>DEFINE_CLASS(fooclass, foomethods, sizeof(struct foodata));
-
-kobj_method_t foomethods[] = {
- KOBJMETHOD(bar_doo, foo_doo),
- KOBJMETHOD(bar_foo, foo_foo),
- { NULL, NULL}
-};</programlisting>
-
- <para>The class must be <quote>compiled</quote>. Depending on
- the state of the system at the time that the class is to be
- initialized a statically allocated cache, <quote>ops
- table</quote> have to be used. This can be accomplished by
- declaring a <structname>struct kobj_ops</structname> and using
- <function>kobj_class_compile_static();</function> otherwise,
- <function>kobj_class_compile()</function> should be used.</para>
- </sect2>
-
- <sect2>
- <title>Creating an Object</title>
-
- <para>The third step in using Kobj involves how to define the
- object. Kobj object creation routines assume that Kobj data is
- at the head of an object. If this in not appropriate you will
- have to allocate the object yourself and then use
- <function>kobj_init()</function> on the Kobj portion of it;
- otherwise, you may use <function>kobj_create()</function> to
- allocate and initialize the Kobj portion of the object
- automatically. <function>kobj_init()</function> may also be
- used to change the class that an object uses.</para>
-
- <para>To integrate Kobj into the object you should use the macro
- KOBJ_FIELDS.</para>
-
- <para>For example</para>
-
- <programlisting>struct foo_data {
- KOBJ_FIELDS;
- foo_foo;
- foo_bar;
-};</programlisting>
- </sect2>
-
- <sect2>
- <title>Calling Methods</title>
-
- <para>The last step in using Kobj is to simply use the generated
- functions to use the desired method within the object's
- class. This is as simple as using the interface name and the
- method name with a few modifications. The interface name
- should be concatenated with the method name using a '_'
- between them, all in upper case.</para>
-
- <para>For example, if the interface name was foo and the method
- was bar then the call would be:</para>
-
- <programlisting>[return value = ] FOO_BAR(object [, other parameters]);</programlisting>
-
- </sect2>
-
- <sect2>
- <title>Cleaning Up</title>
-
- <para>When an object allocated through
- <function>kobj_create()</function> is no longer needed
- <function>kobj_delete()</function> may be called on it, and
- when a class is no longer being used
- <function>kobj_class_free()</function> may be called on it.</para>
- </sect2>
- </sect1>
-</chapter>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-declaration: "../chapter.decl"
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- sgml-parent-document: ("../book.sgml" "part" "chapter")
- End:
--->
diff --git a/en_US.ISO8859-1/books/developers-handbook/l10n/chapter.sgml b/en_US.ISO8859-1/books/developers-handbook/l10n/chapter.sgml
deleted file mode 100644
index c41a51a553..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/l10n/chapter.sgml
+++ /dev/null
@@ -1,83 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD: doc/en_US.ISO8859-1/books/developers-handbook/l10n/chapter.sgml,v 1.1 2001/09/13 00:14:45 chern Exp $
--->
-
- <chapter id="l10n">
- <title>Localization - I18N</title>
-
- <sect1>
- <title>Programming I18N Compliant Applications</title>
- <indexterm><primary>Qt</primary></indexterm>
- <indexterm><primary>GTK</primary></indexterm>
- <para>To make your application more useful for speakers of other
- languages, we hope that you will program I18N compliant. The GNU
- gcc compiler, GUI Libraries like QT and GTK support I18N through
- special handling of strings. Making a program I18N compliant is
- very easy. It allows contributors to port your application to
- other languages quickly. Refer to library specific I18N
- documentation for more details.</para>
-
- <para>To the contrary of common perception, I18N compliant code is
- easy to write. Usually, it only involves wrapping your strings
- with library specific functions. In addition, please be sure to
- allow for wide or multibyte characters support.</para>
-
- <sect2>
- <title>A Call to Unify the I18N Effort</title>
-
- <para>It has come to our attention that the individual I18N/L10N
- efforts for each country has been repeating each others'
- efforts. Many of us have been reinventing the wheel repeatedly
- and inefficiently. We hope that the various major groups in
- I18N could congregate into a group effort similar to the Core
- Team's responsibility.</para>
-
- <para>Currently, we hope that, when you write or port I18N
- programs, you would send it out to each country's related
- FreeBSD mailing lists for testing. In the future, we hope to
- create applications that work in all the languages
- out-of-the-box without dirty hacks.</para>
-
- <para>The mailing list <email>FreeBSD-I18N@FreeBSD.org</email>
- has been established. If you are an I18N/L10N developer,
- please send your comments, ideas, questions, and anything
- you deem related to it. </para>
-
- <para> Michael C. Wu will be maintaining an I18N works in progress
- homepage at <ulink
- url="http://www.FreeBSD.org/~keichii/i18n/index.html">http://www.FreeBSD.org/~keichii/i18n/index.html</ulink>
- Please also read the BSDCon2000 I18N paper and presentations
- by Clive Lin, Chia-Liang Kao, and Michael C. Wu at <ulink
- url="http://www.FreeBSD.org/~keichii/papers/">http://www.FreeBSD.org/~keichii/papers/</ulink></para>
- </sect2>
-
- <sect2>
- <title>Perl and Python</title>
- <indexterm>
- <primary>Perl</primary>
- </indexterm>
- <indexterm>
- <primary>Python</primary>
- </indexterm>
-
- <para>Perl and Python have I18N and wide characters handling
- libraries. Please use them for I18N compliance.</para>
-
- <para>In older FreeBSD versions,
- Perl may gives warning about not having a wide characters locale
- that is already installed in your system. You can set the
- environmental variable <envar>LD_PRELOAD</envar> to
- <filename>/usr/lib/libxpg4.so</filename> in your shell.</para>
-
- <para>In <literal>sh</literal>-based shells:</para>
-
- <programlisting><envar>LD_PRELOAD=/usr/lib/libxpg4.so</envar></programlisting>
-
- <para>In <literal>C</literal>-based shells:</para>
-
- <programlisting><envar>setenv LD_PRELOAD /usr/lib/libxpg4.so</envar></programlisting>
- </sect2>
- </sect1>
-</chapter> \ No newline at end of file
diff --git a/en_US.ISO8859-1/books/developers-handbook/locking/chapter.sgml b/en_US.ISO8859-1/books/developers-handbook/locking/chapter.sgml
deleted file mode 100644
index 993d649ffc..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/locking/chapter.sgml
+++ /dev/null
@@ -1,333 +0,0 @@
-<!--
- The FreeBSD Documentation Project
- The FreeBSD SMP Next Generation Project
-
- $FreeBSD: doc/en_US.ISO_8859-1/books/developers-handbook/locking/chapter.sgml,v 1.1 2000/11/29 04:15:17 jhb Exp $
--->
-
-<chapter id="locking">
- <title>Locking Notes</title>
-
- <para><emphasis>This chapter is maintained by the FreeBSD SMP Next
- Generation Project
- <email>freebsd-smp@FreeBSD.org</email>.</emphasis></para>
-
-
- <para>This document outlines the locking used in the FreeBSD kernel
- to permit effective multi-processing within the kernel. Locking
- can be achieved via several means. Data structures can be
- protected by mutexes or &man.lockmgr.9; locks. A few variables
- are protected simply by always using atomic operations to access
- them.</para>
-
- <sect1>
- <title>Mutexes</title>
-
- <para>A mutex is simply a lock used to guarantee mutual exclusion.
- Specifically, a mutex may only be owned by one entity at a time.
- If another entity wishes to obtain a mutex that is already
- owned, it must wait until the mutex is released. In the FreeBSD
- kernel, mutexes are owned by processes.</para>
-
- <para>Mutexes may be recursively acquired, but they are intended
- to be held for a short period of time. Specifically, one may
- not sleep while holding a mutex. If you need to hold a lock
- across a sleep, use a &man.lockmgr.9; lock.</para>
-
- <para>Each mutex has several properties of interest:</para>
-
- <variablelist>
- <varlistentry>
- <term>Variable Name</term>
- <listitem>
- <para>The name of the <type>struct mtx</type> variable in
- the kernel source.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Logical Name</term>
- <listitem>
- <para>The name of the mutex assigned to it by
- <function>mtx_init</function>. This name is displayed in
- KTR trace messages and witness errors and warnings and is
- used to distinguish mutexes in the witness code.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Type</term>
- <listitem>
- <para>The type of the mutex in terms of the
- <constant>MTX_*</constant> flags. The meaning for each
- flag is related to its meaning as documented in
- &man.mutex.9;.</para>
-
- <variablelist>
- <varlistentry>
- <term><constant>MTX_DEF</constant></term>
- <listitem>
- <para>A sleep mutex</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>MTX_SPIN</constant></term>
- <listitem>
- <para>A spin mutex</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>MTX_COLD</constant></term>
- <listitem>
- <para>This mutex is initialized very early. Thus, it
- must be declared via
- <function>MUTEX_DECLARE</function>, and the
- <constant>MTX_COLD</constant> flag must be passed to
- <function>mtx_init</function>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>MTX_TOPHALF</constant></term>
- <listitem>
- <para>This spin mutex does not disable
- interrupts.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><constant>MTX_NORECURSE</constant></term>
- <listitem>
- <para>This mutex is not allowed to recurse.</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Protectees</term>
- <listitem>
- <para>A list of data structures or data structure members
- that this entry protects. For data structure members, the
- name will be in the form of
- <structname/structure name/.<structfield/member name/.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Dependent Functions</term>
- <listitem>
- <para>Functions that can only be called if this mutex is
- held.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <table frame="all" colsep="1" rowsep="1" pgwide="1">
- <title>Mutex List</title>
-
- <tgroup cols="5">
- <thead>
- <row>
- <entry>Variable Name</entry>
- <entry>Logical Name</entry>
- <entry>Type</entry>
- <entry>Protectees</entry>
- <entry>Dependent Functions</entry>
- </row>
- </thead>
-
- <!-- The scheduler lock -->
- <tbody>
- <row>
- <entry>sched_lock</entry>
- <entry><quote>sched lock</quote></entry>
- <entry>
- <constant>MTX_SPIN</constant> |
- <constant>MTX_COLD</constant>
- </entry>
- <entry>
- <varname>_gmonparam</varname>,
- <varname>cnt.v_swtch</varname>,
- <varname>cp_time</varname>,
- <varname>curpriority</varname>,
- <structname/mtx/.<structfield/mtx_blocked/,
- <structname/mtx/.<structfield/mtx_contested/,
- <structname/proc/.<structfield/p_contested/,
- <structname/proc/.<structfield/p_blocked/,
- <structname/proc/.<structfield/p_flag/
- (<constant>P_PROFIL</constant> XXX,
- <constant>P_INMEM</constant>,
- <constant>P_SINTR</constant>,
- <constant>P_TIMEOUT</constant>,
- <constant>P_SWAPINREQ</constant> XXX,
- <constant>P_INMEN</constant> XXX),
- <structname/proc/.<structfield/p_nice/,
- <structname/proc/.<structfield/p_procq/,
- <structname/proc/.<structfield/p_blocked/,
- <structname/proc/.<structfield/p_estcpu/,
- <structname/proc/.<structfield/p_nativepri/,
- <structname/proc/.<structfield/p_priority/,
- <structname/proc/.<structfield/p_usrpri/,
- <structname/proc/.<structfield/p_rtprio/,
- <structname/proc/.<structfield/p_rqindex/,
- <structname/proc/.<structfield/p_stats->p_prof/,
- <structname/proc/.<structfield/p_stats->p_ru/,
- <structname/proc/.<structfield/p_stat/,
- <structname/proc/.<structfield/p_cpticks/
- <structname/proc/.<structfield/p_iticks/,
- <structname/proc/.<structfield/p_uticks/,
- <structname/proc/.<structfield/p_sticks/,
- <structname/proc/.<structfield/p_swtime/,
- <structname/proc/.<structfield/p_slptime/,
- <structname/proc/.<structfield/p_runtime/,
- <structname/proc/.<structfield/p_pctcpu/,
- <structname/proc/.<structfield/p_oncpu/,
- <structname/proc/.<structfield/p_asleep/,
- <structname/proc/.<structfield/p_wchan/,
- <structname/proc/.<structfield/p_wmesg/,
- <structname/proc/.<structfield/p_slpq/,
- <structname/proc/.<structfield/p_vmspace/
- (XXX - in <function>statclock</function>),
- <varname>pscnt</varname>,
- <varname>slpque</varname>,
- <varname>itqueuebits</varname>,
- <varname>itqueues</varname>,
- <varname>rtqueuebits</varname>,
- <varname>rtqueues</varname>,
- <varname>queuebits</varname>,
- <varname>queues</varname>,
- <varname>idqueuebits</varname>,
- <varname>idqueues</varname>,
- <varname>switchtime</varname>,
- </entry>
- <entry>
- <function>setrunqueue</function>,
- <function>remrunqueue</function>,
- <function>mi_switch</function>,
- <function>chooseproc</function>,
- <function>schedclock</function>,
- <function>resetpriority</function>,
- <function>updatepri</function>,
- <function>maybe_resched</function>,
- <function>cpu_switch</function>,
- <function>cpu_throw</function>
- </entry>
- </row>
-
- <!-- The vm86 pcb lock -->
- <row>
- <entry>vm86pcb_lock</entry>
- <entry><quote>vm86pcb lock</quote></entry>
- <entry>
- <constant>MTX_DEF</constant> |
- <constant>MTX_COLD</constant>
- </entry>
- <entry>
- <varname>vm86pcb</varname>
- </entry>
- <entry>
- <function>vm86_bioscall</function>
- </entry>
- </row>
-
- <!-- Giant -->
- <row>
- <entry>Giant</entry>
- <entry><quote>Giant</quote></entry>
- <entry>
- <constant>MTX_DEF</constant> |
- <constant>MTX_COLD</constant>
- </entry>
- <entry>nearly everything</entry>
- <entry>lots</entry>
- </row>
-
- <!-- The callout lock -->
- <row>
- <entry>callout_lock</entry>
- <entry><quote>callout lock</quote></entry>
- <entry>
- <constant>MTX_SPIN</constant>
- </entry>
- <entry>
- <varname>callfree</varname>,
- <varname>callwheel</varname>,
- <varname>nextsoftcheck</varname>,
- <structname/proc/.<structfield/p_itcallout/,
- <structname/proc/.<structfield/p_slpcallout/,
- <varname>softticks</varname>,
- <varname>ticks</varname>
- </entry>
- <entry>
- </entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </sect1>
-
- <sect1>
- <title>Lock Manager Locks</title>
-
- <para>Locks that are provided via the &man.lockmgr.9; interface
- are lock manager locks. These locks are reader-writer locks and
- may be held by a sleeping process.</para>
-
- <table>
- <title>&man.lockmgr.9; Lock List</title>
-
- <tgroup cols="2">
- <thead>
- <row>
- <entry>Variable Name</entry>
- <entry>Protectees</entry>
- </row>
- </thead>
- <tbody>
- <row>
- <entry><varname>allproc_lock</varname></entry>
- <entry>
- <varname>allproc</varname>
- <varname>zombproc</varname>
- <varname>pidhashtbl</varname>
- <structname/proc/.<structfield/p_list/
- <structname/proc/.<structfield/p_hash/
- <varname>nextpid</varname>
- </entry>
- <entry><varname>proctree_lock</varname></entry>
- <entry>
- <structname/proc/.<structfield/p_children/
- <structname/proc/.<structfield/p_sibling/
- </entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </sect1>
-
- <sect1>
- <title>Atomically Protected Variables</title>
-
- <para>An atomically protected variable is a special variable that
- is not protected by an explicit lock. Instead, all data
- accesses to the variables use special atomic operations as
- described in &man.atomic.9;. Very few variables are treated
- this way, although other synchronization primitives such as
- mutexes are implemented with atomically protected
- variables.</para>
-
- <itemizedlist>
- <listitem>
- <para><varname>astpending</varname></para>
- </listitem>
-
- <listitem>
- <para><structname/mtx/.<structfield/mtx_lock/</para>
- </listitem>
- </itemizedlist>
- </sect1>
-</chapter>
diff --git a/en_US.ISO8859-1/books/developers-handbook/pci/chapter.sgml b/en_US.ISO8859-1/books/developers-handbook/pci/chapter.sgml
deleted file mode 100644
index ca94063864..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/pci/chapter.sgml
+++ /dev/null
@@ -1,372 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD: doc/en_US.ISO_8859-1/books/developers-handbook/pci/chapter.sgml,v 1.2 2001/04/09 00:33:42 dd Exp $
--->
-
-<chapter id="pci">
- <title>PCI Devices</title>
-
- <para>This chapter will talk about the FreeBSD mechanisms for
- writing a device driver for a device on a PCI bus.</para>
-
- <sect1>
- <title>Probe and Attach</title>
-
- <para>Information here about how the PCI bus code iterates through
- the unattached devices and see if a newly loaded kld will attach
- to any of them.</para>
-
-<programlisting>/*
- * Simple KLD to play with the PCI functions.
- *
- * Murray Stokely
- */
-
-#define MIN(a,b) (((a) < (b)) ? (a) : (b))
-
-#include &lt;sys/types.h&gt;
-#include &lt;sys/module.h&gt;
-#include &lt;sys/systm.h&gt; /* uprintf */
-#include &lt;sys/errno.h&gt;
-#include &lt;sys/param.h&gt; /* defines used in kernel.h */
-#include &lt;sys/kernel.h&gt; /* types used in module initialization */
-#include &lt;sys/conf.h&gt; /* cdevsw struct */
-#include &lt;sys/uio.h&gt; /* uio struct */
-#include &lt;sys/malloc.h&gt;
-#include &lt;sys/bus.h&gt; /* structs, prototypes for pci bus stuff */
-
-#include &lt;pci/pcivar.h&gt; /* For get_pci macros! */
-
-/* Function prototypes */
-d_open_t mypci_open;
-d_close_t mypci_close;
-d_read_t mypci_read;
-d_write_t mypci_write;
-
-/* Character device entry points */
-
-static struct cdevsw mypci_cdevsw = {
- mypci_open,
- mypci_close,
- mypci_read,
- mypci_write,
- noioctl,
- nopoll,
- nommap,
- nostrategy,
- "mypci",
- 36, /* reserved for lkms - /usr/src/sys/conf/majors */
- nodump,
- nopsize,
- D_TTY,
- -1
-};
-
-/* vars */
-static dev_t sdev;
-
-/* We're more interested in probe/attach than with
- open/close/read/write at this point */
-
-int
-mypci_open(dev_t dev, int oflags, int devtype, struct proc *p)
-{
- int err = 0;
-
- uprintf("Opened device \"mypci\" successfully.\n");
- return(err);
-}
-
-int
-mypci_close(dev_t dev, int fflag, int devtype, struct proc *p)
-{
- int err=0;
-
- uprintf("Closing device \"mypci.\"\n");
- return(err);
-}
-
-int
-mypci_read(dev_t dev, struct uio *uio, int ioflag)
-{
- int err = 0;
-
- uprintf("mypci read!\n");
- return err;
-}
-
-int
-mypci_write(dev_t dev, struct uio *uio, int ioflag)
-{
- int err = 0;
-
- uprintf("mypci write!\n");
- return(err);
-}
-
-/* PCI Support Functions */
-
-/*
- * Return identification string if this is device is ours.
- */
-static int
-mypci_probe(device_t dev)
-{
- uprintf("MyPCI Probe\n"
- "Vendor ID : 0x%x\n"
- "Device ID : 0x%x\n",pci_get_vendor(dev),pci_get_device(dev));
-
- if (pci_get_vendor(dev) == 0x11c1) {
- uprintf("We've got the Winmodem, probe successful!\n");
- return 0;
- }
-
- return ENXIO;
-}
-
-/* Attach function is only called if the probe is successful */
-
-static int
-mypci_attach(device_t dev)
-{
- uprintf("MyPCI Attach for : deviceID : 0x%x\n",pci_get_vendor(dev));
- sdev = make_dev(<literal>&</literal>mypci_cdevsw,
- 0,
- UID_ROOT,
- GID_WHEEL,
- 0600,
- "mypci");
- uprintf("Mypci device loaded.\n");
- return ENXIO;
-}
-
-/* Detach device. */
-
-static int
-mypci_detach(device_t dev)
-{
- uprintf("Mypci detach!\n");
- return 0;
-}
-
-/* Called during system shutdown after sync. */
-
-static int
-mypci_shutdown(device_t dev)
-{
- uprintf("Mypci shutdown!\n");
- return 0;
-}
-
-/*
- * Device suspend routine.
- */
-static int
-mypci_suspend(device_t dev)
-{
- uprintf("Mypci suspend!\n");
- return 0;
-}
-
-/*
- * Device resume routine.
- */
-
-static int
-mypci_resume(device_t dev)
-{
- uprintf("Mypci resume!\n");
- return 0;
-}
-
-static device_method_t mypci_methods[] = {
- /* Device interface */
- DEVMETHOD(device_probe, mypci_probe),
- DEVMETHOD(device_attach, mypci_attach),
- DEVMETHOD(device_detach, mypci_detach),
- DEVMETHOD(device_shutdown, mypci_shutdown),
- DEVMETHOD(device_suspend, mypci_suspend),
- DEVMETHOD(device_resume, mypci_resume),
-
- { 0, 0 }
-};
-
-static driver_t mypci_driver = {
- "mypci",
- mypci_methods,
- 0,
- /* sizeof(struct mypci_softc), */
-};
-
-static devclass_t mypci_devclass;
-
-DRIVER_MODULE(mypci, pci, mypci_driver, mypci_devclass, 0, 0);</programlisting>
-
- <para>Additional Resources
- <itemizedlist>
- <listitem><simpara><ulink url="http://www.pcisig.org">PCI
- Special Interest Group</ulink></simpara></listitem>
-
- <listitem><simpara>PCI System Architecture, Fourth Edition by
- Tom Shanley, et al.</simpara></listitem>
-
- </itemizedlist>
- </para>
- </sect1>
-
- <sect1>
- <title>Bus Resources</title>
-
- <para>FreeBSD provides an object-oriented mechanism for requesting
- resources from a parent bus. Almost all devices will be a child
- member of some sort of bus (PCI, ISA, USB, SCSI, etc) and these
- devices need to acquire resources from their parent bus (such as
- memory segments, interrupt lines, or DMA channels).</para>
-
- <sect2>
- <title>Base Address Registers</title>
-
- <para>To do anything particularly useful with a PCI device you
- will need to obtain the <emphasis>Base Address
- Registers</emphasis> (BARs) from the PCI Configuration space.
- The PCI-specific details of obtaining the BAR is abstracted in
- the <function>bus_alloc_resource()</function> function.</para>
-
- <para>For example, a typical driver might have something similar
- to this in the <function>attach()</function> function. : </para>
-
-<programlisting> sc->bar0id = 0x10;
- sc->bar0res = bus_alloc_resource(dev, SYS_RES_MEMORY, &amp;(sc->bar0id),
- 0, ~0, 1, RF_ACTIVE);
- if (sc->bar0res == NULL) {
- uprintf("Memory allocation of PCI base register 0 failed!\n");
- error = ENXIO;
- goto fail1;
- }
-
- sc->bar1id = 0x14;
- sc->bar1res = bus_alloc_resource(dev, SYS_RES_MEMORY, &amp;(sc->bar1id),
- 0, ~0, 1, RF_ACTIVE);
- if (sc->bar1res == NULL) {
- uprintf("Memory allocation of PCI base register 1 failed!\n");
- error = ENXIO;
- goto fail2;
- }
- sc->bar0_bt = rman_get_bustag(sc->bar0res);
- sc->bar0_bh = rman_get_bushandle(sc->bar0res);
- sc->bar1_bt = rman_get_bustag(sc->bar1res);
- sc->bar1_bh = rman_get_bushandle(sc->bar1res);
-
-</programlisting>
-
- <para>Handles for each base address register are kept in the
- <structname>softc</structname> structure so that they can be
- used to write to the device later.</para>
-
- <para>These handles can then be used to read or write from the
- device registers with the <function>bus_space_*</function>
- functions. For example, a driver might contain a shorthand
- function to read from a board specific register like this :
- </para>
-
-<programlisting>uint16_t
-board_read(struct ni_softc *sc, uint16_t address) {
- return bus_space_read_2(sc->bar1_bt, sc->bar1_bh, address);
-}
-</programlisting>
-
- <para>Similarly, one could write to the registers with : </para>
-
-<programlisting>void
-board_write(struct ni_softc *sc, uint16_t address, uint16_t value) {
- bus_space_write_2(sc->bar1_bt, sc->bar1_bh, address, value);
-}
-</programlisting>
-
- <para>These functions exist in 8bit, 16bit, and 32bit versions
- and you should use
- <function>bus_space_{read|write}_{1|2|4}</function>
- accordingly.</para>
-
- </sect2>
- <sect2>
- <title>Interrupts</title>
-
- <para>Interrupts are allocated from the object-oriented bus code
- in a way similar to the memory resources. First an IRQ
- resource must be allocated from the parent bus, and then the
- interrupt handler must be setup to deal with this IRQ.</para>
-
- <para>Again, a sample from a device
- <function>attach()</function> function says more than
- words.</para>
-
-<programlisting>/* Get the IRQ resource */
-
- sc->irqid = 0x0;
- sc->irqres = bus_alloc_resource(dev, SYS_RES_IRQ, &amp;(sc->irqid),
- 0, ~0, 1, RF_SHAREABLE | RF_ACTIVE);
- if (sc->irqres == NULL) {
- uprintf("IRQ allocation failed!\n");
- error = ENXIO;
- goto fail3;
- }
-
- /* Now we should setup the interrupt handler */
-
- error = bus_setup_intr(dev, sc->irqres, INTR_TYPE_MISC,
- my_handler, sc, &amp;(sc->handler));
- if (error) {
- printf("Couldn't set up irq\n");
- goto fail4;
- }
-
- sc->irq_bt = rman_get_bustag(sc->irqres);
- sc->irq_bh = rman_get_bushandle(sc->irqres);
-</programlisting>
-
- </sect2>
-
- <sect2>
- <title>DMA</title>
- <para>On the PC, peripherals that want to do bus-mastering DMA
- must deal with physical addresses. This is a problem since
- FreeBSD uses virtual memory and deals almost exclusively with
- virtual addresses. Fortunately, there is a function,
- <function>vtophys()</function> to help.</para>
-
-<programlisting>#include &lt;vm/vm.h&gt;
-#include &lt;vm/pmap.h&gt;
-
-#define vtophys(virtual_address) (...)
-</programlisting>
-
- <para>The solution is a bit different on the alpha however, and
- what we really want is a function called
- <function>vtobus()</function>.</para>
-
-<programlisting>#if defined(__alpha__)
-#define vtobus(va) alpha_XXX_dmamap((vm_offset_t)va)
-#else
-#define vtobus(va) vtophys(va)
-#endif
-</programlisting>
-
- </sect2>
-
- <sect2>
- <title>Deallocating Resources</title>
-
- <para>It's very important to deallocate all of the resources
- that were allocated during <function>attach()</function>.
- Care must be taken to deallocate the correct stuff even on a
- failure condition so that the system will remain useable while
- your driver dies.</para>
-
- </sect2>
- </sect1>
-
-</chapter>
-
-
diff --git a/en_US.ISO8859-1/books/developers-handbook/policies/Makefile b/en_US.ISO8859-1/books/developers-handbook/policies/Makefile
deleted file mode 100644
index 0dd403f15f..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/policies/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-#
-# Build the Handbook with just the content from this chapter.
-#
-# $FreeBSD$
-#
-
-CHAPTERS= policies/chapter.sgml
-
-VPATH= ..
-
-MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
-
-DOC_PREFIX?= ${.CURDIR}/../../../..
-
-.include "../Makefile"
diff --git a/en_US.ISO8859-1/books/developers-handbook/policies/chapter.sgml b/en_US.ISO8859-1/books/developers-handbook/policies/chapter.sgml
deleted file mode 100644
index 69d33b26be..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/policies/chapter.sgml
+++ /dev/null
@@ -1,400 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD: doc/en_US.ISO8859-1/books/handbook/policies/chapter.sgml,v 1.20 2001/07/13 22:21:27 chern Exp $
--->
-
-<chapter id="policies">
- <title>Source Tree Guidelines and Policies</title>
-
- <para><emphasis>Contributed by &a.phk;.</emphasis></para>
-
- <para>This chapter documents various guidelines and policies in force for
- the FreeBSD source tree.</para>
-
- <sect1 id="policies-maintainer">
- <title><makevar>MAINTAINER</makevar> on Makefiles</title>
- <indexterm><primary>ports maintainer</primary></indexterm>
-
- <para>June 1996.</para>
-
- <para>If a particular portion of the FreeBSD distribution is being
- maintained by a person or group of persons, they can communicate this
- fact to the world by adding a
-
- <programlisting>MAINTAINER= email-addresses</programlisting>
-
- line to the <filename>Makefile</filename>s covering this portion of the
- source tree.</para>
-
- <para>The semantics of this are as follows:</para>
-
- <para>The maintainer owns and is responsible for that code. This means
- that he is responsible for fixing bugs and answer problem reports
- pertaining to that piece of the code, and in the case of contributed
- software, for tracking new versions, as appropriate.</para>
-
- <para>Changes to directories which have a maintainer defined shall be sent
- to the maintainer for review before being committed. Only if the
- maintainer does not respond for an unacceptable period of time, to
- several emails, will it be acceptable to commit changes without review
- by the maintainer. However, it is suggested that you try and have the
- changes reviewed by someone else if at all possible.</para>
-
- <para>It is of course not acceptable to add a person or group as
- maintainer unless they agree to assume this duty. On the other hand it
- doesn't have to be a committer and it can easily be a group of
- people.</para>
- </sect1>
-
- <sect1 id="policies-contributed">
- <title>Contributed Software</title>
-
- <indexterm><primary>contributed software</primary></indexterm>
- <para><emphasis>Contributed by &a.phk; and &a.obrien;. </emphasis></para>
-
- <para>June 1996.</para>
-
- <para>Some parts of the FreeBSD distribution consist of software that is
- actively being maintained outside the FreeBSD project. For historical
- reasons, we call this <emphasis>contributed</emphasis> software. Some
- examples are perl, gcc and patch.</para>
-
- <para>Over the last couple of years, various methods have been used in
- dealing with this type of software and all have some number of
- advantages and drawbacks. No clear winner has emerged.</para>
-
- <para>Since this is the case, after some debate one of these methods has
- been selected as the <quote>official</quote> method and will be required
- for future imports of software of this kind. Furthermore, it is
- strongly suggested that existing contributed software converge on this
- model over time, as it has significant advantages over the old method,
- including the ability to easily obtain diffs relative to the
- <quote>official</quote> versions of the source by everyone (even without
- cvs access). This will make it significantly easier to return changes
- to the primary developers of the contributed software.</para>
-
- <para>Ultimately, however, it comes down to the people actually doing the
- work. If using this model is particularly unsuited to the package being
- dealt with, exceptions to these rules may be granted only with the
- approval of the core team and with the general consensus of the other
- developers. The ability to maintain the package in the future will be a
- key issue in the decisions.</para>
-
- <note>
- <para>Because of some unfortunate design limitations with the RCS file
- format and CVS's use of vendor branches, minor, trivial and/or
- cosmetic changes are <emphasis>strongly discouraged</emphasis> on
- files that are still tracking the vendor branch. <quote>Spelling
- fixes</quote> are explicitly included here under the
- <quote>cosmetic</quote> category and are to be avoided for files with
- revision 1.1.x.x. The repository bloat impact from a single character
- change can be rather dramatic.</para>
- </note>
-
- <para>The <application>Tcl</application> embedded programming
- language will be used as example of how this model works:</para>
-
- <para><filename>src/contrib/tcl</filename> contains the source as
- distributed by the maintainers of this package. Parts that are entirely
- not applicable for FreeBSD can be removed. In the case of Tcl, the
- <filename>mac</filename>, <filename>win</filename> and
- <filename>compat</filename> subdirectories were eliminated before the
- import</para>
-
- <para><filename>src/lib/libtcl</filename> contains only a "bmake style"
- <filename>Makefile</filename> that uses the standard
- <filename>bsd.lib.mk</filename> makefile rules to produce the library
- and install the documentation.</para>
-
- <para><filename>src/usr.bin/tclsh</filename> contains only a bmake style
- <filename>Makefile</filename> which will produce and install the
- <command>tclsh</command> program and its associated man-pages using the
- standard <filename>bsd.prog.mk</filename> rules.</para>
-
- <para><filename>src/tools/tools/tcl_bmake</filename> contains a couple of
- shell-scripts that can be of help when the tcl software needs updating.
- These are not part of the built or installed software.</para>
-
- <para>The important thing here is that the
- <filename>src/contrib/tcl</filename> directory is created according to
- the rules: It is supposed to contain the sources as distributed (on a
- proper CVS vendor-branch and without RCS keyword expansion) with as few
- FreeBSD-specific changes as possible. The 'easy-import' tool on
- freefall will assist in doing the import, but if there are any doubts on
- how to go about it, it is imperative that you ask first and not blunder
- ahead and hope it <quote>works out</quote>. CVS is not forgiving of
- import accidents and a fair amount of effort is required to back out
- major mistakes.</para>
-
- <para>Because of the previously mentioned design limitations with CVS's
- vendor branches, it is required that <quote>official</quote> patches from
- the vendor be applied to the original distributed sources and the result
- re-imported onto the vendor branch again. Official patches should never
- be patched into the FreeBSD checked out version and "committed", as this
- destroys the vendor branch coherency and makes importing future versions
- rather difficult as there will be conflicts.</para>
-
- <para>Since many packages contain files that are meant for compatibility
- with other architectures and environments that FreeBSD, it is
- permissible to remove parts of the distribution tree that are of no
- interest to FreeBSD in order to save space. Files containing copyright
- notices and release-note kind of information applicable to the remaining
- files shall <emphasis>not</emphasis> be removed.</para>
-
- <para>If it seems easier, the <command>bmake</command>
- <filename>Makefile</filename>s can be produced from the dist tree
- automatically by some utility, something which would hopefully make it
- even easier to upgrade to a new version. If this is done, be sure to
- check in such utilities (as necessary) in the
- <filename>src/tools</filename> directory along with the port itself so
- that it is available to future maintainers.</para>
-
- <para>In the <filename>src/contrib/tcl</filename> level directory, a file
- called <filename>FREEBSD-upgrade</filename> should be added and it
- should states things like:</para>
-
- <itemizedlist>
- <listitem>
- <para>Which files have been left out</para>
- </listitem>
-
- <listitem>
- <para>Where the original distribution was obtained from and/or the
- official master site.</para>
- </listitem>
-
- <listitem>
- <para>Where to send patches back to the original authors</para>
- </listitem>
-
- <listitem>
- <para>Perhaps an overview of the FreeBSD-specific changes that have
- been made.</para>
- </listitem>
- </itemizedlist>
-
- <para>However, please do not import <filename>FREEBSD-upgrade</filename>
- with the contributed source. Rather you should <command>cvs add
- FREEBSD-upgrade ; cvs ci</command> after the initial import. Example
- wording from <filename>src/contrib/cpio</filename> is below:</para>
-
- <programlisting>This directory contains virgin sources of the original distribution files
-on a "vendor" branch. Do not, under any circumstances, attempt to upgrade
-the files in this directory via patches and a cvs commit. New versions or
-official-patch versions must be imported. Please remember to import with
-"-ko" to prevent CVS from corrupting any vendor RCS Ids.
-
-For the import of GNU cpio 2.4.2, the following files were removed:
-
- INSTALL cpio.info mkdir.c
- Makefile.in cpio.texi mkinstalldirs
-
-To upgrade to a newer version of cpio, when it is available:
- 1. Unpack the new version into an empty directory.
- [Do not make ANY changes to the files.]
-
- 2. Remove the files listed above and any others that don't apply to
- FreeBSD.
-
- 3. Use the command:
- cvs import -ko -m 'Virgin import of GNU cpio v&lt;version&gt;' \
- src/contrib/cpio GNU cpio_&lt;version&gt;
-
- For example, to do the import of version 2.4.2, I typed:
- cvs import -ko -m 'Virgin import of GNU v2.4.2' \
- src/contrib/cpio GNU cpio_2_4_2
-
- 4. Follow the instructions printed out in step 3 to resolve any
- conflicts between local FreeBSD changes and the newer version.
-
-Do not, under any circumstances, deviate from this procedure.
-
-To make local changes to cpio, simply patch and commit to the main
-branch (aka HEAD). Never make local changes on the GNU branch.
-
-All local changes should be submitted to "cpio@gnu.ai.mit.edu" for
-inclusion in the next vendor release.
-
-obrien@FreeBSD.org - 30 March 1997</programlisting>
- </sect1>
-
- <sect1 id="policies-encumbered">
- <title>Encumbered Files</title>
-
- <para>It might occasionally be necessary to include an encumbered file in
- the FreeBSD source tree. For example, if a device requires a small
- piece of binary code to be loaded to it before the device will operate,
- and we do not have the source to that code, then the binary file is said
- to be encumbered. The following policies apply to including encumbered
- files in the FreeBSD source tree.</para>
-
- <orderedlist>
- <listitem>
- <para>Any file which is interpreted or executed by the system CPU(s)
- and not in source format is encumbered.</para>
- </listitem>
-
- <listitem>
- <para>Any file with a license more restrictive than BSD or GNU is
- encumbered.</para>
- </listitem>
-
- <listitem>
- <para>A file which contains downloadable binary data for use by the
- hardware is not encumbered, unless (1) or (2) apply to it. It must
- be stored in an architecture neutral ASCII format (file2c or
- uuencoding is recommended).</para>
- </listitem>
-
- <listitem>
- <para>Any encumbered file requires specific approval from the <link
- linkend="staff-core">Core team</link> before it is added to the
- CVS repository.</para>
- </listitem>
-
- <listitem>
- <para>Encumbered files go in <filename>src/contrib</filename> or
- <filename>src/sys/contrib</filename>.</para>
- </listitem>
-
- <listitem>
- <para>The entire module should be kept together. There is no point in
- splitting it, unless there is code-sharing with non-encumbered
- code.</para>
- </listitem>
-
- <listitem>
- <para>Object files are named
- <filename><replaceable>arch</replaceable>/<replaceable>filename</replaceable>.o.uu></filename>.</para>
- </listitem>
-
- <listitem>
- <para>Kernel files;</para>
-
- <orderedlist>
- <listitem>
- <para>Should always be referenced in
- <filename>conf/files.*</filename> (for build simplicity).</para>
- </listitem>
-
- <listitem>
- <para>Should always be in <filename>LINT</filename>, but the <link
- linkend="staff-core">Core team</link> decides per case if it
- should be commented out or not. The <link
- linkend="staff-core">Core team</link> can, of course, change
- their minds later on.</para>
- </listitem>
-
- <listitem>
- <para>The <link linkend="staff-who">Release Engineer</link>
- decides whether or not it goes in to the release.</para>
- </listitem>
- </orderedlist>
- </listitem>
-
- <listitem>
- <para>User-land files;</para>
-
- <orderedlist>
- <listitem>
- <indexterm><primary>core team</primary></indexterm>
- <para>The <link linkend="staff-core">Core team</link> decides if
- the code should be part of <command>make world</command>.</para>
- </listitem>
-
- <listitem>
- <indexterm><primary>release engineer</primary></indexterm>
- <para>The <link linkend="staff-who">Release Engineer</link>
- decides if it goes in to the release.</para>
- </listitem>
- </orderedlist>
- </listitem>
- </orderedlist>
- </sect1>
-
- <sect1 id="policies-shlib">
- <title>Shared Libraries</title>
-
- <para><emphasis>Contributed by &a.asami;, &a.peter;, and &a.obrien; 9
- December 1996.</emphasis></para>
-
- <para>If you are adding shared library support to a port or other piece of
- software that doesn't have one, the version numbers should follow these
- rules. Generally, the resulting numbers will have nothing to do with
- the release version of the software.</para>
-
- <para>The three principles of shared library building are:</para>
-
- <itemizedlist>
- <listitem>
- <para>Start from <literal>1.0</literal></para>
- </listitem>
-
- <listitem>
- <para>If there is a change that is backwards compatible, bump minor
- number (note that ELF systems ignore the minor number)</para>
- </listitem>
-
- <listitem>
- <para>If there is an incompatible change, bump major number</para>
- </listitem>
- </itemizedlist>
-
- <para>For instance, added functions and bugfixes result in the minor
- version number being bumped, while deleted functions, changed function
- call syntax etc. will force the major version number to change.</para>
-
- <para>Stick to version numbers of the form major.minor
- (<replaceable>x</replaceable>.<replaceable>y</replaceable>). Our a.out
- dynamic linker does not handle version numbers of the form
- <replaceable>x</replaceable>.<replaceable>y</replaceable>.<replaceable>z</replaceable>
- well. Any version number after the <replaceable>y</replaceable>
- (ie. the third digit) is totally ignored when comparing shared lib
- version numbers to decide which library to link with. Given two shared
- libraries that differ only in the <quote>micro</quote> revision,
- <command>ld.so</command> will link with the higher one. Ie: if you link
- with <filename>libfoo.so.3.3.3</filename>, the linker only records
- <literal>3.3</literal> in the headers, and will link with anything
- starting with
- <replaceable>libfoo.so.3</replaceable>.<replaceable>(anything &gt;=
- 3)</replaceable>.<replaceable>(highest
- available)</replaceable>.</para>
-
- <note>
- <para><command>ld.so</command> will always use the highest
- <quote>minor</quote> revision. Ie: it will use
- <filename>libc.so.2.2</filename> in preference to
- <filename>libc.so.2.0</filename>, even if the program was initially
- linked with <filename>libc.so.2.0</filename>.</para>
- </note>
-
- <para>In addition, our ELF dynamic linker does not handle minor version
- numbers at all. However, one should still specify a major and minor
- version number as our <filename>Makefile</filename>s "do the right thing"
- based on the type of system.</para>
-
- <para>For non-port libraries, it is also our policy to change the shared
- library version number only once between releases. In addition, it is
- our policy to change the major shared library version number only once
- between major OS releases. Ie: X.0 to (X+1).0. When you make a
- change to a system library that requires the version number to be
- bumped, check the <filename>Makefile</filename>'s commit logs. It is the
- responsibility of the committer to ensure that the first such change
- since the release will result in the shared library version number in
- the <filename>Makefile</filename> to be updated, and any subsequent
- changes will not.</para>
- </sect1>
-</chapter>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-declaration: "../chapter.decl"
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- sgml-parent-document: ("../book.sgml" "part" "chapter")
- End:
--->
-
diff --git a/en_US.ISO8859-1/books/developers-handbook/scsi/chapter.sgml b/en_US.ISO8859-1/books/developers-handbook/scsi/chapter.sgml
deleted file mode 100644
index 072aea5499..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/scsi/chapter.sgml
+++ /dev/null
@@ -1,1983 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD: doc/en_US.ISO8859-1/books/developers-handbook/scsi/chapter.sgml,v 1.4 2001/06/13 11:35:56 tom Exp $
--->
-
-<chapter id="scsi">
- <title>Common Access Method SCSI Controllers</title>
-
- <para><emphasis>This chapter was written by &a.babkin;
- Modifications for the handbook made by
- &a.murray;.</emphasis></para>
-
- <sect1>
- <title>Synopsis</title>
-
- <para>This document assumes that the reader has a general
- understanding of device drivers in FreeBSD and of the SCSI
- protocol. Much of the information in this document was
- extracted from the drivers :</para>
-
- <itemizedlist>
-
- <listitem><para>ncr (<filename>/sys/pci/ncr.c</filename>) by
- Wolfgang Stanglmeier and Stefan Esser</para></listitem>
-
- <listitem><para>sym (<filename>/sys/pci/sym.c</filename>) by
- Gerard Roudier</para></listitem>
-
- <listitem><para>aic7xxx
- (<filename>/sys/dev/aic7xxx/aic7xxx.c</filename>) by Justin
- T. Gibbs</para></listitem>
-
- </itemizedlist>
-
- <para>and from the CAM code itself (by Justing T. Gibbs, see
- <filename>/sys/cam/*</filename>). When some solution looked the
- most logical and was essentially verbatim extracted from the code
- by Justin Gibbs, I marked it as "recommended".</para>
-
- <para>The document is illustrated with examples in
- pseudo-code. Although sometimes the examples have many details
- and look like real code, it's still pseudo-code. It was written
- to demonstrate the concepts in an understandable way. For a real
- driver other approaches may be more modular and efficient. It
- also abstracts from the hardware details, as well as issues that
- would cloud the demonstrated concepts or that are supposed to be
- described in the other chapters of the developers handbook. Such
- details are commonly shown as calls to functions with descriptive
- names, comments or pseudo-statements. Fortunately real life
- full-size examples with all the details can be found in the real
- drivers.</para>
-
- </sect1>
-
- <sect1>
- <title>General architecture</title>
-
- <para>CAM stands for Common Access Method. It's a generic way to
- address the I/O buses in a SCSI-like way. This allows a
- separation of the generic device drivers from the drivers
- controlling the I/O bus: for example the disk driver becomes able
- to control disks on both SCSI, IDE, and/or any other bus so the
- disk driver portion does not have to be rewritten (or copied and
- modified) for every new I/O bus. Thus the two most important
- active entities are:</para>
-
- <itemizedlist>
- <listitem><para><emphasis>Peripheral Modules</emphasis> - a
- driver for peripheral devices (disk, tape, CDROM,
- etc.)</para></listitem>
- <listitem><para><emphasis>SCSI Interface Modules </emphasis>(SIM)
- - a Host Bus Adapter drivers for connecting to an I/O bus such
- as SCSI or IDE.</para></listitem>
- </itemizedlist>
-
- <para>A peripheral driver receives requests from the OS, converts
- them to a sequence of SCSI commands and passes these SCSI
- commands to a SCSI Interface Module. The SCSI Interface Module
- is responsible for passing these commands to the actual hardware
- (or if the actual hardware is not SCSI but, for example, IDE
- then also converting the SCSI commands to the native commands of
- the hardware).</para>
-
- <para>Because we are interested in writing a SCSI adapter driver
- here, from this point on we will consider everything from the
- SIM standpoint.</para>
-
- <para>A typical SIM driver needs to include the following
- CAM-related header files:</para>
-
-<programlisting>#include &lt;cam/cam.h&gt;
-#include &lt;cam/cam_ccb.h&gt;
-#include &lt;cam/cam_sim.h&gt;
-#include &lt;cam/cam_xpt_sim.h&gt;
-#include &lt;cam/cam_debug.h&gt;
-#include &lt;cam/scsi/scsi_all.h&gt;</programlisting>
-
- <para>The first thing each SIM driver must do is register itself
- with the CAM subsystem. This is done during the driver's
- <function>xxx_attach()</function> function (here and further
- xxx_ is used to denote the unique driver name prefix). The
- <function>xxx_attach()</function> function itself is called by
- the system bus auto-configuration code which we don't describe
- here.</para>
-
- <para>This is achieved in multiple steps: first it's necessary to
- allocate the queue of requests associated with this SIM:</para>
-
-<programlisting> struct cam_devq *devq;
-
- if(( devq = cam_simq_alloc(SIZE) )==NULL) {
- error; /* some code to handle the error */
- }</programlisting>
-
- <para>Here SIZE is the size of the queue to be allocated, maximal
- number of requests it could contain. It's the number of requests
- that the SIM driver can handle in parallel on one SCSI
- card. Commonly it can be calculated as:</para>
-
-<programlisting>SIZE = NUMBER_OF_SUPPORTED_TARGETS * MAX_SIMULTANEOUS_COMMANDS_PER_TARGET</programlisting>
-
- <para>Next we create a descriptor of our SIM:</para>
-
-<programlisting> struct cam_sim *sim;
-
- if(( sim = cam_sim_alloc(action_func, poll_func, driver_name,
- softc, unit, max_dev_transactions,
- max_tagged_dev_transactions, devq) )==NULL) {
- cam_simq_free(devq);
- error; /* some code to handle the error */
- }</programlisting>
-
- <para>Note that if we are not able to create a SIM descriptor we
- free the <structname>devq</structname> also because we can do
- nothing else with it and we want to conserve memory.</para>
-
- <para>If a SCSI card has multiple SCSI buses on it then each bus
- requires its own <structname>cam_sim</structname>
- structure.</para>
-
- <para>An interesting question is what to do if a SCSI card has
- more than one SCSI bus, do we need one
- <structname>devq</structname> structure per card or per SCSI
- bus? The answer given in the comments to the CAM code is:
- either way, as the driver's author prefers.</para>
-
- <para>The arguments are :
- <itemizedlist>
-
- <listitem><para><function>action_func</function> - pointer to
- the driver's <function>xxx_action</function> function.
- <funcSynopsis><funcPrototype>
- <funcDef>static void
- <function>xxx_action</function>
- </funcDef>
- <paramdef>
- <parameter>struct cam_sim *sim</parameter>,
- <parameter>union ccb *ccb</parameter>
- </paramdef>
- </funcPrototype></funcSynopsis>
- </para></listitem>
-
- <listitem><para><function>poll_func</function> - pointer to
- the driver's <function>xxx_poll()</function>
- <funcSynopsis><funcPrototype>
- <funcDef>static void
- <function>xxx_poll</function>
- </funcDef>
- <paramdef>
- <parameter>struct cam_sim *sim</parameter>
- </paramdef>
- </funcPrototype></funcSynopsis>
- </para></listitem>
-
- <listitem><para>driver_name - the name of the actual driver,
- such as "ncr" or "wds"</para></listitem>
-
- <listitem><para><structName>softc</structName> - pointer to the
- driver's internal descriptor for this SCSI card. This
- pointer will be used by the driver in future to get private
- data.</para></listitem>
-
- <listitem><para>unit - the controller unit number, for example
- for controller "wds0" this number will be
- 0</para></listitem>
-
- <listitem><para>max_dev_transactions - maximal number of
- simultaneous transactions per SCSI target in the non-tagged
- mode. This value will be almost universally equal to 1, with
- possible exceptions only for the non-SCSI cards. Also the
- drivers that hope to take advantage by preparing one
- transaction while another one is executed may set it to 2
- but this does not seem to be worth the
- complexity.</para></listitem>
-
- <listitem><para>max_tagged_dev_transactions - the same thing,
- but in the tagged mode. Tags are the SCSI way to initiate
- multiple transactions on a device: each transaction is
- assigned a unique tag and the transaction is sent to the
- device. When the device completes some transaction it sends
- back the result together with the tag so that the SCSI
- adapter (and the driver) can tell which transaction was
- completed. This argument is also known as the maximal tag
- depth. It depends on the abilities of the SCSI
- adapter.</para></listitem>
- </itemizedlist>
- </para>
-
- <para>Finally we register the SCSI buses associated with our SCSI
- adapter:</para>
-
-<programlisting> if(xpt_bus_register(sim, bus_number) != CAM_SUCCESS) {
- cam_sim_free(sim, /*free_devq*/ TRUE);
- error; /* some code to handle the error */
- }</programlisting>
-
- <para>If there is one <structName>devq</structName> structure per
- SCSI bus (i.e. we consider a card with multiple buses as
- multiple cards with one bus each) then the bus number will
- always be 0, otherwise each bus on the SCSI card should be get a
- distinct number. Each bus needs its own separate structure
- cam_sim.</para>
-
- <para>After that our controller is completely hooked to the CAM
- system. The value of <structName>devq</structName> can be
- discarded now: sim will be passed as an argument in all further
- calls from CAM and devq can be derived from it.</para>
-
- <para>CAM provides the framework for such asynchronous
- events. Some events originate from the lower levels (the SIM
- drivers), some events originate from the peripheral drivers,
- some events originate from the CAM subsystem itself. Any driver
- can register callbacks for some types of the asynchronous
- events, so that it would be notified if these events
- occur.</para>
-
- <para>A typical example of such an event is a device reset. Each
- transaction and event identifies the devices to which it applies
- by the means of "path". The target-specific events normally
- occur during a transaction with this device. So the path from
- that transaction may be re-used to report this event (this is
- safe because the event path is copied in the event reporting
- routine but not deallocated nor passed anywhere further). Also
- it's safe to allocate paths dynamically at any time including
- the interrupt routines, although that incurs certain overhead,
- and a possible problem with this approach is that there may be
- no free memory at that time. For a bus reset event we need to
- define a wildcard path including all devices on the bus. So we
- can create the path for the future bus reset events in advance
- and avoid problems with the future memory shortage:</para>
-
-<programlisting> struct cam_path *path;
-
- if(xpt_create_path(&amp;path, /*periph*/NULL,
- cam_sim_path(sim), CAM_TARGET_WILDCARD,
- CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
- xpt_bus_deregister(cam_sim_path(sim));
- cam_sim_free(sim, /*free_devq*/TRUE);
- error; /* some code to handle the error */
- }
-
- softc->wpath = path;
- softc->sim = sim;</programlisting>
-
- <para>As you can see the path includes:</para>
-
- <itemizedlist>
- <listitem><para>ID of the peripheral driver (NULL here because we have
- none)</para></listitem>
-
- <listitem><para>ID of the SIM driver
- (<function>cam_sim_path(sim)</function>)</para></listitem>
-
- <listitem><para>SCSI target number of the device (CAM_TARGET_WILDCARD
- means "all devices")</para></listitem>
-
- <listitem><para>SCSI LUN number of the subdevice (CAM_LUN_WILDCARD means
- "all LUNs")</para></listitem>
- </itemizedlist>
-
- <para>If the driver can't allocate this path it won't be able to
- work normally, so in that case we dismantle that SCSI
- bus.</para>
-
- <para>And we save the path pointer in the
- <structName>softc</structName> structure for future use. After
- that we save the value of sim (or we can also discard it on the
- exit from <function>xxx_probe()</function> if we wish).</para>
-
- <para>That's all for a minimalistic initialization. To do things
- right there is one more issue left. </para>
-
- <para>For a SIM driver there is one particularly interesting
- event: when a target device is considered lost. In this case
- resetting the SCSI negotiations with this device may be a good
- idea. So we register a callback for this event with CAM. The
- request is passed to CAM by requesting CAM action on a CAM
- control block for this type of request:</para>
-
-<programlisting> struct ccb_setasync csa;
-
- xpt_setup_ccb(&amp;csa.ccb_h, path, /*priority*/5);
- csa.ccb_h.func_code = XPT_SASYNC_CB;
- csa.event_enable = AC_LOST_DEVICE;
- csa.callback = xxx_async;
- csa.callback_arg = sim;
- xpt_action((union ccb *)&amp;csa);</programlisting>
-
- <para>Now we take a look at the <function>xxx_action()</function>
- and <function>xxx_poll()</function> driver entry points.</para>
-
- <para>
- <funcSynopsis><funcPrototype>
- <funcDef>static void
- <function>xxx_action</function>
- </funcDef>
- <paramdef>
- <parameter>struct cam_sim *sim</parameter>,
- <parameter>union ccb *ccb</parameter>
- </paramdef>
- </funcPrototype></funcSynopsis>
- </para>
-
- <para>Do some action on request of the CAM subsystem. Sim
- describes the SIM for the request, CCB is the request
- itself. CCB stands for "CAM Control Block". It is a union of
- many specific instances, each describing arguments for some type
- of transactions. All of these instances share the CCB header
- where the common part of arguments is stored.</para>
-
- <para>CAM supports the SCSI controllers working in both initiator
- ("normal") mode and target (simulating a SCSI device) mode. Here
- we only consider the part relevant to the initiator mode.</para>
-
- <para>There are a few function and macros (in other words,
- methods) defined to access the public data in the struct sim:</para>
-
- <itemizedlist>
- <listitem><para><function>cam_sim_path(sim)</function> - the
- path ID (see above)</para></listitem>
-
- <listitem><para><function>cam_sim_name(sim)</function> - the
- name of the sim</para></listitem>
-
- <listitem><para><function>cam_sim_softc(sim)</function> - the
- pointer to the softc (driver private data)
- structure</para></listitem>
-
- <listitem><para><function> cam_sim_unit(sim)</function> - the
- unit number</para></listitem>
-
- <listitem><para><function> cam_sim_bus(sim)</function> - the bus
- ID</para></listitem>
- </itemizedlist>
-
- <para>To identify the device, <function>xxx_action()</function> can
- get the unit number and pointer to its structure softc using
- these functions.</para>
-
- <para>The type of request is stored in
- <structField>ccb-&gt;ccb_h.func_code</structField>. So generally
- <function>xxx_action()</function> consists of a big
- switch:</para>
-
-<programlisting> struct xxx_softc *softc = (struct xxx_softc *) cam_sim_softc(sim);
- struct ccb_hdr *ccb_h = &amp;ccb->ccb_h;
- int unit = cam_sim_unit(sim);
- int bus = cam_sim_bus(sim);
-
- switch(ccb_h->func_code) {
- case ...:
- ...
- default:
- ccb_h->status = CAM_REQ_INVALID;
- xpt_done(ccb);
- break;
- }</programlisting>
-
- <para>As can be seen from the default case (if an unknown command
- was received) the return code of the command is set into
- <structField>ccb-&gt;ccb_h.status</structField> and the completed
- CCB is returned back to CAM by calling
- <function>xpt_done(ccb)</function>. </para>
-
- <para><function>xpt_done()</function> does not have to be called
- from <function>xxx_action()</function>: For example an I/O
- request may be enqueued inside the SIM driver and/or its SCSI
- controller. Then when the device would post an interrupt
- signaling that the processing of this request is complete
- <function>xpt_done()</function> may be called from the interrupt
- handling routine.</para>
-
- <para>Actually, the CCB status is not only assigned as a return
- code but a CCB has some status all the time. Before CCB is
- passed to the <function>xxx_action()</function> routine it gets
- the status CCB_REQ_INPROG meaning that it's in progress. There
- are a surprising number of status values defined in
- <filename>/sys/cam/cam.h</filename> which should be able to
- represent the status of a request in great detail. More
- interesting yet, the status is in fact a "bitwise or" of an
- enumerated status value (the lower 6 bits) and possible
- additional flag-like bits (the upper bits). The enumerated
- values will be discussed later in more detail. The summary of
- them can be found in the Errors Summary section. The possible
- status flags are:</para>
-
- <itemizedlist>
-
- <listitem><para><emphasis>CAM_DEV_QFRZN</emphasis> - if the
- SIM driver gets a serious error (for example, the device does
- not respond to the selection or breaks the SCSI protocol) when
- processing a CCB it should freeze the request queue by calling
- <function>xpt_freeze_simq()</function>, return the other
- enqueued but not processed yet CCBs for this device back to
- the CAM queue, then set this flag for the troublesome CCB and
- call <function>xpt_done()</function>. This flag causes the CAM
- subsystem to unfreeze the queue after it handles the
- error.</para></listitem>
-
- <listitem><para><emphasis>CAM_AUTOSNS_VALID</emphasis> - if
- the device returned an error condition and the flag
- CAM_DIS_AUTOSENSE is not set in CCB the SIM driver must
- execute the REQUEST SENSE command automatically to extract the
- sense (extended error information) data from the device. If
- this attempt was successful the sense data should be saved in
- the CCB and this flag set.</para></listitem>
-
- <listitem><para><emphasis>CAM_RELEASE_SIMQ</emphasis> - like
- CAM_DEV_QFRZN but used in case there is some problem (or
- resource shortage) with the SCSI controller itself. Then all
- the future requests to the controller should be stopped by
- <function>xpt_freeze_simq()</function>. The controller queue
- will be restarted after the SIM driver overcomes the shortage
- and informs CAM by returning some CCB with this flag
- set.</para></listitem>
-
- <listitem><para><emphasis>CAM_SIM_QUEUED</emphasis> - when SIM
- puts a CCB into its request queue this flag should be set (and
- removed when this CCB gets dequeued before being returned back
- to CAM). This flag is not used anywhere in the CAM code now,
- so its purpose is purely diagnostic.</para></listitem>
-
- </itemizedlist>
-
- <para>The function <function>xxx_action()</function> is not
- allowed to sleep, so all the synchronization for resource access
- must be done using SIM or device queue freezing. Besides the
- aforementioned flags the CAM subsystem provides functions
- <function>xpt_selease_simq()</function> and
- <function>xpt_release_devq()</function> to unfreeze the queues
- directly, without passing a CCB to CAM.</para>
-
- <para>The CCB header contains the following fields:</para>
-
- <itemizedlist>
-
- <listitem><para><emphasis>path</emphasis> - path ID for the
- request</para></listitem>
-
- <listitem><para><emphasis>target_id</emphasis> - target device
- ID for the request</para></listitem>
-
- <listitem><para><emphasis>target_lun</emphasis> - LUN ID of
- the target device</para></listitem>
-
- <listitem><para><emphasis>timeout</emphasis> - timeout
- interval for this command, in milliseconds</para></listitem>
-
- <listitem><para><emphasis>timeout_ch</emphasis> - a
- convenience place for the SIM driver to store the timeout handle
- (the CAM subsystem itself does not make any assumptions about
- it)</para></listitem>
-
- <listitem><para><emphasis>flags</emphasis> - various bits of
- information about the request spriv_ptr0, spriv_ptr1 - fields
- reserved for private use by the SIM driver (such as linking to
- the SIM queues or SIM private control blocks); actually, they
- exist as unions: spriv_ptr0 and spriv_ptr1 have the type (void
- *), spriv_field0 and spriv_field1 have the type unsigned long,
- sim_priv.entries[0].bytes and sim_priv.entries[1].bytes are byte
- arrays of the size consistent with the other incarnations of the
- union and sim_priv.bytes is one array, twice
- bigger.</para></listitem>
-
- </itemizedlist>
-
- <para>The recommended way of using the SIM private fields of CCB
- is to define some meaningful names for them and use these
- meaningful names in the driver, like:</para>
-
-<programlisting>#define ccb_some_meaningful_name sim_priv.entries[0].bytes
-#define ccb_hcb spriv_ptr1 /* for hardware control block */</programlisting>
-
- <para>The most common initiator mode requests are:</para>
- <itemizedlist>
- <listitem><para><emphasis>XPT_SCSI_IO</emphasis> - execute an
- I/O transaction</para>
-
- <para>The instance "struct ccb_scsiio csio" of the union ccb is
- used to transfer the arguments. They are:</para>
-
- <itemizedlist>
- <listitem><para><emphasis>cdb_io</emphasis> - pointer to
- the SCSI command buffer or the buffer
- itself</para></listitem>
-
- <listitem><para><emphasis>cdb_len</emphasis> - SCSI
- command length</para></listitem>
-
- <listitem><para><emphasis>data_ptr</emphasis> - pointer to
- the data buffer (gets a bit complicated if scatter/gather is
- used)</para></listitem>
-
- <listitem><para><emphasis>dxfer_len</emphasis> - length of
- the data to transfer</para></listitem>
-
- <listitem><para><emphasis>sglist_cnt</emphasis> - counter
- of the scatter/gather segments</para></listitem>
-
- <listitem><para><emphasis>scsi_status</emphasis> - place
- to return the SCSI status</para></listitem>
-
- <listitem><para><emphasis>sense_data</emphasis> - buffer
- for the SCSI sense information if the command returns an
- error (the SIM driver is supposed to run the REQUEST SENSE
- command automatically in this case if the CCB flag
- CAM_DIS_AUTOSENSE is not set)</para></listitem>
-
- <listitem><para><emphasis>sense_len</emphasis> - the
- length of that buffer (if it happens to be higher than size
- of sense_data the SIM driver must silently assume the
- smaller value) resid, sense_resid - if the transfer of data
- or SCSI sense returned an error these are the returned
- counters of the residual (not transferred) data. They do not
- seem to be especially meaningful, so in a case when they are
- difficult to compute (say, counting bytes in the SCSI
- controller's FIFO buffer) an approximate value will do as
- well. For a successfully completed transfer they must be set
- to zero.</para></listitem>
-
- <listitem><para><emphasis>tag_action</emphasis> - the kind
- of tag to use:
-
- <itemizedlist>
- <listitem><para>CAM_TAG_ACTION_NONE - don't use tags for this
- transaction</para></listitem>
- <listitem><para>MSG_SIMPLE_Q_TAG, MSG_HEAD_OF_Q_TAG,
- MSG_ORDERED_Q_TAG - value equal to the appropriate tag
- message (see /sys/cam/scsi/scsi_message.h); this gives only
- the tag type, the SIM driver must assign the tag value
- itself</para></listitem>
- </itemizedlist>
-
- </para></listitem>
-
- </itemizedlist>
-
- <para>The general logic of handling this request is the
- following:</para>
-
- <para>The first thing to do is to check for possible races, to
- make sure that the command did not get aborted when it was
- sitting in the queue:</para>
-
-<programlisting> struct ccb_scsiio *csio = &amp;ccb->csio;
-
- if ((ccb_h->status &amp; CAM_STATUS_MASK) != CAM_REQ_INPROG) {
- xpt_done(ccb);
- return;
- }</programlisting>
-
- <para>Also we check that the device is supported at all by our
- controller:</para>
-
-<programlisting> if(ccb_h->target_id > OUR_MAX_SUPPORTED_TARGET_ID
- || cch_h->target_id == OUR_SCSI_CONTROLLERS_OWN_ID) {
- ccb_h->status = CAM_TID_INVALID;
- xpt_done(ccb);
- return;
- }
- if(ccb_h->target_lun > OUR_MAX_SUPPORTED_LUN) {
- ccb_h->status = CAM_LUN_INVALID;
- xpt_done(ccb);
- return;
- }</programlisting>
-
- <para>Then allocate whatever data structures (such as
- card-dependent hardware control block) we need to process this
- request. If we can't then freeze the SIM queue and remember
- that we have a pending operation, return the CCB back and ask
- CAM to re-queue it. Later when the resources become available
- the SIM queue must be unfrozen by returning a ccb with the
- CAM_SIMQ_RELEASE bit set in its status. Otherwise, if all went
- well, link the CCB with the hardware control block (HCB) and
- mark it as queued.</para>
-
-<programlisting> struct xxx_hcb *hcb = allocate_hcb(softc, unit, bus);
-
- if(hcb == NULL) {
- softc->flags |= RESOURCE_SHORTAGE;
- xpt_freeze_simq(sim, /*count*/1);
- ccb_h->status = CAM_REQUEUE_REQ;
- xpt_done(ccb);
- return;
- }
-
- hcb->ccb = ccb; ccb_h->ccb_hcb = (void *)hcb;
- ccb_h->status |= CAM_SIM_QUEUED;</programlisting>
-
- <para>Extract the target data from CCB into the hardware control
- block. Check if we are asked to assign a tag and if yes then
- generate an unique tag and build the SCSI tag messages. The
- SIM driver is also responsible for negotiations with the
- devices to set the maximal mutually supported bus width,
- synchronous rate and offset.</para>
-
-<programlisting> hcb->target = ccb_h->target_id; hcb->lun = ccb_h->target_lun;
- generate_identify_message(hcb);
- if( ccb_h->tag_action != CAM_TAG_ACTION_NONE )
- generate_unique_tag_message(hcb, ccb_h->tag_action);
- if( !target_negotiated(hcb) )
- generate_negotiation_messages(hcb);</programlisting>
-
- <para>Then set up the SCSI command. The command storage may be
- specified in the CCB in many interesting ways, specified by
- the CCB flags. The command buffer can be contained in CCB or
- pointed to, in the latter case the pointer may be physical or
- virtual. Since the hardware commonly needs physical address we
- always convert the address to the physical one.</para>
-
- <para>A NOT-QUITE RELATED NOTE: Normally this is done by a call
- to vtophys(), but for the PCI device (which account for most
- of the SCSI controllers now) drivers' portability to the Alpha
- architecture the conversion must be done by vtobus() instead
- due to special Alpha quirks. [IMHO it would be much better to
- have two separate functions, vtop() and ptobus() then vtobus()
- would be a simple superposition of them.] In case if a
- physical address is requested it's OK to return the CCB with
- the status CAM_REQ_INVALID, the current drivers do that. But
- it's also possible to compile the Alpha-specific piece of
- code, as in this example (there should be a more direct way to
- do that, without conditional compilation in the drivers). If
- necessary a physical address can be also converted or mapped
- back to a virtual address but with big pain, so we don't do
- that.</para>
-
-<programlisting> if(ccb_h->flags &amp; CAM_CDB_POINTER) {
- /* CDB is a pointer */
- if(!(ccb_h->flags &amp; CAM_CDB_PHYS)) {
- /* CDB pointer is virtual */
- hcb->cmd = vtobus(csio->cdb_io.cdb_ptr);
- } else {
- /* CDB pointer is physical */
-#if defined(__alpha__)
- hcb->cmd = csio->cdb_io.cdb_ptr | alpha_XXX_dmamap_or ;
-#else
- hcb->cmd = csio->cdb_io.cdb_ptr ;
-#endif
- }
- } else {
- /* CDB is in the ccb (buffer) */
- hcb->cmd = vtobus(csio->cdb_io.cdb_bytes);
- }
- hcb->cmdlen = csio->cdb_len;</programlisting>
-
- <para>Now it's time to set up the data. Again, the data storage
- may be specified in the CCB in many interesting ways,
- specified by the CCB flags. First we get the direction of the
- data transfer. The simplest case is if there is no data to
- transfer:</para>
-
-<programlisting> int dir = (ccb_h->flags &amp; CAM_DIR_MASK);
-
- if (dir == CAM_DIR_NONE)
- goto end_data;</programlisting>
-
- <para>Then we check if the data is in one chunk or in a
- scatter-gather list, and the addresses are physical or
- virtual. The SCSI controller may be able to handle only a
- limited number of chunks of limited length. If the request
- hits this limitation we return an error. We use a special
- function to return the CCB to handle in one place the HCB
- resource shortages. The functions to add chunks are
- driver-dependent, and here we leave them without detailed
- implementation. See description of the SCSI command (CDB)
- handling for the details on the address-translation issues.
- If some variation is too difficult or impossible to implement
- with a particular card it's OK to return the status
- CAM_REQ_INVALID. Actually, it seems like the scatter-gather
- ability is not used anywhere in the CAM code now. But at least
- the case for a single non-scattered virtual buffer must be
- implemented, it's actively used by CAM.</para>
-
-<programlisting> int rv;
-
- initialize_hcb_for_data(hcb);
-
- if((!(ccb_h->flags &amp; CAM_SCATTER_VALID)) {
- /* single buffer */
- if(!(ccb_h->flags &amp; CAM_DATA_PHYS)) {
- rv = add_virtual_chunk(hcb, csio->data_ptr, csio->dxfer_len, dir);
- }
- } else {
- rv = add_physical_chunk(hcb, csio->data_ptr, csio->dxfer_len, dir);
- }
- } else {
- int i;
- struct bus_dma_segment *segs;
- segs = (struct bus_dma_segment *)csio->data_ptr;
-
- if ((ccb_h->flags &amp; CAM_SG_LIST_PHYS) != 0) {
- /* The SG list pointer is physical */
- rv = setup_hcb_for_physical_sg_list(hcb, segs, csio->sglist_cnt);
- } else if (!(ccb_h->flags &amp; CAM_DATA_PHYS)) {
- /* SG buffer pointers are virtual */
- for (i = 0; i < csio->sglist_cnt; i++) {
- rv = add_virtual_chunk(hcb, segs[i].ds_addr,
- segs[i].ds_len, dir);
- if (rv != CAM_REQ_CMP)
- break;
- }
- } else {
- /* SG buffer pointers are physical */
- for (i = 0; i < csio->sglist_cnt; i++) {
- rv = add_physical_chunk(hcb, segs[i].ds_addr,
- segs[i].ds_len, dir);
- if (rv != CAM_REQ_CMP)
- break;
- }
- }
- }
- if(rv != CAM_REQ_CMP) {
- /* we expect that add_*_chunk() functions return CAM_REQ_CMP
- * if they added a chunk successfully, CAM_REQ_TOO_BIG if
- * the request is too big (too many bytes or too many chunks),
- * CAM_REQ_INVALID in case of other troubles
- */
- free_hcb_and_ccb_done(hcb, ccb, rv);
- return;
- }
- end_data:</programlisting>
-
- <para>If disconnection is disabled for this CCB we pass this
- information to the hcb:</para>
-
-<programlisting> if(ccb_h->flags &amp; CAM_DIS_DISCONNECT)
- hcb_disable_disconnect(hcb);</programlisting>
-
- <para>If the controller is able to run REQUEST SENSE command all
- by itself then the value of the flag CAM_DIS_AUTOSENSE should
- also be passed to it, to prevent automatic REQUEST SENSE if the
- CAM subsystem does not want it.</para>
-
- <para>The only thing left is to set up the timeout, pass our hcb
- to the hardware and return, the rest will be done by the
- interrupt handler (or timeout handler).</para>
-
-<programlisting> ccb_h->timeout_ch = timeout(xxx_timeout, (caddr_t) hcb,
- (ccb_h->timeout * hz) / 1000); /* convert milliseconds to ticks */
- put_hcb_into_hardware_queue(hcb);
- return;</programlisting>
-
- <para>And here is a possible implementation of the function
- returning CCB:</para>
-
-<programlisting> static void
- free_hcb_and_ccb_done(struct xxx_hcb *hcb, union ccb *ccb, u_int32_t status)
- {
- struct xxx_softc *softc = hcb->softc;
-
- ccb->ccb_h.ccb_hcb = 0;
- if(hcb != NULL) {
- untimeout(xxx_timeout, (caddr_t) hcb, ccb->ccb_h.timeout_ch);
- /* we're about to free a hcb, so the shortage has ended */
- if(softc->flags &amp; RESOURCE_SHORTAGE) {
- softc->flags &amp;= ~RESOURCE_SHORTAGE;
- status |= CAM_RELEASE_SIMQ;
- }
- free_hcb(hcb); /* also removes hcb from any internal lists */
- }
- ccb->ccb_h.status = status |
- (ccb->ccb_h.status &amp; ~(CAM_STATUS_MASK|CAM_SIM_QUEUED));
- xpt_done(ccb);
- }</programlisting>
- </listitem>
-
- <listitem><para><emphasis>XPT_RESET_DEV</emphasis> - send the SCSI "BUS
- DEVICE RESET" message to a device</para>
-
- <para>There is no data transferred in CCB except the header and
- the most interesting argument of it is target_id. Depending on
- the controller hardware a hardware control block just like for
- the XPT_SCSI_IO request may be constructed (see XPT_SCSI_IO
- request description) and sent to the controller or the SCSI
- controller may be immediately programmed to send this RESET
- message to the device or this request may be just not supported
- (and return the status CAM_REQ_INVALID). Also on completion of
- the request all the disconnected transactions for this target
- must be aborted (probably in the interrupt routine).</para>
-
- <para>Also all the current negotiations for the target are lost on
- reset, so they might be cleaned too. Or they clearing may be
- deferred, because anyway the target would request re-negotiation
- on the next transaction.</para></listitem>
-
- <listitem><para><emphasis>XPT_RESET_BUS</emphasis> - send the RESET signal
- to the SCSI bus</para>
-
- <para>No arguments are passed in the CCB, the only interesting
- argument is the SCSI bus indicated by the struct sim
- pointer.</para>
-
- <para>A minimalistic implementation would forget the SCSI
- negotiations for all the devices on the bus and return the
- status CAM_REQ_CMP.</para>
-
- <para>The proper implementation would in addition actually reset
- the SCSI bus (possible also reset the SCSI controller) and mark
- all the CCBs being processed, both those in the hardware queue
- and those being disconnected, as done with the status
- CAM_SCSI_BUS_RESET. Like:</para>
-
-<programlisting> int targ, lun;
- struct xxx_hcb *h, *hh;
- struct ccb_trans_settings neg;
- struct cam_path *path;
-
- /* The SCSI bus reset may take a long time, in this case its completion
- * should be checked by interrupt or timeout. But for simplicity
- * we assume here that it's really fast.
- */
- reset_scsi_bus(softc);
-
- /* drop all enqueued CCBs */
- for(h = softc->first_queued_hcb; h != NULL; h = hh) {
- hh = h->next;
- free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);
- }
-
- /* the clean values of negotiations to report */
- neg.bus_width = 8;
- neg.sync_period = neg.sync_offset = 0;
- neg.valid = (CCB_TRANS_BUS_WIDTH_VALID
- | CCB_TRANS_SYNC_RATE_VALID | CCB_TRANS_SYNC_OFFSET_VALID);
-
- /* drop all disconnected CCBs and clean negotiations */
- for(targ=0; targ <= OUR_MAX_SUPPORTED_TARGET; targ++) {
- clean_negotiations(softc, targ);
-
- /* report the event if possible */
- if(xpt_create_path(&amp;path, /*periph*/NULL,
- cam_sim_path(sim), targ,
- CAM_LUN_WILDCARD) == CAM_REQ_CMP) {
- xpt_async(AC_TRANSFER_NEG, path, &amp;neg);
- xpt_free_path(path);
- }
-
- for(lun=0; lun <= OUR_MAX_SUPPORTED_LUN; lun++)
- for(h = softc->first_discon_hcb[targ][lun]; h != NULL; h = hh) {
- hh=h->next;
- free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);
- }
- }
-
- ccb->ccb_h.status = CAM_REQ_CMP;
- xpt_done(ccb);
-
- /* report the event */
- xpt_async(AC_BUS_RESET, softc->wpath, NULL);
- return;</programlisting>
-
- <para>Implementing the SCSI bus reset as a function may be a good
- idea because it would be re-used by the timeout function as a
- last resort if the things go wrong.</para></listitem>
-
- <listitem><para><emphasis>XPT_ABORT</emphasis> - abort the specified
- CCB</para>
-
- <para>The arguments are transferred in the instance "struct
- ccb_abort cab" of the union ccb. The only argument field in it
- is:</para>
-
- <para><emphasis>abort_ccb</emphasis> - pointer to the CCB to be
- aborted</para>
-
- <para>If the abort is not supported just return the status
- CAM_UA_ABORT. This is also the easy way to minimally implement
- this call, return CAM_UA_ABORT in any case.</para>
-
- <para>The hard way is to implement this request honestly. First
- check that abort applies to a SCSI transaction:</para>
-
-<programlisting> struct ccb *abort_ccb;
- abort_ccb = ccb->cab.abort_ccb;
-
- if(abort_ccb->ccb_h.func_code != XPT_SCSI_IO) {
- ccb->ccb_h.status = CAM_UA_ABORT;
- xpt_done(ccb);
- return;
- }</programlisting>
-
- <para>Then it's necessary to find this CCB in our queue. This can
- be done by walking the list of all our hardware control blocks
- in search for one associated with this CCB:</para>
-
-<programlisting> struct xxx_hcb *hcb, *h;
-
- hcb = NULL;
-
- /* We assume that softc->first_hcb is the head of the list of all
- * HCBs associated with this bus, including those enqueued for
- * processing, being processed by hardware and disconnected ones.
- */
- for(h = softc->first_hcb; h != NULL; h = h->next) {
- if(h->ccb == abort_ccb) {
- hcb = h;
- break;
- }
- }
-
- if(hcb == NULL) {
- /* no such CCB in our queue */
- ccb->ccb_h.status = CAM_PATH_INVALID;
- xpt_done(ccb);
- return;
- }
-
- hcb=found_hcb;</programlisting>
-
- <para>Now we look at the current processing status of the HCB. It
- may be either sitting in the queue waiting to be sent to the
- SCSI bus, being transferred right now, or disconnected and
- waiting for the result of the command, or actually completed by
- hardware but not yet marked as done by software. To make sure
- that we don't get in any races with hardware we mark the HCB as
- being aborted, so that if this HCB is about to be sent to the
- SCSI bus the SCSI controller will see this flag and skip
- it.</para>
-
-<programlisting> int hstatus;
-
- /* shown as a function, in case special action is needed to make
- * this flag visible to hardware
- */
- set_hcb_flags(hcb, HCB_BEING_ABORTED);
-
- abort_again:
-
- hstatus = get_hcb_status(hcb);
- switch(hstatus) {
- case HCB_SITTING_IN_QUEUE:
- remove_hcb_from_hardware_queue(hcb);
- /* FALLTHROUGH */
- case HCB_COMPLETED:
- /* this is an easy case */
- free_hcb_and_ccb_done(hcb, abort_ccb, CAM_REQ_ABORTED);
- break;</programlisting>
-
- <para>If the CCB is being transferred right now we would like to
- signal to the SCSI controller in some hardware-dependent way
- that we want to abort the current transfer. The SCSI controller
- would set the SCSI ATTENTION signal and when the target responds
- to it send an ABORT message. We also reset the timeout to make
- sure that the target is not sleeping forever. If the command
- would not get aborted in some reasonable time like 10 seconds
- the timeout routine would go ahead and reset the whole SCSI bus.
- Because the command will be aborted in some reasonable time we
- can just return the abort request now as successfully completed,
- and mark the aborted CCB as aborted (but not mark it as done
- yet).</para>
-
-<programlisting> case HCB_BEING_TRANSFERRED:
- untimeout(xxx_timeout, (caddr_t) hcb, abort_ccb->ccb_h.timeout_ch);
- abort_ccb->ccb_h.timeout_ch =
- timeout(xxx_timeout, (caddr_t) hcb, 10 * hz);
- abort_ccb->ccb_h.status = CAM_REQ_ABORTED;
- /* ask the controller to abort that HCB, then generate
- * an interrupt and stop
- */
- if(signal_hardware_to_abort_hcb_and_stop(hcb) < 0) {
- /* oops, we missed the race with hardware, this transaction
- * got off the bus before we aborted it, try again */
- goto abort_again;
- }
-
- break;</programlisting>
-
- <para>If the CCB is in the list of disconnected then set it up as
- an abort request and re-queue it at the front of hardware
- queue. Reset the timeout and report the abort request to be
- completed.</para>
-
-<programlisting> case HCB_DISCONNECTED:
- untimeout(xxx_timeout, (caddr_t) hcb, abort_ccb->ccb_h.timeout_ch);
- abort_ccb->ccb_h.timeout_ch =
- timeout(xxx_timeout, (caddr_t) hcb, 10 * hz);
- put_abort_message_into_hcb(hcb);
- put_hcb_at_the_front_of_hardware_queue(hcb);
- break;
- }
- ccb->ccb_h.status = CAM_REQ_CMP;
- xpt_done(ccb);
- return;</programlisting>
-
- <para>That's all for the ABORT request, although there is one more
- issue. Because the ABORT message cleans all the ongoing
- transactions on a LUN we have to mark all the other active
- transactions on this LUN as aborted. That should be done in the
- interrupt routine, after the transaction gets aborted.</para>
-
- <para>Implementing the CCB abort as a function may be quite a good
- idea, this function can be re-used if an I/O transaction times
- out. The only difference would be that the timed out transaction
- would return the status CAM_CMD_TIMEOUT for the timed out
- request. Then the case XPT_ABORT would be small, like
- that:</para>
-
-<programlisting> case XPT_ABORT:
- struct ccb *abort_ccb;
- abort_ccb = ccb->cab.abort_ccb;
-
- if(abort_ccb->ccb_h.func_code != XPT_SCSI_IO) {
- ccb->ccb_h.status = CAM_UA_ABORT;
- xpt_done(ccb);
- return;
- }
- if(xxx_abort_ccb(abort_ccb, CAM_REQ_ABORTED) < 0)
- /* no such CCB in our queue */
- ccb->ccb_h.status = CAM_PATH_INVALID;
- else
- ccb->ccb_h.status = CAM_REQ_CMP;
- xpt_done(ccb);
- return;</programlisting>
- </listitem>
-
- <listitem><para><emphasis>XPT_SET_TRAN_SETTINGS</emphasis> - explicitly
- set values of SCSI transfer settings</para>
-
- <para>The arguments are transferred in the instance "struct ccb_trans_setting cts"
-of the union ccb:</para>
-
- <itemizedlist>
- <listitem><para><emphasis>valid</emphasis> - a bitmask showing
- which settings should be updated:</para></listitem>
-
- <listitem><para><emphasis>CCB_TRANS_SYNC_RATE_VALID</emphasis>
- - synchronous transfer rate</para></listitem>
-
- <listitem><para><emphasis>CCB_TRANS_SYNC_OFFSET_VALID</emphasis>
- - synchronous offset</para></listitem>
-
- <listitem><para><emphasis>CCB_TRANS_BUS_WIDTH_VALID</emphasis>
- - bus width</para></listitem>
-
- <listitem><para><emphasis>CCB_TRANS_DISC_VALID</emphasis> -
- set enable/disable disconnection</para></listitem>
-
- <listitem><para><emphasis>CCB_TRANS_TQ_VALID</emphasis> - set
- enable/disable tagged queuing</para></listitem>
-
- <listitem><para><emphasis>flags</emphasis> - consists of two
- parts, binary arguments and identification of
- sub-operations. The binary arguments are :</para>
- <itemizedlist>
- <listitem><para><emphasis>CCB_TRANS_DISC_ENB</emphasis> - enable disconnection</para></listitem>
- <listitem><para><emphasis>CCB_TRANS_TAG_ENB</emphasis> -
- enable tagged queuing</para></listitem>
- </itemizedlist>
- </listitem>
-
- <listitem><para>the sub-operations are:</para>
- <itemizedlist>
- <listitem><para><emphasis>CCB_TRANS_CURRENT_SETTINGS</emphasis>
- - change the current negotiations</para></listitem>
-
- <listitem><para><emphasis>CCB_TRANS_USER_SETTINGS</emphasis>
- - remember the desired user values sync_period, sync_offset -
- self-explanatory, if sync_offset==0 then the asynchronous mode
- is requested bus_width - bus width, in bits (not
- bytes)</para></listitem>
- </itemizedlist>
- </listitem>
-
- </itemizedlist>
-
- <para>Two sets of negotiated parameters are supported, the user
- settings and the current settings. The user settings are not
- really used much in the SIM drivers, this is mostly just a piece
- of memory where the upper levels can store (and later recall)
- its ideas about the parameters. Setting the user parameters
- does not cause re-negotiation of the transfer rates. But when
- the SCSI controller does a negotiation it must never set the
- values higher than the user parameters, so it's essentially the
- top boundary.</para>
-
- <para>The current settings are, as the name says,
- current. Changing them means that the parameters must be
- re-negotiated on the next transfer. Again, these "new current
- settings" are not supposed to be forced on the device, just they
- are used as the initial step of negotiations. Also they must be
- limited by actual capabilities of the SCSI controller: for
- example, if the SCSI controller has 8-bit bus and the request
- asks to set 16-bit wide transfers this parameter must be
- silently truncated to 8-bit transfers before sending it to the
- device.</para>
-
- <para>One caveat is that the bus width and synchronous parameters
- are per target while the disconnection and tag enabling
- parameters are per lun.</para>
-
- <para>The recommended implementation is to keep 3 sets of
- negotiated (bus width and synchronous transfer)
- parameters:</para>
-
- <itemizedlist>
- <listitem><para><emphasis>user</emphasis> - the user set, as
- above</para></listitem>
-
- <listitem><para><emphasis>current</emphasis> - those actually
- in effect</para></listitem>
-
- <listitem><para><emphasis>goal</emphasis> - those requested by
- setting of the "current" parameters</para></listitem>
- </itemizedlist>
-
- <para>The code looks like:</para>
-
-<programlisting> struct ccb_trans_settings *cts;
- int targ, lun;
- int flags;
-
- cts = &amp;ccb->cts;
- targ = ccb_h->target_id;
- lun = ccb_h->target_lun;
- flags = cts->flags;
- if(flags &amp; CCB_TRANS_USER_SETTINGS) {
- if(flags &amp; CCB_TRANS_SYNC_RATE_VALID)
- softc->user_sync_period[targ] = cts->sync_period;
- if(flags &amp; CCB_TRANS_SYNC_OFFSET_VALID)
- softc->user_sync_offset[targ] = cts->sync_offset;
- if(flags &amp; CCB_TRANS_BUS_WIDTH_VALID)
- softc->user_bus_width[targ] = cts->bus_width;
-
- if(flags &amp; CCB_TRANS_DISC_VALID) {
- softc->user_tflags[targ][lun] &amp;= ~CCB_TRANS_DISC_ENB;
- softc->user_tflags[targ][lun] |= flags &amp; CCB_TRANS_DISC_ENB;
- }
- if(flags &amp; CCB_TRANS_TQ_VALID) {
- softc->user_tflags[targ][lun] &amp;= ~CCB_TRANS_TQ_ENB;
- softc->user_tflags[targ][lun] |= flags &amp; CCB_TRANS_TQ_ENB;
- }
- }
- if(flags &amp; CCB_TRANS_CURRENT_SETTINGS) {
- if(flags &amp; CCB_TRANS_SYNC_RATE_VALID)
- softc->goal_sync_period[targ] =
- max(cts->sync_period, OUR_MIN_SUPPORTED_PERIOD);
- if(flags &amp; CCB_TRANS_SYNC_OFFSET_VALID)
- softc->goal_sync_offset[targ] =
- min(cts->sync_offset, OUR_MAX_SUPPORTED_OFFSET);
- if(flags &amp; CCB_TRANS_BUS_WIDTH_VALID)
- softc->goal_bus_width[targ] = min(cts->bus_width, OUR_BUS_WIDTH);
-
- if(flags &amp; CCB_TRANS_DISC_VALID) {
- softc->current_tflags[targ][lun] &amp;= ~CCB_TRANS_DISC_ENB;
- softc->current_tflags[targ][lun] |= flags &amp; CCB_TRANS_DISC_ENB;
- }
- if(flags &amp; CCB_TRANS_TQ_VALID) {
- softc->current_tflags[targ][lun] &amp;= ~CCB_TRANS_TQ_ENB;
- softc->current_tflags[targ][lun] |= flags &amp; CCB_TRANS_TQ_ENB;
- }
- }
- ccb->ccb_h.status = CAM_REQ_CMP;
- xpt_done(ccb);
- return;</programlisting>
-
- <para>Then when the next I/O request will be processed it will
- check if it has to re-negotiate, for example by calling the
- function target_negotiated(hcb). It can be implemented like
- this:</para>
-
-<programlisting> int
- target_negotiated(struct xxx_hcb *hcb)
- {
- struct softc *softc = hcb->softc;
- int targ = hcb->targ;
-
- if( softc->current_sync_period[targ] != softc->goal_sync_period[targ]
- || softc->current_sync_offset[targ] != softc->goal_sync_offset[targ]
- || softc->current_bus_width[targ] != softc->goal_bus_width[targ] )
- return 0; /* FALSE */
- else
- return 1; /* TRUE */
- }</programlisting>
-
- <para>After the values are re-negotiated the resulting values must
- be assigned to both current and goal parameters, so for future
- I/O transactions the current and goal parameters would be the
- same and <function>target_negotiated()</function> would return
- TRUE. When the card is initialized (in
- <function>xxx_attach()</function>) the current negotiation
- values must be initialized to narrow asynchronous mode, the goal
- and current values must be initialized to the maximal values
- supported by controller.</para></listitem>
-
- <listitem><para><emphasis>XPT_GET_TRAN_SETTINGS</emphasis> - get values of
- SCSI transfer settings</para>
-
- <para>This operations is the reverse of
- XPT_SET_TRAN_SETTINGS. Fill up the CCB instance "struct
- ccb_trans_setting cts" with data as requested by the flags
- CCB_TRANS_CURRENT_SETTINGS or CCB_TRANS_USER_SETTINGS (if both
- are set then the existing drivers return the current
- settings). Set all the bits in the valid field.</para></listitem>
-
- <listitem><para><emphasis>XPT_CALC_GEOMETRY</emphasis> - calculate logical
- (BIOS) geometry of the disk</para>
-
- <para>The arguments are transferred in the instance "struct
- ccb_calc_geometry ccg" of the union ccb:</para>
-
- <itemizedlist>
-
- <listitem><para><emphasis>block_size</emphasis> - input, block
- (A.K.A sector) size in bytes</para></listitem>
-
- <listitem><para><emphasis>volume_size</emphasis> - input,
- volume size in bytes</para></listitem>
-
- <listitem><para><emphasis>cylinders</emphasis> - output,
- logical cylinders</para></listitem>
-
- <listitem><para><emphasis>heads</emphasis> - output, logical
- heads</para></listitem>
-
- <listitem><para><emphasis>secs_per_track</emphasis> - output,
- logical sectors per track</para></listitem>
-
- </itemizedlist>
-
- <para>If the returned geometry differs much enough from what the
- SCSI controller BIOS thinks and a disk on this SCSI controller
- is used as bootable the system may not be able to boot. The
- typical calculation example taken from the aic7xxx driver
- is:</para>
-
-<programlisting> struct ccb_calc_geometry *ccg;
- u_int32_t size_mb;
- u_int32_t secs_per_cylinder;
- int extended;
-
- ccg = &amp;ccb->ccg;
- size_mb = ccg->volume_size
- / ((1024L * 1024L) / ccg->block_size);
- extended = check_cards_EEPROM_for_extended_geometry(softc);
-
- if (size_mb > 1024 &amp;&amp; extended) {
- ccg->heads = 255;
- ccg->secs_per_track = 63;
- } else {
- ccg->heads = 64;
- ccg->secs_per_track = 32;
- }
- secs_per_cylinder = ccg->heads * ccg->secs_per_track;
- ccg->cylinders = ccg->volume_size / secs_per_cylinder;
- ccb->ccb_h.status = CAM_REQ_CMP;
- xpt_done(ccb);
- return;</programlisting>
-
- <para>This gives the general idea, the exact calculation depends
- on the quirks of the particular BIOS. If BIOS provides no way
- set the "extended translation" flag in EEPROM this flag should
- normally be assumed equal to 1. Other popular geometries
- are:</para>
-
-<programlisting> 128 heads, 63 sectors - Symbios controllers
- 16 heads, 63 sectors - old controllers</programlisting>
-
- <para>Some system BIOSes and SCSI BIOSes fight with each other
- with variable success, for example a combination of Symbios
- 875/895 SCSI and Phoenix BIOS can give geometry 128/63 after
- power up and 255/63 after a hard reset or soft reboot.</para>
- </listitem>
-
- <listitem><para><emphasis>XPT_PATH_INQ</emphasis> - path inquiry, in other
- words get the SIM driver and SCSI controller (also known as HBA
- - Host Bus Adapter) properties</para>
-
- <para>The properties are returned in the instance "struct
-ccb_pathinq cpi" of the union ccb:</para>
-
- <itemizedlist>
-
- <listitem><para>version_num - the SIM driver version number, now
- all drivers use 1</para></listitem>
-
- <listitem><para>hba_inquiry - bitmask of features supported by
- the controller:</para></listitem>
-
- <listitem><para>PI_MDP_ABLE - supports MDP message (something
- from SCSI3?)</para></listitem>
-
- <listitem><para>PI_WIDE_32 - supports 32 bit wide
- SCSI</para></listitem>
-
- <listitem><para>PI_WIDE_16 - supports 16 bit wide
- SCSI</para></listitem>
-
- <listitem><para>PI_SDTR_ABLE - can negotiate synchronous
- transfer rate</para></listitem>
-
- <listitem><para>PI_LINKED_CDB - supports linked
- commands</para></listitem>
-
- <listitem><para>PI_TAG_ABLE - supports tagged
- commands</para></listitem>
-
- <listitem><para>PI_SOFT_RST - supports soft reset alternative
- (hard reset and soft reset are mutually exclusive within a
- SCSI bus)</para></listitem>
-
- <listitem><para>target_sprt - flags for target mode support, 0
- if unsupported</para></listitem>
-
- <listitem><para>hba_misc - miscellaneous controller
- features:</para></listitem>
-
- <listitem><para>PIM_SCANHILO - bus scans from high ID to low
- ID</para></listitem>
-
- <listitem><para>PIM_NOREMOVE - removable devices not included in
- scan</para></listitem>
-
- <listitem><para>PIM_NOINITIATOR - initiator role not
- supported</para></listitem>
-
- <listitem><para>PIM_NOBUSRESET - user has disabled initial BUS
- RESET</para></listitem>
-
- <listitem><para>hba_eng_cnt - mysterious HBA engine count,
- something related to compression, now is always set to
- 0</para></listitem>
-
- <listitem><para>vuhba_flags - vendor-unique flags, unused
- now</para></listitem>
-
- <listitem><para>max_target - maximal supported target ID (7 for
- 8-bit bus, 15 for 16-bit bus, 127 for Fibre
- Channel)</para></listitem>
-
- <listitem><para>max_lun - maximal supported LUN ID (7 for older
- SCSI controllers, 63 for newer ones)</para></listitem>
-
- <listitem><para>async_flags - bitmask of installed Async
- handler, unused now</para></listitem>
-
- <listitem><para>hpath_id - highest Path ID in the subsystem,
- unused now</para></listitem>
-
- <listitem><para>unit_number - the controller unit number,
- cam_sim_unit(sim)</para></listitem>
-
- <listitem><para>bus_id - the bus number,
- cam_sim_bus(sim)</para></listitem>
-
- <listitem><para>initiator_id - the SCSI ID of the controller
- itself</para></listitem>
-
- <listitem><para>base_transfer_speed - nominal transfer speed in
- KB/s for asynchronous narrow transfers, equals to 3300 for
- SCSI</para></listitem>
-
- <listitem><para>sim_vid - SIM driver's vendor id, a
- zero-terminated string of maximal length SIM_IDLEN including
- the terminating zero</para></listitem>
-
- <listitem><para>hba_vid - SCSI controller's vendor id, a
- zero-terminated string of maximal length HBA_IDLEN including
- the terminating zero</para></listitem>
-
- <listitem><para>dev_name - device driver name, a zero-terminated
- string of maximal length DEV_IDLEN including the terminating
- zero, equal to cam_sim_name(sim)</para></listitem>
-
- </itemizedlist>
-
- <para>The recommended way of setting the string fields is using
- strncpy, like:</para>
-
-<programlisting> strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN);</programlisting>
-
- <para>After setting the values set the status to CAM_REQ_CMP and mark the
-CCB as done.</para>
- </listitem>
- </itemizedlist>
-
- </sect1>
-
- <sect1>
- <title>Polling</title>
-
- <funcSynopsis><funcPrototype>
- <funcDef>static void
- <function>xxx_poll</function>
- </funcDef>
- <paramdef>
- <parameter>struct cam_sim *sim</parameter>
- </paramdef>
- </funcPrototype></funcSynopsis>
-
- <para>The poll function is used to simulate the interrupts when
- the interrupt subsystem is not functioning (for example, when
- the system has crashed and is creating the system dump). The CAM
- subsystem sets the proper interrupt level before calling the
- poll routine. So all it needs to do is to call the interrupt
- routine (or the other way around, the poll routine may be doing
- the real action and the interrupt routine would just call the
- poll routine). Why bother about a separate function then ?
- Because of different calling conventions. The
- <function>xxx_poll</function> routine gets the struct cam_sim
- pointer as its argument when the PCI interrupt routine by common
- convention gets pointer to the struct
- <structName>xxx_softc</structName> and the ISA interrupt routine
- gets just the device unit number. So the poll routine would
- normally look as:</para>
-
-<programlisting>static void
-xxx_poll(struct cam_sim *sim)
-{
- xxx_intr((struct xxx_softc *)cam_sim_softc(sim)); /* for PCI device */
-}</programlisting>
-
- <para>or</para>
-
-<programlisting>static void
-xxx_poll(struct cam_sim *sim)
-{
- xxx_intr(cam_sim_unit(sim)); /* for ISA device */
-}</programlisting>
-
- </sect1>
-
- <sect1>
- <title>Asynchronous Events</title>
-
- <para>If an asynchronous event callback has been set up then the
- callback function should be defined.</para>
-
-<programlisting>static void
-ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)</programlisting>
-
- <itemizedlist>
- <listitem><para>callback_arg - the value supplied when registering the
- callback</para></listitem>
-
- <listitem><para>code - identifies the type of event</para></listitem>
-
- <listitem><para>path - identifies the devices to which the event
- applies</para></listitem>
-
- <listitem><para>arg - event-specific argument</para></listitem>
- </itemizedlist>
-
- <para>Implementation for a single type of event, AC_LOST_DEVICE,
- looks like:</para>
-
-<programlisting> struct xxx_softc *softc;
- struct cam_sim *sim;
- int targ;
- struct ccb_trans_settings neg;
-
- sim = (struct cam_sim *)callback_arg;
- softc = (struct xxx_softc *)cam_sim_softc(sim);
- switch (code) {
- case AC_LOST_DEVICE:
- targ = xpt_path_target_id(path);
- if(targ <= OUR_MAX_SUPPORTED_TARGET) {
- clean_negotiations(softc, targ);
- /* send indication to CAM */
- neg.bus_width = 8;
- neg.sync_period = neg.sync_offset = 0;
- neg.valid = (CCB_TRANS_BUS_WIDTH_VALID
- | CCB_TRANS_SYNC_RATE_VALID | CCB_TRANS_SYNC_OFFSET_VALID);
- xpt_async(AC_TRANSFER_NEG, path, &amp;neg);
- }
- break;
- default:
- break;
- }</programlisting>
-
- </sect1>
-
- <sect1>
- <title>Interrupts</title>
-
- <para>The exact type of the interrupt routine depends on the type
- of the peripheral bus (PCI, ISA and so on) to which the SCSI
- controller is connected.</para>
-
- <para>The interrupt routines of the SIM drivers run at the
- interrupt level splcam. So <function>splcam()</function> should
- be used in the driver to synchronize activity between the
- interrupt routine and the rest of the driver (for a
- multiprocessor-aware driver things get yet more interesting but
- we ignore this case here). The pseudo-code in this document
- happily ignores the problems of synchronization. The real code
- must not ignore them. A simple-minded approach is to set
- <function>splcam()</function> on the entry to the other routines
- and reset it on return thus protecting them by one big critical
- section. To make sure that the interrupt level will be always
- restored a wrapper function can be defined, like:</para>
-
-<programlisting> static void
- xxx_action(struct cam_sim *sim, union ccb *ccb)
- {
- int s;
- s = splcam();
- xxx_action1(sim, ccb);
- splx(s);
- }
-
- static void
- xxx_action1(struct cam_sim *sim, union ccb *ccb)
- {
- ... process the request ...
- }</programlisting>
-
- <para>This approach is simple and robust but the problem with it
- is that interrupts may get blocked for a relatively long time
- and this would negatively affect the system's performance. On
- the other hand the functions of the <function>spl()</function>
- family have rather high overhead, so vast amount of tiny
- critical sections may not be good either.</para>
-
- <para>The conditions handled by the interrupt routine and the
- details depend very much on the hardware. We consider the set of
- "typical" conditions.</para>
-
- <para>First, we check if a SCSI reset was encountered on the bus
- (probably caused by another SCSI controller on the same SCSI
- bus). If so we drop all the enqueued and disconnected requests,
- report the events and re-initialize our SCSI controller. It is
- important that during this initialization the controller won't
- issue another reset or else two controllers on the same SCSI bus
- could ping-pong resets forever. The case of fatal controller
- error/hang could be handled in the same place, but it will
- probably need also sending RESET signal to the SCSI bus to reset
- the status of the connections with the SCSI devices.</para>
-
-<programlisting> int fatal=0;
- struct ccb_trans_settings neg;
- struct cam_path *path;
-
- if( detected_scsi_reset(softc)
- || (fatal = detected_fatal_controller_error(softc)) ) {
- int targ, lun;
- struct xxx_hcb *h, *hh;
-
- /* drop all enqueued CCBs */
- for(h = softc->first_queued_hcb; h != NULL; h = hh) {
- hh = h->next;
- free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);
- }
-
- /* the clean values of negotiations to report */
- neg.bus_width = 8;
- neg.sync_period = neg.sync_offset = 0;
- neg.valid = (CCB_TRANS_BUS_WIDTH_VALID
- | CCB_TRANS_SYNC_RATE_VALID | CCB_TRANS_SYNC_OFFSET_VALID);
-
- /* drop all disconnected CCBs and clean negotiations */
- for(targ=0; targ <= OUR_MAX_SUPPORTED_TARGET; targ++) {
- clean_negotiations(softc, targ);
-
- /* report the event if possible */
- if(xpt_create_path(&amp;path, /*periph*/NULL,
- cam_sim_path(sim), targ,
- CAM_LUN_WILDCARD) == CAM_REQ_CMP) {
- xpt_async(AC_TRANSFER_NEG, path, &amp;neg);
- xpt_free_path(path);
- }
-
- for(lun=0; lun <= OUR_MAX_SUPPORTED_LUN; lun++)
- for(h = softc->first_discon_hcb[targ][lun]; h != NULL; h = hh) {
- hh=h->next;
- if(fatal)
- free_hcb_and_ccb_done(h, h->ccb, CAM_UNREC_HBA_ERROR);
- else
- free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);
- }
- }
-
- /* report the event */
- xpt_async(AC_BUS_RESET, softc->wpath, NULL);
-
- /* re-initialization may take a lot of time, in such case
- * its completion should be signaled by another interrupt or
- * checked on timeout - but for simplicity we assume here that
- * it's really fast
- */
- if(!fatal) {
- reinitialize_controller_without_scsi_reset(softc);
- } else {
- reinitialize_controller_with_scsi_reset(softc);
- }
- schedule_next_hcb(softc);
- return;
- }</programlisting>
-
- <para>If interrupt is not caused by a controller-wide condition
- then probably something has happened to the current hardware
- control block. Depending on the hardware there may be other
- non-HCB-related events, we just do not consider them here. Then
- we analyze what happened to this HCB:</para>
-
-<programlisting> struct xxx_hcb *hcb, *h, *hh;
- int hcb_status, scsi_status;
- int ccb_status;
- int targ;
- int lun_to_freeze;
-
- hcb = get_current_hcb(softc);
- if(hcb == NULL) {
- /* either stray interrupt or something went very wrong
- * or this is something hardware-dependent
- */
- handle as necessary;
- return;
- }
-
- targ = hcb->target;
- hcb_status = get_status_of_current_hcb(softc);</programlisting>
-
- <para>First we check if the HCB has completed and if so we check
- the returned SCSI status.</para>
-
-<programlisting> if(hcb_status == COMPLETED) {
- scsi_status = get_completion_status(hcb);</programlisting>
-
- <para>Then look if this status is related to the REQUEST SENSE
- command and if so handle it in a simple way.</para>
-
-<programlisting> if(hcb->flags &amp; DOING_AUTOSENSE) {
- if(scsi_status == GOOD) { /* autosense was successful */
- hcb->ccb->ccb_h.status |= CAM_AUTOSNS_VALID;
- free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_SCSI_STATUS_ERROR);
- } else {
- autosense_failed:
- free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_AUTOSENSE_FAIL);
- }
- schedule_next_hcb(softc);
- return;
- }</programlisting>
-
- <para>Else the command itself has completed, pay more attention to
- details. If auto-sense is not disabled for this CCB and the
- command has failed with sense data then run REQUEST SENSE
- command to receive that data.</para>
-
-<programlisting> hcb->ccb->csio.scsi_status = scsi_status;
- calculate_residue(hcb);
-
- if( (hcb->ccb->ccb_h.flags &amp; CAM_DIS_AUTOSENSE)==0
- &amp;&amp; ( scsi_status == CHECK_CONDITION
- || scsi_status == COMMAND_TERMINATED) ) {
- /* start auto-SENSE */
- hcb->flags |= DOING_AUTOSENSE;
- setup_autosense_command_in_hcb(hcb);
- restart_current_hcb(softc);
- return;
- }
- if(scsi_status == GOOD)
- free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_REQ_CMP);
- else
- free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_SCSI_STATUS_ERROR);
- schedule_next_hcb(softc);
- return;
- }</programlisting>
-
- <para>One typical thing would be negotiation events: negotiation
- messages received from a SCSI target (in answer to our
- negotiation attempt or by target's initiative) or the target is
- unable to negotiate (rejects our negotiation messages or does
- not answer them).</para>
-
-<programlisting> switch(hcb_status) {
- case TARGET_REJECTED_WIDE_NEG:
- /* revert to 8-bit bus */
- softc->current_bus_width[targ] = softc->goal_bus_width[targ] = 8;
- /* report the event */
- neg.bus_width = 8;
- neg.valid = CCB_TRANS_BUS_WIDTH_VALID;
- xpt_async(AC_TRANSFER_NEG, hcb->ccb.ccb_h.path_id, &amp;neg);
- continue_current_hcb(softc);
- return;
- case TARGET_ANSWERED_WIDE_NEG:
- {
- int wd;
-
- wd = get_target_bus_width_request(softc);
- if(wd <= softc->goal_bus_width[targ]) {
- /* answer is acceptable */
- softc->current_bus_width[targ] =
- softc->goal_bus_width[targ] = neg.bus_width = wd;
-
- /* report the event */
- neg.valid = CCB_TRANS_BUS_WIDTH_VALID;
- xpt_async(AC_TRANSFER_NEG, hcb->ccb.ccb_h.path_id, &amp;neg);
- } else {
- prepare_reject_message(hcb);
- }
- }
- continue_current_hcb(softc);
- return;
- case TARGET_REQUESTED_WIDE_NEG:
- {
- int wd;
-
- wd = get_target_bus_width_request(softc);
- wd = min (wd, OUR_BUS_WIDTH);
- wd = min (wd, softc->user_bus_width[targ]);
-
- if(wd != softc->current_bus_width[targ]) {
- /* the bus width has changed */
- softc->current_bus_width[targ] =
- softc->goal_bus_width[targ] = neg.bus_width = wd;
-
- /* report the event */
- neg.valid = CCB_TRANS_BUS_WIDTH_VALID;
- xpt_async(AC_TRANSFER_NEG, hcb->ccb.ccb_h.path_id, &amp;neg);
- }
- prepare_width_nego_rsponse(hcb, wd);
- }
- continue_current_hcb(softc);
- return;
- }</programlisting>
-
- <para>Then we handle any errors that could have happened during
- auto-sense in the same simple-minded way as before. Otherwise we
- look closer at the details again.</para>
-
-<programlisting> if(hcb->flags &amp; DOING_AUTOSENSE)
- goto autosense_failed;
-
- switch(hcb_status) {</programlisting>
-
- <para>The next event we consider is unexpected disconnect. Which
- is considered normal after an ABORT or BUS DEVICE RESET message
- and abnormal in other cases.</para>
-
-<programlisting> case UNEXPECTED_DISCONNECT:
- if(requested_abort(hcb)) {
- /* abort affects all commands on that target+LUN, so
- * mark all disconnected HCBs on that target+LUN as aborted too
- */
- for(h = softc->first_discon_hcb[hcb->target][hcb->lun];
- h != NULL; h = hh) {
- hh=h->next;
- free_hcb_and_ccb_done(h, h->ccb, CAM_REQ_ABORTED);
- }
- ccb_status = CAM_REQ_ABORTED;
- } else if(requested_bus_device_reset(hcb)) {
- int lun;
-
- /* reset affects all commands on that target, so
- * mark all disconnected HCBs on that target+LUN as reset
- */
-
- for(lun=0; lun <= OUR_MAX_SUPPORTED_LUN; lun++)
- for(h = softc->first_discon_hcb[hcb->target][lun];
- h != NULL; h = hh) {
- hh=h->next;
- free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);
- }
-
- /* send event */
- xpt_async(AC_SENT_BDR, hcb->ccb->ccb_h.path_id, NULL);
-
- /* this was the CAM_RESET_DEV request itself, it's completed */
- ccb_status = CAM_REQ_CMP;
- } else {
- calculate_residue(hcb);
- ccb_status = CAM_UNEXP_BUSFREE;
- /* request the further code to freeze the queue */
- hcb->ccb->ccb_h.status |= CAM_DEV_QFRZN;
- lun_to_freeze = hcb->lun;
- }
- break;</programlisting>
-
- <para>If the target refuses to accept tags we notify CAM about
- that and return back all commands for this LUN:</para>
-
-<programlisting> case TAGS_REJECTED:
- /* report the event */
- neg.flags = 0 &amp; ~CCB_TRANS_TAG_ENB;
- neg.valid = CCB_TRANS_TQ_VALID;
- xpt_async(AC_TRANSFER_NEG, hcb->ccb.ccb_h.path_id, &amp;neg);
-
- ccb_status = CAM_MSG_REJECT_REC;
- /* request the further code to freeze the queue */
- hcb->ccb->ccb_h.status |= CAM_DEV_QFRZN;
- lun_to_freeze = hcb->lun;
- break;</programlisting>
-
- <para>Then we check a number of other conditions, with processing
- basically limited to setting the CCB status:</para>
-
-<programlisting> case SELECTION_TIMEOUT:
- ccb_status = CAM_SEL_TIMEOUT;
- /* request the further code to freeze the queue */
- hcb->ccb->ccb_h.status |= CAM_DEV_QFRZN;
- lun_to_freeze = CAM_LUN_WILDCARD;
- break;
- case PARITY_ERROR:
- ccb_status = CAM_UNCOR_PARITY;
- break;
- case DATA_OVERRUN:
- case ODD_WIDE_TRANSFER:
- ccb_status = CAM_DATA_RUN_ERR;
- break;
- default:
- /* all other errors are handled in a generic way */
- ccb_status = CAM_REQ_CMP_ERR;
- /* request the further code to freeze the queue */
- hcb->ccb->ccb_h.status |= CAM_DEV_QFRZN;
- lun_to_freeze = CAM_LUN_WILDCARD;
- break;
- }</programlisting>
-
- <para>Then we check if the error was serious enough to freeze the
- input queue until it gets proceeded and do so if it is:</para>
-
-<programlisting> if(hcb->ccb->ccb_h.status &amp; CAM_DEV_QFRZN) {
- /* freeze the queue */
- xpt_freeze_devq(ccb->ccb_h.path, /*count*/1);
-
- /* re-queue all commands for this target/LUN back to CAM */
-
- for(h = softc->first_queued_hcb; h != NULL; h = hh) {
- hh = h->next;
-
- if(targ == h->targ
- &amp;&amp; (lun_to_freeze == CAM_LUN_WILDCARD || lun_to_freeze == h->lun) )
- free_hcb_and_ccb_done(h, h->ccb, CAM_REQUEUE_REQ);
- }
- }
- free_hcb_and_ccb_done(hcb, hcb->ccb, ccb_status);
- schedule_next_hcb(softc);
- return;</programlisting>
-
- <para>This concludes the generic interrupt handling although
- specific controllers may require some additions.</para>
-
- </sect1>
-
- <sect1>
- <title>Errors Summary</title>
-
- <para>When executing an I/O request many things may go wrong. The
- reason of error can be reported in the CCB status with great
- detail. Examples of use are spread throughout this document. For
- completeness here is the summary of recommended responses for
- the typical error conditions:</para>
-
- <itemizedlist>
-
- <listitem><para><emphasis>CAM_RESRC_UNAVAIL</emphasis> - some
- resource is temporarily unavailable and the SIM driver cannot
- generate an event when it will become available. An example of
- this resource would be some intra-controller hardware resource
- for which the controller does not generate an interrupt when
- it becomes available.</para></listitem>
-
- <listitem><para><emphasis>CAM_UNCOR_PARITY</emphasis> -
- unrecovered parity error occurred</para></listitem>
-
- <listitem><para><emphasis>CAM_DATA_RUN_ERR</emphasis> - data
- overrun or unexpected data phase (going in other direction
- than specified in CAM_DIR_MASK) or odd transfer length for
- wide transfer</para></listitem>
-
- <listitem><para><emphasis>CAM_SEL_TIMEOUT</emphasis> - selection
- timeout occurred (target does not respond)</para></listitem>
-
- <listitem><para><emphasis>CAM_CMD_TIMEOUT</emphasis> - command
- timeout occurred (the timeout function ran)</para></listitem>
-
- <listitem><para><emphasis>CAM_SCSI_STATUS_ERROR</emphasis> - the
- device returned error</para></listitem>
-
- <listitem><para><emphasis>CAM_AUTOSENSE_FAIL</emphasis> - the
- device returned error and the REQUEST SENSE COMMAND
- failed</para></listitem>
-
- <listitem><para><emphasis>CAM_MSG_REJECT_REC</emphasis> - MESSAGE
- REJECT message was received</para></listitem>
-
- <listitem><para><emphasis>CAM_SCSI_BUS_RESET</emphasis> - received
- SCSI bus reset</para></listitem>
-
- <listitem><para><emphasis>CAM_REQ_CMP_ERR</emphasis> -
- "impossible" SCSI phase occurred or something else as weird or
- just a generic error if further detail is not
- available</para></listitem>
-
- <listitem><para><emphasis>CAM_UNEXP_BUSFREE</emphasis> -
- unexpected disconnect occurred</para></listitem>
-
- <listitem><para><emphasis>CAM_BDR_SENT</emphasis> - BUS DEVICE
- RESET message was sent to the target</para></listitem>
-
- <listitem><para><emphasis>CAM_UNREC_HBA_ERROR</emphasis> -
- unrecoverable Host Bus Adapter Error</para></listitem>
-
- <listitem><para><emphasis>CAM_REQ_TOO_BIG</emphasis> - the request
- was too large for this controller</para></listitem>
-
- <listitem><para><emphasis>CAM_REQUEUE_REQ</emphasis> - this
- request should be re-queued to preserve transaction ordering.
- This typically occurs when the SIM recognizes an error that
- should freeze the queue and must place other queued requests
- for the target at the sim level back into the XPT
- queue. Typical cases of such errors are selection timeouts,
- command timeouts and other like conditions. In such cases the
- troublesome command returns the status indicating the error,
- the and the other commands which have not be sent to the bus
- yet get re-queued.</para></listitem>
-
- <listitem><para><emphasis>CAM_LUN_INVALID</emphasis> - the LUN
- ID in the request is not supported by the SCSI
- controller</para></listitem>
-
- <listitem><para><emphasis>CAM_TID_INVALID</emphasis> - the
- target ID in the request is not supported by the SCSI
- controller</para></listitem>
- </itemizedlist>
- </sect1>
-
- <sect1>
- <title>Timeout Handling</title>
-
- <para>When the timeout for an HCB expires that request should be
- aborted, just like with an XPT_ABORT request. The only
- difference is that the returned status of aborted request should
- be CAM_CMD_TIMEOUT instead of CAM_REQ_ABORTED (that's why
- implementation of the abort better be done as a function). But
- there is one more possible problem: what if the abort request
- itself will get stuck? In this case the SCSI bus should be
- reset, just like with an XPT_RESET_BUS request (and the idea
- about implementing it as a function called from both places
- applies here too). Also we should reset the whole SCSI bus if a
- device reset request got stuck. So after all the timeout
- function would look like:</para>
-
-<programlisting>static void
-xxx_timeout(void *arg)
-{
- struct xxx_hcb *hcb = (struct xxx_hcb *)arg;
- struct xxx_softc *softc;
- struct ccb_hdr *ccb_h;
-
- softc = hcb->softc;
- ccb_h = &amp;hcb->ccb->ccb_h;
-
- if(hcb->flags &amp; HCB_BEING_ABORTED
- || ccb_h->func_code == XPT_RESET_DEV) {
- xxx_reset_bus(softc);
- } else {
- xxx_abort_ccb(hcb->ccb, CAM_CMD_TIMEOUT);
- }
-}</programlisting>
-
- <para>When we abort a request all the other disconnected requests
- to the same target/LUN get aborted too. So there appears a
- question, should we return them with status CAM_REQ_ABORTED or
- CAM_CMD_TIMEOUT ? The current drivers use CAM_CMD_TIMEOUT. This
- seems logical because if one request got timed out then probably
- something really bad is happening to the device, so if they
- would not be disturbed they would time out by themselves.</para>
-
- </sect1>
-
-</chapter>
diff --git a/en_US.ISO8859-1/books/developers-handbook/secure/chapter.sgml b/en_US.ISO8859-1/books/developers-handbook/secure/chapter.sgml
deleted file mode 100644
index d9ff3c872a..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/secure/chapter.sgml
+++ /dev/null
@@ -1,514 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD: doc/en_US.ISO8859-1/books/developers-handbook/secure/chapter.sgml,v 1.10 2001/07/17 20:51:50 chern Exp $
--->
-
- <chapter id="secure">
- <title>Secure Programming</title>
-
- <para>This chapter was written by &a.murray;.</para>
-
- <sect1><title>Synopsis</title>
-
- <para>This chapter describes some of the security issues that
- have plagued Unix programmers for decades and some of the new
- tools available to help programmers avoid writing exploitable
- code.</para>
- </sect1>
-
- <sect1 id="secure-philosophy"><title>Secure Design
- Methodology</title>
-
- <para>Writing secure applications takes a very scrutinous and
- pessimistic outlook on life. Applications should be run with
- the principle of <quote>least privilege</quote> so that no
- process is ever running with more than the bare minimum access
- that it needs to accomplish its function. Previously tested
- code should be reused whenever possible to avoid common
- mistakes that others may have already fixed.</para>
-
- <para>One of the pitfalls of the Unix environment is how easy it
- is to make assumptions about the sanity of the environment.
- Applications should never trust user input (in all its forms),
- system resources, inter-process communication, or the timing of
- events. Unix processes do not execute synchronously so logical
- operations are rarely atomic.</para>
- </sect1>
-
- <sect1><title>Buffer Overflows</title>
-
- <para>Buffer Overflows have been around since the very
- beginnings of the Von-Neuman <xref linkend="COD"> architecture.
-
- <indexterm><primary>buffer overflow</primary></indexterm>
- <indexterm><primary>Von-Neuman</primary></indexterm>
-
- They first gained widespread notoriety in 1988 with the Morris
- Internet worm. Unfortunately, the same basic attack remains
-
- <indexterm><primary>Morris Internet worm</primary></indexterm>
-
- effective today. Of the 17 CERT security advisories of 1999, 10
-
- <indexterm>
- <primary>CERT</primary><secondary>security advisories</secondary>
- </indexterm>
-
- of them were directly caused by buffer-overflow software bugs.
- By far the most common type of buffer overflow attack is based
- on corrupting the stack.</para>
-
- <indexterm><primary>stack</primary></indexterm>
- <indexterm><primary>arguments</primary></indexterm>
-
- <para>Most modern computer systems use a stack to pass arguments
- to procedures and to store local variables. A stack is a last
- in first out (LIFO) buffer in the high memory area of a process
- image. When a program invokes a function a new "stack frame" is
-
- <indexterm><primary>LIFO</primary></indexterm>
- <indexterm>
- <primary>process image</primary>
- <secondary>stack pointer</secondary>
- </indexterm>
-
- created. This stack frame consists of the arguments passed to
- the function as well as a dynamic amount of local variable
- space. The "stack pointer" is a register that holds the current
-
- <indexterm><primary>stack frame</primary></indexterm>
- <indexterm><primary>stack pointer</primary></indexterm>
-
- location of the top of the stack. Since this value is
- constantly changing as new values are pushed onto the top of the
- stack, many implementations also provide a "frame pointer" that
- is located near the beginning of a stack frame so that local
- variables can more easily be addressed relative to this
- value. <xref linkend="COD"> The return address for function
-
- <indexterm><primary>frame pointer</primary></indexterm>
- <indexterm>
- <primary>process image</primary>
- <secondary>frame pointer</secondary>
- </indexterm>
- <indexterm><primary>return address</primary></indexterm>
- <indexterm><primary>stack-overflow</primary></indexterm>
-
- calls is also stored on the stack, and this is the cause of
- stack-overflow exploits since overflowing a local variable in a
- function can overwrite the return address of that function,
- potentially allowing a malicious user to execute any code he or
- she wants.</para>
-
- <para>Although stack-based attacks are by far the most common,
- it would also be possible to overrun the stack with a heap-based
- (malloc/free) attack.</para>
-
- <para>The C programming language does not perform automatic
- bounds checking on arrays or pointers as many other languages
- do. In addition, the standard C library is filled with a
- handful of very dangerous functions.</para>
-
- <informaltable>
- <tgroup cols=2>
- <tbody>
- <row><entry><function>strcpy</function>(char *dest, const char
- *src)</entry>
- <entry><simpara>May overflow the dest buffer</simpara></entry>
- </row>
-
- <row><entry><function>strcat</function>(char *dest, const char
- *src)</entry>
- <entry><simpara>May overflow the dest buffer</simpara></entry>
- </row>
-
- <row><entry><function>getwd</function>(char *buf)</entry>
- <entry><simpara>May overflow the buf buffer</simpara></entry>
- </row>
-
- <row><entry><function>gets</function>(char *s)</entry>
- <entry><simpara>May overflow the s buffer</simpara></entry>
- </row>
-
- <row><entry><function>[vf]scanf</function>(const char *format,
- ...)</entry>
- <entry><simpara>May overflow its arguments.</simpara></entry>
- </row>
-
- <row><entry><function>realpath</function>(char *path, char
- resolved_path[])</entry>
- <entry><simpara>May overflow the path buffer</simpara></entry>
- </row>
-
- <row><entry><function>[v]sprintf</function>(char *str, const char
- *format, ...)</entry>
- <entry><simpara>May overflow the str buffer.</simpara></entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <sect2><title>Example Buffer Overflow</title>
-
- <para>The following example code contains a buffer overflow
- designed to overwrite the return address and skip the
- instruction immediately following the function call. (Inspired
- by <xref linkend="Phrack">)</para>
-
-<programlisting>#include <sgmltag>stdio.h</sgmltag>
-
-void manipulate(char *buffer) {
- char newbuffer[80];
- strcpy(newbuffer,buffer);
-}
-
-int main() {
- char ch,buffer[4096];
- int i=0;
-
- while ((buffer[i++] = getchar()) != '\n') {};
-
- i=1;
- manipulate(buffer);
- i=2;
- printf("The value of i is : %d\n",i);
- return 0;
-}</programlisting>
-
- <para>Let us examine what the memory image of this process would
- look like if we were to input 160 spaces into our little program
- before hitting return.</para>
-
- <para>[XXX figure here!]</para>
-
- <para>Obviously more malicious input can be devised to execute
- actual compiled instructions (such as exec(/bin/sh)).</para>
- </sect2>
-
- <sect2><title>Avoiding Buffer Overflows</title>
-
- <para>The most straightforward solution to the problem of
- stack-overflows is to always use length restricted memory and
- string copy functions. <function>strncpy</function> and
- <function>strncat</function> are part of the standard C library.
-
- <indexterm>
- <primary>string copy functions</primary>
- <secondary>strncpy</secondary>
- </indexterm>
- <indexterm>
- <primary>string copy functions</primary>
- <secondary>strncat</secondary>
- </indexterm>
-
- These functions accept a length value as a parameter which
- should be no larger than the size of the destination buffer.
- These functions will then copy up to `length' bytes from the
- source to the destination. However there are a number of
- problems with these functions. Neither function guarantees NUL
- termination if the size of the input buffer is as large as the
-
- <indexterm><primary>NUL termination</primary></indexterm>
-
- destination. The length parameter is also used inconsistently
- between strncpy and strncat so it is easy for programmers to get
- confused as to their proper usage. There is also a significant
- performance loss compared to <function>strcpy</function> when
- copying a short string into a large buffer since
- <function>strncpy</function> NUL fills up the size
- specified.</para>
-
- <para>In OpenBSD, another memory copy implementation has been
-
- <indexterm><primary>OpenBSD</primary></indexterm>
-
- created to get around these problem. The
- <function>strlcpy</function> and <function>strlcat</function>
- functions guarantee that they will always null terminate the
- destination string when given a non-zero length argument. For
- more information about these functions see <xref
- linkend="OpenBSD">. The OpenBSD <function>strlcpy</function> and
- <function>strlcat</function> instructions have been in FreeBSD
- since 3.3.</para>
-
- <indexterm>
- <primary>string copy functions</primary>
- <secondary>strlcpy</secondary>
- </indexterm>
-
- <indexterm>
- <primary>string copy functions</primary>
- <secondary>strlcat</secondary>
- </indexterm>
-
- <sect3><title>Compiler based run-time bounds checking</title>
-
- <indexterm><primary>bounds checking</primary>
- <secondary>compiler-based</secondary></indexterm>
-
- <para>Unfortunately there is still a very large assortment of
- code in public use which blindly copies memory around without
- using any of the bounded copy routines we just discussed.
- Fortunately, there is another solution. Several compiler
- add-ons and libraries exist to do Run-time bounds checking in
- C/C++.</para>
-
- <indexterm><primary>StackGuard</primary></indexterm>
- <indexterm><primary>gcc</primary></indexterm>
-
- <para>StackGuard is one such add-on that is implemented as a
- small patch to the gcc code generator. From the StackGuard
- website, http://immunix.org/stackguard.html :
- <blockquote><para>"StackGuard detects and defeats stack
- smashing attacks by protecting the return address on the stack
- from being altered. StackGuard places a "canary" word next to
- the return address when a function is called. If the canary
- word has been altered when the function returns, then a stack
- smashing attack has been attempted, and the program responds
- by emitting an intruder alert into syslog, and then
- halts."</para></blockquote>
-
- <blockquote><para>"StackGuard is implemented as a small patch
- to the gcc code generator, specifically the function_prolog()
- and function_epilog() routines. function_prolog() has been
- enhanced to lay down canaries on the stack when functions
- start, and function_epilog() checks canary integrity when the
- function exits. Any attempt at corrupting the return address
- is thus detected before the function
- returns."</para></blockquote>
- </para>
-
- <indexterm><primary>buffer overflow</primary></indexterm>
-
- <para>Recompiling your application with StackGuard is an
- effective means of stopping most buffer-overflow attacks, but
- it can still be compromised.</para>
-
- </sect3>
-
- <sect3><title>Library based run-time bounds checking</title>
-
- <indexterm>
- <primary>bounds checking</primary>
- <secondary>library-based</secondary>
- </indexterm>
-
- <para>Compiler-based mechanisms are completely useless for
- binary-only software for which you cannot recompile. For
- these situations there are a number of libraries which
- re-implement the unsafe functions of the C-library
- (<function>strcpy</function>, <function>fscanf</function>,
- <function>getwd</function>, etc..) and ensure that these
- functions can never write past the stack pointer.</para>
-
- <itemizedlist>
- <listitem><simpara>libsafe</simpara></listitem>
- <listitem><simpara>libverify</simpara></listitem>
- <listitem><simpara>libparnoia</simpara></listitem>
- </itemizedlist>
-
- <para>Unfortunately these library-based defenses have a number
- of shortcomings. These libraries only protect against a very
- small set of security related issues and they neglect to fix
- the actual problem. These defenses may fail if the
- application was compiled with -fomit-frame-pointer. Also, the
- LD_PRELOAD and LD_LIBRARY_PATH environment variables can be
- overwritten/unset by the user.</para>
- </sect3>
-
- </sect2>
- </sect1>
-
- <sect1><title>SetUID issues</title>
-
- <indexterm><primary>seteuid</primary></indexterm>
-
- <para>There are at least 6 different IDs associated with any
- given process. Because of this you have to be very careful with
- the access that your process has at any given time. In
- particular, all seteuid applications should give up their
- privileges as soon as it is no longer required.</para>
-
- <indexterm>
- <primary>user IDs</primary>
- <secondary>real user ID</secondary>
- </indexterm>
- <indexterm>
- <primary>user IDs</primary>
- <secondary>effective user ID</secondary>
- </indexterm>
-
- <para>The real user ID can only be changed by a superuser
- process. The <application>login</application> program sets this
- when a user initially logs in and it is seldom changed.</para>
-
- <para>The effective user ID is set by the
- <function>exec()</function> functions if a program has its
- seteuid bit set. An application can call
- <function>seteuid()</function> at any time to set the effective
- user ID to either the real user ID or the saved set-user-ID.
- When the effective user ID is set by <function>exec()</function>
- functions, the previous value is saved in the saved set-user-ID.</para>
-
- </sect1>
-
- <sect1 id="secure-chroot"><title>Limiting your program's environment</title>
-
- <indexterm><primary>chroot()</primary></indexterm>
-
- <para>The traditional method of restricting a process
- is with the <function>chroot()</function> system call. This
- system call changes the root directory from which all other
- paths are referenced for a process and any child processes. For
- this call to succeed the process must have execute (search)
- permission on the directory being referenced. The new
- environment does not actually take effect until you
- <function>chdir()</function> into your new environment. It
- should also be noted that a process can easily break out of a
- chroot environment if it has root privilege. This could be
- accomplished by creating device nodes to read kernel memory,
- attaching a debugger to a process outside of the jail, or in
- many other creative ways.</para>
-
- <para>The behavior of the <function>chroot()</function> system
- call can be controlled somewhat with the
- kern.chroot_allow_open_directories <command>sysctl</command>
- variable. When this value is set to 0,
- <function>chroot()</function> will fail with EPERM if there are
- any directories open. If set to the default value of 1, then
- <function>chroot()</function> will fail with EPERM if there are
- any directories open and the process is already subject to a
- <function>chroot()</function> call. For any other value, the
- check for open directories will be bypassed completely.</para>
-
- <sect2><title>FreeBSD's jail functionality</title>
-
- <indexterm><primary>jail</primary></indexterm>
-
- <para>The concept of a Jail extends upon the
- <function>chroot()</function> by limiting the powers of the
- superuser to create a true `virtual server'. Once a prison is
- setup all network communication must take place through the
- specified IP address, and the power of "root privilege" in this
- jail is severely constrained.</para>
-
- <para>While in a prison, any tests of superuser power within the
- kernel using the <function>suser()</function> call will fail.
- However, some calls to <function>suser()</function> have been
- changed to a new interface <function>suser_xxx()</function>.
- This function is responsible for recognizing or denying access
- to superuser power for imprisoned processes.</para>
-
- <para>A superuser process within a jailed environment has the
- power to : </para>
- <itemizedlist>
- <listitem><simpara>Manipulate credential with
- <function>setuid</function>, <function>seteuid</function>,
- <function>setgid</function>, <function>setegid</function>,
- <function>setgroups</function>, <function>setreuid</function>,
- <function>setregid</function>, <function>setlogin</function></simpara></listitem>
- <listitem><simpara>Set resource limits with <function>setrlimit</function></simpara></listitem>
- <listitem><simpara>Modify some sysctl nodes
- (kern.hostname)</simpara></listitem>
- <listitem><simpara><function>chroot()</function></simpara></listitem>
- <listitem><simpara>Set flags on a vnode:
- <function>chflags</function>,
- <function>fchflags</function></simpara></listitem>
- <listitem><simpara>Set attributes of a vnode such as file
- permission, owner, group, size, access time, and modification
- time.</simpara></listitem>
- <listitem><simpara>Bind to privileged ports in the Internet
- domain (ports < 1024)</simpara></listitem>
- </itemizedlist>
-
- <para><function>Jail</function> is a very useful tool for
- running applications in a secure environment but it does have
- some shortcomings. Currently, the IPC mechanisms have not been
- converted to the <function>suser_xxx</function> so applications
- such as MySQL cannot be run within a jail. Superuser access
- may have a very limited meaning within a jail, but there is
- no way to specify exactly what "very limited" means.</para>
- </sect2>
-
- <sect2><title>POSIX.1e Process Capabilities</title>
-
- <indexterm><primary>POSIX.1e Process Capabilities</primary></indexterm>
- <indexterm><primary>TrustedBSD</primary></indexterm>
-
- <para>Posix has released a working draft that adds event
- auditing, access control lists, fine grained privileges,
- information labeling, and mandatory access control.</para>
- <para>This is a work in progress and is the focus of the <ulink
- url="http://www.trustedbsd.org">TrustedBSD</ulink> project. Some
- of the initial work has been committed to FreeBSD-current
- (cap_set_proc(3)).</para>
-
- </sect2>
-
- </sect1>
-
- <sect1><title>Trust</title>
-
- <para>An application should never assume that anything about the
- users environment is sane. This includes (but is certainly not
- limited to) : user input, signals, environment variables,
- resources, IPC, mmaps, the file system working directory, file
- descriptors, the # of open files, etc.</para>
-
- <indexterm><primary>positive filtering</primary></indexterm>
- <indexterm><primary>data validation</primary></indexterm>
-
- <para>You should never assume that you can catch all forms of
- invalid input that a user might supply. Instead, your
- application should use positive filtering to only allow a
- specific subset of inputs that you deem safe. Improper data
- validation has been the cause of many exploits, especially with
- CGI scripts on the world wide web. For filenames you need to be
- extra careful about paths ("../", "/"), symbolic links, and
- shell escape characters.</para>
-
- <indexterm><primary>Perl Taint mode</primary></indexterm>
-
- <para>Perl has a really cool feature called "Taint" mode which
- can be used to prevent scripts from using data derived outside
- the program in an unsafe way. This mode will check command line
- arguments, environment variables, locale information, the
- results of certain syscalls (<function>readdir()</function>,
- <function>readlink()</function>,
- <function>getpwxxx()</function>, and all file input.</para>
-
- </sect1>
-
- <sect1 id="secure-race-conditions">
- <title>Race Conditions</title>
-
- <para>A race condition is anomalous behavior caused by the
- unexpected dependence on the relative timing of events. In
- other words, a programmer incorrectly assumed that a particular
- event would always happen before another.</para>
-
- <indexterm><primary>race conditions</primary>
- <secondary>signals</secondary></indexterm>
-
- <indexterm><primary>race conditions</primary>
- <secondary>access checks</secondary></indexterm>
-
- <indexterm><primary>race conditions</primary>
- <secondary>file opens</secondary></indexterm>
-
- <para>Some of the common causes of race conditions are signals,
- access checks, and file opens. Signals are asynchronous events
- by nature so special care must be taken in dealing with them.
- Checking access with <function>access(2)</function> then
- <function>open(2)</function> is clearly non-atomic. Users can
- move files in between the two calls. Instead, privileged
- applications should <function>seteuid()</function> and then call
- <function>open()</function> directly. Along the same lines, an
- application should always set a proper umask before
- <function>open()</function> to obviate the need for spurious
- <function>chmod()</function> calls.</para>
-
- </sect1>
-
- </chapter>
diff --git a/en_US.ISO8859-1/books/developers-handbook/sockets/chapter.sgml b/en_US.ISO8859-1/books/developers-handbook/sockets/chapter.sgml
deleted file mode 100644
index acdd95e88e..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/sockets/chapter.sgml
+++ /dev/null
@@ -1,1773 +0,0 @@
-<chapter id="sockets">
- <title>Sockets</title>
-
- <para><emphasis>This chapter was written by
- &a.stanislav;</emphasis></para>
-
- <sect1 id="sockets-synopsis">
- <title>Synopsis</title>
-
- <para><acronym>BSD</acronym> sockets take interprocess
- communications to a new level. It is no longer necessary for the
- communicating processes to run on the same machine. They still
- <emphasis>can</emphasis>, but they do not have to.</para>
-
- <para>Not only do these processes not have to run on the same
- machine, they do not have to run under the same operating
- system. Thanks to <acronym>BSD</acronym> sockets, your FreeBSD
- software can smoothly cooperate with a program running on a
- Macintosh, another one running on a Sun workstation, yet another
- one running under Windows 2000, all connected with an
- Ethernet-based local area network.</para>
-
- <para>But your software can equally well cooperate with processes
- running in another building, or on another continent, inside a
- submarine, or a space shuttle.</para>
-
- <para>It can also cooperate with processes that are not part of a
- computer (at least not in the strict sense of the word), but of
- such devices as printers, digital cameras, medical equipment.
- Just about anything capable of digital communications.</para>
-
- </sect1>
-
- <sect1 id="sockets-diversity">
- <title>Networking and Diversity</title>
-
- <para>We have already hinted on the <emphasis>diversity</emphasis>
- of networking. Many different systems have to talk to each
- other. And they have to speak the same language. They also have
- to <emphasis>understand</emphasis> the same language the same
- way.</para>
-
- <para>People often think that <emphasis>body language</emphasis>
- is universal. But it is not. Back in my early teens, my father
- took me to Bulgaria. We were sitting at a table in a park in
- Sofia, when a vendor approached us trying to sell us some
- roasted almonds.</para>
-
- <para>I had not learned much Bulgarian by then, so, instead of
- saying no, I shook my head from side to side, the
- <quote>universal</quote> body language for
- <emphasis>no</emphasis>. The vendor quickly started serving us
- some almonds.</para>
-
- <para>I then remembered I had been told that in Bulgaria shaking
- your head sideways meant <emphasis>yes</emphasis>. Quickly, I
- started nodding my head up and down. The vendor noticed, took
- his almonds, and walked away. To an uninformed observer, I did
- not change the body language: I continued using the language of
- shaking and nodding my head. What changed was the
- <emphasis>meaning</emphasis> of the body language. At first, the
- vendor and I interpreted the same language as having completely
- different meaning. I had to adjust my own interpretation of that
- language so the vendor would understand.</para>
-
- <para>It is the same with computers: The same symbols may have
- different, even outright opposite meaning. Therefore, for
- two computers to understand each other, they must not only
- agree on the same <emphasis>language</emphasis>, but on the
- same <emphasis>interpretation</emphasis> of the language.
- </para>
- </sect1>
-
- <sect1 id="sockets-protocols">
- <title>Protocols</title>
-
- <para>While various programming languages tend to have complex
- syntax and use a number of multi-letter reserved words (which
- makes them easy for the human programmer to understand), the
- languages of data communications tend to be very terse. Instead
- of multi-byte words, they often use individual
- <emphasis>bits</emphasis>. There is a very convincing reason
- for it: While data travels <emphasis>inside</emphasis> your
- computer at speeds approaching the speed of light, it often
- travels considerably slower between two computers.</para>
-
- <para>Because the languages used in data communications are so
- terse, we usually refer to them as
- <emphasis>protocols</emphasis> rather than languages.</para>
-
- <para>As data travels from one computer to another, it always uses
- more than one protocol. These protocols are
- <emphasis>layered</emphasis>. The data can be compared to the
- inside of an onion: You have to peel off several layers of
- <quote>skin</quote> to get to the data. This is best
- illustrated with a picture:</para>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="sockets/layers">
- </imageobject>
-
- <textobject>
- <literallayout class="monospaced">+----------------+
-| Ethernet |
-|+--------------+|
-|| IP ||
-||+------------+||
-||| TCP |||
-|||+----------+|||
-|||| HTTP ||||
-||||+--------+||||
-||||| PNG |||||
-|||||+------+|||||
-|||||| Data ||||||
-|||||+------+|||||
-||||+--------+||||
-|||+----------+|||
-||+------------+||
-|+--------------+|
-+----------------+</literallayout>
- </textobject>
-
- <textobject>
- <phrase>Protocol Layers</phrase>
- </textobject>
- </mediaobject>
-
- <para>In this example, we are trying to get an image from a web
- page we are connected to via an Ethernet.</para>
-
- <para>The image consists of raw data, which is simply a sequence
- of <acronym>RGB</acronym> values that our software can process,
- i.e., convert into an image and display on our monitor.</para>
-
- <para>Alas, our software has no way of knowing how the raw data is
- organized: Is it a sequence of <acronym>RGB</acronym> values, or
- a sequence of grayscale intensities, or perhaps of
- <acronym>CMYK</acronym> encoded colors? Is the data represented
- by 8-bit quanta, or are they 16 bits in size, or perhaps 4 bits?
- How many rows and columns does the image consist of? Should
- certain pixels be transparent?</para>
-
- <para>I think you get the picture...</para>
-
- <para>To inform our software how to handle the raw data, it is
- encoded as a <acronym>PNG</acronym> file. It could be a
- <acronym>GIF</acronym>, or a <acronym>JPEG</acronym>, but it is
- a <acronym>PNG</acronym>.</para>
-
- <para>And <acronym>PNG</acronym> is a protocol.</para>
-
- <para>At this point, I can hear some of you yelling,
- <emphasis><quote>No, it is not! It is a file
- format!</quote></emphasis></para>
-
- <para>Well, of course it is a file format. But from the
- perspective of data communications, a file format is a protocol:
- The file structure is a <emphasis>language</emphasis>, a terse
- one at that, communicating to our <emphasis>process</emphasis>
- how the data is organized. Ergo, it is a
- <emphasis>protocol</emphasis>.</para>
-
- <para>Alas, if all we received was the <acronym>PNG</acronym>
- file, our software would be facing a serious problem: How is it
- supposed to know the data is representing an image, as opposed
- to some text, or perhaps a sound, or what not? Secondly, how is
- it supposed to know the image is in the <acronym>PNG</acronym>
- format as opposed to <acronym>GIF</acronym>, or
- <acronym>JPEG</acronym>, or some other image format?</para>
-
- <para>To obtain that information, we are using another protocol:
- <acronym>HTTP</acronym>. This protocol can tell us exactly that
- the data represents an image, and that it uses the
- <acronym>PNG</acronym> protocol. It can also tell us some other
- things, but let us stay focused on protocol layers here.
- </para>
-
- <para>So, now we have some data wrapped in the <acronym>PNG</acronym>
- protocol, wrapped in the <acronym>HTTP</acronym> protocol.
- How did we get it from the server?</para>
-
- <para>By using <acronym>TCP/IP</acronym> over Ethernet, that is
- how. Indeed, that is three more protocols. Instead of
- continuing inside out, I am now going to talk about Ethernet,
- simply because it is easier to explain the rest that way.</para>
-
- <para>Ethernet is an interesting system of connecting computers in
- a <emphasis>local area network</emphasis>
- (<acronym>LAN</acronym>). Each computer has a <emphasis>network
- interface card</emphasis> (<acronym>NIC</acronym>), which has a
- unique 48-bit <acronym>ID</acronym> called its
- <emphasis>address</emphasis>. No two Ethernet
- <acronym>NIC</acronym>s in the world have the same address.
- </para>
-
- <para>These <acronym>NIC</acronym>s are all connected with each
- other. Whenever one computer wants to communicate with another
- in the same Ethernet <acronym>LAN</acronym>, it sends a message
- over the network. Every <acronym>NIC</acronym> sees the
- message. But as part of the Ethernet
- <emphasis>protocol</emphasis>, the data contains the address of
- the destination <acronym>NIC</acronym> (among other things). So,
- only one of all the network interface cards will pay attention
- to it, the rest will ignore it.</para>
-
- <para>But not all computers are connected to the same
- network. Just because we have received the data over our
- Ethernet does not mean it originated in our own local area
- network. It could have come to us from some other network (which
- may not even be Ethernet based) connected with our own network
- via the Internet.</para>
-
- <para>All data is transfered over the Internet using
- <acronym>IP</acronym>, which stands for <emphasis>Internet
- Protocol</emphasis>. Its basic role is to let us know where in
- the world the data has arrived from, and where it is supposed to
- go to. It does not <emphasis>guarantee</emphasis> we will
- receive the data, only that we will know where it came from
- <emphasis>if</emphasis> we do receive it.</para>
-
- <para>Even if we do receive the data, <acronym>IP</acronym> does
- not guarantee we will receive various chunks of data in the same
- order the other computer has sent it to us. So, we can receive
- the center of our image before we receive the upper left corner
- and after the lower right, for example.</para>
-
- <para>It is <acronym>TCP</acronym> (<emphasis>Transmission Control
- Protocol</emphasis>) that asks the sender to resend any lost
- data and that places it all into the proper order.</para>
-
- <para>All in all, it took <emphasis>five</emphasis> different
- protocols for one computer to communicate to another what an
- image looks like. We received the data wrapped into the
- <acronym>PNG</acronym> protocol, which was wrapped into the
- <acronym>HTTP</acronym> protocol, which was wrapped into the
- <acronym>TCP</acronym> protocol, which was wrapped into the
- <acronym>IP</acronym> protocol, which was wrapped into the
- <acronym>Ethernet</acronym> protocol.</para>
-
- <para>Oh, and by the way, there probably were several other
- protocols involved somewhere on the way. For example, if our
- <acronym>LAN</acronym> was connected to the Internet through a
- dial-up call, it used the <acronym>PPP</acronym> protocol over
- the modem which used one (or several) of the various modem
- protocols, et cetera, et cetera, et cetera...</para>
-
- <para>As a developer you should be asking by now,
- <emphasis><quote>How am I supposed to handle it
- all?</quote></emphasis></para>
-
- <para>Luckily for you, you are <emphasis>not</emphasis> supposed
- to handle it all. You <emphasis>are</emphasis> supposed to
- handle some of it, but not all of it. Specifically, you need not
- worry about the physical connection (in our case Ethernet and
- possibly <acronym>PPP</acronym>, etc). Nor do you need to handle
- the Internet Protocol, or the Transmission Control
- Protocol.</para>
-
- <para>In other words, you do not have to do anything to receive
- the data from the other computer. Well, you do have to
- <emphasis>ask</emphasis> for it, but that is almost as simple as
- opening a file.</para>
-
- <para>Once you have received the data, it is up to you to figure
- out what to do with it. In our case, you would need to
- understand the <acronym>HTTP</acronym> protocol and the
- <acronym>PNG</acronym> file structure.</para>
-
- <para>To use an analogy, all the internetworking protocols become
- a gray area: Not so much because we do not understand how it
- works, but because we are no longer concerned about it. The
- sockets interface takes care of this gray area for us:</para>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="sockets/slayers">
- </imageobject>
-
- <textobject>
- <literallayout class="monospaced">+----------------+
-|xxxxEthernetxxxx|
-|+--------------+|
-||xxxxxxIPxxxxxx||
-||+------------+||
-|||xxxxxTCPxxxx|||
-|||+----------+|||
-|||| HTTP ||||
-||||+--------+||||
-||||| PNG |||||
-|||||+------+|||||
-|||||| Data ||||||
-|||||+------+|||||
-||||+--------+||||
-|||+----------+|||
-||+------------+||
-|+--------------+|
-+----------------+</literallayout>
- </textobject>
-
- <textobject>
- <phrase>Sockets Covered Protocol Layers</phrase>
- </textobject>
- </mediaobject>
-
- <para>We only need to understand any protocols that tell us how to
- <emphasis>interpret the data</emphasis>, not how to
- <emphasis>receive</emphasis> it from another process, nor how to
- <emphasis>send</emphasis> it to another process.</para>
-
- </sect1>
-
- <sect1 id="sockets-model">
- <title>The Sockets Model</title>
-
- <para><acronym>BSD</acronym> sockets are built on the basic Unix
- model: <emphasis>Everything is a file.</emphasis> In our
- example, then, sockets would let us receive an <emphasis>HTTP
- file</emphasis>, so to speak. It would then be up to us to
- extract the <emphasis><acronym>PNG</acronym> file</emphasis>
- from it.
- </para>
-
- <para>Because of the complexity of internetworking, we cannot just
- use the <function role="syscall">open</function> system call, or
- the <function>open()</function> C function. Instead, we need to
- take several steps to <quote>opening</quote> a socket.</para>
-
- <para>Once we do, however, we can start treating the
- <emphasis>socket</emphasis> the same way we treat any
- <emphasis>file descriptor</emphasis>: We can
- <function>read</function> from it, <function>write</function> to
- it, <function>pipe</function> it, and, eventually,
- <function>close</function> it.</para>
-
- </sect1>
-
- <sect1 id="sockets-essential-functions">
- <title>Essential Socket Functions</title>
-
- <para>While FreeBSD offers different functions to work with
- sockets, we only <emphasis>need</emphasis> four to
- <quote>open</quote> a socket. And in some cases we only need
- two.</para>
-
- <sect2 id="sockets-client-server">
- <title>The Client-Server Difference</title>
-
- <para>Typically, one of the ends of a socket-based data
- communication is a <emphasis>server</emphasis>, the other is a
- <emphasis>client</emphasis>.</para>
-
- <sect3 id="sockets-common-elements">
- <title>The Common Elements</title>
-
- <sect4 id="sockets-socket">
- <title><function>socket</function></title>
-
- <para>The one function used by both, clients and servers, is
- &man.socket.2;. It is declared this way:</para>
-
-<programlisting>
-int socket(int domain, int type, int protocol);
-</programlisting>
-
- <para>The return value is of the same type as that of
- <function>open</function>, an integer. FreeBSD allocates
- its value from the same pool as that of file handles.
- That is what allows sockets to be treated the same way as
- files.</para>
-
- <para>The <varname>domain</varname> argument tells the
- system what <emphasis>protocol family</emphasis> you want
- it to use. Many of them exist, some are vendor specific,
- others are very common. They are declared in
- <filename>sys/socket.h</filename>.</para>
-
- <para>Use <constant>PF_INET</constant> for
- <acronym>UDP</acronym>, <acronym>TCP</acronym> and other
- Internet protocols (<acronym>IP</acronym>v4).</para>
-
- <para>Five values are defined for the
- <varname>type</varname> argument, again, in
- <filename>sys/socket.h</filename>. All of them start with
- <quote><constant>SOCK_</constant></quote>. The most
- common one is <constant>SOCK_STREAM</constant>, which
- tells the system you are asking for a <emphasis>reliable
- stream delivery service</emphasis> (which is
- <acronym>TCP</acronym> when used with
- <constant>PF_INET</constant>).</para>
-
- <para>If you asked for <constant>SOCK_DGRAM</constant>, you
- would be requesting a <emphasis>connectionless datagram
- delivery service</emphasis> (in our case,
- <acronym>UDP</acronym>).</para>
-
- <para>If you wanted to be in charge of the low-level
- protocols (such as <acronym>IP</acronym>), or even network
- interfaces (e.g., the Ethernet), you would need to specify
- <constant>SOCK_RAW</constant>.</para>
-
- <para>Finally, the <varname>protocol</varname> argument
- depends on the previous two arguments, and is not always
- meaningful. In that case, use <constant>0</constant> for
- its value.</para>
-
- <note id="sockets-unconnected">
- <title>The Unconnected Socket</title>
-
- <para>Nowhere, in the <function>socket</function> function
- have we specified to what other system we should be
- connected. Our newly created socket remains
- <emphasis>unconnected</emphasis>.</para>
-
- <para>This is on purpose: To use a telephone analogy, we
- have just attached a modem to the phone line. We have
- neither told the modem to make a call, nor to answer if
- the phone rings.</para>
- </note>
-
- </sect4>
-
- <sect4 id="sockets-sockaddr">
- <title><varname>sockaddr</varname></title>
-
- <para>Various functions of the sockets family expect the
- address of (or pointer to, to use C terminology) a small
- area of the memory. The various C declarations in the
- <filename>sys/socket.h</filename> refer to it as
- <varname>struct sockaddr</varname>. This structure is
- declared in the same file:</para>
-
-<programlisting>
-/*
- * Structure used by kernel to store most
- * addresses.
- */
-struct sockaddr {
- u_char sa_len; /* total length */
- sa_family_t sa_family; /* address family */
- char sa_data[14]; /* actually longer; address value */
-};
-#define SOCK_MAXADDRLEN 255 /* longest possible addresses */
-</programlisting>
-
- <para>Please note the <emphasis>vagueness</emphasis> with
- which the <varname>sa_data</varname> field is declared,
- just as an array of <constant>14</constant> bytes, with
- the comment hinting there can be more than
- <constant>14</constant> of them.</para>
-
- <para>This vagueness is quite deliberate. Sockets is a very
- powerful interface. While most people perhaps think of it
- as nothing more than the Internet interface&mdash;and most
- applications probably use it for that
- nowadays&mdash;sockets can be used for just about
- <emphasis>any</emphasis> kind of interprocess
- communications, of which the Internet (or, more precisely,
- <acronym>IP</acronym>) is only one.</para>
-
- <para>The <filename>sys/socket.h</filename> refers to the
- various types of protocols sockets will handle as
- <emphasis>address families</emphasis>, and lists them
- right before the definition of
- <varname>sockaddr</varname>:</para>
-
-<programlisting>
-/*
- * Address families.
- */
-#define AF_UNSPEC 0 /* unspecified */
-#define AF_LOCAL 1 /* local to host (pipes, portals) */
-#define AF_UNIX AF_LOCAL /* backward compatibility */
-#define AF_INET 2 /* internetwork: UDP, TCP, etc. */
-#define AF_IMPLINK 3 /* arpanet imp addresses */
-#define AF_PUP 4 /* pup protocols: e.g. BSP */
-#define AF_CHAOS 5 /* mit CHAOS protocols */
-#define AF_NS 6 /* XEROX NS protocols */
-#define AF_ISO 7 /* ISO protocols */
-#define AF_OSI AF_ISO
-#define AF_ECMA 8 /* European computer manufacturers */
-#define AF_DATAKIT 9 /* datakit protocols */
-#define AF_CCITT 10 /* CCITT protocols, X.25 etc */
-#define AF_SNA 11 /* IBM SNA */
-#define AF_DECnet 12 /* DECnet */
-#define AF_DLI 13 /* DEC Direct data link interface */
-#define AF_LAT 14 /* LAT */
-#define AF_HYLINK 15 /* NSC Hyperchannel */
-#define AF_APPLETALK 16 /* Apple Talk */
-#define AF_ROUTE 17 /* Internal Routing Protocol */
-#define AF_LINK 18 /* Link layer interface */
-#define pseudo_AF_XTP 19 /* eXpress Transfer Protocol (no AF) */
-#define AF_COIP 20 /* connection-oriented IP, aka ST II */
-#define AF_CNT 21 /* Computer Network Technology */
-#define pseudo_AF_RTIP 22 /* Help Identify RTIP packets */
-#define AF_IPX 23 /* Novell Internet Protocol */
-#define AF_SIP 24 /* Simple Internet Protocol */
-#define pseudo_AF_PIP 25 /* Help Identify PIP packets */
-#define AF_ISDN 26 /* Integrated Services Digital Network*/
-#define AF_E164 AF_ISDN /* CCITT E.164 recommendation */
-#define pseudo_AF_KEY 27 /* Internal key-management function */
-#define AF_INET6 28 /* IPv6 */
-#define AF_NATM 29 /* native ATM access */
-#define AF_ATM 30 /* ATM */
-#define pseudo_AF_HDRCMPLT 31 /* Used by BPF to not rewrite headers
- * in interface output routine
- */
-#define AF_NETGRAPH 32 /* Netgraph sockets */
-
-#define AF_MAX 33
-</programlisting>
-
- <para>The one used for <acronym>IP</acronym> is
- <symbol>AF_INET</symbol>. It is a symbol for the constant
- <constant>2</constant>.</para>
-
- <para>It is the <emphasis>address family</emphasis> listed
- in the <varname>sa_family</varname> field of
- <varname>sockaddr</varname> that decides how exactly the
- vaguely named bytes of <varname>sa_data</varname> will be
- used.</para>
-
- <para>Specifically, whenever the <emphasis>address
- family</emphasis> is <symbol>AF_INET</symbol>, we can use
- <varname>struct sockaddr_in</varname> found in
- <filename>netinet/in.h</filename>, wherever
- <varname>sockaddr</varname> is expected:</para>
-
-<programlisting>
-/*
- * Socket address, internet style.
- */
-struct sockaddr_in {
- u_char sin_len;
- u_char sin_family;
- u_short sin_port;
- struct in_addr sin_addr;
- char sin_zero[8];
-};
-</programlisting>
-
- <para>We can visualize its organization this way:</para>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="sockets/sain">
- </imageobject>
-
- <textobject>
- <literallayout class="monospaced"> 0 1 2 3
- +--------+--------+-----------------+
- 0 | 0 | Family | Port |
- +--------+--------+-----------------+
- 4 | IP Address |
- +-----------------------------------+
- 8 | 0 |
- +-----------------------------------+
-12 | 0 |
- +-----------------------------------+</literallayout>
- </textobject>
-
- <textobject>
- <phrase>sockaddr_in</phrase>
- </textobject>
- </mediaobject>
-
- <para>The three important fields are
- <varname>sin_family</varname>, which is byte 1 of the
- structure, <varname>sin_port</varname>, a 16-bit value
- found in bytes 2 and 3, and <varname>sin_addr</varname>, a
- 32-bit integer representation of the <acronym>IP</acronym>
- address, stored in bytes 4-7.</para>
-
- <para>Now, let us try to fill it out. Let us assume we are
- trying to write a client for the
- <emphasis>daytime</emphasis> protocol, which simply states
- that its server will write a text string representing the
- current date and time to port 13. We want to use
- <acronym>TCP/IP</acronym>, so we need to specify
- <constant>AF_INET</constant> in the address family
- field. <constant>AF_INET</constant> is defined as
- <constant>2</constant>. Let us use the
- <acronym>IP</acronym> address of <hostid
- role="ipaddr">192.43.244.18</hostid>, which is the time
- server of US federal government (<hostid
- role="domainname">time.nist.gov</hostid>).</para>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="sockets/sainfill">
- </imageobject>
-
- <textobject>
- <literallayout class="monospaced"> 0 1 2 3
- +--------+--------+-----------------+
- 0 | 0 | 2 | 13 |
- +-----------------+-----------------+
- 4 | 192.43.244.18 |
- +-----------------------------------+
- 8 | 0 |
- +-----------------------------------+
-12 | 0 |
- +-----------------------------------+</literallayout>
- </textobject>
-
- <textobject>
- <phrase>Specific example of sockaddr_in</phrase>
- </textobject>
- </mediaobject>
-
- <para>By the way the <varname>sin_addr</varname> field is
- declared as being of the <varname>struct in_addr</varname>
- type, which is defined in
- <filename>netinet/in.h</filename>:</para>
-
-<programlisting>
-/*
- * Internet address (a structure for historical reasons)
- */
-struct in_addr {
- in_addr_t s_addr;
-};
-</programlisting>
-
- <para>In addition, <varname>in_addr_t</varname> is a 32-bit
- integer.</para>
-
- <para>The <hostid role="ipaddr">192.43.244.18</hostid> is
- just a convenient notation of expressing a 32-bit integer
- by listing all of its 8-bit bytes, starting with the
- <emphasis>most significant</emphasis> one.</para>
-
- <para>So far, we have viewed <varname>sockaddr</varname> as
- an abstraction. Our computer does not store
- <varname>short</varname> integers as a single 16-bit
- entity, but as a sequence of 2 bytes. Similarly, it stores
- 32-bit integers as a sequence of 4 bytes.</para>
-
- <para>Suppose we coded something like this:</para>
-
-<programlisting>
- sa.sin_family = AF_INET;
- sa.sin_port = 13;
- sa.sin_addr.s_addr = (((((192 << 8) | 43) << 8) | 244) << 8) | 18;
-</programlisting>
-
- <para>What would the result look like?</para>
-
- <para>Well, that depends, of course. On a Pentium, or other
- x86, based computer, it would look like this:</para>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="sockets/sainlsb">
- </imageobject>
-
- <textobject>
- <literallayout class="monospaced"> 0 1 2 3
- +--------+--------+--------+--------+
- 0 | 0 | 2 | 13 | 0 |
- +--------+--------+--------+--------+
- 4 | 18 | 244 | 43 | 192 |
- +-----------------------------------+
- 8 | 0 |
- +-----------------------------------+
-12 | 0 |
- +-----------------------------------+</literallayout>
- </textobject>
-
- <textobject>
- <phrase>sockaddr_in on an Intel system</phrase>
- </textobject>
- </mediaobject>
-
- <para>On a different system, it might look like this:
- </para>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="sockets/sainmsb">
- </imageobject>
-
- <textobject>
- <literallayout class="monospaced"> 0 1 2 3
- +--------+--------+--------+--------+
- 0 | 0 | 2 | 0 | 13 |
- +--------+--------+--------+--------+
- 4 | 192 | 43 | 244 | 18 |
- +-----------------------------------+
- 8 | 0 |
- +-----------------------------------+
-12 | 0 |
- +-----------------------------------+</literallayout>
- </textobject>
-
- <textobject>
- <phrase>sockaddr_in on an MSB system</phrase>
- </textobject>
- </mediaobject>
-
- <para>And on a PDP it might look different yet. But the
- above two are the most common ways in use today.</para>
-
- <para>Ordinarily, wanting to write portable code,
- programmers pretend that these differences do not
- exist. And they get away with it (except when they code in
- assembly language). Alas, you cannot get away with it that
- easily when coding for sockets.</para>
-
- <para>Why?</para>
-
- <para>Because when communicating with another computer, you
- usually do not know whether it stores data <emphasis>most
- significant byte</emphasis> (<acronym>MSB</acronym>) or
- <emphasis>least significant byte</emphasis>
- (<acronym>LSB</acronym>) first.</para>
-
- <para>You might be wondering, <emphasis><quote>So, will
- sockets not handle it for me?</quote></emphasis></para>
-
- <para>It will not.</para>
-
- <para>While that answer may surprise you at first, remember
- that the general sockets interface only understands the
- <varname>sa_len</varname> and <varname>sa_family</varname>
- fields of the <varname>sockaddr</varname> structure. You
- do not have to worry about the byte order there (of
- course, on FreeBSD <varname>sa_family</varname> is only 1
- byte anyway, but many other Unix systems do not have
- <varname>sa_len</varname> and use 2 bytes for
- <varname>sa_family</varname>, and expect the data in
- whatever order is native to the computer).</para>
-
- <para>But the rest of the data is just
- <varname>sa_data[14]</varname> as far as sockets
- goes. Depending on the <emphasis>address
- family</emphasis>, sockets just forwards that data to its
- destination.</para>
-
- <para>Indeed, when we enter a port number, it is because we
- want the other computer to know what service we are asking
- for. And, when we are the server, we read the port number
- so we know what service the other computer is expecting
- from us. Either way, sockets only has to forward the port
- number as data. It does not interpret it in any way.</para>
-
- <para>Similarly, we enter the <acronym>IP</acronym> address
- to tell everyone on the way where to send our data
- to. Sockets, again, only forwards it as data.</para>
-
- <para>That is why, we (the <emphasis>programmers</emphasis>,
- not the <emphasis>sockets</emphasis>) have to distinguish
- between the byte order used by our computer and a
- conventional byte order to send the data in to the other
- computer.</para>
-
- <para>We will call the byte order our computer uses the
- <emphasis>host byte order</emphasis>, or just the
- <emphasis>host order</emphasis>.</para>
-
- <para>There is a convention of sending the multi-byte data
- over <acronym>IP</acronym>
- <emphasis><acronym>MSB</acronym> first</emphasis>. This,
- we will refer to as the <emphasis>network byte
- order</emphasis>, or simply the <emphasis>network
- order</emphasis>.</para>
-
- <para>Now, if we compiled the above code for an Intel based
- computer, our <emphasis>host byte order</emphasis> would
- produce:</para>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="sockets/sainlsb">
- </imageobject>
-
- <textobject>
- <literallayout class="monospaced"> 0 1 2 3
- +--------+--------+--------+--------+
- 0 | 0 | 2 | 13 | 0 |
- +--------+--------+--------+--------+
- 4 | 18 | 244 | 43 | 192 |
- +-----------------------------------+
- 8 | 0 |
- +-----------------------------------+
-12 | 0 |
- +-----------------------------------+</literallayout>
- </textobject>
-
- <textobject>
- <phrase>Host byte order on an Intel system</phrase>
- </textobject>
- </mediaobject>
-
- <para>But the <emphasis>network byte order</emphasis>
- requires that we store the data <acronym>MSB</acronym>
- first:</para>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="sockets/sainmsb">
- </imageobject>
-
- <textobject>
- <literallayout class="monospaced"> 0 1 2 3
- +--------+--------+--------+--------+
- 0 | 0 | 2 | 0 | 13 |
- +--------+--------+--------+--------+
- 4 | 192 | 43 | 244 | 18 |
- +-----------------------------------+
- 8 | 0 |
- +-----------------------------------+
-12 | 0 |
- +-----------------------------------+</literallayout>
- </textobject>
-
- <textobject>
- <phrase>Network byte order</phrase>
- </textobject>
- </mediaobject>
-
- <para>Unfortunately, our <emphasis>host order</emphasis> is
- the exact opposite of the <emphasis>network
- order</emphasis>.</para>
-
- <para>We have several ways of dealing with it. One would be
- to <emphasis>reverse</emphasis> the values in our code:
- </para>
-
-<programlisting>
- sa.sin_family = AF_INET;
- sa.sin_port = 13 << 8;
- sa.sin_addr.s_addr = (((((18 << 8) | 244) << 8) | 43) << 8) | 192;
-</programlisting>
-
- <para>This will <emphasis>trick</emphasis> our compiler
- into storing the data in the <emphasis>network byte
- order</emphasis>. In some cases, this is exactly the way
- to do it (e.g., when programming in assembly
- language). In most cases, however, it can cause a
- problem.</para>
-
- <para>Suppose, you wrote a sockets-based program in C. You
- know it is going to run on a Pentium, so you enter all
- your constants in reverse and force them to the
- <emphasis>network byte order</emphasis>. It works
- well.</para>
-
- <para>Then, some day, your trusted old Pentium becomes a
- rusty old Pentium. You replace it with a system whose
- <emphasis>host order</emphasis> is the same as the
- <emphasis>network order</emphasis>. You need to recompile
- all your software. All of your software continues to
- perform well, except the one program you wrote.</para>
-
- <para>You have since forgotten that you had forced all of
- your constants to the opposite of the <emphasis>host
- order</emphasis>. You spend some quality time tearing out
- your hair, calling the names of all gods you ever heard
- of (and some you made up), hitting your monitor with a
- nerf bat, and performing all the other traditional
- ceremonies of trying to figure out why something that has
- worked so well is suddenly not working at all.</para>
-
- <para>Eventually, you figure it out, say a couple of swear
- words, and start rewriting your code.</para>
-
- <para>Luckily, you are not the first one to face the
- problem. Someone else has created the &man.htons.3; and
- &man.htonl.3; C functions to convert a
- <varname>short</varname> and <varname>long</varname>
- respectively from the <emphasis>host byte
- order</emphasis> to the <emphasis>network byte
- order</emphasis>, and the &man.ntohs.3; and &man.ntohl.3;
- C functions to go the other way.</para>
-
- <para>On <emphasis><acronym>MSB</acronym>-first</emphasis>
- systems these functions do nothing. On
- <emphasis><acronym>LSB</acronym>-first</emphasis> systems
- they convert values to the proper order.</para>
-
- <para>So, regardless of what system your software is
- compiled on, your data will end up in the correct order
- if you use these functions.</para>
-
- </sect4>
-
- </sect3>
-
- <sect3 id="sockets-client-functions">
- <title>Client Functions</title>
-
- <para>Typically, the client initiates the connection to the
- server. The client knows which server it is about to call:
- It knows its <acronym>IP</acronym> address, and it knows the
- <emphasis>port</emphasis> the server resides at. It is akin
- to you picking up the phone and dialing the number (the
- <emphasis>address</emphasis>), then, after someone answers,
- asking for the person in charge of wingdings (the
- <emphasis>port</emphasis>).</para>
-
- <sect4 id="sockets-connect">
- <title><function>connect</function></title>
-
- <para>Once a client has created a socket, it needs to
- connect it to a specific port on a remote system. It uses
- &man.connect.2;:</para>
-
-<programlisting>
-int connect(int s, const struct sockaddr *name, socklen_t namelen);
-</programlisting>
-
- <para>The <varname>s</varname> argument is the socket, i.e.,
- the value returned by the <function>socket</function>
- function. The <varname>name</varname> is a pointer to
- <varname>sockaddr</varname>, the structure we have talked
- about extensively. Finaly, <varname>namelen</varname>
- informs the system how many bytes are in our
- <varname>sockaddr</varname> structure.</para>
-
- <para>If <function>connect</function> is successful, it
- returns <constant>0</constant>. Otherwise it returns
- <constant>-1</constant> and stores the error code in
- <varname>errno</varname>.</para>
-
- <para>There are many reasons why
- <function>connect</function> may fail. For example, with
- an attempt to an Internet connection, the
- <acronym>IP</acronym> address may not exist, or it may be
- down, or just too busy, or it may not have a server
- listening at the specified port. Or it may outright
- <emphasis>refuse</emphasis> any request for specific
- code.</para>
-
- </sect4>
-
- <sect4 id="sockets-first-client">
- <title>Our First Client</title>
-
- <para>We now know enough to write a very simple client, one
- that will get current time from <hostid
- role="ipaddr">192.43.244.18</hostid> and print it to
- <devicename>stdout</devicename>.</para>
-
-<programlisting>
-/*
- * daytime.c
- *
- * Programmed by G. Adam Stanislav
- */
-#include &lt;stdio.h&gt;
-#include &lt;sys/types.h&gt;
-#include &lt;sys/socket.h&gt;
-#include &lt;netinet/in.h&gt;
-
-int main() {
- register int s;
- register int bytes;
- struct sockaddr_in sa;
- char buffer[BUFSIZ+1];
-
- if ((s = socket(PF_INET, SOCK_STREAM, 0)) &lt; 0) {
- perror("socket");
- return 1;
- }
-
- bzero(&amp;sa, sizeof sa);
-
- sa.sin_family = AF_INET;
- sa.sin_port = htons(13);
- sa.sin_addr.s_addr = htonl((((((192 &lt;&lt; 8) | 43) &lt;&lt; 8) | 244) &lt;&lt; 8) | 18);
- if (connect(s, (struct sockaddr *)&amp;sa, sizeof sa) &lt; 0) {
- perror("connect");
- close(s);
- return 2;
- }
-
- while ((bytes = read(s, buffer, BUFSIZ)) > 0)
- write(1, buffer, bytes);
-
- close(s);
- return 0;
-}
-</programlisting>
-
- <para>Go ahead, enter it in your editor, save it as
- <filename>daytime.c</filename>, then compile and run
- it:</para>
-
-<screen>&prompt.user; <userinput>cc -O3 -o daytime daytime.c</userinput>
-&prompt.user; <userinput>./daytime</userinput>
-
-52079 01-06-19 02:29:25 50 0 1 543.9 UTC(NIST) *
-&prompt.user;</screen>
-
- <para>In this case, the date was June 19, 2001, the time was
- 02:29:25 <acronym>UTC</acronym>. Naturally, your results
- will vary.</para>
-
- </sect4>
-
- </sect3>
-
- <sect3 id="sockets-server-functions">
- <title>Server Functions</title>
-
- <para>The typical server does not initiate the
- connection. Instead, it waits for a client to call it and
- request services. It does not know when the client will
- call, nor how many clients will call. It may be just sitting
- there, waiting patiently, one moment, The next moment, it
- can find itself swamped with requests from a number of
- clients, all calling in at the same time.</para>
-
- <para>The sockets interface offers three basic functions to
- handle this.</para>
-
- <sect4 id="sockets-bind">
- <title><function>bind</function></title>
-
- <para>Ports are like extensions to a phone line: After you
- dial a number, you dial the extension to get to a specific
- person or department.</para>
-
- <para>There are 65535 <acronym>IP</acronym> ports, but a
- server usually processes requests that come in on only one
- of them. It is like telling the phone room operator that
- we are now at work and available to answer the phone at a
- specific extension. We use &man.bind.2; to tell sockets
- which port we want to serve.</para>
-
-<programlisting>
-int bind(int s, const struct sockaddr *addr, socklen_t addrlen);
-</programlisting>
-
- <para>Beside specifying the port in <varname>addr</varname>,
- the server may include its <acronym>IP</acronym>
- address. However, it can just use the symbolic constant
- <symbol>INADDR_ANY</symbol> to indicate it will serve all
- requests to the specified port regardless of what its
- <acronym>IP</acronym> address is. This symbol, along with
- several similar ones, is declared in
- <filename>netinet/in.h</filename></para>
-
-<programlisting>
-#define INADDR_ANY (u_int32_t)0x00000000
-</programlisting>
-
- <para>Suppose we were writing a server for the
- <emphasis>daytime</emphasis> protocol over
- <acronym>TCP</acronym>/<acronym>IP</acronym>. Recall that
- it uses port 13. Our <varname>sockaddr_in</varname>
- structure would look like this:</para>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="sockets/sainserv">
- </imageobject>
-
- <textobject>
- <literallayout class="monospaced"> 0 1 2 3
- +--------+--------+--------+--------+
- 0 | 0 | 2 | 0 | 13 |
- +--------+--------+--------+--------+
- 4 | 0 |
- +-----------------------------------+
- 8 | 0 |
- +-----------------------------------+
-12 | 0 |
- +-----------------------------------+</literallayout>
- </textobject>
-
- <textobject>
- <phrase>Example Server sockaddr_in</phrase>
- </textobject>
- </mediaobject>
- </sect4>
-
- <sect4 id="sockets-listen">
- <title><function>listen</function></title>
-
- <para>To continue our office phone analogy, after you have
- told the phone central operator what extension you will be
- at, you now walk into your office, and make sure your own
- phone is plugged in and the ringer is turned on. Plus, you
- make sure your call waiting is activated, so you can hear
- the phone ring even while you are talking to someone.</para>
-
- <para>The server ensures all of that with the &man.listen.2;
- function.</para>
-
-<programlisting>
-int listen(int s, int backlog);
-</programlisting>
-
- <para>In here, the <varname>backlog</varname> variable tells
- sockets how many incoming requests to accept while you are
- busy processing the last request. In other words, it
- determines the maximum size of the queue of pending
- connections.</para>
-
- </sect4>
-
- <sect4 id="sockets-accept">
- <title><function>accept</function></title>
-
- <para>After you hear the phone ringing, you accept the call
- by answering the call. You have now established a
- connection with your client. This connection remains
- active until either you or your client hang up.</para>
-
- <para>The server accepts the connection by using the
- &man.accept.2; function.</para>
-
-<programlisting>
-int accept(int s, struct sockaddr *addr, socklen_t *addrlen);
-</programlisting>
-
- <para>Note that this time <varname>addrlen</varname> is a
- pointer. This is necessary because in this case it is the
- socket that fills out <varname>addr</varname>, the
- <varname>sockaddr_in</varname> structure.</para>
-
- <para>The return value is an integer. Indeed, the
- <function>accept</function> returns a <emphasis>new
- socket</emphasis>. You will use this new socket to
- communicate with the client.</para>
-
- <para>What happens to the old socket? It continues to listen
- for more requests (remember the <varname>backlog</varname>
- variable we passed to <function>listen</function>?) until
- we <function>close</function> it.</para>
-
- <para>Now, the new socket is meant only for
- communications. It is fully connected. We cannot pass it
- to <function>listen</function> again, trying to accept
- additional connections.</para>
-
- </sect4>
-
- <sect4 id="sockets-first-server">
- <title>Our First Server</title>
-
- <para>Our first server will be somewhat more complex than
- our first client was: Not only do we have more sockets
- functions to use, but we need to write it as a
- daemon.</para>
-
- <para>This is best achieved by creating a <emphasis>child
- process</emphasis> after binding the port. The main
- process then exits and returns control to the
- <application>shell</application> (or whatever program
- invoked it).</para>
-
- <para>The child calls <function>listen</function>, then
- starts an endless loop, which accepts a connection, serves
- it, and eventually closes its socket.</para>
-
-<programlisting>
-/*
- * daytimed - a port 13 server
- *
- * Programmed by G. Adam Stanislav
- * June 19, 2001
- */
-#include &lt;stdio.h&gt;
-#include &lt;time.h&gt;
-#include &lt;unistd.h&gt;
-#include &lt;sys/types.h&gt;
-#include &lt;sys/socket.h&gt;
-#include &lt;netinet/in.h&gt;
-
-#define BACKLOG 4
-
-int main() {
- register int s, c;
- int b;
- struct sockaddr_in sa;
- time_t t;
- struct tm *tm;
- FILE *client;
-
- if ((s = socket(PF_INET, SOCK_STREAM, 0)) &lt; 0) {
- perror("socket");
- return 1;
- }
-
- bzero(&amp;sa, sizeof sa);
-
- sa.sin_family = AF_INET;
- sa.sin_port = htons(13);
-
- if (INADDR_ANY)
- sa.sin_addr.s_addr = htonl(INADDR_ANY);
-
- if (bind(s, (struct sockaddr *)&amp;sa, sizeof sa) < 0) {
- perror("bind");
- return 2;
- }
-
- switch (fork()) {
- case -1:
- perror("fork");
- return 3;
- break;
- default:
- close s;
- return 0;
- break;
- case 0:
- break;
- }
-
- listen(s, BACKLOG);
-
- for (;;) {
- b = sizeof sa;
-
- if ((c = accept(s, (struct sockaddr *)&amp;sa, &amp;b)) &lt; 0) {
- perror("daytimed accept");
- return 4;
- }
-
- if ((client = fdopen(c, "w")) == NULL) {
- perror("daytimed fdopen");
- return 5;
- }
-
- if ((t = time(NULL)) &lt; 0) {
- perror("daytimed time");
-
- return 6;
- }
-
- tm = gmtime(&amp;t);
- fprintf(client, "%.4i-%.2i-%.2iT%.2i:%.2i:%.2iZ\n",
- tm->tm_year + 1900,
- tm->tm_mon + 1,
- tm->tm_mday,
- tm->tm_hour,
- tm->tm_min,
- tm->tm_sec);
-
- fclose(client);
- }
-}
-</programlisting>
-
- <para>We start by creating a socket. Then we fill out the
- <varname>sockaddr_in</varname> structure in
- <varname>sa</varname>. Note the conditional use of
- <symbol>INADDR_ANY</symbol>:</para>
-
-<programlisting>
- if (INADDR_ANY)
- sa.sin_addr.s_addr = htonl(INADDR_ANY);
-</programlisting>
-
- <para>Its value is <constant>0</constant>. Since we have
- just used <function>bzero</function> on the entire
- structure, it would be redundant to set it to
- <constant>0</constant> again. But if we port our code to
- some other system where <symbol>INADDR_ANY</symbol> is
- perhaps not a zero, we need to assign it to
- <varname>sa.sin_addr.s_addr</varname>. Most modern C
- compilers are clever enough to notice that
- <symbol>INADDR_ANY</symbol> is a constant. As long as it
- is a zero, they will optimize the entire conditional
- statement out of the code.</para>
-
- <para>After we have called <function>bind</function>
- successfully, we are ready to become a
- <emphasis>daemon</emphasis>: We use
- <function>fork</function> to create a child process. In
- both, the parent and the child, the <varname>s</varname>
- variable is our socket. The parent process will not need
- it, so it calls <function>close</function>, then it
- returns <constant>0</constant> to inform its own parent it
- had terminated successfully.</para>
-
- <para>Meanwhile, the child process continues working in the
- background. It calls <function>listen</function> and sets
- its backlog to <constant>4</constant>. It does not need a
- large value here because <emphasis>daytime</emphasis> is
- not a protocol many clients request all the time, and
- because it can process each request instantly anyway.</para>
-
- <para>Finally, the daemon starts an endless loop, which
- performs the following steps:</para>
-
- <procedure>
- <step><para> Call <function>accept</function>. It waits
- here until a client contacts it. At that point, it
- receives a new socket, <varname>c</varname>, which it
- can use to communicate with this particular client.
- </para></step>
-
- <step><para>It uses the C function
- <function>fdopen</function> to turn the socket from a
- low-level <emphasis>file descriptor</emphasis> to a
- C-style <varname>FILE</varname> pointer. This will allow
- the use of <function>fprintf</function> later on.
- </para></step>
-
- <step><para>It checks the time, and prints it in the
- <emphasis><acronym>ISO</acronym> 8601</emphasis> format
- to the <varname>client</varname> <quote>file</quote>. It
- then uses <function>fclose</function> to close the
- file. That will automatically close the socket as well.
- </para></step>
-
- </procedure>
-
- <para>We can <emphasis>generalize</emphasis> this, and use
- it as a model for many other servers:</para>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="sockets/serv">
- </imageobject>
-
- <textobject>
- <literallayout class="monospaced">+-----------------+
-| Create Socket |
-+-----------------+
- |
-+-----------------+
-| Bind Port | Daemon Process
-+-----------------+
- | +--------+
- +-------------+--&gt;| Init |
- | | +--------+
-+-----------------+ | |
-| Exit | | +--------+
-+-----------------+ | | Listen |
- | +--------+
- | |
- | +--------+
- | | Accept |
- | +--------+
- | |
- | +--------+
- | | Serve |
- | +--------+
- | |
- | +--------+
- | | Close |
- |&lt;--------+</literallayout>
- </textobject>
-
- <textobject>
- <phrase>Sequential Server</phrase>
- </textobject>
- </mediaobject>
-
- <para>This flowchart is good for <emphasis>sequential
- servers</emphasis>, i.e., servers that can serve one
- client at a time, just as we were able to with our
- <emphasis>daytime</emphasis> server. This is only possible
- whenever there is no real <quote>conversation</quote>
- going on between the client and the server: As soon as the
- server detects a connection to the client, it sends out
- some data and closes the connection. The entire operation
- may take nanoseconds, and it is finished.</para>
-
- <para>The advantage of this flowchart is that, except for
- the brief moment after the parent
- <function>fork</function>s and before it exits, there is
- always only one <emphasis>process</emphasis> active: Our
- server does not take up much memory and other system
- resources.</para>
-
- <para>Note that we have added <emphasis>initialize
- daemon</emphasis> in our flowchart. We did not need to
- initialize our own daemon, but this is a good place in the
- flow of the program to set up any
- <function>signal</function> handlers, open any files we
- may need, etc.</para>
-
- <para>Just about everything in the flow chart can be used
- literally on many different servers. The
- <emphasis>serve</emphasis> entry is the exception. We
- think of it as a <emphasis><quote>black
- box</quote></emphasis>, i.e., something you design
- specifically for your own server, and just <quote>plug it
- into the rest.</quote></para>
-
- <para>Not all protocols are that simple. Many receive a
- request from the client, reply to it, then receive another
- request from the same client. Because of that, they do not
- know in advance how long they will be serving the
- client. Such servers usually start a new process for each
- client. While the new process is serving its client, the
- daemon can continue listening for more connections.</para>
-
- <para>Now, go ahead, save the above source code as
- <filename>daytimed.c</filename> (it is customary to end
- the names of daemons with the letter
- <constant>d</constant>). After you have compiled it, try
- running it:</para>
-
-<screen>&prompt.user; <userinput>./daytimed</userinput>
-bind: Permission denied
-&prompt.user;</screen>
-
- <para>What happened here? As you will recall, the
- <emphasis>daytime</emphasis> protocol uses port 13. But
- all ports below 1024 are reserved to the superuser
- (otherwise, anyone could start a daemon pretending to
- serve a commonly used port, while causing a security
- breach).</para>
-
- <para>Try again, this time as the superuser:</para>
-
-<screen>&prompt.root; <userinput>./daytimed</userinput>
-&prompt.root;</screen>
-
- <para>What... Nothing? Let us try again:</para>
-
-<screen>&prompt.root; <userinput>./daytimed</userinput>
-
-bind: Address already in use
-&prompt.root;</screen>
-
- <para>Every port can only be bound by one program at a
- time. Our first attempt was indeed successful: It started
- the child daemon and returned quietly. It is still running
- and will continue to run until you either kill it, or any
- of its system calls fail, or you reboot the system.</para>
-
- <para>Fine, we know it is running in the background. But is
- it working? How do we know it is a proper
- <emphasis>daytime</emphasis> server? Simple:</para>
-
-<screen>&prompt.user; <userinput>telnet localhost 13</userinput>
-
-Trying ::1...
-telnet: connect to address ::1: Connection refused
-Trying 127.0.0.1...
-Connected to localhost.
-Escape character is '^]'.
-2001-06-19T21:04:42Z
-Connection closed by foreign host.
-&prompt.user;</screen>
-
- <para><application>telnet</application> tried the new
- <acronym>IP</acronym>v6, and failed. It retried with
- <acronym>IP</acronym>v4 and succeeded. The daemon
- works.</para>
-
- <para>If you have access to another Unix system via
- <application>telnet</application>, you can use it to test
- accessing the server remotely. My computer does not have a
- static <acronym>IP</acronym> address, so this is what I
- did:</para>
-
-<screen>&prompt.user; <userinput>who</userinput>
-
-whizkid ttyp0 Jun 19 16:59 (216.127.220.143)
-xxx ttyp1 Jun 19 16:06 (xx.xx.xx.xx)
-&prompt.user; <userinput>telnet 216.127.220.143 13</userinput>
-
-Trying 216.127.220.143...
-Connected to r47.bfm.org.
-Escape character is '^]'.
-2001-06-19T21:31:11Z
-Connection closed by foreign host.
-&prompt.user;</screen>
-
- <para>Again, it worked. Will it work using the domain name?
- </para>
-
-<screen>&prompt.user; <userinput>telnet r47.bfm.org 13</userinput>
-
-Trying 216.127.220.143...
-Connected to r47.bfm.org.
-Escape character is '^]'.
-2001-06-19T21:31:40Z
-Connection closed by foreign host.
-&prompt.user;</screen>
-
- <para>By the way, <application>telnet</application> prints
- the <emphasis>Connection closed by foreign host</emphasis>
- message after our daemon has closed the socket. This shows
- us that, indeed, using
- <function>fclose(client);</function> in our code works as
- advertised.</para>
-
- </sect4>
-
- </sect3>
-
- </sect2>
-
- </sect1>
-
- <sect1 id="sockets-helper-functions">
- <title>Helper Functions</title>
-
- <para>FreeBSD C library contains many helper functions for sockets
- programming. For example, in our sample client we hard coded
- the <hostid role="domainname">time.nist.gov</hostid>
- <acronym>IP</acronym> address. But we do not always know the
- <acronym>IP</acronym> address. Even if we do, our software is
- more flexible if it allows the user to enter the
- <acronym>IP</acronym> address, or even the domain name.
- </para>
-
- <sect2 id="sockets-gethostbyname">
- <title><function>gethostbyname</function></title>
-
- <para>While there is no way to pass the domain name directly to
- any of the sockets functions, the FreeBSD C library comes with
- the &man.gethostbyname.3 and &man.gethostbyname2.3 functions,
- declared in <filename>netdb.h</filename>.</para>
-
-<programlisting>
-struct hostent * gethostbyname(const char *name);
-struct hostent * gethostbyname2(const char *name, int af);
-</programlisting>
-
- <para>Both return a pointer to the <varname>hostent</varname>
- structure, with much information about the domain. For our
- purposes, the <varname>h_addr_list[0]</varname> field of the
- structure points at <varname>h_length</varname> bytes of the
- correct address, already stored in the <emphasis>network byte
- order</emphasis>.</para>
-
- <para>This allows us to create a much more flexible&mdash;and
- much more useful&mdash;version of our
- <application>daytime</application> program:</para>
-
-<programlisting>
-/*
- * daytime.c
- *
- * Programmed by G. Adam Stanislav
- * 19 June 2001
- */
-#include &lt;stdio.h&gt;
-#include &lt;string.h&gt;
-#include &lt;sys/types.h&gt;
-#include &lt;sys/socket.h&gt;
-#include &lt;netinet/in.h&gt;
-#include &lt;netdb.h&gt;
-
-int main(int argc, char *argv[]) {
- register int s;
- register int bytes;
- struct sockaddr_in sa;
- struct hostent *he;
- char buf[BUFSIZ+1];
- char *host;
-
- if ((s = socket(PF_INET, SOCK_STREAM, 0)) &lt; 0) {
- perror("socket");
- return 1;
- }
-
- bzero(&amp;sa, sizeof sa);
-
- sa.sin_family = AF_INET;
- sa.sin_port = htons(13);
-
- host = (argc &gt; 1) ? (char *)argv[1] : "time.nist.gov";
-
- if ((he = gethostbyname(host)) == NULL) {
- herror(host);
- return 2;
- }
-
- bcopy(he-&gt;h_addr_list[0],&amp;sa.sin_addr, he-&gt;h_length);
-
- if (connect(s, (struct sockaddr *)&amp;sa, sizeof sa) &lt; 0) {
- perror("connect");
- return 3;
- }
-
- while ((bytes = read(s, buf, BUFSIZ)) &gt; 0)
- write(1, buf, bytes);
-
- close(s);
- return 0;
-}
-</programlisting>
-
- <para>We now can type a domain name (or an <acronym>IP</acronym>
- address, it works both ways) on the command line, and the
- program will try to connect to its
- <emphasis>daytime</emphasis> server. Otherwise, it will still
- default to <hostid
- role="domainname">time.nist.gov</hostid>. However, even in
- this case we will use <function>gethostbyname</function>
- rather than hard coding <hostid
- role="ipaddr">192.43.244.18</hostid>. That way, even if its
- <acronym>IP</acronym> address changes in the future, we will
- still find it.</para>
-
- <para>Since it takes virtually no time to get the time from your
- local server, you could run <application>daytime</application>
- twice in a row: First to get the time from <hostid
- role="domainname">time.nist.gov</hostid>, the second time from
- your own system. You can then compare the results and see how
- exact your system clock is:</para>
-
-<screen>&prompt.user; <userinput>daytime ; daytime localhost</userinput>
-
-
-52080 01-06-20 04:02:33 50 0 0 390.2 UTC(NIST) *
-2001-06-20T04:02:35Z
-&prompt.user;</screen>
-
- <para>As you can see, my system was two seconds ahead of the
- <acronym>NIST</acronym> time.</para>
-
- </sect2>
-
- <sect2 id="sockets-getservbyname">
- <title><function>getservbyname</function></title>
-
- <para>Sometimes you may not be sure what port a certain service
- uses. The &man.getservbyname.3; function, also declared in
- <filename>netdb.h</filename> comes in very handy in those
- cases:</para>
-
-<programlisting>
-struct servent * getservbyname(const char *name, const char *proto);
-</programlisting>
-
- <para>The <varname>servent</varname> structure contains the
- <varname>s_port</varname>, which contains the proper port,
- already in <emphasis>network byte order</emphasis>.</para>
-
- <para>Had we not known the correct port for the
- <emphasis>daytime</emphasis> service, we could have found it
- this way:</para>
-
-<programlisting>
- struct servent *se;
- ...
- if ((se = getservbyname("daytime", "tcp")) == NULL {
- fprintf(stderr, "Cannot determine which port to use.\n");
- return 7;
- }
- sa.sin_port = se->s_port;
-</programlisting>
-
- <para>You usually do know the port. But if you are developing a
- new protocol, you may be testing it on an unofficial
- port. Some day, you will register the protocol and its port
- (if nowehere else, at least in your
- <filename>/etc/services</filename>, which is where
- <function>getservbyname</function> looks). Instead of
- returning an error in the above code, you just use the
- temporary port number. Once you have listed the protocol in
- <filename>/etc/services</filename>, your software will find
- its port without you having to rewrite the code.</para>
-
- </sect2>
-
- </sect1>
-
- <sect1 id="sockets-concurrent-servers">
- <title>Concurrent Servers</title>
-
- <para>Unlike a sequential server, a <emphasis>concurrent
- server</emphasis> has to be able to serve more than one client
- at a time. For example, a <emphasis>chat server</emphasis> may
- be serving a specific client for hours&mdash;it cannot wait till
- it stops serving a client before it serves the next one.</para>
-
- <para>This requires a significant change in our flowchart:</para>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="sockets/serv2">
- </imageobject>
-
- <textobject>
- <literallayout class="monospaced">+-----------------+
-| Create Socket |
-+-----------------+
- |
-+-----------------+
-| Bind Port | Daemon Process
-+-----------------+
- | +--------+
- +-------------+--&gt;| Init |
- | | +--------+
-+-----------------+ | |
-| Exit | | +--------+
-+-----------------+ | | Listen |
- | +--------+
- | |
- | +--------+
- | | Accept |
- | +--------+
- | | +------------------+
- | +------&gt;| Close Top Socket |
- | | +------------------+
- | +--------+ |
- | | Close | +------------------+
- | +--------+ | Serve |
- | | +------------------+
- |&lt;--------+ |
- +------------------+
- | Close Acc Socket |
- +--------+ +------------------+
- | Signal | |
- +--------+ +------------------+
- | Exit |
- +------------------+</literallayout>
- </textobject>
-
- <textobject>
- <phrase>Concurrent Server</phrase>
- </textobject>
- </mediaobject>
-
- <para>We moved the <emphasis>serve</emphasis> from the
- <emphasis>daemon process</emphasis> to its own <emphasis>server
- process</emphasis>. However, because each child process inherits
- all open files (and a socket is treated just like a file), the
- new process inherits not only the <emphasis><quote>accepted
- handle,</quote></emphasis> i.e., the socket returned by the
- <function>accept</function> call, but also the <emphasis>top
- socket</emphasis>, i.e., the one opened by the top process right
- at the beginning.</para>
-
- <para>However, the <emphasis>server process</emphasis> does not
- need this socket and should <function>close</function> it
- immediately. Similarly, the <emphasis>daemon process</emphasis>
- no longer needs the <emphasis>accepted socket</emphasis>, and
- not only should, but <emphasis>must</emphasis>
- <function>close</function> it&mdash;otherwise, it will run out
- of available <emphasis>file descriptors</emphasis> sooner or
- later.</para>
-
- <para>After the <emphasis>server process</emphasis> is done
- serving, it should close the <emphasis>accepted
- socket</emphasis>. Instead of returning to
- <function>accept</function>, it now exits.
- </para>
-
- <para>Under Unix, a process does not really
- <emphasis>exit</emphasis>. Instead, it
- <emphasis>returns</emphasis> to its parent. Typically, a parent
- process <function>wait</function>s for its child process, and
- obtains a return value. However, our <emphasis>daemon
- process</emphasis> cannot simply stop and wait. That would
- defeat the whole purpose of creating additional processes. But
- if it never does <function>wait</function>, its children will
- become <emphasis>zombies</emphasis>&mdash;no loger functional
- but still roaming around.</para>
-
- <para>For that reason, the <emphasis>daemon process</emphasis>
- needs to set <emphasis>signal handlers</emphasis> in its
- <emphasis>initialize daemon</emphasis> phase. At least a
- <symbol>SIGCHLD</symbol> signal has to be processed, so the
- daemon can remove the zombie return values from the system and
- release the system resources they are taking up.</para>
-
- <para>That is why our flowchart now contains a <emphasis>process
- signals</emphasis> box, which is not connected to any other box.
- By the way, many servers also process <symbol>SIGHUP</symbol>,
- and typically interpret as the signal from the superuser that
- they should reread their configuration files. This allows us to
- change settings without having to kill and restart these
- servers.</para>
-
- </sect1>
-
-</chapter>
diff --git a/en_US.ISO8859-1/books/developers-handbook/sockets/layers.eps b/en_US.ISO8859-1/books/developers-handbook/sockets/layers.eps
deleted file mode 100644
index 77b977b1fa..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/sockets/layers.eps
+++ /dev/null
@@ -1,92 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%BoundingBox: -10 -10 110 102
-%%Creator: G. Adam Stanislav
-%%EndComments
-%%BeginProlog
-%%EndProlog
-
-%%BeginSetup
-%%EndSetup
-
-% Outer layer - Ethernet
-0 0 moveto
-0 92 rlineto
-100 0 rlineto
-0 -92 rlineto
-closepath
-
-2 90 moveto
-0 -88 rlineto
-96 0 rlineto
-0 88 rlineto
-closepath
-fill
-
-% IP
-
-4 4 moveto
-0 72 rlineto
-92 0 rlineto
-0 -72 rlineto
-closepath
-stroke
-
-% TCP
-
-7 7 moveto
-0 58 rlineto
-86 0 rlineto
-0 -58 rlineto
-closepath
-stroke
-
-% HTTP
-
-10 10 moveto
-0 44 rlineto
-80 0 rlineto
-0 -44 rlineto
-closepath
-stroke
-
-% PNG
-
-13 13 moveto
-0 30 rlineto
-74 0 rlineto
-0 -30 rlineto
-closepath
-stroke
-
-% Data
-
-16 16 moveto
-0 16.5 rlineto
-68 0 rlineto
-0 -16.5 rlineto
-closepath
-fill
-
-/Courier findfont 10 scalefont setfont
-26 81 moveto
-(Ethernet) show
-
-43 68 moveto
-(IP) show
-
-40 57 moveto
-(TCP) show
-
-37 46 moveto
-(HTTP) show
-
-39.6 35 moveto
-(PNG) show
-
-1 setcolor
-28 22 moveto
-(D A T A) show
-%%Trailer
-showpage
-%%EOF
-
diff --git a/en_US.ISO8859-1/books/developers-handbook/sockets/sain.eps b/en_US.ISO8859-1/books/developers-handbook/sockets/sain.eps
deleted file mode 100644
index ac754bc651..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/sockets/sain.eps
+++ /dev/null
@@ -1,88 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%BoundingBox: -20 -10 290 85
-%%Creator: G. Adam Stanislav
-%%EndComments
-%%BeginProlog
-/box {
- moveto
- 0 70 rlineto
- 280 0 rlineto
- 0 -70 rlineto
- closepath
-} bind def
-
-/bits32 {
- moveto
- 276 0 rlineto
- 0 15 rlineto
- -276 0 rlineto
- closepath
-} bind def
-
-/bits16 {
- moveto
- 137 0 rlineto
- 0 15 rlineto
- -137 0 rlineto
-} bind def
-
-/bits8 {
- moveto
- 67.5 0 rlineto
- 0 15 rlineto
- -67.5 0 rlineto
-} bind def
-
-%%EndProlog
-
-%%BeginSetup
-%%EndSetup
-
-5 7 div setcolor
-1 1 moveto
-0 34 rlineto
-278 0 rlineto
-0 -34 rlineto
-closepath
-
-1 52 moveto
-0 16 rlineto
-68.5 0 rlineto
-0 -16 rlineto
-closepath
-
-fill
-0 setcolor
-
-0 0 box
-2 2 bits32
-2 19 bits32
-2 36 bits32
-2 53 bits8
-71.5 53 bits8
-141 53 bits16
-fill
-
-/Courier findfont 10 scalefont setfont
-32 72 moveto (0) show
-240 72 moveto (3) show
-171.5 72 moveto (2) show
-101.5 72 moveto (1) show
-
--10 57 moveto (0) show
--10 40 moveto (4) show
--10 23 moveto (8) show
--16 6 moveto (12) show
-
-/Helvetica-bold findfont 10 scalefont setfont
-110 40 moveto (IP Address) show
-196 57 moveto (Port) show
-90 57 moveto (Family) show
-32 57 moveto (0) show
-138 23 moveto (0) show
-138 6 moveto (0) show
-
-%%Trailer
-showpage
-%%EOF
-
diff --git a/en_US.ISO8859-1/books/developers-handbook/sockets/sainfill.eps b/en_US.ISO8859-1/books/developers-handbook/sockets/sainfill.eps
deleted file mode 100644
index 6d5331ed2e..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/sockets/sainfill.eps
+++ /dev/null
@@ -1,88 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%BoundingBox: -20 -10 290 85
-%%Creator: G. Adam Stanislav
-%%EndComments
-%%BeginProlog
-/box {
- moveto
- 0 70 rlineto
- 280 0 rlineto
- 0 -70 rlineto
- closepath
-} bind def
-
-/bits32 {
- moveto
- 276 0 rlineto
- 0 15 rlineto
- -276 0 rlineto
- closepath
-} bind def
-
-/bits16 {
- moveto
- 137 0 rlineto
- 0 15 rlineto
- -137 0 rlineto
-} bind def
-
-/bits8 {
- moveto
- 67.5 0 rlineto
- 0 15 rlineto
- -67.5 0 rlineto
-} bind def
-
-%%EndProlog
-
-%%BeginSetup
-%%EndSetup
-
-5 7 div setcolor
-1 1 moveto
-0 34 rlineto
-278 0 rlineto
-0 -34 rlineto
-closepath
-
-1 52 moveto
-0 16 rlineto
-68.5 0 rlineto
-0 -16 rlineto
-closepath
-
-fill
-0 setcolor
-
-0 0 box
-2 2 bits32
-2 19 bits32
-2 36 bits32
-2 53 bits8
-71.5 53 bits8
-141 53 bits16
-fill
-
-/Courier findfont 10 scalefont setfont
-32 72 moveto (0) show
-240 72 moveto (3) show
-171.5 72 moveto (2) show
-101.5 72 moveto (1) show
-
--10 57 moveto (0) show
--10 40 moveto (4) show
--10 23 moveto (8) show
--16 6 moveto (12) show
-
-/Helvetica-bold findfont 10 scalefont setfont
-108 40 moveto (192.43.244.18) show
-204 57 moveto (13) show
-102 57 moveto (2) show
-32 57 moveto (0) show
-138 23 moveto (0) show
-138 6 moveto (0) show
-
-%%Trailer
-showpage
-%%EOF
-
diff --git a/en_US.ISO8859-1/books/developers-handbook/sockets/sainlsb.eps b/en_US.ISO8859-1/books/developers-handbook/sockets/sainlsb.eps
deleted file mode 100644
index 5b2bec6384..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/sockets/sainlsb.eps
+++ /dev/null
@@ -1,96 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%BoundingBox: -20 -10 290 85
-%%Creator: G. Adam Stanislav
-%%EndComments
-%%BeginProlog
-/box {
- moveto
- 0 70 rlineto
- 280 0 rlineto
- 0 -70 rlineto
- closepath
-} bind def
-
-/bits32 {
- moveto
- 276 0 rlineto
- 0 15 rlineto
- -276 0 rlineto
- closepath
-} bind def
-
-/bits16 {
- moveto
- 137 0 rlineto
- 0 15 rlineto
- -137 0 rlineto
-} bind def
-
-/bits8 {
- moveto
- 67.5 0 rlineto
- 0 15 rlineto
- -67.5 0 rlineto
-} bind def
-
-%%EndProlog
-
-%%BeginSetup
-%%EndSetup
-
-5 7 div setcolor
-1 1 moveto
-0 34 rlineto
-278 0 rlineto
-0 -34 rlineto
-closepath
-
-1 52 moveto
-0 16 rlineto
-68.5 0 rlineto
-0 -16 rlineto
-closepath
-
-fill
-0 setcolor
-
-0 0 box
-2 2 bits32
-2 19 bits32
-2 36 bits8
-71.5 36 bits8
-141 36 bits8
-210.5 36 bits8
-2 53 bits8
-71.5 53 bits8
-141 53 bits8
-210.5 53 bits8
-fill
-
-/Courier findfont 10 scalefont setfont
-32 72 moveto (0) show
-240 72 moveto (3) show
-171.5 72 moveto (2) show
-101.5 72 moveto (1) show
-
--10 57 moveto (0) show
--10 40 moveto (4) show
--10 23 moveto (8) show
--16 6 moveto (12) show
-
-/Helvetica-bold findfont 10 scalefont setfont
-27 40 moveto (18) show
-95 40 moveto (244) show
-168 40 moveto (43) show
-234 40 moveto (192) show
-168 57 moveto (13) show
-240 57 moveto (0) show
-102 57 moveto (2) show
-32 57 moveto (0) show
-138 23 moveto (0) show
-138 6 moveto (0) show
-
-%%Trailer
-showpage
-%%EOF
-
diff --git a/en_US.ISO8859-1/books/developers-handbook/sockets/sainmsb.eps b/en_US.ISO8859-1/books/developers-handbook/sockets/sainmsb.eps
deleted file mode 100644
index 279bb5b37f..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/sockets/sainmsb.eps
+++ /dev/null
@@ -1,96 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%BoundingBox: -20 -10 290 85
-%%Creator: G. Adam Stanislav
-%%EndComments
-%%BeginProlog
-/box {
- moveto
- 0 70 rlineto
- 280 0 rlineto
- 0 -70 rlineto
- closepath
-} bind def
-
-/bits32 {
- moveto
- 276 0 rlineto
- 0 15 rlineto
- -276 0 rlineto
- closepath
-} bind def
-
-/bits16 {
- moveto
- 137 0 rlineto
- 0 15 rlineto
- -137 0 rlineto
-} bind def
-
-/bits8 {
- moveto
- 67.5 0 rlineto
- 0 15 rlineto
- -67.5 0 rlineto
-} bind def
-
-%%EndProlog
-
-%%BeginSetup
-%%EndSetup
-
-5 7 div setcolor
-1 1 moveto
-0 34 rlineto
-278 0 rlineto
-0 -34 rlineto
-closepath
-
-1 52 moveto
-0 16 rlineto
-68.5 0 rlineto
-0 -16 rlineto
-closepath
-
-fill
-0 setcolor
-
-0 0 box
-2 2 bits32
-2 19 bits32
-2 36 bits8
-71.5 36 bits8
-141 36 bits8
-210.5 36 bits8
-2 53 bits8
-71.5 53 bits8
-141 53 bits8
-210.5 53 bits8
-fill
-
-/Courier findfont 10 scalefont setfont
-32 72 moveto (0) show
-240 72 moveto (3) show
-171.5 72 moveto (2) show
-101.5 72 moveto (1) show
-
--10 57 moveto (0) show
--10 40 moveto (4) show
--10 23 moveto (8) show
--16 6 moveto (12) show
-
-/Helvetica-bold findfont 10 scalefont setfont
-236 40 moveto (18) show
-166 40 moveto (244) show
-99 40 moveto (43) show
-27 40 moveto (192) show
-236 57 moveto (13) show
-172 57 moveto (0) show
-102 57 moveto (2) show
-32 57 moveto (0) show
-138 23 moveto (0) show
-138 6 moveto (0) show
-
-%%Trailer
-showpage
-%%EOF
-
diff --git a/en_US.ISO8859-1/books/developers-handbook/sockets/sainserv.eps b/en_US.ISO8859-1/books/developers-handbook/sockets/sainserv.eps
deleted file mode 100644
index 33bb86b83e..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/sockets/sainserv.eps
+++ /dev/null
@@ -1,90 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%BoundingBox: -20 -10 290 85
-%%Creator: G. Adam Stanislav
-%%EndComments
-%%BeginProlog
-/box {
- moveto
- 0 70 rlineto
- 280 0 rlineto
- 0 -70 rlineto
- closepath
-} bind def
-
-/bits32 {
- moveto
- 276 0 rlineto
- 0 15 rlineto
- -276 0 rlineto
- closepath
-} bind def
-
-/bits16 {
- moveto
- 137 0 rlineto
- 0 15 rlineto
- -137 0 rlineto
-} bind def
-
-/bits8 {
- moveto
- 67.5 0 rlineto
- 0 15 rlineto
- -67.5 0 rlineto
-} bind def
-
-%%EndProlog
-
-%%BeginSetup
-%%EndSetup
-
-5 7 div setcolor
-1 1 moveto
-0 34 rlineto
-278 0 rlineto
-0 -34 rlineto
-closepath
-
-1 52 moveto
-0 16 rlineto
-68.5 0 rlineto
-0 -16 rlineto
-closepath
-
-fill
-0 setcolor
-
-0 0 box
-2 2 bits32
-2 19 bits32
-2 36 bits32
-2 53 bits8
-71.5 53 bits8
-141 53 bits8
-210.5 53 bits8
-fill
-
-/Courier findfont 10 scalefont setfont
-32 72 moveto (0) show
-240 72 moveto (3) show
-171.5 72 moveto (2) show
-101.5 72 moveto (1) show
-
--10 57 moveto (0) show
--10 40 moveto (4) show
--10 23 moveto (8) show
--16 6 moveto (12) show
-
-/Helvetica-bold findfont 10 scalefont setfont
-236 57 moveto (13) show
-172 57 moveto (0) show
-102 57 moveto (2) show
-32 57 moveto (0) show
-138 40 moveto (0) show
-138 23 moveto (0) show
-138 6 moveto (0) show
-
-%%Trailer
-showpage
-%%EOF
-
diff --git a/en_US.ISO8859-1/books/developers-handbook/sockets/serv.eps b/en_US.ISO8859-1/books/developers-handbook/sockets/serv.eps
deleted file mode 100644
index 4d95eca137..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/sockets/serv.eps
+++ /dev/null
@@ -1,160 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%BoundingBox: 0 -230 255 190
-%%Creator: G. Adam Stanislav
-%%EndComments
-%%BeginProlog
-/box {
- moveto
- 0 30 rlineto
- 100 0 rlineto
- 0 -30 rlineto
- closepath
- 2 28 rmoveto
- 0 -26 rlineto
- 96 0 rlineto
- 0 26 rlineto
- closepath
- fill
-} bind def
-
-/down {
- moveto
- 0 -10 rlineto
- -5 0 rlineto
- 10 -10 rlineto
- 10 10 rlineto
- -5 0 rlineto
- 0 10 rlineto
- closepath
- fill
-} bind def
-
-/bigdown {
- moveto
- 0 -30 rlineto
- -5 0 rlineto
- 10 -10 rlineto
- 10 10 rlineto
- -5 0 rlineto
- 0 30 rlineto
- closepath
- fill
-} bind def
-
-/right {
- moveto
- 70 0 rlineto
- 0 -5 rlineto
- 10 10 rlineto
- -10 10 rlineto
- 0 -5 rlineto
- -70 0 rlineto
- closepath
- fill
-} bind def
-%%EndProlog
-
-%%BeginSetup
-/Helvetica-bold findfont 10 scalefont setfont
-%%EndSetup
-
-[5 3] 0 setdash
-115 190 moveto
-115 -230 lineto
-stroke
-
-newpath
-25 165 15 90 270 arc
-95 165 15 270 90 arc
-closepath
-25 152 moveto
-25 165 13 270 90 arcn
-95 165 13 90 270 arcn
-fill
-
-48 162 moveto (Start) show
-
-55 150 down
-
-10 100 box
-15 112 moveto (Create Top Socket) show
-
-55 100 down
-
-10 50 box
-35 62 moveto (Bind Port) show
-
-55 50 bigdown
-
-10 -20 box
-16.7 -8 moveto (Close Top Socket) show
-
-55 -20 down
-
-newpath
-25 -55 15 90 270 arc
-95 -55 15 270 90 arc
-closepath
-25 -68 moveto
-25 -55 13 270 90 arcn
-95 -55 13 90 270 arcn
-fill
-
-48 -58 moveto (Exit) show
-
-65 30 right
-
-145 20 box
-154 32 moveto (Initialize Daemon) show
-
-190 20 down
-145 -30 box
-181 -18 moveto (Listen) show
-
-190 -30 bigdown
-
-145 -100 box
-177 -88 moveto (Accept) show
-
-190 -100 down
-
-145 -150 moveto
-0 30 rlineto
-100 0 rlineto
-0 -30 rlineto
-closepath
-fill
-
-190 -150 down
-
-145 -200 box
-156 -183 moveto (Close Accepted) show
-178 -194 moveto (Socket) show
-
-190 -200 moveto
-0 -10 rlineto
--60 0 rlineto
-0 160 rlineto
-50 0 rlineto
-0 -5 rlineto
-10 10 rlineto
--10 10 rlineto
-0 -5 rlineto
--60 0 rlineto
-0 -180 rlineto
-80 0 rlineto
-0 20 rlineto
-closepath
-fill
-
-/Helvetica-bold findfont 20 scalefont setfont
-158 82 moveto (Daemon) show
-158 60 moveto (Process) show
-1 setcolor
-166 -143 moveto (Serve) show
-
-
-%%Trailer
-showpage
-%%EOF
-
diff --git a/en_US.ISO8859-1/books/developers-handbook/sockets/serv2.eps b/en_US.ISO8859-1/books/developers-handbook/sockets/serv2.eps
deleted file mode 100644
index 7bd7fa62ef..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/sockets/serv2.eps
+++ /dev/null
@@ -1,211 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%BoundingBox: 0 -305 435 190
-%%Creator: G. Adam Stanislav
-%%EndComments
-%%BeginProlog
-/box {
- moveto
- 0 30 rlineto
- 100 0 rlineto
- 0 -30 rlineto
- closepath
- 2 28 rmoveto
- 0 -26 rlineto
- 96 0 rlineto
- 0 26 rlineto
- closepath
- fill
-} bind def
-
-/down {
- moveto
- 0 -10 rlineto
- -5 0 rlineto
- 10 -10 rlineto
- 10 10 rlineto
- -5 0 rlineto
- 0 10 rlineto
- closepath
- fill
-} bind def
-
-/bigdown {
- moveto
- 0 -30 rlineto
- -5 0 rlineto
- 10 -10 rlineto
- 10 10 rlineto
- -5 0 rlineto
- 0 30 rlineto
- closepath
- fill
-} bind def
-
-/right {
- moveto
- 70 0 rlineto
- 0 -5 rlineto
- 10 10 rlineto
- -10 10 rlineto
- 0 -5 rlineto
- -70 0 rlineto
- closepath
- fill
-} bind def
-
-/process {
- moveto
- 135 0 rlineto
- 0 -245 rlineto
- -135 0 rlineto
- closepath
- gsave
- 5 7 div setcolor
- fill
- grestore
- stroke
-} bind def
-%%EndProlog
-
-%%BeginSetup
-/Helvetica-bold findfont 10 scalefont setfont
-%%EndSetup
-
-[5 3] 0 setdash
-115 190 moveto
-115 -305 lineto
-250 190 moveto
-250 -305 lineto
-stroke
-
-290 -15 process
-285 -20 process
-280 -25 process
-275 -30 process
-270 -35 process
-265 -40 process
-260 -45 process
-
-newpath
-25 165 15 90 270 arc
-95 165 15 270 90 arc
-closepath
-25 152 moveto
-25 165 13 270 90 arcn
-95 165 13 90 270 arcn
-fill
-
-48 162 moveto (Start) show
-
-55 150 down
-
-10 100 box
-15 112 moveto (Create Top Socket) show
-
-55 100 down
-
-10 50 box
-35 62 moveto (Bind Port) show
-
-55 50 bigdown
-
-10 -20 box
-16.7 -8 moveto (Close Top Socket) show
-
-55 -20 down
-
-newpath
-25 -55 15 90 270 arc
-95 -55 15 270 90 arc
-closepath
-25 -68 moveto
-25 -55 13 270 90 arcn
-95 -55 13 90 270 arcn
-fill
-
-48 -58 moveto (Exit) show
-
-65 30 right
-
-145 20 box
-154 32 moveto (Initialize Daemon) show
-
-190 20 down
-145 -30 box
-181 -18 moveto (Listen) show
-
-190 -30 bigdown
-
-145 -100 box
-177 -88 moveto (Accept) show
-
-190 -100 bigdown
-200 -120 right
-
-280 -130 box
-286.7 -118 moveto (Close Top Socket) show
-
-325 -130 down
-
-280 -180 moveto
-0 30 rlineto
-100 0 rlineto
-0 -30 rlineto
-closepath
-fill
-
-325 -180 down
-
-280 -230 box
-291 -213 moveto (Close Accepted) show
-313 -224 moveto (Socket) show
-
-325 -230 down
-
-newpath
-295 -265 15 90 270 arc
-365 -265 15 270 90 arc
-closepath
-295 -278 moveto
-295 -265 13 270 90 arcn
-365 -265 13 90 270 arcn
-fill
-
-318 -268 moveto (Exit) show
-
-145 -170 box
-156 -153 moveto (Close Accepted) show
-178 -164 moveto (Socket) show
-
-190 -170 moveto
-0 -10 rlineto
--60 0 rlineto
-0 130 rlineto
-50 0 rlineto
-0 -5 rlineto
-10 10 rlineto
--10 10 rlineto
-0 -5 rlineto
--60 0 rlineto
-0 -150 rlineto
-80 0 rlineto
-0 20 rlineto
-closepath
-fill
-
-145 -250 box
-155 -238 moveto (Process Signals) show
-
-/Helvetica-bold findfont 20 scalefont setfont
-158 82 moveto (Daemon) show
-158 60 moveto (Process) show
-293 -68 moveto (Server) show
-293 -90 moveto (Process) show
-1 setcolor
-301 -173 moveto (Serve) show
-
-
-%%Trailer
-showpage
-%%EOF
-
diff --git a/en_US.ISO8859-1/books/developers-handbook/sockets/slayers.eps b/en_US.ISO8859-1/books/developers-handbook/sockets/slayers.eps
deleted file mode 100644
index 7b0ab84346..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/sockets/slayers.eps
+++ /dev/null
@@ -1,113 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%BoundingBox: -10 -10 110 102
-%%Creator: G. Adam Stanislav
-%%EndComments
-%%BeginProlog
-%%EndProlog
-
-%%BeginSetup
-%%EndSetup
-
-% Gray area - Sockets
-5 7 div setcolor
-0 0 moveto
-0 92 rlineto
-100 0 rlineto
-0 -92 rlineto
-closepath
-
-10 54 moveto
-0 -44 rlineto
-80 0 rlineto
-0 44 rlineto
-closepath
-fill
-7 11 div setcolor
-
-% Outer layer - Ethernet
-0 0 moveto
-0 92 rlineto
-100 0 rlineto
-0 -92 rlineto
-closepath
-
-2 90 moveto
-0 -88 rlineto
-96 0 rlineto
-0 88 rlineto
-closepath
-fill
-
-% IP
-
-4 4 moveto
-0 72 rlineto
-92 0 rlineto
-0 -72 rlineto
-closepath
-stroke
-
-% TCP
-
-7 7 moveto
-0 58 rlineto
-86 0 rlineto
-0 -58 rlineto
-closepath
-stroke
-
-0 setcolor
-
-% HTTP
-
-10 10 moveto
-0 44 rlineto
-80 0 rlineto
-0 -44 rlineto
-closepath
-stroke
-
-% PNG
-
-13 13 moveto
-0 30 rlineto
-74 0 rlineto
-0 -30 rlineto
-closepath
-stroke
-
-% Data
-
-16 16 moveto
-0 16.5 rlineto
-68 0 rlineto
-0 -16.5 rlineto
-closepath
-fill
-
-/Courier findfont 10 scalefont setfont
-7 11 div setcolor
-
-26 81 moveto
-(Ethernet) show
-
-43 68 moveto
-(IP) show
-
-40 57 moveto
-(TCP) show
-
-0 setcolor
-37 46 moveto
-(HTTP) show
-
-39.6 35 moveto
-(PNG) show
-
-1 setcolor
-28 22 moveto
-(D A T A) show
-%%Trailer
-showpage
-%%EOF
-
diff --git a/en_US.ISO8859-1/books/developers-handbook/sysinit/chapter.sgml b/en_US.ISO8859-1/books/developers-handbook/sysinit/chapter.sgml
deleted file mode 100644
index 468e739d12..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/sysinit/chapter.sgml
+++ /dev/null
@@ -1,161 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD: $
--->
-
-<chapter id="sysinit">
- <title>The Sysinit Framework</title>
-
- <para>Sysinit is the framework for a generic call sort and dispatch
- mechanisim. FreeBSD currently uses it for the dynamic
- initialization of the kernel. Sysinit allows FreeBSD's kernel
- subsystems to be reordered, and added, removed, and replaced at
- kernel link time when the kernel or one of its modules is loaded
- without having to edit a staticly ordered initilization routing
- and recompile the kernel. This system also allows kernel modules,
- currently called <firstterm>KLD's</firstterm>, to be seperatly
- compiled, linked, and initilized at boot time and loaded even
- later while the system is already running. This is accomplished
- using the <quote>kernel linker</quote> and <quote>linker
- sets</quote>.</para>
-
- <sect1>
- <title>Terminology</title>
-
- <variablelist>
- <varlistentry>
- <term>Linker Set</term>
- <listitem>
- <para>A linker technique in which the linker gathers
- staticly declared data throughout a program's source files
- into a single contagiously addressable unit of
- data.</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect1>
-
- <sect1>
- <title>Sysinit Operation</title>
-
- <para>Sysinit relies on the ability of the linker to take static
- data declared at multiple locations throughout a program's
- source and group it together as a single contagious chunk of
- data. This linker technique is called a <quote>linker
- set</quote>. Sysinit uses two linker sets to maintain two data
- sets containing each consumer's call order, function, and a
- pointer to the data to pass to taht function.</para>
-
- <para>Sysinit uses two priorites when ordering the functions for
- execution. The first priority is a subsystem ID giving an
- overall order Sysinit's dispatch of funtions. Current predeclard
- ID's are in <filename>&lt;sys/kernel.h></filename> in the enum
- list <literal>sysinit_sub_id</literal>. The second priority used
- is an element order within the subsystem. Current predeclard
- subsystem element orders are in
- <filename>&lt;sys/kernel.h></filename> in the enum list
- <literal>sysinit_elem_order</literal>.</para>
-
- <para>There are currently two uses for Sysinit. Function dispatch
- at system startup and kernel module loads, and function dispatch
- at system shutdown and kernel module unload.</para>
- </sect1>
-
-
- <sect1>
- <title>Using Sysinit</title>
-
- <sect2>
- <title>Interface</title>
-
- <sect3>
- <title>Headers</title>
-
- <programlisting>&lt;sys/kernel.h></programlisting>
- </sect3>
-
- <sect3>
- <title>Macros</title>
-
- <programlisting>SYSINIT(uniquifier, subsystem, order, func, ident)
- SYSUNINIT(uniquifier, subsystem, order, func, ident)</programlisting>
- </sect3>
- </sect2>
-
- <sect2>
- <title>Startup</title>
-
- <para>The <literal>SYSINIT()</literal> macro creates the
- necessary sysinit data in Sysinit's startup data set for
- Sysinit to sort and dispatch a function at system startup and
- module load. <literal>SYSINIT()</literal> takes a uniquifier
- that Sysinit uses identify the particular function dispatch
- data, the subsystem order, the subsystem element order, the
- function to call, and the data to pass the fuction. All
- functions must take a constant pointer argument.
- </para>
-
- <para>For example:</para>
-
- <programlisting>#include &lt;sys/kernel.h>
-
-void foo_null(void *unused)
-{
- foo_doo();
-}
-SYSINIT(foo_null, SI_SUB_FOO, SI_ORDER_FOO, NULL);
-
-struct foo foo_voodoo = {
- FOO_VOODOO;
-}
-
-void foo_arg(void *vdata)
-{
- struct foo *foo = (struct foo *)vdata;
- foo_data(foo);
-}
-SYSINIT(foo_arg, SI_SUB_FOO, SI_ORDER_FOO, foo_voodoo);
- </programlisting>
- </sect2>
-
- <sect2>
- <title>Shutdown</title>
-
- <para>The <literal>SYSUNINIT()</literal> macro behaves similarly
- to the <literal>SYSINIT()</literal> macro except that it adds
- the Sysinit data to Sysinit's shutdown data set.</para>
-
- <para>For example:</para>
-
- <programlisting>#include &lt;sys/kernel.h>
-
-void foo_cleanup(void *unused)
-{
- foo_kill();
-}
-SYSUNINIT(foo_cleanup, SI_SUB_FOO, SI_ORDER_FOO, NULL);
-
-struct foo_stack foo_stack = {
- FOO_STACK_VOODOO;
-}
-
-void foo_flush(void *vdata)
-{
-}
-SYSUNINIT(foo_flush, SI_SUB_FOO, SI_ORDER_FOO, foo_stack);
- </programlisting>
- </sect2>
- </sect1>
-</chapter>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-declaration: "../chapter.decl"
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- sgml-parent-document: ("../book.sgml" "part" "chapter")
- End:
--->
diff --git a/en_US.ISO8859-1/books/developers-handbook/tools/chapter.sgml b/en_US.ISO8859-1/books/developers-handbook/tools/chapter.sgml
deleted file mode 100644
index a939990c47..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/tools/chapter.sgml
+++ /dev/null
@@ -1,2298 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD: doc/en_US.ISO8859-1/books/developers-handbook/tools/chapter.sgml,v 1.9 2001/07/25 14:37:51 asmodai Exp $
--->
-
- <chapter id="tools">
- <title>Programming Tools</title>
-
- <para><emphasis>This chapter was written by &a.jraynard;.
- Modifications for the Developers' Handbook by &a.murray;.
- </emphasis></para>
-
- <sect1><title>Synopsis</title>
-
- <para>This document is an introduction to using some of the
- programming tools supplied with FreeBSD, although much of it
- will be applicable to many other versions of Unix. It does
- <emphasis>not</emphasis> attempt to describe coding in any
- detail. Most of the document assumes little or no previous
- programming knowledge, although it is hoped that most
- programmers will find something of value in it.</para>
-
- </sect1>
-
- <sect1><title>Introduction</title>
-
- <para>FreeBSD offers an excellent development environment.
- Compilers for C, C++, and Fortran and an assembler come with the
- basic system, not to mention a Perl interpreter and classic Unix
- tools such as <command>sed</command> and <command>awk</command>.
- If that is not enough, there are many more compilers and
- interpreters in the Ports collection. FreeBSD is very
- compatible with standards such as <acronym>POSIX</acronym> and
- <acronym>ANSI</acronym> C, as well with its own BSD heritage, so
- it is possible to write applications that will compile and run
- with little or no modification on a wide range of
- platforms.</para>
-
- <para>However, all this power can be rather overwhelming at
- first if you've never written programs on a Unix platform
- before. This document aims to help you get up and running,
- without getting too deeply into more advanced topics. The
- intention is that this document should give you enough of the
- basics to be able to make some sense of the
- documentation.</para>
-
- <para>Most of the document requires little or no knowledge of
- programming, although it does assume a basic competence with
- using Unix and a willingness to learn!</para>
-
- </sect1>
-
- <sect1>
- <title>Introduction to Programming</title>
-
- <para>A program is a set of instructions that tell the computer
- to do various things; sometimes the instruction it has to
- perform depends on what happened when it performed a previous
- instruction. This section gives an overview of the two main
- ways in which you can give these instructions, or
- <quote>commands</quote> as they are usually called. One way
- uses an <firstterm>interpreter</firstterm>, the other a
- <firstterm>compiler</firstterm>. As human languages are too
- difficult for a computer to understand in an unambiguous way,
- commands are usually written in one or other languages specially
- designed for the purpose.</para>
-
- <sect2>
- <title>Interpreters</title>
-
- <para>With an interpreter, the language comes as an environment,
- where you type in commands at a prompt and the environment
- executes them for you. For more complicated programs, you can
- type the commands into a file and get the interpreter to load
- the file and execute the commands in it. If anything goes
- wrong, many interpreters will drop you into a debugger to help
- you track down the problem.</para>
-
- <para>The advantage of this is that you can see the results of
- your commands immediately, and mistakes can be corrected
- readily. The biggest disadvantage comes when you want to
- share your programs with someone. They must have the same
- interpreter, or you must have some way of giving it to them,
- and they need to understand how to use it. Also users may not
- appreciate being thrown into a debugger if they press the
- wrong key! From a performance point of view, interpreters can
- use up a lot of memory, and generally do not generate code as
- efficiently as compilers.</para>
-
- <para>In my opinion, interpreted languages are the best way to
- start if you have not done any programming before. This kind
- of environment is typically found with languages like Lisp,
- Smalltalk, Perl and Basic. It could also be argued that the
- Unix shell (<command>sh</command>, <command>csh</command>) is itself an
- interpreter, and many people do in fact write shell
- <quote>scripts</quote> to help with various
- <quote>housekeeping</quote> tasks on their machine. Indeed, part
- of the original Unix philosophy was to provide lots of small
- utility programs that could be linked together in shell
- scripts to perform useful tasks.</para>
- </sect2>
-
- <sect2>
- <title>Interpreters available with FreeBSD</title>
-
- <para>Here is a list of interpreters that are available as
- <ulink
- URL="ftp://ftp.FreeBSD.org:pub/FreeBSD/packages/">FreeBSD
- packages</ulink>, with a brief discussion of some of the
- more popular interpreted languages.</para>
-
- <para>To get one of these packages, all you need to do is to
- click on the hotlink for the package, then run</para>
-
- <screen>&prompt.root; <userinput>pkg_add <replaceable>package name</></userinput></screen>
-
- <para>as root. Obviously, you will need to have a fully
- functional FreeBSD 2.1.0 or later system for the package to
- work!</para>
-
- <variablelist>
- <varlistentry>
- <term><acronym>BASIC</acronym></term>
-
- <listitem>
- <para>Short for Beginner's All-purpose Symbolic
- Instruction Code. Developed in the 1950s for teaching
- University students to program and provided with every
- self-respecting personal computer in the 1980s,
- <acronym>BASIC</acronym> has been the first programming
- language for many programmers. It's also the foundation
- for Visual Basic.</para>
-
- <para>The <ulink
- URL="ftp://ftp.FreeBSD.org:pub/FreeBSD/packages/lang/bwbasic-2.10.tgz">Bywater
- Basic Interpreter</ulink> and the <ulink
- URL="ftp://ftp.FreeBSD.org:pub/FreeBSD/packages/lang/pbasic-2.0.tgz">Phil
- Cockroft's Basic Interpreter</ulink> (formerly Rabbit
- Basic) are available as <ulink
- URL="ftp://ftp.FreeBSD.org:pub/FreeBSD/packages/">FreeBSD
- packages</ulink>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Lisp</term>
-
- <listitem>
- <para>A language that was developed in the late 1950s as
- an alternative to the <quote>number-crunching</quote>
- languages that were popular at the time. Instead of
- being based on numbers, Lisp is based on lists; in fact
- the name is short for <quote>List Processing</quote>.
- Very popular in AI (Artificial Intelligence)
- circles.</para>
-
- <para>Lisp is an extremely powerful and sophisticated
- language, but can be rather large and unwieldy.</para>
-
- <para>FreeBSD has <ulink
- URL="ftp://ftp.FreeBSD.org:pub/FreeBSD/packages/gcl-2.0.tgz">GNU
- Common Lisp</ulink> available as a package.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Perl</term>
-
- <listitem>
- <para>Very popular with system administrators for writing
- scripts; also often used on World Wide Web servers for
- writing <acronym>CGI</acronym> scripts.</para>
-
- <para>The latest version (version 5) comes with FreeBSD.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Scheme</term>
-
- <listitem>
- <para>A dialect of Lisp that is rather more compact and
- cleaner than Common Lisp. Popular in Universities as it
- is simple enough to teach to undergraduates as a first
- language, while it has a high enough level of
- abstraction to be used in research work.</para>
-
- <para>FreeBSD has packages of the <ulink
- URL="ftp://ftp.FreeBSD.org:pub/FreeBSD/packages/lang/elk-3.0.tgz">Elk
- Scheme Interpreter</ulink>, the <ulink
- URL="ftp://ftp.FreeBSD.org:pub/FreeBSD/packages/lang/mit-scheme-7.3.tgz">MIT
- Scheme Interpreter</ulink> and the <ulink
- URL="ftp://ftp.FreeBSD.org:pub/FreeBSD/packages/lang/scm-4e1.tgz">SCM
- Scheme Interpreter</ulink>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Icon</term>
-
- <listitem>
- <para><ulink
- URL="ftp://ftp.FreeBSD.org:pub/FreeBSD/packages/lang/icon-9.0.tgz">The
- Icon Programming Language</ulink>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Logo</term>
-
- <listitem>
- <para><ulink
- URL="ftp://ftp.FreeBSD.org:pub/FreeBSD/packages/lang/ucblogo-3.3.tgz">Brian
- Harvey's LOGO Interpreter</ulink>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Python</term>
-
- <listitem>
- <para><ulink
- URL="ftp://ftp.FreeBSD.org:pub/FreeBSD/packages/lang/python-1.2">The
- Python Object-Oriented Programming
- Language</ulink></para>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect2>
-
- <sect2>
- <title>Compilers</title>
-
- <para>Compilers are rather different. First of all, you write
- your code in a file (or files) using an editor. You then run
- the compiler and see if it accepts your program. If it did
- not compile, grit your teeth and go back to the editor; if it
- did compile and gave you a program, you can run it either at a
- shell command prompt or in a debugger to see if it works
- properly.
-
- <footnote>
- <para>If you run it in the shell, you may get a core
- dump.</para>
- </footnote></para>
-
- <para>Obviously, this is not quite as direct as using an
- interpreter. However it allows you to do a lot of things
- which are very difficult or even impossible with an
- interpreter, such as writing code which interacts closely with
- the operating system&mdash;or even writing your own operating
- system! It's also useful if you need to write very efficient
- code, as the compiler can take its time and optimise the code,
- which would not be acceptable in an interpreter. And
- distributing a program written for a compiler is usually more
- straightforward than one written for an interpreter&mdash;you
- can just give them a copy of the executable, assuming they
- have the same operating system as you.</para>
-
- <para>Compiled languages include Pascal, C and C++. C and C++
- are rather unforgiving languages, and best suited to more
- experienced programmers; Pascal, on the other hand, was
- designed as an educational language, and is quite a good
- language to start with. FreeBSD doesn't include Pascal
- support in the base system, but the GNU Pascal Compiler (gpc)
- is available in the ports collection.</para>
-
- <para>As the edit-compile-run-debug cycle is rather tedious when
- using separate programs, many commercial compiler makers have
- produced Integrated Development Environments
- (<acronym>IDE</acronym>s for short). FreeBSD does not include
- an IDE in the base system, but <port>devel/kdevelop</port> is
- available in the ports tree and many use
- <application>Emacs</application> for this purpose. Using
- <application>Emacs</application> as an IDE is discussed in
- <xref linkend="emacs">.</para>
- </sect2>
-
-
- </sect1>
-
-
- <sect1>
- <title>Compiling with <command>cc</command></title>
-
- <para>This section deals only with the GNU compiler for C and C++,
- since that comes with the base FreeBSD system. It can be
- invoked by either <command>cc</command> or <command>gcc</command>. The
- details of producing a program with an interpreter vary
- considerably between interpreters, and are usually well covered
- in the documentation and on-line help for the
- interpreter.</para>
-
- <para>Once you've written your masterpiece, the next step is to
- convert it into something that will (hopefully!) run on FreeBSD.
- This usually involves several steps, each of which is done by a
- separate program.</para>
-
- <procedure>
- <step>
- <para>Pre-process your source code to remove comments and do
- other tricks like expanding macros in C.</para>
- </step>
-
- <step>
- <para>Check the syntax of your code to see if you have obeyed
- the rules of the language. If you have not, it will
- complain!</para>
- </step>
-
- <step>
- <para>Convert the source code into assembly
- language&mdash;this is very close to machine code, but still
- understandable by humans. Allegedly.
-
- <footnote>
- <para>To be strictly accurate, <command>cc</command> converts the
- source code into its own, machine-independent
- <firstterm>p-code</firstterm> instead of assembly language at
- this stage.</para>
- </footnote></para>
- </step>
-
- <step>
- <para>Convert the assembly language into machine
- code&mdash;yep, we are talking bits and bytes, ones and
- zeros here.</para>
- </step>
-
- <step>
- <para>Check that you have used things like functions and
- global variables in a consistent way. For example, if you
- have called a non-existent function, it will
- complain.</para>
- </step>
-
- <step>
- <para>If you are trying to produce an executable from several
- source code files, work out how to fit them all
- together.</para>
- </step>
-
- <step>
- <para>Work out how to produce something that the system's
- run-time loader will be able to load into memory and
- run.</para>
- </step>
-
- <step>
- <para>Finally, write the executable on the file system.</para>
- </step>
- </procedure>
-
- <para>The word <firstterm>compiling</firstterm> is often used to refer to
- just steps 1 to 4&mdash;the others are referred to as
- <firstterm>linking</firstterm>. Sometimes step 1 is referred to as
- <firstterm>pre-processing</firstterm> and steps 3-4 as
- <firstterm>assembling</firstterm>.</para>
-
- <para>Fortunately, almost all this detail is hidden from you, as
- <command>cc</command> is a front end that manages calling all these
- programs with the right arguments for you; simply typing</para>
-
- <screen>&prompt.user; <userinput>cc foobar.c</></screen>
-
- <para>will cause <filename>foobar.c</filename> to be compiled by all the
- steps above. If you have more than one file to compile, just do
- something like</para>
-
- <screen>&prompt.user; <userinput>cc foo.c bar.c</></screen>
-
- <para>Note that the syntax checking is just that&mdash;checking
- the syntax. It will not check for any logical mistakes you may
- have made, like putting the program into an infinite loop, or
- using a bubble sort when you meant to use a binary
- sort.
-
- <footnote>
- <para>In case you didn't know, a binary sort is an efficient
- way of sorting things into order and a bubble sort
- isn't.</para>
- </footnote></para>
-
- <para>There are lots and lots of options for <command>cc</command>, which
- are all in the man page. Here are a few of the most important
- ones, with examples of how to use them.</para>
-
- <variablelist>
- <varlistentry>
- <term><option>-o <replaceable>filename</replaceable></option></term>
-
- <listitem>
- <para>The output name of the file. If you do not use this
- option, <command>cc</command> will produce an executable called
- <filename>a.out</filename>.
-
- <footnote>
- <para>The reasons for this are buried in the mists of
- history.</para>
- </footnote></para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>cc foobar.c</> <lineannotation>executable is <filename>a.out</></>
-&prompt.user; <userinput>cc -o foobar foobar.c</> <lineannotation>executable is <filename>foobar</></>
- </screen>
- </informalexample>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-c</option></term>
-
- <listitem>
- <para>Just compile the file, do not link it. Useful for toy
- programs where you just want to check the syntax, or if
- you are using a <filename>Makefile</filename>.</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>cc -c foobar.c</userinput>
- </screen>
- </informalexample>
-
- <para>This will produce an <firstterm>object file</firstterm> (not an
- executable) called <filename>foobar.o</filename>. This
- can be linked together with other object files into an
- executable.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-g</option></term>
-
- <listitem>
- <para>Create a debug version of the executable. This makes
- the compiler put information into the executable about
- which line of which source file corresponds to which
- function call. A debugger can use this information to show
- the source code as you step through the program, which is
- <emphasis>very</emphasis> useful; the disadvantage is that
- all this extra information makes the program much bigger.
- Normally, you compile with <option>-g</option> while you
- are developing a program and then compile a <quote>release
- version</quote> without <option>-g</option> when you're
- satisfied it works properly.</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>cc -g foobar.c</userinput>
- </screen>
- </informalexample>
-
- <para>This will produce a debug version of the
- program.
-
- <footnote>
- <para>Note, we didn't use the <option>-o</option> flag
- to specify the executable name, so we will get an
- executable called <filename>a.out</filename>.
- Producing a debug version called
- <filename>foobar</filename> is left as an exercise for
- the reader!</para>
- </footnote></para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-O</option></term>
-
- <listitem>
- <para>Create an optimised version of the executable. The
- compiler performs various clever tricks to try and produce
- an executable that runs faster than normal. You can add a
- number after the <option>-O</option> to specify a higher
- level of optimisation, but this often exposes bugs in the
- compiler's optimiser. For instance, the version of
- <command>cc</command> that comes with the 2.1.0 release of
- FreeBSD is known to produce bad code with the
- <option>-O2</option> option in some circumstances.</para>
-
- <para>Optimisation is usually only turned on when compiling
- a release version.</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>cc -O -o foobar foobar.c</userinput>
- </screen>
- </informalexample>
-
- <para>This will produce an optimised version of
- <filename>foobar</filename>.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>The following three flags will force <command>cc</command>
- to check that your code complies to the relevant international
- standard, often referred to as the <acronym>ANSI</acronym>
- standard, though strictly speaking it is an
- <acronym>ISO</acronym> standard.</para>
-
- <variablelist>
- <varlistentry>
- <term><option>-Wall</option></term>
-
- <listitem>
- <para>Enable all the warnings which the authors of
- <command>cc</command> believe are worthwhile. Despite the
- name, it will not enable all the warnings
- <command>cc</command> is capable of.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-ansi</option></term>
-
- <listitem>
- <para>Turn off most, but not all, of the
- non-<acronym>ANSI</acronym>&nbsp;C features provided by
- <command>cc</command>. Despite the name, it does not
- guarantee strictly that your code will comply to the
- standard.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><option>-pedantic</option></term>
-
- <listitem>
- <para>Turn off <emphasis>all</emphasis>
- <command>cc</command>'s non-<acronym>ANSI</acronym>&nbsp;C
- features.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>Without these flags, <command>cc</command> will allow you to
- use some of its non-standard extensions to the standard. Some
- of these are very useful, but will not work with other
- compilers&mdash;in fact, one of the main aims of the standard is
- to allow people to write code that will work with any compiler
- on any system. This is known as <firstterm>portable
- code</firstterm>.</para>
-
- <para>Generally, you should try to make your code as portable as
- possible, as otherwise you may have to completely re-write the
- program later to get it to work somewhere else&mdash;and who
- knows what you may be using in a few years time?</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>cc -Wall -ansi -pedantic -o foobar foobar.c</userinput></screen>
- </informalexample>
-
- <para>This will produce an executable <filename>foobar</filename>
- after checking <filename>foobar.c</filename> for standard
- compliance.</para>
-
- <variablelist>
- <varlistentry>
- <term><option>-l<replaceable>library</replaceable></option></term>
-
- <listitem>
- <para>Specify a function library to be used during when
- linking.</para>
-
- <para>The most common example of this is when compiling a
- program that uses some of the mathematical functions in C.
- Unlike most other platforms, these are in a separate
- library from the standard C one and you have to tell the
- compiler to add it.</para>
-
- <para>The rule is that if the library is called
- <filename>lib<replaceable>something</replaceable>.a</filename>,
- you give <command>cc</command> the argument
- <option>-l<replaceable>something</replaceable></option>.
- For example, the math library is
- <filename>libm.a</filename>, so you give
- <command>cc</command> the argument <option>-lm</option>.
- A common <quote>gotcha</quote> with the math library is
- that it has to be the last library on the command
- line.</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>cc -o foobar foobar.c -lm</userinput>
- </screen>
- </informalexample>
-
- <para>This will link the math library functions into
- <filename>foobar</filename>.</para>
-
- <para>If you are compiling C++ code, you need to add
- <option>-lg++</option>, or <option>-lstdc++</option> if
- you are using FreeBSD 2.2 or later, to the command line
- argument to link the C++ library functions.
- Alternatively, you can run <command>c++</command> instead
- of <command>cc</command>, which does this for you.
- <command>c++</command> can also be invoked as
- <command>g++</command> on FreeBSD.</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>cc -o foobar foobar.cc -lg++</userinput> <lineannotation>For FreeBSD 2.1.6 and earlier</>
-&prompt.user; <userinput>cc -o foobar foobar.cc -lstdc++</userinput> <lineannotation>For FreeBSD 2.2 and later</>
-&prompt.user; <userinput>c++ -o foobar foobar.cc</userinput>
- </screen>
- </informalexample>
-
- <para>Each of these will both produce an executable
- <filename>foobar</filename> from the C++ source file
- <filename>foobar.cc</filename>. Note that, on Unix
- systems, C++ source files traditionally end in
- <filename>.C</filename>, <filename>.cxx</filename> or
- <filename>.cc</filename>, rather than the
- MS-DOS style
- <filename>.cpp</filename> (which was already used for
- something else). <command>gcc</command> used to rely on
- this to work out what kind of compiler to use on the
- source file; however, this restriction no longer applies,
- so you may now call your C++ files
- <filename>.cpp</filename> with impunity!</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <sect2>
- <title>Common <command>cc</command> Queries and Problems</title>
-
- <qandaset>
- <qandaentry>
- <question>
- <para>I am trying to write a program which uses the
- <function>sin()</function> function and I get an error
- like this. What does it mean?</para>
-
- <informalexample>
- <screen>/var/tmp/cc0143941.o: Undefined symbol `_sin' referenced from text segment
- </screen>
- </informalexample>
- </question>
-
- <answer>
- <para>When using mathematical functions like
- <function>sin()</function>, you have to tell
- <command>cc</command> to link in the math library, like
- so:</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>cc -o foobar foobar.c -lm</userinput>
- </screen>
- </informalexample>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>All right, I wrote this simple program to practice
- using <option>-lm</option>. All it does is raise 2.1 to
- the power of 6.</para>
-
- <informalexample>
- <programlisting>#include &lt;stdio.h&gt;
-
-int main() {
- float f;
-
- f = pow(2.1, 6);
- printf("2.1 ^ 6 = %f\n", f);
- return 0;
-}
- </programlisting>
- </informalexample>
-
- <para>and I compiled it as:</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>cc temp.c -lm</userinput>
- </screen>
- </informalexample>
-
- <para>like you said I should, but I get this when I run
- it:</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>./a.out</userinput>
-2.1 ^ 6 = 1023.000000
- </screen>
- </informalexample>
-
- <para>This is <emphasis>not</emphasis> the right answer!
- What is going on?</para>
- </question>
-
- <answer>
- <para>When the compiler sees you call a function, it
- checks if it has already seen a prototype for it. If it
- has not, it assumes the function returns an
- <type>int</type>, which is definitely not what you want
- here.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>So how do I fix this?</para>
- </question>
-
- <answer>
- <para>The prototypes for the mathematical functions are in
- <filename>math.h</filename>. If you include this file,
- the compiler will be able to find the prototype and it
- will stop doing strange things to your
- calculation!</para>
-
- <informalexample>
- <programlisting>#include &lt;math.h&gt;
-#include &lt;stdio.h&gt;
-
-int main() {
-...
- </programlisting>
- </informalexample>
-
- <para>After recompiling it as you did before, run
- it:</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>./a.out</userinput>
-2.1 ^ 6 = 85.766121
- </screen>
- </informalexample>
-
- <para>If you are using any of the mathematical functions,
- <emphasis>always</emphasis> include
- <filename>math.h</filename> and remember to link in the
- math library.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>I compiled a file called
- <filename>foobar.c</filename> and I cannot find an
- executable called <filename>foobar</filename>. Where's
- it gone?</para>
- </question>
-
- <answer>
- <para>Remember, <command>cc</command> will call the
- executable <filename>a.out</filename> unless you tell it
- differently. Use the
- <option>-o&nbsp;<replaceable>filename</replaceable></option>
- option:</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>cc -o foobar foobar.c</userinput>
- </screen>
- </informalexample>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>OK, I have an executable called
- <filename>foobar</filename>, I can see it when I run
- <command>ls</command>, but when I type in
- <command>foobar</command> at the command prompt it tells
- me there is no such file. Why can it not find
- it?</para>
- </question>
-
- <answer>
- <para>Unlike MS-DOS, Unix does not
- look in the current directory when it is trying to find
- out which executable you want it to run, unless you tell
- it to. Either type <command>./foobar</command>, which
- means <quote>run the file called
- <filename>foobar</filename> in the current
- directory</quote>, or change your <envar>PATH</envar>
- environment
- variable so that it looks something like</para>
-
- <informalexample>
- <screen>bin:/usr/bin:/usr/local/bin:.
- </screen>
- </informalexample>
-
- <para>The dot at the end means <quote>look in the current
- directory if it is not in any of the
- others</quote>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>I called my executable <filename>test</filename>,
- but nothing happens when I run it. What is going
- on?</para>
- </question>
-
- <answer>
- <para>Most Unix systems have a program called
- <command>test</command> in <filename>/usr/bin</filename>
- and the shell is picking that one up before it gets to
- checking the current directory. Either type:</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>./test</userinput>
- </screen>
- </informalexample>
-
- <para>or choose a better name for your program!</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>I compiled my program and it seemed to run all right
- at first, then there was an error and it said something
- about <errorname>core dumped</errorname>. What does that
- mean?</para>
- </question>
-
- <answer>
- <para>The name <firstterm>core dump</firstterm> dates back
- to the very early days of Unix, when the machines used
- core memory for storing data. Basically, if the program
- failed under certain conditions, the system would write
- the contents of core memory to disk in a file called
- <filename>core</filename>, which the programmer could
- then pore over to find out what went wrong.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>Fascinating stuff, but what I am supposed to do
- now?</para>
- </question>
-
- <answer>
- <para>Use <command>gdb</command> to analyse the core (see
- <xref linkend="debugging">).</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>When my program dumped core, it said something about
- a <errorname>segmentation fault</errorname>. What's
- that?</para>
- </question>
-
- <answer>
- <para>This basically means that your program tried to
- perform some sort of illegal operation on memory; Unix
- is designed to protect the operating system and other
- programs from rogue programs.</para>
-
- <para>Common causes for this are:</para>
-
- <itemizedlist>
- <listitem>
- <para>Trying to write to a <symbol>NULL</symbol>
- pointer, eg</para>
-
- <programlisting>char *foo = NULL;
-strcpy(foo, "bang!");
- </programlisting>
- </listitem>
-
- <listitem>
- <para>Using a pointer that hasn't been initialised,
- eg</para>
-
- <programlisting>char *foo;
-strcpy(foo, "bang!");
- </programlisting>
-
- <para>The pointer will have some random value that,
- with luck, will point into an area of memory that
- isn't available to your program and the kernel will
- kill your program before it can do any damage. If
- you're unlucky, it'll point somewhere inside your
- own program and corrupt one of your data structures,
- causing the program to fail mysteriously.</para>
- </listitem>
-
- <listitem>
- <para>Trying to access past the end of an array,
- eg</para>
-
- <programlisting>int bar[20];
-bar[27] = 6;
- </programlisting>
- </listitem>
-
- <listitem>
- <para>Trying to store something in read-only memory,
- eg</para>
-
- <programlisting>char *foo = "My string";
-strcpy(foo, "bang!");
- </programlisting>
-
- <para>Unix compilers often put string literals like
- <literal>"My string"</literal> into read-only areas
- of memory.</para>
- </listitem>
-
- <listitem>
- <para>Doing naughty things with
- <function>malloc()</function> and
- <function>free()</function>, eg</para>
-
- <programlisting>char bar[80];
-free(bar);
- </programlisting>
-
- <para>or</para>
-
- <programlisting>char *foo = malloc(27);
-free(foo);
-free(foo);
- </programlisting>
- </listitem>
- </itemizedlist>
-
- <para>Making one of these mistakes will not always lead to
- an error, but they are always bad practice. Some
- systems and compilers are more tolerant than others,
- which is why programs that ran well on one system can
- crash when you try them on an another.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>Sometimes when I get a core dump it says
- <errorname>bus error</errorname>. It says in my Unix
- book that this means a hardware problem, but the
- computer still seems to be working. Is this
- true?</para>
- </question>
-
- <answer>
- <para>No, fortunately not (unless of course you really do
- have a hardware problem&hellip;). This is usually
- another way of saying that you accessed memory in a way
- you shouldn't have.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>This dumping core business sounds as though it could
- be quite useful, if I can make it happen when I want to.
- Can I do this, or do I have to wait until there's an
- error?</para>
- </question>
-
- <answer>
- <para>Yes, just go to another console or xterm, do</para>
-
- <screen>&prompt.user; <userinput>ps</userinput>
- </screen>
-
- <para>to find out the process ID of your program, and
- do</para>
-
- <screen>&prompt.user; <userinput>kill -ABRT <replaceable>pid</replaceable></userinput>
- </screen>
-
- <para>where
- <parameter><replaceable>pid</replaceable></parameter> is
- the process ID you looked up.</para>
-
- <para>This is useful if your program has got stuck in an
- infinite loop, for instance. If your program happens to
- trap <symbol>SIGABRT</symbol>, there are several other
- signals which have a similar effect.</para>
-
- <para>Alternatively, you can create a core dump from
- inside your program, by calling the
- <function>abort()</function> function. See the man page
- of &man.abort.3; to learn more.</para>
-
- <para>If you want to create a core dump from outside your
- program, but don't want the process to terminate, you
- can use the <command>gcore</command> program. See the
- man page of &man.gcore.1 for more information.</para>
-
- </answer>
- </qandaentry>
- </qandaset>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Make</title>
-
- <sect2>
- <title>What is <command>make</command>?</title>
-
- <para>When you're working on a simple program with only one or
- two source files, typing in</para>
-
- <screen>&prompt.user; <userinput>cc file1.c file2.c</userinput></screen>
-
- <para>is not too bad, but it quickly becomes very tedious when
- there are several files&mdash;and it can take a while to
- compile, too.</para>
-
- <para>One way to get around this is to use object files and only
- recompile the source file if the source code has changed. So
- we could have something like:</para>
-
- <screen>&prompt.user; <userinput>cc file1.o file2.o</userinput> &hellip; <userinput>file37.c</userinput> &hellip</screen>
-
- <para>if we'd changed <filename>file37.c</filename>, but not any
- of the others, since the last time we compiled. This may
- speed up the compilation quite a bit, but doesn't solve the
- typing problem.</para>
-
- <para>Or we could write a shell script to solve the typing
- problem, but it would have to re-compile everything, making it
- very inefficient on a large project.</para>
-
- <para>What happens if we have hundreds of source files lying
- about? What if we're working in a team with other people who
- forget to tell us when they've changed one of their source
- files that we use?</para>
-
- <para>Perhaps we could put the two solutions together and write
- something like a shell script that would contain some kind of
- magic rule saying when a source file needs compiling. Now all
- we need now is a program that can understand these rules, as
- it's a bit too complicated for the shell.</para>
-
- <para>This program is called <command>make</command>. It reads
- in a file, called a <firstterm>makefile</firstterm>, that
- tells it how different files depend on each other, and works
- out which files need to be re-compiled and which ones don't.
- For example, a rule could say something like <quote>if
- <filename>fromboz.o</filename> is older than
- <filename>fromboz.c</filename>, that means someone must have
- changed <filename>fromboz.c</filename>, so it needs to be
- re-compiled.</quote> The makefile also has rules telling
- make <emphasis>how</emphasis> to re-compile the source file,
- making it a much more powerful tool.</para>
-
- <para>Makefiles are typically kept in the same directory as the
- source they apply to, and can be called
- <filename>makefile</filename>, <filename>Makefile</filename>
- or <filename>MAKEFILE</filename>. Most programmers use the
- name <filename>Makefile</filename>, as this puts it near the
- top of a directory listing, where it can easily be
- seen.
-
- <footnote>
- <para>They don't use the <filename>MAKEFILE</filename> form
- as block capitals are often used for documentation files
- like <filename>README</filename>.</para>
- </footnote></para>
- </sect2>
-
- <sect2>
- <title>Example of using <command>make</command></title>
-
- <para>Here's a very simple make file:</para>
-
- <programlisting>foo: foo.c
- cc -o foo foo.c</programlisting>
-
- <para>It consists of two lines, a dependency line and a creation
- line.</para>
-
- <para>The dependency line here consists of the name of the
- program (known as the <firstterm>target</firstterm>), followed
- by a colon, then whitespace, then the name of the source file.
- When <command>make</command> reads this line, it looks to see
- if <filename>foo</filename> exists; if it exists, it compares
- the time <filename>foo</filename> was last modified to the
- time <filename>foo.c</filename> was last modified. If
- <filename>foo</filename> does not exist, or is older than
- <filename>foo.c</filename>, it then looks at the creation line
- to find out what to do. In other words, this is the rule for
- working out when <filename>foo.c</filename> needs to be
- re-compiled.</para>
-
- <para>The creation line starts with a <token>tab</token> (press
- the <keycap>tab</keycap> key) and then the command you would
- type to create <filename>foo</filename> if you were doing it
- at a command prompt. If <filename>foo</filename> is out of
- date, or does not exist, <command>make</command> then executes
- this command to create it. In other words, this is the rule
- which tells make how to re-compile
- <filename>foo.c</filename>.</para>
-
- <para>So, when you type <userinput>make</userinput>, it will
- make sure that <filename>foo</filename> is up to date with
- respect to your latest changes to <filename>foo.c</filename>.
- This principle can be extended to
- <filename>Makefile</filename>s with hundreds of
- targets&mdash;in fact, on FreeBSD, it is possible to compile
- the entire operating system just by typing <userinput>make
- world</userinput> in the appropriate directory!</para>
-
- <para>Another useful property of makefiles is that the targets
- don't have to be programs. For instance, we could have a make
- file that looks like this:</para>
-
- <programlisting>foo: foo.c
- cc -o foo foo.c
-
-install:
- cp foo /home/me</programlisting>
-
- <para>We can tell make which target we want to make by
- typing:</para>
-
- <screen>&prompt.user; <userinput>make <replaceable>target</replaceable></userinput></screen>
-
- <para><command>make</command> will then only look at that target
- and ignore any others. For example, if we type
- <userinput>make foo</userinput> with the makefile above, make
- will ignore the <action>install</action> target.</para>
-
- <para>If we just type <userinput>make</userinput> on its own,
- make will always look at the first target and then stop
- without looking at any others. So if we typed
- <userinput>make</userinput> here, it will just go to the
- <action>foo</action> target, re-compile
- <filename>foo</filename> if necessary, and then stop without
- going on to the <action>install</action> target.</para>
-
- <para>Notice that the <action>install</action> target doesn't
- actually depend on anything! This means that the command on
- the following line is always executed when we try to make that
- target by typing <userinput>make install</userinput>. In this
- case, it will copy <filename>foo</filename> into the user's
- home directory. This is often used by application makefiles,
- so that the application can be installed in the correct
- directory when it has been correctly compiled.</para>
-
- <para>This is a slightly confusing subject to try and explain.
- If you don't quite understand how <command>make</command>
- works, the best thing to do is to write a simple program like
- <quote>hello world</quote> and a make file like the one above
- and experiment. Then progress to using more than one source
- file, or having the source file include a header file. The
- <command>touch</command> command is very useful here&mdash;it
- changes the date on a file without you having to edit
- it.</para>
- </sect2>
-
- <sect2>
- <title>Make and include-files</title>
-
- <para>C code often starts with a list of files to include, for
- example stdio.h. Some of these files are system-include
- files, some of them are from the project you're now working
- on:
- </para>
-
- <programlisting>#include &lt;stdio.h&gt;
-#include "foo.h"
-
-int main(....</programlisting>
-
- <para>To make sure that this file is recompiled the moment
- <filename>foo.h</filename> is changed, you have to add it in
- your <filename>Makefile</filename>:</para>
-
- <programlisting>foo: foo.c foo.h</programlisting>
-
- <para>The moment your project is getting bigger and you have
- more and more own include-files to maintain, it will be a
- pain to keep track of all include files and the files which
- are depending on it. If you change an include-file but
- forget to recompile all the files which are depending on
- it, the results will be devastating. <command>gcc</command>
- has an option to analyze your files and to produce a list
- of include-files and their dependencies: <option>-MM</option>.
- </para>
-
- <para>If you add this to your Makefile:</para>
-
- <programlisting>depend:
- gcc -E -MM *.c &gt; .depend</programlisting>
-
- <para>and run <userinput>make depend</userinput>, the file
- <filename>.depend</filename> will appear with a list of
- object-files, C-files and the include-files:</para>
-
- <programlisting>foo.o: foo.c foo.h</programlisting>
-
- <para>If you change <filename>foo.h</filename>, next time
- you run <command>make</command> all files depending on
- <filename>foo.h</filename> will be recompiled.</para>
-
- <para>Don't forget to run <command>make depend</command> each
- time you add an include-file to one of your files.</para>
- </sect2>
-
- <sect2>
- <title>FreeBSD Makefiles</title>
-
- <para>Makefiles can be rather complicated to write. Fortunately,
- BSD-based systems like FreeBSD come with some very powerful
- ones as part of the system. One very good example of this is
- the FreeBSD ports system. Here's the essential part of a
- typical ports <filename>Makefile</filename>:</para>
-
- <programlisting>MASTER_SITES= ftp://freefall.cdrom.com/pub/FreeBSD/LOCAL_PORTS/
-DISTFILES= scheme-microcode+dist-7.3-freebsd.tgz
-
-.include &lt;bsd.port.mk&gt;</programlisting>
-
- <para>Now, if we go to the directory for this port and type
- <userinput>make</userinput>, the following happens:</para>
-
- <procedure>
- <step>
- <para>A check is made to see if the source code for this
- port is already on the system.</para>
- </step>
-
- <step>
- <para>If it isn't, an FTP connection to the URL in
- <symbol>MASTER_SITES</symbol> is set up to download the
- source.</para>
- </step>
-
- <step>
- <para>The checksum for the source is calculated and compared
- it with one for a known, good, copy of the source. This
- is to make sure that the source was not corrupted while in
- transit.</para>
- </step>
-
- <step>
- <para>Any changes required to make the source work on
- FreeBSD are applied&mdash;this is known as
- <firstterm>patching</firstterm>.</para>
- </step>
-
- <step>
- <para>Any special configuration needed for the source is
- done. (Many Unix program distributions try to work out
- which version of Unix they are being compiled on and which
- optional Unix features are present&mdash;this is where
- they are given the information in the FreeBSD ports
- scenario).</para>
- </step>
-
- <step>
- <para>The source code for the program is compiled. In
- effect, we change to the directory where the source was
- unpacked and do <command>make</command>&mdash;the
- program's own make file has the necessary information to
- build the program.</para>
- </step>
-
- <step>
- <para>We now have a compiled version of the program. If we
- wish, we can test it now; when we feel confident about the
- program, we can type <userinput>make install</userinput>.
- This will cause the program and any supporting files it
- needs to be copied into the correct location; an entry is
- also made into a <database>package database</database>, so
- that the port can easily be uninstalled later if we change
- our mind about it.</para>
- </step>
- </procedure>
-
- <para>Now I think you'll agree that's rather impressive for a
- four line script!</para>
-
- <para>The secret lies in the last line, which tells
- <command>make</command> to look in the system makefile called
- <filename>bsd.port.mk</filename>. It's easy to overlook this
- line, but this is where all the clever stuff comes
- from&mdash;someone has written a makefile that tells
- <command>make</command> to do all the things above (plus a
- couple of other things I didn't mention, including handling
- any errors that may occur) and anyone can get access to that
- just by putting a single line in their own make file!</para>
-
- <para>If you want to have a look at these system makefiles,
- they're in <filename>/usr/share/mk</filename>, but it's
- probably best to wait until you've had a bit of practice with
- makefiles, as they are very complicated (and if you do look at
- them, make sure you have a flask of strong coffee
- handy!)</para>
- </sect2>
-
- <sect2>
- <title>More advanced uses of <command>make</command></title>
-
- <para><command>Make</command> is a very powerful tool, and can
- do much more than the simple example above shows.
- Unfortunately, there are several different versions of
- <command>make</command>, and they all differ considerably.
- The best way to learn what they can do is probably to read the
- documentation&mdash;hopefully this introduction will have
- given you a base from which you can do this.</para>
-
- <para>The version of make that comes with FreeBSD is the
- <application>Berkeley make</application>; there is a tutorial
- for it in <filename>/usr/share/doc/psd/12.make</filename>. To
- view it, do</para>
-
- <screen>&prompt.user; <userinput>zmore paper.ascii.gz</userinput></screen>
-
- <para>in that directory.</para>
-
- <para>Many applications in the ports use <application>GNU
- make</application>, which has a very good set of
- <quote>info</quote> pages. If you have installed any of these
- ports, <application>GNU make</application> will automatically
- have been installed as <command>gmake</command>. It's also
- available as a port and package in its own right.</para>
-
- <para>To view the info pages for <application>GNU
- make</application>, you will have to edit the
- <filename>dir</filename> file in the
- <filename>/usr/local/info</filename> directory to add an entry
- for it. This involves adding a line like</para>
-
- <programlisting> * Make: (make). The GNU Make utility.</programlisting>
-
- <para>to the file. Once you have done this, you can type
- <userinput>info</userinput> and then select
- <guimenuitem>make</guimenuitem> from the menu (or in
- <application>Emacs</application>, do <userinput>C-h
- i</userinput>).</para>
- </sect2>
- </sect1>
-
- <sect1 id="debugging">
- <title>Debugging</title>
-
- <sect2>
- <title>The Debugger</title>
-
- <para>The debugger that comes with FreeBSD is called
- <command>gdb</command> (<application>GNU
- debugger</application>). You start it up by typing</para>
-
- <screen>&prompt.user; <userinput>gdb <replaceable>progname</replaceable></userinput></screen>
-
- <para>although most people prefer to run it inside
- <application>Emacs</application>. You can do this by:</para>
-
- <screen><userinput>M-x gdb RET <replaceable>progname</replaceable> RET</userinput></screen>
-
- <para>Using a debugger allows you to run the program under more
- controlled circumstances. Typically, you can step through the
- program a line at a time, inspect the value of variables,
- change them, tell the debugger to run up to a certain point
- and then stop, and so on. You can even attach to a program
- that's already running, or load a core file to investigate why
- the program crashed. It's even possible to debug the kernel,
- though that's a little trickier than the user applications
- we'll be discussing in this section.</para>
-
- <para><command>gdb</command> has quite good on-line help, as
- well as a set of info pages, so this section will concentrate
- on a few of the basic commands.</para>
-
- <para>Finally, if you find its text-based command-prompt style
- off-putting, there's a graphical front-end for it <ulink
- URL="../../../../ports/devel.html">xxgdb</ulink> in the ports
- collection.</para>
-
- <para>This section is intended to be an introduction to using
- <command>gdb</command> and does not cover specialised topics
- such as debugging the kernel.</para>
- </sect2>
-
- <sect2>
- <title>Running a program in the debugger</title>
-
- <para>You'll need to have compiled the program with the
- <option>-g</option> option to get the most out of using
- <command>gdb</command>. It will work without, but you'll only
- see the name of the function you're in, instead of the source
- code. If you see a line like:</para>
-
- <screen>&hellip; (no debugging symbols found) &hellip;</screen>
-
- <para>when <command>gdb</command> starts up, you'll know that
- the program wasn't compiled with the <option>-g</option>
- option.</para>
-
- <para>At the <command>gdb</command> prompt, type
- <userinput>break main</userinput>. This will tell the
- debugger to skip over the preliminary set-up code in the
- program and start at the beginning of your code. Now type
- <userinput>run</userinput> to start the program&mdash;it will
- start at the beginning of the set-up code and then get stopped
- by the debugger when it calls <function>main()</function>.
- (If you've ever wondered where <function>main()</function>
- gets called from, now you know!).</para>
-
- <para>You can now step through the program, a line at a time, by
- pressing <command>n</command>. If you get to a function call,
- you can step into it by pressing <command>s</command>. Once
- you're in a function call, you can return from stepping into a
- function call by pressing <command>f</command>. You can also
- use <command>up</command> and <command>down</command> to take
- a quick look at the caller.</para>
-
- <para>Here's a simple example of how to spot a mistake in a
- program with <command>gdb</command>. This is our program
- (with a deliberate mistake):</para>
-
- <programlisting>#include &lt;stdio.h&gt;
-
-int bazz(int anint);
-
-main() {
- int i;
-
- printf("This is my program\n");
- bazz(i);
- return 0;
-}
-
-int bazz(int anint) {
- printf("You gave me %d\n", anint);
- return anint;
-}</programlisting>
-
- <para>This program sets <symbol>i</symbol> to be
- <literal>5</literal> and passes it to a function
- <function>bazz()</function> which prints out the number we
- gave it.</para>
-
- <para>When we compile and run the program we get</para>
-
- <screen>&prompt.user; <userinput>cc -g -o temp temp.c</userinput>
-&prompt.user; <userinput>./temp</userinput>
-This is my program
-anint = 4231</screen>
-
- <para>That wasn't what we expected! Time to see what's going
- on!</para>
-
- <screen>&prompt.user; <userinput>gdb temp</userinput>
-GDB is free software and you are welcome to distribute copies of it
- under certain conditions; type "show copying" to see the conditions.
-There is absolutely no warranty for GDB; type "show warranty" for details.
-GDB 4.13 (i386-unknown-freebsd), Copyright 1994 Free Software Foundation, Inc.
-(gdb) <userinput>break main</> <lineannotation>Skip the set-up code</>
-Breakpoint 1 at 0x160f: file temp.c, line 9. <lineannotation><command>gdb</command> puts breakpoint at <function>main()</></>
-(gdb) <userinput>run</> <lineannotation>Run as far as <function>main()</></>
-Starting program: /home/james/tmp/temp <lineannotation>Program starts running</>
-
-Breakpoint 1, main () at temp.c:9 <lineannotation><command>gdb</command> stops at <function>main()</></>
-(gdb) <userinput>n</> <lineannotation>Go to next line</>
-This is my program <lineannotation>Program prints out</>
-(gdb) <userinput>s</> <lineannotation>step into <function>bazz()</></>
-bazz (anint=4231) at temp.c:17 <lineannotation><command>gdb</command> displays stack frame</>
-(gdb)</screen>
-
- <para>Hang on a minute! How did <symbol>anint</symbol> get to be
- <literal>4231</literal>? Didn't we set it to be
- <literal>5</literal> in <function>main()</function>? Let's
- move up to <function>main()</function> and have a look.</para>
-
- <screen>(gdb) <userinput>up</> <lineannotation>Move up call stack</>
-#1 0x1625 in main () at temp.c:11 <lineannotation><command>gdb</command> displays stack frame</>
-(gdb) <userinput>p i</> <lineannotation>Show us the value of <symbol>i</></>
-$1 = 4231 <lineannotation><command>gdb</command> displays <literal>4231</></></screen>
-
- <para>Oh dear! Looking at the code, we forgot to initialise
- <symbol>i</symbol>. We meant to put</para>
-
- <programlisting><lineannotation>&hellip;</>
-main() {
- int i;
-
- i = 5;
- printf("This is my program\n");
-<lineannotation>&hellip</></programlisting>
-
- <para>but we left the <literal>i=5;</literal> line out. As we
- didn't initialise <symbol>i</symbol>, it had whatever number
- happened to be in that area of memory when the program ran,
- which in this case happened to be
- <literal>4231</literal>.</para>
-
- <note>
- <para><command>gdb</command> displays the stack frame every
- time we go into or out of a function, even if we're using
- <command>up</command> and <command>down</command> to move
- around the call stack. This shows the name of the function
- and the values of its arguments, which helps us keep track
- of where we are and what's going on. (The stack is a
- storage area where the program stores information about the
- arguments passed to functions and where to go when it
- returns from a function call).</para>
- </note>
- </sect2>
-
- <sect2>
- <title>Examining a core file</title>
-
- <para>A core file is basically a file which contains the
- complete state of the process when it crashed. In <quote>the
- good old days</quote>, programmers had to print out hex
- listings of core files and sweat over machine code manuals,
- but now life is a bit easier. Incidentally, under FreeBSD and
- other 4.4BSD systems, a core file is called
- <filename><replaceable>progname</replaceable>.core</filename> instead of just
- <filename>core</filename>, to make it clearer which program a
- core file belongs to.</para>
-
- <para>To examine a core file, start up <command>gdb</command> in
- the usual way. Instead of typing <command>break</command> or
- <command>run</command>, type</para>
-
- <screen>(gdb) <userinput>core <replaceable>progname</replaceable>.core</userinput></screen>
-
- <para>If you're not in the same directory as the core file,
- you'll have to do <userinput>dir
- /path/to/core/file</userinput> first.</para>
-
- <para>You should see something like this:</para>
-
- <screen>&prompt.user; <userinput>gdb a.out</userinput>
-GDB is free software and you are welcome to distribute copies of it
- under certain conditions; type "show copying" to see the conditions.
-There is absolutely no warranty for GDB; type "show warranty" for details.
-GDB 4.13 (i386-unknown-freebsd), Copyright 1994 Free Software Foundation, Inc.
-(gdb) <userinput>core a.out.core</userinput>
-Core was generated by `a.out'.
-Program terminated with signal 11, Segmentation fault.
-Cannot access memory at address 0x7020796d.
-#0 0x164a in bazz (anint=0x5) at temp.c:17
-(gdb)</screen>
-
- <para>In this case, the program was called
- <filename>a.out</filename>, so the core file is called
- <filename>a.out.core</filename>. We can see that the program
- crashed due to trying to access an area in memory that was not
- available to it in a function called
- <function>bazz</function>.</para>
-
- <para>Sometimes it's useful to be able to see how a function was
- called, as the problem could have occurred a long way up the
- call stack in a complex program. The <command>bt</command>
- command causes <command>gdb</command> to print out a
- back-trace of the call stack:</para>
-
- <screen>(gdb) <userinput>bt</userinput>
-#0 0x164a in bazz (anint=0x5) at temp.c:17
-#1 0xefbfd888 in end ()
-#2 0x162c in main () at temp.c:11
-(gdb)</screen>
-
- <para>The <function>end()</function> function is called when a
- program crashes; in this case, the <function>bazz()</function>
- function was called from <function>main()</function>.</para>
- </sect2>
-
- <sect2>
- <title>Attaching to a running program</title>
-
- <para>One of the neatest features about <command>gdb</command>
- is that it can attach to a program that's already running. Of
- course, that assumes you have sufficient permissions to do so.
- A common problem is when you are stepping through a program
- that forks, and you want to trace the child, but the debugger
- will only let you trace the parent.</para>
-
- <para>What you do is start up another <command>gdb</command>,
- use <command>ps</command> to find the process ID for the
- child, and do</para>
-
- <screen>(gdb) <userinput>attach <replaceable>pid</replaceable></userinput></screen>
-
- <para>in <command>gdb</command>, and then debug as usual.</para>
-
- <para><quote>That's all very well,</quote> you're probably
- thinking, <quote>but by the time I've done that, the child
- process will be over the hill and far away</quote>. Fear
- not, gentle reader, here's how to do it (courtesy of the
- <command>gdb</command> info pages):</para>
-
- <screen><lineannotation>&hellip</lineannotation>
-if ((pid = fork()) < 0) /* _Always_ check this */
- error();
-else if (pid == 0) { /* child */
- int PauseMode = 1;
-
- while (PauseMode)
- sleep(10); /* Wait until someone attaches to us */
- <lineannotation>&hellip</lineannotation>
-} else { /* parent */
- <lineannotation>&hellip</lineannotation></screen>
-
- <para>Now all you have to do is attach to the child, set
- <symbol>PauseMode</symbol> to <literal>0</literal>, and wait
- for the <function>sleep()</function> call to return!</para>
- </sect2>
- </sect1>
-
- <sect1 id="emacs">
- <title>Using Emacs as a Development Environment</title>
-
- <sect2>
- <title>Emacs</title>
-
- <para>Unfortunately, Unix systems don't come with the kind of
- everything-you-ever-wanted-and-lots-more-you-didn't-in-one-gigantic-package
- integrated development environments that other systems
- have.
-
- <footnote>
- <para>Some powerful, free IDEs now exist, such as KDevelop
- in the ports collection.</para>
- </footnote>
-
- However, it is possible to set up your own environment. It
- may not be as pretty, and it may not be quite as integrated,
- but you can set it up the way you want it. And it's free.
- And you have the source to it.</para>
-
- <para>The key to it all is Emacs. Now there are some people who
- loathe it, but many who love it. If you're one of the former,
- I'm afraid this section will hold little of interest to you.
- Also, you'll need a fair amount of memory to run it&mdash;I'd
- recommend 8MB in text mode and 16MB in X as the bare minimum
- to get reasonable performance.</para>
-
- <para>Emacs is basically a highly customisable
- editor&mdash;indeed, it has been customised to the point where
- it's more like an operating system than an editor! Many
- developers and sysadmins do in fact spend practically all
- their time working inside Emacs, leaving it only to log
- out.</para>
-
- <para>It's impossible even to summarise everything Emacs can do
- here, but here are some of the features of interest to
- developers:</para>
-
- <itemizedlist>
- <listitem>
- <para>Very powerful editor, allowing search-and-replace on
- both strings and regular expressions (patterns), jumping
- to start/end of block expression, etc, etc.</para>
- </listitem>
-
- <listitem>
- <para>Pull-down menus and online help.</para>
- </listitem>
-
- <listitem>
- <para>Language-dependent syntax highlighting and
- indentation.</para>
- </listitem>
-
- <listitem>
- <para>Completely customisable.</para>
- </listitem>
-
- <listitem>
- <para>You can compile and debug programs within
- Emacs.</para>
- </listitem>
-
- <listitem>
- <para>On a compilation error, you can jump to the offending
- line of source code.</para>
- </listitem>
-
- <listitem>
- <para>Friendly-ish front-end to the <command>info</command>
- program used for reading GNU hypertext documentation,
- including the documentation on Emacs itself.</para>
- </listitem>
-
- <listitem>
- <para>Friendly front-end to <command>gdb</command>, allowing
- you to look at the source code as you step through your
- program.</para>
- </listitem>
-
- <listitem>
- <para>You can read Usenet news and mail while your program
- is compiling.</para>
- </listitem>
- </itemizedlist>
-
- <para>And doubtless many more that I've overlooked.</para>
-
- <para>Emacs can be installed on FreeBSD using <ulink
- URL="../../ports/editors.html">the Emacs
- port</ulink>.</para>
-
- <para>Once it's installed, start it up and do <userinput>C-h
- t</userinput> to read an Emacs tutorial&mdash;that means
- hold down the <keycap>control</keycap> key, press
- <keycap>h</keycap>, let go of the <keycap>control</keycap>
- key, and then press <keycap>t</keycap>. (Alternatively, you
- can you use the mouse to select <guimenuitem>Emacs
- Tutorial</guimenuitem> from the <guimenu>Help</guimenu>
- menu).</para>
-
- <para>Although Emacs does have menus, it's well worth learning
- the key bindings, as it's much quicker when you're editing
- something to press a couple of keys than to try and find the
- mouse and then click on the right place. And, when you're
- talking to seasoned Emacs users, you'll find they often
- casually throw around expressions like <quote><literal>M-x
- replace-s RET foo RET bar RET</literal></quote> so it's
- useful to know what they mean. And in any case, Emacs has far
- too many useful functions for them to all fit on the menu
- bars.</para>
-
- <para>Fortunately, it's quite easy to pick up the key-bindings,
- as they're displayed next to the menu item. My advice is to
- use the menu item for, say, opening a file until you
- understand how it works and feel confident with it, then try
- doing C-x C-f. When you're happy with that, move on to
- another menu command.</para>
-
- <para>If you can't remember what a particular combination of
- keys does, select <guimenuitem>Describe Key</guimenuitem> from
- the <guimenu>Help</guimenu> menu and type it in&mdash;Emacs
- will tell you what it does. You can also use the
- <guimenuitem>Command Apropos</guimenuitem> menu item to find
- out all the commands which contain a particular word in them,
- with the key binding next to it.</para>
-
- <para>By the way, the expression above means hold down the
- <keysym>Meta</keysym> key, press <keysym>x</keysym>, release
- the <keysym>Meta</keysym> key, type
- <userinput>replace-s</userinput> (short for
- <literal>replace-string</literal>&mdash;another feature of
- Emacs is that you can abbreviate commands), press the
- <keysym>return</keysym> key, type <userinput>foo</userinput>
- (the string you want replaced), press the
- <keysym>return</keysym> key, type bar (the string you want to
- replace <literal>foo</literal> with) and press
- <keysym>return</keysym> again. Emacs will then do the
- search-and-replace operation you've just requested.</para>
-
- <para>If you're wondering what on earth the
- <keysym>Meta</keysym> key is, it's a special key that many
- Unix workstations have. Unfortunately, PC's don't have one,
- so it's usually the <keycap>alt</keycap> key (or if you're
- unlucky, the <keysym>escape</keysym> key).</para>
-
- <para>Oh, and to get out of Emacs, do <command>C-x C-c</command>
- (that means hold down the <keysym>control</keysym> key, press
- <keysym>x</keysym>, press <keysym>c</keysym> and release the
- <keysym>control</keysym> key). If you have any unsaved files
- open, Emacs will ask you if you want to save them. (Ignore
- the bit in the documentation where it says
- <command>C-z</command> is the usual way to leave
- Emacs&mdash;that leaves Emacs hanging around in the
- background, and is only really useful if you're on a system
- which doesn't have virtual terminals).</para>
- </sect2>
-
- <sect2>
- <title>Configuring Emacs</title>
-
- <para>Emacs does many wonderful things; some of them are built
- in, some of them need to be configured.</para>
-
- <para>Instead of using a proprietary macro language for
- configuration, Emacs uses a version of Lisp specially adapted
- for editors, known as Emacs Lisp. This can be quite useful if
- you want to go on and learn something like Common Lisp, as
- it's considerably smaller than Common Lisp (although still
- quite big!).</para>
-
- <para>The best way to learn Emacs Lisp is to download the <ulink
- URL="ftp://prep.ai.mit.edu:pub/gnu/elisp-manual-19-2.4.tar.gz">Emacs
- Tutorial</ulink></para>
-
- <para>However, there's no need to actually know any Lisp to get
- started with configuring Emacs, as I've included a sample
- <filename>.emacs</filename> file, which should be enough to
- get you started. Just copy it into your home directory and
- restart Emacs if it's already running; it will read the
- commands from the file and (hopefully) give you a useful basic
- setup.</para>
- </sect2>
-
- <sect2>
- <title>A sample <filename>.emacs</filename> file</title>
-
- <para>Unfortunately, there's far too much here to explain it in
- detail; however there are one or two points worth
- mentioning.</para>
-
- <itemizedlist>
- <listitem>
- <para>Everything beginning with a <literal>;</literal> is a comment
- and is ignored by Emacs.</para>
- </listitem>
-
- <listitem>
- <para>In the first line, the
- <literal>-*-&nbsp;Emacs-Lisp&nbsp;-*-</literal> is so that
- we can edit the <filename>.emacs</filename> file itself
- within Emacs and get all the fancy features for editing
- Emacs Lisp. Emacs usually tries to guess this based on
- the filename, and may not get it right for
- <filename>.emacs</filename>.</para>
- </listitem>
-
- <listitem>
- <para>The <keysym>tab</keysym> key is bound to an
- indentation function in some modes, so when you press the
- tab key, it will indent the current line of code. If you
- want to put a <token>tab</token> character in whatever
- you're writing, hold the <keysym>control</keysym> key down
- while you're pressing the <keysym>tab</keysym> key.</para>
- </listitem>
-
- <listitem>
- <para>This file supports syntax highlighting for C, C++,
- Perl, Lisp and Scheme, by guessing the language from the
- filename.</para>
- </listitem>
-
- <listitem>
- <para>Emacs already has a pre-defined function called
- <function>next-error</function>. In a compilation output
- window, this allows you to move from one compilation error
- to the next by doing <command>M-n</command>; we define a
- complementary function,
- <function>previous-error</function>, that allows you to go
- to a previous error by doing <command>M-p</command>. The
- nicest feature of all is that <command>C-c C-c</command>
- will open up the source file in which the error occurred
- and jump to the appropriate line.</para>
- </listitem>
-
- <listitem>
- <para>We enable Emacs's ability to act as a server, so that
- if you're doing something outside Emacs and you want to
- edit a file, you can just type in</para>
-
- <screen>&prompt.user; <userinput>emacsclient <replaceable>filename</replaceable></userinput>
- </screen>
-
- <para>and then you can edit the file in your
- Emacs!
-
- <footnote>
- <para>Many Emacs users set their <envar>EDITOR</envar>
- environment to
- <literal>emacsclient</literal> so this happens every
- time they need to edit a file.</para>
- </footnote></para>
- </listitem>
- </itemizedlist>
-
- <example>
- <title>A sample <filename>.emacs</filename> file</title>
-
- <programlisting>;; -*-Emacs-Lisp-*-
-
-;; This file is designed to be re-evaled; use the variable first-time
-;; to avoid any problems with this.
-(defvar first-time t
- "Flag signifying this is the first time that .emacs has been evaled")
-
-;; Meta
-(global-set-key "\M- " 'set-mark-command)
-(global-set-key "\M-\C-h" 'backward-kill-word)
-(global-set-key "\M-\C-r" 'query-replace)
-(global-set-key "\M-r" 'replace-string)
-(global-set-key "\M-g" 'goto-line)
-(global-set-key "\M-h" 'help-command)
-
-;; Function keys
-(global-set-key [f1] 'manual-entry)
-(global-set-key [f2] 'info)
-(global-set-key [f3] 'repeat-complex-command)
-(global-set-key [f4] 'advertised-undo)
-(global-set-key [f5] 'eval-current-buffer)
-(global-set-key [f6] 'buffer-menu)
-(global-set-key [f7] 'other-window)
-(global-set-key [f8] 'find-file)
-(global-set-key [f9] 'save-buffer)
-(global-set-key [f10] 'next-error)
-(global-set-key [f11] 'compile)
-(global-set-key [f12] 'grep)
-(global-set-key [C-f1] 'compile)
-(global-set-key [C-f2] 'grep)
-(global-set-key [C-f3] 'next-error)
-(global-set-key [C-f4] 'previous-error)
-(global-set-key [C-f5] 'display-faces)
-(global-set-key [C-f8] 'dired)
-(global-set-key [C-f10] 'kill-compilation)
-
-;; Keypad bindings
-(global-set-key [up] "\C-p")
-(global-set-key [down] "\C-n")
-(global-set-key [left] "\C-b")
-(global-set-key [right] "\C-f")
-(global-set-key [home] "\C-a")
-(global-set-key [end] "\C-e")
-(global-set-key [prior] "\M-v")
-(global-set-key [next] "\C-v")
-(global-set-key [C-up] "\M-\C-b")
-(global-set-key [C-down] "\M-\C-f")
-(global-set-key [C-left] "\M-b")
-(global-set-key [C-right] "\M-f")
-(global-set-key [C-home] "\M-&lt;")
-(global-set-key [C-end] "\M-&gt;")
-(global-set-key [C-prior] "\M-&lt;")
-(global-set-key [C-next] "\M-&gt;")
-
-;; Mouse
-(global-set-key [mouse-3] 'imenu)
-
-;; Misc
-(global-set-key [C-tab] "\C-q\t") ; Control tab quotes a tab.
-(setq backup-by-copying-when-mismatch t)
-
-;; Treat 'y' or &lt;CR&gt; as yes, 'n' as no.
-(fset 'yes-or-no-p 'y-or-n-p)
- (define-key query-replace-map [return] 'act)
- (define-key query-replace-map [?\C-m] 'act)
-
-;; Load packages
-(require 'desktop)
-(require 'tar-mode)
-
-;; Pretty diff mode
-(autoload 'ediff-buffers "ediff" "Intelligent Emacs interface to diff" t)
-(autoload 'ediff-files "ediff" "Intelligent Emacs interface to diff" t)
-(autoload 'ediff-files-remote "ediff"
- "Intelligent Emacs interface to diff")
-
-(if first-time
- (setq auto-mode-alist
- (append '(("\\.cpp$" . c++-mode)
- ("\\.hpp$" . c++-mode)
- ("\\.lsp$" . lisp-mode)
- ("\\.scm$" . scheme-mode)
- ("\\.pl$" . perl-mode)
- ) auto-mode-alist)))
-
-;; Auto font lock mode
-(defvar font-lock-auto-mode-list
- (list 'c-mode 'c++-mode 'c++-c-mode 'emacs-lisp-mode 'lisp-mode 'perl-mode 'scheme-mode)
- "List of modes to always start in font-lock-mode")
-
-(defvar font-lock-mode-keyword-alist
- '((c++-c-mode . c-font-lock-keywords)
- (perl-mode . perl-font-lock-keywords))
- "Associations between modes and keywords")
-
-(defun font-lock-auto-mode-select ()
- "Automatically select font-lock-mode if the current major mode is
-in font-lock-auto-mode-list"
- (if (memq major-mode font-lock-auto-mode-list)
- (progn
- (font-lock-mode t))
- )
- )
-
-(global-set-key [M-f1] 'font-lock-fontify-buffer)
-
-;; New dabbrev stuff
-;(require 'new-dabbrev)
-(setq dabbrev-always-check-other-buffers t)
-(setq dabbrev-abbrev-char-regexp "\\sw\\|\\s_")
-(add-hook 'emacs-lisp-mode-hook
- '(lambda ()
- (set (make-local-variable 'dabbrev-case-fold-search) nil)
- (set (make-local-variable 'dabbrev-case-replace) nil)))
-(add-hook 'c-mode-hook
- '(lambda ()
- (set (make-local-variable 'dabbrev-case-fold-search) nil)
- (set (make-local-variable 'dabbrev-case-replace) nil)))
-(add-hook 'text-mode-hook
- '(lambda ()
- (set (make-local-variable 'dabbrev-case-fold-search) t)
- (set (make-local-variable 'dabbrev-case-replace) t)))
-
-;; C++ and C mode...
-(defun my-c++-mode-hook ()
- (setq tab-width 4)
- (define-key c++-mode-map "\C-m" 'reindent-then-newline-and-indent)
- (define-key c++-mode-map "\C-ce" 'c-comment-edit)
- (setq c++-auto-hungry-initial-state 'none)
- (setq c++-delete-function 'backward-delete-char)
- (setq c++-tab-always-indent t)
- (setq c-indent-level 4)
- (setq c-continued-statement-offset 4)
- (setq c++-empty-arglist-indent 4))
-
-(defun my-c-mode-hook ()
- (setq tab-width 4)
- (define-key c-mode-map "\C-m" 'reindent-then-newline-and-indent)
- (define-key c-mode-map "\C-ce" 'c-comment-edit)
- (setq c-auto-hungry-initial-state 'none)
- (setq c-delete-function 'backward-delete-char)
- (setq c-tab-always-indent t)
-;; BSD-ish indentation style
- (setq c-indent-level 4)
- (setq c-continued-statement-offset 4)
- (setq c-brace-offset -4)
- (setq c-argdecl-indent 0)
- (setq c-label-offset -4))
-
-;; Perl mode
-(defun my-perl-mode-hook ()
- (setq tab-width 4)
- (define-key c++-mode-map "\C-m" 'reindent-then-newline-and-indent)
- (setq perl-indent-level 4)
- (setq perl-continued-statement-offset 4))
-
-;; Scheme mode...
-(defun my-scheme-mode-hook ()
- (define-key scheme-mode-map "\C-m" 'reindent-then-newline-and-indent))
-
-;; Emacs-Lisp mode...
-(defun my-lisp-mode-hook ()
- (define-key lisp-mode-map "\C-m" 'reindent-then-newline-and-indent)
- (define-key lisp-mode-map "\C-i" 'lisp-indent-line)
- (define-key lisp-mode-map "\C-j" 'eval-print-last-sexp))
-
-;; Add all of the hooks...
-(add-hook 'c++-mode-hook 'my-c++-mode-hook)
-(add-hook 'c-mode-hook 'my-c-mode-hook)
-(add-hook 'scheme-mode-hook 'my-scheme-mode-hook)
-(add-hook 'emacs-lisp-mode-hook 'my-lisp-mode-hook)
-(add-hook 'lisp-mode-hook 'my-lisp-mode-hook)
-(add-hook 'perl-mode-hook 'my-perl-mode-hook)
-
-;; Complement to next-error
-(defun previous-error (n)
- "Visit previous compilation error message and corresponding source code."
- (interactive "p")
- (next-error (- n)))
-
-;; Misc...
-(transient-mark-mode 1)
-(setq mark-even-if-inactive t)
-(setq visible-bell nil)
-(setq next-line-add-newlines nil)
-(setq compile-command "make")
-(setq suggest-key-bindings nil)
-(put 'eval-expression 'disabled nil)
-(put 'narrow-to-region 'disabled nil)
-(put 'set-goal-column 'disabled nil)
-
-;; Elisp archive searching
-(autoload 'format-lisp-code-directory "lispdir" nil t)
-(autoload 'lisp-dir-apropos "lispdir" nil t)
-(autoload 'lisp-dir-retrieve "lispdir" nil t)
-(autoload 'lisp-dir-verify "lispdir" nil t)
-
-;; Font lock mode
-(defun my-make-face (face colour &amp;optional bold)
- "Create a face from a colour and optionally make it bold"
- (make-face face)
- (copy-face 'default face)
- (set-face-foreground face colour)
- (if bold (make-face-bold face))
- )
-
-(if (eq window-system 'x)
- (progn
- (my-make-face 'blue "blue")
- (my-make-face 'red "red")
- (my-make-face 'green "dark green")
- (setq font-lock-comment-face 'blue)
- (setq font-lock-string-face 'bold)
- (setq font-lock-type-face 'bold)
- (setq font-lock-keyword-face 'bold)
- (setq font-lock-function-name-face 'red)
- (setq font-lock-doc-string-face 'green)
- (add-hook 'find-file-hooks 'font-lock-auto-mode-select)
-
- (setq baud-rate 1000000)
- (global-set-key "\C-cmm" 'menu-bar-mode)
- (global-set-key "\C-cms" 'scroll-bar-mode)
- (global-set-key [backspace] 'backward-delete-char)
- ; (global-set-key [delete] 'delete-char)
- (standard-display-european t)
- (load-library "iso-transl")))
-
-;; X11 or PC using direct screen writes
-(if window-system
- (progn
- ;; (global-set-key [M-f1] 'hilit-repaint-command)
- ;; (global-set-key [M-f2] [?\C-u M-f1])
- (setq hilit-mode-enable-list
- '(not text-mode c-mode c++-mode emacs-lisp-mode lisp-mode
- scheme-mode)
- hilit-auto-highlight nil
- hilit-auto-rehighlight 'visible
- hilit-inhibit-hooks nil
- hilit-inhibit-rebinding t)
- (require 'hilit19)
- (require 'paren))
- (setq baud-rate 2400) ; For slow serial connections
- )
-
-;; TTY type terminal
-(if (and (not window-system)
- (not (equal system-type 'ms-dos)))
- (progn
- (if first-time
- (progn
- (keyboard-translate ?\C-h ?\C-?)
- (keyboard-translate ?\C-? ?\C-h)))))
-
-;; Under UNIX
-(if (not (equal system-type 'ms-dos))
- (progn
- (if first-time
- (server-start))))
-
-;; Add any face changes here
-(add-hook 'term-setup-hook 'my-term-setup-hook)
-(defun my-term-setup-hook ()
- (if (eq window-system 'pc)
- (progn
-;; (set-face-background 'default "red")
- )))
-
-;; Restore the "desktop" - do this as late as possible
-(if first-time
- (progn
- (desktop-load-default)
- (desktop-read)))
-
-;; Indicate that this file has been read at least once
-(setq first-time nil)
-
-;; No need to debug anything now
-
-(setq debug-on-error nil)
-
-;; All done
-(message "All done, %s%s" (user-login-name) ".")
- </programlisting>
- </example>
- </sect2>
-
- <sect2>
- <title>Extending the Range of Languages Emacs Understands</title>
-
- <para>Now, this is all very well if you only want to program in
- the languages already catered for in the
- <filename>.emacs</filename> file (C, C++, Perl, Lisp and
- Scheme), but what happens if a new language called
- <quote>whizbang</quote> comes out, full of exciting
- features?</para>
-
- <para>The first thing to do is find out if whizbang comes with
- any files that tell Emacs about the language. These usually
- end in <filename>.el</filename>, short for <quote>Emacs
- Lisp</quote>. For example, if whizbang is a FreeBSD port, we
- can locate these files by doing</para>
-
- <screen>&prompt.user; <userinput>find /usr/ports/lang/whizbang -name "*.el" -print</userinput></screen>
-
- <para>and install them by copying them into the Emacs site Lisp
- directory. On FreeBSD 2.1.0-RELEASE, this is
- <filename>/usr/local/share/emacs/site-lisp</filename>.</para>
-
- <para>So for example, if the output from the find command
- was</para>
-
- <screen>/usr/ports/lang/whizbang/work/misc/whizbang.el</screen>
-
- <para>we would do</para>
-
- <screen>&prompt.root; <userinput>cp /usr/ports/lang/whizbang/work/misc/whizbang.el /usr/local/share/emacs/site-lisp</userinput></screen>
-
- <para>Next, we need to decide what extension whizbang source
- files have. Let's say for the sake of argument that they all
- end in <filename>.wiz</filename>. We need to add an entry to
- our <filename>.emacs</filename> file to make sure Emacs will
- be able to use the information in
- <filename>whizbang.el</filename>.</para>
-
- <para>Find the <symbol>auto-mode-alist entry</symbol> in
- <filename>.emacs</filename> and add a line for whizbang, such
- as:</para>
-
- <programlisting><lineannotation>&hellip;</>
-("\\.lsp$" . lisp-mode)
-("\\.wiz$" . whizbang-mode)
-("\\.scm$" . scheme-mode)
-<lineannotation>&hellip;</></programlisting>
-
- <para>This means that Emacs will automatically go into
- <function>whizbang-mode</function> when you edit a file ending
- in <filename>.wiz</filename>.</para>
-
- <para>Just below this, you'll find the
- <symbol>font-lock-auto-mode-list</symbol> entry. Add
- <function>whizbang-mode</function> to it like so:</para>
-
- <programlisting>;; Auto font lock mode
-(defvar font-lock-auto-mode-list
- (list 'c-mode 'c++-mode 'c++-c-mode 'emacs-lisp-mode 'whizbang-mode 'lisp-mode 'perl-mode 'scheme-mode)
- "List of modes to always start in font-lock-mode")</programlisting>
-
- <para>This means that Emacs will always enable
- <function>font-lock-mode</function> (ie syntax highlighting)
- when editing a <filename>.wiz</filename> file.</para>
-
- <para>And that's all that's needed. If there's anything else
- you want done automatically when you open up a
- <filename>.wiz</filename> file, you can add a
- <function>whizbang-mode hook</function> (see
- <function>my-scheme-mode-hook</function> for a simple example
- that adds <function>auto-indent</function>).</para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Further Reading</title>
-
- <itemizedlist>
- <listitem>
- <para>Brian Harvey and Matthew Wright
- <emphasis>Simply Scheme</emphasis>
- MIT 1994.<!-- <br> -->
- ISBN 0-262-08226-8</para>
- </listitem>
-
- <listitem>
- <para>Randall Schwartz
- <emphasis>Learning Perl</emphasis>
- O'Reilly 1993<!-- <br> -->
- ISBN 1-56592-042-2</para>
- </listitem>
-
- <listitem>
- <para>Patrick Henry Winston and Berthold Klaus Paul Horn
- <emphasis>Lisp (3rd Edition)</emphasis>
- Addison-Wesley 1989<!-- <br> -->
- ISBN 0-201-08319-1</para>
- </listitem>
-
- <listitem>
- <para>Brian W. Kernighan and Rob Pike
- <emphasis>The Unix Programming Environment</emphasis>
- Prentice-Hall 1984<!-- <br> -->
- ISBN 0-13-937681-X</para>
- </listitem>
-
- <listitem>
- <para>Brian W. Kernighan and Dennis M. Ritchie
- <emphasis>The C Programming Language (2nd Edition)</emphasis>
- Prentice-Hall 1988<!-- <br> -->
- ISBN 0-13-110362-8</para>
- </listitem>
-
- <listitem>
- <para>Bjarne Stroustrup
- <emphasis>The C++ Programming Language</emphasis>
- Addison-Wesley 1991<!-- <br> -->
- ISBN 0-201-53992-6</para>
- </listitem>
-
- <listitem>
- <para>W. Richard Stevens
- <emphasis>Advanced Programming in the Unix Environment</emphasis>
- Addison-Wesley 1992<!-- <br> -->
- ISBN 0-201-56317-7</para>
- </listitem>
-
- <listitem>
- <para>W. Richard Stevens
- <emphasis>Unix Network Programming</emphasis>
- Prentice-Hall 1990<!-- <br> -->
- ISBN 0-13-949876-1</para>
- </listitem>
- </itemizedlist>
- </sect1>
-
-</chapter>
-<!--
- Local Variables:
- mode: sgml
- sgml-declaration: "../chapter.decl"
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- sgml-parent-document: ("../book.sgml" "part" "chapter")
- End:
--->
diff --git a/en_US.ISO8859-1/books/developers-handbook/usb/chapter.sgml b/en_US.ISO8859-1/books/developers-handbook/usb/chapter.sgml
deleted file mode 100644
index 9656256e31..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/usb/chapter.sgml
+++ /dev/null
@@ -1,623 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD$
--->
-
-<chapter id="usb">
- <title>USB Devices</title>
-
- <para><emphasis>This chapter was written by &a.nhibma;. Modifications made for
- the handbook by &a.murray;.</emphasis></para>
-
- <sect1>
- <title>Introduction</title>
-
- <para>The Universal Serial Bus (USB) is a new way of attaching
- devices to personal computers. The bus architecture features
- two-way communication and has been developed as a response to
- devices becoming smarter and requiring more interaction with the
- host. USB support is included in all current PC chipsets and is
- therefore available in all recently built PCs. Apple's
- introduction of the USB-only iMac has been a major incentive for
- hardware manufacturers to produce USB versions of their devices.
- The future PC specifications specify that all legacy connectors
- on PCs should be replaced by one or more USB connectors,
- providing generic plug and play capabilities. Support for USB
- hardware was available at a very early stage in NetBSD and was
- developed by Lennart Augustsson for the NetBSD project. The
- code has been ported to FreeBSD and we are currently maintaining
- a shared code base. For the implementation of the USB subsystem
- a number of features of USB are important.</para>
-
- <para><emphasis>Lennart Augustsson has done most of the implementation of
- the USB support for the NetBSD project. Many thanks for this
- incredible amount of work. Many thanks also to Ardy and Dirk for
- their comments and proofreading of this paper.</emphasis></para>
-
- <itemizedlist>
-
- <listitem><para>Devices connect to ports on the computer
- directly or on devices called hubs, forming a treelike device
- structure.</para></listitem>
-
- <listitem><para>The devices can be connected and disconnected at
- run time.</para></listitem>
-
- <listitem><para>Devices can suspend themselves and trigger
- resumes of the host system</para></listitem>
-
- <listitem><para>As the devices can be powered from the bus, the
- host software has to keep track of power budgets for each
- hub.</para></listitem>
-
- <listitem><para>Different quality of service requirements by the
- different device types together with the maximum of 126
- devices that can be connected to the same bus, require proper
- scheduling of transfers on the shared bus to take full
- advantage of the 12Mbps bandwidth available. (over 400Mbps
- with USB 2.0)</para></listitem>
-
- <listitem><para>Devices are intelligent and contain easily
- accessible information about themselves</para></listitem>
-
- </itemizedlist>
-
- <para>The development of drivers for the USB subsystem and devices
- connected to it is supported by the specifications that have
- been developed and will be developed. These specifications are
- publicly available from the USB home pages. Apple has been very
- strong in pushing for standards based drivers, by making drivers
- for the generic classes available in their operating system
- MacOS and discouraging the use of separate drivers for each new
- device. This chapter tries to collate essential information for a
- basic understanding of the present implementation of the USB
- stack in FreeBSD/NetBSD. It is recommended however to read it
- together with the relevant specifications mentioned in the
- references below.</para>
-
- <sect2>
- <title>Structure of the USB Stack</title>
-
- <para>The USB support in FreeBSD can be split into three
- layers. The lowest layer contains the host controller driver,
- providing a generic interface to the hardware and its scheduling
- facilities. It supports initialisation of the hardware,
- scheduling of transfers and handling of completed and/or failed
- transfers. Each host controller driver implements a virtual hub
- providing hardware independent access to the registers
- controlling the root ports on the back of the machine.</para>
-
- <para>The middle layer handles the device connection and
- disconnection, basic initialisation of the device, driver
- selection, the communication channels (pipes) and does
- resource management. This services layer also controls the
- default pipes and the device requests transferred over
- them.</para>
-
- <para>The top layer contains the individual drivers supporting
- specific (classes of) devices. These drivers implement the
- protocol that is used over the pipes other than the default
- pipe. They also implement additional functionality to make the
- device available to other parts of the kernel oruserland. They
- use the USB driver interface (USBDI) exposed by the services
- layer.</para>
- </sect2>
- </sect1>
-
- <sect1 id="usb-hc">
- <title>Host Controllers</title>
-
- <para>The host controller (HC) controls the transmission of
- packets on the bus. Frames of 1 millisecond are used. At the
- start of each frame the host controller generates a Start of
- Frame (SOF) packet.</para>
-
- <para>The SOF packet is used to synchronise to the start of the
- frame and to keep track of the frame number. Within each frame
- packets are transferred, either from host to device (out) or
- from device to host (in). Transfers are always initiated by the
- host (polled transfers). Therefore there can only be one host
- per USB bus. Each transfer of a packet has a status stage in
- which the recipient of the data can return either ACK
- (acknowledge reception), NAK (retry), STALL (error condition) or
- nothing (garbled data stage, device not available or
- disconnected). Section 8.5 of the <ulink
- url="http://www.usb.org/developers/docs.html">USB
- specification</ulink> explains the details of packets in more
- detail. Four different types of transfers can occur on a USB
- bus: control, bulk, interrupt and isochronous. The types of
- transfers and their characteristics are described below (`Pipes'
- subsection).</para>
-
- <para>Large transfers between the device on the USB bus and the
- device driver are split up into multiple packets by the host
- controller or the HC driver.</para>
-
- <para>Device requests (control transfers) to the default endpoints
- are special. They consist of two or three phases: SETUP, DATA
- (optional) and STATUS. The set-up packet is sent to the
- device. If there is a data phase, the direction of the data
- packet(s) is given in the set-up packet. The direction in the
- status phase is the opposite of the direction during the data
- phase, or IN if there was no data phase. The host controller
- hardware also provides registers with the current status of the
- root ports and the changes that have occurred since the last
- reset of the status change register. Access to these registers
- is provided through a virtualised hub as suggested in the USB
- specification [ 2]. Thevirtual hub must comply with the hub
- device class given in chapter 11 of that specification. It must
- provide a default pipe through which device requests can be sent
- to it. It returns the standard andhub class specific set of
- descriptors. It should also provide an interrupt pipe that
- reports changes happening at its ports. There are currently two
- specifications for host controllers available: <ulink
- url="http://developer.intel.com/design/USB/UHCI11D.htm">Universal
- Host Controller Interface</ulink> (UHCI; Intel) and <ulink
- url="http://www.compaq.com/productinfo/development/openhci.html">Open
- Host Controller Interface</ulink> (OHCI; Compaq, Microsoft,
- National Semiconductor). The UHCI specification has been
- designed to reduce hardware complexity byrequiring the host
- controller driver to supply a complete schedule of the transfers
- for each frame. OHCI type controllers are much more independent
- by providing a more abstract interface doing alot of work
- themselves. </para>
-
- <sect2>
- <title>UHCI</title>
-
- <para>The UHCI host controller maintains a framelist with 1024
- pointers to per frame data structures. It understands two
- different data types: transfer descriptors (TD) and queue
- heads (QH). Each TD represents a packet to be communicated to
- or from a device endpoint. QHs are a means to groupTDs (and
- QHs) together.</para>
-
- <para>Each transfer consists of one or more packets. The UHCI
- driver splits large transfers into multiple packets. For every
- transfer, apart from isochronous transfers, a QH is
- allocated. For every type of transfer these QHs are collected
- at a QH for that type. Isochronous transfers have to be
- executed first because of the fixed latency requirement and
- are directly referred to by the pointer in the framelist. The
- last isochronous TD refers to the QH for interrupt transfers
- for that frame. All QHs for interrupt transfers point at the
- QH for control transfers, which in turn points at the QH for
- bulk transfers. The following diagram gives a graphical
- overview of this:</para>
-
- <para>This results in the following schedule being run in each
- frame. After fetching the pointer for the current frame from
- the framelist the controller first executes the TDs for all
- the isochronous packets in that frame. The last of these TDs
- refers to the QH for the interrupt transfers for
- thatframe. The host controller will then descend from that QH
- to the QHs for the individual interrupt transfers. After
- finishing that queue, the QH for the interrupt transfers will
- refer the controller to the QH for all control transfers. It
- will execute all the subqueues scheduled there, followed by
- all the transfers queued at the bulk QH. To facilitate the
- handling of finished or failed transfers different types of
- interrupts are generatedby the hardware at the end of each
- frame. In the last TD for a transfer the Interrupt-On
- Completion bit is set by the HC driver to flag an interrupt
- when the transfer has completed. An error interrupt is flagged
- if a TD reaches its maximum error count. If the short packet
- detect bit is set in a TD and less than the set packet length
- is transferred this interrupt is flagged to notify
- the controller driver of the completed transfer. It is the host
- controller driver's task to find out which transfer has
- completed or produced an error. When called the interrupt
- service routine will locate all the finished transfers and
- call their callbacks.</para>
-
- <para>See for a more elaborate description the <ulink
- url="http://developer.intel.com/design/USB/UHCI11D.htm">UHCI
- specification.</ulink></para>
-
- </sect2>
-
- <sect2>
- <title>OHCI</title>
-
- <para>Programming an OHCI host controller is much simpler. The
- controller assumes that a set of endpoints is available, and
- is aware of scheduling priorities and the ordering of the
- types of transfers in a frame. The main data structure used by
- the host controller is the endpoint descriptor (ED) to which
- aqueue of transfer descriptors (TDs) is attached. The ED
- contains the maximum packet size allowed for an endpoint and
- the controller hardware does the splitting into packets. The
- pointers to the data buffers are updated after each transfer
- and when the start and end pointer are equal, the TD is
- retired to the done-queue. The four types of endpoints have
- their own queues. Control and bulk endpoints are queued each at
- their own queue. Interrupt EDs are queued in a tree, with the
- level in the tree defining the frequency at which they
- run.</para>
-
- <para>framelist interruptisochronous control bulk</para>
-
- <para>The schedule being run by the host controller in each
- frame looks as follows. The controller will first run the
- non-periodic control and bulk queues, up to a time limit set
- by the HC driver. Then the interrupt transfers for that frame
- number are run, by using the lower five bits of the frame
- number as an index into level 0 of the tree of interrupts
- EDs. At the end of this tree the isochronous EDs are connected
- and these are traversed subsequently. The isochronous TDs
- contain the frame number of the first frame the transfer
- should be run in. After all the periodic transfers have been
- run, the control and bulk queues are traversed
- again. Periodically the interrupt service routine is called to
- process the done queue and call the callbacks for each
- transfer and reschedule interrupt and isochronous
- endpoints.</para>
-
- <para>See for a more elaborate description the <ulink
- url="http://www.compaq.com/productinfo/development/openhci.html">
- OHCI specification</ulink>. Services layer The middle layer
- provides access to the device in a controlled way and
- maintains resources inuse by the different drivers and the
- services layer. The layer takes care of the following
- aspects:</para>
-
- <itemizedlist>
- <listitem><para>The device configuration
- information</para></listitem>
- <listitem><para>The pipes to communicate with a
- device</para></listitem>
- <listitem><para>Probing and attaching and detaching form a
- device.</para></listitem>
- </itemizedlist>
-
- </sect2>
- </sect1>
-
- <sect1 id="usb-dev">
- <title>USB Device Information</title>
-
- <sect2>
- <title>Device configuration information</title>
-
- <para>Each device provides different levels of configuration
- information. Each device has one or more configurations, of
- which one is selected during probe/attach. A configuration
- provides power and bandwidth requirements. Within each
- configuration there can be multiple interfaces. A device
- interface is a collection of endpoints. For example USB
- speakers can have an interface for the audio data (Audio
- Class) and an interface for the knobs, dials and buttons (HID
- Class). All interfaces in a configuration areactive at the
- same time and can be attached to by different drivers. Each
- interface can have alternates, providing different quality of
- service parameters. In for example cameras this is used to
- provide different frame sizes and numbers of frames per
- second.</para>
-
- <para>Within each interface 0 or more endpoints can be
- specified. Endpoints are the unidirectional access points for
- communicating with a device. They provide buffers to
- temporarily store incoming or outgoing data from the
- device. Each endpoint has a unique address within
- a configuration, the endpoint's number plus its direction. The
- default endpoint, endpoint 0, is not part of any interface and
- available in all configurations. It is managed by the services
- layer and not directly available to device drivers.</para>
-
- <para>Level 0 Level 1 Level 2 Slot 0</para>
- <para>Slot 3 Slot 2 Slot 1</para>
- <para>(Only 4 out of 32 slots shown)</para>
-
- <para>This hierarchical configuration information is described
- in the device by a standard set of descriptors (see section 9.6
- of the USB specification [ 2]). They can be requested through
- the Get Descriptor Request. The services layer caches these
- descriptors to avoid unnecessary transferson the USB
- bus. Access to the descriptors is provided through function
- calls.</para>
-
- <itemizedlist>
- <listitem><para>Device descriptors: General information about
- the device, like Vendor, Product and Revision Id, supported
- device class, subclass and protocol if applicable, maximum
- packet size for the default endpoint, etc.</para></listitem>
-
- <listitem><para>Configuration descriptors: The number of
- interfaces in this configuration, suspend and resume
- functionality supported and power
- requirements.</para></listitem>
-
- <listitem><para>Interface descriptors: interface class,
- subclass and protocol if applicable, number of alternate
- settings for the interface and the number of
- endpoints.</para></listitem>
-
- <listitem><para>Endpoint descriptors: Endpoint address,
- direction and type, maximum packet size supported and
- polling frequency if type is interrupt endpoint. There is no
- descriptor for thedefault endpoint (endpoint 0) and it is
- never counted in an interface descriptor.</para></listitem>
-
- <listitem><para>String descriptors: In the other descriptors
- string indices are supplied for some fields.These can be
- used to retrieve descriptive strings, possibly in multiple
- languages.</para></listitem>
-
- </itemizedlist>
-
- <para>Class specifications can add their own descriptor types
- that are available through the GetDescriptor Request.</para>
-
- <para>Pipes Communication to end points on a device flows
- through so-called pipes. Drivers submit transfers to endpoints
- to a pipe and provide a callback to be called on completion or
- failure of the transfer (asynchronous transfers) or wait for
- completion (synchronous transfer). Transfers to an endpoint
- are serialised in the pipe. A transfer can either complete,
- fail or time-out (if a time-out has been set). There are two
- types of time-outs for transfers. Time-outs can happen due to
- time-out on the USBbus (milliseconds). These time-outs are
- seen as failures and can be due to disconnection of the
- device. A second form of time-out is implemented in software
- and is triggered when a transfer does not complete within a
- specified amount of time (seconds). These are caused by a
- device acknowledging negatively (NAK) the transferred
- packets. The cause for this is the device not being ready to
- receive data, buffer under- or overrun or protocol
- errors.</para>
-
- <para>If a transfer over a pipe is larger than the maximum
- packet size specified in the associated endpoint descriptor,
- the host controller (OHCI) or the HC driver (UHCI) will split
- the transfer into packets of maximum packet size, with the
- last packet possibly smaller than the maximum
- packetsize.</para>
-
- <para>Sometimes it is not a problem for a device to return less
- data than requested. For example abulk-in-transfer to a modem
- might request 200 bytes of data, but the modem has only 5
- bytes available at that time. The driver can set the short
- packet (SPD) flag. It allows the host controller to accept a
- packet even if the amount of data transferred is less than
- requested. This flag is only valid for in-transfers, as the
- amount of data to be sent to a device is always known
- beforehand. If an unrecoverable error occurs in a device
- during a transfer the pipe is stalled. Before any more data is
- accepted or sent the driver needs to resolve the cause of the
- stall and clear the endpoint stall condition through send the
- clear endpoint halt device request over the default
- pipe. The default endpoint should never stall.</para>
-
- <para>There are four different types of endpoints and
- corresponding pipes: - Control pipe / default pipe: There is
- one control pipe per device, connected to the default endpoint
- (endpoint 0). The pipe carries the device requests and
- associated data. The difference between transfers over the
- default pipe and other pipes is that the protocol for
- thetransfers is described in the USB specification [ 2]. These
- requests are used to reset and configure the device. A basic
- set of commands that must be supported by each device is
- provided in chapter 9 of the USB specification [ 2]. The
- commands supported on this pipe canbe extended by a device
- class specification to support additional
- functionality.</para>
-
- <itemizedlist>
- <listitem><para>Bulk pipe: This is the USB equivalent to a raw
- transmission medium.</para></listitem>
- <listitem><para>Interrupt pipe: The host sends a request for
- data to the device and if the device has nothing to send, it
- will NAK the data packet. Interrupt transfers are scheduled
- at a frequency specifiedwhen creating the
- pipe.</para></listitem>
-
- <listitem><para>Isochronous pipe: These pipes are intended for
- isochronous data, for example video oraudio streams, with
- fixed latency, but no guaranteed delivery. Some support for
- pipes of this type is available in the current
- implementation. Packets in control, bulk and interrupt
- transfers are retried if an error occurs during transmission
- or the device acknowledges the packet negatively (NAK) due to
- for example lack of buffer space to store the incoming
- data. Isochronous packets are however not retried in case of
- failed delivery or NAK of a packet as this might violate the
- timing constraints.</para></listitem>
- </itemizedlist>
-
- <para>The availability of the necessary bandwidth is calculated
- during the creation of the pipe. Transfersare scheduled within
- frames of 1 millisecond. The bandwidth allocation within a
- frame is prescribed by the USB specification, section 5.6 [
- 2]. Isochronous and interrupt transfers areallowed to consume
- up to 90% of the bandwidth within a frame. Packets for control
- and bulk transfers are scheduled after all isochronous and
- interrupt packets and will consume all the remaining
- bandwidth.</para>
-
- <para>More information on scheduling of transfers and bandwidth
- reclamation can be found in chapter 5of the USB specification
- [ 2], section 1.3 of the UHCI specification [ 3] and section
- 3.4.2 of the OHCI specification [4].</para>
-
- </sect2>
- </sect1>
-
- <sect1 id="usb-devprobe">
- <title>Device probe and attach</title>
-
- <para>After the notification by the hub that a new device has been
- connected, the service layer switcheson the port, providing the
- device with 100 mA of current. At this point the device is in
- its default state and listening to device address 0. The
- services layer will proceed to retrieve the various descriptors
- through the default pipe. After that it will send a Set Address
- request to move the device away from the default device address
- (address 0). Multiple device drivers might be able to support
- the device. For example a modem driver might beable to support
- an ISDN TA through the AT compatibility interface. A driver for
- that specific model of the ISDN adapter might however be able to
- provide much better support for this device. To support this
- flexibility, the probes return priorities indicating their level
- of support. Support for a specific revision of a product ranks
- the highest and the generic driver the lowest priority. It might
- also be that multiple drivers could attach to one device if
- there are multiple interfaceswithin one configuration. Each
- driver only needs to support a subset of the interfaces.</para>
-
- <para>The probing for a driver for a newly attached device checks
- first for device specific drivers. If notfound, the probe code
- iterates over all supported configurations until a driver
- attaches in a configuration. To support devices with multiple
- drivers on different interfaces, the probe iteratesover all
- interfaces in a configuration that have not yet been claimed by
- a driver. Configurations that exceed the power budget for the
- hub are ignored. During attach the driver should initialise the
- device to its proper state, but not reset it, as this will make
- the device disconnect itself from the bus and restart the
- probing process for it. To avoid consuming unnecessary bandwidth
- should not claim the interrupt pipe at attach time, but
- should postpone allocating the pipe until the file is opened and
- the data is actually used. When the file is closed the pipe
- should be closed again, eventhough the device might still be
- attached.</para>
-
- <sect2>
- <title>Device disconnect and detach</title>
-
- <para>A device driver should expect to receive errors during any
- transaction with the device. The designof USB supports and
- encourages the disconnection of devices at any point in
- time. Drivers should make sure that they do the right thing
- when the device disappears.</para>
-
- <para>Furthermore a device that has been disconnected and
- reconnected will not be reattached at the same device
- instance. This might change in the future when more devices
- support serial numbers (see the device descriptor) or other
- means of defining an identity for a device have been
- developed.</para>
-
- <para>The disconnection of a device is signalled by a hub in the
- interrupt packet delivered to the hub driver. The status
- change information indicates which port has seen a connection
- change. The device detach method for all device drivers for
- the device connected on that port are called and the structures
- cleaned up. If the port status indicates that in the mean time
- a device has been connected to that port, the procedure for
- probing and attaching the device will be started. A device
- reset will produce a disconnect-connect sequence on the hub
- and will be handled as described above.</para>
-
- </sect2>
- </sect1>
-
- <sect1 id="usb-protocol">
- <title>USB Drivers Protocol Information</title>
-
- <para>The protocol used over pipes other than the default pipe is
- undefined by the USB specification. Information on this can be
- found from various sources. The most accurate source is the
- developer's section on the USB home pages [ 1]. From these pages
- a growing number of deviceclass specifications are
- available. These specifications specify what a compliant device
- should look like from a driver perspective, basic functionality
- it needs to provide and the protocol that is to be used over the
- communication channels. The USB specification [ 2] includes the
- description of the Hub Class. A class specification for Human
- Interface Devices (HID) has been created to cater for keyboards,
- tablets, bar-code readers, buttons, knobs, switches, etc. A
- third example is the class specification for mass storage
- devices. For a full list of device classes see the developers
- sectionon the USB home pages [ 1].</para>
-
- <para>For many devices the protocol information has not yet been
- published however. Information on the protocol being used might
- be available from the company making the device. Some companies
- will require you to sign a Non -Disclosure Agreement (NDA)
- before giving you the specifications. This in most cases
- precludes making the driver open source.</para>
-
- <para>Another good source of information is the Linux driver
- sources, as a number of companies have started to provide drivers
- for Linux for their devices. It is always a good idea to contact
- the authors of those drivers for their source of
- information.</para>
-
- <para>Example: Human Interface Devices The specification for the
- Human Interface Devices like keyboards, mice, tablets, buttons,
- dials,etc. is referred to in other device class specifications
- and is used in many devices.</para>
-
- <para>For example audio speakers provide endpoints to the digital
- to analogue converters and possibly an extra pipe for a
- microphone. They also provide a HID endpoint in a separate
- interface for the buttons and dials on the front of the
- device. The same is true for the monitor control class. It is
- straightforward to build support for these interfaces through
- the available kernel and userland libraries together with the
- HID class driver or the generic driver. Another device that
- serves as an example for interfaces within one configuration
- driven by different device drivers is a cheap keyboard with
- built-in legacy mouse port. To avoid having the cost of
- including the hardware for a USB hub in the device,
- manufacturers combined the mouse data received from the PS/2 port
- on the back of the keyboard and the keypresses from the keyboard
- into two separate interfaces in the same configuration. The
- mouse and keyboard drivers each attach to the appropriate
- interface and allocate the pipes to the two independent
- endpoints.</para>
-
- <para>Example: Firmware download Many devices that have been
- developed are based on a general purpose processor with
- anadditional USB core added to it. Because the development of
- drivers and firmware for USB devices is still very new, many
- devices require the downloading of the firmware after they
- have been connected.</para>
-
- <para>The procedure followed is straightforward. The device
- identifies itself through a vendor and product Id. The first
- driver probes and attaches to it and downloads the firmware into
- it. After that the device soft resets itself and the driver is
- detached. After a short pause the devicere announces its presence
- on the bus. The device will have changed its
- vendor/product/revision Id to reflect the fact that it has been
- supplied with firmware and as a consequence a second driver will
- probe it and attach to it.</para>
-
- <para>An example of these types of devices is the ActiveWire I/O
- board, based on the EZ-USB chip. For this chip a generic firmware
- downloader is available. The firmware downloaded into the
- ActiveWire board changes the revision Id. It will then perform a
- soft reset of the USB part of the EZ-USB chip to disconnect from
- the USB bus and again reconnect.</para>
-
- <para>Example: Mass Storage Devices Support for mass storage
- devices is mainly built around existing protocols. The Iomega
- USB Zipdrive is based on the SCSI version of their drive. The
- SCSI commands and status messages are wrapped in blocks and
- transferred over the bulk pipes to and from the device,
- emulating a SCSI controller over the USB wire. ATAPI and UFI
- commands are supported in a similar fashion.</para>
-
- <para>The Mass Storage Specification supports 2 different types of
- wrapping of the command block.The initial attempt was based on
- sending the command and status through the default pipe and
- using bulk transfers for the data to be moved between the host
- and the device. Based on experience a second approach was
- designed that was based on wrapping the command and status
- blocks and sending them over the bulk out and in endpoint. The
- specification specifies exactly what has to happen when and what
- has to be done in case an error condition is encountered. The
- biggest challenge when writing drivers for these devices is to
- fit USB based protocol into theexisting support for mass storage
- devices. CAM provides hooks to do this in a fairly straight
- forward way. ATAPI is less simple as historically the IDE
- interface has never had many different appearances.</para>
-
- <para>The support for the USB floppy from Y-E Data is again less
- straightforward as a new command set has been designed.</para>
-
- </sect1>
-
-</chapter> \ No newline at end of file
diff --git a/en_US.ISO8859-1/books/developers-handbook/vm/chapter.sgml b/en_US.ISO8859-1/books/developers-handbook/vm/chapter.sgml
deleted file mode 100644
index 4710973d5f..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/vm/chapter.sgml
+++ /dev/null
@@ -1,255 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD: doc/en_US.ISO_8859-1/books/developers-handbook/usb/chapter.sgml,v 1.1 2001/04/13 09:05:13 murray Exp $
--->
-
-<chapter id="vm">
- <title>Virtual Memory System</title>
-
- <sect1 id="internals-vm">
- <title>The FreeBSD VM System</title>
-
- <para><emphasis>Contributed by &a.dillon;. 6 Feb 1999</emphasis></para>
-
- <sect2>
- <title>Management of physical
- memory&mdash;<literal>vm_page_t</literal></title>
-
- <para>Physical memory is managed on a page-by-page basis through the
- <literal>vm_page_t</literal> structure. Pages of physical memory are
- categorized through the placement of their respective
- <literal>vm_page_t</literal> structures on one of several paging
- queues.</para>
-
- <para>A page can be in a wired, active, inactive, cache, or free state.
- Except for the wired state, the page is typically placed in a doubly
- link list queue representing the state that it is in. Wired pages
- are not placed on any queue.</para>
-
- <para>FreeBSD implements a more involved paging queue for cached and
- free pages in order to implement page coloring. Each of these states
- involves multiple queues arranged according to the size of the
- processor's L1 and L2 caches. When a new page needs to be allocated,
- FreeBSD attempts to obtain one that is reasonably well aligned from
- the point of view of the L1 and L2 caches relative to the VM object
- the page is being allocated for.</para>
-
- <para>Additionally, a page may be held with a reference count or locked
- with a busy count. The VM system also implements an <quote>ultimate
- locked</quote> state for a page using the PG_BUSY bit in the page's
- flags.</para>
-
- <para>In general terms, each of the paging queues operates in a LRU
- fashion. A page is typically placed in a wired or active state
- initially. When wired, the page is usually associated with a page
- table somewhere. The VM system ages the page by scanning pages in a
- more active paging queue (LRU) in order to move them to a less-active
- paging queue. Pages that get moved into the cache are still
- associated with a VM object but are candidates for immediate reuse.
- Pages in the free queue are truly free. FreeBSD attempts to minimize
- the number of pages in the free queue, but a certain minimum number of
- truly free pages must be maintained in order to accommodate page
- allocation at interrupt time.</para>
-
- <para>If a process attempts to access a page that does not exist in its
- page table but does exist in one of the paging queues ( such as the
- inactive or cache queues), a relatively inexpensive page reactivation
- fault occurs which causes the page to be reactivated. If the page
- does not exist in system memory at all, the process must block while
- the page is brought in from disk.</para>
-
- <para>FreeBSD dynamically tunes its paging queues and attempts to
- maintain reasonable ratios of pages in the various queues as well as
- attempts to maintain a reasonable breakdown of clean v.s. dirty pages.
- The amount of rebalancing that occurs depends on the system's memory
- load. This rebalancing is implemented by the pageout daemon and
- involves laundering dirty pages (syncing them with their backing
- store), noticing when pages are activity referenced (resetting their
- position in the LRU queues or moving them between queues), migrating
- pages between queues when the queues are out of balance, and so forth.
- FreeBSD's VM system is willing to take a reasonable number of
- reactivation page faults to determine how active or how idle a page
- actually is. This leads to better decisions being made as to when to
- launder or swap-out a page.</para>
- </sect2>
-
- <sect2>
- <title>The unified buffer
- cache&mdash;<literal>vm_object_t</literal></title>
-
- <para>FreeBSD implements the idea of a generic <quote>VM object</quote>.
- VM objects can be associated with backing store of various
- types&mdash;unbacked, swap-backed, physical device-backed, or
- file-backed storage. Since the filesystem uses the same VM objects to
- manage in-core data relating to files, the result is a unified buffer
- cache.</para>
-
- <para>VM objects can be <emphasis>shadowed</emphasis>. That is, they
- can be stacked on top of each other. For example, you might have a
- swap-backed VM object stacked on top of a file-backed VM object in
- order to implement a MAP_PRIVATE mmap()ing. This stacking is also
- used to implement various sharing properties, including,
- copy-on-write, for forked address spaces.</para>
-
- <para>It should be noted that a <literal>vm_page_t</literal> can only be
- associated with one VM object at a time. The VM object shadowing
- implements the perceived sharing of the same page across multiple
- instances.</para>
- </sect2>
-
- <sect2>
- <title>Filesystem I/O&mdash;<literal>struct buf</literal></title>
-
- <para>vnode-backed VM objects, such as file-backed objects, generally
- need to maintain their own clean/dirty info independent from the VM
- system's idea of clean/dirty. For example, when the VM system decides
- to synchronize a physical page to its backing store, the VM system
- needs to mark the page clean before the page is actually written to
- its backing s tore. Additionally, filesystems need to be able to map
- portions of a file or file metadata into KVM in order to operate on
- it.</para>
-
- <para>The entities used to manage this are known as filesystem buffers,
- <literal>struct buf</literal>'s, and also known as
- <literal>bp</literal>'s. When a filesystem needs to operate on a
- portion of a VM object, it typically maps part of the object into a
- struct buf and the maps the pages in the struct buf into KVM. In the
- same manner, disk I/O is typically issued by mapping portions of
- objects into buffer structures and then issuing the I/O on the buffer
- structures. The underlying vm_page_t's are typically busied for the
- duration of the I/O. Filesystem buffers also have their own notion of
- being busy, which is useful to filesystem driver code which would
- rather operate on filesystem buffers instead of hard VM pages.</para>
-
- <para>FreeBSD reserves a limited amount of KVM to hold mappings from
- struct bufs, but it should be made clear that this KVM is used solely
- to hold mappings and does not limit the ability to cache data.
- Physical data caching is strictly a function of
- <literal>vm_page_t</literal>'s, not filesystem buffers. However,
- since filesystem buffers are used placehold I/O, they do inherently
- limit the amount of concurrent I/O possible. As there are usually a
- few thousand filesystem buffers available, this is not usually a
- problem.</para>
- </sect2>
-
- <sect2>
- <title>Mapping Page Tables - vm_map_t, vm_entry_t</title>
-
- <para>FreeBSD separates the physical page table topology from the VM
- system. All hard per-process page tables can be reconstructed on the
- fly and are usually considered throwaway. Special page tables such as
- those managing KVM are typically permanently preallocated. These page
- tables are not throwaway.</para>
-
- <para>FreeBSD associates portions of vm_objects with address ranges in
- virtual memory through <literal>vm_map_t</literal> and
- <literal>vm_entry_t</literal> structures. Page tables are directly
- synthesized from the
- <literal>vm_map_t</literal>/<literal>vm_entry_t</literal>/
- <literal>vm_object_t</literal> hierarchy. Remember when I mentioned
- that physical pages are only directly associated with a
- <literal>vm_object</literal>. Well, that isn't quite true.
- <literal>vm_page_t</literal>'s are also linked into page tables that
- they are actively associated with. One <literal>vm_page_t</literal>
- can be linked into several <emphasis>pmaps</emphasis>, as page tables
- are called. However, the hierarchical association holds so all
- references to the same page in the same object reference the same
- <literal>vm_page_t</literal> and thus give us buffer cache unification
- across the board.</para>
- </sect2>
-
- <sect2>
- <title>KVM Memory Mapping</title>
-
- <para>FreeBSD uses KVM to hold various kernel structures. The single
- largest entity held in KVM is the filesystem buffer cache. That is,
- mappings relating to <literal>struct buf</literal> entities.</para>
-
- <para>Unlike Linux, FreeBSD does NOT map all of physical memory into
- KVM. This means that FreeBSD can handle memory configurations up to
- 4G on 32 bit platforms. In fact, if the mmu were capable of it,
- FreeBSD could theoretically handle memory configurations up to 8TB on
- a 32 bit platform. However, since most 32 bit platforms are only
- capable of mapping 4GB of ram, this is a moot point.</para>
-
- <para>KVM is managed through several mechanisms. The main mechanism
- used to manage KVM is the <emphasis>zone allocator</emphasis>. The
- zone allocator takes a chunk of KVM and splits it up into
- constant-sized blocks of memory in order to allocate a specific type
- of structure. You can use <command>vmstat -m</command> to get an
- overview of current KVM utilization broken down by zone.</para>
- </sect2>
-
- <sect2>
- <title>Tuning the FreeBSD VM system</title>
-
- <para>A concerted effort has been made to make the FreeBSD kernel
- dynamically tune itself. Typically you do not need to mess with
- anything beyond the <literal>maxusers</literal> and
- <literal>NMBCLUSTERS</literal> kernel config options. That is, kernel
- compilation options specified in (typically)
- <filename>/usr/src/sys/i386/conf/<replaceable>CONFIG_FILE</replaceable></filename>.
- A description of all available kernel configuration options can be
- found in <filename>/usr/src/sys/i386/conf/LINT</filename>.</para>
-
- <para>In a large system configuration you may wish to increase
- <literal>maxusers</literal>. Values typically range from 10 to 128.
- Note that raising <literal>maxusers</literal> too high can cause the
- system to overflow available KVM resulting in unpredictable operation.
- It is better to leave maxusers at some reasonable number and add other
- options, such as <literal>NMBCLUSTERS</literal>, to increase specific
- resources.</para>
-
- <para>If your system is going to use the network heavily, you may want
- to increase <literal>NMBCLUSTERS</literal>. Typical values range from
- 1024 to 4096.</para>
-
- <para>The <literal>NBUF</literal> parameter is also traditionally used
- to scale the system. This parameter determines the amount of KVA the
- system can use to map filesystem buffers for I/O. Note that this
- parameter has nothing whatsoever to do with the unified buffer cache!
- This parameter is dynamically tuned in 3.0-CURRENT and later kernels
- and should generally not be adjusted manually. We recommend that you
- <emphasis>not</emphasis> try to specify an <literal>NBUF</literal>
- parameter. Let the system pick it. Too small a value can result in
- extremely inefficient filesystem operation while too large a value can
- starve the page queues by causing too many pages to become wired
- down.</para>
-
- <para>By default, FreeBSD kernels are not optimized. You can set
- debugging and optimization flags with the
- <literal>makeoptions</literal> directive in the kernel configuration.
- Note that you should not use <option>-g</option> unless you can
- accommodate the large (typically 7 MB+) kernels that result.</para>
-
- <programlisting>makeoptions DEBUG="-g"
-makeoptions COPTFLAGS="-O -pipe"</programlisting>
-
- <para>Sysctl provides a way to tune kernel parameters at run-time. You
- typically do not need to mess with any of the sysctl variables,
- especially the VM related ones.</para>
-
- <para>Run time VM and system tuning is relatively straightforward.
- First, use softupdates on your UFS/FFS filesystems whenever possible.
- <filename>/usr/src/contrib/sys/softupdates/README</filename> contains
- instructions (and restrictions) on how to configure it up.</para>
-
- <para>Second, configure sufficient swap. You should have a swap
- partition configured on each physical disk, up to four, even on your
- <quote>work</quote> disks. You should have at least 2x the swap space
- as you have main memory, and possibly even more if you do not have a
- lot of memory. You should also size your swap partition based on the
- maximum memory configuration you ever intend to put on the machine so
- you do not have to repartition your disks later on. If you want to be
- able to accommodate a crash dump, your first swap partition must be at
- least as large as main memory and <filename>/var/crash</filename> must
- have sufficient free space to hold the dump.</para>
-
- <para>NFS-based swap is perfectly acceptable on -4.x or later systems,
- but you must be aware that the NFS server will take the brunt of the
- paging load.</para>
- </sect2>
- </sect1>
-
-</chapter>
diff --git a/en_US.ISO8859-1/books/developers-handbook/x86/chapter.sgml b/en_US.ISO8859-1/books/developers-handbook/x86/chapter.sgml
deleted file mode 100644
index c7a74aa21d..0000000000
--- a/en_US.ISO8859-1/books/developers-handbook/x86/chapter.sgml
+++ /dev/null
@@ -1,6488 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- This file is automatically generated. Please do not make commits
- to this file. Updates should be sent to the author :
-
- G. Adam Stanislav (adam@whizkidtech.net)
-
- This chapter is an exception to our general rule, and the author
- retains the copyright. Among other things, this means that this
- chapter should not be included in any printed version of the
- Developer's Handbook without Adam's explicit permission.
-
- Eventually we will have to replace this chapter or convince the
- author to assign us the copyright. For now, it is valuable
- content so it should stay.
-
- $FreeBSD: doc/en_US.ISO8859-1/books/developers-handbook/x86/chapter.sgml,v 1.4 2001/06/23 06:56:59 dd Exp $
--->
-
-<chapter id="x86">
-
-<title>x86 Assembly Language Programming</title>
-<para>
-<emphasis>
-This chapter was written by G. Adam Stanislav.
-<ulink url="http://www.whizkidtech.net/">Whiz Kid Technomagic</ulink>
-</emphasis></para>
-
-
-
-<sect1 id="x86-intro">
-<title>Synopsis</title>
-
-<para>
-Assembly language programing under Unix is highly undocumented. It
-is generally assumed that no one would ever want to use it because
-various Unix systems run on different microprocessors, so everything
-should be written in C for portability.
-</para>
-
-<para>
-In reality, C portability is quite a myth. Even C programs need
-to be modified when ported from one Unix to another, regardless of
-what processor each runs on. Typically, such a program is full
-of conditional statements depending on the system it is
-compiled for.
-</para>
-
-<para>
-Even if we believe that all of Unix software should be written in C,
-or some other high-level language, we still need assembly language
-programmers: Who else would write the section of C library
-that accesses the kernel?
-</para>
-
-<para>
-In this chapter I will attempt to show you
-how you can use assembly language writing
-Unix programs, specifically under FreeBSD.
-</para>
-
-<para>
-This chapter does not explain the basics of assembly language.
-There are enough resources about that (for a complete
-online course in assembly language, see Randall Hyde's
-<ulink url="http://webster.cs.ucr.edu/">Art
-of Assembly Language</ulink>; or if you prefer
-a printed book, take a look at Jeff Duntemann's
-<ulink url="http://www.int80h.org/cgi-bin/isbn?isbn=0471375233">Assembly
-Language Step-by-Step</ulink>). However,
-once the chapter is finished, any assembly language programmer
-will be able to write programs for FreeBSD
-quickly and efficiently.
-</para>
-
-<para>
-Copyright &copy; 2000-2001 G. Adam Stanislav. All rights reserved.
-</para>
-
-</sect1>
-
-<sect1 id="x86-the-tools">
-<title>The Tools</title>
-
-<sect2 id="x86-the-assembler">
-<title>The Assembler</title>
-
-<para>
-The most important tool for assembly language programming is the
-assembler, the software that converts assembly language code
-into machine language.
-</para>
-
-<para>
-Two very different assemblers are available for FreeBSD. One is
-<citerefentry><refentrytitle>as</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
-which uses the traditional Unix assembly language syntax. It
-comes with the system.
-</para>
-
-<para>
-The other is <application>/usr/ports/devel/nasm</application>.
-It uses the Intel syntax. Its main advantage is that it
-can assemble code for many operating systems. It needs
-to be installed separately, but is completely free.
-</para>
-
-<para>
-This chapter uses <application>nasm</application>
-syntax because most assembly language programmers
-coming to FreeBSD from other operating systems
-will find it easier to understand. And, because,
-quite frankly, that is what I am used to.
-</para>
-
-</sect2>
-
-<sect2 id="x86-the-linker">
-<title>The Linker</title>
-
-<para>
-The output of the assembler, like that of any
-compiler, needs to be linked to form an executable file.
-</para>
-
-<para>
-The standard
-<citerefentry><refentrytitle>ld</refentrytitle><manvolnum>1</manvolnum></citerefentry>
-linker comes with FreeBSD. It works with the
-code assembled with either assembler.
-</para>
-
-</sect2>
-</sect1>
-
-<sect1 id="x86-system-calls">
-<title>System Calls</title>
-
-<sect2 id="x86-default-calling-convention">
-<title>Default Calling Convention</title>
-
-<para>
-By default, the FreeBSD kernel uses the C calling
-convention. Further, although the kernel is accessed
-using <function role="opcode">int 80h</function>,
-it is assumed the program will call a function that
-issues <function role="opcode">int 80h</function>, rather than
-issuing <function role="opcode">int 80h</function> directly.
-</para>
-
-<para>
-This convention is very convenient, and quite superior to the
-Microsoft convention used by <acronym>MS DOS</acronym>.
-Why? Because the Unix convention allows any program written in
-any language to access the kernel.
-</para>
-
-<para>
-An assembly language program can do that as well.
-For example, we could open a file:
-</para>
-
-<programlisting>
-kernel:
- int 80h ; Call kernel
- ret
-
-open:
- push dword mode
- push dword flags
- push dword path
- mov eax, 5
- call kernel
- add esp, byte 12
- ret
-</programlisting>
-
-<para>
-This is a very clean and portable way of coding. If you need to
-port the code to a Unix system which uses a different interrupt,
-or a different way of passing parameters, all you need to change
-is the kernel procedure.
-</para>
-
-<para>
-But assembly language programmers like to shave off cycles. The above example
-requires a <function role="opcode">call/ret</function> combination.
-We can eliminate it by
-<function role="opcode">push</function>ing an extra dword:
-</para>
-
-<programlisting>
-open:
- push dword mode
- push dword flags
- push dword path
- mov eax, 5
- push eax ; Or any other dword
- int 80h
- add esp, byte 16
-</programlisting>
-
-<para>
-The <constant>5</constant> that we have placed in
-<varname role="register">EAX</varname> identifies
-the kernel function, in this case <function role="syscall">open</function>.
-</para>
-
-</sect2>
-<sect2 id="x86-alternate-calling-convention">
-<title>Alternate Calling Convention</title>
-<para>
-FreeBSD is an extremely flexible system. It offers other ways of
-calling the kernel. For it to work, however, the system must
-have Linux emulation installed.
-</para>
-
-<para>
-Linux is a Unix-like system. However, its kernel uses the same
-system-call convention of passing parameters in registers
-<acronym>MS DOS</acronym> does. As with the Unix convention,
-the function number is placed in <varname role="register">EAX</varname>.
-The parameters, however, are not passed on the stack but in
-<varname role="register">EBX, ECX, EDX, ESI, EDI, EBP</varname>:
-</para>
-
-<programlisting>
-open:
- mov eax, 5
- mov ebx, path
- mov ecx, flags
- mov edx, mode
- int 80h
-</programlisting>
-
-<para>
-This convention has a great disadvantage over
-the Unix way, at least as far as assembly language programming
-is concerned: Every time you make a kernel call
-you must <function role="opcode">push</function> the registers, then
-<function role="opcode">pop</function> them later. This makes your code
-bulkier and slower. Nevertheless, FreeBSD gives
-you a choice.
-</para>
-
-<para>
-If you do choose the Linux convention, you must let
-the system know about it. After your program is assembled and
-linked, you need to brand the executable:
-</para>
-
-<screen>&prompt.user; <userinput>brandelf -f Linux <replaceable>filename</replaceable></userinput></screen>
-
-</sect2>
-
-<sect2 id="x86-use-geneva">
-<title>Which Convention Should You Use?</title>
-
-<para>
-If you are coding specifically for FreeBSD, you should always
-use the Unix convention: It is faster, you can store global
-variables in registers, you do not have to brand
-the executable, and you do not impose the installation of
-the Linux emulation package on the target system.
-</para>
-
-<para>
-If you want to create portable code that can also run
-on Linux, you will probably still want to give the FreeBSD
-users as efficient a code as possible. I will show you
-how you can accomplish that after I have explained the basics.
-</para>
-
-</sect2>
-
-<sect2 id="x86-call-numbers">
-<title>Call Numbers</title>
-
-<para>
-To tell the kernel which system service you are calling,
-place its number in <varname role="register">EAX</varname>. Of course, you need
-to know what the number is.
-</para>
-
-<sect3 id="x86-the-syscalls-file">
-<title>The <filename>syscalls</filename> File</title>
-
-<para>
-The numbers are listed in <filename>syscalls</filename>.
-<command>locate syscalls</command> finds this file
-in several different formats, all produced automatically
-from <filename>syscalls.master</filename>.
-</para>
-
-<para>
-You can find the master file for the default Unix calling
-convention in
-<filename>/usr/src/sys/kern/syscalls.master</filename>.
-If you need to use the other convention implemented
-in the Linux emulation mode, read
-<filename>/usr/src/sys/i386/linux/syscalls.master</filename>.
-</para>
-
-<note>
-<para>
-Not only do FreeBSD and Linux use different calling
-conventions, they sometimes use different numbers for
-the same functions.
-</para>
-</note>
-
-<para>
-<filename>syscalls.master</filename> describes how
-the call is to be made:
-</para>
-
-<programlisting>
-0 STD NOHIDE { int nosys(void); } syscall nosys_args int
-1 STD NOHIDE { void exit(int rval); } exit rexit_args void
-2 STD POSIX { int fork(void); }
-3 STD POSIX { ssize_t read(int fd, void *buf, size_t nbyte); }
-4 STD POSIX { ssize_t write(int fd, const void *buf, size_t nbyte); }
-5 STD POSIX { int open(char *path, int flags, int mode); }
-6 STD POSIX { int close(int fd); }
-etc...
-</programlisting>
-<para>
-It is the leftmost column that tells us the number to place in
-<varname role="register">EAX</varname>.
-</para>
-
-<para>
-The rightmost column tells us what parameters to
-<function role="opcode">push</function>. They are <function role="opcode">push</function>ed
-<emphasis>from right to left</emphasis>.
-</para>
-
-<informalexample>
-<para>
-For example, to <function>open</function> a file, we need
-to <function role="opcode">push</function> the <varname>mode</varname> first,
-then <varname>flags</varname>, then the address at which
-the <varname>path</varname> is stored.
-</para>
-</informalexample>
-
-</sect3>
-
-</sect2>
-
-</sect1>
-
-<sect1 id="x86-return-values">
-<title>Return Values</title>
-
-<para>
-A system call would not be useful most of the time
-if it did not return some kind of a value: The file
-descriptor of an open file, the number of bytes read
-to a buffer, the system time, etc.
-</para>
-
-<para>
-Additionally, the system needs to inform us if an error
-occurs: A file does not exist, system resources are exhausted,
-we passed an invalid parameter, etc.
-</para>
-
-<sect2 id="x86-man-pages">
-<title>Man Pages</title>
-
-<para>
-The traditional place to look for information about various
-system calls under Unix systems are the man pages.
-FreeBSD describes its system calls in section 2, sometimes
-in section 3.
-</para>
-
-<para>
-For example, <citerefentry><refentrytitle>open</refentrytitle><manvolnum>2</manvolnum></citerefentry> says:
-</para>
-
-<blockquote>
-<para>
-If successful, <function>open()</function> returns a non-negative
-integer, termed a file descriptor. It returns <varname>-1</varname> on failure,
-and sets <varname>errno</varname> to indicate the error.
-</para>
-
-</blockquote>
-<para>
-The assembly language programmer new to Unix and FreeBSD will
-immediately ask the puzzling question: Where is
-<varname>errno</varname> and how do I get to it?
-</para>
-
-<note>
-<para>
-The information presented in the man pages applies
-to C programs. The assembly language programmer needs additional
-information.
-</para>
-</note>
-
-</sect2>
-
-<sect2 id="x86-where-return-values">
-<title>Where Are the Return Values?</title>
-
-<para>
-Unfortunately, it depends... For most system calls it is
-in <varname role="register">EAX</varname>, but not for all.
-A good rule of thumb,
-when working with a system call for
-the first time, is to look for
-the return value in <varname role="register">EAX</varname>.
-If it is not there, you
-need further research.
-</para>
-
-<note>
-<para>
-I am aware of one system call that returns the value in
-<varname role="register">EDX</varname>: <function role="syscall">SYS_fork</function>. All others
-I have worked with use <varname role="register">EAX</varname>.
-But I have not worked with them all yet.
-</para>
-</note>
-
-<tip>
-<para>
-If you cannot find the answer here or anywhere else,
-study <application>libc</application> source code and see how it
-interfaces with the kernel.
-</para>
-</tip>
-
-</sect2>
-<sect2 id="x86-where-errno">
-<title>Where Is <varname>errno</varname>?</title>
-
-<para>
-Actually, nowhere...
-</para>
-
-<para>
-<varname>errno</varname> is part of the C language, not the
-Unix kernel. When accessing kernel services directly, the
-error code is returned in <varname role="register">EAX</varname>,
-the same register the proper
-return value generally ends up in.
-</para>
-
-<para>
-This makes perfect sense. If there is no error, there is
-no error code. If there is an error, there is no return
-value. One register can contain either.
-</para>
-
-</sect2>
-
-<sect2 id="x86-how-to-know-error">
-<title>Determining an Error Occurred</title>
-
-<para>
-When using the standard FreeBSD calling convention,
-the <varname role="register">carry flag</varname> is cleared upon success,
-set upon failure.
-</para>
-
-<para>
-When using the Linux emulation mode, the signed
-value in <varname role="register">EAX</varname> is non-negative upon success,
-and contains the return value. In case of an error, the value
-is negative, i.e., <varname>-errno</varname>.
-</para>
-
-</sect2>
-
-</sect1>
-
-<sect1 id="x86-portable-code">
-<title>Creating Portable Code</title>
-
-<para>
-Portability is generally not one of the strengths of assembly language.
-Yet, writing assembly language programs for different platforms is
-possible, especially with <application>nasm</application>. I have written
-assembly language libraries that can be assembled for such different
-operating systems as Windows and FreeBSD.
-</para>
-
-<para>
-It is all the more possible when you want your code to run
-on two platforms which, while different, are based on
-similar architectures.
-</para>
-
-<para>
-For example, FreeBSD is Unix, Linux is Unix-like. I only
-mentioned three differences between them (from an assembly language
-programmer's perspective): The calling convention, the
-function numbers, and the way of returning values.
-</para>
-
-<sect2 id="x86-deal-with-function-numbers"><title>Dealing with Function Numbers</title>
-
-<para>
-In many cases the function numbers are the same. However,
-even when they are not, the problem is easy to deal with:
-Instead of using numbers in your code, use constants which
-you have declared differently depending on the target
-architecture:
-</para>
-
-<programlisting>
-%ifdef LINUX
-%define SYS_execve 11
-%else
-%define SYS_execve 59
-%endif
-</programlisting>
-</sect2>
-<sect2 id="x86-deal-with-geneva"><title>Dealing with Conventions</title>
-<para>
-Both, the calling convention, and the return value (the
-<varname>errno</varname> problem) can be resolved with macros:
-</para>
-
-<programlisting>
-%ifdef LINUX
-
-%macro system 0
- call kernel
-%endmacro
-
-align 4
-kernel:
- push ebx
- push ecx
- push edx
- push esi
- push edi
- push ebp
-
- mov ebx, [esp+32]
- mov ecx, [esp+36]
- mov edx, [esp+40]
- mov esi, [esp+44]
- mov ebp, [esp+48]
- int 80h
-
- pop ebp
- pop edi
- pop esi
- pop edx
- pop ecx
- pop ebx
-
- or eax, eax
- js .errno
- clc
- ret
-
-.errno:
- neg eax
- stc
- ret
-
-%else
-
-%macro system 0
- int 80h
-%endmacro
-
-%endif
-</programlisting>
-
-</sect2>
-
-<sect2 id="x86-deal-with-other-portability"><title>Dealing with Other Portability Issues</title>
-
-<para>
-The above solutions can handle most cases of writing code
-portable between FreeBSD and Linux. Nevertheless, with some
-kernel services the differences are deeper.
-</para>
-
-<para>
-In that case, you need to write two different handlers
-for those particular system calls, and use conditional
-assembly. Luckily, most of your code does something other
-than calling the kernel, so usually you will only need
-a few such conditional sections in your code.
-</para>
-
-</sect2>
-
-<sect2 id="x86-portable-library"><title>Using a Library</title>
-
-<para>
-You can avoid portability issues in your main code altogether
-by writing a library of system calls. Create a separate library
-for FreeBSD, a different one for Linux, and yet other libraries
-for more operating systems.
-</para>
-
-<para>
-In your library, write a separate function (or procedure, if
-you prefer the traditional assembly language terminology) for each system
-call. Use the C calling convention of passing parameters.
-But still use <varname role="register">EAX</varname> to pass the call number in.
-In that case, your FreeBSD library can be very simple, as
-many seemingly different functions can be just labels to
-the same code:
-</para>
-
-<programlisting>
-sys.open:
-sys.close:
-[etc...]
- int 80h
- ret
-</programlisting>
-
-<para>
-Your Linux library will require more different functions.
-But even here you can group system calls using the same
-number of parameters:
-</para>
-
-<programlisting>
-sys.exit:
-sys.close:
-[etc... one-parameter functions]
- push ebx
- mov ebx, [esp+12]
- int 80h
- pop ebx
- jmp sys.return
-
-...
-
-sys.return:
- or eax, eax
- js sys.err
- clc
- ret
-
-sys.err:
- neg eax
- stc
- ret
-</programlisting>
-
-<para>
-The library approach may seem inconvenient at first because
-it requires you to produce a separate file your code depends
-on. But it has many advantages: For one, you only need to
-write it once and can use it for all your programs. You can
-even let other assembly language programmers use it, or perhaps use
-one written by someone else. But perhaps the greatest
-advantage of the library is that your code can be ported
-to other systems, even by other programmers, by simply
-writing a new library without any changes to your code.
-</para>
-
-<para>
-If you do not like the idea of having a library, you can
-at least place all your system calls in a separate assembly language file
-and link it with your main program. Here, again, all porters
-have to do is create a new object file to link with your
-main program.
-</para>
-
-</sect2>
-
-<sect2 id="x86-portable-include">
-<title>Using an Include File</title>
-
-<para>
-If you are releasing your software as (or with)
-source code, you can use macros and place them
-in a separate file, which you include in your
-code.
-</para>
-
-<para>
-Porters of your software will simply write a new
-include file. No library or external object file
-is necessary, yet your code is portable without any
-need to edit the code.
-</para>
-
-<note>
-<para>
-This is the approach we will use throughout this chapter.
-We will name our include file <filename>system.inc</filename>, and
-add to it whenever we deal with a new system call.
-</para>
-</note>
-
-<para>
-We can start our <filename>system.inc</filename> by declaring the
-standard file descriptors:
-</para>
-
-<programlisting>
-%define stdin 0
-%define stdout 1
-%define stderr 2
-</programlisting>
-
-<para>
-Next, we create a symbolic name for each system call:
-</para>
-
-<programlisting>
-%define SYS_nosys 0
-%define SYS_exit 1
-%define SYS_fork 2
-%define SYS_read 3
-%define SYS_write 4
-; [etc...]
-</programlisting>
-
-<para>
-We add a short, non-global procedure with a long name,
-so we do not accidentally reuse the name in our code:
-</para>
-
-<programlisting>
-section .text
-align 4
-access.the.bsd.kernel:
- int 80h
- ret
-</programlisting>
-
-<para>
-We create a macro which takes one argument, the syscall number:
-</para>
-
-<programlisting>
-%macro system 1
- mov eax, %1
- call access.the.bsd.kernel
-%endmacro
-</programlisting>
-
-<para>
-Finally, we create macros for each syscall. These macros take
-no arguments.
-</para>
-
-<programlisting>
-%macro sys.exit 0
- system SYS_exit
-%endmacro
-
-%macro sys.fork 0
- system SYS_fork
-%endmacro
-
-%macro sys.read 0
- system SYS_read
-%endmacro
-
-%macro sys.write 0
- system SYS_write
-%endmacro
-
-; [etc...]
-</programlisting>
-
-<para>
-Go ahead, enter it into your editor and save it as
-<filename>system.inc</filename>. We will add more to it as we
-discuss more syscalls.
-</para>
-
-</sect2>
-
-</sect1>
-
-<sect1 id="x86-first-program">
-<title>Our First Program</title>
-
-<para>
-We are now ready for our first program, the mandatory
-<application>Hello, World!</application>
-</para>
-
-<programlisting>
- 1: %include 'system.inc'
- 2:
- 3: section .data
- 4: hello db 'Hello, World!', 0Ah
- 5: hbytes equ $-hello
- 6:
- 7: section .text
- 8: global _start
- 9: _start:
-10: push dword hbytes
-11: push dword hello
-12: push dword stdout
-13: sys.write
-14:
-15: push dword 0
-16: sys.exit
-</programlisting>
-
-<para>
-Here is what it does: Line 1 includes the defines, the macros,
-and the code from <filename>system.inc</filename>.
-</para>
-
-<para>
-Lines 3-5 are the data: Line 3 starts the data section/segment.
-Line 4 contains the string "Hello, World!" followed by a new
-line (<constant>0Ah</constant>). Line 5 creates a constant that contains
-the length of the string from line 4 in bytes.
-</para>
-
-<para>
-Lines 7-16 contain the code. Note that FreeBSD uses the <emphasis>elf</emphasis>
-file format for its executables, which requires every
-program to start at the point labeled <varname>_start</varname> (or, more
-precisely, the linker expects that). This label has to be
-global.
-</para>
-
-<para>
-Lines 10-13 ask the system to write <varname>hbytes</varname> bytes
-of the <varname>hello</varname> string to <varname>stdout</varname>.
-</para>
-
-<para>
-Lines 15-16 ask the system to end the program with the return
-value of <constant>0</constant>. The <function role="syscall">SYS_exit</function> syscall never
-returns, so the code ends there.
-</para>
-
-<note>
-<para>
-If you have come to Unix from <acronym>MS DOS</acronym>
-assembly language background, you may be used to writing directly
-to the video hardware. You will never have to worry about
-this in FreeBSD, or any other flavor of Unix. As far as
-you are concerned, you are writing to a file known as
-<filename>stdout</filename>. This can be the video screen, or
-a <application>telnet</application> terminal, or an actual file,
-or even the input of another program. Which one it is,
-is for the system to figure out.
-</para>
-</note>
-
-<sect2 id="x86-assemble-1"><title>Assembling the Code</title>
-
-<para>
-Type the code (except the line numbers) in an editor, and save
-it in a file named <filename>hello.asm</filename>. You need
-<application>nasm</application> to assemble it.
-</para>
-
-<sect3 id="x86-get-nasm"><title>Installing <application>nasm</application></title>
-
-<para>
-If you do not have <application>nasm</application>, type:
-</para>
-
-<screen>&prompt.user; <userinput>su</userinput>
-Password:<userinput><replaceable>your root password</replaceable></userinput>
-&prompt.root; <userinput>cd /usr/ports/devel/nasm</userinput>
-&prompt.root; <userinput>make install</userinput>
-&prompt.root; <userinput>exit</userinput>
-&prompt.user;</screen>
-
-<para>
-You may type <userinput>make install clean</userinput> instead of just
-<userinput>make install</userinput> if you do not want to keep
-<application>nasm</application> source code.
-</para>
-
-<para>
-Either way, FreeBSD will automatically download
-<application>nasm</application> from the Internet,
-compile it, and install it on your system.
-</para>
-
-<note>
-<para>
-If your system is not FreeBSD, you need to get
-<application>nasm</application> from its
-<ulink url="http://www.web-sites.co.uk/nasm/">home
-page</ulink>. You can still use it to assemble FreeBSD code.
-</para>
-</note>
-
-<para>
-Now you can assemble, link, and run the code:
-</para>
-
-<screen>&prompt.user; <userinput>nasm -f elf hello.asm</userinput>
-&prompt.user; <userinput>ld -s -o hello hello.o</userinput>
-&prompt.user; <userinput>./hello</userinput>
-Hello, World!
-&prompt.user;</screen>
-
-</sect3>
-
-</sect2>
-
-</sect1>
-
-<sect1 id="x86-unix-filters">
-<title>Writing Unix Filters</title>
-
-<para>
-A common type of Unix application is a filter&mdash;a program
-that reads data from the <filename>stdin</filename>, processes it
-somehow, then writes the result to <filename>stdout</filename>.
-</para>
-
-<para>
-In this chapter, we shall develop a simple filter, and
-learn how to read from <filename>stdin</filename> and write to
-<filename>stdout</filename>. This filter will convert each byte
-of its input into a hexadecimal number followed by a
-blank space.
-</para>
-
-<programlisting>
-%include 'system.inc'
-
-section .data
-hex db '0123456789ABCDEF'
-buffer db 0, 0, ' '
-
-section .text
-global _start
-_start:
- ; read a byte from stdin
- push dword 1
- push dword buffer
- push dword stdin
- sys.read
- add esp, byte 12
- or eax, eax
- je .done
-
- ; convert it to hex
- movzx eax, byte [buffer]
- mov edx, eax
- shr dl, 4
- mov dl, [hex+edx]
- mov [buffer], dl
- and al, 0Fh
- mov al, [hex+eax]
- mov [buffer+1], al
-
- ; print it
- push dword 3
- push dword buffer
- push dword stdout
- sys.write
- add esp, byte 12
- jmp short _start
-
-.done:
- push dword 0
- sys.exit
-</programlisting>
-<para>
-In the data section we create an array called <varname>hex</varname>.
-It contains the 16 hexadecimal digits in ascending order.
-The array is followed by a buffer which we will use for
-both input and output. The first two bytes of the buffer
-are initially set to <constant>0</constant>. This is where we will write
-the two hexadecimal digits (the first byte also is
-where we will read the input). The third byte is a
-space.
-</para>
-
-<para>
-The code section consists of four parts: Reading the byte,
-converting it to a hexadecimal number, writing the result,
-and eventually exiting the program.
-</para>
-
-<para>
-To read the byte, we ask the system to read one byte
-from <filename>stdin</filename>, and store it in the first byte
-of the <varname>buffer</varname>. The system returns the number
-of bytes read in <varname role="register">EAX</varname>. This will be <constant>1</constant>
-while data is coming, or <constant>0</constant>, when no more input
-data is available. Therefore, we check the value of
-<varname role="register">EAX</varname>. If it is <constant>0</constant>,
-we jump to <varname>.done</varname>, otherwise we continue.
-</para>
-
-<note>
-<para>
-For simplicity sake, we are ignoring the possibility
-of an error condition at this time.
-</para>
-</note>
-
-<para>
-The hexadecimal conversion reads the byte from the
-<varname>buffer</varname> into <varname role="register">EAX</varname>, or actually just
-<varname role="register">AL</varname>, while clearing the remaining bits of
-<varname role="register">EAX</varname> to zeros. We also copy the byte to
-<varname role="register">EDX</varname> because we need to convert the upper
-four bits (nibble) separately from the lower
-four bits. We store the result in the first two
-bytes of the buffer.
-</para>
-
-<para>
-Next, we ask the system to write the three bytes
-of the buffer, i.e., the two hexadecimal digits and
-the blank space, to <filename>stdout</filename>. We then
-jump back to the beginning of the program and
-process the next byte.
-</para>
-
-<para>
-Once there is no more input left, we ask the system
-to exit our program, returning a zero, which is
-the traditional value meaning the program was
-successful.
-</para>
-
-<para>
-Go ahead, and save the code in a file named <filename>hex.asm</filename>,
-then type the following (the <userinput>^D</userinput> means press the
-control key and type <userinput>D</userinput> while holding the
-control key down):
-</para>
-
-<screen>&prompt.user; <userinput>nasm -f elf hex.asm</userinput>
-&prompt.user; <userinput>ld -s -o hex hex.o</userinput>
-&prompt.user; <userinput>./hex</userinput>
-<userinput>Hello, World!</userinput>
-48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A <userinput>Here I come!</userinput>
-48 65 72 65 20 49 20 63 6F 6D 65 21 0A <userinput>^D</userinput> &prompt.user;</screen>
-
-<note>
-<para>
-If you are migrating to Unix from <acronym>MS DOS</acronym>,
-you may be wondering why each line ends with <constant>0A</constant>
-instead of <constant>0D 0A</constant>.
-This is because Unix does not use the cr/lf convention, but
-a "new line" convention, which is <constant>0A</constant> in hexadecimal.
-</para>
-</note>
-
-<para>
-Can we improve this? Well, for one, it is a bit confusing because
-once we have converted a line of text, our input no longer
-starts at the begining of the line. We can modify it to print
-a new line instead of a space after each <constant>0A</constant>:
-</para>
-
-<programlisting>
-%include 'system.inc'
-
-section .data
-hex db '0123456789ABCDEF'
-buffer db 0, 0, ' '
-
-section .text
-global _start
-_start:
- mov cl, ' '
-
-.loop:
- ; read a byte from stdin
- push dword 1
- push dword buffer
- push dword stdin
- sys.read
- add esp, byte 12
- or eax, eax
- je .done
-
- ; convert it to hex
- movzx eax, byte [buffer]
- mov [buffer+2], cl
- cmp al, 0Ah
- jne .hex
- mov [buffer+2], al
-
-.hex:
- mov edx, eax
- shr dl, 4
- mov dl, [hex+edx]
- mov [buffer], dl
- and al, 0Fh
- mov al, [hex+eax]
- mov [buffer+1], al
-
- ; print it
- push dword 3
- push dword buffer
- push dword stdout
- sys.write
- add esp, byte 12
- jmp short .loop
-
-.done:
- push dword 0
- sys.exit
-</programlisting>
-<para>
-We have stored the space in the <varname role="register">CL</varname> register. We can
-do this safely because, unlike Microsoft Windows, Unix system
-calls do not modify the value of any register they do not use
-to return a value in.
-</para>
-
-<para>
-That means we only need to set <varname role="register">CL</varname> once. We have, therefore,
-added a new label <varname>.loop</varname> and jump to it for the next byte
-instead of jumping at <varname>_start</varname>. We have also added the
-<varname>.hex</varname> label so we can either have a blank space or a
-new line as the third byte of the <varname>buffer</varname>.
-</para>
-
-<para>
-Once you have changed <filename>hex.asm</filename> to reflect
-these changes, type:
-</para>
-
-<screen>&prompt.user; <userinput>nasm -f elf hex.asm</userinput>
-&prompt.user; <userinput>ld -s -o hex hex.o</userinput>
-&prompt.user; <userinput>./hex</userinput>
-<userinput>Hello, World!</userinput>
-48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A
-<userinput>Here I come!</userinput>
-48 65 72 65 20 49 20 63 6F 6D 65 21 0A
-<userinput>^D</userinput> &prompt.user;</screen>
-
-<para>
-That looks better. But this code is quite inefficient! We
-are making a system call for every single byte twice (once
-to read it, another time to write the output).
-</para>
-
-</sect1>
-
-<sect1 id="x86-buffered-io">
-<title>Buffered Input and Output</title>
-
-<para>
-We can improve the efficiency of our code by buffering our
-input and output. We create an input buffer and read a whole
-sequence of bytes at one time. Then we fetch them one by one
-from the buffer.
-</para>
-
-<para>
-We also create an output buffer. We store our output in it until
-it is full. At that time we ask the kernel to write the contents
-of the buffer to <filename>stdout</filename>.
-</para>
-
-<para>
-The program ends when there is no more input. But we still need
-to ask the kernel to write the contents of our output buffer
-to <filename>stdout</filename> one last time, otherwise some of our output
-would make it to the output buffer, but never be sent out.
-Do not forget that, or you will be wondering why some of your
-output is missing.
-</para>
-
-<programlisting>
-%include 'system.inc'
-
-%define BUFSIZE 2048
-
-section .data
-hex db '0123456789ABCDEF'
-
-section .bss
-ibuffer resb BUFSIZE
-obuffer resb BUFSIZE
-
-section .text
-global _start
-_start:
- sub eax, eax
- sub ebx, ebx
- sub ecx, ecx
- mov edi, obuffer
-
-.loop:
- ; read a byte from stdin
- call getchar
-
- ; convert it to hex
- mov dl, al
- shr al, 4
- mov al, [hex+eax]
- call putchar
-
- mov al, dl
- and al, 0Fh
- mov al, [hex+eax]
- call putchar
-
- mov al, ' '
- cmp dl, 0Ah
- jne .put
- mov al, dl
-
-.put:
- call putchar
- jmp short .loop
-
-align 4
-getchar:
- or ebx, ebx
- jne .fetch
-
- call read
-
-.fetch:
- lodsb
- dec ebx
- ret
-
-read:
- push dword BUFSIZE
- mov esi, ibuffer
- push esi
- push dword stdin
- sys.read
- add esp, byte 12
- mov ebx, eax
- or eax, eax
- je .done
- sub eax, eax
- ret
-
-align 4
-.done:
- call write ; flush output buffer
- push dword 0
- sys.exit
-
-align 4
-putchar:
- stosb
- inc ecx
- cmp ecx, BUFSIZE
- je write
- ret
-
-align 4
-write:
- sub edi, ecx ; start of buffer
- push ecx
- push edi
- push dword stdout
- sys.write
- add esp, byte 12
- sub eax, eax
- sub ecx, ecx ; buffer is empty now
- ret
-</programlisting>
-<para>
-We now have a third section in the source code, named
-<varname>.bss</varname>. This section is not included in our
-executable file, and, therefore, cannot be initialized. We use
-<function role="opcode">resb</function> instead of <function role="opcode">db</function>.
-It simply reserves the requested size of uninitialized memory
-for our use.
-</para>
-
-<para>
-We take advantage of the fact that the system does not modify the
-registers: We use registers for what, otherwise, would have to be
-global variables stored in the <varname>.data</varname> section. This is
-also why the Unix convention of passing parameters to system calls
-on the stack is superior to the Microsoft convention of passing
-them in the registers: We can keep the registers for our own use.
-</para>
-
-<para>
-We use <varname role="register">EDI</varname> and <varname role="register">ESI</varname> as pointers to the next byte
-to be read from or written to. We use <varname role="register">EBX</varname> and
-<varname role="register">ECX</varname> to keep count of the number of bytes in the
-two buffers, so we know when to dump the output to, or read more
-input from, the system.
-</para>
-
-<para>
-Let us see how it works now:
-</para>
-
-<screen>&prompt.user; <userinput>nasm -f elf hex.asm</userinput>
-&prompt.user; <userinput>ld -s -o hex hex.o</userinput>
-&prompt.user; <userinput>./hex</userinput>
-<userinput>Hello, World!</userinput>
-<userinput>Here I come!</userinput>
-48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A
-48 65 72 65 20 49 20 63 6F 6D 65 21 0A
-<userinput>^D</userinput> &prompt.user;</screen>
-
-<para>
-Not what you expected? The program did not print the output
-until we pressed <userinput>^D</userinput>. That is easy to fix by
-inserting three lines of code to write the output every time
-we have converted a new line to <constant>0A</constant>. I have marked
-the three lines with &gt; (do not copy the &gt; in your
-<filename>hex.asm</filename>).
-</para>
-
-<programlisting>
-%include 'system.inc'
-
-%define BUFSIZE 2048
-
-section .data
-hex db '0123456789ABCDEF'
-
-section .bss
-ibuffer resb BUFSIZE
-obuffer resb BUFSIZE
-
-section .text
-global _start
-_start:
- sub eax, eax
- sub ebx, ebx
- sub ecx, ecx
- mov edi, obuffer
-
-.loop:
- ; read a byte from stdin
- call getchar
-
- ; convert it to hex
- mov dl, al
- shr al, 4
- mov al, [hex+eax]
- call putchar
-
- mov al, dl
- and al, 0Fh
- mov al, [hex+eax]
- call putchar
-
- mov al, ' '
- cmp dl, 0Ah
- jne .put
- mov al, dl
-
-.put:
- call putchar
-> cmp al, 0Ah
-> jne .loop
-> call write
- jmp short .loop
-
-align 4
-getchar:
- or ebx, ebx
- jne .fetch
-
- call read
-
-.fetch:
- lodsb
- dec ebx
- ret
-
-read:
- push dword BUFSIZE
- mov esi, ibuffer
- push esi
- push dword stdin
- sys.read
- add esp, byte 12
- mov ebx, eax
- or eax, eax
- je .done
- sub eax, eax
- ret
-
-align 4
-.done:
- call write ; flush output buffer
- push dword 0
- sys.exit
-
-align 4
-putchar:
- stosb
- inc ecx
- cmp ecx, BUFSIZE
- je write
- ret
-
-align 4
-write:
- sub edi, ecx ; start of buffer
- push ecx
- push edi
- push dword stdout
- sys.write
- add esp, byte 12
- sub eax, eax
- sub ecx, ecx ; buffer is empty now
- ret
-</programlisting>
-
-<para>
-Now, let us see how it works:
-</para>
-
-<screen>&prompt.user; <userinput>nasm -f elf hex.asm</userinput>
-&prompt.user; <userinput>ld -s -o hex hex.o</userinput>
-&prompt.user; <userinput>./hex</userinput>
-<userinput>Hello, World!</userinput>
-48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A
-<userinput>Here I come!</userinput>
-48 65 72 65 20 49 20 63 6F 6D 65 21 0A
-<userinput>^D</userinput> &prompt.user;</screen>
-
-<para>
-Not bad for a 644-byte executable, is it!
-</para>
-
-<note>
-<para>
-This approach to buffered input/output still
-contains a hidden danger. I will discuss&mdash;and
-fix&mdash;it later, when I talk about the
-<link linkend="x86-buffered-dark-side">dark
-side of buffering</link>.</para>
-</note>
-
-<sect2 id="x86-ungetc">
-<title>How to Unread a Character</title>
-
-<warning><para>
-This may be a somewhat advanced topic, mostly of interest to
-programmers familiar with the theory of compilers. If you wish,
-you may <link linkend="x86-command-line">skip to the next
-section</link>, and perhaps read this later.
-</para>
-</warning>
-<para>
-While our sample program does not require it, more sophisticated
-filters often need to look ahead. In other words, they may need
-to see what the next character is (or even several characters).
-If the next character is of a certain value, it is part of the
-token currently being processed. Otherwise, it is not.
-</para>
-
-<para>
-For example, you may be parsing the input stream for a textual
-string (e.g., when implementing a language compiler): If a
-character is followed by another character, or perhaps a digit,
-it is part of the token you are processing. If it is followed by
-white space, or some other value, then it is not part of the
-current token.
-</para>
-
-<para>
-This presents an interesting problem: How to return the next
-character back to the input stream, so it can be read again
-later?
-</para>
-
-<para>
-One possible solution is to store it in a character variable,
-then set a flag. We can modify <function>getchar</function> to check the flag,
-and if it is set, fetch the byte from that variable instead of the
-input buffer, and reset the flag. But, of course, that slows us
-down.
-</para>
-
-<para>
-The C language has an <function>ungetc()</function> function, just for that
-purpose. Is there a quick way to implement it in our code?
-I would like you to scroll back up and take a look at the
-<function>getchar</function> procedure and see if you can find a nice and
-fast solution before reading the next paragraph. Then come back
-here and see my own solution.
-</para>
-
-<para>
-The key to returning a character back to the stream is in how
-we are getting the characters to start with:
-</para>
-
-<para>
-First we check if the buffer is empty by testing the value
-of <varname role="register">EBX</varname>. If it is zero, we call the
-<function>read</function> procedure.
-</para>
-
-<para>
-If we do have a character available, we use <function role="opcode">lodsb</function>, then
-decrease the value of <varname role="register">EBX</varname>. The <function role="opcode">lodsb</function>
-instruction is effectively identical to:
-</para>
-
-<programlisting>
- mov al, [esi]
- inc esi
-</programlisting>
-
-<para>
-The byte we have fetched remains in the buffer until the next
-time <function>read</function> is called. We do not know when that happens,
-but we do know it will not happen until the next call to
-<function>getchar</function>. Hence, to "return" the last-read byte back
-to the stream, all we have to do is decrease the value of
-<varname role="register">ESI</varname> and increase the value of <varname role="register">EBX</varname>:
-</para>
-
-<programlisting>
-ungetc:
- dec esi
- inc ebx
- ret
-</programlisting>
-
-<para>
-But, be careful! We are perfectly safe doing this if our look-ahead
-is at most one character at a time. If we are examining more than
-one upcoming character and call <function>ungetc</function> several times
-in a row, it will work most of the time, but not all the time
-(and will be tough to debug). Why?
-</para>
-
-<para>
-Because as long as <function>getchar</function> does not have to call
-<function>read</function>, all of the pre-read bytes are still in the buffer,
-and our <function>ungetc</function> works without a glitch. But the moment
-<function>getchar</function> calls <function>read</function>,
-the contents of the buffer change.
-</para>
-
-<para>
-We can always rely on <function>ungetc</function> working properly on the last
-character we have read with <function>getchar</function>, but not on anything
-we have read before that.
-</para>
-
-<para>
-If your program reads more than one byte ahead, you have at least
-two choices:
-</para>
-
-<para>
-If possible, modify the program so it only reads one byte ahead.
-This is the simplest solution.
-</para>
-
-<para>
-If that option is not available, first of all determine the maximum
-number of characters your program needs to return to the input
-stream at one time. Increase that number slightly, just to be
-sure, preferably to a multiple of 16&mdash;so it aligns nicely.
-Then modify the <varname>.bss</varname> section of your code, and create
-a small "spare" buffer right before your input buffer,
-something like this:
-</para>
-
-<programlisting>
-section .bss
- resb 16 ; or whatever the value you came up with
-ibuffer resb BUFSIZE
-obuffer resb BUFSIZE
-</programlisting>
-
-<para>
-You also need to modify your <function>ungetc</function> to pass the value
-of the byte to unget in <varname role="register">AL</varname>:
-</para>
-
-<programlisting>
-ungetc:
- dec esi
- inc ebx
- mov [esi], al
- ret
-</programlisting>
-
-<para>
-With this modification, you can call <function>ungetc</function>
-up to 17 times in a row safely (the first call will still
-be within the buffer, the remaining 16 may be either within
-the buffer or within the "spare").
-</para>
-
-</sect2>
-
-</sect1>
-
-<sect1 id="x86-command-line"><title>Command Line Arguments</title>
-
-<para>
-Our <application>hex</application> program will be more useful if it can
-read the names of an input and output file from its command
-line, i.e., if it can process the command line arguments.
-But... Where are they?
-</para>
-
-<para>
-Before a Unix system starts a program, it <function role="opcode">push</function>es some
-data on the stack, then jumps at the <varname>_start</varname>
-label of the program. Yes, I said jumps, not calls. That means the
-data can be accessed by reading <varname>[esp+offset]</varname>,
-or by simply <function role="opcode">pop</function>ping it.
-</para>
-
-<para>
-The value at the top of the stack contains the number of
-command line arguments. It is traditionally called
-<varname>argc</varname>, for "argument count."
-</para>
-
-<para>
-Command line arguments follow next, all <varname>argc</varname> of them.
-These are typically referred to as <varname>argv</varname>, for
-"argument value(s)." That is, we get <varname>argv[0]</varname>,
-<varname>argv[1]</varname>, <varname>...</varname>,
-<varname>argv[argc-1]</varname>. These are not the actual
-arguments, but pointers to arguments, i.e., memory addresses of
-the actual arguments. The arguments themselves are
-NUL-terminated character strings.
-</para>
-
-<para>
-The <varname>argv</varname> list is followed by a NULL pointer,
-which is simply a <constant>0</constant>. There is more, but this is
-enough for our purposes right now.
-</para>
-
-<note>
-<para>
-If you have come from the <acronym>MS DOS</acronym> programming
-environment, the main difference is that each argument is in
-a separate string. The second difference is that there is no
-practical limit on how many arguments there can be.
-</para>
-</note>
-
-<para>
-Armed with this knowledge, we are almost ready for the next
-version of <filename>hex.asm</filename>. First, however, we need to
-add a few lines to <filename>system.inc</filename>:
-</para>
-
-<para>
-First, we need to add two new entries to our list of system
-call numbers:
-</para>
-
-<programlisting>
-%define SYS_open 5
-%define SYS_close 6
-</programlisting>
-
-<para>
-Then we add two new macros at the end of the file:
-</para>
-
-<programlisting>
-%macro sys.open 0
- system SYS_open
-%endmacro
-
-%macro sys.close 0
- system SYS_close
-%endmacro
-</programlisting>
-
-<para>
-Here, then, is our modified source code:
-</para>
-
-<programlisting>
-%include 'system.inc'
-
-%define BUFSIZE 2048
-
-section .data
-fd.in dd stdin
-fd.out dd stdout
-hex db '0123456789ABCDEF'
-
-section .bss
-ibuffer resb BUFSIZE
-obuffer resb BUFSIZE
-
-section .text
-align 4
-err:
- push dword 1 ; return failure
- sys.exit
-
-align 4
-global _start
-_start:
- add esp, byte 8 ; discard argc and argv[0]
-
- pop ecx
- jecxz .init ; no more arguments
-
- ; ECX contains the path to input file
- push dword 0 ; O_RDONLY
- push ecx
- sys.open
- jc err ; open failed
-
- add esp, byte 8
- mov [fd.in], eax
-
- pop ecx
- jecxz .init ; no more arguments
-
- ; ECX contains the path to output file
- push dword 420 ; file mode (644 octal)
- push dword 0200h | 0400h | 01h
- ; O_CREAT | O_TRUNC | O_WRONLY
- push ecx
- sys.open
- jc err
-
- add esp, byte 12
- mov [fd.out], eax
-
-.init:
- sub eax, eax
- sub ebx, ebx
- sub ecx, ecx
- mov edi, obuffer
-
-.loop:
- ; read a byte from input file or stdin
- call getchar
-
- ; convert it to hex
- mov dl, al
- shr al, 4
- mov al, [hex+eax]
- call putchar
-
- mov al, dl
- and al, 0Fh
- mov al, [hex+eax]
- call putchar
-
- mov al, ' '
- cmp dl, 0Ah
- jne .put
- mov al, dl
-
-.put:
- call putchar
- cmp al, dl
- jne .loop
- call write
- jmp short .loop
-
-align 4
-getchar:
- or ebx, ebx
- jne .fetch
-
- call read
-
-.fetch:
- lodsb
- dec ebx
- ret
-
-read:
- push dword BUFSIZE
- mov esi, ibuffer
- push esi
- push dword [fd.in]
- sys.read
- add esp, byte 12
- mov ebx, eax
- or eax, eax
- je .done
- sub eax, eax
- ret
-
-align 4
-.done:
- call write ; flush output buffer
-
- ; close files
- push dword [fd.in]
- sys.close
-
- push dword [fd.out]
- sys.close
-
- ; return success
- push dword 0
- sys.exit
-
-align 4
-putchar:
- stosb
- inc ecx
- cmp ecx, BUFSIZE
- je write
- ret
-
-align 4
-write:
- sub edi, ecx ; start of buffer
- push ecx
- push edi
- push dword [fd.out]
- sys.write
- add esp, byte 12
- sub eax, eax
- sub ecx, ecx ; buffer is empty now
- ret
-</programlisting>
-
-<para>
-In our <varname>.data</varname> section we now have two new variables,
-<varname>fd.in</varname> and <varname>fd.out</varname>. We store the input and
-output file descriptors here.
-</para>
-
-<para>
-In the <varname>.text</varname> section we have replaced the references
-to <varname>stdin</varname> and <varname>stdout</varname> with
-<varname>[fd.in]</varname> and <varname>[fd.out]</varname>.
-</para>
-
-<para>
-The <varname>.text</varname> section now starts with a simple error
-handler, which does nothing but exit the program with a return
-value of <constant>1</constant>.
-The error handler is before <varname>_start</varname> so we are
-within a short distance from where the errors occur.
-</para>
-
-<para>
-Naturally, the program execution still begins at <varname>_start</varname>.
-First, we remove <varname>argc</varname> and <varname>argv[0]</varname> from the
-stack: They are of no interest to us (in this program, that is).
-</para>
-
-<para>
-We pop <varname>argv[1]</varname> to <varname role="register">ECX</varname>. This
-register is particularly suited for pointers, as we can handle
-NULL pointers with <function role="opcode">jecxz</function>. If <varname>argv[1]</varname>
-is not NULL, we try to open the file named in the first
-argument. Otherwise, we continue the program as before: Reading
-from <varname>stdin</varname>, writing to <varname>stdout</varname>.
-If we fail to open the input file (e.g., it does not exist),
-we jump to the error handler and quit.
-</para>
-
-<para>
-If all went well, we now check for the second argument. If
-it is there, we open the output file. Otherwise, we send
-the output to <varname>stdout</varname>. If we fail to open the output
-file (e.g., it exists and we do not have the write permission),
-we, again, jump to the error handler.
-</para>
-
-<para>
-The rest of the code is the same as before, except we close
-the input and output files before exiting, and, as mentioned,
-we use <varname>[fd.in]</varname> and <varname>[fd.out]</varname>.
-</para>
-
-<para>
-Our executable is now a whopping 768 bytes long.
-</para>
-
-<para>
-Can we still improve it? Of course! Every program can be improved.
-Here are a few ideas of what we could do:
-</para>
-
-<itemizedlist>
-<listitem>
-<para>
-Have our error handler print a message to
-<varname>stderr</varname>.
-</para>
-</listitem>
-
-<listitem>
-<para>
-Add error handlers to the <function>read</function>
-and <function>write</function> functions.
-</para>
-</listitem>
-
-<listitem>
-<para>
-Close <varname>stdin</varname> when we open an input file,
-<varname>stdout</varname> when we open an output file.
-</para>
-</listitem>
-
-<listitem>
-<para>
-Add command line switches, such as <parameter>-i</parameter>
-and <parameter>-o</parameter>, so we can list the input and
-output files in any order, or perhaps read from
-<varname>stdin</varname> and write to a file.
-</para>
-</listitem>
-
-<listitem>
-<para>
-Print a usage message if command line arguments are incorrect.
-</para>
-</listitem>
-
-</itemizedlist>
-<para>
-I shall leave these enhancements as an exercise to the reader:
-You already know everything you need to know to implement them.
-</para>
-
-</sect1>
-
-<sect1 id="x86-environment">
-<title>Unix Environment</title>
-
-<para>
-An important Unix concept is the environment, which is defined by
-<emphasis>environment variables</emphasis>. Some are set by the system, others
-by you, yet others by the <application>shell</application>, or any program
-that loads another program.
-</para>
-
-<sect2 id="x86-find-environment">
-<title>How to Find Environment Variables</title>
-
-<para>
-I said earlier that when a program starts executing, the stack
-contains <varname>argc</varname> followed by the NULL-terminated
-<varname>argv</varname> array, followed by something else. The
-"something else" is the <emphasis>environment</emphasis>, or,
-to be more precise, a NULL-terminated array of pointers to
-<emphasis>environment variables</emphasis>. This is often referred
-to as <varname>env</varname>.
-</para>
-
-<para>
-The structure of <varname>env</varname> is the same as that of
-<varname>argv</varname>, a list of memory addresses followed by a
-NULL (<constant>0</constant>). In this case, there is no
-<varname>"envc"</varname>&mdash;we figure out where the array ends
-by searching for the final NULL.
-</para>
-
-<para>
-The variables usually come in the <varname>name=value</varname>
-format, but sometimes the <varname>=value</varname> part
-may be missing. We need to account for that possibility.
-</para>
-
-</sect2>
-
-<sect2 id="x86-webvar">
-<title>webvars</title>
-
-<para>
-I could just show you some code that prints the environment
-the same way the Unix <application>env</application> command does. But
-I thought it would be more interesting to write a simple
-assembly language CGI utility.
-</para>
-
-<sect3 id="x86-cgi">
-<title>CGI: A Quick Overview</title>
-
-<para>
-I have a
-<ulink url="http://www.whizkidtech.net/cgi-bin/tutorial">detailed
-<acronym>CGI</acronym> tutorial</ulink> on my web site,
-but here is a very quick overview of <acronym>CGI</acronym>:
-</para>
-
-<itemizedlist>
-<listitem>
-<para>
-The web server communicates with the <acronym>CGI</acronym>
-program by setting <emphasis>environment variables</emphasis>.
-</para>
-</listitem>
-
-<listitem>
-<para>
-The <acronym>CGI</acronym> program
-sends its output to <filename>stdout</filename>.
-The web server reads it from there.
-</para>
-</listitem>
-
-<listitem>
-<para>
-It must start with an <acronym>HTTP</acronym>
-header followed by two blank lines.
-</para>
-</listitem>
-
-<listitem>
-<para>
-It then prints the <acronym>HTML</acronym>
-code, or whatever other type of data it is producing.
-</para>
-</listitem>
-
-</itemizedlist>
-<note>
-<para>
-While certain <emphasis>environment variables</emphasis> use
-standard names, others vary, depending on the web server. That
-makes <application>webvars</application>
-quite a useful diagnostic tool.
-</para>
-</note>
-
-</sect3>
-
-<sect3 id="x86-webvars-the-code">
-<title>The Code</title>
-
-<para>
-Our <application>webvars</application> program, then, must send out
-the <acronym>HTTP</acronym> header followed by some
-<acronym>HTML</acronym> mark-up. It then must read
-the <emphasis>environment variables</emphasis> one by one
-and send them out as part of the
-<acronym>HTML</acronym> page.
-</para>
-
-<para>
-The code follows. I placed comments and explanations
-right inside the code:
-</para>
-
-<programlisting>
-;;;;;;; webvars.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;
-; Copyright (c) 2000 G. Adam Stanislav
-; All rights reserved.
-;
-; Redistribution and use in source and binary forms, with or without
-; modification, are permitted provided that the following conditions
-; are met:
-; 1. Redistributions of source code must retain the above copyright
-; notice, this list of conditions and the following disclaimer.
-; 2. Redistributions in binary form must reproduce the above copyright
-; notice, this list of conditions and the following disclaimer in the
-; documentation and/or other materials provided with the distribution.
-;
-; THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-; OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-; LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-; OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-; SUCH DAMAGE.
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;
-; Version 1.0
-;
-; Started: 8-Dec-2000
-; Updated: 8-Dec-2000
-;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-%include 'system.inc'
-
-section .data
-http db 'Content-type: text/html', 0Ah, 0Ah
- db '&lt;?xml version="1.0" encoding="UTF-8"?&gt;', 0Ah
- db '&lt;!DOCTYPE html PUBLIC "-//W3C/DTD XHTML Strict//EN" '
- db '"DTD/xhtml1-strict.dtd"&gt;', 0Ah
- db '&lt;html xmlns="http://www.w3.org/1999/xhtml" '
- db 'xml.lang="en" lang="en"&gt;', 0Ah
- db '&lt;head&gt;', 0Ah
- db '&lt;title&gt;Web Environment&lt;/title&gt;', 0Ah
- db '&lt;meta name="author" content="G. Adam Stanislav" /&gt;', 0Ah
- db '&lt;/head&gt;', 0Ah, 0Ah
- db '&lt;body bgcolor="#ffffff" text="#000000" link="#0000ff" '
- db 'vlink="#840084" alink="#0000ff"&gt;', 0Ah
- db '&lt;div class="webvars"&gt;', 0Ah
- db '&lt;h1&gt;Web Environment&lt;/h1&gt;', 0Ah
- db '&lt;p&gt;The following &lt;b&gt;environment variables&lt;/b&gt; are defined '
- db 'on this web server:&lt;/p&gt;', 0Ah, 0Ah
- db '&lt;table align="center" width="80" border="0" cellpadding="10" '
- db 'cellspacing="0" class="webvars"&gt;', 0Ah
-httplen equ $-http
-left db '&lt;tr&gt;', 0Ah
- db '&lt;td class="name"&gt;&lt;tt&gt;'
-leftlen equ $-left
-middle db '&lt;/tt&gt;&lt;/td&gt;', 0Ah
- db '&lt;td class="value"&gt;&lt;tt&gt;&lt;b&gt;'
-midlen equ $-middle
-undef db '&lt;i&gt;(undefined)&lt;/i&gt;'
-undeflen equ $-undef
-right db '&lt;/b&gt;&lt;/tt&gt;&lt;/td&gt;', 0Ah
- db '&lt;/tr&gt;', 0Ah
-rightlen equ $-right
-wrap db '&lt;/table&gt;', 0Ah
- db '&lt;/div&gt;', 0Ah
- db '&lt;/body&gt;', 0Ah
- db '&lt;/html&gt;', 0Ah, 0Ah
-wraplen equ $-wrap
-
-section .text
-global _start
-_start:
- ; First, send out all the http and xhtml stuff that is
- ; needed before we start showing the environment
- push dword httplen
- push dword http
- push dword stdout
- sys.write
-
- ; Now find how far on the stack the environment pointers
- ; are. We have 12 bytes we have pushed before "argc"
- mov eax, [esp+12]
-
- ; We need to remove the following from the stack:
- ;
- ; The 12 bytes we pushed for sys.write
- ; The 4 bytes of argc
- ; The EAX*4 bytes of argv
- ; The 4 bytes of the NULL after argv
- ;
- ; Total:
- ; 20 + eax * 4
- ;
- ; Because stack grows down, we need to ADD that many bytes
- ; to ESP.
- lea esp, [esp+20+eax*4]
- cld ; This should already be the case, but let's be sure.
-
- ; Loop through the environment, printing it out
-.loop:
- pop edi
- or edi, edi ; Done yet?
- je near .wrap
-
- ; Print the left part of HTML
- push dword leftlen
- push dword left
- push dword stdout
- sys.write
-
- ; It may be tempting to search for the '=' in the env string next.
- ; But it is possible there is no '=', so we search for the
- ; terminating NUL first.
- mov esi, edi ; Save start of string
- sub ecx, ecx
- not ecx ; ECX = FFFFFFFF
- sub eax, eax
-repne scasb
- not ecx ; ECX = string length + 1
- mov ebx, ecx ; Save it in EBX
-
- ; Now is the time to find '='
- mov edi, esi ; Start of string
- mov al, '='
-repne scasb
- not ecx
- add ecx, ebx ; Length of name
-
- push ecx
- push esi
- push dword stdout
- sys.write
-
- ; Print the middle part of HTML table code
- push dword midlen
- push dword middle
- push dword stdout
- sys.write
-
- ; Find the length of the value
- not ecx
- lea ebx, [ebx+ecx-1]
-
- ; Print "undefined" if 0
- or ebx, ebx
- jne .value
-
- mov ebx, undeflen
- mov edi, undef
-
-.value:
- push ebx
- push edi
- push dword stdout
- sys.write
-
- ; Print the right part of the table row
- push dword rightlen
- push dword right
- push dword stdout
- sys.write
-
- ; Get rid of the 60 bytes we have pushed
- add esp, byte 60
-
- ; Get the next variable
- jmp .loop
-
-.wrap:
- ; Print the rest of HTML
- push dword wraplen
- push dword wrap
- push dword stdout
- sys.write
-
- ; Return success
- push dword 0
- sys.exit
-</programlisting>
-
-<para>
-This code produces a 1,396-byte executable. Most of it is data,
-i.e., the <acronym>HTML</acronym> mark-up we need to send out.
-</para>
-
-<para>
-Assemble and link it as usual:
-</para>
-
-<screen>&prompt.user; <userinput>nasm -f elf webvars.asm</userinput>
-&prompt.user; <userinput>ld -s -o webvars webvars.o</userinput></screen>
-
-<para>
-To use it, you need to upload <filename>webvars</filename> to your
-web server. Depending on how your web server is set up, you
-may have to store it in a special <filename>cgi-bin</filename> directory,
-or perhaps rename it with a <filename>.cgi</filename> extension.
-</para>
-
-<para>
-Then you need to use your browser to view its output.
-To see its output on my web server, please go to
-<ulink url="http://www.int80h.org/webvars/"><filename>http://www.int80h.org/webvars/</filename></ulink>.
-If curious about the additional environment variables
-present in a password protected web directory, go to
-<ulink url="http://www.int80h.org/private/"><filename>http://www.int80h.org/private/</filename></ulink>,
-using the name <userinput>asm</userinput> and password
-<userinput>programmer</userinput>.
-</para>
-
-</sect3>
-
-</sect2>
-
-</sect1>
-
-<sect1 id="x86-files">
-<title>Working with Files</title>
-
-<para>
-We have already done some basic file work: We know how
-to open and close them, how to read and write them using
-buffers. But Unix offers much more functionality when it
-comes to files. We will examine some of it in this section,
-and end up with a nice file conversion utility.
-</para>
-
-<para>
-Indeed, let us start at the end, that is, with the file
-conversion utility. It always makes programming easier
-when we know from the start what the end product is
-supposed to do.
-</para>
-
-<para>
-One of the first programs I wrote for Unix was
-<ulink url="ftp://ftp.int80h.org/unix/tuc/"><application>tuc</application></ulink>,
-a text-to-Unix file converter. It converts a text
-file from other operating systems to a Unix text file.
-In other words, it changes from different kind of line endings
-to the newline convention of Unix. It saves the output
-in a different file. Optionally, it converts a Unix text
-file to a <acronym>DOS</acronym> text file.
-</para>
-
-<para>
-I have used <application>tuc</application> extensively, but always
-only to convert from some other <acronym>OS</acronym>
-to Unix, never the other way. I have always wished
-it would just overwrite the file instead of me having
-to send the output to a different file. Most of the time,
-I end up using it like this:
-</para>
-
-<screen>&prompt.user; <userinput>tuc <replaceable>myfile tempfile</replaceable></userinput>
-&prompt.user; <userinput>mv <replaceable>tempfile myfile</replaceable></userinput></screen>
-
-<para>
-It would be nice to have a <application>ftuc</application>,
-i.e., <emphasis>fast tuc</emphasis>, and use it like this:
-</para>
-
-<screen>&prompt.user; <userinput>ftuc <replaceable>myfile</replaceable></userinput></screen>
-
-<para>
-In this chapter, then, we will write
-<application>ftuc</application> in assembly language
-(the original <application>tuc</application>
-is in C), and study various
-file-oriented kernel services in the process.
-</para>
-
-<para>
-At first sight, such a file conversion is very
-simple: All you have to do is strip the carriage
-returns, right?
-</para>
-
-<para>
-If you answered yes, think again: That approach will
-work most of the time (at least with <acronym>MS
-DOS</acronym> text files), but will fail occasionally.
-</para>
-
-<para>
-The problem is that not all non-Unix text files end their
-line with the carriage return / line feed sequence. Some
-use carriage returns without line feeds. Others combine several
-blank lines into a single carriage return followed by several
-line feeds. And so on.
-</para>
-
-<para>
-A text file converter, then, must be able to handle
-any possible line endings:
-</para>
-
-<itemizedlist>
-<listitem>
-<para>
-carriage return / line feed
-</para>
-</listitem>
-
-<listitem>
-<para>
-carriage return
-</para>
-</listitem>
-
-<listitem>
-<para>
-line feed / carriage return
-</para>
-</listitem>
-
-<listitem>
-<para>
-line feed
-</para>
-</listitem>
-
-</itemizedlist>
-<para>
-It should also handle files that use some kind of a
-combination of the above (e.g., carriage return followed
-by several line feeds).
-</para>
-
-<sect2 id="x86-finite-state-machine">
-<title>Finite State Machine</title>
-
-<para>
-The problem is easily solved by the use of a technique
-called <emphasis>finite state machine</emphasis>, originally developed
-by the designers of digital electronic circuits. A
-<emphasis>finite state machine</emphasis> is a digital circuit
-whose output is dependent not only on its input but on
-its previous input, i.e., on its state. The microprocessor
-is an example of a <emphasis>finite state machine</emphasis>: Our
-assembly language code is assembled to machine language in which
-some assembly language code produces a single byte
-of machine language, while others produce several bytes.
-As the microprocessor fetches the bytes from the memory
-one by one, some of them simply change its state rather than
-produce some output. When all the bytes of the op code are
-fetched, the microprocessor produces some output, or changes
-the value of a register, etc.
-</para>
-
-<para>
-Because of that, all software is essentially a sequence of state
-instructions for the microprocessor. Nevertheless, the concept
-of <emphasis>finite state machine</emphasis> is useful in software design as well.
-</para>
-
-<para>
-Our text file converter can be designed as a <emphasis>finite state machine</emphasis> with three
-possible states. We could call them states 0-2,
-but it will make our life easier if we give them symbolic names:
-</para>
-
-<itemizedlist>
-<listitem>
-<para>
-<symbol>ordinary
-</symbol></para>
-</listitem>
-
-<listitem>
-<para>
-<symbol>cr
-</symbol></para>
-</listitem>
-
-<listitem>
-<para>
-<symbol>lf
-</symbol></para>
-</listitem>
-
-</itemizedlist>
-<para>
-Our program will start in the <symbol>ordinary</symbol>
-state. During this state, the program action depends on
-its input as follows:
-</para>
-
-<itemizedlist>
-<listitem>
-<para>
-If the input is anything other than a carriage return
-or line feed, the input is simply passed on to the output. The
-state remains unchanged.
-</para>
-</listitem>
-
-<listitem>
-<para>
-If the input is a carriage return, the state is changed
-to <symbol>cr</symbol>. The input is then discarded, i.e.,
-no output is made.
-</para>
-</listitem>
-
-<listitem>
-<para>
-If the input is a line feed, the state is changed to
-<symbol>lf</symbol>. The input is then discarded.
-</para>
-</listitem>
-
-</itemizedlist>
-<para>
-Whenever we are in the <symbol>cr</symbol> state, it is
-because the last input was a carriage return, which was
-unprocessed. What our software does in this state again
-depends on the current input:
-</para>
-
-<itemizedlist>
-<listitem>
-<para>
-If the input is anything other than a carriage return
-or line feed, output a line feed, then output the input, then
-change the state to <symbol>ordinary</symbol>.
-</para>
-</listitem>
-
-<listitem>
-<para>
-If the input is a carriage return, we have received
-two (or more) carriage returns in a row. We discard the
-input, we output a line feed, and leave the state unchanged.
-</para>
-</listitem>
-
-<listitem>
-<para>
-If the input is a line feed, we output the line feed
-and change the state to <symbol>ordinary</symbol>. Note that
-this is not the same as the first case above &ndash; if we tried
-to combine them, we would be outputting two line feeds
-instead of one.
-</para>
-</listitem>
-
-</itemizedlist>
-<para>
-Finally, we are in the <symbol>lf</symbol> state after
-we have received a line feed that was not preceded by a
-carriage return. This will happen when our file already is
-in Unix format, or whenever several lines in a row are
-expressed by a single carriage return followed by several
-line feeds, or when line ends with a line feed /
-carriage return sequence. Here is how we need to handle
-our input in this state:
-</para>
-
-<itemizedlist>
-<listitem>
-<para>
-If the input is anything other than a carriage return or
-line feed, we output a line feed, then output the input, then
-change the state to <symbol>ordinary</symbol>. This is exactly
-the same action as in the <symbol>cr</symbol> state upon
-receiving the same kind of input.
-</para>
-</listitem>
-
-<listitem>
-<para>
-If the input is a carriage return, we discard the input,
-we output a line feed, then change the state to <symbol>ordinary</symbol>.
-</para>
-</listitem>
-
-<listitem>
-<para>
-If the input is a line feed, we output the line feed,
-and leave the state unchanged.
-</para>
-</listitem>
-
-</itemizedlist>
-<sect3 id="x86-final-state">
-<title>The Final State</title>
-
-<para>
-The above <emphasis>finite state machine</emphasis> works for the entire file, but leaves
-the possibility that the final line end will be ignored. That will
-happen whenever the file ends with a single carriage return or
-a single line feed. I did not think of it when I wrote
-<application>tuc</application>, just to discover that
-occasionally it strips the last line ending.
-</para>
-
-<para>
-This problem is easily fixed by checking the state after the
-entire file was processed. If the state is not
-<symbol>ordinary</symbol>, we simply
-need to output one last line feed.
-</para>
-
-<note>
-<para>
-Now that we have expressed our algorithm as a <emphasis>finite state machine</emphasis>,
-we could easily design a dedicated digital electronic
-circuit (a "chip") to do the conversion for us. Of course,
-doing so would be considerably more expensive than writing
-an assembly language program.
-</para>
-</note>
-
-</sect3>
-
-<sect3 id="x86-tuc-counter">
-<title>The Output Counter</title>
-
-<para>
-Because our file conversion program may be combining two
-characters into one, we need to use an output counter. We
-initialize it to <constant>0</constant>, and increase it
-every time we send a character to the output. At the end of
-the program, the counter will tell us what size we need
-to set the file to.
-</para>
-
-</sect3>
-
-</sect2>
-
-<sect2 id="x86-software-fsm">
-<title>Implementing FSM in Software</title>
-
-<para>
-The hardest part of working with a <emphasis>finite state machine</emphasis>
-is analyzing the problem and expressing it as a
-<emphasis>finite state machine</emphasis>. That accomplished,
-the software almost writes itself.
-</para>
-
-<para>
-In a high-level language, such as C, there are several main
-approaches. One is to use a <function role="statement">switch</function> statement
-which chooses what function should be run. For example,
-</para>
-
-<programlisting>
- switch (state) {
- default:
- case REGULAR:
- regular(inputchar);
- break;
- case CR:
- cr(inputchar);
- break;
- case LF:
- lf(inputchar);
- break;
- }
-</programlisting>
-
-<para>
-Another approach is by using an array of function pointers,
-something like this:
-</para>
-
-<programlisting>
- (output[state])(inputchar);
-</programlisting>
-
-<para>
-Yet another is to have <varname>state</varname> be a
-function pointer, set to point at the appropriate function:
-</para>
-
-<programlisting>
- (*state)(inputchar);
-</programlisting>
-<para>
-This is the approach we will use in our program because it is very easy to do in assembly language, and very fast, too. We will simply keep the address of the right procedure in <varname role="register">EBX</varname>, and then just issue:</para>
-
-<programlisting>
- call ebx
-</programlisting>
-
-<para>
-This is possibly faster than hardcoding the address in the code
-because the microprocessor does not have to fetch the address from
-the memory&mdash;it is already stored in one of its registers. I said
-<emphasis>possibly</emphasis> because with the caching modern
-microprocessors do, either way may be equally fast.
-</para>
-
-</sect2>
-
-<sect2 id="memory-mapped-files">
-<title>Memory Mapped Files</title>
-
-<para>
-Because our program works on a single file, we cannot use the
-approach that worked for us before, i.e., to read from an input
-file and to write to an output file.
-</para>
-
-<para>
-Unix allows us to map a file, or a section of a file,
-into memory. To do that, we first need to open the file with the
-appropriate read/write flags. Then we use the <function role="syscall">mmap</function>
-system call to map it into the memory. One nice thing about
-<function role="syscall">mmap</function> is that it automatically works with
-virtual memory: We can map more of the file into the memory than
-we have physical memory available, yet still access it through
-regular memory op codes, such as <function role="opcode">mov</function>,
-<function role="opcode">lods</function>, and <function role="opcode">stos</function>.
-Whatever changes we make to the memory image of the file will be
-written to the file by the system. We do not even have to keep
-the file open: As long as it stays mapped, we can
-read from it and write to it.
-</para>
-
-<para>
-The 32-bit Intel microprocessors can access up to four
-gigabytes of memory &ndash; physical or virtual. The FreeBSD system
-allows us to use up to a half of it for file mapping.
-</para>
-
-<para>
-For simplicity sake, in this tutorial we will only convert files
-that can be mapped into the memory in their entirety. There are
-probably not too many text files that exceed two gigabytes in size.
-If our program encounters one, it will simply display a message
-suggesting we use the original
-<application>tuc</application> instead.
-</para>
-
-<para>
-If you examine your copy of <filename>syscalls.master</filename>,
-you will find two separate syscalls named <function role="syscall">mmap</function>.
-This is because of evolution of Unix: There was the traditional
-<acronym>BSD</acronym> <function role="syscall">mmap</function>,
-syscall 71. That one was superceded by the <acronym>POSIX</acronym> <function role="syscall">mmap</function>,
-syscall 197. The FreeBSD system supports both because
-older programs were written by using the original <acronym>BSD</acronym>
-version. But new software uses the <acronym>POSIX</acronym> version,
-which is what we will use.
-</para>
-
-<para>
-The <filename>syscalls.master</filename> file lists
-the <acronym>POSIX</acronym> version like this:
-</para>
-
-<programlisting>
-197 STD BSD { caddr_t mmap(caddr_t addr, size_t len, int prot, \
- int flags, int fd, long pad, off_t pos); }
-</programlisting>
-
-<para>
-This differs slightly from what
-<citerefentry><refentrytitle>mmap</refentrytitle><manvolnum>2</manvolnum></citerefentry>
-says. That is because
-<citerefentry><refentrytitle>mmap</refentrytitle><manvolnum>2</manvolnum></citerefentry>
-describes the C version.
-</para>
-
-<para>
-The difference is in the <varname>long pad</varname> argument, which is not present in the C version. However, the FreeBSD syscalls add a 32-bit pad after <function role="opcode">push</function>ing a 64-bit argument. In this case, <varname>off_t</varname> is a 64-bit value.</para>
-
-<para>
-When we are finished working with a memory-mapped file,
-we unmap it with the <function role="syscall">munmap</function> syscall:
-</para>
-
-<tip>
-<para>
-For an in-depth treatment of <function role="syscall">mmap</function>, see
-W. Richard Stevens'
-<ulink url="http://www.int80h.org/cgi-bin/isbn?isbn=0130810819">Unix
-Network Programming, Volume 2, Chapter 12</ulink>.
-</para>
-</tip>
-
-</sect2>
-
-<sect2 id="x86-file-size">
-<title>Determining File Size</title>
-
-<para>
-Because we need to tell <function role="syscall">mmap</function> how many bytes
-of the file to map into the memory, and because we want to map
-the entire file, we need to determine the size of the file.
-</para>
-
-<para>
-We can use the <function role="syscall">fstat</function> syscall to get all
-the information about an open file that the system can give us.
-That includes the file size.
-</para>
-
-<para>
-Again, <filename>syscalls.master</filename> lists two versions
-of <function role="syscall">fstat</function>, a traditional one
-(syscall 62), and a <acronym>POSIX</acronym> one
-(syscall 189). Naturally, we will use the
-<acronym>POSIX</acronym> version:
-</para>
-
-<programlisting>
-189 STD POSIX { int fstat(int fd, struct stat *sb); }
-</programlisting>
-
-<para>
-This is a very straightforward call: We pass to it the address
-of a <structname>stat</structname> structure and the descriptor
-of an open file. It will fill out the contents of the
-<structname>stat</structname> structure.
-</para>
-
-<para>
-I do, however, have to say that I tried to declare the
-<structname>stat</structname> structure in the
-<varname>.bss</varname> section, and
-<function role="syscall">fstat</function> did not like it: It set the carry
-flag indicating an error. After I changed the code to allocate
-the structure on the stack, everything was working fine.
-</para>
-
-</sect2>
-
-<sect2 id="x86-ftruncate">
-<title>Changing the File Size</title>
-
-<para>
-Because our program may combine carriage return / line feed
-sequences into straight line feeds, our output may be smaller
-than our input. However, since we are placing our output into
-the same file we read the input from, we may have to change the
-size of the file.
-</para>
-
-<para>
-The <function role="syscall">ftruncate</function> system call allows us to do
-just that. Despite its somewhat misleading name, the
-<function role="syscall">ftruncate</function> system call can be used to both
-truncate the file (make it smaller) and to grow it.
-</para>
-
-<para>
-And yes, we will find two versions of <function role="syscall">ftruncate</function>
-in <filename>syscalls.master</filename>, an older one
-(130), and a newer one (201). We will use
-the newer one:
-</para>
-
-<programlisting>
-201 STD BSD { int ftruncate(int fd, int pad, off_t length); }
-</programlisting>
-
-<para>
-Please note that this one contains a <varname>int pad</varname> again.
-</para>
-
-</sect2>
-
-<sect2 id="x86-ftuc">
-<title>ftuc</title>
-
-<para>
-We now know everything we need to write <application>ftuc</application>.
-We start by adding some new lines in <filename>system.inc</filename>.
-First, we define some constants and structures, somewhere at
-or near the beginning of the file:
-</para>
-
-<programlisting>
-;;;;;;; open flags
-%define O_RDONLY 0
-%define O_WRONLY 1
-%define O_RDWR 2
-
-;;;;;;; mmap flags
-%define PROT_NONE 0
-%define PROT_READ 1
-%define PROT_WRITE 2
-%define PROT_EXEC 4
-;;
-%define MAP_SHARED 0001h
-%define MAP_PRIVATE 0002h
-
-;;;;;;; stat structure
-struc stat
-st_dev resd 1 ; = 0
-st_ino resd 1 ; = 4
-st_mode resw 1 ; = 8, size is 16 bits
-st_nlink resw 1 ; = 10, ditto
-st_uid resd 1 ; = 12
-st_gid resd 1 ; = 16
-st_rdev resd 1 ; = 20
-st_atime resd 1 ; = 24
-st_atimensec resd 1 ; = 28
-st_mtime resd 1 ; = 32
-st_mtimensec resd 1 ; = 36
-st_ctime resd 1 ; = 40
-st_ctimensec resd 1 ; = 44
-st_size resd 2 ; = 48, size is 64 bits
-st_blocks resd 2 ; = 56, ditto
-st_blksize resd 1 ; = 64
-st_flags resd 1 ; = 68
-st_gen resd 1 ; = 72
-st_lspare resd 1 ; = 76
-st_qspare resd 4 ; = 80
-endstruc
-</programlisting>
-
-<para>
-We define the new syscalls:
-</para>
-
-<programlisting>
-%define SYS_mmap 197
-%define SYS_munmap 73
-%define SYS_fstat 189
-%define SYS_ftruncate 201
-</programlisting>
-
-<para>
-We add the macros for their use:
-</para>
-
-<programlisting>
-%macro sys.mmap 0
- system SYS_mmap
-%endmacro
-
-%macro sys.munmap 0
- system SYS_munmap
-%endmacro
-
-%macro sys.ftruncate 0
- system SYS_ftruncate
-%endmacro
-
-%macro sys.fstat 0
- system SYS_fstat
-%endmacro
-</programlisting>
-
-<para>
-And here is our code:
-</para>
-
-<programlisting>
-;;;;;;; Fast Text-to-Unix Conversion (ftuc.asm) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;
-;; Started: 21-Dec-2000
-;; Updated: 22-Dec-2000
-;;
-;; Copyright 2000 G. Adam Stanislav.
-;; All rights reserved.
-;;
-;;;;;;; v.1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-%include 'system.inc'
-
-section .data
- db 'Copyright 2000 G. Adam Stanislav.', 0Ah
- db 'All rights reserved.', 0Ah
-usg db 'Usage: ftuc filename', 0Ah
-usglen equ $-usg
-co db "ftuc: Can't open file.", 0Ah
-colen equ $-co
-fae db 'ftuc: File access error.', 0Ah
-faelen equ $-fae
-ftl db 'ftuc: File too long, use regular tuc instead.', 0Ah
-ftllen equ $-ftl
-mae db 'ftuc: Memory allocation error.', 0Ah
-maelen equ $-mae
-
-section .text
-
-align 4
-memerr:
- push dword maelen
- push dword mae
- jmp short error
-
-align 4
-toolong:
- push dword ftllen
- push dword ftl
- jmp short error
-
-align 4
-facerr:
- push dword faelen
- push dword fae
- jmp short error
-
-align 4
-cantopen:
- push dword colen
- push dword co
- jmp short error
-
-align 4
-usage:
- push dword usglen
- push dword usg
-
-error:
- push dword stderr
- sys.write
-
- push dword 1
- sys.exit
-
-align 4
-global _start
-_start:
- pop eax ; argc
- pop eax ; program name
- pop ecx ; file to convert
- jecxz usage
-
- pop eax
- or eax, eax ; Too many arguments?
- jne usage
-
- ; Open the file
- push dword O_RDWR
- push ecx
- sys.open
- jc cantopen
-
- mov ebp, eax ; Save fd
-
- sub esp, byte stat_size
- mov ebx, esp
-
- ; Find file size
- push ebx
- push ebp ; fd
- sys.fstat
- jc facerr
-
- mov edx, [ebx + st_size + 4]
-
- ; File is too long if EDX != 0 ...
- or edx, edx
- jne near toolong
- mov ecx, [ebx + st_size]
- ; ... or if it is above 2 GB
- or ecx, ecx
- js near toolong
-
- ; Do nothing if the file is 0 bytes in size
- jecxz .quit
-
- ; Map the entire file in memory
- push edx
- push edx ; starting at offset 0
- push edx ; pad
- push ebp ; fd
- push dword MAP_SHARED
- push dword PROT_READ | PROT_WRITE
- push ecx ; entire file size
- push edx ; let system decide on the address
- sys.mmap
- jc near memerr
-
- mov edi, eax
- mov esi, eax
- push ecx ; for SYS_munmap
- push edi
-
- ; Use EBX for state machine
- mov ebx, ordinary
- mov ah, 0Ah
- cld
-
-.loop:
- lodsb
- call ebx
- loop .loop
-
- cmp ebx, ordinary
- je .filesize
-
- ; Output final lf
- mov al, ah
- stosb
- inc edx
-
-.filesize:
- ; truncate file to new size
- push dword 0 ; high dword
- push edx ; low dword
- push eax ; pad
- push ebp
- sys.ftruncate
-
- ; close it (ebp still pushed)
- sys.close
-
- add esp, byte 16
- sys.munmap
-
-.quit:
- push dword 0
- sys.exit
-
-align 4
-ordinary:
- cmp al, 0Dh
- je .cr
-
- cmp al, ah
- je .lf
-
- stosb
- inc edx
- ret
-
-align 4
-.cr:
- mov ebx, cr
- ret
-
-align 4
-.lf:
- mov ebx, lf
- ret
-
-align 4
-cr:
- cmp al, 0Dh
- je .cr
-
- cmp al, ah
- je .lf
-
- xchg al, ah
- stosb
- inc edx
-
- xchg al, ah
- ; fall through
-
-.lf:
- stosb
- inc edx
- mov ebx, ordinary
- ret
-
-align 4
-.cr:
- mov al, ah
- stosb
- inc edx
- ret
-
-align 4
-lf:
- cmp al, ah
- je .lf
-
- cmp al, 0Dh
- je .cr
-
- xchg al, ah
- stosb
- inc edx
-
- xchg al, ah
- stosb
- inc edx
- mov ebx, ordinary
- ret
-
-align 4
-.cr:
- mov ebx, ordinary
- mov al, ah
- ; fall through
-
-.lf:
- stosb
- inc edx
- ret
-</programlisting>
-
-<warning><para>
-Do not use this program on files stored on a disk formated
-by <acronym>MS DOS</acronym> or Windows. There seems to be a
-subtle bug in the FreeBSD code when using <function role="syscall">mmap</function>
-on these drives mounted under FreeBSD: If the file is over
-a certain size, <function role="syscall">mmap</function> will just fill the memory
-with zeros, and then copy them to the file overwriting
-its contents.
-</para>
-</warning>
-</sect2>
-
-</sect1>
-
-<sect1 id="x86-one-pointed-mind">
-<title>One-Pointed Mind</title>
-
-<para>
-As a student of Zen, I like the idea of a one-pointed mind:
-Do one thing at a time, and do it well.
-</para>
-
-<para>
-This, indeed, is very much how Unix works as well. While
-a typical Windows application is attempting to do everything
-imaginable (and is, therefore, riddled with bugs), a
-typical Unix program does only one thing, and it does it
-well.
-</para>
-
-<para>
-The typical Unix user then essentially assembles his own
-applications by writing a shell script which combines the
-various existing programs by piping the output of one
-program to the input of another.
-</para>
-
-<para>
-When writing your own Unix software, it is generally a
-good idea to see what parts of the problem you need to
-solve can be handled by existing programs, and only
-write your own programs for that part of the problem
-that you do not have an existing solution for.
-</para>
-
-<sect2 id="x86-csv"><title>CSV</title>
-
-<para>
-I will illustrate this principle with a specific real-life
-example I was faced with recently:
-</para>
-
-<para>
-I needed to extract the 11th field of each record from a
-database I downloaded from a web site. The database was a
-<acronym>CSV</acronym> file, i.e., a list of
-<emphasis>comma-separated values</emphasis>. That is quite
-a standard format for sharing data among people who may be
-using different database software.
-</para>
-
-<para>
-The first line of the file contains the list of various fields
-separated by commas. The rest of the file contains the data
-listed line by line, with values separated by commas.
-</para>
-
-<para>
-I tried <application>awk</application>, using the comma as a separator.
-But because several lines contained a quoted comma,
-<application>awk</application> was extracting the wrong field
-from those lines.
-</para>
-
-<para>
-Therefore, I needed to write my own software to extract the 11th
-field from the <acronym>CSV</acronym> file. However, going with the Unix
-spirit, I only needed to write a simple filter that would do the
-following:
-</para>
-
-<itemizedlist>
-<listitem>
-<para>
-Remove the first line from the file;
-</para>
-</listitem>
-
-<listitem>
-<para>
-Change all unquoted commas to a different character;
-</para>
-</listitem>
-
-<listitem>
-<para>
-Remove all quotation marks.
-</para>
-</listitem>
-
-</itemizedlist>
-<para>
-Strictly speaking, I could use <application>sed</application> to remove
-the first line from the file, but doing so in my own program
-was very easy, so I decided to do it and reduce the size of
-the pipeline.
-</para>
-
-<para>
-At any rate, writing a program like this took me about
-20 minutes. Writing a program that extracts the 11th field
-from the <acronym>CSV</acronym> file would take a lot longer,
-and I could not reuse it to extract some other field from some
-other database.
-</para>
-
-<para>
-This time I decided to let it do a little more work than
-a typical tutorial program would:
-</para>
-
-<itemizedlist>
-<listitem>
-<para>
-It parses its command line for options;
-</para>
-</listitem>
-
-<listitem>
-<para>
-It displays proper usage if it finds wrong arguments;
-</para>
-</listitem>
-
-<listitem>
-<para>
-It produces meaningful error messages.
-</para>
-</listitem>
-
-</itemizedlist>
-<para>
-Here is its usage message:
-</para>
-
-<screen>Usage: csv [-t&lt;delim&gt;] [-c&lt;comma&gt;] [-p] [-o &lt;outfile&gt;] [-i &lt;infile&gt;]</screen>
-
-<para>
-All parameters are optional, and can appear in any order.
-</para>
-
-<para>
-The <parameter>-t</parameter> parameter declares what to replace
-the commas with. The <constant>tab</constant> is the default here.
-For example, <parameter>-t;</parameter> will replace all unquoted
-commas with semicolons.
-</para>
-
-<para>
-I did not need the <parameter>-c</parameter> option, but it may
-come in handy in the future. It lets me declare that I want a
-character other than a comma replaced with something else.
-For example, <parameter>-c@</parameter> will replace all at signs
-(useful if you want to split a list of email addresses
-to their user names and domains).
-</para>
-
-<para>
-The <parameter>-p</parameter> option preserves the first line, i.e.,
-it does not delete it. By default, we delete the first
-line because in a <acronym>CSV</acronym> file it contains the field
-names rather than data.
-</para>
-
-<para>
-The <parameter>-i</parameter> and <parameter>-o</parameter>
-options let me specify the input and the output files. Defaults
-are <filename>stdin</filename> and <filename>stdout</filename>,
-so this is a regular Unix filter.
-</para>
-
-<para>
-I made sure that both <parameter>-i filename</parameter> and
-<parameter>-ifilename</parameter> are accepted. I also made
-sure that only one input and one output files may be
-specified.
-</para>
-
-<para>
-To get the 11th field of each record, I can now do:
-</para>
-
-<screen>&prompt.user; <userinput>csv '-t;' <replaceable>data.csv</replaceable> | awk '-F;' '{print $11}'</userinput></screen>
-
-<para>
-The code stores the options (except for the file descriptors)
-in <varname role="register">EDX</varname>: The comma in <varname role="register">DH</varname>, the new
-separator in <varname role="register">DL</varname>, and the flag for
-the <parameter>-p</parameter> option in the highest bit of
-<varname role="register">EDX</varname>, so a check for its sign will give us a
-quick decision what to do.
-</para>
-
-<para>
-Here is the code:
-</para>
-
-<programlisting>
-;;;;;;; csv.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;
-; Convert a comma-separated file to a something-else separated file.
-;
-; Started: 31-May-2001
-; Updated: 1-Jun-2001
-;
-; Copyright (c) 2001 G. Adam Stanislav
-; All rights reserved.
-;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-%include 'system.inc'
-
-%define BUFSIZE 2048
-
-section .data
-fd.in dd stdin
-fd.out dd stdout
-usg db 'Usage: csv [-t&lt;delim&gt;] [-c&lt;comma&gt;] [-p] [-o &lt;outfile&gt;] [-i &lt;infile&gt;]', 0Ah
-usglen equ $-usg
-iemsg db "csv: Can't open input file", 0Ah
-iemlen equ $-iemsg
-oemsg db "csv: Can't create output file", 0Ah
-oemlen equ $-oemsg
-
-section .bss
-ibuffer resb BUFSIZE
-obuffer resb BUFSIZE
-
-section .text
-align 4
-ierr:
- push dword iemlen
- push dword iemsg
- push dword stderr
- sys.write
- push dword 1 ; return failure
- sys.exit
-
-align 4
-oerr:
- push dword oemlen
- push dword oemsg
- push dword stderr
- sys.write
- push dword 2
- sys.exit
-
-align 4
-usage:
- push dword usglen
- push dword usg
- push dword stderr
- sys.write
- push dword 3
- sys.exit
-
-align 4
-global _start
-_start:
- add esp, byte 8 ; discard argc and argv[0]
- mov edx, (',' &lt;&lt; 8) | 9
-
-.arg:
- pop ecx
- or ecx, ecx
- je near .init ; no more arguments
-
- ; ECX contains the pointer to an argument
- cmp byte [ecx], '-'
- jne usage
-
- inc ecx
- mov ax, [ecx]
-
-.o:
- cmp al, 'o'
- jne .i
-
- ; Make sure we are not asked for the output file twice
- cmp dword [fd.out], stdout
- jne usage
-
- ; Find the path to output file - it is either at [ECX+1],
- ; i.e., -ofile --
- ; or in the next argument,
- ; i.e., -o file
-
- inc ecx
- or ah, ah
- jne .openoutput
- pop ecx
- jecxz usage
-
-.openoutput:
- push dword 420 ; file mode (644 octal)
- push dword 0200h | 0400h | 01h
- ; O_CREAT | O_TRUNC | O_WRONLY
- push ecx
- sys.open
- jc near oerr
-
- add esp, byte 12
- mov [fd.out], eax
- jmp short .arg
-
-.i:
- cmp al, 'i'
- jne .p
-
- ; Make sure we are not asked twice
- cmp dword [fd.in], stdin
- jne near usage
-
- ; Find the path to the input file
- inc ecx
- or ah, ah
- jne .openinput
- pop ecx
- or ecx, ecx
- je near usage
-
-.openinput:
- push dword 0 ; O_RDONLY
- push ecx
- sys.open
- jc near ierr ; open failed
-
- add esp, byte 8
- mov [fd.in], eax
- jmp .arg
-
-.p:
- cmp al, 'p'
- jne .t
- or ah, ah
- jne near usage
- or edx, 1 &lt;&lt; 31
- jmp .arg
-
-.t:
- cmp al, 't' ; redefine output delimiter
- jne .c
- or ah, ah
- je near usage
- mov dl, ah
- jmp .arg
-
-.c:
- cmp al, 'c'
- jne near usage
- or ah, ah
- je near usage
- mov dh, ah
- jmp .arg
-
-align 4
-.init:
- sub eax, eax
- sub ebx, ebx
- sub ecx, ecx
- mov edi, obuffer
-
- ; See if we are to preserve the first line
- or edx, edx
- js .loop
-
-.firstline:
- ; get rid of the first line
- call getchar
- cmp al, 0Ah
- jne .firstline
-
-.loop:
- ; read a byte from stdin
- call getchar
-
- ; is it a comma (or whatever the user asked for)?
- cmp al, dh
- jne .quote
-
- ; Replace the comma with a tab (or whatever the user wants)
- mov al, dl
-
-.put:
- call putchar
- jmp short .loop
-
-.quote:
- cmp al, '"'
- jne .put
-
- ; Print everything until you get another quote or EOL. If it
- ; is a quote, skip it. If it is EOL, print it.
-.qloop:
- call getchar
- cmp al, '"'
- je .loop
-
- cmp al, 0Ah
- je .put
-
- call putchar
- jmp short .qloop
-
-align 4
-getchar:
- or ebx, ebx
- jne .fetch
-
- call read
-
-.fetch:
- lodsb
- dec ebx
- ret
-
-read:
- jecxz .read
- call write
-
-.read:
- push dword BUFSIZE
- mov esi, ibuffer
- push esi
- push dword [fd.in]
- sys.read
- add esp, byte 12
- mov ebx, eax
- or eax, eax
- je .done
- sub eax, eax
- ret
-
-align 4
-.done:
- call write ; flush output buffer
-
- ; close files
- push dword [fd.in]
- sys.close
-
- push dword [fd.out]
- sys.close
-
- ; return success
- push dword 0
- sys.exit
-
-align 4
-putchar:
- stosb
- inc ecx
- cmp ecx, BUFSIZE
- je write
- ret
-
-align 4
-write:
- jecxz .ret ; nothing to write
- sub edi, ecx ; start of buffer
- push ecx
- push edi
- push dword [fd.out]
- sys.write
- add esp, byte 12
- sub eax, eax
- sub ecx, ecx ; buffer is empty now
-.ret:
- ret
-</programlisting>
-
-<para>
-Much of it is taken from <filename>hex.asm</filename> above. But there
-is one important difference: I no longer call <function>write</function>
-whenever I am outputing a line feed. Yet, the code can be
-used interactively.
-</para>
-
-<para>
-I have found a better solution for the interactive problem
-since I first started writing this chapter. I wanted to
-make sure each line is printed out separately only when needed.
-After all, there is no need to flush out every line when used
-non-interactively.
-</para>
-
-<para>
-The new solution I use now is to call <function>write</function> every
-time I find the input buffer empty. That way, when running in
-the interactive mode, the program reads one line from the user's
-keyboard, processes it, and sees its input buffer is empty. It
-flushes its output and reads the next line.
-</para>
-
-<sect3 id="x86-buffered-dark-side">
-<title>The Dark Side of Buffering</title>
-<para>
-This change prevents a mysterious lockup
-in a very specific case. I refer to it as the
-<emphasis>dark side of buffering</emphasis>, mostly
-because it presents a danger that is not
-quite obvious.
-</para>
-
-<para>
-It is unlikely to happen with a program like the
-<application>csv</application> above, so let us consider yet
-another filter: In this case we expect our input
-to be raw data representing color values, such as
-the <emphasis>red</emphasis>, <emphasis>green</emphasis>, and
-<emphasis>blue</emphasis> intensities of a pixel. Our
-output will be the negative of our input.
-</para>
-
-<para>
-Such a filter would be very simple to write.
-Most of it would look just like all the other
-filters we have written so far, so I am only
-going to show you its inner loop:
-</para>
-
-<programlisting>
-.loop:
- call getchar
- not al ; Create a negative
- call putchar
- jmp short .loop
-</programlisting>
-<para>
-Because this filter works with raw data,
-it is unlikely to be used interactively.
-</para>
-
-<para>
-But it could be called by image manipulation software.
-And, unless it calls <function>write</function> before each call
-to <function>read</function>, chances are it will lock up.
-</para>
-
-<para>
-Here is what might happen:
-</para>
-
-<procedure><step><para>
-The image editor will load our filter using the
-C function <function>popen()</function>.
-</para>
-</step>
-<step><para>
-It will read the first row of pixels from
-a bitmap or pixmap.
-</para>
-</step>
-<step><para>
-It will write the first row of pixels to
-the <emphasis>pipe</emphasis> leading to
-the <varname>fd.in</varname> of our filter.
-</para>
-</step>
-<step><para>
-Our filter will read each pixel
-from its input, turn it to a negative,
-and write it to its output buffer.
-</para>
-</step>
-<step><para>
-Our filter will call <function>getchar</function>
-to fetch the next pixel.
-</para>
-</step>
-<step><para>
-<function>getchar</function> will find an empty
-input buffer, so it will call
-<function>read</function>.
-</para>
-</step>
-<step><para>
-<function>read</function> will call the
-<function role="syscall">SYS_read</function> system call.
-</para>
-</step>
-<step><para>
-The <emphasis>kernel</emphasis> will suspend
-our filter until the image editor
-sends more data to the pipe.
-</para>
-</step>
-<step><para>
-The image editor will read from the
-other pipe, connected to the
-<varname>fd.out</varname> of our filter so it can set the first row of the
-output image <emphasis>before</emphasis>
-it sends us the second row of the input.
-</para>
-</step>
-<step><para>
-The <emphasis>kernel</emphasis> suspends
-the image editor until it receives
-some output from our filter, so it
-can pass it on to the image editor.
-</para>
-</step>
-</procedure>
-<para>
-At this point our filter waits for the image
-editor to send it more data to process, while
-the image editor is waiting for our filter
-to send it the result of the processing
-of the first row. But the result sits in
-our output buffer.
-</para>
-
-<para>
-The filter and the image editor will continue
-waiting for each other forever (or, at least,
-until they are killed). Our software has just
-entered a
-<link linkend="secure-race-conditions">race condition</link>.
-</para>
-
-<para>
-This problem does not exist if our filter flushes
-its output buffer <emphasis>before</emphasis> asking the
-<emphasis>kernel</emphasis> for more input data.
-</para>
-
-</sect3>
-
-</sect2>
-
-</sect1>
-
-<sect1 id="x86-fpu">
-<title>Using the <acronym>FPU</acronym></title>
-<para>
-Strangely enough, most of assembly language literature does not
-even mention the existence of the <acronym>FPU</acronym>,
-or <emphasis>floating point unit</emphasis>, let alone discuss
-programming it.
-</para>
-
-<para>
-Yet, never does assembly language shine more than when
-we create highly optimized <acronym>FPU</acronym>
-code by doing things that can be done <emphasis>only</emphasis> in assembly language.</para>
-
-<sect2 id="x86-fpu-organization"><title>Organization of the <acronym>FPU</acronym></title>
-<para>
-The <acronym>FPU</acronym> consists of 8 80&ndash;bit floating&ndash;point registers.
-These are organized in a stack fashion&mdash;you can
-<function>push</function> a value on <acronym>TOS</acronym>
-(<emphasis>top of stack</emphasis>) and you can
-<function>pop</function> it.
-</para>
-
-<para>
-That said, the assembly language op codes are not <function role="opcode">push</function>
-and <function role="opcode">pop</function> because those are already taken.</para>
-
-<para>
-You can <function>push</function> a value on <acronym>TOS</acronym>
-by using <function role="opcode">fld</function>, <function role="opcode">fild</function>,
-and <function role="opcode">fbld</function>. Several other op codes
-let you <function>push</function> many common
-<emphasis>constants</emphasis>&mdash;such as <emphasis>pi</emphasis>&mdash;on
-the <acronym>TOS</acronym>.
-</para>
-
-<para>
-Similarly, you can <function>pop</function> a value by
-using <function role="opcode">fst</function>, <function role="opcode">fstp</function>,
-<function role="opcode">fist</function>, <function role="opcode">fistp</function>, and
-<function role="opcode">fbstp</function>. Actually, only the op
-codes that end with a <emphasis>p</emphasis> will
-literally <function>pop</function> the value,
-the rest will <function>store</function> it
-somewhere else without removing it from
-the <acronym>TOS</acronym>.
-</para>
-
-<para>
-We can transfer the data between the
-<acronym>TOS</acronym> and the computer memory either as
-a 32&ndash;bit, 64&ndash;bit, or 80&ndash;bit <emphasis>real</emphasis>,
-a 16&ndash;bit, 32&ndash;bit, or 64&ndash;bit <emphasis>integer</emphasis>,
-or an 80&ndash;bit <emphasis>packed decimal</emphasis>.
-</para>
-
-<para>
-The 80&ndash;bit <emphasis>packed decimal</emphasis> is
-a special case of <emphasis>binary coded
-decimal</emphasis> which is very convenient when
-converting between the <acronym>ASCII</acronym>
-representation of data and the internal
-data of the <acronym>FPU</acronym>. It allows us to use
-18 significant digits.
-</para>
-
-<para>
-No matter how we represent data in the memory,
-the <acronym>FPU</acronym> always stores it in the 80&ndash;bit
-<emphasis>real</emphasis> format in its registers.
-</para>
-
-<para>
-Its internal precision is at least 19 decimal
-digits, so even if we choose to display results
-as <acronym>ASCII</acronym> in the full
-18&ndash;digit precision, we are still showing
-correct results.
-</para>
-
-<para>
-We can perform mathematical operations on the
-<acronym>TOS</acronym>: We can calculate its
-<emphasis>sine</emphasis>, we can <emphasis>scale</emphasis> it
-(i.e., we can multiply or divide it by a power
-of 2), we can calculate its base&ndash;2
-<emphasis>logarithm</emphasis>, and many other things.
-</para>
-
-<para>
-We can also <emphasis>multiply</emphasis> or
-<emphasis>divide</emphasis> it by, <emphasis>add</emphasis>
-it to, or <emphasis>subtract</emphasis> it from,
-any of the <acronym>FPU</acronym> registers (including
-itself).
-</para>
-
-<para>
-The official Intel op code for the
-<acronym>TOS</acronym> is <varname role="register">st</varname>, and
-for the <emphasis>registers</emphasis>
-<varname role="register">st(0)</varname>&ndash;<varname role="register">st(7)</varname>.
-<varname role="register">st</varname> and <varname role="register">st(0)</varname>, then,
-refer to the same register.
-</para>
-
-<para>
-For whatever reasons, the original author of
-<application>nasm</application> has decided to use
-different op codes, namely
-<varname role="register">st0</varname>&ndash;<varname role="register">st7</varname>.
-In other words, there are no parentheses,
-and the <acronym>TOS</acronym> is always
-<varname role="register">st0</varname>, never just <function role="opcode">st</function>.
-</para>
-
-<sect3 id="x86-fpu-packed-decimal">
-<title>The Packed Decimal Format</title>
-<para>
-The <emphasis>packed decimal</emphasis> format
-uses 10 bytes (80 bits) of
-memory to represent 18 digits. The
-number represented there is always an
-<emphasis>integer</emphasis>.
-</para>
-
-<tip>
-<para>
-You can use it to get decimal places
-by multiplying the <acronym>TOS</acronym>
-by a power of 10 first.
-</para>
-</tip>
-
-<para>
-The highest bit of the highest byte
-(byte 9) is the <emphasis>sign bit</emphasis>:
-If it is set, the number is <emphasis>negative</emphasis>,
-otherwise, it is <emphasis>positive</emphasis>.
-The rest of the bits of this byte are unused/ignored.
-</para>
-
-<para>
-The remaining 9 bytes store the 18 digits
-of the number: 2 digits per byte.</para>
-
-<para>
-The <emphasis>more significant digit</emphasis> is
-stored in the high <emphasis>nibble</emphasis>
-(4 bits), the <emphasis>less significant
-digit</emphasis> in the low <emphasis>nibble</emphasis>.
-</para>
-
-<para>
-That said, you might think that <constant>-1234567</constant>
-would be stored in the memory like this (using
-hexadecimal notation):
-</para>
-
-<programlisting>
-80 00 00 00 00 00 01 23 45 67
-</programlisting>
-<para>
-Alas it is not! As with everything else of Intel make,
-even the <emphasis>packed decimal</emphasis> is
-<emphasis>little&ndash;endian</emphasis>.</para>
-
-<para>
-That means our <constant>-1234567</constant>
-is stored like this:
-</para>
-
-<programlisting>
-67 45 23 01 00 00 00 00 00 80
-</programlisting>
-<para>
-Remember that, or you will be pulling your hair out
-in desperation!
-</para>
-
-<note>
-<para>
-The book to read&mdash;if you can find it&mdash;is Richard Startz'
-<ulink url="http://www.int80h.org/cgi-bin/isbn?isbn=013246604X">8087/80287/80387
-for the IBM PC &amp; Compatibles</ulink>.
-Though it does seem to take the fact about the
-little&ndash;endian storage of the <emphasis>packed
-decimal</emphasis> for granted. I kid you not about the
-desperation of trying to figure out what was wrong
-with the filter I show below <emphasis>before</emphasis>
-it occurred to me I should try the
-little&ndash;endian order even for this type of data.
-</para>
-</note>
-
-</sect3>
-
-</sect2>
-
-<sect2 id="x86-pinhole-photography">
-<title>Excursion to Pinhole Photography</title>
-<para>
-To write meaningful software, we must not only
-understand our programming tools, but also the
-field we are creating software for.
-</para>
-
-<para>
-Our next filter will help us whenever we want
-to build a <emphasis>pinhole camera</emphasis>,
-so, we need some background in <emphasis>pinhole
-photography</emphasis> before we can continue.
-</para>
-
-<sect3 id="x86-camera">
-<title>The Camera</title>
-<para>
-The easiest way to describe any camera ever built
-is as some empty space enclosed in some
-lightproof material, with a small hole in the
-enclosure.
-</para>
-
-<para>
-The enclosure is usually sturdy (e.g., a box),
-though sometimes it is flexible (the bellows).
-It is quite dark inside the camera. However, the
-hole lets light rays in through a single point
-(though in some cases there may be several).
-These light rays form an image, a representation
-of whatever is outside the camera, in front of the
-hole.
-</para>
-
-<para>
-If some light sensitive material (such as film)
-is placed inside the camera, it can capture the
-image.</para>
-
-<para>
-The hole often contains a <emphasis>lens</emphasis>, or
-a lens assembly, often called the <emphasis>objective</emphasis>.
-</para>
-
-</sect3>
-
-<sect3 id="x86-the-pinhole">
-<title>The Pinhole</title>
-<para>
-But, strictly speaking, the lens is not necessary:
-The original cameras did not use a lens but a
-<emphasis>pinhole</emphasis>. Even today, <emphasis>pinholes</emphasis>
-are used, both as a tool to study how cameras
-work, and to achieve a special kind of image.
-</para>
-
-<para>
-The image produced by the <emphasis>pinhole</emphasis>
-is all equally sharp. Or <emphasis>blurred</emphasis>.
-There is an ideal size for a pinhole: If it is
-either larger or smaller, the image loses its
-sharpness.</para>
-
-</sect3>
-
-<sect3 id="x86-focal-length">
-<title>Focal Length</title>
-<para>
-This ideal pinhole diameter is a function
-of the square root of <emphasis>focal
-length</emphasis>, which is the distance of the
-pinhole from the film.
-</para>
-
-<programlisting>
- D = PC * sqrt(FL)
-</programlisting>
-<para>
-In here, <varname>D</varname> is the
-ideal diameter of the pinhole,
-<varname>FL</varname> is the focal length,
-and <constant>PC</constant> is a pinhole
-constant. According to Jay Bender,
-its value is <constant>0.04</constant>, while
-Kenneth Connors has determined it to
-be <constant>0.037</constant>. Others have
-proposed other values. Plus, this
-value is for the daylight only: Other types
-of light will require a different constant,
-whose value can only be determined by
-experimentation.
-</para>
-
-</sect3>
-
-<sect3 id="x86-f-number">
-<title>The F&ndash;Number</title>
-<para>
-The f&ndash;number is a very useful measure of
-how much light reaches the film. A light
-meter can determine that, for example,
-to expose a film of specific sensitivity
-with f5.6 may require the exposure to last
-1/1000 sec.</para>
-
-<para>
-It does not matter whether it is a 35&ndash;mm
-camera, or a 6x9cm camera, etc.
-As long as we know the f&ndash;number, we can determine
-the proper exposure.
-</para>
-
-<para>
-The f&ndash;number is easy to calculate:
-</para>
-
-<programlisting>
- F = FL / D
-</programlisting>
-<para>
-In other words, the f&ndash;number equals the focal
-length divided by the diameter of the pinhole.
-It also means a higher f&ndash;number either implies
-a smaller pinhole or a larger focal distance,
-or both. That, in turn, implies, the higher
-the f&ndash;number, the longer the exposure has to be.
-</para>
-
-<para>
-Furthermore, while pinhole diameter and focal
-distance are one&ndash;dimensional measurements,
-both, the film and the pinhole, are two&ndash;dimensional.
-That means that
-if you have measured the exposure at f&ndash;number
-<varname>A</varname> as <varname>t</varname>, then the exposure
-at f&ndash;number <varname>B</varname> is:</para>
-
-<programlisting>
- t * (B / A)&#178;
-</programlisting>
-</sect3>
-
-<sect3 id="x86-normalized-f-number">
-<title>Normalized F&ndash;Number</title>
-<para>
-While many modern cameras can change the diameter
-of their pinhole, and thus their f&ndash;number, quite
-smoothly and gradually, such was not always the case.
-</para>
-
-<para>
-To allow for different f&ndash;numbers, cameras typically
-contained a metal plate with several holes of
-different sizes drilled to them.
-</para>
-
-<para>
-Their sizes were chosen according to the above
-formula in such a way that the resultant f&ndash;number
-was one of standard f&ndash;numbers used on all cameras
-everywhere. For example, a very old Kodak Duaflex IV
-camera in my possession has three such holes for
-f&ndash;numbers 8, 11, and 16.
-</para>
-
-<para>
-A more recently made camera may offer f&ndash;numbers of
-2.8, 4, 5.6, 8, 11,
-16, 22, and 32 (as well as others).
-These numbers were not chosen arbitrarily: They all are
-powers of the square root of 2, though they may
-be rounded somewhat.
-</para>
-
-</sect3>
-
-<sect3 id="x86-f-stop">
-<title>The F&ndash;Stop</title>
-<para>
-A typical camera is designed in such a way that setting
-any of the normalized f&ndash;numbers changes the feel of the
-dial. It will naturally <emphasis>stop</emphasis> in that
-position. Because of that, these positions of the dial
-are called f&ndash;stops.</para>
-
-<para>
-Since the f&ndash;numbers at each stop are powers of the
-square root of 2, moving the dial by 1
-stop will double the amount of light required for
-proper exposure. Moving it by 2 stops will
-quadruple the required exposure. Moving the dial by
-3 stops will require the increase in exposure
-8 times, etc.
-</para>
-
-</sect3>
-
-</sect2>
-
-<sect2 id="x86-pinhole-software">
-<title>Designing the Pinhole Software</title>
-<para>
-We are now ready to decide what exactly we want our
-pinhole software to do.
-</para>
-
-<sect3 id="xpinhole-processing-input">
-<title>Processing Program Input</title>
-<para>
-Since its main purpose is to help us design a working
-pinhole camera, we will use the <emphasis>focal
-length</emphasis> as the input to the program. This is something
-we can determine without software: Proper focal length
-is determined by the size of the film and by the need
-to shoot "regular" pictures, wide angle pictures, or
-telephoto pictures.
-</para>
-
-<para>
-Most of the programs we have written so far worked with
-individual characters, or bytes, as their input: The
-<application>hex</application> program converted individual bytes
-into a hexadecimal number, the <application>csv</application>
-program either let a character through, or deleted it,
-or changed it to a different character, etc.
-</para>
-
-<para>
-One program, <application>ftuc</application> used the state machine
-to consider at most two input bytes at a time.
-</para>
-
-<para>
-But our <application>pinhole</application> program cannot just
-work with individual characters, it has to deal with
-larger syntactic units.
-</para>
-
-<para>
-For example, if we want the program to calculate the
-pinhole diameter (and other values we will discuss
-later) at the focal lengths of <constant>100 mm</constant>,
-<constant>150 mm</constant>, and <constant>210 mm</constant>, we may want
-to enter something like this:</para>
-
-<screen><userinput>100, 150, 210</userinput></screen>
-<para>
-Our program needs to consider more than a single byte of
-input at a time. When it sees the first <constant>1</constant>,
-it must understand it is seeing the first digit of a
-decimal number. When it sees the <constant>0</constant> and
-the other <constant>0</constant>, it must know it is seeing
-more digits of the same number.
-</para>
-
-<para>
-When it encounters the first comma, it must know it is
-no longer receiving the digits of the first number.
-It must be able to convert the digits of the first number
-into the value of <constant>100</constant>. And the digits of the
-second number into the value of <constant>150</constant>. And,
-of course, the digits of the third number into the
-numeric value of <constant>210</constant>.
-</para>
-
-<para>
-We need to decide what delimiters to accept: Do the
-input numbers have to be separated by a comma? If so,
-how do we treat two numbers separated by something else?
-</para>
-
-<para>
-Personally, I like to keep it simple. Something either
-is a number, so I process it. Or it is not a number,
-so I discard it. I don't like the computer complaining
-about me typing in an extra character when it is
-<emphasis>obvious</emphasis> that it is an extra character. Duh!
-</para>
-
-<para>
-Plus, it allows me to break up the monotony of computing
-and type in a query instead of just a number:
-</para>
-
-<screen><userinput>What is the best pinhole diameter for the focal length of 150?</userinput></screen>
-<para>
-There is no reason for the computer to spit out
-a number of complaints:
-</para>
-
-<screen>Syntax error: What
-Syntax error: is
-Syntax error: the
-Syntax error: best</screen>
-<para>
-Et cetera, et cetera, et cetera.</para>
-
-<para>
-Secondly, I like the <constant>#</constant> character to denote
-the start of a comment which extends to the end of the
-line. This does not take too much effort to code, and
-lets me treat input files for my software as executable
-scripts.
-</para>
-
-<para>
-In our case, we also need to decide what units the
-input should come in: We choose <emphasis>millimeters</emphasis>
-because that is how most photographers measure
-the focus length.
-</para>
-
-<para>
-Finally, we need to decide whether to allow the use
-of the decimal point (in which case we must also
-consider the fact that much of the world uses a
-decimal <emphasis>comma</emphasis>).</para>
-
-<para>
-In our case allowing for the decimal point/comma
-would offer a false sense of precision: There is
-little if any noticeable difference between the
-focus lengths of <constant>50</constant> and <constant>51</constant>,
-so allowing the user to input something like
-<constant>50.5</constant> is not a good idea. This is
-my opinion, mind you, but I am the one writing
-this program. You can make other choices in yours,
-of course.
-</para>
-
-</sect3>
-
-<sect3 id="x86-pinhole-options">
-<title>Offering Options</title>
-<para>
-The most important thing we need to know when building
-a pinhole camera is the diameter of the pinhole. Since
-we want to shoot sharp images, we will use the above
-formula to calculate the pinhole diameter from focal length.
-As experts are offering several different values for the
-<constant>PC</constant> constant, we will need to have the choice.
-</para>
-
-<para>
-It is traditional in Unix programming to have two main ways
-of choosing program parameters, plus to have a default for
-the time the user does not make a choice.
-</para>
-
-<para>
-Why have two ways of choosing?</para>
-
-<para>
-One is to allow a (relatively) <emphasis>permanent</emphasis>
-choice that applies automatically each time the
-software is run without us having to tell it over and
-over what we want it to do.
-</para>
-
-<para>
-The permanent choices may be stored in a configuration
-file, typically found in the user's home directory.
-The file usually has the same name as the application
-but is started with a dot. Often <emphasis>"rc"</emphasis>
-is added to the file name. So, ours could be
-<filename>~/.pinhole</filename> or <filename>~/.pinholerc</filename>.
-(The <filename>~/</filename> means current user's
-home directory.)
-</para>
-
-<para>
-The configuration file is used mostly by programs
-that have many configurable parameters. Those
-that have only one (or a few) often use a different
-method: They expect to find the parameter in an
-<emphasis>environment variable</emphasis>. In our case,
-we might look at an environment variable named
-<varname>PINHOLE</varname>.
-</para>
-
-<para>
-Usually, a program uses one or the other of the
-above methods. Otherwise, if a configuration
-file said one thing, but an environment variable
-another, the program might get confused (or just
-too complicated).
-</para>
-
-<para>
-Because we only need to choose <emphasis>one</emphasis>
-such parameter, we will go with the second method
-and search the environment for a variable named
-<varname>PINHOLE</varname>.</para>
-
-<para>
-The other way allows us to make <emphasis>ad hoc</emphasis>
-decisions: <emphasis>"Though I usually want
-you to use 0.039, this time I want 0.03872."</emphasis>
-In other words, it allows us to <emphasis>override</emphasis>
-the permanent choice.
-</para>
-
-<para>
-This type of choice is usually done with command
-line parameters.
-</para>
-
-<para>
-Finally, a program <emphasis>always</emphasis> needs a
-<emphasis>default</emphasis>. The user may not make
-any choices. Perhaps he does not know what
-to choose. Perhaps he is "just browsing."
-Preferably, the default will be the value
-most users would choose anyway. That way
-they do not need to choose. Or, rather, they
-can choose the default without an additional
-effort.
-</para>
-
-<para>
-Given this system, the program may find conflicting
-options, and handle them this way:
-</para>
-
-<procedure><step><para>
-If it finds an <emphasis>ad hoc</emphasis> choice
-(e.g., command line parameter), it should
-accept that choice. It must ignore any permanent
-choice and any default.
-</para>
-</step>
-<step><para>
-<emphasis>Otherwise</emphasis>, if it finds
-a permanent option (e.g., an environment
-variable), it should accept it, and ignore
-the default.</para>
-</step>
-<step><para>
-<emphasis>Otherwise</emphasis>, it should use
-the default.
-</para>
-</step>
-</procedure>
-<para>
-We also need to decide what <emphasis>format</emphasis>
-our <constant>PC</constant> option should have.
-</para>
-
-<para>
-At first site, it seems obvious to use the
-<varname>PINHOLE=0.04</varname> format for the
-environment variable, and <parameter>-p0.04</parameter>
-for the command line.
-</para>
-
-<para>
-Allowing that is actually a security risk.
-The <constant>PC</constant> constant is a very small
-number. Naturally, we will test our software
-using various small values of <constant>PC</constant>.
-But what will happen if someone runs the program
-choosing a huge value?
-</para>
-
-<para>
-It may crash the program because we have not
-designed it to handle huge numbers.
-</para>
-
-<para>
-Or, we may spend more time on the program so
-it can handle huge numbers. We might do that
-if we were writing commercial software for
-computer illiterate audience.
-</para>
-
-<para>
-Or, we might say, <emphasis>"Tough!
-The user should know better.""</emphasis>
-</para>
-
-<para>
-Or, we just may make it impossible for the user
-to enter a huge number. This is the approach we
-will take: We will use an <emphasis>implied 0.</emphasis>
-prefix.
-</para>
-
-<para>
-In other words, if the user wants <constant>0.04</constant>,
-we will expect him to type <parameter>-p04</parameter>,
-or set <varname>PINHOLE=04</varname> in his environment.
-So, if he says <parameter>-p9999999</parameter>, we will
-interpret it as <constant>0.9999999</constant>&mdash;still
-ridiculous but at least safer.
-</para>
-
-<para>
-Secondly, many users will just want to go with either
-Bender's constant or Connors' constant.
-To make it easier on them, we will interpret
-<parameter>-b</parameter> as identical to <parameter>-p04</parameter>,
-and <parameter>-c</parameter> as identical to <parameter>-p037</parameter>.
-</para>
-
-</sect3>
-
-<sect3 id="x86-pinhole-output">
-<title>The Output</title>
-<para>
-We need to decide what we want our software to
-send to the output, and in what format.
-</para>
-
-<para>
-Since our input allows for an unspecified number
-of focal length entries, it makes sense to use
-a traditional database&ndash;style output of showing
-the result of the calculation for each
-focal length on a separate line, while
-separating all values on one line by a
-<constant>tab</constant> character.
-</para>
-
-<para>
-Optionally, we should also allow the user
-to specify the use of the <acronym>CSV</acronym>
-format we have studied earlier. In this case,
-we will print out a line of comma&ndash;separated
-names describing each field of every line,
-then show our results as before, but substituting
-a <constant>comma</constant> for the <constant>tab</constant>.</para>
-
-<para>
-We need a command line option for the <acronym>CSV</acronym>
-format. We cannot use <parameter>-c</parameter> because
-that already means <emphasis>use Connors' constant</emphasis>.
-For some strange reason, many web sites refer to
-<acronym>CSV</acronym> files as <emphasis>"Excel
-spreadsheet"</emphasis> (though the <acronym>CSV</acronym>
-format predates Excel). We will, therefore, use
-the <parameter>-e</parameter> switch to inform our software
-we want the output in the <acronym>CSV</acronym> format.
-</para>
-
-<para>
-We will start each line of the output with the
-focal length. This may sound repetitious at first,
-especially in the interactive mode: The user
-types in the focal length, and we are repeating it.
-</para>
-
-<para>
-But the user can type several focal lengths on one
-line. The input can also come in from a file or
-from the output of another program. In that case
-the user does not see the input at all.
-</para>
-
-<para>
-By the same token, the output can go to a file
-which we will want to examine later, or it could
-go to the printer, or become the input of another
-program.
-</para>
-
-<para>
-So, it makes perfect sense to start each line with
-the focal length as entered by the user.
-</para>
-
-<para>
-No, wait! Not as entered by the user. What if the user
-types in something like this:</para>
-
-<screen><userinput>00000000150</userinput></screen>
-<para>
-Clearly, we need to strip those leading zeros.</para>
-
-<para>
-So, we might consider reading the user input as is,
-converting it to binary inside the <acronym>FPU</acronym>,
-and printing it out from there.
-</para>
-
-<para>
-But...</para>
-
-<para>
-What if the user types something like this:
-</para>
-
-<screen><userinput>17459765723452353453534535353530530534563507309676764423</userinput></screen>
-<para>
-Ha! The packed decimal <acronym>FPU</acronym> format
-lets us input 18&ndash;digit numbers. But the
-user has entered more than 18 digits. How
-do we handle that?
-</para>
-
-<para>
-Well, we <emphasis>could</emphasis> modify our code to read
-the first 18 digits, enter it to the <acronym>FPU</acronym>,
-then read more, multiply what we already have on the
-<acronym>TOS</acronym> by 10 raised to the number
-of additional digits, then <function>add</function> to it.
-</para>
-
-<para>
-Yes, we could do that. But in <emphasis>this</emphasis>
-program it would be ridiculous (in a different one it may be just the thing to do): Even the circumference of the Earth expressed in
-millimeters only takes 11 digits. Clearly,
-we cannot build a camera that large (not yet,
-anyway).
-</para>
-
-<para>
-So, if the user enters such a huge number, he is
-either bored, or testing us, or trying to break
-into the system, or playing games&mdash;doing
-anything but designing a pinhole camera.
-</para>
-
-<para>
-What will we do?</para>
-
-<para>
-We will slap him in the face, in a manner of speaking:</para>
-
-<screen>17459765723452353453534535353530530534563507309676764423 ??? ??? ??? ??? ???</screen>
-<para>
-To achieve that, we will simply ignore any leading zeros.
-Once we find a non&ndash;zero digit, we will initialize a
-counter to <constant>0</constant> and start taking three steps:
-</para>
-
-<procedure>
-<step><para>
-Send the digit to the output.
-</para>
-</step>
-<step><para>
-Append the digit to a buffer we will use later to
-produce the packed decimal we can send to the
-<acronym>FPU</acronym>.
-</para>
-</step>
-<step><para>
-Increase the counter.
-</para>
-</step>
-</procedure>
-<para>
-Now, while we are taking these three steps,
-we also need to watch out for one of two
-conditions:</para>
-
-<itemizedlist>
-<listitem>
-<para>
-If the counter grows above 18,
-we stop appending to the buffer. We
-continue reading the digits and sending
-them to the output.
-</para>
-</listitem>
-
-<listitem>
-<para>
-If, or rather <emphasis>when</emphasis>,
-the next input character is not
-a digit, we are done inputting
-for now.
-</para>
-
-<para>
-Incidentally, we can simply
-discard the non&ndash;digit, unless it
-is a <constant>#</constant>, which we must
-return to the input stream. It
-starts a comment, so we must see it
-after we are done producing output
-and start looking for more input.
-</para>
-</listitem>
-
-</itemizedlist>
-<para>
-That still leaves one possibility
-uncovered: If all the user enters
-is a zero (or several zeros), we
-will never find a non&ndash;zero to
-display.</para>
-
-<para>
-We can determine this has happened
-whenever our counter stays at <constant>0</constant>.
-In that case we need to send <constant>0</constant>
-to the output, and perform another
-"slap in the face":
-</para>
-
-<screen>0 ??? ??? ??? ??? ???</screen>
-<para>
-Once we have displayed the focal
-length and determined it is valid
-(greater than <constant>0</constant>
-but not exceeding 18 digits),
-we can calculate the pinhole diameter.
-</para>
-
-<para>
-It is not by coincidence that <emphasis>pinhole</emphasis>
-contains the word <emphasis>pin</emphasis>. Indeed,
-many a pinhole literally is a <emphasis>pin
-hole</emphasis>, a hole carefully punched with the
-tip of a pin.
-</para>
-
-<para>
-That is because a typical pinhole is very
-small. Our formula gets the result in
-millimeters. We will multiply it by <constant>1000</constant>,
-so we can output the result in <emphasis>microns</emphasis>.
-</para>
-
-<para>
-At this point we have yet another trap to face:
-<emphasis>Too much precision.</emphasis>
-</para>
-
-<para>
-Yes, the <acronym>FPU</acronym> was designed
-for high precision mathematics. But we
-are not dealing with high precision
-mathematics. We are dealing with physics
-(optics, specifically).
-</para>
-
-<para>
-Suppose we want to convert a truck into
-a pinhole camera (we would not be the
-first ones to do that!). Suppose its box is
-<constant>12</constant>
-meters long, so we have the focal length
-of <constant>12000</constant>. Well, using Bender's constant, it gives us square root of
-<constant>12000</constant> multiplied by <constant>0.04</constant>,
-which is <constant>4.381780460</constant> millimeters,
-or <constant>4381.780460</constant> microns.
-</para>
-
-<para>
-Put either way, the result is absurdly precise.
-Our truck is not <emphasis>exactly</emphasis> <constant>12000</constant>
-millimeters long. We did not measure its length
-with such a precision, so stating we need a pinhole
-with the diameter of <constant>4.381780460</constant>
-millimeters is, well, deceiving. <constant>4.4</constant>
-millimeters would do just fine.
-</para>
-
-<note>
-<para>
-I "only" used ten digits in the above example.
-Imagine the absurdity of going for all 18!
-</para>
-</note>
-
-<para>
-We need to limit the number of significant
-digits of our result. One way of doing it
-is by using an integer representing microns.
-So, our truck would need a pinhole with the diameter
-of <constant>4382</constant> microns. Looking at that number, we still decide that <constant>4400</constant> microns,
-or <constant>4.4</constant> millimeters is close enough.
-</para>
-
-<para>
-Additionally, we can decide that no matter how
-big a result we get, we only want to display four
-siginificant digits (or any other number
-of them, of course). Alas, the <acronym>FPU</acronym>
-does not offer rounding to a specific number
-of digits (after all, it does not view the
-numbers as decimal but as binary).
-</para>
-
-<para>
-We, therefore, must devise an algorithm to reduce
-the number of significant digits.
-</para>
-
-<para>
-Here is mine (I think it is awkward&mdash;if
-you know a better one, <emphasis>please</emphasis>, let me know):</para>
-
-<procedure>
-<step><para>
-Initialize a counter to <constant>0</constant>.
-</para>
-</step>
-<step><para>
-While the number is greater than or equal to
-<constant>10000</constant>, divide it by
-<constant>10</constant> and increase the counter.
-</para>
-</step>
-<step><para>
-Output the result.</para>
-</step>
-<step><para>
-While the counter is greater than <constant>0</constant>,
-output <constant>0</constant> and decrease the counter.
-</para>
-</step>
-</procedure>
-<note>
-<para>
-The <constant>10000</constant> is only good if you want
-<emphasis>four</emphasis> significant digits. For any other
-number of significant digits, replace
-<constant>10000</constant> with <constant>10</constant>
-raised to the number of significant digits.
-</para>
-</note>
-
-<para>
-We will, then, output the pinhole diameter
-in microns, rounded off to four significant
-digits.
-</para>
-
-<para>
-At this point, we know the <emphasis>focal
-length</emphasis> and the <emphasis>pinhole
-diameter</emphasis>. That means we have enough
-information to also calculate the
-<emphasis>f&ndash;number</emphasis>.
-</para>
-
-<para>
-We will display the f&ndash;number, rounded to
-four significant digits. Chances are the
-f&ndash;number will tell us very little. To make
-it more meaningful, we can find the nearest
-<emphasis>normalized f&ndash;number</emphasis>, i.e.,
-the nearest power of the square root
-of 2.
-</para>
-
-<para>
-We do that by multiplying the actual f&ndash;number
-by itself, which, of course, will give us
-its <function>square</function>. We will then calculate
-its base&ndash;2 logarithm, which is much
-easier to do than calculating the
-base&ndash;square&ndash;root&ndash;of&ndash;2 logarithm!
-We will round the result to the nearest integer.
-Next, we will raise 2 to the result. Actually,
-the <acronym>FPU</acronym> gives us a good shortcut
-to do that: We can use the <function role="opcode">fscale</function>
-op code to "scale" 1, which is
-analogous to <function role="opcode">shift</function>ing an
-integer left. Finally, we calculate the square
-root of it all, and we have the nearest
-normalized f&ndash;number.
-</para>
-
-<para>
-If all that sounds overwhelming&mdash;or too much
-work, perhaps&mdash;it may become much clearer
-if you see the code. It takes 9 op
-codes altogether:</para>
-
-<programlisting>
- fmul st0, st0
- fld1
- fld st1
- fyl2x
- frndint
- fld1
- fscale
- fsqrt
- fstp st1
-</programlisting>
-<para>
-The first line, <function role="opcode">fmul st0, st0</function>, squares
-the contents of the <acronym>TOS</acronym>
-(top of the stack, same as <varname role="register">st</varname>,
-called <varname role="register">st0</varname> by <application>nasm</application>).
-The <function role="opcode">fld1</function> pushes <constant>1</constant>
-on the <acronym>TOS</acronym>.</para>
-
-<para>
-The next line, <function role="opcode">fld st1</function>, pushes
-the square back to the <acronym>TOS</acronym>.
-At this point the square is both in <varname role="register">st</varname>
-and <varname role="register">st(2)</varname> (it will become
-clear why we leave a second copy on the stack
-in a moment). <varname role="register">st(1)</varname> contains
-<constant>1</constant>.
-</para>
-
-<para>
-Next, <function role="opcode">fyl2x</function> calculates base&ndash;2
-logarithm of <varname role="register">st</varname> multiplied by
-<varname role="register">st(1)</varname>. That is why we placed <constant>1</constant> on <varname role="register">st(1)</varname> before.</para>
-
-<para>
-At this point, <varname role="register">st</varname> contains
-the logarithm we have just calculated,
-<varname role="register">st(1)</varname> contains the square
-of the actual f&ndash;number we saved for later.
-</para>
-
-<para>
-<function role="opcode">frndint</function> rounds the <acronym>TOS</acronym>
-to the nearest integer. <function role="opcode">fld1</function> pushes
-a <constant>1</constant>. <function role="opcode">fscale</function> shifts the
-<constant>1</constant> we have on the <acronym>TOS</acronym>
-by the value in <varname role="register">st(1)</varname>,
-effectively raising 2 to <varname role="register">st(1)</varname>.
-</para>
-
-<para>
-Finally, <function role="opcode">fsqrt</function> calculates
-the square root of the result, i.e.,
-the nearest normalized f&ndash;number.
-</para>
-
-<para>
-We now have the nearest normalized
-f&ndash;number on the <acronym>TOS</acronym>,
-the base&ndash;2 logarithm rounded to the
-nearest integer in <varname role="register">st(1)</varname>,
-and the square of the actual f&ndash;number
-in <varname role="register">st(2)</varname>. We are saving
-the value in <varname role="register">st(2)</varname> for later.
-</para>
-
-<para>
-But we do not need the contents of
-<varname role="register">st(1)</varname> anymore. The last
-line, <function role="opcode">fstp st1</function>, places the
-contents of <varname role="register">st</varname> to
-<varname role="register">st(1)</varname>, and pops. As a
-result, what was <varname role="register">st(1)</varname>
-is now <varname role="register">st</varname>, what was <varname role="register">st(2)</varname>
-is now <varname role="register">st(1)</varname>, etc.
-The new <varname role="register">st</varname> contains the
-normalized f&ndash;number. The new
-<varname role="register">st(1)</varname> contains the square
-of the actual f&ndash;number we have
-stored there for posterity.
-</para>
-
-<para>
-At this point, we are ready to output
-the normalized f&ndash;number. Because it is
-normalized, we will not round it off to
-four significant digits, but will
-send it out in its full precision.
-</para>
-
-<para>
-The normalized f-number is useful as long
-as it is reasonably small and can be found
-on our light meter. Otherwise we need a
-different method of determining proper
-exposure.
-</para>
-
-<para>
-Earlier we have figured out the formula
-of calculating proper exposure at an arbitrary
-f&ndash;number from that measured at a different
-f&ndash;number.
-</para>
-
-<para>
-Every light meter I have ever seen can determine
-proper exposure at f5.6. We will, therefore,
-calculate an <emphasis>"f5.6 multiplier,"</emphasis>
-i.e., by how much we need to multiply the exposure measured
-at f5.6 to determine the proper exposure
-for our pinhole camera.
-</para>
-
-<para>
-From the above formula we know this factor can be
-calculated by dividing our f&ndash;number (the
-actual one, not the normalized one) by
-<constant>5.6</constant>, and squaring the result.
-</para>
-
-<para>
-Mathematically, dividing the square of our
-f&ndash;number by the square of <constant>5.6</constant>
-will give us the same result.
-</para>
-
-<para>
-Computationally, we do not want to square
-two numbers when we can only square one.
-So, the first solution seems better at first.
-</para>
-
-<para>
-But...</para>
-
-<para>
-<constant>5.6</constant> is a <emphasis>constant</emphasis>.
-We do not have to have our <acronym>FPU</acronym>
-waste precious cycles. We can just tell it
-to divide the square of the f&ndash;number by
-whatever <constant>5.6&#178;</constant> equals to.
-Or we can divide the f&ndash;number by <constant>5.6</constant>,
-and then square the result. The two ways
-now seem equal.
-</para>
-
-<para>
-But, they are not!</para>
-
-<para>
-Having studied the principles of photography
-above, we remember that the <constant>5.6</constant>
-is actually square root of 2 raised to
-the fifth power. An <emphasis>irrational</emphasis>
-number. The square of this number is
-<emphasis>exactly</emphasis> <constant>32</constant>.
-</para>
-
-<para>
-Not only is <constant>32</constant> an integer,
-it is a power of 2. We do not need
-to divide the square of the f&ndash;number by
-<constant>32</constant>. We only need to use
-<function role="opcode">fscale</function> to shift it right by
-five positions. In the <acronym>FPU</acronym>
-lingo it means we will <function role="opcode">fscale</function> it
-with <varname role="register">st(1)</varname> equal to
-<constant>-5</constant>. That is <emphasis>much
-faster</emphasis> than a division.
-</para>
-
-<para>
-So, now it has become clear why we have
-saved the square of the f&ndash;number on the
-top of the <acronym>FPU</acronym> stack.
-The calculation of the f5.6 multiplier
-is the easiest calculation of this
-entire program! We will output it rounded
-to four significant digits.
-</para>
-
-<para>
-There is one more useful number we can calculate:
-The number of stops our f&ndash;number is from f5.6.
-This may help us if our f&ndash;number is just outside
-the range of our light meter, but we have
-a shutter which lets us set various speeds,
-and this shutter uses stops.
-</para>
-
-<para>
-Say, our f&ndash;number is 5 stops from
-f5.6, and the light meter says
-we should use 1/1000 sec.
-Then we can set our shutter speed to 1/1000
-first, then move the dial by 5 stops.
-</para>
-
-<para>
-This calculation is quite easy as well. All
-we have to do is to calculate the base-2
-logarithm of the f5.6 multiplier
-we had just calculated (though we need its
-value from before we rounded it off). We then
-output the result rounded to the nearest integer.
-We do not need to worry about having more than
-four significant digits in this one: The result
-is most likely to have only one or two digits
-anyway.</para>
-
-</sect3>
-
-</sect2>
-
-<sect2 id="x86-fpu-optimizations">
-<title>FPU Optimizations</title>
-<para>
-In assembly language we can optimize the <acronym>FPU</acronym>
-code in ways impossible in high languages,
-including C.
-</para>
-
-<para>
-Whenever a C function needs to calculate
-a floating&ndash;point value, it loads all necessary
-variables and constants into <acronym>FPU</acronym>
-registers. It then does whatever calculation is
-required to get the correct result. Good C
-compilers can optimize that part of the code really
-well.
-</para>
-
-<para>
-It "returns" the value by leaving
-the result on the <acronym>TOS</acronym>.
-However, before it returns, it cleans up.
-Any variables and constants it used in its
-calculation are now gone from the <acronym>FPU</acronym>.
-</para>
-
-<para>
-It cannot do what we just did above: We calculated
-the square of the f&ndash;number and kept it on the
-stack for later use by another function.
-</para>
-
-<para>
-We <emphasis>knew</emphasis> we would need that value
-later on. We also knew we had enough room on the
-stack (which only has room for 8 numbers)
-to store it there.
-</para>
-
-<para>
-A C compiler has no way of knowing
-that a value it has on the stack will be
-required again in the very near future.
-</para>
-
-<para>
-Of course, the C programmer may know it.
-But the only recourse he has is to store the
-value in a memory variable.
-</para>
-
-<para>
-That means, for one, the value will be changed
-from the 80-bit precision used internally
-by the <acronym>FPU</acronym> to a C <emphasis>double</emphasis>
-(64 bits) or even <emphasis>single</emphasis> (32
-bits).
-</para>
-
-<para>
-That also means that the value must be moved
-from the <acronym>TOS</acronym> into the memory,
-and then back again. Alas, of all <acronym>FPU</acronym>
-operations, the ones that access the computer
-memory are the slowest.
-</para>
-
-<para>
-So, whenever programming the <acronym>FPU</acronym>
-in assembly language, look for the ways of keeping
-intermediate results on the <acronym>FPU</acronym>
-stack.
-</para>
-
-<para>
-We can take that idea even further! In our
-program we are using a <emphasis>constant</emphasis>
-(the one we named <constant>PC</constant>).
-</para>
-
-<para>
-It does not matter how many pinhole diameters
-we are calculating: 1, 10, 20,
-1000, we are always using the same constant.
-Therefore, we can optimize our program by keeping
-the constant on the stack all the time.
-</para>
-
-<para>
-Early on in our program, we are calculating the
-value of the above constant. We need to divide
-our input by <constant>10</constant> for every digit in the
-constant.
-</para>
-
-<para>
-It is much faster to multiply than to divide.
-So, at the start of our program, we divide <constant>10</constant>
-into <constant>1</constant> to obtain <constant>0.1</constant>, which we
-then keep on the stack: Instead of dividing the
-input by <constant>10</constant> for every digit,
-we multiply it by <constant>0.1</constant>.
-</para>
-
-<para>
-By the way, we do not input <constant>0.1</constant> directly,
-even though we could. We have a reason for that:
-While <constant>0.1</constant> can be expressed with just one
-decimal place, we do not know how many <emphasis>binary</emphasis>
-places it takes. We, therefore, let the <acronym>FPU</acronym>
-calculate its binary value to its own high precision.
-</para>
-
-<para>
-We are using other constants: We multiply the pinhole
-diameter by <constant>1000</constant> to convert it from
-millimeters to microns. We compare numbers to
-<constant>10000</constant> when we are rounding them off to
-four significant digits. So, we keep both, <constant>1000</constant>
-and <constant>10000</constant>, on the stack. And, of course,
-we reuse the <constant>0.1</constant> when rounding off numbers
-to four digits.
-</para>
-
-<para>
-Last but not least, we keep <constant>-5</constant> on the stack.
-We need it to scale the square of the f&ndash;number,
-instead of dividing it by <constant>32</constant>. It is not
-by coincidence we load this constant last. That makes
-it the top of the stack when only the constants
-are on it. So, when the square of the f&ndash;number is
-being scaled, the <constant>-5</constant> is at <varname role="register">st(1)</varname>,
-precisely where <function role="opcode">fscale</function> expects it to be.
-</para>
-
-<para>
-It is common to create certain constants from
-scratch instead of loading them from the memory.
-That is what we are doing with <constant>-5</constant>:
-</para>
-
-<programlisting>
- fld1 ; TOS = 1
- fadd st0, st0 ; TOS = 2
- fadd st0, st0 ; TOS = 4
- fld1 ; TOS = 1
- faddp st1, st0 ; TOS = 5
- fchs ; TOS = -5
-</programlisting>
-<para>
-We can generalize all these optimizations into one rule:
-<emphasis>Keep repeat values on the stack!</emphasis>
-</para>
-
-<tip>
-<para>
-<emphasis>PostScript</emphasis> is a stack&ndash;oriented
-programming language. There are many more books
-available about PostScript than about the
-<acronym>FPU</acronym> assembly language: Mastering
-PostScript will help you master the <acronym>FPU</acronym>.
-</para>
-</tip>
-
-</sect2>
-
-<sect2 id="x86-pinhole-the-code">
-<title><application>pinhole</application>&mdash;The Code</title>
-<programlisting>
-;;;;;;; pinhole.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;
-; Find various parameters of a pinhole camera construction and use
-;
-; Started: 9-Jun-2001
-; Updated: 10-Jun-2001
-;
-; Copyright (c) 2001 G. Adam Stanislav
-; All rights reserved.
-;
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-%include 'system.inc'
-
-%define BUFSIZE 2048
-
-section .data
-align 4
-ten dd 10
-thousand dd 1000
-tthou dd 10000
-fd.in dd stdin
-fd.out dd stdout
-envar db 'PINHOLE=' ; Exactly 8 bytes, or 2 dwords long
-pinhole db '04,', ; Bender's constant (0.04)
-connors db '037', 0Ah ; Connors' constant
-usg db 'Usage: pinhole [-b] [-c] [-e] [-p &lt;value&gt;] [-o &lt;outfile&gt;] [-i &lt;infile&gt;]', 0Ah
-usglen equ $-usg
-iemsg db "pinhole: Can't open input file", 0Ah
-iemlen equ $-iemsg
-oemsg db "pinhole: Can't create output file", 0Ah
-oemlen equ $-oemsg
-pinmsg db "pinhole: The PINHOLE constant must not be 0", 0Ah
-pinlen equ $-pinmsg
-toobig db "pinhole: The PINHOLE constant may not exceed 18 decimal places", 0Ah
-biglen equ $-toobig
-huhmsg db 9, '???'
-separ db 9, '???'
-sep2 db 9, '???'
-sep3 db 9, '???'
-sep4 db 9, '???', 0Ah
-huhlen equ $-huhmsg
-header db 'focal length in millimeters,pinhole diameter in microns,'
- db 'F-number,normalized F-number,F-5.6 multiplier,stops '
- db 'from F-5.6', 0Ah
-headlen equ $-header
-
-section .bss
-ibuffer resb BUFSIZE
-obuffer resb BUFSIZE
-dbuffer resb 20 ; decimal input buffer
-bbuffer resb 10 ; BCD buffer
-
-section .text
-align 4
-huh:
- call write
- push dword huhlen
- push dword huhmsg
- push dword [fd.out]
- sys.write
- add esp, byte 12
- ret
-
-align 4
-perr:
- push dword pinlen
- push dword pinmsg
- push dword stderr
- sys.write
- push dword 4 ; return failure
- sys.exit
-
-align 4
-consttoobig:
- push dword biglen
- push dword toobig
- push dword stderr
- sys.write
- push dword 5 ; return failure
- sys.exit
-
-align 4
-ierr:
- push dword iemlen
- push dword iemsg
- push dword stderr
- sys.write
- push dword 1 ; return failure
- sys.exit
-
-align 4
-oerr:
- push dword oemlen
- push dword oemsg
- push dword stderr
- sys.write
- push dword 2
- sys.exit
-
-align 4
-usage:
- push dword usglen
- push dword usg
- push dword stderr
- sys.write
- push dword 3
- sys.exit
-
-align 4
-global _start
-_start:
- add esp, byte 8 ; discard argc and argv[0]
- sub esi, esi
-
-.arg:
- pop ecx
- or ecx, ecx
- je near .getenv ; no more arguments
-
- ; ECX contains the pointer to an argument
- cmp byte [ecx], '-'
- jne usage
-
- inc ecx
- mov ax, [ecx]
- inc ecx
-
-.o:
- cmp al, 'o'
- jne .i
-
- ; Make sure we are not asked for the output file twice
- cmp dword [fd.out], stdout
- jne usage
-
- ; Find the path to output file - it is either at [ECX+1],
- ; i.e., -ofile --
- ; or in the next argument,
- ; i.e., -o file
-
- or ah, ah
- jne .openoutput
- pop ecx
- jecxz usage
-
-.openoutput:
- push dword 420 ; file mode (644 octal)
- push dword 0200h | 0400h | 01h
- ; O_CREAT | O_TRUNC | O_WRONLY
- push ecx
- sys.open
- jc near oerr
-
- add esp, byte 12
- mov [fd.out], eax
- jmp short .arg
-
-.i:
- cmp al, 'i'
- jne .p
-
- ; Make sure we are not asked twice
- cmp dword [fd.in], stdin
- jne near usage
-
- ; Find the path to the input file
- or ah, ah
- jne .openinput
- pop ecx
- or ecx, ecx
- je near usage
-
-.openinput:
- push dword 0 ; O_RDONLY
- push ecx
- sys.open
- jc near ierr ; open failed
-
- add esp, byte 8
- mov [fd.in], eax
- jmp .arg
-
-.p:
- cmp al, 'p'
- jne .c
- or ah, ah
- jne .pcheck
-
- pop ecx
- or ecx, ecx
- je near usage
-
- mov ah, [ecx]
-
-.pcheck:
- cmp ah, '0'
- jl near usage
- cmp ah, '9'
- ja near usage
- mov esi, ecx
- jmp .arg
-
-.c:
- cmp al, 'c'
- jne .b
- or ah, ah
- jne near usage
- mov esi, connors
- jmp .arg
-
-.b:
- cmp al, 'b'
- jne .e
- or ah, ah
- jne near usage
- mov esi, pinhole
- jmp .arg
-
-.e:
- cmp al, 'e'
- jne near usage
- or ah, ah
- jne near usage
- mov al, ','
- mov [huhmsg], al
- mov [separ], al
- mov [sep2], al
- mov [sep3], al
- mov [sep4], al
- jmp .arg
-
-align 4
-.getenv:
- ; If ESI = 0, we did not have a -p argument,
- ; and need to check the environment for "PINHOLE="
- or esi, esi
- jne .init
-
- sub ecx, ecx
-
-.nextenv:
- pop esi
- or esi, esi
- je .default ; no PINHOLE envar found
-
- ; check if this envar starts with 'PINHOLE='
- mov edi, envar
- mov cl, 2 ; 'PINHOLE=' is 2 dwords long
-rep cmpsd
- jne .nextenv
-
- ; Check if it is followed by a digit
- mov al, [esi]
- cmp al, '0'
- jl .default
- cmp al, '9'
- jbe .init
- ; fall through
-
-align 4
-.default:
- ; We got here because we had no -p argument,
- ; and did not find the PINHOLE envar.
- mov esi, pinhole
- ; fall through
-
-align 4
-.init:
- sub eax, eax
- sub ebx, ebx
- sub ecx, ecx
- sub edx, edx
- mov edi, dbuffer+1
- mov byte [dbuffer], '0'
-
- ; Convert the pinhole constant to real
-.constloop:
- lodsb
- cmp al, '9'
- ja .setconst
- cmp al, '0'
- je .processconst
- jb .setconst
-
- inc dl
-
-.processconst:
- inc cl
- cmp cl, 18
- ja near consttoobig
- stosb
- jmp short .constloop
-
-align 4
-.setconst:
- or dl, dl
- je near perr
-
- finit
- fild dword [tthou]
-
- fld1
- fild dword [ten]
- fdivp st1, st0
-
- fild dword [thousand]
- mov edi, obuffer
-
- mov ebp, ecx
- call bcdload
-
-.constdiv:
- fmul st0, st2
- loop .constdiv
-
- fld1
- fadd st0, st0
- fadd st0, st0
- fld1
- faddp st1, st0
- fchs
-
- ; If we are creating a CSV file,
- ; print header
- cmp byte [separ], ','
- jne .bigloop
-
- push dword headlen
- push dword header
- push dword [fd.out]
- sys.write
-
-.bigloop:
- call getchar
- jc near done
-
- ; Skip to the end of the line if you got '#'
- cmp al, '#'
- jne .num
- call skiptoeol
- jmp short .bigloop
-
-.num:
- ; See if you got a number
- cmp al, '0'
- jl .bigloop
- cmp al, '9'
- ja .bigloop
-
- ; Yes, we have a number
- sub ebp, ebp
- sub edx, edx
-
-.number:
- cmp al, '0'
- je .number0
- mov dl, 1
-
-.number0:
- or dl, dl ; Skip leading 0's
- je .nextnumber
- push eax
- call putchar
- pop eax
- inc ebp
- cmp ebp, 19
- jae .nextnumber
- mov [dbuffer+ebp], al
-
-.nextnumber:
- call getchar
- jc .work
- cmp al, '#'
- je .ungetc
- cmp al, '0'
- jl .work
- cmp al, '9'
- ja .work
- jmp short .number
-
-.ungetc:
- dec esi
- inc ebx
-
-.work:
- ; Now, do all the work
- or dl, dl
- je near .work0
-
- cmp ebp, 19
- jae near .toobig
-
- call bcdload
-
- ; Calculate pinhole diameter
-
- fld st0 ; save it
- fsqrt
- fmul st0, st3
- fld st0
- fmul st5
- sub ebp, ebp
-
- ; Round off to 4 significant digits
-.diameter:
- fcom st0, st7
- fstsw ax
- sahf
- jb .printdiameter
- fmul st0, st6
- inc ebp
- jmp short .diameter
-
-.printdiameter:
- call printnumber ; pinhole diameter
-
- ; Calculate F-number
-
- fdivp st1, st0
- fld st0
-
- sub ebp, ebp
-
-.fnumber:
- fcom st0, st6
- fstsw ax
- sahf
- jb .printfnumber
- fmul st0, st5
- inc ebp
- jmp short .fnumber
-
-.printfnumber:
- call printnumber ; F number
-
- ; Calculate normalized F-number
- fmul st0, st0
- fld1
- fld st1
- fyl2x
- frndint
- fld1
- fscale
- fsqrt
- fstp st1
-
- sub ebp, ebp
- call printnumber
-
- ; Calculate time multiplier from F-5.6
-
- fscale
- fld st0
-
- ; Round off to 4 significant digits
-.fmul:
- fcom st0, st6
- fstsw ax
- sahf
-
- jb .printfmul
- inc ebp
- fmul st0, st5
- jmp short .fmul
-
-.printfmul:
- call printnumber ; F multiplier
-
- ; Calculate F-stops from 5.6
-
- fld1
- fxch st1
- fyl2x
-
- sub ebp, ebp
- call printnumber
-
- mov al, 0Ah
- call putchar
- jmp .bigloop
-
-.work0:
- mov al, '0'
- call putchar
-
-align 4
-.toobig:
- call huh
- jmp .bigloop
-
-align 4
-done:
- call write ; flush output buffer
-
- ; close files
- push dword [fd.in]
- sys.close
-
- push dword [fd.out]
- sys.close
-
- finit
-
- ; return success
- push dword 0
- sys.exit
-
-align 4
-skiptoeol:
- ; Keep reading until you come to cr, lf, or eof
- call getchar
- jc done
- cmp al, 0Ah
- jne .cr
- ret
-
-.cr:
- cmp al, 0Dh
- jne skiptoeol
- ret
-
-align 4
-getchar:
- or ebx, ebx
- jne .fetch
-
- call read
-
-.fetch:
- lodsb
- dec ebx
- clc
- ret
-
-read:
- jecxz .read
- call write
-
-.read:
- push dword BUFSIZE
- mov esi, ibuffer
- push esi
- push dword [fd.in]
- sys.read
- add esp, byte 12
- mov ebx, eax
- or eax, eax
- je .empty
- sub eax, eax
- ret
-
-align 4
-.empty:
- add esp, byte 4
- stc
- ret
-
-align 4
-putchar:
- stosb
- inc ecx
- cmp ecx, BUFSIZE
- je write
- ret
-
-align 4
-write:
- jecxz .ret ; nothing to write
- sub edi, ecx ; start of buffer
- push ecx
- push edi
- push dword [fd.out]
- sys.write
- add esp, byte 12
- sub eax, eax
- sub ecx, ecx ; buffer is empty now
-.ret:
- ret
-
-align 4
-bcdload:
- ; EBP contains the number of chars in dbuffer
- push ecx
- push esi
- push edi
-
- lea ecx, [ebp+1]
- lea esi, [dbuffer+ebp-1]
- shr ecx, 1
-
- std
-
- mov edi, bbuffer
- sub eax, eax
- mov [edi], eax
- mov [edi+4], eax
- mov [edi+2], ax
-
-.loop:
- lodsw
- sub ax, 3030h
- shl al, 4
- or al, ah
- mov [edi], al
- inc edi
- loop .loop
-
- fbld [bbuffer]
-
- cld
- pop edi
- pop esi
- pop ecx
- sub eax, eax
- ret
-
-align 4
-printnumber:
- push ebp
- mov al, [separ]
- call putchar
-
- ; Print the integer at the TOS
- mov ebp, bbuffer+9
- fbstp [bbuffer]
-
- ; Check the sign
- mov al, [ebp]
- dec ebp
- or al, al
- jns .leading
-
- ; We got a negative number (should never happen)
- mov al, '-'
- call putchar
-
-.leading:
- ; Skip leading zeros
- mov al, [ebp]
- dec ebp
- or al, al
- jne .first
- cmp ebp, bbuffer
- jae .leading
-
- ; We are here because the result was 0.
- ; Print '0' and return
- mov al, '0'
- jmp putchar
-
-.first:
- ; We have found the first non-zero.
- ; But it is still packed
- test al, 0F0h
- jz .second
- push eax
- shr al, 4
- add al, '0'
- call putchar
- pop eax
- and al, 0Fh
-
-.second:
- add al, '0'
- call putchar
-
-.next:
- cmp ebp, bbuffer
- jb .done
-
- mov al, [ebp]
- push eax
- shr al, 4
- add al, '0'
- call putchar
- pop eax
- and al, 0Fh
- add al, '0'
- call putchar
-
- dec ebp
- jmp short .next
-
-.done:
- pop ebp
- or ebp, ebp
- je .ret
-
-.zeros:
- mov al, '0'
- call putchar
- dec ebp
- jne .zeros
-
-.ret:
- ret
-</programlisting>
-<para>
-The code follows the same format as all the other
-filters we have seen before, with one subtle
-exception:
-</para>
-
-<blockquote>
-<para>
-We are no longer assuming that the end of input
-implies the end of things to do, something we
-took for granted in the <emphasis>character&ndash;oriented</emphasis>
-filters.
-</para>
-
-<para>
-This filter does not process characters. It
-processes a <emphasis>language</emphasis>
-(albeit a very simple
-one, consisting only of numbers).
-</para>
-
-<para>
-When we have no more input, it can mean one
-of two things:</para>
-
-<itemizedlist><listitem>
-<para>
-We are done and can quit. This is the
-same as before.
-</para>
-</listitem>
-
-<listitem>
-<para>
-The last character we have read was a digit.
-We have stored it at the end of our
-<acronym>ASCII</acronym>&ndash;to&ndash;float conversion
-buffer. We now need to convert
-the contents of that buffer into a
-number and write the last line of our
-output.
-</para>
-</listitem>
-
-</itemizedlist>
-<para>
-For that reason, we have modified our <function>getchar</function>
-and our <function>read</function> routines to return with
-the <varname role="register">carry flag</varname> <emphasis>clear</emphasis> whenever we are
-fetching another character from the input, or the
-<varname role="register">carry flag</varname> <emphasis>set</emphasis> whenever there is no more
-input.
-</para>
-
-<para>
-Of course, we are still using assembly language magic
-to do that! Take a good look at <function>getchar</function>.
-It <emphasis>always</emphasis> returns with the
-<varname role="register">carry flag</varname> <emphasis>clear</emphasis>.
-</para>
-
-<para>
-Yet, our main code relies on the <varname role="register">carry
-flag</varname> to tell it when to quit&mdash;and it works.
-</para>
-
-<para>
-The magic is in <function>read</function>. Whenever it
-receives more input from the system, it just
-returns to <function>getchar</function>, which
-fetches a character from the input buffer,
-<emphasis>clears</emphasis> the <varname role="register">carry flag</varname>
-and returns.
-</para>
-
-<para>
-But when <function>read</function> receives no more
-input from the system, it does <emphasis>not</emphasis>
-return to <function>getchar</function> at all.
-Instead, the <function role="opcode">add esp, byte 4</function>
-op code adds <constant>4</constant> to <varname role="register">ESP</varname>,
-<emphasis>sets</emphasis> the <varname role="register">carry
-flag</varname>, and returns.
-</para>
-
-<para>
-So, where does it return to? Whenever a
-program uses the <function role="opcode">call</function> op code,
-the microprocessor <function role="opcode">push</function>es the
-return address, i.e., it stores it on
-the top of the stack (not the <acronym>FPU</acronym>
-stack, the system stack, which is in the memory).
-When a program uses the <function role="opcode">ret</function>
-op code, the microprocessor <function role="opcode">pop</function>s
-the return value from the stack, and jumps
-to the address that was stored there.
-</para>
-
-<para>
-But since we added <constant>4</constant> to
-<varname role="register">ESP</varname> (which is the stack
-pointer register), we have effectively
-given the microprocessor a minor case
-of <emphasis>amnesia</emphasis>: It no longer
-remembers it was <function>getchar</function>
-that <function role="opcode">call</function>ed <function>read</function>.
-</para>
-
-<para>
-And since <function>getchar</function> never
-<function role="opcode">push</function>ed anything before
-<function role="opcode">call</function>ing <function>read</function>,
-the top of the stack now contains the
-return address to whatever or whoever
-<function role="opcode">call</function>ed <function>getchar</function>.
-As far as that caller is concerned,
-he <function role="opcode">call</function>ed <function>getchar</function>,
-which <function role="opcode">ret</function>urned with the
-<varname role="register">carry flag</varname> set!
-</para>
-
-</blockquote>
-<para>
-Other than that, the <function>bcdload</function>
-routine is caught up in the middle of a
-Lilliputian conflict between the Big&ndash;Endians
-and the Little&ndash;Endians.
-</para>
-
-<para>
-It is converting the text representation
-of a number into that number: The text
-is stored in the big&ndash;endian order, but
-the <emphasis>packed decimal</emphasis> is little&ndash;endian.
-</para>
-
-<para>
-To solve the conflict, we use the <function>std</function>
-op code early on. We cancel it with <function>cld</function>
-later on: It is quite important we do not
-<function>call</function> anything that may depend on
-the default setting of the <emphasis>direction
-flag</emphasis> while <function>std</function> is active.
-</para>
-
-<para>
-Everything else in this code should be quite
-clear, providing you have read the entire chapter
-that precedes it.
-</para>
-
-<para>
-It is a classical example of the adage that
-programming requires a lot of thought and only
-a little coding. Once we have thought through every
-tiny detail, the code almost writes itself.
-</para>
-
-</sect2>
-
-<sect2 id="x86-pinhole-using">
-<title>Using <application>pinhole</application></title>
-<para>
-Because we have decided to make the program
-<emphasis>ignore</emphasis> any input except for numbers
-(and even those inside a comment), we can
-actually perform <emphasis>textual queries</emphasis>.
-We do not <emphasis>have to</emphasis>, but we <emphasis>can</emphasis>.
-</para>
-
-<para>
-In my humble opinion, forming a textual query,
-instead of having to follow a very strict
-syntax, makes software much more user friendly.
-</para>
-
-<para>
-Suppose we want to build a pinhole camera to use the
-4x5 inch film. The standard focal
-length for that film is about 150mm. We want
-to <emphasis>fine&ndash;tune</emphasis> our focal length so the
-pinhole diameter is as round a number as possible.
-Let us also suppose we are quite comfortable with
-cameras but somewhat intimidated by computers.
-Rather than just have to type in a bunch of numbers,
-we want to <emphasis>ask</emphasis> a couple of questions.
-</para>
-
-<para>
-Our session might look like this:</para>
-
-<screen>&prompt.user; <userinput>pinhole
-
-Computer,
-
-What size pinhole do I need for the focal length of 150?</userinput>
-150 490 306 362 2930 12
-<userinput>Hmmm... How about 160?</userinput>
-160 506 316 362 3125 12
-<userinput>Let's make it 155, please.</userinput>
-155 498 311 362 3027 12
-<userinput>Ah, let's try 157...</userinput>
-157 501 313 362 3066 12
-<userinput>156?</userinput>
-156 500 312 362 3047 12
-<userinput>That's it! Perfect! Thank you very much!
-^D</userinput></screen>
-<para>
-We have found that while for the focal length
-of 150, our pinhole diameter should be 490
-microns, or 0.49 mm, if we go with the almost
-identical focal length of 156 mm, we can
-get away with a pinhole diameter of exactly
-one half of a millimeter.
-</para>
-
-</sect2>
-
-<sect2 id="x86-pinhole-scripting">
-<title>Scripting</title>
-<para>
-Because we have chosen the <constant>#</constant>
-character to denote the start of a comment,
-we can treat our <application>pinhole</application>
-software as a <emphasis>scripting language</emphasis>.
-</para>
-
-<para>
-You have probably seen <application>shell</application>
-<emphasis>scripts</emphasis> that start with:</para>
-
-<programlisting>
-#! /bin/sh
-</programlisting>
-<para>
-...or...</para>
-
-<programlisting>
-#!/bin/sh
-</programlisting> <para>
-...because the blank space after the <function>#!</function>
-is optional.
-</para>
-
-<para>
-Whenever Unix is asked to run an executable
-file which starts with the <function>#!</function>,
-it assumes the file is a script. It adds the
-command to the rest of the first line of the
-script, and tries to execute that.
-</para>
-
-<para>
-Suppose now that we have installed <application>pinhole</application>
-in <application>/usr/local/bin/</application>, we can now
-write a script to calculate various pinhole
-diameters suitable for various focal lengths
-commonly used with the 120 film.</para>
-
-<para>
-The script might look something like this:</para>
-
-<programlisting>
-#! /usr/local/bin/pinhole -b -i
-# Find the best pinhole diameter
-# for the 120 film
-
-### Standard
-80
-
-### Wide angle
-30, 40, 50, 60, 70
-
-### Telephoto
-100, 120, 140
-</programlisting>
-<para>
-Because 120 is a medium size film,
-we may name this file <application>medium</application>.
-</para>
-
-<para>
-We can set its permissions to execute,
-and run it as if it were a program:
-</para>
-
-<screen>&prompt.user; <userinput>chmod 755 medium</userinput>
-&prompt.user; <userinput>./medium</userinput></screen>
-<para>
-Unix will interpret that last command as:</para>
-
-<screen>&prompt.user; <userinput>/usr/local/bin/pinhole -b -i ./medium</userinput></screen>
-<para>
-It will run that command and display:
-</para>
-
-<screen>80 358 224 256 1562 11
-30 219 137 128 586 9
-40 253 158 181 781 10
-50 283 177 181 977 10
-60 310 194 181 1172 10
-70 335 209 181 1367 10
-100 400 250 256 1953 11
-120 438 274 256 2344 11
-140 473 296 256 2734 11</screen>
-<para>
-
-Now, let us enter:</para>
-
-<screen>&prompt.user; <userinput>./medium -c</userinput></screen>
-<para>
-Unix will treat that as:</para>
-
-<screen>&prompt.user; <userinput>/usr/local/bin/pinhole -b -i ./medium -c</userinput></screen>
-<para>
-That gives it two conflicting options:
-<parameter>-b</parameter> and <parameter>-c</parameter>
-(Use Bender's constant and use Connors'
-constant). We have programmed it so
-later options override early ones&mdash;our
-program will calculate everything
-using Connors' constant:
-</para>
-
-<screen>80 331 242 256 1826 11
-30 203 148 128 685 9
-40 234 171 181 913 10
-50 262 191 181 1141 10
-60 287 209 181 1370 10
-70 310 226 256 1598 11
-100 370 270 256 2283 11
-120 405 296 256 2739 11
-140 438 320 362 3196 12</screen>
-<para>
-We decide we want to go with Bender's
-constant after all. We want to save its
-values as a comma&ndash;separated file:
-</para>
-
-<screen>&prompt.user; <userinput>./medium -b -e &gt; bender</userinput>
-&prompt.user; <userinput>cat bender</userinput>
-focal length in millimeters,pinhole diameter in microns,F-number,normalized F-number,F-5.6 multiplier,stops from F-5.6
-80,358,224,256,1562,11
-30,219,137,128,586,9
-40,253,158,181,781,10
-50,283,177,181,977,10
-60,310,194,181,1172,10
-70,335,209,181,1367,10
-100,400,250,256,1953,11
-120,438,274,256,2344,11
-140,473,296,256,2734,11
-&prompt.user;</screen>
-</sect2>
-
-</sect1>
-
-<sect1 id="x86-caveats">
-<title>Caveats</title>
-
-<para>
-Assembly language programmers who "grew up" under
-<acronym>MS DOS</acronym> and Windows often tend to take shortcuts.
-Reading the keyboard scan codes and writing directly to video
-memory are two classical examples of practices which, under
-<acronym>MS DOS</acronym> are not frowned upon but considered the
-right thing to do.
-</para>
-
-<para>
-The reason? Both the <acronym>PC BIOS</acronym> and
-<acronym>MS DOS</acronym> are notoriously
-slow when performing these operations.
-</para>
-
-<para>
-You may be tempted to continue similar practices in the
-Unix environment. For example, I have seen a web site which
-explains how to access the keyboard scan codes on a popular Unix clone.
-</para>
-
-<para>
-That is generally a <emphasis>very bad idea</emphasis>
-in Unix environment! Let me explain why.
-</para>
-
-<sect2 id="x86-protected">
-<title>Unix Is Protected</title>
-
-<para>
-For one thing, it may simply not be possible. Unix runs in
-protected mode. Only the kernel and device drivers are allowed
-to access hardware directly. Perhaps a particular Unix clone
-will let you read the keyboard scan codes, but chances are a real
-Unix operating system will not. And even if one version may let you
-do it, the next one may not, so your carefully crafted software may
-become a dinosaur overnight.
-</para>
-
-</sect2>
-
-<sect2 id="x86-abstraction">
-<title>Unix Is an Abstraction</title>
-
-<para>
-But there is a much more important reason not to try
-accessing the hardware directly (unless, of course,
-you are writing a device driver), even on the Unix-like
-systems that let you do it:
-</para>
-
-<para>
-<emphasis>Unix is an abstraction!
-</emphasis></para>
-
-<para>
-There is a major difference in the philosophy of design
-between <acronym>MS DOS</acronym> and Unix.
-<acronym>MS DOS</acronym> was designed as a single-user
-system. It is run on a computer with a keyboard and a video
-screen attached directly to that computer. User input is almost
-guaranteed to come from that keyboard. Your program's output
-virtually always ends up on that screen.
-</para>
-
-<para>
-This is NEVER guaranteed under Unix. It is quite common
-for a Unix user to pipe and redirect program input and output:
-</para>
-
-<screen>&prompt.user; <userinput>program1 | program2 | program3 > file1</userinput></screen>
-
-<para>
-If you have written <application>program2</application>, your input
-does not come from the keyboard but from the output of
-<application>program1</application>. Similarly, your output does not
-go to the screen but becomes the input for
-<application>program3</application> whose output, in turn,
-goes to <filename>file1</filename>.
-</para>
-
-<para>
-But there is more! Even if you made sure that your input comes
-from, and your output goes to, the terminal, there is no guarantee
-the terminal is a PC: It may not have its video memory
-where you expect it, nor may its keyboard be producing
-<acronym>PC</acronym>-style scan codes. It may be a Macintosh,
-or any other computer.
-</para>
-
-<para>
-Now you may be shaking your head: My software is in
-<acronym>PC</acronym> assembly language, how can
-it run on a Macintosh? But I did not say your software
-would be running on a Macintosh, only that its terminal
-may be a Macintosh.
-</para>
-
-<para>
-Under Unix, the terminal does not have to be directly
-attached to the computer that runs your software, it can
-even be on another continent, or, for that matter, on another
-planet. It is perfectly possible that a Macintosh user in
-Australia connects to a Unix system in North America (or
-anywhere else) via <application>telnet</application>. The
-software then runs on one computer, while the terminal is
-on a different computer: If you try to read the scan codes,
-you will get the wrong input!
-</para>
-
-<para>
-Same holds true about any other hardware: A file you are reading
-may be on a disk you have no direct access to. A camera you are
-reading images from may be on a space shuttle, connected to you
-via satellites.
-</para>
-
-<para>
-That is why under Unix you must never make any assumptions about
-where your data is coming from and going to. Always let the
-system handle the physical access to the hardware.
-</para>
-
-<note>
-<para>
-These are caveats, not absolute rules. Exceptions are possible.
-For example, if a text editor has determined it is running
-on a local machine, it may want to read the scan codes
-directly for improved control. I am not mentioning these caveats
-to tell you what to do or what not to do, just to make you aware
-of certain pitfalls that await you if you have just arrived to Unix
-form <acronym>MS DOS</acronym>. Of course, creative people often break
-rules, and it is OK as long as they know they are breaking
-them and why.
-</para>
-</note>
-
-</sect2>
-
-</sect1>
-
-
-<sect1 id="x86-acknowledgements">
-<title>Acknowledgements</title>
-
-<para>
-This tutorial would never have been possible without the
-help of many experienced FreeBSD programmers from the
-<ulink url="mailto:freebsd-hackers@FreeBSD.org">FreeBSD
-hackers</ulink> mailing list, many of whom have patiently
-answered my questions, and pointed me in the right direction
-in my attempts to explore the inner workings of Unix
-system programming in general and FreeBSD in particular.
-</para>
-
-<para>
-Thomas M. Sommers opened the door for me. His
-<ulink url="http://home.ptd.net/~tms2/hello.html">How
-do I write "Hello, world" in FreeBSD assembler?</ulink>
-web page was my first encounter with an example of
-assembly language programming under FreeBSD.
-</para>
-
-<para>
-Jake Burkholder has kept the door open by willingly
-answering all of my questions and supplying me with
-example assembly language source code.
-</para>
-
-<para>
-Copyright &copy; 2000-2001 G. Adam Stanislav. All rights reserved.
-</para>
-
-</sect1>
-
-
-</chapter>
diff --git a/en_US.ISO8859-1/books/faq/Makefile b/en_US.ISO8859-1/books/faq/Makefile
deleted file mode 100644
index 39b7d0cf2c..0000000000
--- a/en_US.ISO8859-1/books/faq/Makefile
+++ /dev/null
@@ -1,27 +0,0 @@
-#
-# $FreeBSD: doc/en_US.ISO_8859-1/books/faq/Makefile,v 1.6 1999/09/06 06:52:39 peter Exp $
-#
-# Build the FreeBSD FAQ
-#
-
-MAINTAINER=nik@FreeBSD.org
-
-DOC?= book
-
-FORMATS?= html-split html
-
-INSTALL_COMPRESSED?= gz
-INSTALL_ONLY_COMPRESSED?=
-
-JADEFLAGS+=-Vbiblio-xref-title
-#
-# SRCS lists the individual SGML files that make up the document. Changes
-# to any of these files will force a rebuild
-#
-
-# SGML content
-SRCS= book.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/books/faq/book.sgml b/en_US.ISO8859-1/books/faq/book.sgml
deleted file mode 100644
index 2f9601fa13..0000000000
--- a/en_US.ISO8859-1/books/faq/book.sgml
+++ /dev/null
@@ -1,12517 +0,0 @@
-<!DOCTYPE BOOK PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man;
-<!ENTITY % freebsd PUBLIC "-//FreeBSD//ENTITIES DocBook Miscellaneous FreeBSD Entities//EN">
-%freebsd;
-<!ENTITY % authors PUBLIC "-//FreeBSD//ENTITIES DocBook Author Entities//EN">
-%authors;
-
-<!ENTITY % bookinfo PUBLIC "-//FreeBSD//ENTITIES DocBook BookInfo Entities//EN">
-%bookinfo;
-
-<!ENTITY % mailing-lists PUBLIC "-//FreeBSD//ENTITIES DocBook Mailing List Entities//EN">
-%mailing-lists;
-]>
-
-<book>
- <bookinfo>
- <title>Frequently Asked Questions for FreeBSD 2.X, 3.X and 4.X</title>
-
- <corpauthor>The FreeBSD Documentation Project</corpauthor>
-
- <pubdate>$FreeBSD: doc/en_US.ISO8859-1/books/faq/book.sgml,v 1.271 2001/10/03 20:29:11 ue Exp $</pubdate>
-
- <copyright>
- <year>1995</year>
- <year>1996</year>
- <year>1997</year>
- <year>1998</year>
- <year>1999</year>
- <year>2000</year>
- <year>2001</year>
- <holder>The FreeBSD Documentation Project</holder>
- </copyright>
-
- &bookinfo.legalnotice;
-
- <abstract>
- <para>This is the FAQ for FreeBSD versions 2.X, 3.X, and 4.X.
- All entries are assumed to be relevant to FreeBSD 2.0.5 and later,
- unless otherwise noted. Any entries with a &lt;XXX&gt; are under
- construction. If you are interested in helping with this project,
- send email to the &a.doc;. The latest version of this
- document is always available from the <ulink
- URL="http://www.FreeBSD.org/">FreeBSD World Wide Web
- server</ulink>. It may also be downloaded as one large <ulink
- URL="book.html">HTML</ulink> file with HTTP or as plain text,
- postscript, PDF, etc. from the <ulink
- URL="ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/">FreeBSD FTP
- server</ulink>. You may also want to <ulink
- URL="http://www.FreeBSD.org/search/search.html">Search the
- FAQ</ulink>.</para>
- </abstract>
- </bookinfo>
-
- <chapter id="introduction">
- <title>Introduction</title>
-
- <para>Welcome to the FreeBSD 2.X-4.X FAQ!</para>
-
- <para>As is usual with Usenet FAQs, this document aims to cover the
- most frequently asked questions concerning the FreeBSD operating
- system (and of course answer them!). Although originally intended
- to reduce bandwidth and avoid the same old questions being asked
- over and over again, FAQs have become recognized as valuable
- information resources.</para>
-
- <para>Every effort has been made to make this FAQ as informative as
- possible; if you have any suggestions as to how it may be improved,
- please feel free to mail them to the &a.faq;.</para>
-
- <qandaset>
- <qandaentry>
- <question id="what-is-FreeBSD">
- <para>What is FreeBSD?</para>
- </question>
-
- <answer>
- <para>Briefly, FreeBSD is a UN*X-like operating system for the
- i386 and Alpha/AXP platforms based on U.C. Berkeley's
- <quote>4.4BSD-Lite</quote> release, with some <quote>4.4BSD-Lite2</quote> enhancements.
- It is also based indirectly on William Jolitz's port of U.C.
- Berkeley's <quote>Net/2</quote> to the i386, known as <quote>386BSD</quote>, though very
- little of the 386BSD code remains. A fuller description of
- what FreeBSD is and how it can work for you may be found on
- the <ulink URL="http://www.FreeBSD.org/">FreeBSD home
- page</ulink>.</para>
-
- <para>FreeBSD is used by companies, Internet Service Providers,
- researchers, computer professionals, students and home users
- all over the world in their work, education and recreation.
- See some of them in the <ulink
- URL="http://www.FreeBSD.org/gallery/gallery.html">FreeBSD
- Gallery</ulink>.</para>
-
- <para>For more detailed information on FreeBSD, please see the
- <ulink URL="../handbook/index.html">FreeBSD
- Handbook</ulink>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="FreeBSD-goals">
- <para>What are the goals of FreeBSD?</para>
- </question>
-
- <answer>
- <para>The goals of the FreeBSD Project are to provide software
- that may be used for any purpose and without strings attached.
- Many of us have a significant investment in the code (and
- project) and would certainly not mind a little financial
- compensation now and then, but we are definitely not prepared
- to insist on it. We believe that our first and foremost
- <quote>mission</quote> is to provide code to any and all
- comers, and for whatever purpose, so that the code gets the
- widest possible use and provides the widest possible benefit.
- This is, we believe, one of the most fundamental goals of Free
- Software and one that we enthusiastically support.</para>
-
- <para>That code in our source tree which falls under the <ulink
- url="http://www.FreeBSD.org/copyright/COPYING">GNU General Public
- License (GPL)</ulink> or <ulink
- url="http://www.FreeBSD.org/copyright/COPYING.LIB">GNU Library
- General Public License (LGPL)</ulink> comes with slightly more
- strings attached, though at least on the side of enforced access
- rather than the usual opposite. Due to the additional complexities
- that can evolve in the commercial use of GPL software, we do,
- however, endeavor to replace such software with submissions under
- the more relaxed <ulink
- url="http://www.FreeBSD.org/copyright/freebsd-license.html">
- FreeBSD copyright</ulink> whenever possible.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="why-called-FreeBSD">
- <para>Why is it called FreeBSD?</para>
- </question>
-
- <answer>
- <itemizedlist>
- <listitem>
- <para>It may be used free of charge, even by commercial
- users.</para>
- </listitem>
-
- <listitem>
- <para>Full source for the operating system is freely
- available, and the minimum possible restrictions have
- been placed upon its use, distribution and incorporation
- into other work (commercial or non-commercial).</para>
- </listitem>
-
- <listitem>
- <para>Anyone who has an improvement and/or bug fix is free
- to submit their code and have it added to the source tree
- (subject to one or two obvious provisions).</para>
- </listitem>
- </itemizedlist>
-
- <para>For those of our readers whose first language is not
- English, it may be worth pointing out that the word
- <quote>free</quote> is being used in two ways here, one meaning
- <quote>at no cost</quote>, the other meaning <quote>you can do
- whatever you like</quote>. Apart from one or two things you
- <emphasis>cannot</emphasis> do with the FreeBSD code, for
- example pretending you wrote it, you really can do whatever you
- like with it.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="latest-version">
- <para>What is the latest version of FreeBSD?</para>
- </question>
-
- <answer>
- <para>Version <ulink
- URL="ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/&rel.current;-RELEASE/">&rel.current;</ulink>
- is the latest <emphasis>STABLE</emphasis> version; it was
- released in &rel.current.date;. This is also the latest
- <emphasis>RELEASE</emphasis> version.</para>
-
- <para>Briefly explained, <emphasis>-STABLE</emphasis> is aimed
- at the ISP or other corporate user who wants stability and a
- low change count over the wizzy new features of the latest
- <emphasis>-CURRENT</emphasis> snapshot. Releases can come
- from either branch, but you should only use
- <emphasis>-CURRENT</emphasis> if you are sure that you are
- prepared for its increased volatility (relative to
- <emphasis>-STABLE</emphasis>, that is).</para>
-
- <para>Releases are only made <link linkend="release-freq">every
- few months</link>. While many people stay more up-to-date with
- the FreeBSD sources (see the questions on <link
- linkend="current">FreeBSD-CURRENT</link> and <link
- linkend="stable">FreeBSD-STABLE</link>) than that, doing so
- is more of a commitment, as the sources are a moving
- target.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="current">
- <para>What is FreeBSD-CURRENT?</para>
- </question>
-
- <answer>
- <para><ulink
- URL="../handbook/cutting-edge.html#CURRENT">FreeBSD-CURRENT</ulink>
- is the development version of the operating system, which will
- in due course become 5.0-RELEASE. As such, it is really only
- of interest to developers working on the system and die-hard
- hobbyists. See the <ulink
- URL="../handbook/cutting-edge.html#CURRENT">relevant
- section</ulink> in the <ulink
- URL="../handbook/index.html">handbook</ulink> for details on
- running -CURRENT.</para>
-
- <para>If you are not familiar with the operating system or are
- not capable of identifying the difference between a real
- problem and a temporary problem, you should not use
- FreeBSD-CURRENT. This branch sometimes evolves quite quickly
- and can be un-buildable for a number of days at a time.
- People that use FreeBSD-CURRENT are expected to be able to
- analyze any problems and only report them if they are deemed
- to be mistakes rather than <quote>glitches</quote>. Questions
- such as <quote>make world produces some error about
- groups</quote> on the -CURRENT mailing list are sometimes
- treated with contempt.</para>
-
- <para>Every day, <ulink
- URL="http://www.FreeBSD.org/releases/snapshots.html">snapshot
- </ulink> releases are made based on the current state of the
- -CURRENT and -STABLE branches. Nowadays, distributions of the
- occasional snapshot are now being made available. The goals
- behind each snapshot release are:</para>
-
- <itemizedlist>
- <listitem>
- <para>To test the latest version of the installation
- software.</para>
- </listitem>
-
- <listitem>
- <para>To give people who would like to run -CURRENT or
- -STABLE but who do not have the time and/or bandwidth to
- follow it on a day-to-day basis an easy way of
- bootstrapping it onto their systems.</para>
- </listitem>
-
- <listitem>
- <para>To preserve a fixed reference point for the code in
- question, just in case we break something really badly
- later. (Although CVS normally prevents anything horrible
- like this happening :)</para>
- </listitem>
-
- <listitem>
- <para>To ensure that any new features in need of testing
- have the greatest possible number of potential
- testers.</para>
- </listitem>
- </itemizedlist>
-
- <para>No claims are made that any -CURRENT snapshot can be
- considered <quote>production quality</quote> for any purpose.
- If you want to run a stable and fully tested system, you will
- have to stick to full releases, or use the -STABLE
- snaphosts.</para>
-
- <para>Snapshot releases are directly available from <ulink
- URL="ftp://current.FreeBSD.org/pub/FreeBSD/">
- ftp://current.FreeBSD.org/pub/FreeBSD/</ulink> for 5.0-CURRENT
- and <ulink URL="ftp://releng4.FreeBSD.org/pub/FreeBSD">
- releng4.FreeBSD.org</ulink> for 4-STABLE snapshots.
- 3-STABLE snapshots are not being produced at the time of
- this writing (May 2000).</para>
-
- <para>Snapshots are generated, on the average, once a day for
- all actively developed branches.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="stable">
- <para>What is the FreeBSD-STABLE concept?</para>
- </question>
-
- <answer>
- <para>Back when FreeBSD 2.0.5 was released, we decided to
- branch FreeBSD development into two parts. One branch was
- named <ulink URL="../handbook/stable.html">-STABLE</ulink>,
- with the intention that only well-tested bug fixes and small
- incremental enhancements would be made to it (for Internet
- Service Providers and other commercial enterprises for whom
- sudden shifts or experimental features are quite
- undesirable). The other branch was <ulink
- URL="../handbook/cutting-edge.html#CURRENT">-CURRENT</ulink>,
- which essentially has been one unbroken line leading towards
- 5.0-RELEASE (and beyond) since 2.0 was released. If a little
- ASCII art would help, this is how it looks:</para>
-
- <programlisting> 2.0
- |
- |
- | [2.1-STABLE]
- *BRANCH* 2.0.5 -&gt; 2.1 -&gt; 2.1.5 -&gt; 2.1.6 -&gt; 2.1.7.1 [2.1-STABLE ends]
- | (Mar 1997)
- |
- |
- | [2.2-STABLE]
- *BRANCH* 2.2.1 -&gt; 2.2.2-RELEASE -&gt; 2.2.5 -&gt; 2.2.6 -&gt; 2.2.7 -&gt; 2.2.8 [end]
- | (Mar 1997) (Oct 97) (Apr 98) (Jul 98) (Dec 98)
- |
- |
- 3.0-SNAPs (started Q1 1997)
- |
- |
- 3.0-RELEASE (Oct 1998)
- |
- | [3.0-STABLE]
- *BRANCH* 3.1-RELEASE (Feb 1999) -&gt; 3.2 -&gt; 3.3 -&gt; 3.4 -&gt; 3.5 -&gt; 3.5.1
- | (May 1999) (Sep 1999) (Dec 1999) (June 2000) (July 2000)
- |
- | [4.0-STABLE]
- *BRANCH* 4.0 (Mar 2000) -&gt; 4.1 -&gt; 4.1.1 -&gt; 4.2 -&gt; 4.3 -&gt; 4.4 -&gt; ... future 4.x releases ...
- |
- | (July 2000) (Sep 2000) (Nov 2000)
- \|/
- +
- [5.0-CURRENT continues]</programlisting>
-
- <para>The 2.2-STABLE branch was retired with the release of 2.2.8.
- The 3-STABLE branch has ended with the release of 3.5.1, the
- final 3.X release. The only changes made to either of these
- branches will be, for the most part, security-related bug
- fixes.</para>
-
- <para>4-STABLE is the actively developed -STABLE branch. The
- latest release on the 4-STABLE is &rel.current;-RELEASE, which was released
- in &rel.current.date;.</para>
-
- <para>The 5-CURRENT branch is slowly progressing toward 5.0-RELEASE
- and beyond. See <link linkend="current">What is
- FreeBSD-CURRENT?</link> for more information on this branch.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="release-freq">
- <para>When are FreeBSD releases made?</para>
- </question>
-
- <answer>
- <para>As a general principle, the FreeBSD core team only release
- a new version of FreeBSD when they believe that there are
- sufficient new features and/or bug fixes to justify one, and
- are satisfied that the changes made have settled down
- sufficiently to avoid compromising the stability of the
- release. Many users regard this caution as one of the best
- things about FreeBSD, although it can be a little frustrating
- when waiting for all the latest goodies to become
- available...</para>
-
- <para>Releases are made about every 4 months on average.</para>
-
- <para>For people needing (or wanting) a little more excitement,
- binary snapshots are made every day... see above.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="responsible">
- <para>Who is responsible for FreeBSD?</para>
- </question>
-
- <answer>
- <para>The key decisions concerning the FreeBSD project, such as
- the overall direction of the project and who is allowed to add
- code to the source tree, are made by a <ulink
- URL="../handbook/staff.html#STAFF-CORE">core team</ulink> of
- 9 people. There is a much larger team of more than 200 <ulink
- URL="../handbook/staff-committers.html">committers</ulink> who
- are authorized to make changes directly to the FreeBSD source
- tree.</para>
-
- <para>However, most non-trivial changes are discussed in advance
- in the <link linkend="mailing">mailing lists</link>, and there
- are no restrictions on who may take part in the
- discussion.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="where-get">
- <para>Where can I get FreeBSD?</para>
- </question>
-
- <answer>
- <para>Every significant release of FreeBSD is available via
- anonymous FTP from the <ulink
- URL="ftp://ftp.FreeBSD.org/pub/FreeBSD/">
- FreeBSD FTP site</ulink>:</para>
-
- <itemizedlist>
- <listitem>
- <para>For the current 3.X-STABLE release, 3.5.1-RELEASE, see
- the <ulink
- URL="ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/3.5.1-RELEASE/">3.5.1-RELEASE directory</ulink>.</para>
- </listitem>
-
- <listitem>
- <para>The current 4-STABLE release, &rel.current;-RELEASE can be
- found in the <ulink
- URL="ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/&rel.current;-RELEASE/">&rel.current;-RELEASE directory</ulink>.</para>
- </listitem>
-
- <listitem>
- <para><ulink
- URL="ftp://releng4.FreeBSD.org/pub/FreeBSD/">4.X
- snapshots</ulink> are usually made once a day.</para>
- </listitem>
-
- <listitem>
- <para><ulink
- URL="ftp://current.FreeBSD.org/pub/FreeBSD/">
- 5.0 Snapshot</ulink> releases are made once a day for the
- <link linkend="current">-CURRENT</link> branch, these being
- of service purely to bleeding-edge testers and
- developers.</para>
- </listitem>
- </itemizedlist>
-
- <para>Information about obtaining FreeBSD on CD, DVD, and other
- media can be found in <ulink url="../handbook/mirrors.html">the
- Handbook</ulink>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="mailing">
- <para>Where do I find info on the FreeBSD mailing lists?</para>
- </question>
-
- <answer>
- <para>You can find full information in the <ulink
- URL="../handbook/eresources.html#ERESOURCES-MAIL">Handbook
- entry on mailing-lists</ulink>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="y2k">
- <para>Where do I find the FreeBSD Y2K info?</para>
- </question>
-
- <answer>
- <para>You can find full information in the <ulink
- URL="http://www.FreeBSD.org/y2kbug.html">FreeBSD Y2K
- page</ulink>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="newsgroups">
- <para>What FreeBSD news groups are available?</para>
- </question>
-
- <answer>
- <para>You can find full information in the <ulink
- URL="../handbook/eresources-news.html">Handbook entry on
- newsgroups</ulink>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="irc">
- <para>Are there FreeBSD IRC (Internet Relay Chat)
- channels?</para>
- </question>
-
- <answer>
- <para>Yes, most major IRC networks host a FreeBSD chat
- channel:</para>
-
- <itemizedlist>
- <listitem>
- <para>Channel <literal>#FreeBSD</literal> on
- <ulink URL="http://www.efnet.org/index.php">EFNet</ulink>
- is a FreeBSD forum, but do not go there for tech
- support or to try and get folks there to help you avoid
- the pain of reading man pages or doing your own research.
- It is a chat channel, first and foremost, and topics there
- are just as likely to involve sex, sports or nuclear
- weapons as they are FreeBSD. You Have Been Warned!
- Available at server <hostid>irc.chat.org</hostid>.</para>
- </listitem>
-
- <listitem>
- <para>Channel <literal>#FreeBSDhelp</literal> on
- <ulink URL="http://www.efnet.org/index.php">EFNet</ulink>
- is a channel dedicated to helping FreeBSD users. They
- are much more sympathetic to questions then
- <literal>#FreeBSD</literal> is.</para>
- </listitem>
-
- <listitem>
- <para>Channel <literal>#FreeBSD</literal> on
- <ulink URL="http://www.dal.net/">DALNET</ulink>
- is available at <hostid>irc.dal.net</hostid> in the
- US and <hostid>irc.eu.dal.net</hostid> in Europe.</para>
- </listitem>
-
- <listitem>
- <para>Channel <literal>#FreeBSD</literal> on
- <ulink URL="http://www.undernet.org/">UNDERNET</ulink>
- is available at <hostid>us.undernet.org</hostid>
- in the US and <hostid>eu.undernet.org</hostid> in Europe.
- Since it is a help channel, be prepared to read the
- documents you are referred to.</para>
- </listitem>
-
- <listitem>
- <para>Channel <literal>#FreeBSD</literal> on <ulink
- url="http://www.hybnet.net/">HybNet</ulink>. This channel
- <emphasis>is</emphasis> a help channel. A list of servers
- can be found on the <ulink
- url="http://www.hybnet.net/">HybNet web site</ulink>.</para>
- </listitem>
- </itemizedlist>
-
- <para>Each of these channels are distinct and are not connected
- to each other. Their chat styles also differ, so you may need
- to try each to find one suited to your chat style. As with
- <emphasis>all</emphasis> types of IRC traffic, if you are easily offended or cannot
- deal with lots of young people (and more than a few older
- ones) doing the verbal equivalent of jello wrestling, do not
- even bother with it.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="access-pr">
- <para>How do I access the Problem Report database?</para>
- </question>
-
- <answer>
- <para>The Problem Report database of all user change requests
- may be queried (or submitted to) by using our web-based PR
- <ulink
- URL="http://www.FreeBSD.org/send-pr.html">submission</ulink>
- and <ulink
- URL="http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query">
- query</ulink>
- interfaces. The &man.send-pr.1; command can
- also be used to submit problem reports and change requests via
- electronic mail.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="doc-formats">
- <para>Is the documentation available in other formats, such as plain
- text (ASCII), or Postscript?</para>
- </question>
-
- <answer>
- <para>Yes. The documentation is available in a number of different
- formats and compression schemes on the FreeBSD FTP site, in the
- <ulink
- URL="ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/">/pub/FreeBSD/doc/</ulink> directory.</para>
-
- <para>The documentation is categorised in a number of different
- ways. These include:</para>
-
- <itemizedlist>
- <listitem>
- <para>The document's name, such as <literal>faq</literal>, or
- <literal>handbook</literal>.</para>
- </listitem>
-
- <listitem>
- <para>The document's language and encoding. These are based on
- the locale names you will find under
- <filename>/usr/share/locale</filename> on your FreeBSD
- system. The current languages and encodings that we have for
- documentation are as follows:</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <thead>
- <row>
- <entry>Name</entry>
-
- <entry>Meaning</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry><literal>en_US.ISO8859-1</literal></entry>
-
- <entry>US English</entry>
- </row>
-
- <row>
- <entry><literal>de_DE.ISO8859-1</literal></entry>
-
- <entry>German</entry>
- </row>
-
- <row>
- <entry><literal>es_ES.ISO8859-1</literal></entry>
-
- <entry>Spanish</entry>
- </row>
-
- <row>
- <entry><literal>fr_FR.ISO8859-1</literal></entry>
-
- <entry>French</entry>
- </row>
-
- <row>
- <entry><literal>ja_JP.eucJP</literal></entry>
-
- <entry>Japanese (EUC encoding)</entry>
- </row>
-
- <row>
- <entry><literal>ru_RU.KOI8-R</literal></entry>
-
- <entry>Russian (KOI8-R encoding)</entry>
- </row>
-
- <row>
- <entry><literal>zh_TW.Big5</literal></entry>
-
- <entry>Chinese (Big5 encoding)</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <note>
- <para>Some documents may not be available in all
- languages.</para>
- </note>
- </listitem>
-
- <listitem>
- <para>The document's format. We produce the documentation in a
- number of different output formats to try and make it as
- flexible as possible. The current formats are;</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <thead>
- <row>
- <entry>Format</entry>
-
- <entry>Meaning</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry><literal>html-split</literal></entry>
-
- <entry>A collection of small, linked, HTML
- files.</entry>
- </row>
-
- <row>
- <entry><literal>html</literal></entry>
-
- <entry>One large HTML file containing the entire
- document</entry>
- </row>
-
- <row>
- <entry><literal>pdb</literal></entry>
-
- <entry>Palm Pilot database format, for use with the
- <ulink URL="http://www.iSilo.com/">iSilo</ulink>
- reader.</entry>
- </row>
-
- <row>
- <entry><literal>pdf</literal></entry>
-
- <entry>Adobe's Portable Document Format</entry>
- </row>
-
- <row>
- <entry><literal>ps</literal></entry>
-
- <entry>Postscript</entry>
- </row>
-
- <row>
- <entry><literal>rtf</literal></entry>
-
- <entry>Microsoft's Rich Text Format<footnote>
- <para>Page numbers are not automatically updated
- when loading this format in to Word. Press
- <keycombo action="simul"><keycap>CTRL</keycap><keycap>A</keycap></keycombo>,
- <keycombo action="simul"><keycap>CTRL</keycap><keycap>END</keycap></keycombo>,
- <keycap>F9</keycap> after loading the document, to
- update the page numbers.</para>
- </footnote>
- </entry>
- </row>
-
- <row>
- <entry><literal>txt</literal></entry>
-
- <entry>Plain text</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </listitem>
-
- <listitem>
- <para>The compression and packaging scheme. There are three of
- these currently in use.</para>
-
- <orderedlist>
- <listitem>
- <para>Where the format is <literal>html-split</literal>, the
- files are bundled up using &man.tar.1;. The resulting
- <filename>.tar</filename> file is then compressed using
- the compression schemes detailed in the next point.</para>
- </listitem>
-
- <listitem>
- <para>All the other formats generate one file, called
- <filename>book.<replaceable>format</replaceable></filename>
- (i.e., <filename>book.pdb</filename>,
- <filename>book.html</filename>, and so on).</para>
-
- <para>These files are then compressed using three
- compression schemes.</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <thead>
- <row>
- <entry>Scheme</entry>
-
- <entry>Description</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry><literal>zip</literal></entry>
-
- <entry>The Zip format. If you want to uncompress
- this on FreeBSD you will need to install the
- <filename>archivers/unzip</filename> port
- first.</entry>
- </row>
-
- <row>
- <entry><literal>gz</literal></entry>
-
- <entry>The GNU Zip format. Use &man.gunzip.1; to
- uncompress these files, which is part of
- FreeBSD.</entry>
- </row>
-
- <row>
- <entry><literal>bz2</literal></entry>
-
- <entry>The BZip2 format. Less widespread than the
- others, but generally gives smaller files.
- Install the <filename>archivers/bzip2</filename>
- port to uncompress these files.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <para>So the Postscript version of the Handbook, compressed
- using BZip2 will be stored in a file called
- <filename>book.ps.bz2</filename> in the
- <filename>handbook/</filename> directory.</para>
- </listitem>
-
- <listitem>
- <para>The formatted documentation is also available as a
- FreeBSD package, of which more later.</para>
- </listitem>
- </orderedlist>
- </listitem>
- </itemizedlist>
-
- <para>After choosing the format and compression mechanism that you
- want to download, you must then decide whether or not you want to
- download the document as a FreeBSD
- <emphasis>package</emphasis>.</para>
-
- <para>The advantage of downloading and installing the package is
- that the documentation can then be managed using the normal
- FreeBSD package management comments, such as &man.pkg.add.1; and
- &man.pkg.delete.1;.</para>
-
- <para>If you decide to download and install the package then you
- must know the filename to download. The documentation-as-packages
- files are stored in a directory called
- <filename>packages</filename>. Each package file looks like
- <filename><replaceable>document-name</replaceable>.<replaceable>lang</replaceable>.<replaceable>encoding</replaceable>.<replaceable>format</replaceable>.tgz</filename>.</para>
-
- <para>For example, the FAQ, in English, formatted as PDF, is in the
- package called
- <filename>faq.en_US.ISO8859-1.pdf.tgz</filename>.</para>
-
- <para>Knowing this, you can use the following command to install the
- English PDF FAQ package.</para>
-
- <screen>&prompt.root; <userinput>pkg_add ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/packages/faq.en_US.ISO8859-1.pdf.tgz</userinput></screen>
-
- <para>Having done that, you can use &man.pkg.info.1; to determine
- where the file has been installed.</para>
-
- <screen>&prompt.root; <userinput>pkg_info -f faq.en_US.ISO8859-1.pdf</userinput>
-Information for faq.en_US.ISO8859-1.pdf:
-
-Packing list:
- Package name: faq.en_US.ISO8859-1.pdf
- CWD to /usr/share/doc/en_US.ISO8859-1/books/faq
-File: book.pdf
- CWD to .
-File: +COMMENT (ignored)
-File: +DESC (ignored)</screen>
-
- <para>As you can see, <filename>book.pdf</filename> will have been
- installed in to
- <filename>/usr/share/doc/en_US.ISO8859-1/books/faq</filename>.
- </para>
-
- <para>If you do not want to use the packages then you will have to
- download the compressed files yourself, uncompress them, and then
- copy the appropriate documents in to place.</para>
-
- <para>For example, the split HTML version of the FAQ, compressed
- using &man.gzip.1;, can be found in the
- <filename>en_US.ISO8859-1/books/faq/book.html-split.tar.gz</filename>
- file. To download and uncompress that file you would have to do
- this.</para>
-
- <screen>&prompt.root; <userinput>fetch ftp://ftp.freebsd.org/pub/FreeBSD/doc/en_US.ISO8859-1/books/faq/book.html-split.tar.gz</userinput>
-&prompt.root; <userinput>gzip -d book.html-split.tar.gz</userinput>
-&prompt.root; <userinput>tar xvf book.html-split.tar</userinput></screen>
-
- <para>You will be left with a collection of
- <filename>.html</filename> files. The main one is called
- <filename>index.html</filename>, which will contain the table of
- contents, introductory material, and links to the other parts of
- the document. You can then copy or move these to their final
- location as necessary.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="become-web-mirror">
- <para>How do I become a FreeBSD Web mirror?</para>
- </question>
-
- <answer>
- <para>Certainly! There are multiple ways to mirror the Web
- pages.</para>
-
-
-
- <itemizedlist>
- <listitem>
- <para>Using <application>CVSup</application>:
- You can retrieve the formatted files
- using <application>CVSup</application>, and connecting to
- a <application>CVSup</application> server.</para>
-
- <para>To retrieve the webpages, please look at the example
- supfile, which can be found in
- <filename>/usr/share/examples/cvsup/www-supfile</filename>.
- </para>
-
- </listitem>
-
- <listitem>
- <para>Using FTP mirror: You can download the FTP server's
- copy of the web site sources using your favorite ftp mirror
- tool. Keep in mind that you have to build these sources before
- publishing them. Simply start at
- <ulink URL="ftp://ftp.FreeBSD.org/pub/FreeBSD/FreeBSD-current/www">ftp://ftp.FreeBSD.org/pub/FreeBSD/FreeBSD-current/www</ulink>.</para>
- </listitem>
- </itemizedlist>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="other-info-sources">
- <para>What other sources of information are there?</para>
- </question>
-
- <answer>
- <para>The following newsgroups contain pertinent discussion for
- FreeBSD users:</para>
-
-
-
- <itemizedlist>
- <listitem>
- <para><ulink
- URL="news:comp.unix.bsd.freebsd.announce">comp.unix.bsd.freebsd.announce</ulink>
- (moderated)</para>
- </listitem>
-
- <listitem>
- <para><ulink
- URL="news:comp.unix.bsd.freebsd.misc">comp.unix.bsd.freebsd.misc</ulink></para>
- </listitem>
-
- <listitem>
- <para><ulink
- URL="news:comp.unix.bsd.misc">comp.unix.bsd.misc</ulink></para>
- </listitem>
- </itemizedlist>
-
- <para>Web resources:</para>
-
-
-
- <itemizedlist>
- <listitem>
- <para>The <ulink
- URL="http://www.FreeBSD.org/">FreeBSD Home Page</ulink>.</para>
- </listitem>
-
- <listitem>
- <para><anchor id="pao">If you have a laptop, be sure and see
- <ulink URL="http://www.jp.FreeBSD.org/PAO/">Tatsumi
- Hosokawa's Mobile Computing page</ulink> in Japan.</para>
- </listitem>
-
- <listitem>
- <para><anchor id="smp">For information on SMP (Symmetric
- MultiProcessing), please see the <ulink
- URL="http://people.FreeBSD.org/~fsmp/SMP/SMP.html">SMP support page</ulink>.</para>
- </listitem>
-
- <listitem>
- <para><anchor id="multimedia">For information on FreeBSD
- multimedia applications, please see the <ulink
- URL="http://people.FreeBSD.org/~faulkner/multimedia/mm.html">multimedia</ulink>
- page. If you are interested specifically in the <ulink
- URL="http://people.FreeBSD.org/~ahasty/Bt848.html">Bt848</ulink>
- video capture chip, then follow that link.</para>
- </listitem>
- </itemizedlist>
-
- <para>The FreeBSD handbook also has a fairly complete <ulink
- URL="../handbook/bibliography.html">bibliography</ulink>
- section which is worth reading if you are looking for actual
- books to buy.</para>
- </answer>
- </qandaentry>
- </qandaset>
- </chapter>
-
- <chapter
- id="install">
- <chapterinfo>
- <author>
- <firstname>Nik</firstname>
- <surname>Clayton</surname>
- <affiliation>
- <address><email>nik@freebsd.org</email></address>
- </affiliation>
- </author>
- </chapterinfo>
-
- <title>Installation</title>
-
- <qandaset>
- <qandaentry>
- <question id="floppy-download">
- <para>Which file do I download to get FreeBSD?</para>
- </question>
-
- <answer>
- <para>Prior to release 3.1, you only needed one floppy image to
- install FreeBSD, namely <filename>floppies/boot.flp</filename>.
- However, since release 3.1 the Project has added base support
- for a wide variety of hardware which needed more space, and
- thus for 3.x and 4.x we now use two floppy images, namely
- <filename>floppies/kernel.flp</filename> and
- <filename>floppies/mfsroot.flp</filename>. These images need to
- be copied onto floppies by tools like
- <command>fdimage</command> or &man.dd.1;.</para>
-
- <para>If you need to download the distributions yourself (for a
- DOS filesystem install, for instance), below are some
- recommendations for distributions to grab:</para>
-
-
- <itemizedlist>
- <listitem>
- <para>bin/</para>
- </listitem>
-
- <listitem>
- <para>manpages/</para>
- </listitem>
-
- <listitem>
- <para>compat*/</para>
- </listitem>
-
- <listitem>
- <para>doc/</para>
- </listitem>
-
- <listitem>
- <para>src/ssys.*</para>
- </listitem>
- </itemizedlist>
-
-
- <para>Full instructions on this procedure and a little bit more
- about installation issues in general can be found in the
- <ulink URL="../handbook/install.html">Handbook entry on
- installing FreeBSD</ulink>.</para>
-
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="floppy-image-too-large">
- <para>What do I do if the floppy images does not fit on a single
- floppy?</para>
- </question>
-
- <answer>
- <para>A 3.5 inch (1.44MB) floppy can accomodate 1474560 bytes
- of data. The boot image is exactly 1474560 bytes in size.</para>
-
- <para>Common mistakes when preparing the boot floppy are:</para>
-
- <itemizedlist>
- <listitem>
- <para>Not downloading the floppy image in
- <emphasis>binary</emphasis> mode when using
- <acronym>FTP</acronym>.</para>
-
-
- <para>Some FTP clients default their transfer mode to
- <emphasis>ascii</emphasis> and attempt to change any
- end-of-line characters received to match the conventions
- used by the client's system. This will almost invariably
- corrupt the boot image. Check the size of the downloaded
- boot image: if it is not <emphasis>exactly</emphasis> that
- on the server, then the download process is suspect.</para>
-
- <para>To workaround: type <emphasis>binary</emphasis> at the
- FTP command prompt after getting connected to the server
- and before starting the download of the image.</para>
- </listitem>
-
- <listitem>
- <para>Using the DOS <command>copy</command> command (or
- equivalent GUI tool) to transfer the boot image to
- floppy.</para>
-
- <para>Programs like <command>copy</command> will not work as
- the boot image has been created to be booted into directly.
- The image has the complete content of the floppy, track for
- track, and is not meant to be placed on the floppy as a
- regular file. You have to transfer it to the floppy
- <quote>raw</quote>, using the low-level tools (e.g.
- <command>fdimage</command> or <command>rawrite</command>)
- described in the <ulink
- URL="../handbook/install.html">installation guide to
- FreeBSD</ulink>.</para>
- </listitem>
- </itemizedlist>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="install-instructions-location">
- <para>Where are the instructions for installing FreeBSD?</para>
- </question>
-
- <answer>
- <para>Installation instructions can be found in the
- <ulink URL="../handbook/install.html">Handbook entry on installing FreeBSD</ulink>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="need-to-run">
- <para>What do I need in order to run FreeBSD?</para>
- </question>
-
- <answer>
- <para>You will need a 386 or better PC, with 5 MB or more of RAM
- and at least 60 MB of hard disk space. It can run with a low
- end MDA graphics card but to run X11R6, a VGA or better video
- card is needed.</para>
-
- <para>See also the section on
- <xref linkend="hardware" remap="Hardware compatibility"></para>
-
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="four-meg-ram-install">
- <para>I have only 4 MB of RAM. Can I install FreeBSD?</para>
- </question>
-
- <answer>
- <para>FreeBSD 2.1.7 was the last version of FreeBSD that could
- be installed on a 4MB system. Newer versions of FreeBSD, like
- 2.2, need at least 5MB to install on a new system.</para>
-
- <para>All versions of FreeBSD, including 3.0, will
- <emphasis>run</emphasis> in 4MB of RAM, they just cannot run the
- installation program in 4MB. You can add extra memory for the
- install process, if you like, and then after the system is up
- and running, go back to 4MB. Or you could always just swap your
- disk into a system which has &gt;4MB, install onto it and then
- swap it back.</para>
-
- <para>There are also situations in which FreeBSD 2.1.7 will not
- install in 4 MB. To be exact: it does not install with 640 kB
- base + 3 MB extended memory. If your motherboard can remap some
- of the <quote>lost</quote> memory out of the 640kB to 1MB
- region, then you may still be able to get FreeBSD 2.1.7
- up.</para>
-
- <para>Try to go into your BIOS setup and look for a
- <quote>remap</quote> option. Enable it. You may also have to
- disable ROM shadowing.</para>
-
- <para>It may be easier to get 4 more MB just for the install.
- Build a custom kernel with only the options you need and then
- get the 4MB out again.</para>
-
- <para>You may also install 2.0.5 and then upgrade your system to
- 2.1.7 with the <quote>upgrade</quote> option of the 2.1.7
- installation program.</para>
-
- <para>After the installation, if you build a custom kernel, it
- will run in 4 MB. Someone has even succeeded in booting with 2
- MB (the system was almost unusable though :-))</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="custom-boot-floppy">
- <para>How can I make my own custom install floppy?</para>
- </question>
-
- <answer>
- <para>Currently there is no way to <emphasis>just</emphasis>
- make a custom install floppy. You have to cut a whole new
- release, which will include your install floppy.</para>
-
- <para>To make a custom release, follow the instructions
- <link linkend="custrel">here</link>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="multiboot">
- <para>Can I have more than one operating system on my PC?</para>
- </question>
-
- <answer>
- <para>Have a look at
- <ulink URL="http://www.FreeBSD.org/tutorials/multi-os/">
- The multi-OS page</ulink>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="windows-coexist">
- <para>Can Windows 95/98 co-exist with FreeBSD?</para>
- </question>
-
- <answer>
- <para>Install Windows 95/98 first, after that FreeBSD.
- FreeBSD's boot manager will then manage to boot Win95/98 and
- FreeBSD. If you install Windows 95/98 second, it will boorishly
- overwrite your boot manager without even asking. If that
- happens, see the next section.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="win95-damaged-boot-manager">
- <para>Windows 95/98 killed my boot manager!
- How do I get it back?</para>
- </question>
-
- <answer>
- <para>You can reinstall the boot manager FreeBSD comes with in
- one of three ways:</para>
-
- <itemizedlist>
- <listitem>
- <para>Running DOS, go into the tools/ directory of your
- FreeBSD distribution and look for
- <filename>bootinst.exe</filename>. You run it like
- so:</para>
-
- <screen><prompt>...\TOOLS&gt;</prompt> <userinput>bootinst.exe boot.bin</userinput></screen>
-
- <para>and the boot manager will be reinstalled.</para>
- </listitem>
-
- <listitem>
- <para>Boot the FreeBSD boot floppy again and go to the
- Custom installation menu item. Choose Partition. Select the
- drive which used to contain your boot manager (likely the
- first one) and when you come to the partition editor for
- it, as the very first thing (e.g. do not make any changes)
- select (W)rite. This will ask for confirmation, say yes,
- and when you get the Boot Manager selection prompt, be
- sure to select <quote>Boot Manager</quote>. This will
- re-write the boot manager to disk. Now quit out of the
- installation menu and reboot off the hard disk as
- normal.</para>
- </listitem>
-
- <listitem>
- <para>Boot the FreeBSD boot floppy (or CDROM) and choose the
- <quote>Fixit</quote> menu item. Select either the Fixit
- floppy or CDROM #2 (the <quote>live</quote> file system
- option) as appropriate and enter the fixit shell. Then
- execute the following command:</para>
-
- <screen><prompt>Fixit#</prompt> <userinput>fdisk -B -b /boot/boot0 <replaceable>bootdevice</replaceable></userinput></screen>
-
- <para>substituting <replaceable>bootdevice</replaceable> for
- your real
- boot device such as <devicename>ad0</devicename> (first IDE
- disk), <devicename>ad4</devicename> (first IDE disk on
- auxiliary controller), <devicename>da0</devicename> (first
- SCSI disk), etc.</para>
- </listitem>
- </itemizedlist>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="boot-on-thinkpad">
- <para>My A, T, or X series IBM Thinkpad locks up when I first
- booted up my FreeBSD installation. How can I solve this?</para>
- </question>
-
- <answer>
- <para>A bug in early revisions of IBM's BIOS on these machines
- mistakenly identifies the FreeBSD partition as a potential FAT
- suspend-to-disk partition. When the BIOS tries to parse the
- FreeBSD partition it hangs.</para>
-
- <para>According to IBM<footnote><para>In an e-mail from Keith
- Frechette
- <email>kfrechet@us.ibm.com</email>.</para></footnote>, the
- following model/BIOS release numbers incorporate the fix.</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <thead>
- <row>
- <entry>Model</entry>
- <entry>BIOS revision</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>T20</entry>
- <entry>IYET49WW or later</entry>
- </row>
-
- <row>
- <entry>T21</entry>
- <entry>KZET22WW or later</entry>
- </row>
-
- <row>
- <entry>A20p</entry>
- <entry>IVET62WW or later</entry>
- </row>
-
- <row>
- <entry>A20m</entry>
- <entry>IWET54WW or later</entry>
- </row>
-
- <row>
- <entry>A21p</entry>
- <entry>KYET27WW or later</entry>
- </row>
-
- <row>
- <entry>A21m</entry>
- <entry>KXET24WW or later</entry>
- </row>
-
- <row>
- <entry>A21e</entry>
- <entry>KUET30WW</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <para>It has been reported that later IBM BIOS revisions may have
- reintroduced the bug. <ulink
- url="http://www.FreeBSD.org/cgi/getmsg.cgi?fetch=200565+208320+/usr/local/www/db/text/2001/freebsd-mobile/20010429.freebsd-mobile">This message</ulink>
- from Jacques Vidrine to the &a.mobile; describes a procedure
- which may work if your newer IBM laptop does not boot FreeBSD
- properly, and you can upgrade or downgrade the BIOS..</para>
-
- <para>If you have an earlier BIOS, and upgrading is not an option a
- workaround is to install FreeBSD, change the partition ID FreeBSD
- uses, and install new boot blocks that can handle the different
- partition ID.</para>
-
- <para>First, you will need to restore the machine to a state where
- it can get through its self-test screen. Doing this requires
- powering up the machine without letting it find a FreeBSD
- partition on its primary disk. One way is to remove the hard disk
- and temporarily move it to an older ThinkPad (such as a ThinkPad
- 600) or a desktop PC with an appropriate conversion cable. Once
- it is there, you can delete the FreeBSD partition and move the hard
- disk back. The ThinkPad should now be in a bootable state
- again.</para>
-
- <para>With the machine functional again, you can use the workaround
- procedure described here to get a working FreeBSD
- installation.</para>
-
- <procedure>
- <step>
- <para>Download <filename>boot1</filename> and
- <filename>boot2</filename> from <ulink
- url="http://people.freebsd.org/~bmah/ThinkPad/">http://people.freebsd.org/~bmah/ThinkPad/</ulink>.
- Put these files somewhere you will be able to retrieve them
- later.</para>
- </step>
-
- <step>
- <para>Install FreeBSD as normal on to the ThinkPad.
- <emphasis>Do not</emphasis> use <literal>Dangerously
- Dedicated</literal> mode. <emphasis>Do not</emphasis>
- reboot when the install has finished.</para>
- </step>
-
- <step>
- <para>Either switch to the <quote>Emergency Holographic
- Shell</quote> (<keycombo action="simul"><keycap>ALT</keycap>
- <keycap>F4</keycap></keycombo>) or start a
- <quote>fixit</quote> shell.</para>
- </step>
-
- <step>
- <para>Use &man.fdisk.8; to change the FreeBSD partition ID from
- <literal>165</literal> to <literal>166</literal> (this is the
- type used by OpenBSD).</para>
- </step>
-
- <step>
- <para>Bring the <filename>boot1</filename> and
- <filename>boot2</filename> files to the local
- filesystem.</para>
- </step>
-
- <step>
- <para>Use &man.disklabel.8; to write <filename>boot1</filename>
- and <filename>boot2</filename> to your FreeBSD slice.</para>
-
- <screen>&prompt.root; <userinput>disklabel -B -b boot1 -s boot2 ad0s<replaceable>n</replaceable></userinput></screen>
-
- <para><replaceable>n</replaceable> is the number of the slice
- where you installed FreeBSD.</para>
- </step>
-
- <step>
- <para>Reboot. At the boot prompt you will be given the option
- of booting <literal>OpenBSD</literal>. This will actually
- boot FreeBSD.</para>
- </step>
- </procedure>
-
- <para>Getting this to work in the case where you want to dual boot
- OpenBSD and FreeBSD on the same laptop is left as an exercise for
- the reader.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="install-bad-blocks">
- <para>Can I install on a disk with bad blocks?</para>
- </question>
-
- <answer>
- <para>Prior to 3.0, FreeBSD included a utility known as
- <command>bad144</command>, which automatically remapped bad
- blocks. Because modern IDE drives perform this function
- themselves, <command>bad144</command> has been removed from the
- FreeBSD source tree. If you wish to install FreeBSD 3.0 or
- later, we strongly suggest you purchase a newer disk drive. If
- you do not wish to do this, you must run FreeBSD 2.x.</para>
- <para>If you are seeing bad block errors with a modern IDE
- drive, chances are the drive is going to die very soon (the
- drive's internal remapping functions are no longer sufficient
- to fix the bad blocks, which means the disk is heavily
- corrupted); we suggest you buy a new hard drive.</para>
-
- <para>If you have a SCSI drive with bad blocks, see
- <link linkend="awre">this answer</link>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="boot-floppy-strangeness">
- <para>Strange things happen when I boot the install floppy!
- What is happening?</para>
- </question>
-
- <answer>
- <para>If you are seeing things like the machine grinding to a halt
- or spontaneously rebooting when you try to boot the install
- floppy, here are three questions to ask yourself:-</para>
-
- <orderedlist>
- <listitem>
- <para>Did you use a new, freshly-formatted, error-free floppy
- (preferably a brand-new one straight out of the box, as
- opposed to the magazine coverdisk that has been lying under
- the bed for the last three years)?</para>
- </listitem>
-
- <listitem>
- <para>Did you download the floppy image in binary (or image)
- mode? (do not be embarrassed, even the best of us have
- accidentally downloaded a binary file in ASCII mode at
- least once!)</para>
- </listitem>
-
- <listitem>
- <para>If you are using Windows95 or Win98 did you run
- <command>fdimage</command> or <command>rawrite</command> in
- pure DOS mode? These OS's can interfere with programs that
- write directly to hardware, which the disk creation program
- does; even running it inside a DOS shell in the GUI can
- cause this problem.</para>
- </listitem>
- </orderedlist>
-
- <para>There have also been reports of Netscape causing problems
- when downloading the boot floppy, so it is probably best to use
- a different FTP client if you can.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="no-install-cdrom">
- <para>I booted from my ATAPI CDROM, but the install program says no
- CDROM is found. Where did it go?</para>
- </question>
-
- <answer>
- <para>The usual cause of this problem is a mis-configured CDROM
- drive. Many PCs now ship with the CDROM as the slave device on
- the secondary IDE controller, with no master device on that
- controller. This is illegal according to the ATAPI specification,
- but Windows plays fast and loose with the specification, and the
- BIOS ignores it when booting. This is why the BIOS was able to
- see the CDROM to boot from it, but why FreeBSD cannot see it to
- complete the install.</para>
-
- <para>Reconfigure your system so that the CDROM is either the
- master device on the IDE controller it is attached to, or make
- sure that it is the slave on an IDE controller that also has a
- master device.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="cannot-install-tape">
- <para>Why can I not install from tape?</para>
- </question>
-
- <answer>
- <para>If you are installing 2.1.7R from tape, you must create
- the tape using a tar blocksize of 10 (5120 bytes). The default
- tar blocksize is 20 (10240 bytes), and tapes created using this
- default size cannot be used to install 2.1.7R; with these
- tapes, you will get an error that complains about the record
- size being too big.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="install-PLIP">
- <para>Can I install on my laptop over PLIP (Parallel Line
- IP)?</para>
- </question>
-
- <answer>
- <para>Connect the two computers using a Laplink parallel cable
- to use this feature:</para>
-
- <table>
- <title>Wiring a parallel cable for networking</title>
-
- <tgroup cols="5">
- <thead>
- <row>
- <entry>A-name</entry>
-
- <entry>A-End</entry>
-
- <entry>B-End</entry>
-
- <entry>Descr.</entry>
-
- <entry>Post/Bit</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry><literallayout>DATA0
--ERROR</literallayout></entry>
-
- <entry><literallayout>2
-15</literallayout></entry>
-
- <entry><literallayout>15
-2</literallayout></entry>
-
- <entry>Data</entry>
-
- <entry><literallayout>0/0x01
-1/0x08</literallayout></entry>
- </row>
-
- <row>
- <entry><literallayout>DATA1
-+SLCT</literallayout></entry>
-
- <entry><literallayout>3
-13</literallayout></entry>
-
- <entry><literallayout>13
-3</literallayout></entry>
-
- <entry>Data</entry>
-
- <entry><literallayout>0/0x02
-1/0x10</literallayout></entry>
- </row>
-
- <row>
- <entry><literallayout>DATA2
-+PE</literallayout></entry>
-
- <entry><literallayout>4
-12</literallayout></entry>
-
- <entry><literallayout>12
-4</literallayout></entry>
-
- <entry>Data</entry>
-
- <entry><literallayout>0/0x04
-1/0x20</literallayout></entry>
- </row>
-
- <row>
- <entry><literallayout>DATA3
--ACK</literallayout></entry>
-
- <entry><literallayout>5
-10</literallayout></entry>
-
- <entry><literallayout>10
-5</literallayout></entry>
-
- <entry>Strobe</entry>
-
- <entry><literallayout>0/0x08
-1/0x40</literallayout></entry>
- </row>
-
- <row>
- <entry><literallayout>DATA4
-BUSY</literallayout></entry>
-
- <entry><literallayout>6
-11</literallayout></entry>
-
- <entry><literallayout>11
-6</literallayout></entry>
-
- <entry>Data</entry>
-
- <entry><literallayout>0/0x10
-1/0x80</literallayout></entry>
- </row>
-
- <row>
- <entry>GND</entry>
-
- <entry>18-25</entry>
-
- <entry>18-25</entry>
-
- <entry>GND</entry>
-
- <entry>-</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <para>See also <link linkend="pao">this note</link> on the
- Mobile Computing page.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="geometry">
- <para>Which geometry should I use for a disk drive?</para>
- </question>
-
- <answer>
- <note>
- <para>By the <quote>geometry</quote> of a disk, we mean the
- number of cylinders, heads and sectors/track on a disk - I will
- refer to this as C/H/S for convenience. This is how the PC's
- BIOS works out which area on a disk to read/write from.</para>
- </note>
-
- <para>This seems to cause a lot of confusion for some reason.
- First of all, the <emphasis>physical</emphasis> geometry of a
- SCSI drive is totally irrelevant, as FreeBSD works in term of
- disk blocks. In fact, there is no such thing as
- <quote>the</quote> physical geometry, as the sector
- density varies across the disk - what manufacturers claim is
- the <quote>physical geometry</quote> is usually the
- geometry that they have worked out results in the least wasted
- space. For IDE disks, FreeBSD does work in terms of C/H/S, but
- all modern drives will convert this into block references
- internally as well.</para>
-
- <para>All that matters is the <emphasis>logical</emphasis>
- geometry - the answer that the BIOS gets when it asks
- <quote>what is your geometry?</quote> and then uses to access
- the disk. As FreeBSD uses the BIOS when booting, it is very
- important to get this right. In particular, if you have more
- than one operating system on a disk, they must all agree on the
- geometry, otherwise you will have serious problems
- booting!</para>
-
- <para>For SCSI disks, the geometry to use depends on whether
- extended translation support is turned on in your controller
- (this is often referred to as <quote>support for DOS disks
- &gt;1GB</quote> or something similar). If it is turned off, then
- use <replaceable>N</replaceable> cylinders, 64 heads and 32
- sectors/track, where <replaceable>N</replaceable> is the
- capacity of the disk in MB. For example, a 2GB disk should
- pretend to have 2048 cylinders, 64 heads and 32
- sectors/track.</para>
-
- <para>If it <emphasis>is</emphasis> turned on (it is often supplied
- this way to get around certain limitations in MSDOS) and the
- disk capacity is more than 1GB, use M cylinders, 63 sectors per
- track (<emphasis>not</emphasis> 64), and 255 heads, where 'M' is the disk capacity
- in MB divided by 7.844238 (!). So our example 2GB drive would
- have 261 cylinders, 63 sectors per track and 255 heads.</para>
-
- <para>If you are not sure about this, or FreeBSD fails to detect
- the geometry correctly during installation, the simplest way
- around this is usually to create a small DOS partition on the
- disk. The correct geometry should then be detected (and you can
- always remove the DOS partition in the partition editor if you
- do not want to keep it, or leave it around for programming
- network cards and the like).</para>
-
- <para>Alternatively, there is a freely available utility
- distributed with FreeBSD called <filename>pfdisk.exe</filename>
- (located in the <filename>tools</filename> subdirectory on the
- FreeBSD CDROM or on the various FreeBSD FTP sites) which can be
- used to work out what geometry the other operating systems on
- the disk are using. You can then enter this geometry in the
- partition editor.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="disk-divide-restrictions">
- <para>Are there any restrictions on how I divide the disk up?</para>
- </question>
-
- <answer>
- <para>Yes. You must make sure that your root partition is below
- 1024
- cylinders so the BIOS can boot the kernel from it. (Note that
- this is a limitation in the PC's BIOS, not FreeBSD).</para>
-
- <para>For a SCSI drive, this will normally imply that the root
- partition will be in the first 1024MB (or in the first 4096MB
- if extended translation is turned on - see previous question).
- For IDE, the corresponding figure is 504MB.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="disk-manager">
- <para>Is FreeBSD compatible with any disk managers?</para>
- </question>
-
- <answer>
- <para>FreeBSD recognizes the Ontrack Disk Manager and makes
- allowances for it. Other disk managers are not supported.</para>
-
- <para>If you just want to use the disk with FreeBSD you do not
- need a disk manager. Just configure the disk for as much space
- as the BIOS can deal with (usually 504 megabytes), and FreeBSD
- should figure out how much space you really have. If you are
- using an old disk with an MFM controller, you may need to
- explicitly tell FreeBSD how many cylinders to use.</para>
-
- <para>If you want to use the disk with FreeBSD and another
- operating system, you may be able to do without a disk manager:
- just make sure the FreeBSD boot partition and the slice for
- the other operating system are in the first 1024 cylinders. If
- you are reasonably careful, a 20 megabyte boot partition should
- be plenty.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="missing-os">
- <para>When I boot FreeBSD I get <errorname>Missing Operating
- System</errorname>. What is happening?</para>
- </question>
-
- <answer>
- <para>This is classically a case of FreeBSD and DOS or some other
- OS conflicting over their ideas of disk <link
- linkend="geometry">geometry</link>. You will have to reinstall
- FreeBSD, but obeying the instructions given above will almost
- always get you going.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="stop-at-boot-manager">
- <para>Why can I not get past the boot manager's <prompt>F?</prompt>
- prompt?</para>
- </question>
-
- <answer>
- <para>This is another symptom of the problem described in the
- preceding question. Your BIOS geometry and FreeBSD geometry
- settings do not agree! If your controller or BIOS supports
- cylinder translation (often marked as <quote>&gt;1GB drive
- support</quote>), try toggling its setting and reinstalling
- FreeBSD.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="need-complete-sources">
- <para>Do I need to install the complete sources?</para>
- </question>
-
- <answer>
- <para>In general, no. However, we would strongly recommend that
- you install, at a minimum, the <literal>base</literal> source
- kit, which includes several of the files mentioned here, and
- the <literal>sys</literal> (kernel) source kit, which includes
- sources for the kernel. There is nothing in the system which
- requires the presence of the sources to operate, however,
- except for the kernel-configuration program &man.config.8;.
- With the exception of the kernel sources, our build structure
- is set up so that you can read-only mount the sources from
- elsewhere via NFS and still be able to make new binaries.
- (Because of the kernel-source restriction, we recommend that
- you not mount this on <filename>/usr/src</filename> directly,
- but rather in some other location with appropriate symbolic
- links to duplicate the top-level structure of the source
- tree.)</para>
-
- <para>Having the sources on-line and knowing how to build a
- system with them will make it much easier for you to upgrade
- to future releases of FreeBSD.</para>
-
- <para>To actually select a subset of the sources, use the Custom
- menu item when you are in the Distributions menu of the
- system installation tool.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="need-kernel">
- <para>Do I need to build a kernel?</para>
- </question>
-
- <answer>
- <para>Building a new kernel was originally pretty much a required
- step in a FreeBSD installation, but more recent releases have
- benefited from the introduction of a much friendlier kernel
- configuration tool. When at the FreeBSD boot prompt (boot:),
- use the <option>-c</option> flag and you will be dropped into a
- visual configuration screen which allows you to configure the
- kernel's settings for most common ISA cards.</para>
-
- <para>It is still recommended that you eventually build a new
- kernel containing just the drivers that you need, just to save a
- bit of RAM, but it is no longer a strict requirement for most
- systems.</para>
-
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="password-encryption">
- <para>Should I use DES passwords, or MD5, and how do I specify
- which form my users receive?</para>
- </question>
-
- <answer>
- <para>The default password format on FreeBSD is to use
- <emphasis>MD5</emphasis>-based passwords. These are believed to
- be more secure than the traditional Unix password format, which
- used a scheme based on the <emphasis>DES</emphasis> algorithm.
- DES passwords are still available if you need to share your
- password file with legacy operating systems which still use the
- less secure password format (they are available if you choose
- to install the <quote>crypto</quote> distribution in
- sysinstall, or by installing the crypto sources if building
- from source). Which password format to use for new passwords is
- controlled by the <quote>passwd_format</quote> login capability
- in <filename>/etc/login.conf</filename>, which takes values of
- either <quote>des</quote> (if available) or <quote>md5</quote>.
- See the &man.login.conf.5; manpage for more information about login
- capabilities.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="boot-floppy-hangs">
- <para>Why does the boot floppy start, but hang at the
- <literal>Probing Devices...</literal> screen?</para>
- </question>
-
- <answer>
-
- <para>If you have a IDE Zip or Jaz drive installed, remove it
- and try again. The boot floppy can get confused by the drives.
- After the system is installed you can reconnect the drive.
- Hopefully this will be fixed in a later release.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="panic-on-install-reboot">
- <para>Why do I get a <errorname>panic: can't mount root</errorname>
- error when rebooting the system after installation?</para>
- </question>
-
- <answer>
- <para>This error comes from confusion between the boot block's
- and the kernel's understanding of the disk devices. The error
- usually manifests on two-disk IDE systems, with the hard disks
- arranged as the master or single device on separate IDE
- controllers, with FreeBSD installed on the secondary IDE
- controller. The boot blocks think the system is installed on
- wd1 (the second BIOS disk) while the kernel assigns the first
- disk on the secondary controller device wd2. After the device
- probing, the kernel tries to mount what the boot blocks think
- is the boot disk, wd1, while it is really wd2, and
- fails.</para>
-
- <para>To fix the problem, do one of the following:</para>
-
- <orderedlist>
- <listitem>
- <para>For FreeBSD 3.3 and later, reboot the system and hit
- <literal>Enter</literal> at the <literal>Booting kernel
- in 10 seconds; hit [Enter] to interrupt</literal> prompt.
- This will drop you into the boot loader.</para>
-
- <para>Then type
- <literal>
- set root_disk_unit="<replaceable>disk_number</replaceable>"
- </literal>. <replaceable>disk_number</replaceable>
- will be <literal>0</literal> if FreeBSD is installed on
- the master drive on the first IDE controller,
- <literal>1</literal> if it is installed on the slave on
- the first IDE controller, <literal>2</literal> if it is
- installed on the master of the second IDE controller, and
- <literal>3</literal> if it is installed on the slave of
- the second IDE controller.</para>
-
- <para>Then type <literal>boot</literal>, and your system
- should boot correctly.</para>
-
- <para>To make this change permanent (ie so you do not have to
- do this every time you reboot or turn on your FreeBSD
- machine), put the line <literal>
- root_disk_unit="<replaceable>disk_number</replaceable>"</literal> in <filename>/boot/loader.conf.local
- </filename>.</para>
- </listitem>
-
- <listitem>
- <para>If using FreeBSD 3.2 or earlier, at the Boot: prompt,
- enter <literal>1:wd(2,a)kernel</literal> and press Enter.
- If the system starts, then run the command
- <command>echo "1:wd(2,a)kernel" &gt; /boot.config</command>
- to make it the default boot string.</para>
- </listitem>
-
- <listitem>
- <para>Move the FreeBSD disk onto the primary IDE controller,
- so the hard disks are consecutive.</para>
- </listitem>
-
- <listitem>
- <para><ulink URL="../handbook/kernelconfig.html">Rebuild
- your kernel,</ulink> modify the wd configuration lines to
- read:</para>
-
- <programlisting>controller wdc0 at isa? port "IO_WD1" bio irq 14 vector wdintr
-disk wd0 at wdc0 drive 0
-# disk wd1 at wdc0 drive 1 # comment out this line
-
-controller wdc1 at isa? port "IO_WD2" bio irq 15 vector wdintr
-disk wd1 at wdc1 drive 0 # change from wd2 to wd1
-disk wd2 at wdc1 drive 1 # change from wd3 to wd2</programlisting>
-
- <para>Install the new kernel. If you moved your disks and
- wish to restore the previous configuration, replace the
- disks in the desired configuration and reboot. Your
- system should boot successfully.</para>
- </listitem>
- </orderedlist>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="memory-limits">
- <para>What are the limits for memory?</para>
- </question>
-
- <answer>
- <para>For memory, the limit is 4 gigabytes. This configuration
- has been tested, see <ulink
- URL="ftp://ftp.cdrom.com/archive-info/configuration">wcarchive's
- configuration</ulink> for more details. If you plan to install
- this much memory into a machine, you need to be careful. You will
- probably want to use ECC memory and to reduce capacitive
- loading use 9 chip memory modules versus 18 chip memory
- modules.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ffs-limits">
- <para>What are the limits for ffs filesystems?</para>
- </question>
-
- <answer>
- <para>For ffs filesystems, the maximum theoretical limit is 8
- terabytes (2G blocks), or 16TB for the default block size of
- 8K. In practice, there is a soft limit of 1 terabyte, but with
- modifications filesystems with 4 terabytes are possible (and
- exist).</para>
-
- <para>The maximum size of a single ffs file is approximately 1G
- blocks (4TB) if the block size is 4K.</para>
-
- <table>
- <title>Maximum file sizes</title>
-
- <tgroup cols="5">
- <thead>
- <row>
- <entry>fs block size</entry>
-
- <entry>2.2.7-stable</entry>
-
- <entry>3.0-current</entry>
-
- <entry>works</entry>
-
- <entry>should work</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>4K</entry>
-
- <entry>4T-1</entry>
-
- <entry>4T-1</entry>
-
- <entry>4T-1</entry>
-
- <entry>&gt;4T</entry>
- </row>
-
- <row>
- <entry>8K</entry>
-
- <entry>&gt;32G</entry>
-
- <entry>8T-1</entry>
-
- <entry>&gt;32G</entry>
-
- <entry>32T-1</entry>
- </row>
-
- <row>
- <entry>16K</entry>
-
- <entry>&gt;128G</entry>
-
- <entry>16T-1</entry>
-
- <entry>&gt;128G</entry>
-
- <entry>32T-1</entry>
- </row>
-
- <row>
- <entry>32K</entry>
-
- <entry>&gt;512G</entry>
-
- <entry>32T-1</entry>
-
- <entry>&gt;512G</entry>
-
- <entry>64T-1</entry>
- </row>
-
- <row>
- <entry>64K</entry>
-
- <entry>&gt;2048G</entry>
-
- <entry>64T-1</entry>
-
- <entry>&gt;2048G</entry>
-
- <entry>128T-1</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <para>When the fs block size is 4K, triple indirect blocks work
- and everything should be limited by the maximum fs block number
- that can be represented using triple indirect blocks (approx.
- 1K^3 + 1K^2 + 1K), but everything is limited by a (wrong) limit
- of 1G-1 on fs block numbers. The limit on fs block numbers
- should be 2G-1. There are some bugs for fs block numbers near
- 2G-1, but such block numbers are unreachable when the fs block
- size is 4K.</para>
-
- <para>For block sizes of 8K and larger, everything should be
- limited by the 2G-1 limit on fs block numbers, but is actually
- limited by the 1G-1 limit on fs block numbers, except under
- -STABLE triple indirect blocks are unreachable, so the limit is
- the maximum fs block number that can be represented using
- double indirect blocks (approx. (blocksize/4)^2 +
- (blocksize/4)), and under -CURRENT exceeding this limit may
- cause problems. Using the correct limit of 2G-1 blocks does
- cause problems.</para>
-
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="tb-on-floppy">
- <para>How can I put 1TB files on my floppy?</para>
- </question>
-
- <answer>
- <para>I keep several virtual ones on floppies :-). The maximum
- file size is not closely related to the maximum disk size. The
- maximum disk size is 1TB. It is a feature that the file size
- can be larger than the disk size.</para>
-
- <para>The following example creates a file of size 8T-1 using a
- whole 32K of disk space (3 indirect blocks and 1 data block) on
- a small root partition. The dd command requires a dd that works
- with large files.</para>
-
- <screen>&prompt.user; <userinput>cat foo</userinput>
-df .
-dd if=/dev/zero of=z bs=1 seek=`echo 2^43 - 2 | bc` count=1
-ls -l z
-du z
-df .
-&prompt.user; <userinput>sh foo</userinput>
-Filesystem 1024-blocks Used Avail Capacity Mounted on
-/dev/da0a 64479 27702 31619 47% /
-1+0 records in
-1+0 records out
-1 bytes transferred in 0.000187 secs (5346 bytes/sec)
--rw-r--r-- 1 bde bin 8796093022207 Sep 7 16:04 z
-32 z
-Filesystem 1024-blocks Used Avail Capacity Mounted on
-/dev/da0a 64479 27734 31587 47% /</screen>
-
- <para>Bruce Evans, September 1998</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="archsw-readin-failed-error">
- <para>Why do I get an error message,
- <errorname>archsw.readin.failed</errorname> after compiling
- and booting a new kernel?</para>
- </question>
-
- <answer>
- <para>You can boot by specifying the kernel directly at the second
- stage, pressing any key when the | shows up before loader is
- started. More specifically, you have upgraded the source for
- your kernel, and installed a new kernel builtin from them
- <emphasis>without making world</emphasis>. This is not
- supported. Make world.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="upgrade-3x-4x">
- <para>How do I upgrade from 3.X -&gt; 4.X?</para>
- </question>
-
- <answer>
- <para>We <emphasis>strongly</emphasis> recommend that you use
- binary snapshots to do this. 4-STABLE snapshots are available at
- <ulink
- URL="ftp://releng4.FreeBSD.org/">releng4.FreeBSD.org</ulink>.</para>
-
- <para>If you wish to upgrade using source, please see the <ulink
- URL="http://www.FreeBSD.org/handbook/cutting-edge.html">FreeBSD
- Handbook</ulink> for more information.</para>
-
- <caution>
- <para>Upgrading via source is never recommended for new
- users, and upgrading from 3.X to 4.X is even less so; make sure
- you have read the instructions carefully before attempting to
- upgrade via source.</para>
- </caution>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="security-profiles">
- <para>What are these <quote>security profiles</quote>?</para>
- </question>
-
- <answer>
- <para>A <quote>security profile</quote> is a set of configuration
- options that attempts to achieve the desired ratio of security
- to convenience by enabling and disabling certain programs and
- other settings. The more severe the security profile, the
- fewer programs will be enabled by default. This is one of the
- basic principles of security: do not run anything except what
- you must.</para>
-
- <para>Please note that the security profile is just a default
- setting. All programs can be enabled and disabled after you
- have installed FreeBSD by editing or adding the appropriate
- line(s) to <filename>/etc/rc.conf</filename>. For more
- information, please see the &man.rc.conf.5; manual page.</para>
-
- <para>The following table describes what each of the security
- profiles does. The columns are the choices you have for a
- security profile, and the rows are the program or feature that
- the profile enables or disables.</para>
-
- <table>
- <title>Possible security profiles</title>
-
- <tgroup cols=3>
- <thead>
- <row>
- <entry></entry>
-
- <entry>Extreme</entry>
-
- <entry>Moderate</entry>
- </row>
- </thead>
-
- <tbody>
-
- <row>
- <entry>&man.sendmail.8;</entry>
-
- <entry>NO</entry>
-
- <entry>YES</entry>
- </row>
-
- <row>
- <entry>&man.sshd.8;</entry>
-
- <entry>NO</entry>
-
- <entry>YES</entry>
- </row>
-
- <row>
- <entry>&man.portmap.8;</entry>
-
- <entry>NO</entry>
-
- <entry>MAYBE
- <footnote>
- <para>The portmapper is enabled if the machine has
- been configured as an NFS client or server earlier
- in the installation.</para>
- </footnote>
- </entry>
- </row>
-
- <row>
- <entry>NFS server</entry>
-
- <entry>NO</entry>
-
- <entry>YES</entry>
- </row>
-
- <row>
- <entry>&man.securelevel.8;</entry>
-
- <entry>YES (2)
- <footnote>
- <para>If you choose a security profile that sets the
- securelevel (Extreme or High), you must be aware
- of the implications. Please read the &man.init.8;
- manual page and pay particular attention to the
- meanings of the security levels, or you may have
- significant trouble later!</para>
- </footnote>
- </entry>
-
- <entry>NO</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <warning>
- <para>The security profile is not a silver bullet! Even if you use the
- extreme setting, you need to keep up with security
- issues by reading an appropriate <ulink
- url="../handbook/eresources.html#ERESOURCES-MAIL">mailing
- list</ulink>, using good passwords and passphrases, and
- generally adhering to good security practices. It simply
- sets up the desired security to convenience ratio out of
- the box.</para>
- </warning>
-
- <note>
- <para>The security profile mechanism is meant to be used
- when you first install FreeBSD. If you already have
- FreeBSD installed, it would probably be more beneficial to
- simply enable or disable the desired functionality. If
- you really want to use a security profile, you can re-run
- &man.sysinstall.8; to set it.</para>
- </note>
- </answer>
- </qandaentry>
- </qandaset>
- </chapter>
-
- <chapter
- id="hardware">
- <title>Hardware compatibility</title>
-
- <qandaset>
- <qandaentry>
- <question id="architectures">
- <para>Does FreeBSD support architectures other than the
- x86?</para>
- </question>
-
- <answer>
-
- <para>Yes. FreeBSD currently runs on both Intel x86 and
- DEC (now Compaq) Alpha architectures. Interest has also
- been expressed in a port of FreeBSD to the SPARC architecture,
- join the <email>freebsd-sparc@FreeBSD.org</email> <link
- linkend="mailing"> mailing list</link> if you are interested
- in joining that project. Most recent additions to the list of
- upcoming platforms are IA-64 and PowerPC, join the
- <email>freebsd-ia64@FreeBSD.org</email> and/or
- <email>freebsd-ppc@FreeBSD.org</email> <link
- linkend="mailing">mailing lists</link> for more information.
- For general discussion on new architectures, join
- the <email>freebsd-platforms@FreeBSD.org</email>
- <link linkend="mailing">mailing list</link>.</para>
-
- <para>If your machine has a different architecture and you need
- something right now, we suggest you look at <ulink
- URL="http://www.netbsd.org/">NetBSD</ulink> or <ulink
- URL="http://www.openbsd.org/">OpenBSD</ulink>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="supported-hard-drives">
- <para>What kind of hard drives does FreeBSD support?</para>
- </question>
-
- <answer>
- <para>FreeBSD supports EIDE and SCSI drives (with a compatible
- controller; see the next section), and all drives using the
- original <quote>Western Digital</quote> interface (MFM, RLL,
- ESDI, and of course IDE). A few ESDI controllers that use
- proprietary interfaces may not work: stick to WD1002/3/6/7
- interfaces and clones.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="supported-scsi-controllers">
- <para>Which SCSI controllers are supported?</para>
- </question>
-
- <answer>
- <para>See the complete list in the <ulink
- URL="../handbook/install.html#INSTALL-HW">Handbook</ulink>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="supported-cdrom-drives">
- <para>Which CDROM drives are supported by FreeBSD?</para>
- </question>
-
- <answer>
- <para>Any SCSI drive connected to a supported controller is
- supported.</para>
-
- <para>The following proprietary CDROM interfaces are also
- supported:</para>
-
- <itemizedlist>
- <listitem>
- <para>Mitsumi LU002 (8bit), LU005 (16bit) and FX001D
- (16bit 2x Speed).</para>
- </listitem>
-
- <listitem>
- <para>Sony CDU 31/33A</para>
- </listitem>
-
- <listitem>
- <para>Sound Blaster Non-SCSI CDROM</para>
- </listitem>
-
- <listitem>
- <para>Matsushita/Panasonic CDROM</para>
- </listitem>
-
- <listitem>
- <para>ATAPI compatible IDE CDROMs</para>
- </listitem>
- </itemizedlist>
-
- <para>All non-SCSI cards are known to be extremely slow compared
- to SCSI drives, and some ATAPI CDROMs may not work.</para>
-
- <para>As of 2.2 the FreeBSD CDROM from the FreeBSD Mall supports
- booting directly from the CD.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="supported-cdrw-drives">
- <para>Which CD-RW drives are supported by FreeBSD?</para>
- </question>
-
- <answer>
- <para>FreeBSD supports any ATAPI-compatible IDE CD-R or CD-RW
- drive. For FreeBSD versions 4.0 and later, see the man page for
- &man.burncd.8;. For earlier FreeBSD versions, see the examples
- in <filename>/usr/share/examples/atapi</filename>.</para>
-
- <para>FreeBSD also supports any SCSI CD-R or CD-RW drives.
- Install and use the <command>cdrecord</command> command from the
- ports or packages system, and make sure that you have the
- <devicename>pass</devicename> device compiled in your
- kernel.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="zip-support">
- <para>Does FreeBSD support ZIP drives?</para>
- </question>
-
- <answer>
- <para>FreeBSD supports the SCSI ZIP drive out of the box, of
- course. The ZIP drive can only be set to run at SCSI target IDs
- 5 or 6, but if your SCSI host adapter's BIOS supports it you
- can even boot from it. It is not clear which host
- adapters support booting from targets other than 0 or 1,
- so you will have to consult your adapter's documentation
- if you would like to use this feature.</para>
-
- <para>ATAPI (IDE) Zip drives are supported in FreeBSD 2.2.6 and
- later releases.</para>
-
- <para>FreeBSD has contained support for Parallel Port Zip Drives
- since version 3.0. If you are using a sufficiently up to date
- version, then you should check that your kernel contains the
- <devicename>scbus0</devicename>, <devicename>da0</devicename>,
- <devicename>ppbus0</devicename>, and
- <devicename>vp0</devicename> drivers (the GENERIC kernel
- contains everything except <devicename>vp0</devicename>). With
- all these drivers present, the Parallel Port drive should be
- available as <devicename>/dev/da0s4</devicename>. Disks can be
- mounted using <command>mount /dev/da0s4 /mnt</command> OR (for
- dos disks) <command>mount_msdos /dev/da0s4 /mnt</command> as
- appropriate.</para>
-
- <para>Also check out <link linkend="jaz">this note on removable
- drives</link>, and <link linkend="disklabel">this note on
- <quote>formatting</quote></link>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="jaz-zip-removable-support">
- <para>Does FreeBSD support JAZ, EZ and other removable
- drives?</para>
- </question>
-
- <answer>
- <para>Apart from the IDE version of the EZ drive, these are all
- SCSI devices, so they should all look like SCSI disks to
- FreeBSD, and the IDE EZ should look like an IDE drive.</para>
-
- <para><anchor id="jaz">I am not sure how well FreeBSD supports
- changing the media out while running. You will of course need
- to dismount the drive before swapping media, and make sure that
- any external units are powered on when you boot the system so
- FreeBSD can see them.</para>
-
- <para>See <link linkend="disklabel">this note on
- <quote>formatting</quote></link>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="multiport-serial-support">
- <para>Which multi-port serial cards are supported by
- FreeBSD?</para>
- </question>
-
- <answer>
- <para>There is a list of these in the <ulink
- URL="../handbook/install-hw.html#INSTALL-MISC">Miscellaneous
- devices</ulink> section of the handbook.</para>
-
- <para>Some unnamed clone cards have also been known to work,
- especially those that claim to be AST compatible.</para>
-
- <para>Check the &man.sio.4;
- man page to get more information on configuring such cards.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="usbkbd">
- <para>Does FreeBSD support my USB keyboard?</para>
- </question>
-
- <answer>
- <para>USB device support was added to FreeBSD 3.1. However, it
- is still in preliminary state and may not always work as of
- version 3.2. If you want to experiment with the USB keyboard
- support, follow the procedure described below.</para>
-
- <procedure>
- <step>
- <para>Use FreeBSD 3.2 or later.</para>
- </step>
-
- <step>
- <para>Add the following lines to your kernel configuration
- file, and rebuild the kernel.</para>
-
- <programlisting>device uhci
-device ohci
-device usb
-device ukbd
-options KBD_INSTALL_CDEV</programlisting>
-
- <para>In versions of FreeBSD before 4.0, use this
- instead:</para>
-
- <programlisting>controller uhci0
-controller ohci0
-controller usb0
-controller ukbd0
-options KBD_INSTALL_CDEV</programlisting>
- </step>
-
- <step>
- <para>Go to the <filename>/dev</filename> directory and create
- device nodes as follows:</para>
-
- <screen>&prompt.root; <userinput>cd /dev</userinput>
-&prompt.root; <userinput>./MAKEDEV kbd0 kbd1</userinput></screen>
-
- </step>
-
- <step>
- <para>Edit <filename>/etc/rc.conf</filename> and add the
- following lines:</para>
-
- <programlisting>usbd_enable="YES"
-usbd_flags=""</programlisting>
-
- </step>
- </procedure>
-
- <para>After the system is rebooted, the AT keyboard becomes
- <devicename>/dev/kbd0</devicename> and the USB keyboard becomes
- <devicename>/dev/kbd1</devicename>, if both are connected to the
- system. If there is the USB keyboard only, it will be
- <devicename>/dev/ukbd0</devicename>.</para>
-
- <para>If you want to use the USB keyboard in the console, you
- have to explicitly tell the console driver to use the existing
- USB keyboard. This can be done by running the following
- command as a part of system initialization.</para>
-
- <screen>&prompt.root; <userinput>kbdcontrol -k /dev/kbd1 &lt; /dev/ttyv0 &gt; /dev/null</userinput></screen>
-
- <para>Note that if the USB keyboard is the only keyboard, it is
- accessed as <devicename>/dev/kbd0</devicename>, thus, the command
- should look like:</para>
-
- <screen>&prompt.root; <userinput>kbdcontrol -k /dev/kbd0 &lt; /dev/ttyv0 &gt; /dev/null</userinput></screen>
-
- <para><filename>/etc/rc.i386</filename> is a good place to add the
- above command.</para>
-
- <para>Once this is done, the USB keyboard should work in the X
- environment as well without any special settings.</para>
-
- <para>Hot-plugging and unplugging of the USB keyboard may not
- work quite right yet. It is a good idea to connect the keyboard
- before you start the system and leave it connected until the
- system is shutdown to avoid troubles.</para>
-
- <para>See the &man.ukbd.4; man page for more information.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="busmouse">
- <para>I have an unusual bus mouse. How do I set it up?</para>
- </question>
-
- <answer>
- <para>FreeBSD supports the bus mouse and the InPort bus mouse
- from such manufactures as Microsoft, Logitech and ATI. The bus
- device driver is compiled in the GENERIC kernel by default in
- FreeBSD versions 2.X, but not included in version 3.0 or later.
- If you are building a custom kernel with the bus mouse driver,
- make sure to add the following line to the kernel config
- file</para>
-
- <para>In FreeBSD 3.0 or before, add:</para>
-
- <programlisting>device mse0 at isa? port 0x23c tty irq5 vector mseintr</programlisting>
-
- <para>In FreeBSD 3.X, the line should be:</para>
-
- <programlisting>device mse0 at isa? port 0x23c tty irq5</programlisting>
-
- <para>And in FreeBSD 4.X and later, the line should read:</para>
-
- <programlisting>device mse0 at isa? port 0x23c irq5</programlisting>
-
- <para>Bus mice usually comes with dedicated interface cards.
- These cards may allow you to set the port address and the IRQ
- number other than shown above. Refer to the manual of your
- mouse and the &man.mse.4; man page for more information.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ps2mouse">
- <para>How do I use my PS/2 (<quote>mouse port</quote> or
- <quote>keyboard</quote>) mouse?</para>
- </question>
-
- <answer>
-
- <para>If you are running a post-2.2.5 version of FreeBSD, the
- necessary driver, <devicename>psm</devicename>, is included and
- enabled in the kernel. The kernel should detect your PS/2 mouse
- at boot time.</para>
-
- <para>If you are running a previous but relatively recent version
- of FreeBSD (2.1.x or better) then you can simply enable it in
- the kernel configuration menu at installation time, otherwise
- later with <option>-c</option> at the <command>boot:</command>
- prompt. It is disabled by default, so you will need to enable
- it explicitly.</para>
-
- <para>If you are running an older version of FreeBSD then you will
- have to add the following lines to your kernel configuration
- file and compile a new kernel.</para>
-
- <para>In FreeBSD 3.0 or earlier, the line should be:</para>
-
- <programlisting>device psm0 at isa? port "IO_KBD" conflicts tty irq 12 vector psmintr</programlisting>
-
- <para>In FreeBSD 3.1 or later, the line should be:</para>
-
- <programlisting>device psm0 at isa? tty irq 12</programlisting>
-
- <para>In FreeBSD 4.0 or later, the line should be:</para>
-
- <programlisting>device psm0 at atkbdc? irq 12</programlisting>
-
- <para>See the <ulink
- URL="../handbook/kernelconfig.html">Handbook entry on
- configuring the kernel</ulink> if you have no experience with
- building kernels.</para>
-
- <para>Once you have a kernel detecting
- <devicename>psm0</devicename> correctly at boot time, make sure
- that an entry for <devicename>psm0</devicename> exists in
- <filename>/dev</filename>. You can do this by typing:</para>
-
- <screen>&prompt.root; <userinput>cd /dev; sh MAKEDEV psm0</userinput></screen>
-
- <para>when logged in as <username>root</username>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="moused">
- <para>Is it possible to make use of a mouse in any way outside
- the X Window system?</para>
- </question>
-
- <answer>
- <para>If you are using the default console driver, syscons, you
- can use a mouse pointer in text consoles to cut &amp; paste
- text. Run the mouse daemon, moused, and turn on the mouse
- pointer in the virtual console:</para>
-
- <screen>&prompt.root; <userinput>moused -p /dev/<replaceable>xxxx</replaceable> -t <replaceable>yyyy</replaceable></userinput>
-&prompt.root; <userinput>vidcontrol -m on</userinput></screen>
-
- <para>Where <replaceable>xxxx</replaceable> is the mouse device
- name and <replaceable>yyyy</replaceable> is a protocol type for
- the mouse. See the &man.moused.8; man page for supported
- protocol types.</para>
-
- <para>You may wish to run the mouse daemon automatically when the
- system starts. In version 2.2.1, set the following variables in
- <filename>/etc/sysconfig</filename>.</para>
-
- <programlisting>mousedtype="yyyy"
-mousedport="xxxx"
-mousedflags=""</programlisting>
-
- <para>In versions 2.2.2 to 3.0, set the following variables in
- <filename>/etc/rc.conf</filename>.</para>
-
- <programlisting>moused_type="yyyy"
-moused_port="xxxx"
-moused_flags=""</programlisting>
-
- <para>In 3.1 and later, assuming you have a PS/2 mouse, all you
- need to is add <literal>moused_enable="YES"</literal> to
- <filename>/etc/rc.conf</filename>.</para>
-
- <para>In addition, if you would like to be able to use the mouse
- daemon on all virtual terminals instead of just console at
- boot-time, add the following to
- <filename>/etc/rc.conf</filename>.</para>
-
- <programlisting>allscreens_flags="-m on"</programlisting>
-
- <para>Staring from FreeBSD 2.2.6, the mouse daemon is capable of
- determining the correct protocol type automatically unless the
- mouse is a relatively old serial mouse model. Specify
- <literal>auto</literal> the protocol to invoke automatic
- detection.</para>
-
- <para>When the mouse daemon is running, access to the mouse
- needs to be coordinated between the mouse daemon and other
- programs such as the X Window. Refer to <link
- linkend="x-and-moused">another section</link> on this
- issue.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="text-mode-cut-paste">
- <para>How do I cut and paste text with mouse in the text
- console?</para>
- </question>
-
- <answer>
- <para>Once you get the mouse daemon running (see
- <link linkend="moused">previous section</link>), hold down the
- button 1 (left button) and move the mouse to select a region of
- text. Then, press the button 2 (middle button) or the button 3
- (right button) to paste it at the text cursor.</para>
-
- <para>In versions 2.2.6 and later, pressing the button 2 will
- paste the text. Pressing the button 3 will
- <quote>extend</quote> the selected region of text. If your
- mouse does not have the middle button, you may wish to emulate
- it or remap buttons using moused options. See the
- &man.moused.8; man page for details.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="usbmouse">
- <para>Does FreeBSD support any USB mice?</para>
- </question>
-
- <answer>
- <para>USB device support was added to FreeBSD 3.1. However, it
- is still in a preliminary state and may not always work as of
- version 3.2. If you want to experiment with the USB mouse
- support, follow the procedure described below.</para>
-
- <procedure>
- <step>
- <para>Use FreeBSD 3.2 or later.</para>
- </step>
-
- <step>
- <para>Add the following lines to your kernel configuration
- file, and rebuild the kernel.</para>
-
- <programlisting>device uhci
-device ohci
-device usb
-device ums</programlisting>
-
- <para>In versions of FreeBSD before 4.0, use this
- instead:</para>
-
- <programlisting>controller uhci0
-controller ohci0
-controller usb0
-device ums0</programlisting>
- </step>
-
- <step>
- <para>Go to the <filename>/dev</filename> directory and
- create a device node as follows:</para>
-
- <screen>&prompt.root; <userinput>cd /dev</userinput>
-&prompt.root; <userinput>./MAKEDEV ums0</userinput></screen>
- </step>
-
- <step>
- <para>Edit <filename>/etc/rc.conf</filename> and add the
- following lines:</para>
-
- <programlisting>moused_enable="YES"
-moused_type="auto"
-moused_port="/dev/ums0"
-moused_flags=""
-usbd_enable="YES"
-usbd_flags=""</programlisting>
-
- <para>See the <link linkend="moused">previous section</link>
- for more detailed discussion on moused.</para>
- </step>
-
- <step>
- <para>In order to use the USB mouse in the X session, edit
- <filename>XF86Config</filename>. If you are using XFree86
- 3.3.2 or later, be sure to have the following lines in the
- <emphasis>Pointer</emphasis> section:</para>
-
- <programlisting>Device "/dev/sysmouse"
-Protocol "Auto"</programlisting>
-
- <para>If you are using earlier versions of XFree86, be sure to
- have the following lines in the <emphasis>Pointer</emphasis>
- section:</para>
-
- <programlisting>Device "/dev/sysmouse"
-Protocol "SysMouse"</programlisting>
- </step>
- </procedure>
-
- <para>Refer to <link linkend="x-and-moused">another section</link>
- on the mouse support in the X environment.</para>
-
- <para>Hot-plugging and unplugging of the USB mouse may not work
- quite right yet. It is a good idea connect the mouse before you
- start the system and leave it connected until the system is
- shutdown to avoid trouble.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="mouse-wheel-buttons">
- <para>My mouse has a fancy wheel and buttons. Can I use them in
- FreeBSD?</para>
- </question>
-
- <answer>
- <para>The answer is, unfortunately, <quote>It depends</quote>.
- These mice with additional features require specialized driver
- in most cases. Unless the mouse device driver or the user
- program has specific support for the mouse, it will act just
- like a standard two, or three button mouse.</para>
-
- <para>For the possible usage of wheels in the X Window
- environment, refer to <link linkend="x-and-wheel">that
- section</link>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="psmerr">
- <para>Why does my wheel-equipped PS/2 mouse cause my mouse cursor
- to jump around the screen?</para>
- </question>
-
- <answer>
- <para>The PS/2 mouse driver psm in FreeBSD versions 3.2 or
- earlier has difficulty with some wheel mice, including Logitech
- model M-S48 and its OEM siblings. Apply the following patch to
- <filename>/sys/i386/isa/psm.c</filename> and rebuild the
- kernel.</para>
-
- <programlisting>Index: psm.c
-===================================================================
-RCS file: /src/CVS/src/sys/i386/isa/Attic/psm.c,v
-retrieving revision 1.60.2.1
-retrieving revision 1.60.2.2
-diff -u -r1.60.2.1 -r1.60.2.2
---- psm.c 1999/06/03 12:41:13 1.60.2.1
-+++ psm.c 1999/07/12 13:40:52 1.60.2.2
-@@ -959,14 +959,28 @@
- sc->mode.packetsize = vendortype[i].packetsize;
-
- /* set mouse parameters */
-+#if 0
-+ /*
-+ * A version of Logitech FirstMouse+ won't report wheel movement,
-+ * if SET_DEFAULTS is sent... Don't use this command.
-+ * This fix was found by Takashi Nishida.
-+ */
- i = send_aux_command(sc->kbdc, PSMC_SET_DEFAULTS);
- if (verbose >= 2)
- printf("psm%d: SET_DEFAULTS return code:%04x\n", unit, i);
-+#endif
- if (sc->config & PSM_CONFIG_RESOLUTION) {
- sc->mode.resolution
- = set_mouse_resolution(sc->kbdc,
-- (sc->config & PSM_CONFIG_RESOLUTION) - 1);
-+ (sc->config & PSM_CONFIG_RESOLUTION) - 1);
-+ } else if (sc->mode.resolution >= 0) {
-+ sc->mode.resolution
-+ = set_mouse_resolution(sc->kbdc, sc->dflt_mode.resolution);
-+ }
-+ if (sc->mode.rate > 0) {
-+ sc->mode.rate = set_mouse_sampling_rate(sc->kbdc, sc->dflt_mode.rate);
- }
-+ set_mouse_scaling(sc->kbdc, 1);
-
- /* request a data packet and extract sync. bits */
- if (get_mouse_status(sc->kbdc, stat, 1, 3) < 3) {</programlisting>
-
- <para>Versions later than 3.2 should be all right.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="laptop-mouse-trackball">
- <para>How do I use the mouse/trackball/touchpad on my
- laptop?</para>
- </question>
-
- <answer>
- <para>Please refer to <link linkend="ps2mouse">the answer to
- the previous question</link>. And check out
- <link linkend="pao">this note</link> on the Mobile Computing
- page.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="tape-support">
- <para>What types of tape drives are supported?</para>
- </question>
-
- <answer>
-
- <para>FreeBSD supports SCSI and QIC-36 (with a QIC-02 interface).
- This includes 8-mm (aka Exabyte) and DAT drives.</para>
-
- <para>Some of the early 8-mm drives are not quite compatible
- with SCSI-2, and may not work well with FreeBSD.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="tape-changer-support">
- <para>Does FreeBSD support tape changers?</para>
- </question>
-
- <answer>
- <para>FreeBSD 2.2 supports SCSI changers using the
- &man.ch.4;
- device and the
- &man.chio.1;
- command. The details of how you actually control the changer
- can be found in the
- &man.chio.1;
- man page.</para>
-
- <para>If you are not using <application>AMANDA</application>
- or some other product that already understands changers,
- remember that they only know how to move a tape from one
- point to another, so you need to keep track of which slot a
- tape is in, and which slot the tape currently in the drive
- needs to go back to.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="sound-card-support">
- <para>Which sound cards are supported by FreeBSD?</para>
- </question>
-
- <answer>
- <para>FreeBSD supports the SoundBlaster, SoundBlaster Pro,
- SoundBlaster 16, Pro Audio Spectrum 16, AdLib and Gravis
- UltraSound sound cards. There is also limited support for
- MPU-401 and compatible MIDI cards. Cards conforming to the
- Microsoft Sound System specification are also supported through
- the pcm driver.</para>
-
- <note>
- <para>This is only for sound! This driver does not support
- CDROMs, SCSI or joysticks on these cards, except for the
- SoundBlaster. The SoundBlaster SCSI interface and some
- non-SCSI CDROMS are supported, but you cannot boot off this
- device.</para>
- </note>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="es1370-silent-pcm">
- <para>Workarounds for no sound from es1370 with pcm driver?</para>
- </question>
-
- <answer>
- <para>You can run the following command every time the machine
- booted up:</para>
-
- <screen>&prompt.root; <userinput>mixer pcm 100 vol 100 cd 100</userinput></screen>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="network-cards">
- <para>Which network cards does FreeBSD support?</para>
- </question>
-
- <answer>
- <para>See the <ulink
- URL="../handbook/install-hw.html#INSTALL-NICS">
- Ethernet cards</ulink> section of the handbook for a more
- complete list.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="no-math-coprocessor">
- <para>I do not have a math co-processor - is that bad?</para>
- </question>
-
- <answer>
- <note>
- <para>This will only affect 386/486SX/486SLC owners - other
- machines will have one built into the CPU.</para>
- </note>
-
- <para>In general this will not cause any problems, but there are
- circumstances where you will take a hit, either in performance
- or accuracy of the math emulation code (see the section <link
- linkend="emul">on FP emulation</link>). In particular, drawing
- arcs in X will be VERY slow. It is highly recommended that you
- buy a math co-processor; it is well worth it.</para>
-
- <note>
- <para>Some math co-processors are better than others. It
- pains us to say it, but nobody ever got fired for buying
- Intel. Unless you are sure it works with FreeBSD, beware of
- clones.</para>
- </note>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="other-device-support">
- <para>What other devices does FreeBSD support?</para>
- </question>
-
- <answer>
- <para>See the <ulink
- URL="../handbook/install.html#INSTALL-MISC">Handbook</ulink>
- for the list of other devices supported.</para>
-
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="power-management-support">
- <para>Does FreeBSD support power management on my laptop?</para>
- </question>
-
- <answer>
- <para>FreeBSD supports <acronym>APM</acronym> on certain machines. Please look in
- the <filename>LINT</filename> kernel config file, searching for
- the
- <acronym>APM</acronym>
- keyword. Further information can be found in &man.apm.4;.</para>
-
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="micron-hang-boot">
- <para>Why does my Micron system hang at boot time?</para>
- </question>
-
- <answer>
- <para>Certain Micron motherboards have a non-conforming PCI BIOS
- implementation that causes grief when FreeBSD boots because PCI
- devices do not get configured at their reported addresses.</para>
-
- <para>Disable the <quote>Plug and Play Operating System</quote>
- flag in the BIOS to work around this problem. More information
- can be found at <ulink
- URL="http://cesdis.gsfc.nasa.gov/linux/drivers/vortex.html#micron">
- http://cesdis.gsfc.nasa.gov/linux/drivers/vortex.html#micron</ulink></para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="newer-adaptec-support">
- <para>Why does FreeBSD not recognize my Adaptec SCSI
- controller card?</para>
- </question>
-
- <answer>
- <para>The newer AIC789x series Adaptec chips are supported under
- the CAM SCSI framework which made it's debut in 3.0. Patches
- against 2.2-STABLE are in <ulink
- URL="ftp://ftp.FreeBSD.org/pub/FreeBSD/development/cam/">
- ftp://ftp.FreeBSD.org/pub/FreeBSD/development/cam/</ulink>.
- A CAM-enhanced boot floppy is available at <ulink
- URL="http://people.FreeBSD.org/~abial/cam-boot/">
- http://people.FreeBSD.org/~abial/cam-boot/</ulink>.
- In both cases read the README before beginning.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="internal-plugnplay-modem">
- <para>How come FreeBSD cannot find my internal Plug &amp; Play
- modem?</para>
- </question>
-
- <answer>
- <para>You will need to add the modem's PnP ID to the PnP ID
- list in the serial driver. To enable Plug &amp; Play support,
- compile a new kernel with <literal>controller pnp0</literal> in
- the configuration file, then reboot the system. The kernel will
- print the PnP IDs of all the devices it finds. Copy the PnP ID
- from the modem to the table in
- <filename>/sys/i386/isa/sio.c</filename>, at about line 2777.
- Look for the string <literal>SUP1310</literal> in the structure
- <literal>siopnp_ids[]</literal> to find the table. Build the
- kernel again, install, reboot, and your modem should be
- found.</para>
-
- <para>You may have to manually configure the PnP devices using
- the <literal>pnp</literal> command in the boot-time
- configuration with a command like</para>
-
- <programlisting>pnp 1 0 enable os irq0 3 drq0 0 port0 0x2f8</programlisting>
-
- <para>to make the modem show.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="serial-console-prompt">
- <para>How do I get the boot: prompt to show on the serial
- console?</para>
- </question>
-
- <answer>
- <orderedlist>
- <listitem>
- <para>Build a kernel with
- <literal>options COMCONSOLE</literal>.</para>
- </listitem>
-
- <listitem>
- <para>Create /boot.config and place <option>-P</option>
- as the only text in the file.</para>
- </listitem>
-
- <listitem>
- <para>Unplug the keyboard from the system.</para>
- </listitem>
- </orderedlist>
-
- <para>See
- <filename>/usr/src/sys/i386/boot/biosboot/README.serial</filename>
- for information.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="micron-3comnic-failure">
- <para>Why doesn't my 3Com PCI network card work with my Micron
- computer?</para>
- </question>
-
- <answer>
- <para>Certain Micron motherboards have a non-conforming PCI BIOS
- implementation that does not configure PCI devices at the
- addresses reported. This causes grief when FreeBSD
- boots.</para>
-
- <para>To work around this problem, disable the
- <quote>Plug and Play Operating System</quote> flag in the
- BIOS.</para>
-
- <para>More information on this problem is available at URL:
- <ulink URL="http://cesdis.gsfc.nasa.gov/linux/drivers/vortex.html#micron">http://cesdis.gsfc.nasa.gov/linux/drivers/vortex.html#micron</ulink></para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="smp-support">
- <para>Does FreeBSD support Symmetric Multiprocessing (SMP)?</para>
- </question>
-
- <answer>
- <para>SMP is supported in 3.0-STABLE and later releases only.
- SMP is not enabled in the <emphasis>GENERIC</emphasis> kernel,
- so you will have to recompile your kernel to enable SMP. Take a
- look at <filename>/sys/i386/conf/LINT</filename> to figure out
- what options to put in your kernel config file.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="asusk7v-boot-failure">
- <para>The boot floppy hangs on a system with an ASUS K7V
- motherboard. How do I fix this?</para>
- </question>
-
- <answer>
- <para>Go in to the BIOS setup and disable the <quote>boot virus
- protection</quote>.</para>
- </answer>
- </qandaentry>
- </qandaset>
- </chapter>
-
- <chapter id="troubleshoot">
- <title>Troubleshooting</title>
-
- <qandaset>
- <qandaentry>
- <question id="awre">
- <para>What do I do when I have bad blocks on my hard drive?</para>
- </question>
-
- <answer>
- <para>With SCSI drives, the drive should be capable of re-mapping
- these automatically. However, many drives are shipped with
- this feature disabled, for some mysterious reason...</para>
-
- <para>To enable this, you will need to edit the first device page
- mode, which can be done on FreeBSD by giving the command
- (as <username>root</username>)</para>
-
- <screen>&prompt.root; <userinput>scsi -f /dev/rsd0c -m 1 -e -P 3</userinput></screen>
-
- <para>and changing the values of AWRE and ARRE from 0 to 1:-</para>
-
- <programlisting>AWRE (Auto Write Reallocation Enbld): 1
-ARRE (Auto Read Reallocation Enbld): 1</programlisting>
-
- <para>The following paragraphs were submitted by Ted Mittelstaedt
- <email>tedm@toybox.placo.com</email>:</para>
-
- <para>For IDE drives, any bad block is usually a sign of
- potential trouble. All modern IDE drives come with internal
- bad-block remapping turned on. All IDE hard drive manufacturers
- today offer extensive warranties and will replace drives with
- bad blocks on them.</para>
-
- <para>If you still want to attempt to rescue an IDE drive with
- bad blocks, you can attempt to download the IDE drive
- manufacturer's IDE diagnostic program, and run this against the
- drive. Sometimes these programs can be set to force the drive
- electronics to rescan the drive for bad blocks and lock them
- out.</para>
-
- <para>For ESDI, RLL and MFM drives, bad blocks are a normal part
- of the drive and are no sign of trouble, generally. With a PC,
- the disk drive controller card and BIOS handle the task of
- locking out bad sectors. This is fine for operating systems
- like DOS that use BIOS code to access the disk. However,
- FreeBSD's disk driver does not go through BIOS, therefore a
- mechanism, bad144, exists that replaces this functionality.
- bad144 only works with the wd driver (which means it is not
- supported in FreeBSD 4.0), it is NOT able to be used with SCSI.
- bad144 works by entering all bad sectors found into a special
- file.</para>
-
- <para>One caveat with bad144 - the bad block special file is
- placed on the last track of the disk. As this file may possibly
- contain a listing for a bad sector that would occur near the
- beginning of the disk, where the /kernel file might be located,
- it therefore must be accessible to the bootstrap program that
- uses BIOS calls to read the kernel file. This means that the
- disk with bad144 used on it must not exceed 1024 cylinders, 16
- heads, and 63 sectors. This places an effective limit of 500MB
- on a disk that is mapped with bad144.</para>
-
- <para>To use bad144, simply set the <quote>Bad Block</quote>
- scanning to ON in the FreeBSD fdisk screen during the initial
- install. This works up through FreeBSD 2.2.7. The disk must
- have less than 1024 cylinders. It is generally recommended that
- the disk drive has been in operation for at least 4 hours prior
- to this to allow for thermal expansion and track
- wandering.</para>
-
- <para>If the disk has more than 1024 cylinders (such as a large
- ESDI drive) the ESDI controller uses a special translation mode
- to make it work under DOS. The wd driver understands about
- these translation modes, IF you enter the
- <quote>translated</quote> geometry with the <quote>set
- geometry</quote> command in fdisk. You must also NOT use the
- <quote>dangerously dedicated</quote> mode of creating the
- FreeBSD partition, as this ignores the geometry. Also, even
- though fdisk will use your overridden geometry, it still knows
- the true size of the disk, and will attempt to create a too
- large FreeBSD partition. If the disk geometry is changed to the
- translated geometry, the partition MUST be manually created
- with the number of blocks.</para>
-
- <para>A quick trick to use is to set up the large ESDI disk with
- the ESDI controller, boot it with a DOS disk and format it with
- a DOS partition. Then, boot the FreeBSD install and in the
- fdisk screen, read off and write down the blocksize and block
- numbers for the DOS partition. Then, reset the geometry to the
- same that DOS uses, delete the DOS partition, and create a
- <quote>cooperative</quote> FreeBSD partition using the
- blocksize you recorded earlier. Then, set the partition
- bootable and turn on bad block scanning. During the actual
- install, bad144 will run first, before any filesystems are
- created. (you can view this with an Alt-F2) If it has any
- trouble creating the badsector file, you have set too large a
- disk geometry - reboot the system and start all over again
- (including repartitioning and reformatting with DOS).</para>
-
- <para>If remapping is enabled and you are seeing bad blocks,
- consider replacing the drive. The bad blocks will only get
- worse as time goes on.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="bustek742a-eisa-scsi">
- <para>How come FreeBSD does not recognize my Bustek 742a EISA
- SCSI controller?</para>
- </question>
-
- <answer>
- <para>This info is specific to the 742a but may also cover
- other Buslogic cards. (Bustek = Buslogic)</para>
-
- <para>There are 2 general <quote>versions</quote> of the 742a
- card. They are hardware revisions A-G, and revisions H -
- onwards. The revision letter is located after the Assembly
- number on the edge of the card. The 742a has 2 ROM chips on it,
- one is the BIOS chip and the other is the Firmware chip.
- FreeBSD does not care what version of BIOS chip you have but it
- does care about what version of firmware chip. Buslogic will
- send upgrade ROMS out if you call their tech support dept. The
- BIOS and Firmware chips are shipped as a matched pair. You must
- have the most current Firmware ROM in your adapter card for
- your hardware revision.</para>
-
- <para>The REV A-G cards can only accept BIOS/Firmware sets up to
- 2.41/2.21. The REV H- up cards can accept the most current
- BIOS/Firmware sets of 4.70/3.37. The difference between the
- firmware sets is that the 3.37 firmware supports <quote>round
- robin</quote></para>
-
- <para>The Buslogic cards also have a serial number on them. If
- you have a old hardware revision card you can call the Buslogic
- RMA department and give them the serial number and attempt to
- exchange the card for a newer hardware revision. If the card is
- young enough they will do so.</para>
-
- <para>FreeBSD 2.1 only supports Firmware revisions 2.21 onward.
- If you have a Firmware revision older than this your card will
- not be recognized as a Buslogic card. It may be recognized as
- an Adaptec 1540, however. The early Buslogic firmware contains
- an AHA1540 <quote>emulation</quote> mode. This is not a good
- thing for an EISA card, however.</para>
-
- <para>If you have an old hardware revision card and you obtain
- the 2.21 firmware for it, you will need to check the position
- of jumper W1 to B-C, the default is A-B.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="hpnetserver-scsi-failure">
- <para>How come FreeBSD does not detect my HP Netserver's SCSI
- controller?</para>
- </question>
-
- <answer>
- <para>This is basically a known problem. The EISA on-board SCSI
- controller in the HP Netserver machines occupies EISA slot
- number 11, so all the <quote>true</quote> EISA slots are in
- front of it. Alas, the address space for EISA slots &gt;= 10
- collides with the address space assigned to PCI, and FreeBSD's
- auto-configuration currently cannot handle this situation very
- well.</para>
-
- <para>So now, the best you can do is to pretend there is no
- address range clash :), by bumping the kernel option
- <literal>EISA_SLOTS</literal> to a value of 12. Configure and
- compile a kernel, as described in the <ulink
- URL="../handbook/kernelconfig.html">Handbook entry on
- configuring the kernel</ulink>.</para>
-
- <para>Of course, this does present you with a chicken-and-egg
- problem when installing on such a machine. In order to work
- around this problem, a special hack is available inside
- <emphasis>UserConfig</emphasis>. Do not use the
- <quote>visual</quote> interface, but the plain command-line
- interface there. Simply type</para>
-
- <programlisting>eisa 12
-quit</programlisting>
-
- <para>at the prompt, and install your system as usual. While
- it is recommended you compile and install a custom kernel
- anyway.</para>
-
- <para>Hopefully, future versions will have a proper fix for
- this problem.</para>
-
- <note>
- <para>You cannot use a
- <literal>dangerously dedicated</literal> disk
- with an HP Netserver. See <link linkend="dedicate">this
- note</link> for more info.</para>
- </note>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="cmd640-ide">
- <para>What is going on with my CMD640 IDE controller?</para>
- </question>
-
- <answer>
- <para>It is broken. It cannot handle commands on both channels
- simultaneously.</para>
-
- <para>There's a workaround available now and it is enabled
- automatically if your system uses this chip. For the details
- refer to the manual page of the disk driver (man 4 wd).</para>
-
- <para>If you are already running FreeBSD 2.2.1 or 2.2.2 with a
- CMD640 IDE controller and you want to use the second channel,
- build a new kernel with <literal>options "CMD640"</literal>
- enabled. This is the default for 2.2.5 and later.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ed1-timeout">
- <para>I keep seeing messages like
- <errorname>ed1: timeout</errorname>. What do these messages
- mean?</para>
- </question>
-
- <answer>
- <para>This is usually caused by an interrupt conflict (e.g.,
- two boards using the same IRQ). FreeBSD prior to 2.0.5R used to
- be tolerant of this, and the network driver would still
- function in the presence of IRQ conflicts. However, with 2.0.5R
- and later, IRQ conflicts are no longer tolerated. Boot with the
- -c option and change the ed0/de0/... entry to match your
- board.</para>
-
- <para>If you are using the BNC connector on your network card,
- you may also see device timeouts because of bad termination. To
- check this, attach a terminator directly to the NIC (with no
- cable) and see if the error messages go away.</para>
-
- <para>Some NE2000 compatible cards will give this error if there
- is no link on the UTP port or if the cable is disconnected.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="mount-cd-superblock">
- <para>Why do I get <errorname>Incorrect super block</errorname> when
- mounting a CDROM?</para>
- </question>
-
- <answer>
- <para>You have to tell &man.mount.8;
- the type of the device that you want to mount. By default,
- &man.mount.8;
- will assume the filesystem is of type <literal>ufs</literal>.
- You want to mount a CDROM filesystem, and you do this by
- specifying the <option>-t cd9660</option> option to
- &man.mount.8;. This does, of course, assume that the
- CDROM contains an ISO 9660 filesystem, which is what most CDROMs
- have. As of 1.1R, FreeBSD automatically understands the Rock
- Ridge (long filename) extensions as well.</para>
-
- <para>As an example, if you want to mount the CDROM device,
- <devicename>/dev/cd0c</devicename>, under <filename>/mnt</filename>,
- you would execute:</para>
-
- <screen>&prompt.root; <userinput>mount -t cd9660 /dev/cd0c /mnt</userinput></screen>
-
- <para>Note that your device name (<devicename>/dev/cd0c</devicename>
- in this example) could be different, depending on the CDROM
- interface. Note that the <option>-t cd9660</option> option just
- causes the &man.mount.cd9660.8; command to be
- executed, and so the above example could be shortened
- to:</para>
-
- <screen>&prompt.root; <userinput>mount_cd9660 /dev/cd0c /mnt</userinput></screen>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="cdrom-not-configured">
- <para>Why do I get <errorname>Device not configured</errorname> when
- mounting a CDROM?</para>
- </question>
-
- <answer>
- <para>This generally means that there is no CDROM in the CDROM
- drive, or the drive is not visible on the bus. Feed the drive
- something, and/or check its master/slave status if it is IDE
- (ATAPI). It can take a couple of seconds for a CDROM drive to
- notice that it has been fed, so be patient.</para>
-
- <para>Sometimes a SCSI CDROM may be missed because it had not
- enough time to answer the bus reset. If you have a SCSI CDROM
- please try to add the following symbol into your kernel
- configuration file and recompile.</para>
-
- <programlisting>options "SCSI_DELAY=15"</programlisting>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="cdrom-unicode-filenames">
- <para>Why do all non-English characters in filenames show up as
- <quote>?</quote> on my CDs when mounted in FreeBSD?</para>
- </question>
-
- <answer>
- <para>Most likely your CDROM uses the <quote>Joliet</quote>
- extension for storing information about files and directories.
- This extension specifies that all filenames are stored using
- Unicode two-byte characters. Currently, efforts are under way
- to introduce a generic Unicode interface into the FreeBSD
- kernel, but since that is not ready yet, the CD9660 driver does
- not have the ability to decode the characters in the
- filenames.</para>
-
- <para>As a temporary solution, starting with FreeBSD 4.3, a
- special hook has been added into the CD9660 driver to allow the
- user to load an appropriate conversion table on the fly.
- Modules for some of the common encodings are available via the
- <filename>sysutils/cd9660_unicode</filename> port.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="printer-slow">
- <para>My printer is ridiculously slow. What can I do?</para>
- </question>
-
- <answer>
- <para>If it is parallel, and the only problem is that it is terribly
- slow, try setting your printer port into <quote>polled</quote>
- mode:</para>
-
- <screen>&prompt.root; <userinput>lptcontrol -p</userinput></screen>
-
- <para>Some newer HP printers are claimed not to work correctly in
- interrupt mode, apparently due to some (not yet exactly
- understood) timing problem.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="signal11">
- <para>Why do my programs occasionally die with
- <errorname>Signal 11</errorname> errors?</para>
- </question>
-
- <answer>
- <para>Signal 11 errors are caused when your process has attempted
- to access memory which the operating system has not granted it
- access to. If something like this is happening at seemingly
- random intervals then you need to start investigating things
- very carefully.</para>
-
- <para>These problems can usually be attributed to either:</para>
-
- <orderedlist>
- <listitem>
- <para>If the problem is occurring only in a specific
- application that you are developing yourself it is probably
- a bug in your code.</para>
- </listitem>
-
- <listitem>
- <para>If it is a problem with part of the base FreeBSD system,
- it may also be buggy code, but more often than not these
- problems are found and fixed long before us general FAQ
- readers get to use these bits of code (that is what -current
- is for).</para>
- </listitem>
- </orderedlist>
-
- <para>In particular, a dead giveaway that this is <emphasis>not</emphasis> a FreeBSD
- bug is if you see the problem when you are compiling a program,
- but the activity that the compiler is carrying out changes
- each time.</para>
-
- <para>For example, suppose you are running <quote>make
- buildworld</quote>, and the compile fails while trying to
- compile <filename>ls.c</filename> in to
- <filename>ls.o</filename>. If you then run <quote>make
- buildworld</quote> again, and the compile fails in the same
- place then this is a broken build -- try updating your sources
- and try again. If the compile fails elsewhere then this is
- almost certainly hardware.</para>
-
- <para>What you should do:</para>
-
- <para>In the first case you can use a debugger e.g. gdb to find
- the point in the program which is attempting to access a bogus
- address and then fix it.</para>
-
- <para>In the second case you need to verify that it is not your
- hardware at fault.</para>
-
- <para>Common causes of this include:</para>
-
- <orderedlist>
- <listitem>
- <para>Your hard disks might be overheating: Check the fans in
- your case are still working, as your disk (and perhaps
- other hardware might be overheating).</para>
- </listitem>
-
- <listitem>
- <para>The processor running is overheating: This might be
- because the processor has been overclocked, or the fan on
- the processor might have died. In either case you need to
- ensure that you have hardware running at what it is
- specified to run at, at least while trying to solve this
- problem. i.e. Clock it back to the default settings.</para>
-
- <para>If you are overclocking then note that it is far cheaper
- to have a slow system than a fried system that needs
- replacing! Also the wider community is not often
- sympathetic to problems on overclocked systems, whether you
- believe it is safe or not.</para>
- </listitem>
-
- <listitem>
- <para>Dodgy memory: If you have multiple memory SIMMS/DIMMS
- installed then pull them all out and try running the
- machine with each SIMM or DIMM individually and narrow the
- problem down to either the problematic DIMM/SIMM or perhaps
- even a combination.</para>
- </listitem>
-
- <listitem>
- <para>Over-optimistic Motherboard settings: In your BIOS
- settings, and some motherboard jumpers you have options to
- set various timings, mostly the defaults will be
- sufficient, but sometimes, setting the wait states on RAM
- too low, or setting the <quote>RAM Speed: Turbo</quote> option, or
- similar in the BIOS will cause strange behaviour. A
- possible idea is to set to BIOS defaults, but it might be
- worth noting down your settings first!</para>
- </listitem>
-
- <listitem>
- <para>Unclean or insufficient power to the motherboard. If you
- have any unused I/O boards, hard disks, or CDROMs in your
- system, try temporarily removing them or disconnecting the
- power cable from them, to see if your power supply can
- manage a smaller load. Or try another power supply,
- preferably one with a little more power (for instance, if
- your current power supply is rated at 250 Watts try one
- rated at 300 Watts).</para>
- </listitem>
-
- </orderedlist>
-
- <para>You should also read the SIG11 FAQ (listed below) which has
- excellent explanations of all these problems, albeit from a
- Linux viewpoint. It also discusses how memory testing software
- or hardware can still pass faulty memory.</para>
-
- <para>Finally, if none of this has helped it is possible that
- you have just found a bug in FreeBSD, and you should follow the
- instructions to send a problem report.</para>
-
- <para>There is an extensive FAQ on this at <ulink
- URL="http://www.bitwizard.nl/sig11/">
- the SIG11 problem FAQ</ulink></para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="screen-loses-sync">
- <para>Why does the screen go black and lose sync when I
- boot?</para>
- </question>
-
- <answer>
- <para>This is a known problem with the ATI Mach 64 video card.
- The problem is that this card uses address
- <literal>2e8</literal>, and the fourth serial port does too.
- Due to a bug (feature?) in the &man.sio.4;
- driver it will touch this port even if you do not have the
- fourth serial port, and <emphasis>even</emphasis> if
- you disable sio3 (the fourth port) which normally uses this
- address.</para>
-
- <para>Until the bug has been fixed, you can use this
- workaround:</para>
-
- <orderedlist>
- <listitem>
- <para>Enter <option>-c</option> at the boot prompt.
- (This will put the kernel into configuration mode).</para>
- </listitem>
-
- <listitem>
- <para>Disable <devicename>sio0</devicename>,
- <devicename>sio1</devicename>,
- <devicename>sio2</devicename> and
- <devicename>sio3</devicename> (all of them). This way
- the sio driver does not get activated -&gt; no
- problems.</para>
- </listitem>
-
- <listitem>
- <para>Type exit to continue booting.</para>
- </listitem>
- </orderedlist>
-
- <para>If you want to be able to use your serial ports, you will
- have to build a new kernel with the following modification: in
- <filename>/usr/src/sys/i386/isa/sio.c</filename> find the one
- occurrence of the string <literal>0x2e8</literal> and remove
- that string and the preceding comma (keep the trailing comma).
- Now follow the normal procedure of building a new
- kernel.</para>
-
- <para>Even after applying these workarounds, you may still find
- that the X Window System does not work properly. If this is the
- case, make sure that the XFree86 version you are using is at
- least XFree86 3.3.3 or higher. This version and upwards has
- built-in support for the Mach64 cards and even a dedicated X
- server for those cards.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="reallybigram">
- <para>How come FreeBSD uses only 64 MB of RAM when my system has
- 128 MB of RAM installed?</para>
- </question>
-
- <answer>
- <para>Due to the manner in which FreeBSD gets the memory size
- from the BIOS, it can only detect 16 bits worth of Kbytes in
- size (65535 Kbytes = 64MB) (or less... some BIOSes peg the
- memory size to 16M). If you have more than 64MB, FreeBSD will
- attempt to detect it; however, the attempt may fail.</para>
-
- <para>To work around this problem, you need to use the kernel
- option specified below. There is a way to get complete memory
- information from the BIOS, but we do not have room in the
- bootblocks to do it. Someday when lack of room in the
- bootblocks is fixed, we will use the extended BIOS functions to
- get the full memory information...but for now we are stuck with
- the kernel option.</para>
-
- <para><literal>options "MAXMEM=<replaceable>n</replaceable>"</literal></para>
-
- <para>Where <replaceable>n</replaceable> is your memory in
- Kilobytes. For a 128 MB machine, you would want to use
- <literal>131072</literal>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="panic-kmemmap-too-small">
- <para>Why does FreeBSD 2.0 panic with
- <errorname>kmem_map too small!</errorname>?</para>
- </question>
-
- <answer>
- <note>
- <para>The message may also be
- <literal>mb_map too small!</literal></para>
- </note>
-
- <para>The panic indicates that the system ran out of virtual
- memory for network buffers (specifically, mbuf clusters). You
- can increase the amount of VM available for mbuf clusters by
- adding:</para>
-
- <para><literal>options "NMBCLUSTERS=<replaceable>n</replaceable>"</literal></para>
-
- <para>to your kernel config file, where
- <replaceable>n</replaceable> is a number in the range 512-4096,
- depending on the number of concurrent TCP connections you need
- to support. I would recommend trying 2048 - this should get rid of
- the panic completely. You can monitor the number of mbuf
- clusters allocated/in use on the system with
- <command>netstat
- -m</command> (see &man.netstat.1;). The default value for NMBCLUSTERS is <literal>512 +
- MAXUSERS * 16</literal>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="cmap-busy-panic">
- <para>Why do I get an error reading <errorname>CMAP
- busy</errorname> when rebooting with a new
- kernel?</para>
- </question>
-
- <answer>
- <para>The logic that attempts to detect an out of date
- <filename>/var/db/kvm_*.db</filename> files sometimes fails
- and using a mismatched file can sometimes lead to panics.</para>
-
- <para>If this happens, reboot single-user and do:</para>
-
- <screen>&prompt.root; <userinput>rm /var/db/kvm_*.db</userinput></screen>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="brkadrint-illegal-host-access">
- <para>What does the message <errorname>ahc0: brkadrint,
- Illegal Host Access at seqaddr 0x0</errorname>
- mean?</para>
- </question>
-
- <answer>
- <para>This is a conflict with an Ultrastor SCSI Host Adapter.</para>
-
- <para>During the boot process enter the kernel configuration
- menu and disable
- <devicename>uha0</devicename>,
- which is causing the problem.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="mail-loopback">
- <para>Why does Sendmail give me an error reading
- <quote><errorname>mail loops back to
- myself</errorname></quote>?</para>
- </question>
-
- <answer>
- <para>This is answered in the sendmail FAQ as follows:-</para>
-
-<literallayout> * I'm getting "Local configuration error" messages, such as:
-
- 553 relay.domain.net config error: mail loops back to myself
- 554 &lt;user@domain.net&gt;... Local configuration error
-
- How can I solve this problem?
-
- You have asked mail to the domain (e.g., domain.net) to be
- forwarded to a specific host (in this case, relay.domain.net)
- by using an MX record, but the relay machine doesn't recognize
- itself as domain.net. Add domain.net to /etc/sendmail.cw
- (if you are using FEATURE(use_cw_file)) or add "Cw domain.net"
- to /etc/sendmail.cf.
- </literallayout>
-
- <para>The current version of the <ulink
- URL="ftp://rtfm.mit.edu/pub/usenet/news.answers/mail/sendmail-faq">sendmail
- FAQ</ulink> is no longer maintained with the sendmail release.
- It is however regularly posted to <ulink
- URL="news:comp.mail.sendmail">comp.mail.sendmail</ulink>,
- <ulink URL="news:comp.mail.misc">comp.mail.misc</ulink>, <ulink
- URL="news:comp.mail.smail">comp.mail.smail</ulink>, <ulink
- URL="news:comp.answers">comp.answers</ulink>, and <ulink
- URL="news:news.answers">news.answers</ulink>. You can also
- receive a copy via email by sending a message to
- <email>mail-server@rtfm.mit.edu</email> with the command
- <literal>send usenet/news.answers/mail/sendmail-faq</literal>
- as the body of the message.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="remote-fullscreen">
- <para>Why do full screen applications on remote machines
- misbehave?</para>
- </question>
-
- <answer>
- <para>The remote machine may be setting your terminal type
- to something other than the <literal>cons25</literal> terminal
- type required by the FreeBSD console.</para>
-
- <para>There are a number of possible work-arounds for this
- problem:</para>
- <itemizedlist>
- <listitem>
- <para>After logging on to the remote machine, set your
- TERM shell variable to <literal>ansi</literal> or
- <literal>sco</literal> if the remote machine knows
- about these terminal types.</para>
- </listitem>
-
- <listitem>
- <para>Use a VT100 emulator like
- <application>screen</application> at the FreeBSD console.
- <application>screen</application> offers you the ability
- to run multiple concurrent sessions from one terminal,
- and is a neat program in its own right. Each
- <application>screen</application> window behaves like a
- VT100 terminal, so the TERM variable at the remote end
- should be set to <literal>vt100</literal>.</para>
- </listitem>
-
- <listitem>
- <para>Install the <literal>cons25</literal> terminal
- database entry on the remote machine. The way to do this
- depends on the operating system on the remote machine.
- The system administration manuals for the remote system
- should be able to help you here.</para>
- </listitem>
-
- <listitem>
- <para>Fire up an X server at the FreeBSD end and login to
- the remote machine using an X based terminal emulator
- such as <command>xterm</command> or
- <command>rxvt</command>. The TERM variable at the remote
- host should be set to <literal>xterm</literal> or
- <literal>vt100</literal>.</para>
- </listitem>
- </itemizedlist>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="calcru-negative">
- <para>Why does my machine print
- <errorname>calcru: negative time...</errorname>?</para>
- </question>
-
- <answer>
- <para>This can be caused by various hardware and/or software
- ailments relating to interrupts. It may be due to bugs but can
- also happen by nature of certain devices. Running TCP/IP over
- the parallel port using a large MTU is one good way to provoke
- this problem. Graphics accelerators can also get you here, in
- which case you should check the interrupt setting of the card
- first.</para>
-
- <para>A side effect of this problem are dying processes with the
- message <quote>SIGXCPU exceeded cpu time limit</quote>.</para>
-
- <para>For FreeBSD 3.0 and later from Nov 29, 1998 forward: If the
- problem cannot be fixed otherwise the solution is to set
- this sysctl variable:</para>
-
- <screen>&prompt.root; <userinput>sysctl -w kern.timecounter.method=1</userinput></screen>
-
- <para>This means a performance impact, but considering the cause
- of this problem, you probably will not notice. If the problem
- persists, keep the sysctl set to one and set the
- <literal>NTIMECOUNTER</literal> option in your kernel to
- increasingly large values. If by the time you have reached
- <literal>NTIMECOUNTER=20</literal> the problem is not solved,
- interrupts are too hosed on your machine for reliable
- timekeeping.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="pcm0-not-found">
- <para>I see <errorname>pcm0 not found</errorname> or my sound card is
- found as <devicename>pcm1</devicename> but I have
- <literal>device pcm0</literal> in my kernel config file. What is
- going on?</para>
- </question>
-
- <answer>
- <para>This occurs in FreeBSD 3.x with PCI sound cards. The
- <devicename>pcm0</devicename> device is reserved exclusively for
- ISA-based cards so, if you have a PCI card, then you will see
- this error, and your card will appear as <devicename>pcm1</devicename>.
-
- <note>
- <para>You cannot remove the warning by simply changing the
- line in the kernel config file to <literal>device
- pcm1</literal> as this will result in
- <devicename>pcm1</devicename> being reserved for ISA cards and
- your PCI card being found as <devicename>pcm2</devicename> (along
- with the warning <errorname>pcm1 not found</errorname>).</para>
- </note>
-
- If you have a PCI sound card you will also have to make the
- <devicename>snd1</devicename> device rather than
- <devicename>snd0</devicename>:</para>
-
- <screen>&prompt.root; <userinput>cd /dev</userinput>
-&prompt.root; <userinput>./MAKEDEV snd1</userinput></screen>
-
- <para>This situation does not arise in FreeBSD 4.x as a lot
- of work has been done to make it more
- <emphasis>PnP-centric</emphasis> and the
- <devicename>pcm0</devicename> device is no longer reserved
- exclusively for ISA cards</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="pnp-not-found">
- <para>Why is my PnP card no longer found (or found as
- <literal>unknown</literal>) since upgrading to FreeBSD 4.x?</para>
- </question>
-
- <answer>
- <para>FreeBSD 4.x is now much more <emphasis>PnP-centric</emphasis>
- and this has had the side effect of some PnP devices (e.g. sound
- cards and internal modems) not working even though they worked
- under FreeBSD 3.x.</para>
-
- <para>The reasons for this behaviour are explained by the following
- e-mail, posted to the freebsd-questions mailing list by Peter
- Wemm, in answer to a question about an internal modem that was
- no longer found after an upgrade to FreeBSD 4.x (the comments
- in <literal>[]</literal> have been added to clarify the
- context.</para>
-
- <blockquote>
- <para>The PNP bios preconfigured it [the modem] and left it
- laying around in port space, so [in 3.x] the old-style ISA
- probes <quote>found</quote> it there.</para>
-
- <para>Under 4.0, the ISA code is much more PnP-centric. It was
- possible [in 3.x] for an ISA probe to find a
- <quote>stray</quote> device and then for the PNP device id to
- match and then fail due to resource conflicts. So, it
- disables the programmable cards first so this double probing
- cannot happen. It also means that it needs to know the PnP
- id's for supported PnP hardware. Making this more user
- tweakable is on the TODO list.</para>
- </blockquote>
-
- <para>To get the device working again requires finding its PnP id
- and adding it to the list that the ISA probes use to identify
- PnP devices. This is obtained using &man.pnpinfo.8; to probe the
- device, for example this is the output from &man.pnpinfo.8; for
- an internal modem:</para>
-
- <screen>&prompt.root; <userinput>pnpinfo</userinput>
-Checking for Plug-n-Play devices...
-
-Card assigned CSN #1
-Vendor ID PMC2430 (0x3024a341), Serial Number 0xffffffff
-PnP Version 1.0, Vendor Version 0
-Device Description: Pace 56 Voice Internal Plug & Play Modem
-
-Logical Device ID: PMC2430 0x3024a341 #0
- Device supports I/O Range Check
-TAG Start DF
- I/O Range 0x3f8 .. 0x3f8, alignment 0x8, len 0x8
- [16-bit addr]
- IRQ: 4 - only one type (true/edge)</screen>
-
- <para>[more TAG lines elided]</para>
-
- <screen>TAG End DF
-End Tag
-
-Successfully got 31 resources, 1 logical fdevs
--- card select # 0x0001
-
-CSN PMC2430 (0x3024a341), Serial Number 0xffffffff
-
-Logical device #0
-IO: 0x03e8 0x03e8 0x03e8 0x03e8 0x03e8 0x03e8 0x03e8 0x03e8
-IRQ 5 0
-DMA 4 0
-IO range check 0x00 activate 0x01</screen>
-
- <para>The information you require is in the
- <quote>Vendor ID</quote> line at the start of the output. The
- hexadecimal number in parentheses (0x3024a341 in this example)
- is the PnP id and the string immediately before this (PMC2430)
- is a unique ASCII id. This information needs adding to the file
- <filename>/usr/src/sys/isa/sio.c</filename>.</para>
-
- <para>You should first make a backup of <filename>sio.c</filename>
- just in case things go wrong. You will also need it to make the
- patch to submit with your PR (you are going to submit a PR,
- aren't you?) then edit <filename>sio.c</filename> and search
- for the line</para>
-
- <programlisting>static struct isa_pnp_id sio_ids[] = {</programlisting>
-
- <para>then scroll down to find the correct place to add the entry
- for your device. The entries look like this, and are sorted on
- the ASCII Vendor ID string which should be included in the
- comment to the right of the line of code along with all (if it
- will fit) or part of the <emphasis>Device Description</emphasis>
- from the output of &man.pnpinfo.8;:</para>
-
- <programlisting>{0x0f804f3f, NULL}, /* OZO800f - Zoom 2812 (56k Modem) */
-{0x39804f3f, NULL}, /* OZO8039 - Zoom 56k flex */
-{0x3024a341, NULL}, /* PMC2430 - Pace 56 Voice Internal Modem */
-{0x1000eb49, NULL}, /* ROK0010 - Rockwell ? */
-{0x5002734a, NULL}, /* RSS0250 - 5614Jx3(G) Internal Modem */</programlisting>
-
- <para>Add the hexadecimal Vendor ID for your device in the
- correct place, save the file, rebuild your kernel, and reboot.
- Your device should now be found as an <literal>sio</literal>
- device as it was under FreeBSD 3.x</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="nlist-failed">
- <para>Why do I get the error <errorname>nlist failed</errorname> when
- running, for example, <command>top</command> or
- <command>systat</command>?</para>
- </question>
-
- <answer>
- <para>The problem is that the application you are trying to run is
- looking for a specific kernel symbol, but, for whatever reason,
- cannot find it; this error stems from one of two problems:</para>
-
- <itemizedlist>
- <listitem>
- <para>Your kernel and userland are not synchronized (i.e., you
- built a new kernel but did not do an
- <maketarget>installworld</maketarget>, or vice versa), and
- thus the symbol table is different from what the user
- application thinks it is. If this is the case, simply
- complete the upgrade process (see
- <filename>/usr/src/UPDATING</filename> for the correct
- sequence).</para>
- </listitem>
-
- <listitem>
- <para>You are not using <command>/boot/loader</command> to load
- your kernel, but doing it directly from boot2 (see
- &man.boot.8;). While there is nothing wrong with bypassing
- <command>/boot/loader</command>, it generally does a better
- job of making the kernel symbols available to user
- applications.</para>
- </listitem>
- </itemizedlist>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="connection-delay">
- <para>Why does it take so long to connect to my computer via
- <command>ssh</command> or <command>telnet</command>?</para>
- </question>
-
- <answer>
- <para>The symptom: there is a long delay between the time the TCP
- connection is established and the time when the client software
- asks for a password (or, in &man.telnet.1;'s case, when a login
- prompt appears).</para>
-
- <para>The problem: more likely than not, the delay is caused by
- the server software trying to resolve the client's IP address
- into a hostname. Many servers, including the Telnet and SSH
- servers that come with FreeBSD, do this in order to, among
- other things, store the hostname in a log file for future
- reference by the administrator.</para>
-
- <para>The remedy: if the problem occurs whenever you connect from
- your computer (the client) to any server, the problem is with
- the client; likewise, if the problem only occurs when someone
- connects to your computer (the server) the problem is with the
- server.</para>
-
- <para>If the problem is with the client, the only remedy is to
- fix the DNS so the server can resolve it. If this is on a
- local network, consider it a server problem and keep reading;
- conversely, if this is on the global Internet, you will most
- likely need to contact your ISP and ask them to fix it for
- you.</para>
-
- <para>If the problem is with the server, and this is on a local
- network, you need to configure the server to be able to resolve
- address-to-hostname queries for your local address range. See
- the &man.hosts.5; and &man.named.8; manual pages for more
- information. If this is on the global Internet, the problem
- may be that your server's resolver is not functioning
- correctly. To check, try to look up another host--say,
- <hostid>www.yahoo.com</hostid>. If it does not work, that is
- your problem.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="stray-irq">
- <para>What does <errorname>stray IRQ</errorname> mean?</para>
- </question>
- <answer>
- <para>Stray IRQs are indications of hardware IRQ glitches,
- mostly from hardware that removes its interrupt request in
- the middle of the interrupt request acknowledge
- cycle.</para>
- <para>One has three options for dealing with this:</para>
- <itemizedlist>
- <listitem>
- <para>Live with the warnings. All except the first 5
- per irq are suppressed anyway.</para>
- </listitem>
- <listitem>
- <para>Break the warnings by changing 5 to 0 in
- <function>isa_strayintr()</function> so that all the
- warnings are suppressed.</para>
- </listitem>
- <listitem>
- <para>Break the warnings by installing parallel port
- hardware that uses irq 7 and the ppp driver for it (this
- happens on most systems), and install an ide drive or
- other hardware that uses irq 15 and a suitable driver
- for it.</para>
- </listitem>
- </itemizedlist>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="file-table-full">
- <para>Why does <errorname>file: table is full</errorname> show up
- repeatedly in dmesg?</para>
- </question>
- <answer>
- <para>
- This error is caused when you have exhausted the number of
- available file descriptors on your system. The file table in
- memory is full.
- </para>
- <para>The solution:</para>
- <para>
- Manually adjust the <varname>kern.maxfiles</varname> kernel limit
- setting.
- </para>
- <screen>&prompt.root; <userinput>sysctl -w kern.maxfiles=n</userinput></screen>
- <para>Adjust <varname>n</varname> according to your system needs.
- Each open file, socket, or fifo uses one file descriptor.
- A large-scale server may easily require tens of thousands of
- file descriptors (10,000+), depending on the kind and number
- of services running concurrently.</para>
- <para>The number of default file descriptors set in the kernel is
- dictated by the</para>
- <programlisting>maxusers 32</programlisting>
- <para><varname>maxusers</varname> line in your kernel
- config file. Increasing this will proportionally increase
- <varname>kern.maxfiles</varname>.
- </para>
- <para>You can see what <varname>kern.maxfiles</varname> is
- currently set to by:
- </para>
- <screen>&prompt.root; <userinput>sysctl kern.maxfiles</userinput>
-kern.maxfiles: 1064</screen>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="laptop-clock-skew">
- <para>Why does the clock on my laptop keep incorrect time?</para>
- </question>
-
- <answer>
- <para>Your laptop has two or more clocks, and FreeBSD has chosen to
- use the wrong one.</para>
-
- <para>Run &man.dmesg.8;, and check for lines that contain
- <literal>Timecounter</literal>. The last line printed is the one
- that FreeBSD chose, and will almost certainly be
- <literal>TSC</literal>.</para>
-
- <screen>&prompt.root; <userinput>dmesg | grep Timecounter</userinput>
-Timecounter "i8254" frequency 1193182 Hz
-Timecounter "TSC" frequency 595573479 Hz</screen>
-
- <para>You can confirm this by checking the
- <varname>kern.timecounter.hardware</varname>
- &man.sysctl.3;.</para>
-
- <screen>&prompt.root; <userinput>sysctl kern.timecounter.hardware</userinput>
-kern.timecounter.hardware: TSC</screen>
-
- <para>The BIOS may modify the TSC clock&mdash;perhaps to change the
- speed of the processor when running from batteries, or going in to
- a power saving mode, but FreeBSD is unaware of these adjustments,
- and appears to gain or lose time.</para>
-
- <para>In this example, the <literal>i8254</literal> clock is also
- available, and can be selected by writing its name to the
- <varname>kern.timecounter.hardware</varname>
- &man.sysctl.3;.</para>
-
- <screen>&prompt.root; <userinput>sysctl -w kern.timecounter.hardware=i8254</userinput>
-kern.timecounter.hardware: TSC -&gt; i8254</screen>
-
- <para>Your laptop should now start keeping more accurate
- time.</para>
-
- <para>To have this change automatically run at boot time, add the
- following line to <filename>/etc/sysctl.conf</filename>.</para>
-
- <programlisting>kern.timecounter.hardware=i8254</programlisting>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="boot-read-error">
- <para>Why does FreeBSD's boot loader display
- <errorname>Read error</errorname> and stop after the BIOS
- screen?</para>
- </question>
-
- <answer>
- <para>FreeBSD's boot loader is incorrectly recognizing the hard
- drive's geometry. This must be manually set within fdisk when
- creating or modifying FreeBSD's slice.
- </para>
- <para>The correct drive geometry values can be found within the
- machine's BIOS. Look for the number of cylinders, heads and
- sectors for the particular drive.
- </para>
- <para>Within &man.sysinstall.8;'s fdisk, hit
- <keycap>G</keycap> to set the drive geometry.</para>
- <para>A dialog will pop up requesting the number of cylinders, heads
- and sectors. Type the numbers found from the BIOS separates by
- forward slashes.
- </para>
- <para>5000 cylinders, 250 sectors and 60 sectors would be entered as
- <userinput>5000/250/60</userinput>
- </para>
- <para>Press enter to set the values, and hit
- <keycap>W</keycap> to write the
- new partition table to the drive.
- </para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="bootmanager-restore">
- <para>Another operating system destroyed my Boot Manager. How do I
- get it back?
- </para>
- </question>
-
- <answer>
- <para>Enter &man.sysinstall.8; and choose Configure,
- then Fdisk. Select the disk the Boot Manager resided on
- with the <keycap>space</keycap> key. Press
- <keycap>W</keycap> to write changes to the drive. A prompt
- will appear asking which boot loader to install. Select this,
- and it will be restored.
- </para>
- </answer>
- </qandaentry>
- </qandaset>
- </chapter>
-
- <chapter id="commercial">
- <title>Commercial Applications</title>
-
- <note>
- <para>This section is still very sparse, though we are hoping, of
- course, that companies will add to it! :) The FreeBSD group has
- no financial interest in any of the companies listed here but
- simply lists them as a public service (and feels that commercial
- interest in FreeBSD can have very positive effects on FreeBSD's
- long-term viability). We encourage commercial software vendors to
- send their entries here for inclusion. See <ulink
- URL="http://www.FreeBSD.org/commercial/commercial.html">the
- Vendors page</ulink> for a longer list.</para>
- </note>
-
- <qandaset>
- <qandaentry>
- <question id="officesuite">
- <para>Where can I get an Office Suite for FreeBSD?</para>
- </question>
- <answer>
- <itemizedlist>
- <listitem>
- <para><ulink url="http://www.freebsdmall.com">The FreeBSD Mall</ulink>
- offers a FreeBSD native version of <ulink
- url="http://www.vistasource.com">VistaSource</ulink>
- ApplixWare 5.</para>
-
- <para>ApplixWare is a rich full-featured, commercial
- Office Suite for FreeBSD containing a word processor,
- spreadsheet, presentation program, vector drawing
- package, and other applications.
- </para>
-
- <para>You can purchase ApplixWare for FreeBSD <ulink
- url="http://www.wccdrom.com/titles/freebsd/applix.phtml">here</ulink>.
- </para>
-
- </listitem>
- <listitem>
- <para>The Linux version of <ulink
- url="http://www.sun.com/staroffice">StarOffice</ulink>
- works flawlessly on FreeBSD. The easiest way to
- install the Linux version of StarOffice is through the
- <ulink
- url="../handbook/ports.html">FreeBSD
- Ports collection</ulink>. Future versions of the
- open-source <ulink
- url="http://www.openoffice.org">OpenOffice</ulink>
- suite should work as well.</para>
- </listitem>
- </itemizedlist>
- </answer>
- </qandaentry>
- <qandaentry>
- <question id="motif">
- <para>Where can I get Motif for FreeBSD?</para>
- </question>
-
- <answer>
- <para>The Open Group has released the source code to Motif 2.1.30.
- You can install the <literal>open-motif</literal> package, or
- compile it from ports. Refer to
- <ulink url="../handbook/ports.html">the ports section of the
- Handbook</ulink> for more information on how to do this.
-
- <note>
- <para>The Open Motif distribution only allows redistribution
- if it is running on an <ulink url="http://www.opensource.org">
- open source</ulink> operating system.</para>
- </note>
- </para>
-
- <para>In addition, there are commercial distributions of the Motif
- software available. These, however, are not for free, but their
- license allows them to be used in closed-source software.
- Contact <link linkend="apps2go">Apps2go</link> for the
- least expensive ELF Motif 2.1.20 distribution for FreeBSD
- (either i386 or Alpha).<anchor id="apps2go"></para>
-
- <para>There are two distributions, the <quote>developement
- edition</quote> and the <quote>runtime edition</quote> (for
- much less). These distributions includes:</para>
-
- <itemizedlist>
- <listitem>
- <para>OSF/Motif manager, xmbind, panner, wsm.</para>
- </listitem>
-
- <listitem>
- <para>Development kit with uil, mrm, xm, xmcxx, include
- and Imake files.</para>
- </listitem>
-
- <listitem>
- <para>Static and dynamic ELF libraries (for use with
- FreeBSD 3.0 and above).</para>
- </listitem>
-
- <listitem>
- <para>Demonstration applets.</para>
- </listitem>
- </itemizedlist>
-
- <para>Be sure to specify that you want the FreeBSD version of
- Motif when ordering (do not forget to mention the architecture
- you want too)! Versions for NetBSD and OpenBSD are also sold by
- <emphasis>Apps2go</emphasis>. This is currently a FTP only
- download.</para>
-
- <variablelist>
- <varlistentry>
- <term>More info</term>
- <listitem>
- <para><ulink URL="http://www.apps2go.com/">
- Apps2go WWW page</ulink></para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>or</term>
- <listitem>
- <para>
- <email>sales@apps2go.com</email> or
- <email>support@apps2go.com</email>
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>or</term>
- <listitem>
- <para>phone (817) 431 8775 or +1 817 431-8775</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>Contact <link linkend="metrox">Metro Link</link>
- for an either ELF or a.out Motif 2.1 distribution for
- FreeBSD.</para>
-
- <para>This distribution includes:</para>
- <itemizedlist>
- <listitem>
- <para>OSF/Motif manager, xmbind, panner, wsm.</para>
- </listitem>
-
- <listitem>
- <para>Development kit with uil, mrm, xm, xmcxx, include
- and Imake files.</para>
- </listitem>
-
- <listitem>
- <para>Static and dynamic libraries (specify ELF for use
- with FreeBSD 3.0 and later; or a.out for use with FreeBSD
- 2.2.8 and earlier).</para>
- </listitem>
-
- <listitem>
- <para>Demonstration applets.</para>
- </listitem>
-
- <listitem>
- <para>Preformatted man pages.</para>
- </listitem>
-
- </itemizedlist>
-
- <para>Be sure to specify that you want the FreeBSD version
- of Motif when ordering! Versions for Linux are also sold by
- <emphasis>Metro Link</emphasis>. This is available on either a
- CDROM or for FTP download.</para>
-
- <para>Contact <link linkend="xig">Xi Graphics</link> for an
- a.out Motif 2.0 distribution for FreeBSD.</para>
-
- <para>This distribution includes:</para>
- <itemizedlist>
- <listitem>
- <para>OSF/Motif manager, xmbind, panner, wsm.</para>
- </listitem>
-
- <listitem>
- <para>Development kit with uil, mrm, xm, xmcxx, include
- and Imake files.</para>
- </listitem>
-
- <listitem>
- <para>Static and dynamic libraries (for use with FreeBSD
- 2.2.8 and earlier).</para>
- </listitem>
-
- <listitem>
- <para>Demonstration applets.</para>
- </listitem>
-
- <listitem>
- <para>Preformatted man pages.</para>
- </listitem>
- </itemizedlist>
-
- <para>Be sure to specify that you want the FreeBSD version
- of Motif when ordering! Versions for BSDI and Linux are also
- sold by <emphasis>Xi Graphics</emphasis>. This is currently a 4
- diskette set... in the future this will change to a unified CD
- distribution like their CDE.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="cde">
- <para>Where can I get CDE for FreeBSD?</para>
- </question>
-
- <answer>
- <para><link linkend="xig">Xi Graphics</link> used to sell CDE
- for FreeBSD, but no longer do.</para>
-
- <para><ulink URL="http://www.kde.org/">KDE</ulink> is an open
- source X11 desktop which is similar to CDE in many respects.
- You might also like the look and feel of <ulink
- URL="http://www.xfce.org/">xfce</ulink>. KDE and xfce are both
- in the <ulink URL="http://www.FreeBSD.org/ports/">ports
- system</ulink>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="commercial-xserver">
- <para>Are there any commercial high-performance X servers?</para>
- </question>
-
- <answer>
- <para>Yes, <ulink URL="http://www.xig.com/">Xi Graphics</ulink>
- and <ulink URL="http://www.metrolink.com/">Metro Link</ulink>
- sell Accelerated-X product for FreeBSD and other Intel based
- systems.</para>
-
- <para>The Metro Link offering is a high performance X Server
- that offers easy configuration using the FreeBSD Package suite
- of tools, support for multiple concurrent video boards and is
- distributed in binary form only, in a convenient FTP download.
- Not to mention the Metro Link offering is available at the very
- reasonable price of $39. <anchor id="metrox"></para>
-
- <para>Metro Link also sells both ELF and a.out Motif for
- FreeBSD (see above).</para>
-
- <variablelist>
- <varlistentry>
- <term>More info</term>
- <listitem>
- <para><ulink URL="http://www.metrolink.com/">
- Metro Link WWW page</ulink></para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>or</term>
- <listitem>
- <para><email>sales@metrolink.com</email>
- or <email>tech@metrolink.com</email>
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>or</term>
- <listitem>
- <para>phone (954) 938-0283 or +1 954 938-0283</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>The Xi Graphics offering is a high performance X Server
- that offers easy configuration, support for multiple concurrent
- video boards and is distributed in binary form only, in a
- unified diskette distribution for FreeBSD and Linux. Xi
- Graphics also offers a high performance X Server tailored for
- laptop support.<anchor id="xig"></para>
-
- <para>There is a free <quote>compatibility demo</quote> of
- version 5.0 available.</para>
-
- <para>Xi Graphics also sells Motif and CDE for FreeBSD (see
- above).</para>
-
- <variablelist>
- <varlistentry>
- <term>More info</term>
- <listitem>
- <para><ulink URL="http://www.xig.com/">
- Xi Graphics WWW page</ulink></para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>or</term>
- <listitem>
- <para><email>sales@xig.com</email>
- or <email>support@xig.com</email>
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>or</term>
- <listitem>
- <para>phone (800) 946 7433 or +1 303 298-7478.</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="database-systems">
- <para>Are there any Database systems for FreeBSD?</para>
- </question>
-
- <answer>
- <para>Yes! See the <ulink
- URL="http://www.FreeBSD.org/commercial/software_bycat.html#CATEGORY_DATABASE">
- Commercial Vendors</ulink> section of FreeBSD's Web site.</para>
-
- <para>Also see the <ulink
- URL="http://www.FreeBSD.org/ports/databases.html">
- Databases</ulink> section of the Ports collection.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="oracle-support">
- <para>Can I run Oracle on FreeBSD?</para>
- </question>
-
- <answer>
- <para>Yes. The following pages tell you exactly how to setup
- Linux-Oracle on FreeBSD:</para>
-
- <itemizedlist>
- <listitem>
- <para><ulink
- URL="http://www.scc.nl/~marcel/howto-oracle.html">
- http://www.scc.nl/~marcel/howto-oracle.html</ulink></para>
- </listitem>
-
- <listitem>
- <para><ulink
- URL="http://www.lf.net/lf/pi/oracle/install-linux-oracle-on-freebsd">
-
- http://www.lf.net/lf/pi/oracle/install-linux-oracle-on-freebsd</ulink></para>
-
- </listitem>
- </itemizedlist>
- </answer>
- </qandaentry>
- </qandaset>
- </chapter>
-
- <chapter id="applications">
- <title>User Applications</title>
-
- <qandaset>
- <qandaentry>
- <question id="user-apps">
- <para>So, where are all the user applications?</para>
- </question>
-
- <answer>
- <para>Please take a look at
- <ulink URL="http://www.FreeBSD.org/ports/">the ports
- page</ulink> for info on software packages ported to FreeBSD.
- The list currently tops 3400 and is growing daily, so come back
- to check often or subscribe to the
- <literal>freebsd-announce</literal> <link
- linkend="mailing">mailing list</link> for periodic updates on
- new entries.</para>
-
- <para>Most ports should be available for the 2.2, 3.x and 4.x
- branches, and many of them should work on 2.1.x systems as
- well. Each time a FreeBSD release is made, a snapshot of the
- ports tree at the time of release in also included in the
- <filename>ports/</filename> directory.</para>
-
- <para>We also support the concept of a <quote>package</quote>,
- essentially no more than a gzipped binary distribution with a
- little extra intelligence embedded in it for doing whatever
- custom installation work is required. A package can be
- installed and uninstalled again easily without having to know
- the gory details of which files it includes.</para>
-
- <para>Use the package installation menu in
- <filename>/stand/sysinstall</filename> (under the
- post-configuration menu item) or invoke the
- &man.pkg.add.1; command on the specific package
- files you are interested in installing. Package files can
- usually be identified by their <filename>.tgz</filename> suffix
- and CDROM distribution people will have a
- <filename>packages/All</filename> directory on their CD which
- contains such files. They can also be downloaded over the net
- for various versions of FreeBSD at the following
- locations:</para>
-
- <variablelist>
- <varlistentry>
- <term>for 2.2.8-RELEASE/2.2.8-STABLE</term>
- <listitem>
- <para><ulink
- URL="ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386/packages-2.2.8/">
- ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386/packages-2.2.8/</ulink></para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>for 3.X-RELEASE/3.X-STABLE</term>
- <listitem>
- <para><ulink
- URL="ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386/packages-3-stable/">
- ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386/packages-3-stable/</ulink></para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>for 4.X-RELEASE/4-STABLE</term>
- <listitem>
- <para><ulink
- URL="ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386/packages-4-stable/">
- ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386/packages-4-stable/</ulink></para>
-
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>for 5.X-CURRENT</term>
- <listitem>
- <para><ulink
- URL="ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386/packages-5-current/">
- ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/i386/packages-5-current</ulink></para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>or your nearest local mirror site.</para>
-
- <para>Note that all ports may not be available as packages since
- new ones are constantly being added. It is always a good idea
- to check back periodically to see which packages are available
- at the <ulink
- URL="ftp://ftp.FreeBSD.org/pub/FreeBSD/">ftp.FreeBSD.org</ulink>
- master site.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="missing-libcso30">
- <para>Where do I find libc.so.3.0?</para>
- </question>
-
- <answer>
- <para>You are trying to run a package built on 2.2 and later on
- a 2.1.x system. Please take a look at the previous section and
- get the correct port/package for your system.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="missing-libcso40">
- <para>Why do I get a message reading <errorname>Error: can't find
- libc.so.4.0</errorname>?</para>
- </question>
-
- <answer>
-
- <para>You accidently downloaded packages meant for 4.X and 5.X
- systems and attempted to install them on your 2.X or 3.X
- FreeBSD system. Please download the correct version of the
- packages.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="emul">
- <para>Why does ghostscript give lots of errors with my
- 386/486SX?</para>
- </question>
-
- <answer>
- <para>You do not have a math co-processor, right?
- You will need to add the alternative math emulator to your
- kernel; you do this by adding the following to your kernel
- config file and it will be compiled in.</para>
-
- <programlisting>options GPL_MATH_EMULATE</programlisting>
-
- <note>
- <para>You will need to remove the
- <literal>MATH_EMULATE</literal> option when you do
- this.</para>
- </note>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="sco-socksys">
- <para>Why do SCO/iBCS2 applications bomb on
- <errorname>socksys</errorname>? (FreeBSD 3.0 and older only).</para>
- </question>
-
- <answer>
- <para>You first need to edit the
- <filename>/etc/sysconfig</filename> (or
- <filename>/etc/rc.conf</filename>, see &man.rc.conf.5;) file in the last section to change the
- following variable to <literal>YES</literal>:</para>
-
- <programlisting># Set to YES if you want ibcs2 (SCO) emulation loaded at startup
-ibcs2=NO</programlisting>
-
- <para>It will load the ibcs2 kernel module at startup.</para>
-
- <para>You will then need to set up /compat/ibcs2/dev to look
- like:</para>
-
- <screen>lrwxr-xr-x 1 root wheel 9 Oct 15 22:20 X0R@ -&gt; /dev/null
-lrwxr-xr-x 1 root wheel 7 Oct 15 22:20 nfsd@ -&gt; socksys
--rw-rw-r-- 1 root wheel 0 Oct 28 12:02 null
-lrwxr-xr-x 1 root wheel 9 Oct 15 22:20 socksys@ -&gt; /dev/null
-crw-rw-rw- 1 root wheel 41, 1 Oct 15 22:14 spx</screen>
-
- <para>You just need socksys to go to
- <devicename>/dev/null</devicename> (see &man.null.4;)
- to fake the open &amp; close. The code in -CURRENT will handle
- the rest. This is much cleaner than the way it was done before.
- If you want the <devicename>spx</devicename> driver for a local
- socket X connection, define <literal>SPX_HACK</literal> when
- you compile the system.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="configure-inn">
- <para>How do I configure INN (Internet News) for my machine?</para>
- </question>
-
- <answer>
- <para>After installing the inn package or port, an excellent
- place to start is <ulink
- URL="http://www.cis.ohio-state.edu/~barr/INN.html">Dave Barr's
- INN Page</ulink> where you will find the INN FAQ.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ms-frontpage">
- <para>What version of Microsoft FrontPage should I get?</para>
- </question>
-
- <answer>
- <para>Use the Port, Luke! A pre-patched version of Apache is
- available in the ports tree.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="java">
- <para>Does FreeBSD support Java?</para>
- </question>
-
- <answer>
- <para>Yes. Please see <ulink
- URL="http://www.FreeBSD.org/java/">
- http://www.FreeBSD.org/java/</ulink>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ports-3x">
- <para>Why can't I build this port on my 3.X-STABLE machine?</para>
- </question>
-
- <answer>
- <para>If you are running a FreeBSD version that lags
- significantly behind -CURRENT or -STABLE, you may need a ports
- upgrade kit from <ulink URL="http://www.FreeBSD.org/ports/">
- http://www.FreeBSD.org/ports/</ulink>. If you are up to date,
- then someone might have committed a change to the port which
- works for -CURRENT but which broke the port for -STABLE. Please
- submit a bug report on this with the
- &man.send-pr.1; command, since the ports
- collection is supposed to work for both the -CURRENT and
- -STABLE branches.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="find-ldso">
- <para>Where do I find ld.so?</para>
- </question>
-
- <answer>
- <para>If you want to run some a.out applications like
- Netscape Navigator on an Elf'ened machine such as 3.1-R or
- later, it would need <filename>/usr/libexec/ld.so</filename>
- and some a.out libs. They are included in the compat22
- distribution. Use <filename>/stand/sysinstall</filename> or
- <filename>install.sh</filename> in the compat22 subdirectory
- and install it. Also read ERRATAs for 3.1-R and 3.2-R.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ports-update">
- <para>I updated the sources, now how do I update my installed
- ports?</para>
- </question>
-
- <answer>
- <para>Unfortunately, there is no easy way to update installed
- ports. The &man.pkg.version.1; command can be used
- to generate a script that will update the installed ports with
- a newer version in the ports tree:</para>
-
- <screen>&prompt.root; <userinput>pkg_version <option>-c</option> > <replaceable>/tmp/myscript</replaceable></userinput></screen>
-
- <para>The output script <emphasis>must</emphasis> be edited by
- hand before you use it. Current versions of
- &man.pkg.version.1; force this by inserting an
- &man.exit.1; at the beginning of the script.</para>
-
- <para>You should save the output of the script, as it will note
- packages that depend on the one that has been updated. These
- may or may not need to be updated as well. The usual case where
- they need to be updated is that a shared library has changed
- version numbers, so the ports that used that library need to be
- rebuilt to use the new version.</para>
-
- <para>If your system is up full time, the &man.periodic.8 system
- can be used to generate a weekly list of ports that might need
- updating by setting
- <literal>weekly_status_pkg_enable="YES"</literal> in
- <filename>/etc/periodic.conf</filename>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="minimal-sh">
- <para>Why is <command>/bin/sh</command> so minimal? Why doesn't
- FreeBSD use <command>bash</command> or another shell?</para>
- </question>
-
- <answer>
- <para>Because POSIX says that there shall be such a shell.</para>
-
- <para>The more complicated answer: many people need to write shell
- scripts which will be portable across many systems. That is why
- POSIX specifies the shell and utility commands in great detail.
- Most scripts are written in Bourne shell, and because several
- important programming interfaces (&man.make.1;, &man.system.3;,
- &man.popen.3;, and analogues in higher-level scripting
- languages like Perl and Tcl) are specified to use the Bourne
- shell to interpret commands. Because the Bourne shell is so
- often and widely used, it is important for it to be quick to
- start, be deterministic in its behavior, and have a small
- memory footprint.</para>
-
- <para>The existing implementation is our best effort at meeting as
- many of these requirements simultaneously as we can. In order to
- keep <command>/bin/sh</command> small, we have not provided many
- of the convenience features that other shells have. That is why the
- Ports Collection includes more featureful shells like bash, scsh,
- tcsh, and zsh. (You can compare for yourself the memory
- utilization of all these shells by looking at the
- <quote>VSZ</quote> and <quote>RSS</quote> columns in a <command>ps
- -u</command> listing.)</para>
- </answer>
- </qandaentry>
- </qandaset>
- </chapter>
-
- <chapter id="kernelconfig">
- <title>Kernel Configuration</title>
-
- <qandaset>
- <qandaentry>
- <question id="make-kernel">
- <para>I would like to customize my kernel. Is it difficult?</para>
- </question>
-
- <answer>
- <para>Not at all! Check out the <ulink
- URL="../handbook/kernelconfig.html">
- kernel config section of the Handbook</ulink>.</para>
-
- <note>
- <para>It is recommended that you make a dated snapshot
- of your kernel
- in <filename>kernel.YYMMDD</filename> after you get it all
- working, that way if you do something dire the next time
- you play with your configuration you can boot that kernel
- instead of having to go all the way back to
- <filename>kernel.GENERIC</filename>. This is particularly
- important if you are now booting off a controller that is not
- supported in the GENERIC kernel.</para>
- </note>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="missing-hw-float">
- <para>My kernel compiles fail because
- <literal>_hw_float</literal> is missing. How do I solve
- this problem?</para>
- </question>
-
- <answer>
- <para>Let me guess. You removed
- <devicename>npx0</devicename> (see &man.npx.4;)
- from your kernel configuration file because you do not have a
- math co-processor, right? Wrong! :-) The
- <devicename>npx0</devicename> is
- <emphasis>MANDATORY</emphasis>. Even if you do not have a
- mathematic co-processor, you <emphasis>must</emphasis>
- include the <devicename>npx0</devicename> device.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="why-kernel-big">
- <para>Why is my kernel so big (over 10MB)?</para>
- </question>
-
- <answer>
- <para>Chances are, you compiled your kernel in
- <emphasis>debug mode</emphasis>. Kernels built in debug
- mode contain many symbols that are used for debugging, thus
- greatly increasing the size of the kernel. Note that if you
- running a FreeBSD 3.0 or later system, there will be little
- or no performance decrease from running a debug kernel,
- and it is useful to keep one around in case of a system
- panic.</para>
-
- <para>However, if you are running low on disk space, or
- you simply do not want to run a debug kernel, make sure
- that both of the following are true:</para>
-
- <itemizedlist>
- <listitem>
- <para>You do not have a line in your kernel
- configuration file that reads:</para>
-
- <programlisting>makeoptions DEBUG=-g</programlisting>
- </listitem>
-
- <listitem>
- <para>You are not running &man.config.8; with
- the <option>-g</option> option.</para>
- </listitem>
- </itemizedlist>
-
- <para>Both of the above situations will cause your kernel to
- be built in debug mode. As long as you make sure you follow
- the steps above, you can build your kernel normally, and you
- should notice a fairly large size decrease; most kernels
- tend to be around 1.5MB to 2MB.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="multiport-serial-interrupts">
- <para>Why do I get interrupt conflicts with multi-port serial
- code?</para>
- </question>
-
- <answer>
- <para>When I compile a kernel
- with multi-port serial code, it tells me that only the first
- port is probed and the rest skipped due to interrupt conflicts.
- How do I fix this?</para>
-
- <para>The problem here is that
- FreeBSD has code built-in to keep the kernel from getting
- trashed due to hardware or software conflicts. The way to fix
- this is to leave out the IRQ settings on all but one port. Here
- is a example:</para>
-
- <programlisting>#
-# Multiport high-speed serial line - 16550 UARTS
-#
-device sio2 at isa? port 0x2a0 tty irq 5 flags 0x501 vector siointr
-device sio3 at isa? port 0x2a8 tty flags 0x501 vector siointr
-device sio4 at isa? port 0x2b0 tty flags 0x501 vector siointr
-device sio5 at isa? port 0x2b8 tty flags 0x501 vector siointr</programlisting>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="generic-kernel-build-failure">
- <para>Why does every kernel I try to build fail to compile, even
- GENERIC?</para>
- </question>
-
- <answer>
- <para>There are a number of possible causes for this problem.
- They are, in no particular order:</para>
-
- <itemizedlist>
- <listitem>
- <para>You are not using the new <command>make
- buildkernel</command> and <command>make
- installkernel</command> targets, and your source tree is
- different from the one used to build the currently running
- system (e.g., you are compiling 4.3-RELEASE on a 4.0-RELEASE
- system). If you are attempting an upgrade, please read the
- <filename>/usr/src/UPDATING</filename> file, paying
- particular attention to the <quote>COMMON ITEMS</quote>
- section at the end.</para>
- </listitem>
-
- <listitem>
- <para>You are using the new <command>make
- buildkernel</command> and <command>make
- installkernel</command> targets, but you failed to assert
- the completion of the <command>make buildworld</command>
- target. The <command>make buildkernel</command> target
- relies on files generated by the <command>make
- buildworld</command> target to complete its job
- correctly.</para>
- </listitem>
-
- <listitem>
- <para>Even if you are trying to build <link
- linkend="stable">FreeBSD-STABLE</link>, it is possible that
- you fetched the source tree at a time when it was either
- being modified, or broken for other reasons; only releases
- are absolutely guaranteed to be buildable, although <link
- linkend="stable">FreeBSD-STABLE</link> builds fine the
- majority of the time. If you have not already done so, try
- re-fetching the source tree and see if the problem goes
- away. Try using a different server in case the one you are
- using is having problems.</para>
- </listitem>
- </itemizedlist>
- </answer>
- </qandaentry>
- </qandaset>
- </chapter>
-
- <chapter id="admin">
- <title>System Administration</title>
-
- <qandaset>
- <qandaentry>
- <question id="startup-config-files">
- <para>Where are the system start-up configuration files?</para>
- </question>
-
- <answer>
-
- <para>From 2.0.5R to 2.2.1R, the primary configuration file is
- <filename>/etc/sysconfig</filename>. All the options are to be
- specified in this file and other files such as
- <filename>/etc/rc</filename> (see &man.rc.8;)
- and <filename>/etc/netstart</filename> just include it.</para>
-
- <para>Look in the <filename>/etc/sysconfig</filename> file and
- change the value to match your system. This file is filled with
- comments to show what to put in there.</para>
-
- <para>In post-2.2.1 and 3.0, <filename>/etc/sysconfig</filename>
- was renamed to a more self-describing &man.rc.conf.5;
- file and the syntax cleaned up a bit in the process.
- <filename>/etc/netstart</filename> was also renamed to
- <filename>/etc/rc.network</filename> so that all files could be
- copied with a
- <command>cp
- /usr/src/etc/rc* /etc</command> command.</para>
-
- <para>And, in 3.1 and later, <filename>/etc/rc.conf</filename>
- has been moved to <filename>/etc/defaults/rc.conf</filename>.
- <emphasis>Do not edit this file!</emphasis> Instead, if there
- is any entry in <filename>/etc/defaults/rc.conf</filename> that
- you want to change, you should copy the line into
- <filename>/etc/rc.conf</filename> and change it there.</para>
-
- <para>For example, if you wish to start named, the DNS server
- included with FreeBSD in FreeBSD 3.1 or later, all you need to
- do is:</para>
- <screen>&prompt.root; <userinput>echo named_enable="YES" &gt;&gt; /etc/rc.conf</userinput></screen>
-
- <para>To start up local services in FreeBSD 3.1 or later, place
- shell scripts in the <filename>/usr/local/etc/rc.d</filename>
- directory. These shell scripts should be set executable, and
- end with a .sh. In FreeBSD 3.0 and earlier releases, you should
- edit the <filename>/etc/rc.local</filename> file.</para>
-
- <para>The <filename>/etc/rc.serial</filename> is for serial port
- initialization (e.g. locking the port characteristics, and so
- on.).</para>
-
- <para>The <filename>/etc/rc.i386</filename> is for Intel-specifics
- settings, such as iBCS2 emulation or the PC system console
- configuration.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="adding-users">
- <para>How do I add a user easily?</para>
- </question>
-
- <answer>
- <para>Use the &man.adduser.8;
- command. For more complicated usage, the &man.pw.8;
- command.</para>
-
- <para>To remove the user again, use the &man.rmuser.8;
- command. Once again, &man.pw.8; will work as
- well.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="adding-disks">
- <para>How can I add my new hard disk to my FreeBSD system?</para>
- </question>
-
- <answer>
- <para>See the Disk Formatting Tutorial at <ulink
- URL="../../articles/formatting-media/">
- www.FreeBSD.org</ulink>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="removable-drives">
- <para>I have a new removable drive, how do I use it?</para>
- </question>
-
- <answer>
-
- <para>Whether it is a removable drive like a ZIP or an EZ drive
- (or even a floppy, if you want to use it that way), or a new
- hard disk, once it is installed and recognized by the system,
- and you have your cartridge/floppy/whatever slotted in, things
- are pretty much the same for all devices.</para>
-
- <para><anchor id="disklabel">(this section is based on <ulink
- URL="http://www.vmunix.com/mark/FreeBSD/ZIP-FAQ.html">
- Mark Mayo's ZIP FAQ</ulink>)</para>
-
- <para>If it is a ZIP drive or a floppy , you have already got a DOS
- filesystem on it, you can use a command like this:</para>
-
- <screen>&prompt.root; <userinput>mount -t msdos /dev/fd0c /floppy</userinput></screen>
-
- <para>if it is a floppy, or this:</para>
-
- <screen>&prompt.root; <userinput>mount -t msdos /dev/da2s4 /zip</userinput></screen>
-
- <para>for a ZIP disk with the factory configuration.</para>
-
- <para>For other disks, see how they are laid out using
- &man.fdisk.8; or
- &man.sysinstall.8;.</para>
-
- <para>The rest of the examples will be for a ZIP drive on da2,
- the third SCSI disk.</para>
-
- <para>Unless it is a floppy, or a removable you plan on sharing
- with other people, it is probably a better idea to stick a BSD
- file system on it. You will get long filename support, at least a
- 2X improvement in performance, and a lot more stability. First,
- you need to redo the DOS-level partitions/filesystems. You can
- either use &man.fdisk.8; or
- <filename>/stand/sysinstall</filename>, or for a small drive
- that you do not want to bother with multiple operating system
- support on, just blow away the whole FAT partition table
- (slices) and just use the BSD partitioning:</para>
-
- <screen>&prompt.root; <userinput>dd if=/dev/zero of=/dev/rda2 count=2</userinput>
-&prompt.root; <userinput>disklabel -Brw da2 auto</userinput></screen>
-
- <para>You can use disklabel or
- <filename>/stand/sysinstall</filename> to create multiple BSD
- partitions. You will certainly want to do this if you are adding
- swap space on a fixed disk, but it is probably irrelevant on a
- removable drive like a ZIP.</para>
-
- <para>Finally, create a new file system, this one is on our ZIP
- drive using the whole disk:</para>
-
- <screen>&prompt.root; <userinput>newfs /dev/rda2c</userinput></screen>
-
- <para>and mount it:</para>
-
- <screen>&prompt.root; <userinput>mount /dev/da2c /zip</userinput></screen>
-
- <para>and it is probably a good idea to add a line like this to
- <filename>/etc/fstab</filename> (see &man.fstab.5;) so you can just type
- <command>mount /zip</command> in the future:</para>
-
- <programlisting>/dev/da2c /zip ffs rw,noauto 0 0</programlisting>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="root-not-found-cron-errors">
- <para>Why do I keep getting messages like <errorname>root: not
- found</errorname> after editing my crontab file?</para>
- </question>
-
- <answer>
- <para>This is normally caused by editing the system crontab
- (<filename>/etc/crontab</filename>) and then using
- &man.crontab.1; to install it:</para>
-
- <screen>&prompt.root; <userinput>crontab /etc/crontab</userinput></screen>
-
- <para>This is not the correct way to do things. The system
- crontab has a different format to the per-user crontabs
- which &man.crontab.1; updates (the &man.crontab.5; manual
- page explains the differences in more detail).</para>
-
- <para>If this is what you did, the extra crontab is simply a
- copy of <filename>/etc/crontab</filename> in the wrong
- format it. Delete it with the command:</para>
-
- <screen>&prompt.root; <userinput>crontab -r</userinput></screen>
-
- <para>Next time, when you edit
- <filename>/etc/crontab</filename>, you should not do
- anything to inform &man.cron.8; of the changes, since it
- will notice them automatically.</para>
-
- <para>If you want something to be run once per day, week, or
- month, it is probably better to add shell scripts
- <filename>/usr/local/etc/periodic</filename>, and let the
- &man.periodic.8; command run from the system cron schedule
- it with the other periodic system tasks.</para>
-
- <para>The actual reason for the error is that the system
- crontab has an extra field, specifying which user to run the
- command as. In the default system crontab provided with
- FreeBSD, this is <username>root</username> for all entries.
- When this crontab is used as the <username>root</username>
- user's crontab (which is <emphasis>not</emphasis> the
- same as the system crontab), &man.cron.8; assumes the string
- <literal>root</literal> is the first word of the command to
- execute, but no such command exists.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="su-wheel-group">
- <para>Why do I get the error, <errorname>you are not in the correct
- group to su root</errorname> when I try to su to root?</para>
- </question>
-
- <answer>
- <para>This is a security feature. In order to su to
- <username>root</username> (or any other account with superuser
- privileges), you must be in the <groupname>wheel</groupname>
- group. If this feature were not there, anybody with an account
- on a system who also found out <username>root</username>'s
- password would be able to gain superuser level access to the
- system. With this feature, this is not strictly true;
- &man.su.1; will prevent them from even trying to enter the
- password if they are not in <groupname>wheel</groupname>.</para>
-
- <para>To allow someone to su to <username>root</username>, simply
- put them in the <groupname>wheel</groupname> group.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="rcconf-readonly">
- <para>I made a mistake in <filename>rc.conf</filename>,
- or another startup file, and
- now I cannot edit it because the filesystem is read-only.
- What should I do?</para>
- </question>
-
- <answer>
- <para>When you get the prompt to enter the shell
- pathname, simply press <literal>ENTER</literal>, and run
- <command>mount /</command> to re-mount the root filesystem in
- read/write mode. You may also need to run <command>mount -a -t
- ufs</command> to mount the filesystem where your favourite
- editor is defined. If your favourite editor is on a network
- filesystem, you will need to either configure the network
- manually before you can mount network filesystems, or use an
- editor which resides on a local filesystem, such as
- &man.ed.1;.</para>
-
- <para>If you intend to use a full screen editor such
- as &man.vi.1; or &man.emacs.1;, you may also need to
- run <command>export TERM=cons25</command> so that these
- editors can load the correct data from the &man.termcap.5;
- database.</para>
-
- <para>Once you have performed these steps, you can edit
- <filename>/etc/rc.conf</filename> as you usually would
- to fix the syntax error. The error message displayed
- immediately after the kernel boot messages should tell you
- the number of the line in the file which is at fault.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="mount-dos">
- <para>How do I mount a secondary DOS partition?</para>
- </question>
-
- <answer>
-
- <para>The secondary DOS partitions are found after ALL the primary
- partitions. For example, if you have an <quote>E</quote>
- partition as the second DOS partition on the second SCSI drive,
- you need to create the special files for <quote>slice 5</quote>
- in /dev, then mount /dev/da1s5:</para>
-
- <screen>&prompt.root; <userinput>cd /dev</userinput>
-&prompt.root; <userinput>sh MAKEDEV da1s5</userinput>
-&prompt.root; <userinput>mount -t msdos /dev/da1s5 /dos/e</userinput></screen>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="mount-foreign-fs">
- <para>Can I mount other foreign filesystems under FreeBSD?</para>
- </question>
-
- <answer>
- <variablelist>
- <varlistentry>
- <term>Digital UNIX</term>
-
- <listitem>
- <para>UFS CDROMs can be mounted directly on FreeBSD.
- Mounting disk partitions from Digital UNIX and other
- systems that support UFS may be more complex, depending
- on the details of the disk partitioning for the operating
- system in question.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Linux</term>
-
- <listitem>
- <para>As of 2.2, FreeBSD supports <literal>ext2fs</literal>
- partitions. See &man.mount.ext2fs.8; for more
- information.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>NT</term>
-
- <listitem>
- <para>A read-only NTFS driver exists for FreeBSD. For more
- information, see this tutorial by Mark Ovens at <ulink
- URL="http://ukug.uk.freebsd.org/~mark/ntfs_install.html">
- http://ukug.uk.freebsd.org/~mark/ntfs_install.html</ulink>.
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>Any other information on this subject would be
- appreciated.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="nt-bootloader">
- <para>How can I use the NT loader to boot FreeBSD?</para>
- </question>
-
- <answer>
- <para>This procedure is slightly different for 2.2.x and 3.x
- (with the 3-stage boot) systems.</para>
-
- <para>The general idea is that you copy the first sector of your
- native root FreeBSD partition into a file in the DOS/NT
- partition. Assuming you name that file something like
- <filename>c:\bootsect.bsd</filename> (inspired by
- <filename>c:\bootsect.dos</filename>), you can then edit the
- <filename>c:\boot.ini</filename> file to come up with something
- like this:</para>
-
- <programlisting>[boot loader]
-timeout=30
-default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
-[operating systems]
-multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows NT"
-C:\BOOTSECT.BSD="FreeBSD"
-C:\="DOS"</programlisting>
-
- <para>For 2.2.x systems this procedure assumes that DOS, NT,
- FreeBSD, or whatever have been installed into their respective
- fdisk partitions on the <emphasis>same</emphasis>
- disk. This example was tested on a system where DOS &amp; NT
- were on the first fdisk partition, and FreeBSD on the second.
- FreeBSD was also set up to boot from its native partition, not
- the disk's MBR.</para>
-
- <para>Mount a DOS-formatted floppy (if you have converted to NTFS)
- or the FAT partition, under, say,
- <filename>/mnt</filename>.</para>
-
- <screen>&prompt.root; <userinput>dd if=/dev/rda0a of=/mnt/bootsect.bsd bs=512 count=1</userinput></screen>
-
- <para>Reboot into DOS or NT. NTFS users copy the
- <filename>bootsect.bsd</filename> and/or the
- <filename>bootsect.lnx</filename> file from the floppy to
- <filename>C:\</filename>. Modify the attributes (permissions)
- on <filename>boot.ini</filename> with:</para>
-
- <screen><prompt>C:\&gt;</prompt> <userinput>attrib -s -r c:\boot.ini</userinput></screen>
-
- <para>Edit to add the appropriate entries from the example
- <filename>boot.ini</filename> above, and restore the
- attributes:</para>
-
- <screen><prompt>C:\&gt;</prompt> <userinput>attrib +s +r c:\boot.ini</userinput></screen>
-
- <para>If FreeBSD is booting from the MBR, restore it with the DOS
- <command>fdisk</command> command after you reconfigure them to
- boot from their native partitions.</para>
-
- <para>For FreeBSD 3.x systems the procedure is somewhat
- simpler.</para>
-
- <para>If FreeBSD is installed on the same disk as the NT boot
- partition simply copy <filename>/boot/boot1</filename> to
- <filename>C:\BOOTSECT.BSD</filename> However, if FreeBSD is
- installed on a different disk <filename>/boot/boot1</filename>
- will not work, <filename>/boot/boot0</filename> is needed.
-
- <warning>
- <para>DO NOT SIMPLY COPY <filename>/boot/boot0</filename>
- INSTEAD OF <filename>/boot/boot1</filename>, YOU WILL
- OVERWRITE YOUR PARTITION TABLE AND RENDER YOUR COMPUTER
- UN-BOOTABLE!</para>
- </warning>
-
- <filename>/boot/boot0</filename> needs to be installed using
- sysinstall by selecting the FreeBSD boot manager on the
- screen which asks if you wish to use a boot manager. This is
- because <filename>/boot/boot0</filename> has the partition
- table area filled with NULL characters but sysinstall copies
- the partition table before copying
- <filename>/boot/boot0</filename> to the MBR.</para>
-
- <para>When the FreeBSD boot manager runs it records the last
- OS booted by setting the active flag on the partition table
- entry for that OS and then writes the whole 512-bytes of itself
- back to the MBR so if you just copy
- <filename>/boot/boot0</filename> to
- <filename>C:\BOOTSECT.BSD</filename> then it writes an empty
- partition table, with the active flag set on one entry, to the
- MBR.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="lilo-bootloader">
- <para>How do I boot FreeBSD and Linux from LILO?</para>
- </question>
-
- <answer>
- <para>If you have FreeBSD and Linux on the same disk, just follow
- LILO's installation instructions for booting a non-Linux
- operating system. Very briefly, these are:</para>
-
- <para>Boot Linux, and add the following lines to
- <filename>/etc/lilo.conf</filename>:</para>
-
- <programlisting>other=/dev/hda2
- table=/dev/hda
- label=FreeBSD</programlisting>
-
- <para>(the above assumes that your FreeBSD slice is known to Linux
- as <devicename>/dev/hda2</devicename>; tailor to suit your setup).
- Then, run <command>lilo</command> as <username>root</username> and you should be
- done.</para>
-
- <para>If FreeBSD resides on another disk, you need to add
- <literal>loader=/boot/chain.b</literal> to the LILO entry.
- For example:</para>
-
- <programlisting>other=/dev/dab4
- table=/dev/dab
- loader=/boot/chain.b
- label=FreeBSD</programlisting>
-
- <para>In some cases you may need to specify the BIOS drive number
- to the FreeBSD boot loader to successfully boot off the second
- disk. For example, if your FreeBSD SCSI disk is probed by BIOS
- as BIOS disk 1, at the FreeBSD boot loader prompt you need to
- specify:</para>
-
- <screen>Boot: <userinput>1:da(0,a)/kernel</userinput></screen>
-
- <para>On FreeBSD 2.2.5 and later, you can configure
- &man.boot.8;
- to automatically do this for you at boot time.</para>
-
- <para>The <ulink
- URL="http://sunsite.unc.edu/LDP/HOWTO/mini/Linux+FreeBSD.html">
- Linux+FreeBSD mini-HOWTO</ulink> is a good reference for
- FreeBSD and Linux interoperability issues.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="booteasy-loader">
- <para>How do I boot FreeBSD and Linux using BootEasy?</para>
- </question>
-
- <answer>
- <para>Install LILO at the start of your Linux boot partition
- instead of in the Master Boot Record. You can then boot LILO
- from BootEasy.</para>
-
- <para>If you are running Windows-95 and Linux this is recommended
- anyway, to make it simpler to get Linux booting again if you
- should need to reinstall Windows95 (which is a Jealous
- Operating System, and will bear no other Operating Systems in
- the Master Boot Record).</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="dangerously-dedicated">
- <para>Will a <quote>dangerously dedicated</quote> disk endanger
- my health?</para>
- </question>
-
- <answer>
-
- <para><anchor id="dedicate">The installation procedure allows
- you to chose two different methods in partitioning your
- harddisk(s). The default way makes it compatible with other
- operating systems on the same machine, by using fdisk table
- entries (called <quote>slices</quote> in FreeBSD), with a
- FreeBSD slice that employs partitions of its own. Optionally,
- one can chose to install a boot-selector to switch between the
- possible operating systems on the disk(s). The alternative uses
- the entire disk for FreeBSD, and makes no attempt to be
- compatible with other operating systems.</para>
-
- <para>So why it is called <quote>dangerous</quote>? A disk in
- this mode does not contain what normal PC utilities would
- consider a valid fdisk table. Depending on how well they have
- been designed, they might complain at you once they are getting
- in contact with such a disk, or even worse, they might damage
- the BSD bootstrap without even asking or notifying you. In
- addition, the <quote>dangerously dedicated</quote> disk's
- layout is known to confuse many BIOSsen, including those from
- AWARD (eg. as found in HP Netserver and Micronics systems as
- well as many others) and Symbios/NCR (for the popular 53C8xx
- range of SCSI controllers). This is not a complete list, there
- are more. Symptoms of this confusion include the <errorname>read
- error</errorname> message printed by the FreeBSD bootstrap when it
- cannot find itself, as well as system lockups when
- booting.</para>
-
- <para>Why have this mode at all then? It only saves a few kbytes
- of disk space, and it can cause real problems for a new
- installation. <quote>Dangerously dedicated</quote> mode's
- origins lie in a desire to avoid one of the most common
- problems plaguing new FreeBSD installers - matching the BIOS
- <quote>geometry</quote> numbers for a disk to the disk
- itself.</para>
-
- <para><quote>Geometry</quote> is an outdated concept, but one
- still at the heart of the PC's BIOS and its interaction with
- disks. When the FreeBSD installer creates slices, it has to
- record the location of these slices on the disk in a fashion
- that corresponds with the way the BIOS expects to find them. If
- it gets it wrong, you will not be able to boot.</para>
-
- <para><quote>Dangerously dedicated</quote> mode tries to work
- around this by making the problem simpler. In some cases, it
- gets it right. But it is meant to be used as a last-ditch
- alternative - there are better ways to solve the problem 99
- times out of 100.</para>
-
- <para>So, how do you avoid the need for <quote>DD</quote> mode
- when you are installing? Start by making a note of the geometry
- that your BIOS claims to be using for your disks. You can
- arrange to have the kernel print this as it boots by specifying
- <option>-v</option> at the <literal>boot:</literal> prompt, or
- using <command>boot -v</command> in the loader. Just before the
- installer starts, the kernel will print a list of BIOS
- geometries. Do not panic - wait for the installer to start and
- then use scrollback to read the numbers. Typically the BIOS
- disk units will be in the same order that FreeBSD lists your
- disks, first IDE, then SCSI.</para>
-
- <para>When you are slicing up your disk, check that the disk
- geometry displayed in the FDISK screen is correct (ie. it
- matches the BIOS numbers); if it is wrong, use the
- <literal>g</literal> key to fix it. You may have to do this if
- there is absolutely nothing on the disk, or if the disk has been
- moved from another system. Note that this is only an issue with
- the disk that you are going to boot from; FreeBSD will sort
- itself out just fine with any other disks you may have.</para>
-
- <para>Once you have got the BIOS and FreeBSD agreeing about the
- geometry of the disk, your problems are almost guaranteed to be
- over, and with no need for <quote>DD</quote> mode at all. If,
- however, you are still greeted with the dreaded <errorname>read
- error</errorname> message when you try to boot, it is time to cross
- your fingers and go for it - there's nothing left to
- lose.</para>
-
- <para>To return a <quote>dangerously dedicated</quote> disk
- for normal PC use, there are basically two options. The first
- is, you write enough NULL bytes over the MBR to make any
- subsequent installation believe this to be a blank disk. You
- can do this for example with</para>
-
- <screen>&prompt.root; <userinput>dd if=/dev/zero of=/dev/rda0 count=15</userinput></screen>
-
- <para>Alternatively, the undocumented DOS
- <quote>feature</quote></para>
-
- <screen><prompt>C:\&gt;</prompt> <userinput>fdisk /mbr</userinput></screen>
-
- <para>will to install a new master boot record as well, thus
- clobbering the BSD bootstrap.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="add-swap-space">
- <para>How can I add more swap space?</para>
- </question>
-
- <answer>
-
- <para>The best way is to increase the size of your swap partition,
- or take advantage of this convenient excuse to add another
- disk. The general rule of thumb is to have around 2x the swap
- space as you have main memory. However, if you have a very
- small amount of main memory you may want to configure swap
- beyond that. It is also a good idea to configure sufficient
- swap relative to anticipated future memory upgrades so you do
- not have to futz with your swap configuration later.</para>
-
- <para>Adding swap onto a separate disk makes things faster than
- simply adding swap onto the same disk. As an example, if you
- are compiling source located on one disk, and the swap is on
- another disk, this is much faster than both swap and compile on
- the same disk. This is true for SCSI disks specifically.</para>
-
- <para>When you have several disks, configuring a swap partition on
- each one is usually beneficial, even if you wind up putting
- swap on a work disk. Typically, each fast disk in your system
- should have some swap configured. FreeBSD supports up to 4
- interleaved swap devices by default. When configuring multiple
- swap partitions you generally want to make them all about the
- same size, but people sometimes make their primary swap
- partition larger in order to accomodate a kernel core dump. Your
- primary swap partition must be at least as large as main memory
- in order to be able to accomodate a kernel core.</para>
-
- <para>IDE drives are not able to allow access to both drives on
- the same channel at the same time (FreeBSD does not support mode
- 4, so all IDE disk I/O is <quote>programmed</quote>).
- It is still suggested that you put your swap partition on a
- separate driver, however: the drives are so cheap, it is not
- worth worrying about.</para>
-
- <para>Swapping over NFS is only recommended if you do not have a
- local disk to swap to. Swapping over NFS is slow and
- inefficient in FreeBSD releases prior to 4.x, but reasonably
- fast in releases greater or equal to 4.0. Even so, it will be
- limited to the network bandwidth available and puts an
- additional burden on the NFS server.</para>
-
- <para>Here is an example for 64Mb vn-swap
- (<filename>/usr/swap0</filename>, though of course you can use
- any name that you want).</para>
-
- <para>Make sure your kernel was built with the line</para>
-
- <programlisting>pseudo-device vn 1 #Vnode driver (turns a file into a device)</programlisting>
-
- <para>in your config-file. The GENERIC kernel already contains
- this.</para>
-
- <orderedlist>
- <listitem>
- <para>create a vn-device</para>
- <screen>&prompt.root; <userinput>cd /dev</userinput>
-&prompt.root; <userinput>sh MAKEDEV vn0</userinput></screen>
- </listitem>
-
- <listitem>
- <para>create a swapfile (<filename>/usr/swap0</filename>)</para>
-
- <screen>&prompt.root; <userinput>dd if=/dev/zero of=/usr/swap0 bs=1024k count=64</userinput></screen>
- </listitem>
-
- <listitem>
- <para>set proper permissions on (<filename>/usr/swap0</filename>)</para>
-
- <screen>&prompt.root; <userinput>chmod 0600 /usr/swap0</userinput></screen>
- </listitem>
-
- <listitem>
- <para>enable the swap file in <filename>/etc/rc.conf</filename></para>
-
- <programlisting>swapfile="/usr/swap0" # Set to name of swapfile if aux swapfile desired.</programlisting>
- </listitem>
-
- <listitem>
- <para>reboot the machine</para>
- </listitem>
- </orderedlist>
-
- <para>To enable the swap file immediately, type</para>
-
- <screen>&prompt.root; <userinput>vnconfig -e /dev/vn0b /usr/swap0 swap</userinput></screen>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="printer-setup">
- <para>Why am I having trouble setting up my printer?</para>
- </question>
-
- <answer>
- <para>Please have a look at the Handbook entry on printing. It
- should cover most of your problem. See the <ulink
- URL="../handbook/printing.html">
- Handbook entry on printing</ulink>.</para>
-
- <para>Some printers require a host-based driver to do any kind of
- printing. These so-called <quote>WinPrinters</quote> are not
- natively supported by FreeBSD. If your printer does not work
- in DOS or Windows NT 4.0, it is probably a WinPrinter. Your
- only hope of getting one of these to work is to check if the
- <filename>ports/print/pnm2ppa</filename> port supports it.
- From <ulink
- url="http://www.freebsd.org/cgi/url.cgi?ports/print/pnm2ppa/pkg-descr">its
- package description</ulink>:</para>
-
- <blockquote>
- <para>This software creates output using the PPA (printer
- performance architecture) protocol. This protocol is used by
- some HP "Windows-only" printers, including the HP Deskjet
- 820C series, the HP DeskJet 720 series, and the HP DeskJet
- 1000 series. [...]</para>
-
- <para>WWW: <ulink
- url="http://pnm2ppa.sourceforge.net/">http://pnm2ppa.sourceforge.net/</ulink></para>
- </blockquote>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="keyboard-mappings">
- <para>How can I correct the keyboard mappings for my system?</para>
- </question>
-
- <answer>
- <para>The kbdcontrol program has an option to load a keyboard
- map file. Under <filename>/usr/share/syscons/keymaps</filename>
- are a number of map files. Choose the one relevant to your
- system and load it.</para>
-
- <screen>&prompt.root; <userinput>kbdcontrol -l uk.iso</userinput></screen>
-
- <para>Both the <filename>/usr/share/syscons/keymaps</filename>
- and the <filename>.kbd</filename> extension are assumed by
- &man.kbdcontrol.1;.</para>
-
- <para>This can be configured in <filename>/etc/sysconfig</filename>
- (or
- &man.rc.conf.5;). See the appropriate comments in this
- file.</para>
-
- <para>In 2.0.5R and later, everything related to text fonts,
- keyboard mapping is in
- <filename>/usr/share/examples/syscons</filename>.</para>
-
- <para>The following mappings are currently supported:</para>
-
- <itemizedlist>
- <listitem>
- <para>Belgian ISO-8859-1</para>
- </listitem>
-
- <listitem>
- <para>Brazilian 275 keyboard Codepage 850</para>
- </listitem>
-
- <listitem>
- <para>Brazilian 275 keyboard ISO-8859-1</para>
- </listitem>
-
- <listitem>
- <para>Danish Codepage 865</para>
- </listitem>
-
- <listitem>
- <para>Danish ISO-8859-1</para>
- </listitem>
-
- <listitem>
- <para>French ISO-8859-1</para>
- </listitem>
-
- <listitem>
- <para>German Codepage 850</para>
- </listitem>
-
- <listitem>
- <para>German ISO-8859-1</para>
- </listitem>
-
- <listitem>
- <para>Italian ISO-8859-1</para>
- </listitem>
-
- <listitem>
- <para>Japanese 106</para>
- </listitem>
-
- <listitem>
- <para>Japanese 106x</para>
- </listitem>
-
- <listitem>
- <para>Latin American</para>
- </listitem>
-
- <listitem>
- <para>Norwegian ISO-8859-1</para>
- </listitem>
-
- <listitem>
- <para>Polish ISO-8859-2 (programmer's)</para>
- </listitem>
-
- <listitem>
- <para>Russian Codepage 866 (alternative)</para>
- </listitem>
-
- <listitem>
- <para>Russian koi8-r (shift)</para>
- </listitem>
-
- <listitem>
- <para>Russian koi8-r</para>
- </listitem>
-
- <listitem>
- <para>Spanish ISO-8859-1</para>
- </listitem>
-
- <listitem>
- <para>Swedish Codepage 850</para>
- </listitem>
-
- <listitem>
- <para>Swedish ISO-8859-1</para>
- </listitem>
-
- <listitem>
- <para>Swiss-German ISO-8859-1</para>
- </listitem>
-
- <listitem>
- <para>United Kingdom Codepage 850</para>
- </listitem>
-
- <listitem>
- <para>United Kingdom ISO-8859-1</para>
- </listitem>
-
- <listitem>
- <para>United States of America ISO-8859-1</para>
- </listitem>
-
- <listitem>
- <para>United States of America dvorak</para>
- </listitem>
-
- <listitem>
- <para>United States of America dvorakx</para>
- </listitem>
- </itemizedlist>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="pnp-resources">
- <para>Why do I get messages like: <errorname>unknown: &lt;PNP0303&gt;
- can't assign resources</errorname> on boot?</para>
- </question>
-
- <answer>
- <para>The following is an excerpt from a post to the
- freebsd-current mailing list.</para>
-
- <blockquote>
- <attribution>&a.wollman;, 24 April 2001</attribution>
-
- <para>The <quote>can't assign resources</quote> messages
- indicate that the devices are legacy ISA devices for which a
- non-PnP-aware driver is compiled into the kernel. These
- include devices such as keyboard controllers, the
- programmable interrupt controller chip, and several other
- bits of standard infrastructure. The resources cannot be
- assigned because there is already a driver using those
- addresses.</para>
- </blockquote>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="user-quotas">
- <para>How come I cannot get user quotas to work properly?</para>
- </question>
-
- <answer>
-
- <orderedlist>
- <listitem>
- <para>Do not turn on quotas on <filename>/</filename>,</para>
- </listitem>
-
- <listitem>
- <para>Put the quota file on the file system that the quotas
- are to be enforced on. ie:</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <thead>
- <row>
- <entry>Filesystem</entry>
- <entry>Quota file</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry><filename>/usr</filename></entry>
- <entry><filename>/usr/admin/quotas</filename></entry>
- </row>
-
- <row>
- <entry><filename>/home</filename></entry>
- <entry><filename>/home/admin/quotas</filename></entry>
- </row>
-
- <row>
- <entry>&hellip;</entry>
- <entry>&hellip;</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </listitem>
- </orderedlist>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="inappropriate-ccd">
- <para>What is inappropriate about my ccd?</para>
- </question>
-
- <answer>
- <para>The symptom of this is:</para>
-
- <screen>&prompt.root; <userinput>ccdconfig -C</userinput>
-ccdconfig: ioctl (CCDIOCSET): /dev/ccd0c: Inappropriate file type or format</screen>
-
- <para>This usually happens when you are trying to concatenate
- the <literal>c</literal> partitions, which default to type
- <literal>unused</literal>. The ccd driver requires the
- underlying partition type to be FS_BSDFFS. Edit the disklabel
- of the disks you are trying to concatenate and change the types
- of partitions to <literal>4.2BSD</literal>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ccd-disklabel">
- <para>Why can't I edit the disklabel on my ccd?</para>
- </question>
-
- <answer>
- <para>The symptom of this is:</para>
-
- <screen>&prompt.root; <userinput>disklabel ccd0</userinput>
-(it prints something sensible here, so let's try to edit it)
-&prompt.root; <userinput>disklabel -e ccd0</userinput>
-(edit, save, quit)
-disklabel: ioctl DIOCWDINFO: No disk label on disk;
-use "disklabel -r" to install initial label</screen>
-
- <para>This is because the disklabel returned by ccd is actually
- a <quote>fake</quote> one that is not really on the disk.
- You can solve this problem by writing it back explicitly,
- as in:</para>
-
- <screen>&prompt.root; <userinput>disklabel ccd0 &gt; /tmp/disklabel.tmp</userinput>
-&prompt.root; <userinput>disklabel -Rr ccd0 /tmp/disklabel.tmp</userinput>
-&prompt.root; <userinput>disklabel -e ccd0</userinput>
-(this will work now)</screen>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="sysv-ipc">
- <para>Does FreeBSD support System V IPC primitives?</para>
- </question>
-
- <answer>
- <para>Yes, FreeBSD supports System V-style IPC. This includes
- shared memory, messages and semaphores. You need to add the
- following lines to your kernel config to enable them.</para>
-
- <programlisting>options SYSVSHM # enable shared memory
-options SYSVSEM # enable for semaphores
-options SYSVMSG # enable for messaging</programlisting>
-
- <note>
- <para>In FreeBSD 3.2 and later, these options are already
- part of the <emphasis>GENERIC</emphasis> kernel, which
- means they should already be compiled into your
- system.</para>
- </note>
-
- <para>Recompile and install your kernel.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="uucpmail">
- <para>How do I use sendmail for mail delivery with UUCP?</para>
- </question>
-
- <answer>
-
- <para>The sendmail configuration that ships with FreeBSD is
- suited for sites that connect directly to the Internet.
- Sites that wish to exchange their mail via UUCP must install
- another sendmail configuration file.</para>
-
- <para>Tweaking <filename>/etc/sendmail.cf</filename> manually is
- considered something for purists. Sendmail version 8 comes with
- a new approach of generating config files via some
- &man.m4.1;
- preprocessing, where the actual hand-crafted configuration is
- on a higher abstraction level. You should use the configuration
- files under
- <filename>/usr/src/usr.sbin/sendmail/cf</filename></para>
-
- <para>If you did not install your system with full sources,
- the sendmail config stuff has been broken out into a separate
- source distribution tarball just for you. Assuming you have got
- your CDROM mounted, do:</para>
-
- <screen>&prompt.root; <userinput>cd /cdrom/src</userinput>
-&prompt.root; <userinput>cat scontrib.?? | tar xzf - -C /usr/src contrib/sendmail</userinput></screen>
-
- <para>Do not panic, this is only a few hundred kilobytes in size.
- The file <filename>README</filename> in the
- <filename>cf</filename> directory can serve as a basic
- introduction to m4 configuration.</para>
-
- <para>For UUCP delivery, you are best advised to use the
- <literal>mailertable</literal> feature. This constitutes a
- database that sendmail can use to base its routing decision
- upon.</para>
-
- <para>First, you have to create your <filename>.mc</filename>
- file. The directory
- <filename>/usr/src/usr.sbin/sendmail/cf/cf</filename> is the
- home of these files. Look around, there are already a few
- examples. Assuming you have named your file
- <filename>foo.mc</filename>, all you need to do in order to
- convert it into a valid <filename>sendmail.cf</filename>
- is:</para>
-
- <screen>&prompt.root; <userinput>cd /usr/src/usr.sbin/sendmail/cf/cf</userinput>
-&prompt.root; <userinput>make foo.cf</userinput>
-&prompt.root; <userinput>cp foo.cf /etc/sendmail.cf</userinput></screen>
-
- <para>A typical <filename>.mc</filename> file might look
- like:</para>
-
-
- <programlisting>include(`../m4/cf.m4')
-VERSIONID(`<replaceable>Your version number</replaceable>')
-OSTYPE(bsd4.4)
-
-FEATURE(nodns)
-FEATURE(nocanonify)
-FEATURE(mailertable)
-
-define(`UUCP_RELAY', <replaceable>your.uucp.relay</replaceable>)
-define(`UUCP_MAX_SIZE', 200000)
-
-MAILER(local)
-MAILER(smtp)
-MAILER(uucp)
-
-Cw <replaceable>your.alias.host.name</replaceable>
-Cw <replaceable>youruucpnodename.UUCP</replaceable></programlisting>
-
- <para>The <literal>nodns</literal> and
- <literal>nocanonify</literal> features will prevent any usage
- of the DNS during mail delivery. The
- <literal>UUCP_RELAY</literal> clause is needed for bizarre
- reasons, do not ask. Simply put an Internet hostname there that
- is able to handle .UUCP pseudo-domain addresses; most likely,
- you will enter the mail relay of your ISP there.</para>
-
- <para>Once you have got this, you need this file called
- <filename>/etc/mailertable</filename>. A typical example of
- this gender again:</para>
-
- <programlisting>#
-# makemap hash /etc/mailertable.db &lt; /etc/mailertable
-#
-horus.interface-business.de uucp-dom:horus
-.interface-business.de uucp-dom:if-bus
-interface-business.de uucp-dom:if-bus
-.heep.sax.de smtp8:%1
-horus.UUCP uucp-dom:horus
-if-bus.UUCP uucp-dom:if-bus
-. uucp-dom:</programlisting>
-
-
- <para>As you can see, this is part of a real-life file. The
- first three lines handle special cases where domain-addressed
- mail should not be sent out to the default route, but instead
- to some UUCP neighbor in order to <quote>shortcut</quote> the
- delivery path. The next line handles mail to the local Ethernet
- domain that can be delivered using SMTP. Finally, the UUCP
- neighbors are mentioned in the .UUCP pseudo-domain notation, to
- allow for a <literal><replaceable>uucp-neighbor
- </replaceable>!<replaceable>recipient</replaceable></literal>
- override of the default rules. The last line is always a single
- dot, matching everything else, with UUCP delivery to a UUCP
- neighbor that serves as your universal mail gateway to the
- world. All of the node names behind the
- <literal>uucp-dom:</literal> keyword must be valid UUCP
- neighbors, as you can verify using the command
- <literal>uuname</literal>.</para>
-
- <para>As a reminder that this file needs to be converted into a
- DBM database file before being usable, the command line to
- accomplish this is best placed as a comment at the top of
- the mailertable. You always have to execute this command
- each time you change your mailertable.</para>
-
- <para>Final hint: if you are uncertain whether some particular
- mail routing would work, remember the <option>-bt</option>
- option to sendmail. It starts sendmail in <emphasis>address
- test mode</emphasis>; simply enter <literal>0</literal>,
- followed by the address you wish to test for the mail routing.
- The last line tells you the used internal mail agent, the
- destination host this agent will be called with, and the
- (possibly translated) address. Leave this mode by typing
- Control-D.</para>
-
- <screen>&prompt.user; <userinput>sendmail -bt</userinput>
-ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
-Enter &lt;ruleset&gt; &lt;address&gt;
-<prompt>&gt;</prompt> <userinput>0 foo@interface-business.de</userinput>
-rewrite: ruleset 0 input: foo @ interface-business . de
-...
-rewrite: ruleset 0 returns: $# uucp-dom $@ if-bus $: foo \
-&lt; @ interface-business . de &gt;
-<prompt>&gt;</prompt> <userinput>^D</userinput></screen>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ispmail">
- <para>How do I set up mail with a dialup connection to the
- 'net?</para>
- </question>
-
- <answer>
- <para>If you have got a statically assigned IP number, you should
- not need to adjust anything from the default. Set your host
- name up as your assigned Internet name and sendmail will do
- the rest.</para>
-
- <para>If you have got a dynamically assigned IP number and use a
- dialup <application>ppp</application> connection to the
- Internet, you will probably be given a mailbox on your ISPs
- mail server. Lets assume your ISPs domain is
- <hostid role="domainname">myISP.com</hostid>, and that your user name is
- <username>user</username>. Lets also assume you have
- called your machine <hostid role="fqdn">bsd.home</hostid> and that your
- ISP has told you that you may use
- <hostid role="fqdn">relay.myISP.com</hostid> as a mail relay.</para>
-
- <para>In order to retrieve mail from your mailbox, you will need
- to install a retrieval agent. <application>Fetchmail</application> is a good choice as it supports
- many different protocols. Usually, POP3 will be provided by
- your ISP. If you have chosen to use user-ppp, you can
- automatically fetch your mail when a connection to the 'net is
- established with the following entry in
- <filename>/etc/ppp/ppp.linkup</filename>:</para>
-
- <programlisting>MYADDR:
- !bg su user -c fetchmail</programlisting>
-
- <para>If you are using <application>sendmail</application>
- (as shown below) to deliver mail to non-local accounts, put
- the command</para>
-
- <programlisting> !bg su user -c "sendmail -q"</programlisting>
-
- <para>after the above shown entry. This forces <application>sendmail</application> to
- process your mailqueue as soon as the connection to the 'net
- is established.</para>
-
- <para>I am assuming that you have an account for
- <username>user</username> on
- <hostid role="fqdn">bsd.home</hostid>. In the home directory of
- <username>user</username> on
- <hostid role="fqdn">bsd.home</hostid>, create a
- <filename>.fetchmailrc</filename> file:</para>
-
- <programlisting>poll myISP.com protocol pop3 fetchall pass MySecret</programlisting>
-
- <para>Needless to say, this file should not be readable by
- anyone except <username>user</username> as it contains
- the password <literal>MySecret</literal>.</para>
-
- <para>In order to send mail with the correct
- <literal>from:</literal> header, you must tell
- <application>sendmail</application> to use <literal>user@myISP.com</literal> rather than
- <literal>user@bsd.home</literal>. You may also wish to tell
- <application>sendmail</application> to send all mail via
- <hostid role="fqdn">relay.myISP.com</hostid>, allowing quicker mail
- transmission.</para>
-
- <para>The following <filename>.mc</filename> file should
- suffice:</para>
-
- <programlisting>VERSIONID(`bsd.home.mc version 1.0')
-OSTYPE(bsd4.4)dnl
-FEATURE(nouucp)dnl
-MAILER(local)dnl
-MAILER(smtp)dnl
-Cwlocalhost
-Cwbsd.home
-MASQUERADE_AS(`myISP.com')dnl
-FEATURE(allmasquerade)dnl
-FEATURE(masquerade_envelope)dnl
-FEATURE(nocanonify)dnl
-FEATURE(nodns)dnl
-define(`SMART_HOST', `relay.myISP.com')
-Dmbsd.home
-define(`confDOMAIN_NAME',`bsd.home')dnl
-define(`confDELIVERY_MODE',`deferred')dnl</programlisting>
-
- <para>Refer to the previous section for details of how to turn
- this <filename>.mc</filename> file into a
- <filename>sendmail.cf</filename> file. Also, don't forget to
- restart <application>sendmail</application> after updating <filename>sendmail.cf</filename>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="toor-account">
- <para>What is this UID 0 <username>toor</username> account? Have I
- been compromised?</para>
- </question>
-
- <answer>
- <para>Do not worry. <username>toor</username> is an
- <quote>alternative</quote> superuser account (toor is root
- spelt backwards). Previously it was created when the
- &man.bash.1; shell was installed but now it is created by
- default. It is intended to be used with a non-standard shell so
- you do not have to change <username>root</username>'s default
- shell. This is important as shells which are not part of the
- base distribution (for example a shell installed from ports or
- packages) are likely be to be installed in
- <filename>/usr/local/bin</filename> which, by default, resides
- on a different filesystem. If <username>root</username>'s shell
- is located in <filename>/usr/local/bin</filename> and
- <filename>/usr</filename> (or whatever filesystem contains
- <filename>/usr/local/bin</filename>) is not mounted for some
- reason, <username>root</username> will not be able to log in to
- fix a problem (although if you reboot into single user mode
- you will be prompted for the path to a shell).</para>
-
- <para>Some people use <username>toor</username> for
- day-to-day root tasks with a non-standard shell, leaving
- <username>root</username>, with a standard shell, for
- single user mode or emergencies. By default you cannot log
- in using <username>toor</username> as it does not have a
- password, so log in as <username>root</username> and set a password for
- <username>toor</username> if you want to use it.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="forgot-root-pw">
- <para>I have forgotten the root password! What do I do?</para>
- </question><answer>
-
- <para>Do not Panic! Simply restart the system, type
- <userinput>boot -s</userinput> at the Boot: prompt (just
- <userinput>-s</userinput> for FreeBSD releases before 3.2) to
- enter Single User mode. At the question about the shell to use,
- hit ENTER. You will be dropped to a &prompt.root; prompt. Enter
- <command>mount -u /</command> to remount your root filesystem
- read/write, then run <command>mount -a</command> to remount all
- the filesystems. Run <command>passwd root</command> to change
- the root password then run &man.exit.1; to continue
- booting.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="CAD-reboot">
- <para>How do I keep Control-Alt-Delete from rebooting the
- system?</para>
- </question>
-
- <answer>
-
- <para>If you are using syscons (the default console driver)
- in FreeBSD 2.2.7-RELEASE or later,
- build and install a new kernel with the line</para>
-
- <programlisting>options SC_DISABLE_REBOOT</programlisting>
-
- <para>in the configuration file. If you use the PCVT console
- driver in FreeBSD 2.2.5-RELEASE or later, use the following
- kernel configuration line instead:</para>
-
- <programlisting>options PCVT_CTRL_ALT_DEL</programlisting>
-
- <para>For older versions of FreeBSD, edit the keymap you are
- using for the console and replace the <literal>boot</literal>
- keywords with <literal>nop</literal>. The default keymap is
- <filename>/usr/share/syscons/keymaps/us.iso.kbd</filename>. You
- may have to instruct <filename>/etc/rc.conf</filename> to load
- this keymap explicitly for the change to take effect. Of course
- if you are using an alternate keymap for your country, you
- should edit that one instead.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="dos-to-unix-txt">
- <para>How do I reformat DOS text files to Unix ones?</para>
- </question>
-
- <answer>
-
- <para>Simply use this perl command:</para>
-
- <screen>&prompt.user; <userinput>perl -i.bak -npe 's/\r\n/\n/g' file ...</userinput></screen>
-
- <para>file is the file(s) to process. The modification is done
- in-place, with the original file stored with a .bak
- extension.</para>
-
- <para>Alternatively you can use the
- &man.tr.1;
- command:</para>
-
- <screen>&prompt.user; <userinput>tr -d '\r' &lt; <replaceable>dos-text-file</replaceable> &gt; <replaceable>unix-file</replaceable></userinput></screen>
-
- <para><replaceable>dos-text-file</replaceable> is the file
- containing DOS text while <replaceable>unix-file</replaceable>
- will contain the converted output. This can be quite a bit
- faster than using perl.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="kill-by-name">
- <para>How do I kill processes by name?</para>
- </question><answer>
-
- <para>Use &man.killall.1;.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="root-acl">
- <para>Why is su bugging me about not being in
- <username>root</username>'s ACL?</para>
- </question>
-
- <answer>
-
- <para>The error comes from the Kerberos distributed
- authentication system. The problem is not fatal but annoying.
- You can either run su with the -K option, or uninstall
- Kerberos as described in the next question.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="uninstall-kerberos">
- <para>How do I uninstall Kerberos?</para>
- </question>
-
- <answer>
-
- <para>To remove Kerberos from the system, reinstall the bin
- distribution for the release you are running. If you have
- the CDROM, you can mount the cd (we will assume on /cdrom)
- and run</para>
-
- <screen>&prompt.root; <userinput>cd /cdrom/bin</userinput>
-&prompt.root; <userinput>./install.sh</userinput></screen>
-
- <para>Alternately, you can remove all "MAKE_KERBEROS"
- options from <filename>/etc/make.conf</filename> and rebuild
- world.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="add-pty">
- <para>How do I add pseudoterminals to the system?</para>
- </question>
-
- <answer>
-
- <para>If you have lots of telnet, ssh, X, or screen users,
- you will probably run out of pseudoterminals. Here is how to
- add more:</para>
-
- <procedure>
- <step>
- <para>Build and install a new kernel with the line</para>
-
- <programlisting>pseudo-device pty 256</programlisting>
-
- <para>in the configuration file.</para>
- </step>
-
- <step>
- <para>Run the commands</para>
-
- <screen>&prompt.root; <userinput>cd /dev</userinput>
-&prompt.root; <userinput>sh MAKEDEV pty{1,2,3,4,5,6,7}</userinput></screen>
-
- <para>to make 256 device nodes for the new terminals.</para>
-
- </step>
-
- <step>
- <para>Edit <filename>/etc/ttys</filename> and add lines
- for each of the 256 terminals. They should match the form
- of the existing entries, i.e. they look like</para>
-
- <programlisting>ttyqc none network</programlisting>
-
- <para>The order of the letter designations is
- <literal>tty[pqrsPQRS][0-9a-v]</literal>, using a
- regular expression. </para>
- </step>
-
- <step>
- <para>Reboot the system with the new kernel and you are
- ready to go.</para>
- </step>
- </procedure>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="create-snd0">
- <para>How come I cannot create the snd0 device?</para>
- </question>
-
- <answer>
- <para>There is no <devicename>snd</devicename> device. The name
- is used as a shorthand for the various devices that make up the
- FreeBSD sound driver, such as <devicename>mixer</devicename>,
- <devicename>sequencer</devicename>, and
- <devicename>dsp</devicename>.</para>
-
- <para>To create these devices you should</para>
-
- <screen>&prompt.root; <userinput>cd /dev</userinput>
-&prompt.root; <userinput>sh MAKEDEV snd0</userinput></screen>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="reread-rc">
- <para>How do I re-read <filename>/etc/rc.conf</filename> and re-start <filename>/etc/rc</filename> without
- a reboot?</para>
- </question>
-
- <answer>
-
- <para>Go into single user mode and then back to multi user
- mode.</para>
-
- <para>On the console do:</para>
-
- <screen>&prompt.root; <userinput>shutdown now</userinput>
-(Note: without -r or -h)
-
-&prompt.root; <userinput>return</userinput>
-&prompt.root; <userinput>exit</userinput></screen>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="sandbox">
- <para>What is a sandbox?</para>
- </question><answer>
-
- <para><quote>Sandbox</quote> is a security term. It can mean
- two things:</para>
-
- <itemizedlist>
- <listitem>
-
- <para>A process which is placed inside a set of virtual
- walls that are designed to prevent someone who breaks
- into the process from being able to break into the wider
- system.</para>
-
- <para>The process is said to be able to
- <quote>play</quote> inside the walls. That is,
- nothing the process does in regards to executing code is
- supposed to be able to breech the walls so you do not
- have to do a detailed audit of its code to be able to
- say certain things about its security.</para>
-
- <para>The walls might be a userid, for example. This is
- the definition used in the security and named man
- pages.</para>
-
- <para>Take the <literal>ntalk</literal> service, for
- example (see /etc/inetd.conf). This service used to run
- as userid root. Now it runs as userid tty. The tty user
- is a sandbox designed to make it more difficult for
- someone who has successfully hacked into the system via
- ntalk from being able to hack beyond that user id.</para>
- </listitem>
-
- <listitem>
-
- <para>A process which is placed inside a simulation of the
- machine. This is more hard-core. Basically it means that
- someone who is able to break into the process may believe
- that he can break into the wider machine but is, in fact,
- only breaking into a simulation of that machine and not
- modifying any real data.</para>
-
- <para>The most common way to accomplish this is to build a
- simulated environment in a subdirectory and then run the
- processes in that directory chroot'd (i.e.
- <filename>/</filename> for that process is this
- directory, not the real <filename>/</filename> of the
- system).</para>
-
- <para>Another common use is to mount an underlying
- filesystem read-only and then create a filesystem layer
- on top of it that gives a process a seemingly writeable
- view into that filesystem. The process may believe it is
- able to write to those files, but only the process sees
- the effects - other processes in the system do not,
- necessarily.</para>
-
- <para>An attempt is made to make this sort of sandbox so
- transparent that the user (or hacker) does not realize
- that he is sitting in it.</para>
- </listitem>
- </itemizedlist>
-
- <para>Unix implements two core sandboxes. One is at the
- process level, and one is at the userid level.</para>
-
- <para>Every Unix process is completely firewalled off from every
- other Unix process. One process cannot modify the address
- space of another. This is unlike Windows where a process
- can easily overwrite the address space of any other, leading
- to a crash.</para>
-
- <para>A Unix process is owned by a particular userid. If the
- userid is not the <username>root</username> user, it serves to firewall the process
- off from processes owned by other users. The userid is also
- used to firewall off on-disk data.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="securelevel">
- <para>What is securelevel?</para>
- </question>
-
- <answer>
- <para>The securelevel is a security mechanism implemented in the
- kernel. Basically, when the securelevel is positive, the
- kernel restricts certain tasks; not even the superuser (i.e.,
- <username>root</username>) is allowed to do them. At the time
- of this writing, the securelevel mechanism is capable of, among
- other things, limiting the ability to,</para>
-
- <itemizedlist>
- <listitem>
- <para>unset certain file flags, such as
- <literal>schg</literal> (the system immutable flag),</para>
- </listitem>
-
- <listitem>
- <para>write to kernel memory via
- <devicename>/dev/mem</devicename> and
- <devicename>/dev/kmem</devicename>,</para>
- </listitem>
-
- <listitem>
- <para>load kernel modules, and</para>
- </listitem>
-
- <listitem>
- <para>alter &man.ipfirewall.4; rules.</para>
- </listitem>
- </itemizedlist>
-
- <para>To check the status of the securelevel on a running system,
- simply execute the following command:</para>
-
- <screen>&prompt.root; <userinput>sysctl kern.securelevel</userinput></screen>
-
- <para>The output will contain the name of the &man.sysctl.8;
- variable (in this case, <varname>kern.securelevel</varname>)
- and a number. The latter is the current value of the
- securelevel. If it is positive (i.e., greater than 0), at
- least some of the securelevel's protections are enabled.</para>
-
- <para>You cannot lower the securelevel of a running system; being
- able to do that would defeat its purpose. If you need to do a
- task that requires that the securelevel be non-positive (e.g.,
- an <maketarget>installworld</maketarget> or changing the date),
- you will have to change the securelevel setting in
- <filename>/etc/rc.conf</filename> (you want to look for the
- <varname>kern_securelevel</varname> and
- <varname>kern_securelevel_enable</varname> variables) and
- reboot.</para>
-
- <para>For more information on securelevel and the specific things
- all the levels do, please consult the &man.init.8; manual
- page.</para>
-
- <warning>
- <para>Securelevel is not a silver bullet; it has many known
- deficiencies. More often than not, it provides a false
- sense of security.</para>
-
- <para>One of its biggest problems is that in order for it to
- be at all effective, all files used in the boot process up
- until the securelevel is set must be protected. If an
- attacker can get the system to execute their code prior to
- the securelevel being set (which happens quite late in the
- boot process since some things the system must do at
- start-up cannot be done at an elevated securelevel), its
- protections are invalidated. While this task of protecting
- all files used in the boot process is not technically
- impossible, if it is achieved, system maintenance will
- become a nightmare since one would have to take the system
- down, at least to single-user mode, to modify a
- configuration file.</para>
-
- <para>This point and others are often discussed on the
- mailing lists, particularly freebsd-security. Please search
- the archives <ulink
- url="http://www.FreeBSD.org/search/">here</ulink> for an
- extensive discussion. Some people are hopeful that
- securelevel will soon go away in favor of a more
- fine-grained mechanism, but things are still hazy in this
- respect.</para>
-
- <para>Consider yourself warned.</para>
- </warning>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="user-floppymount">
- <para>How do I let ordinary users mount floppies, CDROMs and other removable
- media?</para>
- </question>
-
- <answer>
- <para>Ordinary users can be permitted to mount devices. Here is
- how:</para>
-
- <procedure>
- <step>
- <para>As <username>root</username> set the sysctl variable
- <varname>vfs.usermount</varname> to
- <literal>1</literal>.</para>
-
- <screen>&prompt.root; <userinput>sysctl -w vfs.usermount=1</userinput></screen>
- </step>
-
- <step>
- <para>As <username>root</username> assign the appropriate
- permissions to the block device associated with the
- removable media.</para>
-
- <para>For example, to allow users to mount the first floppy
- drive, use:</para>
-
- <screen>&prompt.root; <userinput>chmod 666 /dev/fd0</userinput></screen>
-
- <para>To allow users in the group
- <groupname>operator</groupname> to mount the CDROM drive,
- use:</para>
-
- <screen>&prompt.root; <userinput>chgrp operator /dev/cd0c</userinput>
-&prompt.root; <userinput>chmod 640 /dev/cd0c</userinput></screen>
- </step>
-
- <step>
- <para>Finally, add the line
- <literal><varname>vfs.usermount</varname>=1</literal> to the file
- <filename>/etc/sysctl.conf</filename> so that it is reset
- at system boot time.</para>
- </step>
- </procedure>
-
- <para>All users can now mount the floppy
- <devicename>/dev/fd0</devicename> onto a directory that they
- own:</para>
-
- <screen>&prompt.user; <userinput>mkdir ~/my-mount-point</userinput>
-&prompt.user; <userinput>mount -t msdos /dev/fd0 ~/my-mount-point</userinput></screen>
-
- <para>Users in group <groupname>operator</groupname> can now
- mount the CDROM <devicename>/dev/cd0c</devicename> onto a
- directory that they own:</para>
-
- <screen>&prompt.user; <userinput>mkdir ~/my-mount-point</userinput>
-&prompt.user; <userinput>mount -t msdos /dev/cd0c ~/my-mount-point</userinput></screen>
-
- <para>Unmounting the device is simple:</para>
-
- <screen>&prompt.user; <userinput>umount <filename>~/my-mount-point</></userinput></screen>
-
- <para>Enabling <varname>vfs.usermount</varname>, however, has
- negative security implications. A better way to access MSDOS
- formatted media is to use the <ulink
- URL="http://www.freebsd.org/cgi/ports.cgi?query=%5Emtools-&amp;stype=name">mtools</ulink> package in the ports collection.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="new-huge-disk">
- <para>How do I move my system over to my huge new disk?</para>
- </question>
-
- <answer>
- <para>The best way is to reinstall the OS on the new
- disk, then move the user data over. This is highly
- recommended if you have been tracking -stable for more
- than one release, or have updated a release instead of
- installing a new one. You can install booteasy on both
- disks with &man.boot0cfg.8;, and dual boot them until
- you are happy with the new configuration. Skip the
- next paragraph to find out how to move the data after
- doing this.</para>
-
- <para>Should you decide not to do a fresh install, you
- need to partition and label the new disk with either
- <filename>/stand/sysinstall</filename>, or &man.fdisk.8;
- and &man.disklabel.8;. You should also install booteasy
- on both disks with &man.boot0cfg.8;, so that you can
- dual boot to the old or new system after the copying
- is done. See the <ulink
- url="http://www.freebsd.org/tutorials/formatting-media/index.html">
- formatting-media tutorial</ulink> for details on this
- process.</para>
-
- <para>Now you have the new disk set up, and are ready
- to move the data. Unfortunately, you cannot just blindly
- copy the data. Things like device files (in
- <filename>/dev</filename>), flags, and links tend to
- screw that up. You need to use tools that understand
- these things, which means &man.dump.8;.
- Although it is suggested that you move the data in single user
- mode, it is not required.</para>
-
- <para>You should never use anything but &man.dump.8; and
- &man.restore.8; to move the root file system. The
- &man.tar.1; command may work - then again, it may not.
- You should also use &man.dump.8; and &man.restore.8;
- if you are moving a single partition to another empty
- partition. The sequence of steps to use dump to move
- a partitions data to a new partition is:</para>
-
- <procedure>
- <step>
- <para>newfs the new partition.</para>
- </step>
-
- <step>
- <para>mount it on a temporary mount point.</para>
- </step>
-
- <step>
- <para>cd to that directory.</para>
- </step>
-
- <step>
- <para>dump the old partition, piping output to the
- new one.</para>
- </step>
- </procedure>
-
- <para>For example, if you are going to move root to
- <devicename>/dev/ad1s1a</devicename>, with
- <filename>/mnt</filename> as the temporary mount point,
- it is:</para>
-
- <screen>&prompt.root; <userinput>newfs /dev/ad1s1a</userinput>
-&prompt.root; <userinput>mount /dev/ad1s1a /mnt</userinput>
-&prompt.root; <userinput>cd /mnt</userinput>
-&prompt.root; <userinput>dump 0af - / | restore xf -</userinput></screen>
-
- <para>Rearranging your partitions with dump takes a bit more
- work. To merge a partition like <filename>/var</filename>
- into it's parent, create the new partition large enough
- for both, move the parent partition as described above,
- then move the child partition into the empty directory
- that the first move created:</para>
-
- <screen>&prompt.root; <userinput>newfs /dev/ad1s1a</userinput>
-&prompt.root; <userinput>mount /dev/ad1s1a /mnt</userinput>
-&prompt.root; <userinput>cd /mnt</userinput>
-&prompt.root; <userinput>dump 0af - / | restore xf -</userinput>
-&prompt.root; <userinput>cd var</userinput>
-&prompt.root; <userinput>dump 0af - /var | restore xf -</userinput></screen>
-
- <para>To split a directory from it's parent, say putting
- <filename>/var</filename> on it's own partition when it wasn't
- before, create both partitions, then mount the child partition
- on the approriate directory in the temporary mount point, then
- move the old single partition:</para>
-
- <screen>&prompt.root; <userinput>newfs /dev/ad1s1a</userinput>
-&prompt.root; <userinput>newfs /dev/ad1s1d</userinput>
-&prompt.root; <userinput>mount /dev/ad1s1a /mnt</userinput>
-&prompt.root; <userinput>mkdir /mnt/var</userinput>
-&prompt.root; <userinput>mount /dev/ad1s1d /mnt/var</userinput>
-&prompt.root; <userinput>cd /mnt</userinput>
-&prompt.root; <userinput>dump 0af - / | restore xf -</userinput></screen>
-
- <para>You might prefer &man.cpio.1;, &man.pax.1;,
- &man.tar.1; to &man.dump.8; for user data. At the time of
- this writing, these are known to lose file flag information,
- so use them with caution.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="release-candidate">
- <para>I tried to update my system to the latest -STABLE, but
- got -RC or -BETA! What is going on?</para>
- </question>
-
- <answer>
- <para>Short answer: it is just a name. RC stands for
- <quote>Release Candidate</quote>. It signifies that a
- release is imminent. In FreeBSD, -BETA is typically synonymous
- with the code freeze before a release.</para>
-
- <para>Long answer: FreeBSD derives its releases from one of
- two places. Major, dot-zero, releases, such as
- 3.0-RELEASE and 4.0-RELEASE, are branched from the head of
- the development stream, commonly referred to as <link
- linkend="current">-CURRENT</link>. Minor releases, such
- as 3.1-RELEASE or 4.2-RELEASE, have been snapshots of the active
- <link linkend="stable">-STABLE</link> branch. Starting with
- 4.3-RELEASE, each release also now has its own branch which can be
- tracked by people requiring an extremely conservative rate
- of development (typically only security advisories).</para>
-
- <para>When a release is about to be made, the branch from
- which it will be derived from has to undergo a certain
- process. Part of this process is a code freeze. When a
- code freeze is initiated, the name of the branch is
- changed to reflect that it is about to become a release.
- For example, if the branch used to be called 4.0-STABLE,
- its name will be changed to 4.1-BETA to signify the code
- freeze and signify that extra pre-release testing should
- be happening. Bug fixes can still be committed to be part
- of the release. When the source code is in shape for the
- release the name will be changed to 4.1-RC to signify that a
- release is about to be made from it. Once in the RC stage,
- only the most critical bugs found can be fixed.
- Once the release, 4.1-RELEASE in this example, has been made,
- the branch will be renamed to 4.1-STABLE.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="kernel-chflag-failure">
- <para>I tried to install a new kernel, and the chflags failed.
- How do I get around this?</para>
- </question>
-
- <answer>
- <para>Short answer: You are probably at security level
- greater than 0. Reboot directly to single user mode to
- install the kernel.</para>
-
- <para>Long answer: FreeBSD disallows changing system flags
- at security levels greater than 0. You can check your
- security level with the command:</para>
-
- <screen>&prompt.root; <userinput>sysctl kern.securelevel</userinput></screen>
-
- <para>You cannot lower the security level; you have to boot to
- single mode to install the kernel, or change the security
- level in <filename>/etc/rc.conf</filename> then reboot. See
- the &man.init.8; man page for details on securelevel, and see
- <filename>/etc/defaults/rc.conf</filename> and the
- &man.rc.conf.5; man page for more information on
- rc.conf.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="kernel-securelevel-time">
- <para>I cannot change the time on my system by more than one second!
- How do I get around this?</para>
- </question>
-
- <answer>
- <para>Short answer: You are probably at security level
- greater than 1. Reboot directly to single user mode to
- change the date.</para>
-
- <para>Long answer: FreeBSD disallows changing the time by
- more that one second at security levels greater than 1. You
- can check your security level with the command:</para>
-
- <screen>&prompt.root; <userinput>sysctl kern.securelevel</userinput></screen>
-
- <para>You cannot lower the security level; you have to boot
- to single mode to change the date, or change the security
- level in <filename>/etc/rc.conf</filename> then reboot. See
- the &man.init.8; man page for details on securelevel, and
- see <filename>/etc/defaults/rc.conf</filename> and the
- &man.rc.conf.5; man page for more information on rc.conf.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="statd-mem-leak">
- <para>Why is <command>rpc.statd</command> using 256 megabytes of
- memory?</para>
- </question>
-
- <answer>
- <para>No, there is no memory leak, and it is not using 256 Mbytes
- of memory. It simply likes to (i.e., always does) map an
- obscene amount of memory into its address space for convenience.
- There is nothing terribly wrong with this from a technical
- standpoint; it just throws off things like &man.top.1; and
- &man.ps.1;.</para>
-
- <para>&man.rpc.statd.8; maps its status file (resident on
- <filename>/var</filename>) into its address space; to save
- worrying about remapping it later when it needs to grow, it maps
- it with a generous size. This is very evident from the source
- code, where one can see that the length argument to &man.mmap.2;
- is <literal>0x10000000</literal>, or one sixteenth of the
- address space on an IA32, or exactly 256MB.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="unsetting-schg">
- <para>Why can't I unset the <literal>schg</literal> file
- flag?</para>
- </question>
-
- <answer>
- <para>You are running at an elevated (i.e., greater than 0)
- securelevel. Lower the securelevel and try again. For more
- information, see <link linkend="securelevel">the FAQ entry on
- securelevel</link> and the &man.init.8; manual page.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ssh-shosts">
- <para>Why doesn't SSH authentication through
- <filename>.shosts</filename> work by default in recent
- versions of FreeBSD?</para>
- </question>
-
- <answer>
- <para>The reason why <filename>.shosts</filename>
- authentication does not work by default in more recent
- versions of FreeBSD is because &man.ssh.1;
- is not installed suid root by default. To
- <quote>fix</quote> this, you can do one of the
- following:</para>
-
- <itemizedlist>
- <listitem>
- <para>As a permanent fix, set
- <makevar>ENABLE_SUID_SSH</makevar> to <literal>true</literal>
- in <filename>/etc/make.conf</filename> and rebuild ssh
- (or run <command>make world</command>).</para>
- </listitem>
-
- <listitem>
- <para>As a temporary fix, change the mode on
- <filename>/usr/bin/ssh</filename> to <literal>4555</literal>
- by running <command>chmod 4755 /usr/bin/ssh</command> as
- <username>root</username>. Then add
- <makevar>ENABLE_SUID_SSH= true</makevar> to
- <filename>/etc/make.conf</filename> so the change takes
- effect the next time <command>make world</command> is
- run.</para>
- </listitem>
- </itemizedlist>
- </answer>
- </qandaentry>
- </qandaset>
- </chapter>
-
- <chapter id="x">
- <title>The X Window System and Virtual Consoles</title>
-
- <qandaset>
- <qandaentry>
- <question id="running-X">
- <para>I want to run X, how do I go about it?</para>
- </question>
-
- <answer>
-
- <para>The easiest way is to simply specify that you want to
- run X during the installation process.</para>
-
- <para>Then read and follow the documentation on the
- <command>xf86config</command> tool, which assists you in configuring
- XFree86(tm) for your particular graphics card/mouse/etc.</para>
-
- <para>You may also wish to investigate the Xaccel server.
- See the section on <link linkend="xig">Xi Graphics</link> or
- <link linkend="metrox">Metro Link</link> for more details.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="running-X-securelevels">
- <para>I <emphasis>tried</emphasis> to run X, but I get an
- <errorname>KDENABIO failed (Operation not permitted)</errorname>
- error when I type <command>startx</command>. What do I do
- now?</para>
- </question>
-
- <answer>
- <para>Your system is running at a raised securelevel, is not
- it? It is, indeed, impossible to start X at a raised
- securelevel. To see why, look at the &man.init.8; man
- page.</para>
-
- <para>So the question is what else you should do instead,
- and you basically have two choices: set your securelevel
- back down to zero (usually from <filename>/etc/rc.conf</filename>),
- or run &man.xdm.1; at boot time (before the securelevel is
- raised).</para>
-
- <para>See <xref linkend="xdm-boot"> for more information about
- running &man.xdm.1; at boot time.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="x-and-moused">
- <para>Why doesn't my mouse work with X?</para>
- </question>
-
- <answer>
- <para>If you are using syscons (the default console driver),
- you can configure FreeBSD to support a mouse pointer on each
- virtual screen. In order to avoid conflicting with X, syscons
- supports a virtual device called
- <devicename>/dev/sysmouse</devicename>. All mouse events received
- from the real mouse device are written to the sysmouse device
- via moused. If you wish to use your mouse on one or more
- virtual consoles, <emphasis>and</emphasis> use X, see
- <xref linkend="moused" remap="another section"> and set up
- moused.</para>
-
- <para>Then edit <filename>/etc/XF86Config</filename> and make
- sure you have the following lines.</para>
-
- <programlisting>Section Pointer
-Protocol "SysMouse"
-Device "/dev/sysmouse"
-.....</programlisting>
-
- <para>The above example is for XFree86 3.3.2 or later. For
- earlier versions, the <emphasis>Protocol</emphasis> should be
- <emphasis>MouseSystems</emphasis>.</para>
-
- <para>Some people prefer to use <devicename>/dev/mouse</devicename>
- under X. To make this work, <devicename>/dev/mouse</devicename>
- should be linked to
- <devicename>/dev/sysmouse</devicename> (see &man.sysmouse.4;):</para>
-
- <screen>&prompt.root; <userinput>cd /dev</userinput>
-&prompt.root; <userinput>rm -f mouse</userinput>
-&prompt.root; <userinput>ln -s sysmouse mouse</userinput></screen>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="x-and-wheel">
- <para>My mouse has a fancy wheel. Can I use it in X?</para>
- </question>
-
- <answer>
- <para>Yes. But you need to customize X client programs. See <ulink
- URL="http://www.inria.fr/koala/colas/mouse-wheel-scroll/">
- Colas Nahaboo's web page
- (http://www.inria.fr/koala/colas/mouse-wheel-scroll/)
- </ulink>.</para>
-
- <para>If you want to use the <application>imwheel</application>
- program, just follow these simple steps.</para>
-
- <orderedlist>
- <listitem>
- <para>Translate the Wheel Events</para>
-
- <para>The <application>imwheel</application> program
- works by translating mouse button 4 and mouse button 5
- events into key events. Thus, you have to get the
- mouse driver to translate mouse wheel events to button
- 4 and 5 events. There are two ways of doing this, the
- first way is to have &man.moused.8; do the
- translation. The second way is for the X server
- itself to do the event translation.</para>
-
- <orderedlist>
- <listitem>
- <para>Using &man.moused.8; to Translate Wheel
- Events</para>
-
- <para>To have &man.moused.8; perform the event
- translations, simply add <option>-z 4</option> to
- the command line used to start &man.moused.8;.
- For example, if you normally start &man.moused.8;
- via <command>moused -p /dev/psm0</command> you
- would start it by entering <command>moused -p
- /dev/psm0 -z 4</command> instead. If you start
- &man.moused.8; automatically during bootup via
- <filename>/etc/rc.conf</filename>, you can simply
- add <option>-z 4</option> to the
- <varname>moused_flags</varname> variable in
- <filename>/etc/rc.conf</filename>.</para>
-
- <para>You now need to tell X that you have a 5
- button mouse. To do this, simply add the line
- <literal>Buttons 5</literal> to the
- <quote>Pointer</quote> section of
- <filename>/etc/XF86Config</filename>. For
- example, you might have the following
- <quote>Pointer</quote> section in
- <filename>/etc/XF86Config</filename>.</para>
-
- <example>
- <title><quote>Pointer</quote> Section for Wheeled
- Mouse in XFree86 3.3.x series XF86Config with moused
- Translation</title>
-
- <programlisting>Section "Pointer"
- Protocol "SysMouse"
- Device "/dev/sysmouse"
- Buttons 5
-EndSection</programlisting>
- </example>
-
- <example>
- <title><quote>InputDevice</quote> Section for Wheeled
- Mouse in XFree86 4.x series XF86Config with
- automatic protocol recognition and button mapping
- Translation</title>
-
- <programlisting>Section "InputDevice"
- Identifier "Mouse1"
- Driver "mouse"
- Option "Protocol" "auto"
- Option "Device" "/dev/psm0"
- Option "Buttons" "5"
- Option "ZAxisMapping" "4 5"
-EndSection</programlisting>
- </example>
-
- <example>
- <title><quote>.emacs</quote> example for naive
- page scrolling with Wheeled Mouse</title>
- <programlisting>;; wheel mouse
-(global-set-key [mouse-4] 'scroll-down)
-(global-set-key [mouse-5] 'scroll-up)</programlisting>
- </example>
-
- </listitem>
-
- <listitem>
- <para>Using Your X Server to Translate the Wheel
- Events</para>
-
- <para>If you are not running &man.moused.8;, or if
- you do not want &man.moused.8; to translate your
- wheel events, you can have the X server do the
- event translation instead. This requires a couple
- of modifications to your
- <filename>/etc/XF86Config</filename> file. First,
- you need to choose the proper protocol for your
- mouse. Most wheeled mice use the
- <quote>IntelliMouse</quote> protocol. However,
- XFree86 does support other protocols, such as
- <quote>MouseManPlusPS/2</quote> for the Logitech
- MouseMan+ mice. Once you have chosen the protocol
- you will use, you need to add a
- <varname>Protocol</varname> line to the
- <quote>Pointer</quote> section.</para>
-
- <para>Secondly, you need to tell the X server to
- remap wheel scroll events to mouse buttons 4 and
- 5. This is done with the
- <varname>ZAxisMapping</varname> option.</para>
-
- <para>For example, if you are not using
- &man.moused.8;, and you have an IntelliMouse
- attached to the PS/2 mouse port you would use
- the following in
- <filename>/etc/XF86Config</filename>.</para>
-
- <example>
- <title><quote>Pointer</quote> Section for Wheeled
- Mouse in <filename>XF86Config</filename> with X
- Server Translation</title>
-
- <programlisting>Section "Pointer"
- Protocol "IntelliMouse"
- Device "/dev/psm0"
- ZAxisMapping 4 5
-EndSection</programlisting>
- </example>
- </listitem>
- </orderedlist>
- </listitem>
-
- <listitem>
- <para>Install <application>imwheel</application></para>
-
- <para>Next, install <application>imwheel</application>
- from the Ports collection. It can be found in the
- <filename>x11</filename> category. This program will
- map the wheel events from your mouse into keyboard
- events. For example, it might send <keycap>Page
- Up</keycap> to a program when you scroll the wheel
- forwards. <application>Imwheel</application> uses a
- configuration file to map the wheel events to
- keypresses so that it can send different keys to
- different applications. The default
- <application>imwheel</application> configuration file
- is installed in
- <filename>/usr/X11R6/etc/imwheelrc</filename>. You
- can copy it to <filename>~/.imwheelrc</filename> and
- then edit it if you wish to customize
- <application>imwheel</application>'s configuration.
- The format of the configuration file is documented in
- &man.imwheel.1;.</para>
- </listitem>
-
- <listitem>
- <para>Configure <application>Emacs</application> to Work
- with <application>Imwheel</application>
- (<emphasis>optional</emphasis>)</para>
-
- <para>If you use <application>emacs</application> or
- <application>Xemacs</application>, then you need to
- add a small section to your
- <filename>~/.emacs</filename> file. For
- <application>emacs</application>, add the
- following:</para>
-
- <example>
- <title><application>Emacs</application> Configuration
- for <application>Imwheel</application></title>
-
- <programlisting>;;; For imwheel
-(setq imwheel-scroll-interval 3)
-(defun imwheel-scroll-down-some-lines ()
- (interactive)
- (scroll-down imwheel-scroll-interval))
-(defun imwheel-scroll-up-some-lines ()
- (interactive)
- (scroll-up imwheel-scroll-interval))
-(global-set-key [?\M-\C-\)] 'imwheel-scroll-up-some-lines)
-(global-set-key [?\M-\C-\(] 'imwheel-scroll-down-some-lines)
-;;; end imwheel section</programlisting>
- </example>
-
- <para>For <application>Xemacs</application>, add the
- following to your <filename>~/.emacs</filename> file
- instead:</para>
-
- <example>
- <title><application>Xemacs</application> Configuration
- for <application>Imwheel</application></title>
-
- <programlisting>;;; For imwheel
-(setq imwheel-scroll-interval 3)
-(defun imwheel-scroll-down-some-lines ()
- (interactive)
- (scroll-down imwheel-scroll-interval))
-(defun imwheel-scroll-up-some-lines ()
- (interactive)
- (scroll-up imwheel-scroll-interval))
-(define-key global-map [(control meta \))] 'imwheel-scroll-up-some-lines)
-(define-key global-map [(control meta \()] 'imwheel-scroll-down-some-lines)
-;;; end imwheel section</programlisting>
- </example>
- </listitem>
-
- <listitem>
- <para>Run <application>Imwheel</application></para>
-
- <para>You can just type <command>imwheel</command>
- in an xterm to start it up once it is installed. It
- will background itself and take effect immediately.
- If you want to always use
- <application>imwheel</application>, simply add it to
- your <filename>.xinitrc</filename> or
- <filename>.xsession</filename> file. You can safely
- ignore any warnings <application>imwheel</application>
- displays about PID files. Those warnings only apply
- to the Linux version of
- <application>imwheel</application>.</para>
- </listitem>
- </orderedlist>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="window-menu-weird">
- <para>Why do X Window menus and dialog boxes not work right?</para>
- </question>
-
- <answer>
- <para>Try turning off the Num Lock key.</para>
-
- <para>If your Num Lock key is on by default at boot-time, you
- may add the following line in the <literal>Keyboard</literal>
- section of the <filename>XF86Config</filename> file.</para>
-
- <programlisting># Let the server do the NumLock processing. This should only be
-# required when using pre-R6 clients
- ServerNumLock</programlisting>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="virtual-console">
- <para>What is a virtual console and how do I make more?</para>
- </question>
-
- <answer>
- <para>Virtual consoles, put simply, enable you to have several
- simultaneous sessions on the same machine without doing anything
- complicated like setting up a network or running X.</para>
-
- <para>When the system starts, it will display a login prompt on
- the monitor after displaying all the boot messages. You can
- then type in your login name and password and start working (or
- playing!) on the first virtual console.</para>
-
- <para>At some point, you will probably wish to start another
- session, perhaps to look at documentation for a program
- you are running or to read your mail while waiting for an
- FTP transfer to finish. Just do Alt-F2 (hold down the Alt
- key and press the F2 key), and you will find a login prompt
- waiting for you on the second <quote>virtual console</quote>!
- When you want to go back to the original session, do
- Alt-F1.</para>
-
- <para>The default FreeBSD installation has three virtual consoles
- enabled (8 starting with 3.3-RELEASE), and Alt-F1, Alt-F2, and
- Alt-F3 will switch between these virtual consoles.</para>
-
- <para>To enable more of them, edit
- <filename>/etc/ttys</filename> (see &man.ttys.5;)
- and add entries for <devicename>ttyv4</devicename>
- to <devicename>ttyvc</devicename> after the comment on
- <quote>Virtual terminals</quote>:</para>
-
- <programlisting># Edit the existing entry for ttyv3 in /etc/ttys and change
-# "off" to "on".
-ttyv3 "/usr/libexec/getty Pc" cons25 on secure
-ttyv4 "/usr/libexec/getty Pc" cons25 on secure
-ttyv5 "/usr/libexec/getty Pc" cons25 on secure
-ttyv6 "/usr/libexec/getty Pc" cons25 on secure
-ttyv7 "/usr/libexec/getty Pc" cons25 on secure
-ttyv8 "/usr/libexec/getty Pc" cons25 on secure
-ttyv9 "/usr/libexec/getty Pc" cons25 on secure
-ttyva "/usr/libexec/getty Pc" cons25 on secure
-ttyvb "/usr/libexec/getty Pc" cons25 on secure</programlisting>
-
- <para>Use as many or as few as you want. The more virtual
- terminals you have, the more resources that are used; this
- can be important if you have 8MB RAM or less. You may also
- want to change the <literal>secure</literal>
- to <literal>insecure</literal>.</para>
-
- <important>
- <para>If you want to run an X server you
- <emphasis>must</emphasis> leave at least one virtual
- terminal unused (or turned off) for it to use. That is to
- say that if you want to have a login prompt pop up for all
- twelve of your Alt-function keys, you are out of luck - you
- can only do this for eleven of them if you also want to run
- an X server on the same machine.</para>
- </important>
-
- <para>The easiest way to disable a console is by turning it off.
- For example, if you had the full 12 terminal allocation
- mentioned above and you wanted to run X, you would change
- settings for virtual terminal 12 from:</para>
-
- <programlisting>ttyvb "/usr/libexec/getty Pc" cons25 on secure</programlisting>
-
- <para>to:</para>
-
- <programlisting>ttyvb "/usr/libexec/getty Pc" cons25 off secure</programlisting>
-
- <para>If your keyboard has only ten function keys, you would
- end up with:</para>
-
-<programlisting>ttyv9 "/usr/libexec/getty Pc" cons25 off secure
-ttyva "/usr/libexec/getty Pc" cons25 off secure
-ttyvb "/usr/libexec/getty Pc" cons25 off secure</programlisting>
-
- <para>(You could also just delete these lines.)</para>
-
- <para>Once you have edited
- <filename>/etc/ttys</filename>, the next step is to make sure that you
- have enough virtualterminal devices. The easiest way to do
- this is:</para>
-
- <screen>&prompt.root; <userinput>cd /dev</userinput>
-&prompt.root; <userinput>sh MAKEDEV vty12</userinput></screen>
-
- <para>Next, the easiest (and cleanest) way to activate the
- virtual consoles is to reboot. However, if you really do not
- want to reboot, you can just shut down the X Window system
- and execute (as <username>root</username>):</para>
-
- <screen>&prompt.root; <userinput>kill -HUP 1</userinput></screen>
-
- <para>It is imperative that you completely shut down X Window if
- it is running, before running this command. If you don't,
- your system will probably appear to hang/lock up after
- executing the kill command.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="vty-from-x">
- <para>How do I access the virtual consoles from X?</para>
- </question>
-
- <answer>
- <para>Use <keycombo action="simul">
- <keycap>Ctrl</keycap>
- <keycap>Alt</keycap>
- <keycap>F<replaceable>n</replaceable></keycap>
- </keycombo> to switch back to a virtual console.
- <keycombo action="simul">
- <keycap>Ctrl</keycap>
- <keycap>Alt</keycap>
- <keycap>F1</keycap>
- </keycombo> would return you to the first virtual console.</para>
-
- <para>Once you are back to a text console, you can then use
- <keycombo action="simul">
- <keycap>Alt</keycap>
- <keycap>F<replaceable>n</replaceable></keycap>
- </keycombo> as normal to move between them.</para>
-
- <para>To return to the X session, you must switch to the virtual
- console running X. If you invoked X from the command line, (e.g.,
- using <command>startx</command>) then the X session will attach to
- the next unused virtual console, not the text console from which
- it was invoked. If you have eight active virtual terminals then X
- will be running on the ninth, and you would use
- <keycombo action="simul">
- <keycap>Alt</keycap>
- <keycap>F9</keycap>
- </keycombo> to return.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="xdm-boot">
- <para>How do I start XDM on boot?</para>
- </question><answer>
-
- <para>There are two schools of thought on how to start <ulink
- URL="http://www.FreeBSD.org/cgi/man.cgi?manpath=xfree86&amp;query=xdm">
- xdm</ulink>. One school starts xdm from
- <filename>/etc/ttys</filename> (see &man.ttys.5;)
- using the supplied example, while the other simply runs xdm
- from
- <filename>rc.local</filename> (see &man.rc.8;)
- or from a <filename>X.sh</filename> script in
- <filename>/usr/local/etc/rc.d</filename>. Both are equally
- valid, and one may work in situations where the other does not.
- In both cases the result is the same: X will popup a graphical
- login: prompt.</para>
-
- <para>The ttys method has the advantage of documenting which
- vty X will start on and passing the responsibility of
- restarting the X server on logout to init. The rc.local
- method makes it easy to kill xdm if there is a problem
- starting the X server.</para>
-
- <para>If loaded from rc.local, <command>xdm</command> should
- be started without any arguments (i.e., as a daemon). xdm must
- start AFTER getty runs, or else getty and xdm will conflict,
- locking out the console. The best way around this is to have
- the script sleep 10 seconds or so then launch xdm.</para>
-
- <para>If you are to start <command>xdm</command> from
- <filename>/etc/ttys</filename>, there still is a chance of
- conflict between <command>xdm</command> and
- &man.getty.8;. One way to avoid this is to add the
- <literal>vt</literal> number in the
- <filename>/usr/X11R6/lib/X11/xdm/Xservers</filename>
- file.</para>
-
- <programlisting>:0 local /usr/X11R6/bin/X vt4</programlisting>
-
- <para>The above example will direct the X server to run in
- <devicename>/dev/ttyv3</devicename>. Note the number is offset by
- one. The X server counts the vty from one, whereas the FreeBSD
- kernel numbers the vty from zero.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="xconsole-failure">
- <para>Why do I get <errorname>Couldn't open console</errorname>
- when I run xconsole?</para>
- </question>
-
- <answer>
- <para>If you start <application>X</application>
- with
- <command>startx</command>, the permissions on
- <devicename>/dev/console</devicename> will
- <emphasis>not</emphasis> get changed, resulting in
- things like
- <command>xterm -C</command> and
- <command>xconsole</command> not working.</para>
-
- <para>This is because of the way console permissions are set
- by default. On a multi-user system, one does not necessarily
- want just any user to be able to write on the system console.
- For users who are logging directly onto a machine with a VTY,
- the &man.fbtab.5;
- file exists to solve such problems.</para>
-
- <para>In a nutshell, make sure an uncommented line of the
- form</para>
-
- <programlisting>/dev/ttyv0 0600 /dev/console</programlisting>
-
- <para>is in
- <filename>/etc/fbtab</filename> (see &man.fbtab.5;) and it will ensure that whomever logs in on
- <devicename>/dev/ttyv0</devicename> will own the console.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="xfree86-root">
- <para>Before, I was able to run XFree86 as a regular user. Why does
- it now say that I must be <username>root</username>?</para>
- </question>
-
- <answer>
- <para>All X servers need to be run as <username>root</username> in order to get direct
- access to your video hardware. Older versions of XFree86
- (&lt;= 3.3.6) installed all bundled servers to be automatically
- run as <username>root</username> (setuid to <username>root</username>). This is obviously a security
- hazard because X servers are large, complicated programs.
- Newer versions of XFree86 do not install the servers setuid to
- <username>root</username> for just this reason.</para>
-
- <para>Obviously, running an X server as the root user is not
- acceptable, nor a good idea security-wise. There are two ways
- to be able to use X as a regular user. The first is to use
- <command>xdm</command> or another display manager
- (e.g., <command>kdm</command>); the second is to use the
- <command>Xwrapper</command>.</para>
-
- <para><command>xdm</command> is a daemon that handles graphical
- logins. It is usually started at boot time, and is responsible
- for authenticating users and starting their sessions; it is
- essentially the graphical counterpart of
- &man.getty.8; and &man.login.1;. For
- more information on <command>xdm</command> see
- <ulink url="http://www.xfree86.org/support.html">the XFree86
- documentation</ulink>, and the <link linkend="xdm-boot">the FAQ
- entry</link> on it.</para>
-
- <para><command>Xwrapper</command> is the X server wrapper; it is
- a small utility to enable one to manually run an X server while
- maintaining reasonable safety. It performs some sanity checks
- on the command line arguments given, and if they pass, runs the
- appropriate X server. If you do not want to run a display
- manger for whatever reason, this is for you. If you have
- installed the complete ports collection, you can find the port in
- <filename>/usr/ports/x11/wrapper</filename>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ps2-x">
- <para>Why does my PS/2 mouse misbehave under X?</para>
- </question>
-
- <answer>
- <para>Your mouse and the mouse driver may have somewhat become
- out of synchronization.</para>
-
- <para>In versions 2.2.5 and earlier, switching away from X to a
- virtual terminal and getting back to X again may make them
- re-synchronized. If the problem occurs often, you may add the
- following option in your kernel configuration file and
- recompile it.</para>
-
- <programlisting>options PSM_CHECKSYNC</programlisting>
-
- <para>See the section on <link linkend="make-kernel">building
- a kernel</link> if you have no experience with building
- kernels.</para>
-
- <para>With this option, there should be less chance of
- synchronization problem between the mouse and the driver.
- If, however, you still see the problem, click any mouse
- button while holding the mouse still to re-synchronize the
- mouse and the driver.</para>
-
- <para>Note that unfortunately this option may not work with all
- the systems and voids the <quote>tap</quote> feature of the
- ALPS GlidePoint device attached to the PS/2 mouse port.</para>
-
- <para>In versions 2.2.6 and later, synchronization check is done
- in a slightly better way and is standard in the PS/2 mouse
- driver. It should even work with GlidePoint. (As the check code
- has become a standard feature, PSM_CHECKSYNC option is not
- available in these versions.) However, in rare case the driver
- may erroneously report synchronization problem and you may see
- the kernel message:</para>
-
- <programlisting>psmintr: out of sync (xxxx != yyyy)</programlisting>
-
- <para>and find your mouse does not seem to work properly.</para>
-
- <para>If this happens, disable the synchronization check code
- by setting the driver flags for the PS/2 mouse driver to 0x100.
- Enter <emphasis>UserConfig</emphasis> by giving the
- <option>-c</option> option at the boot prompt:</para>
-
- <screen>boot: <userinput>-c</userinput></screen>
-
- <para>Then, in the <emphasis>UserConfig</emphasis> command
- line, type:</para>
-
- <screen>UserConfig&gt; <userinput>flags psm0 0x100</userinput>
-UserConfig&gt; <userinput>quit</userinput></screen>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ps2-mousesystems">
- <para>How come my PS/2 mouse from MouseSystems does not seem
- to work?</para>
- </question>
-
- <answer>
- <para>There have been some reports that certain model of PS/2
- mouse from MouseSystems works only if it is put into the
- <quote>high resolution</quote> mode. Otherwise, the mouse
- cursor may jump to the upper-left corner of the screen every
- so often.</para>
-
- <para>Unfortunately there is no workaround for versions 2.0.X
- and 2.1.X. In versions 2.2 through 2.2.5, apply the following
- patch to <filename>/sys/i386/isa/psm.c</filename> and rebuild
- the kernel. See the section on <link
- linkend="make-kernel">building a kernel</link> if you have no
- experience with building kernels.</para>
-
- <programlisting>@@ -766,6 +766,8 @@
- if (verbose &gt;= 2)
- log(LOG_DEBUG, "psm%d: SET_DEFAULTS return code:%04x\n",
- unit, i);
-+ set_mouse_resolution(sc-&gt;kbdc, PSMD_RES_HIGH);
-+
- #if 0
- set_mouse_scaling(sc-&gt;kbdc); /* 1:1 scaling */
- set_mouse_mode(sc-&gt;kbdc); /* stream mode */</programlisting>
-
- <para>In versions 2.2.6 or later, specify the flags 0x04 to
- the PS/2 mouse driver to put the mouse into the high
- resolution mode. Enter <emphasis>UserConfig</emphasis> by
- giving the <option>-c</option> option at the boot prompt:</para>
-
- <screen>boot: <userinput>-c</userinput></screen>
-
- <para>Then, in the <emphasis>UserConfig</emphasis> command line,
- type:</para>
-
- <screen>UserConfig&gt; <userinput>flags psm0 0x04</userinput>
-UserConfig&gt; <userinput>quit</userinput></screen>
-
- <para>See the previous section for another possible cause of mouse
- problems.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="imake-tmpl">
- <para>When building an X app, <command>imake</command> cannot
- find <filename>Imake.tmpl</filename>. Where is it?</para>
- </question>
-
- <answer>
-
- <para><filename>Imake.tmpl</filename> is part of the Imake package, a standard X
- application building tool. <filename>Imake.tmpl</filename>, as well as several
- header files that are required to build X apps, is contained
- in the X prog distribution. You can install this from sysinstall
- or manually from the X distribution files.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="mouse-button-reverse">
- <para>How do I reverse the mouse buttons?</para>
- </question>
-
- <answer>
- <para>Run the command
- <command>xmodmap -e "pointer = 3 2 1"</command> from your
- <filename>.xinitrc</filename> or <filename>.xsession</filename>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="install-splash">
- <para>How do I install a splash screen and where do I find
- them?</para>
- </question>
-
- <answer>
-
- <para>Just prior to the release of FreeBSD 3.1, a new feature
- was added to allow the display of <quote>splash</quote> screens
- during the boot messages. The splash screens currently must be
- a 256 color bitmap (<filename>*.BMP</filename>) or ZSoft PCX
- (<filename>*.PCX</filename>) file. In addition, they must have
- a resolution of 320x200 or less to work on standard VGA
- adapters. If you compile VESA support into your kernel, then
- you can use larger bitmaps up to 1024x768. Note that VESA
- support requires the <literal>VM86</literal> kernel option to
- be compiled into the kernel. The actual VESA support can either
- be compiled directly into the kernel with the
- <literal>VESA</literal> kernel config option or by loading the
- VESA kld module during bootup.</para>
-
- <para>To use a splash screen, you need to modify the startup
- files that control the boot process for FreeBSD. The files for
- this changed prior to the release of FreeBSD 3.2, so there are
- now two ways of loading a splash screen:</para>
-
- <itemizedlist>
- <listitem>
- <para>FreeBSD 3.1</para>
-
- <para>The first step is to find a bitmap version of your
- splash screen. Release 3.1 only supports Windows bitmap
- splash screens. Once you have found your splash screen of
- choice copy it to <filename>/boot/splash.bmp</filename>.
- Next, you need to have a
- <filename>/boot/loader.rc</filename> file that contains
- the following lines:</para>
-
- <programlisting>load kernel
-load -t splash_image_data /boot/splash.bmp
-load splash_bmp
-autoboot</programlisting>
-
- </listitem>
-
- <listitem>
- <para>FreeBSD 3.2+</para>
-
- <para>In addition to adding support for PCX splash screens,
- FreeBSD 3.2 includes a nicer way of configuring the boot
- process. If you wish, you can use the method listed above
- for FreeBSD 3.1. If you do and you want to use PCX,
- replace <literal>splash_bmp</literal> with
- <literal>splash_pcx</literal>. If, on the other hand, you
- want to use the newer boot configuration, you need to
- create a <filename>/boot/loader.rc</filename> file that
- contains the following lines:</para>
-
- <programlisting>include /boot/loader.4th
-start</programlisting>
-
- <para>and a <filename>/boot/loader.conf</filename> that
- contains the following:</para>
-
- <programlisting>splash_bmp_load="YES"
-bitmap_load="YES"</programlisting>
-
- <para>This assumes you are using
- <filename>/boot/splash.bmp</filename> for your splash
- screen. If you would rather use a PCX file, copy it to
- <filename>/boot/splash.pcx</filename>, create a
- <filename>/boot/loader.rc</filename> as instructed
- above, and create a
- <filename>/boot/loader.conf</filename> that
- contains:</para>
-
- <programlisting>splash_pcx_load="YES"
-bitmap_load="YES"
-bitmap_name="/boot/splash.pcx"</programlisting>
-
- </listitem>
- </itemizedlist>
-
- <para>Now all you need is a splash screen. For that you can
- surf on over to the gallery at <ulink
- URL="http://www.baldwin.cx/splash/">http://www.baldwin.cx/splash/</ulink>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="windows-keys">
- <para>Can I use the Windows(tm) keys on my keyboard in X?</para>
- </question>
-
- <answer>
- <para>Yes. All you need to do is use &man.xmodmap.1; to define
- what function you wish them to perform.</para>
-
- <para>Assuming all <quote>Windows(tm)</quote> keyboards are
- standard then the keycodes for the 3 keys are</para>
-
- <itemizedlist>
- <listitem>
- <para>115 - Windows(tm) key, between the left-hand Ctrl and
- Alt keys</para>
- </listitem>
-
- <listitem>
- <para>116 - Windows(tm) key, to the right of the Alt-Gr
- key</para>
- </listitem>
-
- <listitem>
- <para>117 - Menu key, to the left of the right-hand Ctrl
- key</para>
- </listitem>
- </itemizedlist>
-
- <para>To have the left Windows(tm) key print a comma, try
- this.</para>
-
- <screen>&prompt.root; <userinput>xmodmap -e "keycode 115 = comma"</userinput></screen>
-
- <para>You will probably have to re-start your window manager
- to see the result.</para>
-
- <para>To have the Windows(tm) key-mappings enabled automatically
- every time you start X either put the <command>xmodmap</command>
- commands in your <filename>~/.xinitrc</filename> file or,
- preferably, create a file <filename>~/.xmodmaprc</filename> and
- include the <command>xmodmap</command> options, one per line,
- then add the line</para>
-
- <programlisting>xmodmap $HOME/.xmodmaprc</programlisting>
-
- <para>to your <filename>~/.xinitrc</filename>.</para>
-
- <para>For example, you could map the 3 keys top be F13, F14, and
- F15, respectively. This would make it easy to map them to
- useful functions within applications or your window
- manager, as demonstrated further down.</para>
-
- <para>To do this put the following in
- <filename>~/.xmodmaprc</filename>.</para>
-
- <programlisting>keycode 115 = F13
-keycode 116 = F14
-keycode 117 = F15</programlisting>
-
- <para>If you use <command>fvwm2</command>, for example, you
- could map the keys
- so that F13 iconifies (or de-iconifies) the window the cursor
- is in, F14 brings the window the cursor is in to the front or,
- if it is already at the front, pushes it to the back, and F15
- pops up the main Workplace (application) menu even if the
- cursor is not on the desktop, which is useful if you do not have
- any part of the desktop visible (and the logo on the key
- matches its functionality).</para>
-
- <para>The following entries in
- <filename>~/.fvwmrc</filename> implement the
- aforementioned setup:</para>
-
- <programlisting>Key F13 FTIWS A Iconify
-Key F14 FTIWS A RaiseLower
-Key F15 A A Menu Workplace Nop</programlisting>
- </answer>
- </qandaentry>
- </qandaset>
- </chapter>
-
- <chapter id="networking">
- <title>Networking</title>
-
- <qandaset>
- <qandaentry>
- <question id="diskless-booting">
- <para>Where can I get information on
- <quote>diskless booting</quote>?</para>
- </question>
-
- <answer>
- <para><quote>Diskless booting</quote> means that the FreeBSD
- box is booted over a network, and reads the necessary files
- from a server instead of its hard disk. For full details,
- please read <ulink URL="../handbook/diskless.html">the
- Handbook entry on diskless booting</ulink></para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="router">
- <para>Can a FreeBSD box be used as a dedicated network
- router?</para>
- </question>
-
- <answer>
- <para>Internet standards and good engineering practice prohibit
- us from providing packet forwarding by default in FreeBSD. You
- can however enable this feature by changing the following
- variable to <literal>YES</literal> in
- &man.rc.conf.5;:</para>
-
- <programlisting>gateway_enable=YES # Set to YES if this host will be a gateway</programlisting>
-
- <para>This option will put the
- &man.sysctl.8; variable
- <filename>net.inet.ip.forwarding</filename>
- to <literal>1</literal>.</para>
-
- <para>In most cases, you will also need to run a routing process
- to tell other systems on your network about your router;
- FreeBSD comes with the standard BSD routing daemon
- &man.routed.8;
- or for more complex situations you may want to try
- <application>GaTeD</application> (available from <ulink
- URL="http://www.gated.org/">http://www.gated.org/</ulink>)
- which supports FreeBSD as of 3_5Alpha7.</para>
-
- <para>It is our duty to warn you that, even when FreeBSD is
- configured in this way, it does not completely comply with
- the Internet standard requirements for routers; however,
- it comes close enough for ordinary usage.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="win95-connection">
- <para>Can I connect my Win95 box to the Internet via
- FreeBSD?</para>
- </question>
-
- <answer>
- <para>Typically, people who ask this question have two PC's
- at home, one with FreeBSD and one with Win95; the idea is to
- use the FreeBSD box to connect to the Internet and then be able
- to access the Internet from the Windows95 box through the
- FreeBSD box. This is really just a special case of the previous
- question.</para> <para>... and the answer is yes! In FreeBSD
- 3.x, user-mode ppp contains a <option>-nat</option> option. If
- you run <application>ppp</application> with the <option>-nat</option>,
- set <literal>gateway_enable</literal> to
- <emphasis>YES</emphasis> in <filename>/etc/rc.conf</filename>,
- and configure your Windows machine correctly, this should work
- fine.</para>
-
- <para>More detailed information about setting this up can be
- found in the <ulink
- URL="http://www.FreeBSD.org/tutorials/ppp/index.html">
- Pedantic PPP Primer</ulink> by Steve Sims.</para>
-
- <para>If you are using kernel-mode ppp, or have an Ethernet
- connection to the Internet, you will have to use
- &man.natd.8;. Please look at the
- <link linkend="natd">natd</link> section of this FAQ.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="latest-bind">
- <para>Why does recompiling the latest BIND from ISC fail?</para>
- </question>
-
- <answer>
- <para>There is a conflict between the
- <filename>cdefs.h</filename> file in the distribution and the
- one shipped with FreeBSD. Just remove
- <filename>compat/include/sys/cdefs.h</filename>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="slip-ppp-support">
- <para>Does FreeBSD support SLIP and PPP?</para>
- </question>
-
- <answer>
- <para>Yes. See the manual pages for &man.slattach.8;,
- &man.sliplogin.8;, &man.ppp.8;, and &man.pppd.8;. &man.ppp.8;
- and &man.pppd.8; provide support for both incoming and outgoing
- connections, while &man.sliplogin.8; deals exclusively with
- incoming connections, and &man.slattach.8; deals exclusively
- with outgoing connections.</para>
-
- <para>For more information on how to use these, please see the
- <ulink url="../handbook/ppp-and-slip.html">Handbook chapter on
- PPP and SLIP</ulink>.</para>
-
- <para>If you only have access to the Internet through a
- <quote>shell account</quote>, you may want to have a look at
- the
- <application>slirp</application> package. It can provide you with (limited)
- access to services such as ftp and http direct from your local
- machine.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="natd">
- <para>Does FreeBSD support NAT or Masquerading?</para>
- </question>
-
- <answer>
- <para>If you have a local subnet (one or more local machines),
- but have been allocated only a single IP number from your
- Internet provider (or even if you receive a dynamic IP number),
- you may want to look at the &man.natd.8;
- program. &man.natd.8; allows you to connect an
- entire subnet to the Internet using only a single IP
- number.</para>
-
- <para>The &man.ppp.8;
- program has similar functionality built in via
- the <option>-nat</option> switch. The
- alias library (&man.libalias.3;) is used in both cases.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="parallel-connect">
- <para>How do I connect two FreeBSD systems over a parallel line
- using PLIP?</para>
- </question>
-
- <answer>
- <para>Get a laplink cable. Make sure both computer have a kernel
- with lpt driver support.</para>
-
- <screen>&prompt.root; <userinput>dmesg | grep lp</userinput>
-lpt0 at 0x378-0x37f irq 7 on isa
-lpt0: Interrupt-driven
-lp0: TCP/IP capable interface</screen>
-
- <para>Plug in the laplink cable into the parallel interface.</para>
-
- <para>Configure the network interface parameters for lp0 on both
- sites as root. For example, if you want connect the host max
- with moritz</para>
-
- <programlisting> max &lt;-----&gt; moritz
-IP Address 10.0.0.1 10.0.0.2</programlisting>
-
- <para>on max start</para>
-
- <screen>&prompt.root; <userinput>ifconfig lp0 10.0.0.1 10.0.0.2</userinput></screen>
-
- <para>on moritz start</para>
-
- <screen>&prompt.root; <userinput>ifconfig lp0 10.0.0.2 10.0.0.1</userinput></screen>
-
-
- <para>Thats all! Please read also the manpages
- &man.lp.4; and &man.lpt.4; .</para>
-
- <para>You should also add the hosts to
- <filename>/etc/hosts</filename>.</para>
-
- <programlisting>127.0.0.1 localhost.my.domain localhost
-10.0.0.1 max.my.domain max
-10.0.0.2 moritz.my.domain</programlisting>
-
-
- <para>To check if it works do:</para>
-
- <para>on max:</para>
-
-
- <screen>&prompt.root; <userinput>ifconfig lp</userinput>0
-lp0: flags=8851&lt;UP,POINTOPOINT,RUNNING,SIMPLEX,MULTICAST&gt; mtu 1500
- inet 10.0.0.1 --&gt; 10.0.0.2 netmask 0xff000000
-&prompt.root; <userinput>netstat -r</userinput>
-Routing tables
-
-Internet:
-Destination Gateway Flags Refs Use Netif Expire
-moritz max UH 4 127592 lp0
-&prompt.root; <userinput>ping -c 4 moritz</userinput>
-PING moritz (10.0.0.2): 56 data bytes
-64 bytes from 10.0.0.2: icmp_seq=0 ttl=255 time=2.774 ms
-64 bytes from 10.0.0.2: icmp_seq=1 ttl=255 time=2.530 ms
-64 bytes from 10.0.0.2: icmp_seq=2 ttl=255 time=2.556 ms
-64 bytes from 10.0.0.2: icmp_seq=3 ttl=255 time=2.714 ms
-
---- moritz ping statistics ---
-4 packets transmitted, 4 packets received, 0% packet loss
-round-trip min/avg/max/stddev = 2.530/2.643/2.774/0.103 ms</screen>
-
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="create-dev-net">
- <para>How come I cannot create a <devicename>/dev/ed0</devicename>
- device?</para>
- </question>
-
- <answer>
-
- <para>In the Berkeley networking framework, network interfaces
- are only directly accessible by kernel code. Please see the
- <filename>/etc/rc.network</filename> file and the manual pages
- for the various network programs mentioned there for more
- information. If this leaves you totally confused, then you
- should pick up a book describing network administration on
- another BSD-related operating system; with few significant
- exceptions, administering networking on FreeBSD is basically
- the same as on SunOS 4.0 or Ultrix.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ethernet-aliases">
- <para>How can I setup Ethernet aliases?</para>
- </question><answer>
-
- <para>Add <literal>netmask 0xffffffff</literal> to your
- &man.ifconfig.8; command-line like the following:</para>
-
- <screen>&prompt.root; <userinput>ifconfig ed0 alias 204.141.95.2 netmask 0xffffffff</userinput></screen>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="port-3c503">
- <para>How do I get my 3C503 to use the other network
- port?</para>
- </question>
-
- <answer>
- <para>If you want to use the other ports, you will have to specify
- an additional parameter on the
- &man.ifconfig.8; command line. The default port is
- <literal>link0</literal>. To use the AUI port instead of the
- BNC one, use <literal>link2</literal>. These flags should be
- specified using the ifconfig_* variables in
- <filename>/etc/rc.conf</filename> (see &man.rc.conf.5;).</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="nfs">
- <para>Why am I having trouble with NFS and FreeBSD?</para>
- </question>
-
- <answer>
- <para>Certain PC network cards are better than others (to put
- it mildly) and can sometimes cause problems with network
- intensive applications like NFS.</para>
-
- <para>See <ulink URL="../handbook/nfs.html">
- the Handbook entry on NFS</ulink> for more information on
- this topic.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="nfs-linux">
- <para>Why can't I NFS-mount from a Linux box?</para>
- </question>
-
- <answer>
- <para>Some versions of the Linux NFS code only accept mount
- requests from a privileged port; try</para>
-
- <screen>&prompt.root; <userinput>mount -o -P linuxbox:/blah /mnt</userinput></screen>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="nfs-sun">
- <para>Why can't I NFS-mount from a Sun box?</para>
- </question>
-
- <answer>
- <para>Sun workstations running SunOS 4.X only accept mount
- requests from a privileged port; try</para>
-
- <screen>&prompt.root; <userinput>mount -o -P sunbox:/blah /mnt</userinput></screen>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="exports-errors">
- <para>Why does <command>mountd</command> keep telling me it
- <errorname>can't change attributes</errorname> and that I have a
- <errorname>bad exports list</errorname> on my FreeBSD NFS
- server?</para>
- </question>
-
- <answer>
- <para>The most frequent problem is not understanding this
- passage from the &man.exports.5; manual page
- correctly:</para>
-
- <blockquote>
- <para>Each line in the file (other than comment
- lines that begin with a #) specifies the mount point(s)
- and export flags within one local server filesystem for
- one or more hosts. A host may be specified only once
- for each local filesystem on the server and there may be
- only one default entry for each server filesystem that
- applies to all other hosts.</para>
- </blockquote>
-
- <para>This is made more clear by an example of a common
- mistake. If everything above <filename>/usr</filename> is
- part of one filesystem (there are no mounts above
- <filename>/usr</filename>) the following exports list is
- not valid:</para>
-
- <programlisting>/usr/src client
-/usr/ports client</programlisting>
-
- <para>There are two lines specifying properties for one
- filesystem, <filename>/usr</filename>, exported to the
- same host, <hostid>client</hostid>. The correct format
- is:</para>
-
- <programlisting>/usr/src /usr/ports client</programlisting>
-
- <para>To rephrase the passage from the manual page, the
- properties of one filesystem exported to a given host
- (world-wide exports are treated like another unique host)
- must all occur on one line. And yes, this does cause
- limitation in how you can export filesystems without ugly
- workarounds, but for most people, this is not an
- issue.</para>
-
- <para>The following is an example of a valid export list,
- where <filename>/usr</filename> and
- <filename>/exports</filename> are local
- filesystems:</para>
-
- <programlisting># Export src and ports to client01 and client02, but only
-# client01 has root privileges on it
-/usr/src /usr/ports -maproot=0 client01
-/usr/src /usr/ports client02
-# The "client" machines have root and can mount anywhere
-# up /exports. The world can mount /exports/obj read-only
-/exports -alldirs -maproot=0 client01 client02
-/exports/obj -ro</programlisting>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ppp-nextstep">
- <para>Why am I having problems talking PPP to NeXTStep
- machines?</para>
- </question>
-
- <answer>
-
- <para>Try disabling the TCP extensions in
- <filename>/etc/rc.conf</filename> (see &man.rc.conf.5;) by changing the following variable to
- NO:</para>
-
- <programlisting>tcp_extensions=NO</programlisting>
-
- <para>Xylogic's Annex boxes are also broken in this regard and
- you must use the above change to connect thru them.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ip-multicast">
- <para>How do I enable IP multicast support?</para>
- </question>
-
- <answer>
- <para>Multicast host operations are fully supported in FreeBSD
- 2.0 and later by default. If you want your box to run as a
- multicast router, you will need to recompile your kernel with
- the <literal>MROUTING</literal> option and run
- &man.mrouted.8;. FreeBSD 2.2 and later will start
- &man.mrouted.8; at boot time if the flag
- <literal>mrouted_enable</literal> is set to
- <literal>"YES"</literal> in
- <filename>/etc/rc.conf</filename>.</para>
-
- <para>MBONE tools are available in their own ports category,
- mbone. If you are looking for the conference tools
- <command>vic</command> and <command>vat</command>,
- look there!</para>
-
- <para>For more information, see the <ulink
- URL="http://www.mbone.com/">Mbone Information Web</ulink>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="dec-pci-chipset">
- <para>Which network cards are based on the DEC PCI
- chipset?</para>
- </question><answer>
-
- <para>Here is a list compiled by Glen Foster
- <email>gfoster@driver.nsta.org</email>,
- with some more modern additions:</para>
-
- <table>
- <title>Network cards based on the DEC PCI chipset</title>
-
- <tgroup cols=2>
- <thead>
- <row>
- <entry>Vendor</entry>
- <entry>Model</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>ASUS</entry>
- <entry>PCI-L101-TB</entry>
- </row>
- <row>
- <entry>Accton</entry>
- <entry>ENI1203</entry>
- </row>
- <row>
- <entry>Cogent</entry>
- <entry>EM960PCI</entry>
- </row>
- <row>
- <entry>Compex</entry>
- <entry>ENET32-PCI</entry>
- </row>
- <row>
- <entry>D-Link</entry>
- <entry>DE-530</entry>
- </row>
- <row>
- <entry>Dayna</entry>
- <entry>DP1203, DP2100</entry>
- </row>
- <row>
- <entry>DEC</entry>
- <entry>DE435, DE450</entry>
- </row>
- <row>
- <entry>Danpex</entry>
- <entry>EN-9400P3</entry>
- </row>
- <row>
- <entry>JCIS</entry>
- <entry>Condor JC1260</entry>
- </row>
- <row>
- <entry>Linksys</entry>
- <entry>EtherPCI</entry>
- </row>
- <row>
- <entry>Mylex</entry>
- <entry>LNP101</entry>
- </row>
- <row>
- <entry>SMC</entry>
- <entry>EtherPower 10/100 (Model 9332)</entry>
- </row>
- <row>
- <entry>SMC</entry>
- <entry>EtherPower (Model 8432)</entry>
- </row>
- <row>
- <entry>TopWare</entry>
- <entry>TE-3500P</entry>
- </row>
- <row>
- <entry>Znyx (2.2.x)</entry>
- <entry>ZX312, ZX314, ZX342, ZX345, ZX346, ZX348</entry>
- </row>
- <row>
- <entry>Znyx (3.x)</entry>
- <entry>ZX345Q, ZX346Q, ZX348Q, ZX412Q, ZX414, ZX442, ZX444,
- ZX474, ZX478, ZX212, ZX214 (10mbps/hd)</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="fqdn-hosts">
- <para>Why do I have to use the FQDN for hosts on my
- site?</para>
- </question>
-
- <answer>
- <para>You will probably find that the host is actually in a
- different domain; for example, if you are in foo.bar.edu and
- you wish to reach a host called <hostid>mumble</hostid> in the
- <hostid role="domainname">bar.edu</hostid> domain, you will
- have to refer to it by the fully-qualified domain name, <hostid
- role="fqdn">mumble.bar.edu</hostid>, instead of just
- <hostid>mumble</hostid>.</para>
-
- <para>Traditionally, this was allowed by BSD BIND resolvers.
- However the current version of
- <application>bind</application> (see &man.named.8;)
- that ships with FreeBSD no longer provides default
- abbreviations for non-fully qualified domain names other than
- the domain you are in. So an unqualified host
- <hostid>mumble</hostid> must either be found as <hostid
- role="fqdn">mumble.foo.bar.edu</hostid>, or it will be searched
- for in the root domain.</para>
-
- <para>This is different from the previous behavior, where the
- search continued across
- <hostid role="domainname">mumble.bar.edu</hostid>, and
- <hostid role="domainname">mumble.edu</hostid>. Have a look at
- RFC 1535 for why this was considered bad practice, or even a
- security hole.</para>
-
- <para>As a good workaround, you can place the line</para>
-
- <programlisting>search foo.bar.edu bar.edu</programlisting>
-
- <para>instead of the previous</para>
-
- <programlisting>domain foo.bar.edu</programlisting>
-
- <para>into your
- <filename>/etc/resolv.conf</filename> file (see &man.resolv.conf.5;). However, make sure that the
- search order does not go beyond the <quote>boundary between
- local and public administration</quote>, as RFC 1535 calls
- it.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="network-permission-denied">
- <para>Why do I get an error, <errorname>Permission denied</errorname>,
- for all networking operations?</para>
- </question>
-
- <answer>
- <para>If you have compiled your kernel with the
- <literal>IPFIREWALL</literal> option, you need to be aware
- that the default policy as of 2.1.7R (this actually changed
- during 2.1-STABLE development) is to deny all packets that are
- not explicitly allowed.</para>
-
- <para>If you had unintentionally misconfigured your system for
- firewalling, you can restore network operability by typing
- the following while logged in as <username>root</username>:</para>
-
- <screen>&prompt.root; <userinput>ipfw add 65534 allow all from any to any</userinput></screen>
-
- <para>You can also set <literal>firewall_type="open"</literal>
- in <filename>/etc/rc.conf</filename>.</para>
-
- <para>For further information on configuring a FreeBSD firewall,
- see the <ulink URL="../handbook/firewalls.html">
- Handbook section</ulink>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ipfw-overhead">
- <para>How much overhead does IPFW incur?</para>
- </question>
-
- <answer>
- <para>The answer to this depends mostly on your rule set and
- processor speed. For most applications dealing with Ethernet
- and small rule sets, the answer is, negligible. For those of
- you that need actual measurements to satisfy your curiosity,
- read on.</para>
-
- <para>The following measurements were made using 2.2.5-STABLE
- on a 486-66. IPFW was modified to measure the time spent
- within the <literal>ip_fw_chk</literal> routine, displaying
- the results to the console every 1000 packets.</para>
-
- <para>Two rule sets, each with 1000 rules were tested. The
- first set was designed to demonstrate a worst case scenario
- by repeating the rule:</para>
-
- <screen>&prompt.root; <userinput>ipfw add deny tcp from any to any 55555</userinput></screen>
-
- <para>This demonstrates worst case by causing most of IPFW's
- packet check routine to be executed before finally deciding
- that the packet does not match the rule (by virtue of the port
- number). Following the 999th iteration of this rule was an
- <literal>allow ip from any to any</literal>.</para>
-
- <para>The second set of rules were designed to abort the rule
- check quickly:</para>
-
- <screen>&prompt.root; <userinput>ipfw add deny ip from 1.2.3.4 to 1.2.3.4</userinput></screen>
-
- <para>The nonmatching source IP address for the above rule causes
- these rules to be skipped very quickly. As before, the 1000th
- rule was an <literal>allow ip from any to any</literal>.</para>
-
- <para>The per-packet processing overhead in the former case was
- approximately 2.703ms/packet, or roughly 2.7 microseconds per
- rule. Thus the theoretical packet processing limit with these
- rules is around 370 packets per second. Assuming 10Mbps
- Ethernet and a ~1500 byte packet size, we would only be able to
- achieve a 55.5% bandwidth utilization.</para>
-
- <para>For the latter case each packet was processed in
- approximately 1.172ms, or roughly 1.2 microseconds per rule.
- The theoretical packet processing limit here would be about
- 853 packets per second, which could consume 10Mbps Ethernet
- bandwidth.</para>
-
- <para>The excessive number of rules tested and the nature of
- those rules do not provide a real-world scenario -- they were
- used only to generate the timing information presented here.
- Here are a few things to keep in mind when building an
- efficient rule set:</para>
-
- <itemizedlist>
- <listitem>
- <para>Place an <literal>established</literal> rule early
- on to handle the majority of TCP traffic. Do not put any
- <literal>allow tcp</literal> statements before this
- rule.</para>
- </listitem>
-
- <listitem>
- <para>Place heavily triggered rules earlier in the rule
- set than those rarely used (<emphasis>without
- changing the permissiveness of the firewall</emphasis>,
- of course). You can see which rules are used most often
- by examining the packet counting statistics with
- <command>ipfw -a l</command>.</para>
- </listitem>
- </itemizedlist>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ipfw-fwd">
- <para>Why is my <command>ipfw</command> <quote>fwd</quote> rule
- to redirect a service to another machine not working?</para>
- </question>
-
- <answer>
- <para>Possibly because you want to do network address translation
- (NAT) and not just forward packets. A <quote>fwd</quote> rule
- does exactly what it says; it forwards packets. It does not
- actually change the data inside the packet. Say we have a rule
- like:</para>
-
- <screen>01000 fwd <replaceable>10.0.0.1</replaceable> from any to <replaceable>foo 21</replaceable></screen>
-
- <para>When a packet with a destination address of
- <replaceable>foo</replaceable> arrives at the machine with this
- rule, the packet is forwarded to
- <replaceable>10.0.0.1</replaceable>, but it still has the
- destination address of <replaceable>foo</replaceable>! The
- destination address of the packet is <emphasis>not</emphasis>
- changed to <replaceable>10.0.0.1</replaceable>. Most machines
- would probably drop a packet that they receive with a
- destination address that is not their own. Therefore, using a
- <quote>fwd</quote> rule does not often work the way the user
- expects. This behavior is a feature and not a bug.</para>
-
- <para>See the <link linkend="service-redirect">FAQ about
- redirecting services</link>, the &man.natd.8; manual, or one of
- the several port redirecting utilities in the <ulink
- url="../ports/">ports collection</ulink> for a correct way to do
- this.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="service-redirect">
- <para>How can I redirect service requests from one machine to
- another?</para>
- </question>
-
- <answer>
- <para>You can redirect FTP (and other service) request with
- the <literal>socket</literal> package, available in the ports
- tree in category <quote>sysutils</quote>. Simply replace the
- service's commandline to call socket instead, like so:</para>
-
- <programlisting>ftp stream tcp nowait nobody /usr/local/bin/socket socket <replaceable>ftp.foo.com</replaceable> <replaceable>ftp</replaceable></programlisting>
-
- <para>where <replaceable>ftp.foo.com</replaceable> and
- <replaceable>ftp</replaceable> are the host and port to
- redirect to, respectively.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="bandwidth-mgr-tool">
- <para>Where can I get a bandwidth management tool?</para>
- </question>
-
- <answer>
- <para>There are three bandwidth management tools available for
- FreeBSD. &man.dummynet.4; is integreated into FreeBSD (or more
- specifically, &man.ipfw.4;); <ulink
- URL="http://www.csl.sony.co.jp/person/kjc/programs.html">ALTQ</ulink>
- is available for free; Bandwidth Manager from <ulink
- URL="http://www.etinc.com/">Emerging Technologies</ulink> is a
- commercial product.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="extra-named-port">
- <para>BIND (<command>named</command>) is listening on port 53 and
- some other high-numbered port. Has my host been
- compromised?</para>
- </question>
-
- <answer>
- <para>Probably not. FreeBSD 3.0 and later use a version of BIND
- that uses a random high-numbered port for outgoing queries. If
- you want to use port 53 for outgoing queries, either to get
- past a firewall or to make yourself feel better, you can try
- the following in
- <filename>/etc/namedb/named.conf</filename>:</para>
-
- <programlisting>options {
- query-source address * port 53;
-};</programlisting>
-
- <para>You can replace the <literal>*</literal> with a single IP
- address if you want to tighten things further.</para>
-
- <para>Congratulations, by the way. It is good practice to read
- your &man.sockstat.1; output and notice odd
- things!</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="bpf-not-configured">
- <para>Why do I get <literal>/dev/bpf0: device not
- configured</literal>?</para>
- </question>
-
- <answer>
- <para>The Berkeley Packet Filter (&man.bpf.4;)
- driver needs to be enabled before running programs that
- utilize it. Add this to your kernel config file and build
- a new kernel:</para>
-
- <programlisting>pseudo-device bpf # Berkeley Packet Filter</programlisting>
-
- <para>Secondly, after rebooting you will have to create the
- device node. This can be accomplished by a change to the
- <filename>/dev</filename> directory, followed by the execution
- of:</para>
-
- <screen>&prompt.root; <userinput>sh MAKEDEV bpf0</userinput></screen>
-
- <para>Please see the <ulink
- URL="../handbook/kernelconfig-nodes.html">
- handbook's entry on device nodes</ulink> for more information
- on creating devices.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="mount-smb-share">
- <para>How do I mount a disk from a Windows machine that is on my
- network, like smbmount in Linux?</para>
- </question>
-
- <answer>
- <para>Use the <application>sharity light</application>
- package in the ports collection.</para>
-
-<!-- XXX update for bp's SMBFS in CURRENT, when it is imported! -->
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="icmp-response-bw-limit">
- <para>What are these messages about <quote>icmp-response
- bandwidth limit 300/200 pps</quote> in my log
- files?</para>
- </question>
-
- <answer>
- <para>This is the kernel telling you that some activity is
- provoking it to send more ICMP or TCP reset (RST)
- responses than it thinks it should. ICMP responses are
- often generated as a result of attempted connections to
- unused UDP ports. TCP resets are generated as a result of
- attempted connections to unopened TCP ports. Among
- others, these are the kinds of activities which may cause
- these messages:</para>
-
- <itemizedlist>
- <listitem>
- <para>Brute-force denial of service (DoS) attacks (as
- opposed to single-packet attacks which exploit a
- specific vulnerability).</para>
- </listitem>
-
- <listitem>
- <para>Port scans which attempt to connect to a large
- number of ports (as opposed to only trying a few
- well-known ports).</para>
- </listitem>
- </itemizedlist>
-
- <para>The first number in the message tells you how many
- packets the kernel would have sent if the limit was not in
- place, and the second number tells you the limit. You can
- control the limit using the
- <varname>net.inet.icmp.icmplim</varname> sysctl variable
- like this, where <literal>300</literal> is the limit in
- packets per second:</para>
-
- <screen>&prompt.root; <userinput>sysctl -w net.inet.icmp.icmplim=300</userinput></screen>
-
- <para>If you do not want to see messages about this in your
- log files, but you still want the kernel to do response
- limiting, you can use the
- <varname>net.inet.icmp.icmplim_output</varname> sysctl
- variable to disable the output like this:</para>
-
- <screen>&prompt.root; <userinput>sysctl -w net.inet.icmp.icmplim_output=0</userinput></screen>
-
- <para>Finally, if you want to disable response limiting, you
- can set the <varname>net.inet.icmp.icmplim</varname>
- sysctl variable (see above for an example) to
- <literal>0</literal>. Disabling response limiting is
- discouraged for the reasons listed above.</para>
- </answer>
- </qandaentry>
- </qandaset>
- </chapter>
-
- <chapter id="ppp">
- <title>PPP</title>
-
- <qandaset>
- <qandaentry>
- <question id="userppp">
- <para>I cannot make &man.ppp.8; work. What am I doing wrong?</para>
- </question>
-
- <answer>
- <para>You should first read the
- &man.ppp.8;
- man page and the <ulink
- URL="../handbook/ppp-and-slip.html#USERPPP">
- ppp section of the handbook</ulink>. Enable logging with
- the command</para>
-
- <programlisting>set log Phase Chat Connect Carrier lcp ipcp ccp command</programlisting>
-
- <para>This command may be typed at the
- <application>ppp</application> command prompt or it may be
- entered in the <filename>/etc/ppp/ppp.conf</filename>
- configuration file (the start of the
- <literal>default</literal> section is the best
- place to put it). Make sure that
- <filename>/etc/syslog.conf</filename> (see &man.syslog.conf.5;) contains the lines</para>
-
- <programlisting>!ppp
-*.* /var/log/ppp.log</programlisting>
-
- <para>and that the file <filename>/var/log/ppp.log</filename>
- exists. You can now find out a lot about what is going on
- from the log file. Do not worry if it does not all make sense.
- If you need to get help from someone, it may make sense to
- them.</para>
-
- <para>If your version of ppp does not understand the
- <command>set log</command> command, you should download the
- <ulink URL="http://people.FreeBSD.org/~brian/">
- latest version</ulink>. It will build on FreeBSD version
- 2.1.5 and higher.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ppp-hangs">
- <para>Why does &man.ppp.8; hang when I run it?</para>
- </question>
-
- <answer>
- <para>This is usually because your hostname will not resolve.
- The best way to fix this is to make sure that
- <filename>/etc/hosts</filename> is consulted by your
- resolver first by editing <filename>/etc/host.conf</filename>
- and putting the <literal>hosts</literal> line first. Then,
- simply put an entry in <filename>/etc/hosts</filename> for
- your local machine. If you have no local network, change your
- <hostid>localhost</hostid> line:</para>
-
- <programlisting>127.0.0.1 foo.bar.com foo localhost</programlisting>
-
- <para>Otherwise, simply add another entry for your host.
- Consult the relevant man pages for more details.</para>
-
- <para>You should be able to successfully
- <command>ping -c1 `hostname`</command> when you are done.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ppp-nodial-auto">
- <para>Why won't &man.ppp.8; dial in <literal>-auto</literal>
- mode?</para>
- </question>
-
- <answer>
- <para>First, check that you have got a default route. By running
- <command>netstat -rn</command> (see &man.netstat.1;), you should see two entries like this:</para>
-
- <programlisting>Destination Gateway Flags Refs Use Netif Expire
-default 10.0.0.2 UGSc 0 0 tun0
-10.0.0.2 10.0.0.1 UH 0 0 tun0</programlisting>
-
- <para>This is assuming that you have used the addresses from the
- handbook, the man page or from the ppp.conf.sample file.
- If you haven't got a default route, it may be because you are
- running an old version of &man.ppp.8;
- that does not understand the word <literal>HISADDR</literal>
- in the ppp.conf file. If your version of
- <application>ppp</application> is from before FreeBSD
- 2.2.5, change the</para>
-
- <programlisting>add 0 0 HISADDR</programlisting>
-
- <para>line to one saying</para>
-
-
- <programlisting>add 0 0 10.0.0.2</programlisting>
-
- <para>Another reason for the default route line being missing
- is that you have mistakenly set up a default router in your
- <filename>/etc/rc.conf</filename> (see &man.rc.conf.5;) file (this file was called
- <filename>/etc/sysconfig</filename> prior to release 2.2.2),
- and you have omitted the line saying</para>
-
- <programlisting>delete ALL</programlisting>
-
- <para>from <filename>ppp.conf</filename>. If this is the case,
- go back to the <ulink
- URL="../handbook/ppp-and-slip.html#USERPPP-FINAL">
- Final system configuration</ulink> section of the
- handbook.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="no-route-to-host">
- <para>What does <errorname>No route to host</errorname> mean?</para>
- </question>
-
- <answer>
- <para>This error is usually due to a missing</para>
-
- <programlisting>MYADDR:
- delete ALL
- add 0 0 HISADDR</programlisting>
-
- <para>section in your <filename>/etc/ppp/ppp.linkup</filename>
- file. This is only necessary if you have a dynamic IP address
- or do not know the address of your gateway. If you are using
- interactive mode, you can type the following after entering
- <literal>packet mode</literal> (packet mode is
- indicated by the capitalized <acronym>PPP</acronym> in the
- prompt):</para>
-
- <programlisting>delete ALL
-add 0 0 HISADDR</programlisting>
-
- <para>Refer to the <ulink
- URL="../handbook/ppp-and-slip.html#USERPPP-DYNAMICIP">
- PPP and Dynamic IP addresses</ulink> section of the handbook
- for further details.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="connection-threeminutedrop">
- <para>Why does my connection drop after about 3 minutes?</para>
- </question>
-
- <answer>
- <para>The default ppp timeout is 3 minutes. This can be
- adjusted with the line</para>
-
- <programlisting>set timeout <replaceable>NNN</replaceable></programlisting>
-
- <para>where <replaceable>NNN</replaceable> is the number of
- seconds of inactivity before the connection is closed. If
- <replaceable>NNN</replaceable> is zero, the connection is never
- closed due to a timeout. It is possible to put this command in
- the <filename>ppp.conf</filename> file, or to type it at the
- prompt in interactive mode. It is also possible to adjust it on
- the fly while the line is active by connecting to
- <application>ppp</application>s server socket using
- &man.telnet.1; or &man.pppctl.8;.
- Refer to the
- &man.ppp.8; man
- page for further details.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ppp-drop-heavy-load">
- <para>Why does my connection drop under heavy load?</para>
- </question>
-
- <answer>
- <para>If you have Link Quality Reporting (LQR) configured,
- it is possible that too many LQR packets are lost between
- your machine and the peer. Ppp deduces that the line must
- therefore be bad, and disconnects. Prior to FreeBSD version
- 2.2.5, LQR was enabled by default. It is now disabled by
- default. LQR can be disabled with the line</para>
-
- <programlisting>disable lqr</programlisting>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ppp-drop-random">
- <para>Why does my connection drop after a random amount of
- time?</para>
- </question>
-
- <answer>
- <para>Sometimes, on a noisy phone line or even on a line with
- call waiting enabled, your modem may hang up because it
- thinks (incorrectly) that it lost carrier.</para>
-
- <para>There is a setting on most modems for determining how
- tolerant it should be to temporary losses of carrier. On a
- USR Sportster for example, this is measured by the S10
- register in tenths of a second. To make your modem more
- forgiving, you could add the following send-expect sequence
- to your dial string:</para>
-
- <programlisting>set dial "...... ATS10=10 OK ......"</programlisting>
-
- <para>Refer to your modem manual for details.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ppp-hangs-random">
- <para>Why does my connection hang after a random amount of
- time?</para>
- </question><answer>
-
- <para>Many people experience hung connections with no apparent
- explanation. The first thing to establish is which side of
- the link is hung.</para>
-
- <para>If you are using an external modem, you can simply try
- using &man.ping.8; to see if the
- <acronym>TD</acronym> light is flashing when you transmit data.
- If it flashes (and the <acronym>RD</acronym> light does not),
- the problem is with the remote end. If <acronym>TD</acronym>
- does not flash, the problem is local. With an internal modem,
- you will need to use the <literal>set server</literal> command in
- your <filename>ppp.conf</filename> file. When the hang occurs,
- connect to ppp using pppctl. If your network connection
- suddenly revives (ppp was revived due to the activity on the
- diagnostic socket) or if you cannot connect (assuming the
- <literal>set socket</literal> command succeeded at startup
- time), the problem is local. If you can connect and things are
- still hung, enable local async logging with <literal>set log
- local async</literal> and use &man.ping.8; from
- another window or terminal to make use of the link. The async
- logging will show you the data being transmitted and received
- on the link. If data is going out and not coming back, the
- problem is remote.</para>
-
- <para>Having established whether the problem is local or remote,
- you now have two possibilities:</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ppp-remote-not-responding">
- <para>The remote end is not responding. What can I do?</para>
- </question>
-
- <answer>
- <para>There is very little you can do about this. Most ISPs
- will refuse to help if you are not running a Microsoft OS.
- You can <literal>enable lqr</literal> in your
- <filename>ppp.conf</filename> file, allowing ppp to detect
- the remote failure and hang up, but this detection is
- relatively slow and therefore not that useful. You may want to
- avoid telling your ISP that you are running user-ppp....</para>
-
- <para>First, try disabling all local compression by adding the
- following to your configuration:</para>
-
- <programlisting>disable pred1 deflate deflate24 protocomp acfcomp shortseq vj
-deny pred1 deflate deflate24 protocomp acfcomp shortseq vj</programlisting>
-
- <para>Then reconnect to ensure that this makes no difference.
- If things improve or if the problem is solved completely,
- determine which setting makes the difference through trial
- and error. This will provide good ammunition when you contact
- your ISP (although it may make it apparent that you are not
- running a Microsoft product).</para>
-
- <para>Before contacting your ISP, enable async logging locally
- and wait until the connection hangs again. This may use up
- quite a bit of disk space. The last data read from the port
- may be of interest. It is usually ascii data, and may even
- describe the problem
- (<quote>Memory fault, core dumped</quote>?).</para>
-
- <para>If your ISP is helpful, they should be able to enable
- logging on their end, then when the next link drop occurs,
- they may be able to tell you why their side is having a
- problem. Feel free to send the details to &a.brian;, or
- even to ask your ISP to contact me directly.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ppp-hung">
- <para>&man.ppp.8; has hung. What can I do?</para>
- </question>
-
- <answer>
- <para>Your best bet here is to rebuild ppp by adding
- <literal>CFLAGS+=-g</literal> and <literal>STRIP=</literal>
- to the end of the Makefile, then doing a
- <command>make clean &amp;&amp; make &amp;&amp; make
- install</command>. When ppp hangs, find the ppp process id
- with <command>ps ajxww | fgrep ppp</command> and run
- <command>gdb ppp <replaceable>PID</replaceable></command>.
- From the gdb prompt, you can then use <command>bt</command>
- to get a stack trace.</para>
-
- <para>Send the results to <email>brian@Awfulhak.org</email>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ppp-loginok-thennothing">
- <para>Why does nothing happen after the <quote>Login OK!</quote>
- message?</para>
- </question>
-
- <answer>
- <para>Prior to FreeBSD version 2.2.5, once the link was
- established, &man.ppp.8;
- would wait for the peer to initiate the Line Control Protocol
- (LCP). Many ISPs will not initiate negotiations and expect
- the client to do so. To force
- <application>ppp</application> to initiate the LCP, use the
- following line:</para>
-
- <programlisting>set openmode active</programlisting>
-
- <note>
- <para>It usually does no
- harm if both sides initiate negotiation, so openmode is now
- active by default. However, the next section explains when
- it <emphasis>does</emphasis> do some harm.</para>
- </note>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ppp-same-magic">
- <para>I keep seeing errors about magic being the same. What does
- it mean?</para>
- </question>
-
- <answer>
- <para>Occasionally, just after connecting, you may see messages
- in the log that say <quote>magic is the same</quote>.
- Sometimes, these messages are harmless, and sometimes one side
- or the other exits. Most ppp implementations cannot survive
- this problem, and even if the link seems to come up, you will see
- repeated configure requests and configure acknowledgments in
- the log file until ppp eventually gives up and closes the
- connection.</para>
-
- <para>This normally happens on server machines with slow disks
- that are spawning a getty on the port, and executing ppp from
- a login script or program after login. I have also heard reports
- of it happening consistently when using slirp. The reason is
- that in the time taken between getty exiting and ppp starting,
- the client-side ppp starts sending Line Control Protocol (LCP)
- packets. Because ECHO is still switched on for the port on
- the server, the client ppp sees these packets
- <quote>reflect</quote> back.</para>
-
- <para>One part of the LCP negotiation is to establish a magic
- number for each side of the link so that
- <quote>reflections</quote> can be detected. The protocol says
- that when the peer tries to negotiate the same magic number, a
- NAK should be sent and a new magic number should be chosen.
- During the period that the server port has ECHO turned on, the
- client ppp sends LCP packets, sees the same magic in the
- reflected packet and NAKs it. It also sees the NAK reflect
- (which also means ppp must change its magic). This produces a
- potentially enormous number of magic number changes, all of
- which are happily piling into the server's tty buffer. As soon
- as ppp starts on the server, it is flooded with magic number
- changes and almost immediately decides it has tried enough to
- negotiate LCP and gives up. Meanwhile, the client, who no
- longer sees the reflections, becomes happy just in time to see
- a hangup from the server.</para>
-
- <para>This can be avoided by allowing the peer to start
- negotiating with the following line in your ppp.conf
- file:</para>
-
- <programlisting>set openmode passive</programlisting>
-
- <para>This tells ppp to wait for the server to initiate LCP
- negotiations. Some servers however may never initiate
- negotiations. If this is the case, you can do something
- like:</para>
-
- <programlisting>set openmode active 3</programlisting>
-
- <para>This tells ppp to be passive for 3 seconds, and then to
- start sending LCP requests. If the peer starts sending
- requests during this period, ppp will immediately respond
- rather than waiting for the full 3 second period.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ppp-lcp-constant">
- <para>LCP negotiations continue 'till the connection is
- closed. What is wrong?</para>
- </question>
-
- <answer>
- <para>There is currently an implementation mis-feature in
- <application>ppp</application> where it does not associate
- LCP, CCP &amp; IPCP responses with their original requests. As
- a result, if one <application>ppp</application>
- implementation is more than 6 seconds slower than the other
- side, the other side will send two additional LCP configuration
- requests. This is fatal.</para>
-
- <para>Consider two implementations,
- <hostid>A</hostid> and
- <hostid>B</hostid>. <hostid>A</hostid> starts
- sending LCP requests immediately after connecting and
- <hostid>B</hostid> takes 7 seconds to start. When
- <hostid>B</hostid> starts, <hostid>A</hostid>
- has sent 3 LCP REQs. We are assuming the line has ECHO switched
- off, otherwise we would see magic number problems as described in
- the previous section. <hostid>B</hostid> sends a
- REQ, then an ACK to the first of
- <hostid>A</hostid>'s REQs. This results in
- <hostid>A</hostid> entering the <acronym>OPENED</acronym>
- state and sending and ACK (the first) back to
- <hostid>B</hostid>. In the meantime,
- <hostid>B</hostid> sends back two more ACKs in response to
- the two additional REQs sent by <hostid>A</hostid>
- before <hostid>B</hostid> started up.
- <hostid>B</hostid> then receives the first ACK from
- <hostid>A</hostid> and enters the
- <acronym>OPENED</acronym> state.
- <hostid>A</hostid> receives the second ACK from
- <hostid>B</hostid> and goes back to the
- <acronym>REQ-SENT</acronym> state, sending another (forth) REQ
- as per the RFC. It then receives the third ACK and enters the
- <acronym>OPENED</acronym> state. In the meantime,
- <hostid>B</hostid> receives the forth REQ from
- <hostid>A</hostid>, resulting in it reverting to the
- <acronym>ACK-SENT</acronym> state and sending
- another (second) REQ and (forth) ACK as per the RFC.
- <hostid>A</hostid> gets the REQ, goes into
- <acronym>REQ-SENT</acronym> and sends another REQ. It
- immediately receives the following ACK and enters
- <acronym>OPENED</acronym>.</para>
-
- <para>This goes on 'till one side figures out that they are
- getting nowhere and gives up.</para>
-
- <para>The best way to avoid this is to configure one side to be
- <literal>passive</literal> - that is, make one side
- wait for the other to start negotiating. This can be done
- with the</para>
-
- <programlisting>set openmode passive</programlisting>
-
- <para>command. Care should be taken with this option. You
- should also use the</para>
-
- <programlisting>set stopped N</programlisting>
-
- <para>command to limit the amount of time that
- <application>ppp</application> waits for the peer to begin
- negotiations. Alternatively, the</para>
-
- <programlisting>set openmode active N</programlisting>
-
- <para>command (where <replaceable>N</replaceable> is the
- number of seconds to wait before starting negotiations) can be
- used. Check the manual page for details.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ppp-lockups">
- <para>Why does &man.ppp.8; lock up shortly after connection?</para>
- </question>
-
- <answer>
- <para>Prior to version 2.2.5 of FreeBSD, it was possible that
- your link was disabled shortly after connection due to
- <application>ppp</application> mis-handling Predictor1
- compression negotiation. This would only happen if both sides
- tried to negotiate different Compression Control Protocols
- (CCP). This problem is now corrected, but if you are still
- running an old version of <application>ppp</application>,
- the problem can be circumvented with the line</para>
-
- <programlisting>disable pred1</programlisting>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ppp-shell-test-lockup">
- <para>Why does &man.ppp.8; lock up when I shell out to test it?</para>
- </question>
-
- <answer>
- <para>When you execute the <command>shell</command> or
- <command>!</command> command, <application>ppp</application> executes a
- shell (or if you have passed any arguments,
- <application>ppp</application> will execute those arguments). Ppp will
- wait for the command to complete before continuing. If you
- attempt to use the ppp link while running the command, the link
- will appear to have frozen. This is because
- <application>ppp</application> is waiting for the command to
- complete.</para>
-
- <para>If you wish to execute commands like this, use the
- <command>!bg</command> command instead. This will execute
- the given command in the background, and ppp can continue to
- service the link.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ppp-nullmodem">
- <para>How come &man.ppp.8; over a null-modem cable never exits?</para>
- </question>
-
- <answer>
- <para>There is no way for <application>ppp</application> to
- automatically determine that a direct connection has been
- dropped. This is due to the lines that are used in a
- null-modem serial cable. When using this sort of connection,
- LQR should always be enabled with the line</para>
-
- <programlisting>enable lqr</programlisting>
-
- <para>LQR is accepted by default if negotiated by the peer.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ppp-auto-noreasondial">
- <para>Why does &man.ppp.8; dial for no reason in -auto mode?</para>
- </question><answer>
-
- <para>If <application>ppp</application> is dialing
- unexpectedly, you must determine the cause, and set up Dial
- filters (dfilters) to prevent such dialing.</para>
-
- <para>To determine the cause, use the following line:</para>
-
- <programlisting>set log +tcp/ip</programlisting>
-
- <para>This will log all traffic through the connection. The
- next time the line comes up unexpectedly, you will see the
- reason logged with a convenient timestamp next to it.</para>
-
- <para>You can now disable dialing under these circumstances.
- Usually, this sort of problem arises due to DNS lookups. To
- prevent DNS lookups from establishing a connection (this will
- <emphasis>not</emphasis> prevent
- <application>ppp</application> from passing the packets
- through an established connection), use the following:</para>
-
- <programlisting>set dfilter 1 deny udp src eq 53
-set dfilter 2 deny udp dst eq 53
-set dfilter 3 permit 0/0 0/0</programlisting>
-
- <para>This is not always suitable, as it will effectively break
- your demand-dial capabilities - most programs will need a DNS
- lookup before doing any other network related things.</para>
-
- <para>In the DNS case, you should try to determine what is
- actually trying to resolve a host name. A lot of the time,
- &man.sendmail.8; is the culprit. You should make sure that
- you tell sendmail not to do any DNS lookups in its
- configuration file. See the section on
- <link linkend="ispmail">Mail Configuration</link> for details
- on how to create your own configuration file and what should
- go into it. You may also want to add the following line to
- your <filename>.mc</filename> file:</para>
-
- <programlisting>define(`confDELIVERY_MODE', `d')dnl</programlisting>
-
- <para>This will make sendmail queue everything until the queue
- is run (usually, sendmail is invoked with
- <option>-bd -q30m</option>, telling it to run the queue every
- 30 minutes) or until a <command>sendmail -q</command> is done
- (perhaps from your ppp.linkup file).</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ccp-errors">
- <para>What do these CCP errors mean?</para>
- </question>
-
- <answer>
- <para>I keep seeing the following errors in my log file:</para>
-
- <programlisting>CCP: CcpSendConfigReq
-CCP: Received Terminate Ack (1) state = Req-Sent (6)</programlisting>
-
- <para>This is because ppp is trying to negotiate Predictor1
- compression, and the peer does not want to negotiate any
- compression at all. The messages are harmless, but if you
- wish to remove them, you can disable Predictor1 compression
- locally too:</para>
-
- <programlisting>disable pred1</programlisting>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ppp-lockup-ioerrors">
- <para>Why does &man.ppp.8; lock up during file transfers with IO
- errors?</para>
- </question>
-
- <answer>
- <para>Under FreeBSD 2.2.2 and before, there was a bug in the
- tun driver that prevents incoming packets of a size larger
- than the tun interface's MTU size. Receipt of a packet
- greater than the MTU size results in an IO error being logged
- via syslogd.</para>
-
- <para>The ppp specification says that an MRU of 1500 should
- <emphasis>always</emphasis> be accepted as a minimum,
- despite any LCP negotiations, therefore it is possible that
- should you decrease the MTU to less than 1500, your ISP will
- transmit packets of 1500 regardless, and you will tickle this
- non-feature - locking up your link.</para>
-
- <para>The problem can be circumvented by never setting an MTU of
- less than 1500 under FreeBSD 2.2.2 or before.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ppp-connectionspeed">
- <para>Why doesn't &man.ppp.8; log my connection speed?</para>
- </question>
-
- <answer>
-
- <para>In order to log all lines of your modem
- <quote>conversation</quote>, you must enable the
- following:</para>
-
- <programlisting>set log +connect</programlisting>
-
- <para>This will make &man.ppp.8; log
- everything up until the last requested <quote>expect</quote>
- string.</para>
-
- <para>If you wish to see your connect speed and are using PAP
- or CHAP (and therefore do not have anything to
- <quote>chat</quote> after the CONNECT in the dial script - no
- <literal>set login</literal> script), you must make sure that
- you instruct ppp to <quote>expect</quote> the whole CONNECT
- line, something like this:</para>
-
- <programlisting>set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 4 \
- \"\" ATZ OK-ATZ-OK ATDT\\T TIMEOUT 60 CONNECT \\c \\n"</programlisting>
-
- <para>Here, we get our CONNECT, send nothing, then expect a
- line-feed, forcing <application>ppp</application> to read
- the whole CONNECT response.</para>
-
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ppp-ignores-backslash">
- <para>Why does &man.ppp.8; ignore the <literal>\</literal> character
- in my chat script?</para>
- </question><answer>
-
- <para>Ppp parses each line in your config files so that it can
- interpret strings such as
- <literal>set phone "123 456 789"</literal> correctly (and
- realize that the number is actually only
- <emphasis>one</emphasis> argument. In order to specify
- a <literal>"</literal> character, you must escape it using a
- backslash (<literal>\</literal>).</para>
-
- <para>When the chat interpreter parses each argument, it
- re-interprets the argument in order to find any special
- escape sequences such as <literal>\P</literal> or
- <literal>\T</literal> (see the man page). As a result of this
- double-parsing, you must remember to use the correct number of
- escapes.</para>
-
- <para>If you wish to actually send a <literal>\</literal>
- character to (say) your modem, you would need something
- like:</para>
-
- <programlisting>set dial "\"\" ATZ OK-ATZ-OK AT\\\\X OK"</programlisting>
-
- <para>resulting in the following sequence:</para>
-
- <programlisting>ATZ
-OK
-AT\X
-OK</programlisting>
-
- <para>or</para>
-
- <programlisting>set phone 1234567
-set dial "\"\" ATZ OK ATDT\\T"</programlisting>
-
- <para>resulting in the following sequence:</para>
-
- <programlisting>ATZ
-OK
-ATDT1234567</programlisting>
-
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ppp-segfault-nocore">
- <para>Why does &man.ppp.8; get a seg-fault, but I see no
- <filename>ppp.core</filename> file?</para>
- </question>
-
- <answer>
- <para>Ppp (or any other program for that matter) should never
- dump core. Because ppp runs with an effective user id of 0,
- the operating system will not write ppp's core image to disk
- before terminating it. If, however ppp
- is actually terminating due to a
- segmentation violation or some other signal that normally
- causes core to be dumped, <emphasis>and</emphasis>
- you are sure you are using the latest version (see the start of
- this section), then you should do the following:</para>
-
- <screen>&prompt.user; <userinput>tar xfz ppp-*.src.tar.gz</userinput>
-&prompt.user; <userinput>cd ppp*/ppp</userinput>
-&prompt.user; <userinput>echo STRIP= &gt;&gt;Makefile</userinput>
-&prompt.user; <userinput>echo CFLAGS+=-g &gt;&gt;Makefile</userinput>
-&prompt.user; <userinput>make clean all</userinput>
-&prompt.user; <userinput>su</userinput>
-&prompt.root; <userinput>make install</userinput>
-&prompt.root; <userinput>chmod 555 /usr/sbin/ppp</userinput></screen>
-
- <para>You will now have a debuggable version of ppp installed.
- You will have to be <username>root</username> to run ppp as all of its privileges
- have been revoked. When you start ppp, take a careful note
- of what your current directory was at the time.</para>
-
- <para>Now, if and when ppp receives the segmentation violation,
- it will dump a core file called <filename>ppp.core</filename>. You should then do
- the following:</para>
-
- <screen>&prompt.user; <userinput>su</userinput>
-&prompt.root; <userinput>gdb /usr/sbin/ppp ppp.core</userinput>
-<prompt>(gdb)</prompt> <userinput>bt</userinput>
-.....
-<prompt>(gdb)</prompt> <userinput>f 0</userinput>
-....
-<prompt>(gdb)</prompt> <userinput>i args</userinput>
-....
-<prompt>(gdb)</prompt> <userinput>l</userinput>
-.....</screen>
-
- <para>All of this information should be given alongside your
- question, making it possible to diagnose the problem.</para>
-
- <para>If you are familiar with gdb, you may wish to find out some
- other bits and pieces such as what actually caused the dump and
- the addresses &amp; values of the relevant variables.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ppp-autodialprocess-noconnect">
- <para>Why does the process that forces a dial in auto mode never
- connect?</para>
- </question>
-
- <answer>
- <para>This was a known problem with
- <application>ppp</application> set up to negotiate a
- dynamic local IP number with the peer in auto mode. It is
- fixed in the latest version - search the man page for
- <literal>iface</literal>.</para>
-
- <para>The problem was that when that initial program calls
- &man.connect.2;, the IP number of the tun interface is assigned
- to the socket endpoint. The kernel creates the first outgoing
- packet and writes it to the tun device.
- <application>ppp</application> then reads the packet and
- establishes a connection. If, as a result of
- <application>ppp</application>'s dynamic IP assignment, the
- interface address is changed, the original socket endpoint will
- be invalid. Any subsequent packets sent to the peer will
- usually be dropped. Even if they are not, any responses will
- not route back to the originating machine as the IP number is
- no longer owned by that machine.</para>
-
- <para>There are several theoretical ways to approach this
- problem. It would be nicest if the peer would re-assign the
- same IP number if possible <literal>:-)</literal>
- The current version of <application>ppp</application> does
- this, but most other implementations do not.</para>
-
- <para>The easiest method from our side would be to never change
- the tun interface IP number, but instead to change all outgoing
- packets so that the source IP number is changed from the
- interface IP to the negotiated IP on the fly. This is
- essentially what the <literal>iface-alias</literal> option in
- the latest version of <application>ppp</application> is
- doing (with the help of
- &man.libalias.3; and ppp's <option>-nat</option> switch) -
- it is maintaining all previous interface addresses and NATing
- them to the last negotiated address.</para>
-
- <para>Another alternative (and probably the most reliable) would
- be to implement a system call that changes all bound sockets
- from one IP to another. <application>ppp</application> would
- use this call to modify the sockets of all existing programs
- when a new IP number is negotiated. The same system call could
- be used by dhcp clients when they are forced to re-bind() their
- sockets.</para>
-
- <para>Yet another possibility is to allow an interface to be
- brought up without an IP number. Outgoing packets would be
- given an IP number of 255.255.255.255 up until the first
- SIOCAIFADDR ioctl is done. This would result in fully binding
- the socket. It would be up to <application>ppp</application>
- to change the source IP number, but only if it is set to
- 255.255.255.255, and only the IP number and IP checksum would
- need to change. This, however is a bit of a hack as the kernel
- would be sending bad packets to an improperly configured
- interface, on the assumption that some other mechanism is
- capable of fixing things retrospectively.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ppp-nat-games">
- <para>Why don't most games work with the -nat switch?</para>
- </question>
-
- <answer>
- <para>The reason games and the like do not work when libalias
- is in use is that the machine on the outside will try to open a
- connection or send (unsolicited) UDP packets to the machine on
- the inside. The NAT software does not know that it should send
- these packets to the interior machine.</para>
-
- <para>To make things work, make sure that the only thing
- running is the software that you are having problems with, then
- either run tcpdump on the tun interface of the gateway or
- enable ppp tcp/ip logging (<literal>set log +tcp/ip</literal>)
- on the gateway.</para>
-
- <para>When you start the offending software, you should see
- packets passing through the gateway machine. When something
- comes back from the outside, it will be dropped (that is the
- problem). Note the port number of these packets then shut down
- the offending software. Do this a few times to see if the port
- numbers are consistent. If they are, then the following line in
- the relevant section of <filename>/etc/ppp/ppp.conf</filename> will make the
- software functional:</para>
-
- <programlisting>nat port <replaceable>proto</replaceable> <replaceable>internalmachine</replaceable>:<replaceable>port</replaceable> <replaceable>port</replaceable></programlisting>
-
- <para>where <replaceable>proto</replaceable> is either
- <literal>tcp</literal> or <literal>udp</literal>,
- <replaceable>internalmachine</replaceable> is the machine that
- you want the packets to be sent to and
- <replaceable>port</replaceable> is the destination port number
- of the packets.</para>
-
- <para>You will not be able to use the software on other machines
- without changing the above command, and running the software
- on two internal machines at the same time is out of the question
- - after all, the outside world is seeing your entire internal
- network as being just a single machine.</para>
-
- <para>If the port numbers are not consistent, there are three
- more options:</para>
-
- <orderedlist>
- <listitem>
- <para>Submit support in
- libalias. Examples of <quote>special cases</quote> can be found
- in <filename>/usr/src/lib/libalias/alias_*.c</filename>
- (<filename>alias_ftp.c</filename> is a good prototype). This
- usually involves reading certain recognised outgoing packets,
- identifying the instruction that tells the outside machine to
- initiate a connection back to the internal machine on a
- specific (random) port and setting up a <quote>route</quote> in
- the alias table so that the subsequent packets know where to
- go.</para>
-
- <para>This is the most difficult solution, but it is the best
- and will make the software work with multiple machines.</para>
- </listitem>
-
- <listitem>
- <para>Use a proxy. The
- application may support socks5 for example, or (as in the
- <quote>cvsup</quote> case) may have a <quote>passive</quote>
- option that avoids ever requesting that the peer open
- connections back to the local machine.</para>
- </listitem>
-
- <listitem>
- <para>Redirect everything to
- the internal machine using <literal>nat addr</literal>. This
- is the sledge-hammer approach.</para>
- </listitem>
- </orderedlist>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="useful-port-numbers">
- <para>Has anybody made a list of useful port numbers?</para>
- </question><answer>
-
- <para>Not yet, but this is intended to grow into such a list
- (if any interest is shown). In each example,
- <replaceable>internal</replaceable> should be replaced with
- the IP number of the machine playing the game.</para>
-
- <itemizedlist>
- <listitem>
- <para><application>Asheron's Call</application></para>
-
- <para><literal>nat port udp
- <replaceable>internal</replaceable>
- :65000 65000</literal></para>
-
- <para>Manually change the port number within the game to
- 65000. If you have got a number of machines that you wish
- to play on assign a unique port number for each (i.e.
- 65001, 65002, etc) and add a <literal>nat port</literal>
- line for each one.</para>
- </listitem>
-
- <listitem>
- <para><application>Half Life</application></para>
-
- <para><literal>nat port udp
- <replaceable>internal</replaceable>:27005
- 27015</literal></para>
- </listitem>
-
- <listitem>
- <para><application>PCAnywhere 8.0</application></para>
-
- <para><literal>nat port udp
- <replaceable>internal</replaceable>:5632
- 5632</literal></para>
-
- <para><literal>nat port tcp
- <replaceable>internal</replaceable>:5631
- 5631</literal></para>
- </listitem>
-
- <listitem>
- <para><application>Quake</application></para>
-
- <para><literal>nat port udp
- <replaceable>internal</replaceable>:6112
- 6112</literal></para>
-
- <para>Alternatively, you may want to take a look at <ulink
- URL="http://www.battle.net/support/proxy/">
- www.battle.net</ulink> for Quake proxy support.</para>
- </listitem>
-
- <listitem>
- <para><application>Quake 2</application></para>
-
- <para><literal>nat port udp
- <replaceable>internal</replaceable>:27901
- 27910</literal></para>
- <para><literal>nat port udp
- <replaceable>internal</replaceable>:60021
- 60021</literal></para>
- <para><literal>nat port udp
- <replaceable>internal</replaceable>:60040
- 60040</literal></para>
- </listitem>
-
- <listitem>
- <para><application>Red Alert</application></para>
-
- <para><literal>nat port udp
- <replaceable>internal</replaceable>:8675
- 8675</literal></para>
-
- <para><literal>nat port udp
- <replaceable>internal</replaceable>:5009
- 5009</literal></para>
- </listitem>
- </itemizedlist>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="fcs-errors">
- <para>What are FCS errors?</para>
- </question>
-
- <answer>
- <para>FCS stands for <literal>F</literal>rame
- <literal>C</literal>heck
- <literal>S</literal>equence. Each ppp packet
- has a checksum attached to ensure that the data being
- received is the data being sent. If the FCS of an incoming
- packet is incorrect, the packet is dropped and the HDLC FCS
- count is increased. The HDLC error values can be displayed
- using the <literal>show hdlc</literal> command.</para>
-
- <para>If your link is bad (or if your serial driver is dropping
- packets), you will see the occasional FCS error. This is not
- usually worth worrying about although it does slow down the
- compression protocols substantially. If you have an external
- modem, make sure your cable is properly shielded from
- interference - this may eradicate the problem.</para>
-
- <para>If your link freezes as soon as you have connected and you
- see a large number of FCS errors, this may be because your link
- is not 8 bit clean. Make sure your modem is not using software
- flow control (XON/XOFF). If your datalink
- <emphasis>must</emphasis> use software flow control, use the
- command <literal>set accmap 0x000a0000</literal> to tell
- <application>ppp</application> to escape the <literal>^Q</literal> and
- <literal>^S</literal> characters.</para>
-
- <para>Another reason for seeing too many FCS errors may be that
- the remote end has stopped talking <acronym>PPP</acronym>. You
- may want to enable <literal>async</literal> logging at this
- point to determine if the incoming data is actually a login or
- shell prompt. If you have a shell prompt at the remote end,
- it is possible to terminate ppp without dropping the line by
- using the <literal>close lcp</literal> command (a following
- <literal>term</literal> command will reconnect you to the shell
- on the remote machine.</para>
-
- <para>If nothing in your log file indicates why the link might
- have been terminated, you should ask the remote administrator
- (your ISP?) why the session was terminated.</para>
- </answer>
- </qandaentry>
-
- <qandaentry id=PPPoEwithNAT>
- <question id="macos-win98-pppoe-freeze">
- <para>Why do MacOS and Windows 98 connections freeze when
- running PPPoE on the gateway?</para>
- </question>
-
- <answer>
- <para>Thanks to Michael Wozniak
- <email>mwozniak@netcom.ca</email> for figuring this out and
- Dan Flemming <email>danflemming@mac.com</email> for the Mac
- solution:</para>
-
- <para>This is due to what is called a <quote>Black Hole</quote>
- router. MacOS and Windows 98 (and maybe other Microsoft OSs)
- send TCP packets with a requested segment size too big to fit
- into a PPPoE frame (MTU is 1500 by default for Ethernet)
- <emphasis>and</emphasis> have the <quote>do not
- fragment</quote> bit set (default of TCP) and the Telco router
- is not sending ICMP <quote>must fragment</quote> back to the
- www site you are trying to load. (Alternatively, the router is
- sending the ICMP packet correctly, but the firewall at the www
- site is dropping it.) When the www server is sending
- you frames that do not fit into the PPPoE pipe the Telco router
- drops them on the floor and your page does not load (some
- pages/graphics do as they are smaller than a MSS.) This seems
- to be the default of most Telco PPPoE configurations (if only
- they knew how to program a router... sigh...)</para>
-
- <para>One fix is to use regedit on your 95/98 boxes to add the
- following registry entry...</para>
-
- <programlisting>HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\NetTrans\0000\MaxMTU</programlisting>
-
- <para>It should be a string with a value <quote>1436</quote>, as
- some ADSL routers are reported to be unable to deal with packets
- larger than this. This registry key has been changed to
- <literal>Tcpip\Parameters\Interfaces\<replaceable>ID for adapter</replaceable>\MTU</literal>
- in Windows 2000 and becomes a DWORD.</para>
-
- <para>Refer to the Microsoft Knowledge Base documents <ulink
- url="http://support.microsoft.com/support/kb/articles/Q158/4/74.asp">Q158474
- - Windows TCPIP Registry Entries</ulink> and <ulink
- url="http://support.microsoft.com/support/kb/articles/Q120/6/42.asp">Q120642
- - TCPIP & NBT Configuration Parameters for Windows
- NT</ulink> for more information on changing Windows MTU to
- work with a NAT router.</para>
-
- <para>Another regedit possibility under Windows 2000 is to
- set the
- <literal>Tcpip\Parameters\Interfaces\<replaceable>ID for
- adapter</replaceable>\EnablePMTUBHDetect</literal> DWORD
- to 1 as mentioned in the Microsoft document 120642
- mentioned above.</para>
-
- <para>Unfortunately, MacOS does not provide an interface for
- changing TCP/IP settings. However, there is commercial software
- available, such as OTAdvancedTuner (OT for OpenTransport, the
- MacOS TCP/IP stack) by <ulink
- URL="http://www.softworks.com/">Sustainable Softworks</ulink>,
- that will allow users to customize TCP/IP settings. MacOS NAT
- users should select <literal>ip_interface_MTU</literal> from
- the drop-down menu, enter <literal>1450</literal> instead of
- <literal>1500</literal> in the box, click the box next to
- <literal>Save as Auto Configure</literal>, and click
- <literal>Make Active</literal>.</para>
-
- <para>The latest version of <application>ppp</application>
- (2.3 or greater) has an <command>enable tcpmssfixup</command>
- command that will automatically adjust the MSS to an appropriate
- value. This facility is enabled by default. If you are stuck
- with an older version of <application>ppp</application>, you
- may want to look at the <application>tcpmssd</application>
- port.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="desperation">
- <para>None of this helps - I am desperate! What can I do?</para>
- </question>
-
- <answer>
- <para>If all else fails, send as much information as you can,
- including your config files, how you are starting
- <application>ppp</application>, the relevant parts of your
- log file and the output of the <command>netstat -rn</command>
- command (before and after connecting) to the &a.questions; or
- the <ulink URL="news:comp.unix.bsd.freebsd.misc">
- comp.unix.bsd.freebsd.misc</ulink> news group, and someone
- should point you in the right direction.</para>
- </answer>
- </qandaentry>
- </qandaset>
- </chapter>
-
- <chapter id="serial">
- <title>Serial Communications</title>
-
- <para>This section answers common questions about serial
- communications with FreeBSD. PPP and SLIP are covered in the
- <xref linkend="networking" remap="Networking"> section.</para>
-
-
- <qandaset>
- <qandaentry>
- <question id="found-serial">
- <para>How do I tell if FreeBSD found my serial ports?</para>
- </question>
-
- <answer>
- <para>As the FreeBSD kernel boots, it will probe for the serial
- ports in your system for which the kernel was configured.
- You can either watch your system closely for the messages it
- prints or run the command</para>
-
- <screen>&prompt.user; <userinput>dmesg | grep sio</userinput></screen>
-
- <para>after your system is up and running.</para>
-
- <para>Here is some example output from the above command:</para>
-
- <programlisting>sio0 at 0x3f8-0x3ff irq 4 on isa
-sio0: type 16550A
-sio1 at 0x2f8-0x2ff irq 3 on isa
-sio1: type 16550A</programlisting>
-
- <para>This shows two serial ports. The first is on irq 4, is
- using port address <literal>0x3f8</literal>, and has a
- 16550A-type UART chip. The second uses the same kind of chip
- but is on irq 3 and is at port address <literal>0x2f8</literal>.
- Internal modem cards are treated just like serial ports---except
- that they always have a modem <quote>attached</quote> to the
- port.</para>
-
- <para>The <filename>GENERIC</filename> kernel includes support
- for two serial ports using the same irq and port address
- settings in the above example. If these settings are not
- right for your system, or if you've added modem cards or have
- more serial ports than your kernel is configured for, just
- reconfigure your kernel. See section
- <link linkend="make-kernel">about building a kernel</link> for
- more details.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="found-modem">
- <para>How do I tell if FreeBSD found my modem cards?</para>
- </question>
-
- <answer>
- <para>Refer to the answer to the previous question.</para>
-
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="missing-tty0X">
- <para>I just upgraded to 2.0.5 and my
- <devicename>tty0<replaceable>X</replaceable></devicename>
- are missing! How do I solve this problem?</para>
- </question>
-
- <answer>
- <para>Do not worry, they have been merged with the
- <devicename>ttyd<replaceable>X</replaceable></devicename> devices. You will have to change
- any old configuration files you have, though.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="access-serial-ports">
- <para>How do I access the serial ports on FreeBSD?</para>
- </question>
-
- <answer>
- <para>The third serial port,
- <devicename>sio2</devicename>
- (see &man.sio.4;, known as COM3 in DOS), is on <devicename>/dev/cuaa2</devicename>
- for dial-out devices, and on <devicename>/dev/ttyd2</devicename>
- for dial-in devices. What is the difference between these two
- classes of devices?</para>
-
- <para>You use <devicename>ttyd<replaceable>X</replaceable></devicename> for dial-ins. When
- opening <devicename>/dev/ttyd<replaceable>X</replaceable></devicename> in blocking mode, a
- process will wait for the corresponding
- <devicename>cuaa<replaceable>X</replaceable></devicename> device to become inactive, and then
- wait for the carrier detect line to go active. When you open
- the <devicename>cuaa<replaceable>X</replaceable></devicename> device, it makes sure the serial
- port is not already in use by the <devicename>ttyd<replaceable>X</replaceable></devicename>
- device. If the port is available, it <quote>steals</quote> it
- from the <devicename>ttyd<replaceable>X</replaceable></devicename> device. Also, the
- <devicename>cuaa<replaceable>X</replaceable></devicename> device does not care about carrier
- detect. With this scheme and an auto-answer modem, you can have
- remote users log in and you can still dialout with the same
- modem and the system will take care of all the
- conflicts.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="enable-multiport-serial">
- <para>How do I enable support for a multiport serial
- card?</para>
- </question>
-
- <answer>
- <para>Again, the section on kernel configuration provides
- information about configuring your kernel. For a multiport
- serial card, place an &man.sio.4; line
- for each serial port on the card in the kernel configuration
- file. But place the irq and vector specifiers on only one of
- the entries. All of the ports on the card should share one irq.
- For consistency, use the last serial port to specify the irq.
- Also, specify the <literal>COM_MULTIPORT</literal>
- option.</para>
-
- <para>The following example is for an AST 4-port serial card on
- irq 7:</para>
-
- <programlisting>options "COM_MULTIPORT"
-device sio4 at isa? port 0x2a0 tty flags 0x781
-device sio5 at isa? port 0x2a8 tty flags 0x781
-device sio6 at isa? port 0x2b0 tty flags 0x781
-device sio7 at isa? port 0x2b8 tty flags 0x781 irq 7 vector siointr</programlisting>
-
- <para>The flags indicate that the master port has minor number 7
- (<literal>0x700</literal>), diagnostics enabled during probe
- (<literal>0x080</literal>), and all the ports share an irq
- (<literal>0x001</literal>).</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="multiport-serial-share-irq">
- <para>Can FreeBSD handle multiport serial cards sharing
- irqs?</para>
- </question>
-
- <answer>
- <para>Not yet. You will have to use a different irq for each
- card.</para>
-
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="default-serial-params">
- <para>Can I set the default serial parameters for a
- port?</para>
- </question>
-
- <answer>
- <para>The <devicename>ttyd<replaceable>X</replaceable></devicename> (or
- <devicename>cuaa<replaceable>X</replaceable></devicename>) device is the regular device
- you will want to open for your applications. When a process
- opens the device, it will have a default set of terminal I/O
- settings. You can see these settings with the command</para>
-
- <screen>&prompt.root; <userinput>stty -a -f /dev/ttyd1</userinput></screen>
-
- <para>When you change the settings to this device, the settings
- are in effect until the device is closed. When it is reopened,
- it goes back to the default set. To make changes to the
- default set, you can open and adjust the settings of the
- <quote>initial state</quote> device. For example, to turn on
- <acronym>CLOCAL</acronym> mode, 8 bits, and
- <acronym>XON/XOFF</acronym> flow control by default for
- ttyd5, do:</para>
-
- <screen>&prompt.root; <userinput>stty -f /dev/ttyid5 clocal cs8 ixon ixoff</userinput></screen>
-
- <para>A good place to do this is in
- <filename>/etc/rc.serial</filename>. Now, an application will
- have these settings by default when it opens
- <filename>ttyd5</filename>. It can still change these settings
- to its liking, though.</para>
-
- <para>You can also prevent certain settings from being changed
- by an application by making adjustments to the
- <quote>lock state</quote> device. For example, to lock the
- speed of <devicename>ttyd5</devicename> to 57600 bps, do</para>
-
- <screen>&prompt.root; <userinput>stty -f /dev/ttyld5 57600</userinput></screen>
-
- <para>Now, an application that opens <devicename>ttyd5</devicename>
- and tries to change the speed of the port will be stuck with
- 57600 bps.</para>
-
- <para>Naturally, you should make the initial state and lock state
- devices writable only by <username>root</username>. The
- &man.MAKEDEV.8;
- script does <emphasis>NOT</emphasis> do this when it creates the
- device entries.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="enable-dialup">
- <para>How can I enable dialup logins on my modem?</para>
- </question>
-
- <answer>
- <para>So you want to become an Internet service provider, eh?
- First, you will need one or more modems that can auto-answer.
- Your modem will need to assert carrier-detect when it detects a
- carrier and not assert it all the time. It will need to hang up
- the phone and reset itself when the data terminal ready
- (<acronym>DTR</acronym>) line goes from on to off. It should
- probably use <filename>RTS/CTS</filename> flow control or no
- local flow control at all. Finally, it must use a constant
- speed between the computer and itself, but (to be nice to your
- callers) it should negotiate a speed between itself and the
- remote modem.</para>
-
- <para>For many Hayes command-set--compatible modems, this
- command will make these settings and store them in
- nonvolatile memory:</para>
-
- <programlisting>AT &amp;C1 &amp;D3 &amp;K3 &amp;Q6 S0=1 &amp;W</programlisting>
-
- <para>See the section <link linkend="direct-at">on sending AT
- commands</link> below for information on how to make these
- settings without resorting to an MS-DOS terminal program.</para>
-
- <para>Next, make an entry in
- <filename>/etc/ttys</filename> (see &man.ttys.5;) for the modem. This file lists all the ports
- on which the operating system will await logins. Add a line
- that looks something like this:</para>
-
- <programlisting>ttyd1 "/usr/libexec/getty std.57600" dialup on insecure</programlisting>
-
- <para>This line indicates that the second serial port
- (<devicename>/dev/ttyd1</devicename>) has a modem connected
- running at 57600 bps and no parity
- (<literal>std.57600</literal>, which comes from the file
- <filename>/etc/gettytab</filename>, see &man.gettytab.5;).
- The terminal type for this port is <literal>dialup</literal>.
- The port is <literal>on</literal> and is
- <literal>insecure</literal>---meaning root logins on the port
- are not allowed. For dialin ports like this one, use the
- <devicename>ttyd<replaceable>X</replaceable></devicename> entry.</para>
-
- <para>It is common practice to use <literal>dialup</literal> as
- the terminal type. Many users set up in their <filename>.profile</filename> or
- <filename>.login</filename> files a prompt for the actual terminal type if the
- starting type is dialup. The example shows the port as
- insecure. To become root on this port, you have to login as a
- regular user, then &man.su.1; to become
- <username>root</username>. If you use <literal>secure</literal>
- then <username>root</username> can login in directly.</para>
-
- <para>After making modifications to
- <filename>/etc/ttys</filename>, you need to send a hangup or
- <acronym>HUP</acronym> signal to the
- &man.init.8; process:</para>
-
- <screen>&prompt.root; <userinput>kill -HUP 1</userinput></screen>
-
- <para>This forces the &man.init.8; process to reread
- <filename>/etc/ttys</filename>. The init process will then start getty
- processes on all <literal>on</literal> ports. You can find
- out if logins are available for your port by typing</para>
-
- <screen>&prompt.user; <userinput>ps -ax | grep '[t]tyd1'</userinput></screen>
-
- <para>You should see something like:</para>
-
- <programlisting>747 ?? I 0:00.04 /usr/libexec/getty std.57600 ttyd1</programlisting>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="dumb-terminal">
- <para>How can I connect a dumb terminal to my FreeBSD
- box?</para>
- </question>
-
- <answer>
- <para>If you are using another computer as a terminal into your
- FreeBSD system, get a null modem cable to go between the two
- serial ports. If you are using an actual terminal, see its
- accompanying instructions.</para>
-
- <para>Then, modify
- <filename>/etc/ttys</filename> (see &man.ttys.5;), like above. For example, if you are
- hooking up a WYSE-50 terminal to the fifth serial port,
- use an entry like this:</para>
-
- <programlisting>ttyd4 "/usr/libexec/getty std.38400" wyse50 on secure</programlisting>
-
- <para>This example shows that the port on
- <devicename>/dev/ttyd4</devicename> has a wyse50 terminal
- connected at 38400 bps with no parity
- (<literal>std.38400</literal> from
- <filename>/etc/gettytab</filename>, see &man.gettytab.5;) and <username>root</username> logins are
- allowed (<literal>secure</literal>).</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="cannot-tip">
- <para>Why can't I run <command>tip</command> or
- <command>cu</command>?</para>
- </question>
-
- <answer>
- <para>On your system, the programs &man.tip.1;
- and &man.cu.1;
- are probably executable only by
- <username>uucp</username>
- and group <groupname>dialer</groupname>. You can use the group
- <groupname>dialer</groupname> to control who has access to your
- modem or remote systems. Just add yourself to group
- dialer.</para>
-
- <para>Alternatively, you can let everyone on your system
- run &man.tip.1; and &man.cu.1; by
- typing:</para>
-
- <screen>&prompt.root; <userinput>chmod 4511 /usr/bin/cu</userinput>
-&prompt.root; <userinput>chmod 4511 /usr/bin/tip</userinput></screen>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="hayes-unsupported">
- <para>My stock Hayes modem is not supported---what
- can I do?</para>
- </question>
-
- <answer>
- <para>Actually, the man page for &man.tip.1; is
- out of date. There is a generic Hayes dialer already built in.
- Just use <literal>at=hayes</literal> in your
- <filename>/etc/remote</filename> (see &man.remote.5;) file.</para>
-
- <para>The Hayes driver is not smart enough to recognize some of
- the advanced features of newer modems---messages like
- <literal>BUSY</literal>, <literal>NO DIALTONE</literal>, or
- <literal>CONNECT 115200</literal> will just confuse it. You
- should turn those messages off when you use &man.tip.1;
- (using <literal>ATX0&amp;W</literal>).</para>
-
- <para>Also, the dial timeout for &man.tip.1; is 60
- seconds. Your modem should use something less, or else tip
- will think there is a communication problem. Try
- <literal>ATS7=45&amp;W</literal>.</para>
-
- <para>Actually, as shipped &man.tip.1; does not yet
- support it fully. The solution is to edit the file
- <filename>tipconf.h</filename> in the directory
- <filename>/usr/src/usr.bin/tip/tip</filename>. Obviously you
- need the source distribution to do this.</para>
-
- <para>Edit the line <literal>#define HAYES 0</literal>
- to <literal>#define HAYES 1</literal>. Then
- <command>make</command> and <command>make install</command>.
- Everything works nicely after that.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="direct-at">
- <para>How am I expected to enter these AT commands?</para>
- </question>
-
- <answer>
- <para>Make what is called a <quote>direct</quote> entry in your
- <filename>/etc/remote</filename> file (see &man.remote.5;). For example, if your modem is hooked
- up to the first serial port, <devicename>/dev/cuaa0</devicename>,
- then put in the following line:</para>
-
- <programlisting>cuaa0:dv=/dev/cuaa0:br#19200:pa=none</programlisting>
-
- <para>Use the highest bps rate your modem supports in the br
- capability. Then, type
- <command>tip <devicename>cuaa0</devicename></command> (see &man.tip.1;)
- and you will be connected to your modem.</para>
-
- <para>If there is no <devicename>/dev/cuaa0</devicename> on your
- system, do this:</para>
-
- <screen>&prompt.root; <userinput>cd /dev</userinput>
-&prompt.root; <userinput>sh MAKEDEV cuaa0</userinput></screen>
-
- <para>Or use cu as <username>root</username> with the following command:</para>
-
- <screen>&prompt.root; <userinput>cu -l<replaceable>line</replaceable> -s<replaceable>speed</replaceable></userinput></screen>
-
- <para>with <replaceable>line</replaceable> being the serial port (e.g.
- <devicename>/dev/cuaa0</devicename>) and <replaceable>speed</replaceable> being the speed
- (e.g.<literal>57600</literal>). When you are done entering
- the AT commands hit <literal>~.</literal> to exit.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="gt-failure">
- <para>How come the <literal>&lt;@&gt;</literal> sign for the pn
- capability does not work?</para></question><answer>
-
- <para>The <literal>&lt;@&gt;</literal> sign in the phone number
- capability tells tip to look in
- <filename>/etc/phones</filename> for a phone number. But the
- <literal>&lt;@&gt;</literal> sign is also a special character
- in capability files like <filename>/etc/remote</filename>.
- Escape it with a backslash:</para>
-
- <programlisting>pn=\@</programlisting>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="dial-command-line">
- <para>How can I dial a phone number on the command
- line?</para>
- </question><answer>
-
- <para>Put what is called a <quote>generic</quote> entry in your
- <filename>/etc/remote</filename> file (see &man.remote.5;). For example:</para>
-
- <programlisting>tip115200|Dial any phone number at 115200 bps:\
- :dv=/dev/cuaa0:br#115200:at=hayes:pa=none:du:
-tip57600|Dial any phone number at 57600 bps:\
- :dv=/dev/cuaa0:br#57600:at=hayes:pa=none:du:</programlisting>
-
- <para>Then you can do something like <command>tip -115200
- 5551234</command>. If you prefer &man.cu.1;
- over
- &man.tip.1;, use a generic cu entry:</para>
-
- <programlisting>cu115200|Use cu to dial any number at 115200bps:\
- :dv=/dev/cuaa1:br#57600:at=hayes:pa=none:du:</programlisting>
-
- <para>and type <command>cu 5551234 -s 115200</command>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="set-bps">
- <para>Do I have to type in the bps rate every time I do
- that?</para>
- </question><answer>
-
- <para>Put in an entry for <literal>tip1200</literal> or
- <literal>cu1200</literal>, but go ahead and use whatever bps
- rate is appropriate with the br capability.
- &man.tip.1;
- thinks a good default is 1200 bps which is why it looks for
- a <literal>tip1200</literal> entry. You do not have to use 1200
- bps, though.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="terminal-server">
- <para>How can I more easily access a number of hosts through a
- terminal server?</para>
- </question>
-
- <answer>
- <para>Rather than waiting until you are connected and typing
- <literal>CONNECT <replaceable>host</replaceable></literal>
- each time, use tip's <literal>cm</literal> capability. For
- example, these entries in
- <filename>/etc/remote</filename> (see &man.remote.5;):</para>
-
- <programlisting>pain|pain.deep13.com|Forrester's machine:\
- :cm=CONNECT pain\n:tc=deep13:
-muffin|muffin.deep13.com|Frank's machine:\
- :cm=CONNECT muffin\n:tc=deep13:
-deep13:Gizmonics Institute terminal server:\
- :dv=/dev/cuaa2:br#38400:at=hayes:du:pa=none:pn=5551234:</programlisting>
-
- <para>will let you type <command>tip pain</command> or
- <command>tip muffin</command> to connect to the hosts
- <hostid>pain</hostid> or <hostid>muffin</hostid>; and
- <command>tip deep13</command> to get to the terminal
- server.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="tip-multiline">
- <para>Can tip try more than one line for each site?</para>
- </question>
-
- <answer>
- <para>This is often a problem where a university has several
- modem lines and several thousand students trying to use
- them...</para>
-
- <para>Make an entry for your university in
- <filename>/etc/remote</filename> (see &man.remote.5;) and use <literal>&lt;\@&gt;</literal> for
- the <literal>pn</literal> capability:</para>
-
- <programlisting>big-university:\
- :pn=\@:tc=dialout
-dialout:\
- :dv=/dev/cuaa3:br#9600:at=courier:du:pa=none:</programlisting>
-
- <para>Then, list the phone numbers for the university in
- <filename>/etc/phones</filename> (see &man.phones.5;):</para>
-
- <programlisting>big-university 5551111
-big-university 5551112
-big-university 5551113
-big-university 5551114</programlisting>
-
- <para>&man.tip.1;
- will try each one in the listed order, then give
- up. If you want to keep retrying, run &man.tip.1;
- in a while loop.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="multi-controlp">
- <para>Why do I have to hit CTRL+P twice to send CTRL+P
- once?</para>
- </question>
-
- <answer>
- <para>CTRL+P is the default <quote>force</quote> character,
- used to tell &man.tip.1;
- that the next character is literal data. You can set the
- force character to any other character with the
- <literal>~s</literal> escape, which means <quote>set a
- variable</quote>.</para>
-
- <para>Type <literal>~sforce=<replaceable>single-char
- </replaceable></literal> followed by a newline.
- <replaceable>single-char</replaceable> is any single character.
- If you leave out <replaceable>single-char</replaceable>,
- then the force character is the nul character, which you can
- get by typing CTRL+2 or CTRL+SPACE. A pretty good value for
- <replaceable>single-char</replaceable> is SHIFT+CTRL+6, which
- I have seen only used on some terminal servers.</para>
-
- <para>You can have the force character be whatever you want by
- specifying the following in your
- <filename>$HOME/.tiprc</filename> file:</para>
-
- <programlisting>force=<replaceable>single-char</replaceable></programlisting>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="uppercase">
- <para>Why is everything I type suddenly in UPPER CASE?</para>
- </question>
-
- <answer>
- <para>You must have pressed CTRL+A, &man.tip.1;
- <quote>raise character</quote>, specially
- designed for people with broken caps-lock keys. Use
- <literal>~s</literal> as above and set the variable
- <quote>raisechar</quote> to something reasonable. In fact,
- you can set it to the same as the force character, if you
- never expect to use either of these features.</para>
-
- <para>Here is a sample .tiprc file perfect for Emacs users who
- need to type CTRL+2 and CTRL+A a lot:</para>
-
- <programlisting>force=^^
-raisechar=^^</programlisting>
-
-<para>The ^^ is SHIFT+CTRL+6.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="tip-filetransfer">
- <para>How can I do file transfers with
- <command>tip</command>?</para>
- </question>
-
- <answer>
- <para>If you are talking to another Unix system, you can send
- and receive files with <literal>~p</literal> (put) and
- <literal>~t</literal> (take). These commands run
- &man.cat.1; and
- &man.echo.1; on the remote system to accept and send files.
- The syntax is:</para>
-
- <programlisting>~p &lt;local-file&gt; [&lt;remote-file&gt;]
-~t &lt;remote-file&gt; [&lt;local-file&gt;]</programlisting>
-
- <para>There is no error checking, so you probably should use
- another protocol, like zmodem.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="zmodem-tip">
- <para>How can I run zmodem with
- <application>tip</application>?</para>
- </question>
-
- <answer>
- <para>First, install one of the zmodem programs from the
- ports collection (such as one of the two from the comms
- category, <application>lrzsz</application> or
- <application>rzsz</application>.</para>
-
- <para>To receive files, start the sending program on the
- remote end. Then, press enter and type
- <literal>~C rz</literal> (or <literal>~C lrz</literal> if you
- installed <application>lrzsz</application>) to begin
- receiving them locally.</para>
-
- <para>To send files, start the receiving program on the remote
- end. Then, press enter and type
- <literal>~C sz <replaceable>files</replaceable></literal>
- (or <literal>~C lsz <replaceable>files</replaceable></literal>)
- to send them to the remote system.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="cannot-find-serial">
- <para>How come FreeBSD cannot seem to find my serial ports, even
- when the settings are correct?</para>
- </question>
-
- <answer>
- <para>Motherboards and cards with Acer UARTs do not probe
- properly under the FreeBSD sio probe. Obtain a patch from
- <ulink URL="http://www.lemis.com/serial-port-patch.html">
- www.lemis.com</ulink> to fix your problem.</para>
- </answer>
- </qandaentry>
- </qandaset>
- </chapter>
-
- <chapter id="misc">
- <title>Miscellaneous Questions</title>
-
- <qandaset>
- <qandaentry>
- <question id="more-swap">
- <para>FreeBSD uses far more swap space than Linux. Why?</para>
- </question>
-
- <answer>
- <para>FreeBSD only appears to use more swap than Linux. In
- actual fact, it does not. The main difference between FreeBSD
- and Linux in this regard is that FreeBSD will proactively move
- entirely idle, unused pages of main memory into swap in order
- to make more main memory available for active use. Linux tends
- to only move pages to swap as a last resort. The perceived
- heavier use of swap is balanced by the more efficient use of
- main memory.</para>
-
- <para>Note that while FreeBSD is proactive in this regard, it
- does not arbitrarily decide to swap pages when the system is
- truly idle. Thus you will not find your system all paged
- out when you get up in the morning after leaving it idle
- overnight.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="top-freemem">
- <para>Why does <command>top</command> show very little free memory even
- when I have very few programs running?</para>
- </question>
-
- <answer>
- <para>The simple answer is that free memory is wasted
- memory. Any memory that your programs do not actively
- allocate is used within the FreeBSD kernel as disk
- cache. The values shown by &man.top.1; labelled as
- <literal>Inact</literal>, <literal>Cache</literal>, and
- <literal>Buf</literal> are all cached data at different
- aging levels. This cached data means the system does
- not have to access a slow disk again for data it has
- accessed recently, thus increasing overall performance.
- In general, a low value shown for <literal>Free</literal>
- memory in &man.top.1; is good, provided it is not
- <emphasis>very</emphasis> low.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="aout-elf">
- <para>Why use (what are) a.out and ELF executable
- formats?</para>
- </question>
-
- <answer>
- <para>To understand why FreeBSD uses the
- <filename>ELF</filename> format, you must first know a little
- about the 3 currently <quote>dominant</quote> executable
- formats for Unix:</para>
-
- <note>
- <para>Prior to FreeBSD 3.x, FreeBSD used the a.out
- format.</para>
- </note>
-
- <itemizedlist>
- <listitem>
- <para>&man.a.out.5;</para>
-
- <para>The oldest and <quote>classic</quote> unix object
- format. It uses a short and compact header with a magic
- number at the beginning that is often used to
- characterize the format (see
- &man.a.out.5; for more details). It contains three
- loaded segments: .text, .data, and .bss plus a symbol
- table and a string table.</para>
- </listitem>
-
- <listitem>
- <para><acronym>COFF</acronym></para>
-
- <para>The SVR3 object format. The header now comprises
- a section table, so you can have more than just .text,
- .data, and .bss sections.</para>
- </listitem>
-
- <listitem>
- <para><acronym>ELF</acronym></para>
-
- <para>The successor to <acronym>COFF</acronym>, featuring
- Multiple sections and 32-bit or 64-bit possible values.
- One major drawback: <acronym>ELF</acronym> was also
- designed with the assumption that there would be only
- one ABI per system architecture. That assumption is
- actually quite incorrect, and not even in the
- commercial SYSV world (which has at least three ABIs:
- SVR4, Solaris, SCO) does it hold true.</para>
-
- <para>FreeBSD tries to work around this problem somewhat
- by providing a utility for <emphasis>branding</emphasis>
- a known <acronym>ELF</acronym> executable with
- information about the ABI it is compliant with. See the
- man page for &man.brandelf.1;
- for more information.</para>
- </listitem>
- </itemizedlist>
-
- <para>FreeBSD comes from the <quote>classic</quote> camp and has
- traditionally used the &man.a.out.5;
- format, a technology tried and proven through
- many generations of BSD releases. Though it has also been
- possible for some time to build and run native
- <acronym>ELF</acronym> binaries (and kernels) on a FreeBSD
- system, FreeBSD initially resisted the <quote>push</quote> to
- switch to <acronym>ELF</acronym> as the default format. Why?
- Well, when the Linux camp made their painful transition to
- <acronym>ELF</acronym>, it was not so much to flee the
- <filename>a.out</filename> executable format as it was their
- inflexible jump-table based shared library mechanism, which
- made the construction of shared libraries very difficult for
- vendors and developers alike. Since the <acronym>ELF</acronym>
- tools available offered a solution to the shared library
- problem and were generally seen as <quote>the way
- forward</quote> anyway, the migration cost was accepted as
- necessary and the transition made.</para>
-
- <para>In FreeBSD's case, our shared library mechanism is based
- more closely on Sun's <application>SunOS</application>-style
- shared library mechanism and, as such, is very easy to use.
- However, starting with 3.0, FreeBSD officially supports
- <acronym>ELF</acronym> binaries as the default format. Even
- though the <filename>a.out</filename> executable format has
- served us well, the GNU people, who author the compiler tools
- we use, have dropped support for the <filename>a.out</filename>
- format. This has forced us to maintain a divergent version of
- the compiler and linker, and has kept us from reaping the
- benefits of the latest GNU development efforts. Also the
- demands of ISO-C++, notably constructors and destructors, has
- also led to native <acronym>ELF</acronym> support in future
- FreeBSD releases.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="binary-formats">
- <para>Yes, but why are there so many different formats?</para>
- </question>
-
- <answer>
- <para>Back in the dim, dark past, there was simple hardware.
- This simple hardware supported a simple, small system. a.out
- was completely adequate for the job of representing binaries on
- this simple system (a PDP-11). As people ported Unix from this
- simple system, they retained the a.out format because it was
- sufficient for the early ports of Unix to architectures like
- the Motorola 68k, VAXen, etc.</para>
-
- <para>Then some bright hardware engineer decided that if he
- could force software to do some sleazy tricks, then he would be
- able to shave a few gates off the design and allow his CPU core
- to run faster. While it was made to work with this new kind of
- hardware (known these days as RISC), <filename>a.out</filename>
- was ill-suited for this hardware, so many formats were
- developed to get to a better performance from this hardware
- than the limited, simple <filename>a.out</filename> format
- could offer. Things like <acronym>COFF</acronym>,
- <acronym>ECOFF</acronym>, and a few obscure others were
- invented and their limitations explored before things seemed to
- settle on <acronym>ELF</acronym>.</para>
-
- <para>In addition, program sizes were getting huge and disks
- (and physical memory) were still relatively small so the
- concept of a shared library was born. The VM system also became
- more sophisticated. While each one of these advancements was
- done using the <filename>a.out</filename> format, its
- usefulness was stretched more and more with each new feature.
- In addition, people wanted to dynamically load things at run
- time, or to junk parts of their program after the init code had
- run to save in core memory and/or swap space. Languages became
- more sophisticated and people wanted code called before main
- automatically. Lots of hacks were done to the
- <filename>a.out</filename> format to allow all of these things
- to happen, and they basically worked for a time. In time,
- <filename>a.out</filename> was not up to handling all these
- problems without an ever increasing overhead in code and
- complexity. While <acronym>ELF</acronym> solved many of these
- problems, it would be painful to switch from the system that
- basically worked. So <acronym>ELF</acronym> had to wait until
- it was more painful to remain with <filename>a.out</filename>
- than it was to migrate to <acronym>ELF</acronym>.</para>
-
- <para>However, as time passed, the build tools that FreeBSD
- derived their build tools from (the assembler and loader
- especially) evolved in two parallel trees. The FreeBSD tree
- added shared libraries and fixed some bugs. The GNU folks that
- originally write these programs rewrote them and added simpler
- support for building cross compilers, plugging in different
- formats at will, etc. Since many people wanted to build cross
- compilers targeting FreeBSD, they were out of luck since the
- older sources that FreeBSD had for as and ld were not up to the
- task. The new gnu tools chain (binutils) does support cross
- compiling, <acronym>ELF</acronym>, shared libraries, C++
- extensions, etc. In addition, many vendors are releasing
- <acronym>ELF</acronym> binaries, and it is a good thing for
- FreeBSD to run them. And if it is running
- <acronym>ELF</acronym> binaries, why bother having
- <filename>a.out</filename> any more? It is a tired old horse
- that has proven useful for a long time, but it is time to turn
- him out to pasture for his long, faithful years of
- service.</para>
-
- <para><acronym>ELF</acronym> is more expressive than a.out and
- will allow more extensibility in the base system. The
- <acronym>ELF</acronym> tools are better maintained, and offer
- cross compilation support, which is important to many people.
- <acronym>ELF</acronym> may be a little slower than a.out, but
- trying to measure it can be difficult. There are also numerous
- details that are different between the two in how they map
- pages, handle init code, etc. None of these are very important,
- but they are differences. In time support for
- <filename>a.out</filename> will be moved out of the GENERIC
- kernel, and eventually removed from the kernel once the need to
- run legacy <filename>a.out</filename> programs is past.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="chmod-symlinks">
- <para>Why won't chmod change the permissions on symlinks?</para>
- </question>
-
- <answer>
- <para>Symlinks do not have permissions, and by default,
- &man.chmod.1; will not follow symlinks to change the
- permissions on the target file. So if you have a file,
- <filename>foo</filename>, and a symlink to that file,
- <filename>bar</filename>, then this command will always
- succeed.</para>
-
- <screen>&prompt.user; <userinput>chmod g-w bar</userinput></screen>
-
- <para>However, the permissions on <filename>foo</filename> will
- not have changed.</para>
-
- <para>You have to use either <option>-H</option> or
- <option>-L</option> together with the <option>-R</option>
- option to make this work. See the
- &man.chmod.1; and &man.symlink.7;
- man pages for more info.</para>
-
- <warning>
- <para>The <option>-R</option> option does a
- <acronym>RECURSIVE</acronym>
- &man.chmod.1;. Be careful about
- specifying directories or symlinks to directories to
- &man.chmod.1;. If you want to
- change the permissions of a directory referenced by a
- symlink, use &man.chmod.1;
- without any options and follow the symlink
- with a trailing slash (<filename>/</filename>). For
- example, if <filename>foo</filename> is a symlink to
- directory <filename>bar</filename>, and you want to change
- the permissions of <filename>foo</filename> (actually
- <filename>bar</filename>), you would do something
- like:</para>
-
- <screen>&prompt.user; <userinput>chmod 555 foo/</userinput></screen>
-
- <para>With the trailing slash, &man.chmod.1;
- will follow the symlink,
- <filename>foo</filename>, to change the permissions of the
- directory, <filename>bar</filename>.</para>
- </warning>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="login-8char">
- <para>Why are login names <emphasis>still</emphasis>
- restricted to 8 characters?</para>
- </question>
-
- <answer>
-
- <para>You would think it would be easy enough to change
- <literal>UT_NAMESIZE</literal> and rebuild the whole world,
- and everything would just work. Unfortunately there are often
- scads of applications and utilities (including system tools)
- that have hard-coded small numbers (not always
- <literal>8</literal> or <literal>9</literal>, but oddball ones
- like <literal>15</literal> and <literal>20</literal>) in
- structures and buffers. Not only will this get you log files
- which are trashed (due to variable-length records getting
- written when fixed records were expected), but it can break
- Suns NIS clients and potentially cause other problems in
- interacting with other Unix systems.</para>
-
- <para>In FreeBSD 3.0 and later, the maximum name length has
- been increased to 16 characters and those various utilities
- with hard-coded name sizes have been found and fixed. The fact
- that this touched so many areas of the system is why, in fact,
- the change was not made until 3.0.</para>
-
- <para>If you are absolutely confident in your ability to find
- and fix these sorts of problems for yourself when and if they
- pop up, you can increase the login name length in earlier
- releases by editing <filename>/usr/include/utmp.h</filename> and changing
- UT_NAMESIZE accordingly. You must also update MAXLOGNAME in
- <filename>/usr/include/sys/param.h</filename> to match the UT_NAMESIZE change.
- Finally, if you build from sources, do not forget that
- /usr/include is updated each time! Change the appropriate files
- in /usr/src/.. instead.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="dos-binaries">
- <para>Can I run DOS binaries under FreeBSD?</para>
- </question>
-
- <answer>
- <para>Yes, starting with version 3.0 you can using BSDI's
- <application>doscmd</application> DOS emulation which has
- been integrated and enhanced. Send mail to the &a.emulation;
- if you are interested in joining this ongoing effort!</para>
-
- <para>For pre-3.0 systems, there is a neat utility called
- <application>pcemu</application> in the ports collection which emulates an 8088
- and enough BIOS services to run DOS text mode applications.
- It requires the X Window System (provided as XFree86).</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="translation">
- <para>What do I need to do to translate a FreeBSD document into
- my native language?</para>
- </question>
-
- <answer>
- <para>See the <ulink url="../fdp-primer/translations.html">
- Translation FAQ</ulink> in the FreeBSD Documentation Project
- Primer.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="free-account">
- <para>Where can I find a free FreeBSD account?</para>
- </question>
-
- <answer>
- <para>While FreeBSD does not provide open access to any of their
- servers, others do provide open access Unix systems. The
- charge varies and limited services may be available.</para>
-
- <para><ulink URL="http://www.arbornet.org/">Arbornet,
- Inc</ulink>, also known as M-Net, has been providing open
- access to Unix systems since 1983. Starting on an Altos
- running System III, the site switched to BSD/OS in 1991. In
- June of 2000, the site switched again to FreeBSD. M-Net can be
- accessed via telnet and SSH and provides basic access to the
- entire FreeBSD software suite. However, network access is
- limited to members and patrons who donate to the system, which
- is run as a non-profit organization. M-Net also provides an
- bulletin board system and interactive chat.</para>
-
- <para><ulink URL="http://www.grex.org/">Grex</ulink> provides a
- site very similar to M-Net including the same bulletin board
- and interactive chat software. However, the machine is a Sun
- 4M and is running SunOS</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="sup-define">
- <para>What is <command>sup</command>, and how do I use
- it?</para>
- </question>
-
- <answer>
- <para><ulink URL="http://www.FreeBSD.org/cgi/ports.cgi?^sup">
- SUP</ulink> stands for Software Update Protocol, and was
- developed by CMU for keeping their development trees in sync.
- We used it to keep remote sites in sync with our central
- development sources.</para>
-
- <para>SUP is not bandwidth friendly, and has been retired.
- The current recommended method to keep your sources up to
- date is <ulink URL="../handbook/synching.html#CVSUP">
- Handbook entry on CVSup</ulink></para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="very-very-cool">
- <para>How cool is FreeBSD?</para>
- </question>
-
- <answer>
- <para>Q. Has anyone done any temperature testing while
- running FreeBSD? I know Linux runs cooler than dos, but have
- never seen a mention of FreeBSD. It seems to run really
- hot.</para>
-
- <para>A. No, but we have done numerous taste tests on
- blindfolded volunteers who have also had 250 micrograms of
- LSD-25 administered beforehand. 35% of the volunteers said that
- FreeBSD tasted sort of orange, whereas Linux tasted like purple
- haze. Neither group mentioned any significant variances in
- temperature. We eventually had to throw the
- results of this survey out entirely anyway when we found that
- too many volunteers were wandering out of the room during the
- tests, thus skewing the results. We think most of the volunteers
- are at Apple now, working on their new <quote>scratch and
- sniff</quote> GUI. It's a funny old business we're in!</para>
-
- <para>Seriously, both FreeBSD and Linux use the
- <acronym>HLT</acronym> (halt) instruction when the system is
- idle thus lowering its energy consumption and therefore the
- heat it generates. Also if you have APM (advanced power
- management) configured, then FreeBSD can also put the CPU into
- a low power mode.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="letmeoutofhere">
- <para>Who is scratching in my memory banks??</para>
- </question>
-
- <answer>
- <para>Q. Is there anything <quote>odd</quote> that FreeBSD
- does when compiling the kernel which would cause the memory to
- make a scratchy sound? When compiling (and for a brief moment
- after recognizing the floppy drive upon startup, as well), a
- strange scratchy sound emanates from what appears to be the
- memory banks.</para>
-
- <para>A. Yes! You will see frequent references to
- <quote>daemons</quote> in the BSD documentation, and what most
- people do not know is that this refers to genuine, non-corporeal
- entities that now possess your computer. The scratchy sound
- coming from your memory is actually high-pitched whispering
- exchanged among the daemons as they best decide how to deal
- with various system administration tasks.</para>
-
- <para>If the noise gets to you, a good
- <command>fdisk /mbr</command> from DOS will get rid of them,
- but do not be surprised if they react adversely and try to stop
- you. In fact, if at any point during the exercise you hear the
- satanic voice of Bill Gates coming from the built-in speaker,
- take off running and don't ever look back! Freed from the
- counterbalancing influence of the BSD daemons, the twin demons
- of DOS and Windows are often able to re-assert total control
- over your machine to the eternal damnation of your soul.
- Now that you know, given a choice you would probably prefer to get
- used to the scratchy noises, no?</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="define-MFC">
- <para>What does <acronym>MFC</acronym> mean?</para>
- </question>
-
- <answer>
- <para>MFC is an acronym for <quote>Merged From -CURRENT</quote>.
- It is used in the CVS logs to denote when a change was
- migrated from the CURRENT to the STABLE branches.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="define-BSD">
- <para>What does <acronym>BSD</acronym> mean?</para>
- </question>
-
- <answer>
- <para>It stands for something in a secret language that only
- members can know. It does not translate literally but its ok
- to tell you that BSD's translation is something between,
- <quote>Formula-1 Racing Team</quote>, <quote>Penguins are
- tasty snacks</quote>, and <quote>We have a better sense of
- humor than Linux</quote>. :-)</para>
-
- <para>Seriously, BSD is an acronym for <quote>Berkeley
- Software Distribution</quote>, which is the name the
- Berkeley <acronym>CSRG</acronym> (Computer Systems Research
- Group) chose for their Unix distribution way back when.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="define-repocopy">
- <para>What is a repo-copy?</para>
- </question>
-
- <answer>
- <para>A repo-copy (which is a short form of <quote>repository
- copy</quote>) refers to the direct copying of files within
- the CVS repository.</para>
-
- <para>Without a repo-copy, if a file needed to be copied or
- moved to another place in the repository, the committer would
- run <command>cvs add</command> to put the file in its new
- location, and then <command>cvs rm</command> on the old file
- if the old copy was being removed.</para>
-
- <para>The disadvantage of this method is that the history
- (i.e. the entries in the CVS logs) of the file would not be
- copied to the new location. As the FreeBSD Project considers
- this history very useful, a repository copy is often used
- instead. This is a process where one of the repository meisters
- will copy the files directly within the repository, rather than
- using the &man.cvs.1; program.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="bikeshed-painting">
- <para>Why should I care what color the bikeshed is?</para>
- </question>
-
- <answer>
- <para>The really, really short answer is that you should not.
- The somewhat longer answer is that just because you are
- capable of building a bikeshed doesn't mean you should stop
- others from building one just because you don't like the
- color they plan to paint it. This is a metaphor indicating
- that you need not argue about every little feature just
- because you know enough to do so. Some people have
- commented that the amount of noise generated by a change is
- inversely proportional to the complexity of the
- change.</para>
-
- <para>The longer and more complete answer is that after a very
- long argument about whether &man.sleep.1; should take
- fractional second arguments, &a.phk; posted a long
- message entitled <quote><ulink
- url="http://www.FreeBSD.org/cgi/getmsg.cgi?fetch=506636+517178+/usr/local/www/db/text/1999/freebsd-hackers/19991003.freebsd-hackers">A bike
- shed (any colour will do) on greener grass...</ulink></quote>.
- The appropriate portions of that message are quoted
- below.</para>
-
- <blockquote>
- <attribution>&a.phk; on freebsd-hackers, October
- 2, 1999</attribution>
-
- <para>
- <quote>What is it about this bike shed?</quote> Some
- of you have asked me.</para>
-
- <para>It is a long story, or rather it is an old story, but
- it is quite short actually. C. Northcote Parkinson wrote
- a book in the early 1960'ies, called <quote>Parkinson's
- Law</quote>, which contains a lot of insight into the
- dynamics of management.</para>
-
- <para>[snip a bit of commentary on the book]</para>
-
- <para>In the specific example involving the bike shed, the
- other vital component is an atomic power-plant, I guess
- that illustrates the age of the book.</para>
-
- <para>Parkinson shows how you can go in to the board of
- directors and get approval for building a multi-million or
- even billion dollar atomic power plant, but if you want to
- build a bike shed you will be tangled up in endless
- discussions.</para>
-
- <para>Parkinson explains that this is because an atomic
- plant is so vast, so expensive and so complicated that
- people cannot grasp it, and rather than try, they fall
- back on the assumption that somebody else checked all the
- details before it got this far. Richard P. Feynmann
- gives a couple of interesting, and very much to the point,
- examples relating to Los Alamos in his books.</para>
-
- <para>A bike shed on the other hand. Anyone can build one
- of those over a weekend, and still have time to watch the
- game on TV. So no matter how well prepared, no matter how
- reasonable you are with your proposal, somebody will seize
- the chance to show that he is doing his job, that he is
- paying attention, that he is
- <emphasis>here</emphasis>.</para>
-
- <para>In Denmark we call it <quote>setting your
- fingerprint</quote>. It is about personal pride and
- prestige, it is about being able to point somewhere and
- say <quote>There! <emphasis>I</emphasis> did that.</quote>
- It is a strong trait in politicians, but present in most
- people given the chance. Just think about footsteps in
- wet cement.</para>
- </blockquote>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="changing-lightbulbs">
- <para>How many FreeBSD hackers does it take to change a
- lightbulb?</para>
- </question>
-
- <answer>
- <para>One thousand, one hundred and seventy-two:</para>
-
- <para>Twenty-three to complain to -CURRENT about the lights
- being out;</para>
-
- <para>Four to claim that it is a configuration problem, and
- that such matters really belong on -questions;</para>
-
- <para>Three to submit PRs about it, one of which is misfiled
- under doc and consists only of "it's dark";</para>
-
- <para>One to commit an untested lightbulb which breaks
- buildworld, then back it out five minutes later;</para>
-
- <para>Eight to flame the PR originators for not including
- patches in their PRs;</para>
-
- <para>Five to complain about buildworld being broken;</para>
-
- <para>Thirty-one to answer that it works for them, and they
- must have cvsupped at a bad time;</para>
-
- <para>One to post a patch for a new lightbulb to -hackers;</para>
-
- <para>One to complain that he had patches for this three years
- ago, but when he sent them to -CURRENT they were just ignored,
- and he has had bad experiences with the PR system; besides,
- the proposed new lightbulb is non-reflexive;</para>
-
- <para>Thirty-seven to scream that lightbulbs do not belong in
- the base system, that committers have no right to do things
- like this without consulting the Community, and WHAT IS
- -CORE DOING ABOUT IT!?</para>
-
- <para>Two hundred to complain about the color of the bicycle
- shed;</para>
-
- <para>Three to point out that the patch breaks &man.style.9;;</para>
-
- <para>Seventeen to complain that the proposed new lightbulb is
- under GPL;</para>
-
- <para>Five hundred and eighty-six to engage in a flame war
- about the comparative advantages of the GPL, the BSD
- license, the MIT license, the NPL, and the personal hygiene
- of unnamed FSF founders;</para>
-
- <para>Seven to move various portions of the thread to -chat
- and -advocacy;</para>
-
- <para>One to commit the suggested lightbulb, even though it
- shines dimmer than the old one;</para>
-
- <para>Two to back it out with a furious flame of a commit
- message, arguing that FreeBSD is better off in the dark than
- with a dim lightbulb;</para>
-
- <para>Forty-six to argue vociferously about the backing out
- of the dim lightbulb and demanding a statement from
- -core;</para>
-
- <para>Eleven to request a smaller lightbulb so it will fit
- their Tamagotchi if we ever decide to port FreeBSD to that
- platform;</para>
-
- <para>Seventy-three to complain about the SNR on -hackers and
- -chat and unsubscribe in protest;</para>
-
- <para>Thirteen to post "unsubscribe", "How do I unsubscribe?",
- or "Please remove me from the list", followed by the usual
- footer;</para>
-
- <para>One to commit a working lightbulb while everybody is too
- busy flaming everybody else to notice;</para>
-
- <para>Thirty-one to point out that the new lightbulb would shine
- 0.364% brighter if compiled with TenDRA (although it will have
- to be reshaped into a cube), and that FreeBSD should therefore
- switch to TenDRA instead of EGCS;</para>
-
- <para>One to complain that the new lightbulb lacks
- fairings;</para>
-
- <para>Nine (including the PR originators) to ask
- "what is MFC?";</para>
-
- <para>Fifty-seven to complain about the lights being out two
- weeks after the bulb has been changed.</para>
-
- <para><emphasis>&a.nik; adds:</emphasis></para>
-
- <para><emphasis>I was laughing quite hard at
- this.</emphasis></para>
-
- <para><emphasis>And then I thought,
- "Hang on, shouldn't there be '1 to document it.' in that list somewhere?"</emphasis></para>
-
- <para><emphasis>And then I was enlightened :-)</emphasis></para>
-
- <para><emphasis>This entry is Copyright (c) 1999 &a.des;.
- Please do not reproduce without attribution.</emphasis></para>
- </answer>
- </qandaentry>
- </qandaset>
- </chapter>
-
- <chapter id="advanced">
- <title>Advanced Topics</title>
-
- <qandaset>
- <qandaentry>
- <question id="define-snap-release">
- <para>What are SNAPs and RELEASEs?</para>
- </question>
-
- <answer>
- <para>There are currently three active/semi-active branches
- in the FreeBSD <ulink
- URL="http://www.FreeBSD.org/cgi/cvsweb.cgi">
- CVS Repository</ulink> (the RELENG_2 branch is probably
- only changed twice a year, which is why there are only three
- active branches of development):</para>
-
- <itemizedlist>
- <listitem>
- <para><literal>RELENG_2_2</literal> AKA
- <emphasis>2.2-STABLE</emphasis></para>
- </listitem>
-
- <listitem>
- <para><literal>RELENG_3</literal> AKA
- <emphasis>3.X-STABLE</emphasis></para>
- </listitem>
-
- <listitem>
- <para><literal>RELENG_4</literal> AKA
- <emphasis>4-STABLE</emphasis></para>
- </listitem>
-
- <listitem>
- <para><literal>HEAD</literal> AKA
- <emphasis>-CURRENT</emphasis> AKA
- <emphasis>5.0-CURRENT</emphasis></para>
- </listitem>
-
- </itemizedlist>
-
- <para><literal>HEAD</literal> is not an actual branch tag,
- like the other two; it is simply a symbolic constant for
- <quote><emphasis>the current, non-branched development
- stream</emphasis></quote> which we simply refer to as
- <quote>-CURRENT</quote>.</para>
-
- <para>Right now, <quote>-CURRENT</quote> is the 5.0 development
- stream and the <literal>4-STABLE</literal> branch,
- <symbol>RELENG_4</symbol>, forked off from
- <quote>-CURRENT</quote> in Mar 2000.</para>
-
- <para>The <literal>2.2-STABLE</literal> branch,
- <symbol>RELENG_2_2</symbol>, departed -CURRENT in November
- 1996, and has pretty much been retired.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="custrel">
- <para>How do I make my own custom release?</para>
- </question>
-
- <answer>
- <para>To make a release you need to do three things: First,
- you need to be running a kernel with the
- &man.vn.4;
- driver configured in. Add this to your kernel config file
- and build a new kernel:</para>
-
- <programlisting>pseudo-device vn #Vnode driver (turns a file into a device)</programlisting>
-
- <para>Second, you have to have the whole CVS repository at
- hand. To get this you can use <ulink
- URL="../handbook/synching.html#CVSUP">CVSUP</ulink> but in
- your supfile set the release name to cvs and remove any tag or
- date fields:</para>
-
- <programlisting>*default prefix=/home/ncvs
-*default base=/a
-*default host=cvsup.FreeBSD.org
-*default release=cvs
-*default delete compress use-rel-suffix
-
-## Main Source Tree
-src-all
-src-eBones
-src-secure
-
-# Other stuff
-ports-all
-www
-doc-all</programlisting>
-
- <para>Then run <command>cvsup -g supfile</command> to suck all
- the good bits onto your box...</para>
-
- <para>Finally, you need a chunk of empty space to build into.
- Let's say it is in <filename>/some/big/filesystem</filename>,
- and from the example above you have got the CVS repository in
- <filename>/home/ncvs</filename>:</para>
-
- <screen>&prompt.root; <userinput>setenv CVSROOT /home/ncvs</userinput> # or export CVSROOT=/home/ncvs
-&prompt.root; <userinput>cd /usr/src</userinput>
-&prompt.root; <userinput>make buildworld</userinput>
-&prompt.root; <userinput>cd /usr/src/release</userinput>
-&prompt.root; <userinput>make release BUILDNAME=3.0-MY-SNAP CHROOTDIR=/some/big/filesystem/release</userinput></screen>
-
- <note>
- <para>Please note that you <emphasis>do not</emphasis>
- need to build world if you already have a populated
- <filename>/usr/obj</filename>.</para>
- </note>
-
- <para>An entire release will be built in
- <filename>/some/big/filesystem/release</filename> and you
- will have a full FTP-type installation in
- <filename>/some/big/filesystem/release/R/ftp</filename> when
- you are done. If you want to build your SNAP along some other
- branch than -CURRENT, you can also add
- <literal>RELEASETAG=SOMETAG</literal> to the make release
- command line above, e.g. <literal>RELEASETAG=RELENG_2_2</literal>
- would build an up-to-the- minute 2.2-STABLE snapshot.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="custom-install-disks">
- <para>How do I create customized installation disks?</para>
- </question>
-
- <answer>
- <para>The entire process of creating installation disks and
- source and binary archives is automated by various targets in
- <filename>/usr/src/release/Makefile</filename>. The information
- there should be enough to get you started. However, it should
- be said that this involves doing a <command>make
- world</command> and will therefore take up a lot of time and
- disk space.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="makeworld-clobbers">
- <para>Why does <command>make world</command> clobber my existing
- installed binaries?</para>
- </question>
-
- <answer>
- <para>Yes, this is the general idea; as its name might suggest,
- <command>make world</command> rebuilds every system binary from
- scratch, so you can be certain of having a clean and consistent
- environment at the end (which is why it takes so long).</para>
-
- <para>If the environment variable <literal>DESTDIR</literal>
- is defined while running <command>make world</command> or
- <command>make install</command>, the newly-created binaries
- will be deposited in a directory tree identical to the
- installed one, rooted at <literal>${DESTDIR}</literal>.
- Some random combination of shared libraries modifications and
- program rebuilds can cause this to fail in <command>make
- world</command> however.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="bus-speed-defaulted">
- <para>How come when my system boots, it says <quote>(bus speed
- defaulted)</quote>?</para>
- </question>
-
- <answer>
-
- <para>The Adaptec 1542 SCSI host adapters allow the user to
- configure their bus access speed in software. Previous versions
- of the 1542 driver tried to determine the fastest usable speed
- and set the adapter to that. We found that this breaks some
- users' systems, so you now have to define the
- <symbol>TUNE_1542</symbol> kernel configuration option in order
- to have this take place. Using it on those systems where it
- works may make your disks run faster, but on those systems
- where it does not, your data could be corrupted.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="ctm">
- <para>Can I follow current with limited Internet access?</para>
- </question>
-
- <answer>
- <para>Yes, you can do this <literal>without</literal>
- downloading the whole source tree by using the <ulink
- URL="../handbook/synching.html#CTM">CTM facility</ulink>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="split-240k">
- <para>How did you split the distribution into 240k files?</para>
- </question>
-
- <answer>
- <para>Newer BSD based systems have a <option>-b</option>
- option to split that allows them to split files on arbitrary
- byte boundaries.</para>
-
- <para>Here is an example from
- <filename>/usr/src/Makefile</filename>.</para>
-
- <programlisting>bin-tarball:
-(cd ${DISTDIR}; \
-tar cf - . \
-gzip --no-name -9 -c | \
-split -b 240640 - \
-${RELEASEDIR}/tarballs/bindist/bin_tgz.)</programlisting>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="submitting-kernel-extensions">
- <para>I have written a kernel extension, who do I send it
- to?</para>
- </question>
-
- <answer>
- <para>Please take a look at <ulink
- URL="../handbook/contrib.html">The Handbook entry on how to
- submit code</ulink>.</para>
-
- <para>And thanks for the thought!</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="pnp-initialize">
- <para>How are Plug N Play ISA cards detected and
- initialized?</para>
- </question>
-
- <answer>
- <para>By: Frank Durda IV
- <email>uhclem@nemesis.lonestar.org</email></para>
-
- <para>In a nutshell, there a few I/O ports that all of the
- PnP boards respond to when the host asks if anyone is out
- there. So when the PnP probe routine starts, he asks if there
- are any PnP boards present, and all the PnP boards respond with
- their model # to a I/O read of the same port, so the probe
- routine gets a wired-OR <quote>yes</quote> to that question. At
- least one bit will be on in that reply. Then the probe code is
- able to cause boards with board model IDs (assigned by
- Microsoft/Intel) lower than X to go <quote>off-line</quote>. It
- then looks to see if any boards are still responding to the
- query. If the answer was <literal>0</literal>, then there are
- no boards with IDs above X. Now probe asks if there are any
- boards below <literal>X</literal>. If so, probe knows there are
- boards with a model numbers below X. Probe then asks for boards
- greater than X-(limit/4) to go off-line. If repeats the query.
- By repeating this semi-binary search of IDs-in-range enough
- times, the probing code will eventually identify all PnP boards
- present in a given machine with a number of iterations that is
- much lower than what 2^64 would take.</para>
-
- <para>The IDs are two 32-bit fields (hence 2&circ;64) + 8 bit
- checksum. The first 32 bits are a vendor identifier. They never
- come out and say it, but it appears to be assumed that
- different types of boards from the same vendor could have
- different 32-bit vendor ids. The idea of needing 32 bits just
- for unique manufacturers is a bit excessive.</para>
-
- <para>The lower 32 bits are a serial #, Ethernet address,
- something that makes this one board unique. The vendor must
- never produce a second board that has the same lower 32 bits
- unless the upper 32 bits are also different. So you can have
- multiple boards of the same type in the machine and the full 64
- bits will still be unique.</para>
-
- <para>The 32 bit groups can never be all zero. This allows the
- wired-OR to show non-zero bits during the initial binary
- search.</para>
-
- <para>Once the system has identified all the board IDs present,
- it will reactivate each board, one at a time (via the same I/O
- ports), and find out what resources the given board needs, what
- interrupt choices are available, etc. A scan is made over all
- the boards to collect this information.</para>
-
- <para>This info is then combined with info from any ECU files
- on the hard disk or wired into the MLB BIOS. The ECU and BIOS
- PnP support for hardware on the MLB is usually synthetic, and
- the peripherals do not really do genuine PnP. However by
- examining the BIOS info plus the ECU info, the probe routines
- can cause the devices that are PnP to avoid those devices the
- probe code cannot relocate.</para>
-
- <para>Then the PnP devices are visited once more and given
- their I/O, DMA, IRQ and Memory-map address assignments. The
- devices will then appear at those locations and remain there
- until the next reboot, although there is nothing that says you
- cannot move them around whenever you want.</para>
-
- <para>There is a lot of oversimplification above, but you
- should get the general idea.</para>
-
- <para>Microsoft took over some of the primary printer status
- ports to do PnP, on the logic that no boards decoded those
- addresses for the opposing I/O cycles. I found a genuine IBM
- printer board that did decode writes of the status port during
- the early PnP proposal review period, but MS said
- <quote>tough</quote>. So they do a write to the printer status
- port for setting addresses, plus that use that address +
- <literal>0x800</literal>, and a third I/O port for reading that
- can be located anywhere between <literal>0x200</literal> and
- <literal>0x3ff</literal>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="major-numbers">
- <para>Can you assign a major number for a device driver I have
- written?</para>
- </question>
-
- <answer>
-
- <para>This depends on whether or not you plan on making the
- driver publicly available. If you do, then please send us a
- copy of the driver source code, plus the appropriate
- modifications to <filename>files.i386</filename>, a
- sample configuration file entry, and the appropriate
- &man.MAKEDEV.8;
- code to create any special files your device uses. If you do
- not, or are unable to because of licensing restrictions, then
- character major number 32 and block major number 8 have been
- reserved specifically for this purpose; please use them. In any
- case, we would appreciate hearing about your driver on
- &a.hackers;.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="alternate-directory-layout">
- <para>What about alternative layout policies for
- directories?</para>
- </question>
-
- <answer>
- <para>In answer to the question of alternative layout policies
- for directories, the scheme that is currently in use is
- unchanged from what I wrote in 1983. I wrote that policy for
- the original fast filesystem, and never revisited it. It works
- well at keeping cylinder groups from filling up. As several of
- you have noted, it works poorly for find. Most filesystems are
- created from archives that were created by a depth first search
- (aka ftw). These directories end up being striped across the
- cylinder groups thus creating a worst possible scenario for
- future depth first searches. If one knew the total number of
- directories to be created, the solution would be to create
- (total / fs_ncg) per cylinder group before moving on.
- Obviously, one would have to create some heuristic to guess at
- this number. Even using a small fixed number like say 10 would
- make an order of magnitude improvement. To differentiate
- restores from normal operation (when the current algorithm is
- probably more sensible), you could use the clustering of up to
- 10 if they were all done within a ten second window. Anyway, my
- conclusion is that this is an area ripe for
- experimentation.</para>
-
- <para>Kirk McKusick, September 1998</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="kernel-panic-troubleshooting">
- <para>How can I make the most of the data I see when my kernel
- panics?</para>
- </question>
-
- <answer>
- <para><emphasis>[This section was extracted from a mail
- written by &a.wpaul; on the freebsd-current
- <link linkend="mailing">mailing list</link> by &a.des;, who
- fixed a few typos and added the bracketed comments]
- </emphasis></para>
-
- <programlisting>From: Bill Paul &lt;wpaul@skynet.ctr.columbia.edu&gt;
-Subject: Re: the fs fun never stops
-To: ben@rosengart.com
-Date: Sun, 20 Sep 1998 15:22:50 -0400 (EDT)
-Cc: current@FreeBSD.org</programlisting>
-
- <para><emphasis>[&lt;ben@rosengart.com&gt; posted the following
- panic message]</emphasis></para>
-
- <programlisting>&gt; Fatal trap 12: page fault while in kernel mode
-&gt; fault virtual address = 0x40
-&gt; fault code = supervisor read, page not present
-&gt; instruction pointer = 0x8:0xf014a7e5
- ^^^^^^^^^^
-&gt; stack pointer = 0x10:0xf4ed6f24
-&gt; frame pointer = 0x10:0xf4ed6f28
-&gt; code segment = base 0x0, limit 0xfffff, type 0x1b
-&gt; = DPL 0, pres 1, def32 1, gran 1
-&gt; processor eflags = interrupt enabled, resume, IOPL = 0
-&gt; current process = 80 (mount)
-&gt; interrupt mask =
-&gt; trap number = 12
-&gt; panic: page fault</programlisting>
-
- <para>[When] you see a message like this, it is not enough to just
- reproduce it and send it in. The instruction pointer value that
- I highlighted up there is important; unfortunately, it is also
- configuration dependent. In other words, the value varies
- depending on the exact kernel image that you are using. If
- you are using a GENERIC kernel image from one of the snapshots,
- then it is possible for somebody else to track down the
- offending function, but if you are running a custom kernel then
- only <emphasis>you</emphasis> can tell us where the fault
- occurred.</para>
-
- <para>What you should do is this:</para>
-
- <procedure>
- <step>
- <para>Write down the instruction pointer value. Note that
- the <literal>0x8:</literal> part at the beginning is not
- significant in this case: it is the
- <literal>0xf0xxxxxx</literal> part that we want.</para>
- </step>
-
- <step>
- <para>When the system reboots, do the following:
-
- <screen>&prompt.user; <userinput>nm -n /kernel.that.caused.the.panic | grep f0xxxxxx</userinput></screen>
-
- where <literal>f0xxxxxx</literal> is the instruction
- pointer value. The odds are you will not get an exact
- match since the symbols in the kernel symbol table are
- for the entry points of functions and the instruction
- pointer address will be somewhere inside a function, not
- at the start. If you do not get an exact match, omit the
- last digit from the instruction pointer value and try
- again, i.e.:
-
- <screen>&prompt.user; <userinput>nm -n /kernel.that.caused.the.panic | grep f0xxxxx</userinput></screen>
-
- If that does not yield any results, chop off another
- digit. Repeat until you get some sort of output. The
- result will be a possible list of functions which caused
- the panic. This is a less than exact mechanism for
- tracking down the point of failure, but it is better than
- nothing.</para>
- </step>
- </procedure>
-
- <para>I see people constantly show panic messages like this
- but rarely do I see someone take the time to match up the
- instruction pointer with a function in the kernel symbol
- table.</para>
-
- <para>The best way to track down the cause of a panic is by
- capturing a crash dump, then using
- &man.gdb.1; to generate a stack trace on the
- crash dump.</para>
-
- <para>In any case, the method I normally use is this:</para>
-
- <procedure>
- <step>
- <para>Set up a kernel config file, optionally adding
- <literal>options DDB</literal> if you think you need
- the kernel debugger for something. (I use this mainly
- for setting breakpoints if I suspect an infinite loop
- condition of some kind.)</para>
- </step>
-
- <step>
- <para>Use <command>config -g
- <replaceable>KERNELCONFIG</replaceable></command> to set
- up the build directory.</para>
- </step>
-
- <step>
- <para><command>cd /sys/compile/
- <replaceable>KERNELCONFIG</replaceable>; make
- </command></para>
- </step>
-
- <step>
- <para>Wait for kernel to finish compiling.</para>
- </step>
-
- <step>
- <para><command>make install</command></para>
- </step>
-
- <step>
- <para>reboot</para>
- </step>
- </procedure>
-
- <para>The &man.make.1; process will have built two kernels.
- <filename>kernel</filename> and
- <filename>kernel.debug</filename>. <filename>kernel</filename>
- was installed as <filename>/kernel</filename>, while
- <filename>kernel.debug</filename> can be used as the source of
- debugging symbols for &man.gdb.1;.</para>
-
- <para>To make sure you capture a crash dump, you need edit
- <filename>/etc/rc.conf</filename> and set
- <literal>dumpdev</literal> to point to your swap
- partition. This will cause the &man.rc.8; scripts
- to use the &man.dumpon.8; command to enable crash
- dumps. You can also run &man.dumpon.8; manually.
- After a panic, the crash dump can be recovered using
- &man.savecore.8;; if
- <literal>dumpdev</literal> is set in
- <filename>/etc/rc.conf</filename>, the &man.rc.8;
- scripts will run &man.savecore.8; automatically
- and put the crash dump in
- <filename>/var/crash</filename>.</para>
-
- <note>
- <para>FreeBSD crash dumps are usually the same size as the
- physical RAM size of your machine. That is, if you have
- 64MB of RAM, you will get a 64MB crash dump. Therefore you
- must make sure there is enough space in
- <filename>/var/crash</filename> to hold the dump.
- Alternatively, you run &man.savecore.8;
- manually and have it recover the crash dump to another
- directory where you have more room. It is possible to limit
- the size of the crash dump by using <literal>options
- MAXMEM=(foo)</literal> to set the amount of memory the
- kernel will use to something a little more sensible. For
- example, if you have 128MB of RAM, you can limit the
- kernel's memory usage to 16MB so that your crash dump size
- will be 16MB instead of 128MB.</para>
- </note>
-
- <para>Once you have recovered the crash dump, you can get a
- stack trace with &man.gdb.1; as follows:</para>
-
- <screen>&prompt.user; <userinput>gdb -k /sys/compile/KERNELCONFIG/kernel.debug /var/crash/vmcore.0</userinput>
-<prompt>(gdb)</prompt> <userinput>where</userinput></screen>
-
- <para>Note that there may be several screens worth of
- information; ideally you should use
- &man.script.1; to capture all of them. Using the
- unstripped kernel image with all the debug symbols should show
- the exact line of kernel source code where the panic occurred.
- Usually you have to read the stack trace from the bottom up in
- order to trace the exact sequence of events that lead to the
- crash. You can also use &man.gdb.1; to print out
- the contents of various variables or structures in order to
- examine the system state at the time of the crash.</para>
-
- <para>Now, if you are really insane and have a second computer,
- you can also configure &man.gdb.1; to do remote
- debugging such that you can use &man.gdb.1; on
- one system to debug the kernel on another system, including
- setting breakpoints, single-stepping through the kernel code,
- just like you can do with a normal user-mode program. I have not
- played with this yet as I do not often have the chance to set up
- two machines side by side for debugging purposes.</para>
-
- <para><emphasis>[Bill adds: "I forgot to mention one thing: if
- you have DDB enabled and the kernel drops into the debugger,
- you can force a panic (and a crash dump) just by typing 'panic'
- at the ddb prompt. It may stop in the debugger again during the
- panic phase. If it does, type 'continue' and it will finish the
- crash dump." -ed]</emphasis></para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="dlsym-failure">
- <para>Why has dlsym() stopped working for ELF executables?</para>
- </question>
-
- <answer>
- <para>The ELF toolchain does not, by default, make the symbols
- defined in an executable visible to the dynamic linker.
- Consequently <function>dlsym()</function> searches on handles
- obtained from calls to <function>dlopen(NULL,
- flags)</function> will fail to find such symbols.</para>
-
- <para>If you want to search, using <function>dlsym()</function>,
- for symbols present in the main executable of a process, you
- need to link the executable using the
- <option>-export-dynamic</option> option to the
- ELF
- linker (&man.ld.1;).</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question id="change-kernel-address-space">
- <para>How can I increase or reduce the kernel address space?</para>
- </question>
-
- <answer>
- <para>By default, the kernel address space is 256 MB on
- FreeBSD 3.x and 1 GB on FreeBSD 4.x. If you run a
- network-intensive server (e.g. a large FTP or HTTP server),
- you might find that 256 MB is not enough.</para>
-
- <para>So how do you increase the address space? There are two
- aspects to this. First, you need to tell the kernel to reserve
- a larger portion of the address space for itself. Second, since
- the kernel is loaded at the top of the address space, you need
- to lower the load address so it does not bump its head against
- the ceiling.</para>
-
- <para>The first goal is achieved by increasing the value of
- <literal>NKPDE</literal> in
- <filename>src/sys/i386/include/pmap.h</filename>. Here is what
- it looks like for a 1 GB address space:</para>
-
- <programlisting>#ifndef NKPDE
-#ifdef SMP
-#define NKPDE 254 /* addressable number of page tables/pde's */
-#else
-#define NKPDE 255 /* addressable number of page tables/pde's */
-#endif /* SMP */
-#endif</programlisting>
-
- <para>To find the correct value of <literal>NKPDE</literal>,
- divide the desired address space size (in megabytes) by four,
- then subtract one for UP and two for SMP.</para>
-
- <para>To achieve the second goal, you need to compute the
- correct load address: simply subtract the address space size
- (in bytes) from 0x100100000; the result is 0xc0100000 for a 1
- GB address space. Set <symbol>LOAD_ADDRESS</symbol> in
- <filename>src/sys/i386/conf/Makefile.i386</filename> to that
- value; then set the location counter in the beginning of the
- section listing in
- <filename>src/sys/i386/conf/kernel.script</filename> to the
- same value, as follows:</para>
-
- <programlisting>OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
-OUTPUT_ARCH(i386)
-ENTRY(btext)
-SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/obj/elf/home/src/tmp/usr/i386-unknown-freebsdelf/lib);
-SECTIONS
-{
- /* Read-only sections, merged into text segment: */
- . = 0xc0100000 + SIZEOF_HEADERS;
- .interp : { *(.interp) }</programlisting>
-
- <para>Then reconfig and rebuild your kernel. You will probably
- have problems with &man.ps.1;
- &man.top.1; and the like; <command>make
- world</command> should take care of it (or a manual rebuild of
- <filename>libkvm</filename>,
- &man.ps.1; and &man.top.1;
- after copying the patched <filename>pmap.h</filename> to
- <filename>/usr/include/vm/</filename>.</para>
-
- <para>NOTE: the size of the kernel address space must be a
- multiple of four megabytes.</para>
-
- <para>[&a.dg; adds: <emphasis>I think the kernel address space
- needs to be a power of two, but I am not certain about that. The
- old(er) boot code used to monkey with the high order address bits
- and I think expected at least 256MB
- granularity.]</emphasis></para>
- </answer>
- </qandaentry>
- </qandaset>
- </chapter>
-
- <chapter id="acknowledgments">
- <title>Acknowledgments</title>
-
- <blockquote>
- <attribution>FreeBSD Core Team</attribution>
-
- <para>If you see a problem with this FAQ, or wish to submit an
- entry, please mail the &a.faq;. We appreciate your feedback,
- and cannot make this a better FAQ without your help!</para>
- </blockquote>
-
- <variablelist>
- <varlistentry>
- <term>&a.jkh;</term>
- <listitem>
- <para>Occasional fits of FAQ-reshuffling and updating.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>&a.dwhite;</term>
-
- <listitem>
- <para>Services above and beyond the call of duty on
- freebsd-questions</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>&a.joerg;</term>
-
- <listitem>
- <para>Services above and beyond the call of duty on
- Usenet</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>&a.wollman;</term>
-
- <listitem>
- <para>Networking and formatting</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Jim Lowe</term>
-
- <listitem>
- <para>Multicast information</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>&a.pds;</term>
-
- <listitem>
- <para>FreeBSD FAQ typing machine slavey</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>The FreeBSD Team</term>
-
- <listitem>
- <para>Kvetching, moaning, submitting data</para>
-
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>And to any others we have forgotten, apologies and heartfelt
- thanks!</para>
- </chapter>
-
- <bibliography id="bibliography">
- <title>Bibliography</title>
-
- <biblioentry id="biblio-44sysman">
- <biblioset relation="book">
- <title>4.4BSD System Manager's Manual</title>
-
- <corpauthor>Computer Systems Research Group, University of
- California, Berkeley</corpauthor>
-
- <publisher>
- <publishername>O'Reilly and Associates</publishername>
- </publisher>
-
- <edition>1st Edition</edition>
-
- <pubdate>June 1994</pubdate>
-
- <pagenums>804 pages</pagenums>
-
- <isbn>ISBN 1-56592-080-5</isbn>
- </biblioset>
- </biblioentry>
-
- <biblioentry id="biblio-44userman">
- <biblioset relation="book">
- <title>4.4BSD User's Reference Manual</title>
-
- <corpauthor>Computer Systems Research Group, University of
- California, Berkeley</corpauthor>
-
- <publisher>
- <publishername>O'Reilly and Associates</publishername>
- </publisher>
-
- <edition>1st Edition</edition>
-
- <pubdate>June 1994</pubdate>
-
- <pagenums>905 pages</pagenums>
-
- <isbn>ISBN 1-56592-075-9</isbn>
- </biblioset>
- </biblioentry>
-
- <biblioentry id="biblio-44suppman">
- <biblioset relation="book">
- <title>4.4BSD User's Supplementary Documents</title>
-
- <corpauthor>Computer Systems Research Group, University of
- California, Berkeley</corpauthor>
-
- <publisher>
- <publishername>O'Reilly and Associates</publishername>
- </publisher>
-
- <edition>1st Edition</edition>
-
- <pubdate>June 1994</pubdate>
-
- <pagenums>712 pages</pagenums>
-
- <isbn>ISBN 1-56592-076-7</isbn>
- </biblioset>
- </biblioentry>
-
- <biblioentry id="biblio-44progman">
- <biblioset relation="book">
- <title>4.4BSD Programmer's Reference Manual</title>
-
- <corpauthor>Computer Systems Research Group, University of
- California, Berkeley</corpauthor>
-
- <publisher>
- <publishername>O'Reilly and Associates</publishername>
- </publisher>
-
- <edition>1st Edition</edition>
-
- <pubdate>June 1994</pubdate>
-
- <pagenums>866 pages</pagenums>
-
- <isbn>ISBN 1-56592-078-3</isbn>
- </biblioset>
- </biblioentry>
-
- <biblioentry id="biblio-44progsupp">
- <biblioset relation="book">
- <title>4.4BSD Programmer's Supplementary Documents</title>
-
- <corpauthor>Computer Systems Research Group, University of
- California, Berkeley</corpauthor>
-
- <publisher>
- <publishername>O'Reilly and Associates</publishername>
- </publisher>
-
- <edition>1st Edition</edition>
-
- <pubdate>June 1994</pubdate>
-
- <pagenums>596 pages</pagenums>
-
- <isbn>ISBN 1-56592-079-1</isbn>
- </biblioset>
- </biblioentry>
-
- <biblioentry id="biblio-44kernel">
- <biblioset relation="book">
- <title>The Design and Implementation of the 4.4BSD Operating System</title>
-
- <authorgroup>
- <author>
- <firstname>M. K.</firstname>
-
- <surname>McKusick</surname>
- </author>
-
- <author>
- <firstname>Kirk</firstname>
-
- <surname>Marshall</surname>
- </author>
-
- <author>
- <firstname>Keith</firstname>
-
- <surname>Bostic</surname>
- </author>
-
- <author>
- <firstname>Michael J</firstname>
-
- <surname>Karels</surname>
- </author>
-
- <author>
- <firstname>John</firstname>
-
- <surname>Quarterman</surname>
- </author>
- </authorgroup>
-
- <publisher>
- <publishername>Addison-Wesley</publishername>
-
- <address>
- <city>Reading</city>
- <state>MA</state>
- </address>
- </publisher>
-
- <pubdate>1996</pubdate>
-
- <isbn>ISBN 0-201-54979-4</isbn>
- </biblioset>
- </biblioentry>
-
- <biblioentry id="biblio-nemeth3rd">
- <biblioset relation="book">
- <title>Unix System Administration Handbook</title>
-
- <authorgroup>
- <author>
- <firstname>Evi</firstname>
-
- <surname>Nemeth</surname>
- </author>
-
- <author>
- <firstname>Garth</firstname>
-
- <surname>Snyder</surname>
- </author>
-
- <author>
- <firstname>Scott</firstname>
-
- <surname>Seebass</surname>
- </author>
-
- <author>
- <firstname>Trent R.</firstname>
-
- <surname>Hein</surname>
- </author>
-
- <author>
- <firstname>John</firstname>
-
- <surname>Quarterman</surname>
- </author>
- </authorgroup>
-
- <publisher>
- <publishername>Prentice-Hall</publishername>
- </publisher>
-
- <edition>3rd edition</edition>
-
- <pubdate>2000</pubdate>
-
- <isbn>ISBN 0-13-020601-6</isbn>
- </biblioset>
- </biblioentry>
-
- <biblioentry id="lehey3rd">
- <biblioset relation="book">
- <title>The Complete FreeBSD</title>
-
- <author>
- <firstname>Greg</firstname>
-
- <surname>Lehey</surname>
- </author>
-
- <publisher>
- <publishername>Walnut Creek</publishername>
- </publisher>
-
- <edition>3rd edition</edition>
-
- <pubdate>June 1999</pubdate>
-
- <pagenums>773 pages</pagenums>
-
- <isbn>ISBN 1-57176-246-9</isbn>
- </biblioset>
- </biblioentry>
-
- <biblioentry id="biblio-handbook">
- <biblioset relation="book">
- <title>The FreeBSD Handbook</title>
-
- <corpauthor>FreeBSD Documentation Project</corpauthor>
-
- <publisher>
- <publishername>BSDi</publishername>
- </publisher>
-
- <edition>1st Edition</edition>
-
- <pubdate>November 1999</pubdate>
-
- <pagenums>489 pages</pagenums>
-
- <isbn>ISBN 1-57176-241-8</isbn>
- </biblioset>
- </biblioentry>
-
- <biblioentry id="biblio-mckusick-1">
- <abbrev>McKusick et al, 1994</abbrev>
-
- <biblioset relation="manual">
- <title>Berkeley Software Architecture Manual, 4.4BSD
- Edition</title>
-
- <authorgroup>
- <author>
- <firstname>M. K.</firstname>
-
- <surname>McKusick</surname>
- </author>
-
- <author>
- <firstname>M. J.</firstname>
-
- <surname>Karels</surname>
- </author>
-
- <author>
- <firstname>S. J.</firstname>
-
- <surname>Leffler</surname>
- </author>
-
- <author>
- <firstname>W. N.</firstname>
-
- <surname>Joy</surname>
- </author>
-
- <author>
- <firstname>R. S.</firstname>
-
- <surname>Faber</surname>
- </author>
- </authorgroup>
-
- <pagenums>5:1-42</pagenums>
- </biblioset>
- </biblioentry>
- </bibliography>
-</book>
diff --git a/en_US.ISO8859-1/books/fdp-primer/Makefile b/en_US.ISO8859-1/books/fdp-primer/Makefile
deleted file mode 100644
index 3e9ced1ea7..0000000000
--- a/en_US.ISO8859-1/books/fdp-primer/Makefile
+++ /dev/null
@@ -1,50 +0,0 @@
-#
-# $FreeBSD: doc/en_US.ISO_8859-1/books/fdp-primer/Makefile,v 1.9 2000/07/16 16:40:36 nik Exp $
-#
-# Build the FreeBSD Documentation Project Primer.
-#
-
-MAINTAINER=nik@FreeBSD.org
-
-DOC?= book
-
-FORMATS?= html-split html
-
-INSTALL_COMPRESSED?= gz
-INSTALL_ONLY_COMPRESSED?=
-
-#
-# SRCS lists the individual SGML files that make up the document. Changes
-# to any of these files will force a rebuild
-#
-
-# SGML content
-SRCS= book.sgml
-SRCS+= overview/chapter.sgml
-SRCS+= psgml-mode/chapter.sgml
-SRCS+= see-also/chapter.sgml
-SRCS+= sgml-markup/chapter.sgml
-SRCS+= sgml-primer/chapter.sgml
-SRCS+= stylesheets/chapter.sgml
-SRCS+= structure/chapter.sgml
-SRCS+= doc-build/chapter.sgml
-SRCS+= the-website/chapter.sgml
-SRCS+= tools/chapter.sgml
-SRCS+= translations/chapter.sgml
-SRCS+= writing-style/chapter.sgml
-
-SRCS+= examples/appendix.sgml
-
-# Images from the cross-document image library
-IMAGES_LIB= callouts/1.png
-IMAGES_LIB+= callouts/2.png
-IMAGES_LIB+= callouts/3.png
-IMAGES_LIB+= callouts/4.png
-IMAGES_LIB+= callouts/5.png
-
-# Entities
-SRCS+= chapters.ent
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/books/fdp-primer/book.sgml b/en_US.ISO8859-1/books/fdp-primer/book.sgml
deleted file mode 100644
index df0cc7e712..0000000000
--- a/en_US.ISO8859-1/books/fdp-primer/book.sgml
+++ /dev/null
@@ -1,300 +0,0 @@
-<!-- Copyright (c) 1998, 1999 Nik Clayton, All rights reserved.
-
- Redistribution and use in source (SGML DocBook) and 'compiled' forms
- (SGML, HTML, PDF, PostScript, RTF and so forth) with or without
- modification, are permitted provided that the following conditions
- are met:
-
- 1. Redistributions of source code (SGML DocBook) must retain the above
- copyright notice, this list of conditions and the following
- disclaimer as the first lines of this file unmodified.
-
- 2. Redistributions in compiled form (transformed to other DTDs,
- converted to PDF, PostScript, RTF and other formats) must reproduce
- the above copyright notice, this list of conditions and the
- following disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS DOCUMENTATION IS PROVIDED BY NIK CLAYTON "AS IS" AND ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL NIK CLAYTON BE LIABLE FOR ANY DIRECT,
- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
- $FreeBSD: doc/en_US.ISO8859-1/books/fdp-primer/book.sgml,v 1.13 2001/04/17 16:16:17 nik Exp $
--->
-
-<!DOCTYPE book PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man;
-
-<!ENTITY % chapters SYSTEM "chapters.ent"> %chapters;
-<!ENTITY % not.published "INCLUDE">
-<!-- ENTITY index SYSTEM "index.sgml" -->
-]>
-
-<book>
- <bookinfo>
- <title>FreeBSD Documentation Project Primer for New Contributors</title>
-
- <author>
- <firstname>Nik</firstname>
- <surname>Clayton</surname>
- <affiliation>
- <address><email>nik@FreeBSD.org</email></address>
- </affiliation>
- </author>
-
- <copyright>
- <year>1998</year>
- <year>1999</year>
- <year>2000</year>
- <year>2001</year>
- <holder role="mailto:nik@FreeBSD.org">Nik Clayton</holder>
- </copyright>
-
- <pubdate role="rcs">$FreeBSD: doc/en_US.ISO8859-1/books/fdp-primer/book.sgml,v 1.13 2001/04/17 16:16:17 nik Exp $</pubdate>
-
- <releaseinfo>$FreeBSD: doc/en_US.ISO8859-1/books/fdp-primer/book.sgml,v 1.13 2001/04/17 16:16:17 nik Exp $</releaseinfo>
-
- <legalnotice>
- <para>Redistribution and use in source (SGML DocBook) and 'compiled'
- forms (SGML, HTML, PDF, PostScript, RTF and so forth) with or without
- modification, are permitted provided that the following conditions are
- met:</para>
-
- <orderedlist>
- <listitem>
- <para>Redistributions of source code (SGML DocBook) must retain the
- above copyright notice, this list of conditions and the following
- disclaimer as the first lines of this file unmodified.</para>
- </listitem>
-
- <listitem>
- <para>Redistributions in compiled form (transformed to other DTDs,
- converted to PDF, PostScript, RTF and other formats) must
- reproduce the above copyright notice, this list of conditions and
- the following disclaimer in the documentation and/or other
- materials provided with the distribution.</para>
- </listitem>
- </orderedlist>
-
- <important>
- <para>THIS DOCUMENTATION IS PROVIDED BY NIK CLAYTON "AS IS" AND ANY
- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NIK CLAYTON BE LIABLE FOR
- ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
- BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
- DAMAGE.</para>
- </important>
- </legalnotice>
-
- <abstract>
- <para>Thank you for becoming a part of the FreeBSD Documentation
- Project. Your contribution is extremely valuable.</para>
-
- <para>This primer covers everything you will need to know in order
- to start contributing to the FreeBSD Documentation Project, from
- the tools and software you will be using (both mandatory and
- recommended) to the philosophy behind the Documentation
- Project.</para>
-
- <para>This document is a work in progress, and is not complete. Sections
- that are known to be incomplete are indicated with a
- <literal>*</literal> in their name.</para>
- </abstract>
- </bookinfo>
-
- <preface>
- <title>Preface</title>
-
- <sect1>
- <title>Shell Prompts</title>
-
- <para>The following table shows the default system prompt and superuser
- prompt. The examples will use this prompt to indicate which user you
- should be running the example as.</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <thead>
- <row>
- <entry>User</entry>
- <entry>Prompt</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>Normal user</entry>
- <entry>&prompt.user;</entry>
- </row>
-
- <row>
- <entry><username>root</username></entry>
- <entry>&prompt.root;</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </sect1>
-
- <sect1>
- <title>Typographic Conventions</title>
-
- <para>The following table describes the typographic conventions used in
- this book.</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <thead>
- <row>
- <entry>Meaning</entry>
- <entry>Examples</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>The name of commands, files, and directories. On screen
- computer output.</entry>
- <entry><para>Edit your <filename>.login</filename>
- file.</para><para>Use <command>ls -a</command> to list all
- files.</para><para><screen>You have mail.</screen>
- </para></entry>
- </row>
-
- <row>
- <entry>What you type, when contrasted with on-screen computer
- output.</entry>
-
- <entry><screen>&prompt.user; <userinput>su</userinput>
-Password:</screen></entry>
- </row>
-
- <row>
- <entry>Manual page references.</entry>
-
- <entry>Use <citerefentry>
- <refentrytitle>su</refentrytitle>
- <manvolnum>1</manvolnum>
- </citerefentry> to change user names.</entry>
- </row>
-
- <row>
- <entry>User and group names</entry>
-
- <entry>Only <username>root</username> can do this.</entry>
- </row>
-
- <row>
- <entry>Emphasis</entry>
-
- <entry>You <emphasis>must</emphasis> do this.</entry>
- </row>
-
- <row>
- <entry>Command line variables; replace with the real name or
- variable.</entry>
-
- <entry>To delete a file, type <command>rm <filename><replaceable>filename</replaceable></filename></command></entry>
- </row>
-
- <row>
- <entry>Environment variables</entry>
-
- <entry><envar>$HOME</envar> is your home directory.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </sect1>
-
- <sect1>
- <title>Notes, tips, important information, warnings, and examples</title>
-
- <para>Within the text appear notes, warnings, and examples.</para>
-
- <note>
- <para>Notes are represented like this, and contain information that
- you should take note of, as it may affect what you do.</para>
- </note>
-
- <tip>
- <para>Tips are represented like this, and contain information that you
- might find useful, or lead to an easier way to do something.</para>
- </tip>
-
- <important>
- <para>Important information is represented like this. Typically they
- flag extra steps you may need to carry out.</para>
- </important>
-
- <warning>
- <para>Warnings are represented like this, and contain information
- warning you about possible damage if you do not follow the
- instructions. This damage may be physical, to your hardware or to
- you, or it may be non-physical, such as the inadvertant deletion of
- important files.</para>
- </warning>
-
- <example>
- <title>A sample example</title>
-
- <para>Examples are represented like this, and typically contain
- examples you should walk through, or show you what the results of a
- particular action should be.</para>
- </example>
- </sect1>
-
- <sect1>
- <title>Acknowledgments</title>
-
- <para>My thanks to Sue Blake, Patrick Durusau, Jon Hamilton, Peter
- Flynn, and Christopher Maden, who took the time to read early drafts
- of this document and offer many valuable comments and
- criticisms.</para>
- </sect1>
- </preface>
-
- &chap.overview;
- &chap.tools;
- &chap.sgml-primer;
- &chap.sgml-markup;
- &chap.stylesheets;
- &chap.structure;
- &chap.doc-build;
- &chap.the-website;
- &chap.translations;
- &chap.writing-style;
- &chap.psgml-mode;
- &chap.see-also;
-
- &app.examples;
-
-<!--
- &index;
--->
-</book>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- End:
--->
diff --git a/en_US.ISO8859-1/books/fdp-primer/chapter.decl b/en_US.ISO8859-1/books/fdp-primer/chapter.decl
deleted file mode 100644
index ce0a7ed16a..0000000000
--- a/en_US.ISO8859-1/books/fdp-primer/chapter.decl
+++ /dev/null
@@ -1 +0,0 @@
-<!DOCTYPE chapter PUBLIC "-//FreeBSD//DTD DocBook V3.1-Based Extension//EN">
diff --git a/en_US.ISO8859-1/books/fdp-primer/chapters.ent b/en_US.ISO8859-1/books/fdp-primer/chapters.ent
deleted file mode 100644
index 651a2bd465..0000000000
--- a/en_US.ISO8859-1/books/fdp-primer/chapters.ent
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
- Creates entities for each chapter in the Documentation Project Primer.
- Each entity is named chap.foo, where foo is the value of the id
- attribute on that chapter, and corresponds to the name of the
- directory in which that chapter's .sgml file is stored.
-
- Chapters should be listed in the order in which they are referenced.
-
- $FreeBSD: doc/en_US.ISO_8859-1/books/fdp-primer/chapters.ent,v 1.5 2000/06/23 00:37:53 nik Exp $
--->
-
-<!ENTITY chap.overview SYSTEM "overview/chapter.sgml">
-<!ENTITY chap.sgml-primer SYSTEM "sgml-primer/chapter.sgml">
-<!ENTITY chap.tools SYSTEM "tools/chapter.sgml">
-<!ENTITY chap.sgml-markup SYSTEM "sgml-markup/chapter.sgml">
-<!ENTITY chap.stylesheets SYSTEM "stylesheets/chapter.sgml">
-<!ENTITY chap.structure SYSTEM "structure/chapter.sgml">
-<!ENTITY chap.the-website SYSTEM "the-website/chapter.sgml">
-<!ENTITY chap.translations SYSTEM "translations/chapter.sgml">
-<!ENTITY chap.writing-style SYSTEM "writing-style/chapter.sgml">
-<!ENTITY chap.psgml-mode SYSTEM "psgml-mode/chapter.sgml">
-<!ENTITY chap.see-also SYSTEM "see-also/chapter.sgml">
-<!ENTITY chap.doc-build SYSTEM "doc-build/chapter.sgml">
-
-<!ENTITY app.examples SYSTEM "examples/appendix.sgml">
diff --git a/en_US.ISO8859-1/books/fdp-primer/doc-build/chapter.sgml b/en_US.ISO8859-1/books/fdp-primer/doc-build/chapter.sgml
deleted file mode 100644
index 20dc438fec..0000000000
--- a/en_US.ISO8859-1/books/fdp-primer/doc-build/chapter.sgml
+++ /dev/null
@@ -1,498 +0,0 @@
-<!-- Copyright (c) 1999 Neil Blakey-Milner, All rights reserved.
-
- Redistribution and use in source (SGML DocBook) and 'compiled' forms
- (SGML HTML, PDF, PostScript, RTF and so forth) with or without
- modification, are permitted provided that the following conditions
- are met:
-
- 1. Redistributions of source code (SGML DocBook) must retain the above
- copyright notice, this list of conditions and the following
- disclaimer as the first lines of this file unmodified.
-
- 2. Redistributions in compiled form (transformed to other DTDs,
- converted to PDF, PostScript, RTF and other formats) must reproduce
- the above copyright notice, this list of conditions and the
- following disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS DOCUMENTATION IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL NIK CLAYTON BE LIABLE FOR ANY DIRECT,
- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
- $FreeBSD: doc/en_US.ISO8859-1/books/fdp-primer/doc-build/chapter.sgml,v 1.5 2001/07/05 08:47:55 dd Exp $
--->
-
-<chapter id="doc-build">
- <title>The Documentation Build Process</title>
-
- <para>This chapter's main purpose is to clearly explain <emphasis>how
- the documentation build process is organised</emphasis>, and
- <emphasis>how to affect modifications to this process</emphasis>.
- </para>
-
- <para>After you have finished reading this chapter you should:</para>
-
- <itemizedlist>
- <listitem>
- <para>Know what you need to build the FDP documentation, in
- addition to those mentioned in the <link
- linkend="tools">SGML tools chapter</link>.</para>
- </listitem>
-
- <listitem>
- <para>Be able to read and understand the
- <application>make</application> instructions that are present in
- each document's <filename>Makefile</filename>s, as well as an
- overview of the <filename>doc.project.mk</filename> includes.</para>
- </listitem>
-
- <listitem>
- <para>Be able to customize the build process by using
- <application>make</application> variables and
- <application>make</application> targets.</para>
- </listitem>
- </itemizedlist>
-
- <sect1>
- <title>The FreeBSD Documentation Build Toolset</title>
-
- <para>Here are your tools. Use them every way you can.</para>
-
- <itemizedlist>
- <listitem>
- <para>The primary build tool you will need is
- <application>make</application>, but specifically
- <application>Berkeley Make</application>.</para>
- </listitem>
-
- <listitem>
- <para>Package building is handled by FreeBSD's
- <application>pkg_create</application>. If you are not using
- FreeBSD, you will either have to live without packages, or
- compile the source yourself.</para>
- </listitem>
-
- <listitem>
- <para><application>gzip</application> is needed to create
- compressed versions of the document.
- <application>bzip2</application> compression and
- <application>zip</application> archives are also supported.
- <application>tar</application> is supported, but package
- building demands it.</para>
- </listitem>
-
- <listitem>
- <para><application>install</application> is the default method
- to install the documentation. There are alternatives,
- however.</para>
- </listitem>
- </itemizedlist>
-
- <note>
- <para>It is unlikely you will not be able to find these last two, they
- are mentioned for completeness.</para>
- </note>
- </sect1>
-
- <sect1>
- <title>Understanding Makefiles in the Documentation tree</title>
-
- <para>There are three main types of <filename>Makefile</filename>s
- in the FreeBSD Documentation Project tree.</para>
-
- <itemizedlist>
- <listitem>
- <para><link linkend="sub-make">Subdirectory
- <filename>Makefile</filename>s</link> simply pass
- commands to those directories below them.</para>
- </listitem>
-
- <listitem>
- <para><link linkend="doc-make">Documentation
- <filename>Makefile</filename>s</link> describe the
- document(s) that should be produced from this directory.</para>
- </listitem>
-
- <listitem>
- <para><link linkend="make-includes"><application>Make</application>
- includes</link> are the glue that perform the document production,
- and are usually of the form
- <filename>doc.<replaceable>xxx</replaceable>.mk</filename>.</para>
- </listitem>
- </itemizedlist>
-
- <sect2 id="sub-make">
- <title>Subdirectory Makefiles</title>
-
- <para>These directories usually take the form of:</para>
-
- <programlisting>SUBDIR =articles
-SUBDIR+=books
-
-COMPAT_SYMLINK = en
-
-DOC_PREFIX?= ${.CURDIR}/..
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"</programlisting>
-
- <para>In quick summary, the first four non-empty lines define the
- <application>make</application> variables,
- <makevar>SUBDIR</makevar>, <makevar>COMPAT_SYMLINK</makevar>,
- and <makevar>DOC_PREFIX</makevar>.</para>
-
- <para>The first <makevar>SUBDIR</makevar> statement, as well as
- the <makevar>COMPAT_SYMLINK</makevar> statement, shows how to
- assign a value to a variable, overriding any previous
- value.</para>
-
- <para>The second <makevar>SUBDIR</makevar> statement shows how a
- value is appended to the current value of a variable. The
- <makevar>SUBDIR</makevar> variable is now <literal>articles
- books</literal>.</para>
-
- <para>The <makevar>DOC_PREFIX</makevar> assignment shows how a
- value is assigned to the variable, but only if it is not already
- defined. This is useful if <makevar>DOC_PREFIX</makevar> is not
- where this <filename>Makefile</filename> thinks it is - the user
- can override this and provide the correct value.</para>
-
- <para>Now what does it all mean? <makevar>SUBDIR</makevar>
- mentions which subdirectories below this one the build process
- should pass any work on to.</para>
-
- <para><makevar>COMPAT_SYMLINK</makevar> is specific to
- compatibility symlinks (amazingly enough) for languages to their
- official encoding (<filename>doc/en</filename> would point to
- <filename>en_US.ISO-8859-1</filename>).</para>
-
- <para><makevar>DOC_PREFIX</makevar> is the path to the root of the
- FreeBSD Document Project tree. This is not always that easy to
- find, and is also easily overridable, to allow for flexibility.
- <makevar>.CURDIR</makevar> is a <application>make</application>
- builtin variable with the path to the current directory.</para>
-
- <para>The final line includes the FreeBSD Documentation Project's
- project-wide <application>make</application> system file
- <filename>doc.project.mk</filename> which is the glue which
- converts these variables into build instructions.</para>
-
- </sect2>
- <sect2 id="doc-make">
- <title>Documentation Makefiles</title>
-
- <para>These <filename>Makefile</filename>s set a bunch of
- <application>make</application> variables that describe how to
- build the documentation contained in that directory.</para>
-
- <para>Here is an example:</para>
-
- <programlisting>MAINTAINER=nik@FreeBSD.org
-
-DOC?= book
-
-FORMATS?= html-split html
-
-INSTALL_COMPRESSED?= gz
-INSTALL_ONLY_COMPRESSED?=
-
-# SGML content
-SRCS= book.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "$(DOC_PREFIX)/share/mk/docproj.docbook.mk"</programlisting>
-
- <para>The <makevar>MAINTAINER</makevar> variable is a very
- important one. This variable provides the ability to claim
- ownership over a document in the FreeBSD Documentation
- Project, whereby you gain the responsibility for maintaining
- it.</para>
-
- <para><makevar>DOC</makevar> is the name (sans the
- <filename>.sgml</filename> extension) of the main document
- created by this directory. <makevar>SRCS</makevar> lists all
- the individual files that make up the document. This should
- also include important files in which a change should result
- in a rebuild.</para>
-
- <para><makevar>FORMATS</makevar> indicates the default formats
- that should be built for this document.
- <makevar>INSTALL_COMPRESSED</makevar> is the default list of
- compression techniques that should be used in the document
- build. <makevar>INSTALL_ONLY_COMPRESS</makevar>, empty by
- default, should be non-empty if only compressed documents are
- desired in the build.</para>
-
- <note>
- <para>We covered optional variable assignments in the
- <link linkend="sub-make">previous section</link>.</para>
- </note>
-
- <para>The <makevar>DOC_PREFIX</makevar> and include statements
- should be familiar already.</para>
- </sect2>
- </sect1>
-
- <sect1 id="make-includes">
- <title>FreeBSD Documentation Project make includes</title>
-
- <para>This is best explained by inspection of the code. Here are
- the system include files:</para>
-
- <itemizedlist>
- <listitem>
- <para><filename>doc.project.mk</filename> is the main project
- include file, which includes all the following include files, as
- necessary.</para>
- </listitem>
-
- <listitem>
- <para><filename>doc.subdir.mk</filename> handles traversing of
- the document tree during the build and install processes.</para>
- </listitem>
-
- <listitem>
- <para><filename>doc.install.mk</filename> provides variables
- that affect ownership and installation of documents.</para>
- </listitem>
-
- <listitem>
- <para><filename>doc.docbook.mk</filename> is included if
- <makevar>DOCFORMAT</makevar> is <literal>docbook</literal>
- and <makevar>DOC</makevar> is set.</para>
- </listitem>
- </itemizedlist>
-
- <sect2>
- <title>doc.project.mk</title>
-
- <para>By inspection:</para>
-
- <programlisting>DOCFORMAT?= docbook
-MAINTAINER?= doc@FreeBSD.org
-
-PREFIX?= /usr/local
-PRI_LANG?= en_US.ISO8859-1
-
-.if defined(DOC)
-.if ${DOCFORMAT} == "docbook"
-.include "doc.docbook.mk"
-.endif
-.endif
-
-.include "doc.subdir.mk"
-.include "doc.install.mk"</programlisting>
-
- <sect3>
-
- <title>Variables</title>
-
- <para><makevar>DOCFORMAT</makevar> and <makevar>MAINTAINER</makevar>
- are assigned default values, if these are not set by the
- document make file.</para>
-
- <para><makevar>PREFIX</makevar> is the prefix under which the
- <link linkend="tools">documentation building tools</link> are
- installed. For normal package and port installation, this is
- <filename>/usr/local</filename>.</para>
-
- <para><makevar>PRI_LANG</makevar> should be set to whatever
- language and encoding is natural amongst users these documents are
- being built for. US English is the default.</para>
-
- <note>
- <para><makevar>PRI_LANG</makevar> in no way affects what documents
- can, or even will, be built. It's main use is creating links to
- commonly referenced documents into the FreeBSD documentation
- install root.</para>
- </note>
- </sect3>
-
- <sect3>
- <title>Conditionals</title>
-
- <para>The <literal>.if defined(DOC)</literal> line is an example of
- a <application>make</application> conditional which, like in
- other programs, defines behaviour if some condition is true or
- if it is false. <literal>defined</literal> is a function which
- returns whether the variable given is defined or not.</para>
-
- <para><literal>.if ${DOCFORMAT} == "docbook"</literal>, next,
- tests whether the <makevar>DOCFORMAT</makevar> variable is
- <literal>"docbook"</literal>, and in this case, includes
- <filename>doc.docbook.mk</filename>.</para>
-
- <para>The two <literal>.endif</literal>s close the two above
- conditionals, marking the end of their application.</para>
- </sect3>
- </sect2>
-
- <sect2>
- <title>doc.subdir.mk</title>
-
- <para>This is too long to explain by inspection, you should be
- able to work it out with the knowledge gained from the previous
- chapters, and a little help given here.</para>
-
- <sect3>
- <title>Variables</title>
-
- <itemizedlist>
- <listitem>
- <para><makevar>SUBDIR</makevar> is a list of subdirectories
- that the build process should go further down
- into.</para>
- </listitem>
-
- <listitem>
- <para><makevar>ROOT_SYMLINKS</makevar> is the name of
- directories that should be linked to the document
- install root from their actual locations, if the current
- language is the primary language (specified by
- <makevar>PRI_LANG</makevar>).</para>
- </listitem>
-
- <listitem>
- <para><makevar>COMPAT_SYMLINK</makevar> is described in the
- <link linkend="sub-make">Subdirectory Makefile</link>
- section.</para>
- </listitem>
- </itemizedlist>
- </sect3>
-
- <sect3>
- <title>Targets and macros</title>
-
- <para>Dependencies are described by
- <literal><replaceable>target</replaceable>:
- <replaceable>dependency1 dependency2 ...</replaceable></literal>
- tuples, where to build <literal>target</literal>, you need to build
- the given dependencies first.</para>
-
- <para>After that descriptive tuple, instructions on how to build
- the target may be given, if the conversion process between the
- target and it's dependencies are not previously defined, or if
- this particular conversion is not the same as the default
- conversion method.</para>
-
- <para>A special dependency <literal>.USE</literal> defines
- the equivalent of a macro.</para>
-
-<programlisting>_SUBDIRUSE: .USE
-.for entry in ${SUBDIR}
- @${ECHO} "===> ${DIRPRFX}${entry}"
- @(cd ${.CURDIR}/${entry} && \
- ${MAKE} ${.TARGET:S/realpackage/package/:S/realinstall/install/} DIRPRFX=${DIRPRFX}${entry}/ )
-.endfor</programlisting>
-
- <para>In the above, <maketarget>_SUBDIRUSE</maketarget> is now a
- macro which will execute the given commands when it is listed
- as a dependency.</para>
-
- <para>What sets this macro apart from other targets? Basically,
- it is executed <emphasis>after</emphasis> the instructions
- given in the build procedure it is listed as a dependency to,
- and it doesn't adjust <makevar>.TARGET</makevar>, which is the
- variable which contains the name of the target currently
- being built.</para>
-
-<programlisting>clean: _SUBDIRUSE
- rm -f ${CLEANFILES}</programlisting>
-
- <para>In the above, <maketarget>clean</maketarget> will use the
- <maketarget>_SUBDIRUSE</maketarget> macro after it has
- executed the instruction
- <command>rm -f ${CLEANFILES}</command>. In effect, this causes
- <maketarget>clean</maketarget> to go further and further down
- the directory tree, deleting built files as it goes
- <emphasis>down</emphasis>, not on the way back up.</para>
-
- <sect4>
- <title>Provided targets</title>
-
- <itemizedlist>
- <listitem>
- <para><maketarget>install</maketarget> and
- <maketarget>package</maketarget> both go down the
- directory tree calling the real versions of themselves
- in the subdirectories.
- (<maketarget>realinstall</maketarget> and
- <maketarget>realpackage</maketarget>
- respectively)</para>
- </listitem>
-
- <listitem>
- <para><maketarget>clean</maketarget> removes files created
- by the build process (and goes down the directory tree
- too). <maketarget>cleandir</maketarget> does the same,
- and also removes the object directory, if any.</para>
- </listitem>
- </itemizedlist>
- </sect4>
- </sect3>
-
- <sect3>
- <title>More on conditionals</title>
-
- <itemizedlist>
- <listitem>
- <para><literal>exists</literal> is another condition
- function which returns true if the given file exists.</para>
- </listitem>
-
- <listitem>
- <para><literal>empty</literal> returns true if the given
- variable is empty.</para>
- </listitem>
-
- <listitem>
- <para><literal>target</literal> returns true if the given
- target does not already exist.</para>
- </listitem>
- </itemizedlist>
- </sect3>
-
- <sect3>
- <title>Looping constructs in make (.for)</title>
-
- <para><literal>.for</literal> provides a way to repeat a set of
- instructions for each space-separated element in a variable.
- It does this by assigning a variable to contain the current
- element in the list being examined.</para>
-
-<programlisting>_SUBDIRUSE: .USE
-.for entry in ${SUBDIR}
- @${ECHO} "===> ${DIRPRFX}${entry}"
- @(cd ${.CURDIR}/${entry} && \
- ${MAKE} ${.TARGET:S/realpackage/package/:S/realinstall/install/} DIRPRFX=${DIRPRFX}${entry}/ )
-.endfor</programlisting>
-
- <para>In the above, if <makevar>SUBDIR</makevar> is empty, no
- action is taken; if it has one or more elements, the
- instructions between <literal>.for</literal> and
- <literal>.endfor</literal> would repeat for every element,
- with <makevar>entry</makevar> being replaced with the value of
- the current element.</para>
- </sect3>
- </sect2>
- </sect1>
-</chapter>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-declaration: "../chapter.decl"
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- sgml-parent-document: ("../book.sgml" "part" "chapter")
- End:
--->
-
diff --git a/en_US.ISO8859-1/books/fdp-primer/examples/appendix.sgml b/en_US.ISO8859-1/books/fdp-primer/examples/appendix.sgml
deleted file mode 100644
index 84e8675dce..0000000000
--- a/en_US.ISO8859-1/books/fdp-primer/examples/appendix.sgml
+++ /dev/null
@@ -1,355 +0,0 @@
-<!-- Copyright (c) 2000 Nik Clayton, All rights reserved.
-
- Redistribution and use in source (SGML DocBook) and 'compiled' forms
- (SGML HTML, PDF, PostScript, RTF and so forth) with or without
- modification, are permitted provided that the following conditions
- are met:
-
- 1. Redistributions of source code (SGML DocBook) must retain the above
- copyright notice, this list of conditions and the following
- disclaimer as the first lines of this file unmodified.
-
- 2. Redistributions in compiled form (transformed to other DTDs,
- converted to PDF, PostScript, RTF and other formats) must reproduce
- the above copyright notice, this list of conditions and the
- following disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS DOCUMENTATION IS PROVIDED BY NIK CLAYTON "AS IS" AND ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL NIK CLAYTON BE LIABLE FOR ANY DIRECT,
- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
- $FreeBSD: doc/en_US.ISO8859-1/books/fdp-primer/examples/appendix.sgml,v 1.5 2001/08/29 00:34:27 nik Exp $
--->
-
-<appendix id="examples">
- <title>Examples</title>
-
- <para>This appendix contains example SGML files and command lines you can
- use to convert them from one output format to another. If you have
- successfully installed the Documentation Project tools then you should
- be able to use these examples directly.</para>
-
- <para>These examples are not exhaustive&mdash;they do not contain all the
- elements you might want to use, particularly in your document's front
- matter. For more examples of DocBook markup you should examine the SGML
- source for this and other documents, available in the
- <application>CVSup</application> <literal>doc</literal> collection, or
- available online starting at <ulink
- url="http://www.FreeBSD.org/cgi/cvsweb.cgi/doc/">http://www.FreeBSD.org/cgi/cvsweb.cgi/doc/</ulink>.</para>
-
- <para>To avoid confusion, these examples use the standard DocBook 3.1 DTD
- rather than the FreeBSD extension. They also use the stock stylesheets
- distributed by Norm Walsh, rather than any customisations made to those
- stylesheets by the FreeBSD Documentation Project. This makes them more
- useful as generic DocBook examples.</para>
-
- <sect1>
- <title>DocBook <sgmltag>book</sgmltag></title>
-
- <example>
- <title>DocBook <sgmltag>book</sgmltag></title>
-
- <programlisting><![ CDATA [<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V4.1//EN">
-
-<book>
- <bookinfo>
- <title>An Example Book</title>
-
- <author>
- <firstname>Your first name</firstname>
- <surname>Your surname</surname>
- <affiliation>
- <address><email>foo@example.com</email></address>
- </affiliation>
- </author>
-
- <copyright>
- <year>2000</year>
- <holder>Copyright string here</holder>
- </copyright>
-
- <abstract>
- <para>If your book has an abstract then it should go here.</para>
- </abstract>
- </bookinfo>
-
- <preface>
- <title>Preface</title>
-
- <para>Your book may have a preface, in which case it should be placed
- here.</para>
- </preface>
-
- <chapter>
- <title>My first chapter</title>
-
- <para>This is the first chapter in my book.</para>
-
- <sect1>
- <title>My first section</title>
-
- <para>This is the first section in my book.</para>
- </sect1>
- </chapter>
-</book>]]></programlisting>
- </example>
- </sect1>
-
- <sect1>
- <title>DocBook <sgmltag>article</sgmltag></title>
-
- <example>
- <title>DocBook <sgmltag>article</sgmltag></title>
-
- <programlisting><![ CDATA [<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V4.1//EN">
-
-<article>
- <articleinfo>
- <title>An example article</title>
-
- <author>
- <firstname>Your first name</firstname>
- <surname>Your surname</surname>
- <affiliation>
- <address><email>foo@example.com</email></address>
- </affiliation>
- </author>
-
- <copyright>
- <year>2000</year>
- <holder>Copyright string here</holder>
- </copyright>
-
- <abstract>
- <para>If your article has an abstract then it should go here.</para>
- </abstract>
- </articleinfo>
-
- <sect1>
- <title>My first section</title>
-
- <para>This is the first section in my article.</para>
-
- <sect2>
- <title>My first sub-section</title>
-
- <para>This is the first sub-section in my article.</para>
- </sect2>
- </sect1>
-</article>]]></programlisting>
- </example>
- </sect1>
-
- <sect1>
- <title>Producing formatted output</title>
-
- <para>This section assumes that you have installed the software listed in
- the <filename>textproc/docproj</filename> port, either by hand, or by
- using the port. Further, it is assumed that your software is installed
- in subdirectories under <filename>/usr/local/</filename>, and the
- directory where binaries have been installed is in your
- <envar>PATH</envar>. Adjust the paths as necessary for your
- system.</para>
-
- <sect2>
- <title>Using Jade</title>
-
- <example>
- <title>Converting DocBook to HTML (one large file)</title>
-
- <screen>&prompt.user; <userinput>jade -V nochunks \ <co id="examples-co-jade-1-nochunks">
- -c /usr/local/share/sgml/docbook/dsssl/modular/catalog \ <co id="examples-co-jade-1-catalog">
- -c /usr/local/share/sgml/docbook/catalog \
- -c /usr/local/share/sgml/jade/catalog \
- -d /usr/local/share/sgml/docbook/dsssl/modular/html/docbook.dsl <co id="examples-co-jade-1-dsssl">
- -t sgml <co id="examples-co-jade-1-transform"> file.sgml > file.html <co id="examples-co-jade-1-filename"></userinput></screen>
-
- <calloutlist>
- <callout arearefs="examples-co-jade-1-nochunks">
- <para>Specifies the <literal>nochunks</literal> parameter to the
- stylesheets, forcing all output to be written to
- <abbrev>STDOUT</abbrev> (using Norm Walsh's stylesheets).</para>
- </callout>
-
- <callout arearefs="examples-co-jade-1-catalog">
- <para>Specifies the catalogs that Jade will need to process.
- Three catalogs are required. The first is a catalog that
- contains information about the DSSSL stylesheets. The second
- contains information about the DocBook DTD. The third contains
- information specific to Jade.</para>
- </callout>
-
- <callout arearefs="examples-co-jade-1-dsssl">
- <para>Specifies the full path to the DSSSL stylesheet that Jade
- will use when processing the document.</para>
- </callout>
-
- <callout arearefs="examples-co-jade-1-transform">
- <para>Instructs Jade to perform a
- <emphasis>transformation</emphasis> from one DTD to another. In
- this case, the input is being transformed from the DocBook DTD
- to the HTML DTD.</para>
- </callout>
-
- <callout arearefs="examples-co-jade-1-filename">
- <para>Specifies the file that Jade should process, and redirects
- output to the specified <filename>.html</filename> file.</para>
- </callout>
- </calloutlist>
- </example>
-
- <example>
- <title>Converting DocBook to HTML (several small files)</title>
-
- <screen>&prompt.user; <userinput>jade \
- -c /usr/local/share/sgml/docbook/dsssl/modular/catalog \ <co id="examples-co-jade-2-catalog">
- -c /usr/local/share/sgml/docbook/catalog \
- -c /usr/local/share/sgml/jade/catalog \
- -d /usr/local/share/sgml/docbook/dsssl/modular/html/docbook.dsl <co id="examples-co-jade-2-dsssl">
- -t sgml <co id="examples-co-jade-2-transform"> <replaceable>file</replaceable>.sgml <co id="examples-co-jade-2-filename"></userinput></screen>
-
- <calloutlist>
- <callout arearefs="examples-co-jade-2-catalog">
- <para>Specifies the catalogs that Jade will need to process.
- Three catalogs are required. The first is a catalog that
- contains information about the DSSSL stylesheets. The second
- contains information about the DocBook DTD. The third contains
- information specific to Jade.</para>
- </callout>
-
- <callout arearefs="examples-co-jade-2-dsssl">
- <para>Specifies the full path to the DSSSL stylesheet that Jade
- will use when processing the document.</para>
- </callout>
-
- <callout arearefs="examples-co-jade-2-transform">
- <para>Instructs Jade to perform a
- <emphasis>transformation</emphasis> from one DTD to another. In
- this case, the input is being transformed from the DocBook DTD
- to the HTML DTD.</para>
- </callout>
-
- <callout arearefs="examples-co-jade-2-filename">
- <para>Specifies the file that Jade should process. The
- stylesheets determine how the individual HTML files will be
- named, and the name of the <quote>root</quote> file (i.e., the
- one that contains the start of the document.</para>
- </callout>
- </calloutlist>
-
- <para>This example may still only generate one HTML file, depending on
- the structure of the document you are processing, and the
- stylesheet's rules for splitting output.</para>
- </example>
-
- <example id="examples-docbook-postscript">
- <title>Converting DocBook to Postscript</title>
-
- <para>The source SGML file must be converted to a TeX file.</para>
-
- <screen>&prompt.user; <userinput>jade -Vtex-backend \ <co id="examples-co-jade-3-tex-backend">
- -c /usr/local/share/sgml/docbook/dsssl/modular/catalog \ <co id="examples-co-jade-3-catalog">
- -c /usr/local/share/sgml/docbook/catalog \
- -c /usr/local/share/sgml/jade/catalog \
- -d /usr/local/share/sgml/docbook/dsssl/modular/print/docbook.dsl <co id="examples-co-jade-3-dsssl">
- -t tex <co id="examples-co-jade-3-tex"> <replaceable>file</replaceable>.sgml</userinput></screen>
-
- <calloutlist>
- <callout arearefs="examples-co-jade-3-tex-backend">
- <para>Customises the stylesheets to use various options
- specific to producing output for TeX.</para>
- </callout>
-
- <callout arearefs="examples-co-jade-3-catalog">
- <para>Specifies the catalogs that Jade will need to process. Three
- catalogs are required. The first is a catalog that contains
- information about the DSSSL stylesheets. The second contains
- information about the DocBook DTD. The third contains
- information specific to Jade.</para>
- </callout>
-
- <callout arearefs="examples-co-jade-3-dsssl">
- <para>Specifies the full path to the DSSSL stylesheet that
- Jade will use when processing the document.</para>
- </callout>
-
- <callout arearefs="examples-co-jade-3-tex">
- <para>Instructs Jade to convert the output to TeX.</para>
- </callout>
- </calloutlist>
-
- <para>The generated <filename>.tex</filename> file must now be run
- through <command>tex</command>, specifying the
- <literal>&amp;jadetex</literal> macro package.</para>
-
- <screen>&prompt.user; <userinput>tex "&amp;jadetex" <replaceable>file</replaceable>.tex</userinput></screen>
-
- <para>You have to run <command>tex</command> <emphasis>at
- least</emphasis> three times. The first run processes the
- document, and determines areas of the document which are referenced
- from other parts of the document, for use in indexing, and so
- on.</para>
-
- <para>Do not be alarmed if you see warning messages such as
- <literal>LaTeX Warning: Reference `136' on page 5 undefined on input
- line 728.</literal> at this point.</para>
-
- <para>The second run reprocesses the document now that certain pieces
- of information are known (such as the document's page length). This
- allows index entries and other cross-references to be fixed
- up.</para>
-
- <para>The third pass performs any final cleanup necessary.</para>
-
- <para>The output from this stage will be
- <filename><replaceable>file</replaceable>.dvi</filename>.</para>
-
- <para>Finally, run <command>dvips</command> to convert the
- <filename>.dvi</filename> file to Postscript.</para>
-
- <screen>&prompt.user; <userinput>dvips -o <replaceable>file</replaceable>.ps <replaceable>file.dvi</replaceable></userinput></screen>
- </example>
-
- <example>
- <title>Converting DocBook to PDF</title>
-
- <para>The first part of this process is identical to that when
- converting DocBook to Postscript, using the same
- <command>jade</command> command line (<xref
- linkend="examples-docbook-postscript">).</para>
-
- <para>When the <filename>.tex</filename> file has been generated you
- run pdfTeX. However, use the &amp;pdfjadetex macro package
- instead.</para>
-
- <screen>&prompt.user; <userinput>pdftex "&amp;pdfjadetex" <replaceable>file</replaceable>.tex</userinput></screen>
-
- <para>Again, run this command three times.</para>
-
- <para>This will generate
- <filename><replaceable>file</replaceable>.pdf</filename>, which does
- not need to be processed any further.</para>
- </example>
- </sect2>
- </sect1>
-</appendix>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-declaration: "../appendix.decl"
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- sgml-parent-document: ("../book.sgml" "part" "appendix")
- End:
--->
diff --git a/en_US.ISO8859-1/books/fdp-primer/overview/chapter.sgml b/en_US.ISO8859-1/books/fdp-primer/overview/chapter.sgml
deleted file mode 100644
index 763ca39c2a..0000000000
--- a/en_US.ISO8859-1/books/fdp-primer/overview/chapter.sgml
+++ /dev/null
@@ -1,300 +0,0 @@
-<!-- Copyright (c) 1998, 1999 Nik Clayton, All rights reserved.
-
- Redistribution and use in source (SGML DocBook) and 'compiled' forms
- (SGML HTML, PDF, PostScript, RTF and so forth) with or without
- modification, are permitted provided that the following conditions
- are met:
-
- 1. Redistributions of source code (SGML DocBook) must retain the above
- copyright notice, this list of conditions and the following
- disclaimer as the first lines of this file unmodified.
-
- 2. Redistributions in compiled form (transformed to other DTDs,
- converted to PDF, PostScript, RTF and other formats) must reproduce
- the above copyright notice, this list of conditions and the
- following disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS DOCUMENTATION IS PROVIDED BY NIK CLAYTON "AS IS" AND ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL NIK CLAYTON BE LIABLE FOR ANY DIRECT,
- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
- $FreeBSD: doc/en_US.ISO8859-1/books/fdp-primer/overview/chapter.sgml,v 1.9 2001/10/02 05:28:55 murray Exp $
--->
-
-<chapter id="overview">
- <title>Overview</title>
-
- <para>Welcome to the FreeBSD Documentation Project. Good quality
- documentation is very important to the success of FreeBSD, and the
- FreeBSD Documentation Project (FDP) is how a lot of that documentation
- is produced. Your contributions are very valuable.</para>
-
- <para>This document's main purpose is to clearly explain <emphasis>how
- the FDP is organised</emphasis>, <emphasis>how to write and submit
- documentation to the FDP</emphasis>, and <emphasis>how to
- effectively use the tools available to you when writing
- documentation</emphasis>.</para>
-
- <para><indexterm>
- <primary>Membership</primary>
- </indexterm>
- Every one is welcome to join the FDP. There is no minimum
- membership requirement, no quota of documentation you need to
- produce per month. All you need to do is subscribe to the
- <email>freebsd-doc@FreeBSD.org</email> mailing list.</para>
-
- <para>After you have finished reading this document you should:</para>
-
- <itemizedlist>
- <listitem>
- <para>Know which documentation is maintained by the FDP.</para>
- </listitem>
-
- <listitem>
- <para>Be able to read and understand the SGML source code for the
- documentation maintained by the FDP.</para>
- </listitem>
-
- <listitem>
- <para>Be able to make changes to the documentation.</para>
- </listitem>
-
- <listitem>
- <para>Be able to submit your changes back for review and eventual
- inclusion in the FreeBSD documentation.</para>
- </listitem>
- </itemizedlist>
-
- <sect1>
- <title>The FreeBSD Documentation Set</title>
-
- <para>The FDP is responsible for four categories of FreeBSD
- documentation.</para>
-
- <variablelist>
- <varlistentry>
- <term>Manual pages</term>
-
- <listitem>
- <para>The English language system manual pages are not written by
- the FDP, as they are part of the base system. However, the FDP can
- (and has) re-worded parts of existing manual pages to make them
- clearer, or to correct inaccuracies.</para>
-
- <para>The translation teams are responsible for translating the
- system manual pages in to different languages. These translations
- are kept within the FDP.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>FAQ</term>
-
- <listitem>
- <para>The FAQ aims to address (in short question and answer format)
- questions that are asked, or should be asked, on the various
- mailing lists and newsgroups devoted to FreeBSD. The format does
- not permit long and comprehensive answers.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Handbook</term>
-
- <listitem>
- <para>The Handbook aims to be the comprehensive on-line resource and
- reference for FreeBSD users.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Web site</term>
-
- <listitem>
- <para>This is the main FreeBSD presence on the World Wide Web,
- visible at <ulink
- url="http://www.FreeBSD.org/">http://www.FreeBSD.org/</ulink>
- and many mirrors around the world. The web site is many people's
- first exposure to FreeBSD.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>These four groups of documentation are all available in the
- FreeBSD CVS tree. This means that the logs of changes to these
- files are visible to anyone, and anyone can use a program such as
- <application>CVSup</application> or
- <application>CTM</application> to keep local copies of
- this documentation.</para>
-
- <para>In addition, many people have written tutorials or other web
- sites relating to FreeBSD. Some of these are stored in the CVS
- repository as well (where the author has agreed to this). In
- other cases the author has decided to keep his documentation
- separate from the main FreeBSD repository. The FDP endeavours to
- provide links to as much of this documentation as
- possible.</para>
- </sect1>
-
- <sect1>
- <title>Before you start</title>
-
- <para>This document assumes that you already know:</para>
-
- <itemizedlist>
- <listitem>
- <para>How to maintain an up-to-date local copy of the FreeBSD
- documentation by maintaining a local copy of the
- FreeBSD CVS repository (using <application>CVS</application>
- and either <application>CVSup</application> or
- <application>CTM</application>) or by using
- <application>CVSup</application> to download just a
- <emphasis>checked-out</emphasis> copy.</para>
- </listitem>
-
- <listitem>
- <para>How to download and install new software using either the
- FreeBSD Ports system or &man.pkg.add.1;.</para>
- </listitem>
- </itemizedlist>
- </sect1>
-
- <sect1>
- <title>Quick Start</title>
-
- <para>If you just want to get going, and feel confident you can pick
- things up as you go along, follow these instructions.</para>
-
- <procedure>
- <step>
- <para>Install the <filename>textproc/docproj</filename>
- meta-port.</para>
-
- <screen>&prompt.root; <userinput>cd /usr/ports/textproc/docproj</userinput>
-&prompt.root; <userinput>make JADETEX=no install</userinput></screen>
- </step>
-
- <step>
- <para>Get a local copy of the FreeBSD <filename>doc</filename> tree.
- Either use CVSup in <literal>checkout</literal> mode to do this, or
- get a full copy of the CVS repository locally.</para>
-
- <para>If you have the CVS repository locally then as a minimum you
- will need to checkout the <filename>doc/share</filename>, and
- <filename>doc/en_US.ISO8859-1/share</filename>
- directories.</para>
-
- <screen>&prompt.user; <userinput>cvs checkout doc/share</userinput>
-&prompt.user; <userinput>cvs checkout doc/en_US.ISO8859-1/share</userinput></screen>
-
- <para>If you have plenty of disk space then you could check out
- everything.</para>
-
- <screen>&prompt.user; <userinput>cvs checkout doc</userinput></screen>
- </step>
-
- <step>
- <para>If you are preparing a change to an existing book or article,
- check it out of the repository as necessary. If you are planning on
- contributing a new book or article then use an existing one as a
- guide.</para>
-
- <para>For example, if you want to contribute a new article about
- setting up a VPN between FreeBSD and Windows 2000 you might do the
- following.</para>
-
- <procedure>
- <step>
- <para>Check out the <filename>articles</filename>
- directory.</para>
-
- <screen>&prompt.user; <userinput>cvs checkout doc/en_US.ISO8859-1/articles</userinput></screen>
- </step>
-
- <step>
- <para>Copy an existing article to use as a template. In this
- case, you have decided that your new article belongs in a
- directory called <filename>vpn-w2k</filename>.</para>
-
- <screen>&prompt.user; <userinput>cd doc/en_US.ISO8859-1/articles</userinput>
-&prompt.user; <userinput>cp -r committers-guide vpn-w2k</userinput></screen>
- </step>
- </procedure>
-
- <para>If you wanted to edit an existing document, such as the the FAQ,
- which is in <filename>doc/en_US.ISO8859-1/books/faq</filename> you
- would check it out of the repository like this.</para>
-
- <screen>&prompt.user; <userinput>cvs checkout doc/en_US.ISO8859-1/books/faq</userinput></screen>
- </step>
-
- <step>
- <para>Edit the <filename>.sgml</filename> files using your editor of
- choice.</para>
- </step>
-
- <step>
- <para>Test the markup using the <maketarget>lint</maketarget>
- target. This will quickly find any errors in the document
- without actually performing the time-consuming
- transformation.</para>
-
- <screen>&prompt.user; <userinput>make lint</userinput></screen>
-
- <para>When you are ready to actually build the document, you
- may specify a single format or a list of formats in the
- <varname>FORMATS</varname> variable. Currently,
- <literal>html</literal>, <literal>html-split</literal>,
- <literal>txt</literal>, <literal>ps</literal>,
- <literal>pdf</literal>, and <literal>rtf</literal> are
- supported. The most up to date list of supported formats is
- listed at the top of the
- <filename>doc/share/mk/doc.docbook.mk</filename> file. Make
- sure to use quotes around the list of formats when you build
- more than one format with a single command.</para>
-
- <para>For example, to convert the document to
- <literal>html</literal> only, you would use:</para>
-
- <screen>&prompt.user; <userinput>make FORMATS=html</userinput></screen>
-
- <para>But when you want to convert the document to both
- <literal>html</literal> and <literal>txt</literal> format,
- you could use either two separate &man.make.1; runs,
- with:</para>
-
- <screen>&prompt.user; <userinput>make FORMATS=html</userinput>
-&prompt.user; <userinput>make FORMATS=txt</userinput></screen>
-
- <para>or, you can do it in one command:</para>
-
- <screen>&prompt.user; <userinput>make FORMATS="html txt"</userinput></screen>
- </step>
-
- <step>
- <para>Submit your changes using &man.send-pr.1;.</para>
- </step>
- </procedure>
- </sect1>
-</chapter>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-declaration: "../chapter.decl"
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- sgml-parent-document: ("../book.sgml" "part" "chapter")
- End:
--->
-
diff --git a/en_US.ISO8859-1/books/fdp-primer/psgml-mode/chapter.sgml b/en_US.ISO8859-1/books/fdp-primer/psgml-mode/chapter.sgml
deleted file mode 100644
index 8abcde6496..0000000000
--- a/en_US.ISO8859-1/books/fdp-primer/psgml-mode/chapter.sgml
+++ /dev/null
@@ -1,150 +0,0 @@
-<!-- Copyright (c) 1998, 1999 Nik Clayton, All rights reserved.
-
- Redistribution and use in source (SGML DocBook) and 'compiled' forms
- (SGML HTML, PDF, PostScript, RTF and so forth) with or without
- modification, are permitted provided that the following conditions
- are met:
-
- 1. Redistributions of source code (SGML DocBook) must retain the above
- copyright notice, this list of conditions and the following
- disclaimer as the first lines of this file unmodified.
-
- 2. Redistributions in compiled form (transformed to other DTDs,
- converted to PDF, PostScript, RTF and other formats) must reproduce
- the above copyright notice, this list of conditions and the
- following disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS DOCUMENTATION IS PROVIDED BY NIK CLAYTON "AS IS" AND ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL NIK CLAYTON BE LIABLE FOR ANY DIRECT,
- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
- $FreeBSD: doc/en_US.ISO_8859-1/books/fdp-primer/psgml-mode/chapter.sgml,v 1.3 1999/09/06 06:52:41 peter Exp $
--->
-
-<chapter id="psgml-mode">
- <title>Using <literal>sgml-mode</literal> with
- <application>Emacs</application></title>
-
- <para>Recent versions of Emacs or Xemacs (available from the ports
- collection) contain a very useful package called PSGML. Automatically
- invoked when a file with the <filename>.sgml</filename> extension is loaded,
- or by typing <command>M-x sgml-mode</command>, it is a major mode for
- dealing with SGML files, elements and attributes.</para>
-
- <para>An understanding of some of the commands provided by this mode can
- make working with SGML documents such as the Handbook much easier.</para>
-
- <variablelist>
- <varlistentry>
- <term><command>C-c C-e</command></term>
-
- <listitem>
- <para>Runs <literal>sgml-insert-element</literal>. You will be
- prompted for the name of the element to insert at the current point.
- You can use the TAB key to complete the element. Elements that are
- not valid at the current point will be disallowed.</para>
-
- <para>The start and end tags for the element will be inserted. If the
- element contains other, mandatory, elements then these will be
- inserted as well.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>C-c =</command></term>
-
- <listitem>
- <para>Runs <literal>sgml-change-element-name</literal>. Place the
- point within an element and run this command. You will be prompted
- for the name of the element to change to. Both the start and end
- tags of the current element will be changed to the new
- element.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>C-c C-r</command></term>
-
- <listitem>
- <para>Runs <literal>sgml-tag-region</literal>. Select some text (move
- to start of text, C-space, move to end of text, C-space) and then
- run this command. You will be prompted for the element to use. This
- element will then be inserted immediately before and after your
- marked region.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>C-c -</command></term>
-
- <listitem>
- <para>Runs <literal>sgml-untag-element</literal>. Place the point
- within the start or end tag of an element you want to remove, and
- run this command. The element's start and end tags will be
- removed.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>C-c C-q</command></term>
-
- <listitem>
- <para>Runs <literal>sgml-fill-element</literal>. Will recursively fill
- (i.e., reformat) content from the current element in. The filling
- <emphasis>will</emphasis> affect content in which whitespace is
- significant, such as within <sgmltag>programlisting</sgmltag>
- elements, so run this command with care.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>C-c C-a</command></term>
-
- <listitem>
- <para>Runs <literal>sgml-edit-attributes</literal>. Opens a second
- buffer containing a list of all the attributes for the closest
- enclosing element, and their current values. Use TAB to navigate
- between attributes, <command>C-k</command> to remove an existing
- value and replace it with a new one, <command>C-c</command> to close
- this buffer and return to the main document.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><command>C-c C-v</command></term>
-
- <listitem>
- <para>Runs <literal>sgml-validate</literal>. Prompts you to save the
- current document (if necessary) and then runs an SGML validator. The
- output from the validator is captured into a new buffer, and you can
- then navigate from one troublespot to the next, fixing markup errors
- as you go.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>Doubtless there are other useful functions of this mode, but those are
- the ones I use most often.</para>
-</chapter>
-
-
-<!--
- Local Variables:
- mode: sgml
- sgml-declaration: "../chapter.decl"
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- sgml-parent-document: ("../book.sgml" "part" "chapter")
- End:
--->
-
diff --git a/en_US.ISO8859-1/books/fdp-primer/see-also/chapter.sgml b/en_US.ISO8859-1/books/fdp-primer/see-also/chapter.sgml
deleted file mode 100644
index 981812ec6e..0000000000
--- a/en_US.ISO8859-1/books/fdp-primer/see-also/chapter.sgml
+++ /dev/null
@@ -1,134 +0,0 @@
-<!-- Copyright (c) 1998, 1999 Nik Clayton, All rights reserved.
-
- Redistribution and use in source (SGML DocBook) and 'compiled' forms
- (SGML HTML, PDF, PostScript, RTF and so forth) with or without
- modification, are permitted provided that the following conditions
- are met:
-
- 1. Redistributions of source code (SGML DocBook) must retain the above
- copyright notice, this list of conditions and the following
- disclaimer as the first lines of this file unmodified.
-
- 2. Redistributions in compiled form (transformed to other DTDs,
- converted to PDF, PostScript, RTF and other formats) must reproduce
- the above copyright notice, this list of conditions and the
- following disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS DOCUMENTATION IS PROVIDED BY NIK CLAYTON "AS IS" AND ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL NIK CLAYTON BE LIABLE FOR ANY DIRECT,
- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
- $FreeBSD: doc/en_US.ISO8859-1/books/fdp-primer/see-also/chapter.sgml,v 1.6 2001/07/13 20:48:01 nik Exp $
--->
-
-<chapter id="see-also">
- <title>See Also</title>
-
- <para>This document is deliberately not an exhaustive discussion of SGML,
- the DTDs listed, and the FreeBSD Documentation Project. For more
- information about these, you are encouraged to see the following web
- sites.</para>
-
- <sect1>
- <title>The FreeBSD Documentation Project</title>
-
- <itemizedlist>
- <listitem>
- <para><ulink url="http://www.FreeBSD.org/docproj/">The FreeBSD
- Documentation Project web pages</ulink></para>
- </listitem>
-
- <listitem>
- <para><ulink url="http://www.FreeBSD.org/handbook/">The FreeBSD Handbook</ulink></para>
- </listitem>
- </itemizedlist>
- </sect1>
-
- <sect1>
- <title>SGML</title>
-
- <itemizedlist>
- <listitem>
- <para><ulink url="http://www.oasis-open.org/cover/">The SGML/XML web
- page</ulink>, a comprehensive SGML resource</para>
- </listitem>
-
- <listitem>
- <para><ulink
- url="http://etext.virginia.edu/bin/tei-tocs?div=DIV1&amp;id=SG">Gentle introduction to SGML</ulink></para>
- </listitem>
- </itemizedlist>
- </sect1>
-
- <sect1>
- <title>HTML</title>
-
- <itemizedlist>
- <listitem>
- <para><ulink url="http://www.w3.org/">The World Wide Web
- Consortium</ulink></para>
- </listitem>
-
- <listitem>
- <para><ulink url="http://www.w3.org/TR/REC-html40/">The HTML 4.0
- specification</ulink></para>
- </listitem>
- </itemizedlist>
- </sect1>
-
- <sect1>
- <title>DocBook</title>
-
- <itemizedlist>
- <listitem>
- <para><ulink url="http://www.oasis-open.org/docbook/">The DocBook
- Technical Committee</ulink>, maintainers of the DocBook DTD</para>
- </listitem>
-
- <listitem>
- <para><ulink url="http://www.docbook.org/">DocBook: The Definitive
- Guide</ulink>, the online documentation for the DocBook
- DTD.</para>
-
- </listitem>
-
- <listitem>
- <para><ulink url="http://docbook.sourceforge.net">The DocBook Open
- Repository</ulink> contains DSSSL stylesheets and other resources
- for people using DocBook.</para>
- </listitem>
- </itemizedlist>
- </sect1>
-
- <sect1>
- <title>The Linux Documentation Project</title>
-
- <itemizedlist>
- <listitem>
- <para><ulink url="http://www.linuxdoc.org/">The Linux Documentation
- Project web pages</ulink></para>
- </listitem>
- </itemizedlist>
- </sect1>
-</chapter>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-declaration: "../chapter.decl"
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- sgml-parent-document: ("../book.sgml" "part" "chapter")
- End:
--->
-
diff --git a/en_US.ISO8859-1/books/fdp-primer/sgml-markup/chapter.sgml b/en_US.ISO8859-1/books/fdp-primer/sgml-markup/chapter.sgml
deleted file mode 100644
index 39313fb747..0000000000
--- a/en_US.ISO8859-1/books/fdp-primer/sgml-markup/chapter.sgml
+++ /dev/null
@@ -1,2600 +0,0 @@
-<!-- Copyright (c) 1998, 1999 Nik Clayton, All rights reserved.
-
- Redistribution and use in source (SGML DocBook) and 'compiled' forms
- (SGML HTML, PDF, PostScript, RTF and so forth) with or without
- modification, are permitted provided that the following conditions
- are met:
-
- 1. Redistributions of source code (SGML DocBook) must retain the above
- copyright notice, this list of conditions and the following
- disclaimer as the first lines of this file unmodified.
-
- 2. Redistributions in compiled form (transformed to other DTDs,
- converted to PDF, PostScript, RTF and other formats) must reproduce
- the above copyright notice, this list of conditions and the
- following disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS DOCUMENTATION IS PROVIDED BY NIK CLAYTON "AS IS" AND ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL NIK CLAYTON BE LIABLE FOR ANY DIRECT,
- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
- $FreeBSD: doc/en_US.ISO8859-1/books/fdp-primer/sgml-markup/chapter.sgml,v 1.31 2001/10/02 05:28:56 murray Exp $
--->
-
-<chapter id="sgml-markup">
- <title>SGML Markup</title>
-
- <para>This chapter describes the two markup languages you will encounter
- when you contribute to the FreeBSD documentation project. Each section
- describes the markup language, and details the markup that you are likely
- to want to use, or that is already in use.</para>
-
- <para>These markup languages contain a large number of elements, and it can
- be confusing sometimes to know which element to use for a particular
- situation. This section goes through the elements you are most likely to
- need, and gives examples of how you would use them.</para>
-
- <para>This is <emphasis>not</emphasis> an exhaustive list of elements, since
- that would just reiterate the documentation for each language. The aim of
- this section is to list those elements more likely to be useful to you.
- If you have a question about how best to markup a particular piece of
- content, please post it to the FreeBSD Documentation Project mailing list
- <email>freebsd-doc@FreeBSD.org</email>.</para>
-
- <note>
- <title>Inline vs. block</title>
-
- <para>In the remainder of this document, when describing elements,
- <emphasis>inline</emphasis> means that the element can occur within a
- block element, and does not cause a line break. A
- <emphasis>block</emphasis> element, by comparison, will cause a line
- break (and other processing) when it is encountered.</para>
- </note>
-
- <sect1>
- <title>HTML</title>
-
- <para>HTML, the HyperText Markup Language, is the markup language of
- choice on the World Wide Web. More information can be found at
- &lt;URL:<ulink
- url="http://www.w3.org/">http://www.w3.org/</ulink>&gt;.</para>
-
- <para>HTML is used to markup pages on the FreeBSD web site. It should not
- (generally) be used to mark up other documention, since DocBook offers a
- far richer set of elements to choose from. Consequently, you will
- normally only encounter HTML pages if you are writing for the web
- site.</para>
-
- <para>HTML has gone through a number of versions, 1, 2, 3.0, 3.2, and the
- latest, 4.0 (available in both <emphasis>strict</emphasis> and
- <emphasis>loose</emphasis> variants).</para>
-
- <para>The HTML DTDs are available from the ports collection in the
- <filename>textproc/html</filename> port. They are automatically
- installed as part of the <filename>textproc/docproj</filename>
- port.</para>
-
- <sect2>
- <title>Formal Public Identifier (FPI)</title>
-
- <para>There are a number of HTML FPIs, depending upon the version (also
- known as the level) of HTML that you want to declare your document to
- be compliant with.</para>
-
- <para>The majority of HTML documents on the FreeBSD web site comply with
- the loose version of HTML 4.0.</para>
-
- <programlisting>PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"</programlisting>
- </sect2>
-
- <sect2>
- <title>Sectional elements</title>
-
- <para>An HTML document is normally split in to two sections. The first
- section, called the <emphasis>head</emphasis>, contains
- meta-information about the document, such as its title, the name of
- the author, the parent document, and so on. The second section, the
- <emphasis>body</emphasis>, contains the content that will be displayed
- to the user.</para>
-
- <para>These sections are indicated with <sgmltag>head</sgmltag> and
- <sgmltag>body</sgmltag> elements respectively. These elements are
- contained within the top-level <sgmltag>html</sgmltag> element.</para>
-
- <example>
- <title>Normal HTML document structure</title>
-
- <programlisting>&lt;html>
- &lt;head>
- &lt;title><replaceable>The document's title</replaceable>&lt;/title>
- &lt;/head>
-
- &lt;body>
-
- &hellip;
-
- &lt;/body>
-&lt;/html></programlisting>
- </example>
- </sect2>
-
- <sect2>
- <title>Block elements</title>
-
- <sect3>
- <title>Headings</title>
-
- <para>HTML allows you to denote headings in your document, at up to
- six different levels.</para>
-
- <para>The largest and most prominent heading is <sgmltag>h1</sgmltag>,
- then <sgmltag>h2</sgmltag>, continuing down to
- <sgmltag>h6</sgmltag>.</para>
-
- <para>The element's content is the text of the heading.</para>
-
- <example>
- <title><sgmltag>h1</sgmltag>, <sgmltag>h2</sgmltag>, etc.</title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<h1>First section</h1>
-
-<!-- Document introduction goes here -->
-
-<h2>This is the heading for the first section</h2>
-
-<!-- Content for the first section goes here -->
-
-<h3>This is the heading for the first sub-section</h3>
-
-<!-- Content for the first sub-section goes here -->
-
-<h2>This is the heading for the second section</h2>
-
-<!-- Content for the second section goes here -->]]></programlisting>
- </example>
-
- <para>Generally, an HTML page should have one first level heading
- (<sgmltag>h1</sgmltag>). This can contain many second level
- headings (<sgmltag>h2</sgmltag>), which can in turn contain many
- third level headings. Each
- <sgmltag>h<replaceable>n</replaceable></sgmltag> element should have
- the same element, but one further up the hierarchy, preceeding it.
- Leaving gaps in the numbering is to be avoided.</para>
-
- <example>
- <title>Bad ordering of
- <sgmltag>h<replaceable>n</replaceable></sgmltag> elements</title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<h1>First section</h1>
-
-<!-- Document introduction -->
-
-<h3>Sub-section</h3>
-
-<!-- This is bad, <h2> has been left out -->]]></programlisting>
- </example>
- </sect3>
-
- <sect3>
- <title>Paragraphs</title>
-
- <para>HTML supports a single paragraph element,
- <sgmltag>p</sgmltag>.</para>
-
- <example>
- <title><sgmltag>p</sgmltag></title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<p>This is a paragraph. It can contain just about any
- other element.</p>]]></programlisting>
- </example>
- </sect3>
-
- <sect3>
- <title>Block quotations</title>
-
- <para>A block quotation is an extended quotation from another document
- that should not appear within the current paragraph.</para>
-
- <example>
- <title><sgmltag>blockquote</sgmltag></title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<p>A small excerpt from the US Constitution:</p>
-
-<blockquote>We the People of the United States, in Order to form
- a more perfect Union, establish Justice, insure domestic
- Tranquility, provide for the common defence, promote the general
- Welfare, and secure the Blessings of Liberty to ourselves and our
- Posterity, do ordain and establish this Constitution for the
- United States of America.</blockquote>]]></programlisting>
- </example>
- </sect3>
-
- <sect3>
- <title>Lists</title>
-
- <para>You can present the user with three types of lists, ordered,
- unordered, and definition.</para>
-
- <para>Typically, each entry in an ordered list will be numbered, while
- each entry in an unordered list will be preceded by a bullet point.
- Definition lists are composed of two sections for each entry. The
- first section is the term being defined, and the second section is
- the definition of the term.</para>
-
- <para>Ordered lists are indicated by the <sgmltag>ol</sgmltag>
- element, unordered lists by the <sgmltag>ul</sgmltag> element, and
- definition lists by the <sgmltag>dl</sgmltag> element.</para>
-
- <para>Ordered and unordered lists contain listitems, indicated by the
- <sgmltag>li</sgmltag> element. A listitem can contain textual
- content, or it may be further wrapped in one or more
- <sgmltag>p</sgmltag> elements.</para>
-
- <para>Definition lists contain definition terms
- (<sgmltag>dt</sgmltag>) and definition descriptions
- (<sgmltag>dd</sgmltag>). A definition term can only contain inline
- elements. A definition description can contain other block
- elements.</para>
-
- <example>
- <title><sgmltag>ul</sgmltag> and <sgmltag>ol</sgmltag></title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<p>An unordered list. Listitems will probably be
- preceeded by bullets.</p>
-
-<ul>
- <li>First item</li>
-
- <li>Second item</li>
-
- <li>Third item</li>
-</ul>
-
-<p>An ordered list, with list items consisting of multiple
- paragraphs. Each item (note: not each paragraph) will be
- numbered.</p>
-
-<ol>
- <li><p>This is the first item. It only has one paragraph.</p></li>
-
- <li><p>This is the first paragraph of the second item.</p>
-
- <p>This is the second paragraph of the second item.</p></li>
-
- <li><p>This is the first and only paragraph of the third
- item.</p></li>
-</ol>]]></programlisting>
- </example>
-
- <example>
- <title>Definition lists with <sgmltag>dl</sgmltag></title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<dl>
- <dt>Term 1</dt>
-
- <dd><p>Paragraph 1 of definition 1.</p></dd>
-
- <p>Paragraph 2 of definition 1.</p></dd>
-
- <dt>Term 2</dt>
-
- <dd><p>Paragraph 1 of definition 2.</p></dd>
-
- <dt>Term 3</dt>
-
- <dd>Paragraph 1 of definition 3. Note that the &lt;p&gt;
- element is not required in the single paragraph case.</dd>
-</dl>]]></programlisting>
- </example>
- </sect3>
-
- <sect3>
- <title>Pre-formatted text</title>
-
- <para>You can indicate that text should be shown to the user exactly
- as it is in the file. Typically, this means that the text is shown
- in a fixed font, multiple spaces are not merged in to one, and line
- breaks in the text are significant.</para>
-
- <para>In order to do this, wrap the content in the
- <sgmltag>pre</sgmltag> element.</para>
-
- <example>
- <title><sgmltag>pre</sgmltag></title>
-
- <para>You could use <sgmltag>pre</sgmltag> to mark up an e-mail
- message;</para>
-
- <programlisting><![ CDATA [<pre> From: nik@FreeBSD.org
- To: freebsd-doc@FreeBSD.org
- Subject: New documentation available
-
- There's a new copy of my primer for contributers to the FreeBSD
- Documentation Project available at
-
- <URL:http://people.FreeBSD.org/~nik/primer/index.html>
-
- Comments appreciated.
-
- N</pre>]]></programlisting>
- </example>
- </sect3>
-
- <sect3>
- <title>Tables</title>
-
- <note>
- <para>Most text-mode browsers (such as Lynx) do not render tables
- particularly effectively. If you are relying on the tabular
- display of your content, you should consider using alternative
- markup to prevent confusion.</para>
- </note>
-
- <para>Mark up tabular information using the <sgmltag>table</sgmltag>
- element. A table consists of one or more table rows
- (<sgmltag>tr</sgmltag>), each containing one or more cells of table
- data (<sgmltag>td</sgmltag>). Each cell can contain other block
- elements, such as paragraphs or lists. It can also contain another
- table (this nesting can repeat indefinitely). If the cell only
- contains one paragraph then you do not need to include the
- <sgmltag>p</sgmltag> element.</para>
-
- <example>
- <title>Simple use of <sgmltag>table</sgmltag></title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<p>This is a simple 2x2 table.</p>
-
-<table>
- <tr>
- <td>Top left cell</td>
-
- <td>Top right cell</td>
- </tr>
-
- <tr>
- <td>Bottom left cell</td>
-
- <td>Bottom right cell</td>
- </tr>
-</table>]]></programlisting></example>
-
- <para>A cell can span multiple rows and columns. To indicate this,
- add the <literal>rowspan</literal> and/or <literal>colspan</literal>
- attributes, with values indicating the number of rows of columns
- that should be spanned.</para>
-
- <example>
- <title>Using <literal>rowspan</literal></title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<p>One tall thin cell on the left, two short cells next to
- it on the right.</p>
-
-<table>
- <tr>
- <td rowspan="2">Long and thin</td>
- </tr>
-
- <tr>
- <td>Top cell</td>
-
- <td>Bottom cell</td>
- </tr>
-</table>]]></programlisting>
- </example>
-
- <example>
- <title>Using <literal>colspan</literal></title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<p>One long cell on top, two short cells below it.</p>
-
-<table>
- <tr>
- <td colspan="2">Top cell</td>
- </tr>
-
- <tr>
- <td>Bottom left cell</td>
-
- <td>Bottom right cell</td>
- </tr>
-</table>]]></programlisting>
- </example>
-
- <example>
- <title>Using <literal>rowspan</literal> and
- <literal>colspan</literal> together</title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<p>On a 3x3 grid, the top left block is a 2x2 set of
- cells merged in to one. The other cells are normal.</p>
-
-<table>
- <tr>
- <td colspan="2" rowspan="2">Top left large cell</td>
-
- <td>Top right cell</td>
- </tr>
-
- <tr>
- <!-- Because the large cell on the left merges in to
- this row, the first <td> will occur on its
- right -->
-
- <td>Middle right cell</td>
- </tr>
-
- <tr>
- <td>Bottom left cell</td>
-
- <td>Bottom middle cell</td>
-
- <td>Bottom right cell</td>
- </tr>
-</table>]]></programlisting>
- </example>
- </sect3>
- </sect2>
-
- <sect2>
- <title>In-line elements</title>
-
- <sect3>
- <title>Emphasising information</title>
-
- <para>You have two levels of emphasis available in HTML,
- <sgmltag>em</sgmltag> and <sgmltag>strong</sgmltag>.
- <sgmltag>em</sgmltag> is for a normal level of emphasis and
- <sgmltag>strong</sgmltag> indicates stronger emphasis.</para>
-
- <para>Typically, <sgmltag>em</sgmltag> is rendered in italic and
- <sgmltag>strong</sgmltag> is rendered in bold. This is not always
- the case, however, and you should not rely on it.</para>
-
- <example>
- <title><sgmltag>em</sgmltag> and <sgmltag>strong</sgmltag></title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<p><em>This</em> has been emphasised, while
- <strong>this</strong> has been strongly emphasised.</p>]]></programlisting>
- </example>
- </sect3>
-
- <sect3>
- <title>Bold and italics</title>
-
- <para>Because HTML includes presentational markup, you can also
- indicate that particular content should be rendered in bold or
- italic. The elements are <sgmltag>b</sgmltag> and
- <sgmltag>i</sgmltag> respectively.</para>
-
- <example>
- <title><sgmltag>b</sgmltag> and <sgmltag>i</sgmltag></title>
-
- <programlisting><![ CDATA [<p><b>This</b> is in bold, while <i>this</i> is
- in italics.</p>]]></programlisting>
- </example>
- </sect3>
-
- <sect3>
- <title>Indicating fixed pitch text</title>
-
- <para>If you have content that should be rendered in a fixed pitch
- (typewriter) typeface, use <sgmltag>tt</sgmltag> (for
- <quote>teletype</quote>).</para>
-
- <example>
- <title><sgmltag>tt</sgmltag></title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<p>This document was originally written by
- Nik Clayton, who can be reached by e-mail as
- <tt>nik@FreeBSD.org</tt>.</p>]]></programlisting>
- </example>
- </sect3>
-
- <sect3>
- <title>Content size</title>
-
- <para>You can indicate that content should be shown in a larger or
- smaller font. There are three ways of doing this.</para>
-
- <orderedlist>
- <listitem>
- <para>Use <sgmltag>big</sgmltag> and <sgmltag>small</sgmltag>
- around the content you wish to change size. These tags can be
- nested, so <literal>&lt;big&gt;&lt;big&gt;This is much
- bigger&lt;/big&gt;&lt;/big&gt;</literal> is possible.</para>
- </listitem>
-
- <listitem>
- <para>Use <sgmltag>font</sgmltag> with the <literal>size</literal>
- attribute set to <literal>+1</literal> or <literal>-1</literal>
- respectively. This has the same effect as using
- <sgmltag>big</sgmltag> or <sgmltag>small</sgmltag>. However,
- the use of this approach is deprecated.</para>
- </listitem>
-
- <listitem>
- <para>Use <sgmltag>font</sgmltag> with the <literal>size</literal>
- attribute set to a number between 1 and 7. The default font size
- is <literal>3</literal>. This approach is deprecated.</para>
- </listitem>
- </orderedlist>
-
- <example>
- <title><sgmltag>big</sgmltag>, <sgmltag>small</sgmltag>, and
- <sgmltag>font</sgmltag></title>
-
- <para>The following fragments all do the same thing.</para>
-
- <programlisting><![ CDATA [<p>This text is <small>slightly smaller</small>. But
- this text is <big>slightly bigger</big>.</p>
-
-<p>This text is <font size="-1">slightly smaller</font>. But
- this text is <font size="+1">slightly bigger</font.</p>
-
-<p>This text is <font size="2">slightly smaller</font>. But
- this text is <font size="4">slightly bigger</font>.</p>]]></programlisting>
- </example>
- </sect3>
- </sect2>
-
- <sect2>
- <title>Links</title>
-
- <note>
- <para>Links are also in-line elements.</para>
- </note>
-
- <sect3>
- <title>Linking to other documents on the WWW</title>
-
- <para>In order to include a link to another document on the WWW you
- must know the URL of the document you want to link to.</para>
-
- <para>The link is indicated with <sgmltag>a</sgmltag>, and the
- <literal>href</literal> attribute contains the URL of the target
- document. The content of the element becomes the link, and is
- normally indicated to the user in some way (underlining, change of
- colour, different mouse cursor when over the link, and so
- on).</para>
-
- <example>
- <title>Using <literal>&lt;a href="..."&gt;</literal></title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<p>More information is available at the
- <a href="http://www.FreeBSD.org/">FreeBSD web site</a>.</p>]]></programlisting>
- </example>
-
- <para>These links will take the user to the top of the chosen
- document.</para>
- </sect3>
-
- <sect3>
- <title>Linking to other parts of documents</title>
-
- <para>Linking to a point within another document (or within the same
- document) requires that the document author include anchors that you
- can link to.</para>
-
- <para>Anchors are indicated with <sgmltag>a</sgmltag> and the
- <literal>name</literal> attribute instead of
- <literal>href</literal>.</para>
-
- <example>
- <title>Using <literal>&lt;a name="..."&gt;</literal></title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<p><a name="para1">This</a> paragraph can be referenced
- in other links with the name <tt>para1</tt>.</p>]]></programlisting>
- </example>
-
- <para>To link to a named part of a document, write a normal link to
- that document, but include the name of the anchor after a
- <literal>#</literal> symbol.</para>
-
- <example>
- <title>Linking to a named part of another document</title>
-
- <para>Assume that the <literal>para1</literal> example resides in a
- document called <filename>foo.html</filename>.</para>
-
- <programlisting><![ CDATA [<p>More information can be found in the
- <a href="foo.html#para1">first paragraph</a> of
- <tt>foo.html</tt>.</p>]]></programlisting>
- </example>
-
- <para>If you are linking to a named anchor within the same document
- then you can omit the document's URL, and just include the name of
- the anchor (with the preceeding <literal>#</literal>).</para>
-
- <example>
- <title>Linking to a named part of the same document</title>
-
- <para>Assume that the <literal>para1</literal> example resides in
- this document</para>
-
- <programlisting><![ CDATA [<p>More information can be found in the
- <a href="#para1">first paragraph</a> of this
- document.</p>]]></programlisting>
- </example>
- </sect3>
- </sect2>
- </sect1>
-
- <sect1>
- <title>DocBook</title>
-
- <para>DocBook was designed by the <ulink
- url="http://www.oreilly.com/davenport/">Davenport Group</ulink> to be
- a DTD for writing technical documentation. As such, and unlike LinuxDoc
- and HTML, DocBook is very heavily oriented towards markup that
- describes <emphasis>what</emphasis> something is, rather than describing
- <emphasis>how</emphasis> it should be presented.</para>
-
- <note>
- <title><literal>formal</literal> vs. <literal>informal</literal></title>
-
- <para>Some elements may exist in two forms, <emphasis>formal</emphasis>
- and <emphasis>informal</emphasis>. Typically, the formal version of
- the element will consist of a title followed by the information
- version of the element. The informal version will not have a
- title.</para>
- </note>
-
- <para>The DocBook DTD is available from the ports collection in the
- <filename>textproc/docbook</filename> port. It is automatically
- installed as part of the <filename>textproc/docproj</filename>
- port.</para>
-
- <sect2>
- <title>FreeBSD extensions</title>
-
- <para>The FreeBSD Documentation Project has extended the DocBook DTD by
- adding some new elements. These elements serve to make some of the
- markup more precise.</para>
-
- <para>Where a FreeBSD specific element is listed below it is clearly
- marked.</para>
-
- <para>Throughout the rest of this document, the term
- <quote>DocBook</quote> is used to mean the FreeBSD extended DocBook
- DTD.</para>
-
- <note>
- <para>There is nothing about these extensions that is FreeBSD
- specific, it was just felt that they were useful enhancements for
- this particular project. Should anyone from any of the other *nix
- camps (NetBSD, OpenBSD, Linux, &hellip;) be interested in
- collaborating on a standard DocBook extension set, please get in
- touch with Nik Clayton <email>nik@FreeBSD.org</email>.</para>
- </note>
-
- <para>The FreeBSD extensions are not (currently) in the ports
- collection. They are stored in the FreeBSD CVS tree, as <ulink
- url="http://www.freebsd.org/cgi/cvsweb.cgi/doc/share/sgml/freebsd.dtd">doc/share/sgml/freebsd.dtd</ulink>.</para>
- </sect2>
-
- <sect2>
- <title>Formal Public Identifier (FPI)</title>
-
- <para>In compliance with the DocBook guidelines for writing FPIs for
- DocBook customisations, the FPI for the FreeBSD extended DocBook DTD
- is;</para>
-
- <programlisting>PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN"</programlisting>
- </sect2>
-
- <sect2>
- <title>Document structure</title>
-
- <para>DocBook allows you to structure your documentation in several
- ways. In the FreeBSD Documentation Project we are using two primary
- types of DocBook document: the book and the article.</para>
-
- <para>A book is organised into <sgmltag>chapter</sgmltag>s. This is a
- mandatory requirement. There may be <sgmltag>part</sgmltag>s between
- the book and the chapter to provide another layer of organisation.
- The Handbook is arranged in this way.</para>
-
- <para>A chapter may (or may not) contain one or more sections. These
- are indicated with the <sgmltag>sect1</sgmltag> element. If a section
- contains another section then use the <sgmltag>sect2</sgmltag>
- element, and so on, up to <sgmltag>sect5</sgmltag>.</para>
-
- <para>Chapters and sections contain the remainder of the content.</para>
-
- <para>An article is simpler than a book, and does not use chapters.
- Instead, the content of an article is organised into one or more
- sections, using the same <sgmltag>sect1</sgmltag> (and
- <sgmltag>sect2</sgmltag> and so on) elements that are used in
- books.</para>
-
- <para>Obviously, you should consider the nature of the documentation you
- are writing in order to decide whether it is best marked up as a book
- or an article. Articles are well suited to information that does not
- need to be broken down into several chapters, and that is, relatively
- speaking, quite short, at up to 20-25 pages of content. Books are
- best suited to information that can be broken up into several
- chapters, possibly with appendices and similar content as well.</para>
-
- <para>The <ulink url="http://www.FreeBSD.org/tutorials/">FreeBSD
- tutorials</ulink> are all marked up as articles, while this
- document, the <ulink url="http://www.FreeBSD.org/FAQ/">FreeBSD
- FAQ</ulink>, and the <ulink
- url="http://www.FreeBSD.org/handbook/">FreeBSD Handbook</ulink> are
- all marked up as books.</para>
-
- <sect3>
- <title>Starting a book</title>
-
- <para>The content of the book is contained within the
- <sgmltag>book</sgmltag> element. As well as containing structural
- markup, this element can contain elements that include additional
- information about the book. This is either meta-information, used
- for reference purposes, or additional content used to produce a
- title page.</para>
-
- <para>This additional information should be contained within
- <sgmltag>bookinfo</sgmltag>.</para>
-
- <example>
- <title>Boilerplate <sgmltag>book</sgmltag> with
- <sgmltag>bookinfo</sgmltag></title>
-
- <!-- Can't put this in a marked section because of the
- replaceable elements -->
- <programlisting>&lt;book>
- &lt;bookinfo>
- &lt;title><replaceable>Your title here</replaceable>&lt;/title>
-
- &lt;author>
- &lt;firstname><replaceable>Your first name</replaceable>&lt;/firstname>
- &lt;surname><replaceable>Your surname</replaceable>&lt;/surname>
- &lt;affiliation>
- &lt;address>&lt;email><replaceable>Your e-mail address</replaceable>&lt;/email>&lt;/address>
- &lt;/affiliation>
- &lt;/author>
-
- &lt;copyright>
- &lt;year><replaceable>1998</replaceable>&lt;/year>
- &lt;holder role="mailto:<replaceable>your e-mail address</replaceable>"><replaceable>Your name</replaceable>&lt;/holder>
- &lt;/copyright>
-
- &lt;pubdate role="rcs">&#36;Date&#36;&lt;/pubdate>
-
- &lt;releaseinfo>&#36;Id&#36;&lt;/releaseinfo>
-
- &lt;abstract>
- &lt;para><replaceable>Include an abstract of the book's contents here.</replaceable>&lt;/para>
- &lt;/abstract>
- &lt;/bookinfo>
-
- &hellip;
-
-&lt;/book></programlisting>
- </example>
- </sect3>
-
- <sect3>
- <title>Starting an article</title>
-
- <para>The content of the article is contained within the
- <sgmltag>article</sgmltag> element. As well as containing
- structural markup, this element can contain elements that include
- additional information about the article. This is either
- meta-information, used for reference purposes, or additional content
- used to produce a title page.</para>
-
- <para>This additional information should be contained within
- <sgmltag>articleinfo</sgmltag>.</para>
-
- <example>
- <title>Boilerplate <sgmltag>article</sgmltag> with
- <sgmltag>articleinfo</sgmltag></title>
-
- <!-- Can't put this in a marked section because of the
- replaceable elements -->
- <programlisting>&lt;article>
- &lt;articleinfo>
- &lt;title><replaceable>Your title here</replaceable>&lt;/title>
-
- &lt;author>
- &lt;firstname><replaceable>Your first name</replaceable>&lt;/firstname>
- &lt;surname><replaceable>Your surname</replaceable>&lt;/surname>
- &lt;affiliation>
- &lt;address>&lt;email><replaceable>Your e-mail address</replaceable>&lt;/email>&lt;/address>
- &lt;/affiliation>
- &lt;/author>
-
- &lt;copyright>
- &lt;year><replaceable>1998</replaceable>&lt;/year>
- &lt;holder role="mailto:<replaceable>your e-mail address</replaceable>"><replaceable>Your name</replaceable>&lt;/holder>
- &lt;/copyright>
-
- &lt;pubdate role="rcs">&#36;Date&#36;&lt;/pubdate>
-
- &lt;releaseinfo>&#36;Id&#36;&lt;/releaseinfo>
-
- &lt;abstract>
- &lt;para><replaceable>Include an abstract of the article's contents here.</replaceable>&lt;/para>
- &lt;/abstract>
- &lt;/articleinfo>
-
- &hellip;
-
-&lt;/article></programlisting>
- </example>
- </sect3>
- <sect3>
- <title>Indicating chapters</title>
-
- <para>Use <sgmltag>chapter</sgmltag> to mark up your chapters. Each
- chapter has a mandatory <sgmltag>title</sgmltag>. Articles do not
- contain chapters, they are reserved for books.</para>
-
- <example>
- <title>A simple chapter</title>
-
- <programlisting><![ CDATA [<chapter>
- <title>The chapter's title</title>
-
- ...
-</chapter>]]></programlisting>
- </example>
-
- <para>A chapter cannot be empty; it must contain elements in addition
- to <sgmltag>title</sgmltag>. If you need to include an empty
- chapter then just use an empty paragraph.</para>
-
- <example>
- <title>Empty chapters</title>
-
- <programlisting><![ CDATA [<chapter>
- <title>This is an empty chapter</title>
-
- <para></para>
-</chapter>]]></programlisting>
- </example>
- </sect3>
-
- <sect3>
- <title>Sections below chapters</title>
-
- <para>In books, chapters may (but do not need to) be broken up into
- sections, subsections, and so on. In articles, sections are the
- main structural element, and each article must contain at least one
- section. Use the
- <sgmltag>sect<replaceable>n</replaceable></sgmltag> element. The
- <replaceable>n</replaceable> indicates the section number, which
- identifies the section level.</para>
-
- <para>The first <sgmltag>sect<replaceable>n</replaceable></sgmltag> is
- <sgmltag>sect1</sgmltag>. You can have one or more of these in a
- chapter. They can contain one or more <sgmltag>sect2</sgmltag>
- elements, and so on, down to <sgmltag>sect5</sgmltag>.</para>
-
- <example>
- <title>Sections in chapters</title>
-
- <programlisting><![ RCDATA [<chapter>
- <title>A sample chapter</title>
-
- <para>Some text in the chapter.</para>
-
- <sect1>
- <title>First section (1.1)</title>
-
- &hellip;
- </sect1>
-
- <sect1>
- <title>Second section (1.2)</title>
-
- <sect2>
- <title>First sub-section (1.2.1)</title>
-
- <sect3>
- <title>First sub-sub-section (1.2.1.1)</title>
-
- &hellip;
- </sect3>
- </sect2>
-
- <sect2>
- <title>Second sub-section (1.2.2)</title>
-
- &hellip;
- </sect2>
- </sect1>
-</chapter>]]></programlisting>
- </example>
-
- <note>
- <para>This example includes section numbers in the section titles.
- You should not do this in your documents. Adding the section
- numbers is carried out by the stylesheets (of which more
- later), and you do not need to manage them yourself.</para>
- </note>
- </sect3>
-
- <sect3>
- <title>Subdividing using <sgmltag>part</sgmltag>s</title>
-
- <para>You can introduce another layer of organisation between
- <sgmltag>book</sgmltag> and <sgmltag>chapter</sgmltag> with one or
- more <sgmltag>part</sgmltag>s. This cannot be done in an
- <sgmltag>article</sgmltag>.</para>
-
- <programlisting><![ CDATA [<part>
- <title>Introduction</title>
-
- <chapter>
- <title>Overview</title>
-
- ...
- </chapter>
-
- <chapter>
- <title>What is FreeBSD?</title>
-
- ...
- </chapter>
-
- <chapter>
- <title>History</title>
-
- ...
- </chapter>
-</part>]]></programlisting>
- </sect3>
- </sect2>
-
- <sect2>
- <title>Block elements</title>
-
- <sect3>
- <title>Paragraphs</title>
-
- <para>DocBook supports three types of paragraphs:
- <sgmltag>formalpara</sgmltag>, <sgmltag>para</sgmltag>, and
- <sgmltag>simpara</sgmltag>.</para>
-
- <para>Most of the time you will only need to use
- <sgmltag>para</sgmltag>. <sgmltag>formalpara</sgmltag> includes a
- <sgmltag>title</sgmltag> element, and <sgmltag>simpara</sgmltag>
- disallows some elements from within <sgmltag>para</sgmltag>. Stick
- with <sgmltag>para</sgmltag>.</para>
-
- <example>
- <title><sgmltag>para</sgmltag></title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<para>This is a paragraph. It can contain just about any
- other element.</para> ]]></programlisting>
-
- <para>Appearance:</para>
-
- <para>This is a paragraph. It can contain just about any other
- element.</para>
- </example>
- </sect3>
-
- <sect3>
- <title>Block quotations</title>
-
- <para>A block quotation is an extended quotation from another document
- that should not appear within the current paragraph. You will
- probably only need it infrequently.</para>
-
- <para>Blockquotes can optionally contain a title and an attribution
- (or they can be left untitled and unattributed).</para>
-
- <example>
- <title><sgmltag>blockquote</sgmltag></title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<para>A small excerpt from the US Constitution;</para>
-
-<blockquote>
- <title>Preamble to the Constitution of the United States</title>
-
- <attribution>Copied from a web site somewhere</attribution>
-
- <para>We the People of the United States, in Order to form a more perfect
- Union, establish Justice, insure domestic Tranquility, provide for the
- common defence, promote the general Welfare, and secure the Blessings
- of Liberty to ourselves and our Posterity, do ordain and establish this
- Constitution for the United States of America.</para>
-</blockquote>]]></programlisting>
-
- <para>Appearance:</para>
-
- <blockquote>
- <title>Preamble to the Constitution of the United States</title>
-
- <attribution>Copied from a web site somewhere</attribution>
-
- <para>We the People of the United States, in Order to form a more
- perfect Union, establish Justice, insure domestic Tranquility,
- provide for the common defence, promote the general Welfare, and
- secure the Blessings of Liberty to ourselves and our Posterity,
- do ordain and establish this Constitution for the United States
- of America.</para>
- </blockquote>
- </example>
- </sect3>
-
- <sect3>
- <title>Tips, notes, warnings, cautions, important information and
- sidebars.</title>
-
- <para>You may need to include extra information separate from the
- main body of the text. Typically this is <quote>meta</quote>
- information that the user should be aware of.</para>
-
- <para>Depending on the nature of the information, one of
- <sgmltag>tip</sgmltag>, <sgmltag>note</sgmltag>,
- <sgmltag>warning</sgmltag>, <sgmltag>caution</sgmltag>, and
- <sgmltag>important</sgmltag> should be used. Alternatively, if the
- information is related to the main text but is not one of the above,
- use <sgmltag>sidebar</sgmltag>.</para>
-
- <para>The circumstances in which to choose one of these elements over
- another is unclear. The DocBook documentation suggests;</para>
-
- <itemizedlist>
- <listitem>
- <para>A Note is for information that should be heeded by all
- readers.</para>
- </listitem>
-
- <listitem>
- <para>An Important element is a variation on Note.</para>
- </listitem>
-
- <listitem>
- <para>A Caution is for information regarding possible data loss
- or software damage.</para>
- </listitem>
-
- <listitem>
- <para>A Warning is for information regarding possible hardware
- damage or injury to life or limb.</para>
- </listitem>
- </itemizedlist>
-
- <example>
- <title><sgmltag>warning</sgmltag></title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<warning>
- <para>Installing FreeBSD may make you want to delete Windows from your
- harddisk.</para>
-</warning>]]></programlisting>
- </example>
-
- <!-- Need to do this outside of the example -->
- <warning>
- <para>Installing FreeBSD may make you want to delete Windows from
- your harddisk.</para>
- </warning>
- </sect3>
-
- <sect3>
- <title>Lists and procedures</title>
-
- <para>You will often need to list pieces of information to the user,
- or present them with a number of steps that must be carried out in
- order to accomplish a particular goal.</para>
-
- <para>In order to do this, use <sgmltag>itemizedlist</sgmltag>,
- <sgmltag>orderedlist</sgmltag>, or
- <sgmltag>procedure</sgmltag><footnote><para>There are other types of
- list element in DocBook, but we're not concerned with those at
- the moment.</para>
- </footnote>
- </para>
-
- <para><sgmltag>itemizedlist</sgmltag> and
- <sgmltag>orderedlist</sgmltag> are similar to their counterparts in
- HTML, <sgmltag>ul</sgmltag> and <sgmltag>ol</sgmltag>. Each one
- consists of one or more <sgmltag>listitem</sgmltag> elements, and
- each <sgmltag>listitem</sgmltag> contains one or more block
- elements. The <sgmltag>listitem</sgmltag> elements are analagous to
- HTML's <sgmltag>li</sgmltag> tags. However, unlike HTML, they are
- required.</para>
-
- <para><sgmltag>procedure</sgmltag> is slightly different. It consists
- of <sgmltag>step</sgmltag>s, which may in turn consists of more
- <sgmltag>step</sgmltag>s or <sgmltag>substep</sgmltag>s. Each
- <sgmltag>step</sgmltag> contains block elements.</para>
-
- <example>
- <title><sgmltag>itemizedlist</sgmltag>,
- <sgmltag>orderedlist</sgmltag>, and
- <sgmltag>procedure</sgmltag></title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<itemizedlist>
- <listitem>
- <para>This is the first itemized item.</para>
- </listitem>
-
- <listitem>
- <para>This is the second itemized item.</para>
- </listitem>
-</itemizedlist>
-
-<orderedlist>
- <listitem>
- <para>This is the first ordered item.</para>
- </listitem>
-
- <listitem>
- <para>This is the second ordered item.</para>
- </listitem>
-</orderedlist>
-
-<procedure>
- <step>
- <para>Do this.</para>
- </step>
-
- <step>
- <para>Then do this.</para>
- </step>
-
- <step>
- <para>And now do this.</para>
- </step>
-</procedure>]]></programlisting>
-
- <para>Appearance:</para>
-
- <itemizedlist>
- <listitem>
- <para>This is the first itemized item.</para>
- </listitem>
-
- <listitem>
- <para>This is the second itemized item.</para>
- </listitem>
- </itemizedlist>
-
- <orderedlist>
- <listitem>
- <para>This is the first ordered item.</para>
- </listitem>
-
- <listitem>
- <para>This is the second ordered item.</para>
- </listitem>
- </orderedlist>
- </example>
-
- <!-- Can't have <procedure> inside <example>, so this is a cheat -->
-
- <procedure>
- <step>
- <para>Do this.</para>
- </step>
-
- <step>
- <para>Then do this.</para>
- </step>
-
- <step>
- <para>And now do this.</para>
- </step>
- </procedure>
- </sect3>
-
- <sect3>
- <title>Showing file samples</title>
-
- <para>If you want to show a fragment of a file (or perhaps a complete
- file) to the user, wrap it in the <sgmltag>programlisting</sgmltag>
- element.</para>
-
- <para>White space and line breaks within
- <sgmltag>programlisting</sgmltag> <emphasis>are</emphasis>
- significant. In particular, this means that the opening tag should
- appear on the same line as the first line of the output, and the
- closing tag should appear on the same line as the last line of the
- output, otherwise spurious blank lines may be included.</para>
-
- <example>
- <title><sgmltag>programlisting</sgmltag></title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA[<para>When you have finished, your program should look like
- this;</para>
-
-<programlisting>#include &lt;stdio.h&gt;
-
-int
-main(void)
-{
- printf("hello, world\n");
-}</programlisting>]]></programlisting>
-
- <para>Notice how the angle brackets in the
- <literal>#include</literal> line need to be referenced by their
- entities instead of being included literally.</para>
-
- <para>Appearance:</para>
-
- <para>When you have finished, your program should look like
- this;</para>
-
- <programlisting>#include &lt;stdio.h&gt;
-
-int
-main(void)
-{
- printf("hello, world\n");
-}</programlisting>
- </example>
- </sect3>
-
- <sect3>
- <title>Callouts</title>
-
- <para>A callout is a mechanism for referring back to an earlier piece
- of text or specific position within an earlier example without
- linking to it within the text.</para>
-
- <para>To do this, mark areas of interest in your example
- (<sgmltag>programlisting</sgmltag>,
- <sgmltag>literallayout</sgmltag>, or whatever) with the
- <sgmltag>co</sgmltag> element. Each element must have a unique
- <literal>id</literal> assigned to it. After the example include a
- <sgmltag>calloutlist</sgmltag> that refers back to the example and
- provides additional commentary.</para>
-
- <example>
- <title><sgmltag>co</sgmltag> and
- <sgmltag>calloutlist</sgmltag></title>
-
- <programlisting><![ CDATA[<para>When you have finished, your program should look like
- this;</para>
-
-<programlisting>#include &lt;stdio.h&gt; <co id="co-ex-include">
-
-int <co id="co-ex-return">
-main(void)
-{
- printf("hello, world\n"); <co id="co-ex-printf">
-}</programlisting>
-
-<calloutlist>
- <callout arearefs="co-ex-include">
- <para>Includes the standard IO header file.</para>
- </callout>
-
- <callout arearefs="co-ex-return">
- <para>Specifies that <function>main()</function> returns an
- int.</para>
- </callout>
-
- <callout arearefs="co-ex-printf">
- <para>The <function>printf()</function> call that writes
- <literal>hello, world</literal> to standard output.</para>
- </callout>
-</calloutlist>]]></programlisting>
-
- <para>Appearance:</para>
-
- <para>When you have finished, your program should look like
- this;</para>
-
- <programlisting>#include &lt;stdio.h&gt; <co id="co-ex-include">
-
-int <co id="co-ex-return">
-main(void)
-{
- printf("hello, world\n"); <co id="co-ex-printf">
-}</programlisting>
-
- <calloutlist>
- <callout arearefs="co-ex-include">
- <para>Includes the standard IO header file.</para>
- </callout>
-
- <callout arearefs="co-ex-return">
- <para>Specifies that <function>main()</function> returns an
- int.</para>
- </callout>
-
- <callout arearefs="co-ex-printf">
- <para>The <function>printf()</function> call that writes
- <literal>hello, world</literal> to standard output.</para>
- </callout>
- </calloutlist>
- </example>
- </sect3>
-
- <sect3>
- <title>Tables</title>
-
- <para>Unlike HTML, you do not need to use tables for layout purposes,
- as the stylesheet handles those issues for you. Instead, just use
- tables for marking up tabular data.</para>
-
- <para>In general terms (and see the DocBook documentation for more
- detail) a table (which can be either formal or informal) consists of
- a <sgmltag>table</sgmltag> element. This contains at least one
- <sgmltag>tgroup</sgmltag> element, which specifies (as an attribute)
- the number of columns in this table group. Within the tablegroup
- you can then have one <sgmltag>thead</sgmltag> element, which
- contains elements for the table headings (column headings), and one
- <sgmltag>tbody</sgmltag> which contains the body of the
- table.</para>
-
- <para>Both <sgmltag>tgroup</sgmltag> and <sgmltag>thead</sgmltag>
- contain <sgmltag>row</sgmltag> elements, which in turn contain
- <sgmltag>entry</sgmltag> elements. Each <sgmltag>entry</sgmltag>
- element specifies one cell in the table.</para>
-
- <example>
- <title><sgmltag>informaltable</sgmltag></title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<informaltable>
- <tgroup cols="2">
- <thead>
- <row>
- <entry>This is column head 1</entry>
- <entry>This is column head 2</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>Row 1, column 1</entry>
- <entry>Row 1, column 2</entry>
- </row>
-
- <row>
- <entry>Row 2, column 1</entry>
- <entry>Row 2, column 2</entry>
- </row>
- </tbody>
- </tgroup>
-</informaltable>]]></programlisting>
-
- <para>Appearance:</para>
-
- <informaltable>
- <tgroup cols="2">
- <thead>
- <row>
- <entry>This is column head 1</entry>
- <entry>This is column head 2</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>Row 1, column 1</entry>
- <entry>Row 1, column 2</entry>
- </row>
-
- <row>
- <entry>Row 2, column 1</entry>
- <entry>Row 2, column 2</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </example>
-
- <para>If you don't want a border around the table the
- <literal>frame</literal> attribute can be added to the
- <sgmltag>informaltable</sgmltag> element with a value of
- <literal>none</literal> (i.e., <literal>&lt;informaltable
- frame="none"&gt;</literal>).</para>
-
- <example>
- <title>Tables where <literal>frame="none"</literal></title>
-
- <para>Appearance:</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <thead>
- <row>
- <entry>This is column head 1</entry>
- <entry>This is column head 2</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>Row 1, column 1</entry>
- <entry>Row 1, column 2</entry>
- </row>
-
- <row>
- <entry>Row 2, column 1</entry>
- <entry>Row 2, column 2</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </example>
- </sect3>
-
- <sect3>
- <title>Examples for the user to follow</title>
-
- <para>A lot of the time you need to show examples for the user to
- follow. Typically, these will consist of dialogs with the computer;
- the user types in a command, the user gets a response back, they
- type in another command, and so on.</para>
-
- <para>A number of distinct elements and entities come in to play
- here.</para>
-
- <variablelist>
- <varlistentry>
- <term><sgmltag>screen</sgmltag></term>
-
- <listitem>
- <para>Everything the user sees in this example will be on the
- computer screen, so the next element is
- <sgmltag>screen</sgmltag>.</para>
-
- <para>Within <sgmltag>screen</sgmltag>, white space is
- significant.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><sgmltag>prompt</sgmltag>,
- <literal>&amp;prompt.root;</literal> and
- <literal>&amp;prompt.user;</literal></term>
-
- <listitem>
- <para>Some of the things the user will be seeing on the screen
- are prompts from the computer (either from the OS, command
- shell, or application. These should be marked up using
- <sgmltag>prompt</sgmltag>.</para>
-
- <para>As a special case, the two shell prompts for the normal
- user and the root user have been provided as entities. Every
- time you want to indicate the user is at a shell prompt, use
- one of <literal>&amp;prompt.root;</literal> and
- <literal>&amp;prompt.user;</literal> as necessary. They do
- not need to be inside <sgmltag>prompt</sgmltag>.</para>
-
- <note>
- <para><literal>&amp;prompt.root;</literal> and
- <literal>&amp;prompt.user;</literal> are FreeBSD
- extensions to DocBook, and are not part of the original
- DTD.</para>
- </note>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><sgmltag>userinput</sgmltag></term>
-
- <listitem>
- <para>When displaying text that the user should type in, wrap it
- in <sgmltag>userinput</sgmltag> tags. It will probably be
- displayed differently to the user.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <example>
- <title><sgmltag>screen</sgmltag>, <sgmltag>prompt</sgmltag>, and
- <sgmltag>userinput</sgmltag></title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<screen>&prompt.user; <userinput>ls -1</userinput>
-foo1
-foo2
-foo3
-&prompt.user; <userinput>ls -1 | grep foo2</userinput>
-foo2
-&prompt.user; <userinput>su</userinput>
-<prompt>Password: </prompt>
-&prompt.root; <userinput>cat foo2</userinput>
-This is the file called 'foo2'</screen>]]></programlisting>
-
- <para>Appearance:</para>
-
- <screen>&prompt.user; <userinput>ls -1</userinput>
-foo1
-foo2
-foo3
-&prompt.user; <userinput>ls -1 | grep foo2</userinput>
-foo2
-&prompt.user; <userinput>su</userinput>
-<prompt>Password: </prompt>
-&prompt.root; <userinput>cat foo2</userinput>
-This is the file called 'foo2'</screen>
- </example>
-
- <note>
- <para>Even though we are displaying the contents of the file
- <filename>foo2</filename>, it is <emphasis>not</emphasis> marked
- up as <sgmltag>programlisting</sgmltag>. Reserve
- <sgmltag>programlisting</sgmltag> for showing fragments of files
- outside the context of user actions.</para>
- </note>
- </sect3>
- </sect2>
-
- <sect2>
- <title>In-line elements</title>
-
- <sect3>
- <title>Emphasising information</title>
-
- <para>When you want to emphasise a particular word or phrase, use
- <sgmltag>emphasis</sgmltag>. This may be presented as italic, or
- bold, or might be spoken differently with a text-to-speech
- system.</para>
-
- <para>There is no way to change the presentation of the emphasis
- within your document, no equivalent of HTML's <sgmltag>b</sgmltag>
- and <sgmltag>i</sgmltag>. If the information you are presenting is
- important then consider presenting it in
- <sgmltag>important</sgmltag> rather than
- <sgmltag>emphasis</sgmltag>.</para>
-
- <example>
- <title><sgmltag>emphasis</sgmltag></title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<para>FreeBSD is without doubt <emphasis>the</emphasis>
- premiere Unix like operating system for the Intel architecture.</para>]]></programlisting>
-
- <para>Appearance:</para>
-
- <para>FreeBSD is without doubt <emphasis>the</emphasis> premiere Unix
- like operating system for the Intel architecture.</para>
- </example>
- </sect3>
-
- <sect3>
- <title>Keys, mouse buttons, and combinations</title>
-
- <para>To refer to a specific key on the keyboard, use
- <sgmltag>keycap</sgmltag>. To refer to a mouse button, use
- <sgmltag>mousebutton</sgmltag>. And to refer to combinations of key
- presses or mouse clicks, wrap them all in
- <sgmltag>keycombo</sgmltag>.</para>
-
- <para><sgmltag>keycombo</sgmltag> has an attribute called
- <literal>action</literal>, which may be one of
- <literal>click</literal>, <literal>double-click</literal>,
- <literal>other</literal>, <literal>press</literal>,
- <literal>seq</literal>, or <literal>simul</literal>. The last two
- values denote whether the keys or buttons should be pressed in
- sequence, or simultaneously.</para>
-
- <para>The stylesheets automatically add any connecting symbols, such
- as <literal>+</literal>, between the key names, when wrapped in
- <sgmltag>keycombo</sgmltag>.</para>
-
- <example>
- <title>Keys, mouse buttons, and combinations</title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<para>To switch to the second virtual terminal, press
- <keycombo action="simul"><keycap>Alt</keycap>
- <keycap>F1</keycap></keycombo>.</para>
-
-<para>To exit <command>vi</command> without saving your work, type
- <keycombo action="seq"><keycap>Esc</keycap><keycap>:</keycap>
- <keycap>q</keycap><keycap>!</keycap></keycombo>.</para>
-
-<para>My window manager is configured so that
- <keycombo action="simul"><keycap>Alt</keycap>
- <mousebutton>right</mousebutton>
- </keycombo> mouse button is used to move windows.</para>]]></programlisting>
-
- <para>Appearance:</para>
-
- <para>To switch to the second virtual terminal, press
- <keycombo action="simul"><keycap>Alt</keycap>
- <keycap>F1</keycap></keycombo>.</para>
-
- <para>To exit <command>vi</command> without saving your work, type
- <keycombo action="seq"><keycap>Esc</keycap><keycap>:</keycap>
- <keycap>q</keycap><keycap>!</keycap></keycombo>.</para>
-
- <para>My window manager is configured so that
- <keycombo action="simul"><keycap>Alt</keycap>
- <mousebutton>right</mousebutton>
- </keycombo> mouse button is used to move windows.</para>
- </example>
- </sect3>
-
- <sect3>
- <title>Applications, commands, options, and cites</title>
-
- <para>You will frequently want to refer to both applications and
- commands when writing for the Handbook. The distinction between
- them is simple: an application is the name for a suite (or possibly
- just 1) of programs that fulfil a particular task. A command is the
- name of a program that the user can run.</para>
-
- <para>In addition, you will occasionally need to list one or more of
- the options that a command might take.</para>
-
- <para>Finally, you will often want to list a command with its manual
- section number, in the <quote>command(number)</quote> format so
- common in Unix manuals.</para>
-
- <para>Mark up application names with
- <sgmltag>application</sgmltag>.</para>
-
- <para>When you want to list a command with its manual section number
- (which should be most of the time) the DocBook element is
- <sgmltag>citerefentry</sgmltag>. This will contain a further two
- elements, <sgmltag>refentrytitle</sgmltag> and
- <sgmltag>manvolnum</sgmltag>. The content of
- <sgmltag>refentrytitle</sgmltag> is the name of the command, and the
- content of <sgmltag>manvolnum</sgmltag> is the manual page
- section.</para>
-
- <para>This can be cumbersome to write, and so a series of <link
- linkend="sgml-primer-general-entities">general entities</link>
- have been created to make this easier. Each entity takes the form
- <literal>&amp;man.<replaceable>manual-page</replaceable>.<replaceable>manual-section</replaceable>;</literal>.</para>
-
- <para>The file that contains these entities is in
- <filename>doc/share/sgml/man-refs.ent</filename>, and can be
- referred to using this FPI:</para>
-
- <programlisting>PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN"</programlisting>
-
- <para>Therefore, the introduction to your documentation will probably
- look like this:</para>
-
- <programlisting>&lt;!DOCTYPE book PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-
-&lt;!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN"&gt;
-%man;
-
-&hellip;
-
-]&gt;</programlisting>
-
- <para>Use <sgmltag>command</sgmltag> when you want to include a
- command name <quote>in-line</quote> but present it as something the
- user should type in.</para>
-
- <para>Use <sgmltag>option</sgmltag> to mark up a command's
- options.</para>
-
- <para>This can be confusing, and sometimes the choice is not always
- clear. Hopefully this example makes it clearer.</para>
-
- <example>
- <title>Applications, commands, and options.</title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<para><application>Sendmail</application> is the most
- widely used Unix mail application.</para>
-
-<para><application>Sendmail</application> includes the
- <citerefentry>
- <refentrytitle>sendmail</refentrytitle>
- <manvolnum>8</manvolnum>
- </citerefentry>, &man.mailq.8;, and &man.newaliases.8;
- programs.</para>
-
-<para>One of the command line parameters to <citerefentry>
- <refentrytitle>sendmail</refentrytitle>
- <manvolnum>8</manvolnum>
- </citerefentry>, <option>-bp</option>, will display the current
- status of messages in the mail queue. Check this on the command
- line by running <command>sendmail -bp</command>.</para>]]></programlisting>
-
- <para>Appearance:</para>
-
- <para><application>Sendmail</application> is the most widely used
- Unix mail application.</para>
-
- <para><application>Sendmail</application> includes the
- <citerefentry>
- <refentrytitle>sendmail</refentrytitle>
- <manvolnum>8</manvolnum>
- </citerefentry>, <citerefentry>
- <refentrytitle>mailq</refentrytitle>
- <manvolnum>8</manvolnum>
- </citerefentry>, and <citerefentry>
- <refentrytitle>newaliases</refentrytitle>
- <manvolnum>8</manvolnum>
- </citerefentry> programs.</para>
-
- <para>One of the command line parameters to <citerefentry>
- <refentrytitle>sendmail</refentrytitle>
- <manvolnum>8</manvolnum>
- </citerefentry>, <option>-bp</option>, will display the current
- status of messages in the mail queue. Check this on the command
- line by running <command>sendmail -bp</command>.</para>
- </example>
-
- <note>
- <para>Notice how the
- <literal>&amp;man.<replaceable>command</replaceable>.<replaceable>section</replaceable>;</literal> notation is easier to follow.</para>
- </note>
- </sect3>
-
- <sect3>
- <title>Files, directories, extensions</title>
-
- <para>Whenever you wish to refer to the name of a file, a directory,
- or a file extension, use <sgmltag>filename</sgmltag>.</para>
-
- <example>
- <title><sgmltag>filename</sgmltag></title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<para>The SGML source for the Handbook in English can be
- found in <filename>/usr/doc/en/handbook/</filename>. The first
- file is called <filename>handbook.sgml</filename> in that
- directory. You should also see a <filename>Makefile</filename>
- and a number of files with a <filename>.ent</filename>
- extension.</para>]]></programlisting>
-
- <para>Appearance:</para>
-
- <para>The SGML source for the Handbook in English can be found in
- <filename>/usr/doc/en/handbook/</filename>. The first file is
- called <filename>handbook.sgml</filename> in that directory. You
- should also see a <filename>Makefile</filename> and a number of
- files with a <filename>.ent</filename> extension.</para>
- </example>
- </sect3>
-
- <sect3>
- <title>Devices</title>
-
- <note>
- <title>FreeBSD extension</title>
-
- <para>These elements are part of the FreeBSD extension to DocBook,
- and do not exist in the original DocBook DTD.</para>
- </note>
-
- <para>When referring to devices you have two choices. You can either
- refer to the device as it appears in <filename>/dev</filename>, or
- you can use the name of the device as it appears in the kernel. For
- this latter course, use <sgmltag>devicename</sgmltag>.</para>
-
- <para>Sometimes you will not have a choice. Some devices, such as
- networking cards, do not have entries in <filename>/dev</filename>,
- or the entries are markedly different from those entries.</para>
-
- <example>
- <title><sgmltag>devicename</sgmltag></title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<para><devicename>sio</devicename> is used for serial
- communication in FreeBSD. <devicename>sio</devicename> manifests
- through a number of entries in <filename>/dev</filename>, including
- <filename>/dev/ttyd0</filename> and <filename>/dev/cuaa0</filename>.</para>
-
-<para>By contrast, the networking devices, such as
- <devicename>ed0</devicename> do not appear in <filename>/dev</filename>.
-
-<para>In MS-DOS, the first floppy drive is referred to as
- <devicename>a:</devicename>. In FreeBSD it is
- <filename>/dev/fd0</filename>.</para>]]></programlisting>
-
- <para>Appearance:</para>
-
- <para><devicename>sio</devicename> is used for serial communication
- in FreeBSD. <devicename>sio</devicename> manifests through a
- number of entries in <filename>/dev</filename>, including
- <filename>/dev/ttyd0</filename> and
- <filename>/dev/cuaa0</filename>.</para>
-
- <para>By contrast, the networking devices, such as
- <devicename>ed0</devicename> do not appear in
- <filename>/dev</filename>.</para>
-
- <para>In MS-DOS, the first floppy drive is referred to as
- <devicename>a:</devicename>. In FreeBSD it is
- <filename>/dev/fd0</filename>.</para>
- </example>
- </sect3>
-
- <sect3>
- <title>Hosts, domains, IP addresses, and so forth</title>
-
- <note>
- <title>FreeBSD extension</title>
-
- <para>These elements are part of the FreeBSD extension to DocBook,
- and do not exist in the original DocBook DTD.</para>
- </note>
-
- <para>You can markup identification information for networked
- computers (hosts) in several ways, depending on the nature of the
- information. All of them use <sgmltag>hostid</sgmltag> as the
- element, with the <literal>role</literal> attribute selecting the
- type of the marked up information.</para>
-
- <variablelist>
- <varlistentry>
- <term>No role attribute, or
- <literal>role="hostname"</literal></term>
-
- <listitem>
- <para>With no role attribute (i.e.,
- <sgmltag>hostid</sgmltag>...<sgmltag>hostid</sgmltag> the
- marked up information is the simple hostname, such as
- <literal>freefall</literal> or <literal>wcarchive</literal>.
- You can explicitly specify this with
- <literal>role="hostname"</literal>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><literal>role="domainname"</literal></term>
-
- <listitem>
- <para>The text is a domain name, such as
- <literal>FreeBSD.org</literal> or
- <literal>ngo.org.uk</literal>. There is no hostname
- component.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><literal>role="fqdn"</literal></term>
-
- <listitem>
- <para>The text is a Fully Qualified Domain Name, with both
- hostname and domain name parts.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><literal>role="ipaddr"</literal></term>
-
- <listitem>
- <para>The text is an IP address, probably expressed as a dotted
- quad.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><literal>role="ip6addr"</literal></term>
-
- <listitem>
- <para>The text is an IPv6 address.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><literal>role="netmask"</literal></term>
-
- <listitem>
- <para>The text is a network mask, which might be expressed as a
- dotted quad, a hexadecimal string, or as a
- <literal>/</literal> followed by a number.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><literal>role="mac"</literal></term>
-
- <listitem>
- <para>The text is an Ethernet MAC address, expressed as a series
- of 2 digit hexadecimal numbers separated by colons.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <example>
- <title><sgmltag>hostid</sgmltag> and roles</title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<para>The local machine can always be referred to by the
- name <hostid>localhost</hostid>, which will have the IP address
- <hostid role="ipaddr">127.0.0.1</hostid>.</para>
-
-<para>The <hostid role="domainname">FreeBSD.org</hostid> domain
- contains a number of different hosts, including
- <hostid role="fqdn">freefall.FreeBSD.org</hostid> and
- <hostid role="fqdn">bento.FreeBSD.org</hostid>.</para>
-
-<para>When adding an IP alias to an interface (using
- <command>ifconfig</command>) <emphasis>always</emphasis> use a
- netmask of <hostid role="netmask">255.255.255.255</hostid>
- (which can also be expressed as <hostid
- role="netmask">0xffffffff</hostid>.</para>
-
-<para>The MAC address uniquely identifies every network card
- in existence. A typical MAC address looks like <hostid
- role="mac">08:00:20:87:ef:d0</hostid>.</para>]]></programlisting>
-
- <para>Appearance:</para>
-
- <para>The local machine can always be referred to by the name
- <hostid>localhost</hostid>, which will have the IP address <hostid
- role="ipaddr">127.0.0.1</hostid>.</para>
-
- <para>The <hostid role="domainname">FreeBSD.org</hostid> domain
- contains a number of different hosts, including <hostid
- role="fqdn">freefall.FreeBSD.org</hostid> and <hostid
- role="fqdn">bento.FreeBSD.org</hostid>.</para>
-
- <para>When adding an IP alias to an interface (using
- <command>ifconfig</command>) <emphasis>always</emphasis> use a
- netmask of <hostid role="netmask">255.255.255.255</hostid> (which
- can also be expressed as <hostid
- role="netmask">0xffffffff</hostid>.</para>
-
- <para>The MAC address uniquely identifies every network card in
- existence. A typical MAC address looks like <hostid
- role="mac">08:00:20:87:ef:d0</hostid>.</para>
- </example>
- </sect3>
-
- <sect3>
- <title>Usernames</title>
-
- <note>
- <title>FreeBSD extension</title>
-
- <para>These elements are part of the FreeBSD extension to DocBook,
- and do not exist in the original DocBook DTD.</para>
- </note>
-
- <para>When you need to refer to a specific username, such as
- <literal>root</literal> or <literal>bin</literal>, use
- <sgmltag>username</sgmltag>.</para>
-
- <example>
- <title><sgmltag>username</sgmltag></title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<para>To carry out most system administration functions you
- will need to be <username>root</username>.</para>]]></programlisting>
-
- <para>Appearance:</para>
-
- <para>To carry out most system administration functions you will
- need to be <username>root</username>.</para>
- </example>
- </sect3>
-
- <sect3>
- <title>Describing <filename>Makefile</filename>s</title>
-
- <note>
- <title>FreeBSD extension</title>
-
- <para>These elements are part of the FreeBSD extension to DocBook,
- and do not exist in the original DocBook DTD.</para>
- </note>
-
- <para>Two elements exist to describe parts of
- <filename>Makefile</filename>s, <sgmltag>maketarget</sgmltag> and
- <sgmltag>makevar</sgmltag>.</para>
-
- <para><sgmltag>maketarget</sgmltag> identifies a build target exported
- by a <filename>Makefile</filename> that can be given as a parameter
- to <command>make</command>. <sgmltag>makevar</sgmltag> identifies a
- variable that can be set (in the environment, on the
- <command>make</command> command line, or within the
- <filename>Makefile</filename>) to influence the process.</para>
-
- <example>
- <title><sgmltag>maketarget</sgmltag> and
- <sgmltag>makevar</sgmltag></title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<para>Two common targets in a <filename>Makefile</filename>
- are <maketarget>all</maketarget> and <maketarget>clean</maketarget>.</para>
-
-<para>Typically, invoking <maketarget>all</maketarget> will rebuild the
- application, and invoking <maketarget>clean</maketarget> will remove
- the temporary files (<filename>.o</filename> for example) created by
- the build process.</para>
-
-<para><maketarget>clean</maketarget> may be controlled by a number of
- variables, including <makevar>CLOBBER</makevar> and
- <makevar>RECURSE</makevar>.</para>]]></programlisting>
-
- <para>Appearance:</para>
-
- <para>Two common targets in a <filename>Makefile</filename> are
- <maketarget>all</maketarget> and
- <maketarget>clean</maketarget>.</para>
-
- <para>Typically, invoking <maketarget>all</maketarget> will rebuild
- the application, and invoking <maketarget>clean</maketarget> will
- remove the temporary files (<filename>.o</filename> for example)
- created by the build process.</para>
-
- <para><maketarget>clean</maketarget> may be controlled by a number
- of variables, including <makevar>CLOBBER</makevar> and
- <makevar>RECURSE</makevar>.</para>
- </example>
- </sect3>
-
- <sect3>
- <title>Literal text</title>
-
- <para>You will often need to include <quote>literal</quote> text in the
- Handbook. This is text that is excerpted from another file, or
- which should be copied from the Handbook into another file
- verbatim.</para>
-
- <para>Some of the time, <sgmltag>programlisting</sgmltag> will be
- sufficient to denote this text. <sgmltag>programlisting</sgmltag>
- is not always appropriate, particularly when you want to include a
- portion of a file <quote>in-line</quote> with the rest of the
- paragraph.</para>
-
- <para>On these occasions, use <sgmltag>literal</sgmltag>.</para>
-
- <example>
- <title><sgmltag>literal</sgmltag></title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<para>The <literal>maxusers 10</literal> line in the kernel
- configuration file determines the size of many system tables, and is
- a rough guide to how many simultaneous logins the system will
- support.</para>]]></programlisting>
-
- <para>Appearance:</para>
-
- <para>The <literal>maxusers 10</literal> line in the kernel
- configuration file determines the size of many system tables, and
- is a rough guide to how many simultaneous logins the system will
- support.</para>
- </example>
- </sect3>
-
- <sect3>
- <title>Showing items that the user <emphasis>must</emphasis> fill
- in</title>
-
- <para>There will often be times when you want to show the user what to
- do, or refer to a file, or command line, or similar, where the user
- cannot simply copy the examples that you provide, but must instead
- include some information themselves.</para>
-
- <para><sgmltag>replaceable</sgmltag> is designed for this eventuality.
- Use it <emphasis>inside</emphasis> other elements to indicate parts
- of that element's content that the user must replace.</para>
-
- <example>
- <title><sgmltag>replaceable</sgmltag></title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<informalexample>
- <screen>&prompt.user; <userinput>man <replaceable>command</replaceable></userinput></screen>
-</informalexample>]]></programlisting>
-
- <para>Appearance:</para>
-
- <informalexample>
- <screen>&prompt.user; <userinput>man <replaceable>command</replaceable></userinput></screen>
- </informalexample>
-
- <para><sgmltag>replaceable</sgmltag> can be used in many different
- elements, including <sgmltag>literal</sgmltag>. This example also
- shows that <sgmltag>replaceable</sgmltag> should only be wrapped
- around the content that the user <emphasis>is</emphasis> meant to
- provide. The other content should be left alone.</para>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<para>The <literal>maxusers <replaceable>n</replaceable></literal>
- line in the kernel configuration file determines the size of many system
- tables, and is a rough guide to how many simultaneous logins the system will
- support.</para>
-
-<para>For a desktop workstation, <literal>32</literal> is a good value
- for <replaceable>n</replaceable>.</para>]]></programlisting>
-
- <para>Appearance:</para>
-
- <para>The <literal>maxusers <replaceable>n</replaceable></literal>
- line in the kernel configuration file determines the size of many
- system tables, and is a rough guide to how many simultaneous
- logins the system will support.</para>
-
- <para>For a desktop workstation, <literal>32</literal> is a good
- value for <replaceable>n</replaceable>.</para>
- </example>
- </sect3>
- </sect2>
-
- <sect2>
- <title>Images</title>
-
- <important>
- <para>Image support in the documentation is currently extremely
- experimental. I think the mechanisms described here are unlikely to
- change, but that's not guaranteed.</para>
-
- <para>You will also need to install the
- <filename>graphics/ImageMagick</filename> port, which is used to
- convert between the different image formats. This is a big port,
- and most of it is not required. However, while we're working on the
- <filename>Makefile</filename>s and other infrastructure it makes
- things easier. This port is <emphasis>not</emphasis> in the
- <filename>textproc/docproj</filename> meta port, you must install it
- by hand.</para>
-
- <para>The best example of what follows in practice is the
- <filename>en_US.ISO8859-1/articles/vm-design/</filename> document.
- If you're unsure of the description that follows, take a look at the
- files in that directory to see how everything hangs togther.
- Experiment with creating different formatted versions of the
- document to see how the image markup appears in the formatted
- output.</para>
- </important>
-
- <sect3>
- <title>Image formats</title>
-
- <para>We currently support two formats for images. The format you
- should use will depend on the nature of your image.</para>
-
- <para>For images that are primarily vector based, such as network
- diagrams, timelines, and similar, use Encapsulated Postscript, and
- make sure that your images have the <filename>.eps</filename>
- extension.</para>
-
- <para>For bitmaps, such as screen captures, use the Portable Network
- Graphic format, and make sure that your images have the
- <filename>.png</filename> extension.</para>
-
- <para>These are the <emphasis>only</emphasis> formats in which images
- should be committed to the CVS repository.</para>
-
- <para>Use the right format for the right image. It is to be expected
- that your documentation will have a mix of EPS and PNG images. The
- <filename>Makefile</filename>s ensure that the correct format image
- is chosen depending on the output format that you use for your
- documentation. <emphasis>Do not commit the same image to the
- repository in two different formats</emphasis>.</para>
-
- <important>
- <para>It is anticipated that the Documentation Project will switch to
- using the Scalable Vector Graphic (SVG) format for vector images.
- However, the current state of SVG capable editing tools makes this
- impractical.</para>
- </important>
- </sect3>
-
- <sect3>
- <title>Markup</title>
-
- <para>The markup for an image is relatively simple. First, markup a
- <sgmltag>mediaobject</sgmltag>. The <sgmltag>mediaobject</sgmltag>
- can contain other, more specific objects. We are concerned with
- two, the <sgmltag>imageobject</sgmltag> and the
- <sgmltag>textobject</sgmltag>.</para>
-
- <para>You should include one <sgmltag>imageobject</sgmltag>, and two
- <sgmltag>textobject</sgmltag> elements. The
- <sgmltag>imageobject</sgmltag> will point to the name of the image
- file that will be used (without the extension). The
- <sgmltag>textobject</sgmltag> elements contain information that will
- be presented to the user as well as, or instead of, the
- image.</para>
-
- <para>There are two circumstances where this can happen.</para>
-
- <itemizedlist>
- <listitem>
- <para>When the reader is viewing the documentation in HTML. In
- this case, each image will need to have associated alternate
- text to show the user, typically whilst the image is loading, or
- if they hover the mouse pointer over the image.</para>
- </listitem>
-
- <listitem>
- <para>When the reader is viewing the documentation in plain text.
- In this case, each image should have an ASCII art equivalent to
- show the user.</para>
- </listitem>
- </itemizedlist>
-
- <para>An example will probably make things easier to understand.
- Suppose you have an image, called <filename>fig1</filename>, that
- you want to include in the document. This image is of a rectangle
- with an A inside it. The markup for this would be as
- follows.</para>
-
- <programlisting>&lt;mediaobject>
- &lt;imageobject>
- &lt;imagedata fileref="fig1"> <co id="co-image-ext">
- &lt;/imageobject>
-
- &lt;textobject>
- &lt;literallayout class="monospaced">+---------------+ <co id="co-image-literal">
-| A |
-+---------------+&lt;/literallayout>
- &lt;/textobject>
-
- &lt;textobject>
- &lt;phrase>A picture&lt;/phrase> <co id="co-image-phrase">
- &lt;/textobject>
-&lt;/mediaobject></programlisting>
-
- <calloutlist>
- <callout arearefs="co-image-ext">
- <para>Include an <sgmltag>imagedata</sgmltag> element inside the
- <sgmltag>imageobject</sgmltag> element. The
- <literal>fileref</literal> attribute should contain the filename
- of the image to include, without the extension. The stylesheets
- will work out which extension should be added to the filename
- automatically.</para>
- </callout>
-
- <callout arearefs="co-image-literal">
- <para>The first <sgmltag>textobject</sgmltag> should contain a
- <sgmltag>literallayout</sgmltag> element, where the
- <literal>class</literal> attribute is set to
- <literal>monospaced</literal>. This is your opportunity to
- demonstrate your ASCII art skills. This content will be used if
- the document is converted to plain text.</para>
-
- <para>Notice how the first and last lines of the content of the
- <sgmltag>literallayout</sgmltag> element butt up next to the
- element's tags. This ensures no extraneous white space is
- included.</para>
- </callout>
-
- <callout arearefs="co-image-phrase">
- <para>The second <sgmltag>textobject</sgmltag> should contain a
- single <sgmltag>phrase</sgmltag> element. The contents of this
- will become the <literal>alt</literal> attribute for the image
- when this document is converted to HTML.</para>
- </callout>
- </calloutlist>
- </sect3>
-
- <sect3>
- <title><filename>Makefile</filename> entries</title>
-
- <para>Your images must be listed in the
- <filename>Makefile</filename> in the <makevar>IMAGES</makevar>
- variable. This variable should contain the name of all your
- <emphasis>source</emphasis> images. For example, if you have
- created three figures, <filename>fig1.eps</filename>,
- <filename>fig2.png</filename>, <filename>fig3.png</filename>, then
- your <filename>Makefile</filename> should have lines like this in
- it.</para>
-
- <programlisting>&hellip;
-IMAGES= fig1.eps fig2.png fig3.png
-&hellip;</programlisting>
-
- <para>or</para>
-
- <programlisting>&hellip;
-IMAGES= fig1.eps
-IMAGES+= fig2.png
-IMAGES+= fig3.png
-&hellip;</programlisting>
-
- <para>Again, the <filename>Makefile</filename> will work out the
- complete list of images it needs to build your source document, you
- only need to list the image files <emphasis>you</emphasis>
- provided.</para>
- </sect3>
-
- <sect3>
- <title>Images and chapters in subdirectories</title>
-
- <para>You must be careful when you separate your documentation in to
- smaller files (see <xref linkend="sgml-primer-include-using-gen-entities">) in
- different directories.</para>
-
- <para>Suppose you have a book with three chapters, and the chapters
- are stored in their own directories, called
- <filename>chapter1/chapter.sgml</filename>,
- <filename>chapter2/chapter.sgml</filename>, and
- <filename>chapter3/chapter.sgml</filename>. If each chapter has
- images associated with it, I suggest you place those images in each
- chapter's subdirectory (<filename>chapter1/</filename>,
- <filename>chapter2/</filename>, and
- <filename>chapter3/</filename>).</para>
-
- <para>However, if you do this you must include the directory names in
- the <makevar>IMAGES</makevar> variable in the
- <filename>Makefile</filename>, <emphasis>and</emphasis> you must
- include the directory name in the <sgmltag>imagedata</sgmltag>
- element in your document.</para>
-
- <para>For example, if you have <filename>chapter1/fig1.png</filename>,
- then <filename>chapter1/chapter.sgml</filename> should
- contain</para>
-
- <programlisting>&lt;mediaobject>
- &lt;imageobject>
- &lt;imagedata fileref="chapter1/fig1"> <co id="co-image-dir">
- &lt;/imageobject>
-
- &hellip;
-
-&lt;/mediaobject></programlisting>
-
- <calloutlist>
- <callout arearefs="co-image-dir">
- <para>The directory name must be included in the
- <literal>fileref</literal> attribute</para>
- </callout>
- </calloutlist>
-
- <para>The <filename>Makefile</filename> must contain</para>
-
- <programlisting>&hellip;
-IMAGES= chapter1/fig1.png
-&hellip;</programlisting>
-
- <para>Then everything should just work.</para>
- </sect3>
- </sect2>
-
- <sect2>
- <title>Links</title>
-
- <note>
- <para>Links are also in-line elements.</para>
- </note>
-
- <sect3>
- <title>Linking to other parts of the same document</title>
-
- <para>Linking within the same document requires you to specify
- where you are linking from (i.e., the text the user will click, or
- otherwise indicate, as the source of the link) and where you are
- linking to (the link's destination).</para>
-
- <para>Each element within DocBook has an attribute called
- <literal>id</literal>. You can place text in this attribute to
- uniquely name the element it is attached to.</para>
-
- <para>This value will be used when you specify the link
- source.</para>
-
- <para>Normally, you will only be linking to chapters or sections, so
- you would add the <literal>id</literal> attribute to these
- elements.</para>
-
- <example>
- <title><literal>id on chapters and sections</literal></title>
-
- <programlisting><![ CDATA [<chapter id="chapter1">
- <title>Introduction</title>
-
- <para>This is the introduction. It contains a subsection,
- which is identified as well.</para>
-
- <sect1 id="chapter1-sect1">
- <title>Sub-sect 1</title>
-
- <para>This is the subsection.</para>
- </sect1>
-</chapter>]]></programlisting>
- </example>
-
- <para>Obviously, you should use more descriptive values. The values
- must be unique within the document (i.e., not just the file, but the
- document the file might be included in as well). Notice how the
- <literal>id</literal> for the subsection is constructed by appending
- text to the <literal>id</literal> of the chapter. This helps to
- ensure that they are unique.</para>
-
- <para>If you want to allow the user to jump into a specific portion of
- the document (possibly in the middle of a paragraph or an example),
- use <sgmltag>anchor</sgmltag>. This element has no content, but
- takes an <literal>id</literal> attribute.</para>
-
- <example>
- <title><sgmltag>anchor</sgmltag></title>
-
- <programlisting><![ CDATA [<para>This paragraph has an embedded
- <anchor id="para1">link target in it. It won't show up in
- the document.</para>]]></programlisting>
- </example>
-
- <para>When you want to provide the user with a link they can activate
- (probably by clicking) to go to a section of the document that has
- an <literal>id</literal> attribute, you can use either
- <sgmltag>xref</sgmltag> or <sgmltag>link</sgmltag>.</para>
-
- <para>Both of these elements have a <literal>linkend</literal>
- attribute. The value of this attribute should be the value that you
- have used in a <literal>id</literal> attribute (it does not matter
- if that value has not yet occurred in your document; this will work
- for forward links as well as backward links).</para>
-
- <para>If you use <sgmltag>xref</sgmltag> then you have no control over
- the text of the link. It will be generated for you.</para>
-
- <example>
- <title>Using <sgmltag>xref</sgmltag></title>
-
- <para>Assume that this fragment appears somewhere in a document that
- includes the <literal>id</literal> example;</para>
-
- <programlisting><![ CDATA [<para>More information can be found
- in <xref linkend="chapter1">.</para>
-
-<para>More specific information can be found
- in <xref linkend="chapter1-sect1">.</para>]]></programlisting>
-
- <para>The text of the link will be generated automatically, and will
- look like (<emphasis>emphasised</emphasis> text indicates the text
- that will be the link);</para>
-
- <blockquote>
- <para>More information can be found in <emphasis>Chapter
- One</emphasis>.</para>
-
- <para>More specific information can be found in <emphasis>the
- section called Sub-sect 1</emphasis>.</para>
- </blockquote>
- </example>
-
- <para>Notice how the text from the link is derived from the section
- title or the chapter number.</para>
-
- <note>
- <para>This means that you <emphasis>cannot</emphasis> use
- <sgmltag>xref</sgmltag> to link to an <literal>id</literal>
- attribute on an <sgmltag>anchor</sgmltag> element. The
- <sgmltag>anchor</sgmltag> has no content, so the
- <sgmltag>xref</sgmltag> cannot generate the text for the
- link.</para>
- </note>
-
- <para>If you want to control the text of the link then use
- <sgmltag>link</sgmltag>. This element wraps content, and the
- content will be used for the link.</para>
-
- <example>
- <title>Using <sgmltag>link</sgmltag></title>
-
- <para>Assume that this fragment appears somewhere in a document that
- includes the <literal>id</literal> example.</para>
-
- <programlisting><![ CDATA [<para>More information can be found in
- <link linkend="chapter1">the first chapter</link>.</para>
-
-<para>More specific information can be found in
- <link linkend="chapter1-sect1">this</link> section.</para>]]></programlisting>
-
- <para>This will generate the following
- (<emphasis>emphasised</emphasis> text indicates the text that will
- be the link);</para>
-
- <blockquote>
- <para>More information can be found in <emphasis>the first
- chapter</emphasis>.</para>
-
- <para>More specific information can be found in
- <emphasis>this</emphasis> section.</para>
- </blockquote>
- </example>
-
- <note>
- <para>That last one is a bad example. Never use words like
- <quote>this</quote> or <quote>here</quote> as the source for the
- link. The reader will need to hunt around the surrounding context
- to see where the link is actually taking them.</para>
- </note>
-
- <note>
- <para>You <emphasis>can</emphasis> use <sgmltag>link</sgmltag> to
- include a link to an <literal>id</literal> on an
- <sgmltag>anchor</sgmltag> element, since the
- <sgmltag>link</sgmltag> content defines the text that will be used
- for the link.</para>
- </note>
- </sect3>
-
- <sect3>
- <title>Linking to documents on the WWW</title>
-
- <para>Linking to external documents is much simpler, as long as you
- know the URL of the document you want to link to. Use
- <sgmltag>ulink</sgmltag>. The <literal>url</literal> attribute is
- the URL of the page that the link points to, and the content of the
- element is the text that will be displayed for the user to
- activate.</para>
-
- <example>
- <title><sgmltag>ulink</sgmltag></title>
-
- <para>Use:</para>
-
- <programlisting><![ CDATA [<para>Of course, you could stop reading this document and
- go to the <ulink url="http://www.FreeBSD.org/">FreeBSD
- home page</ulink> instead.</para>]]></programlisting>
-
- <para>Appearance:</para>
-
- <para>Of course, you could stop reading this document and go to the
- <ulink url="http://www.FreeBSD.org/">FreeBSD home page</ulink>
- instead.</para>
- </example>
- </sect3>
- </sect2>
- </sect1>
-</chapter>
-
-
-<!--
- Local Variables:
- mode: sgml
- sgml-declaration: "../chapter.decl"
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- sgml-parent-document: ("../book.sgml" "part" "chapter")
- End:
--->
-
diff --git a/en_US.ISO8859-1/books/fdp-primer/sgml-primer/chapter.sgml b/en_US.ISO8859-1/books/fdp-primer/sgml-primer/chapter.sgml
deleted file mode 100644
index cdac8cd636..0000000000
--- a/en_US.ISO8859-1/books/fdp-primer/sgml-primer/chapter.sgml
+++ /dev/null
@@ -1,1556 +0,0 @@
-<!-- Copyright (c) 1998, 1999 Nik Clayton, All rights reserved.
-
- Redistribution and use in source (SGML DocBook) and 'compiled' forms
- (SGML, HTML, PDF, PostScript, RTF and so forth) with or without
- modification, are permitted provided that the following conditions
- are met:
-
- 1. Redistributions of source code (SGML DocBook) must retain the above
- copyright notice, this list of conditions and the following
- disclaimer as the first lines of this file unmodified.
-
- 2. Redistributions in compiled form (transformed to other DTDs,
- converted to PDF, PostScript, RTF and other formats) must reproduce
- the above copyright notice, this list of conditions and the
- following disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS DOCUMENTATION IS PROVIDED BY NIK CLAYTON "AS IS" AND ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL NIK CLAYTON BE LIABLE FOR ANY DIRECT,
- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
- $FreeBSD: doc/en_US.ISO8859-1/books/fdp-primer/sgml-primer/chapter.sgml,v 1.20 2001/10/02 05:28:56 murray Exp $
--->
-
-<chapter id="sgml-primer">
- <title>SGML Primer</title>
-
- <para>The majority of FDP documentation is written in applications of
- SGML. This chapter explains exactly what that means, how to read
- and understand the source to the documentation, and the sort of SGML
- tricks you will see used in the documentation.</para>
-
- <para>Portions of this section were inspired by Mark Galassi's <ulink
- url="http://nis-www.lanl.gov/~rosalia/mydocs/docbook-intro/docbook-intro.html">Get Going With DocBook</ulink>.</para>
-
- <sect1>
- <title>Overview</title>
-
- <para>Way back when, electronic text was simple to deal with. Admittedly,
- you had to know which character set your document was written in (ASCII,
- EBCDIC, or one of a number of others) but that was about it. Text was
- text, and what you saw really was what you got. No frills, no
- formatting, no intelligence.</para>
-
- <para>Inevitably, this was not enough. Once you have text in a
- machine-usable format, you expect machines to be able to use it and
- manipulate it intelligently. You would like to indicate that certain
- phrases should be emphasised, or added to a glossary, or be hyperlinks.
- You might want filenames to be shown in a <quote>typewriter</quote> style
- font for viewing on screen, but as <quote>italics</quote> when printed,
- or any of a myriad of other options for presentation.</para>
-
- <para>It was once hoped that Artificial Intelligence (AI) would make this
- easy. Your computer would read in the document and automatically
- identify key phrases, filenames, text that the reader should type in,
- examples, and more. Unfortunately, real life has not happened quite
- like that, and our computers require some assistance before they can
- meaningfully process our text.</para>
-
- <para>More precisely, they need help identifying what is what. You or I
- can look at
-
- <blockquote>
- <para>To remove <filename>/tmp/foo</filename> use &man.rm.1;.</para>
-
- <screen>&prompt.user; <userinput>rm /tmp/foo</userinput></screen>
- </blockquote>
-
- and easily see which parts are filenames, which are commands to be typed
- in, which parts are references to manual pages, and so on. But the
- computer processing the document cannot. For this we need
- markup.</para>
-
- <para><quote>Markup</quote> is commonly used to describe <quote>adding
- value</quote> or <quote>increasing cost</quote>. The term takes on both
- these meanings when applied to text. Markup is additional text included
- in the document, distinguished from the document's content in some way,
- so that programs that process the document can read the markup and use
- it when making decisions about the document. Editors can hide the
- markup from the user, so the user is not distracted by it.</para>
-
- <para>The extra information stored in the markup <emphasis>adds
- value</emphasis> to the document. Adding the markup to the document
- must typically be done by a person&mdash;after all, if computers could
- recognise the text sufficiently well to add the markup then there would
- be no need to add it in the first place. This <emphasis>increases the
- cost</emphasis> (i.e., the effort required) to create the
- document.</para>
-
- <para>The previous example is actually represented in this document like
- this;</para>
-
- <programlisting><![ CDATA [
-<para>To remove <filename>/tmp/foo</filename> use &man.rm.1;.</para>
-
-<screen>&prompt.user; <userinput>rm /tmp/foo</userinput></screen>]]></programlisting>
-
- <para>As you can see, the markup is clearly separate from the
- content.</para>
-
- <para>Obviously, if you are going to use markup you need to define what
- your markup means, and how it should be interpreted. You will need a
- markup language that you can follow when marking up your
- documents.</para>
-
- <para>Of course, one markup language might not be enough. A markup
- language for technical documentation has very different requirements
- than a markup language that was to be used for cookery recipes. This,
- in turn, would be very different from a markup language used to describe
- poetry. What you really need is a first language that you use to write
- these other markup languages. A <emphasis>meta markup
- language</emphasis>.</para>
-
- <para>This is exactly what the Standard Generalised Markup Language (SGML)
- is. Many markup languages have been written in SGML, including the two
- most used by the FDP, HTML and DocBook.</para>
-
- <para>Each language definition is more properly called a Document Type
- Definition (DTD). The DTD specifies the name of the elements that can
- be used, what order they appear in (and whether some markup can be used
- inside other markup) and related information. A DTD is sometimes
- referred to as an <emphasis>application</emphasis> of SGML.</para>
-
- <para id="sgml-primer-validating">A DTD is a <emphasis>complete</emphasis>
- specification of all the elements that are allowed to appear, the order
- in which they should appear, which elements are mandatory, which are
- optional, and so forth. This makes it possible to write an SGML
- <emphasis>parser</emphasis> which reads in both the DTD and a document
- which claims to conform to the DTD. The parser can then confirm whether
- or not all the elements required by the DTD are in the document in the
- right order, and whether there are any errors in the markup. This is
- normally referred to as <quote>validating the document</quote>.</para>
-
- <note>
- <para>This processing simply confirms that the choice of elements, their
- ordering, and so on, conforms to that listed in the DTD. It does
- <emphasis>not</emphasis> check that you have used
- <emphasis>appropriate</emphasis> markup for the content. If you were
- to try and mark up all the filenames in your document as function
- names, the parser would not flag this as an error (assuming, of
- course, that your DTD defines elements for filenames and functions,
- and that they are allowed to appear in the same place).</para>
- </note>
-
- <para>It is likely that most of your contributions to the Documentation
- Project will consist of content marked up in either HTML or DocBook,
- rather than alterations to the DTDs. For this reason this book will
- not touch on how to write a DTD.</para>
- </sect1>
-
- <sect1 id="sgml-primer-elements">
- <title>Elements, tags, and attributes</title>
-
- <para>All the DTDs written in SGML share certain characteristics. This is
- hardly surprising, as the philosophy behind SGML will inevitably show
- through. One of the most obvious manifestations of this philisophy is
- that of <emphasis>content</emphasis> and
- <emphasis>elements</emphasis>.</para>
-
- <para>Your documentation (whether it is a single web page, or a lengthy
- book) is considered to consist of content. This content is then divided
- (and further subdivided) into elements. The purpose of adding markup is
- to name and identify the boundaries of these elements for further
- processing.</para>
-
- <para>For example, consider a typical book. At the very top level, the
- book is itself an element. This <quote>book</quote> element obviously
- contains chapters, which can be considered to be elements in their own
- right. Each chapter will contain more elements, such as paragraphs,
- quotations, and footnotes. Each paragraph might contain further
- elements, identifying content that was direct speech, or the name of a
- character in the story.</para>
-
- <para>You might like to think of this as <quote>chunking</quote> content.
- At the very top level you have one chunk, the book. Look a little
- deeper, and you have more chunks, the individual chapters. These are
- chunked further into paragraphs, footnotes, character names, and so
- on.</para>
-
- <para>Notice how you can make this differentation between different
- elements of the content without resorting to any SGML terms. It really
- is surprisingly straightforward. You could do this with a highlighter
- pen and a printout of the book, using different colours to indicate
- different chunks of content.</para>
-
- <para>Of course, we do not have an electronic highlighter pen, so we need
- some other way of indicating which element each piece of content belongs
- to. In languages written in SGML (HTML, DocBook, et al) this is done by
- means of <emphasis>tags</emphasis>.</para>
-
- <para>A tag is used to identify where a particular element starts, and
- where the element ends. <emphasis>The tag is not part of the element
- itself</emphasis>. Because each DTD was normally written to mark up
- specific types of information, each one will recognise different
- elements, and will therefore have different names for the tags.</para>
-
- <para>For an element called <replaceable>element-name</replaceable> the
- start tag will normally look like
- <literal>&lt;<replaceable>element-name</replaceable>&gt;</literal>. The
- corresponding closing tag for this element is
- <literal>&lt;/<replaceable>element-name</replaceable>&gt;</literal>.</para>
-
- <example>
- <title>Using an element (start and end tags)</title>
-
- <para>HTML has an element for indicating that the content enclosed by
- the element is a paragraph, called <literal>p</literal>. This
- element has both start and end tags.</para>
-
- <programlisting><![ CDATA [<p>This is a paragraph. It starts with the start tag for
- the 'p' element, and it will end with the end tag for the 'p'
- element.</p>
-
-<p>This is another paragraph. But this one is much shorter.</p>]]></programlisting>
- </example>
-
- <para>Not all elements require an end tag. Some elements have no content.
- For example, in HTML you can indicate that you want a horizontal line to
- appear in the document. Obviously, this line has no content, so just
- the start tag is required for this element.</para>
-
- <example>
- <title>Using an element (start tag only)</title>
-
- <para>HTML has an element for indicating a horizontal rule, called
- <literal>hr</literal>. This element does not wrap content, so only
- has a start tag.</para>
-
- <programlisting><![ CDATA [<p>This is a paragraph.</p>
-
-<hr>
-
-<p>This is another paragraph. A horizontal rule separates this
- from the previous paragraph.</p>]]></programlisting>
- </example>
-
- <para>If it is not obvious by now, elements can contain other elements.
- In the book example earlier, the book element contained all the chapter
- elements, which in turn contained all the paragraph elements, and so
- on.</para>
-
- <example>
- <title>Elements within elements; <sgmltag>em</sgmltag></title>
-
- <programlisting><![ CDATA [<p>This is a simple <em>paragraph</em> where some
- of the <em>words</em> have been <em>emphasised</em>.</p>]]></programlisting>
- </example>
-
- <para>The DTD will specify the rules detailing which elements can contain
- other elements, and exactly what they can contain.</para>
-
- <important>
- <para>People often confuse the terms tags and elements, and use the
- terms as if they were interchangeable. They are not.</para>
-
- <para>An element is a conceptual part of your document. An element has
- a defined start and end. The tags mark where the element starts and
- end.</para>
-
- <para>When this document (or anyone else knowledgable about SGML) refers
- to <quote>the &lt;p&gt; tag</quote> they mean the literal text
- consisting of the three characters <literal>&lt;</literal>,
- <literal>p</literal>, and <literal>&gt;</literal>. But the phrase
- <quote>the &lt;p&gt; element</quote> refers to the whole
- element.</para>
-
- <para>This distinction <emphasis>is</emphasis> very subtle. But keep it
- in mind.</para>
- </important>
-
- <para>Elements can have attributes. An attribute has a name and a value,
- and is used for adding extra information to the element. This might be
- information that indicates how the content should be rendered, or might
- be something that uniquely identifies that occurence of the element, or
- it might be something else.</para>
-
- <para>An element's attributes are written <emphasis>inside</emphasis> the
- start tag for that element, and take the form
- <literal><replaceable>attribute-name</replaceable>="<replaceable>attribute-value</replaceable>"</literal>.</para>
-
- <para>In sufficiently recent versions of HTML, the <sgmltag>p</sgmltag>
- element has an attribute called <literal>align</literal>, which suggests
- an alignment (justification) for the paragraph to the program displaying
- the HTML.</para>
-
- <para>The <literal>align</literal> attribute can take one of four defined
- values, <literal>left</literal>, <literal>center</literal>,
- <literal>right</literal> and <literal>justify</literal>. If the
- attribute is not specified then the default is
- <literal>left</literal>.</para>
-
- <example>
- <title>Using an element with an attribute</title>
-
- <programlisting><![ CDATA [<p align="left">The inclusion of the align attribute
- on this paragraph was superfluous, since the default is left.</p>
-
-<p align="center">This may appear in the center.</p>]]></programlisting>
- </example>
-
- <para>Some attributes will only take specific values, such as
- <literal>left</literal> or <literal>justify</literal>. Others will
- allow you to enter anything you want. If you need to include quotes
- (<literal>"</literal>) within an attribute then use single quotes around
- the attribute value.</para>
-
- <example>
- <title>Single quotes around attributes</title>
-
- <programlisting><![ CDATA [<p align='right'>I'm on the right!</p>]]></programlisting>
- </example>
-
- <para>Sometimes you do not need to use quotes around attribute values at
- all. However, the rules for doing this are subtle, and it is far
- simpler just to <emphasis>always</emphasis> quote your attribute
- values.</para>
-
- <sect2>
- <title>For you to do&hellip;</title>
-
- <para>In order to run the examples in this document you will need to
- install some software on your system and ensure that an environment
- variable is set correctly.</para>
-
- <procedure>
- <step>
- <para>Download and install <filename>textproc/docproj</filename>
- from the FreeBSD ports system. This is a
- <emphasis>meta-port</emphasis> that should download and install
- all of the programs and supporting files that are used by the
- Documentation Project.</para>
- </step>
-
- <step>
- <para>Add lines to your shell startup files to set
- <envar>SGML_CATALOG_FILES</envar>.</para>
-
- <example id="sgml-primer-envars">
- <title><filename>.profile</filename>, for &man.sh.1; and
- &man.bash.1; users</title>
-
- <programlisting>SGML_ROOT=/usr/local/share/sgml
-SGML_CATALOG_FILES=${SGML_ROOT}/jade/catalog
-SGML_CATALOG_FILES=${SGML_ROOT}/iso8879/catalog:$SGML_CATALOG_FILES
-SGML_CATALOG_FILES=${SGML_ROOT}/html/catalog:$SGML_CATALOG_FILES
-SGML_CATALOG_FILES=${SGML_ROOT}/docbook/4.1/catalog:$SGML_CATALOG_FILES
-export SGML_CATALOG_FILES</programlisting>
- </example>
-
- <example>
- <title><filename>.login</filename>, for &man.csh.1; and
- &man.tcsh.1; users</title>
-
- <programlisting>setenv SGML_ROOT /usr/local/share/sgml
-setenv SGML_CATALOG_FILES ${SGML_ROOT}/jade/catalog
-setenv SGML_CATALOG_FILES ${SGML_ROOT}/iso8879/catalog:$SGML_CATALOG_FILES
-setenv SGML_CATALOG_FILES ${SGML_ROOT}/html/catalog:$SGML_CATALOG_FILES
-setenv SGML_CATALOG_FILES ${SGML_ROOT}/docbook/4.1/catalog:$SGML_CATALOG_FILES</programlisting>
- </example>
-
- <para>Then either log out, and log back in again, or run those
- commands from the command line to set the variable values.</para>
- </step>
- </procedure>
-
- <procedure>
- <step>
- <para>Create <filename>example.sgml</filename>, and enter the
- following text;</para>
-
- <programlisting><![ CDATA [<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-
-<html>
- <head>
- <title>An example HTML file</title>
- </head>
-
- <body>
- <p>This is a paragraph containing some text.</p>
-
- <p>This paragraph contains some more text.</p>
-
- <p align="right">This paragraph might be right-justified.</p>
- </body>
-</html>]]></programlisting>
- </step>
-
- <step>
- <para>Try and validate this file using an SGML parser.</para>
-
- <para>Part of <filename>textproc/docproj</filename> is the
- &man.nsgmls.1; <link linkend="sgml-primer-validating">validating
- parser</link>. Normally, &man.nsgmls.1; reads in a document
- marked up according to an SGML DTD and returns a copy of the
- document's Element Structure Information Set (ESIS, but that is
- not important right now).</para>
-
- <para>However, when &man.nsgmls.1; is given the <option>-s</option>
- parameter, &man.nsgmls.1; will suppress its normal output, and
- just print error messages. This makes it a useful way to check to
- see if your document is valid or not.</para>
-
- <para>Use &man.nsgmls.1; to check that your document is
- valid;</para>
-
- <screen>&prompt.user; <userinput>nsgmls -s example.sgml</userinput></screen>
-
- <para>As you will see, &man.nsgmls.1; returns without displaying any
- output. This means that your document validated
- successfully.</para>
- </step>
-
- <step>
- <para>See what happens when required elements are omitted. Try
- removing the <sgmltag>title</sgmltag> and
- <sgmltag>/title</sgmltag> tags, and re-run the validation.</para>
-
- <screen>&prompt.user; <userinput>nsgmls -s example.sgml</userinput>
-nsgmls:example.sgml:5:4:E: character data is not allowed here
-nsgmls:example.sgml:6:8:E: end tag for "HEAD" which is not finished</screen>
-
- <para>The error output from &man.nsgmls.1; is organised into
- colon-separated groups, or columns.</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <thead>
- <row>
- <entry>Column</entry>
- <entry>Meaning</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>1</entry>
- <entry>The name of the program generating the error. This
- will always be <literal>nsgmls</literal>.</entry>
- </row>
-
- <row>
- <entry>2</entry>
- <entry>The name of the file that contains the error.</entry>
- </row>
-
- <row>
- <entry>3</entry>
- <entry>Line number where the error appears.</entry>
- </row>
-
- <row>
- <entry>4</entry>
- <entry>Column number where the error appears.</entry>
- </row>
-
- <row>
- <entry>5</entry>
- <entry>A one letter code indicating the nature of the
- message. <literal>I</literal> indicates an informational
- message, <literal>W</literal> is for warnings, and
- <literal>E</literal> is for errors<footnote>
- <para>It is not always the fifth column either.
- <command>nsgmls -sv</command> displays
- <literal>nsgmls:I: SP version "1.3"</literal>
- (depending on the installed version). As you can see,
- this is an informational message.</para>
- </footnote>, and <literal>X</literal> is for
- cross-references. As you can see, these messages are
- errors.</entry>
- </row>
-
- <row>
- <entry>6</entry>
- <entry>The text of the error message.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <para>Simply omitting the <sgmltag>title</sgmltag> tags has
- generated 2 different errors.</para>
-
- <para>The first error indicates that content (in this case,
- characters, rather than the start tag for an element) has occured
- where the SGML parser was expecting something else. In this case,
- the parser was expecting to see one of the start tags for elements
- that are valid inside <sgmltag>head</sgmltag> (such as
- <sgmltag>title</sgmltag>).</para>
-
- <para>The second error is because <sgmltag>head</sgmltag> elements
- <emphasis>must</emphasis> contain a <sgmltag>title</sgmltag>
- element. Because it does not &man.nsgmls.1; considers that the
- element has not been properly finished. However, the closing tag
- indicates that the element has been closed before it has been
- finished.</para>
- </step>
-
- <step>
- <para>Put the <literal>title</literal> element back in.</para>
- </step>
- </procedure>
- </sect2>
- </sect1>
-
- <sect1 id="sgml-primer-doctype-declaration">
- <title>The DOCTYPE declaration</title>
-
- <para>The beginning of each document that you write must specify the name
- of the DTD that the document conforms to. This is so that SGML parsers
- can determine the DTD and ensure that the document does conform to
- it.</para>
-
- <para>This information is generally expressed on one line, in the DOCTYPE
- declaration.</para>
-
- <para>A typical declaration for a document written to conform with version
- 4.0 of the HTML DTD looks like this;</para>
-
- <programlisting><![ CDATA [<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN">]]></programlisting>
-
- <para>That line contains a number of different components.</para>
-
- <variablelist>
- <varlistentry>
- <term><literal>&lt;!</literal></term>
-
- <listitem>
- <para>Is the <emphasis>indicator</emphasis> that indicates that this
- is an SGML declaration. This line is declaring the document type.
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><literal>DOCTYPE</literal></term>
-
- <listitem>
- <para>Shows that this is an SGML declaration for the document
- type.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><literal>html</literal></term>
-
- <listitem>
- <para>Names the first <link linkend="sgml-primer-elements">element</link> that
- will appear in the document.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><literal>PUBLIC "-//W3C//DTD HTML 4.0//EN"</literal></term>
-
- <listitem>
- <para>Lists the Formal Public Identifier (FPI)<indexterm>
- <primary>Formal Public Identifier</primary>
- </indexterm>
- for the DTD that this
- document conforms to. Your SGML parser will use this to find the
- correct DTD when processing this document.</para>
-
- <para><literal>PUBLIC</literal> is not a part of the FPI, but
- indicates to the SGML processor how to find the DTD referenced in
- the FPI. Other ways of telling the SGML parser how to find the
- DTD are shown <link
- linkend="sgml-primer-fpi-alternatives">later</link>.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><literal>&gt;</literal></term>
-
- <listitem>
- <para>Returns to the document.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <sect2>
- <title>Formal Public Identifiers (FPIs)<indexterm significance="preferred">
- <primary>Formal Public Identifier</primary>
- </indexterm>
-</title>
-
- <note>
- <para>You don't need to know this, but it's useful background, and
- might help you debug problems when your SGML processor can't locate
- the DTD you are using.</para>
- </note>
-
- <para>FPIs must follow a specific syntax. This syntax is as
- follows;</para>
-
- <programlisting>"<replaceable>Owner</replaceable>//<replaceable>Keyword</replaceable> <replaceable>Description</replaceable>//<replaceable>Language</replaceable>"</programlisting>
-
- <variablelist>
- <varlistentry>
- <term><replaceable>Owner</replaceable></term>
-
- <listitem>
- <para>This indicates the owner of the FPI.</para>
-
- <para>If this string starts with <quote>ISO</quote> then this is an
- ISO owned FPI. For example, the FPI <literal>"ISO
- 8879:1986//ENTITIES Greek Symbols//EN"</literal> lists
- <literal>ISO 8879:1986</literal> as being the owner for the set
- of entities for greek symbols. ISO 8879:1986 is the ISO number
- for the SGML standard.</para>
-
- <para>Otherwise, this string will either look like
- <literal>-//<replaceable>Owner</replaceable></literal> or
- <literal>+//<replaceable>Owner</replaceable></literal> (notice
- the only difference is the leading <literal>+</literal> or
- <literal>-</literal>).</para>
-
- <para>If the string starts with <literal>-</literal> then the
- owner information is unregistered, with a <literal>+</literal>
- it identifies it as being registered.</para>
-
- <para>ISO 9070:1991 defines how registered names are generated; it
- might be derived from the number of an ISO publication, an ISBN
- code, or an organisation code assigned according to ISO 6523.
- In addition, a registration authority could be created in order
- to assign registered names. The ISO council delegated this to
- the American National Standards Institute (ANSI).</para>
-
- <para>Because the FreeBSD Project hasn't been registered the
- owner string is <literal>-//FreeBSD</literal>. And as you can
- see, the W3C are not a registered owner either.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><replaceable>Keyword</replaceable></term>
-
- <listitem>
- <para>There are several keywords that indicate the type of
- information in the file. Some of the most common keywords are
- <literal>DTD</literal>, <literal>ELEMENT</literal>,
- <literal>ENTITIES</literal>, and <literal>TEXT</literal>.
- <literal>DTD</literal> is used only for DTD files,
- <literal>ELEMENT</literal> is usually used for DTD fragments
- that contain only entity or element declarations.
- <literal>TEXT</literal> is used for SGML content (text and
- tags).</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><replaceable>Description</replaceable></term>
-
- <listitem>
- <para>Any description you want to supply for the contents of this
- file. This may include version numbers or any short text that
- is meaningful to you and unique for the SGML system.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><replaceable>Language</replaceable></term>
-
- <listitem>
- <para>This is an ISO two-character code that identifies the native
- language for the file. <literal>EN</literal> is used for
- English.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <sect3>
- <title><filename>catalog</filename> files</title>
-
- <para>If you use the syntax above and try and process this document
- using an SGML processor, the processor will need to have some way of
- turning the FPI into the name of the file on your computer that
- contains the DTD.</para>
-
- <para>In order to do this it can use a catalog file. A catalog file
- (typically called <filename>catalog</filename>) contains lines that
- map FPIs to filenames. For example, if the catalog file contained
- the line;</para>
-
- <programlisting>PUBLIC "-//W3C//DTD HTML 4.0//EN" "4.0/strict.dtd"</programlisting>
-
- <para>The SGML processor would know to look up the DTD from
- <filename>strict.dtd</filename> in the <filename>4.0</filename>
- subdirectory of whichever directory held the
- <filename>catalog</filename> file that contained that line.</para>
-
- <para>Look at the contents of
- <filename>/usr/local/share/sgml/html/catalog</filename>. This is
- the catalog file for the HTML DTDs that will have been installed as
- part of the <filename>textproc/docproj</filename> port.</para>
- </sect3>
-
- <sect3>
- <title><envar>SGML_CATALOG_FILES</envar></title>
-
- <para>In order to locate a <filename>catalog</filename> file, your
- SGML processor will need to know where to look. Many of them
- feature command line parameters for specifying the path to one or
- more catalogs.</para>
-
- <para>In addition, you can set <envar>SGML_CATALOG_FILES</envar> to
- point to the files. This environment variable should consist of a
- colon-separated list of catalog files (including their full
- path).</para>
-
- <para>Typically, you will want to include the following files;</para>
-
- <itemizedlist>
- <listitem>
- <para><filename>/usr/local/share/sgml/docbook/4.1/catalog</filename></para>
- </listitem>
-
- <listitem>
- <para><filename>/usr/local/share/sgml/html/catalog</filename></para>
- </listitem>
-
- <listitem>
- <para><filename>/usr/local/share/sgml/iso8879/catalog</filename></para>
- </listitem>
-
- <listitem>
- <para><filename>/usr/local/share/sgml/jade/catalog</filename></para>
- </listitem>
- </itemizedlist>
-
- <para>You should <link linkend="sgml-primer-envars">already have done
- this</link>.</para>
- </sect3>
- </sect2>
-
- <sect2 id="sgml-primer-fpi-alternatives">
- <title>Alternatives to FPIs</title>
-
- <para>Instead of using an FPI to indicate the DTD that the document
- conforms to (and therefore, which file on the system contains the DTD)
- you can explicitly specify the name of the file.</para>
-
- <para>The syntax for this is slightly different:</para>
-
- <programlisting><![ CDATA [<!DOCTYPE html SYSTEM "/path/to/file.dtd">]]></programlisting>
-
- <para>The <literal>SYSTEM</literal> keyword indicates that the SGML
- processor should locate the DTD in a system specific fashion. This
- typically (but not always) means the DTD will be provided as a
- filename.</para>
-
- <para>Using FPIs is preferred for reasons of portability. You don't
- want to have to ship a copy of the DTD around with your document, and
- if you used the <literal>SYSTEM</literal> identifier then everyone
- would need to keep their DTDs in the same place.</para>
- </sect2>
- </sect1>
-
- <sect1 id="sgml-primer-sgml-escape">
- <title>Escaping back to SGML</title>
-
- <para>Earlier in this primer I said that SGML is only used when writing a
- DTD. This is not strictly true. There is certain SGML syntax that you
- will want to be able to use within your documents. For example,
- comments can be included in your document, and will be ignored by the
- parser. Comments are entered using SGML syntax. Other uses for SGML
- syntax in your document will be shown later too.</para>
-
- <para>Obviously, you need some way of indicating to the SGML processor
- that the following content is not elements within the document, but is
- SGML that the parser should act upon.</para>
-
- <para>These sections are marked by <literal>&lt;! ... &gt;</literal> in
- your document. Everything between these delimiters is SGML syntax as
- you might find within a DTD.</para>
-
- <para>As you may just have realised, the <link
- linkend="sgml-primer-doctype-declaration">DOCTYPE declaration</link>
- is an example of SGML syntax that you need to include in your
- document&hellip;</para>
- </sect1>
-
- <sect1>
- <title>Comments</title>
-
- <para>Comments are an SGML construction, and are normally only valid
- inside a DTD. However, as <xref linkend="sgml-primer-sgml-escape">
- shows, it is possible to use SGML syntax within your document.</para>
-
- <para>The delimiter for SGML comments is the string
- <quote><literal>--</literal></quote>. The first occurence of this string
- opens a comment, and the second closes it.</para>
-
- <example>
- <title>SGML generic comment</title>
-
- <programlisting>&lt;!-- test comment --></programlisting>
-
- <programlisting><![ CDATA [
-<!-- This is inside the comment -->
-
-<!-- This is another comment -->
-
-<!-- This is one way
- of doing multiline comments -->
-
-<!-- This is another way of --
- -- doing multiline comments -->]]></programlisting>
- </example>
-
- <![ %output.print; [
- <important>
- <title>Use 2 dashes</title>
-
- <para>There is a problem with producing the Postscript and PDF versions
- of this document. The above example probably shows just one hyphen
- symbol, <literal>-</literal> after the <literal>&lt;!</literal> and
- before the <literal>&gt;</literal>.</para>
-
- <para>You <emphasis>must</emphasis> use two <literal>-</literal>,
- <emphasis>not</emphasis> one. The Postscript and PDF versions have
- translated the two <literal>-</literal> in the original to a longer,
- more professional <emphasis>em-dash</emphasis>, and broken this
- example in the process.</para>
-
- <para>The HTML, plain text, and RTF versions of this document are not
- affected.</para>
- </important>
- ]]>
-
- <para>If you have used HTML before you may have been shown different rules
- for comments. In particular, you may think that the string
- <literal>&lt!--</literal> opens a comment, and it is only closed by
- <literal>--&gt;</literal>.</para>
-
- <para>This is <emphasis>not</emphasis> the case. A lot of web browsers
- have broken HTML parsers, and will accept that as valid. However, the
- SGML parsers used by the Documentation Project are much stricter, and
- will reject documents that make that error.</para>
-
- <example>
- <title>Errorneous SGML comments</title>
-
- <programlisting><![ CDATA [
-<!-- This is in the comment --
-
- THIS IS OUTSIDE THE COMMENT!
-
- -- back inside the comment -->]]></programlisting>
-
- <para>The SGML parser will treat this as though it were actually;</para>
-
- <programlisting>&lt;!THIS IS OUTSIDE THE COMMENT&gt;</programlisting>
-
- <para>This is not valid SGML, and may give confusing error
- messages.</para>
-
- <programlisting><![ CDATA [<!--------------- This is a very bad idea --------------->]]></programlisting>
-
- <para>As the example suggests, <emphasis>do not</emphasis> write
- comments like that.</para>
-
- <programlisting><![ CDATA [<!--===================================================-->]]></programlisting>
-
- <para>That is a (slightly) better approach, but it still potentially
- confusing to people new to SGML.</para>
- </example>
-
- <sect2>
- <title>For you to do&hellip;</title>
-
- <procedure>
- <step>
- <para>Add some comments to <filename>example.sgml</filename>, and
- check that the file still validates using &man.nsgmls.1;</para>
- </step>
-
- <step>
- <para>Add some invalid comments to
- <filename>example.sgml</filename>, and see the error messages that
- &man.nsgmls.1; gives when it encounters an invalid comment.</para>
- </step>
- </procedure>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Entities</title>
-
- <para>Entities are a mechanism for assigning names to chunks of content.
- As an SGML parser processes your document, any entities it finds are
- replaced by the content of the entity.</para>
-
- <para>This is a good way to have re-usable, easily changeable chunks of
- content in your SGML documents. It is also the only way to include one
- marked up file inside another using SGML.</para>
-
- <para>There are two types of entities which can be used in two different
- situations; <emphasis>general entities</emphasis> and
- <emphasis>parameter entities</emphasis>.</para>
-
- <sect2 id="sgml-primer-general-entities">
- <title>General Entities</title>
-
- <para>You cannot use general entities in an SGML context (although you
- define them in one). They can only be used in your document.
- Contrast this with <link
- linkend="sgml-primer-parameter-entities">parameter
- entities</link>.</para>
-
- <para>Each general entity has a name. When you want to reference a
- general entity (and therefore include whatever text it represents in
- your document), you write
- <literal>&amp;<replaceable>entity-name</replaceable>;</literal>. For
- example, suppose you had an entity called
- <literal>current.version</literal> which expanded to the current
- version number of your product. You could write;</para>
-
- <programlisting><![ CDATA [<para>The current version of our product is
- &current.version;.</para>]]></programlisting>
-
- <para>When the version number changes you can simply change the
- definition of the value of the general entity and reprocess your
- document.</para>
-
- <para>You can also use general entities to enter characters that you
- could not otherwise include in an SGML document. For example, &lt;
- and &amp; cannot normally appear in an SGML document. When the SGML
- parser sees the &lt; symbol it assumes that a tag (either a start tag
- or an end tag) is about to appear, and when it sees the &amp; symbol
- it assumes the next text will be the name of an entity.</para>
-
- <para>Fortunately, you can use the two general entities &amp;lt; and
- &amp;amp; whenever you need to include one or other of these </para>
-
- <para>A general entity can only be defined within an SGML context.
- Typically, this is done immediately after the DOCTYPE
- declaration.</para>
-
- <example>
- <title>Defining general entities</title>
-
- <programlisting><![ CDATA [<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
-<!ENTITY current.version "3.0-RELEASE">
-<!ENTITY last.version "2.2.7-RELEASE">
-]>]]></programlisting>
-
- <para>Notice how the DOCTYPE declaration has been extended by adding a
- square bracket at the end of the first line. The two entities are
- then defined over the next two lines, before the square bracket is
- closed, and then the DOCTYPE declaration is closed.</para>
-
- <para>The square brackets are necessary to indicate that we are
- extending the DTD indicated by the DOCTYPE declaration.</para>
- </example>
- </sect2>
-
- <sect2 id="sgml-primer-parameter-entities">
- <title>Parameter entities</title>
-
- <para>Like <link linkend="sgml-primer-general-entities">general
- entities</link>, parameter entities are used to assign names to
- reusable chunks of text. However, where as general entities can only
- be used within your document, parameter entities can only be used
- within an <link linkend="sgml-primer-sgml-escape">SGML
- context</link>.</para>
-
- <para>Parameter entities are defined in a similar way to general
- entities. However, instead of using
- <literal>&amp;<replaceable>entity-name</replaceable>;</literal> to
- refer to them, use
- <literal>%<replaceable>entity-name</replaceable>;</literal><footnote>
- <para><emphasis>P</emphasis>arameter entities use the
- <emphasis>P</emphasis>ercent symbol.</para>
- </footnote>. The definition also includes the <literal>%</literal>
- between the <literal>ENTITY</literal> keyword and the name of the
- entity.</para>
-
- <example>
- <title>Defining parameter entities</title>
-
- <programlisting><![ CDATA [<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
-<!ENTITY % param.some "some">
-<!ENTITY % param.text "text">
-<!ENTITY % param.new "%param.some more %param.text">
-
-<!-- %param.new now contains "some more text" -->
-]>]]></programlisting>
- </example>
-
- <para>This may not seem particularly useful. It will be.</para>
- </sect2>
-
- <sect2>
- <title>For you to do&hellip;</title>
-
- <procedure>
- <step>
- <para>Add a general entity to
- <filename>example.sgml</filename>.</para>
-
- <programlisting><![ CDATA [<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" [
-<!ENTITY version "1.1">
-]>
-
-<html>
- <head>
- <title>An example HTML file</title>
- </head>
-
- <!-- You might well have some comments in here as well -->
-
- <body>
- <p>This is a paragraph containing some text.</p>
-
- <p>This paragraph contains some more text.</p>
-
- <p align="right">This paragraph might be right-justified.</p>
-
- <p>The current version of this document is: &version;</p>
- </body>
-</html>]]></programlisting>
- </step>
-
- <step>
- <para>Validate the document using &man.nsgmls.1;</para>
- </step>
-
- <step>
- <para>Load <filename>example.sgml</filename> into your web browser
- (you may need to copy it to <filename>example.html</filename>
- before your browser recognises it as an HTML document).</para>
-
- <para>Unless your browser is very advanced, you won't see the entity
- reference <literal>&amp;version;</literal> replaced with the
- version number. Most web browsers have very simplistic parsers
- which do not handle proper SGML<footnote>
- <para>This is a shame. Imagine all the problems and hacks (such
- as Server Side Includes) that could be avoided if they
- did.</para>
- </footnote>.</para>
- </step>
-
- <step>
- <para>The solution is to <emphasis>normalise</emphasis> your
- document using an SGML normaliser. The normaliser reads in valid
- SGML and outputs equally valid SGML which has been transformed in
- some way. One of the ways in which the normaliser transforms the
- SGML is to expand all the entity references in the document,
- replacing the entities with the text that they represent.</para>
-
- <para>You can use &man.sgmlnorm.1; to do this.</para>
-
- <screen>&prompt.user; <userinput>sgmlnorm example.sgml > example.html</userinput></screen>
-
- <para>You should find a normalised (i.e., entity references
- expanded) copy of your document in
- <filename>example.html</filename>, ready to load into your web
- browser.</para>
- </step>
-
- <step>
- <para>If you look at the output from &man.sgmlnorm.1; you will see
- that it does not include a DOCTYPE declaration at the start. To
- include this you need to use the <option>-d</option>
- option;</para>
-
- <screen>&prompt.user; <userinput>sgmlnorm -d example.sgml > example.html</userinput></screen>
- </step>
- </procedure>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Using entities to include files</title>
-
- <para>Entities (both <link
- linkend="sgml-primer-general-entities">general</link> and <link
- linkend="sgml-primer-parameter-entities">parameter</link>) are
- particularly useful when used to include one file inside another.</para>
-
- <sect2 id="sgml-primer-include-using-gen-entities">
- <title>Using general entities to include files</title>
-
- <para>Suppose you have some content for an SGML book organised into
- files, one file per chapter, called
- <filename>chapter1.sgml</filename>,
- <filename>chapter2.sgml</filename>, and so forth, with a
- <filename>book.sgml</filename> file that will contain these
- chapters.</para>
-
- <para>In order to use the contents of these files as the values for your
- entities, you declare them with the <literal>SYSTEM</literal> keyword.
- This directs the SGML parser to use the contents of the named file as
- the value of the entity.</para>
-
- <example>
- <title>Using general entities to include files</title>
-
- <programlisting><![ CDATA [<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
-<!ENTITY chapter.1 SYSTEM "chapter1.sgml">
-<!ENTITY chapter.2 SYSTEM "chapter2.sgml">
-<!ENTITY chapter.3 SYSTEM "chapter3.sgml">
-<!-- And so forth -->
-]>
-
-<html>
- <!-- Use the entities to load in the chapters -->
-
- &chapter.1;
- &chapter.2;
- &chapter.3;
-</html>]]></programlisting>
- </example>
-
- <warning>
- <para>When using general entities to include other files within a
- document, the files being included
- (<filename>chapter1.sgml</filename>,
- <filename>chapter2.sgml</filename>, and so on) <emphasis>must
- not</emphasis> start with a DOCTYPE declaration. This is a syntax
- error.</para>
- </warning>
- </sect2>
-
- <sect2>
- <title>Using parameter entities to include files</title>
-
- <para>Recall that parameter entities can only be used inside an SGML
- context. Why then would you want to include a file within an SGML
- context?</para>
-
- <para>You can use this to ensure that you can reuse your general
- entities.</para>
-
- <para>Suppose that you had many chapters in your document, and you
- reused these chapters in two different books, each book organising the
- chapters in a different fashion.</para>
-
- <para>You could list the entities at the top of each book, but this
- quickly becomes cumbersome to manage.</para>
-
- <para>Instead, place the general entity definitions inside one file,
- and use a parameter entity to include that file within your
- document.</para>
-
- <example>
- <title>Using parameter entities to include files</title>
-
- <para>First, place your entity definitions in a separate file, called
- <filename>chapters.ent</filename>. This file contains the
- following;</para>
-
- <programlisting><![ CDATA [<!ENTITY chapter.1 SYSTEM "chapter1.sgml">
-<!ENTITY chapter.2 SYSTEM "chapter2.sgml">
-<!ENTITY chapter.3 SYSTEM "chapter3.sgml">]]></programlisting>
-
- <para>Now create a parameter entity to refer to the contents of the
- file. Then use the parameter entity to load the file into the
- document, which will then make all the general entities available
- for use. Then use the general entities as before;</para>
-
- <programlisting><![ CDATA [<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
-<!-- Define a parameter entity to load in the chapter general entities -->
-<!ENTITY % chapters SYSTEM "chapters.ent">
-
-<!-- Now use the parameter entity to load in this file -->
-%chapters;
-]>
-
-<html>
- &chapter.1;
- &chapter.2;
- &chapter.3;
-</html>]]></programlisting>
- </example>
- </sect2>
-
- <sect2>
- <title>For you to do&hellip;</title>
-
- <sect3>
- <title>Use general entities to include files</title>
-
- <procedure>
- <step>
- <para>Create three files, <filename>para1.sgml</filename>,
- <filename>para2.sgml</filename>, and
- <filename>para3.sgml</filename>.</para>
-
- <para>Put content similar to the following in each file;</para>
-
- <programlisting><![ CDATA [<p>This is the first paragraph.</p>]]></programlisting>
- </step>
-
- <step>
- <para>Edit <filename>example.sgml</filename> so that it looks like
- this;</para>
-
- <programlisting><![ CDATA [<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
-<!ENTITY version "1.1">
-<!ENTITY para1 SYSTEM "para1.sgml">
-<!ENTITY para2 SYSTEM "para2.sgml">
-<!ENTITY para3 SYSTEM "para3.sgml">
-]>
-
-<html>
- <head>
- <title>An example HTML file</title>
- </head>
-
- <body>
- <p>The current version of this document is: &version;</p>
-
- &para1;
- &para2;
- &para3;
- </body>
-</html>]]></programlisting>
- </step>
-
- <step>
- <para>Produce <filename>example.html</filename> by normalising
- <filename>example.sgml</filename>.</para>
-
- <screen>&prompt.user; <userinput>sgmlnorm -d example.sgml > example.html</userinput></screen>
- </step>
-
- <step>
- <para>Load <filename>example.html</filename> in to your web
- browser, and confirm that the
- <filename>para<replaceable>n</replaceable>.sgml</filename> files
- have been included in <filename>example.html</filename>.</para>
- </step>
- </procedure>
- </sect3>
-
- <sect3>
- <title>Use parameter entities to include files</title>
-
- <note>
- <para>You must have taken the previous steps first.</para>
- </note>
-
- <procedure>
- <step>
- <para>Edit <filename>example.sgml</filename> so that it looks like
- this;</para>
-
- <programlisting><![ CDATA [<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
-<!ENTITY % entities SYSTEM "entities.sgml"> %entities;
-]>
-
-<html>
- <head>
- <title>An example HTML file</title>
- </head>
-
- <body>
- <p>The current version of this document is: &version;</p>
-
- &para1;
- &para2;
- &para3;
- </body>
-</html>]]></programlisting>
- </step>
-
- <step>
- <para>Create a new file, <filename>entities.sgml</filename>, with
- this content:</para>
-
- <programlisting><![ CDATA [<!ENTITY version "1.1">
-<!ENTITY para1 SYSTEM "para1.sgml">
-<!ENTITY para2 SYSTEM "para2.sgml">
-<!ENTITY para3 SYSTEM "para3.sgml">]]></programlisting>
- </step>
-
- <step>
- <para>Produce <filename>example.html</filename> by normalising
- <filename>example.sgml</filename>.</para>
-
- <screen>&prompt.user; <userinput>sgmlnorm -d example.sgml > example.html</userinput></screen>
- </step>
-
- <step>
- <para>Load <filename>example.html</filename> in to your web
- browser, and confirm that the
- <filename>para<replaceable>n</replaceable>.sgml</filename> files
- have been included in <filename>example.html</filename>.</para>
- </step>
- </procedure>
- </sect3>
- </sect2>
- </sect1>
-
- <sect1 id="sgml-primer-marked-sections">
- <title>Marked sections</title>
-
- <para>SGML provides a mechanism to indicate that particular pieces of the
- document should be processed in a special way. These are termed
- <quote>marked sections</quote>.</para>
-
- <example>
- <title>Structure of a marked section</title>
-
- <programlisting>&lt;![ <replaceable>KEYWORD</replaceable> [
- Contents of marked section
-]]&gt;</programlisting>
- </example>
-
- <para>As you would expect, being an SGML construct, a marked section
- starts with <literal>&lt!</literal>.</para>
-
- <para>The first square bracket begins to delimit the marked
- section.</para>
-
- <para><replaceable>KEYWORD</replaceable> describes how this marked
- section should be processed by the parser.</para>
-
- <para>The second square bracket indicates that the content of the marked
- section starts here.</para>
-
- <para>The marked section is finished by closing the two square brackets,
- and then returning to the document context from the SGML context with
- <literal>&gt;</literal></para>
-
- <sect2>
- <title>Marked section keywords</title>
-
- <sect3>
- <title><literal>CDATA</literal>, <literal>RCDATA</literal></title>
-
- <para>These keywords denote the marked sections <emphasis>content
- model</emphasis>, and allow you to change it from the
- default.</para>
-
- <para>When an SGML parser is processing a document it keeps track
- of what is called the <quote>content model</quote>.</para>
-
- <para>Briefly, the content model describes what sort of content the
- parser is expecting to see, and what it will do with it when it
- finds it.</para>
-
- <para>The two content models you will probably find most useful are
- <literal>CDATA</literal> and <literal>RCDATA</literal>.</para>
-
- <para><literal>CDATA</literal> is for <quote>Character Data</quote>.
- If the parser is in this content model then it is expecting to see
- characters, and characters only. In this model the &lt; and &amp;
- symbols lose their special status, and will be treated as ordinary
- characters.</para>
-
- <para><literal>RCDATA</literal> is for <quote>Entity references and
- character data</quote> If the parser is in this content model then it
- is expecting to see characters <emphasis>and</emphasis> entities.
- &lt; loses its special status, but &amp; will still be treated as
- starting the beginning of a general entity.</para>
-
- <para>This is particularly useful if you are including some verbatim
- text that contains lots of &lt; and &amp; characters. While you
- could go through the text ensuring that every &lt; is converted to a
- &amp;lt; and every &amp; is converted to a &amp;amp;, it can be
- easier to mark the section as only containing CDATA. When the SGML
- parser encounters this it will ignore the &lt; and &amp; symbols
- embedded in the content.</para>
-
- <!-- The nesting of CDATA within the next example is disgusting -->
-
- <example>
- <title>Using a CDATA marked section</title>
-
- <programlisting>&lt;para>Here is an example of how you would include some text
- that contained many &amp;lt; and &amp;amp; symbols. The sample
- text is a fragment of HTML. The surrounding text (&lt;para> and
- &lt;programlisting>) are from DocBook.&lt;/para>
-
-&lt;programlisting>
- &lt![ CDATA [ <![ CDATA [
- <p>This is a sample that shows you some of the elements within
- HTML. Since the angle brackets are used so many times, it's
- simpler to say the whole example is a CDATA marked section
- than to use the entity names for the left and right angle
- brackets throughout.</p>
-
- <ul>
- <li>This is a listitem</li>
- <li>This is a second listitem</li>
- <li>This is a third listitem</li>
- </ul>
-
- <p>This is the end of the example.</p>]]>
- ]]&gt;
-&lt/programlisting></programlisting>
-
- <para>If you look at the source for this document you will see this
- technique used throughout.</para>
- </example>
- </sect3>
-
- <sect3>
- <title><literal>INCLUDE</literal> and
- <literal>IGNORE</literal></title>
-
- <para>If the keyword is <literal>INCLUDE</literal> then the contents
- of the marked section will be processed. If the keyword is
- <literal>IGNORE</literal> then the marked section is ignored and
- will not be processed. It will not appear in the output.</para>
-
- <example>
- <title>Using <literal>INCLUDE</literal> and
- <literal>IGNORE</literal> in marked sections</title>
-
- <programlisting>&lt;![ INCLUDE [
- This text will be processed and included.
-]]&gt;
-
-&lt;![ IGNORE [
- This text will not be processed or included.
-]]&gt;</programlisting>
- </example>
-
- <para>By itself, this isn't too useful. If you wanted to remove text
- from your document you could cut it out, or wrap it in
- comments.</para>
-
- <para>It becomes more useful when you realise you can use <link
- linkend="sgml-primer-parameter-entities">parameter entities</link>
- to control this. Remember that parameter entities can only be used
- in SGML contexts, and the keyword of a marked section
- <emphasis>is</emphasis> an SGML context.</para>
-
- <para>For example, suppose that you produced a hard-copy version of
- some documentation and an electronic version. In the electronic
- version you wanted to include some extra content that wasn't to
- appear in the hard-copy.</para>
-
- <para>Create a parameter entity, and set it's value to
- <literal>INCLUDE</literal>. Write your document, using marked
- sections to delimit content that should only appear in the
- electronic version. In these marked sections use the parameter
- entity in place of the keyword.</para>
-
- <para>When you want to produce the hard-copy version of the document,
- change the parameter entity's value to <literal>IGNORE</literal> and
- reprocess the document.</para>
-
- <example>
- <title>Using a parameter entity to control a marked
- section</title>
-
- <programlisting>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
-&lt;!ENTITY % electronic.copy "INCLUDE">
-]]&gt;
-
-...
-
-&lt;![ %electronic.copy [
- This content should only appear in the electronic
- version of the document.
-]]&gt;</programlisting>
-
- <para>When producing the hard-copy version, change the entity's
- definition to;</para>
-
- <programlisting>&lt!ENTITY % electronic.copy "IGNORE"></programlisting>
-
- <para>On reprocessing the document, the marked sections that use
- <literal>%electronic.copy</literal> as their keyword will be
- ignored.</para>
- </example>
- </sect3>
- </sect2>
-
- <sect2>
- <title>For you to do&hellip;</title>
-
- <procedure>
- <step>
- <para>Create a new file, <filename>section.sgml</filename>, that
- contains the following;</para>
-
- <programlisting>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN" [
-&lt;!ENTITY % text.output "INCLUDE">
-]&gt;
-
-&lt;html>
- &lt;head>
- &lt;title>An example using marked sections&lt;/title>
- &lt;/head>
-
- &lt;body>
- &lt;p>This paragraph &lt;![ CDATA [contains many &lt;
- characters (&lt; &lt; &lt; &lt; &lt;) so it is easier
- to wrap it in a CDATA marked section ]]&gt;&lt/p>
-
- &lt;![ IGNORE [
- &lt;p>This paragraph will definitely not be included in the
- output.&lt;/p>
- ]]&gt;
-
- &lt;![ <![ CDATA [%text.output]]> [
- &lt;p>This paragraph might appear in the output, or it
- might not.&lt;/p>
-
- &lt;p>Its appearance is controlled by the <![CDATA[%text.output]]>
- parameter entity.&lt;/p>
- ]]&gt;
- &lt;/body>
-&lt;/html></programlisting>
- </step>
-
- <step>
- <para>Normalise this file using &man.sgmlnorm.1; and examine the
- output. Notice which paragraphs have appeared, which have
- disappeared, and what has happened to the content of the CDATA
- marked section.</para>
- </step>
-
- <step>
- <para>Change the definition of the <literal>text.output</literal>
- entity from <literal>INCLUDE</literal> to
- <literal>IGNORE</literal>. Re-normalise the file, and examine the
- output to see what has changed. </para>
- </step>
- </procedure>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Conclusion</title>
-
- <para>That is the conclusion of this SGML primer. For reasons of space
- and complexity several things have not been covered in depth (or at
- all). However, the previous sections cover enough SGML for you to be
- able to follow the organisation of the FDP documentation.</para>
- </sect1>
-</chapter>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-declaration: "../chapter.decl"
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- sgml-parent-document: ("../book.sgml" "part" "chapter")
- End:
--->
diff --git a/en_US.ISO8859-1/books/fdp-primer/structure/chapter.sgml b/en_US.ISO8859-1/books/fdp-primer/structure/chapter.sgml
deleted file mode 100644
index 4f65641207..0000000000
--- a/en_US.ISO8859-1/books/fdp-primer/structure/chapter.sgml
+++ /dev/null
@@ -1,295 +0,0 @@
-<!-- Copyright (c) 1998, 1999 Nik Clayton, All rights reserved.
-
- Redistribution and use in source (SGML DocBook) and 'compiled' forms
- (SGML HTML, PDF, PostScript, RTF and so forth) with or without
- modification, are permitted provided that the following conditions
- are met:
-
- 1. Redistributions of source code (SGML DocBook) must retain the above
- copyright notice, this list of conditions and the following
- disclaimer as the first lines of this file unmodified.
-
- 2. Redistributions in compiled form (transformed to other DTDs,
- converted to PDF, PostScript, RTF and other formats) must reproduce
- the above copyright notice, this list of conditions and the
- following disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS DOCUMENTATION IS PROVIDED BY NIK CLAYTON "AS IS" AND ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL NIK CLAYTON BE LIABLE FOR ANY DIRECT,
- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
- $FreeBSD: doc/en_US.ISO8859-1/books/fdp-primer/structure/chapter.sgml,v 1.6 2001/06/11 01:16:47 ache Exp $
--->
-
-<chapter id="structure">
- <title>Structuring documents under <filename>doc/</filename></title>
-
- <para>The <filename>doc/</filename> tree is organised in a particular
- fashion, and the documents that are part of the FDP are in turn organised
- in a particular fashion. The aim is to make it simple to add new
- documentation in to the tree and:</para>
-
- <orderedlist>
- <listitem>
- <para>make it easy to automate converting the document to other formats</para>
- </listitem>
-
- <listitem>
- <para>promote consistency between the different documentation
- organisations, to make it easier to switch between working on
- different documents</para>
- </listitem>
-
- <listitem>
- <para>make it easy to decide where in the tree new documentation should
- be placed</para>
- </listitem>
- </orderedlist>
-
- <para>In addition, the documentation tree has to accommodate documentation
- that could be in many different languages and in many different
- encodings. It is important that the structure of the documentation tree
- does not enforce any particular defaults or cultural preferences.</para>
-
- <sect1>
- <title>The top level, <filename>doc/</filename></title>
-
- <para>There are two types of directory under <filename>doc/</filename>,
- each with very specific directory names and meanings.</para>
-
- <segmentedlist>
- <segtitle>Directory</segtitle>
-
- <segtitle>Meaning</segtitle>
-
- <seglistitem>
- <seg><filename>share/</filename></seg>
-
- <seg>Contains files that are not specific to the various translations
- and encodings of the documentation. Contains subdirectories to
- further categorise the information. For example, the files that
- comprise the &man.make.1; infrastructure are in
- <filename>share/mk</filename>, while the additional SGML support
- files (such as the FreeBSD extended DocBook DTD) are in
- <filename>share/sgml</filename>.</seg>
- </seglistitem>
-
- <seglistitem>
- <seg><filename><replaceable>lang</replaceable>.<replaceable>encoding</replaceable>/</filename></seg>
-
- <seg>One directory exists for each available translation and encoding
- of the documentation, for example
- <filename>en_US.ISO8859-1/</filename> and
- <filename>zh_TW.Big5/</filename>. The names are long, but by fully
- specifying the language and encoding we prevent any future headaches
- should a translation team want to provide the documentation in the
- same language but in more than one encoding. This also completely
- isolates us from any problems that might be caused by a switch to
- Unicode.</seg>
- </seglistitem>
- </segmentedlist>
- </sect1>
-
- <sect1>
- <title>The
- <filename><replaceable>lang</replaceable>.<replaceable>encoding</replaceable>/</filename> directories</title>
-
- <para>These directories contain the documents themselves. The
- documentation is split into up to three more categories at this
- level, indicated by the different directory names.</para>
-
- <segmentedlist>
- <segtitle>Directory</segtitle>
-
- <segtitle>Contents</segtitle>
-
- <seglistitem>
- <seg><filename>articles</filename></seg>
-
- <seg>Documentation marked up as a DocBook <sgmltag>article</sgmltag>
- (or equivalent). Reasonably short, and broken up into sections.
- Normally only available as one HTML file.</seg>
- </seglistitem>
-
- <seglistitem>
- <seg><filename>books</filename></seg>
-
- <seg>Documentation marked up as a DocBook <sgmltag>book</sgmltag> (or
- equivalent). Book length, and broken up in to chapters. Normally
- available as both one large HTML file (for people with fast
- connections, or who want to print it easily from a browser) and
- as a collection of linked, smaller files.</seg>
- </seglistitem>
-
- <seglistitem>
- <seg><filename>man</filename></seg>
-
- <seg>For translations of the system manual pages. This directory will
- contain one or more
- <filename>man<replaceable>n</replaceable></filename> directories,
- corresponding to the sections that have been translated.</seg>
- </seglistitem>
- </segmentedlist>
-
- <para>Not every
- <filename><replaceable>lang</replaceable>.<replaceable>encoding</replaceable></filename> directory will contain all of these directories. It depends
- on how much translation has been accomplished by that translation
- team.</para>
- </sect1>
-
- <sect1>
- <title>Document specific information</title>
-
- <para>This section contains specific notes about particular documents
- managed by the FDP.</para>
-
- <sect2>
- <title>The Handbook</title>
-
- <subtitle><filename>books/handbook/</filename></subtitle>
-
- <para>The Handbook is written to comply with the FreeBSD DocBook
- extended DTD.</para>
-
- <para>The Handbook is organised as a DocBook <sgmltag>book</sgmltag>.
- It is then divided into <sgmltag>part</sgmltag>s, each of which may
- contain several <sgmltag>chapter</sgmltag>s.
- <sgmltag>chapter</sgmltag>s are further subdivided into sections
- (<sgmltag>sect1</sgmltag>) and subsections (<sgmltag>sect2</sgmltag>,
- <sgmltag>sect3</sgmltag>) and so on.</para>
-
- <sect3>
- <title>Physical organisation</title>
-
- <para>There are a number of files and directories within the
- <filename>handbook</filename> directory.</para>
-
- <note>
- <para>The Handbook's organisation may change over time, and this
- document may lag in detailing the organisational changes. If you
- have any questions about how the Handbook is organised, please
- contact the FreeBSD Documentation Project,
- <email>freebsd-doc@FreeBSD.org</email>.</para>
- </note>
-
- <sect4>
- <title><filename>Makefile</filename></title>
-
- <para>The <filename>Makefile</filename> defines some variables that
- affect how the SGML source is converted to other formats, and
- lists the various source files that make up the Handbook. It then
- includes the standard <filename>doc.project.mk</filename> file, to
- bring in the rest of the code that handles converting documents
- from one format to another.</para>
- </sect4>
-
- <sect4>
- <title><filename>book.sgml</filename></title>
-
- <para>This is the top level document in the Handbook. It contains
- the Handbook's <link
- linkend="sgml-primer-doctype-declaration">DOCTYPE
- declaration</link>, as well as the elements that describe the
- Handbook's structure.</para>
-
- <para><filename>book.sgml</filename> uses <link
- linkend="sgml-primer-parameter-entities">parameter
- entities</link> to load in the files with the
- <filename>.ent</filename> extension. These files (described later)
- then define <link linkend="sgml-primer-general-entities">general
- entities</link> that are used throughout the rest of the
- Handbook.</para>
- </sect4>
-
- <sect4>
- <title><filename><replaceable>directory</replaceable>/chapter.sgml</filename></title>
-
- <para>Each chapter in the Handbook is stored in a file called
- <filename>chapter.sgml</filename> in a separate directory from the
- other chapters. Each directory is named after the value of the
- <literal>id</literal> attribute on the <sgmltag>chapter</sgmltag>
- element.</para>
-
- <para>For example, if one of the chapter files contains:</para>
-
- <programlisting><![ CDATA [
-<chapter id="kernelconfiguration">
-...
-</chapter>]]></programlisting>
-
- <para>then it will be called <filename>chapter.sgml</filename> in
- the <filename>kernelconfiguration</filename> directory. In
- general, the entire contents of the chapter will be held in this
- file.</para>
-
- <para>When the HTML version of the Handbook is produced, this will
- yield <filename>kernelconfiguration.html</filename>. This is
- because of the <literal>id</literal> value, and is not related to
- the name of the directory.</para>
-
- <para>In earlier versions of the Handbook the files were stored in
- the same directory as <filename>book.sgml</filename>, and named
- after the value of the <literal>id</literal> attribute on the
- file's <sgmltag>chapter</sgmltag> element. Moving them in to
- separate directories prepares for future plans for the Handbook.
- Specifically, it will soon be possible to include images in each
- chapter. It makes more sense for each image to be stored in a
- directory with the text for the chapter than to try and keep the
- text for all the chapters, and all the images, in one large
- directory. Namespace collisions would be inevitable, and it is
- easier to work with several directories with a few files in them
- than it is to work with one directory that has many files in
- it.</para>
-
- <para>A brief look will show that there are many directories with
- individual <filename>chapter.sgml</filename> files, including
- <filename>basics/chapter.sgml</filename>,
- <filename>introduction/chapter.sgml</filename>, and
- <filename>printing/chapter.sgml</filename>.</para>
-
- <important>
- <para>Chapters and/or directories should not be named in a fashion
- that reflects their ordering within the Handbook. This ordering
- might change as the content within the Handbook is reorganised;
- this sort of reorganistion should not (generally) include the
- need to rename files (unless entire chapters are being promoted
- or demoted within the hierarchy).</para>
- </important>
-
- <para>Each <filename>chapter.sgml</filename> file will not be a
- complete SGML document. In particular, they will not have their
- own DOCTYPE lines at the start of the files.</para>
-
- <para>This is unfortunate as
- it makes it impossible to treat these as generic SGML
- files and simply convert them to HTML, RTF, PS, and other
- formats in the same way the main Handbook is generated. This
- <emphasis>would</emphasis> force you to rebuild the Handbook
- every time you want to see the effect a change has had on just
- one chapter.</para>
- </sect4>
- </sect3>
- </sect2>
- </sect1>
-</chapter>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-declaration: "../chapter.decl"
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- sgml-parent-document: ("../book.sgml" "part" "chapter")
- End:
--->
-
diff --git a/en_US.ISO8859-1/books/fdp-primer/stylesheets/chapter.sgml b/en_US.ISO8859-1/books/fdp-primer/stylesheets/chapter.sgml
deleted file mode 100644
index 591345e07a..0000000000
--- a/en_US.ISO8859-1/books/fdp-primer/stylesheets/chapter.sgml
+++ /dev/null
@@ -1,102 +0,0 @@
-<!-- Copyright (c) 1998, 1999 Nik Clayton, All rights reserved.
-
- Redistribution and use in source (SGML DocBook) and 'compiled' forms
- (SGML HTML, PDF, PostScript, RTF and so forth) with or without
- modification, are permitted provided that the following conditions
- are met:
-
- 1. Redistributions of source code (SGML DocBook) must retain the above
- copyright notice, this list of conditions and the following
- disclaimer as the first lines of this file unmodified.
-
- 2. Redistributions in compiled form (transformed to other DTDs,
- converted to PDF, PostScript, RTF and other formats) must reproduce
- the above copyright notice, this list of conditions and the
- following disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS DOCUMENTATION IS PROVIDED BY NIK CLAYTON "AS IS" AND ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL NIK CLAYTON BE LIABLE FOR ANY DIRECT,
- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
- $FreeBSD: doc/en_US.ISO8859-1/books/fdp-primer/stylesheets/chapter.sgml,v 1.4 1999/09/06 06:52:42 peter Exp $
--->
-
-<chapter id="stylesheets">
- <title>* Stylesheets</title>
-
- <para>SGML says nothing about how a document should be displayed to the
- user, or rendered on paper. To do that, various languages have been
- developed to describe stylesheets, including DynaText, Panorama, SPICE,
- JSSS, FOSI, CSS, and DSSSL.</para>
-
- <para>For DocBook, we are using stylesheets written in DSSSL. For HTML we
- are using CSS.</para>
-
- <sect1>
- <title>* DSSSL</title>
-
- <para>The Documentation Project uses a slightly customised version of
- Norm Walsh's modular DocBook stylesheets.</para>
-
- <para>These can be found in
- <filename>textproc/dsssl-docbook-modular</filename>.</para>
-
- <para>The modified stylesheets are not in the ports system. Instead they
- are part of the Documentation Project source repository, and can be
- found in <filename>doc/share/sgml/freebsd.dsl</filename>. It is well
- commented, and pending completion of this section you are encouraged to
- examine that file to see how some of the available options in the
- standard stylesheets have been configured in order to customise the
- output for the FreeBSD Documentation Project. That file also contains
- examples showing how to extend the elements that the stylesheet
- understands, which is how the FreeBSD specific elements have been
- formatted.</para>
- </sect1>
-
- <sect1>
- <title>CSS</title>
-
- <para>Cascacding Stylesheets (CSS) are a mechanism for attaching style
- information (font, weight, size, color, and so forth) to elements in an
- HTML document without abusing HTML to do so.</para>
-
- <sect2>
- <title>The Web site (HTML documents)</title>
-
- <para>The FreeBSD web site does not currently use CSS. Unfortunately,
- the look and feel is constructed using abuses of HTML of varying
- degrees. This should be fixed, and would be a good project for
- someone looking to contribute to the documentation project.</para>
- </sect2>
-
- <sect2>
- <title>The DocBook documents</title>
-
- <para>The FreeBSD DSSSL stylesheets include a reference to a stylesheet,
- <filename>docbook.css</filename>, which is expected to appear in the
- same directory as the HTML files. The project-wide CSS file is copied
- from <filename>doc/share/misc/docbook.css</filename> when documents
- are converted to HTML, and is installed automatically.</para>
- </sect2>
- </sect1>
-</chapter>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-declaration: "../chapter.decl"
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- sgml-parent-document: ("../book.sgml" "part" "chapter")
- End:
--->
diff --git a/en_US.ISO8859-1/books/fdp-primer/the-website/chapter.sgml b/en_US.ISO8859-1/books/fdp-primer/the-website/chapter.sgml
deleted file mode 100644
index 1cf48fb8ab..0000000000
--- a/en_US.ISO8859-1/books/fdp-primer/the-website/chapter.sgml
+++ /dev/null
@@ -1,218 +0,0 @@
-<!-- Copyright (c) 1998, 1999 Nik Clayton, All rights reserved.
-
- Redistribution and use in source (SGML DocBook) and 'compiled' forms
- (SGML HTML, PDF, PostScript, RTF and so forth) with or without
- modification, are permitted provided that the following conditions
- are met:
-
- 1. Redistributions of source code (SGML DocBook) must retain the above
- copyright notice, this list of conditions and the following
- disclaimer as the first lines of this file unmodified.
-
- 2. Redistributions in compiled form (transformed to other DTDs,
- converted to PDF, PostScript, RTF and other formats) must reproduce
- the above copyright notice, this list of conditions and the
- following disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS DOCUMENTATION IS PROVIDED BY NIK CLAYTON "AS IS" AND ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL NIK CLAYTON BE LIABLE FOR ANY DIRECT,
- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
- $FreeBSD: doc/en_US.ISO8859-1/books/fdp-primer/the-website/chapter.sgml,v 1.5 2001/08/19 23:54:35 dd Exp $
--->
-
-<chapter id="the-website">
- <title>The Website</title>
-
- <sect1>
- <title>Preparation</title>
-
- <para>Get 200MB free disk space. You will need the disk space for the
- SGML tools, a subset of the CVS tree, temporary build space and the
- installed web pages. If you aready have installed the SGML tools and
- the CVS tree, you need only ~100MB free disk space.</para>
-
- <note>
- <para>Make sure your documentation ports are up to date! When in
- doubt, remove the old ports using &man.pkg.delete.1; command before
- installing the port. For example, we currently depend on
- jade-1.2 and if you have installed jade-1.1, please do</para>
-
- <screen>&prompt.root; <userinput>pkg_delete jade-1.1</userinput></screen>
- </note>
-
- <para>Setup a CVS repository. You need the directories www, doc and
- ports in the CVS tree (plus the CVSROOT of course). Please read the
- CVSup introduction <ulink
- url="http://www.freebsd.org/handbook/synching.html#CVSUP">
- http://www.freebsd.org/handbook/synching.html#CVSUP</ulink> how to
- mirror a CVS tree or parts of a CVS tree.</para>
-
- <para>The essential cvsup collections are: <literal>www</literal>,
- <literal>doc-all</literal>, <literal>cvs-base</literal>, and
- <literal>ports-base</literal>.</para>
-
- <para>These collections require ~100MB free disk space.</para>
-
- <para>A full CVS tree - including <literal>src</literal>,
- <literal>doc</literal>, <literal>www</literal>, and
- <literal>ports</literal> - is currently 650MB large.</para>
- </sect1>
-
- <sect1>
- <title>Build the web pages from scratch</title>
-
- <procedure>
- <step>
- <para>Go to into a build directory with at least 60MB of free
- space.</para>
-
- <screen>&prompt.root; <userinput>mkdir /var/tmp/webbuild</userinput>
-&prompt.root; <userinput>cd /var/tmp/webbuild</userinput></screen>
- </step>
-
- <step>
- <para>Checkout the SGML files from the CVS tree.</para>
-
- <screen>&prompt.root; <userinput>cvs -R co www doc</userinput></screen>
- </step>
-
- <step>
- <para>Change in to the <filename>www</filename> directory, and
- run the &man.make.1; <maketarget>links</maketarget> target, to
- create the necessary symbolic links.</para>
-
- <screen>&prompt.root; <userinput>cd www</userinput>
-&prompt.root; <userinput>make links</userinput></screen>
- </step>
-
- <step>
- <para>Change in to the <filename>en</filename> directory, and run
- the &man.make.1; <maketarget>all</maketarget> target, to create
- the web pages.</para>
-
- <screen>&prompt.root; <userinput>cd en</userinput>
-&prompt.root; <userinput>make all</userinput></screen>
- </step>
- </procedure>
- </sect1>
-
- <sect1>
- <title>Install the web pages into your web server</title>
-
- <procedure>
- <step>
- <para>If you have moved out of the <filename>en</filename>
- directory, change back to it.</para>
-
- <screen>&prompt.root; <userinput>cd <replaceable>path</replaceable>/www/en</userinput></screen>
- </step>
-
- <step>
- <para>Run the &man.make.1; <maketarget>install</maketarget> target,
- setting the <makevar>DESTDIR</makevar> variable to the name of the
- directory you want to install the files to.</para>
-
- <screen>&prompt.root; <userinput>make DESTDIR=<replaceable>/usr/local/www</replaceable> install</userinput></screen>
- </step>
-
- <step>
- <para>If you have previously installed the web pages in to the same
- directory the install process will not have deleted any old or
- outdated pages. For example, if you build and install a new copy
- of the site every day, this command will find and delete all
- files that have not been updated in three days.</para>
-
- <screen>&prompt.root; <userinput>find <replaceable>/usr/local/www</replaceable> -ctime 3 -print0 | xargs -0 rm</userinput></screen>
- </step>
- </procedure>
- </sect1>
-
- <sect1>
- <title>Environment variables</title>
-
- <variablelist>
- <varlistentry>
- <term><envar>CVSROOT</envar></term>
-
- <listitem>
- <para>Location of the CVS tree. Essential.</para>
-
- <screen><userinput>&prompt.root; CVSROOT=/home/ncvs; export CVSROOT</userinput></screen>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><makevar>ENGLISH_ONLY</makevar></term>
-
- <listitem>
- <para>If set and not empty, the makefiles will build and
- install only the English documents. All translations will be
- ignored. E.g.:</para>
-
- <screen>&prompt.root; <userinput>make ENGLISH_ONLY=YES all install</userinput></screen>
-
- <para>If you want unset the variable
- <makevar>ENGLISH_ONLY</makevar> and build all pages, including
- translations, set the variable <makevar>ENGLISH_ONLY</makevar>
- to an empty value</para>
-
- <screen>&prompt.root; <userinput>make ENGLISH_ONLY="" all install clean</userinput></screen>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><makevar>WEB_ONLY</makevar></term>
-
- <listitem>
- <para>If set and not empty, the makefiles wil build and install
- only the HTML pages from the www directory. All documents from
- the doc directory (Handbook, FAQ, Tutorials) will be ignored.
- E.g.:</para>
-
- <screen>&prompt.root; <userinput>make WEB_ONLY=YES all install</userinput></screen>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><makevar>NOPORTSCVS</makevar></term>
-
- <listitem>
- <para>If set, the makefiles will not checkout files from the ports
- cvs repository. Instead, it will copy the files from
- <filename>/usr/ports</filename> (or where the variable
- <envar>PORTSBASE</envar> points to).</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para><envar>CVSROOT</envar> is an environment variable. You must set it
- on the commandline or in your dot files (~/.profile).</para>
-
- <para><makevar>WEB_ONLY</makevar>, <makevar>ENGLISH_ONLY</makevar> and
- <makevar>NOPORTSCVS</makevar> are makefile variables. You can set the
- variables in <filename>/etc/make.conf</filename>,
- <filename>Makefile.inc</filename> or as environment variables on the
- commandline or in your dot files.</para>
- </sect1>
-</chapter>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-declaration: "../chapter.decl"
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- sgml-parent-document: ("../book.sgml" "part" "chapter")
- End:
--->
diff --git a/en_US.ISO8859-1/books/fdp-primer/tools/chapter.sgml b/en_US.ISO8859-1/books/fdp-primer/tools/chapter.sgml
deleted file mode 100644
index 21167ba5a6..0000000000
--- a/en_US.ISO8859-1/books/fdp-primer/tools/chapter.sgml
+++ /dev/null
@@ -1,285 +0,0 @@
-<!-- Copyright (c) 1998, 1999 Nik Clayton, All rights reserved.
-
- Redistribution and use in source (SGML DocBook) and 'compiled' forms
- (SGML, HTML, PDF, PostScript, RTF and so forth) with or without
- modification, are permitted provided that the following conditions
- are met:
-
- 1. Redistributions of source code (SGML DocBook) must retain the above
- copyright notice, this list of conditions and the following
- disclaimer as the first lines of this file unmodified.
-
- 2. Redistributions in compiled form (transformed to other DTDs,
- converted to PDF, PostScript, RTF and other formats) must reproduce
- the above copyright notice, this list of conditions and the
- following disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS DOCUMENTATION IS PROVIDED BY NIK CLAYTON "AS IS" AND ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL NIK CLAYTON BE LIABLE FOR ANY DIRECT,
- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
- $FreeBSD: doc/en_US.ISO8859-1/books/fdp-primer/tools/chapter.sgml,v 1.13 2001/06/22 10:29:03 nik Exp $
--->
-
-<chapter id="tools">
- <title>Tools</title>
-
- <para>The FDP uses a number of different software tools to help
- manage the FreeBSD documentation, convert it to different output
- formats, and so on. You will need to use these tools yourself if
- you are to work with the FreeBSD documentation.</para>
-
- <para>All these tools are available as FreeBSD Ports and Packages,
- greatly simplifying the work you have to do to install
- them.</para>
-
- <para>You will need to install these tools before you work through
- any of the examples in later chapters. The actual usage of these
- tools is covered in later chapters.</para>
-
- <tip>
- <title>Use <filename>textproc/docproj</filename> if possible</title>
-
- <para>You can save yourself a lot of time if you install the
- <filename>textproc/docproj</filename> port. This is a
- <emphasis>meta-port</emphasis> which does not contain any software
- itself. Instead, it depends on various other ports being installed
- correctly. Installing this port <emphasis>should</emphasis>
- automatically download and install all of the packages listed in this
- chapter that you need.</para>
-
- <para>One of the packages that you might need is the JadeTeX macro set.
- In turn, this macro set requires that TeX is installed. TeX is a large
- package, and you only need it if you want to produce Postscript or PDF
- output.</para>
-
- <para>To save yourself time and space you must specify whether or not you
- want JadeTeX (and therefore TeX) installed when you install this port.
- Either do;
-
- <screen>&prompt.root; <userinput>make JADETEX=yes install</userinput></screen>
-
- or
-
- <screen>&prompt.root; <userinput>make JADETEX=no install</userinput></screen>
-
- as necessary.</para>
- </tip>
-
- <sect1>
- <title>Mandatory tools</title>
-
- <sect2>
- <title>Software</title>
-
- <para>These programs are required before you can usefully work with the
- FreeBSD documentation, and they will allow you to convert the
- documentation to HTML, plain text, and RTF formats. They are all
- included in <filename>textproc/docproj</filename>.</para>
-
- <variablelist>
- <varlistentry>
- <term><application>SP</application>
- (<filename>textproc/sp</filename>)</term>
-
- <listitem>
- <para>A suite of applications, including a validating SGML parser,
- and an SGML normaliser.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><application>Jade</application>
- (<filename>textproc/jade</filename>)</term>
-
- <listitem>
- <para>A DSSSL implementation. Used for converting marked up
- documents to other formats, including HTML and TeX.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><application>Tidy</application>
- (<filename>www/tidy</filename>)</term>
-
- <listitem>
- <para>An HTML 'pretty printer', used to reformat some of the
- automatically generated HTML so that it is easier to
- follow.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><application>Links</application>
- (<filename>www/links</filename>)</term>
-
- <listitem>
- <para>A text-mode WWW browser, &man.links.1; can also convert
- HTML files to plain text.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><application>peps</application>
- (<filename>graphics/peps</filename>)</term>
-
- <listitem>
- <para>Some of the documentation includes images, some of which are
- stored as EPS files. These must be converted to PNG before most
- web browsers will display them.</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect2>
-
- <sect2>
- <title>DTDs and Entities</title>
-
- <para>These are the DTDs and entity sets used by the FDP. They need to
- be installed before you can work with any of the documentation.</para>
-
- <variablelist>
- <varlistentry>
- <term>HTML DTD (<filename>textproc/html</filename>)</term>
-
- <listitem>
- <para>HTML is the markup language of choice for the World Wide
- Web, and is used throughout the FreeBSD web site.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>DocBook DTD (<filename>textproc/docbook</filename>)</term>
-
- <listitem>
- <para>DocBook is designed for marking up technical documentation.
- All the FreeBSD documentation is written in DocBook.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>ISO 8879 entities
- (<filename>textproc/iso8879</filename>)</term>
-
- <listitem>
- <para>19 of the ISO 8879:1986 character entity sets used by many
- DTDs. Includes named mathematical symbols, additional
- characters in the 'latin' character set (accents, diacriticals,
- and so on), and greek symbols.</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect2>
-
- <sect2>
- <title>Stylesheets</title>
-
- <para>The stylesheets are used when converting and formatting the
- documentation for display on screen, printing, and so on.</para>
-
- <variablelist>
- <varlistentry>
- <term>Modular DocBook Stylesheets
- (<filename>textproc/dsssl-docbook-modular</filename>)</term>
-
- <listitem>
- <para>The Modular DocBook Stylesheets are used when converting
- documentation marked up in DocBook to other formats, such as
- HTML or RTF.</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Optional tools</title>
-
- <para>You do not need to have any of the following installed. However,
- you may find it easier to work with the documentation if you do, and
- they may give you more flexibility in the output formats that can be
- generated.</para>
-
- <sect2>
- <title>Software</title>
-
- <variablelist>
- <varlistentry>
- <term><application>JadeTeX</application> and
- <application>teTeX</application>
- (<filename>print/jadetex</filename> and
- <filename>print/teTeX</filename>)</term>
-
- <listitem>
- <para><application>Jade</application> and
- <application>teTeX</application> are used to convert DocBook
- documents to DVI, Postscript, and PDF formats. The
- <application>JadeTeX</application> macros are needed in order to
- do this.</para>
-
- <para>If you do not intend to convert your documentation to one of
- these formats (i.e., HTML, plain text, and RTF are sufficient)
- then you do not need to install
- <application>JadeTeX</application> and
- <application>teTeX</application>. This can be a significant
- space and time saver, as <application>teTeX</application> is
- over 30MB in size.</para>
-
- <important>
- <para>If you decide to install
- <application>JadeTeX</application> and
- <application>teTeX</application> then you will need to
- configure <application>teTeX</application> after
- <application>JadeTeX</application> has been installed.
- <filename>print/jadetex/pkg-message</filename> contains
- detailed instructions explaining what you need to do.</para>
- </important>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><application>Emacs</application> or
- <application>xemacs</application>
- (<filename>editors/emacs</filename> or
- <filename>editors/xemacs</filename>)</term>
-
- <listitem>
- <para>Both these editors include a special mode for editing
- documents marked up according to an SGML DTD. This mode
- includes commands to reduce the amount of typing you need, and
- help reduce the possibility of errors.</para>
-
- <para>You do not need to use them; any text editor can be used to
- edit marked up documents. You may find they make you more
- efficient.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>If anyone has recommendations for other software that is useful
- when manipulating SGML documents, please let Nik Clayton
- (<email>nik@FreeBSD.org</email>) know, so they can be added to this
- list.</para>
- </sect2>
- </sect1>
-</chapter>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-declaration: "../chapter.decl"
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- sgml-parent-document: ("../book.sgml" "part" "chapter")
- End:
--->
diff --git a/en_US.ISO8859-1/books/fdp-primer/translations/chapter.sgml b/en_US.ISO8859-1/books/fdp-primer/translations/chapter.sgml
deleted file mode 100644
index b5ebbeb5ad..0000000000
--- a/en_US.ISO8859-1/books/fdp-primer/translations/chapter.sgml
+++ /dev/null
@@ -1,482 +0,0 @@
-<!-- Copyright (c) 1999 Nik Clayton, All rights reserved.
-
- Redistribution and use in source (SGML DocBook) and 'compiled' forms
- (SGML HTML, PDF, PostScript, RTF and so forth) with or without
- modification, are permitted provided that the following conditions
- are met:
-
- 1. Redistributions of source code (SGML DocBook) must retain the above
- copyright notice, this list of conditions and the following
- disclaimer as the first lines of this file unmodified.
-
- 2. Redistributions in compiled form (transformed to other DTDs,
- converted to PDF, PostScript, RTF and other formats) must reproduce
- the above copyright notice, this list of conditions and the
- following disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS DOCUMENTATION IS PROVIDED BY NIK CLAYTON "AS IS" AND ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL NIK CLAYTON BE LIABLE FOR ANY DIRECT,
- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
- $FreeBSD: doc/en_US.ISO8859-1/books/fdp-primer/translations/chapter.sgml,v 1.10 2001/06/28 14:47:22 nik Exp $
--->
-
-<chapter id="translations">
- <title>Translations</title>
-
- <para>This is the FAQ for people translating the FreeBSD documentation
- (FAQ, Handbook, tutorials, man pages, and others) to different
- languages.</para>
-
- <para>It is <emphasis>very</emphasis> heavily based on the translation FAQ
- from the FreeBSD German Documentation Project, originally written by Frank
- Gr&uuml;nder <email>elwood@mc5sys.in-berlin.de</email> and translated back to
- English by Bernd Warken <email>bwarken@mayn.de</email>.</para>
-
- <para>The FAQ maintainer is Nik Clayton
- <email>nik@FreeBSD.org</email>.</para>
-
- <qandaset>
- <qandaentry>
- <question>
- <para>Why a FAQ?</para>
- </question>
-
- <answer>
- <para>More and more people are approaching the freebsd-doc mailing
- list and volunteering to translate FreeBSD documentation to other
- languages. This FAQ aims to answer their questions so they can start
- translating documentation as quickly as possible.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>What do <phrase>i18n</phrase> and <phrase>l10n</phrase>
- mean?</para>
- </question>
-
- <answer>
- <para><phrase>i18n</phrase> means
- <phrase>internationalisation</phrase> and <phrase>l10n</phrase>
- means <phrase>localisation</phrase>. They are just a convenient
- shorthand.</para>
-
- <para><phrase>i18n</phrase> can be read as <quote>i</quote> followed by
- 18 letters, followed by <quote>n</quote>. Similarly,
- <phrase>l10n</phrase> is <quote>l</quote> followed by 10 letters,
- followed by <quote>n</quote>.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>Is there a mailing list for translators?</para>
- </question>
-
- <answer>
- <para>Yes, <email>freebsd-translate@ngo.org.uk</email>. Subscribe by
- sending a message to
- <email>freebsd-translate-request@ngo.org.uk</email> with the word
- <literal>subscribe</literal> in the body of the message.</para>
-
- <para>You will receive a reply asking you to confirm your subscription
- (in exactly the same manner as the FreeBSD lists at <hostid
- role="domainname">FreeBSD.org</hostid>).</para>
-
- <para>The primary language of the mailing list is English. However,
- posts in other languages will be accepted. The mailing list is not
- moderated, but you need to be a member of the list before you can
- post to it.</para>
-
- <para>The mailing list is archived, but they are not currently
- searchable. Sending the message <literal>help</literal> to
- <email>majordomo@ngo.org.uk</email> will send back instructions on
- how to access the archive.</para>
-
- <para>It is expected that the mailing list will transfer to <hostid
- role="domainname">FreeBSD.org</hostid> and therefore become
- <emphasis>official</emphasis> in the near future.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>Are more translators needed?</para>
- </question>
-
- <answer>
- <para>Yes. The more people work on translation the faster it gets
- done, and the faster changes to the English documentation are
- mirrored in the translated documents.</para>
-
- <para>You do not have to be a professional translator to be able to
- help.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>What languages do I need to know?</para>
- </question>
-
- <answer>
- <para>Ideally, you will have a good knowledge of written English, and
- obviously you will need to be fluent in the language you are
- translating to.</para>
-
- <para>English is not strictly necessary. For example, you could do a
- Hungarian translation of the FAQ from the Spanish
- translation.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>What software do I need to know?</para>
- </question>
-
- <answer>
- <para>It is strongly recommended that you maintain a local copy of the
- FreeBSD CVS repository (at least the documentation part) either
- using <application>CTM</application> or
- <application>CVSup</application>. The "Staying current with FreeBSD"
- chapter in the Handbook explains how to use these
- applications.</para>
-
- <para>You should be comfortable using <application>CVS</application>.
- This will allow you to see what has changed between different
- versions of the files that make up the documentation.</para>
-
- <para>[XXX To Do -- write a tutorial that shows how to use CVSup to
- get just the documentation, check it out, and see what's changed
- between two arbitrary revisions]</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>How do I find out who else might be translating to the same
- language?</para>
- </question>
-
- <answer>
- <para>The <ulink
- url="http://www.FreeBSD.org/docproj/translations.html">Documentation
- Project translations page</ulink> lists the translation efforts
- that are currently known about. If others are already working
- on translating documentation to your language, please don't
- duplicate their efforts. Instead, contact them to see how you can
- help.</para>
-
- <para>If no one is listed on that page as translating for your
- language, then send a message to
- <email>freebsd-doc@FreeBSD.org</email> in case someone else is
- thinking of doing a translation, but hasn't announced it yet.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>No one else is translating to my language. What do I do?</para>
- </question>
-
- <answer>
- <para>Congratulations, you have just started the <quote>FreeBSD
- <replaceable>your-language-here</replaceable> Documentation
- Translation Project</quote>. Welcome aboard.</para>
-
- <para>First, decide whether or not you've got the time to spare. Since
- you are the only person working on your language at the moment it is
- going to be your responsibility to publicise your work and
- coordinate any volunteers that might want to help you.</para>
-
- <para>Write an e-mail to the Documentation Project mailing list,
- announcing that you are going to translate the documentation, so the
- Documentation Project translations page can be maintained.</para>
-
- <para>You should subscribe to the
- <email>freebsd-translate@ngo.org.uk</email> mailing list (as
- described earlier).</para>
-
- <para>If there is already someone in your country providing FreeBSD
- mirroring services you should contact them and ask if you can
- have some webspace for your project, and possibly an e-mail
- address or mailing list services.</para>
-
- <para>Then pick a document and start translating. It is best to start
- with something fairly small&mdash;either the FAQ, or one of the
- tutorials.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>I've translated some documentation, where do I send it?</para>
- </question>
-
- <answer>
- <para>That depends. If you are already working with a translation team
- (such as the Japanese team, or the German team) then they will have
- their own procedures for handling submitted documentation, and these
- will be outlined on their web pages.</para>
-
- <para>If you are the only person working on a particular language (or
- you are responsible for a translation project and want to submit
- your changes back to the FreeBSD project) then you should send your
- translation to the FreeBSD project (see the next question).</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>I'm the only person working on translating to this language, how
- do I submit my translation?</para>
-
- <para>or</para>
-
- <para>We're a translation team, and want to submit documentation that
- our members have translated for us?</para>
- </question>
-
- <answer>
- <para>First, make sure your translation is organised properly. This
- means that it should drop in to the existing documentation tree and
- build straight away.</para>
-
- <para>Currently, the FreeBSD documentation is stored in a top level
- directory called <filename>doc/</filename>. Directories below this
- are named according to the language code they are written in, as
- defined in ISO639 (<filename>/usr/share/misc/iso639</filename> on a
- version of FreeBSD newer than 20th January 1999).</para>
-
- <para>If your language can be encoded in different ways (for example,
- Chinese) then there should be directories below this, one for each
- encoding format you have provided.</para>
-
- <para>Finally, you should have directories for each document.</para>
-
- <para>For example, a hypothetical Swedish translation might look
- like</para>
-
- <programlisting>doc/
- sv_SE.ISO8859-1/
- Makefile
- books/
- faq/
- Makefile
- book.sgml</programlisting>
-
- <para><literal>sv_SE.ISO8859-1</literal> is the name of the
- translation, in
- <filename><replaceable>lang</replaceable>.<replaceable>encoding</replaceable></filename>
- form. Note the
- two Makefiles, which will be used to build the documentation.</para>
-
- <para>Use &man.tar.1; and &man.gzip.1; to compress up your
- documentation, and send it to the project.</para>
-
- <screen>&prompt.user; <userinput>cd doc</userinput>
-&prompt.user; <userinput>tar cf swedish-docs.tar sv</userinput>
-&prompt.user; <userinput>gzip -9 swedish-docs.tar</userinput></screen>
-
- <para>Put <filename>swedish-docs.tar.gz</filename> somewhere. If you
- do not have access to your own webspace (perhaps your ISP does not
- let you have any) then you can e-mail Nik Clayton
- <email>nik@FreeBSD.org</email>, and arrange to e-mail the files
- when it is convenient.</para>
-
- <para>Either way, you should use &man.send-pr.1; to submit a report
- indicating that you have submitted the documentation. It would be
- very helpful if you could get other people to look over your
- translation and double check it first, since it is unlikely that the
- person committing it will be fluent in the language.</para>
-
- <para>Someone (probably the Documentation Project Manager, currently
- Nik Clayton <email>nik@FreeBSD.org</email>) will then take your
- translation and confirm that it builds. In particular, the
- following things will be looked at:</para>
-
- <orderedlist>
- <listitem>
- <para>Do all your files use RCS strings (such as "ID")?</para>
- </listitem>
-
- <listitem>
- <para>Does <command>make all</command> in the
- <filename>sv_SE.ISO8859-1</filename> directory work correctly?</para>
- </listitem>
-
- <listitem>
- <para>Does <command>make install</command> work correctly?</para>
- </listitem>
- </orderedlist>
-
- <para>If there are any problems then whoever is looking at the
- submission will get back to you to try and work them out.</para>
-
- <para>If there are no problems your translation will be committed
- as soon as possible.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>Can I include language or country specific text in my
- translation?</para>
- </question>
-
- <answer>
- <para>We would prefer that you did not.</para>
-
- <para>For example, suppose that you are translating the Handbook to
- Korean, and want to include a section about retailers in Korea in
- your Handbook.</para>
-
- <para>There's no real reason why that information should not be in the
- English (or German, or Spanish, or Japanese, or &hellip;) versions
- as well. It is feasible that an English speaker in Korea might try
- and pick up a copy of FreeBSD whilst over there. It also helps
- increase FreeBSD's perceived presence around the globe, which is not
- a bad thing.</para>
-
- <para>If you have country specific information, please submit it as a
- change to the English Handbook (using &man.send-pr.1;) and then
- translate the change back to your language in the translated
- Handbook.</para>
-
- <para>Thanks.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>How should language specific characters be included?</para>
- </question>
-
- <answer>
- <para>Non-ASCII characters in the documentation should be included
- using SGML entities.</para>
-
- <para>Briefly, these look like an ampersand (&amp;), the name of the
- entity, and a semi-colon (;).</para>
-
- <para>The entity names are defined in ISO8879, which is in the ports
- tree as <filename>textproc/iso8879</filename>.</para>
-
- <para>A few examples include</para>
-
- <segmentedlist>
- <segtitle>Entity</segtitle>
-
- <segtitle>Appearance</segtitle>
-
- <segtitle>Description</segtitle>
-
- <seglistitem>
- <seg>&amp;eacute;</seg>
- <seg>&eacute;</seg>
- <seg>Small <quote>e</quote> with an acute accent</seg>
- </seglistitem>
-
- <seglistitem>
- <seg>&amp;Eacute;</seg>
- <seg>&Eacute;</seg>
- <seg>Large <quote>E</quote> with an acute accent</seg>
- </seglistitem>
-
- <seglistitem>
- <seg>&amp;uuml;</seg>
- <seg>&uuml;</seg>
- <seg>Small <quote>u</quote> with an umlaut</seg>
- </seglistitem>
- </segmentedlist>
-
- <para>After you have installed the iso8879 port, the files in
- <filename>/usr/local/share/sgml/iso8879</filename> contain the
- complete list.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>Addressing the reader</para>
- </question>
-
- <answer>
- <para>In the English documents, the reader is addressed as
- <quote>you</quote>, there is no formal/informal distinction as there
- is in some languages.</para>
-
- <para>If you are translating to a language which does distinguish, use
- whichever form is typically used in other technical documentation in
- your language. If in doubt, use a mildly polite form.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>Do I need to include any additional information in my
- translations?</para>
- </question>
-
- <answer>
- <para>Yes.</para>
-
- <para>The header of the English version of each document will look
- something like this;</para>
-
- <programlisting>&lt;!--
- The FreeBSD Documentation Project
-
- &dollar;FreeBSD: doc/en_US.ISO8859-1/books/fdp-primer/translations/chapter.sgml,v 1.5 2000/07/07 18:38:38 dannyboy Exp &dollar;
---&gt;</programlisting>
-
- <para>The exact boilerplate may change, but it will always include a
- &dollar;FreeBSD&dollar; line and the phrase <literal>The FreeBSD Documentation
- Project</literal>.
- Note that the &dollar;FreeBSD part is expanded automatically by
- CVS, so it should be empty (just
- <literal>&dollar;FreeBSD&dollar;</literal>) for new files.</para>
-
- <para>Your translated documents should include their own
- &dollar;FreeBSD&dollar; line, and change the
- <literal>FreeBSD Documentation Project</literal> line to
- <literal>The FreeBSD <replaceable>language</replaceable>
- Documentation Project</literal>.</para>
-
- <para>In addition, you should add a third line which indicates which
- revision of the English text this is based on.</para>
-
- <para>So, the Spanish version of this file might start</para>
-
- <programlisting>&lt;!--
- The FreeBSD Spanish Documentation Project
-
- &dollar;FreeBSD: doc/es_ES.ISO8859-1/books/fdp-primer/translations/chapter.sgml,v 1.3 1999/06/24 19:12:32 jesusr Exp &dollar;
- Original revision: 1.11
---&gt;</programlisting>
- </answer>
- </qandaentry>
- </qandaset>
-</chapter>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-declaration: "../chapter.decl"
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- sgml-parent-document: ("../book.sgml" "part" "chapter")
- End:
--->
diff --git a/en_US.ISO8859-1/books/fdp-primer/writing-style/chapter.sgml b/en_US.ISO8859-1/books/fdp-primer/writing-style/chapter.sgml
deleted file mode 100644
index 18c1e0ecdc..0000000000
--- a/en_US.ISO8859-1/books/fdp-primer/writing-style/chapter.sgml
+++ /dev/null
@@ -1,388 +0,0 @@
-<!-- Copyright (c) 1998 Nik Clayton, All rights reserved.
-
- Redistribution and use in source (SGML DocBook) and 'compiled' forms
- (SGML HTML, PDF, PostScript, RTF and so forth) with or without
- modification, are permitted provided that the following conditions
- are met:
-
- 1. Redistributions of source code (SGML DocBook) must retain the above
- copyright notice, this list of conditions and the following
- disclaimer as the first lines of this file unmodified.
-
- 2. Redistributions in compiled form (transformed to other DTDs,
- converted to PDF, PostScript, RTF and other formats) must reproduce
- the above copyright notice, this list of conditions and the
- following disclaimer in the documentation and/or other materials
- provided with the distribution.
-
- THIS DOCUMENTATION IS PROVIDED BY NIK CLAYTON "AS IS" AND ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL NIK CLAYTON BE LIABLE FOR ANY DIRECT,
- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-
- $FreeBSD: doc/en_US.ISO8859-1/books/fdp-primer/writing-style/chapter.sgml,v 1.20 2001/08/11 21:45:32 jim Exp $
--->
-
-<chapter id="writing-style">
- <title>Writing style</title>
-
- <para>In order to promote consistency between the myriad authors of the
- FreeBSD documentation, some guidelines have been drawn up for authors to
- follow.</para>
-
- <variablelist>
- <varlistentry>
- <term>Do not use contractions</term>
-
- <listitem>
- <para>Do not use contractions. Always spell the phrase out in full.
- <quote>Don't use contractions</quote> would be wrong.</para>
-
- <para>Avoiding contractions makes for a more formal tone, is more
- precise, and is slightly easier for translators.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Use the serial comma</term>
-
- <listitem>
- <para>In a list of items within a paragraph, separate each item from
- the others with a comma. Seperate the last item from the others with
- a comma and the word <quote>and</quote>.</para>
-
- <para>For example, look at the following:</para>
-
- <blockquote>
- <para>This is a list of one, two and three items.</para>
- </blockquote>
-
- <para>Is this a list of three items, <quote>one</quote>,
- <quote>two</quote>, and <quote>three</quote>, or a list of two items,
- <quote>one</quote> and <quote>two and three</quote>?</para>
-
- <para>It is better to be explicit and include a serial comma:</para>
-
- <blockquote>
- <para>This is a list of one, two, and three items.</para>
- </blockquote>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Avoid redundant phrases</term>
-
- <listitem>
- <para>Try not to use redundant phrases. In particular, <quote>the
- command</quote>, <quote>the file</quote>, and <quote>man
- command</quote> are probably redundant.</para>
-
- <para>These two examples show this for commands. The second example
- is preferred.</para>
-
- <informalexample>
- <para>Use the command <command>cvsup</command> to update your
- sources</para>
- </informalexample>
-
- <informalexample>
- <para>Use <command>cvsup</command> to update your sources</para>
- </informalexample>
-
- <para>These two examples show this for filenames. The second example
- is preferred.</para>
-
- <informalexample>
- <para>&hellip; in the filename
- <filename>/etc/rc.local</filename>&hellip;</para>
- </informalexample>
-
- <informalexample>
- <para>&hellip; in
- <filename>/etc/rc.local</filename>&hellip;</para>
- </informalexample>
-
- <para>These two examples show this for manual references. The second
- example is preferred (the second example uses
- <sgmltag>citerefentry</sgmltag>).</para>
-
- <informalexample>
- <para>See <command>man csh</command> for more
- information.</para>
- </informalexample>
-
- <informalexample>
- <para>See &man.csh.1;</para>
- </informalexample>
- </listitem>
- </varlistentry>
- <varlistentry>
- <term>Two spaces at the end of sentences</term>
-
- <listitem>
- <para>Always use two spaces at the end of sentences, as this
- improves readability, and eases use of tools such as
- <application>emacs</application>.</para>
-
- <para>While it may be argued that a capital letter following
- a period denotes a new sentence, this is not the case, especially
- in name usage. <quote>Jordan K. Hubbard</quote> is a good
- example; it has a capital <literal>H</literal> following a
- period and a space, and there certainly isn't a new sentence
- there.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>For more information about writing style, see <ulink
- url="http://www.bartleby.com/141/index.html">Elements of
- Style</ulink>, by William Strunk.</para>
-
- <sect1>
- <title>Style guide</title>
-
- <para>To keep the source for the Handbook consistent when many different
- people are editing it, please follow these style conventions.</para>
-
- <sect2>
- <title>Letter case</title>
-
- <para>Tags are entered in lower case, <literal>&lt;para&gt;</literal>,
- <emphasis>not</emphasis> <literal>&lt;PARA&gt;</literal>.</para>
-
- <para>Text that appears in SGML contexts is generally written in upper
- case, <literal>&lt!ENTITY&hellip;&gt;</literal>, and
- <literal>&lt;!DOCTYPE&hellip;&gt;</literal>, <emphasis>not</emphasis>
- <literal>&lt;!entity&hellip;&gt;</literal> and
- <literal>&lt;!doctype&hellip;&gt;</literal>.</para>
- </sect2>
-
- <sect2>
- <title>Indentation</title>
-
- <para>Each file starts with indentation set at column 0,
- <emphasis>regardless</emphasis> of the indentation level of the file
- which might contain this one.</para>
-
- <para>Every start tag increases the indentation level by 2 spaces, and
- every end tag decreases the indentation level by 2 spaces. Replace
- as many leading spaces with tabs as appropriate. Do not use
- spaces in front of tabs, and do not add extraneous whitespace at the
- end of a line. Content
- within elements should be indented by two spaces if the content runs
- over more than one line.</para>
-
- <para>For example, the source for this section looks something
- like:</para>
-
- <programlisting><![ CDATA [+--- This is column 0
-V
-<chapter>
- <title>...</title>
-
- <sect1>
- <title>...</title>
-
- <sect2>
- <title>Indentation</title>
-
- <para>Each file starts with indentation set at column 0,
- <emphasis>regardless</emphasis> of the indentation level of the file
- which might contain this one.</para>
-
- <para>Every start tag increases the indentation level by 2 spaces, and
- every end tag decreases the indentation level by 2 spaces. Content
- within elements should be indented by two spaces if the content runs
- over more than one line.</para>
-
- ...
- </sect2>
- </sect1>
-</chapter>]]></programlisting>
-
- <para>If you use <application>Emacs</application> or
- <application>Xemacs</application> to edit the files then
- <literal>sgml-mode</literal> should be loaded automatically, and the
- Emacs local variables at the bottom of each file should enforce these
- styles.</para>
- </sect2>
-
- <sect2>
- <title>Tag style</title>
-
- <sect3>
- <title>Tag spacing</title>
-
- <para>Tags that start at the same indent as a previous tag
- should be separated by a blank line, and those that are not
- at the same indent as a previous tag should not:</para>
-
- <informalexample>
- <programlisting><![ CDATA [<article>
- <articleinfo>
- <title>NIS</title>
-
- <pubdate>October 1999</pubdata>
-
- <abstract>
- <para>...
- ...
- ...</para>
- </abstract>
- </articleinfo>
-
- <sect1>
- <title>...</title>
-
- <para>...</para>
- </sect1>
-
- <sect1>
- <title>...</title>
-
- <para>...</para>
- </sect1>
-</article>]]></programlisting>
- </informalexample>
- </sect3>
-
- <sect3>
- <title>Separating tags</title>
-
- <para>Tags like <sgmltag>itemizedlist</sgmltag> which will
- always have further tags inside them, and in fact don't take
- character data themselves, are always on a line by
- themselves.</para>
-
- <para>Tags like <sgmltag>para</sgmltag> and
- <sgmltag>term</sgmltag> don't need other tags to contain
- normal character data, and their contents begin immediately
- after the tag, <emphasis>on the same line</emphasis>.</para>
-
- <para>The same applies to when these two types of tags
- close.</para>
-
- <para>This leads to an obvious problem when mixing these
- tags.</para>
-
- <para>When a starting tag which cannot contain character data
- directly follows a tag of the type that requires other tags
- within it to use character data, they are on separate lines.
- The second tag should be properly indented.</para>
-
- <para>When a tag which can contain character data closes
- directly after a tag which cannot contain character data
- closes, they co-exist on the same line.</para>
- </sect3>
- </sect2>
-
- <sect2>
- <title>White space changes</title>
-
- <para>When committing changes, <emphasis>do not commit changes to the
- content at the same time as changes to the
- formatting</emphasis>.</para>
-
- <para>This is so that the teams that convert the Handbook to other
- languages can quickly see what content has actually changed in your
- commit, without having to decide whether a line has changed because of
- the content, or just because it has been refilled.</para>
-
- <para>For example, if you have added two sentences to a paragraph, such
- that the line lengths on the paragraph now go over 80 columns, first
- commit your change with the too-long line lengths. Then fix the line
- wrapping, and commit this second change. In the commit message for
- the second change, be sure to indicate that this is a whitespace-only
- change, and that the translation team can ignore it.</para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Word list</title>
-
- <para>The following is a small list of words spelled the way they
- should be used in the FreeBSD Documentation Project. If the
- word you are looking for is not in this list, then please
- consult the <ulink
- url="http://www.oreilly.com/oreilly/author/stylesheet.html">O'Reilly
- word list</ulink>.</para>
-
- <itemizedlist>
- <listitem>
- <para>2.2.X</para>
- </listitem>
-
- <listitem>
- <para>4.X-STABLE</para>
- </listitem>
-
- <listitem>
- <para>DoS <emphasis>(Denial of Service)</emphasis> </para>
- </listitem>
-
- <listitem>
- <para>FreeBSD Ports Collection</para>
- </listitem>
-
- <listitem>
- <para>Internet</para>
- </listitem>
-
- <listitem>
- <para>CDROM</para>
- </listitem>
-
- <listitem>
- <para>MHz</para>
- </listitem>
-
- <listitem>
- <para>ports collection</para>
- </listitem>
-
- <listitem>
- <para>Unix</para>
- </listitem>
-
- <listitem>
- <para>email</para>
- </listitem>
-
- <listitem>
- <para>manual page(s)</para>
- </listitem>
-
- <listitem>
- <para>mail server</para>
- </listitem>
-
- <listitem>
- <para>name server</para>
- </listitem>
-
- <listitem>
- <para>web server</para>
- </listitem>
- </itemizedlist>
-
- </sect1>
-</chapter>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-declaration: "../chapter.decl"
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- sgml-parent-document: ("../book.sgml" "part" "chapter")
- End:
--->
-
diff --git a/en_US.ISO8859-1/books/handbook/basics/disk-layout.kil b/en_US.ISO8859-1/books/handbook/basics/disk-layout.kil
deleted file mode 100644
index 85820c2878..0000000000
--- a/en_US.ISO8859-1/books/handbook/basics/disk-layout.kil
+++ /dev/null
Binary files differ
diff --git a/en_US.ISO8859-1/books/handbook/multimedia/Makefile b/en_US.ISO8859-1/books/handbook/multimedia/Makefile
deleted file mode 100644
index 0ea7f84352..0000000000
--- a/en_US.ISO8859-1/books/handbook/multimedia/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-#
-# Build the Handbook with just the content from this chapter.
-#
-# $FreeBSD$
-#
-
-CHAPTERS= sound/chapter.sgml
-
-VPATH= ..
-
-MASTERDOC= ${.CURDIR}/../${DOC}.${DOCBOOKSUFFIX}
-
-DOC_PREFIX?= ${.CURDIR}/../../../..
-
-.include "../Makefile"
diff --git a/en_US.ISO8859-1/books/handbook/multimedia/chapter.sgml b/en_US.ISO8859-1/books/handbook/multimedia/chapter.sgml
deleted file mode 100644
index 5fe664092b..0000000000
--- a/en_US.ISO8859-1/books/handbook/multimedia/chapter.sgml
+++ /dev/null
@@ -1,579 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD: doc/en_US.ISO8859-1/books/handbook/sound/chapter.sgml,v 1.22 2001/09/24 11:23:09 murray Exp $
--->
-
-<chapter id="sound">
- <chapterinfo>
- <authorgroup>
- <author>
- <firstname>Moses</firstname>
- <surname>Moore</surname>
- <contrib>Contributed by </contrib>
- </author>
- </authorgroup>
- <!-- 20 November 2000 -->
- </chapterinfo>
-
- <title>Sound</title>
-
- <sect1>
- <title>Synopsis</title>
-
- <para>FreeBSD supports a wide variety of sound cards, allowing you
- to enjoy high fidelity output from your computer. This includes
- the ability to record and playback audio in the MPEG Audio Layer
- 3 (MP3), WAV, and Ogg Vorbis formats as well as many other
- formats. The FreeBSD Ports Collection also contains
- applications allowing you to edit your recorded audio, add sound
- effects, and control attached MIDI devices.</para>
-
- <para>After reading this chapter, you will know:</para>
- <itemizedlist>
- <listitem><para>How to locate your sound card.</para></listitem>
- <listitem><para>How to configure your system so that your sound card is
- recognized.</para></listitem>
- <listitem><para>Methods to test that your card is working using
- sample applications.</para></listitem>
- <listitem><para>How to troubleshoot your sound setup.</para></listitem>
- <listitem><para>How to playback and encode MP3s.</para></listitem>
- <listitem><para>How to rip CD audio tracks into data files.</para></listitem>
- </itemizedlist>
-
- <para>Before reading this chapter, you should:</para>
-
- <itemizedlist>
- <listitem><para>Know how to configure and install a new kernel (<xref
- linkend="kernelconfig">).</para></listitem>
- </itemizedlist>
- </sect1>
-
- <sect1>
- <title>Locating the Correct Device</title>
-
- <indexterm><primary>PCI</primary></indexterm>
- <indexterm><primary>ISA</primary></indexterm>
- <indexterm><primary>sound cards</primary></indexterm>
- <para>Before you begin, you should know the model of the card you
- have, the chip it uses, and whether it is a PCI or ISA card.
- FreeBSD supports a wide variety of both PCI and ISA cards. If you
- do not see your card in the following list, check the &man.pcm.4;
- manual page. This is not a complete list; however, it does list
- some of the most common cards.</para>
-
- <itemizedlist>
- <listitem>
- <para>Crystal 4237, 4236, 4232, 4231</para>
- </listitem>
-
- <listitem>
- <para>Yamaha OPL-SAx</para>
- </listitem>
-
- <listitem>
- <para>OPTi931</para>
- </listitem>
-
- <listitem>
- <para>Ensoniq AudioPCI 1370/1371</para>
- </listitem>
-
- <listitem>
- <para>ESS Solo-1/1E</para>
- </listitem>
-
- <listitem>
- <para>NeoMagic 256AV/ZX</para>
- </listitem>
-
- <listitem>
- <para>Sound Blaster Pro, 16, 32, AWE64, AWE128, Live</para>
- </listitem>
-
- <listitem>
- <para>Creative ViBRA16</para>
- </listitem>
-
- <listitem>
- <para>Advanced Asound 100, 110, and Logic ALS120</para>
- </listitem>
-
- <listitem>
- <para>ES 1868, 1869, 1879, 1888</para>
- </listitem>
-
- <listitem>
- <para>Gravis UltraSound</para>
- </listitem>
-
- <listitem>
- <para>Aureal Vortex 1 or 2</para>
- </listitem>
- </itemizedlist>
-
- <indexterm>
- <primary>kernel</primary>
- <secondary>configuration</secondary>
- </indexterm>
- <para>The driver you use in your kernel depends on the kind of card
- you have. The sections below provide more information and what
- you will need to add to your <link linkend="kernelconfig">kernel
- configuration</link>.</para>
-
- <sect2>
- <title>Creative, Advance, and ESS Sound Cards</title>
-
- <para>If you have one of the above cards, you will need to
- add:</para>
-
- <programlisting>device pcm</programlisting>
-
- <para>to your kernel configuration file. If you have a PnP ISA
- card, you will also need to add:</para>
-
- <programlisting>device sbc</programlisting>
-
- <para>For a non-PnP ISA card, add:</para>
-
- <programlisting>device pcm
-device sbc0 at isa? port 0x220 irq 5 drq 1 flags 0x15</programlisting>
-
- <para>to your kernel configuration file. The settings shown
- above are the defaults. You may need to change the IRQ or the
- other settings to match your card. See the &man.sbc.4; manual
- page for more information.</para>
-
- <note>
- <para>The Sound Blaster Live is not supported under FreeBSD 4.0
- without a patch, which this section will not cover. It is
- recommended that you update to the latest -STABLE before
- trying to use this card.</para>
- </note>
- </sect2>
-
- <sect2>
- <title>Gravis UltraSound Cards</title>
-
- <para>For a PnP ISA card, you will need to add:</para>
-
- <programlisting>device pcm
-device gusc</programlisting>
-
- <para>to your kernel configuration file. If you have a non-PnP ISA card, you will
- need to add:</para>
-
- <programlisting>device pcm
-device gus0 at isa? port 0x220 irq 5 drq 1 flags 0x13</programlisting>
-
- <para>to your kernel configuration file. You may need to change
- the IRQ or the other settings to match your card. See the
- &man.gusc.4; manual page for more information.</para>
- </sect2>
-
- <sect2>
- <title>Crystal Sound Cards</title>
-
- <para>For Crystal cards, you will need to add:</para>
-
- <programlisting>device pcm
-device csa</programlisting>
-
- <para>to your kernel configuration file.</para>
- </sect2>
-
- <sect2>
- <title>Generic Support</title>
-
- <para>For PnP ISA or PCI cards, you will need to add:</para>
-
- <programlisting>device pcm</programlisting>
-
- <para>to your kernel configuration file. If you have a non-PnP ISA
- sound card that does not have a bridge driver, you will need
- to add:</para>
-
- <programlisting>device pcm0 at isa? irq 10 drq 1 flags 0x0</programlisting>
-
- <para>to your kernel configuration file. You may need to change
- the IRQ or the other settings to match your card.</para>
-
- </sect2>
-
- <sect2>
- <title>Onboard Sound</title>
-
- <para>Some systems with built-in motherboard sound devices may
- require the following option in your kernel
- configuration:</para>
-
- <programlisting>options PNPBIOS</programlisting>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Recompiling the Kernel</title>
-
- <para>After adding the requisite driver(s) to your kernel
- configuration file, you will need to recompile your kernel. Please see
- <xref linkend="kernelconfig-building"> of the handbook for
- more information.</para>
- </sect1>
-
- <sect1>
- <title>Creating and Testing the Device Nodes</title>
-
- <indexterm><primary>device nodes</primary></indexterm>
- <para>After you reboot, log in and run <command>dmesg | grep pcm</command> as shown
- below:</para>
-
- <screen>&prompt.root; dmesg | grep pcm
-pcm0: &lt;SB16 DSP 4.11&gt; on sbc0</screen>
-
- <para>The output from your system may look different. If no
- <devicename>pcm</devicename> devices show up, something went wrong
- earlier. If that happens, go through your kernel configuration
- file again and make sure you chose the correct device. Consult
- the troubleshooting section for additional options.</para>
-
- <para>If the previous command returned <devicename>pcm0</devicename>,
- you will have to run the following as root:</para>
-
- <screen>&prompt.root; cd /dev
-&prompt.root; sh MAKEDEV snd0</screen>
-
- <para>If the command returned <devicename>pcm1</devicename>,
- follow the same steps as shown above, replacing
- <devicename>snd0</devicename> with
- <devicename>snd1</devicename>.</para>
-
- <note>
- <para>The above commands will <emphasis>not</emphasis> create a
- <devicename>/dev/snd</devicename> device!</para>
- </note>
-
- <para><command>MAKEDEV</command> will create a group of device
- nodes, including:</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <thead>
- <row>
- <entry>Device</entry>
- <entry>Description</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry><devicename>/dev/audio</devicename></entry>
- <entry>SPARC-compatible audio device</entry>
- </row>
-
- <row>
- <entry><devicename>/dev/dsp</devicename></entry>
- <entry>Digitized voice device</entry>
- </row>
-
- <row>
- <entry><devicename>/dev/dspW</devicename></entry>
- <entry>Like <devicename>/dev/dsp</devicename>, but 16 bits
- per sample</entry>
- </row>
-
- <row>
- <entry><devicename>/dev/midi</devicename></entry>
- <entry>Raw midi access device</entry>
- </row>
-
- <row>
- <entry><devicename>/dev/mixer</devicename></entry>
- <entry>Control port mixer device</entry>
- </row>
-
- <row>
- <entry><devicename>/dev/music</devicename></entry>
- <entry>Level 2 sequencer interface</entry>
- </row>
-
- <row>
- <entry><devicename>/dev/sequencer</devicename></entry>
- <entry>Sequencer device</entry>
- </row>
-
- <row>
- <entry><devicename>/dev/pss</devicename></entry>
- <entry>Programmable device interface</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <para>If all goes well, you should now have a functioning sound
- card. If you do not, read the next section.</para>
- </sect1>
-
- <sect1>
- <title>Common Problems</title>
-
- <qandaset>
- <indexterm><primary>device node</primary></indexterm>
- <qandaentry>
- <question>
- <para>I get an unsupported subdevice XX error!</para>
- </question>
-
- <answer>
- <para>One or more of the device nodes was not created
- correctly. Repeat the steps above.</para>
- </answer>
- </qandaentry>
-
- <indexterm><primary>I/O port</primary></indexterm>
- <qandaentry>
- <question>
- <para>I get a sb_dspwr(XX) timed out error!</para>
- </question>
-
- <answer>
- <para>The I/O port is not set correctly.</para>
- </answer>
- </qandaentry>
-
- <indexterm><primary>IRQ</primary></indexterm>
- <qandaentry>
- <question>
- <para>I get a bad irq XX error!</para>
- </question>
-
- <answer>
- <para>The IRQ is set incorrectly. Make sure that the set IRQ
- and the sound IRQ are the same.</para>
- </answer>
- </qandaentry>
-
- <qandaentry>
- <question>
- <para>I get a <errorname>xxx: gus pcm not attached, out of
- memory</errorname>
- error. What causes that?</para>
- </question>
-
- <answer>
- <para>If this happens, it is because there is not enough
- available memory to use the device.</para>
- </answer>
- </qandaentry>
- </qandaset>
- </sect1>
-
- <sect1 id="mp3">
- <sect1info>
- <authorgroup>
- <author>
- <firstname>Chern</firstname>
- <surname>Lee</surname>
- <contrib>Contributed by </contrib>
- </author>
- </authorgroup>
- <!-- 11 Sept 2001 -->
- </sect1info>
-
- <title>MP3 Audio</title>
-
- <para>MP3 (MPEG Layer 3 Audio) accomplishes near CD-quality sound,
- leaving no reason to let your FreeBSD workstation fall short of
- its offerings.</para>
-
- <sect2 id="mp3-players">
- <title>MP3 Players</title>
-
- <para>By far, the most popular XFree86 MP3 player is
- <application>XMMS</application> (X Multimedia System).
- <application>WinAmp</application>
- skins can be used with <application>XMMS</application> since the
- GUI is almost identical to that of Nullsoft
- <application>Winamp</application>'s.
- <application>XMMS</application> also has native plug-in
- support.</para>
-
- <para><application>XMMS</application> can be installed from the
- <port>audio/xmms</port> port or package.</para>
-
- <para><application>XMMS'</application> interface is intuitive, with
- a playlist, graphic equalizer, and more. Those familiar with WinAmp
- will find <application>XMMS</application> simple to use.</para>
-
- <para>The <port>audio/mpg123</port> port is an alternative,
- command-line MP3 player.</para>
-
- <para><application>mpg123</application> can be run by specifying the
- sound device and the MP3 file on the command line, as shown below:</para>
-
- <screen>&prompt.root; mpg123 -a <replaceable>/dev/dsp1.0</replaceable> Foobar-GreatestHits.mp3
-High Performance MPEG 1.0/2.0/2.5 Audio Player for Layer 1, 2 and 3.
-Version 0.59r (1999/Jun/15). Written and copyrights by Michael Hipp.
-Uses code from various people. See 'README' for more!
-THIS SOFTWARE COMES WITH ABSOLUTELY NO WARRANTY! USE AT YOUR OWN RISK!
-
-
-
-
-
-Playing MPEG stream from BT - Foobar-GreastHits.mp3 ...
-MPEG 1.0 layer III, 128 kbit/s, 44100 Hz joint-stereo
-</screen>
-
- <para><literal>/dev/dsp1.0</literal> should be replaced with the
- <devicename>dsp</devicename> device entry on your system.</para>
-
- </sect2>
-
- <sect2 id="rip-cd">
- <title>Ripping CD Audio Tracks</title>
-
- <para>Before encoding a CD or CD track to MP3, the audio data on
- the CD must be ripped onto the hard drive. This is done by
- copying the raw CDDA (CD Digital Audio) data to WAV
- files.</para>
-
- <para>The <command>cdda2wav</command> tool, which is a part of the
- <port>sysutils/cdrtools</port> suite, is used for ripping audio
- information of CDs and the information associated with it.</para>
-
- <para>With the audio CD in the drive, the following command
- can be issued (as <username>root</username>) to rip an entire
- CD into individual (per track) WAV files:</para>
-
- <screen>&prompt.root; cdda2wav -D <replaceable>0,1,0</replaceable> -B</screen>
-
- <para>The <option>-D <replaceable>0,1,0</replaceable></option>
- indicates the SCSI device <devicename>0,1,0</devicename>, which
- corresponds to the output of <command>cdrecord
- -scanbus</command>.</para>
-
- <para>To rip individual tracks, make use of the
- <option>-t</option> option as shown:</para>
-
- <screen>&prompt.root; cdda2wav -D <replaceable>0,1,0</replaceable> -t 7</screen>
-
- <para>This example rips track seven of the audio CDROM. To rip a range
- of tracks, for example, track one to seven, specify a range:</para>
-
- <screen>&prompt.root; cdda2wav -D <replaceable>0,1,0</replaceable> -t 1+7</screen>
-
- <para><application>cdda2wav</application> only supports SCSI
- CDROM drives. For IDE drives, try out <port>audio/cdd</port> or
- some of the various other utilities in the audio ports
- collection.</para>
-
- </sect2>
-
- <sect2 id="mp3-encoding">
- <title>Encoding MP3s</title>
-
- <para>Nowadays, the mp3 encoder of choice is
- <application>lame</application>.
- <application>Lame</application> can be found at
- <port>audio/lame</port> in the ports tree.</para>
-
- <para>Using the ripped WAV files, the following command will
- convert <filename>audio01.wav</filename> to
- <filename>audio01.mp3</filename>:</para>
-
- <screen>&prompt.root; lame -h -b <replaceable>128</replaceable> \
---tt "<replaceable>Foo Song Title</replaceable>" \
---ta "<replaceable>FooBar Artist</replaceable>" \
---tl "<replaceable>FooBar Album</replaceable>" \
---ty "<replaceable>2001</replaceable>" \
---tc "<replaceable>Ripped and encoded by Foo</replaceable>" \
---tg "<replaceable>Genre</replaceable>" \
-<replaceable>audio01.wav audio01.mp3</replaceable></screen>
-
- <para>128 kbits seems to be the standard MP3 bitrate in use.
- Many enjoy the higher quality 160, or 192. The higher the
- bitrate, the more disk space the resulting MP3 will consume--but
- the quality will be higher. The <option>-h</option> option
- turns on the <quote>higher quality but a little slower</quote>
- mode. The options beginning with <option>--t</option> indicate
- ID3 tags, which usually contain song information, to be embedded
- within the MP3 file. Additional encoding options can be found
- by consulting the lame man page.</para>
- </sect2>
-
- <sect2 id="mp3-decoding">
- <title>Decoding MP3s</title>
-
- <para>In order to burn an audio CD from MP3s, they must be converted
- to a non-compressed WAV format. Both <application>XMMS</application>
- and <application>mpg123</application> support the output of MP3 to
- an uncompressed file format.</para>
-
- <para>Writing to Disk in <application>XMMS</application>:</para>
-
- <procedure>
- <step>
- <para>Launch <application>XMMS</application>.</para>
- </step>
-
- <step>
- <para>Right-click on the window to bring up the
- <application>XMMS</application> menu.</para>
- </step>
-
- <step>
- <para>Select <literal>Preference</literal> under
- <literal>Options</literal>.</para>
- </step>
-
- <step>
- <para>Change the Output Plugin to <quote>Disk Writer
- Plugin</quote>.</para>
- </step>
-
- <step>
- <para>Press <literal>Configure</literal>.</para>
- </step>
-
- <step>
- <para>Enter (or choose browse) a directory to write the
- uncompressed files to.</para>
- </step>
-
- <step>
- <para>Load the MP3 file into <application>XMMS</application>
- as usual, with volume at 100% and EQ settings turned
- off.</para>
- </step>
-
- <step>
- <para>Press <literal>Play</literal> &mdash; <application>XMMS</application>
- will appear as if it is playing the MP3, but no music will be heard. It
- is actually playing the MP3 to a file.</para>
- </step>
-
- <step>
- <para>Be sure to set the default Output Plugin back to what it was before
- in order to listen to MP3s again.</para>
- </step>
- </procedure>
-
- <para>Writing to stdout in <application>mpg123</application>:</para>
-
- <procedure>
- <step>
- <para>Run mpg123 -s <replaceable>audio01.mp3</replaceable>
- &gt; audio01.pcm</para>
- </step>
- </procedure>
-
- <para><application>XMMS</application> writes a file in the WAV format, while
- <application>mpg123</application> converts the MP3 into raw PCM audio data.
- Both of these formats can be used with <application>cdrecord</application>
- or <application>burncd</application> to create audio CDROMs.</para>
-
- <para>Read <xref linkend="creating-cds"> for more information on using a
- CD burner in FreeBSD.</para>
- </sect2>
- </sect1>
-</chapter>
diff --git a/en_US.ISO8859-1/books/porters-handbook/Makefile b/en_US.ISO8859-1/books/porters-handbook/Makefile
deleted file mode 100644
index 4557e616bf..0000000000
--- a/en_US.ISO8859-1/books/porters-handbook/Makefile
+++ /dev/null
@@ -1,29 +0,0 @@
-#
-# $FreeBSD: doc/en_US.ISO_8859-1/books/porter-handbook/Makefile,v 1.1 2000/04/22 23:47:57 nik Exp $
-#
-# Build the FreeBSD Porter's Handbook.
-#
-
-MAINTAINER=nik@FreeBSD.org
-
-DOC?= book
-
-FORMATS?= html-split
-
-INSTALL_COMPRESSED?= gz
-INSTALL_ONLY_COMPRESSED?=
-
-#
-# SRCS lists the individual SGML files that make up the document. Changes
-# to any of these files will force a rebuild
-#
-
-# SGML content
-SRCS= book.sgml
-
-# Use the local DSSSL file
-DSLHTML?= ${.CURDIR}/freebsd.dsl
-DSLPRINT?= ${.CURDIR}/freebsd.dsl
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/books/porters-handbook/book.sgml b/en_US.ISO8859-1/books/porters-handbook/book.sgml
deleted file mode 100644
index 0d0f2c27cc..0000000000
--- a/en_US.ISO8859-1/books/porters-handbook/book.sgml
+++ /dev/null
@@ -1,4564 +0,0 @@
-<!--
- The FreeBSD Documentation Project
-
- $FreeBSD: doc/en_US.ISO8859-1/books/porters-handbook/book.sgml,v 1.172 2001/10/10 02:47:43 ache Exp $
--->
-
-<!DOCTYPE BOOK PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man;
-
-<!ENTITY % bookinfo PUBLIC "-//FreeBSD//ENTITIES DocBook BookInfo Entities//EN">
-%bookinfo;
-
-<!ENTITY % authors PUBLIC "-//FreeBSD//ENTITIES DocBook Author Entities//EN"> %authors;
-<!ENTITY % mailing-lists PUBLIC "-//FreeBSD//ENTITIES DocBook Mailing List Entities//EN">
-%mailing-lists;
-
-]>
-
-<book>
- <bookinfo>
- <title>FreeBSD Porter's Handbook</title>
-
- <authorgroup>
- <corpauthor>The FreeBSD Documentation Project</corpauthor>
- </authorgroup>
-
- <pubdate>April 2000</pubdate>
-
- <copyright>
- <year>2000</year>
- <holder role="mailto:doc@FreeBSD.org">The FreeBSD Documentation
- Project</holder>
- </copyright>
-
- &bookinfo.legalnotice;
- </bookinfo>
-
-
- <chapter>
- <title>Making a port yourself</title>
-
- <para>So, now you are interested in making your own port or
- upgrading an existing one? Great!</para>
-
- <para>What follows are some guidelines for creating a new port for
- FreeBSD. If you want to upgrade an existing port, you should
- read this and then read <xref linkend="port-upgrading">.</para>
-
- <para>When this document is not sufficiently detailed, you should
- refer to <filename>/usr/ports/Mk/bsd.port.mk</filename>, which
- all port Makefiles include. Even if you do not hack Makefiles
- daily, it is well commented, and you will still gain much
- knowledge from it. Additionally, you may send specific questions
- to the &a.ports;.</para>
-
- <note>
- <para>Only a fraction of the variables
- (<makevar><replaceable>VAR</replaceable></makevar>) that can be
- overridden are mentioned in this document. Most (if not all)
- are documented at the start of <filename>bsd.port.mk</filename>.
- This file uses a non-standard tab setting.
- <application>Emacs</application> and
- <application>Vim</application> should recognize the setting on
- loading the file. Both <command>vi</command> and
- <command>ex</command> can be set to use the correct value by
- typing <command>:set tabstop=4</command> once the file has been
- loaded.</para>
- </note>
- </chapter>
-
- <chapter id="quick-porting">
- <title>Quick Porting</title>
-
- <para>This section tells you how to do a quick port. In many cases, it
- is not enough, but we will see.</para>
-
- <para>First, get the original tarball and put it into
- <makevar>DISTDIR</makevar>, which defaults to
- <filename>/usr/ports/distfiles</filename>.</para>
-
- <note>
- <para>The following assumes that the software compiled out-of-the-box,
- i.e., there was absolutely no change required for the port to work
- on your FreeBSD box. If you needed to change something, you will
- have to refer to the next section too.</para>
- </note>
-
- <sect1>
- <title>Writing the <filename>Makefile</filename></title>
-
- <para>The minimal <filename>Makefile</filename> would look something
- like this:</para>
-
- <programlisting># New ports collection makefile for: oneko
-# Date created: 5 December 1994
-# Whom: asami
-#
-# &dollar;FreeBSD&dollar;
-#
-
-PORTNAME= oneko
-PORTVERSION= 1.1b
-CATEGORIES= games
-MASTER_SITES= ftp://ftp.cs.columbia.edu/archives/X11R5/contrib/
-
-MAINTAINER= asami@FreeBSD.org
-
-MAN1= oneko.1
-MANCOMPRESSED= yes
-USE_IMAKE= yes
-
-.include &lt;bsd.port.mk&gt;</programlisting>
-
- <para>See if you can figure it out. Do not worry about the contents
- of the <literal>&dollar;FreeBSD&dollar;</literal> line, it will be
- filled in automatically by CVS when the port is imported to our main
- ports tree. You can find a more detailed example in the <link
- linkend="porting-samplem">sample Makefile</link> section.</para>
- </sect1>
-
- <sect1>
- <title>Writing the description files</title>
-
- <para>There are three description files that are required for
- any port, whether they actually package or not. They are
- <filename>pkg-comment</filename>,
- <filename>pkg-descr</filename>, and
- <filename>pkg-plist</filename>, and their
- <filename>pkg-</filename> prefix distinguishes them from
- other files.</para>
-
- <sect2>
- <title><filename>pkg-comment</filename></title>
-
- <para>This is the one-line description of the port.
- <emphasis>Please</emphasis> do not include the package name (or
- version number of the software) in the comment. The comment
- should begin with a capital, and end without a period. Here
- is an example:</para>
-
- <programlisting>A cat chasing a mouse all over the screen</programlisting>
- </sect2>
-
- <sect2>
- <title><filename>pkg-descr</filename></title>
-
- <para>This is a longer description of the port. One to a few
- paragraphs concisely explaining what the port does is
- sufficient.</para>
-
- <note>
- <para>This is <emphasis>not</emphasis> a manual or an in-depth
- description on how to use or compile the port! <emphasis>Please
- be careful if you are copying from the
- <filename>README</filename> or manpage</emphasis>; too often
- they are not a concise description of the port or are in an
- awkward format (e.g., manpages have justified spacing). If the
- ported software has an official WWW homepage, you should list it
- here. Prefix <emphasis>one</emphasis> of the websites with
- <literal>WWW:</literal> so that automated tools will work
- correctly.</para>
- </note>
-
- <para>It is recommended that you sign your name at the end of this
- file, as in:</para>
-
- <programlisting>This is a port of oneko, in which a cat chases a poor mouse all over
-the screen.
- :
-(etc.)
-
-WWW: http://www.oneko.org/
-
-- Satoshi
-asami@cs.berkeley.edu</programlisting>
- </sect2>
-
- <sect2>
- <title><filename>pkg-plist</filename></title>
-
- <para>This file lists all the files installed by the port. It is
- also called the <quote>packing list</quote> because the package is
- generated by packing the files listed here. The pathnames are
- relative to the installation prefix (usually
- <filename>/usr/local</filename> or
- <filename>/usr/X11R6</filename>). If you are using the
- <makevar>MAN<replaceable>n</replaceable></makevar> variables (as
- you should be), do not list any manpages here.</para>
-
- <para>Here is a small example:</para>
-
- <programlisting>bin/oneko
-lib/X11/app-defaults/Oneko
-lib/X11/oneko/cat1.xpm
-lib/X11/oneko/cat2.xpm
-lib/X11/oneko/mouse.xpm
-@dirrm lib/X11/oneko</programlisting>
-
- <para>Refer to the &man.pkg.create.1; man page for details on the
- packing list.</para>
-
- <note>
- <para>You should list all the files, but not the name directories,
- in the list. Also, if the port creates directories for itself
- during installation, make sure to add <literal>@dirrm</literal>
- lines as necessary to remove them when the port is
- deleted.</para>
-
- <para>It is recommended that you keep all the filenames in this
- file sorted alphabetically. It will make verifying the changes
- when you upgrade the port much easier.</para>
-
- <para>Creating a packing list manually can be a very tedious
- task. If the port installs a large numbers of files, <link
- linkend="porting-autoplist">creating the packing list
- automatically</link> might save time.</para>
- </note>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Creating the checksum file</title>
-
- <para>Just type <command>make makesum</command>. The ports make rules
- will automatically generate the file
- <filename>distinfo</filename>.</para>
- </sect1>
-
- <sect1 id="porting-testing">
- <title>Testing the port</title>
-
- <para>You should make sure that the port rules do exactly what you
- want them to do, including packaging up the port. These are the
- important points you need to verify.</para>
-
- <itemizedlist>
- <listitem>
- <para><filename>pkg-plist</filename> does not contain anything not
- installed by your port</para>
- </listitem>
-
- <listitem>
- <para><filename>pkg-plist</filename> contains everything that is
- installed by your port</para>
- </listitem>
-
- <listitem>
- <para>Your port can be installed multiple times using the
- <maketarget>reinstall</maketarget> target</para>
- </listitem>
-
- <listitem>
- <para>Your port <link linkend="porting-cleaning">cleans up</link>
- after itself upon deinstall</para>
- </listitem>
- </itemizedlist>
-
- <procedure>
- <title>Recommended test ordering</title>
-
- <step>
- <para><command>make install</command></para>
- </step>
-
- <step>
- <para><command>make package</command></para>
- </step>
-
- <step>
- <para><command>make deinstall</command></para>
- </step>
-
- <step>
- <para><command>pkg_add <replaceable>package-name</replaceable>
- </command></para>
- </step>
-
- <step>
- <para><command>make deinstall</command></para>
- </step>
-
- <step>
- <para><command>make reinstall</command></para>
- </step>
-
- <step>
- <para><command>make package</command></para>
- </step>
- </procedure>
-
- <para>Make sure that there are not any warnings issued in any of the
- <maketarget>package</maketarget> and
- <maketarget>deinstall</maketarget> stages. After step 3, check to
- see if all the new directories are correctly deleted. Also, try
- using the software after step 4, to ensure that it works correctly
- when installed from a package.</para>
- </sect1>
-
- <sect1 id="porting-portlint">
- <title>Checking your port with <command>portlint</command></title>
-
- <para>Please use <command>portlint</command> to see if your port
- conforms to our guidelines. The <command>portlint</command> program
- is part of the ports collection. In particular, you may want to
- check if the <link linkend="porting-samplem">Makefile</link> is in
- the right shape and the <link
- linkend="porting-pkgname">package</link> is named
- appropriately.</para>
- </sect1>
-
- <sect1 id="porting-submitting">
- <title>Submitting the port</title>
-
- <para>First, make sure you have read the <link
- linkend="porting-dads">DOs and DON'Ts</link> section.</para>
-
- <para>Now that you are happy with your port, the only thing remaining
- is to put it in the main FreeBSD ports tree and make everybody else
- happy about it too. We do not need your <filename>work</filename>
- directory or the <filename>pkgname.tgz</filename> package, so delete
- them now. Next, simply include the output of <command>shar `find
- port_dir`</command> in a bug report and send it with the
- &man.send-pr.1; program (see <ulink url="../handbook/contrib-how.html#CONTRIB-GENERAL">Bug
- Reports and General Commentary</ulink> for more information about
- &man.send-pr.1;. If the uncompressed port is larger than 20KB,
- you should compress it into a tarfile and use &man.uuencode.1;
- before including it in the bug report (uuencoded tarfiles are
- acceptable even if the bug report is smaller than 20KB but are not
- preferred). Be sure to classify the bug report as category
- <literal>ports</literal> and class
- <literal>change-request</literal> (Do not mark the report
- <literal>confidential</literal>!).
- Also add a short description of the program you ported
- to the <quote>Description</quote> field of the PR and
- the shar or uuencoded tarfile to the
- <quote>Fix</quote> field. The latter one helps the committers
- a lot, who use scripts for the ports-work.</para>
-
- <para>One more time, <emphasis>do not include the original source
- distfile, the <filename>work</filename> directory, or the package
- you built with <command>make package</command></emphasis>.</para>
-
- <note>
- <para>In the past, we asked you to upload new port submissions in
- our FTP site (<hostid role="fqdn">ftp.FreeBSD.org</hostid>). This
- is no longer recommended as read access is turned off on the
- <filename>incoming/</filename> directory of that site due to the
- large amount of pirated software showing up there.</para>
- </note>
-
- <para>We will look at your port, get back to you if necessary, and put
- it in the tree. Your name will also appear in the list of
- <quote>Additional FreeBSD contributors</quote> in the FreeBSD
- Handbook and other files. Isn't that great?!? <!-- smiley
- -->:-)</para>
-
- <note>
- <para>You can make our work a lot easier, if you use a good
- description in the synopsis of the problem report.
- We prefer something like
- <quote>New port: &lt;short description of the port&gt;</quote> for
- new ports and
- <quote>Update port: &lt;category&gt;/&lt;port&gt; &lt;short description
- of the update&gt;</quote> for port updates.
- If you stick to this scheme, the chance that one takes a look at
- your PR soon is much bigger.</para>
- </note>
- </sect1>
- </chapter>
-
- <chapter>
- <title>Slow Porting</title>
-
- <para>Ok, so it was not that simple, and the port required some
- modifications to get it to work. In this section, we will explain,
- step by step, how to modify it to get it to work with the ports
- paradigm.</para>
-
- <sect1>
- <title>How things work</title>
-
- <para>First, this is the sequence of events which occurs when the user
- first types <command>make</command> in your port's directory.
- You may find that having <filename>bsd.port.mk</filename> in another
- window while you read this really helps to understand it.</para>
-
- <para>But do not worry if you do not really understand what
- <filename>bsd.port.mk</filename> is doing, not many people do...
- <!-- smiley --><emphasis>:-&gt;</emphasis></para>
-
- <procedure>
-
- <step>
- <para>The <maketarget>fetch</maketarget> target is run. The
- <maketarget>fetch</maketarget> target is responsible for making
- sure that the tarball exists locally in
- <makevar>DISTDIR</makevar>. If <maketarget>fetch</maketarget>
- cannot find the required files in <makevar>DISTDIR</makevar> it
- will look up the URL <makevar>MASTER_SITES</makevar>, which is
- set in the Makefile, as well as our main FTP site at <ulink
- url="ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/">ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/</ulink>,
- where we put sanctioned distfiles as backup. It will then
- attempt to fetch the named distribution file with
- <makevar>FETCH</makevar>, assuming that the requesting site has
- direct access to the Internet. If that succeeds, it will save
- the file in <makevar>DISTDIR</makevar> for future use and
- proceed.</para>
- </step>
-
- <step>
- <para>The <maketarget>extract</maketarget> target is run. It
- looks for your port's distribution file (typically a gzip'd
- tarball) in <makevar>DISTDIR</makevar> and unpacks it into a
- temporary subdirectory specified by <makevar>WRKDIR</makevar>
- (defaults to <filename>work</filename>).</para>
- </step>
-
- <step>
- <para>The <maketarget>patch</maketarget> target is run. First,
- any patches defined in <makevar>PATCHFILES</makevar> are
- applied. Second, if any patch files named
- <filename>patch-<replaceable>*</replaceable></filename> are found in
- <makevar>PATCHDIR</makevar> (defaults to the
- <filename>files</filename> subdirectory), they are applied at
- this time in alphabetical order.</para>
- </step>
-
- <step>
- <para>The <maketarget>configure</maketarget> target is run. This
- can do any one of many different things.</para>
-
- <orderedlist>
- <listitem>
- <para>If it exists, <filename>scripts/configure</filename> is
- run.</para>
- </listitem>
-
- <listitem>
- <para>If <makevar>HAS_CONFIGURE</makevar> or
- <makevar>GNU_CONFIGURE</makevar> is set,
- <filename><makevar>WRKSRC</makevar>/configure</filename> is
- run.</para>
- </listitem>
-
- <listitem>
- <para>If <makevar>USE_IMAKE</makevar> is set,
- <makevar>XMKMF</makevar> (default: <command>xmkmf
- -a</command>) is run.</para>
- </listitem>
- </orderedlist>
- </step>
-
- <step>
- <para>The <maketarget>build</maketarget> target is run. This is
- responsible for descending into the port's private working
- directory (<makevar>WRKSRC</makevar>) and building it. If
- <makevar>USE_GMAKE</makevar> is set, GNU <command>make</command>
- will be used, otherwise the system <command>make</command> will
- be used.</para>
- </step>
- </procedure>
-
- <para>The above are the default actions. In addition, you can define
- targets
- <maketarget>pre-<replaceable>something</replaceable></maketarget> or
- <maketarget>post-<replaceable>something</replaceable></maketarget>,
- or put scripts with those names, in the <filename>scripts</filename>
- subdirectory, and they will be run before or after the default
- actions are done.</para>
-
- <para>For example, if you have a <maketarget>post-extract</maketarget>
- target defined in your Makefile, and a file
- <filename>pre-build</filename> in the <filename>scripts</filename>
- subdirectory, the <maketarget>post-extract</maketarget> target will
- be called after the regular extraction actions, and the
- <filename>pre-build</filename> script will be executed before the
- default build rules are done. It is recommended that you use
- <filename>Makefile</filename> targets if the actions are simple
- enough, because it will be easier for someone to figure out what
- kind of non-default action the port requires.</para>
-
- <para>The default actions are done by the
- <filename>bsd.port.mk</filename> targets
- <maketarget>do-<replaceable>something</replaceable></maketarget>.
- For example, the commands to extract a port are in the target
- <maketarget>do-extract</maketarget>. If you are not happy with the
- default target, you can fix it by redefining the
- <maketarget>do-<replaceable>something</replaceable></maketarget>
- target in your <filename>Makefile</filename>.</para>
-
- <note>
- <para>The <quote>main</quote> targets (e.g.,
- <maketarget>extract</maketarget>,
- <maketarget>configure</maketarget>, etc.) do nothing more than
- make sure all the stages up to that one are completed and call
- the real targets or scripts, and they are not intended to be
- changed. If you want to fix the extraction, fix
- <maketarget>do-extract</maketarget>, but never ever touch
- <maketarget>extract</maketarget>!</para>
- </note>
-
- <para>Now that you understand what goes on when the user types
- <command>make</command>, let us go through the recommended steps to
- create the perfect port.</para>
- </sect1>
-
- <sect1>
- <title>Getting the original sources</title>
-
- <para>Get the original sources (normally) as a compressed tarball
- (<filename><replaceable>foo</replaceable>.tar.gz</filename> or
- <filename><replaceable>foo</replaceable>.tar.Z</filename>) and copy
- it into <makevar>DISTDIR</makevar>. Always use
- <emphasis>mainstream</emphasis> sources when and where you
- can.</para>
-
- <para>If you cannot find a FTP/http site that is well-connected to the
- net, or can only find sites that have irritatingly non-standard
- formats, you might want to put a copy on a reliable FTP or http
- server that you control (e.g., your home page). Make sure you set
- <makevar>MASTER_SITES</makevar> to reflect your choice.</para>
-
- <para>If you cannot find somewhere convenient and reliable to put the
- distfile
- we can <quote>house</quote> it ourselves
- on <hostid>ftp.FreeBSD.org</hostid>.
- The distfile must be placed into
- <filename>~/public_distfiles/</filename> of someone's
- <hostid>freefall</hostid> account.
- Ask the person who commits your port to do this.
- This person will also set <makevar>MASTER_SITES</makevar> to
- <makevar>MASTER_SITE_LOCAL</makevar> and
- <makevar>MASTER_SITE_SUBDIR</makevar> to their
- <hostid>freefall</hostid> username.</para>
-
- <para>If your port's distfile changes all the time for no good reason,
- consider putting the distfile in your home page and listing it as
- the first <makevar>MASTER_SITES</makevar>. This will prevent users
- from getting <errorname>checksum mismatch</errorname> errors, and
- also reduce the workload of maintainers of our FTP site. Also, if
- there is only one master site for the port, it is recommended that
- you house a backup at your site and list it as the second
- <makevar>MASTER_SITES</makevar>.</para>
-
- <para>If your port requires some additional `patches' that are
- available on the Internet, fetch them too and put them in
- <makevar>DISTDIR</makevar>. Do not worry if they come from a site
- other than where you got the main source tarball, we have a way to
- handle these situations (see the description of <link
- linkend="porting-patchfiles">PATCHFILES</link> below).</para>
- </sect1>
-
- <sect1>
- <title>Modifying the port</title>
-
- <para>Unpack a copy of the tarball in a private directory and make
- whatever changes are necessary to get the port to compile properly
- under the current version of FreeBSD. Keep <emphasis>careful
- track</emphasis> of everything you do, as you will be automating
- the process shortly. Everything, including the deletion, addition,
- or modification of files should be doable using an automated script
- or patch file when your port is finished.</para>
-
- <para>If your port requires significant user interaction/customization
- to compile or install, you should take a look at one of Larry Wall's
- classic <application>Configure</application> scripts and perhaps do
- something similar yourself. The goal of the new ports collection is
- to make each port as <quote>plug-and-play</quote> as possible for the
- end-user while using a minimum of disk space.</para>
-
- <note>
- <para>Unless explicitly stated, patch files, scripts, and other
- files you have created and contributed to the FreeBSD ports
- collection are assumed to be covered by the standard BSD copyright
- conditions.</para>
- </note>
- </sect1>
-
- <sect1>
- <title>Patching</title>
-
- <para>In the preparation of the port, files that have been added or
- changed can be picked up with a recursive diff for later feeding to
- patch. Each set of patches you wish to apply should be collected
- into a file named
- <filename>patch-<replaceable>*</replaceable></filename> where
- <replaceable>*</replaceable> denotes the sequence in which the
- patches will be applied &mdash; these are done in
- <emphasis>alphabetical order</emphasis>, thus <literal>aa</literal>
- first, <literal>ab</literal> second and so on. If you wish,
- you can use names that indicate the pathnames of the files that
- are patched, such as <filename>patch-Imakefile</filename> or
- <filename>patch-src-config.h</filename>. These files should
- be stored in <makevar>PATCHDIR</makevar>, from where they will be
- automatically applied. All patches should be relative to
- <makevar>WRKSRC</makevar> (generally the directory your port's
- tarball unpacks itself into, that being where the build is done).
- To make fixes and upgrades easier, you should avoid having more than
- one patch fix the same file (e.g., <filename>patch-aa</filename> and
- <filename>patch-ab</filename> both changing
- <filename><makevar>WRKSRC</makevar>/foobar.c</filename>).</para>
- </sect1>
-
- <sect1>
- <title>Configuring</title>
-
- <para>Include any additional customization commands in your
- <filename>configure</filename> script and save it in the
- <filename>scripts</filename> subdirectory. As mentioned above, you
- can also do this with <filename>Makefile</filename> targets and/or
- scripts with the name <filename>pre-configure</filename> or
- <filename>post-configure</filename>.</para>
- </sect1>
-
- <sect1>
- <title>Handling user input</title>
-
- <para>If your port requires user input to build, configure, or install,
- then set <makevar>IS_INTERACTIVE</makevar> in your Makefile. This
- will allow <quote>overnight builds</quote> to skip your port if the
- user sets the variable <envar>BATCH</envar> in his environment (and
- if the user sets the variable <envar>INTERACTIVE</envar>, then
- <emphasis>only</emphasis> those ports requiring interaction are
- built).</para>
-
- <para>It is also recommended that if there are reasonable default
- answers to the questions, you check the
- <makevar>PACKAGE_BUILDING</makevar> variable and turn off the
- interactive script when it is set. This will allow us to build the
- packages for CDROMs and FTP.</para>
- </sect1>
- </chapter>
-
- <chapter>
- <title>Configuring the Makefile</title>
-
- <para>Configuring the Makefile is pretty simple, and again we suggest
- that you look at existing examples before starting. Also, there is a
- <link linkend="porting-samplem">sample Makefile</link> in this
- handbook, so take a look and please follow the ordering of variables
- and sections in that template to make your port easier for others to
- read.</para>
-
- <para>Now, consider the following problems in sequence as you design
- your new Makefile:</para>
-
- <sect1>
- <title>The original source</title>
-
- <para>Does it live in <makevar>DISTDIR</makevar> as a standard
- gzip'd tarball named something like
- <filename>foozolix-1.2.tar.gz</filename>? If so, you can go on
- to the next step. If not, you should look at overriding any of
- the <makevar>DISTNAME</makevar>, <makevar>EXTRACT_CMD</makevar>,
- <makevar>EXTRACT_BEFORE_ARGS</makevar>,
- <makevar>EXTRACT_AFTER_ARGS</makevar>,
- <makevar>EXTRACT_SUFX</makevar>, or <makevar>DISTFILES</makevar>
- variables, depending on how alien a format your port's
- distribution file is. (The most common case is
- <literal>EXTRACT_SUFX=.tar.Z</literal>, when the tarball is
- condensed by regular <command>compress</command>, not
- <command>gzip</command>.)</para>
-
- <para>In the worst case, you can simply create your own
- <maketarget>do-extract</maketarget> target to override the
- default, though this should be rarely, if ever,
- necessary.</para>
- </sect1>
-
- <sect1>
- <title><makevar>PORTNAME</makevar> and <makevar>PORTVERSION</makevar></title>
-
- <para>You should set <makevar>PORTNAME</makevar> to the
- base name of your port, and <makevar>PORTVERSION</makevar>
- to the version number of the port.</para>
- </sect1>
-
- <sect1>
- <title><makevar>PORTREVISION</makevar> and
- <makevar>PORTEPOCH</makevar></title>
-
- <sect2>
- <title><makevar>PORTREVISION</makevar></title>
-
- <para>The <makevar>PORTREVISION</makevar> variable is a
- monotonically increasing value which is reset to 0 with
- every increase of <makevar>PORTVERSION</makevar> (i.e.
- every time a new official vendor release is made), and
- appended to the package name if non-zero.
- <makevar>PORTREVISION</makevar> is increased each time a
- change is made to the FreeBSD port which significantly
- affects the content or stucture of the derived
- package.</para>
-
- <para>Examples of when PORTREVISION should be bumped:</para>
-
- <itemizedlist>
- <listitem>
- <para>Addition of patches to correct security
- vulnerabilities, bugs, or to add new functionality to
- the FreeBSD port.</para>
- </listitem>
-
- <listitem>
- <para>Changes to the port makefile to enable or disable
- compile-time options in the package.</para>
- </listitem>
-
- <listitem>
- <para>Changes in the packing list or the install-time
- behaviour of the package (e.g. change to a script
- which generates initial data for the package, like ssh
- host keys).</para>
- </listitem>
-
- <listitem>
- <para>Version bump of a port's shared library dependency
- (in this case, someone trying to install the old
- package after installing a newer version of the
- dependency will fail since it will look for the old
- libfoo.x instead of libfoo.(x+1)).</para>
- </listitem>
-
- <listitem>
- <para>Silent changes to the port distfile which have
- significant functional differences, i.e. changes to
- the distfile requiring a correction to
- <filename>distinfo</filename> with no corresponding change to
- <makevar>PORTVERSION</makevar>, where a <command>diff
- -ru</command> of the old and new versions shows
- non-trivial changes to the code.</para>
- </listitem>
- </itemizedlist>
-
- <para>Examples of changes which do not require a
- <makevar>PORTREVISION</makevar> bump:</para>
-
- <itemizedlist>
- <listitem>
- <para>Style changes to the port skeleton with no
- functional change to what appears in the resulting
- package.</para>
- </listitem>
-
- <listitem>
- <para>Changes to <makevar>MASTER_SITES</makevar> or
- other functional changes to the port which do not
- effect the resulting package.</para>
- </listitem>
-
- <listitem>
- <para>Trivial patches to the distfile such as correction
- of typos, which are not important enough that users of
- the package should go to the trouble of
- upgrading.</para>
- </listitem>
-
- <listitem>
- <para>Build fixes which cause a package to become
- compilable where it was previously failing (as long as
- the changes do not introduce any functional change on
- any other platforms on which the port did previously
- build). Since <makevar>PORTREVISION</makevar> reflects
- the content of the package, if no package was
- previously buildable then there is no need to increase
- <makevar>PORTREVISION</makevar> to mark a
- change.</para>
- </listitem>
- </itemizedlist>
-
- <para>A rule of thumb is to ask yourself whether a change
- committed to a port is something which someone, somewhere,
- would benefit from having (either because of an
- enhancement, fix, or by virtue that the new package will
- actually work for them). If yes, the
- <makevar>PORTREVISION</makevar> should be bumped so that
- automated tools (e.g. <command>pkg_version</command>)
- will highlight the fact that a new package is
- available.</para>
- </sect2>
-
- <sect2>
- <title><makevar>PORTEPOCH</makevar></title>
-
- <para>From time to time a software vendor or FreeBSD porter
- will do something silly and release a version of their
- software which is actually numerically less than the
- previous version. An example of this is a port which goes
- from foo-20000801 to foo-1.0 (the former will be
- incorrectly treated as a newer version since 20000801 is a
- numerically greater value than 1).</para>
-
- <para>In situations such as this, the
- <makevar>PORTEPOCH</makevar> version should be increased.
- If <makevar>PORTEPOCH</makevar> is nonzero it is appended
- to the package name as described in section 0 above.
- <makevar>PORTEPOCH</makevar> is never decreased or reset
- to zero, because that would cause comparison to a package
- from an earlier epoch to fail (i.e. the package would not
- be detected as out of date): the new version number (e.g.
- <literal>1.0,1</literal> in the above example) is still
- numerically less than the previous version (20000801), but
- the <literal>,1</literal> suffix is treated specially by
- automated tools and found to be greater than the implied
- suffix ",0" on the earlier package.</para>
-
- <para>It is expected that <makevar>PORTEPOCH</makevar> will
- not be used for the majority of ports, and that sensible
- use of <makevar>PORTVERSION</makevar> can often pre-empt
- it becoming necessary if a future release of the software
- should change the version structure. However, care is
- needed by FreeBSD porters when a vendor release is made
- without an official version number - such as a code
- "snapshot" release. The temptation is to label the
- release with the release date, which will cause problems
- as in the example above when a new "official" release is
- made.</para>
-
- <para>For example, if a snapshot release is made on the date
- 20000917, and the previous version of the software was
- version 1.2, the snapshot release should be given a
- <makevar>PORTVERSION</makevar> of 1.2.20000917 or similar,
- not 20000917, so that the succeeding release, say 1.3, is
- still a numerically greater value.</para>
- </sect2>
-
- <sect2>
- <title>Example of <makevar>PORTREVISION</makevar> and
- <makevar>PORTEPOCH</makevar> usage</title>
-
- <para>The gtkmumble port, version 0.10, is committed to the
- ports collection.</para>
-
- <programlisting>PORTNAME= gtkmumble
-PORTVERSION= 0.10</programlisting>
-
- <para><makevar>PKGNAME</makevar> becomes
- <literal>gtkmumble-0.10</literal>.</para>
-
- <para>A security hole is discovered which requires a local
- FreeBSD patch. <makevar>PORTREVISION</makevar> is bumped
- accordingly.</para>
-
- <programlisting>PORTNAME= gtkmumble
-PORTVERSIOn= 0.10
-PORTREVISION= 1</programlisting>
-
- <para><makevar>PKGNAME</makevar> becomes
- <literal>gtkmumble-0.10_1</literal></para>
-
- <para>A new version is released by the vendor, numbered 0.2
- (it turns out the author actually intended
- <literal>0.10</literal> to actually mean
- <literal>0.1.0</literal>, not <quote>what comes after
- 0.9</quote> - oops, too late now). Since the new minor
- version <literal>2</literal> is numerically less than the
- previous version <literal>10</literal> the
- <makevar>PORTEPOCH</makevar> must be bumped to manually
- force the new package to be detected as "newer". Since it
- is a new vendor release of the code,
- <makevar>PORTREVISION</makevar> is reset to 0 (or removed
- from the makefile).</para>
-
- <programlisting>PORTNAME= gtkmumble
-PORTVERSION= 0.2
-PORTEPOCH= 1</programlisting>
-
- <para><makevar>PKGNAME</makevar> becomes
- <literal>gtkmumble-0.2,1</literal></para>
-
- <para>The next release is 0.3. Since
- <makevar>PORTEPOCH</makevar> never decreases, the version
- variables are now:</para>
-
- <programlisting>PORTNAME= gtkmumble
-PORTVERSION= 0.3
-PORTEPOCH= 1</programlisting>
-
- <para><makevar>PKGNAME</makevar> becomes
- <literal>gtkmumble-0.3,1</literal></para>
-
- <note>
- <para>If <makevar>PORTEPOCH</makevar> were reset
- to <literal>0</literal> with this upgrade, someone who had
- installed the gtkmumble-0.10_1 package would not detect
- the gtkmumble-0.3 package as newer, since
- <literal>3</literal> is still numerically less than
- <literal>10</literal>.</para>
- </note>
- </sect2>
- </sect1>
-
- <sect1>
- <title><makevar>PKGNAMEPREFIX</makevar> and <makevar>PKGNAMESUFFIX</makevar></title>
-
- <para>Two optional variables, <makevar>PKGNAMEPREFIX</makevar> and
- <makevar>PKGNAMESUFFIX</makevar>, are combined with
- <makevar>PORTNAME</makevar> and
- <makevar>PORTVERSION</makevar> to
- form <makevar>PKGNAME</makevar> as
- <literal>${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}</literal>.
- Make sure this conforms to our <link
- linkend="porting-pkgname">guidelines for a good package
- name</link>. In particular, you are not allowed to use a
- hyphen (<literal>-</literal>) in
- <makevar>PORTVERSION</makevar>. Also, if the package name
- has the <replaceable>language-</replaceable> or the
- <replaceable>compiled.specifics</replaceable> part, use
- <makevar>PKGNAMEPREFIX</makevar> and
- <makevar>PKGNAMESUFFIX</makevar>, respectively. Do not make
- them part of <makevar>PORTNAME</makevar>.</para>
- </sect1>
-
- <sect1>
- <title><makevar>DISTNAME</makevar></title>
-
- <para><makevar>DISTNAME</makevar> is the name of the port as
- called by the authors of the software.
- <makevar>DISTNAME</makevar> defaults to
- <literal>${PORTNAME}-${PORTVERSION}</literal>, so override it if necessary.
- <makevar>DISTNAME</makevar> is only used in two places.
- First, the distribution file list
- (<makevar>DISTFILES</makevar>) defaults to
- <makevar>${DISTNAME}</makevar><makevar>${EXTRACT_SUFX}</makevar>.
- Second, the distribution file is expected to extract into a
- subdirectory named <makevar>WRKSRC</makevar>, which defaults
- to <filename>work/<makevar>${DISTNAME}</makevar></filename>.</para>
-
- <note>
- <para><makevar>PKGNAMEPREFIX</makevar> and
- <makevar>PKGNAMESUFFIX</makevar> do not affect
- <makevar>DISTNAME</makevar>. Also note that when
- <makevar>WRKSRC</makevar> is equal to
- <filename>work/<makevar>${PORTNAME}-${PORTVERSION}</makevar></filename>
- while the original source archive is named something other than
- <makevar>${PORTNAME}-${PORTVERSION}${EXTRACT_SUFX}</makevar>,
- you should probably leave <makevar>DISTNAME</makevar>
- alone&mdash; you are better off defining
- <makevar>DISTFILES</makevar> than having to set both
- <makevar>DISTNAME</makevar> and <makevar>WRKSRC</makevar>
- (and possibly <makevar>EXTRACT_SUFX</makevar>).</para>
- </note>
- </sect1>
-
- <sect1>
- <title><makevar>CATEGORIES</makevar></title>
-
- <para>When a package is created, it is put under
- <filename>/usr/ports/packages/All</filename> and links are made from
- one or more subdirectories of
- <filename>/usr/ports/packages</filename>. The names of these
- subdirectories are specified by the variable
- <makevar>CATEGORIES</makevar>. It is intended to make life easier
- for the user when he is wading through the pile of packages on the
- FTP site or the CDROM. Please take a look at the existing <link
- linkend="porting-categories">categories</link> and pick the ones
- that are suitable for your port.</para>
-
- <para>This list also determines where in the ports tree the port is
- imported. If you put more than one category here, it is assumed
- that the port files will be put in the subdirectory with the name in
- the first category. See the <link
- linkend="porting-categories">categories</link> section for more
- discussion about how to pick the right categories.</para>
-
- <para>If your port truly belongs to something that is different from
- all the existing ones, you can even create a new category name. In
- that case, please send mail to the &a.ports; to propose a new
- category.</para>
- </sect1>
-
- <sect1>
- <title><makevar>MASTER_SITES</makevar></title>
-
- <para>Record the directory part of the FTP/http-URL pointing at the
- original tarball in <makevar>MASTER_SITES</makevar>. Do not forget
- the trailing slash (<filename>/</filename>)!</para>
-
- <para>The <command>make</command> macros will try to use this
- specification for grabbing the distribution file with
- <makevar>FETCH</makevar> if they cannot find it already on the
- system.</para>
-
- <para>It is recommended that you put multiple sites on this list,
- preferably from different continents. This will safeguard against
- wide-area network problems, and we are even planning to add support
- for automatically determining the closest master site and fetching
- from there!</para>
-
- <para>If the original tarball is part of one of the popular
- archives such as X-contrib, GNU, or Perl CPAN, you may be able
- refer to those sites in an easy compact form using
- <makevar>MASTER_SITE_<replaceable>*</replaceable></makevar>
- (e.g., <makevar>MASTER_SITE_XCONTRIB</makevar> and
- <makevar>MASTER_SITE_PERL_GNU</makevar>). Simply set
- <makevar>MASTER_SITES</makevar> to one of these variables and
- <makevar>MASTER_SITE_SUBDIR</makevar> to the path within the
- archive. Here is an example:</para>
-
- <programlisting>MASTER_SITES= ${MASTER_SITE_XCONTRIB}
-MASTER_SITE_SUBDIR= applications</programlisting>
-
- <para>These variables are defined in
- <filename>/usr/ports/Mk/bsd.sites.mk</filename>. There are
- new archives added all the time, so make sure to check the
- latest version of this file before submitting a port.</para>
-
- <para>The user can also set the <makevar>MASTER_SITE_*</makevar>
- variables in <filename>/etc/make.conf</filename> to override our
- choices, and use their favorite mirrors of these popular archives
- instead.</para>
- </sect1>
-
- <sect1 id="porting-patchfiles">
- <title><makevar>PATCHFILES</makevar></title>
-
- <para>If your port requires some additional patches that are available
- by FTP or http, set <makevar>PATCHFILES</makevar> to the names of
- the files and <makevar>PATCH_SITES</makevar> to the URL of the
- directory that contains them (the format is the same as
- <makevar>MASTER_SITES</makevar>).</para>
-
- <para>If the patch is not relative to the top of the source tree
- (i.e., <makevar>WRKSRC</makevar>) because it contains some extra
- pathnames, set <makevar>PATCH_DIST_STRIP</makevar> accordingly. For
- instance, if all the pathnames in the patch have an extra
- <literal>foozolix-1.0/</literal> in front of the filenames, then set
- <literal>PATCH_DIST_STRIP=-p1</literal>.</para>
-
- <para>Do not worry if the patches are compressed; they will be
- decompressed automatically if the filenames end with
- <filename>.gz</filename> or <filename>.Z</filename>.</para>
-
- <para>If the patch is distributed with some other files, such as
- documentation, in a gzip'd tarball, you cannot just use
- <makevar>PATCHFILES</makevar>. If that is the case, add the name
- and the location of the patch tarball to
- <makevar>DISTFILES</makevar> and <makevar>MASTER_SITES</makevar>.
- Then, use the <makevar>EXTRA_PATCHES</makevar> variable to
- point to those files and <filename>bsd.port.mk</filename>
- will automatically apply them for you. In particular, do
- <emphasis>not</emphasis> copy patch files into the
- <makevar>PATCHDIR</makevar> directory&mdash;that directory may
- not be writable.</para>
-
- <note>
- <para>Note that the tarball will have been extracted alongside the
- regular source by then, so there is no need to explicitly extract
- it if it is a regular gzip'd or compress'd tarball. If you do the
- latter, take extra care not to overwrite something that already
- exists in that directory. Also, do not forget to add a command to
- remove the copied patch in the <maketarget>pre-clean</maketarget>
- target.</para>
- </note>
- </sect1>
-
- <sect1>
- <title><makevar>MAINTAINER</makevar></title>
-
- <para>Set your mail-address here. Please. <!-- smiley
- --><emphasis>:-)</emphasis></para>
-
- <para>For a detailed description of the responsibilities of maintainers,
- refer to the <ulink url="../handbook/policies.html#POLICIES-MAINTAINER">MAINTAINER on
- Makefiles</ulink> section.</para>
- </sect1>
-
- <sect1>
- <title>Dependencies</title>
-
- <para>Many ports depend on other ports. There are five variables that
- you can use to ensure that all the required bits will be on the
- user's machine. There are also some pre-supported dependency
- variables for common cases, plus a few more to control the behaviour
- of dependencies.</para>
-
- <sect2>
- <title><makevar>LIB_DEPENDS</makevar></title>
-
- <para>This variable specifies the shared libraries this port depends
- on. It is a list of
- <replaceable>lib</replaceable>:<replaceable>dir</replaceable><optional><replaceable>:target</replaceable></optional>
- tuples where <replaceable>lib</replaceable> is the name of the
- shared library, <replaceable>dir</replaceable> is the
- directory in which to find it in case it is not available, and
- <replaceable>target</replaceable> is the target to call in that
- directory. For example, <programlisting> LIB_DEPENDS=
- jpeg.9:${PORTSDIR}/graphics/jpeg:install</programlisting>
- will check for a shared jpeg library with major version 9, and
- descend into the <filename>graphics/jpeg</filename> subdirectory
- of your ports tree to build and install it if it is not found.
- The <replaceable>target</replaceable> part can be omitted if it is
- equal to <makevar>DEPENDS_TARGET</makevar> (which defaults to
- <literal>install</literal>).</para>
-
- <note>
- <para>The <replaceable>lib</replaceable> part is an argument given
- to <command>ldconfig -r | grep -wF</command>. There shall be no
- regular expressions in this variable.</para>
- </note>
-
- <para>The dependency is checked twice, once from within the
- <maketarget>extract</maketarget> target and then from within the
- <maketarget>install</maketarget> target. Also, the name of the
- dependency is put into the package so that
- <command>pkg_add</command> will automatically install it if it is
- not on the user's system.</para>
- </sect2>
-
- <sect2>
- <title><makevar>RUN_DEPENDS</makevar></title>
-
- <para>This variable specifies executables or files this port depends
- on during run-time. It is a list of
- <replaceable>path</replaceable>:<replaceable>dir</replaceable><optional><replaceable>:target</replaceable></optional>
- tuples where <replaceable>path</replaceable> is the name of the
- executable or file, <replaceable>dir</replaceable> is the
- directory in which to find it in case it is not available, and
- <replaceable>target</replaceable> is the target to call in that
- directory. If <replaceable>path</replaceable> starts with a slash
- (<literal>/</literal>), it is treated as a file and its existence
- is tested with <command>test -e</command>; otherwise, it is
- assumed to be an executable, and <command>which -s</command> is
- used to determine if the program exists in the user's search
- path.</para>
-
- <para>For example,</para>
-
- <programlisting>RUN_DEPENDS= ${PREFIX}/etc/innd:${PORTSDIR}/news/inn \
- wish8.0:${PORTSDIR}/x11-toolkits/tk80</programlisting>
-
- <para>will check if the file or directory
- <filename>/usr/local/etc/innd</filename> exists, and build and
- install it from the <filename>news/inn</filename> subdirectory of
- the ports tree if it is not found. It will also see if an
- executable called <command>wish8.0</command> is in your search
- path, and descend into the <filename>x11-toolkits/tk80</filename>
- subdirectory of your ports tree to build and install it if it is
- not found.</para>
-
- <note>
- <para>In this case, <command>innd</command> is actually an
- executable; if an executable is in a place that is not expected
- to be in a normal user's search path, you should use the full
- pathname.</para>
- </note>
-
- <para>The dependency is checked from within the
- <maketarget>install</maketarget> target. Also, the name of the
- dependency is put in to the package so that
- <command>pkg_add</command> will automatically install it if it is
- not on the user's system. The <replaceable>target</replaceable>
- part can be omitted if it is the same as
- <makevar>DEPENDS_TARGET</makevar>.</para>
- </sect2>
-
- <sect2>
- <title><makevar>BUILD_DEPENDS</makevar></title>
-
- <para>This variable specifies executables or files this port
- requires to build. Like <makevar>RUN_DEPENDS</makevar>, it is a
- list of
- <replaceable>path</replaceable>:<replaceable>dir</replaceable><optional><replaceable>:target</replaceable></optional>
- tuples. For example, <programlisting> BUILD_DEPENDS=
- unzip:${PORTSDIR}/archivers/unzip</programlisting> will check
- for an executable called <command>unzip</command>, and descend
- into the <filename>archivers/unzip</filename> subdirectory of your
- ports tree to build and install it if it is not found.</para>
-
- <note>
- <para><quote>build</quote> here means everything from extraction to
- compilation. The dependency is checked from within the
- <maketarget>extract</maketarget> target. The
- <replaceable>target</replaceable> part can be omitted if it is
- the same as <makevar>DEPENDS_TARGET</makevar></para>
- </note>
- </sect2>
-
- <sect2>
- <title><makevar>FETCH_DEPENDS</makevar></title>
-
- <para>This variable specifies executables or files this port
- requires to fetch. Like the previous two, it is a list of
- <replaceable>path</replaceable>:<replaceable>dir</replaceable><optional><replaceable>:target</replaceable></optional>
- tuples. For example, <programlisting> FETCH_DEPENDS=
- ncftp2:${PORTSDIR}/net/ncftp2</programlisting> will check for an
- executable called <command>ncftp2</command>, and descend into the
- <filename>net/ncftp2</filename> subdirectory of your ports tree to
- build and install it if it is not found.</para>
-
- <para>The dependency is checked from within the
- <maketarget>fetch</maketarget> target. The
- <replaceable>target</replaceable> part can be omitted if it is the
- same as <makevar>DEPENDS_TARGET</makevar>.</para>
- </sect2>
-
- <sect2>
- <title><makevar>DEPENDS</makevar></title>
-
- <para>If there is a dependency that does not fall into either of the
- above four categories, or your port requires having the source of
- the other port extracted in addition to having it installed,
- then use this variable. This is a list of
- <replaceable>dir</replaceable><optional><replaceable>:target</replaceable></optional>,
- as there is nothing to check, unlike the previous four. The
- <replaceable>target</replaceable> part can be omitted if it is the
- same as <makevar>DEPENDS_TARGET</makevar>.</para>
- </sect2>
-
- <sect2>
- <title>Common dependency variables</title>
-
- <para>Define <literal>USE_XLIB=yes</literal> if your port requires
- the X Window System to be installed (it is implied by
- <makevar>USE_IMAKE</makevar>). Define
- <literal>USE_GMAKE=yes</literal> if your port requires GNU
- <command>make</command> instead of BSD <command>make</command>.
- Define <literal>USE_AUTOCONF=yes</literal> if your port requires
- GNU autoconf to be run. Define <literal>USE_QT=yes</literal> if
- your port uses the latest qt toolkit. Use
- <literal>USE_PERL5=yes</literal> if your port requires version 5
- of the perl language. (The last is especially important since
- some versions of FreeBSD have perl5 as part of the base system
- while others do not.)</para>
- </sect2>
-
- <sect2>
- <title>Notes on dependencies</title>
-
- <para>As mentioned above, the default target to call when a
- dependency is required is <maketarget>DEPENDS_TARGET</maketarget>.
- It defaults to <literal>install</literal>. This is a user
- variable; it is never defined in a port's
- <filename>Makefile</filename>. If your port needs a special way
- to handle a dependency, use the <literal>:target</literal> part of
- the <makevar>*_DEPENDS</makevar> variables instead of redefining
- <makevar>DEPENDS_TARGET</makevar>.</para>
-
- <para>When you type <command>make clean</command>, its dependencies
- are automatically cleaned too. If you do not wish this to happen,
- define the variable <makevar>NOCLEANDEPENDS</makevar> in your
- environment.</para>
-
- <para>To depend on another port unconditionally, use the
- variable <makevar>${NONEXISTENT}</makevar> as the first field
- of <makevar>BUILD_DEPENDS</makevar> or
- <makevar>RUN_DEPENDS</makevar>. Use this only when you need to
- the to get to the source of the other port. You can often save
- compilation time by specifying the target too. For
- instance
-
- <programlisting>BUILD_DEPENDS= ${NONEXISTENT}:${PORTSDIR}/graphics/jpeg:extract</programlisting>
-
- will always descend to the JPEG port and extract it.</para>
-
- <para>Do not use <makevar>DEPENDS</makevar> unless there is no other
- way the behaviour you want can be accomplished. It will cause the
- other port to always be built (and installed, by default), and the
- dependency will go into the packages as well. If this is really
- what you need, you should probably write it as
- <literal>BUILD_DEPENDS</literal> and
- <literal>RUN_DEPENDS</literal> instead&mdash;at least the
- intention will be clear.</para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Optional dependencies</title>
-
- <para>Some large applications can be built in a number of
- configurations, adding functionality if one of a number of
- libraries or applications is available. Since not all users
- want those libraries or applications, the ports system
- provides hooks that the port author can use to decide which
- configuration should be built. Supporting these properly will
- make uses happy, and effectively provide 2 or more ports for the
- price of one.</para>
-
- <para>The easiest of these to use is
- <makevar>WITHOUT_X11</makevar>. If the port can be built both
- with and without X support, then it should normally be built
- with X support. If <makevar>WITHOUT_X11</makevar> is defined,
- then the version that does not have X support should be
- built.</para>
-
- <para>Various parts of GNOME have such knobs, though they are
- slightly more difficult to use. The variables to use in the
- <filename>Makefile</filename> are <makevar>WANT_*</makevar>
- and <makevar>HAVE_*</makevar>. If the application can be
- built both with or without one of the dependencies listed
- below, then the <filename>Makefile</filename> should set
- <makevar>WANT_PKG</makevar>, and should build the version that
- uses <makevar>PKG</makevar> if <makevar>HAVE_PKG</makevar>
- is defined.</para>
-
- <para>The <makevar>WANT_*</makevar> variables currently
- supported this way are <makevar>WANT_GLIB</makevar>,
- <makevar>WANT_GTK</makevar>, <makevar>WANT_ESOUND</makevar>,
- <makevar>WANT_IMLIB</makevar>, and
- <makevar>WANT_GNOME</makevar>.</para>
- </sect1>
-
- <sect1>
- <title>Building mechanisms</title>
-
- <para>If your package uses GNU <command>make</command>, set
- <literal>USE_GMAKE=yes</literal>. If your package uses
- <command>configure</command>, set
- <literal>HAS_CONFIGURE=yes</literal>. If your package uses GNU
- <command>configure</command>, set
- <literal>GNU_CONFIGURE=yes</literal> (this implies
- <literal>HAS_CONFIGURE</literal>). If you want to give some extra
- arguments to <command>configure</command> (the default argument list
- <literal>--prefix=&dollar;{PREFIX}</literal> for GNU
- <command>configure</command> and empty for non-GNU
- <command>configure</command>), set those extra arguments in
- <makevar>CONFIGURE_ARGS</makevar>. If your package uses GNU
- <command>autoconf</command>, set
- <literal>USE_AUTOCONF=yes</literal>. This implies
- <makevar>GNU_CONFIGURE</makevar>, and will cause
- <command>autoconf</command> to be run before
- <command>configure</command>.</para>
-
- <para>If your package is an X application that creates
- <filename>Makefile</filename>s from <filename>Imakefile</filename>s
- using <command>imake</command>, then set
- <literal>USE_IMAKE=yes</literal>. This will cause the configure
- stage to automatically do an <command>xmkmf -a</command>. If the
- <option>-a</option> flag is a problem for your port, set
- <literal>XMKMF=xmkmf</literal>. If the port uses
- <command>imake</command> but does not understand the
- <maketarget>install.man</maketarget> target,
- <literal>NO_INSTALL_MANPAGES=yes</literal> should be set. In
- addition, the author of the original port should be shot. <!--
- smiley --><emphasis>:-&gt;</emphasis></para>
-
- <para>If your port's source <filename>Makefile</filename> has
- something else than <maketarget>all</maketarget> as the main build
- target, set <makevar>ALL_TARGET</makevar> accordingly. Same goes
- for <maketarget>install</maketarget> and
- <makevar>INSTALL_TARGET</makevar>.</para>
- </sect1>
- </chapter>
-
- <chapter>
- <title>Special considerations</title>
-
- <para>There are some more things you have to take into account when you
- create a port. This section explains the most common of those.</para>
-
- <sect1 id="porting-shlibs">
- <title>Shared Libraries</title>
-
- <para>If your port installs one or more shared libraries, define a
- <makevar>INSTALLS_SHLIB</makevar> make variable, which will instruct
- a <filename>bsd.port.mk</filename> to run
- <literal>&dollar;{LDCONFIG} -m</literal> on the directory where the
- new library is installed (usually
- <filename><makevar>PREFIX</makevar>/lib</filename>) during
- <maketarget>post-install</maketarget> target to register it into the
- shared library cache. This variable, when defined, will also
- facilitate addition of an appropriate
- <literal>@exec /sbin/ldconfig -m</literal> and
- <literal>@unexec /sbin/ldconfig -R</literal> pair into your
- <filename>pkg-plist</filename> file, so that a user who installed
- the package can start using the shared library immediately and
- deinstallation will not cause the system to still believe the
- library is there.</para>
-
- <para>If you need, you can override default location where the new
- library is installed by defining <makevar>LDCONFIG_DIRS</makevar>
- make variable, which should contain a list of directories into which
- shared libraries are to be installed. For example if your port
- installs shared libraries into
- <filename><makevar>PREFIX</makevar>/lib/foo</filename> and
- <filename><makevar>PREFIX</makevar>/lib/bar</filename> directories
- you could use the following in your
- <filename>Makefile</filename>:</para>
-
- <programlisting>INSTALLS_SHLIB= yes
-LDCONFIG_DIRS= %%PREFIX%%/lib/foo %%PREFIX%%/lib/bar</programlisting>
-
- <para>Note that content of <makevar>LDCONFIG_DIRS</makevar> is passed
- through &man.sed.1; just like the rest of <filename>pkg-plist</filename>,
- so <makevar>PLIST_SUB</makevar> substitutions also apply here. It is
- recommended that you use <literal>%%PREFIX%%</literal> for
- <makevar>PREFIX</makevar>, <literal>%%LOCALBASE%%</literal> for
- <makevar>LOCALBASE</makevar> and <literal>%%X11BASE%%</literal> for
- <makevar>X11BASE</makevar>.</para>
- </sect1>
- </chapter>
-
-<!--
-
- <chapter>
- <title>ELF support</title>
-
- <para>Since FreeBSD changed to an ELF binary format shortly after
- 3.0-RELEASE, we need to convert many ports that build shared
- libraries to support ELF. Complicating this task is that a 3.0
- system can run as both ELF and a.out, and we wish to unofficially
- support the 2.2 branch as long as possible. Below are the guidelines on
- how to convert a.out only ports to support both a.out and ELF
- compilation.</para>
-
- <para>Some part of this list is only applicable during the conversion,
- but will be left here for a while for reference in case you have come
- across some old port you wish to upgrade.</para>
-
- <sect1>
- <title>Moving a.out libraries out of the way</title>
-
- <para>Any a.out libraries should be moved out of
- <filename>/usr/local/lib</filename> and similar to an
- <filename>aout</filename> subdirectory. (If you do not move them out
- of the way, ELF ports will happily overwrite a.out libraries.) The
- <maketarget>move-aout-libs</maketarget> target in the 3.0-CURRENT
- <filename>src/Makefile</filename> (called from
- <maketarget>aout-to-elf</maketarget>) will do this for you. It will
- only move a.out libs so it is safe to call it on a system with both
- ELF and a.out libs in the standard directories.</para>
- </sect1>
-
- <sect1>
- <title>Format</title>
-
- <para>The ports tree will build packages in the format the machine is
- in. This means a.out for 2.2 and a.out or ELF for 3.0 depending on
- what <command>`objformat`</command> returns. Also, once users move
- a.out libraries to a subdirectory, building a.out libraries will be
- unsupported. (I.e., it may still work if you know what you are
- doing, but you are on your own.)</para>
-
- <note>
- <para>If a port only works for a.out, set
- <makevar>BROKEN_ELF</makevar> to a string describing the reason
- why. Such ports will be skipped during a build on an ELF
- system.</para>
- </note>
- </sect1>
-
- <sect1>
- <title><makevar>PORTOBJFORMAT</makevar></title>
-
- <para><filename>bsd.port.mk</filename> will set
- <makevar>PORTOBJFORMAT</makevar> to <literal>aout</literal> or
- <literal>elf</literal> and export it in the environments
- <envar>CONFIGURE_ENV</envar>, <envar>SCRIPTS_ENV</envar> and
- <envar>MAKE_ENV</envar>. (It's always going to be
- <literal>aout</literal> in 2.2-STABLE). It is also passed to
- <maketarget>PLIST_SUB</maketarget> as
- <literal>PORTOBJFORMAT=${PORTOBJFORMAT}</literal>. (See comment on
- <literal>ldconfig</literal> lines below.)</para>
-
- <para>The variable is set using this line in
- <filename>bsd.port.mk</filename>:</para>
-
- <programlisting>PORTOBJFORMAT!= test -x /usr/bin/objformat && /usr/bin/objformat || echo aout</programlisting>
-
- <para>Ports' make processes should use this variable to decide what to
- do. However, if the port's <filename>configure</filename> script
- already automatically detects an ELF system, it is not necessary to
- refer to <makevar>PORTOBJFORMAT</makevar>.</para>
- </sect1>
-
- <sect1>
- <title>Building shared libraries</title>
-
- <para>The following are differences in handling shared libraries for
- a.out and ELF.</para>
-
- <itemizedlist>
- <listitem>
- <para>Shared library versions</para>
-
- <para>An ELF shared library should be called
- <filename>libfoo.so.<replaceable>M</replaceable></filename>
- where <replaceable>M</replaceable> is the single version number,
- and an a.out library should be called
- <filename>libfoo.so.<replaceable>M</replaceable>.<replaceable>N</replaceable></filename>
- where <replaceable>M</replaceable> is the major version and
- <replaceable>N</replaceable> is the minor version number.
- Do not mix those; <emphasis>never</emphasis> install an ELF
- shared library called
- <filename>libfoo.so.<replaceable>N</replaceable>.<replaceable>M</replaceable></filename>
- or an a.out shared library (or symlink) called
- <filename>libfoo.so.<replaceable>N</replaceable></filename>.</para>
- </listitem>
-
- <listitem>
- <para>Linker command lines</para>
-
- <para>Assuming <command>cc -shared</command> is used rather than
- <command>ld</command> directly, the only difference is that you
- need to add
- <option>-Wl,-<replaceable>soname,libfoo.so.M</replaceable></option>
- on the command line for ELF.</para>
- </listitem>
- </itemizedlist>
-
- <para>You need to install a symlink from
- <filename>libfoo.so</filename> to
- <filename>libfoo.so.<replaceable>N</replaceable></filename> to make
- ELF linkers happy. Since it should be listed in
- <filename>pkg-plist</filename> too, and it won't hurt in the a.out case
- (some ports even require the link for dynamic loading), you should
- just make this link regardless of the setting of
- <makevar>PORTOBJFORMAT</makevar>.</para>
- </sect1>
-
- <sect1>
- <title><makevar>LIB_DEPENDS</makevar></title>
-
- <para>All port Makefiles are edited to remove minor numbers from
- <makevar>LIB_DEPENDS</makevar>, and also to have the regexp support
- removed. (E.g., <literal>foo\\.1\\.\\(33|40\\)</literal> becomes
- <literal>foo.2</literal>.) They will be matched using <command>grep
- -wF</command>.</para>
- </sect1>
-
- <sect1>
- <title><filename>pkg-plist</filename></title>
-
- <para><filename>pkg-plist</filename> should contain the short (ELF) shlib
- names if the a.out minor number is zero, and the long (a.out) names
- otherwise. <filename>bsd.port.mk</filename> will automatically add
- <literal>.0</literal> to the end of short shlib lines if
- <makevar>PORTOBJFORMAT</makevar> equals <literal>aout</literal>, and
- will delete the minor number from long shlib names if
- <makevar>PORTOBJFORMAT</makevar> equals
- <literal>elf</literal>.</para>
-
- <para>In cases where you really need to install shlibs with two
- versions on an ELF system or those with one version on an a.out
- system (for instance, ports that install compatibility libraries for
- other operating systems), define the variable
- <makevar>NO_FILTER_SHLIBS</makevar>. This will turn off the editing
- of <filename>pkg-plist</filename> mentioned in the previous
- paragraph.</para>
- </sect1>
-
- <sect1>
- <title><literal>ldconfig</literal></title>
-
- <para>The <literal>ldconfig</literal> line in Makefiles should
- read:</para>
-
- <programlisting>${SETENV} OBJFORMAT=${PORTOBJFORMAT} ${LDCONFIG} -m ....</programlisting>
-
- <para>In <filename>pkg-plist</filename> it should read;</para>
-
- <programlisting>@exec /usr/bin/env OBJFORMAT=%%PORTOBJFORMAT%% /sbin/ldconfig -m ...
-@unexec /usr/bin/env OBJFORMAT=%%PORTOBJFORMAT%% /sbin/ldconfig -R</programlisting>
-
- <para>This is to ensure that the correct <command>ldconfig</command>
- will be called depending on the format of the package, not the
- default format of the system.</para>
- </sect1>
- </chapter>
-
--->
-
- <chapter id="porting-masterdir">
- <title><makevar>MASTERDIR</makevar></title>
-
- <para>If your port needs to build slightly different versions of
- packages by having a variable (for instance, resolution, or paper
- size) take different values, create one subdirectory per package to
- make it easier for users to see what to do, but try to share as many
- files as possible between ports. Typically you only need a very short
- <filename>Makefile</filename> in all but one of the directories if you
- use variables cleverly. In the sole <filename>Makefiles</filename>,
- you can use <makevar>MASTERDIR</makevar> to specify the directory
- where the rest of the files are. Also, use a variable as part of
- <link linkend="porting-pkgname"><makevar>PKGNAMESUFFIX</makevar></link> so
- the packages will have different names.</para>
-
- <para>This will be best demonstrated by an example. This is part of
- <filename>japanese/xdvi300/Makefile</filename>;</para>
-
- <programlisting>PORTNAME= xdvi
-PORTVERSION= 17
-PKGNAMEPREFIX= ja-
-PKGNAMESUFFIX= ${RESOLUTION}
- :
-# default
-RESOLUTION?= 300
-.if ${RESOLUTION} != 118 && ${RESOLUTION} != 240 && \
- ${RESOLUTION} != 300 && ${RESOLUTION} != 400
- @${ECHO} "Error: invalid value for RESOLUTION: \"${RESOLUTION}\""
- @${ECHO} "Possible values are: 118, 240, 300 (default) and 400."
- @${FALSE}
-.endif</programlisting>
-
- <para><filename>japanese/xdvi300</filename> also has all the regular
- patches, package files, etc. If you type <command>make</command>
- there, it will take the default value for the resolution (300) and
- build the port normally.</para>
-
- <para>As for other resolutions, this is the <emphasis>entire</emphasis>
- <filename>xdvi118/Makefile</filename>:</para>
-
- <programlisting>RESOLUTION= 118
-MASTERDIR= ${.CURDIR}/../xdvi300
-
-.include ${MASTERDIR}/Makefile</programlisting>
-
- <para>(<filename>xdvi240/Makefile</filename> and
- <filename>xdvi400/Makefile</filename> are similar). The
- <makevar>MASTERDIR</makevar> definition tells
- <filename>bsd.port.mk</filename> that the regular set of
- subdirectories like <makevar>FILESDIR</makevar> and
- <makevar>SCRIPTDIR</makevar> are to be found under
- <filename>xdvi300</filename>. The <literal>RESOLUTION=118</literal>
- line will override the <literal>RESOLUTION=300</literal> line in
- <filename>xdvi300/Makefile</filename> and the port will be built with
- resolution set to 118.</para>
- </chapter>
-
- <chapter>
- <title>Shared library versions</title>
-
- <para>Please read our <ulink url="../handbook/policies-shlib.html">policy on
- shared library versioning</ulink> to understand what to do with
- shared library versions in general. Do not blindly assume software
- authors know what they are doing; many of them do not. It is very
- important that these details are carefully considered, as we have
- quite a unique situation where we are trying to have dozens of
- potentially incompatible software pairs co-exist. Careless port
- imports have caused great trouble regarding shared libraries in the
- past (ever wondered why the port <filename>jpeg-6b</filename> has a
- shared library version of 9?). If in doubt, send a message to the
- &a.ports;. Most of the time, your job ends by determining the right
- shared library version and making appropriate patches to implement
- it.</para>
-
-<!--
- <para>However, if there is a port which is a different version of the
- same software already in the tree, the situation is much more complex.
- In short, the FreeBSD implementation does not allow the user to
- specify to the linker which version of shared library to link against
- (the linker will always pick the highest numbered version). This
- means, if there is a <filename>libfoo.so.3.2</filename> and
- <filename>libfoo.so.4.0</filename> in the system, there is no way to
- tell the linker to link a particular application to
- <filename>libfoo.so.3.2</filename>. It is essentially completely
- overshadowed in terms of compilation-time linkage. In this case, the
- only solution is to rename the <emphasis>base</emphasis> part of the
- shared library. For instance, change
- <filename>libfoo.so.4.0</filename> to
- <filename>libfoo4.so.1.0</filename> so both version 3.2 and 4.0 can be
- linked from other ports.</para>
--->
- </chapter>
-
- <chapter id="porting-manpages">
- <title>Manpages</title>
-
- <para>The <makevar>MAN[1-9LN]</makevar> variables will automatically add
- any manpages to <filename>pkg-plist</filename> (this means you must
- <emphasis>not</emphasis> list manpages in the
- <filename>pkg-plist</filename>&mdash;see <link
- linkend="porting-plist">generating PLIST</link> for more). It also
- makes the install stage automatically compress or uncompress manpages
- depending on the setting of <makevar>NOMANCOMPRESS</makevar> in
- <filename>/etc/make.conf</filename>.</para>
-
- <para>If your port tries to install multiple names for manpages using
- symlinks or hardlinks, you must use the <makevar>MLINKS</makevar>
- variable to identify these. The link installed by your port will
- be destroyed and recreated by <filename>bsd.port.mk</filename>
- to make sure it points to the correct file. Any manpages
- listed in MLINKS must not be listed in the
- <filename>pkg-plist</filename>.</para>
-
- <para>To specify whether the manpages are compressed upon installation,
- use the <makevar>MANCOMPRESSED</makevar> variable. This variable can
- take three values, <literal>yes</literal>, <literal>no</literal> and
- <literal>maybe</literal>. <literal>yes</literal> means manpages are
- already installed compressed, <literal>no</literal> means they are
- not, and <literal>maybe</literal> means the software already respects
- the value of <makevar>NOMANCOMPRESS</makevar> so
- <filename>bsd.port.mk</filename> does not have to do anything
- special.</para>
-
- <para><makevar>MANCOMPRESSED</makevar> is automatically set to
- <literal>yes</literal> if <makevar>USE_IMAKE</makevar> is set and
- <makevar>NO_INSTALL_MANPAGES</makevar> is not set, and to
- <literal>no</literal> otherwise. You do not have to explicitly define
- it unless the default is not suitable for your port.</para>
-
- <para>If your port anchors its man tree somewhere other than
- <makevar>PREFIX</makevar>, you can use the
- <makevar>MANPREFIX</makevar> to set it. Also, if only manpages in
- certain sections go in a non-standard place, such as some Perl modules
- ports, you can set individual man paths using
- <makevar>MAN<replaceable>sect</replaceable>PREFIX</makevar> (where
- <replaceable>sect</replaceable> is one of <literal>1-9</literal>,
- <literal>L</literal> or <literal>N</literal>).</para>
-
- <para>If your manpages go to language-specific subdirectories, set the
- name of the languages to <makevar>MANLANG</makevar>. The value of
- this variable defaults to <literal>""</literal> (i.e., English
- only).</para>
-
- <para>Here is an example that puts it all together.</para>
-
- <programlisting>MAN1= foo.1
-MAN3= bar.3
-MAN4= baz.4
-MLINKS= foo.1 alt-name.8
-MANLANG= "" ja
-MAN3PREFIX= ${PREFIX}/share/foobar
-MANCOMPRESSED= yes</programlisting>
-
- <para>This states that six files are installed by this port;</para>
-
- <programlisting>${PREFIX}/man/man1/foo.1.gz
-${PREFIX}/man/ja/man1/foo.1.gz
-${PREFIX}/share/foobar/man/man3/bar.3.gz
-${PREFIX}/share/foobar/man/ja/man3/bar.3.gz
-${PREFIX}/man/man4/baz.4.gz
-${PREFIX}/man/ja/man4/baz.4.gz</programlisting>
-
- <para>Additionally <filename>${PREFIX}/man/man8/alt-name.8.gz</filename>
- may or may not be installed by your port. Regardless, a
- symlink will be made to join the foo(1) manpage and
- alt-name(8) manpage.</para>
-
- </chapter>
-
- <chapter id="porting-motif">
- <title>Ports that require Motif</title>
-
- <para>There are many programs that require a Motif library (available
- from several commercial vendors, while there is a free clone reported
- to be able to run many applications in
- <filename>x11-toolkits/lesstif</filename>) to compile. Since it is a
- popular toolkit and their licenses usually permit redistribution of
- statically linked binaries, we have made special provisions for
- handling ports that require Motif in a way that we can easily compile
- binaries linked either dynamically (for people who are compiling from
- the port) or statically (for people who distribute packages).</para>
-
- <sect1>
- <title><makevar>REQUIRES_MOTIF</makevar></title>
-
- <para>If your port requires Motif, define this variable in the
- Makefile. This will prevent people who do not own a copy of Motif
- from even attempting to build it.</para>
- </sect1>
-
- <sect1>
- <title><makevar>MOTIFLIB</makevar></title>
-
- <para>This variable will be set by <filename>bsd.port.mk</filename> to
- be the appropriate reference to the Motif library. Please patch the
- source to use this wherever the Motif library is referenced in the
- <filename>Makefile</filename> or
- <filename>Imakefile</filename>.</para>
-
- <para>There are two common cases:</para>
-
- <itemizedlist>
- <listitem>
- <para>If the port refers to the Motif library as
- <literal>-lXm</literal> in its <filename>Makefile</filename> or
- <filename>Imakefile</filename>, simply substitute
- <literal>&dollar;{MOTIFLIB}</literal> for it.</para>
- </listitem>
-
- <listitem>
- <para>If the port uses <literal>XmClientLibs</literal> in its
- <filename>Imakefile</filename>, change it to
- <literal>&dollar;{MOTIFLIB} &dollar;{XTOOLLIB}
- &dollar;{XLIB}</literal>.</para>
- </listitem>
-
- </itemizedlist>
-
- <para>Note that <makevar>MOTIFLIB</makevar> (usually) expands to
- <literal>-L/usr/X11R6/lib -lXm</literal> or
- <literal>/usr/X11R6/lib/libXm.a</literal>, so there is no need to
- add <literal>-L</literal> or <literal>-l</literal> in front.</para>
- </sect1>
- </chapter>
-
- <chapter>
- <title>X11 fonts</title>
-
- <para>If your port installs fonts for the X Window system, put them in
- <filename><makevar>X11BASE</makevar>/lib/X11/fonts/local</filename>.
- This directory is new to XFree86 release 3.3.3. If it does not exist,
- please create it, and print out a message urging the user to update
- their XFree86 to 3.3.3 or newer, or at least add this directory to the
- font path in <filename>/etc/XF86Config</filename>.</para>
- </chapter>
-
- <chapter id="porting-info">
- <title>Info files</title>
-
- <para>The new version of texinfo (included in 2.2.2-RELEASE and onwards)
- contains a utility called <command>install-info</command> to add and
- delete entries to the <filename>dir</filename> file. If your port
- installs any info documents, please follow these instructions so your
- port/package will correctly update the user's
- <filename><makevar>PREFIX</makevar>/info/dir</filename> file. (Sorry
- for the length of this section, but is it imperative to weave all the
- info files together. If done correctly, it will produce a
- <emphasis>beautiful</emphasis> listing, so please bear with me!</para>
-
- <para>First, this is what you (as a porter) need to know</para>
-
- <screen>&prompt.user; <userinput>install-info --help</userinput>
-install-info [OPTION]... [INFO-FILE [DIR-FILE]]
- Install INFO-FILE in the Info directory file DIR-FILE.
-
-Options:
---delete Delete existing entries in INFO-FILE;
- don't insert any new entries.
- :
---entry=TEXT Insert TEXT as an Info directory entry.
- :
---section=SEC Put this file's entries in section SEC of the directory. :</screen>
-
- <note>
- <para>This program will not actually <emphasis>install</emphasis> info
- files; it merely inserts or deletes entries in the
- <filename>dir</filename> file.</para>
- </note>
-
- <para>Here's a seven-step procedure to convert ports to use
- <command>install-info</command>.
- <filename>editors/emacs</filename> will be used as an
- example.</para>
-
- <procedure>
- <step>
- <para>Look at the texinfo sources and make a patch to insert
- <literal>@dircategory</literal> and <literal>@direntry</literal>
- statements to files that do not have them. This is part of my
- patch:</para>
-
- <programlisting>--- ./man/vip.texi.org Fri Jun 16 15:31:11 1995
-+++ ./man/vip.texi Tue May 20 01:28:33 1997
-@@ -2,6 +2,10 @@
-
- @setfilename ../info/vip
- @settitle VIP
-+@dircategory The Emacs editor and associated tools
-+@direntry
-+* VIP: (vip). A VI-emulation for Emacs.
-+@end direntry
-
- @iftex
- @finalout
- :</programlisting>
-
- <para>The format should be self-explanatory. Many authors leave a
- <filename>dir</filename> file in the source tree that contains all
- the entries you need, so look around before you try to write your
- own. Also, make sure you look into related ports and make the
- section names and entry indentations consistent (we recommend that
- all entry text start at the 4th tab stop).</para>
-
- <note>
- <para>Note that you can put only one info entry per file because
- of a bug in <command>install-info --delete</command> that
- deletes only the first entry if you specify multiple entries in
- the <email>@direntry</email> section.</para>
- </note>
-
- <para>You can give the <literal>dir</literal> entries to
- <command>install-info</command> as arguments
- (<option>--section</option> and <option>--entry</option>) instead
- of patching the texinfo sources. This probably is not a good
- idea for ports because you need to duplicate the same information
- in <emphasis>three</emphasis> places
- (<filename>Makefile</filename> and
- <literal>@exec</literal>/<literal>@unexec</literal> of
- <filename>pkg-plist</filename>; see below). However, if you have
- Japanese (or other multibyte encoding) info files, you will have
- to use the extra arguments to <command>install-info</command>
- because <command>makeinfo</command> cannot handle those texinfo
- sources. (See <filename>Makefile</filename> and
- <filename>pkg-plist</filename> of <filename>japanese/skk</filename>
- for examples on how to do this).</para>
- </step>
-
- <step>
- <para>Go back to the port directory and do a <command>make clean;
- make</command> and verify that the info files are regenerated
- from the texinfo sources. Since the texinfo sources are newer than
- the info files, they should be rebuilt when you type
- <command>make</command>; but many <filename>Makefile</filename>s
- do not include correct dependencies for info files. In
- <command>emacs</command>' case, it was necessary to patch the main
- <filename>Makefile.in</filename> so it would descend into the
- <filename>man</filename> subdirectory to rebuild the info
- pages.</para>
-
- <programlisting>--- ./Makefile.in.org Mon Aug 19 21:12:19 1996
-+++ ./Makefile.in Tue Apr 15 00:15:28 1997
-@@ -184,7 +184,7 @@
- # Subdirectories to make recursively. `lisp' is not included
- # because the compiled lisp files are part of the distribution
- # and you cannot remake them without installing Emacs first.
--SUBDIR = lib-src src
-+SUBDIR = lib-src src man
-
- # The makefiles of the directories in $SUBDIR.
- SUBDIR_MAKEFILES = lib-src/Makefile man/Makefile src/Makefile oldXMenu/Makefile
- lwlib/Makefile
---- ./man/Makefile.in.org Thu Jun 27 15:27:19 1996
-+++ ./man/Makefile.in Tue Apr 15 00:29:52 1997
-@@ -66,6 +66,7 @@
- ${srcdir}/gnu1.texi \
- ${srcdir}/glossary.texi
-
-+all: info
- info: $(INFO_TARGETS)
-
- dvi: $(DVI_TARGETS)</programlisting>
-
- <para>The second hunk was necessary because the default target in
- the <filename>man</filename> subdir is called
- <maketarget>info</maketarget>, while the main
- <filename>Makefile</filename> wants to call
- <maketarget>all</maketarget>. The installation of the
- <filename>info</filename> info file was also removed because we
- already have one with the same name in
- <filename>/usr/share/info</filename> (that patch is not shown
- here).</para>
- </step>
-
- <step>
- <para>If there is a place in the <filename>Makefile</filename> that
- is installing the <filename>dir</filename> file, delete it. Your
- port may not be doing it. Also, remove any commands that are
- otherwise mucking around with the <filename>dir</filename>
- file.</para>
-
- <programlisting>--- ./Makefile.in.org Mon Aug 19 21:12:19 1996
-+++ ./Makefile.in Mon Apr 14 23:38:07 1997
-@@ -368,14 +368,8 @@
- if [ `(cd ${srcdir}/info && /bin/pwd)` != `(cd ${infodir} && /bin/pwd)` ]; \
- then \
- (cd ${infodir}; \
-- if [ -f dir ]; then \
-- if [ ! -f dir.old ]; then mv -f dir dir.old; \
-- else mv -f dir dir.bak; fi; \
-- fi; \
- cd ${srcdir}/info ; \
-- (cd $${thisdir}; ${INSTALL_DATA} ${srcdir}/info/dir ${infodir}/dir);
-\
-- (cd $${thisdir}; chmod a+r ${infodir}/dir); \
- for f in ccmode* cl* dired-x* ediff* emacs* forms* gnus* info* message* mh-e* sc* vip*; do \
- (cd $${thisdir}; \
- ${INSTALL_DATA} ${srcdir}/info/$$f ${infodir}/$$f; \
- chmod a+r ${infodir}/$$f); \</programlisting>
- </step>
-
- <step>
- <para>(This step is only necessary if you are modifying an existing
- port.) Take a look at <filename>pkg-plist</filename> and delete
- anything that is trying to patch up <filename>info/dir</filename>.
- They may be in <filename>pkg-install</filename> or some other
- file, so search extensively.</para>
-
- <programlisting>Index: pkg-plist
-===================================================================
-RCS file: /usr/cvs/ports/editors/emacs/pkg-plist,v
-retrieving revision 1.15
-diff -u -r1.15 pkg-plist
---- pkg-plist 1997/03/04 08:04:00 1.15
-+++ pkg-plist 1997/04/15 06:32:12
-@@ -15,9 +15,6 @@
- man/man1/emacs.1.gz
- man/man1/etags.1.gz
- man/man1/ctags.1.gz
--@unexec cp %D/info/dir %D/info/dir.bak
--info/dir
--@unexec cp %D/info/dir.bak %D/info/dir
- info/cl
- info/cl-1
- info/cl-2</programlisting>
- </step>
-
- <step>
- <para>Add a <maketarget>post-install</maketarget> target to the
- <filename>Makefile</filename> to call
- <maketarget>install-info</maketarget> with the installed
- info files. (It is no longer necessary to create the
- <filename>dir</filename> file yourself;
- <command>install-info</command> automatically creates this
- file if it does not exist.)</para>
-
- <programlisting>Index: Makefile
-===================================================================
-RCS file: /usr/cvs/ports/editors/emacs/Makefile,v
-retrieving revision 1.26
-diff -u -r1.26 Makefile
---- Makefile 1996/11/19 13:14:40 1.26
-+++ Makefile 1997/05/20 10:25:09 1.28
-@@ -20,5 +20,8 @@
- post-install:
- .for file in emacs-19.34 emacsclient etags ctags b2m
- strip ${PREFIX}/bin/${file}
- .endfor
-+.for info in emacs vip viper forms gnus mh-e cl sc dired-x ediff ccmode
-+ install-info ${PREFIX}/info/${info} ${PREFIX}/info/dir
-+.endfor
-
- .include &lt;bsd.port.mk&gt;</programlisting>
- </step>
-
- <step>
- <para>Edit <filename>pkg-plist</filename> and add equivalent
- <literal>@exec</literal> statements and also
- <literal>@unexec</literal> for
- <command>pkg_delete</command>.</para>
-
- <programlisting>Index: pkg-plist
-===================================================================
-RCS file: /usr/cvs/ports/editors/emacs/pkg-plist,v
-retrieving revision 1.15
-diff -u -r1.15 pkg-plist
---- pkg-plist 1997/03/04 08:04:00 1.15
-+++ pkg-plist 1997/05/20 10:25:12 1.17
-@@ -16,7 +14,14 @@
- man/man1/etags.1.gz
- man/man1/ctags.1.gz
-+@unexec install-info --delete %D/info/emacs %D/info/dir
- :
-+@unexec install-info --delete %D/info/ccmode %D/info/dir
- info/cl
- info/cl-1
-@@ -87,6 +94,18 @@
- info/viper-3
- info/viper-4
-+@exec install-info %D/info/emacs %D/info/dir
- :
-+@exec install-info %D/info/ccmode %D/info/dir
- libexec/emacs/19.34/i386--freebsd/cvtmail
- libexec/emacs/19.34/i386--freebsd/digest-doc</programlisting>
-
- <note>
- <para>The <literal>@unexec install-info --delete</literal>
- commands have to be listed before the info files themselves so
- they can read the files. Also, the <literal>@exec
- install-info</literal> commands have to be after the info
- files and the <literal>@exec</literal> command that creates the
- the <filename>dir</filename> file.</para>
- </note>
- </step>
-
- <step>
- <para><link linkend="porting-testing">Test</link> and admire your
- work. <!-- smiley --><emphasis>:-)</emphasis>. Check the
- <filename>dir</filename> file before and after each step.</para>
- </step>
- </procedure>
- </chapter>
-
- <chapter>
- <title>The <filename>pkg-<replaceable>*</replaceable></filename> files</title>
-
- <para>There are some tricks we have not mentioned yet about the
- <filename>pkg-<replaceable>*</replaceable></filename> files
- that come in handy sometimes.</para>
-
- <sect1 id="porting-message">
- <title><filename>pkg-message</filename></title>
-
- <para>If you need to display a message to the installer, you may place
- the message in <filename>pkg-message</filename>. This capability is
- often useful to display additional installation steps to be taken
- after a <command>pkg_add</command> or to display licensing
- information.</para>
-
- <note>
- <para>The <filename>pkg-message</filename> file does not need to be
- added to <filename>pkg-plist</filename>. Also, it will not get
- automatically printed if the user is using the port, not the
- package, so you should probably display it from the
- <maketarget>post-install</maketarget> target yourself.</para>
- </note>
- </sect1>
-
- <sect1>
- <title><filename>pkg-install</filename></title>
-
- <para>If your port needs to execute commands when the binary package
- is installed with <command>pkg_add</command> you can do this via the
- <filename>pkg-install</filename> script. This script will
- automatically be added to the package, and will be run twice by
- <command>pkg_add</command>. The first time as
- <literal>&dollar;{SH} pkg-install &dollar;{PKGNAME}
- PRE-INSTALL</literal> and the second time as
- <literal>&dollar;{SH} pkg-install &dollar;{PKGNAME} POST-INSTALL</literal>.
- <literal>&dollar;2</literal> can be tested to determine which mode
- the script is being run in. The <envar>PKG_PREFIX</envar>
- environmental variable will be set to the package installation
- directory. See &man.pkg.add.1; for
- additional information.</para>
-
- <note>
- <para>This script is not run automatically if you install the port
- with <command>make install</command>. If you are depending on it
- being run, you will have to explicitly call it from your port's
- <filename>Makefile</filename>.</para>
- </note>
- </sect1>
-
- <sect1>
- <title><filename>pkg-req</filename></title>
-
- <para>If your port needs to determine if it should install or not, you
- can create a <filename>pkg-req</filename> <quote>requirements</quote>
- script. It will be invoked automatically at
- installation/deinstallation time to determine whether or not
- installation/deinstallation should proceed.</para>
-
- <para>The script will be run at installation time by
- <command>pkg_add</command> as
- <literal>pkg-req &dollar;{PKGNAME} INSTALL</literal>.
- At deinstallation time it will be run by
- <command>pkg_delete</command> as
- <literal>pkg-req &dollar;{PKGNAME} DEINSTALL</literal>.</para>
- </sect1>
-
- <sect1 id="porting-plist">
- <title>Changing <filename>pkg-plist</filename> based on make
- variables</title>
-
- <para>Some ports, particularly the p5- ports, need to change their
- <filename>pkg-plist</filename> depending on what options they are
- configured with (or version of perl, in the case of p5- ports). To
- make this easy, any instances in the <filename>pkg-plist</filename> of
- <literal>%%OSREL%%</literal>, <literal>%%PERL_VER%%</literal>, and
- <literal>%%PERL_VERSION%%</literal> will be substituted for
- appropriately. The value of <literal>%%OSREL%%</literal> is the
- numeric revision of the operating system (e.g.,
- <literal>2.2.7</literal>). <literal>%%PERL_VERSION%%</literal> is
- the full version number of perl (e.g., <literal>5.00502</literal>)
- and <literal>%%PERL_VER%%</literal> is the perl version number minus
- the patchlevel (e.g., <literal>5.005</literal>).</para>
-
- <para>If you need to make other substitutions, you can set the
- <makevar>PLIST_SUB</makevar> variable with a list of
- <literal><replaceable>VAR</replaceable>=<replaceable>VALUE</replaceable></literal>
- pairs and instances of
- <literal>%%<replaceable>VAR</replaceable>%%</literal>' will be
- substituted with <replaceable>VALUE</replaceable> in the
- <filename>pkg-plist</filename>.</para>
-
- <para>For instance, if you have a port that installs many files in a
- version-specific subdirectory, you can put something like
-
- <programlisting>OCTAVE_VERSION= 2.0.13
-PLIST_SUB= OCTAVE_VERSION=${OCTAVE_VERSION}</programlisting>
-
- in the <filename>Makefile</filename> and use
- <literal>%%OCTAVE_VERSION%%</literal> wherever the version shows up
- in <filename>pkg-plist</filename>. That way, when you upgrade the port,
- you will not have to change dozens (or in some cases, hundreds) of
- lines in the <filename>pkg-plist</filename>.</para>
-
- <para>This substitution (as well as addition of any <link
- linkend="porting-manpages">man pages</link>) will be done between
- the <maketarget>do-install</maketarget> and
- <maketarget>post-install</maketarget> targets, by reading from
- <makevar>PLIST</makevar> and writing to <makevar>TMPPLIST</makevar>
- (default:
- <filename><makevar>WRKDIR</makevar>/.PLIST.mktmp</filename>). So if
- your port builds <makevar>PLIST</makevar> on the fly, do so in or
- before <maketarget>do-install</maketarget>. Also, if your port
- needs to edit the resulting file, do so in
- <maketarget>post-install</maketarget> to a file named
- <makevar>TMPPLIST</makevar>.</para>
- </sect1>
-
- <sect1>
- <title id="porting-pkgfiles">Changing the names of
- <filename>pkg-<replaceable>*</replaceable></filename> files</title>
-
- <para>All the names of <filename>pkg-<replaceable>*</replaceable></filename> files
- are defined using variables so you can change them in your
- <filename>Makefile</filename> if need be. This is especially useful
- when you are sharing the same <filename>pkg-<replaceable>*</replaceable></filename> files
- among several ports or have to write to one of the above files (see
- <link linkend="porting-wrkdir">writing to places other than
- <makevar>WRKDIR</makevar></link> for why it is a bad idea to write
- directly in to the <filename>pkg-<replaceable>*</replaceable></filename> subdirectory).</para>
-
- <para>Here is a list of variable names and their default
- values. (<makevar>PKGDIR</makevar> defaults to
- <makevar>${MASTERDIR}</makevar>.)</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <thead>
- <row>
- <entry>Variable</entry>
- <entry>Default value</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry><makevar>COMMENT</makevar></entry>
- <entry><literal>${PKGDIR}/pkg-comment</literal></entry>
- </row>
-
- <row>
- <entry><makevar>DESCR</makevar></entry>
- <entry><literal>${PKGDIR}/pkg-descr</literal></entry>
- </row>
-
- <row>
- <entry><makevar>PLIST</makevar></entry>
- <entry><literal>${PKGDIR}/pkg-plist</literal></entry>
- </row>
-
- <row>
- <entry><makevar>PKGINSTALL</makevar></entry>
- <entry><literal>${PKGDIR}/pkg-install</literal></entry>
- </row>
-
- <row>
- <entry><makevar>PKGDEINSTALL</makevar></entry>
- <entry><literal>${PKGDIR}/pkg-deinstall</literal></entry>
- </row>
-
- <row>
- <entry><makevar>PKGREQ</makevar></entry>
- <entry><literal>${PKGDIR}/pkg-req</literal></entry>
- </row>
-
- <row>
- <entry><makevar>PKGMESSAGE</makevar></entry>
- <entry><literal>${PKGDIR}/pkg-message</literal></entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <para>Please change these variables rather than overriding
- <makevar>PKG_ARGS</makevar>. If you change
- <makevar>PKG_ARGS</makevar>, those files will not correctly be
- installed in <filename>/var/db/pkg</filename> upon install from a
- port.</para>
- </sect1>
- </chapter>
-
- <chapter>
- <title>Licensing Problems</title>
-
- <para>Some software packages have restrictive licenses or can be in
- violation of the law in some countries (such as violating a patent).
- What we can do with
- them varies a lot, depending on the exact wordings of the respective
- licenses.</para>
-
- <note>
- <para>It is your responsibility as a porter to read the licensing
- terms of the software and make sure that the FreeBSD project will
- not be held accountable for violating them by redistributing the
- source or compiled binaries either via FTP or CDROM. If in doubt,
- please contact the &a.ports;.</para>
- </note>
-
- <para>There are two variables you can set in the Makefile to handle the
- situations that arise frequently:</para>
-
- <orderedlist>
- <listitem>
- <para>If the port has a <quote>do not sell for profit</quote> type of
- license, set the variable <makevar>NO_CDROM</makevar> to a string
- describing the reason why. We will make sure such ports will not go
- into the CDROM come release time. The distfile and package will
- still be available via FTP.</para>
- </listitem>
-
- <listitem>
- <para>If the resulting package needs to be built uniquely for each
- site, or the resulting binary package cannot be distributed due to
- licensing; set the variable <makevar>NO_PACKAGE</makevar> to a
- string describing the reason why. We will make sure such packages
- will not go on the FTP site, nor into the CDROM come release time.
- The distfile will still be included on both however.</para>
- </listitem>
-
- <listitem>
- <para>If the port has legal restrictions on who can use it (e.g.,
- patented stuff) or has a <quote>no commercial use</quote> license,
- set the variable <makevar>RESTRICTED</makevar> to be the string
- describing the reason why. For such ports, the distfiles/packages
- will not be available even from our FTP sites.</para>
- </listitem>
- </orderedlist>
-
- <note>
- <para>The GNU General Public License (GPL), both version 1 and 2,
- should not be a problem for ports.</para>
- </note>
-
- <note>
- <para>If you are a committer, make sure you update the
- <filename>ports/LEGAL</filename> file too.</para>
- </note>
- </chapter>
-
- <chapter id="port-upgrading">
- <title>Upgrading</title>
-
- <para>When you notice that a port is out of date compared to the latest
- version from the original authors, first make sure you have the latest
- port. You can find them in the
- <filename>ports/ports-current</filename> directory of the FTP mirror
- sites. You may also use CVSup to keep your whole ports collection
- up-to-date, as described in <ulink url="../handbook/synching.html#CVSUP-CONFIG">the Handbook</ulink>.</para>
-
- <para>The next step is to send a mail to the maintainer, if one is
- listed in the port's <filename>Makefile</filename>. That person may
- already be working on an upgrade, or have a reason to not upgrade the
- port right now (because of, for example, stability problems of the new
- version).</para>
-
- <para>If the maintainer asks you to do the upgrade or there is not any
- such person to begin with, please make the upgrade and send the
- recursive diff (either unified or context diff is fine, but port
- committers appear to prefer unified diff more) of the new and old
- ports directories to us (e.g., if your modified port directory is
- called <filename>superedit</filename> and the original as in our tree
- is <filename>superedit.bak</filename>, then send us the result of
- <command>diff -ruN superedit.bak superedit</command>). Please examine
- the output to make sure all the changes make sense. The best way to
- send us the diff is by including it via &man.send-pr.1; (category
- <literal>ports</literal>). Please mention any added or deleted files
- in the message, as they have to be explicitly specified to CVS when
- doing a commit. If the diff is more than about 20KB, please compress
- and uuencode it; otherwise, just include it in the PR as is.</para>
-
- <note>
- <para>Once again, please use &man.diff.1; and not &man.shar.1; to send
- updates to existing ports!</para>
- </note>
- </chapter>
-
- <chapter>
- <title><anchor id="porting-dads">Dos and Don'ts</title>
-
- <para>Here is a list of common dos and don'ts that you encounter during
- the porting process.You should check your own port against this list,
- but you can also check ports in the PR database that others have
- submitted. Submit any comments on ports you check as described in
- <ulink url="../handbook/contrib-how.html#CONTRIB-GENERAL">Bug Reports and General
- Commentary</ulink>. Checking ports in the PR database will both make
- it faster for us to commit them, and prove that you know what you are
- doing.</para>
-
- <sect1>
- <title>Strip Binaries</title>
-
- <para>Do strip binaries. If the original source already strips the
- binaries, fine; otherwise you should add a
- <literal>post-install</literal> rule to it yourself. Here is an
- example:</para>
-
- <programlisting>post-install:
- strip ${PREFIX}/bin/xdl</programlisting>
-
- <para>Use the &man.file.1; command on the installed executable to
- check whether the binary is stripped or not. If it does not say
- <literal>not stripped</literal>, it is stripped.</para>
- </sect1>
-
- <sect1>
- <title>INSTALL_* macros</title>
-
- <para>Do use the macros provided in <filename>bsd.port.mk</filename>
- to ensure correct modes and ownership of files in your own
- <maketarget>*-install</maketarget> targets.</para>
-
- <itemizedlist>
- <listitem>
- <para><makevar>INSTALL_PROGRAM</makevar> is a command to install
- binary executables.</para>
- </listitem>
-
- <listitem>
- <para><makevar>INSTALL_SCRIPT</makevar> is a command to install
- executable scripts.</para>
- </listitem>
-
- <listitem>
- <para><makevar>INSTALL_DATA</makevar> is a command to install
- sharable data.</para>
- </listitem>
-
- <listitem>
- <para><makevar>INSTALL_MAN</makevar> is a command to install
- manpages and other documentation (it does not compress
- anything).</para>
- </listitem>
- </itemizedlist>
-
- <para>These are basically the <command>install</command> command with
- all the appropriate flags. See below for an example on how to use
- them.</para>
- </sect1>
-
- <sect1 id="porting-wrkdir">
- <title><makevar>WRKDIR</makevar></title>
-
- <para>Do not write anything to files outside
- <makevar>WRKDIR</makevar>. <makevar>WRKDIR</makevar> is the only
- place that is guaranteed to be writable during the port build (see
- <ulink url="../handbook/ports-using.html#PORTS-CD">compiling ports from CDROM</ulink> for an
- example of building ports from a read-only tree). If you need to
- modify one of the <filename>pkg-<replaceable>*</replaceable></filename>
- files, do so by <link
- linkend="porting-pkgfiles">redefining a variable</link>, not by
- writing over it.</para>
- </sect1>
-
- <sect1 id="porting-wrkdirprefix">
- <title><makevar>WRKDIRPREFIX</makevar></title>
-
- <para>Make sure your port honors <makevar>WRKDIRPREFIX</makevar>.
- Most ports do not have to worry about this. In particular, if you
- are referring to a <makevar>WRKDIR</makevar> of another port, note
- that the correct location is
- <filename><makevar>WRKDIRPREFIX</makevar><makevar>PORTSDIR</makevar>/<replaceable>subdir</replaceable>/<replaceable>name</replaceable>/work</filename> not <filename><makevar>PORTSDIR</makevar>/<replaceable>subdir</replaceable>/<replaceable>name</replaceable>/work</filename> or <filename><makevar>.CURDIR</makevar>/../../<replaceable>subdir</replaceable>/<replaceable>name</replaceable>/work</filename> or some such.</para>
-
- <para>Also, if you are defining <makevar>WRKDIR</makevar> yourself,
- make sure you prepend
- <literal>&dollar;{WRKDIRPREFIX}&dollar;{.CURDIR}</literal> in the
- front.</para>
- </sect1>
-
- <sect1 id="porting-versions">
- <title>Differentiating operating systems and OS versions</title>
-
- <para>You may come across code that needs modifications or conditional
- compilation based upon what version of Unix it is running under. If
- you need to make such changes to the code for conditional
- compilation, make sure you make the changes as general as possible
- so that we can back-port code to FreeBSD 1.x systems and cross-port
- to other BSD systems such as 4.4BSD from CSRG, BSD/386, 386BSD,
- NetBSD, and OpenBSD.</para>
-
- <para>The preferred way to tell 4.3BSD/Reno (1990) and newer versions
- of the BSD code apart is by using the <literal>BSD</literal> macro
- defined in <filename>&lt;sys/param.h&gt;</filename>. Hopefully that
- file is already included; if not, add the code:</para>
-
- <programlisting>#if (defined(__unix__) || defined(unix)) &amp;&amp; !defined(USG)
-#include &lt;sys/param.h&gt;
-#endif</programlisting>
-
- <para>to the proper place in the <filename>.c</filename> file. We
- believe that every system that defines these two symbols has
- <filename>sys/param.h</filename>. If you find a system that
- does not, we would like to know. Please send mail to the
- &a.ports;.</para>
-
- <para>Another way is to use the GNU Autoconf style of doing
- this:</para>
-
- <programlisting>#ifdef HAVE_SYS_PARAM_H
-#include &lt;sys/param.h&gt;
-#endif</programlisting>
-
- <para>Do not forget to add <literal>-DHAVE_SYS_PARAM_H</literal> to the
- <makevar>CFLAGS</makevar> in the <filename>Makefile</filename> for
- this method.</para>
-
- <para>Once you have <filename>sys/param.h</filename> included, you may
- use:</para>
-
- <programlisting>#if (defined(BSD) &amp;&amp; (BSD &gt;= 199103))</programlisting>
-
- <para>to detect if the code is being compiled on a 4.3 Net2 code base
- or newer (e.g. FreeBSD 1.x, 4.3/Reno, NetBSD 0.9, 386BSD, BSD/386
- 1.1 and below).</para>
-
- <para>Use:</para>
-
- <programlisting>#if (defined(BSD) &amp;&amp; (BSD &gt;= 199306))</programlisting>
-
- <para>to detect if the code is being compiled on a 4.4 code base or
- newer (e.g. FreeBSD 2.x, 4.4, NetBSD 1.0, BSD/386 2.0 or
- above).</para>
-
- <para>The value of the <literal>BSD</literal> macro is
- <literal>199506</literal> for the 4.4BSD-Lite2 code base. This is
- stated for informational purposes only. It should not be used to
- distinguish between versions of FreeBSD based only on 4.4-Lite vs.
- versions that have merged in changes from 4.4-Lite2. The
- <literal>__FreeBSD__</literal> macro should be used instead.</para>
-
- <para>Use sparingly:</para>
-
- <itemizedlist>
- <listitem>
- <para><literal>__FreeBSD__</literal> is defined in all versions of
- FreeBSD. Use it if the change you are making
- <emphasis>only</emphasis> affects FreeBSD. Porting gotchas like
- the use of <literal>sys_errlist[]</literal> vs
- <function>strerror()</function> are Berkeleyisms, not FreeBSD
- changes.</para>
- </listitem>
-
- <listitem>
- <para>In FreeBSD 2.x, <literal>__FreeBSD__</literal> is defined to
- be <literal>2</literal>. In earlier versions, it is
- <literal>1</literal>. Later versions will bump it to match
- their major version number.</para>
- </listitem>
-
- <listitem>
- <para>If you need to tell the difference between a FreeBSD 1.x
- system and a FreeBSD 2.x or 3.x system, usually the right answer
- is to use the <literal>BSD</literal> macros described above. If
- there actually is a FreeBSD specific change (such as special
- shared library options when using <command>ld</command>) then it
- is OK to use <literal>__FreeBSD__</literal> and <literal>#if
- __FreeBSD__ &gt; 1</literal> to detect a FreeBSD 2.x and later
- system. If you need more granularity in detecting FreeBSD
- systems since 2.0-RELEASE you can use the following:</para>
-
- <programlisting>#if __FreeBSD__ &gt;= 2
-#include &lt;osreldate.h&gt;
-# if __FreeBSD_version &gt;= 199504
- /* 2.0.5+ release specific code here */
-# endif
-#endif</programlisting>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <thead>
- <row>
- <entry>Release</entry>
- <entry><literal>__FreeBSD_version</literal></entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>2.0-RELEASE</entry>
- <entry>119411</entry>
- </row>
-
- <row>
- <entry>2.1-CURRENT</entry>
- <entry>199501, 199503</entry>
- </row>
-
- <row>
- <entry>2.0.5-RELEASE</entry>
- <entry>199504</entry>
- </row>
-
- <row>
- <entry>2.2-CURRENT before 2.1</entry>
- <entry>199508</entry>
- </row>
-
- <row>
- <entry>2.1.0-RELEASE</entry>
- <entry>199511</entry>
- </row>
-
- <row>
- <entry>2.2-CURRENT before 2.1.5</entry>
- <entry>199512</entry>
- </row>
-
- <row>
- <entry>2.1.5-RELEASE</entry>
- <entry>199607</entry>
- </row>
-
- <row>
- <entry>2.2-CURRENT before 2.1.6</entry>
- <entry>199608</entry>
- </row>
-
- <row>
- <entry>2.1.6-RELEASE</entry>
- <entry>199612</entry>
- </row>
-
- <row>
- <entry>2.1.7-RELEASE</entry>
- <entry>199612</entry>
- </row>
-
- <row>
- <entry>2.2-RELEASE</entry>
- <entry>220000</entry>
- </row>
-
- <row>
- <entry>2.2.1-RELEASE</entry>
- <entry>220000 (no change)</entry>
- </row>
-
- <row>
- <entry>2.2-STABLE after 2.2.1-RELEASE</entry>
- <entry>220000 (no change)</entry>
- </row>
-
- <row>
- <entry>2.2-STABLE after texinfo-3.9</entry>
- <entry>221001</entry>
- </row>
-
- <row>
- <entry>2.2-STABLE after top</entry>
- <entry>221002</entry>
- </row>
-
- <row>
- <entry>2.2.2-RELEASE</entry>
- <entry>222000</entry>
- </row>
-
- <row>
- <entry>2.2-STABLE after 2.2.2-RELEASE</entry>
- <entry>222001</entry>
- </row>
-
- <row>
- <entry>2.2.5-RELEASE</entry>
- <entry>225000</entry>
- </row>
-
- <row>
- <entry>2.2-STABLE after 2.2.5-RELEASE</entry>
- <entry>225001</entry>
- </row>
-
- <row>
- <entry>2.2-STABLE after ldconfig -R merge</entry>
- <entry>225002</entry>
- </row>
-
- <row>
- <entry>2.2.6-RELEASE</entry>
- <entry>226000</entry>
- </row>
-
- <row>
- <entry>2.2.7-RELEASE</entry>
- <entry>227000</entry>
- </row>
-
- <row>
- <entry>2.2-STABLE after 2.2.7-RELEASE</entry>
- <entry>227001</entry>
- </row>
-
- <row>
- <entry>2.2-STABLE after &man.semctl.2; change</entry>
- <entry>227002</entry>
- </row>
-
- <row>
- <entry>2.2.8-RELEASE</entry>
- <entry>228000</entry>
- </row>
-
- <row>
- <entry>2.2-STABLE after 2.2.8-RELEASE</entry>
- <entry>228001</entry>
- </row>
-
- <row>
- <entry>3.0-CURRENT before &man.mount.2; change</entry>
- <entry>300000</entry>
- </row>
-
- <row>
- <entry>3.0-CURRENT after &man.mount.2; change</entry>
- <entry>300001</entry>
- </row>
-
- <row>
- <entry>3.0-CURRENT after &man.semctl.2; change</entry>
- <entry>300002</entry>
- </row>
-
- <row>
- <entry>3.0-CURRENT after ioctl arg changes</entry>
- <entry>300003</entry>
- </row>
-
- <row>
- <entry>3.0-CURRENT after ELF conversion</entry>
- <entry>300004</entry>
- </row>
-
- <row>
- <entry>3.0-RELEASE</entry>
- <entry>300005</entry>
- </row>
-
- <row>
- <entry>3.0-CURRENT after 3.0-RELEASE</entry>
- <entry>300006</entry>
- </row>
-
- <row>
- <entry>3.0-STABLE after 3/4 branch</entry>
- <entry>300007</entry>
- </row>
-
- <row>
- <entry>3.1-RELEASE</entry>
- <entry>310000</entry>
- </row>
-
- <row>
- <entry>3.1-STABLE after 3.1-RELEASE</entry>
- <entry>310001</entry>
- </row>
-
- <row>
- <entry>3.1-STABLE after C++ constructor/destructor order
- change</entry>
- <entry>310002</entry>
- </row>
-
- <row>
- <entry>3.2-RELEASE</entry>
- <entry>320000</entry>
- </row>
-
- <row>
- <entry>3.2-STABLE</entry>
- <entry>320001</entry>
- </row>
-
- <row>
- <entry>3.2-STABLE after binary-incompatible IPFW and
- socket changes</entry>
- <entry>320002</entry>
- </row>
-
- <row>
- <entry>3.3-RELEASE</entry>
- <entry>330000</entry>
- </row>
-
- <row>
- <entry>3.3-STABLE</entry>
- <entry>330001</entry>
- </row>
-
- <row>
- <entry>3.3-STABLE after adding &man.mkstemp.3;
- to libc</entry>
- <entry>330002</entry>
- </row>
-
- <row>
- <entry>3.4-RELEASE</entry>
- <entry>340000</entry>
- </row>
-
- <row>
- <entry>3.4-STABLE</entry>
- <entry>340001</entry>
- </row>
-
- <row>
- <entry>4.0-CURRENT after 3.4 branch</entry>
- <entry>400000</entry>
- </row>
-
- <row>
- <entry>4.0-CURRENT after change in dynamic linker
- handling</entry>
- <entry>400001</entry>
- </row>
-
- <row>
- <entry>4.0-CURRENT after C++ constructor/destructor
- order change</entry>
- <entry>400002</entry>
- </row>
-
- <row>
- <entry>4.0-CURRENT after functioning &man.dladdr.3;</entry>
- <entry>400003</entry>
- </row>
-
- <row>
- <entry>4.0-CURRENT after __deregister_frame_info dynamic
- linker bug fix (also 4.0-CURRENT after EGCS 1.1.2
- integration)
- </entry>
- <entry>400004</entry>
- </row>
-
- <row>
- <entry>4.0-CURRENT after &man.suser.9; API change
- (also 4.0-CURRENT after newbus)</entry>
- <entry>400005</entry>
- </row>
-
- <row>
- <entry>4.0-CURRENT after cdevsw registration change</entry>
- <entry>400006</entry>
- </row>
-
- <row>
- <entry>4.0-CURRENT after the addition of so_cred for
- socket level credentials</entry>
- <entry>400007</entry>
- </row>
-
- <row>
- <entry>4.0-CURRENT after the addition of a poll syscall
- wrapper to libc_r</entry>
- <entry>400008</entry>
- </row>
-
- <row>
- <entry>4.0-CURRENT after the change of the kernel's
- <literal>dev_t</literal> type to <literal>struct
- specinfo</literal> pointer</entry>
- <entry>400009</entry>
- </row>
-
- <row>
- <entry>4.0-CURRENT after fixing a hole
- in &man.jail.2;</entry>
- <entry>400010</entry>
- </row>
-
- <row>
- <entry>4.0-CURRENT after the <literal>sigset_t</literal>
- datatype change</entry>
- <entry>400011</entry>
- </row>
-
- <row>
- <entry>4.0-CURRENT after the cutover to the GCC 2.95.2
- compiler</entry>
- <entry>400012</entry>
- </row>
-
- <row>
- <entry>4.0-CURRENT after adding pluggable linux-mode
- ioctl handlers</entry>
- <entry>400013</entry>
- </row>
-
- <row>
- <entry>4.0-CURRENT after importing OpenSSL</entry>
- <entry>400014</entry>
- </row>
-
- <row>
- <entry>4.0-CURRENT after the C++ ABI change in GCC 2.95.2
- from -fvtable-thunks to -fno-vtable-thunks by
- default</entry>
- <entry>400015</entry>
- </row>
-
- <row>
- <entry>4.0-CURRENT after importing OpenSSH</entry>
- <entry>400016</entry>
- </row>
-
- <row>
- <entry>4.0-RELEASE</entry>
- <entry>400017</entry>
- </row>
-
- <row>
- <entry>4.0-STABLE after 4.0-RELEASE</entry>
- <entry>400018</entry>
- </row>
-
- <row>
- <entry>4.0-STABLE after merging libxpg4 code into
- libc.</entry>
- <entry>400020</entry>
- </row>
-
- <row>
- <entry>4.0-STABLE after upgrading Binutils to 2.10.0, ELF
- branding changes, and tcsh in the base system.</entry>
- <entry>400021</entry>
- </row>
-
- <row>
- <entry>4.1-RELEASE</entry>
- <entry>410000</entry>
- </row>
-
- <row>
- <entry>4.1-STABLE after 4.1-RELEASE</entry>
- <entry>410001</entry>
- </row>
-
- <row>
- <entry>4.1-STABLE after &man.setproctitle.3; moved from
- libutil to libc.</entry>
- <entry>410002</entry>
- </row>
-
- <row>
- <entry>4.1.1-RELEASE</entry>
- <entry>411000</entry>
- </row>
-
- <row>
- <entry>4.1.1-STABLE after 4.1.1-RELEASE</entry>
- <entry>411001</entry>
- </row>
-
- <row>
- <entry>4.2-RELEASE</entry>
- <entry>420000</entry>
- </row>
-
- <row>
- <entry>4.2-STABLE after combining libgcc.a and
- libgcc_r.a, and associated GCC linkage changes.</entry>
- <entry>420001</entry>
- </row>
-
- <row>
- <entry>4.3-RELEASE</entry>
- <entry>430000</entry>
- </row>
-
- <row>
- <entry>4.3-STABLE after wint_t introduction.</entry>
- <entry>430001</entry>
- </row>
-
- <row>
- <entry>4.3-STABLE after PCI powerstate API merge.</entry>
- <entry>430002</entry>
- </row>
-
- <row>
- <entry>4.4-RELEASE</entry>
- <entry>440000</entry>
- </row>
-
-
- <row>
- <entry>5.0-CURRENT</entry>
- <entry>500000</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after adding addition ELF header fields,
- and changing our ELF binary branding method.</entry>
- <entry>500001</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after kld metadata changes.</entry>
- <entry>500002</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after buf/bio changes.</entry>
- <entry>500003</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after binutils upgrade.</entry>
- <entry>500004</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after merging libxpg4 code into
- libc and after TASKQ interface introduction.</entry>
- <entry>500005</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after the addition of AGP
- interfaces.</entry>
- <entry>500006</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after Perl upgrade to 5.6.0</entry>
- <entry>500007</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after the update of KAME code to
- 2000/07 sources.</entry>
- <entry>500008</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after ether_ifattach() and
- ether_ifdetach() changes.</entry>
- <entry>500009</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after changing mtree defaults
- back to original variant, adding -L to follow
- symlinks.</entry>
- <entry>500010</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after kqueue API changed.</entry>
- <entry>500011</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after &man.setproctitle.3; moved from
- libutil to libc.</entry>
- <entry>500012</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after the first SMPng commit.</entry>
- <entry>500013</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after &lt;sys/select.h&gt; moved to
- &lt;sys/selinfo.h&gt;.</entry>
- <entry>500014</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after combining libgcc.a and
- libgcc_r.a, and associated GCC linkage changes.</entry>
- <entry>500015</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after change allowing libc and libc_r
- to be linked together, deprecating -pthread option.</entry>
- <entry>500016</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after switch from struct ucred to
- struct xucred to stabilize kernel-exported API for
- mountd et al.</entry>
- <entry>500017</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after addition of CPUTYPE make variable
- for controlling CPU-specific optimizations.</entry>
- <entry>500018</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after moving machine/ioctl_fd.h to
- sys/fdcio.h</entry>
- <entry>500019</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after locale names renaming.</entry>
- <entry>500020</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after Bzip2 import.</entry>
- <entry>500021</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after SSE support.</entry>
- <entry>500022</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after KSE Milestone 2.</entry>
- <entry>500023</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after d_thread_t.</entry>
- <entry>500024</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after ABI change for discriptor
- and creds passing on 64 bit platforms.</entry>
- <entry>500025</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after moving to XFree86 4 by default for
- package builds, and after the new libc strnstr() function
- was added.</entry>
- <entry>500026</entry>
- </row>
-
- <row>
- <entry>5.0-CURRENT after the new libc strcasestr() function
- was added.</entry>
- <entry>500027</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </listitem>
- </itemizedlist>
-
- <note>
- <para>Note that 2.2-STABLE sometimes identifies itself as
- <quote>2.2.5-STABLE</quote> after the 2.2.5-RELEASE. The pattern
- used to be year followed by the month, but we decided to change it
- to a more straightforward major/minor system starting from 2.2.
- This is because the parallel development on several branches made
- it infeasible to classify the releases simply by their real
- release dates. If you are making a port now, you do not have to
- worry about old -CURRENTs; they are listed here just for your
- reference.</para>
- </note>
-
- <para>In the hundreds of ports that have been done, there have only
- been one or two cases where <literal>__FreeBSD__</literal> should
- have been used. Just because an earlier port screwed up and used it
- in the wrong place does not mean you should do so too.</para>
- </sect1>
-
- <sect1>
- <title>Writing something after
- <filename>bsd.port.mk</filename></title>
-
- <para>Do not write anything after the <literal>.include
- &lt;bsd.port.mk&gt;</literal> line. It usually can be avoided by
- including <filename>bsd.port.pre.mk</filename> somewhere in the
- middle of your <filename>Makefile</filename> and
- <filename>bsd.port.post.mk</filename> at the end.</para>
-
- <note>
- <para>You need to include either the
- <filename>pre.mk</filename>/<filename>post.mk</filename> pair or
- <filename>bsd.port.mk</filename> only; do not mix these two.</para>
- </note>
-
- <para><filename>bsd.port.pre.mk</filename> only defines a few
- variables, which can be used in tests in the
- <filename>Makefile</filename>, <filename>bsd.port.post.mk</filename>
- defines the rest.</para>
-
- <para>Here are some important variables defined in
- <filename>bsd.port.pre.mk</filename> (this is not the complete list,
- please read <filename>bsd.port.mk</filename> for the complete
- list).</para>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <thead>
- <row>
- <entry>Variable</entry>
- <entry>Description</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry><makevar>ARCH</makevar></entry>
- <entry>The architecture as returned by <command>uname
- -m</command> (e.g., <literal>i386</literal>)</entry>
- </row>
-
- <row>
- <entry><makevar>OPSYS</makevar></entry>
- <entry>The operating system type, as returned by
- <command>uname -s</command> (e.g.,
- <literal>FreeBSD</literal>)</entry>
- </row>
-
- <row>
- <entry><makevar>OSREL</makevar></entry>
- <entry>The release version of the operating system (e.g.,
- <literal>2.1.5</literal> or
- <literal>2.2.7</literal>)</entry>
- </row>
-
- <row>
- <entry><makevar>OSVERSION</makevar></entry>
- <entry>The numeric version of the operating system, same as
- <link
- linkend="porting-versions"><literal>__FreeBSD_version</literal></link>.</entry>
- </row>
-
- <row>
- <entry><makevar>PORTOBJFORMAT</makevar></entry>
- <entry>The object format of the system
- (<literal>aout</literal> or <literal>elf</literal>)</entry>
- </row>
-
- <row>
- <entry><makevar>LOCALBASE</makevar></entry>
- <entry>The base of the <quote>local</quote> tree (e.g.,
- <literal>/usr/local/</literal>)</entry>
- </row>
-
- <row>
- <entry><makevar>X11BASE</makevar></entry>
- <entry>The base of the <quote>X11</quote> tree (e.g.,
- <literal>/usr/X11R6</literal>)</entry>
- </row>
-
- <row>
- <entry><makevar>PREFIX</makevar></entry>
- <entry>Where the port installs itself (see <link
- linkend="porting-prefix">more on
- <makevar>PREFIX</makevar></link>).</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <note>
- <para>If you have to define the variables
- <makevar>USE_IMAKE</makevar>, <makevar>USE_X_PREFIX</makevar>, or
- <makevar>MASTERDIR</makevar>, do so before including
- <filename>bsd.port.pre.mk</filename>.</para>
- </note>
-
- <para>Here are some examples of things you can write after
- <filename>bsd.port.pre.mk</filename>:</para>
-
- <programlisting># no need to compile lang/perl5 if perl5 is already in system
-.if ${OSVERSION} > 300003
-BROKEN= perl is in system
-.endif
-
-# only one shlib version number for ELF
-.if ${PORTOBJFORMAT} == "elf"
-TCL_LIB_FILE= ${TCL_LIB}.${SHLIB_MAJOR}
-.else
-TCL_LIB_FILE= ${TCL_LIB}.${SHLIB_MAJOR}.${SHLIB_MINOR}
-.endif
-
-# software already makes link for ELF, but not for a.out
-post-install:
-.if ${PORTOBJFORMAT} == "aout"
- ${LN} -sf liblinpack.so.1.0 ${PREFIX}/lib/liblinpack.so
-.endif</programlisting>
- </sect1>
-
- <sect1>
- <title>Install additional documentation</title>
-
- <para>If your software has some documentation other than the standard
- man and info pages that you think is useful for the user, install it
- under <filename><makevar>PREFIX</makevar>/share/doc</filename>.
- This can be done, like the previous item, in the
- <maketarget>post-install</maketarget> target.</para>
-
- <para>Create a new directory for your port. The directory name should
- reflect what the port is. This usually means
- <makevar>PORTNAME</makevar>. However, if you
- think the user might want different versions of the port to be
- installed at the same time, you can use the whole
- <makevar>PKGNAME</makevar>.</para>
-
- <para>Make the installation dependent to the variable
- <makevar>NOPORTDOCS</makevar> so that users can disable it in
- <filename>/etc/make.conf</filename>, like this:</para>
-
- <programlisting>post-install:
-.if !defined(NOPORTDOCS)
- ${MKDIR} ${PREFIX}/share/doc/xv
- ${INSTALL_MAN} ${WRKSRC}/docs/xvdocs.ps ${PREFIX}/share/doc/xv
-.endif</programlisting>
-
- <para>All documentation files and directories installed should
- be included in <filename>pkg-plist</filename> with the
- <literal>%%PORTDOCS%%</literal> prefix, for example:</para>
-
- <programlisting>%%PORTDOCS%%share/doc/pure-ftpd/AUTHORS
-%%PORTDOCS%%share/doc/pure-ftpd/CONTACT
-%%PORTDOCS%%@dirrm share/doc/pure-ftpd</programlisting>
-
- <para>You can also use the <filename>pkg-message</filename> file to
- display messages upon installation. See the <link
- linkend="porting-message">using
- <filename>pkg-message</filename></link> section for
- details.</para>
-
- <note>
- <para><filename>pkg-message</filename> does not need to be added to
- <filename>pkg-plist</filename>.</para>
- </note>
- </sect1>
-
- <sect1>
- <title><makevar>DIST_SUBDIR</makevar></title>
-
- <para>Do not let your port clutter
- <filename>/usr/ports/distfiles</filename>. If your port requires a
- lot of files to be fetched, or contains a file that has a name that
- might conflict with other ports (e.g.,
- <filename>Makefile</filename>), set <makevar>DIST_SUBDIR</makevar>
- to the name of the port (<literal>${PORTNAME}</literal> or
- <literal>${PKGNAMEPREFIX}${PORTNAME}</literal>
- should work fine). This will change
- <makevar>DISTDIR</makevar> from the default
- <filename>/usr/ports/distfiles</filename> to
- <filename>/usr/ports/distfiles/<makevar>DIST_SUBDIR</makevar></filename>,
- and in effect puts everything that is required for your port into
- that subdirectory.</para>
-
- <para>It will also look at the subdirectory with the same name on the
- backup master site at <filename>ftp.FreeBSD.org</filename>.
- (Setting <makevar>DISTDIR</makevar> explicitly in your
- <makevar>Makefile</makevar> will not accomplish this, so please use
- <makevar>DIST_SUBDIR</makevar>.)</para>
-
- <note>
- <para>This does not affect the <makevar>MASTER_SITES</makevar> you
- define in your Makefile.</para>
- </note>
- </sect1>
-
- <sect1>
- <title>Package information</title>
-
- <para>Do include package information, i.e.
- <filename>pkg-comment</filename>, <filename>pkg-descr</filename>, and
- <filename>pkg-plist</filename>.</para>
-
- <note>
- <para>Note that these files are not used only for packaging anymore,
- and are <emphasis>mandatory</emphasis> now, even if
- <makevar>NO_PACKAGE</makevar> is set.</para>
- </note>
- </sect1>
-
- <sect1>
- <title>RCS strings</title>
-
- <para>Do not put RCS strings in patches. CVS will mangle them when we
- put the files into the ports tree, and when we check them out again,
- they will come out different and the patch will fail. RCS strings
- are surrounded by dollar (<literal>&dollar;</literal>) signs, and
- typically start with <literal>&dollar;Id</literal> or
- <literal>&dollar;RCS</literal>.</para>
- </sect1>
-
- <sect1>
- <title>Recursive diff</title>
-
- <para>Using the recurse (<option>-r</option>) option to
- <command>diff</command> to generate patches is fine, but please take
- a look at the resulting patches to make sure you do not have any
- unnecessary junk in there. In particular, diffs between two backup
- files, <filename>Makefiles</filename> when the port uses
- <command>Imake</command> or GNU <command>configure</command>, etc.,
- are unnecessary and should be deleted. If you had to edit
- <filename>configure.in</filename> and run
- <command>autoconf</command> to regenerate
- <command>configure</command>, do not take the diffs of
- <command>configure</command> (it often grows to a few thousand
- lines!); define <literal>USE_AUTOCONF=yes</literal> and take the
- diffs of <filename>configure.in</filename>.</para>
-
- <para>Also, if you had to delete a file, then you can do it in the
- <maketarget>post-extract</maketarget> target rather than as part of
- the patch. Once you are happy with the resulting diff, please split
- it up into one source file per patch file.</para>
- </sect1>
-
- <sect1 id="porting-prefix">
- <title><makevar>PREFIX</makevar></title>
-
- <para>Do try to make your port install relative to
- <makevar>PREFIX</makevar>. (The value of this variable will be set
- to <makevar>LOCALBASE</makevar> (default
- <filename>/usr/local</filename>), unless
- <makevar>USE_X_PREFIX</makevar> or <makevar>USE_IMAKE</makevar> is
- set, in which case it will be <makevar>X11BASE</makevar> (default
- <filename>/usr/X11R6</filename>).)</para>
-
- <para>Not hard-coding <filename>/usr/local</filename> or
- <filename>/usr/X11R6</filename> anywhere in the source will make the
- port much more flexible and able to cater to the needs of other
- sites. For X ports that use <command>imake</command>, this is
- automatic; otherwise, this can often be done by simply replacing the
- occurrences of <filename>/usr/local</filename> (or
- <filename>/usr/X11R6</filename> for X ports that do not use imake)
- in the various scripts/Makefiles in the port to read
- <makevar>PREFIX</makevar>, as this variable is automatically passed
- down to every stage of the build and install processes.</para>
-
- <para>Make sure your application isn't installing things in
- <filename>/usr/local</filename> instead of <makevar>PREFIX</makevar>.
- A quick test for this is to do this is:</para>
-
- <screen>&prompt.root; <userinput>make clean; make package PREFIX=/var/tmp/<replaceable>port-name</replaceable></userinput></screen>
-
- <para>If anything is installed outside of <makevar>PREFIX</makevar>,
- making the package creation process will complain that it
- can't find the files.</para>
-
- <!-- XXX This paragraph is confusing and poorly indented. -->
- <para>This does not test for the existence of internal references,
- or correct use of <makevar>LOCALBASE</makevar> for references to
- files from other ports. Testing the installation in
- <filename>/var/tmp/<replaceable>port-name</replaceable></filename>
- to do that that while you have it installed would do that.</para>
-
- <para>Do not set <makevar>USE_X_PREFIX</makevar> unless your port
- truly requires it (i.e., it links against X libs or it needs to
- reference files in <makevar>X11BASE</makevar>).</para>
-
- <para>The variable <makevar>PREFIX</makevar> can be reassigned in your
- <filename>Makefile</filename> or in the user's environment.
- However, it is strongly discouraged for individual ports to set this
- variable explicitly in the <filename>Makefiles</filename>.</para>
-
- <para>Also, refer to programs/files from other ports with the
- variables mentioned above, not explicit pathnames. For instance, if
- your port requires a macro <literal>PAGER</literal> to be the full
- pathname of <command>less</command>, use the compiler flag:
-
- <programlisting>-DPAGER=\"&dollar;{PREFIX}/bin/less\"</programlisting>
-
- or
-
- <programlisting>-DPAGER=\"&dollar;{LOCALBASE}/bin/less\"</programlisting>
-
- if this is an X port, instead of
- <literal>-DPAGER=\"/usr/local/bin/less\"</literal>. This way it will
- have a better chance of working if the system administrator has
- moved the whole `/usr/local' tree somewhere else.</para>
- </sect1>
-
- <sect1>
- <title>Subdirectories</title>
-
- <para>Try to let the port put things in the right subdirectories of
- <makevar>PREFIX</makevar>. Some ports lump everything and put it in
- the subdirectory with the port's name, which is incorrect. Also,
- many ports put everything except binaries, header files and manual
- pages in the a subdirectory of <filename>lib</filename>, which does
- not bode well with the BSD paradigm. Many of the files should be
- moved to one of the following: <filename>etc</filename>
- (setup/configuration files), <filename>libexec</filename>
- (executables started internally), <filename>sbin</filename>
- (executables for superusers/managers), <filename>info</filename>
- (documentation for info browser) or <filename>share</filename>
- (architecture independent files). See man &man.hier.7; for details,
- the rules governing
- <filename>/usr</filename> pretty much apply to
- <filename>/usr/local</filename> too. The exception are ports
- dealing with USENET <quote>news</quote>. They may use
- <filename><makevar>PREFIX</makevar>/news</filename> as a destination
- for their files.</para>
- </sect1>
-
- <sect1 id="porting-cleaning">
- <title>Cleaning up empty directories</title>
-
- <para>Do make your ports clean up after themselves when they are
- deinstalled. This is usually accomplished by adding
- <literal>@dirrm</literal> lines for all directories that are
- specifically created by the port. You need to delete subdirectories
- before you can delete parent directories.</para>
-
- <programlisting> :
-lib/X11/oneko/pixmaps/cat.xpm
-lib/X11/oneko/sounds/cat.au
- :
-@dirrm lib/X11/oneko/pixmaps
-@dirrm lib/X11/oneko/sounds
-@dirrm lib/X11/oneko</programlisting>
-
- <para>However, sometimes <literal>@dirrm</literal> will give you
- errors because other ports also share the same subdirectory. You
- can call <command>rmdir</command> from <literal>@unexec</literal> to
- remove only empty directories without warning.</para>
-
- <programlisting>@unexec rmdir %D/share/doc/gimp 2>/dev/null || true</programlisting>
-
- <para>This will neither print any error messages nor cause
- <command>pkg_delete</command> to exit abnormally even if
- <filename><makevar>PREFIX</makevar>/share/doc/gimp</filename> is not
- empty due to other ports installing some files in there.</para>
- </sect1>
-
- <sect1>
- <title>UIDs</title>
-
- <para>If your port requires a certain user to be on the installed
- system, let the <filename>pkg-install</filename> script call
- <command>pw</command> to create it automatically. Look at
- <filename>net/cvsup-mirror</filename> for an example.</para>
-
- <para>If your port must use the same user/group ID number when it is
- installed as a binary package as when it was compiled, then you must
- choose a free UID from 50 to 99 and register it below. Look at
- <filename>japanese/Wnn</filename> for an example.</para>
-
- <para>Make sure you do not use a UID already used by the system or
- other ports. This is the current list of UIDs between 50 and
- 99.</para>
-
- <programlisting>majordom:*:54:54:Majordomo Pseudo User:/usr/local/majordomo:/nonexistent
-cyrus:*:60:60:the cyrus mail server:/nonexistent:/nonexistent
-gnats:*:61:1:GNATS database owner:/usr/local/share/gnats/gnats-db:/bin/sh
-uucp:*:66:66:UUCP pseudo-user:/var/spool/uucppublic:/usr/libexec/uucp/uucico
-xten:*:67:67:X-10 daemon:/usr/local/xten:/nonexistent
-pop:*:68:6:Post Office Owner (popper):/nonexistent:/nonexistent
-wnn:*:69:7:Wnn:/nonexistent:/nonexistent
-ifmail:*:70:66:Ifmail user:/nonexistent:/nonexistent
-pgsql:*:70:70:PostgreSQL pseudo-user:/usr/local/pgsql:/bin/sh
-ircd:*:72:72:IRCd hybrid:/nonexistent:/nonexistent
-alias:*:81:81:QMail user:/var/qmail/alias:/nonexistent
-qmaill:*:83:81:QMail user:/var/qmail:/nonexistent
-qmaild:*:82:81:QMail user:/var/qmail:/nonexistent
-qmailq:*:85:82:QMail user:/var/qmail:/nonexistent
-qmails:*:87:82:QMail user:/var/qmail:/nonexistent
-qmailp:*:84:81:QMail user:/var/qmail:/nonexistent
-qmailr:*:86:82:QMail user:/var/qmail:/nonexistent
-msql:*:87:87:mSQL-2 pseudo-user:/var/db/msqldb:/bin/sh
-mysql:*:88:88:MySQL Daemon:/var/db/mysql:/sbin/nologin
-vpopmail:*:89:89::0:0:User &:/usr/local/vpopmail:/nonexistent
-smmsp:*:90:90:Sendmail Queue:/nonexistent:/nonexistent</programlisting>
-
- <para>Please include a notice when you submit a port (or an upgrade)
- that reserves a new UID or GID in this range. This allows us to
- keep the list of reserved IDs up to date.</para>
- </sect1>
-
- <sect1>
- <title>Do things rationally</title>
-
- <para>The <filename>Makefile</filename> should do things simply and
- reasonably. If you can make it a couple of lines shorter or more
- readable, then do so. Examples include using a make
- <literal>.if</literal> construct instead of a shell
- <literal>if</literal> construct, not redefining
- <maketarget>do-extract</maketarget> if you can redefine
- <makevar>EXTRACT*</makevar> instead, and using
- <makevar>GNU_CONFIGURE</makevar> instead of <literal>CONFIGURE_ARGS
- += --prefix=&dollar;{PREFIX}</literal>.</para>
- </sect1>
-
- <sect1>
- <title>Respect <makevar>CFLAGS</makevar></title>
-
- <para>The port should respect the <makevar>CFLAGS</makevar> variable.
- If it does not, please add <literal>NO_PACKAGE=ignores
- cflags</literal> to the <filename>Makefile</filename>.</para>
-
- <para>An example of a <filename>Makefile</filename> respecting
- the <makevar>CFLAGS</makevar> variable follows. Note the
- <makevar>+=</makevar>:</para>
-
- <programlisting>CFLAGS += -Wall -Werror</programlisting>
-
- <para>Here is an example which does not respect the
- <makevar>CFLAGS</makevar> variable:</para>
-
- <programlisting>CFLAGS = -Wall -Werror</programlisting>
-
- <para>The <makevar>CFLAGS</makevar> variable is defined on
- FreeBSD systems in <filename>/etc/make.conf</filename>. The
- first example appends additional flags to the
- <makevar>CFLAGS</makevar> variable, preserving any system-wide
- definitions. The second example clobbers anything previously
- defined.</para>
- </sect1>
-
- <sect1>
- <title>Configuration files</title>
-
- <para>If your port requires some configuration files in
- <filename><makevar>PREFIX</makevar>/etc</filename>, do
- <emphasis>not</emphasis> just install them and list them in
- <filename>pkg-plist</filename>. That will cause
- <command>pkg_delete</command> to delete files carefully edited by
- the user and a new installation to wipe them out.</para>
-
- <para>Instead, install sample files with a suffix
- (<filename><replaceable>filename</replaceable>.sample</filename>
- will work well) and print out a <link
- linkend="porting-message">message</link> pointing out that the
- user has to copy and edit the file before the software can be made
- to work.</para>
- </sect1>
-
- <sect1>
- <title>Portlint</title>
-
- <para>Do check your work with <link
- linkend="porting-portlint"><command>portlint</command></link>
- before you submit or commit it.</para>
- </sect1>
-
- <sect1>
- <title>Feedback</title>
-
- <para>Do send applicable changes/patches to the original
- author/maintainer for inclusion in next release of the code. This
- will only make your job that much easier for the next
- release.</para>
- </sect1>
-
- <sect1>
- <title><filename>README.html</filename></title>
-
- <para>Do not include the <filename>README.html</filename> file. This
- file is not part of the cvs collection but is generated using the
- <command>make readme</command> command.
- </para>
- </sect1>
-
- <sect1>
- <title>Miscellanea</title>
-
- <para>The files <filename>pkg-comment</filename>,
- <filename>pkg-descr</filename>, and <filename>pkg-plist</filename>
- should each be double-checked. If you are reviewing a port and feel
- they can be worded better, do so.</para>
-
- <para>Do not copy more copies of the GNU General Public License into
- our system, please.</para>
-
- <para>Please be careful to note any legal issues! Do not let us
- illegally distribute software!</para>
- </sect1>
-
- <sect1>
- <title>If you are stuck&hellip;</title>
-
- <para>Do look at existing examples and the
- <filename>bsd.port.mk</filename> file before asking us questions!
- <!-- smiley --><emphasis>;-)</emphasis></para>
-
- <para>Do ask us questions if you have any trouble! Do not just beat
- your head against a wall! <!-- smiley
- --><emphasis>:-)</emphasis></para>
- </sect1>
- </chapter>
-
- <chapter id="porting-samplem">
- <title>A Sample <filename>Makefile</filename></title>
-
- <para>Here is a sample <filename>Makefile</filename> that you can use to
- create a new port. Make sure you remove all the extra comments (ones
- between brackets)!</para>
-
- <para>It is recommended that you follow this format (ordering of
- variables, empty lines between sections, etc.). This format is
- designed so that the most important information is easy to locate. We
- recommend that you use <link
- linkend="porting-portlint">portlint</link> to check the
- <filename>Makefile</filename>.</para>
-
- <programlisting>[the header...just to make it easier for us to identify the ports.]
-# New ports collection makefile for: xdvi
-[the "version required" line is only needed when the PORTVERSION
- variable is not specific enough to describe the port.]
-# Date created: 26 May 1995
-[this is the person who did the original port to FreeBSD, in particular, the
-person who wrote the first version of this Makefile. Remember, this should
-not be changed when upgrading the port later.]
-# Whom: Satoshi Asami &lt;asami@FreeBSD.org&gt;
-#
-# &dollar;FreeBSD&dollar;
-[ ^^^^^^^^^ This will be automatically replaced with RCS ID string by CVS
-when it is committed to our repository. If upgrading a port, do not alter
-this line back to "&dollar;FreeBSD&dollar;". CVS deals with it automatically.]
-#
-
-[section to describe the port itself and the master site - PORTNAME
- and PORTVERSION are always first, followed by CATEGORIES,
- and then MASTER_SITES, which can be followed by MASTER_SITE_SUBDIR.
- PKGNAMEPREFIX and PKGNAMESUFFIX, if needed, will be after that.
- Then comes DISTNAME, EXTRACT_SUFX and/or DISTFILES, and then
- EXTRACT_ONLY, as necessary.]
-PORTNAME= xdvi
-PORTVERSION= 18.2
-CATEGORIES= print
-[do not forget the trailing slash ("/")!
- if you are not using MASTER_SITE_* macros]
-MASTER_SITES= ${MASTER_SITE_XCONTRIB}
-MASTER_SITE_SUBDIR= applications
-PKGNAMEPREFIX= ja-
-DISTNAME= xdvi-pl18
-[set this if the source is not in the standard ".tar.gz" form]
-EXTRACT_SUFX= .tar.Z
-
-[section for distributed patches -- can be empty]
-PATCH_SITES= ftp://ftp.sra.co.jp/pub/X11/japanese/
-PATCHFILES= xdvi-18.patch1.gz xdvi-18.patch2.gz
-
-[maintainer; *mandatory*! This is the person (preferably with commit
- privileges) whom a user can contact for questions and bug reports - this
- person should be the porter or someone who can forward questions to the
- original porter reasonably promptly. If you really do not want to have
- your address here, set it to "ports@FreeBSD.org".]
-MAINTAINER= asami@FreeBSD.org
-
-[dependencies -- can be empty]
-RUN_DEPENDS= gs:${PORTSDIR}/print/ghostscript
-LIB_DEPENDS= Xpm.5:${PORTSDIR}/graphics/xpm
-
-[this section is for other standard bsd.port.mk variables that do not
- belong to any of the above]
-[If it asks questions during configure, build, install...]
-IS_INTERACTIVE= yes
-[If it extracts to a directory other than ${DISTNAME}...]
-WRKSRC= ${WRKDIR}/xdvi-new
-[If the distributed patches were not made relative to ${WRKSRC}, you
- may need to tweak this]
-PATCH_DIST_STRIP= -p1
-[If it requires a "configure" script generated by GNU autoconf to be run]
-GNU_CONFIGURE= yes
-[If it requires GNU make, not /usr/bin/make, to build...]
-USE_GMAKE= yes
-[If it is an X application and requires "xmkmf -a" to be run...]
-USE_IMAKE= yes
-[et cetera.]
-
-[non-standard variables to be used in the rules below]
-MY_FAVORITE_RESPONSE= "yeah, right"
-
-[then the special rules, in the order they are called]
-pre-fetch:
- i go fetch something, yeah
-
-post-patch:
- i need to do something after patch, great
-
-pre-install:
- and then some more stuff before installing, wow
-
-[and then the epilogue]
-.include &lt;bsd.port.mk&gt;</programlisting>
- </chapter>
-
- <chapter id="porting-autoplist">
- <title>Automated package list creation</title>
-
- <para>First, make sure your port is almost complete, with only
- <filename>pkg-plist</filename> missing. Create an empty
- <filename>pkg-plist</filename>.</para>
-
- <screen>&prompt.root; <userinput>touch pkg-plist</userinput></screen>
-
- <para>Next, create a new set of directories which your port can be
- installed, and install any dependencies.</para>
-
- <screen>&prompt.root; <userinput>mtree -U -f /etc/mtree/BSD.local.dist -d -e -p /var/tmp/<replaceable>port-name</replaceable></userinput>
-&prompt.root; <userinput>make depends PREFIX=/var/tmp/<replaceable>port-name</replaceable></userinput></screen>
-
- <para>Store the directory structure in a new file.</para>
-
- <screen>&prompt.root; <userinput>(cd /var/tmp/<replaceable>port-name</replaceable> && find * -type d) &gt; OLD-DIRS</userinput></screen>
-
- <para>If your port honors <makevar>PREFIX</makevar> (which it should)
- you can then install the port and create the package list.</para>
-
- <screen>&prompt.root; <userinput>make install PREFIX=/var/tmp/<replaceable>port-name</replaceable></userinput>
-&prompt.root; <userinput>(cd /var/tmp/<replaceable>port-name</replaceable> && find * \! -type d) &gt; pkg-plist</userinput></screen>
-
- <para>You must also add any newly created directories to the packing
- list.</para>
-
- <screen>&prompt.root; <userinput>(cd /var/tmp/<replaceable>port-name && find * -type d) | comm -13 OLD-DIRS - | sed -e 's#^#@dirrm #' &gt;&gt; pkg-plist</replaceable></userinput></screen>
-
- <para>Finally, you need to tidy up the packing list by hand; it isn't
- <emphasis>all</emphasis> automated. Manual pages should be listed in
- the port's <filename>Makefile</filename> under
- <makevar>MAN<replaceable>n</replaceable></makevar>, and not in the
- package list. User configuration files should be removed, or
- installed as
- <filename><replaceable>filename</replaceable>.sample</filename>.
- The <filename>info/dir</filename> file should not be listed
- and appropriate <filename>install-info</filename> lines should
- be added as noted in the <link linkend="porting-info">info
- files</link> section. Any
- libraries installed by the port should be listed as specified in the
- <link linkend="porting-shlibs">shared libraries</link> section.</para>
- </chapter>
-
- <chapter id="porting-pkgname">
- <title>Package Names</title>
-
- <para>The following are the conventions you should follow in naming your
- packages. This is to have our package directory easy to scan, as
- there are already lots and lots of packages and users are going to
- turn away if they hurt their eyes!</para>
-
- <para>The package name should look like
- <filename><replaceable><optional>language<optional>_region</optional></optional>-name<optional><optional>-</optional>compiled.specifics</optional>-version.numbers</replaceable></filename>.</para>
-
- <para>The package name is defined as
- <literal>${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}</literal>.
- Make sure to set the variables to conform to that format.</para>
-
- <orderedlist>
- <listitem>
- <para>FreeBSD strives to support the native language of its users.
- The <replaceable>language-</replaceable> part should be a two
- letter abbreviation of the natural language defined by ISO-639 if
- the port is specific to a certain language. Examples are
- <literal>ja</literal> for Japanese, <literal>ru</literal> for
- Russian, <literal>vi</literal> for Vietnamese,
- <literal>zh</literal> for Chinese, <literal>ko</literal> for
- Korean and <literal>de</literal> for German.</para>
-
- <para>If the port is specific to a certain region within the
- language area, add the two letter country code as well.
- Examples are <literal>en_US</literal> for US English and
- <literal>fr_CH</literal> for Swiss French.</para>
-
- <para>The <replaceable>language-</replaceable> part should
- be set in the <makevar>PKGNAMEPREFIX</makevar> variable.</para>
- </listitem>
-
- <listitem>
- <para>The first letter of <filename>name</filename> part
- should be lowercase. (The rest of the name can contain
- capital letters, so use your own discretion when you are
- converting a software name that has some capital letters in it.)
- There is a tradition of naming Perl 5 modules by
- prepending <literal>p5-</literal> and converting the double-colon
- separator to a hyphen; for example, the
- <literal>Data::Dumper</literal> module becomes
- <literal>p5-Data-Dumper</literal>. If the software in question
- has numbers, hyphens, or underscores in its name, you may include
- them as well (like <literal>kinput2</literal>).</para>
- </listitem>
-
- <listitem>
- <para>If the port can be built with different <link
- linkend="porting-masterdir">hardcoded defaults</link> (usually
- part of the directory name in a family of ports), the
- <replaceable>-compiled.specifics</replaceable> part should state
- the compiled-in defaults (the hyphen is optional). Examples are
- papersize and font units.</para>
-
- <para>The <replaceable>compiled.specifics</replaceable> part
- should be set in the <makevar>PKGNAMESUFFIX</makevar>
- variable.</para>
- </listitem>
-
- <listitem>
- <para>The version string should follow a dash
- (<literal>-</literal>) and be a period-separated list of
- integers and single lowercase alphabetics. In particular,
- it is not permissible to have another dash inside the
- version string. The only exception is the string
- <literal>pl</literal> (meaning `patchlevel'), which can be
- used <emphasis>only</emphasis> when there are no major and
- minor version numbers in the software. If the software
- version has strings like "alpha", "beta", "rc", or "pre", take
- the first letter and put it immediately after a period.
- If the version string continues after those names, the
- numbers should follow the single alphabet without an extra
- period between them.</para>
-
- <para>The idea is to make it easier to sort ports by looking
- at the version string. In particular, make sure version
- number components are always delimited by a period, and
- if the date is part of the string, use the
- <literal><replaceable>yyyy</replaceable>.<replaceable>mm</replaceable>.<replaceable>dd</replaceable></literal>
- format, not
- <literal><replaceable>dd</replaceable>.<replaceable>mm</replaceable>.<replaceable>yyyy</replaceable></literal>
- or the non-Y2K compliant
- <literal><replaceable>yy</replaceable>.<replaceable>mm</replaceable>.<replaceable>dd</replaceable></literal>
- format.</para>
- </listitem>
- </orderedlist>
-
- <para>Here are some (real) examples on how to convert the name
- as called by the software authors to a suitable package
- name:</para>
-
- <informaltable frame="none">
- <tgroup cols="6">
- <thead>
- <row>
- <entry>Distribution Name</entry>
- <entry><makevar>PKGNAMEPREFIX</makevar></entry>
- <entry><makevar>PORTNAME</makevar></entry>
- <entry><makevar>PKGNAMESUFFIX</makevar></entry>
- <entry><makevar>PORTVERSION</makevar></entry>
- <entry>Reason</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>mule-2.2.2</entry>
- <entry>(empty)</entry>
- <entry>mule</entry>
- <entry>(empty)</entry>
- <entry>2.2.2</entry>
- <entry>No changes required</entry>
- </row>
-
- <row>
- <entry>XFree86-3.3.6</entry>
- <entry>(empty)</entry>
- <entry>XFree86</entry>
- <entry>(empty)</entry>
- <entry>3.3.6</entry>
- <entry>No changes required</entry>
- </row>
-
- <row>
- <entry>EmiClock-1.0.2</entry>
- <entry>(empty)</entry>
- <entry>emiclock</entry>
- <entry>(empty)</entry>
- <entry>1.0.2</entry>
- <entry>No uppercase names for single programs</entry>
- </row>
-
- <row>
- <entry>rdist-1.3alpha</entry>
- <entry>(empty)</entry>
- <entry>rdist</entry>
- <entry>(empty)</entry>
- <entry>1.3.a</entry>
- <entry>No strings like <literal>alpha</literal>
- allowed</entry>
- </row>
-
- <row>
- <entry>es-0.9-beta1</entry>
- <entry>(empty)</entry>
- <entry>es</entry>
- <entry>(empty)</entry>
- <entry>0.9.b1</entry>
- <entry>No strings like <literal>beta</literal>
- allowed</entry>
- </row>
-
- <row>
- <entry>mailman-2.0rc3</entry>
- <entry>(empty)</entry>
- <entry>mailman</entry>
- <entry>(empty)</entry>
- <entry>2.0.r3</entry>
- <entry>No strings like <literal>rc</literal>
- allowed</entry>
- </row>
-
- <row>
- <entry>v3.3beta021.src</entry>
- <entry>(empty)</entry>
- <entry>tiff</entry>
- <entry>(empty)</entry>
- <entry>3.3</entry>
- <entry>What the heck was that anyway?</entry>
- </row>
-
- <row>
- <entry>tvtwm</entry>
- <entry>(empty)</entry>
- <entry>tvtwm</entry>
- <entry>(empty)</entry>
- <entry>pl11</entry>
- <entry>Version string always required</entry>
- </row>
-
- <row>
- <entry>piewm</entry>
- <entry>(empty)</entry>
- <entry>piewm</entry>
- <entry>(empty)</entry>
- <entry>1.0</entry>
- <entry>Version string always required</entry>
- </row>
-
- <row>
- <entry>xvgr-2.10pl1</entry>
- <entry>(empty)</entry>
- <entry>xvgr</entry>
- <entry>(empty)</entry>
- <entry>2.10.1</entry>
- <entry><literal>pl</literal> allowed only when no
- major/minor version numbers</entry>
- </row>
-
- <row>
- <entry>gawk-2.15.6</entry>
- <entry>ja-</entry>
- <entry>gawk</entry>
- <entry>(empty)</entry>
- <entry>2.15.6</entry>
- <entry>Japanese language version</entry>
- </row>
-
- <row>
- <entry>psutils-1.13</entry>
- <entry>(empty)</entry>
- <entry>psutils</entry>
- <entry>-letter</entry>
- <entry>1.13</entry>
- <entry>Papersize hardcoded at package build time</entry>
- </row>
-
- <row>
- <entry>pkfonts</entry>
- <entry>(empty)</entry>
- <entry>pkfonts</entry>
- <entry>300</entry>
- <entry>1.0</entry>
- <entry>Package for 300dpi fonts</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
-
- <para>If there is absolutely no trace of version information in the
- original source and it is unlikely that the original author will ever
- release another version, just set the version string to
- <literal>1.0</literal> (like the piewm example above). Otherwise, ask
- the original author or use the date string
- (<literal><replaceable>yyyy</replaceable>.<replaceable>mm</replaceable>.<replaceable>dd</replaceable></literal>)
- as the version.</para>
- </chapter>
-
- <chapter id="porting-categories">
- <title>Categories</title>
-
- <para>As you already know, ports are classified in several categories.
- But for this to work, it is important that porters and users understand
- what each category is for and how we decide what to put in each
- category.</para>
-
- <sect1>
- <title>Current list of categories</title>
-
- <para>First, this is the current list of port categories. Those
- marked with an asterisk (<literal>*</literal>) are
- <emphasis>virtual</emphasis> categories&mdash;those that do not have
- a corresponding subdirectory in the ports tree.</para>
-
- <note>
- <para>For non-virtual categories, you will find a one-line
- description in the <filename>pkg/COMMENT</filename> file in that
- subdirectory (e.g.,
- <filename>archivers/pkg/COMMENT</filename>).</para>
- </note>
-
- <informaltable frame="none">
- <tgroup cols="2">
- <thead>
- <row>
- <entry>Category</entry>
- <entry>Description</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry><filename>afterstep*</filename></entry>
- <entry>Ports to support the AfterStep window manager.</entry>
- </row>
-
- <row>
- <entry><filename>archivers</filename></entry>
- <entry>Archiving tools.</entry>
- </row>
-
- <row>
- <entry><filename>astro</filename></entry>
- <entry>Astronomical ports.</entry>
- </row>
-
- <row>
- <entry><filename>audio</filename></entry>
- <entry>Sound support.</entry>
- </row>
-
- <row>
- <entry><filename>benchmarks</filename></entry>
- <entry>Benchmarking utilities.</entry>
- </row>
-
- <row>
- <entry><filename>biology</filename></entry>
- <entry>Biology-related software.</entry>
- </row>
-
- <row>
- <entry><filename>cad</filename></entry>
- <entry>Computer aided design tools.</entry>
- </row>
-
- <row>
- <entry><filename>chinese</filename></entry>
- <entry>Chinese language support.</entry>
- </row>
-
- <row>
- <entry><filename>comms</filename></entry>
- <entry>Communication software. Mostly software to talk to
- your serial port.</entry>
- </row>
-
- <row>
- <entry><filename>converters</filename></entry>
- <entry>Character code converters.</entry>
- </row>
-
- <row>
- <entry><filename>databases</filename></entry>
- <entry>Databases.</entry>
- </row>
-
- <row>
- <entry><filename>deskutils</filename></entry>
- <entry>Things that used to be on the desktop before
- computers were invented.</entry>
- </row>
-
- <row>
- <entry><filename>devel</filename></entry>
- <entry>Development utilities. Do not put libraries here just
- because they are libraries&mdash;unless they truly do not
- belong anywhere else, they should not be in this
- category.</entry>
- </row>
-
- <row>
- <entry><filename>editors</filename></entry>
- <entry>General editors. Specialized editors go in the section
- for those tools (e.g., a mathematical-formula editor will go
- in <filename>math</filename>).</entry>
- </row>
-
- <row>
- <entry><filename>elisp*</filename></entry>
- <entry>Emacs-lisp ports.</entry>
- </row>
-
- <row>
- <entry><filename>emulators</filename></entry>
- <entry>Emulators for other operating systems. Terminal
- emulators do <emphasis>not</emphasis> belong
- here&mdash;X-based ones should go to
- <filename>x11</filename> and text-based ones to either
- <filename>comms</filename> or <filename>misc</filename>,
- depending on the exact functionality.</entry>
- </row>
-
- <row>
- <entry><filename>french</filename></entry>
- <entry>French language support.</entry>
- </row>
-
- <row>
- <entry><filename>ftp</filename></entry>
- <entry>FTP client and server utilities. If your
- port speaks both FTP and HTTP, put it in
- <filename>ftp</filename> with a secondary
- category of <filename>www</filename>.</entry>
- </row>
-
- <row>
- <entry><filename>games</filename></entry>
- <entry>Games.</entry>
- </row>
-
- <row>
- <entry><filename>german</filename></entry>
- <entry>German language support.</entry>
- </row>
-
- <row>
- <entry><filename>gnome*</filename></entry>
- <entry>Ports from the GNU Object Model Environment (GNOME)
- Project.</entry>
- </row>
-
- <row>
- <entry><filename>graphics</filename></entry>
- <entry>Graphics utilities.</entry>
- </row>
-
- <row>
- <entry><filename>hebrew</filename></entry>
- <entry>Hebrew language support.</entry>
- </row>
-
- <row>
- <entry><filename>irc</filename></entry>
- <entry>Internet Relay Chat utilities.</entry>
- </row>
-
- <row>
- <entry><filename>ipv6*</filename></entry>
- <entry>IPv6 related software.</entry>
- </row>
-
- <row>
- <entry><filename>japanese</filename></entry>
- <entry>Japanese language support.</entry>
- </row>
-
- <row>
- <entry><filename>java</filename></entry>
- <entry>Java language support.</entry>
- </row>
-
- <row>
- <entry><filename>kde*</filename></entry>
- <entry>Ports from the K Desktop Environment (KDE)
- Project.</entry>
- </row>
-
- <row>
- <entry><filename>korean</filename></entry>
- <entry>Korean language support.</entry>
- </row>
-
- <row>
- <entry><filename>lang</filename></entry>
- <entry>Programming languages.</entry>
- </row>
-
- <row>
- <entry><filename>linux*</filename></entry>
- <entry>Linux applications and support utilities.</entry>
- </row>
-
- <row>
- <entry><filename>mail</filename></entry>
- <entry>Mail software.</entry>
- </row>
-
- <row>
- <entry><filename>math</filename></entry>
- <entry>Numerical computation software and other utilities
- for mathematics.</entry>
- </row>
-
- <row>
- <entry><filename>mbone</filename></entry>
- <entry>MBone applications.</entry>
- </row>
-
- <row>
- <entry><filename>misc</filename></entry>
- <entry>Miscellaneous utilities&mdash;basically things that
- do not belong anywhere else. This is the only category
- that should not appear with any other non-virtual category.
- If you have <literal>misc</literal> with something else in
- your <makevar>CATEGORIES</makevar> line, that means you can
- safely delete <literal>misc</literal> and just put the port
- in that other subdirectory!</entry>
- </row>
-
- <row>
- <entry><filename>net</filename></entry>
- <entry>Miscellaneous networking software.</entry>
- </row>
-
- <row>
- <entry><filename>news</filename></entry>
- <entry>USENET news software.</entry>
- </row>
-
- <row>
- <entry><filename>offix*</filename></entry>
- <entry>Ports from the OffiX suite.</entry>
- </row>
-
- <row>
- <entry><filename>palm</filename></entry>
- <entry>Software support for the 3Com Palm(tm) series.</entry>
- </row>
-
- <row>
- <entry><filename>perl5*</filename></entry>
- <entry>Ports that require perl version 5 to run.</entry>
- </row>
-
- <row>
- <entry><filename>picobsd</filename></entry>
- <entry>Ports to support PicoBSD.</entry>
- </row>
-
- <row>
- <entry><filename>plan9*</filename></entry>
- <entry>Various programs from Plan9.</entry>
- </row>
-
- <row>
- <entry><filename>print</filename></entry>
- <entry>Printing software. Desktop publishing tools
- (previewers, etc.) belong here too.</entry>
- </row>
-
- <row>
- <entry><filename>python*</filename></entry>
- <entry>Software written in python.</entry>
- </row>
-
- <row>
- <entry><filename>ruby*</filename></entry>
- <entry>Software written in ruby.</entry>
- </row>
-
- <row>
- <entry><filename>russian</filename></entry>
- <entry>Russian language support.</entry>
- </row>
-
- <row>
- <entry><filename>science</filename></entry>
- <entry>Scientific ports that don't fit into other
- categories such as <filename>astro</filename>,
- <filename>biology</filename> and
- <filename>math</filename>.</entry>
- </row>
-
- <row>
- <entry><filename>security</filename></entry>
- <entry>Security utilities.</entry>
- </row>
-
- <row>
- <entry><filename>shells</filename></entry>
- <entry>Command line shells.</entry>
- </row>
-
- <row>
- <entry><filename>sysutils</filename></entry>
- <entry>System utilities.</entry>
- </row>
-
- <row>
- <entry><filename>tcl76*</filename></entry>
- <entry>Ports that use Tcl version 7.6 to run.</entry>
- </row>
-
- <row>
- <entry><filename>tcl80*</filename></entry>
- <entry>Ports that use Tcl version 8.0 to run.</entry>
- </row>
-
- <row>
- <entry><filename>tcl81*</filename></entry>
- <entry>Ports that use Tcl version 8.1 to run.</entry>
- </row>
-
- <row>
- <entry><filename>tcl82*</filename></entry>
- <entry>Ports that use Tcl version 8.2 to run.</entry>
- </row>
-
- <row>
- <entry><filename>textproc</filename></entry>
- <entry>Text processing utilities. It does not include
- desktop publishing tools, which go to print/.</entry>
- </row>
-
- <row>
- <entry><filename>tk42*</filename></entry>
- <entry>Ports that use Tk version 4.2 to run.</entry>
- </row>
-
- <row>
- <entry><filename>tk80*</filename></entry>
- <entry>Ports that use Tk version 8.0 to run.</entry>
- </row>
-
- <row>
- <entry><filename>tk81*</filename></entry>
- <entry>Ports that use Tk version 8.1 to run.</entry>
- </row>
-
- <row>
- <entry><filename>tk82*</filename></entry>
- <entry>Ports that use Tk version 8.2 to run.</entry>
- </row>
-
- <row>
- <entry><filename>tkstep80*</filename></entry>
- <entry>Ports that use TkSTEP version 8.0 to run.</entry>
- </row>
-
- <row>
- <entry><filename>ukrainian</filename></entry>
- <entry>Ukrainian language support.</entry>
- </row>
-
- <row>
- <entry><filename>vietnamese</filename></entry>
- <entry>Vietnamese language support.</entry>
- </row>
-
- <row>
- <entry><filename>windowmaker*</filename></entry>
- <entry>Ports to support the WindowMaker window
- manager</entry>
- </row>
-
- <row>
- <entry><filename>www</filename></entry>
- <entry>Software related to the World Wide Web. HTML language
- support belongs here too.</entry>
- </row>
-
- <row>
- <entry>x11</entry>
- <entry>The X window system and friends. This category is only
- for software that directly supports the window system. Do not
- put regular X applications here. If your port is an X
- application, define <makevar>USE_XLIB</makevar> (implied by
- <makevar>USE_IMAKE</makevar>) and put it in the appropriate
- categories. Also, many of them go into other
- <filename>x11-*</filename> categories (see below).</entry>
- </row>
-
- <row>
- <entry><filename>x11-clocks</filename></entry>
- <entry>X11 clocks.</entry>
- </row>
-
- <row>
- <entry><filename>x11-fm</filename></entry>
- <entry>X11 file managers.</entry>
- </row>
-
- <row>
- <entry><filename>x11-fonts</filename></entry>
- <entry>X11 fonts and font utilities.</entry>
- </row>
-
- <row>
- <entry><filename>x11-servers</filename></entry>
- <entry>X11 servers.</entry>
- </row>
-
- <row>
- <entry><filename>x11-toolkits</filename></entry>
- <entry>X11 toolkits.</entry>
- </row>
-
- <row>
- <entry><filename>x11-wm</filename></entry>
- <entry>X11 window managers.</entry>
- </row>
-
- <row>
- <entry><filename>zope*</filename></entry>
- <entry>Zope support.</entry>
- </row>
- </tbody>
- </tgroup>
- </informaltable>
- </sect1>
-
- <sect1>
- <title>Choosing the right category</title>
-
- <para>As many of the categories overlap, you often have to choose
- which of the categories should be the primary category of your port.
- There are several rules that govern this issue. Here is the list of
- priorities, in decreasing order of precedence.</para>
-
- <itemizedlist>
- <listitem>
- <para>Language specific categories always come first. For
- example, if your port installs Japanese X11 fonts, then your
- <makevar>CATEGORIES</makevar> line would read <literal>japanese
- x11-fonts</literal>.</para>
- </listitem>
-
- <listitem>
- <para>Specific categories win over less-specific ones. For
- instance, an HTML editor should be listed as <literal>www
- editors</literal>, not the other way around. Also, you do not
- need to list <literal>net</literal> when the port belongs to
- any of <literal>irc</literal>, <literal>mail</literal>,
- <literal>mbone</literal>, <literal>news</literal>,
- <literal>security</literal>, or <literal>www</literal>.</para>
- </listitem>
-
- <listitem>
- <para><literal>x11</literal> is used as a secondary category only
- when the primary category is a natural language. In particular,
- you should not put <literal>x11</literal> in the category line
- for X applications.</para>
- </listitem>
-
- <listitem>
- <para><application>Emacs</application> modes should be
- placed in the same ports category as the application
- supported by the mode, not in
- <filename>editors</filename>. For example, an
- <application>Emacs</application> mode to edit source
- files of some programming language should go into
- <filename>lang</filename>.
- </para>
- </listitem>
-
- <listitem>
- <para>If your port truly does not belong anywhere else, put it in
- <literal>misc</literal>.</para>
- </listitem>
- </itemizedlist>
-
- <para>If you are not sure about the category, please put a comment to
- that effect in your <command>send-pr</command> submission so we can
- discuss it before we import it. If you are a committer, send a note
- to the &a.ports; so we can discuss it first&mdash;too often new ports are
- imported to the wrong category only to be moved right away.</para>
- </sect1>
- </chapter>
-
- <chapter>
- <title>Changes to this document and the ports system</title>
-
- <para>If you maintain a lot of ports, you should consider following the
- &a.ports;. Important changes to the way ports work will be announced
- there. You can always find more detailed information on the latest
- changes by looking at <ulink
- url="http://www.FreeBSD.org/cgi/cvsweb.cgi/ports/Mk/bsd.port.mk"> the
- bsd.port.mk CVS log</ulink>.</para>
- </chapter>
-
- <chapter>
- <title>That is It, Folks!</title>
-
- <para>Boy, this sure was a long tutorial, wasn't it? Thanks for
- following us to here, really. Now that you know how to do a port,
- have at it and convert everything in the world into ports! That
- is the easiest way to start contributing to the FreeBSD Project!
- <!-- smiley --><emphasis>:-)</emphasis></para>
- </chapter>
-</book>
-
-<!--
- Local Variables:
- mode: sgml
- sgml-indent-data: t
- sgml-omittag: nil
- sgml-always-quote-attributes: t
- End:
--->
diff --git a/en_US.ISO8859-1/books/porters-handbook/freebsd.dsl b/en_US.ISO8859-1/books/porters-handbook/freebsd.dsl
deleted file mode 100644
index f02372d9c2..0000000000
--- a/en_US.ISO8859-1/books/porters-handbook/freebsd.dsl
+++ /dev/null
@@ -1,40 +0,0 @@
-<!-- $FreeBSD: doc/en_US.ISO8859-1/books/porters-handbook/freebsd.dsl,v 1.4 2001/06/03 00:07:28 dd Exp $ -->
-
-<!-- Local DSSSL file for the Porter's Handbook. This is so we can include
- a link to the -ports mailing list at the bottom of the HTML files,
- rather than the -questions mailing list. -->
-
-<!DOCTYPE style-sheet PUBLIC "-//James Clark//DTD DSSSL Style Sheet//EN" [
-<!ENTITY freebsd.dsl SYSTEM "../../share/sgml/freebsd.dsl" CDATA DSSSL>
-<!ENTITY % output.html "IGNORE">
-]>
-
-<style-sheet>
- <style-specification use="docbook">
- <style-specification-body>
-
- <![ %output.html; [
- (define ($email-footer$)
- (make sequence
- (literal "For questions about the FreeBSD ports system, e-mail <")
- (create-link (list (list "HREF" "mailto:ports@FreeBSD.org"))
- (literal "ports@FreeBSD.org"))
- (literal ">.")
- (make empty-element gi: "br")
- (literal "For questions about this documentation, e-mail <")
- (create-link (list (list "HREF" "mailto:doc@FreeBSD.org"))
- (literal "doc@FreeBSD.org"))
- (literal ">.")))
-
- <!-- Convert " ... " to `` ... '' in the HTML output. -->
- (element quote
- (make sequence
- (literal "``")
- (process-children)
- (literal "''")))
- ]]>
- </style-specification-body>
- </style-specification>
-
- <external-specification id="docbook" document="freebsd.dsl">
-</style-sheet>
diff --git a/en_US.ISO8859-1/books/ppp-primer/Makefile b/en_US.ISO8859-1/books/ppp-primer/Makefile
deleted file mode 100644
index 769be1a879..0000000000
--- a/en_US.ISO8859-1/books/ppp-primer/Makefile
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# $FreeBSD: doc/en_US.ISO_8859-1/books/faq/Makefile,v 1.6 1999/09/06 06:52:39 peter Exp $
-#
-# Build the PPP PrimerQ
-#
-
-MAINTAINER=nik@FreeBSD.org
-
-DOC?= book
-
-FORMATS?= html-split html
-
-INSTALL_COMPRESSED?= gz
-INSTALL_ONLY_COMPRESSED?=
-
-#
-# SRCS lists the individual SGML files that make up the document. Changes
-# to any of these files will force a rebuild
-#
-
-# SGML content
-SRCS= book.sgml
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/books/ppp-primer/book.sgml b/en_US.ISO8859-1/books/ppp-primer/book.sgml
deleted file mode 100644
index b0156838f3..0000000000
--- a/en_US.ISO8859-1/books/ppp-primer/book.sgml
+++ /dev/null
@@ -1,2372 +0,0 @@
-<!DOCTYPE BOOK PUBLIC "-//FreeBSD//DTD DocBook V4.1-Based Extension//EN" [
-<!ENTITY % man PUBLIC "-//FreeBSD//ENTITIES DocBook Manual Page Entities//EN">
-%man;
-]>
-
-<book>
-
-<bookinfo>
-<title>PPP - Pedantic PPP Primer</title>
-
-<authorgroup>
-<author>
-<firstname>Steve</firstname>
-<surname>Sims</surname>
-<affiliation>
-<address><email>SimsS@IBM.net</email></address>
-</affiliation>
-</author>
-</authorgroup>
-
-<pubdate>$FreeBSD: doc/en_US.ISO8859-1/books/ppp-primer/book.sgml,v 1.11 2001/07/17 20:51:52 chern Exp $</pubdate>
-
-<abstract><para>This is a step-by-step guide for configuring FreeBSD systems to act as
-a dial-up router/gateway in a Local Area Environment. All entries may
-be assumed to be relevant to FreeBSD 2.2+, unless otherwise noted.</para></abstract>
-
-</bookinfo>
-
-<preface>
-<title>Overview:</title>
-
-<para>The User-Mode PPP dialer in FreeBSD Version 2.2 (also known as:
-<emphasis remap=it>"IIJ-PPP"</emphasis> ) now supports Packet Aliasing for dial up
-connections to the Internet. This feature, also known as
-"<emphasis remap=it>Masquerading</emphasis>", "<emphasis remap=it>IP Aliasing</emphasis>", or "<emphasis remap=it>Network Address
-Translation</emphasis>", allows a FreeBSD system to act as a dial- on-demand
-router between an Ethernet-based Local Area Network and an Internet
-Service Provider. Systems on the LAN can use the FreeBSD system to
-forward information between the Internet by means of a single
-dial-connection.</para>
-
-<para>This guide explains how to:
-<itemizedlist>
-
-<listitem>
-<para>Configure the FreeBSD system to support dial-out connections,</para>
-</listitem>
-
-<listitem>
-<para>Share a dial-out connection with other systems in a network,</para>
-</listitem>
-
-<listitem>
-<para>Configure Windows platforms to use the FreeBSD system as a gateway to the Internet.</para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para>While the focus of this guide is to assist in configuring IP Aliasing,
-it also includes specific examples of the configuration steps necessary
-to configure and install each individual component; each section stands
-alone and may be used to assist in the configuration of various aspects
-of FreeBSD internetworking.</para>
-
-</preface>
-
-<chapter>
-<title>Building the Local Area Network</title>
-
-<para> While the ppp program can, and usually is, be configured to provide
-services to <emphasis>only</emphasis> the local FreeBSD box it can also be used to serve as a
-"Gateway" (or "router") between other LAN-connected resources and the Internet or
-other Dial-Up service.</para>
-
-
-<sect1>
-<title>Typical Network Topology</title>
-
-<para>This guide assumes a typical Local Area Network lashed together as
-follows:
-<programlisting>
-+---------+ ----&gt; Dial-Up Internet Connection
-| FreeBSD | \ (i.e.: NetCom, AOL, AT&amp;T, EarthLink,
-etc)
-| |--------
-| "Curly" |
-| |
-+----+----+
- |
-|----+-------------+-------------+----| &lt;-- Ethernet Network
- | | |
- | | |
-+----+----+ +----+----+ +----+----+
-| | | | | |
-| Win95 | | WFW | | WinNT |
-| "Larry" | | "Moe" | | "Shemp" |
-| | | | | |
-+---------+ +---------+ +---------+</programlisting>
-</para>
-
-</sect1>
-
-<sect1>
-<title>Assumptions about the Local Area Network</title>
-
-<para>Some specific assumptions about this sample network are:</para>
-
-<para>Three workstations and a Server are connected with Ethernet
-cabling:
-<itemizedlist>
-
-<listitem>
-<para>a FreeBSD Server ("Curly") with an NE-2000 adapter configured as
-'ed0'</para>
-</listitem>
-
-<listitem>
-<para>a Windows-95 workstation ("Larry") with Microsoft's "native"
-32-bit TCP/IP drivers</para>
-</listitem>
-
-<listitem>
-<para>a Windows for Workgroups workstation ("Moe") with Microsoft's
-16-bit TCP/IP extensions</para>
-</listitem>
-
-<listitem>
-<para>a Windows NT workstation ("Shemp") with Microsoft's "native"
-32-bit TCP/IP drivers</para>
-</listitem>
-
-</itemizedlist>
- </para>
-
-<para>The IP addresses on the Ethernet side of this sample LAN have been
-taken from a pool addresses proposed reserved by RFC 1918 for use on
-private LANs, so you are free to use these actual IP addresses on your
-own LAN if you want. IP addresses are assigned as follows:</para>
-
-<informaltable>
- <tgroup cols=3>
- <thead>
- <row>
- <entry>Name</entry>
- <entry>IP Address</entry>
- <entry>Comment</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry><hostid>Curly</hostid></entry>
- <entry><hostid role="ipaddr">192.168.1.1</hostid></entry>
- <entry>The FreeBSD box</entry>
- </row>
-
- <row>
- <entry><hostid>Larry</hostid></entry>
- <entry><hostid role="ipaddr">192.168.1.2</hostid></entry>
- <entry>The Win'95 box</entry>
- </row>
-
- <row>
- <entry><hostid>Moe</hostid></entry>
- <entry><hostid role="ipaddr">192.168.1.3</hostid></entry>
- <entry>The WfW box</entry>
- </row>
-
- <row>
- <entry><hostid>Shemp</hostid></entry>
- <entry><hostid role="ipaddr">192.168.1.4</hostid></entry>
- <entry>The Windows NT box</entry>
- </row>
- </tbody>
- </tgroup>
-</informaltable>
-
-<para>This guide assumes that the modem on the FreeBSD box is connected
-to the first serial port ('<filename>/dev/cuaa0</filename>' or '<emphasis remap=tt>COM1:</emphasis>' in
-DOS-terms).</para>
-
-<para>Finally, we'll also assume that your Internet Service Provider (ISP)
-automatically provides the IP addresses of both your PPP/FreeBSD side
-as well as the ISP's side. (i.e.: Dynamic IP Addresses on both ends
-of the link.) Specific details for configuring the Dial-Out side of
-PPP will be addressed in Section 2, "Configuring the FreeBSD System".</para>
-
-</sect1>
-</chapter>
-
-<chapter id="system-config">
-<title>FreeBSD System Configuration</title>
-
-<para>There are three basic pieces of information that must be known to
-the FreeBSD box before you can proceed with integrating the sample
-Local Area Network:</para>
-
-<para>
-<itemizedlist>
-
-<listitem>
-<para>The Host Name of the FreeBSD system; in our example it's "Curly",</para>
-</listitem>
-
-<listitem>
-<para>The Network configuration,</para>
-</listitem>
-
-<listitem>
-<para>The <filename>/etc/hosts</filename> file (which lists the names and IP addresses of
-the other systems in your network)</para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para>If you performed the installation of FreeBSD over a network
-connection some of this information may already be configured into
-your FreeBSD system.</para>
-
-<para>Even if you believe that the FreeBSD system was properly configured
-when it was installed you should at least verify each of these bits of
-information to prevent trouble in subsequent steps.</para>
-
-
-<sect1>
-<title>Verifying the FreeBSD Host Name</title>
-
-<para>It's possible that the FreeBSD host name was specified and saved
-when the system was initially installed. To verify that it was, enter
-the following command at a prompt:</para>
-
-<para>
-<informalexample>
-<screen># hostname</screen>
-</informalexample>
-</para>
-
-<para>The name of the host FreeBSD system will be displayed on a single
-line. If the name looks correct (this is very subjective :-) skip
-ahead to <xref linkend="verify-ether-if-config">.</para>
-
-<para>For example, in our sample network, we would see 'curly.my.domain'
-as a result of the `hostname` command if the name had been set
-correctly during, or after, installation. (At this point, don't worry
-too much about the ".my.domain" part, we'll sort this out later. The
-important part is the name up to the first dot.)</para>
-
-<para>If a host name wasn't specified when FreeBSD was installed you'll
-probably see 'myname.my.domain` as a response. You'll need to edit
-<filename>/etc/rc.conf</filename> to set the name of the machine.</para>
-
-
-<sect2>
-<title>Configuring the FreeBSD Host Name</title>
-
-<para><emphasis><emphasis remap=bf>Reminder: You must be logged in as 'root' to edit the
-system configuration files!</emphasis></emphasis></para>
-
-<para><emphasis><emphasis remap=bf>CAUTION: If you mangle the system configuration files,
-chances are your system WILL NOT BOOT correctly! Be careful!</emphasis></emphasis></para>
-
-<para>The configuration file that specifies the FreeBSD system's host
-name when the system boots is in <filename>/etc/rc.conf</filename>. Use the
-default text editor ('<emphasis remap=tt>ee</emphasis>') to edit this file.</para>
-
-<para>Logged in as user 'root' load <filename>/etc/rc.conf</filename> into the
-editor with the following command:
-<informalexample>
-<screen># ee /etc/rc.conf</screen>
-</informalexample>
-</para>
-
-<para>Using the arrow keys, scroll down until you find the line that
-specifies the host name of the FreeBSD system. By default, this
-section says:
-<informalexample>
-<screen>---
-### Basic network options: ###
-hostname="myname.my.domain" # Set this!
----</screen>
-</informalexample>
-
-Change this section to say (in our example):
-<informalexample>
-<screen>---
-### Basic network options: ###
-hostname="curly.my.domain" # Set this!
----</screen>
-</informalexample>
-</para>
-
-<para>Once the change to the host name has been made, press the 'Esc' key to
-access the command menu. Select "leave editor" and make sure to
-specify "save changes" when prompted.</para>
-
-</sect2>
-</sect1>
-
-<sect1 id="verify-ether-if-config">
-<title>Verifying the Ethernet Interface Configuration</title>
-
-<para>To reiterate our basic assumption, this guide assumes that the
-Ethernet Interface in the FreeBSD system is named '<emphasis remap=tt>ed0</emphasis>'. This is
-the default for NE-1000, NE-2000, WD/SMC models 8003, 8013 and Elite
-Ultra (8216) network adapters.</para>
-
-<para>Other models of network adapters may have different device names in
-FreeBSD. Check the FAQ for specifics about your network adapter. If
-you're not sure of the device name of your adapter, check the FreeBSD
-FAQ to determine the device name for the card you have and substitute
-that name (i.e.: '<emphasis remap=tt>de0</emphasis>', '<emphasis remap=tt>zp0</emphasis>', or similar) in the following
-steps.</para>
-
-<para>As was the case with the host name, the configuration for the
-FreeBSD system's Ethernet Interface may have been specified when the
-system was installed.</para>
-
-<para>To display the configuration for the interfaces in your
-FreeBSD system (Ethernet and others), enter the following command:
-<informalexample>
-<screen># ifconfig -a</screen>
-</informalexample>
-
-(In layman's terms: "Show me the <emphasis remap=bf>I</emphasis>nter<emphasis remap=bf>F</emphasis>ace <acronym>CONFIG</acronym>uration
-for my network devices.") </para>
-
-<para>An example:
-<informalexample>
-<screen># ifconfig -a
- ed0: flags=8843&lt;UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST&gt; mtu
-1500
- inet 192.168.1.1 netmask 0xffffff00 broadcast 192.168.1.255
- ether 01:02:03:04:05:06
- lp0: flags=8810&lt;POINTOPOINT,SIMPLEX,MULTICAST&gt; mtu 1500
- tun0: flags=8050&lt;POINTOPOINT,RUNNING, MULTICAST&gt; mtu 1500
- sl0: flags=c010&lt;POINTOPOINT,LINK2,MULTICAST&gt; mtu 552
- ppp0: flags=8010&lt;POINTOPOINT,MULTICAST&gt; mtu 1500
- lo0: flags=8049&lt;UP,LOOPBACK,RUNNING,MULTICAST&gt; mtu 16384
- inet 127.0.0.1 netmask 0xff000000
-# _</screen>
-</informalexample>
-</para>
-
-<para>In this example, the following devices were displayed:</para>
-
-<para><emphasis remap=tt>ed0:</emphasis> The Ethernet Interface</para>
-
-<para><emphasis remap=tt>lp0:</emphasis> The Parallel Port Interface (ignored in this guide)</para>
-
-<para><emphasis remap=tt>tun0:</emphasis> The "tunnel" device; <emphasis>This is the one user-mode ppp uses!</emphasis></para>
-
-<para><emphasis remap=tt>sl0:</emphasis> The SL/IP device (ignored in this guide)</para>
-
-<para><emphasis remap=tt>ppp0:</emphasis> Another PPP device (for kernel ppp; ignored in this guide)</para>
-
-<para><emphasis remap=tt>lo0:</emphasis> The "Loopback" device (ignored in this guide)</para>
-
-<para>In this example, the 'ed0' device is up and running. The key
-indicators are:
-<orderedlist>
-
-<listitem>
-<para>Its status is "<acronym>UP</acronym>",</para>
-</listitem>
-
-<listitem>
-<para>It has an Internet ("<emphasis remap=tt>inet</emphasis>") address, (in this case, 192.168.1.1)</para>
-</listitem>
-
-<listitem>
-<para>It has a valid Subnet Mask ("netmask"; 0xffffff00 is the same as
-255.255.255.0), and</para>
-</listitem>
-
-<listitem>
-<para>It has a valid broadcast address (in this case, 192.168.1.255).</para>
-</listitem>
-
-</orderedlist>
-</para>
-
-<para>If the line for the Ethernet card had shown something similar to:
-<informalexample>
-<screen>ed0: flags=8802&lt;BROADCAST,SIMPLEX,MULTICAST&gt; mtu 1500
- ether 01:02:03:04:05:06</screen>
-</informalexample>
-
-then the Ethernet card hasn't been configured yet.</para>
-
-<para>If the configuration for the Ethernet interface is correct you can
-skip forward to <xref linkend="list-lan-hosts">.</para>
-
-<sect2 >
-<title>Configuring your Ethernet Interface</title>
-
-<para><emphasis><emphasis remap=bf>Reminder: You must be logged in as 'root' to edit the
-system configuration files!</emphasis></emphasis></para>
-
-<para><emphasis><emphasis remap=bf>CAUTION: If you mangle the system configuration files,
-chances are your system WILL NOT BOOT correctly! Be careful!</emphasis></emphasis></para>
-
-<para>The configuration file that specifies settings for the network
-interfaces when the system boots is in <filename>/etc/rc.conf</filename>. Use
-the default text editor ('ee') to edit this file.</para>
-
-<para>Logged in as user 'root' load <filename>/etc/rc.conf</filename> into the
-editor with the following command:</para>
-
-<para><command> # ee /etc/rc.conf</command></para>
-
-<para>About 20 lines from the top of <filename>/etc/rc.conf</filename> is the section
-that describes which network interfaces should be activated when the
-system boots. In the default configuration file the specific line
-that controls this is:</para>
-
-<para>
-<informalexample>
-<screen>network_interfaces="lo0" # List of network interfaces (lo0 is loopback).</screen>
-</informalexample>
-</para>
-
-<para>You'll need to amend this line to tell FreeBSD that you want to add
-another device, namely the '<emphasis remap=tt>ed0</emphasis>' device. Change this line to
-read:</para>
-
-<para>
-<informalexample>
-<screen>network_interfaces="lo0 ed0" # List of network interfaces (lo0 is loopback).</screen>
-</informalexample>
-</para>
-
-<para>(Note the space between the definition for the loopback device
-("<emphasis remap=tt>lo0</emphasis>")
-and the Ethernet device ("<emphasis remap=tt>ed0</emphasis>")! </para>
-
-<para><emphasis><emphasis remap=bf> Reminder: If your Ethernet card isn't named '<emphasis remap=tt>ed0</emphasis>', specify
-the correct device name here instead.</emphasis></emphasis></para>
-
-<para>If you performed the installation of FreeBSD over a network
-connection then the '<literal>network_interfaces=</literal>' line may already
-include a reference to your Ethernet adapter. If it is, verify that
-it is the correct device name.</para>
-
-<para>Specify the Interface Settings for the Ethernet device
-('<emphasis remap=tt>ed0</emphasis>'):</para>
-
-<para>Beneath the line that specifies which interfaces should be
-activated are the lines that specify the actual settings for each
-interface. In the default <filename>/etc/rc.conf</filename> file is a single
-line that says:</para>
-
-<para>
-<informalexample>
-<screen>ifconfig_lo0="inet 127.0.0.1" # default loopback device configuration.</screen>
-</informalexample>
-</para>
-
-<para>You'll need to add another line after that to specify the settings
-for your '<emphasis remap=tt>ed0</emphasis>' device.</para>
-
-<para>If you performed the installation of FreeBSD over a network
-connection then there may already be an '<literal>ifconfig_ed0=</literal>' line
-after the loopback definition. If so, verify that it has the correct
-values.</para>
-
-<para>For our sample configuration we'll insert a line immediately after
-the loopback device definition that says:</para>
-
-<para>
-<informalexample>
-<screen>ifconfig_ed0="inet 192.168.1.1 netmask 255.255.255.0"</screen>
-</informalexample>
-</para>
-
-<para>When you've finished editing <filename>/etc/rc.conf</filename> to specify and
-configure the network interfaces the section should look really close
-to:</para>
-
-<para>
-<informalexample>
-<screen>---
-network_interfaces="ed1 lo0" # List of network interfaces (lo0 is loopback).
-ifconfig_lo0="inet 127.0.0.1" # default loopback device configuration.
-ifconfig_ed1="inet 192.168.1.1 netmask 255.255.255.0"
----</screen>
-</informalexample>
-</para>
-
-<para>Once all of the necessary changes to <filename>/etc/rc.conf</filename> have
-been made, press the 'Esc' key to invoke the control menu. Select
-"leave editor" and be sure to select "save changes" when prompted.</para>
-
-</sect2>
-</sect1>
-
-<sect1>
-<title>Enabling Packet Forwarding</title>
-
-<para>By default the FreeBSD system will not forward IP packets between
-various network interfaces. In other words, routing functions (also
-known as gateway functions) are disabled.</para>
-
-<para>If your intent is to use a FreeBSD system as stand-alone Internet
-workstation and not as a gateway between LAN nodes and your ISP you
-should skip forward to <xref linkend="list-lan-hosts">.</para>
-
-<para>If you intend for the PPP program to service the local FreeBSD box
-as well as LAN workstations (as a router) you'll need to enable IP
-forwarding.</para>
-
-<para>To enable IP Packet forwarding you'll need to edit the
-<filename>/etc/rc.conf</filename> file.</para>
-
- <para>This file contains overrides of the defaults in
- <filename>/etc/defaults/rc.conf</filename>. The default gateway
- setting is controlled by the line</para>
-
- <programlisting>gateway_enable="NO"</programlisting>
-
- <para>in that file. To override it, add a line like</para>
-
- <programlisting>gateway_enable="YES"</programlisting>
-
- <para><filename>/etc/rc.conf</filename>.</para>
-
-<para><emphasis><emphasis remap=bf>NOTE: This line may already be set to
-'<literal>gateway_enable="YES"</literal>' if IP forwarding was enabled when the
-FreeBSD system was installed.</emphasis></emphasis></para>
-
-</sect1>
-
-<sect1 id="list-lan-hosts">
-<title>Creating the List of other LAN Hosts(<filename>/etc/hosts</filename>)</title>
-
-<para>The final step in configuring the LAN side of the FreeBSD system is
-to create a list of the names and TCP/IP addresses of the various
-systems that are connected to the Local Area Network. This list is
-stored in the '<filename>/etc/hosts</filename>' file.</para>
-
-<para>The default version of this file has only a single host name
-listing in it: the name and address of the loopback device ('lo0').
-By networking convention, this device is always named "localhost" and
-always has an IP address of 127.0.0.1. <xref
- linkend="verify-ether-if-config">.</para>
-
-
-<para>To edit the <filename>/etc/hosts</filename> file enter the following command:
-<informalexample>
-<screen> # ee /etc/hosts </screen>
-</informalexample>
-</para>
-
-<para>Scroll all the way to the bottom of the file (paying attention to
-the comments along the way; there's some good information there!) and
-enter (assuming our sample network) the following IP addresses and
-host names:
-<informalexample>
-<screen>192.168.1.1 curly curly.my.domain # FreeBSD System
-192.168.1.2 larry larry.my.domain # Windows '95 System
-192.168.1.3 moe moe.my.domain # Windows for Workgroups
-System
-192.168.1.4 shemp shemp.my.domain # Windows NT System</screen>
-</informalexample>
-</para>
-
-<para>(No changes are needed to the line for the '<emphasis remap=tt>127.0.0.1
-localhost</emphasis>' entry.)</para>
-
-<para>Once you've entered these lines, press the 'Esc' key to invoke the
-control menu. Select "leave editor" and be sure to select "save
-changes" when prompted.</para>
-
-</sect1>
-
-<sect1>
-<title>Testing the FreeBSD system</title>
-
-<para>Congratulations! Once you've made it to this point, the FreeBSD
-system is configured as a network-connected Unix system! If you made
-any changes to the <filename>/etc/rc.conf</filename> file you should probably
-re-boot your FreeBSD system. This will accomplish two important
-objectives:
-<itemizedlist>
-
-<listitem>
-<para>Allow the changes to the interface configurations to be applied, and</para>
-</listitem>
-
-<listitem>
-<para>Verify that the system restarts without any glaring configuration errors.</para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para>Once the system has been rebooted you should test the network
-interfaces.</para>
-
-
-<sect2>
-<title>Verifying the operation of the loopback device</title>
-
-<para>To verify that the loopback device is configured correctly, log in as
-'root' and enter:
-<informalexample>
-<screen># ping localhost</screen>
-</informalexample>
-</para>
-
-<para>You should see:
-<informalexample>
-<screen># ping localhost
-PING localhost.my.domain. (127.0.0.1): 56 data bytes
-64 bytes from 127.0.0.1: icmp_seq=0 ttl=255 time=0.219 ms
-64 bytes from 127.0.0.1: icmp_seq=1 ttl=255 time=0.287 ms
-64 bytes from 127.0.0.1: icmp_seq=2 ttl=255 time=0.214 m
-[...]</screen>
-</informalexample>
-
-messages scroll by until you hit Ctrl-C to stop the madness.</para>
-
-</sect2>
-
-<sect2>
-<title>Verifying the operation of the Ethernet Device</title>
-
-<para>To verify that the Ethernet device is configured correctly, enter:</para>
-
-<para>
-<informalexample>
-<screen># ping curly</screen>
-</informalexample>
-</para>
-
-<para>You should see:
-<informalexample>
-<screen># ping curly
-PING curly.my.domain. (192.168.1.1): 56 data bytes
-64 bytes from 192.168.1.1: icmp_seq=0 ttl=255 time=0.219 ms
-64 bytes from 192.168.1.1: icmp_seq=1 ttl=255 time=0.200 ms
-64 bytes from 192.168.1.1: icmp_seq=2 ttl=255 time=0.187 ms
-[...]</screen>
-</informalexample>
-
-messages.</para>
-
-<para>One important thing to look at in these two examples is that the
-names (loopback and curly) correctly correlate to their IP addresses
-(127.0.0.1 and 192.168.1.1). This verifies that the
-<filename>/etc/hosts</filename> files is correct.</para>
-
-<para>If the IP address for "curly" isn't 192.168.1.1 or the address for
-"localhost" isn't 127.0.0.1, return to <xref linkend="list-lan-hosts"> and review your
-entries in '<filename>/etc/hosts</filename>'.</para>
-
-<para>If the names and addresses are indicated correctly in the result of
-the ping command but there are errors displayed then something is
-amiss with the interface configuration(s). Return to <xref linkend="system-config"> and
-verify everything again.</para>
-
-<para>If everything here checks out, proceed with the next section.</para>
-
-</sect2>
-</sect1>
-</chapter>
-
-<chapter>
-<title>Configuring the PPP Dial-Out Connection</title>
-
-<para>There are two basic modes of operation of the ppp driver:
-"Interactive" and "Automatic".</para>
-
-<para>In Interactive mode you:</para>
-
-<para>
-<itemizedlist>
-
-<listitem>
-<para>Manually establish a connection to your ISP,</para>
-</listitem>
-
-<listitem>
-<para>Browse, surf, transfer files and mail, etc...,</para>
-</listitem>
-
-<listitem>
-<para>Manually disconnect from your ISP.</para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para>In Automatic mode, the PPP program silently watches what goes on
-inside the FreeBSD system and automagically connects and disconnects
-with your ISP as required to make the Internet a seamless element of
-your network.</para>
-
-<para>In this section we'll address the configuration(s) for both modes
-with emphasis on configuring your `ppp` environment to operate in
-"Automatic" mode.</para>
-
-
-<sect1>
-<title>Backing up the original PPP configuration files</title>
-
- <note>
- <para>More recent versions of FreeBSD have the examples files in
- <filename>/usr/share/examples/ppp</filename>, so this step may not
- be necessary.</para>
- </note>
-
-<para>Before making any changes to the files which are used by PPP you
-should make a copy of the default files that were created when the
-FreeBSD system was installed.</para>
-
-<para>Log in as the 'root' user and perform the following steps:</para>
-
-<para>Change to the '<filename>/etc</filename> directory:</para>
-
-<para><emphasis remap=tt># cd /etc</emphasis></para>
-
-<para>Make a backup copy the original files in the 'ppp' directory:</para>
-
-<para><emphasis remap=tt># cp -R ppp ppp.ORIGINAL</emphasis></para>
-
-<para>You should now be able to see both a '<emphasis remap=tt>ppp</emphasis>' and a
-'<filename>ppp.ORIGINAL</filename>' subdirectory
-in the '<filename>/etc</filename>' directory.</para>
-
-</sect1>
-
-<sect1>
-<title>Create your own PPP configuration files</title>
-
-<para>By default, the FreeBSD installation process creates a number of
-sample configuration files in the <filename>/etc/ppp</filename>
-and <filename>/usr/share/examples/ppp</filename> directories. Please take
-some time to review these files; they were derived from working
-systems and represent the features and capabilities of the PPP
-program.</para>
-
-<para>You are <emphasis>strongly</emphasis> encouraged to learn from
-these sample files and apply them to your own configuration as
-necessary.</para>
-
-<para>For detailed information about the `ppp` program, read the ppp
-manpage:
-<informalexample>
-<screen># man ppp</screen>
-</informalexample>
-</para>
-
-<para>For detailed information about the `chat` scripting language used by
-the PPP dialer, read the chat manpage:
-<informalexample>
-<screen># man chat</screen>
-</informalexample>
-</para>
-
-<para>The remainder of this section describes the recommended contents of
-the PPP configuration files.</para>
-
-
-<sect2>
-<title>The '<filename>/etc/ppp/ppp.conf</filename>' file</title>
-
-<para>The '<filename>/etc/ppp/ppp.conf</filename>' file contains the information and
-settings required to set up a dial-out PPP connection. More than one
-configuration may be contained in this file. The FreeBSD handbook
-(XXX URL? XXX) describes the contents and syntax of this file in
-detail.</para>
-
-<para>This section will describe only the minimal configuration to get a
-dial-out connection working.</para>
-
-<para>Below is the /etc/ppp/ppp.conf file that we'll be using to provide a
-dial-out Internet gateway for our example LAN:
-
-<note>
- <para>The full syntax for <filename>ppp.conf</filename> is described in
- &man.ppp.8;. Particuarly, note that any line that isn't a label that
- ends with a colon (e.g., <literal>default:</literal>,
- <literal>interactive:</literal>), a command that begins with
- <quote>!</quote> (e.g., <literal>!include</literal>), or a comment
- <emphasis>must</emphasis> be indented!</para>
-</note>
-
-<programlisting>################################################################
-# PPP Configuration File ('/etc/ppp/ppp.conf')
-#
-# Default settings; These are always executed always when PPP
-# is invoked and apply to all system configurations.
-################################################################
-default:
- set device /dev/cuaa0
- set speed 57600
- disable pred1
- deny pred1
- disable lqr
- deny lqr
- set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \"\" ATE1Q0M0 OK-AT-OK\\dATDT\\T TIMEOUT 40 CONNECT"
- set redial 3 10
-#
-#
-################################################################
-#
-# For interactive mode use this configuration:
-#
-# Invoke with `ppp -alias interactive`
-#
-################################################################
-interactive:
- set authname Your_User_ID_On_Remote_System
- set authkey Your_Password_On_Remote_System
- set phone 1-800-123-4567
- set timeout 300
- set openmode active
- accept chap
-#
-################################################################
-#
-# For demand-dial (automatic) mode we'll use this configuration:
-#
-# Invoke with: 'ppp -auto -alias demand'
-#
-################################################################
-demand:
- set authname Your_User_ID_On_Remote_System
- set authkey Your_Password_On_Remote_System
- set phone 1-800-123-4567
- set timeout 300
- set openmode active
- accept chap
- set ifaddr 127.1.1.1/0 127.2.2.2/0 255.255.255.0
- add 0 0 127.2.2.2
-################################################################
-# End of /etc/ppp/ppp.conf</programlisting>
-
-This file, taken verbatim from a working system, has three relevant
-configuration sections:</para>
-
-
-<sect3>
-<title>The "<emphasis remap=tt>default</emphasis>" Section</title>
-
-<para>The '<emphasis remap=tt>default:</emphasis>' section contains the values and settings
-used by every other section in the file. Essentially, this section is
-implicitly added to the configuration lines to each other section.</para>
-
-<para>This is a good place to put "global defaults" applicable to all
-dial-up sessions; especially modem settings and dialing prefixes which
-typically don't change based on which destination system you're
-connecting to.</para>
-
-<para>Following are the descriptions of each line in the "default" section
-of the sample '<filename>/etc/ppp/ppp.conf</filename>' file:
-<informalexample>
-<screen>set device /dev/cuaa0</screen>
-</informalexample>
-
-This statement informs the PPP program that it should use the first
-serial port.
-Under FreeBSD the '<filename>/dev/cuaa0</filename>' device is the same port that's
-known as "<emphasis remap=tt>COM1:</emphasis>" under DOS, Windows, Windows 95, etc....</para>
-
-<para>If your modem is on <emphasis remap=tt>COM2:</emphasis> you should specify
-'<filename>/dev/cuaa1</filename>; <emphasis remap=tt>COM3:</emphasis> would be '<filename>/dev/cuaa2</filename>'.</para>
-
-<para>
-<informalexample>
-<screen>set speed 57600 </screen>
-</informalexample>
-</para>
-
-<para>This line sets the transmit and receive speed for the connection
-between the serial port and the modem. While the modem used for this
-configuration is only a 28.8 device, setting this value to 57600 lets
-the serial link run at a higher rate to accommodate higher throughput
-as a result of the data compression built into late-model modems.</para>
-
-<para>If you have trouble communicating with your modem, try setting this
-value to 38400 or even as low as 19200.</para>
-
-<para>
-<informalexample>
-<screen>disable pred1
-deny pred1</screen>
-</informalexample>
-</para>
-
-<para>These two lines disable the "CCP/Predictor type 1" compression
-features of the PPP program. The current version of `ppp` supports
-data compression in accordance with draft Internet standards.
-Unfortunately many ISPs use equipment that does not support this
-capability. Since most modems try to perform on-the-fly compression
-anyway you're probably not losing much performance by disabling this
-feature on the FreeBSD side and denying the remote side from forcing
-it on you.</para>
-
-<para>
-<informalexample>
-<screen>disable lqr
-deny lqr</screen>
-</informalexample>
-</para>
-
-<para>These two lines control the "Line Quality Reporting" functions which
-are part of the complete Point-to-Point (PPP) protocol specification.
-(See RFC-1989 for details.)</para>
-
-<para>The first line, "disable lqr", instructs the PPP program to not
-attempt to report line quality status to the device on the remote end.</para>
-
-<para>The second line, "deny lqr", instructs the PPP program to deny any
-attempts by the remote end to reports line quality.</para>
-
-<para>As most modern dial-up modems have automatic error correction and
-detection and LQR reporting is not fully implemented in many vendor's
-products it's generally a safe bet to include these two lines in the
-default configuration.</para>
-
-<para>
-<informalexample>
-<screen>set dial "ABORT BUSY ABORT NO\\sCARRIER TIMEOUT 5 \"\" ATE1Q0M0
-OK-AT-OK\\dATDT\\T TIMEOUT 40 CONNECT"</screen>
-</informalexample>
-</para>
-
-<para><emphasis>NOTE: (This statement should appear on a single line; ignore any
-line wrapping that may appear in this document.)</emphasis></para>
-
-<para>This line instructs the PPP program how to dial the modem and
-specifies some rudimentary guidelines for doing so:
-<itemizedlist>
-
-<listitem>
-<para>Attempts to dial should fail if the modem returns a "BUSY" result code,</para>
-</listitem>
-
-<listitem>
-<para>Attempts to dial should also fail if the modem returns a "NO CARRIER" result code,</para>
-</listitem>
-
-<listitem>
-<para>The PPP program should expect each of the following events to complete within a
-5-second timeout period:
-<itemizedlist>
-
-<listitem>
-<para>The PPP program will initially expect nothing (specified above
-by the \"\" portion of the statement) from the modem </para>
-</listitem>
-
-<listitem>
-<para>The program
-will send the modem initialization string "ATE1Q0M0" to the modem and
-await a response of "OK". If a response is not received, the program
-should send an attention command to the modem ("AT") and look again
-for a response of "OK", </para>
-</listitem>
-
-<listitem>
-<para>The program should delay for one second
-(specified by the "\\d" part of the statement, and send the dialing
-string to the modem. The "ATDT" portion of the statement is the
-standard modem prefix to dial using tone-dialing; if you do not have
-touch-tone service on your local phone line, replace the "ATDT" with
-"ATDP". The "\\T" string is a placeholder for the actual phone number
-(which will be automatically inserted as specified by the "set dial
-123-4567").</para>
-</listitem>
-
-</itemizedlist>
-</para>
-</listitem>
-
-<listitem>
-<para>Finally, before a (maximum) timeout of 40 seconds, the PPP
-program should expect to see a "CONNECT" result code returned from the
-modem.</para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para>A failure at any point in this dialog will be interpreted as a dialing
-failure and the PPP program will fail to connect.</para>
-
-<para>(For a detailed description of the mini-scripting language used by the
-PPP dialer, refer to the "chat" manpage.)</para>
-
-<para>
-<informalexample>
-<screen>set redial 3 10</screen>
-</informalexample>
-
-This line specifies that if a dial connection cannot immediately be made
-the PPP program should retry (up to 3 times if necessary) with a delay of 10 seconds
-between redialing attempts.</para>
-
-</sect3>
-
-<sect3>
-<title>The "<emphasis remap=tt>interactive</emphasis>" Section</title>
-
-<para>The '<emphasis remap=tt>interactive:</emphasis>' section contains the values and
-settings used to set up an "interactive" PPP session with a specific
-remote system. Settings in this section will have the lines included
-in the "default" section included automatically.</para>
-
-<para>The example cited in this section of the guide presumes that you'll
-be connecting to a remote system that understands how to authenticate
-a user without any fancy scripting language. That is, this sample
-uses the CHAP protocol to set up the connection.</para>
-
-<para>A good rule of thumb is that if the Windows '95 dialer can set up a
-connection by just clicking the "Connect" button this sample
-configuration should work OK.</para>
-
-<para>If, on the other hand, when you connect to your ISP using Microsoft
-Windows '95 Dial-Up Networking you need to resort to using the "Dial
-Up Scripting Tool" from the Microsoft Plus! pack or you have to select
-"Bring up a terminal windows after dialing" in the Windows '95
-connection options then you'll need to look at the sample PPP
-configuration files and the ppp manpage for examples of "expect /
-response" scripting to make your ISP connection. The "set login"
-command is used for this purpose.</para>
-
-<para>Or even better, find an ISP who knows how to provide PAP or CHAP
-authentication!</para>
-
-<para>The configuration examples shown here have been successfully used to
-connect to:
-<itemizedlist>
-
-<listitem>
-<para>Various Shiva LanRovers</para>
-</listitem>
-
-<listitem>
-<para>The IBM Network (<ulink URL="http://www.ibm.net">http://www.ibm.net</ulink>)</para>
-</listitem>
-
-<listitem>
-<para>AT&amp;T WorldNet (<ulink URL="http://att.com/worldnet">http://att.com/worldnet</ulink>)</para>
-</listitem>
-
-<listitem>
-<para>Erol's (<ulink URL="http://www.erols.com">http://www.erols.com</ulink>)</para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para>Following are descriptions for each line in the "interactive" section
-of the sample '<filename>/etc/ppp/ppp.conf</filename>' file:</para>
-
-<para>
-<informalexample>
-<screen>set authname Your_User_ID_On_Remote_System</screen>
-</informalexample>
-
-This line specifies the name you would use to log in to the remote
-system. </para>
-
-<para>
-<informalexample>
-<screen>set authkey Your_Password_On_Remote_System</screen>
-</informalexample>
-
-This is the password you'd use to log in to the remote system.</para>
-
-<para>
-<informalexample>
-<screen>set phone 1-800-123-4567</screen>
-</informalexample>
-
-This is the phone number of the remote system. If you're inside a PBX
-you can
-prepend '<emphasis remap=tt>9, </emphasis>' to the number here.</para>
-
-<para>
-<informalexample>
-<screen>set timeout 300</screen>
-</informalexample>
-
-This tells the PPP program that it should automatically hang up the
-phone if no data has
-be exchanged for 300 seconds (5 minutes). You may wish to tailor this
-number to your
-specific requirements.</para>
-
-<para>
-<informalexample>
-<screen>set openmode active</screen>
-</informalexample>
-
-This tells the PPP program that once the modems are connected it
-should immediately attempt to negotiate the connection. Some remote
-sites do this automatically, some don't. This instructs your side of
-the link to take the initiative and try to set up the connection.</para>
-
-
-
-<screen>accept chap</screen>
-
-
-<para>This tells the PPP program to use the "Challenge-Handshake
-Authentication Protocol" to authenticate you. The values exchanged
-between the local and remote side for UserID and password are taken
-from the 'authname' and 'authkey' entries above.</para>
-
-</sect3>
-
-<sect3>
-<title>The "<emphasis remap=tt>demand</emphasis>" Section</title>
-
-<para>The "<emphasis remap=tt>demand</emphasis>" section contains the values and settings used
-to set up a "Dial-on-demand" PPP session with a specific remote
-system. Settings in this section will also have the lines included in
-the "default" section included automatically.</para>
-
-<para>Except for the last two lines in this section it is identical to
-the configuration section which defines the "interactive"
-configuration.</para>
-
-<para>As noted earlier, the examples cited in this section of
-the guide presume that you'll be connecting to a remote system that
-understands how to use the CHAP protocol to set up the connection.</para>
-
-<para>Following are descriptions for each line in the "demand" section of
-the sample '<filename>/etc/ppp/ppp.conf</filename>' file:</para>
-
-<para>
-<informalexample>
-<screen>set authname Your_User_ID_On_Remote_System</screen>
-</informalexample>
-
-This line specifies the name you would use to log in to the remote
-system. </para>
-
-<para>
-<informalexample>
-<screen>set authkey Your_Password_On_Remote_System</screen>
-</informalexample>
-
-This is the password you'd use to log in to the remote system.</para>
-
-<para>
-<informalexample>
-<screen>set phone 1-800-123-4567</screen>
-</informalexample>
-
-This is the phone number of the remote system.</para>
-
-<para>
-<informalexample>
-<screen>set timeout 300</screen>
-</informalexample>
-</para>
-
-<para>This tells the PPP program that it should automatically hang up the
-phone if no data has be exchanged for 300 seconds (5 minutes). You
-may wish to tailor this number to your specific requirements.</para>
-
-<para>
-<informalexample>
-<screen>set openmode active</screen>
-</informalexample>
-</para>
-
-<para>This tells the PPP program that once the modems are connected it
-should immediately attempt to negotiate the connection. Some remote
-sites do this automatically, some don't. This instructs your side of
-the link to take the initiative and try to set up the connection.</para>
-
-<para>
-<informalexample>
-<screen>accept chap</screen>
-</informalexample>
-</para>
-
-<para>This tells the PPP program to use the "Challenge-Handshake
-Authentication Protocol" to authenticate you. The values exchanged
-between the local and remote side for UserID and password are taken
-from the 'authname' and 'authkey' entries above.</para>
-
-<para>
-<informalexample>
-<screen>set ifaddr 127.1.1.1/0 127.2.2.2/0 255.255.255.0</screen>
-</informalexample>
-</para>
-
-<para>This command sets up a pair of "fake" IP addresses for the local and
-remote sides of the PPP link. It instructs the PPP program to create
-an IP address of 127.1.1.1 for the local side of the '<emphasis remap=tt>tun0</emphasis>'
-(tunnel) device
-and 127.2.2.2 for the remote side. Appending '<filename>/0</filename>' to
-each address tells the PPP program that zero of the bits that make up
-these addresses are significant and can (in fact, must!) be negotiated
-between the local and remote systems when the link is established.
-The 255.255.255.0 string tells the PPP program what Subnet mask to
-apply to these pseudo-interfaces.</para>
-
-<para>Remember, we've assumed that your ISP provides the IP addresses for
-both ends of the link! If your ISP assigned you a specific IP address
-that you should use on your side when configuring your system, enter
-that IP address here <emphasis>instead</emphasis> of <emphasis remap=tt>127.1.1.1</emphasis>.</para>
-
-<para>Conversly, if your ISP gave you a specific IP address that he uses on
-his end you should enter that IP address here <emphasis>instead</emphasis> of
-<emphasis remap=tt>127.2.2.2</emphasis>.</para>
-
-<para>In both cases, it's probably a good idea to leave the '<filename>/0</filename>' on
-the end of each address. This gives the PPP program the opportunity
-to change the address(es) of the link if it <emphasis>has</emphasis> to.</para>
-
-<para>
-<informalexample>
-<screen>add 0 0 127.2.2.2</screen>
-</informalexample>
-</para>
-
-<para>This last line tells the PPP program that it should add a default
-route for IP traffic that points to the (fake) IP address of the ISP's
-system.</para>
-
-<para><emphasis><emphasis remap=bf>Note: If you used an ISP-specified address instead of
-<emphasis remap=tt>127.2.2.2</emphasis> on the preceeding line, use the same number here
-instead of <emphasis remap=tt>127.2.2.2</emphasis></emphasis></emphasis>.</para>
-
-<para>By adding this "fake" route for IP traffic, the PPP program can,
-while idle:
-<itemizedlist>
-
-<listitem>
-<para>Accept packets that FreeBSD doesn't already know how to forward,</para>
-</listitem>
-
-<listitem>
-<para>Establish a connection to the ISP "<emphasis>on-the-fly</emphasis>",</para>
-</listitem>
-
-<listitem>
-<para>Reconfigure the IP addresses of the local and remote side of the link,</para>
-</listitem>
-
-<listitem>
-<para>Forward packets between your workstation and the ISP.</para>
-</listitem>
-
-</itemizedlist>
-
-automatically!</para>
-
-<para>Once the number of seconds specified by the timeout value in the
-"default" section have elapsed without any TCP/IP traffic the PPP
-program will automatically close the dial-up connection and the
-process will begin again.</para>
-
-</sect3>
-</sect2>
-
-<sect2>
-<title>The '<filename>/etc/ppp/ppp.linkup</filename>' file</title>
-
-<para>The other file needed to complete the PPP configuration is found in
-'<filename>/etc/ppp/ppp.linkup</filename>'. This file contains instructions for
-the PPP program on what actions to take after a dial-up link is
-established.</para>
-
-<para>In the case of dial-on-demand configurations the PPP program will need
-to delete the default route that was created to the fake IP address of
-the remote side (127.2.2.2 in our example in the previous section) and
-install a new default route that points the actual IP address of the
-remote end (discovered during the dial-up connection setup).</para>
-
-<para>A representative '<filename>/etc/ppp/ppp.linkup</filename>' file:
-<informalexample>
-<screen>#########################################################################=
-
-# PPP Link Up File ('/etc/ppp/ppp.linkup')
-#
-# This file is checked after PPP establishes a network connection.
-#
-# This file is searched in the following order.
-#
-# 1) First, the IP address assigned to us is searched and
-# the associated command(s) are executed.
-#
-# 2) If the IP Address is not found, then the label name specified at
-
-# PPP startup time is searched and the associated command(s)
-# are executed.
-#
-# 3) If neither of the above are found then commands under the label
-# 'MYADDR:' are executed.
-#
-#########################################################################=
-
-#
-# This section is used for the "demand" configuration in
-# /etc/ppp/ppp.conf:
-demand:
- delete ALL
- add 0 0 HISADDR
-#
-# All other configurations in /etc/ppp/ppp.conf use this:
-#
-MYADDR:
- add 0 0 HISADDR
-########################################################################
-# End of /etc/ppp/ppp.linkup</screen>
-</informalexample>
-
-Notice that there is a section in this file named "demand:", identical
-to the configuration name used in the '<filename>/etc/ppp/ppp.conf</filename>'
-file. This section instructs the PPP program that once a link is
-established using this configuration, it must:
-<orderedlist>
-
-<listitem>
-<para>Remove any IP routing information that the PPP program has created</para>
-</listitem>
-
-<listitem>
-<para>Add a default route the remote end's actual address.</para>
-</listitem>
-
-</orderedlist>
-</para>
-
-<para>It's critical that those configurations in
-'<filename>/etc/ppp/ppp.conf</filename>' which include the '<emphasis remap=tt>set ifaddr</emphasis>' and
-'<emphasis remap=tt>add 0 0</emphasis>' statements (i.e.: those configurations used for
-Dial-on-Demand configurations) execute the "delete ALL" and "add 0 0
-HISADDR" commands in <filename>/etc/ppp/ppp.linkup</filename>.</para>
-
-<para><emphasis><emphasis remap=bf>This is the mechanism that controls the actual on-demand
-configuration of the link.</emphasis></emphasis></para>
-
-<para>All configurations not explicitly named in
-<filename>/etc/ppp/ppp.linkup</filename> will use whatever commands are in the
-"MYADDR:" section of the file. This is where non-Demand-Dial
-configurations (such as our "interactive:" sample) will fall through
-to. This section simply adds a default route to the ISP's IP address
-(at the remote end).</para>
-
-</sect2>
-</sect1>
-
-<sect1>
-<title>IP Aliasing</title>
-
-<para>All of the configuration steps described thus far are relevant to
-any FreeBSD system which will be used to connect to an ISP via dial-up
-connection.</para>
-
-<para>If your sole objective in reading this guide is to connect your
-FreeBSD box to the Internet using dial-out ppp you can proceed to
-<xref linkend="testing-the-network">.</para>
-
-<para>One very attractive feature of the PPP program in on-demand mode is
-its ability to route IP traffic between other systems on the Local
-Area Network automatically. This feature is known by various names,
-"<emphasis>IP Aliasing</emphasis>", "<emphasis>Network Address Translation</emphasis>", "<emphasis>Address
-Masquerading</emphasis>" or "<emphasis>Transparent Proxying</emphasis>".</para>
-
-<para>Regardless of the terminology used, this mode is not, however,
-automatic. If the PPP program is started normally then the program
-will not forward packets between LAN interface(s) and the dial-out
-connection. In effect, only the FreeBSD system is connected to the
-ISP; other workstations cannot "share" the same connection.</para>
-
-<para>For example, if the program is started with either of the following
-command lines:</para>
-
-<para><emphasis remap=tt># ppp interactive (Interactive mode)</emphasis></para>
-
-<para> or</para>
-
-<para><emphasis remap=tt># ppp -auto demand (Dial-on-Demand mode)</emphasis></para>
-
-<para>then the system will function as an Internet-connected workstation
-<emphasis>only</emphasis> for the
-FreeBSD box.</para>
-
-<para>To start the PPP program as a gateway between LAN resources and the
-Internet, one of the following command lines would be used instead:</para>
-
-<para><emphasis remap=tt># ppp -alias interactive (Interactive mode)</emphasis></para>
-
-<para> or</para>
-
-<para><emphasis remap=tt># ppp -auto -alias demand (Dial-on-Demand mode)</emphasis></para>
-
-<para>You can alternatively use the command <emphasis remap=tt>``alias enable yes''</emphasis>
-in your ppp configuration file (refer to the man page for details).</para>
-
-<para>Keep this in mind if you intend to proceed with <xref
- linkend="config-window-system">.</para>
-
-</sect1>
-</chapter>
-
-<chapter id="config-window-system">
-<title>Configuring Windows Systems</title>
-
-<para>As indicated in Section 1, our example network consists of a
-FreeBSD system ("Curly") which acts as a gateway (or router) between a
-Local Area Network consisting of two different flavors of Windows
-Workstations. In order for the LAN nodes to use Curly as a router
-they need to be properly configured. Note that this section does not
-explain how to configure the Windows workstations for Dial-Up
-networking. If you need a good explanation of that procedure, I
-recommend <ulink URL="http://www.aladdin.co.uk/techweb">http://www.aladdin.co.uk/techweb</ulink>.</para>
-
-
-<sect1>
-<title> Configuring Windows 95</title>
-
-<para>Configuring Windows 95 to act as an attached resource on your LAN
-is relatively simple. The Windows 95 network configuration must be
-slightly modified to use the FreeBSD system as the default gateway to
-the ISP. Perform the following steps:</para>
-
-<para><emphasis remap=bf>Create the Windows 95 "hosts" file:</emphasis></para>
-
-<para>In order to connect to the other TCP/IP systems on the LAN you'll
-need to create an identical copy of the "hosts" file that you
-installed on the FreeBSD system in <xref linkend="list-lan-hosts">.
-<itemizedlist>
-
-<listitem>
-<para>Click the "Start" button; select "Run..."; enter "notepad
-\WINDOWS\HOSTS" (without the quotes) and click "OK"</para>
-</listitem>
-
-<listitem>
-<para>In the editor, enter the addresses and system names from the hosts
-file shown in <xref linkend="list-lan-hosts">.</para>
-</listitem>
-
-<listitem>
-<para>When finished editing, close the notepad application (making sure
-that you save the file!).</para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para><emphasis remap=bf>Configure the Windows 95 TCP/IP Network Configuation
-settings</emphasis>:
-<itemizedlist>
-
-<listitem>
-<para>Click the "Start" button on the taskbar; select "Settings" and
-"Control Panel". </para>
-</listitem>
-
-<listitem>
-<para>Double-click the "Network" icon to open it.</para>
-
-<para>
-The settings for all Network Elements are displayed.</para>
-</listitem>
-
-<listitem>
-<para>With the "Configuration" tab selected, scroll down the list of
-installed components and highlight the "TCP/IP-&gt;<emphasis>YourInterfaceType</emphasis>" line
-(where "<emphasis>YourInterfaceType</emphasis>" is the name or type of Ethernet adapter in your system).
-</para>
-
-<para>If TCP/IP is not listed in the list of installed network
-components, click the "Add" button and install it before proceeding.</para>
-
-<para>(Hint: "Add | Protocol | Microsoft | TCP/IP | OK")</para>
-</listitem>
-
-<listitem>
-<para>Click on the "Properties" button to display a list of the
-settings associated with the TCP component.</para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para><emphasis remap=bf>Configure the IP Address Information:</emphasis>
-<itemizedlist>
-
-<listitem>
-<para>Click the "IP Address" tab</para>
-</listitem>
-
-<listitem>
-<para>Click the "Specify an IP address" radio button.
-</para>
-
-<para>(In our example LAN the Windows 95 system is the one we've called "Larry".)</para>
-</listitem>
-
-<listitem>
-<para>In the "IP Address" field enter "192.168.1.2".</para>
-</listitem>
-
-<listitem>
-<para>Enter 255.255.255.0 in the "Subnet Mask" field.</para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para><emphasis remap=bf>Configure the Gateway information:</emphasis>
-<itemizedlist>
-
-<listitem>
-<para>Click on the "Gateway" tab
-</para>
-
-<para>For our example network the FreeBSD box will be acting as our
-gateway to the Internet (routing packets between the Ethernet LAN and
-the PPP dial-up connection. Enter the IP address of the FreeBSD
-Ethernet interface, 192.168.1.1, in the "New gateway" field and click
-the "Add" button. If any other gateways are defined in the "Installed
-gateways" list you may wish to consider removing them.</para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para><emphasis remap=bf>Configure the DNS Information:</emphasis></para>
-
-<para>This guide assumes that your Internet Service Provider has given
-you a list of Domain Name Servers (or "DNS Servers") that you should
-use. If you wish to run a DNS server on your local FreeBSD system,
-refer to Section 6, "Exercise for the Interested Student" for tips on
-setting up DNS on your FreeBSD system.</para>
-
-<para>
-<itemizedlist>
-
-<listitem>
-<para>Click the "DNS Configuration" tab</para>
-</listitem>
-
-<listitem>
-<para>Make sure that the "Enable DNS" radio button is selected.
-</para>
-
-<para>(If this button is not selected only the entries that
-we put in the host file(s) will be available and your Net-Surfing
-will not work as you expect!)</para>
-</listitem>
-
-<listitem>
-<para>In the "Host" field enter the name of the Windows 95 box, in this
-case: "Larry".</para>
-</listitem>
-
-<listitem>
-<para>In the "Domain" field enter the name of our local network, in this
-case: "my.domain"</para>
-</listitem>
-
-<listitem>
-<para>In the "DNS Server Search Order" section, enter the IP address
-of the DNS server(s) that your ISP provided, clicking the "Add" button
-after every address is entered. Repeat this step as many times as
-necessary to add all of the addresses that your ISP provided.</para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para><emphasis remap=bf>Other Windows 95 TCP/IP options:</emphasis></para>
-
-<para>For our purposes the settings under the "Advanced", "WINS
-Configuration" and "Bindings" tabs are not necessary.</para>
-
-<para>If you wish to use the Windows Internet Naming Service ("WINS")
-your attention is invited to <ulink URL="http://www.localnet.org">http://www.localnet.org</ulink> for
-more information about WINS settings, specifically regarding sharing
-files transparently across the Internet.</para>
-
-<para><emphasis remap=bf>Mopping up:</emphasis>
-<itemizedlist>
-
-<listitem>
-<para>Click on the "OK" button to close the TCP/IP Properties window.</para>
-</listitem>
-
-<listitem>
-<para>Click on the "OK" button to close the Network Control Panel. </para>
-</listitem>
-
-<listitem>
-<para>Reboot your computer if prompted to do so. </para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para> That's it!</para>
-
-</sect1>
-
-<sect1>
-<title>Configuring Windows NT</title>
-
-<para>Configuring Windows NT to act as a LAN resource is also relatively
-straightforward. The procedures for configuring Windows NT are
-similar to Windows 95 with minor exceptions in the user interface.</para>
-
-<para>The steps shown here are appropriate for a Windows NT 4.0
-Workstation, but the principles are the same for NT 3.5x. You may
-wish to refer to the "Configuring Windows for Workgroups" section if
-you're configuring Windows NT 3.5<emphasis remap=it>x</emphasis>, since the user interface is
-the same for NT 3.5 and WfW.</para>
-
-<para>Perform the following steps: </para>
-
-<para><emphasis remap=bf>Create the Windows NT "hosts" file:</emphasis></para>
-
-<para>In order to connect to the other TCP/IP systems on the LAN you'll
-need to create an identical copy of the "hosts" file that you
-installed on the FreeBSD system in Section 3.4
-<itemizedlist>
-
-<listitem>
-<para>Click the "Start" button; select "Run..."; enter "notepad
-\WINNT\SYSTEM32\DRIVERS\ETC\HOSTS" (without the quotes) and click
-"OK"</para>
-</listitem>
-
-<listitem>
-<para>In the editor, enter the addresses and system names from Section
-3.4.</para>
-</listitem>
-
-<listitem>
-<para>When finished editing, close the notepad application (making sure
-that you save the file!).</para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para><emphasis remap=bf>Configure the Windows NT TCP/IP Network Configuation
-settings</emphasis>:
-<itemizedlist>
-
-<listitem>
-<para>Click the "Start" button on the taskbar; select "Settings" and
-"Control Panel". </para>
-</listitem>
-
-<listitem>
-<para>Double-click the "Network" icon to open it. </para>
-</listitem>
-
-<listitem>
-<para>With the "Identification" tab selected, verify the "Computer Name"
-and "Workgroup" fields. In this example we'll use "Shemp" for the name
-and "Stooges" for the workgroup. Click the "Change" button and amend
-these entries as necessary.</para>
-</listitem>
-
-<listitem>
-<para>Select the "Protocols" tab.
-
-</para>
-
-<para>The installed Network Protocols will be displayed. There may be a
-number of protocols listed but the one of interest to this guide is
-the "TCP/IP Protocol". If "TCP/IP Protocol" is not listed, click the
-"Add" button to load it.</para>
-
-<para>(Hint: "Add | TCP/IP Protocol | OK") </para>
-</listitem>
-
-<listitem>
-<para>Highlight "TCP/IP
-Protocol" and click the "Properties" button.
-</para>
-
-<para>Tabs for specifying various settings for TCP/IP will be displayed.</para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para><emphasis remap=bf>Configuring the IP Address:</emphasis></para>
-
-<para>Make sure that the Ethernet Interface is shown in the "Adapter"
-box; if not, scroll through the list of adapters until the correct
-interface is shown.
-<itemizedlist>
-
-<listitem>
-<para>Click the "Specify an IP address" radio button to enable the three
-text boxes.
-</para>
-
-<para>In our example LAN the Windows NT system is the one we've called
-"Shemp"</para>
-</listitem>
-
-<listitem>
-<para>In the "IP Address" field enter "192.168.1.4".</para>
-</listitem>
-
-<listitem>
-<para>Enter 255.255.255.0 in the "Subnet Mask" field.</para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para><emphasis remap=bf>Configure the Gateway information:</emphasis></para>
-
-<para>For our example network the FreeBSD box will be acting as our gateway
-to the Internet (routing packets between the Ethernet LAN and the PPP dial-up
-connection.
-<itemizedlist>
-
-<listitem>
-<para>Enter the IP address of the FreeBSD Ethernet interface,
-192.168.1.1, in the "New gateway" field and click the "Add" button.
-</para>
-
-<para>If any other gateways are defined in the "Installed gateways" list
-you may wish to consider removing them.</para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para><emphasis remap=bf>Configuring DNS:</emphasis></para>
-
-<para>Again, this guide assumes that your Internet Service Provider has
-given you a list of Domain Name Servers (or "DNS Servers") that you
-should use.</para>
-
-<para>If you wish to run a DNS server on your local FreeBSD system, refer to
-Section 6, "Exercise for the Interested Student" for tips on setting
-up DNS on your FreeBSD system.
-<itemizedlist>
-
-<listitem>
-<para>Click the "DNS" tab</para>
-</listitem>
-
-<listitem>
-<para>In the "Host Name" field enter the name of the Windows NT box, in
-this case: "Shemp".</para>
-</listitem>
-
-<listitem>
-<para>In the "Domain" field enter the name of our local network, in this
-case: "my.domain"</para>
-</listitem>
-
-<listitem>
-<para>In the "DNS Server Search Order" section, enter the IP address of
-the DNS server that your ISP provided, clicking the "Add" button after
-every address is entered. Repeat this step as many times as necessary
-to add all of the addresses that your ISP provided.</para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para><emphasis remap=bf>Other Windows NT TCP/IP options:</emphasis></para>
-
-<para>For our purposes the settings under the "WINS Address" and
-"Routing" tabs are not used.</para>
-
-<para>If you wish to use the Windows Internet Naming Service ("WINS")
-your attention is invited to <ulink URL="http://www.localnet.org">http://www.localnet.org</ulink> for
-more information about WINS settings, specifically regarding sharing
-files transparently across the Internet.</para>
-
-<para><emphasis remap=bf>Mopping up:</emphasis>
-<itemizedlist>
-
-<listitem>
-<para>Click on the "OK" button to close the TCP/IP Properties section.
-</para>
-</listitem>
-
-<listitem>
-<para>Click on the "Close" button to close the Network Control Panel.
-</para>
-</listitem>
-
-<listitem>
-<para>Restart your computer if prompted to do so.</para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para>That's it!</para>
-
-</sect1>
-
-<sect1>
-<title>Configuring Windows for Workgroups</title>
-
-<para>Configuring Windows for Workgroups to act as a network client
-requires that the Microsoft TCP/IP-32 driver diskette has been
-installed on the workstation. The TCP/IP drivers are not included
-with the WfW CD or diskettes; if you need a copy they're available at
-<ulink URL="ftp://ftp.microsoft.com:/peropsys/windows/public/tcpip">ftp://ftp.microsoft.com:/peropsys/windows/public/tcpip</ulink>.</para>
-
-<para>Once the TCP/IP drivers have been loaded, perform the following
-steps:</para>
-
-<para><emphasis remap=bf>Create the Windows for Workgroups "hosts" file:</emphasis></para>
-
-<para>In order to connect to the other TCP/IP systems on the LAN you'll
-need to create an identical copy of the "hosts" file that you
-installed on the FreeBSD system in Section 3.4.
-<itemizedlist>
-
-<listitem>
-<para>In Program Manager, click the "File" button; select "Run"; and
-enter: "notepad \WINDOWS\HOSTS" (without the quotes) and click "OK"</para>
-</listitem>
-
-<listitem>
-<para>In the editor, enter the addresses and system names from the hosts
-file shown in Section 3.4.</para>
-</listitem>
-
-<listitem>
-<para>When finished editing, close the notepad application (making sure
-that you save the file!).</para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para><emphasis remap=bf>Configure the Windows 95 TCP/IP Network Configuation
-settings</emphasis>
-<itemizedlist>
-
-<listitem>
-<para>In the main window of Program Manager, open the "Network" group by
-double-clicking the icon. </para>
-</listitem>
-
-<listitem>
-<para>Double click on the "Network Setup" icon. </para>
-</listitem>
-
-<listitem>
-<para>In the "Network Drivers Box" double-click the "Microsoft
-TCP/IP-32" entry. </para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para><emphasis remap=bf>Configure the Windows for Workgroups IP Address:</emphasis> </para>
-
-<para>Ensure
-the correct Ethernet Interface is selected in the "Adapter" list. If
-not, scroll down until it is displayed and select it by clicking on
-it.
-<itemizedlist>
-
-<listitem>
-<para>Ensure that the "Enable Automatic DHCP Configuration" check box is
-blank. If it is checked, click it to remove the "X".</para>
-</listitem>
-
-<listitem>
-<para>In our example LAN the Windows for Workgroups system is the one
-we've called "Moe"; in the "IP Address" field enter "192.168.1.3".</para>
-</listitem>
-
-<listitem>
-<para>Enter 255.255.255.0 in the "Subnet Mask" field.</para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para><emphasis remap=bf>Configure the Gateway information:</emphasis></para>
-
-<para>For our example network the FreeBSD box will be acting as our
-gateway to the Internet (routing packets between the Ethernet LAN and
-the PPP dial-up connection).
-<itemizedlist>
-
-<listitem>
-<para>Enter the IP address of the FreeBSD system, 192.168.1.1, in the
-"Default Gateway" field.</para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para><emphasis remap=bf>Configuring DNS:</emphasis></para>
-
-<para>Again, this guide assumes that your Internet Service Provider has
-given you a list of Domain Name Servers (or "DNS Servers") that you
-should use. If you wish to run a DNS server on your local FreeBSD
-system, refer to Section 6, "Exercise for the Interested Student" for
-tips on setting up DNS on your FreeBSD system.
-<itemizedlist>
-
-<listitem>
-<para>Click the "DNS" button.</para>
-</listitem>
-
-<listitem>
-<para>In the "Host Name" field enter the name of the Windows for
-Workgroups box, in this case: "Moe".</para>
-</listitem>
-
-<listitem>
-<para>In the "Domain" field enter the name of our local network, in this
-case: "my.domain"</para>
-</listitem>
-
-<listitem>
-<para>In the "Domain Name Service (DNS) Search Order" section, enter the
-IP address of the DNS server that your ISP provided, clicking the "Add"
-button after each address is entered. Repeat this step as many times as
-necessary to add all of the addresses that your ISP provided.</para>
-</listitem>
-
-<listitem>
-<para>Click on the "OK" button to close the DNS Configuration window.
-</para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para><emphasis remap=bf>Mopping up:</emphasis>
-<itemizedlist>
-
-<listitem>
-<para>Click on the "OK" button to close the TCP/IP Configuration window.
-</para>
-</listitem>
-
-<listitem>
-<para>Click on the "OK" button to close the Network Setup window.</para>
-</listitem>
-
-<listitem>
-<para>Reboot your computer if prompted. </para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para>That's it!</para>
-
-</sect1>
-</chapter>
-
-<chapter id="testing-the-network">
-<title>Testing the Network</title>
-
-<para> Once you've completed that appropriate tasks above you should have
-a functioning PPP gateway to the Internet.</para>
-
-
-<sect1>
-<title>Testing the Dial-Up link:</title>
-
-<para> The first thing to test is that the connection is being made
-between your modem and the ISP.</para>
-
-</sect1>
-
-<sect1>
-<title>Testing the Ethernet LAN</title>
-
-<para> *** TBD ***</para>
-
-</sect1>
-</chapter>
-
-<chapter>
-<title>Exercises for the Interested Student</title>
-
-
-<sect1>
-<title>Creating a mini-DNS system</title>
-
-<para>While managing a Domain Name Service (DNS) hierarchy can be a black
-art, it is possible to set up a Mini-DNS server on the FreeBSD system
-that also acts as your gateway to your ISP.</para>
-
-<para>Building on the files in <filename>/etc/namedb</filename> when the FreeBSD
-system was installed it's possible to create a name server that is
-both authoritative for the example network shown here as well as a
-front-door to the Internet DNS architecture.</para>
-
-<para>In this minimal DNS configuration, only three files are necessary:
-<informalexample>
-<screen>/etc/namedb/named.boot
-/etc/namedb/named.root
-/etc/namedb/mydomain.db</screen>
-</informalexample>
-</para>
-
-<para>The <filename>/etc/namedb/named.root</filename> file is automatically installed
-as part of the FreeBSD base installation; the other two files must be
-created manually.</para>
-
-
-<sect2>
-<title>The <filename>/etc/namedb/named.boot</filename> file</title>
-
-<para>The <filename>/etc/namedb/named.boot</filename> file controls the startup
-settings of the DNS server.
-Esentially, it tells the Name Server:
-<orderedlist>
-
-<listitem>
-<para>Where to find configuration files,</para>
-</listitem>
-
-<listitem>
-<para>What "domain names" it's responsible for, and</para>
-</listitem>
-
-<listitem>
-<para>Where to find other DNS servers.</para>
-</listitem>
-
-</orderedlist>
-</para>
-
-<para>Using the '<emphasis remap=tt>ee</emphasis>' editor, create a
-<filename>/etc/namedb/named.boot</filename> with the following contents:
-<informalexample>
-<screen>; boot file for mini-name server
-
-directory /etc/namedb
-
-; type domain source host/file backup file
-
-cache . named.root
-primary my.domain. mydomain.db</screen>
-</informalexample>
-</para>
-
-<para>Lines that begin with a semi-colon are comments. The significant
-lines in this file are:
-<itemizedlist>
-
-<listitem>
-<para><command>directory /etc/namedb</command>
-</para>
-
-<para>Tells the Name Server where to find the configuration files
-referenced in the remaining sections of the
-'<filename>/etc/namedb/named.boot</filename>' file.</para>
-</listitem>
-
-<listitem>
-<para><emphasis remap=tt>cache . named.root</emphasis>
-</para>
-
-<para>Tells the Name Server that the list of "Top-Level" DNS servers for
-the Internet can be found in a file called '<filename>named.root</filename>'.
-(This file is included in the base installation and its
-contents are not described in this document.)</para>
-</listitem>
-
-<listitem>
-<para><emphasis remap=tt>primary my.domain. mydomain.db</emphasis>
-</para>
-
-<para>Tells the Name Server that it will be "authoritative" for a DNS
-domain called "my.domain" and that a list of names and IP addresses
-for the systems in "my.domain" (the local network)
-can be found in a file named '<filename>mydomain.db</filename>'.</para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para>Once the <filename>/etc/namedb/named.boot</filename> file has been created and
-saved, proceed to the next section to create the
-<filename>/etc/namedb/mydomain.db</filename> file.</para>
-
-</sect2>
-
-<sect2>
-<title>The <filename>/etc/namedb/mydomain.db</filename> file</title>
-
-<para>The <filename>/etc/namedb/mydomain.db</filename> file lists the names and IP
-addresses of <emphasis>every</emphasis> system in the Local Area Network.</para>
-
-<para><emphasis>For a detailed description of the statements used in this file,
-refer to the <emphasis remap=tt>named</emphasis> manpage.</emphasis></para>
-
-<para>The <filename>/etc/namedb/mydomain.db</filename> file for our minimal DNS
-server has the following contents:
-<informalexample>
-<screen>@ IN SOA my.domain. root.my.domain. (
- 961230 ; Serial
- 3600 ; Refresh
- 300 ; Retry
- 3600000 ; Expire
- 3600 ) ; Minimum
- IN NS curly.my.domain.
-
-curly.my.domain. IN A 192.168.1.1 # The FreeBSD box
-larry.my.domain. IN A 192.168.1.2 # The Win'95 box
-moe.my.domain. IN A 192.168.1.3 # The WfW box
-shemp.my.domain. IN A 192.168.1.4 # The Windows NT box
-
-$ORIGIN 1.168.192.IN-ADDR.ARPA
- IN NS curly.my.domain.
-1 IN PTR curly.my.domain.
-2 IN PTR larry.my.domain.
-3 IN PTR moe.my.domain.
-4 IN PTR shemp.my.domain.
-
-$ORIGIN 0.0.127.IN-ADDR.ARPA
- IN NS curly.my.domain.
-1 IN PTR localhost.my.domain.</screen>
-</informalexample>
-</para>
-
-<para>In simple terms, this file declares that the local DNS server is:
-<itemizedlist>
-
-<listitem>
-<para>The Start of Authority for ("SOA") for a domain called
-'my.domain',</para>
-</listitem>
-
-<listitem>
-<para>The Name Server ("NS") for 'my.domain',</para>
-</listitem>
-
-<listitem>
-<para>Responsible for the reverse-mapping for all IP addresses that
-start with '192.168.1.' and
-'127.0.0.' ("$ORIGIN ...")</para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para>To add workstation entries to this file you'll need to add two
-lines for each system; one in the top section where the name(s) are
-mapped into Internet Addresses ("IN A"), and another line that maps
-the addresses back into names in the <filename>$ORIGIN
-1.168.192.IN-ADDR.ARPA</filename> section.</para>
-
-</sect2>
-
-<sect2>
-<title>Starting the DNS Server</title>
-
-<para>By default the DNS server ('<filename>/usr/sbin/named</filename>') is not
-started when the system boots. You can modify this behavior by
-changing a single line in '<filename>/etc/rc.conf</filename>' as follows:</para>
-
-<para> Using the '<emphasis remap=tt>ee</emphasis>' editor, load <filename>/etc/rc.conf</filename>. Scroll
-down approximately 40 lines until you come to the section that says:
-<informalexample>
-<screen>---
-named_enable="NO" # Run named, the DNS server (or NO).
-named_flags="-b /etc/namedb/named.boot" # Flags to named (if enabled).
----</screen>
-</informalexample>
-
-Change this section to read:
-<informalexample>
-<screen>---
-named_enable="YES" # Run named, the DNS server (or NO).
-named_flags="-b /etc/namedb/named.boot" # Flags to named (if enabled).
----</screen>
-</informalexample>
-
-Save the file and reboot.</para>
-
-<para>Alternatively, start the Name Server daemon by entering the following
-command:
-<informalexample>
-<screen># named -b /etc/namedb/named.boot</screen>
-</informalexample>
-</para>
-
-<para>Whenever you modify any of the files in <filename>/etc/namedb</filename> you'll
-need to kick-start the Name Server process to make it pick up the
-modifications. This is performed with the following system command:
-<informalexample>
-<screen># kill -HUP `cat /var/run/named.pid`</screen>
-</informalexample>
-</para>
-
-</sect2>
-</sect1>
-
-<sect1>
-<title>Playing with PPP filters</title>
-
-<para>The PPP program has the ability to apply selected filtering rules
-to the traffic it routes. While this is not nearly as secure as a
-formal firewall it does provide some access control as to how the link
-is used.</para>
-
-<para>('<emphasis remap=tt>man ipfw</emphasis>' for information on setting up a more secure
-FreeBSD system.)</para>
-
-<para>The complete documentation for the various filters and rules under
-PPP are availabe in the PPP manpage.</para>
-
-<para>There are four distinct classes of rules which may be applied to
-the PPP program:
-<itemizedlist>
-
-<listitem>
-<para><emphasis>alive</emphasis> filter - Access Counter (or "Keep Alive") filters
-</para>
-
-<para>These control which events are ignored by the <literal>set timeout=</literal>
-statement in the configuration file.</para>
-</listitem>
-
-<listitem>
-<para><emphasis>dial</emphasis> filter - Dialing filters
-</para>
-
-<para>These filtering rules control which events are ignored by the
-demand-dial mode of PPP.</para>
-</listitem>
-
-<listitem>
-<para><emphasis>in</emphasis> filter - Input filters
-</para>
-
-<para>Control whether incoming packets should be discarded or passed into
-the system.</para>
-</listitem>
-
-<listitem>
-<para><emphasis>out</emphasis> filter - Output filters
-</para>
-
-<para>Control whether outgoing packets should be discarded or passed into
-the system.</para>
-</listitem>
-
-</itemizedlist>
-</para>
-
-<para>What follows is a snippet from an operating system which provides a
-good foundation for "normal" Internet operations while preventing PPP
-from pumping <emphasis>all</emphasis> data over the dial-up connection. Comments
-briefly describe the logic of each rule set:
-<informalexample>
-<screen>#
-# KeepAlive filters
-# Don't keep Alive with ICMP,DNS and RIP packet
-#
- set filter alive 0 deny icmp
- set filter alive 1 deny udp src eq 53
- set filter alive 2 deny udp dst eq 53
- set filter alive 3 deny udp src eq 520
- set filter alive 4 deny udp dst eq 520
- set filter alive 5 permit 0/0 0/0
-#
-# Dial Filters:
-# Note: ICMP will trigger a dial-out in this configuration!
-#
- set filter dial 0 permit 0/0 0/0
-#
-# Allow ident packet pass through
-#
- set filter in 0 permit tcp dst eq 113
- set filter out 0 permit tcp src eq 113
-#
-# Allow telnet connection to the Internet
-#
- set filter in 1 permit tcp src eq 23 estab
- set filter out 1 permit tcp dst eq 23
-#
-# Allow ftp access to the Internet
-#
- set filter in 2 permit tcp src eq 21 estab
- set filter out 2 permit tcp dst eq 21
- set filter in 3 permit tcp src eq 20 dst gt 1023
- set filter out 3 permit tcp dst eq 20
-#
-# Allow access to DNS lookups
-#
- set filter in 4 permit udp src eq 53
- set filter out 4 permit udp dst eq 53
-#
-# Allow DNS Zone Transfers
-#
- set filter in 5 permit tcp src eq 53
- set filter out 5 permit tcp dst eq 53
-#
-# Allow access from/to local network
-#
- set filter in 6 permit 0/0 192.168.1.0/24
- set filter out 6 permit 192.168.1.0/24 0/0
-#
-# Allow ping and traceroute response
-#
- set filter in 7 permit icmp
- set filter out 7 permit icmp
- set filter in 8 permit udp dst gt 33433
- set filter out 9 permit udp dst gt 33433
-#
-# Allow cvsup
-#
- set filter in 9 permit tcp src eq 5998
- set filter out 9 permit tcp dst eq 5998
- set filter in 10 permit tcp src eq 5999
- set filter out 10 permit tcp dst eq 5999
-#
-# Allow NTP for Time Synchronization
-#
- set filter in 11 permit tcp src eq 123 dst eq 123
- set filter out 11 permit tcp src eq 123 dst eq 123
- set filter in 12 permit udp src eq 123 dst eq 123
- set filter out 12 permit udp src eq 123 dst eq 123
-#
-# SMTP'd be a good idea!
-#
- set filter in 13 permit tcp src eq 25
- set filter out 13 permit tcp dst eq 25
-#
-#
-# We use a lot of `whois`, let's pass that
-#
- set filter in 14 permit tcp src eq 43
- set filter out 14 permit tcp dst eq 43
- set filter in 15 permit udp src eq 43
- set filter out 15 permit udp dst eq 43
-#
-# If none of above rules matches, then packet is blocked.
-#-------</screen>
-</informalexample>
-</para>
-
-<para>Up to 20 distinct filtering rules can be applied to each class of
-filter. Rules in each class are number sequentially from 0 to 20
-<emphasis>but none of the rules for a particular filter class take affect
-until ruleset '0' is defined!</emphasis></para>
-
-<para>If you choose <emphasis>not</emphasis> to use Filtering Rules in the PPP
-configuration then <acronym>ALL</acronym> traffic will be permitted both into and
-out of your system while it's connected to your ISP.</para>
-
-<para>If you decide that you want to implement filtering rules, add the
-above lines to your <filename>/etc/ppp/ppp.conf</filename> file in either the
-"default:", "demand:", or "interactive:" section (or all of them - the
-choice is yours).</para>
-
-</sect1>
-</chapter>
-</book>