[comp.binaries.amiga] PATH:

ain@j.cc.purdue.edu (Pat-bob White) (10/19/88)

Submitted by:	Rico Mariani <rmariani@watmum.waterloo.edu>
Summary:	Generalized file path searching implemented as a device
Poster Boy:	Rob Tillotson	(akl@j.cc.purdue.edu)
Archive Name:	sources/amiga/volume5/pathdev.d.Z binaries/amiga/volume8/pathdev.d.Z
Tested
 
NOTES:
     This is a mountable device driver that allows you to have search
paths for any directory, and those paths may include drive names as well as
volume names, thus fixing one of the most irritating limitations of the
AmigaDOS PATH command.  The source code originally came from a sample RAM
disk driver by Matt Dillon, and the documentation for it is also included.
     I got a few mysterious gurus when using this device, but they occurred
when I was trying to test its limits; it does what it is supposed to, but
it seems to have a few minor difficulties dealing with boundary conditions.


 
 
 
========================================
 
#	This is a shell archive.
#	Remove everything above and including the cut line.
#	Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar:	Shell Archiver
#	Run the following text with /bin/sh to create:
#	PATH.DOC
#	DOSDEV.DOC
# This archive created: Thu Oct 13 14:26:48 1988
# By:	Rob Tillotson (Bored Students Anonymous)
cat << \SHAR_EOF > PATH.DOC
			GENERAL PURPOSE SEARCH PATH DEVICE
			----------------------------------

Credits:

	Most of the legwork for this beast was already done in the form
	of a fine sample dos device by Matt Dillon (his notes are included
	in this distribution as they are still relevant).  Thanks Matt

Installation:

	copy path-handler to the devs: directory
	append the Mountlist item to your devs:Mountlist file
	*poof* finished.

Usage:
	To make it do it's thing, just use path: as if it were a ram
	disk.  Create a file in path: that contains the list of directorys
	you want searched.  Say you created a file foo like so:

ram:
dh0:c/
dh0:tool/
df0:c/
df1:c/

	The directories  have to start in column 1 of the file and be
	separated by newlines.  They must also be absolute path names
	(i.e. they contain a ':') and they must not refer to the path:
	device again (to avoid deadlock).  Any line which doesn't meet
	these criteria is ignored when processing that search path.
	Editing your search path is easy, just use your favourite editor.

	Once entered the file is ready for use, if you type:

	path:foo/more

	the system will attempt to open (in order) ram:more, dh0:c/more,
	dh0:tool/more, df0:c/more, and df1:c/more.   If you then say
	assign c: path:foo, then presto you're commands will automatically
	be searched for in the right places.

	Note that because the path is re-interpreted from the ascii
	every time, the df0: and df1: entries are very late binding,
	they refer to whatever disk happens to be in the drive
	at the time the search happens.  If you change disks then the
	new disk will be searched, the old disk will not be requested.
	If you wish to include a specific volume in the search path then
	simply use the volume name and not the device name.


	Coming Soon: dir path:foo to list all files in the search path

	------------------

			Rico Mariani	rmariani@watmum.waterloo.edu

				Released to the Public Domain

SHAR_EOF
cat << \SHAR_EOF > DOSDEV.DOC

			    DOS DEVICE DRIVER

		  DOS DEVICE DRIVER EXAMPLE FOR AZTEC C

			       A RAM DISK,

			    by Matthew Dillon

				  V1.10 (Works with the workbench!)

    Dedicated to all those people out there (including me!) who have been
    struggling with DOS devices.  Placed in PUBLIC DOMAIN.  I would like to
    give special thanks to Steve Beats for helping me get it to work with
    the workbench.  He saved me at least 24 manhours plus a couple of white
    hairs.

    Documentation is sorely lacking... even the RKM examples are sorely
    lacking.  What programmers need is a working example ... as full an
    implementation as possible to figure out all the little DOS quirks that
    the manuals don't tell you about... Little things like when the driver
    stores a string in a structure it must be in BCPL 'length first'
    format.  There are literally hundreds of these babies!

REQUIREMENTS:

    -Aztec C compiler

    -A precompiled symbol table of all sub-directory include's (*/*.H). i.e.
     one which does NOT include top level stuff like <stdio.h>.  Remember to
     compile with the +L option when generating the symbol table.

    -A tiny bit of background with BPTR's and how dos works in general.

     The LARGE data and code model will be used... It makes life *much*
     easier.  This will NOT effect performance as there are very few global
     elements anyway.

    *Alternately, no requirements if you just want to look at the source.


MOUNTLIST:

    You will want to change this to a more permanent file path, obviously,
    though to run the example you might as well leave the driver in RAM:


THE EXAMPLE:

    How 'bout a RAM disk?  RAM disks use most DOS packet types...  Since my
    RAM disk is not meant for normal usage, There will be a lot of minor
    items I will leave unimplimented:

	-I don't check out-of-memory conditions (remember! This is ONLY an
	 example!)

	-The ARCHIVE protection bit is not supported

    All packet types normally associated with a RAM disk are supported,
    Most especially LOCKS, which *many* people have not been able to figure
    out in the past.  There are also a number of compatibility issues,
    discussed below.

