dillon@CORY.BERKELEY.EDU (Matt Dillon) (05/11/87)
Again, a very *small* program which I wrote to fool around with B-SPLINES. Note that there are some cosmetic errors, and the 'add point' routine isn't perfect (but these little programs are just splurges on my part so don't bother to mail me the bugs you find). -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: # bspline.c # bspline.uue # This archive created: Sun May 10 20:18:36 1987 export PATH; PATH=/bin:/usr/bin:$PATH echo shar: "extracting 'bspline.c'" '(9256 characters)' if test -f 'bspline.c' then echo shar: "will not over-write existing file 'bspline.c'" else cat << \!Funky!Stuff! > 'bspline.c' /* * BSPLINE.C * * Matthew Dillon. * Public Domain (no Copyrights whatsoever) * * -Assumes AZTEC compilation, +L (32 bit ints), with all AMIGA symbols * precompiled. Additionally expects certain typedefs and routines * found in MY.LIB, as well as some MY.LIB #include files. * * An experienced programmer can remove the MY.LIB dependancies * (openlibs() call), and figure out what typedefs have been assumed if * he wishes to compile the program. You can also simply extract the * Bezier functions for your own use. * * BSPLINE EQUATIONS: * * c(t) = T(t)BP * * T(t) = (t^3 t^2 t 1) P= ( Pi-1 ) * B = ( -1 3 -3 1 ) ( Pi ) * ( 3 -6 3 0 ) ( Pi+1 ) * ( -3 0 3 0 ) ( Pi+2 ) * ( 1 4 1 0 ) * * t: range 0 to 1 * C: coordinate matrix 1xD matrix (D = dimensions) * B: Bspline matrix 4x4 * P: Ctrl. Point matrix 4xD matrix (D = dimensions) * * using D = 2. For B-Spline, must loop through all control points * beginning at Pi+1 and ending at Pend-2 */ #include <typedefs.h> #include <xmisc.h> #define SHIFTS 9 #define ONE (1<<SHIFTS) #define MAXPTS 256 /* Maximum # of bspline points allowed */ typedef struct PropInfo XPI; typedef struct Image IM; extern IMESS *GetMsg(); #define MYGADGETS (WINDOWSIZING|WINDOWDRAG|WINDOWDEPTH|WINDOWCLOSE) NW Nw = { 64, 64, 320, 100, 0, 1, NEWSIZE|MOUSEBUTTONS|MOUSEMOVE|CLOSEWINDOW|GADGETDOWN|GADGETUP|MENUPICK, MYGADGETS|REPORTMOUSE|ACTIVATE|NOCAREREFRESH, 0, 0, (UBYTE *)"Bspline, By Matthew Dillon", NULL, NULL, 32, 64, -1, -1, WBENCHSCREEN }; WIN *Win; RP *Rp; short Ux, Uy, Lx, Ly; short Step = 128; short Display = 1; short Pts[MAXPTS+1][2], Npts; main(ac, av) char *av[]; { register IMESS *mess; short notdone = 1; short pt = -1; char mode = 0; /* 0=move pts, 1=add pts, 2=del pts */ short gy, gg = 0; XPI *po; init_gadgets(&Nw, &po); exiterr(!openlibs(INTUITION_LIB|GRAPHICS_LIB), "unable to open libs"); exiterr(!(Win = OpenWindow(&Nw)), "unable to open window"); init_menu(Win); Rp = Win->RPort; SetAPen(Rp, 3); SetDrMd(Rp, COMPLEMENT); setpoint(Pts, 0, 32, 32); setpoint(Pts, 1, 40, 40); setpoint(Pts, 2, 100, 50); setpoint(Pts, 3, 200, 60); Npts = 4; setbounds(Pts, Npts); while (notdone) { short mx, my, mm = 0; WaitPort(Win->UserPort); while (mess = GetMsg(Win->UserPort)) { switch(mess->Class) { case CLOSEWINDOW: notdone = 0; break; case NEWSIZE: setbounds(Pts, Npts); break; case GADGETUP: case GADGETDOWN: { gg = mess->Class; gy = po->VertPot / 256; } break; case MOUSEBUTTONS: switch(mess->Code) { case SELECTDOWN: pt = getpoint(Pts, Npts, mess->MouseX, mess->MouseY); switch(mode) { case 0: mm = 1; mx = mess->MouseX; my = mess->MouseY; goto break2; case 1: if (pt < 0) pt = 0; if (Npts != MAXPTS) { bmov(Pts[pt], Pts[pt+1], (Npts-pt)*sizeof(Pts[0])); Pts[pt][0] = mess->MouseX; Pts[pt][1] = mess->MouseY; ++Npts; } break; case 2: if (pt >= 0 && pt < Npts) { bmov(Pts[pt+1], Pts[pt], (Npts-pt)*sizeof(Pts[0])); --Npts; } break; } clearall(); drawcurve(Pts, Npts); drawpoints(Pts, 0, Npts); break; case SELECTUP: pt = -1; break; } break2: break; case MENUPICK: switch(MENUNUM(mess->Code)) { case 0: mode = ITEMNUM(mess->Code); break; case 1: drawpoints(Pts, 0, Npts); Display = ITEMNUM(mess->Code); /* 0=cross 1=nums */ drawpoints(Pts, 0, Npts); } break; case MOUSEMOVE: if (gg == GADGETDOWN) { gy = po->VertPot / 256; break; } if (mode == 0 || mode == 1) { mm = 1; mx = mess->MouseX; my = mess->MouseY; } break; default: break; } ReplyMsg(mess); } if (mm && pt >= 0) { register int i; register int n; i = (pt - 3 < 0) ? 0 : pt - 3; n = (i + 7 > Npts) ? Npts - i : 7; drawpoints(Pts, pt, pt+1); drawcurve(&Pts[i], n); setpoint(Pts, pt, mx, my); drawcurve(&Pts[i], n); drawpoints(Pts, pt, pt+1); } if (gg) { char buf[32]; if (gg == GADGETUP) gg = 0; if (gy + 1 >= 0 && gy + 1 != Step) { Step = gy + 1; sprintf(buf, "gran: %4ld/%ld", Step, ONE); clearall(); drawcurve(Pts, Npts); drawpoints(Pts, 0, Npts); Move(Rp, Ux + 1, Uy + 16); Text(Rp, buf, strlen(buf)); } } } exiterr(1, NULL); } exiterr(n, str) char *str; { if (n) { if (str) puts(str); if (Win) { uninit_menu(Win); CloseWindow(Win); } closelibs(-1); exit(1); } } setbounds(a, na) register long *a; { Ux = Win->BorderLeft; Uy = Win->BorderTop; Lx = Win->Width - Win->BorderRight; Ly = Win->Height- Win->BorderBottom + 1; clearall(); drawcurve(a, na); drawpoints(a, 0, na); } setpoint(a, pt, x, y) register short a[4][2]; { a[pt][0] = x; a[pt][1] = y; } getpoint(a, na, x, y) register short a[][2]; { register short i, bi; register long r, br; for (i = bi = 0, br = 0x7FFFFFFF; i < na; ++i) { r = (x-a[i][0])*(x-a[i][0]) + (y-a[i][1])*(y-a[i][1])*3; if (r < br) { bi = i; br = r; } } return(bi); } clearall() { SetAPen(Rp, 0); SetDrMd(Rp, JAM2); RectFill(Rp, Ux, Uy, Lx - 1, Ly - 1); SetAPen(Rp, 3); SetDrMd(Rp, COMPLEMENT); } #define S10(x) ((x) >> SHIFTS) #define S20(x) ((x) >> (2*SHIFTS)) /* * So I can use integer arithmatic, I am defining 512 as 1 (as far * as the mathematics go), which means that I must divide any power * multiplication by 512^(n-1). E.G. .5^2 = .25 ... to make 256^2 * equal 128, I must divide by 512^1 */ static short Array[ONE+4][2]; /* hold points to plot */ drawcurve(a, na) register short a[][2]; { long mr[4]; register short n, i, t; long tt, ttt; short last; for (i = 1; i < na - 2; ++i) { for (t = n = last = 0; t <= ONE; t += Step) { oncemore: tt = t * t; ttt= tt* t; mr[0] = -S20(ttt/6) + S10(tt/2) - t/2 + ONE/6; mr[1] = S20(ttt/2) - S10(tt) + ONE*2/3; mr[2] = -S20(ttt/2) + S10(tt/2) + t/2 + ONE/6; mr[3] = S20(ttt/6); Array[n][0] = (mr[0] * a[i-1][0] + mr[1] * a[i][0] + mr[2] * a[i+1][0] + mr[3] * a[i+2][0]) >> SHIFTS; Array[n][1] = (mr[0] * a[i-1][1] + mr[1] * a[i][1] + mr[2] * a[i+1][1] + mr[3] * a[i+2][1]) >> SHIFTS; if (++n == ONE + 4) { --n; puts("software error: OVERFLOW"); } } if (last == 0 && t > ONE) { t = ONE; last = 1; goto oncemore; } Move(Rp, Array[0][0], Array[0][1]); PolyDraw(Rp, n, Array); } } drawpoints(a, is, ie) register short a[][2]; { register short i; for (i = is; i < ie; ++i) { if (Display) { char buf[32]; Move(Rp, a[i][0], a[i][1]); Draw(Rp, a[i][0], a[i][1]); Move(Rp, a[i][0] - 16, a[i][1] + 4); sprintf(buf, "%ld", i); Text(Rp, buf, strlen(buf)); } else { Move(Rp, a[i][0] - 2, a[i][1]); Draw(Rp, a[i][0] + 2, a[i][1]); Move(Rp, a[i][0], a[i][1] - 2); Draw(Rp, a[i][0], a[i][1] + 2); } } } /* * GADGET ROUTINES! ------------------------------------------------ */ #define NG(nn) &Gadgets[nn+1] #define G_YGLOB 1 #define G_XGLOB 2 XPI Props[] = { { AUTOKNOB|FREEVERT , 0, 0, 0x1FFF, 0x1FFF } }; IM Images[] = { { 0,0,2,1,1, NULL, 1, 0, NULL }, }; GADGET Gadgets[] = { { NULL, -15, 11, 15, -19, GADGIMAGE|GADGHCOMP|GRELRIGHT|GRELHEIGHT, GADGIMMEDIATE|RIGHTBORDER|RELVERIFY,PROPGADGET, (APTR)&Images[0],NULL,NULL,0,(APTR)&Props[0], G_YGLOB, 0 }, }; GADGET *Gc; long GUx, GUy; init_gadgets(nw, ppo) NW *nw; XPI **ppo; { nw->FirstGadget = &Gadgets[0]; *ppo = &Props[0]; } /* * MENU ROUTINES! ----------------------------------------------------- */ ITEXT Itext[] = { { 0,1,JAM2,0,0,NULL,(UBYTE *)" Move", NULL }, { 0,1,JAM2,0,0,NULL,(UBYTE *)" Add", NULL }, { 0,1,JAM2,0,0,NULL,(UBYTE *)" Delete",NULL }, { 0,1,JAM2,0,0,NULL,(UBYTE *)" Cross", NULL }, { 0,1,JAM2,0,0,NULL,(UBYTE *)" Number",NULL } }; MENUITEM Item0[] = { { &Item0[1], 0, 0, 8*11, 8, CHECKIT|ITEMENABLED|COMMSEQ|HIGHCOMP|ITEMTEXT, 0xFE, (APTR)&Itext[0], NULL, 'M', NULL, NULL }, { &Item0[2], 0, 8, 8*11, 8, CHECKIT|ITEMENABLED|COMMSEQ|HIGHCOMP|ITEMTEXT, 0xFD, (APTR)&Itext[1], NULL, 'A', NULL, NULL }, { NULL, 0,16, 8*11, 8, CHECKIT|ITEMENABLED|COMMSEQ|HIGHCOMP|ITEMTEXT, 0xFB, (APTR)&Itext[2], NULL, 'D', NULL, NULL } }; MENUITEM Item1[] = { { &Item1[1], 0, 0, 8*11, 8, CHECKIT|ITEMENABLED|COMMSEQ|HIGHCOMP|ITEMTEXT, 0xFE, (APTR)&Itext[3], NULL, 'C', NULL, NULL }, { NULL , 0, 8, 8*11, 8, CHECKIT|ITEMENABLED|COMMSEQ|HIGHCOMP|ITEMTEXT, 0xFD, (APTR)&Itext[4], NULL, 'N', NULL, NULL } }; MENU Menu[] = { { &Menu[1], 0, 0,8*11, 8, MENUENABLED, "Control", &Item0[0] }, { NULL , 8*11,0,8*11, 8, MENUENABLED, "Display", &Item1[0] } }; init_menu(win) WIN *win; { SetMenuStrip(win, &Menu[0]); } uninit_menu(win) WIN *win; { ClearMenuStrip(win); } !Funky!Stuff! fi # end of overwriting check echo shar: "extracting 'bspline.uue'" '(13690 characters)' if test -f 'bspline.uue' then echo shar: "will not over-write existing file 'bspline.uue'" else cat << \!Funky!Stuff! > 'bspline.uue' begin 644 bspline M```#\P`````````#``````````(```@J```$6`````$```/I```(*D[Z#H)" M<W!L:6YE+"!">2!-871T:&5W($1I;&QO;@``3E7_S$CG#"`[?``!__X[?/__ M__Q"+?_[0FW_]DAM__)(;(`"3KH+W%!/2'H%<$AX``-.N@V@6$]*@&8$<`%@ M`G``2,`O`$ZZ!8Y03TAZ!6)(;(`"3KH@&%A/*4"-"&8$<`%@`G``2,`O`$ZZ M!6I03R\LC0A.N@OB6$\@;(T(*6@`,HT,2'@``R\LC0Q.NA]H4$](>``"+RR- M#$ZZ'VI03TAX`"!(>``@0J=(;(U<3KH%^$_O`!!(>``H2'@`*$AX``%(;(U< M3KH%X$_O`!!(>``R2'@`9$AX``)(;(U<3KH%R$_O`!!(>``\2'@`R$AX``-( M;(U<3KH%L$_O`!`Y?``$C08P+(T&2,`O`$ALC5Q.N@404$]*;?_^9P`$;D)M M_^P@;(T(+R@`5DZZ'G)83R!LC0@O*`!63KH>(EA/)$!*@&<``JP@*@`48``" M7D)M__Y@``*0,"R-!DC`+P!(;(U<3KH$OE!/8``">CMJ`!;_]B!M__)P`#`H M``3@B#M`__A@``)@<``P*@`88``!7#`J`")(P"\`,BH`($C!+P$T+(T&2,(O M`DALC5Q.N@4F3^\`$#M`__P0+?_[2(!(P&```.([?``!_^P[:@`@__`[:@`B M_^Y@``$D2FW__&P$0FW__`QL`0"-!F=D,"R-!DC`,BW__$C!D('E@"\`-"W_ M_$C"4H+E@D'LC5S4B"\"-BW__$C#Y8-#[(U<UHDO`TZZ"EY/[P`,,"W__$C` MY8!![(U<,:H`(`@`,"W__$C`Y8!![(U>,:H`(@@`4FR-!F!B2FW__&U*,"W_ M_+!LC09L0#`LC09(P#(M__Q(P9"!Y8`O`#0M__Q(PN6"0>R-7-2(+P(V+?_\ M2,-2@^6#0^R-7-:)+P-.N@GH3^\`#%-LC09@$$J`9P#_'%.`9P#_+%.`9YY. MN@2\,"R-!DC`+P!(;(U<3KH%&E!/,"R-!DC`+P!"ITALC5Q.N@=Z3^\`#&`: M.WS____\8!*0O````&AG`/Z>D+P```"`9^9@``#F<``P*@`8P+P````?8%1P M`#`J`!CJB,"\````/QM`__M@2#`LC09(P"\`0J=(;(U<3KH'(D_O``QP`#`J M`!CJB,"\````/SE`@#0P+(T&2,`O`$*G2&R-7$ZZ!OI/[P`,8`A*@&>H4X!G MN&!X#&T`(/_V9A(@;?_R<``P*``$X(@[0/_X8%Y*+?_[9P@,+0`!__MF$CM\ M``'_[#MJ`"#_\#MJ`"+_[F`\8#I5@&<`_:A=@&<`_=)1@&>RD+P````09P#] MJI"\````(&<`_:"0O````,!G`/\JD+P```$`9P#];F#$+PI.NAN86$]@`/U" M2FW_[&<``,A*;?_\;0``P#`M__Q(P%>`2H!L!'``8`@P+?_\2,!7@"@`(`1> M@#(LC09(P;"!;PHP+(T&2,"0A&`"<`<J`#`M__Q(P%*`+P`R+?_\2,$O`4AL MC5Q.N@8&3^\`#"\%(`3E@$'LC5S0B"\`3KH#?%!/,"W_[DC`+P`R+?_P2,$O M`30M__Q(PB\"2&R-7$ZZ`B)/[P`0+P4@!.6`0>R-7-"(+P!.N@-$4$\P+?_\ M2,!2@"\`,BW__$C!+P%(;(U<3KH%G$_O``Q*;?_V9P``P@QM`$#_]F8$0FW_ M]C`M__A(P%*`2H!M``"H,BW_^$C!4H$T+(`R2,*R@F<``)0P+?_X2,!2@#E` M@#)(>`(`,"R`,DC`+P!(>@"X2&W_S$ZZ#@Y/[P`03KH"5#`LC09(P"\`2&R- M7$ZZ`K)03S`LC09(P"\`0J=(;(U<3KH%$D_O``PP+(T`2,`@0$AH`!`R+(S^ M2,%2@2\!+RR-#$ZZ&EQ/[P`,2&W_S$ZZ$I)83R\`2&W_S"\LC0Q.NAJ63^\` M#&``^XY"ITAX``%A1%!/3-\$,$Y=3G5U;F%B;&4@=&\@;W!E;B!L:6)S`'5N M86)L92!T;R!O<&5N('=I;F1O=P!G<F%N.B`E-&QD+R5L9```3E4``$JM``AG M/DJM``QG"B\M``Q.N@Q&6$]*K(T(9Q0O+(T(3KH&<EA/+RR-"$ZZ&EQ83TAX M__].N@;N6$](>``!3KH7!%A/3EU.=4Y5```O"B1M``@@;(T($"@`-DB`.4", M_B!LC0@0*``W2(`Y0(T`(&R-"#`H``A(P")LC0@2*0`X2(%(P9"!.4"-`B!L MC0@P*``*2,`B;(T($BD`.4B!2,&0@5*`.4"-!$ZZ`.XO+0`,+PI.N@%24$\O M+0`,0J<O"DZZ`[A/[P`,)%].74YU3E4``"\*)&T`""`M``SE@#6M`!((`"`M M``SE@"!`T<HQ;0`6``(D7TY=3G5.50``2.</("1M``AZ`#@%+CQ_____8'`@ M+0`4,@1(P>6!($'1RC(H``)(P9"!(BT`%#0$2,+E@B)"T\HT*0`"2,*2@DZZ M%V!R`TZZ%UHO`"`M`!`V!$C#Y8,T,C@`2,*0@B(M`!`V!$C#Y8,T,C@`2,*2 M@DZZ%S`L7RP.W("\AVP$.@0N!E)$,`1(P+"M``QMAC`%2,!,WP3P3EU.=4Y5 M``!"IR\LC0Q.NAAX4$](>``!+RR-#$ZZ&'I03S`LC01(P%.`+P`R+(T"2,%3 M@2\!-"R-`$C"+P(V+(S^2,,O`R\LC0Q.NA@J3^\`%$AX``,O+(T,3KH8+%!/ M2'@``B\LC0Q.NA@N4$].74YU3E7_YDCG#B`D;0`(>@%@``(R0FW_YG@`/`1@ M``'0,`;!QBM`_^PP!DC`(BW_[$ZZ%FHK0/_H<@8@+?_H3KH//'02Y*!$@'(" M+P`@+?_L3KH/*G8)YJ`@7]'`,`9(P'("3KH/&)'`T?P```!5*TC_\'("("W_ MZ$ZZ#P)T$N2@)BW_['0)Y*.0@]"\```!52M`__0P!DC`<@).N@[@<@(O`"`M M_^A.N@[4=!+DH$2`)A_6@'("("W_[$ZZ#L!T">2@UH#6O````%4K0__X<@8@ M+?_H3KH.IG02Y*`K0/_\,`5(P%.`Y8`B`#`R&`!(P"(M__!.NA6F-`5(PN6" M+P`P,B@`2,`B+?_T3KH5D"8?UH`T!4C"4H+E@C`R*`!(P"(M__A.NA5VUH`T M!4C"5(+E@C`R*`!(P"(M__Q.NA5>UH!T">2C-`1(PN6"0>R$KC&#*``P!4C` M4X#E@"!`T<HP*``"2,`B+?_P3KH5,#0%2,+E@B)"T\HO`#`I``)(P"(M__1. MNA46)!_4@#8%2,-2@^6#+$/=RC`N``)(P"(M__A.NA3XU(`V!4C#5(/E@RQ# MW<HP+@`"2,`B+?_\3KH4W-2`=@GFHC8$2,/E@TWLA+`]@C@`4D2X?`($9@Q3 M1$AZ`'I.N@AN6$_<;(`RO'P"`&\`_BQ*;?_F9A2\?`(`;PX\/`(`.WP``?_F M8`#^$C`LA+!(P"\`,BR$KDC!+P$O+(T,3KH5O$_O``Q(;(2N,`1(P"\`+RR- M#$ZZ%;A/[P`,4D4P!4C`(BT`#%6!L(%M`/W"3-\$<$Y=3G5S;V9T=V%R92!E M<G)O<CH@3U9%4D9,3U<``$Y5_^!(YP@@)&T`"#@M``Y@``&$2FR`-&<``,(P M!$C`Y8`@0-'*,"@``DC`+P`R!$C!Y8$T,A@`2,(O`B\LC0Q.NA4J3^\`##`$ M2,#E@"!`T<HP*``"2,`O`#($2,'E@30R&`!(PB\"+RR-#$ZZ%.Q/[P`,,`1( MP.6`($#1RC`H``)(P%B`+P`R!$C!Y8$T,A@`2,(B0DAI__`O+(T,3KH4S$_O M``PP!$C`+P!(>@#\2&W_X$ZZ"!I/[P`,2&W_X$ZZ#.Q83R\`2&W_X"\LC0Q. MNA3P3^\`#&```+HP!$C`Y8`@0-'*,"@``DC`+P`R!$C!Y8$T,A@`2,)5@B\" M+RR-#$ZZ%&A/[P`,,`1(P.6`($#1RC`H``)(P"\`,@1(P>6!-#(8`$C"5((O M`B\LC0Q.NA0H3^\`##`$2,#E@"!`T<HP*``"2,!5@"\`,@1(P>6!-#(8`$C" M+P(O+(T,3KH4#$_O``PP!$C`Y8`@0-'*,"@``DC`5(`O`#($2,'E@30R&`!( MPB\"+RR-#$ZZ$\Q/[P`,4D0P!$C`L*T`$&T`_G1,WP003EU.=25L9`!.50`` M0>R`8")M``@C2``20>R`-B)M``PBB$Y=3G4@($UO=F4`("!!9&0`("!$96QE M=&4`("!#<F]S<P`@($YU;6)E<@``0V]N=')O;`!$:7-P;&%Y`$Y5``!(;(&: M+RT`"$ZZ%!103TY=3G5.50``+RT`"$ZZ$]Y83TY=3G5,[P,```0@+P`,0@$" M+P`#``]F$`(O``,`!V8(`B\``P`+5\&SR&<<;RS1P-/`2@%G%N2(8`(C(%'( M__R0O``!``!J\DYU$R!1R/_\D+P``0``:O).=4H!9Q;DB&`"(MA1R/_\D+P` M`0``:O).=1+84<C__)"\``$``&KR3G5.50``2.<((#@M``I!^0```=0D2&`F M"`0``&<<(&H`!$J09Q0@:@`$+Q!.N0``'SI83R!J``1"D.),4(I*1&<$2I)F MTDS?!!!.74YU9W)A<&AI8W,`:6YT=6ET:6]N`&5X<&%N<VEO;@!D:7-K9F]N M=`!T<F%N<VQA=&]R`&EC;VX`;6%T:&9F<`!M871H=')A;G,`;6%T:&EE965D M;W5B8F%S`&UA=&AI965E<VEN9V)A<P!L87EE<G,`8VQI<W0`<&]T9V\`=&EM M97(`>#$U`'@Q-@``3E7_O"\*<``P+0`**T#_O$'Y```!U"1(8$H(+0````MG M/"\22&W_P$ZY```20E!/2'H`5$AM_\!.N0``$AA03R!J``1*D&860J=(;?_` M3KD``!^,4$\@:@`$((!G&.+M``I0BDIM``IG!$J29JQP`21?3EU.=2\M_[Q. MN0``#1Y83W``8.HN;&EB<F%R>0``87!#[(2N1>R$KK7)9@XR/`,L:PAT`"+" M4<G__"E/C,8L>``$*4Z,RDCG@(`(+@`$`2EG$$OZ``A.KO_B8`9"I_-?3G-# M^@`@3J[^:"E`C,YF#"X\``.`!TZN_Y1@!$ZZ`!I03TYU9&]S+FQI8G)A<GD` M2?D``'_^3G5.50``+PI(>0`!```P+(2JP?P`!B\`3KH0-%!/*4",TF840J=( M>0`!``!.N@_X4$\N;(S&3G4@;(S20F@`!"!LC-(Q?``!`!`B;(S2,WP``0`* M(&R,QB`LC,:0J``$4(`I0(S6(&R,UB"\34%.6$*G3KH/Z%A/)$!*J@"L9S`O M+0`,+RT`""\*3KH`M$_O``PI?`````&,VB!LC-(`:(````0@;(S2`&B````* M8$1(:@!<3KH0$%A/2&H`7$ZZ#\183RE`C-X@;(S>2J@`)&<0(&R,WB)H`"0O M$4ZZ#O!83R\LC-XO"DZZ`JI03RELC-Z,XDZZ#O`@;(S2((!.N@\0(&R,TB%` M``9G%DAX`^U(>@`L3KH.[%!/(&R,TB%```PO+(SB+RR,YDZZ[_A03T*G3KH- M#EA/)%].74YU*@!.50``2.<,,"1M`!`@;0`(("@`K.6`*``@1"`H`!#E@"9` M$!-(@$C`T*T`#%2`*4",ZD*G+RR,ZDZZ#M103RE`C.YF"$S?##!.74YU$!-( M@$C`+P`@2U*(+P@O+(SN3KH!6D_O``Q(>@%0$!-(@$C`T*R,[B\`3KH!CE!/ M+RT`#"\*+RR,[DZZ`5I/[P`,0JR,YB9LC.XD2Q`32(!(P"H`L+P````@9R"Z MO`````EG&+J\````#&<0NKP````-9PBZO`````IF!%*+8,P,$P`@;0``C`P3 M`")F,E*+($M2BQ`02(!(P"H`9R`@2E**$(6ZO````")F$`P3`")F!%*+8`9" M*O__8`)@TF!$($M2BQ`02(!(P"H`9S"ZO````"!G*+J\````"6<@NKP````, M9QBZO`````UG$+J\````"F<(($I2BA"%8,(@2E**0A!*A68"4XM2K(SF8`#_ M/$(20J<@+(SF4H#E@"\`3KH-H%!/*4",XF8(0JR,YF``_L9Z`"9LC.Y@&B`% MY8`@;(SB(8L(`"\+3KH&3EA/4H#7P%*%NJR,YFW@(`7E@"!LC.)"L`@`8`#^ MCB``3.\#```$(`@B+P`,8`(0V5?)__QG!E)!8`)"&%')__Q.=3`\?_]@!#`O M``X@;P`$2AAF_%-((F\`"%-`$-E7R/_\9P)"$"`O``1.=2!O``0@"")O``@0 MV6;\3G5.50``+PHD;0`(2A)G)"!*4HH0$$B`2,`O`$ZZ!<983["\_____V8( M</\D7TY=3G5@V$AX``I.N@6J6$]@[$Y5``!(YPXP)&T`"$*G2'H`CDZZ#.Q0 M3RE`C3!F"$S?#'!.74YU(&T`#")H`"0O*0`$3KH-IEA/*`!G4DAZ`&T@1"\H M`#9.N@UX4$\F0$J`9S1(>`/M+PM.N@P44$\L`&<D(`;E@"H`($4E:``(`*0E M1@"<2'@#[4AZ`#A.N@OP4$\E0`"@+P1.N@U$6$\O+(TP3KH,%EA/0JR-,&"` M:6-O;BYL:6)R87)Y`%=)3D1/5P`J`$Y5```O!"EM``B,ODAM`!`O+0`,2'H` M&DZZ`+Q/[P`,*``@;(R^0A`@!"@?3EU.=4Y5```@;(R^4JR,OA`M``L0@$B` M2,#`O````/].74YU3E4``$CG""`D;0`0#*T````$`!1F""!M``@H$&`42JT` M#&\((&T`""@08`8@;0`(*!!"K0`42JT`#&P21*T`#$J$;`I$A"M\`````0`4 M(BT`#"`$3KH#TD'L@EY3BA2P"``B+0`,(`1.N@/**`!FWDJM`!1G!E.*%+P` M+2`*3-\$$$Y=3G5.5?\42.<(,"1M``@F;0`,0JW_^"MM`!#__"!+4HL0$$B` M2,`H`&<``S"XO````"5F``,*0BW_(BM\`````?_T*WP````@__`K?```)Q#_ M["!+4HL0$$B`2,`H`+"\````+6800JW_]"!+4HL0$$B`2,`H`+B\````,&84 M*WP````P__`@2U*+$!!(@$C`*`"XO````"IF&B!M__Q8K?_\*U#_Z"!+4HL0 M$$B`2,`H`&`T0JW_Z&`B<@H@+?_H3KH)P-"$D+P````P*T#_Z"!+4HL0$$B` M2,`H`$'L@G$(,``"2`!FTKB\````+F9B($M2BQ`02(!(P"@`L+P````J9AH@ M;?_\6*W__"M0_^P@2U*+$!!(@$C`*`!@-$*M_^Q@(G(*("W_[$ZZ"5;0A)"\ M````,"M`_^P@2U*+$!!(@$C`*`!![()Q"#```D@`9M(K?`````3_Y+B\```` M;&86($M2BQ`02(!(P"@`*WP````$_^1@%+B\````:&8,($M2BQ`02(!(P"@` M(`1@?BM\````"/_@8!PK?`````K_X&`2*WP````0_^!@""M\____]O_@+RW_ MY$AM_R(O+?_@+RW__$ZZ_;1/[P`0*T#_W"`M_^31K?_\8%H@;?_\6*W__"M0 M_]PO+?_<3KH"'%A/*T#_Y&!*(&W__%BM__PH$$'M_R$K2/_<$(1@*)"\```` M8V?B4X!GE)"\````"V<`_VY9@&>T58!G`/]N5X!G`/]R8,Q![?\BD>W_W"M( M_^0@+?_DL*W_[&\&*VW_[/_D2JW_]&=P(&W_W`P0`"UG"B)M_]P,$0`K9C0, MK0```##_\&8J4ZW_Z"!M_]Q2K?_<$!!(@$C`+P!.DEA/L+S_____9@IP_TS? M#!!.74YU8!@O+?_P3I)83["\_____V8$</]@XE*M__@@+?_H4ZW_Z+"M_^1N MVD*M_^!@)"!M_]Q2K?_<$!!(@$C`+P!.DEA/L+S_____9@1P_V"J4JW_X"!M M_]Q*$&<*("W_X+"M_^QMRB`M_^#1K?_X2JW_]&8J8!I(>``@3I)83["\____ M_V8&</]@`/]P4JW_^"`M_^A3K?_HL*W_Y&[88!@O!$Z26$^PO/____]F!G#_ M8`#_2%*M__A@`/S$("W_^&``_SA(YT@`0H1*@&H$1(!21$J!:@9$@0I$``%A M/DI$9P)$@$S?`!)*@$YU2.=(`$*$2H!J!$2`4D1*@6H"1(%A&B`!8-@O`6$2 M(`$B'TJ`3G4O`6$&(A]*@$YU2.<P`$A!2D%F($A!-@$T`$)`2$"`PR(`2$`R M`H+#,`%"04A!3-\`#$YU2$$F`2(`0D%(04A`0D!T#]"`TX&V@6($DH-20%'* M__),WP`,3G4@;P`$(`A*&&;\D<`@"%.`3G5.50``2&R#""\M``A.N@`(4$]. M74YU3E4``"\$*"T`""\M``PO!$ZZ`#103[B\````"F8F(&T`#!`H``Q(@$C` M"```!V<42'C__R\M``Q.N@#^4$\H'TY=3G5@^$Y5```O"B1M``P@4K'J``1E M&B`M``C`O````/\O`"\*3KH`T%!/)%].74YU(%)2DA`M``L0@$B`2,#`O``` M`/]@Y$Y5```O"D'L@O(D2"!*U?P````6+PAA$%A/0>R$JK7(9>HD7TY=3G5. M50``2.<(("1M``AX`"`*9@IP_TS?!!!.74YU2BH`#&=4""H``@`,9PQ(>/__ M+PIA5E!/*``0*@`-2(!(P"\`3KH%"%A/B(`(*@`!``QG"B\J``A.N@(\6$\( M*@`%``QG%"\J`!).N@+86$\O*@`23KH"(%A/0I)"J@`$0JH`"$(J``P@!&", M3E7__DCG""`D;0`(0?K_0BE(C/((*@`$``QG"G#_3-\$$$Y=3G4(*@`"``QG M,B@2F*H`""\$+RH`"!`J``U(@$C`+P!.N@*63^\`#+"$9Q`(Z@`$``Q"DD*J M``1P_V"^#*W_____``QF$`BJ``(`#$*20JH`!'``8*1*J@`(9@@O"DZZ`*18 M3PQJ``$`$&8P&VT`#___2'@``4AM__\0*@`-2(!(P"\`3KH",D_O``RPO``` M``%FF"`M``Q@`/]@)*H`"#`J`!!(P-"J``@E0``$".H``@`,(%)2DA`M``\0 M@$B`2,#`O````/]@`/\P3E4``"\*0>R"\B1(2BH`#&<8U?P````60>R$JK7( M90AP`"1?3EU.=6#B0I)"J@`$0JH`""`*8.I.5?_\+PHD;0`(2'@$`$ZZ`,)8 M3RM`__QF\``$`$"`*T+P````.)4``""1?3EU.=35\!```$`CJ``$`#"5M M__P`"!`J``U(@$C`+P!.N@#>6$]*@&<&`"H`@``,8,Q.50``2.<`,"1LC,)@ M%"92("H`!%"`+P`O"DZZ!$903R1+(`IFZ$*LC,),WPP`3EU.=4Y5```O"D'Z M_\8I2(SV0J<@+0`(4(`O`$ZZ`_103R1`2H!F"'``)%].74YU)*R,PB5M``@` M!"E*C,(@"E"`8.9.50``+RT`"&&V6$].74YU3E4``$CG`#"7RR1LC,)@#B!M M``A1B+'*9Q(F2B12(`IF[G#_3-\,`$Y=3G4@"V<$)I)@!"E2C,(@*@`$4(`O M`"\*3KH#G%!/<`!@V$Y5```O"G(&("T`"$ZZ`K0D0-7LC-)*K0`(;1(P+(2J M2,`B+0`(LH!L!$J29A`I?`````*,^G#_)%].74YU<@8@+0`(3KH"?"!LC-(O M,`@`3KH"R%A/2H!G!'`!8`)P`?E4``"\M``A.N@*26$]*@&8.3KH"G"E` MC/IP_TY=3G5P`Ϥ``$CG#"`H+0`(3KH`=G(&(`1.N@(F)$#5[(S22H1M M#C`LA*I(P+B`;`1*DF82*7P````"C/IP_TS?!#!.74YU,"H`!,!\``-F#"E\ M````!8SZ</]@XB\M`!`O+0`,+Q).N@)23^\`#"H`L+S_____9@Q.N@(6*4", M^G#_8+H@!6"V3E7__$AX$`!"ITZZ`L)03RM`__P(```,9Q)*K(S:9@@@+?_\ M3EU.=4ZZ``9P`&#T3E4``$AX``1(>@`>3KH!["\`3KH![D_O``Q(>``!3KH` M#%A/3EU.=5Y#"@!.50``2JR,\F<&(&R,\DZ0+RT`"$ZZ``A83TY=3G5.5?_\ M+P0K;0`(__Q*K(S29RQX`&`*+P1.N@#.6$]2A#`LA*I(P+B`;>PP+(2JP?P` M!B\`+RR,TDZZ`=903TJLC/9G!B!LC/9.D$JLC3AG"B\LC3A.N@&,6$]*K(TT M9PHO+(TT3KH!?%A/2JR-/&<*+RR-/$ZZ`6Q83RQX``0(+@`$`2EG%"\-2_H` M"DZN_^(J7V`&0J?S7TYS2JR,WF8J2JR,[F<B+RR,ZB\LC.Y.N@%@4$\@+(SF M4H#E@"\`+RR,XDZZ`4Q03V`.3KH!/"\LC-Y.N@%T6$\@+?_\+FR,QDYU*!]. M74YU3E4``$CG#B`H+0`(<@8@!$ZZ`$0D0-7LC-)*A&T.,"R$JDC`N(!L!$J2 M9A(I?`````*,^G#_3-\$<$Y=3G4P*@`$P'R``&8(+Q).N@`N6$]"DG``8.!( MYW``-`'$P"8!2$/&P$A#0D/4@TA`P,%(0$)`T(),WP`.3G4B+P`$+&R,SD[N M_]PB+P`$+&R,SD[N_X(B+P`$+&R,SD[N_[@L;(S.3N[_RBQLC,Y.[O]\(B\` M!"QLC,Y.[O\H3.\`!@`$+&R,SD[N_^(L;(S.3N[_Q$SO``X`!"QLC,Y.[O_0 M2.<!!$SO((``#"QLC,I.KO^43-\@@$YU3OH``B)O``0L;(S*3N[^8DSO``,` M!"QLC,I.[O\Z(F\`!"QLC,I.[O[:+&R,RD[N_WPB;P`$("\`""QLC,I.[O\N M3OH``B!O``0L;(S*3N[^C$[Z``(L;(S*(F\`!"`O``A.[OW83OH``B)O``0L M;(S*3N[^ADSO``,`!"QLC,I.[O[.3OH``B!O``0L;(S*3N[^@")O``1,[P`# M``@L;(T<3N[_"B)O``1,[P`#``@L;(T<3N[_$")O``1,[P$!``@L;(T<3N[^ ML")O``1,[P`/``@L;(T<3N[^SB)O``0@+P`(+&R-'$[N_JHB;P`$("\`""QL MC1Q.[OZ>(F\`!"!O``@@+P`,+&R-'"\'3J[_Q"X?3G5,[P,```0L;(TP3N[_ MH"!O``0L;(TP3N[_IB!O``0L;(TP3N[_LB!O``0L;(T@3N[_RB!O``0L;(T@ M3N[_N"!O``0L;(T@3N[_-$SO`P``!"QLC2!.[O[X```#[`````4````````- M2@``#AX```XN```.1```#G`````#`````0``#2P```X&```.^`````````/R M```#Z@```2L`0`!``4``9``!```#>@`"$@\```````````````0````````` M```@`$#_____``$`@``!``4`````'_\?_P```````````````````````@`! M``$``````0```````````/_Q``L`#__M`%0`$P`#````2@`````````````` M`````#0``0```````0$```````````````Q````````!`0`````````````` M#$<```````$!```````````````,30```````0$```````````````Q6```` M```!`0``````````````#%X````````!$```````6``(`%<```#^````B@`` M``!-`````````````3(````(`%@`"`!7````_0```)X`````00`````````` M````````$`!8``@`5P```/L```"R`````$0````````````!=@``````6``( M`%<```#^````Q@````!#```````````````````(`%@`"`!7````_0```-H` M````3@````````````&V``````!8``@``0``#&@```#N```````````````` M`%@```!8``@``0``#'````%4``````````````UJ```-&@``#7,```T>```- M?0``#2(```V'```-)@``#9````TJ```-FP``#2X```V@```-,@``#:@```TV M```-L@``#3H```W"```-/@``#=(```U"```-V0``#48```W?```-2@``#>4` M``U.```-ZP``#5(```WO```-5@``````````,#$R,S0U-C<X.6%B8V1E9@`` M`"`@("`@("`@(#`P,#`P("`@("`@("`@("`@("`@("`@D$!`0$!`0$!`0$!` M0$!`0`P,#`P,#`P,#`Q`0$!`0$!`"0D)"0D)`0$!`0$!`0$!`0$!`0$!`0$! M`0%`0$!`0$`*"@H*"@H"`@("`@("`@("`@("`@("`@("`D!`0$`@```````` M``````````$``````0`````````````````````!`0````$````````````` M`````````0(````!```````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M```````````````````````````````````````````````````````````` M`````````````````````````````````````````!0``````^P````=```` M`0```'````"`````[@```0````$0```!(@```40```%4```!9@```8@```&8 M```!J@```<@```'8```!X````>@```'P```!^````@````((```"$````A@` M``(@```"*````C````(X```"0````D@```)0````&``````````:````E@`` M`*H```"^````T@```.8```&F```!Q````=0```'<```!Y````>P```'T```! M_````@0```(,```"%````AP```(D```"+````C0```(\```"1````DP````` 0```#\@```^L````!```#\AP` ` end !Funky!Stuff! fi # end of overwriting check exit 0 # End of shell archive