[comp.sys.amiga] DEVICE REQUEST INTERCEPT PROGRAM

dillon@CORY.BERKELEY.EDU (Matt Dillon) (05/04/87)

	This is version 1.00.  It will give you most of the IO request 
information for any device(s) you choose.  It makes an assumption:

	-(1) The device that it is monitoring doesn't go away while it's
	monitoring it.

	The program understands The trackdisk.device and will breakup the
Offset field into cylinder , track,  and block number (sorry, currently
only prints the numbers right for the Amiga's Floppies).

	TDEBUG works by intercepting the EXEC  SendIO() and DoIO() vectors.
The new vector checks the sent request against the list of devices you want
displayed and places the IOStdReq part of the request in a FIFO (Allocating
a copy of the IOStdReq).  It then signals the main program.

	The Main program is constantly waiting for the latter signal, or 
a BREAK (CTRL-C or CTRL-D).  When it gets the signal, it checks the FIFO
and pulls off any pending buffers, displaying their contents and 
deallocating the memory.

	This is what I used to get those DOS statistics for you.  It makes
an excellent debugging tool for devices since you can intercept any device.
Please mail all suggestions and comments to me.. remember, this is only
V1.00

				-Matt

#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
#	tdebug.c
#	tdebug.uue
# This archive created: Sun May  3 17:31:30 1987
export PATH; PATH=/bin:/usr/bin:$PATH
echo shar: "extracting 'tdebug.c'" '(5668 characters)'
if test -f 'tdebug.c'
then
	echo shar: "will not over-write existing file 'tdebug.c'"
else
cat << \!Funky!Stuff! > 'tdebug.c'

/*
 *  TDEBUG.C
 *
 *  (C)Copyright 1987 Matthew Dillon, All Rights Reserved
 *  FreeWare.  May be distributed for non-profit only.
 *
 *  Debug any device .. usually trackdisk.device
 *
 *  AZTEC USERS:   MUST COMPILE  +CDL and LINK WITH THE LARGE EVERYTHING
 *  LIBRARY!!!! (cl32.lib).  NOTE: This source expects all the amiga
 *  symbols to be preloaded.  NOTE: There are some function calls in this
 *  source which you don't have... the functions should be obvious and
 *  easy to implement.
 *
 *  Sorry, no support for lattice.  A smart programmable will be able to
 *  split the assembly file and do all the right #includes.
 *
 */

#define FIFO	struct _FIFO

typedef struct ExecBase EB;
typedef struct List	LIST;
typedef struct Node	NODE;
typedef struct IOStdReq STD;
typedef struct Task	TASK;

FIFO {
    FIFO    *next;	    /* next element */
    STD     std;	    /* IO request   */
};

extern EB *SysBase;
extern NODE *findlist();
extern TASK *FindTask();
extern char *AllocMem();

FIFO *Base, **Lnext = &Base;

NODE *Nodearray[64];

NODE *Ntrack;
NODE *Nasdg;

TASK *Mastertask;
long Operations;	    /* # operations monitored	*/
long Mask, Signum;

char *Stdname[] = {
    "INVALID", "RESET", "READ", "WRITE", "UPDATE", "CLEAR", "STOP",
    "START", "FLUSH"
};

main(ac, av)
char *av[];
{
    register FIFO *fifo;
    register long result;

    disablebreak();
    Mastertask = FindTask(0);
    Signum = AllocSignal(-1);
    Mask = 1 << Signum;
    loadnodearray(ac, av);	/* which devices to intercept?	*/

    overidevector(1);
    puts ("Now intercepting all DoIO() and SendIO() operations");
    puts ("");
    puts ("Device__         Cmd_ Len_____");
    SetSignal(0, SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_D);
    for (;;) {
	result = Wait(SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_D|Mask);
	if (result & (SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_D))
	    break;
	while (Base) {
	    long block, cmd;
	    char ext;

	    Forbid();
	    fifo = Base;
	    Base = Base->next;
	    if (Base == NULL)
		Lnext = &Base;
	    Permit();
	    printf ("%16s ", fifo->std.io_Device->dd_Library.lib_Node.ln_Name);
	    cmd = fifo->std.io_Command;
	    ext = ' ';
	    if (cmd & TDF_EXTCOM) {
		cmd &= ~TDF_EXTCOM;
		ext = 'E';
	    }
	    if (fifo->std.io_Command < CMD_NONSTD)
		printf ("%lc%-7s ", ext, Stdname[fifo->std.io_Command]);
	    else
		printf (" NON+%lc%-2ld ", ext, fifo->std.io_Command - CMD_NONSTD);
	    printf ("%-8ld %-8ld ", fifo->std.io_Length, fifo->std.io_Offset);
	    if (fifo->std.io_Device == Ntrack || fifo->std.io_Device == Nasdg) {
		block = fifo->std.io_Offset / 512;
		printf ("Blk#: %-5ld ", block);
		printf ("(Trk %2ld  Cyl %2ld) ", block/22, (block/11)&1);
	    }
	    puts("");
	    FreeMem(fifo, sizeof(*fifo));
	}
    }
    puts ("Restoring intercept vector");
    overidevector(0);
    Delay(50);
    while (Base) {
	fifo = Base->next;
	FreeMem(Base, sizeof(*Base));
	Base = fifo;
    }
    FreeSignal(Signum);
    printf ("%ld operations monitored\n", Operations);
}


loadnodearray(ac, av)
char *av[];
{
    register int i;
    register int j;
    register NODE *node;
    register LIST *list = &SysBase->DeviceList;

    Ntrack = findlist(list, "trackdisk.device");
    Nasdg  = findlist(list, "asdg.vdisk.device");
    if (ac == 1) {
	puts ("TDEBUG V1.00  By Matthew Dillon");
	puts ("(C)Copyright 1987 Mathew Dillon, All Rights Reserved");
	puts ("CTRL-C, CTRL-D, or BREAK to terminate");
	puts ("");
	puts ("tdebug device device...");
	puts ("tdebug trackdisk.device");
	puts ("");
	showlist(list);
	puts ("");
	exit(1);
    }
    for (i = 1, j = 0; av[i]; ++i) {
	node = findlist(list, av[i]);
	if (!node)
	    printf ("Unable to find: %s\n", av[i]);
	else
	    Nodearray[j++] = node;
    }
}


NODE *
findlist(list, name)
LIST *list;
char *name;
{
    register NODE *node;

    for (node = list->lh_Head; node != &list->lh_Tail; node = node->ln_Succ) {
	if (strcmp(name, node->ln_Name) == 0)
	    return(node);
    }
    return(NULL);
}

showlist(list)
LIST *list;
{
    register NODE *node;

    for (node=list->lh_Head; node != &list->lh_Tail; node=node->ln_Succ) {
	puts(node->ln_Name);
    }
}



static long oldsendvec;
static long olddovec;

overidevector(n)
{
    extern char LVODoIO;
    extern char LVOSendIO;
    extern int newsendio(), newdoio();

    Forbid();
    if (n) {
	oldsendvec = SetFunction(SysBase, &LVOSendIO, newsendio);
	olddovec =   SetFunction(SysBase, &LVODoIO,   newdoio);
    } else {
	SetFunction(SysBase, &LVOSendIO, oldsendvec);
	SetFunction(SysBase, &LVODoIO,	 olddovec);
    }
    Permit();
}

/*
 *  NOTE!!! Since BeginIO is the basis for the entire operating system,
 *  we cannot do anything inside this routine that would ever use it.
 */

myio(ioreq)
register STD *ioreq;
{
    register FIFO *fifo;
    register int i;

    Forbid();
    for (i = 0; Nodearray[i]; ++i) {
	if (Nodearray[i] == ioreq->io_Device)
	    break;
    }
    if (Nodearray[i]) {
	if (fifo = (FIFO *)AllocMem(sizeof(*fifo), 0)) {
	    *Lnext = fifo;
	    Lnext = &fifo->next;
	    fifo->next = NULL;
	    fifo->std = *ioreq;
	}
	++Operations;
	Signal(Mastertask, Mask);
    }
    Permit();
}

#asm

_newsendio:
		movem.l D0-D7/A0-A6,-(sp)   ;save regs
		move.l	A1,-(sp)	    ;the io request
		jsr	_myio		    ;call my intercept routine
		addq.l	#4,sp
		movem.l (sp)+,D0-D7/A0-A6   ;restore regs
		move.l	_oldsendvec,A0	    ;A0 not used by SendIO
		jsr (A0)
		rts

_newdoio:
		movem.l D0-D7/A0-A6,-(sp)   ;save regs
		move.l	A1,-(sp)	    ;the io request
		jsr	_myio		    ;call my intercept routine
		addq.l	#4,sp
		movem.l (sp)+,D0-D7/A0-A6   ;restore regs
		move.l	_olddovec,A0	  ;A0 not used by SendIO
		jsr (A0)
		rts

#endasm

!Funky!Stuff!
fi  # end of overwriting check
echo shar: "extracting 'tdebug.uue'" '(12473 characters)'
if test -f 'tdebug.uue'
then
	echo shar: "will not over-write existing file 'tdebug.uue'"
else
cat << \!Funky!Stuff! > 'tdebug.uue'
begin 644 tdebug
M```#\P`````````#``````````(```;:````G@```%P```/I```&VD[Z!XQ)
M3E9!3$E$`%)%4T54`%)%040`5U))5$4`55!$051%`$-,14%2`%-43U``4U1!
M4E0`1DQ54T@``$Y5__9(YP@@3KD```=N0J=.N0``&F!83R/`````7$AX__].
MN0``&CQ83R/`````:'`!(CD```!HXZ`CP````&0O+0`,+RT`"$ZZ`Q903TAX
M``%.N@5P6$](>@(N3KD```P26$](>@)63KD```P26$](>@)+3KD```P26$](
M>#``0J=.N0``&OA03R`Y````9("\```P`"\`3KD``!L@6$\H`"`$P+P``#``
M9@`!:DJY````4&<``5Q.N0``&G0D>0```%`@>0```%`CT````%!*N0```%!F
M#$'Y````4"/(`````$ZY```:RB!J`!@O*``*2'H!Z$ZY```-(E!/<``P*@`@
M*T#_^!M\`"#_]P@M``?_^F<,"*T`!__Z&WP`1?_W#&H`"0`@9"QP`#`J`"#E
M@$'Y````!"\P"``2+?_W2(%(P2\!2'H!FDZY```-(D_O``Q@)'``,"H`("!`
M2&C_]Q(M__=(@4C!+P%(>@%]3KD```TB3^\`#"\J`#`O*@`H2'H!=DZY```-
M(D_O``P@:@`8L?D```!49PPB:@`8L_D```!89DP@*@`P<@GBJ"M`__PO+?_\
M2'H!34ZY```-(E!/<@L@+?_\3KD``!%"P+P````!+P!R%B`M__Q.N0``$4(O
M`$AZ`2Q.N0``#2)/[P`,2'H!-$ZY```,$EA/2'@`-"\*3KD``!J$4$]@`/Z>
M8`#^=DAZ`1-.N0``#!)83T*G3KH#GEA/2'@`,DZY```9IEA/2KD```!09R(@
M>0```%`D4$AX`#0O.0```%!.N0``&H103R/*````4&#6+SD```!H3KD``!J<
M6$\O.0```&!(>@#03KD```TB4$],WP003EU.=4YO=R!I;G1E<F-E<'1I;F<@
M86QL($1O24\H*2!A;F0@4V5N9$E/*"D@;W!E<F%T:6]N<P``1&5V:6-E7U\@
M("`@("`@("!#;61?($QE;E]?7U]?`"4Q-G,@`"5L8R4M-W,@`"!.3TXK)6QC
M)2TR;&0@`"4M.&QD("4M.&QD(`!";&LC.B`E+35L9"``*%1R:R`E,FQD("!#
M>6P@)3)L9"D@``!297-T;W)I;F<@:6YT97)C97!T('9E8W1O<@`E;&0@;W!E
M<F%T:6]N<R!M;VYI=&]R960*`$Y5``!(YPPP)GD````,U_P```%>2'H!`B\+
M3KH!XE!/(\````!42'H!`2\+3KH!T%!/(\````!8#*T````!``AF=$AZ`/=.
MN0``#!)83TAZ`0M.N0``#!)83TAZ`31.N0``#!)83TAZ`4Y.N0``#!)83TAZ
M`4-.N0``#!)83TAZ`4].N0``#!)83TAZ`5M.N0``#!)83R\+3KH!GEA/2'H!
M2$ZY```,$EA/2'@``4ZY```7M%A/>`%Z`&!&(`3E@"!M``PO,`@`+PM.N@$R
M4$\D0"`*9AH@!.6`(&T`#"\P"`!(>@$%3KD```TB4$]@$"`%4H7E@$'Y````
M<"&*"`!2A"`$Y8`@;0`,2K`(`&:L3-\,,$Y=3G5T<F%C:V1I<VLN9&5V:6-E
M`&%S9&<N=F1I<VLN9&5V:6-E`%1$14)51R!6,2XP,"`@0GD@36%T=&AE=R!$
M:6QL;VX`*$,I0V]P>7)I9VAT(#$Y.#<@36%T:&5W($1I;&QO;BP@06QL(%)I
M9VAT<R!297-E<G9E9`!#5%),+4,L($-44DPM1"P@;W(@0E)%04L@=&\@=&5R
M;6EN871E``!T9&5B=6<@9&5V:6-E(&1E=FEC92XN+@!T9&5B=6<@=')A8VMD
M:7-K+F1E=FEC90```%5N86)L92!T;R!F:6YD.B`E<PH``$Y5```O"B!M``@D
M4&`>+RH`"B\M``Q.N0``"])03TJ`9@@@"B1?3EU.=212(&T`"%B(L<IFV'``
M8.I.50``+PH@;0`()%!@#B\J``I.N0``#!)83R12(&T`"%B(L<IFZ"1?3EU.
M=4Y5``!.N0``&G1*K0`(9T)(>@$H2'G___XR+SD````,3KD``!KB3^\`#"/`
M`````$AZ`2)(>?___C@O.0````Q.N0``&N)/[P`,(\`````$8#@O.0````!(
M>?___C(O.0````Q.N0``&N)/[P`,+SD````$2'G___XX+SD````,3KD``!KB
M3^\`#$ZY```:RDY=3G5.50``2.<(,"1M``A.N0``&G1X`&`6(`3E@$'Y````
M<")P"`"SZ@`49Q)2A"`$Y8!!^0```'!*L`@`9MH@!.6`0?D```!P2K`(`&=,
M0J=(>``T3KD``!I*4$\F0$J`9QX@>0`````@BR/+`````$*3($M8B")*<`L@
MV5'(__Q2N0```&`O.0```&0O.0```%Q.N0``&PY03TZY```:RDS?#!!.74YU
M2.?__B\)3KK_4EB/3-]__R!Y`````$Z03G5(Y__^+PE.NO\X6(],WW__('D`
M```$3I!.=4Y5``!"N0```!!.74YU3E4``"/\`````0```!!.74YU87Q#^0``
M`GA%^0````"UR68.,CP`6VL(=``BPE')__PCSP```!0L>``$(\X````,2.>`
M@`@N``0!*6<02_H`"$ZN_^)@!D*G\U].<T/Z`"1.KOYH(\`````89@PN/``#
M@`=.KO^48`9.N0``"!103TYU9&]S+FQI8G)A<GD`2?D``'_^3G5.50``2.<P
M($AY``$``#`Y```"=,'\``8O`$ZY```:4%!/(\`````<9AA"ITAY``$``$ZY
M```:#E!/+GD````43G4@>0```!Q":``$('D````<,7P``0`0(GD````<,WP`
M`0`*('D````4(#D````4D*@`!%"`(\`````@('D````@(+Q-04Y80J=.N0``
M&F983R1`2JH`K&<X+RT`#"\M``@O"DZY```)H$_O``PC_`````$````0('D`
M```<`&B````$('D````<`&B````*8%A(:@!<3KD``!LN6$](:@!<3KD``!JJ
M6$\CP````"0@>0```"1*J``D9Q0@>0```"0B:``D+Q%.N0``&9A83R\Y````
M)"\*3KD```Q84$\C^0```"0````H3KD``!G"('D````<((!.N0``&?0@>0``
M`!PA0``&9QI(>`/M2'H`.DZY```9Y%!/('D````<(4``#"\Y````*"\Y````
M+$ZY````/%!/0J=.N0``%[183TS?!`Q.74YU*@!.50``2.<\,"1M`!`@;0`(
M("@`K.6`*``@1"`H`!#E@"9`$!-(@$C`T*T`#%2`(\`````P0J<O.0```#!.
MN0``&E!03R/`````-&8(3-\,/$Y=3G40$TB`2,`O`"!+4H@O""\Y````-$ZY
M```+AD_O``Q(>@%P$!-(@$C`T+D````T+P!.N0``#`)03R\M``PO"B\Y````
M-$ZY```+KD_O``Q"N0```"PF>0```#0D2Q`32(!(P"H`L+P````@9R"ZO```
M``EG&+J\````#&<0NKP````-9PBZO`````IF!%*+8,P,$P`@;0``C@P3`")F
M,E*+($M2BQ`02(!(P"H`9R`@2E**$(6ZO````")F$`P3`")F!%*+8`9"*O__
M8`)@TF!$($M2BQ`02(!(P"H`9S"ZO````"!G*+J\````"6<@NKP````,9QBZ
MO`````UG$+J\````"F<(($I2BA"%8,(@2E**0A!*A68"4XM2N0```"Q@`/\Z
M0A)"IR`Y````+%*`Y8`O`$ZY```:4%!/(\`````H9@I"N0```"Q@`/ZL>@`F
M>0```#1@'B`%Y8`@>0```"@ABP@`+PM.N0``$>I83U*`U\!2A;JY````+&W:
M(`7E@"!Y````*$*P"`!@`/YJ(`!,[P,```0@""(O``Q@`A#95\G__&<&4D%@
M`D(84<G__$YU,#Q__V`$,"\`#B!O``1*&&;\4T@B;P`(4T`0V5?(__QG`D(0
M("\`!$YU,#Q__V`$,"\`#E-`:Q0@;P`$(F\`"+$)9@Q32$H85\C_]G``3G5C
M!'`!3G5P_TYU(&\`!"`((F\`"!#99OQ.=4Y5``!(YS`@)&T`"$H29R@@2E**
M$!!(@$C`+P!.N0``$?Q83["\_____V8*</],WP0,3EU.=6#42'@`"DZY```1
M_%A/8.A.50``2.<^,"1M``A"ITAZ`*1.N0``&KA03R/`````;&8(3-\,?$Y=
M3G4@;0`,(F@`)"\I``1.N0``&UI83R@`9UI(>@!]($0O*``V3KD``!L\4$\F
M0$J`9SA(>`/M+PM.N0``&>103RP`9R8@!N6`*@`@125H``@`I"5&`)Q(>`/M
M2'H`1$ZY```9Y%!/)4``H"\$3KD``!M,6$\O.0```&Q.N0``&BA83T*Y````
M;&``_W!I8V]N+FQI8G)A<GD`5TE.1$]7`"H`3E4``$CG,`!(;0`,+RT`"$AY
M```1_$ZY```-UD_O``Q,WP`,3EU.=4Y5``!(YS@@)&T`$`RM````!``49@@@
M;0`(*!!@%$JM``QO""!M``@H$&`&(&T`""@00JT`%$JM``QL$D2M``Q*A&P*
M1(0K?`````$`%"(M``P@!$ZY```1A$'Y````*%.*%+`(`"(M``P@!$ZY```1
MD"@`9MA*K0`49P93BA2\`"T@"DS?!!Q.74YU3E7_%$CG.#`D;0`()FT`#$*M
M__@K;0`0__P@2U*+$!!(@$C`*`!G``,\N+P````E9@`#%D(M_R(K?`````'_
M]"M\````(/_P*WP``"<0_^P@2U*+$!!(@$C`*`"PO````"UF$$*M__0@2U*+
M$!!(@$C`*`"XO````#!F%"M\````,/_P($M2BQ`02(!(P"@`N+P````J9AH@
M;?_\6*W__"M0_^@@2U*+$!!(@$C`*`!@.$*M_^A@)'(*("W_Z$ZY```99M"$
MD+P````P*T#_Z"!+4HL0$$B`2,`H`$'Y````.P@P``)(`&;.N+P````N9F8@
M2U*+$!!(@$C`*`"PO````"IF&B!M__Q8K?_\*U#_["!+4HL0$$B`2,`H`&`X
M0JW_[&`D<@H@+?_L3KD``!EFT(20O````#`K0/_L($M2BQ`02(!(P"@`0?D`
M```["#```D@`9LXK?`````3_Y+B\````;&86($M2BQ`02(!(P"@`*WP````$
M_^1@%+B\````:&8,($M2BQ`02(!(P"@`(`1@``""*WP````(_^!@'"M\````
M"O_@8!(K?````!#_X&`(*WS____V_^`O+?_D2&W_(B\M_^`O+?_\3KK]I$_O
M`!`K0/_<("W_Y-&M__Q@7"!M__Q8K?_\*U#_W"\M_]Q.N0``$>I83RM`_^1@
M2B!M__Q8K?_\*!!![?\A*TC_W!"$8"B0O````&-GXE.`9Y*0O`````MG`/]L
M68!GLE6`9P#_;%>`9P#_<&#,0>W_(I'M_]PK2/_D("W_Y+"M_^QO!BMM_^S_
MY$JM__1G<"!M_]P,$``M9PHB;?_<#!$`*V8T#*T````P__!F*E.M_^@@;?_<
M4JW_W!`02(!(P"\`3I)83["\_____V8*</],WPP<3EU.=6`8+RW_\$Z26$^P
MO/____]F!'#_8.)2K?_X("W_Z%.M_^BPK?_D;MI"K?_@8"0@;?_<4JW_W!`0
M2(!(P"\`3I)83["\_____V8$</]@JE*M_^`@;?_<2A!G"B`M_^"PK?_L;<H@
M+?_@T:W_^$JM__1F*F`:2'@`($Z26$^PO/____]F!G#_8`#_<%*M__@@+?_H
M4ZW_Z+"M_^1NV&`8+P1.DEA/L+S_____9@9P_V``_TA2K?_X8`#\N"`M__A@
M`/\X2.=(`$*$2H!J!$2`4D1*@6H&1($*1``!83Y*1&<"1(!,WP`22H!.=4CG
M2`!"A$J`:@1$@%)$2H%J`D2!81H@`6#8+P%A$B`!(A]*@$YU+P%A!B(?2H!.
M=4CG,`!(04I!9B!(038!-`!"0$A`@,,B`$A`,@*"PS`!0D%(04S?``Q.=4A!
M)@$B`$)!2$%(0$)`=`_0@-.!MH%B!)*#4D!1RO_R3-\`#$YU(&\`!"`(2AAF
M_)'`(`A3@$YU3E4``$CG,`!(>0```-(O+0`(3KD``!(>4$],WP`,3EU.=4Y5
M``!(YS@`*"T`""\M``PO!$ZY```2;%!/N+P````*9BH@;0`,$"@`#$B`2,`(
M```'9QA(>/__+RT`#$ZY```3<E!/3-\`'$Y=3G5@]DY5``!(YS`@)&T`#"!2
ML>H`!&4<("T`","\````_R\`+PI.N@#B4$],WP0,3EU.=2!24I(0+0`+$(!(
M@$C`P+P```#_8.).50``2.<P($'Y````O"1(($K5_````!8O"&$46$]!^0``
M`G2UR&7H3-\$#$Y=3G5.50``2.<X("1M``AX`"`*9@IP_TS?!!Q.74YU2BH`
M#&=<""H``@`,9PQ(>/__+PIA7E!/*``0*@`-2(!(P"\`3KD``!D&6$^(@`@J
M``$`#&<,+RH`"$ZY```5KEA/""H`!0`,9Q@O*@`23KD``!9T6$\O*@`23KD`
M`!6N6$]"DD*J``1"J@`(0BH`#"`$8(1.5?_^2.<X("1M``A!^O\R(\@````X
M""H`!``,9PIP_TS?!!Q.74YU""H``@`,9S0H$IBJ``@O!"\J``@0*@`-2(!(
MP"\`3KD``!:F3^\`#+"$9Q`(Z@`$``Q"DD*J``1P_V"\#*W_____``QF$`BJ
M``(`#$*20JH`!'``8*)*J@`(9@HO"DZY```4JEA/#&H``0`09C(;;0`/__](
M>``!2&W__Q`J``U(@$C`+P!.N0``%J9/[P`,L+P````!9I0@+0`,8`#_6B2J
M``@P*@`02,#0J@`()4``!`CJ``(`#"!24I(0+0`/$(!(@$C`P+P```#_8`#_
M*DY5``!(YS`@0?D```"\)$A**@`,9QS5_````!9!^0```G2UR&4*<`!,WP0,
M3EU.=6#>0I)"J@`$0JH`""`*8.A.5?_\2.<P("1M``A(>`0`3KD``!666$\K
M0/_\9AHU?``!`!`@"M"\````#B5```A,WP0,3EU.=35\!```$`CJ``$`#"5M
M__P`"!`J``U(@$C`+P!.N0``%@!83TJ`9P8`*@"```Q@R$Y5``!(YS`P)'D`
M```(8!8F4B`J``10@"\`+PI.N0``&HI03R1+(`IFYD*Y````"$S?#`Q.74YU
M3E4``$CG,"!!^O^^(\@````\0J<@+0`(4(`O`$ZY```:4%!/)$!*@&8*<`!,
MWP0,3EU.=22Y````""5M``@`!"/*````""`*4(!@X$Y5``!(YS``+RT`"&&F
M6$],WP`,3EU.=4Y5``!(YS`PE\LD>0````A@#B!M``A1B+'*9Q(F2B12(`IF
M[G#_3-\,#$Y=3G4@"V<$)I)@!B/2````""`J``10@"\`+PI.N0``&HI03W``
M8-1.50``2.<P('(&("T`"$ZY```99B1`U?D````<2JT`"&T4,#D```)T2,`B
M+0`(LH!L!$J29A0C_`````(```!`</],WP0,3EU.=7(&("T`"$ZY```99B!Y
M````'"\P"`!.N0``&=983TJ`9P1P`6`"<`!@SDY5``!(YS``+RT`"$ZY```9
MM%A/2H!F%DZY```9S"/`````0'#_3-\`#$Y=3G5P`&#T3E4``$CG/"`H+0`(
M3KD``!<\<@8@!$ZY```99B1`U?D````<2H1M$#`Y```"=$C`N(!L!$J29A0C
M_`````(```!`</],WP0\3EU.=3`J``3`?``#9@XC_`````4```!`</]@X"\M
M`!`O+0`,+Q).N0``&?Y/[P`,*@"PO/____]F$$ZY```9S"/`````0'#_8+(@
M!6"N3E7__$CG,`!(>!``0J=.N0``&OY03RM`__P(```,9QI*N0```!!F#"`M
M__Q,WP`,3EU.=4ZY```7>G``8.Y.50``2.<P`$AX``1(>@`H3KD``!GT+P!.
MN0``&?Y/[P`,2'@``4ZY```7M%A/3-\`#$Y=3G5>0PH`3E4``$CG,`!*N0``
M`#AG""!Y````.$Z0+RT`"$ZY```7X%A/3-\`#$Y=3G5.5?_\2.<X`"MM``C_
M_$JY````'&<V>`!@#"\$3KD``!D&6$]2A#`Y```"=$C`N(!MZ#`Y```"=,'\
M``8O`"\Y````'$ZY```:BE!/2KD````\9P@@>0```#Q.D$JY````1&<.+SD`
M``!$3KD``!HN6$]*N0```$AG#B\Y````2$ZY```:+EA/2KD```!,9PXO.0``
M`$Q.N0``&BY83RQX``0(+@`$`2EG%"\-2_H`"DZN_^(J7V`&0J?S7TYS2KD`
M```D9CA*N0```#1G+B\Y````,"\Y````-$ZY```:BE!/(#D````L4H#E@"\`
M+SD````H3KD``!J*4$]@%$ZY```:>B\Y````)$ZY```:U%A/("W__"YY````
M%$YU3-\`'$Y=3G5.50``2.<^("@M``AR!B`$3KD``!EF)$#5^0```!Q*A&T0
M,#D```)T2,"X@&P$2I)F%"/\`````@```$!P_TS?!'Q.74YU,"H`!,!\@`!F
M"B\23KD``!F*6$]"DG``8-Y(YW``-`'$P"8!2$/&P$A#0D/4@TA`P,%(0$)`
MT(),WP`.3G4B+P`$+'D````83N[_W"(O``0L>0```!A.[O^"(B\`!"QY````
M&$[N_SHB+P`$+'D````83N[_N"QY````&$[N_\HL>0```!A.[O]\(B\`!"QY
M````&$[N_RA,[P`&``0L>0```!A.[O_B+'D````83N[_Q$SO``X`!"QY````
M&$[N_]!(YP$$3.\@@``,+'D````,3J[_E$S?((!.=4[Y```:+B)O``0L>0``
M``Q.[OYB("\`!"QY````#$[N_K9.^0``&E!,[P`#``0L>0````Q.[O\Z3OD`
M`!IF(F\`!"QY````#$[N_MI.^0``&GHL>0````Q.[O]\3OD``!J*(F\`!"`O
M``@L>0````Q.[O\N("\`!"QY````#$[N_K`@;P`$+'D````,3N[^C"QY````
M#")O``0@+P`(3N[]V"QY````#$[N_W8B;P`$+'D````,3N[^AB)O``0@;P`(
M("\`#"QY````#$[N_EQ.^0``&OY,[P`#``0L>0````Q.[O[.(F\`!"`O``@L
M>0````Q.[OZ\("\`!"QY````#$[N_L(@;P`$+'D````,3N[^@$SO`P``!"QY
M````;$[N_Z`@;P`$+'D```!L3N[_IB!O``0L>0```&Q.[O^R```#[````!0`
M```!```!'````7````;V```&_@``!Y(```@.```()```#:8```ZT```/(@``
M$@8``!*\```2T@``%'0``!2(```6)```%M```!@(```8%```&2H```""````
M`````$8```!.````8````)H```"F````L@```,````#6````]@```2(```$T
M```!B````:X```'$```!^@```@@```(<```"*````C8```)$```"6````FP`
M``*.```"I````K8```/D```#\````_P```0(```$%```!"````0L```$0```
M!$P```2$```%L@``!>@```8&```&(@``!D(```9F```&@@``!HP```:B```&
MZ```!R8```<N```'^```"#````A(```(H```"+H```CL```(^```"1X```DN
M```)0```"4X```EH```)A@``"9````G>```*"@``"B8```HZ```+*@``"UX`
M``PP```,4```#&P```R0```,I@``#+H```S@```,[@``#/P```TT```-.@``
M#:````VX```.E@``#P0```_,```2$```$C(``!)<```3)```$SH``!-.```3
M6@``$[H``!/Z```4(@``%+P``!4````5,```%6@``!7V```6$```%E(``!9B
M```6@@``%HX``!:T```6O@``%Q8``!<J```73```%W(``!>,```7E```%Z(`
M`!?2```7_@``&"8``!A,```88@``&'@``!B\```8U@``&.```!CL```9&```
M&5H``!HJ```:3```&F(``!IV```:A@``&OH```"<`````@```%8```!H````
M<````'@```#(````[````/P```$"```!"````0X```$6```!T@```=X```)T
M```"?````H@```*6```"G@```JP```.F```#O@```]````24```&'```!BP`
M``8\```&3```!E0```9@```&<```!GP```:P```&Q@``!M8```<4```'&@``
M!R````=,```'9@``!W0```>&```'F```![````>Z```'Y```"#@```A0```(
M6```"&(```AN```(>@``"(````B,```(D@``",@```C.```(V@``"0````D&
M```)$@``"28```DV```).@``"48```E4```)<```"7H```F````)T```"=@`
M``GF```*!```"AX```HT```*1```"DH```L0```+'@``"S(```LZ```+1@``
M"U(```ML```+>```#'0```SV```-!```$X0``!4<```5/@``%5@``!6````5
MC```%;H``!7F```6&```%CP``!98```6E```%L8``!;D```7`@``%S```!=>
M```7O@``%\8``!?P```8(```&"X``!@V```8/@``&$8``!A4```87```&&H`
M`!AR```8H```&*@``!BP```8M@``&,0``!C0```8Y@``&/@``!D@```9/@``
M&9```!F>```9K```&;H``!G$```9S@``&=P``!GL```9]@``&@8``!H:```:
M-```&D(``!I8```:;```&GP``!J4```:H@``&K```!JZ```:S```&MH``!KP
M```;!@``&Q@``!LF```;-```&T0``!M2```;8`````````/R```#Z@```)X`
M``!0````!`````P````2````%P```!T````D````*@```"\````U,#$R,S0U
M-C<X.6%B8V1E9@```"`@("`@("`@(#`P,#`P("`@("`@("`@("`@("`@("`@
MD$!`0$!`0$!`0$!`0$!`0`P,#`P,#`P,#`Q`0$!`0$!`"0D)"0D)`0$!`0$!
M`0$!`0$!`0$!`0$!`0%`0$!`0$`*"@H*"@H"`@("`@("`@("`@("`@("`@("
M`D!`0$`@``````````````````$``````0`````````````````````!`0``
M``$``````````````````````0(````!````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````!0`
M`````^P````!`````@`````````)``````````0````(````#````!`````4
D````&````!P````@````)`````````/R```#ZP```%P```/R
`
end
!Funky!Stuff!
fi  # end of overwriting check
exit 0
#	End of shell archive