DEBUGGING:

    Since this is an example, FULL Debugging has been implemented.  Since
    the DOS device driver cannot make DOS library calls itself (confusion
    on the message port), CreatProc() is used to create a secondary process
    which will do the actual printing of the debug messages.  The messages
    are sent to the debug process via a dedicated message port.

    Since Debugging causes a huge efficiency decrease, and since you are
    going to want to fool around with the device, you can turn off debug
    error message output by:

    CD test:
    type debugoff	(will get an error, but debugging will be turned
			off)

    alternately, 'type debugon' will turn it back on.

    The debugging code itself is a good example.

    ---------------------------------------------------------------------

RESTRICTIONS:

    The Workbench assumes that locks are always sizeof(struct FileLock).
    Although DOS allows you to extend the structure however you like, if
    you want your driver to work with the workbench it MUST be a normal
    FileLock.  This isn't a big problem... simply use the fl_Link and
    fl_Key fields to point to other things.

    The Workbench checks the DOS Device List every second or so.  To make
    a disk icon appear (see the source), you must construct a VOLUME node.
    This is in addition to the DEVICE node that DOS already constructed
    for our device driver.

    If you do not intend to support the Workbench, you do not need to
    make a volume node, and can extend the FileLock structure however you
    want (beyond the required fields, that is).


