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+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