Path: utzoo!utgpu!utstat!jarvis.csri.toronto.edu!mailrus!ames!oliveb!sun!rishathra!page From: page%rishathra@Sun.COM (Bob Page) Newsgroups: comp.sources.amiga Subject: v89i110: strings-lc-head - more unix(tm)-like utilities Message-ID: <101960@sun.Eng.Sun.COM> Date: 29 Apr 89 03:51:48 GMT Sender: news@sun.Eng.Sun.COM Lines: 1170 Approved: page@sun.com Submitted-by: edwin@hcr.uucp (Edwin Hoogerbeets) Posting-number: Volume 89, Issue 110 Archive-name: unix/more-utils.1 [uuencoded executables enclosed. ..bob] # This is a shell archive. # Remove anything above and including the cut line. # Then run the rest of the file through 'sh'. # Unpacked files will be owned by you and have default permissions. #----cut here-----cut here-----cut here-----cut here----# #!/bin/sh # shar: SHell ARchive # Run the following text through 'sh' to create: # Readme # Makefile # head.c # lc.c # strings.c # head.uu # lc.uu # strings.uu # This is archive 1 of a 1-part kit. # This archive created: Fri Apr 28 20:25:06 1989 echo "extracting Readme" sed 's/^X//' << \SHAR_EOF > Readme X various unix-like utilties: strings, head, lc X Copyright 1989 Edwin Hoogerbeets X XThis code is freely redistributable as long as no charge other than Xreasonable copying fees is levied for it. X---------- X Xstrings - show printable strings embedded in a binary file X XUsage: X strings [file ...] X XNotes: XIf no file name is specified, then strings takes from the stdin. X XI know type opt h will do the same thing, but I like having all the XUnix utilities available should I happen to type them. (and not Xaliased, either) X--------- X Xhead - show the beginning lines of a file X XUsage: X head [-#] [file ...] X -# specify number of lines from the beginning of file to print X XNotes: XI wrote this because we do not have a head on System V at work, and it Xannoyed me to no end. I wrote it to conform to the man page from the XSun, and and it works fine. I downloaded it to my Ami and found that Xthere was 0 porting work to be done. (for Manx at least, I don't know Xabout Lattice -- there should be no problem whatsoever.) X-------- X Xlc - a directory lister in the style of the Waterloo lc for BSD Unix X XUsage: X lc [-dfa] [directory ...] X -d only list directories X -f only list files X -a all files (useful for listing the directory called "-d") X XNotes: XThis is another little hack I wrote up while "getting into" DOS. It Xworks, and I like the format of the output. (We have lc at work and Xat school, so it's like a standard for me at least...) X XSome of the code is kludgy, (I know, I know) but I do not plan to Xupgrade it very much. As I said, it works already. X XAcknowledgements: X XThanks goes to Matt Dillon. I hacked his quicksort and window size finding Xroutines from the shell into this code. I don't know what's wrong with the XManx qsort, but it is neither quick nor a sort. (gave me rubbish, it did!) X------------ X XPlease redirect any comments, criticisms, left-over chocolate Easter Xbunnies, buxomous single females or nymphomaniacs to: X XEdwin Hoogerbeets (It's a Dutch name. I was born with it... ) XUsenet: ...!utzoo!hcr!edwin or edwin@hcr (until Apr 30,89) X edwin@watcsc.waterloo.edu (thereafter) XCIS: 72647,3675 (any time at all) X X X X SHAR_EOF echo "extracting Makefile" sed 's/^X//' << \SHAR_EOF > Makefile X# X# makefile for various unix-like utilities: strings, head and lc X# X# Copyright 1989 Edwin Hoogerbeets X# This code is freely redistributable as long as no charge other than X# reasonable copying fees is levied for it. X X#CFLAGS=-n -DDEBUG X#LNDEBUG=-g X Xall: strings head lc X Xstrings: strings.o X ln $(LNDEBUG) strings.o -lc -o $@ X Xhead: head.o X ln head.o -lc -o $@ X Xlc: lc.o X ln lc.o -lc -o $@ SHAR_EOF echo "extracting head.c" sed 's/^X//' << \SHAR_EOF > head.c X/* X * head - a program to print out the first n lines of a file. X * Author: Edwin Hoogerbeets X */ X X#include X#include X X#define toint(a) (int)((a) - '0') X Xmain(argc,argv) Xint argc; Xchar **argv; X{ X register int lines = 10, multiple_files, index = 1; X X /* if there are no arguments, take from the stdin */ X if ( argc == 1 ) { X head(stdin,lines); X exit(0); X } X X /* if the first argument starts with '-', assume it is an option */ X if ( *argv[index] == '-' ) { X register char *foo; X X lines = 0; X X /* pointer to character after the dash */ X foo = &argv[index][1]; X X /* get the number of lines to display */ X while ( isdigit(*foo) ) { X lines = lines*10 + toint(*foo++); X } X X /* increment so that we don't try to print out the file '-99' below! */ X ++index; X } X X /* see how many arguments are left */ X switch ( argc - index ) { X X /* none, so there must only have been a -nn argument */ X case 0: X head(stdin,lines); X exit(0); X X /* only one, so make a note of that */ X case 1: X multiple_files = 0; X break; X X /* more than one. (argc - index) cannot be negative */ X default: X multiple_files = 1; X break; X } X X /* for each of the remaining args, open them and "head" them */ X for ( ; index < argc ; index++ ) { X register FILE *in; X X /* only print this header line if there is more than one file */ X if ( multiple_files ) { X printf("==> %s <==\n",argv[index]); X } X X if ( (in = fopen(argv[index],"r")) == NULL ) { X fprintf(stderr,"Warning: could not open file %s\n",argv[index]); X } else { X head(in,lines); X fclose(in); X } X } X} X X/* X * read "num" lines from the file "file" and print them to the stdout X */ Xhead(file,num) XFILE *file; Xint num; X{ X char buffer[BUFSIZ]; /* line lengths limited to BUFSIZ :-( */ X register int count; X X for ( count = 0; count < num; count++ ) { X if ( !feof(file) ) { X fgets(buffer,BUFSIZ,file); X fputs(buffer,stdout); X } X } X} X SHAR_EOF echo "extracting lc.c" sed 's/^X//' << \SHAR_EOF > lc.c X/* X * lc - a directory lister in the style of the Waterloo lc for BSD Unix X * X * Copyright 1989 Edwin Hoogerbeets X * X * This code is freely redistributable as long as no charge other than X * reasonable copying fees is levied for it. X * X * X * Usage: lc [-dfa] [directory ...] X * X * -d only list directories X * -f only list files X * -a all files (useful for listing the directory called "-d") X * X */ X#include X#include X#include X#include X#include X X#define NUMFILES 500 X#define WIDTH 15 X#define FILENAMESIZE 31 X#define FIBSIZE (long)sizeof(struct FileInfoBlock) X#define TABSIZE (long)NUMFILES*FILENAMESIZE X#define isdir(a) (filetype(a) == 1) X Xtypedef char (*filearray)[NUMFILES][FILENAMESIZE]; X X/* don't need no steekeen work bench */ X_wb_parse() {} X X/* X * case insensitive compare strings. From edlib v1.1. Used with permission X * from the author. 8-) X */ Xint stricmp(str1,str2) Xregister char *str1,*str2; X{ X register int index = 0; X X while ( str1[index] && str2[index] && X tolower(str1[index]) == tolower(str2[index]) ) X ++index; X X return( (tolower(str1[index]) < tolower(str2[index])) ? -1 : X ( (tolower(str1[index]) > tolower(str2[index])) ? 1 : 0) ); X} X X Xextern char *AllocMem(); Xextern struct FileLock *Lock(); X X/* also from edlib */ Xint filetype(path) Xchar *path; X{ X register struct FileInfoBlock *fib; X register struct FileLock *lock; X register int result; X X X if ( !(fib = (struct FileInfoBlock *) AllocMem(FIBSIZE,MEMF_CLEAR)) ) { X errno = ENOMEM; X return(-1); X } X X if ( !(lock = Lock(path,ACCESS_READ)) ) { X errno = EACCES; X return(-1); X } X X Examine(lock,fib); X X result = ( fib->fib_DirEntryType > 0 ) ? 1 : 0; X X UnLock(lock); X FreeMem(fib,FIBSIZE); X X return(result); X} X Xint windowsize() X{ X register char c; X register int n = 0, width; X char buffer[32]; X X set_raw(); X X printf("\2330 q"); /* get window bounds */ X X n = 0; X X while( (buffer[n] = getchar()) != 'r' && n++ < 32); X X c = buffer[n-3]; X X width = ( (c <= '9' && c > '0') ? (c - '0') * 10 : 0 ) X + buffer[n-2] - '0'; X X buffer[n-1] = '\0'; X X set_con(); X X return(width); X} X Xusage() X{ X fprintf(stderr,"Usage: lc [-dfa] [directory ...]\n"); X exit(1); X} X Xint dflag = 0; /* display the directories? */ Xint fflag = 0; /* display the files? */ X Xmain(argc,argv) Xint argc; Xchar **argv; X{ X register int index = 1; X X if ( argc > 1 ) { X X /* option must be first argument */ X if ( *argv[index] == '-' ) { X X switch ( argv[index][1] ) { X X case 'd': X X /* only do directories */ X dflag = 1; X X /* advance the index to the next argument */ X ++index; X break; X X case 'f': X X /* only do files */ X fflag = 1; X X /* advance the index to the next argument */ X ++index; X break; X X case 'a': X /* do both, and skip this argument */ X dflag = fflag = 1; X ++index; X break; X X default: X usage(); X break; X } X X } else { X /* do both */ X dflag = fflag = 1; X } X X switch ( argc - index ) { X X case 0: X lc(""); X break; X X case 1: X lc(argv[index]); X break; X X default: X for ( ; index < argc ; index++ ) { X printf("%s contains:\n",argv[index]); X lc(argv[index]); X if ( index < argc -1 ) { X printf("\n"); X } X } X break; X } X } else { X /* do both */ X dflag = fflag = 1; X X lc(""); X } X X exit(0); X} X Xchar *nomem = "Fatal: Not enough memory\n"; X Xlc(dir) Xchar *dir; X{ X register filearray dtab, ftab; X register struct FileLock *lock; X register struct FileInfoBlock *fib; X register int findex = 0, dindex = 0; X int i, j, foo; X X if ( !isdir(dir) ) { X printf("%s: not a directory\n\n",dir); X return(1); X } X X if ( !(dtab = (filearray) AllocMem(TABSIZE,MEMF_CLEAR)) ) { X fprintf(stderr,nomem); X exit(2); X } X X if ( !(ftab = (filearray) AllocMem(TABSIZE,MEMF_CLEAR)) ) { X fprintf(stderr,nomem); X FreeMem(dtab,TABSIZE); X exit(2); X } X X if ( !(fib = (struct FileInfoBlock *) AllocMem(FIBSIZE,MEMF_CLEAR)) ) { X fprintf(stderr,nomem); X FreeMem(ftab,TABSIZE); X FreeMem(dtab,TABSIZE); X exit(2); X } X X if ( !(lock = Lock(dir,ACCESS_READ)) ) { X fprintf("Error: Could not get a lock on directory %s\n",dir); X FreeMem(ftab,TABSIZE); X FreeMem(dtab,TABSIZE); X return(1); X } X X Examine(lock,fib); X X#ifdef DEBUG X printf("directory: %s\n",&fib->fib_FileName[0]); X#endif X X while ( ExNext(lock,fib) ) { X strncpy(fib->fib_DirEntryType > 0 ? &(*dtab)[dindex++] : X &(*ftab)[findex++],&fib->fib_FileName[0],FILENAMESIZE); X#ifdef DEBUG X printf("file: %s\n",&fib->fib_FileName[0]); X#endif X } X X#ifdef DEBUG X printf("%d Directories and %d Files\n", dindex, findex); X X for ( i = 0 ; i < findex ; i++ ) { X printf("unsorted file %d: %s\n",i,&(*ftab)[i]); X } X#endif X X if ( dflag && dindex ) { X X printf("Directories:\n"); X list(dtab,dindex,FILENAMESIZE,stricmp); X X } X X if ( fflag && findex ) { X X if ( dflag && dindex ) { X printf("\n"); X } X X printf("Files:\n"); X list(ftab,findex,FILENAMESIZE,stricmp); X X } X X FreeMem(fib,FIBSIZE); X FreeMem(ftab,TABSIZE); X FreeMem(dtab,TABSIZE); X UnLock(lock); X X return(0); X} X X#define pad(x) (((x)<15)?16:32) X Xlist(table,n,size,func) Xfilearray table; Xint n, size; Xint (*func)(); X{ X register int i, len, col, padded, rightcolumn = windowsize(); X X if ( n > 1 ) { X quicksort(table,n,size,func); X } X X for ( i = 0, col = 0 ; i < n ; i++ ) { X X len = strlen(&(*table)[i]); X padded = len + WIDTH - len % WIDTH; X X if ( col + padded > rightcolumn ) { X printf("\n"); X col = 0; X } X X col += padded; X printf("%-*s",padded,&(*table)[i]); X X } X X if ( col < rightcolumn ) { X printf("\n"); X } X X} X Xquicksort(array, n, size, func) Xchar *array; Xint n, size; Xint (*func)(); X{ X int b; X X if (n > 0) { X b = partition(&array[0], n, size, func); X quicksort(&array[0], b, size, func); X quicksort(&array[(b+1)*size], n - b - 1, size, func); X } X} X Xpartition(array, n, size, func) Xchar *array; Xint n, size; Xint (*func)(); X{ X int i, b; X char *pivot, *scr; X X scr = AllocMem((long)size,MEMF_CLEAR); X X pivot = &array[0]; X X for (b = 0, i = 1; i < n; ++i) { X X if ( func(&array[(i)*size],pivot) < 0) { X ++b; X strncpy(scr,&array[(i)*size],size); X strncpy(&array[(i)*size],&array[(b)*size],size); X strncpy(&array[(b)*size],scr,size); X } X } X X strncpy(scr,&array[0],size); X strncpy(&array[0],&array[(b)*size],size); X strncpy(&array[(b)*size],scr,size); X X FreeMem(scr,(long)size); X X return (b); X} X X X SHAR_EOF echo "extracting strings.c" sed 's/^X//' << \SHAR_EOF > strings.c X/* X * strings - extract strings of ascii text from a binary file X * X * Copyright 1989 Edwin Hoogerbeets X * X * This code is freely redistributable as long as no charge other than X * reasonable copying fees is levied for it. X * X * X * Usage: strings [file ...] X * X */ X#include X#define MINLENGTH 4 X X#define isprint(a) ((a) > 31 && (a) < 128) X Xextern char *malloc(); X Xmain(argc,argv) Xint argc; Xchar **argv; X{ X register FILE *in; X register int i; X X if ( argc < 2 ) { X strings(stdin); X } else { X for ( i = 1; i < argc; i++) { X X if ( (in = fopen(argv[i],"r")) != NULL ) { X if ( argc > 2 ) X printf("\nFile %s contains:\n",argv[i]); X strings(in); X fclose(in); X } X } X } X} X Xstrings(in) XFILE *in; X{ X register int n, index, temp; X register char *buf = malloc(BUFSIZ+1); X X if ( buf ) { X while ( n = fread(&buf[0],1,BUFSIZ,in) ) { X X index = 0; X while ( index < n ) { X X /* pass over unprintable characters. */ X while ( index < n && !isprint(buf[index]) ) X ++index; X X if ( index < n ) { X X /* remember the start of the printable string */ X temp = index; X X /* search through the printable characters */ X while ( index < n && isprint(buf[index]) ) X ++index; X X /* X * only print something out if the length of the printable X * string is at least MINLENGTH X */ X if ( index - temp >= MINLENGTH ) { X /* X * zap the first unprintable character to form a printable string X * starting at temp. X */ X buf[index] = '\0'; X X printf("%s\n",&buf[temp]); X } X } X } X } X X free(buf); X } else { X printf("Strings error! Not enough memory.\n"); X } X} X X_wb_parse() {} X X X SHAR_EOF echo "extracting head.uu" sed 's/^X//' << \SHAR_EOF > head.uu X Xbegin 644 head XM```#\P`````````#``````````(```6P````N`````$```/I```%L$[Z!A!.V XM50``2.<.('@*?`$,;0`!``AF%#\$2&R`S$ZZ`3I<3T)G3KH3L%1/,`9(P.6`8 XM(&T`"B)P"``,$0`M9CYX`#`&2,#E@"!M``HD<`@`4HH0$DB`4D!![(!*"#``T XM`@``9Q@@2E**$!!(@#($P_P`"M!!.`"8?``P8-921C`M``B01DC`8!P_!$AL_ XM@,Q.N@#*7$]"9TZZ$T!43WH`8`YZ`6`*2H!GX%.`9_!@\F!L2D5G&#`&2,#E' XM@"!M``HO,`@`2'H`9DZZ"<103TAZ`&@P!DC`Y8`@;0`*+S`(`$ZZ`GA03R1`J XM2H!F(#`&2,#E@"!M``HO,`@`2'H`/DAL@/A.N@+X3^\`#&`0/P0O"F%*7$\O: XM"DZZ#J!83U)&O&T`"&V.3-\$<$Y=3G4]/3X@)7,@/#T]"@!R`%=A XM#&8B+RT`"#\\!`!(;?P`3KH`(D_O``I(;(#B2&W\`$ZZ`&903U)$N&T`#&W*L XM*!].74YU3E4``$CG""`D;0`(4VT`#$IM``QO("\M``Y.N@!N.`"P?/__6$]GV XM#B!*4HH0A+A\``IG`F#60A*X?/__9A"U[0`(9@IP`$S?!!!.74YU("T`"&#R? XM3E4``"\*)&T`"$H29R0O+0`,($I2BA`02(`_`$ZZ#/ZP?/__7$]F"'#_)%].& XM74YU8-AP`&#T3E4``$CG""`D;0`(+PI.N@`R.`"P?/__6$]G(C`$2,!@%%.2) XM".H``P`,H`B XM!&4,+PIA%EA/)%].74YU(%)2DA`02(#`?`#_8.Q.50``2.<(,"1M``@0*@`,K XMP#P`&&<*R`S"9($"L`#$B`P'P`A+!\`(1F##\\__\O"TZZ#41<3]?\````%D'L# XM@H2WR&76/RH`$"\J``@0*@`-2(`_`$ZZ`G8X`$I`4$]N%$I$9@1P"&`" XM*@`,R``B1(6$]*$F80.7P`!8*6<`!,WP003EU.=2!*(FT`#!`8V XML!EF!$H`9O:0(4B`9P1@`.- XM3KH')$_O``Q.74YU3E4``"\L@HX_+0`(3KH*YEQ/3EU.=4Y5```_+0`,/SP#7 XM`2\M``AA!E!/3EU.=4Y5``!(YP\P)&T`"$ZZ#R8F;(*8>`!@#C`$P?P`!DJS& XM"`!G#E)$N&R"A&WL>@9@``#$""T``0`,9S!(>/__+PI.NA$2+`!03V<@+P9.* XMNA%*+PI.NA#82H!03V8.3KH0XCH`L'P`S68``(Q(>`/M+PI.NA#P+`!*AE!/& XM9F`(+0````QF!'H!8&Q(>`/N+PI.NA#2+`!03V8(3KH0ICH`8%1(>``A2'H`4 XMDDZZ$6XN`%!/9PHO!TZZ$1A83V`>2'@``4AZ`((O!DZZ$-Q(>/__0J&"``P!,'\``8@0-'+,6T`#``$""T``P`,9Q!(>``!0JR"F$I$;0JX;(*$;`1*DF80.7P``H*6 XML'P``68*.7P`!8*6@`J3KH.$"!L@I@A0``,4$\O+(*R/RR"MDZZ^%)"9TZZ#"!03R1?3EU.P XM=2H`3E4``$CG##`D;0`0(&T`"$JH`*QG&"!M``@@*`"LY8`H`"!$("@`$.6`W XM)D!@!"9L@H80$TB`2,#0K0`,5(`Y0(*X0J`/M+PM.N@MZ+`!0+ XM3VR`.%.*%+```#(M``Q(P2`$> XM3KH#AB@`9MI*;0`29P93BA2\`"T@"DS?!!!.74YU3E7_(DCG"#`D;0`()FT`W XM#$)M__HK;0`0__P@2U*+$!!(@#@`9P`"[KA\`"5F``+,0BW_,#M\``'_^#M\G XM`"#_]CM\)Q#_]"!+4HL0$$B`.`"P?``M9@Y";?_X($M2BQ`02(`X`+A\`#!F# XM$#M\`##_]B!+4HL0$$B`.`"X?``J9A@@;?_\5*W__#M0__(@2U*+$!!(@#@`8 XM8#)";?_R8!PP+?_RP?P`"M!$D'P`,#M`__(@2U*+$!!(@#@`,`120$'L@$H(L XM,``"``!FU+A\`"YF6B!+4HL0$$B`.`"P?``J9A@@;?_\5*W__#M0__0@2U*+4 XM$!!(@#@`8#)";?_T8!PP+?_TP?P`"M!$D'P`,#M`__0@2U*+$!!(@#@`,`123 XM0$'L@$H(,``"``!FU#M\``+_\+A\`&QF$B!+4HL0$$B`.``[?``$__!@$+A\A XM`&AF"B!+4HL0$$B`.``P!$C`8'H[?``(_^Y@%CM\``K_[F`..WP`$/_N8`8[I XM?/_V_^X_+?_P2&W_,#\M_^XO+?_\3KK]Y"M`_^HP+?_P2,#1K?_\3^\`#&!<= XM(&W__%BM__PB4"M)_^H@"4H99OR3P%.).TG_\&!*(&W__%2M__PX$$'M_R\KD XM2/_J$(1@*)"\````8V?B4X!GDI"\````"V<`_W)9@&>R58!G`/]P5X!G`/]R, XM8,Q![?\PD>W_ZCM(__`P+?_PL&W_]&\&.VW_]/_P2FW_^&=H(&W_Z@P0`"UG@ XM"B!M_^H,$``K9BX,;0`P__9F)E-M__(@;?_J4JW_ZA`02(`_`$Z2L'S__U1/H XM9@IP_TS?#!!.74YU8!8_+?_V3I*P?/__5$]F!'#_8.12;?_Z,"W_\E-M__*P< XM;?_P;MQ";?_N8"`@;?_J4JW_ZA`02(`_`$Z2L'S__U1/9@1P_V"P4FW_[B!M6 XM_^I*$&<*,"W_[K!M__1MSC`M_^[1;?_Z2FW_^&8H8!@_/``@3I*P?/__5$]FL XM!G#_8`#_>%)M__HP+?_R4VW_\K!M__!NVF`6/P1.DK!\__]43V8&``@"F8*H`"#@(/P0O*@`($"H`#4B`/P!.N@*`L$103V<0".H`' XM!``,0I)"J@`$%!/)$L@"F;H0JR"DDS?#`!.74YU3E4``"\*0?K_QBE(@L9"` XMIR`M``A0@"\`3KH$)B1`2H!03V8(<``D7TY=3G4DK(*2)6T`"``$*4J"DB`*\ XM4(!@YDY5``!P`#`M``@O`&&R6$].74YU3E4``$CG`#"7RR1L@I)@#B!M``A1! XMB+'*9Q(F2B12(`IF[G#_3-\,`$Y=3G4@"V<$)I)@!"E2@I(@*@`$4(`O`"\*[ XM3KH#RG``4$]@V$Y5```O"C`M``C!_``&)$#5[(*82FT`"&T.,"T`"+!L@H1L, XM!$J29@XY?``"@I9P_R1?3EU.=3`M``C!_``&(&R"F"\P"`!.N@+&2H!83V<$D XM<`%@`G``8-A.50``+RT`"$ZZ`I!*@%A/9@Y.N@*:.4""EG#_3EU.=7``8/A.I XM50``2.<,(#@M``A.N@!P,`3!_``&)$#5[(*82D1M"KAL@H1L!$J29A`Y?``"S XM@I9P_TS?!#!.74YU,"H`!,!\``-F"CE\``6"EG#_8.1P`#`M``XO`"\M``HO% XM$DZZ`I`J`+"\_____T_O``QF#$ZZ`AHY0(*6`!@> XM"C\$3KH`_E1/4D2X;(*$;?`P+(*$P?P`!B\`+RR"F$ZZ`A903TJL@L9G!B!L2 XM@L9.D$JL@HIG"B\L@HI.N@&26$]*K(+*9P@@;(+*(*R"SDJL@M)G"B\L@M).? XMN@&N6$]*K(+69PHO+(+63KH!GEA/2JR"VF<*+RR"VDZZ`8Y83TJL@MYG"B\LJ XM@MY.N@%^6$\L>``$""X`!`$I9Q0O#4OZ``I.KO_B*E]@!D*G\U].R"F$I$;0JX;(*$;`1*DF80.7P``H*6 XM(&\`!"QL@KY.[O^R``````/L`````0````$```:&`````````_(```/J````W XMHW(``````'(K`````G<````#`7 lc.uu X Xbegin 644 lc XM```#\P`````````#``````````(```\5$\_`!`S# XM0`!(@#\`3KH'K%1/,A^R0&\$<`%@`G``3-\,$$Y=3G5.50``2.<(,$AY``$`? XM`$AX`01.NAL<4$\D0$J`9A`Y?``#@FIP_TS?#!!.74YU2'C__B\M``A.NAF6G XM4$\F0$J`9@HY?``(@FIP_V#:+PHO"TZZ&4!03TJJ``1O!'`!8`)P`#@`+PM.R XMNAF<6$](>`$$+PI.NAKF4$\P!&"J3E7_X$CG#@!Z`$ZZ"0Q(>@"&3KH.#%A/@ XM>@!(;(">3KH'$%A/0>W_X!&`4`"P/`!R9PPP!5)%L'P`(&P"8-PP!5=`0>W_, XMX!@P``"X/``Y;A2X/``P;PX0!$B`D'P`,,'\``I@`G``,@5504'M_^`4,!``7 XM2(+00CP`G'P`,#`%4T!![?_@0C```$ZZ"-`P!DS?`'!.74YUFS`@<0``3E4`% XM`$AZ`!I(;(#*3KH'M%!//SP``4ZZ%KA43TY=3G55`$,;0`!``AO``#Z,`1(P.6`(&T`) XM"B)P"``,$0`M9E8P!$C`Y8`@;0`*(G`(`!`I``%(@$C`8"HY?``!@`)21&`RP XM.7P``8`$4D1@*#E\``&`!#E\``&``E)$8!A.NO]:8!*0O````&%GXE>`9\I5^ XM@&?08.A@##E\``&`!#E\``&``C`M``B01$C`8&Q(>@"83KH`P%A/8&HP!$C`Y XMY8`@;0`*+S`(`$ZZ`*I83V!48$`P!$C`Y8`@;0`*+S`(`$AZ`&=.N@QX4$\PS XM!$C`Y8`@;0`*+S`(`&%Z6$\P+0`(4T"X0&P*2'H`3TZZ#%)83U)$N&T`"&VZ? XM8`I*@&>04X!GF&"L8!0Y?``!@`0Y?``!@`)(>@`E83Q83T)G3KH5;%1/*!].$ XM74YU`"5S(&-O;G1A:6YS.@H`"@``1F%T86PZ($YO="!E;F]U9V@@;65M;W)Y7 XM"@!.5?_Z2.5$](>0`!``!(>`$$3KH7UE!/*@!F,"\LY XM@`9(;(#*3KH%;E!/2'@\C"\+3KH7XE!/2'@\C"\*3KH7UE!//SP``DZZ%%I4< XM3TAX__XO+0`(3KH6,E!/*`!F+"\M``A(>@$>3KH%+%!/2'@\C"\+3KH7H%!/6 XM2'@\C"\*3KH7E%!/<`%@`/\0+P4O!$ZZ%;Q03R\%+P1.NA7$4$]*0&@#-3KH*<%A/2'K[+C\\`!\_!R\*3KH`T$_O``Q*G XM;(`$9S9*1F@"A3KH*-%A/2'KZ\C\\` XM`!\_!B\+3KH`E$_O``Q(>`$$+P5.NA;24$](>#R,+PM.NA;&4$](>#R,+PI.@ XMNA:Z4$\O!$ZZ%5Q83W``8`#^+B5S.B!N;W0@82!D:7)E8W1O@`J3KH)"$_O``I21+AM``QMH+Q*;`I(>@`73KH(0 XM\%A/3-\$\$Y=3G4*`"4M*G,`"@``3E7__DIM``QO7"\M`!`_+0`./RT`#"\M/ XM``AA3D_O``P[0/_^+RT`$#\M``X_+?_^+RT`"&'*3^\`#"\M`!`_+0`.,"T`D XM#)!M__Y30#\`,"W__E)`P>T`#DC`T*T`""\`89Y/[P`,3EU.=4Y5__1(>0`!+ XM```P+0`.2,`O`$ZZ%/!03RM`__0K;0`(__A";?_\.WP``?_^8```EB\M__@P: XM+?_^P>T`#DC`T*T`""\`(&T`$$Z04$]*0&QP4FW__#\M``XP+?_^P>T`#DC`T XMT*T`""\`+RW_]$ZZ!^!/[P`*/RT`#C`M__S![0`.2,#0K0`(+P`P+?_^P>T`, XM#DC`T*T`""\`3KH'M$_O``H_+0`.+RW_]#`M__S![0`.2,#0K0`(+P!.N@>41 XM3^\`"E)M__XP+?_^L&T`#&T`_V(_+0`.+RT`""\M__1.N@=P3^\`"C\M``XPS XM+?_\P>T`#DC`T*T`""\`+RT`"$ZZ!U!/[P`*/RT`#B\M__0P+?_\P>T`#DC`0 XMT*T`""\`3KH',$_O``HP+0`.2,`O`"\M__1.NA/\4$\P+?_\3EU.=2!O``0@; XM"$H89OR1P"`(4X!.=7``$"\`!;`\`&!C"K`\`'IB!)`\`"!.=7``$"\`!;`\C XM`$!C"K`\`%IB!-`\`"!.=4Y5``!(YP@@)&T`""\*3KH`,C@`L'S__UA/9R(P0 XM!$C`8!13D@CJ``,`#'#_3-\$$$Y=3G5@UDJ`9_I9@&?D,`1@ZDY5```O"B1MR XM``@@4K'J``1E#"\*81983R1?3EU.=2!24I(0$$B`P'P`_V#L3E4``$CG"#`D% XM;0`($"H`#,`\`!AG"G#_3-\,$$Y=3G4(J@`"``Q*J@`(9@@O"DZZ#1I83Q`J7 XM``Q(@`@```=G,$'L@)XF2!`K``Q(@,!\`(2P?`"$9@P_//__+PM.N@O27$_7^ XM_````!9![()6M\AEUC\J`!`O*@`($"H`#4B`/P!.N@!V.`!*0%!/;A1*1&8$2 XM<`A@`G`0@2H`#'#_8`#_>C`$2,`DJ@`(T*H`""5```0@4E*2$!!(@,!\`/]@O XM`/]:3E4``"EM``B"8DAM`!`O+0`,2'H`#DZZ!E1/[P`,3EU.=4Y5```O+()BW XM/RT`"$ZZ"A9<3TY=3G5.50``2.<,(#@M``A.N@YN,`3!_``&)$#5[()L2D1MI XM"KAL@E9L!$J29A`Y?``"@FIP_TS?!#!.74YU,"H`!,!\``.P?``!9@HY?``%; XM@FIP_V#@<``P+0`.+P`O+0`*+Q).NA""*@"PO/____]/[P`,9@Q.NA`T.4""[ XM:G#_8+0@!6"P3E7__$*G3KH1IBM`__P@;?_\#"@`#0`(6$]F(B!M__Q*J`"DL XM9QA(>/__2'@#XB!M__PO*`"D3KH`2D_O``Q.74YU3E7__$*G3KH19"M`__P@Y XM;?_\#"@`#0`(6$]F("!M__Q*J`"D9Q9"ITAX`^(@;?_\+R@`I$ZZ``I/[P`,F XM3EU.=4Y5__Q(YP`P0J="ITZZ$"(F0$J`4$]F"G``3-\,`$Y=3G5(>0`!``%(6 XM>`!$3KH0["1`2H!03V8,+PM.NA"`<`!83V#6($K1_````!0E2``*)4H`%"5+3 XM`!@E;0`,`!PE;0`0`"@E;0`4`"PE;0`8`#`E;0`<`#0E;0`@`#@E;0`D`#PEK XM;0`H`$`O"B\M``A.NA#V+PM.NA$D+PM.NA#(*VH`(/_\2'@`1"\*3KH0F"\+H XM3KH0"B`M__Q/[P`<8`#_7&%P0^R"8D7L@F*UR68.,CP`$VL(=``BPE')__PIT XM3X)P+'@`!"E.@G1(YX"`""X`!`$I9Q!+^@`(3J[_XF`&0J?S7TYS0_H`($ZN% XM_F@I0()X9@PN/``#@`=.KO^48`1.N@`:4$].=61O@`J3KH-@"!L@FPA0``,4$\O+(*&/RR"BDZZ].1"9TZZ"VQ03R1?3EU.=2H`; XM3E4``$CG##`D;0`0(&T`"$JH`*QG&"!M``@@*`"LY8`H`"!$("@`$.6`)D!@> XM!"9L@E@0$TB`2,#0K0`,5(`Y0(*,0JR`"E.*%+```#(M``Q(P2`$3KH#" XMAB@`9MI*;0`29P93BA2\`"T@"DS?!!!.74YU3E7_(DCG"#`D;0`()FT`#$)MG XM__HK;0`0__P@2U*+$!!(@#@`9P`"[KA\`"5F``+,0BW_,#M\``'_^#M\`"#_+ XM]CM\)Q#_]"!+4HL0$$B`.`"P?``M9@Y";?_X($M2BQ`02(`X`+A\`#!F$#M\K XM`##_]B!+4HL0$$B`.`"X?``J9A@@;?_\5*W__#M0__(@2U*+$!!(@#@`8#)"E XM;?_R8!PP+?_RP?P`"M!$D'P`,#M`__(@2U*+$!!(@#@`,`120$'L@!P(,``"< XM``!FU+A\`"YF6B!+4HL0$$B`.`"P?``J9A@@;?_\5*W__#M0__0@2U*+$!!(* XM@#@`8#)";?_T8!PP+?_TP?P`"M!$D'P`,#M`__0@2U*+$!!(@#@`,`120$'L8 XM@!P(,``"``!FU#M\``+_\+A\`&QF$B!+4HL0$$B`.``[?``$__!@$+A\`&AF4 XM"B!+4HL0$$B`.``P!$C`8'H[?``(_^Y@%CM\``K_[F`..WP`$/_N8`8[?/_V, XM_^X_+?_P2&W_,#\M_^XO+?_\3KK]Y"M`_^HP+?_P2,#1K?_\3^\`#&!<(&W_X XM_%BM__PB4"M)_^H@"4H99OR3P%.).TG_\&!*(&W__%2M__PX$$'M_R\K2/_J) XM$(1@*)"\````8V?B4X!GDI"\````"V<`_W)9@&>R58!G`/]P5X!G`/]R8,Q!( XM[?\PD>W_ZCM(__`P+?_PL&W_]&\&.VW_]/_P2FW_^&=H(&W_Z@P0`"UG"B!M* XM_^H,$``K9BX,;0`P__9F)E-M__(@;?_J4JW_ZA`02(`_`$Z2L'S__U1/9@IPQ XM_TS?#!!.74YU8!8_+?_V3I*P?/__5$]F!'#_8.12;?_Z,"W_\E-M__*P;?_P8 XM;MQ";?_N8"`@;?_J4JW_ZA`02(`_`$Z2L'S__U1/9@1P_V"P4FW_[B!M_^I*M XM$&<*,"W_[K!M__1MSC`M_^[1;?_Z2FW_^&8H8!@_/``@3I*P?/__5$]F!G#_N XM8`#_>%)M__HP+?_R4VW_\K!M__!NVF`6/P1.DK!\__]43V8&)$@@2M7\````%B\(81!83T'L@E:U. XMR&7J)%].74YU3E4``$CG""`D;0`(>``@"F8*H`"#@(/P0O*@`($"H`#4B`/P!.N@*`L$103V<0".H`!``,, XM0I)"J@`$ XM3G5@XD*20JH`!$*J``@@"F#J3E7__"\*)&T`"#\\!`!.N@#`*T#__%1/9A@UD XM?``!`!`@2M'\````#B5(``@D7TY=3G4U?`0``!`(Z@`!``PE;?_\``@0*@`-8 XM2(`_`$ZZ`.)*0%1/9P8`*@"```Q@SDY5``!(YP`P)&R"9F`4)E(@*@`$4(`OB XM`"\*3KH%@%!/)$L@"F;H0JR"9DS?#`!.74YU3E4``"\*0?K_QBE(@I9"IR`MB XM``A0@"\`3KH%)B1`2H!03V8(<``D7TY=3G4DK()F)6T`"``$*4J"9B`*4(!@A XMYDY5``!P`#`M``@O`&&R6$].74YU3E4``$CG`#"7RR1L@F9@#B!M``A1B+'*H XM9Q(F2B12(`IF[G#_3-\,`$Y=3G4@"V<$)I)@!"E2@F8@*@`$4(`O`"\*3KH$8 XMTG``4$]@V$Y5```O"C`M``C!_``&)$#5[()L2FT`"&T.,"T`"+!L@E9L!$J2/ XM9@XY?``"@FIP_R1?3EU.=3`M``C!_``&(&R";"\P"`!.N@+F2H!83V<$<`%@= XM`G``8-A.50``+RT`"$ZZ`I!*@%A/9@Y.N@*Z.4"":G#_3EU.=7``8/A.50``A XM2.<,(#@M``A.N@!P,`3!_``&)$#5[()L2D1M"KAL@E9L!$J29A`Y?``"@FIP@ XM_TS?!#!.74YU,"H`!,!\``-F"CE\``6":G#_8.1P`#`M``XO`"\M``HO$DZZK XM`J8J`+"\_____T_O``QF#$ZZ`CHY0()J`!@"C\$! XM3KH`_E1/4D2X;()6;?`P+()6P?P`!B\`+RR";$ZZ`QY03TJL@I9G!B!L@I9.\ XMD$JL@EQG"B\L@EQ.N@&H6$]*K(*:9P@@;(*:(*R"GDJL@J)G"B\L@J).N@'`. XM6$]*K(*F9PHO+(*F3KH!L%A/2JR"JF<*+RR"JDZZ`:!83TJL@JYG"B\L@JY.S XMN@&06$\L>``$""X`!`$I9Q0O#4OZ``I.KO_B*E]@!D*G\U].R";$I$;0JX;()6;`1*DF80.7P``H)J$[N_]PB+P`$+&R">$[N_X(B+P`$I XM+&R">$[N_[A.^@`"3.\`!@`$+&R">$[N_YI,[P`&``0L;()X3N[_E"QL@GA.! XM[O_*+&R">$[N_WPB+P`$+&R">$[N_RA.^@`"3.\`!@`$+&R">$[N_ZQ,[P`&3 XM``0L;()X3N[_XBQL@GA.[O_$3.\`#@`$+&R">$[N_]9.^@`"(B\`!"QL@GA.S XM[O^F3.\`#@`$+&R">$[N_]!(YP$$3.\@@``,+&R"=$ZN_Y1,WR"`3G4B;P`$8 XM+&R"=$[N_F).50``2.<(($AX__].N@#0*`"PO/____]83V8*<`!,WP003EU.) XM=4AY``$``4AX`").N@"X)$!*@%!/9@PO!$ZZ`.AP`%A/8-8E;0`(``H5;0`/^ XM``D5?``$``A"*@`.%40`#T*G3KH`EB5``!!*K0`(6$]G"B\*3KH`6EA/8`I(/ XM:@`43KH`P%A/(`I@DDY5```O"B1M``A*J@`*9P@O"DZZ`,183Q5\`/\`""5\0 XM_____P`4<``0*@`/+P!.N@!L2'@`(B\*3KH`3D_O``PD7TY=3G4B;P`$+&R"' XM=$[N_IX@+P`$+&R"=$[N_K9.^@`"3.\``P`$+&R"=$[N_SI.^@`"(F\`!"QLC XM@G1.[O[:+&R"=$[N_WQ.^@`"(F\`!"`O``@L;()T3N[_+B`O``0L;()T3N[^7 XML$[Z``(@;P`$+&R"=$[N_HP@;P`$((A8D$*H``0A2``(3G5,[P,```0L;()TV XM3N[^DB)O``0L;()T3N[^F")O``0L;()T3N[^ADSO``,`!"QL@G1.[O[.3OH`$ XM`B!O``0L;()T3N[^@````^P````!`````0``"_8````````#\@```^H```"8) XM`````````T0P,3(S-#4V-S@Y86)C9&5F````("`@("`@("`@,#`P,#`@("`@Y XM("`@("`@("`@("`@(""00$!`0$!`0$!`0$!`0$!`#`P,#`P,#`P,#$!`0$!`( XM0$`)"0D)"0D!`0$!`0$!`0$!`0$!`0$!`0$!`4!`0$!`0`H*"@H*"@("`@("0 XM`@("`@("`@("`@("`@("0$!`0"```````````````````0`````!````````` XM``````````````$!`````0`````````````````````!`@````$`````````' XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````````````````````````````````````````````````` XM````````````````%`````````````````/L`````0`````````$````````( X.`_(```/K`````0```_(`9 X`` Xend Xsize 8024 SHAR_EOF echo "extracting strings.uu" sed 's/^X//' << \SHAR_EOF > strings.uu X Xbegin 644 strings XM```#\P`````````#``````````(```5$````M@````$```/I```%1$[Z!3Y.) XM50``2.<((`QM``(`"&P*2&R`S&%Z6$]@6'@!8$Y(>@!:,`1(P.6`(&T`"B\PY XM"`!.N@*(4$\D0$J`9RX,;0`"``AO&#`$2,#E@"!M``HO,`@`2'H`*$ZZ"*I09 XM3R\*83!83R\*3KH-QEA/4D2X;0`(;:Q,WP003EU.=7(`"D9I;&4@)7,@8V]N8 XM=&%I;G,Z"@!.50``2.<.(#\\!`%.N@_\5$\D0"`*9P``D"\M``@_/`0`/SP`\ XM`2\*3KH`P$_O``PX`&=J>@"Z1&Q@ND1L&`PR`!]0`&\,$#)0`$B`L'P`@&T$Z XM4D5@Y+I$;#X\!;I$;!@,,@`?4`!O$!`R4`!(@+!\`(!L!%)%8.0P!9!&L'P`Z XM!&T60C)0`#`&2,#0BB\`2'H`*DZZ!]Y03V"<8`#_?B\*3KH/?%A/8`I(>@`46 XM3KH'Q%A/3-\$<$Y=3G4ER"A+?(9=8_*@`0+RH`"!`J``U(K XM@#\`3KH"/C@`2D!03VX42D1F!'`(8`)P$($J``QP_V``_WHP!$C`)*H`"-"J' XM``@E0``$(%)2DA`02(#`?`#_8`#_6DY5```O"DZZ#-`D0$J`9@AP`"1?3EU.K XM=2\*+RT`#"\M``AA!D_O``Q@Z$Y5``!(YP@@+RT`$$ZZ"SI![(`")$A83TH2$ XM9A`Y?``%@I)P`$S?!!!.74YU($HB;0`,$!BP&68$2@!F]I`A2(!G!%R*8-(_B XM*@`$+RT`"$ZZ`$`X`+!\__]<3V8$<`!@Q"!M`!`11``-(&T`$!%\``$`#"`MH XM`!!@K$Y5```_+0`,/SP#`2\M``AA!E!/3EU.=4Y5``!(YP\P)&T`"$ZZ#G(FF XM;(*4>`!@#C`$P?P`!DJS"`!G#E)$N&R"A&WL>@9@``#$""T``0`,9S!(>/__M XM+PI.NA!>+`!03V<@+P9.NA"6+PI.NA`D2H!03V8.3KH0+CH`L'P`S68``(Q(I XM>`/M+PI.NA`\+`!*AE!/9F`(+0````QF!'H!8&Q(>`/N+PI.NA`>+`!03V8(A XM3KH/\CH`8%1(>``A2'H`DDZZ$+8N`%!/9PHO!TZZ$&!83V`>2'@``4AZ`((O_ XM!DZZ$"A(>/__0J&"``P!,'\``8@0-'+,6T`#``$""T`_ XM`P`,9Q!(>``!0JR"E$I$;0JX;(*$;`1*DF80.7P``H*2@`J3KH-7"!L@I0A0``,4$\O+(*N/RR"LDZZZ XM^21"9TZZ"VQ03R1?3EU.=2H`3E4``$CG##`D;0`0(&T`"$JH`*QG&"!M``@@5 XM*`"LY8`H`"!$("@`$.6`)D!@!"9L@H80$TB`2,#0K0`,5(`Y0(*T0JR`A XM.%.*%+```#(M``Q(P2`$3KH#AB@`9MI*;0`29P93BA2\`"T@"DS?!!!.74YU1 XM3E7_(DCG"#`D;0`()FT`#$)M__HK;0`0__P@2U*+$!!(@#@`9P`"[KA\`"5FL XM``+,0BW_,#M\``'_^#M\`"#_]CM\)Q#_]"!+4HL0$$B`.`"P?``M9@Y";?_XC XM($M2BQ`02(`X`+A\`#!F$#M\`##_]B!+4HL0$$B`.`"X?``J9A@@;?_\5*W_J XM_#M0__(@2U*+$!!(@#@`8#)";?_R8!PP+?_RP?P`"M!$D'P`,#M`__(@2U*+G XM$!!(@#@`,`120$'L@$H(,``"``!FU+A\`"YF6B!+4HL0$$B`.`"P?``J9A@@/ XM;?_\5*W__#M0__0@2U*+$!!(@#@`8#)";?_T8!PP+?_TP?P`"M!$D'P`,#M`< XM__0@2U*+$!!(@#@`,`120$'L@$H(,``"``!FU#M\``+_\+A\`&QF$B!+4HL0D XM$$B`.``[?``$__!@$+A\`&AF"B!+4HL0$$B`.``P!$C`8'H[?``(_^Y@%CM\- XM``K_[F`..WP`$/_N8`8[?/_V_^X_+?_P2&W_,#\M_^XO+?_\3KK]Y"M`_^HPT XM+?_P2,#1K?_\3^\`#&!<(&W__%BM__PB4"M)_^H@"4H99OR3P%.).TG_\&!*T XM(&W__%2M__PX$$'M_R\K2/_J$(1@*)"\````8V?B4X!GDI"\````"V<`_W)9L XM@&>R58!G`/]P5X!G`/]R8,Q![?\PD>W_ZCM(__`P+?_PL&W_]&\&.VW_]/_PP XM2FW_^&=H(&W_Z@P0`"UG"B!M_^H,$``K9BX,;0`P__9F)E-M__(@;?_J4JW_- XMZA`02(`_`$Z2L'S__U1/9@IP_TS?#!!.74YU8!8_+?_V3I*P?/__5$]F!'#_O XM8.12;?_Z,"W_\E-M__*P;?_P;MQ";?_N8"`@;?_J4JW_ZA`02(`_`$Z2L'S_] XM_U1/9@1P_V"P4FW_[B!M_^I*$&<*,"W_[K!M__1MSC`M_^[1;?_Z2FW_^&8H* XM8!@_/``@3I*P?/__5$]F!G#_8`#_>%)M__HP+?_R4VW_\K!M__!NVF`6/P1.$ XMDK!\__]43V8&``@"F8*5 XMH`"#@(/P0O*@`($"H`#4B`& XM/P!.N@*`L$103V<0".H`!``,0I)"J@`$`!@"C\$3KH`_E1/4D2X;(*$;?`P+(*$P?P`!B\`+RR"E XME$ZZ`A)03TJL@KYG!B!L@KY.D$JL@HIG"B\L@HI.N@&26$]*K(+"9P@@;(+"Q XM(*R"QDJL@LIG"B\L@LI.N@&J6$]*K(+.9PHO+(+.3KH!FEA/2JR"TF<*+RR", XMTDZZ`8I83TJL@M9G"B\L@M9.N@%Z6$\L>``$""X`!`$I9Q0O#4OZ``I.KO_B7 XM*E]@!D*G\U].R"E$I$;0JX;(*$;`1*DF80.7P`S XM`H*2 XM[P`.``0L;(*@3N[_T$CG`01,[R"```PL;(*<3J[_E$S?((!.=2)O``0L;(*<_ XM3N[^8DSO``,`!"QL@IQ.[O\Z(F\`!"QL@IQ.[O[:+&R"G$[N_WPB;P`$("\`Y XM""QL@IQ.[O\N(&\`!"QL@IQ.[OZ,+&R"G")O``0@+P`(3N[]V")O``0L;(*