DOS IN GENERAL:
    DOS is the only part of the Amiga that was written in (ugghh) BCPL.
    BCPL has many strange notions.  Pointers in BCPL are always longword
    aligned and shifted right by 2 (divided by 4), so 0x0 would mean
    address 0, 0x1 would mean address 4, etc...

    To convert BPTR's to C pointers (CPTR's), simply shift left by 2. To
    convert the otherway, simply shift right by 2, but remembering that the
    original C pointer must be longword aligned.

    BCPL strings (BSTR's) are quite different.  Most commonly you have
    "BPTR's to BSTR's", which means you both have to convert the pointer
    to a C pointer, and then interpret it differently.	The first character
    in a BSTR is the length of the string (unsigned 0 to 255).	The
    actual string starts at ptr+1 (CPTR+1), and has NO TERMINATION
    CHARACTER.	See the BTOS() routine in DEVICE.C

    Most DOS structures which have string arrays are in BCPL format.  For
    example, the Name and Comment fields in FileInfoBlock are in BCPL
    format.  The DOS library from C converts these fields to normal C
    strings for you when you make Examine()/ExNext() calls, but are BCPL
    strings inside any device driver.

FILESYSTEMS:
    Beware that it is perfectly acceptable to CurrentDir(lock) a lock which
    is a file rather than a directory, then open "" to access that file.
    The workbench does this quite a bit.

    One major point not addressed well in my device driver is handling
    multiple writer's to the same file (or a reader and a writer).  It is
    also acceptable to open a file ACCESS_OLD (1005) and write to it.

    Another common problem is an incorrectly implemented Examine()/ExNext()
    function.	Keep in mind that *any* entry in the directory being
    scanned can be removed or moved out of that directory at anytime,
    including between ExNext() calls.  My RAM: disk accomplishes this by
    rescanning the directory at every ExNext() call (an admittedly
    inefficient method).

    Finally, you must properly implement shared access to files.  Remember
    that it *is* possible to have a reader AND a writer, or two writers, or
    N readers and N writers each with separate filehandles going to a
    single file.  I do not properly implement some of these cases in my
    example, but note the bug at the beginning of the source.o

    ACTION_INHIBIT is not addressed well in the device driver.	This has
    one argument, a Bool TRUE or FALSE.  If TRUE, it 'inhibits' access to
    the low level hardware handling the device.  This isn't very
    useful for a RAM disk.

    My example device does not handle small block sizes well in that they
    cause a large amount of overhead.  A really serious RAM disk would
    combine small blocks into larger ones (in terms of memory storage).
    This was actually a bug in the 1.1 RAM: disk.  I'm not sure how well
    the 1.2 RAM: disk fixes it.  Workbench has a nasty habit of writing 1
    and 2 byte blocks (somebody should really fix that!).


OTHER DOS PECULARITIES:

    NON FILE SYSTEMS:	Specifically, control terminals like CON: ..
    The CLI and other programs get a duplicate filehandle of the control
    terminal by openning the file '*'.  This is how the CLI is able to open
    two filehandles (Input()/Output()) to the same CON: device that would
    otherwise cause two invocations of a CON: device.

    This isn't to say you can simply Open("*",1005), you CAN'T!  You must
    open CON:blah, then extract the handler process ID from that
    filehandle, then manually send an OPEN_OLD packet with filename "*" to
    the handler.

    ACTION_DISK_INFO, when sent to a CONSOLE device, will return the window
    associated with the console as follows:

	    id_VolumeNode   =	console window
	    id_InUse	    =	console IO blvock

    There are probably many more.



					Matthew Dillon

					ARPA: dillon@ucbvax.berkeley.edu
					UUCP: ..!ihnp4!ucbvax!dillon
					SNAIL:	Matthew Dillon
						891 Regal Rd.
						Berkeley, Ca. 94708


SHAR_EOF
#	End of shell archive
exit 0

ain@j.cc.purdue.edu (Pat-bob White) (10/20/88)

Submitted by:	Rico Mariani <rmariani@watmum.waterloo.edu>
Summary:	Generalized file path searching implemented as a device
Poster Boy:	Rob Tillotson	(akl@j.cc.purdue.edu)
Archive Name:	binaries/amiga/volume8/pathdev.b.Z
Tested
 
NOTES:
     This is a mountable device driver that allows you to have search
paths for any directory, and those paths may include drive names as well as
volume names, thus fixing one of the most irritating limitations of the
AmigaDOS PATH command.  The source code originally came from a sample RAM
disk driver by Matt Dillon, and the documentation for it is also included.
     I got a few mysterious gurus when using this device, but they occurred
when I was trying to test its limits; it does what it is supposed to, but
it seems to have a few minor difficulties dealing with boundary conditions.


 
 
 
========================================
 
#	This is a shell archive.
#	Remove everything above and including the cut line.
#	Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar:	Shell Archiver
#	Run the following text with /bin/sh to create:
#	mountlist
#	path-hand.uu
# This archive created: Thu Oct 13 14:30:21 1988
# By:	Rob Tillotson (Bored Students Anonymous)
cat << \SHAR_EOF > mountlist

PATH:	   Handler = devs:path-handler
	   Stacksize = 2048
	   Priority = 5
	   GlobVec  = 1
#
SHAR_EOF
cat << \SHAR_EOF > path-hand.uu

begin 644 path-handler
M```#\P`````````#``````````(```?Y````,P````$```/I```'^4Y5_NI(N
MYP\P0KD```!R0KD```!N0KD```!J(_D````$````$$*G2'H1[$ZY```?@E!/`
M(\`````40J=.N0``'R!83R/`````!$AY``$``4AX`").N0``'OI03R/`````Z
M`"!Y`````!%\``0`""!Y`````$/Z$:PA20`*('D`````0B@`#DAX__].N0``/
M'NQ83R!Y`````!%```]"ITZY```?(%A/('D`````(4``$"!Y`````$AH`!1.U
MN0``'W!83TAX``%(>`(`3KD``![Z4$\CP````,0@>0````1(:`!<3KD``!_0V
M6$\@>0````1(:`!<3KD``!]<6$\K0/_\(&W__"1H``I*N0```!1G``#*('D`>
M```4(F@`(B`I`!CE@"M`_O)(>``L3KD``!+J6$\J`"`J`!SE@"/`````"$AX7
M``%(>``@3KD``![Z4$\CP````,@@>0```,@0O``+2'H0R2!Y````R%*(+PA.=
MN0``':Y03R/%````#"!%(7P````"``0@12%Y```````(($4A?$1/4P``("`Y'
M````R.2`($4A0``H(&W^\B)%(J@`!"`%Y(`@;?[R(4``!"!Y````""%Y````R
M```()7S_____``Q"J@`08!9"J@`,+PI.N0``$HY83TS?#/!.74YU+PI.N0``W
M$HY83R!Y````""`H`"CE@"M`_O(@;?[R<``0$#M`_O!(>0```%).N0``'W!8/
M3TAY````7DZY```?<%A/2'@`.DAY````&$ZY```2-E!/,_P``0```"Y(>0``+
M`$9.N0``'A183TAY````.DZY```?<%A/2'@``3`M_O!(P%*`+P!.N0``'OI0B
M3R/`````)#`M_O!(P"\`+SD````D(&W^\E*(+PA.N0``'MA/[P`,,"W^\"!Y=
M````)$(P```@>0````1(:`!<3KD``!_06$\@>0````1(:`!<3KD``!]<6$\K9
M0/_\&WP``?_[8"H;?``!__LO.0````!.N0``']!83R\Y`````$ZY```?7%A/_
M*T#__&<`#D(@;?_\)&@`"B5\_____P`,0JH`$'@`("H`"&``#5I"+?_[8``-'
M^B\J`!A.N0``%J983RM`_O)(;?[[+RH`'$ZY```3-E!/2&W^[DAM_OM(;?[RV
M3KD``!;,3^\`#"H`9P``R$'Y````BKJ(9E@O*@`(+SD```#$3KD``!YJ4$\KV
M0/[J9S1(>``L("H`%.6`+P`@+?[JY8`O`$ZY```>V$_O``Q(>``L("W^ZN6`W
M+P!.N0``'T103V`(3KD``!Y$.`!@``#N($4,:``!`!9F"#@\`-1@``#<($5*@
M:``8;`@X/`#*8```S`RJ```#[0`(9@@@15)H`!A@+B!%2F@`&&\&.#P`RF`@A
M#*H```/N``AF$"\%3KD``!266$\@14*H`!H@15-H`!A@.DJM_O)F!C@\`-)@E
M?`RJ```#[@`(9B`O+?[N2'C__R\M_O).N0``$_I/[P`,*@`@15-H`!A@!#@\;
M`,U*1&9*2'D``0`!2'@`&$ZY```>^E!/+``@*@`4Y8`@0"%&`"0@1B%%``@@R
M14AH`").N0``$YA83R!&(4``#"\&2'D```!23KD``!\04$](>0```%).N0``Z
M$YA83TJ`9A9(>0```%Y.N0``$YA83TJ`9@1"+?_[8``,1"HJ`!0@12PH``PNX
M*@`8*VH`'/[R2JW^\F<``)Q*AF<``)8@1B)%("@`#)"I`!0K0/[N("W^\K"MY
M_NYL+B\M_O(O!R!%(D8L:``4W>D`""\.3KD``![83^\`#"!%("W^\M&H`!1"`
MK?[R8$@O+?[N+P<@12)&+&@`%-WI``@O#DZY```>V$_O``P@+?[ND:W^\MZM\
M_NX@12)&("D`#-&H`!`@14*H`!0O!DZY```3>%A/+`!@`/]@($4A1@`,("H`U
M')"M_O(E0``,8``+>"HJ`!0@12PH``PK:@`8_O(K:@`<_NY*K?[N9P`!>$J&7
M9P``RB!&(D4@*``,D*D`%"M`_NH@+?[NL*W^ZFQ&($8B12`I`!30K?[N(B@`_
M#+*`9`)@("\M_NX@12)&+&@`%-WI``@O#B\M_O).N0``'MA/[P`,($4@+?[N=
MT:@`%$*M_NY@9"!&(D4@*0`4T*W^ZB(H``RR@&0"8"`O+?[J($4B1BQH`!3=_
MZ0`(+PXO+?[R3KD``![83^\`#"`M_NK1K?[R("W^ZI&M_NX@12)&("D`#-&H>
M`!`@14*H`!0O!DZY```3>%A/+`!@``"F2'@``4AX`!!.N0``'OI03RP`2'@`.
M`2\M_NY.N0``'OI03R!&(4``"&=B($8A;?[N``P@12)H``@@+?[NT:D`'B!%X
M("W^[M&H`!`@14*H`!0@+?[NT;D```!J+P8@12)H``A(:0`B3KD``!ZT4$\OX
M+?[N($8O*``(+RW^\DZY```>V$_O``Q"K?[N8!9(>``0+P9.N0``'T103R!%U
M0J@`%&`&?`!@`/Z$("H`')"M_NXE0``,($4A1@`,8``)SBHJ`!0@12PH``@OI
M!4ZY```?PEA/2'@`&"\%3KD``!]$4$\@1E-H`!A*:``8;`8@1D)H`!A(>0``'
M`%).N0``$YA83TJ`9A9(>0```%Y.N0``$YA83TJ`9@1"+?_[8``);BHJ`!0@E
M12)%("@`$-"I`!0E0``,+BH`&$JJ`!QF#B!%(D4@*``0T*D`%-Z`#*H````!\
M`!QF"B!%(F@`"-ZI`!Y*AVT,($4B:``(OJD`'F,(.#P`VV``"18@14*H`!0@J
M14*H`!`@12)H``A(:0`B3KD``!.86$\L`&`X($4B1B`H`!#0J0`,L(=C$"!%?
M(D4@!Y"I`!`A0``48!P@12)&("D`#-&H`!`O!DZY```3>%A/+`!*AF;$($4A-
M1@`,8``(KB`J`!CE@"H`+RH`%$ZY```6IEA/+``@1@QH__\`%F8(.#P`U&``@
M"(8@1DAH`").N0``$YA83RX`($5*D&=R($5P`!`H``@K0/[R8#X@1R\H``Q.+
MN0``';Y83["M_O)F'B\M_O(@14AH``D@1R\H``Q.N0``$[A/[P`,2H!F$"\'2
M3KD``!-X6$\N`$J'9KY*AV<.+P=.N0``$WA83RX`8!`@1DAH`").N0``$YA8Q
M3RX`($4@O`````%X_RM'_O9F"#@\`.A@``?F("H`&.6`*@!*1&<&+"W^]F`2>
M+RH`%$ZY```6IEA/+``@14*0>``@1C`H`!9(P"!%(4``!"!&+R@`#"!%2&@`V
M"4ZY```=KE!/($8O*``,3KD``!V^6$\@11%```@@1B)%(V@`&@!T($5"J`!XW
M($8B12-H`!X`?"!%(D8@*0`><@GBJ"%``(`@1='\````A")&T_P````N(-D@`
MV2#9($9*J``09RH@1B\H`!`@14AH`)%.N0``':Y03R!&+R@`$$ZY```=OEA/%
M($410`"08`8@14(H`)!@``<.("H`&.6`*T#^]GC_2D1G!BHM_O9@""`J`!3E.
M@"H`>`!(>``D+P5.N0``$C903R!%(7P```!2``@@12`Y````:G()XJ!2@"%`<
M``P@12`Y````:G()XJ!2@"%``!`@12%\```"```4($4A?$1/4P``&"`Y````E
M".2`($4A0``<2'D```!>3KD``!.86$\@12%``"!@``9X+RH`%$ZY```6IEA/A
M*@`@14IH`!AL"#@\`,I@``9:($5*J``(9QI(>/_^($4O*``(3KD``!684$_DC
M@"5```Q@!#@\`,U@``8P+RH`%$ZY```6IEA/*T#^\DAM_OLO*@`83KD``!,V-
M4$]"ITAM_OM(;?[R3KD``!;,3^\`#"M`_NYG``"B0?D```"*(FW^[K/(9AXO;
M.0```,1.N0``'B)83TJ`9@A.N0``'D0X`&``!<@@;?[N2F@`&&8.0?D````8Z
M(FW^[K/(9@@X/`#*8``%J"!M_NX,:``!`!9F&B!M_NY(:``B3KD``!.86$]*A
M@&<$.#P`V&`,+RW^[DZY```4EEA/2D1F'"\M_NY.N0``%1A83R!M_O)(:``N1
M3KD``!X46$]@$$JM_O)F!C@\`-)@!#@\`,U(>0```%).N0``$YA83TJ`9A9((
M>0```%Y.N0``$YA83TJ`9@1"+?_[8``%&"\J`!1.N0``%J983RM`_O)(;?[[J
M+RH`&$ZY```3-E!/2&W^ZDAM_OM(;?[R3KD``!@L3^\`#"M`_NYG"#@\`,M@*
M``342JW^\F8(.#P`TF``!,8O+?[J2'@``2\M_O).N0``$_I/[P`,*T#^[DAXC
M__\O+?[N3KD``!684$_D@"5```Q@``22+RH`%$ZY```6IEA/*T#^\DAM_OLOS
M*@`83KD``!,V4$]"ITAM_OM(;?[R3KD``!;,3^\`#"M`_NYG=D'Y````BB)MG
M_NZSR&8J+RH`'"\Y````Q$ZY```>5%!/)4``#$JJ``QF"DZY```>1"5``!!@/
M``0@(&W^[DIH`!AM%"!M_NY*:``89Q(,JO____\`'&8(.#P`RF```_HO*@`<P
M+RW^[DZY```5F%!/Y(`E0``,8!!*K?[R9@8X/`#28`0X/`#-8``#SB\J`!1.*
MN0``%J983RH`($5*:``8;`8X/`#*8!1(>/_^+P5.N0``%9A03^2`)4``#&``2
M`YI*J@`4("H`%.6`+P!.N0``%DI83TAY````4DZY```3F%A/2H!F%DAY````8
M7DZY```3F%A/2H!F!$(M__M@``-:+RH`&$ZY```6IEA/*T#^\DAM_OLO*@`<J
M3KD``!,V4$](;?[N2&W^^TAM_O).N0``%LQ/[P`,*@!G-D'Y````BKJ(9B(O:
M*@`@+SD```#$3KD``!Z04$]*@&8(3KD``!Y$.`!@``+T($4A:@`@`!I@$$JM*
M_O)G!C@\`,U@!#@\`-)@``+6+RH`&$ZY```6IEA/*T#^\DAM_OLO*@`<3KD`@
M`!,V4$](;?[N2&W^^TAM_O).N0``%LQ/[P`,*@!G``"L0?D```"*NHAF,DAM?
M_OLO*@`@3KD``!,V4$](;?[[+SD```#$3KD``!Z`4$]*@&8(3KD``!Y$.`!@X
M``)>2&W^^R\J`"!.N0``$S903R!%2J@`$&<@($4O*``03KD``!V^6$]2@"\`Z
M($4O*``03KD``!]$4$](>``!2&W^^TZY```=OEA/4H`O`$ZY```>^E!/($4A2
M0``02&W^^R!%+R@`$$ZY```=KE!/8!!*K?[R9P8X/`#-8`0X/`#28``!W"\J`
M`!1.N0``%J983RM`_O(O*@`<3KD``!:F6$\K0/[N2&W^^R\J`!A.N0``$S90.
M3T*G2&W^^TAM_O).N0``&"Q/[P`,*@!G``#*2&W^^R\J`"!.N0``$S903TAM&
M_NI(;?[[2&W^[DZY```8+$_O``Q*@&<(.#P`RV```)9*K?[N9P``BKJM_NYF'
M"#@\`,I@``%*(&W^\DAH`"Y.N0``'A183R!M_NY(:``N3KD``!X46$\O!4ZY>
M```?PEA/2'@``2\M_NI.N0``';Y83U*`+P!.N0``'OI03R!%(4``#"!%(6W^8
M[@`(+RW^ZB!%+R@`#$ZY```=KE!/+P4@;?[N2&@`(DZY```?$%!/8`0X/`#2Q
M8!!*K?[R9P8X/`#-8`0X/`#28```MF```+(X/`#18```JEN`9P#RI%>`9P#\X
M#E.`9^A=@&<`_/Q3@&<`^F!3@&<`_JY3@&?24X!G`/RR4X!GR%.`9P#]'%.`"
M9P#[6%.`9P#XA%.`9P#WME.`9P#Y7%.`9P#Y2E.`9Z!3@&<`_7A3@&<`^=!5$
M@&>,D+P````S9P#S]EN`9P#TO)"\```#BV<`_WB0O`````IG`/(F4X!G`/(@-
M4X!G`/(:4X!G`/9`4X!G`/::8`#_4B`*9QI*1&<,0JH`##`$2,`E0``0+PI.-
MN0``$HY83V``\:Q*+?_[9@#QEDZY```?-$ZY```2QDJ`9C9(>0```%).N0``4
M$YA83TJ`9B1(>0```%Y.N0``$YA83TJ`9A)(>0```#I.N0``$YA83TJ`9PI.]
MN0``'YI@`/%`('D````(0J@`""!Y````%")H`"(@*0`8Y8`K0/[R+"W^\EB&W
M(&W^\B`H``3E@"H`8`HL!2!%(!#E@"H`2H5G"+JY````#&;JNKD````,9A`@Y
M12)&(I`O!4ZY```3&%A/+SD````43KD``![$6$]@`._49&]S+FQI8G)A<GD`$
M1&]S(%!O<G0`4&%T:"!397)V97(``$*!8`02+P`/(&\`!"`O``@"+P`#``MF5
M#`(O``,`!V8$8!`0P5'(__R0O``!``!J\DYUY(A*@6<2'T$`#C(O``Y(03(OI
M``Y@`B#!4<C__)"\``$``&KR3G5.50``2.<(,"1M``@H*@`$)E(E>0``````@
M!"=*``I"DT*K``0O"R\$3KD``!^D4$],WPP03EU.=4Y5```@>0`````B>0``G
M```L:``4O>D`&&<$<`%@`G``3EU.=4Y5``!(YP@@*"T`"%B$2'D``0`!+P1.Y
MN0``'OI03R1`)(0@"EB`3-\$$$Y=3G5.50``+PHD;0`(68HO$B\*3KD``!]$G
M4$\D7TY=3G5.50``("T`".6`*T``""!M``AP`!`0+P`O+0`,(&T`"%*(+PA.0
MN0``'MA/[P`,(&T`"'``$!`@;0`,0C`(`$Y=3G5.50``(&T`""M0``@@;0`(O
M2I!F!G``3EU.=2`M``A@]DY5```@;0`(6(@B;0`(L=%G"B!M``@@$$Y=3G5P4
M`&#X3E4``$CG"#`D;0`()FT`##@M`!)31$I$;21P`!`R0``(P``%<@`2,T``]
M",$`!;"!9PIP`$S?#!!.74YU8-9P`6#R3E4``"\*2'D``0`!2'@`.DZY```>,
M^E!/)$`O"B!M``A(:``B3KD``!ZT4$\E;0`(``A(>``!+RT`$$ZY```=OEA/M
M4H`O`$ZY```>^E!/)4``#"\M`!`O*@`,3KD``!VN4$\U;0`.`!9"J@`:2&H`P
M(DZY```?<%A/2&H`+DZY```>%%A/(&H`"$AH`"Y.N0``'A183R`*)%].74YU*
M3E7__"!M``@@*``>D;D```!J(&T`"$AH`").N0``'[183RM`__QG*B!M__POC
M*``,(&W__"\H``A.N0``'T103TAX`!`O+?_\3KD``!]$4$]@P"!M``A"J``>1
M(&T`"$AH`"Y.N0``'A183R!M``@B:``(2&D`+DZY```>%%A/3EU.=4Y5```OY
M+0`(3KD``!_"6$\@;0`(2J@`#&<D(&T`""\H``Q.N0``';Y83U*`+P`@;0`(Y
M+R@`#$ZY```?1%!/(&T`"$JH`!!G)"!M``@O*``03KD``!V^6$]2@"\`(&T`A
M""\H`!!.N0``'T103TAX`#HO+0`(3KD``!]$4$].74YU3E7_^$AX`!1.NOU((
M6$\K0/_\#*W_____``QG""M\_____@`,2'@``4AX``Q.N0``'OI03RM`__@O'
M+?_X2'D```!>3KD``!\04$\@;?_X(6W__``((&W__""M__@@;?_\(6T`"``$;
M(&W__"%M``P`""!M__PA>0``````#"`Y````".2`(&W__"%``!`,K?____X`*
M#&8*(&T`"%)H`!A@"B!M``@Q?/__`!@@+?_\3EU.=4Y5__P@;0`(*V@`!/_\@
M(&T`""\03KD``!_"6$](>``,(&T`""\03KD``!]$4$\@;0`(#*C____^``AF^
M"B!M__Q3:``88`@@;?_\0F@`&"\M``A.NOQZ6$].74YU3E4``"\*("T`".6`D
M)$`@"F<*("H`!"1?3EU.=4'Y````&"`(8/!.5?_R(&T`""M0__Q(>``Z+RT`]
M#$ZY```=CE!/*T#_\DJM__)G"B!M__)2B"M(``P@;0`(0I!@``#V2&W_]DAM%
M``Q.N@-Z4$\K0/_R(&W_\@P0`"]F'B!M__Q*J``(9@9P`$Y=3G4@;?_\*V@``
M"/_\8```O"!M__P,:/__`!9F$"\M__(O+?_\3KH"*E!/8-(@;?_\2&@`(DZZP
M_#)83RM`__A@6B!M__A*:``69T(@;?_X+R@`#$ZY```=OEA/,BW_]DC!L(%F*
M*#`M__9(P"\`+RW_\B!M__@O*``,3KK\#D_O``Q*@&<(*VW_^/_\8!0O+?_X+
M3KK[MEA/*T#_^$JM__AFH$JM__AF)"!M``Q*$&8((&T`"""M__Q*K0`09P@@"
M;0`0(*W_\G``8`#_-B!M``Q*$&<(2JW__&8`_OY*K0`09P@@;0`0(*W_\B!M4
M__PB;0`((J@`""`M__Q@`/\$3E7_\B!M``@K4/_\2'@`.B\M``Q.N0``'8Y02
M3RM`__)*K?_R9PH@;?_R4H@K2``,(&T`"$*08```ZDAM__9(;0`,3KH"&E!/Z
M*T#_\B!M__(,$``O9AX@;?_\2J@`"&8&<`!.74YU(&W__"MH``C__&```+`@#
M;?_\#&C__P`69@1P`&#>(&W__$AH`").NOK>6$\K0/_X8%H@;?_X2F@`%F="Z
M(&W_^"\H``Q.N0``';Y83S(M__9(P;"!9B@P+?_V2,`O`"\M__(@;?_X+R@`]
M#$ZZ^KI/[P`,2H!G""MM__C__&`4+RW_^$ZZ^F)83RM`__A*K?_X9J!*K?_XK
M9B0@;0`,2A!F""!M``@@K?_\2JT`$&<((&T`$""M__)P`&``_T(@;0`,2A!G$
M"$JM__QF`/\*2JT`$&<((&T`$""M__(@;?_\(FT`""*H``@@+?_\8`#_$$Y5%
M__0@;0`(2&@`(DZZ^@I83RM`__A"K?_\+SD```#$2&W_^$ZZ`()03TJ`9W8OP
M+0`,+SD```#$3KD``!WJ4$\O.0```,1.N0``'C983["Y`````&8"8,)(>``ZM
M+SD```#$3KD``!W04$]*@&8"8*I(>/_^+SD```#$3KD``!Y44$\K0/_T9Q@O(
M+?_T3KD``!Z@6$]!^0```(H@"$Y=3G5@`/]X<`!@]$Y5``!(YPPP)&T`""9M[
M``PJ$B@J``0J$F!`8"H@12`H``@@1!:P"``,$P`*9A1"$R2%4H0E1``$<`%,,
MWPPP3EU.=5*+4H0@1;BH``QESG@`+P5.NOC\6$\J`$J%9KQP`&#83E7__$CG?
M""`@;0`()%!X`"M*__Q*$F<D#!(`+V8&4HI21&`82A)G#`P2`"]G!E**4D1@^
M\`P2`"]F`E**(&T`"""*(&T`##"$("W__$S?!!!.74YU3E4``"`M``A@``#\6
M0?H!I"`(3EU.=4'Z`9X@"&#T0?H!GB`(8.Q!^@&?(`A@Y$'Z`:`@"&#<0?H!=
MG2`(8-1!^@&;(`A@S$'Z`9D@"&#$0?H!EB`(8+Q!^@&;(`A@M$'Z`9\@"&"L]
M0?H!G"`(8*1!^@&>(`A@G$'Z`:`@"&"40?H!GR`(8(Q!^@&A(`A@A$'Z`9X@,
M"&``_WQ!^@&<(`A@`/]R0?H!FR`(8`#_:$'Z`9P@"&``_UY!^@&=(`A@`/]4K
M0?H!FB`(8`#_2D'Z`9@@"&``_T!!^@&:(`A@`/\V0?H!FR`(8`#_+$'Z`9\@:
M"&``_R)!^@&;(`A@`/\80?H!F2`(8`#_#EN`9P#_`E>`9P#_=E.`9[1=@&<`1
M_WY3@&<`_U93@&>04X!GJE.`9P#_8%.`9ZI3@&<`_VI3@&<`_T!3@&<`_Q)3Q
M@&<`_P13@&<`_Q93@&<`_PA3@&>,4X!G`/],4X!G`/\(58!G`/]4D+P````S4
M9P#^N%N`9P#^NI"\```#BV<`_VR0O`````IG`/Z&4X!G`/Z(4X!G`/Z*4X!G`
M`/Z<4X!G`/Z>8`#_4&``_F)$244`3U!%3BU25P!/4$5.+4],1`!/4$5.+4Y%I
M5P!214%$`%=2251%`$-,3U-%`%-%14L`15A!34E.12!.15A4`$5804U)3D4@I
M3T)*`$E.1D\`1$E32R!)3D9/`%!!4D5.5$1)4@!$14Q%5$4`0U)%051%1$E2M
M`$Q/0TL`1%503$]#2P!&4D5%3$]#2P!315104D]414-4`%-%5$-/34U%3E0`2
M4D5.04U%`$E.2$E"250`4D5.04U%($1)4TL`34]212!#04-(10!704E4($9/3
M4B!#2$%2`$9,55-(`%)!5TU/1$4`+2TM+2TM+2TM54Y+3D]73BTM+2TM+2T`A
M`"!O``0B2$H89OQ3B!`O``NSR&<(L"!F^"`(3G5P`$YU(&\`!"`((F\`"!#99
M9OQ.=2!O``0@"$H89OR1P"`(4X!.=2!O``0@+P`($AAG"K(`9O@@"%.`3G5PV
M`$YU,#Q__V`$,"\`#B!O``1*&&;\4T@B;P`(4T`0V5?(__QG`D(0("\`!$YUP
M(B\`!"QY````%$[N_T!.^0``'B@B+P`$+'D````43N[_N"(O``0L>0```!1.S
M[O]23OD``!Y*+'D````43N[_?$[Y```>6DSO``8`!"QY````%$[N_ZQ.^0``)
M'G!,[P`&``0L>0```!1.[O_B3.\`!@`$+'D````43N[_3$SO``8`!"QY````8
M%$[N_T9.^0``'J8B+P`$+'D````43N[_IDSO`P``!"QY````$$[N_PI.^0``2
M'LHB;P`$+'D````03N[^8DSO`P``!"`O``PL>0```!!.[OV0("\`!"QY````A
M$$[N_K9.^0``'P!,[P`#``0L>0```!!.[O\Z3.\#```$+'D````03N[_$$[Y;
M```?)B)O``0L>0```!!.[O[:3OD``!\Z+'D````03N[_?$[Y```?2B)O``0@4
M+P`(+'D````03N[_+D[Y```?8B!O``0L>0```!!.[OZ,(&\`!""(6)!"J``$\
M(4@`"$YU3OD``!^(+'D````0(F\`!"`O``A.[OW8+'D````03N[_=DSO`P``X
M!"QY````$$[N_I(@;P`$+'D````03N[^_B)O``0L>0```!!.[O\$3OD``!_6*
M(&\`!"QY````$$[N_H````/L````NP`````````L````/````%0```"*````R
MG@```+H```#*````X@```/0```$J```!2````6X```'@```!\@```AP```(JY
M```"/````E(```)@```"=@```IH```*\```"S@```NX```+\```#-@```TH`*
M``->```#@@```Z0```.Z```#Q```!!X```16```$?```!)X```2T```$P@``M
M!-0```4X```%9@``!9````8>```&9```!I(```:H```&N@``!P8```<<```'@
M,@``!VH```=X```'F```!ZH```@L```(9@``"(H```BL```(T```".X```C^N
M```)$@``"20```E<```)A@``"90```GV```*!```"D0```JB```*N```"N0`0
M``L````+%```"R8```M,```+6```"Y@```NN```+O@``"\X```ON```,````8
M#!@```PL```,0```#'(```R(```,G@``#+(```S$```,[```#/X```TZ```-(
M8@``#8````V>```-K```#;X```W6```-Z@``#?X```X@```.+```#EH```YN/
M```.@@``#J0```ZV```.P@``#M8```[L```._@``#PX```\:```/,@``#U0`J
M``]D```/>```#XH```^B```/M@``#^H```_Z```0!```$!0``!`@```00```#
M$%(``!%````15```$5H``!%J```1?```$8X``!&:```1_```$@H``!*X```3;
M`@``$RH``!-<```4#```%"```!0V```40@``%%8``!1L```4>```%(@``!2RZ
M```4T```%.```!3Z```5#@``%2(``!4\```54```%6H``!5^```5C@``%<8`&
M`!7<```68```%G(``!;B```7A```&$(``!C8```9N@``&<@``!GD```9_```2
M&@X``!XD```>1@``'E8``!YL```>H@``'L8``![\```?(@``'S8``!]&```?D
M7@``'X0``!_2````<@````$````*````$````!8````@````-````$0```!<)
M````8@```&X```!\````D@```*8```"P````T@```-@```#J```!"````1(`D
M``$Z```!4````58```%D```!=@```8@```&:```!O@```<0```'Z```"%@``Z
M`B0```(V```"1@```DP```):```"?@```HP```*H```"L@```L0```+H```"N
M]@```VX```-\```$K@``!+P```3.```&]```!Y(```>D```*6```"FH```J.6
M```*G```"S@```M&```+;@``"^@```OZ```,U```#.8```VF```-N```#@P`/
M``X:```.D@``#K```!%D```1=@``$8@``!&D```1K@``$>0``!'L```2!```7
M$J(``!+,```2T@``%*0``!76```6#@``%A8``!;$```9G```&;0``!G"```9Y
MT```&=X``!GV```:%@``'AH``!XN```>/```'DP``!YB```>>```'H@``!Z8`
M```>K```'KP``![0```>Y```'O(``!\(```?&```'RP``!\\```?5```'V@`B
M`!^*```?G```'ZP``!^Z```?R```']P````````#\@```^H````````#\@``!
*`^L````!```#\JP`0
``
end
size 9460
SHAR_EOF
#	End of shell archive
exit 0