[comp.sources.amiga] v89i215: crypt - fast file encryption

page%swap@Sun.COM (Bob Page) (11/13/89)

Submitted-by: altger!vyrus@apple.com (David Vincenzetti)
Posting-number: Volume 89, Issue 215
Archive-name: applications/crypt.1

[uuencoded executable included.  ..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:
#	extract.c
#	main.c
#	xrand.c
#	crypt.doc
#	makefile
#	crypt.uu
# This is archive 1 of a 1-part kit.
# This archive created: Sun Nov 12 20:55:27 1989
echo "extracting extract.c"
sed 's/^X//' << \SHAR_EOF > extract.c
X/* extract.c */
X
Xtypedef unsigned long		large;
X
X/*
XSpeed is critical.
XExtracts and returns a large number using some bits "bits" from its 
Xfirst argument "n".
X*/
Xlarge
Xextract(n, bits)
Xregister large n;
Xregister bits;
X{
X	large value;
X	large mod;
X	register large nn;
X	register i;
X	/* 128 bits are enough - static is faster */
X	register char matrix[128];
X
X	if(bits > sizeof(matrix)) return(0);
X
X	mod = (large) 1 << bits;
X	if(n < mod) return(n);
X	while(n > mod << 1) n = n >> 1;
X
X	for (i = 0; n > 1; i++) {
X		nn = n >> 1;
X		matrix[i] = n - (nn << 1);
X		n = nn;
X	}
X	i--;
X
X	bits--;
X	value = 0;
X	for(; i >= 0, bits >= 0; i--, bits--)
X		if(matrix[i]) value += (large) 1 << bits;
X
X	return(value);
X}
SHAR_EOF
echo "extracting main.c"
sed 's/^X//' << \SHAR_EOF > main.c
X/* main.c */
X
X#include <stdio.h>
X
X/*
XIt is strongly raccomended that you choose a key as combination of uppercase
Xand lowercase characters, digits and punctuation ("," and ".")
X*/
Xmain(ac, av)
Xchar **av;
X{
X	char buf[1024];
X	char *key;
X	int i;
X	int len;
X
X	if( !(key = av[1]) ) die("no key?");
X	if(strlen(key) < 15 || Xsrand(key)) die("bad key.");
X
X	do {
X		if( (len = read(0, buf, sizeof(buf))) == -1)
X			die("read error.");
X		for(i = 0; i < len; i++) buf[i] ^= Xrand(); /* too simple */
X		if(write(1, buf, len) == -1) die("write error.");
X	} while(len > 0);
X}
X
Xdie(str)
Xchar *str;
X{
X	fprintf(stderr, "Crypt: %s\n", str);
X	exit(10);
X}
SHAR_EOF
echo "extracting xrand.c"
sed 's/^X//' << \SHAR_EOF > xrand.c
X/* X-random number generator */
X
X#define KLEN	15	/* key length in bytes */
X#define BITS	6	/* get lower bits */
X#define TRUE	1L
X#define FALSE	0L
X
Xtypedef unsigned long		large;
X
Xchar		*malloc();
Xchar		*realloc();
Xchar		*fgetline();
Xlarge		compress();
Xextern large	extract();
X
Xlarge C, B, XN, modulus;
Xint W; /* word size */
X
X/*
XRandomize given a 15 valid char key.
X*/
XXsrand(input)
Xchar *input;
X{
X	char bits[KLEN * BITS];
X	char key[KLEN];
X
X	setmem(key, sizeof(key), 0);
X	strncpy(key, input, sizeof(key));
X	setmem(input, strlen(input), 0); /* get rid of ps -f */
X
X	if(tokenize(key)) return(TRUE); /* illegalities */
X	expand(key, bits);
X
X	C = compress(bits, 0, 29) << 1;		/* 30 bits */
X	B = compress(bits, 30, 58) << 2;	/* 29 bits */
X	XN = compress(bits, 59, 89);		/* 31 bits */
X	/* modulus equal to (2 ^ (W - 1)); W is the word size */
X	W = sizeof(modulus) * 8 - 1;
X	modulus = (large) 1 << W;
X
X	if(!modulus) return(TRUE); /* should never happen */
X	return(FALSE);
X}
X
X/*
XCheck key characters. Make things compact.
X*/
Xtokenize(key)
Xchar *key;
X{
X	int i;
X	char c;
X
X	for(i = 0; i < KLEN && (c = key[i]); i++) {
X		if(c >= 48 && c <= 57) c -= 48;		/* [0-9] [0-9] */
X		else if(c >= 65 && c <= 90) c -= 55;	/* [10-35] [A-Z] */
X		else if(c >= 97 && c <= 122) c -= 61;	/* [36-61] [a-z] */
X		else if(c == '.') c = 62;		/* [62] '.' */
X		else if(c == ',') c = 63;		/* [63] ',' */
X		else return TRUE;
X
X		key[i] = c;
X	}
X
X	return FALSE;
X}
X
X/*
XExpand an array into bits, reading "BITS" bits from each character.
X*/
Xexpand(in, out)
Xunsigned char *in;
Xchar *out;
X{
X	int i, j;
X	char c;
X
X	for(i = 0; i < KLEN; i++)
X		for(j = 0; j < 8; j++) {
X			c = (in[i] >> j) & 1;
X			if(j < BITS) *out++ = c;
X		}
X}
X
X/*
XCompress bits: suppose the "bits" buffer has the form: 0 0 1 1 0 1 :
Xthe instruction: compress(bits, 1, 3) will return the binary
Xsequence 0 1 1 converted into decimal.
X*/
Xlarge
Xcompress(bits, start, end)
Xchar *bits;
Xint start;
Xint end;
X{
X	large value;
X	int i, j;
X
X	j = 0;
X	value = 0;
X	for(i = start; i <= end; i++) {
X		if(bits[i]) value += (large) 1 << j;
X		j++;
X	}
X	return(value);
X}
X
X
X/*
XGenerate a random number. Currently only 8-bit numbers (bytes).
X*/
XXrand()
X{
X	register large A;
X	static large XNplus;
X
X	A = B + 1;
X
X	XNplus = (XN * A + C) % modulus;
X	XN = XNplus;
X
X	return(extract(XNplus, 8)); /* wanna bytes */
X}
SHAR_EOF
echo "extracting crypt.doc"
sed 's/^X//' << \SHAR_EOF > crypt.doc
X#:ts=8
X
X	Crypt v1.0	David Vincenzetti 8910.15 - vyrus@altger
X
X	Crypt reads from the standard input and writes on the standard
Xoutput. You have to supply a key as first argument, valid characters for
Xthe key are upper and lowercase characters, digits and punctuation.
X	The security of encrypted files depends on three factors: the
Xfundamental method must be hard to solve; direct search of the key space
Xmust be infeasible; 'sneak paths' by which keys or clear text can become
Xvisible must be minimized. The program fully futfils these requirements.
X
X	The kernel of the cipher consists of a Linear Congruential random
Xnumber generator as introduced by Knuth in his trilogy "The Art of
XComputer Programming". The period is maximum equal to 2**31, the seed
Xis a sequence of 90 bits extracted from the key and therefore there are
X2**90 combinations at all. I have been studying the algorithm and some
Xalgebra theorems for a long time to develop a cipher which was simple
Xto understand, fast and suitable for most computer applications.
XNo doubt the choice of key and key security are, as usually occours
Xwhen we deal with human behaviour, the most vulnerable aspect of Crypt.
X
X	Version 1.0, released on impetus after Cbc1.0, a block chaining
Xcipher which uses Data Encryption Standard, very secure but too slow for
Xfile encryption. Most features which I would like to see in a real
Xcrypt-o-program are missing here, I will do better in a future version:-))
X
XAlmost forgotten: this is public domain, do whatever you want just do not
Xuse commercially and notify me for changes or enhancements you might make.
XWhen hacking the source code beware of modifying the algorithm logic:
Xsmall changes can completely compromise security, complexity does not
Xmean strength: things obscure to you will be transparent to the analyst.
X
XEnjoy this program, math and your life.
X
SHAR_EOF
echo "extracting makefile"
sed 's/^X//' << \SHAR_EOF > makefile
X# :ts=8
X#	Working about Xrand random number generator
X#		David Vincenzetti		8910.12
X
XSRC = main.c xrand.c extract.c makefile crypt.doc
XOBJ = main.o xrand.o extract.o
XCFLAGS = -n
X
Xcrypt: $(OBJ)
X	ln $(OBJ) -g -o crypt -ll -lc
Xcopy:
X	shell -c cp -u $(SRC) ws:crypt
SHAR_EOF
echo "extracting crypt.uu"
sed 's/^X//' << \SHAR_EOF > crypt.uu
X
Xbegin 644 crypt.exe
XM```#\P`````````#``````````(```5:````L0````$```/I```%6D[Z!.1.5
XM5?OX(&T`"BMH``3[_&8*2'H`I$ZZ`,I83R\M^_Q.N@/B6$^P?``/;0XO+?O\L
XM3KH`XEA/2D!G"DAZ`(1.N@"B6$\_/`0`2&W\`$)G3KH$$E!/.T#[^+!\__]FW
XM"$AZ`&EA?EA/0FW[^F`8,"W[^D'M_`#0P"\(3KH"KB!?L1!2;?OZ,"W[^K!MS
XM^_AMWC\M^_A(;?P`/SP``4ZZ$2A03[!\__]F"$AZ`"UA-EA/2FW[^&Z03EU.0
XM=6YO(&ME>3\`8F%D(&ME>2X`<F5A9"!E<G)O<BX`=W)I=&4@97)R;W(N`$Y52
XM```O+0`(2'H`'$AL@,).N@,V3^\`##\\``I.NA&<5$].74YU0W)Y<'0Z("5S2
XM"@``3E7_ED)G/SP`#TAM_Y=.N@+R4$\_/``/+RT`"$AM_Y=.N@=23^\`"D)GF
XM+RT`"$ZZ`L!83S\`+RT`"$ZZ`L903TAM_Y=.N@""6$]*0&<&<`%.74YU2&W_M
XMIDAM_Y=.N@$44$\_/``=0F=(;?^F3KH!7%!/XX`I0()F/SP`.C\\`!Y(;?^FH
XM3KH!1%!/Y8`I0()J/SP`63\\`#M(;?^F3KH!+%!/*4"";CE\`!^"=C`L@G9(?
XMP'(!X:$I08)R2JR"<F8$<`%@C'``8(A.5?_\0FW__F```((,+0`P__UM$`PMC
XM`#G__6X(!"T`,/_]8%8,+0!!__UM$`PM`%K__6X(!"T`-__]8#X,+0!A__UM[
XM$`PM`'K__6X(!"T`/?_]8"8,+0`N__UF"!M\`#[__6`6#"T`+/_]9@@;?``_B
XM__U@!G`!3EU.=3`M__X@;0`($:W__0``4FW__@QM``___FP2,"W__B!M``@;S
XM<```__UF`/]H<`!@S$Y5__I";?_^0FW__#`M__X@;0`(<@`2,```,"W__.!I+
XMPGP``1M!__L,;0`&__QL#"!M``Q2K0`,$*W_^U)M__P,;0`(__QMQ%)M__X,1
XM;0`/__YMM$Y=3G5.5?_X0FW_^$*M__P[;0`,__I@)#`M__H@;0`(2C```&<.]
XM,"W_^$C`<@'AH=.M__Q2;?_X4FW_^C`M__JP;0`.;](@+?_\3EU.=4Y5```O$
XM!"@L@FI2A"($("R";DZZ!6[0K()F(BR"<DZZ"B8I0():*6R"6H)N/SP`""\L9
XM@EI.N@`*7$\H'TY=3G5.5?]X2.</`"@M``@Z+0`,NGP`@&,*<`!,WP#P3EU.=
XM=3`%2,!R`>&A*T'_^+BM__AD!"`$8.(@+?_XXX"X@&,$XHQ@\GX`8!@L!.*.0
XM(`;C@"($DH!![?]X$8%P`"@&4D>XO`````%BX%-'4T5"K?_\8!I![?]X2C!P+
XM`&<,,`5(P'(!X:'3K?_\4T=31;Y\``!*16S>("W__&``_WX@;P`$(`A*&&;\)
XMD<`@"%.`3G4@;P`$3*\``P`(8`(0P5'(__Q.=4Y5```I;0`(@EY(;0`0+RT`T
XM#$AZ``Y.N@7.3^\`#$Y=3G5.50``+RR"7C\M``A.N@EZ7$].74YU3E4``$CGW
XM#"`X+0`(3KH-TC`$P?P`!B1`U>R">$I$;0JX;().;`1*DF80.7P``H)\</],!
XMWP0P3EU.=3`J``3`?``#L'P``68*.7P`!8)\</]@X'``,"T`#B\`+RT`"B\23
XM3KH/M"H`L+S_____3^\`#&8,3KH/>#E`@GQP_V"T(`5@L&%P0^R"6D7L@EJUU
XMR68.,CP`&FL(=``BPE')__PI3X)^+'@`!"E.@H)(YX"`""X`!`$I9Q!+^@`(7
XM3J[_XF`&0J?S7TYS0_H`($ZN_F@I0(*&9@PN/``#@`=.KO^48`1.N@`:4$].7
XM=61O<RYL:6)R87)Y`$GY``!__DYU3E4``"\*2'D``0``,"R"3L'\``8O`$ZZD
XM#U8I0()X4$]F%$*G2'D``0``3KH/&E!/+FR"?DYU(&R">$)H``0@;()X,7P`@
XM`0`0(&R">#%\``$`"B!L@GX@+()^D*@`!%"`*4""BB!L@HH@O$U!3EA"ITZZ!
XM#PHD0$JJ`*Q83V<N+RT`#"\M``@O"DZZ`*XY?``!@HX@;()X`&B````$(&R":
XM>`!H@```"D_O``Q@0DAJ`%Q.N@\D2&H`7$ZZ#N8I0(*0(&R"D$JH`"103V<0N
XM(&R"D")H`"0O$4ZZ#?A83R\L@I`O"DZZ`HPI;(*0@I103TZZ#?@@;()X((!.9
XMN@X8(&R">"%```9G%DAX`^U(>@`J3KH-]"!L@G@A0``,4$\O+(*4/RR"F$ZZ_
XM^7Y"9TZZ#!)03R1?3EU.=2H`3E4``$CG##`D;0`0(&T`"$JH`*QG&"!M``@@6
XM*`"LY8`H`"!$("@`$.6`)D!@!"9L@E`0$TB`2,#0K0`,5(`Y0(*:0J<P+(*:V
XM2,`O`$ZZ#>@I0(*<4$]F"$S?##!.74YU$!-(@#H`/P4@2U*(+P@O+(*<3KH!$
XM?C`%2,`@0-'L@IQ#^@%$$-EF_#\M``XO"B\L@IQ.N@$Z(&R"G$(P4``Y?``!4
XM@I@P!4C`T*R"G"9`4HLD2T_O`!00$TB`.@"P?``@9QBZ?``)9Q*Z?``,9PRZ,
XM?``-9P:Z?``*9@12BV#8#!,`(&UZ#!,`(F8N4HL@2U*+$!!(@#H`9QX@2E**"
XM$(6Z?``B9A`,$P`B9@12BV`&0BK__V`"8-9@."!+4HL0$$B`.@!G)KI\`"!G?
XM(+I\``EG&KI\``QG%+I\``UG#KI\``IG""!*4HH0A6#.($I2BD(02D5F`E.+Z
XM4FR"F&``_UI"$D*G,"R"F%)`2,#E@"\`3KH,QBE`@I103V8(0FR"F&``_MAZ0
XM`"9L@IQ@)#`%2,#E@"!L@I0ABP@`($L@"$H89OR1P%.(,`A20$C`U\!21;IL5
XM@IAMUC`%2,#E@"!L@I1"L`@`8`#^E"``,#Q__V`$,"\`#"!O``1*&&;\4T@BZ
XM;P`(4T`0V5?(__QG`D(0("\`!$YU3.\#```$(`@R+P`,8`(0V5?)__QG!E)!;
XM8`)"&%')__Q.=4CG<``T`<3`)@%(0\;`2$-"0]2#2$#`P4A`0D#0@DS?``Y.W
XM=4Y5``!(YPXP)&T`"$*G2'H`CDZZ#"@I0(*@4$]F"$S?#'!.74YU(&T`#")HC
XM`"0O*0`$3KH,6"@`6$]G4DAZ`&T@1"\H`#9.N@PJ)D!*@%!/9S1(>`/M+PM.T
XMN@LZ+`!03V<D(`;E@"H`($4E:``(`*0E1@"<2'@#[4AZ`#A.N@L6)4``H%!/F
XM+P1.N@OV6$\O+(*@3KH+6D*L@J!83V"`:6-O;BYL:6)R87)Y`%=)3D1/5P`JR
XM`$Y5``!(YP@@)&T`#@QM``0`$F8((&T`""@08!Q*;0`,;PP@;0`(<``P$"@`*
XM8`H@;0`(,!!(P"@`0FT`$DIM``QL$$1M``Q*A&P(1(0[?``!`!(R+0`,2,$@4
XM!$ZZ`Y!![(`"4XH4L```,BT`#$C!(`1.N@.&*`!FVDIM`!)G!E.*%+P`+2`*Z
XM3-\$$$Y=3G5.5?\B2.<(,"1M``@F;0`,0FW_^BMM`!#__"!+4HL0$$B`.`!GJ
XM``+NN'P`)68``LQ"+?\P.WP``?_X.WP`(/_V.WPG$/_T($M2BQ`02(`X`+!\+
XM`"UF#D)M__@@2U*+$!!(@#@`N'P`,&80.WP`,/_V($M2BQ`02(`X`+A\`"IF1
XM&"!M__Q4K?_\.U#_\B!+4HL0$$B`.`!@,D)M__)@'#`M__+!_``*T$20?``P3
XM.T#_\B!+4HL0$$B`.``P!%)`0>R`%`@P``(``&;4N'P`+F9:($M2BQ`02(`X9
XM`+!\`"IF&"!M__Q4K?_\.U#_]"!+4HL0$$B`.`!@,D)M__1@'#`M__3!_``*%
XMT$20?``P.T#_]"!+4HL0$$B`.``P!%)`0>R`%`@P``(``&;4.WP``O_PN'P`]
XM;&82($M2BQ`02(`X`#M\``3_\&`0N'P`:&8*($M2BQ`02(`X`#`$2,!@>CM\G
XM``C_[F`6.WP`"O_N8`X[?``0_^Y@!CM\__;_[C\M__!(;?\P/RW_[B\M__Q.W
XMNOWD*T#_ZC`M__!(P-&M__Q/[P`,8%P@;?_\6*W__")0*TG_ZB`)2AEF_)/`:
XM4XD[2?_P8$H@;?_\5*W__#@00>W_+RM(_^H0A&`HD+P```!C9^)3@&>2D+P`I
XM```+9P#_<EF`9[)5@&<`_W!7@&<`_W)@S$'M_S"1[?_J.TC_\#`M__"P;?_TM
XM;P8[;?_T__!*;?_X9V@@;?_J#!``+6<*(&W_Z@P0`"MF+@QM`##_]F8F4VW_F
XM\B!M_^I2K?_J$!!(@#\`3I*P?/__5$]F"G#_3-\,$$Y=3G5@%C\M__9.DK!\;
XM__]43V8$</]@Y%)M__HP+?_R4VW_\K!M__!NW$)M_^Y@("!M_^I2K?_J$!!(M
XM@#\`3I*P?/__5$]F!'#_8+!2;?_N(&W_ZDH09PHP+?_NL&W_]&W.,"W_[M%M?
XM__I*;?_X9BA@&#\\`"!.DK!\__]43V8&</]@`/]X4FW_^C`M__)3;?_RL&W_Z
XM\&[:8!8_!$Z2L'S__U1/9@9P_V``_U)2;?_Z8`#]"#`M__I@`/]"2.=(`$*$[
XM2H!J!$2`4D1*@6H&1($*1``!83Y*1&<"1(!,WP`22H!.=4CG2`!"A$J`:@1$^
XM@%)$2H%J`D2!81H@`6#8+P%A$B`!(A]*@$YU+P%A!B(?2H!.=4CG,`!(04I!0
XM9B!(038!-`!"0$A`@,,B`$A`,@*"PS`!0D%(04S?``Q.=4A!)@$B`$)!2$%('
XM0$)`=`_0@-.!MH%B!)*#4D!1RO_R3-\`#$YU3E4``"\$."T`""\M``H_!$ZZG
XM`#"X?``*7$]F)"!M``H0*``,2(`(```'9Q0_//__+RT`"DZZ`/1<3R@?3EU.6
XM=6#X3E4``"\*)&T`"B!2L>H`!&48,"T`",!\`/\_`"\*3KH`R%Q/)%].74YU6
XM(%)2DA`M``D0@$B`P'P`_V#H3E4``"\*0>R`EB1(($K5_````!8O"&$06$]!C
XM[().M<AEZB1?3EU.=4Y5``!(YP@@)&T`"'@`(`IF"G#_3-\$$$Y=3G5**@`,Z
XM9U`(*@`"``QG##\\__\O"F%2.`!<3Q`J``U(@#\`3KH%'(A`""H``0`,5$]GZ
XM"B\J``A.N@(N6$\(*@`%``QG$B\J`!).N@+`+RH`$DZZ`A103T*20JH`!$*J3
XM``A"*@`,,`1@D$Y5__Y(YP@@)&T`"$'Z_T8I2(*D""H`!``,9PIP_TS?!!!.Z
XM74YU""H``@`,9S`@4I'J``@X"#\$+RH`"!`J``U(@#\`3KH"@+!$4$]G$`CJD
XM``0`#$*20JH`!'#_8,`,;?__``QF$`BJ``(`#$*20JH`!'``8*A*J@`(9@@OQ
XM"DZZ`)I83PQJ``$`$&8J&VT`#?__/SP``4AM__\0*@`-2(`_`$ZZ`B*P?``!3
XM4$]FH#`M``Q@`/]J)*H`"#`J`!!(P-"J``@E0``$".H``@`,(%)2DA`M``T0Z
XM@$B`P'P`_V``_SY.50``+PI![("6)$A**@`,9QC5_````!9![().M<AE"'``H
XM)%].74YU8.)"DD*J``1"J@`((`I@ZDY5__PO"B1M``@_/`0`3KH`P"M`__Q40
XM3V88-7P``0`0($K1_`````XE2``()%].74YU-7P$```0".H``0`,)6W__``(3
XM$"H`#4B`/P!.N@#B2D!43V<&`"H`@``,8,Y.50``2.<`,"1L@F)@%"92("H`B
XM!%"`+P`O"DZZ!%Q03R1+(`IFZ$*L@F),WPP`3EU.=4Y5```O"D'Z_\8I2(*H8
XM0J<@+0`(4(`O`$ZZ!`HD0$J`4$]F"'``)%].74YU)*R"8B5M``@`!"E*@F(@X
XM"E"`8.9.50``<``P+0`(+P!ALEA/3EU.=4Y5``!(YP`PE\LD;()B8`X@;0`(*
XM48BQRF<2)DHD4B`*9NYP_TS?#`!.74YU(`MG!":28`0I4H)B("H`!%"`+P`O2
XM"DZZ`ZYP`%!/8-A.50``+PHP+0`(P?P`!B1`U>R">$IM``AM#C`M``BP;().X
XM;`1*DF8..7P``H)\</\D7TY=3G4P+0`(P?P`!B!L@G@O,`@`3KH"QDJ`6$]G2
XM!'`!8`)P`&#83E4``"\M``A.N@*02H!83V8.3KH"FCE`@GQP_TY=3G5P`&#X%
XM3E4``$CG#"`X+0`(3KH`<#`$P?P`!B1`U>R">$I$;0JX;().;`1*DF80.7P`I
XM`H)\</],WP0P3EU.=3`J``3`?``#9@HY?``%@GQP_V#D<``P+0`.+P`O+0`*D
XM+Q).N@)T*@"PO/____]/[P`,9@Q.N@(:.4""?'#_8+@@!6"T3E7__$AX$`!"8
XMITZZ`M@K0/_\"```#%!/9Q)*;(*.9@@@+?_\3EU.=4ZZ``9P`&#T3E4``$AXZ
XM``1(>@`<3KH!\"\`3KH"$#\\``%.N@`.3^\`#DY=3G5>0PH`3E4``$JL@J1G!
XM!B!L@J1.D#\M``A.N@`(5$].74YU3E7__"\$,"T`"$C`*T#__$JL@GAG*'@`&
XM8`H_!$ZZ`/Y43U)$N&R"3FWP,"R"3L'\``8O`"\L@GA.N@'Z4$]*K(*H9P8@_
XM;(*H3I!*K()49PHO+()43KH!=EA/2JR"K&<((&R"K""L@K!*K(*T9PHO+(*T!
XM3KH!DEA/2JR"N&<*+RR"N$ZZ`8)83TJL@KQG"B\L@KQ.N@%R6$]*K(+`9PHOB
XM+(+`3KH!8EA/+'@`!`@N``0!*6<4+PU+^@`*3J[_XBI?8`9"I_-?3G-*K(*0B
XM9C!*K(*<9R@P+(*:2,`O`"\L@IQ.N@%2,"R"F%)`2,#E@"\`+RR"E$ZZ`3Y/G
XM[P`08`Y.N@$L+RR"D$ZZ`5A83R`M__PN;()^3G4H'TY=3G5.50``2.<.(#@M6
XM``@P!,'\``8D0-7L@GA*1&T*N&R"3FP$2I)F$#E\``*"?'#_3-\$<$Y=3G4(2
XM*@`'``1F""\23KH`"EA/0I)P`&#B(B\`!"QL@H9.[O_<(B\`!"QL@H9.[O^"A
XM(B\`!"QL@H9.[O^X+&R"AD[N_\HL;(*&3N[_?"(O``0L;(*&3N[_*$SO``8`]
XM!"QL@H9.[O_B+&R"AD[N_\1,[P`.``0L;(*&3N[_UD[Z``(B+P`$+&R"AD[N9
XM_Z9,[P`.``0L;(*&3N[_T$CG`01,[R"```PL;(*"3J[_E$S?((!.=4[Z``(B=
XM;P`$+&R"@D[N_F),[P`#``0L;(*"3N[_.B)O``0L;(*"3N[^VBQL@H).[O]\6
XM(F\`!"`O``@L;(*"3N[_+B!O``0L;(*"3N[^C"QL@H(B;P`$("\`"$[N_=@BA
XM;P`$+&R"@D[N_H9,[P`#``0L;(*"3N[^SB!O``0L;(*"3N[^@$SO`P``!"QLX
XM@J!.[O^@(&\`!"QL@J!.[O^F(&\`!"QL@J!.[O^R```#[`````$````!```%;
XM6@````````/R```#Z@```)8P,3(S-#4V-S@Y86)C9&5F````("`@("`@("`@4
XM,#`P,#`@("`@("`@("`@("`@("`@(""00$!`0$!`0$!`0$!`0$!`#`P,#`P,(
XM#`P,#$!`0$!`0$`)"0D)"0D!`0$!`0$!`0$!`0$!`0$!`0$!`4!`0$!`0`H*.
XM"@H*"@("`@("`@("`@("`@("`@("`@("0$!`0"```````````````````0``Q
XM```!``````````````````````$!`````0`````````````````````!`@``'
XM``$`````````````````````````````````````````````````````````!
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM`````````````````````````````````````````````````````````````
XM````````````````````````````%`````````````````/R```#ZP````$`X
X#``/RU
X``
Xend
Xsize 6168
SHAR_EOF
echo "End of archive 1 (of 1)"
# if you want to concatenate archives, remove anything after this line
exit