page@swan.ulowell.edu (Bob Page) (02/01/89)
Submitted-by: hcr!hcrvax!edwin (Edwin Hoogerbeets) Posting-number: Volume 89, Issue 6 Archive-name: libraries/mklib.1 I wanted to write my routines in C and not fiddle with the assembler interface, etc. I decided to write mklib and keep my fiddling with the assembler to this one session. [uuencoded executable included. ..Bob] # This is a shell archive. # Remove everything above and including the cut line. # Then run the rest of the file through sh. #----cut here-----cut here-----cut here-----cut here----# #!/bin/sh # shar: Shell Archiver # Run the following text with /bin/sh to create: # ed.c # makefile # mklib.c # mklib.h # mklib.man # mklib.uu # readme # t.c # text.c # This archive created: Mon Jan 30 17:11:16 1989 cat << \SHAR_EOF > ed.c /* this is a test library */ #include <exec/types.h> char myname[] = "mylib.library"; char myid[] = "mylib 1.0 (23 Oct 1986)\r\n"; LONG GetDown() { return (77); } ULONG Double(arg) ULONG arg; { return (2 * arg); } LONG Triple(arg) LONG arg; { arg *= 3; return ((LONG)arg); } LONG Add(apples,oranges) LONG apples,oranges; { return(apples+oranges); } LONG Sum(a,b,c,d,e,f) LONG a,b,c,d,e,f; { return(a+b+c+d+e+f); } SHAR_EOF cat << \SHAR_EOF > makefile # Mklib 1.0 - a source file generator for Amiga shared libraries # copyright 1988 Edwin Hoogerbeets # # This software is freely redistributable as long as there is no charge # beyond resonable copy fees and as long as this notice stays intact. # # Thanks to Jimm Mackraz for Elib on Fish 87, from which much of this # program is lifted. Also thanks to Neil Katin for his mylib.asm upon # which elib is based. CFLAGS=-Z20000 OBJS=mklib.o text.o mklib: $(OBJS) ln $(OBJS) -led -lc -o mklib SHAR_EOF cat << \SHAR_EOF > mklib.c /* Mklib 1.0 - a source file generator for Amiga shared libraries Compiled with Manx v3.6a small code model/16 bit int. (see makefile) copyright 1988 Edwin Hoogerbeets This software and the files it produces are freely redistributable as long there is no charge beyond reasonable copy fees and as long as this notice stays intact. Thanks to Jimm Mackraz for Elib on Fish 87, from which much of this program is lifted. Also thanks to Neil Katin for his mylib.asm upon which elib is based. */ #include <stdio.h> #include <ctype.h> #include <edlib.h> #include "mklib.h" void error(msg) char *msg; { fprintf(stderr,"Error: %s\n",msg); exit(1); } void writeto(file,header) FILE *file; char *header[]; { int index = 0; while ( header[index] != NULL ) fprintf(file,"%s\n",header[index++]); } /* init opens and initializes all the output files */ void init() { /* open file with startup code */ if ( (startup = fopen("startup.asm","w")) == NULL ) error("Could not open startup code file"); /* write the header and the body to the file */ writeto(startup,asmheader); writeto(startup,startupcode); /* we are finished with the startup code file */ fclose(startup); /* open romtag file */ if ( (romtag = fopen("rtag.asm","w")) == NULL ) error("Could not open romtag file"); /* write the header and the romtag info */ writeto(romtag,asmheader); writeto(romtag,rtag); /* we are finished with this one too */ fclose(romtag); /* open library include file */ if ( (inc = fopen("lib.h","w")) == NULL ) error("Could not open library include file"); /* write the header and the info */ writeto(inc,cheader); writeto(inc,incbody); /* we are finished with this one too */ fclose(inc); /* open the interface, link and make file for processing and add in the appropriate header info */ /* open library file */ if ( (lib = fopen("lib.c","w")) == NULL ) error("Could not open library main file"); /* write the header */ writeto(lib,cheader); /* open link header file */ if ( (linkh = fopen("link.h","w")) == NULL ) error("Could not open link header main file"); /* write the header */ writeto(linkh,cheader); /* open library interface file */ if ( (interface = fopen("interface.asm","w")) == NULL ) error("Could not open library interface file"); /* write the header */ writeto(interface,asmheader); writeto(interface,faceheader); /* open library linker file */ if ( (link = fopen("link.asm","w")) == NULL ) error("Could not open library linker file"); /* write the header */ writeto(link,asmheader); writeto(link,linkhead); /* open makefile */ if ( (makefile = fopen("makefile","w")) == NULL ) error("Could not open makefile"); /* write the header */ writeto(makefile,makeheader); return(); } /* rudimentary scanner for picking up tokens to be parsed for function declarations */ int getoken(file) char *file; { char c; short cont = 1, eoc = 0; /* continue loop and end of comment flags */ while ( isspace(c = getc(file)) ); if ( c == EOF ) return(NOTHING); /* if the character is escaped, then ignore it */ if ( c == '\\' ) { getc(file); return(OTHER); } /* if the character is '/' and is followed by a '*', then you have a comment which you can throw out until the end of comment characters come along, example here ->*/ if ( c == '/' ) { if ( (c = getc(file)) == '*' ) { /* get a comment */ while ( (c = getc(file)) != EOF && cont ) { if ( c == '/' && eoc ) { cont = 0; } else { eoc = 0; } if ( c == '*' ) eoc = 1; } if ( c == EOF ) return(NOTHING); } ungetc(c,file); return(OTHER); } if ( iscsymf(c) ) { tempc = 0; tempfunc[tempc++] = c; /* to allow tokens like asdf.library, we must check for '.' too */ while ( iscsym(c = getc(file)) || c == '.' ) tempfunc[tempc++] = c; tempfunc[tempc] = '\0'; ungetc(c,file); if ( !strcmp("LONG",tempfunc) || !strcmp("ULONG",tempfunc) ) return(LONGT); if ( !strcmp("extern",tempfunc) ) return(EXT); if ( !strcmp("char",tempfunc) ) return(CHAR); if ( !strcmp("myname",tempfunc) ) return(MYNAME); if ( !strcmp("myid",tempfunc) ) return(MYID); return(IDENT); } switch (c) { case ',': return(COMMA); case ';': return(SEMI); case '{': return(OBRACE); case '}': return(CBRACE); case '(': return(OBRACK); case ')': return(CBRACK); case '*': return(STAR); case '\"': return(QUOTE); default: return(OTHER); } } void addfunc(name,count) char *name; int count; { if ( ftcounter < MAXFUNC ) { strcpy(functable[ftcounter].name,name); functable[ftcounter++].numofargs = count; } else { error("Out of function name table space. Recompile with bigger MAXFUNC"); } } /* process reads the input files and generates the proper output in the interface, link and makefiles */ void process(file) char *file; { FILE *in; /* pointer to input file */ int leftcount = 0; /* counter for number of { } to tell when a function starts */ int token, argcount; char tempname[MAXLEN], str[MAXLEN]; if ( (in = fopen(file,"r")) == NULL ) { fprintf(stderr,"Could not open input file %s\n",file); return(); } /* fill the function name table with the names of the functions in the given file */ while ( (token = getoken(in)) != NOTHING ) { switch ( token ) { /* extern definition... throw out everything to end of statement which is denoted by a ; */ case EXT: while ( (token = getoken(in)) != SEMI && token != NOTHING ) ; break; /* (maybe) a definition of a function */ case LONGT: if ( !leftcount ) { if ( (token = getoken(in)) == IDENT ) { if ( (token = getoken(in)) == OBRACK ) { argcount = 0; /* save the function name from further thrashing by the scanner */ strcpy(tempname,tempfunc); token = getoken(in); while ( token != CBRACK ) { if ( token == IDENT ) { ++argcount; } else if ( token != COMMA ) { sprintf(str,"Bad declaration syntax in\ file %s, function %s\n",file,tempname); error(str); } token = getoken(in); } /* if a semicolon follows then this is only a forward declaration and should not be added to the functions list. If anything else, then this is a definition. */ if ( (token = getoken(in)) != SEMI ) { addfunc(tempname,argcount); } } } } break; /* entering a block */ case OBRACE: ++leftcount; break; /* exiting a block */ case CBRACE: if ( leftcount ) --leftcount; break; case CHAR: /* possibly myname is defined */ if ( !leftcount ) { /* might be declared as char *myname = "foo.library" */ if ( (token = getoken(in)) == STAR ) { if ( (token = getoken(in)) == MYNAME && !mynamedef ) { token = getoken(in); /* skip the = */ if ( (token = getoken(in)) == QUOTE) { /* we have ignition! */ if ( (token = getoken(in)) == IDENT ) { /* we have liftoff! */ strcpy(myname,tempfunc); mynamedef = 1; } } } else if ( token == MYID && !myiddef ) { token = getoken(in); /* skip the = */ if ( (token = getoken(in)) == QUOTE) { /* we have ignition! */ if ( (token = getoken(in)) == IDENT ) { /* we have liftoff! */ strcpy(myid,tempfunc); myiddef = 1; } } } /* else declared as char myname[] = "foo.library" */ } else if ( token == MYNAME && !mynamedef ) { /* now skip the [, ] and = */ token = getoken(in); token = getoken(in); token = getoken(in); if ( (token = getoken(in)) == QUOTE) { /* we have ignition! */ if ( (token = getoken(in)) == IDENT ) { /* we have liftoff! */ strcpy(myname,tempfunc); mynamedef = 1; } } } else if ( token == MYID && !myiddef ) { /* now skip the [, ] and = */ token = getoken(in); token = getoken(in); token = getoken(in); if ( (token = getoken(in)) == QUOTE) { /* we have ignition! */ if ( (token = getoken(in)) == IDENT ) { /* we have liftoff! */ strcpy(myid,tempfunc); myiddef = 1; } } } } break; default: break; } } fclose(in); } /* converts a file name from a .c to a .o file */ void to_dot_o(out,in) char *out,*in; { int index = strrpos(in,'.'); strcpy(out,in); /* if there is no '.' in the file name or if the letter after the '.' is not 'c', then concatenate a ".o" to the end of the file name, or else just change the 'c' to an 'o' */ if ( index == -1 || in[index+1] != 'c' ) { strcat(out,".o"); } else { out[index+1] = 'o'; } return(); } /* shutdown cleans up and closes the output files */ void shutdown(argc,argv) int argc; char **argv; { int index, num; char temp[MAXLEN]; if ( !mynamedef ) { strcpy(myname,"mylib.library"); printf("Myname variable not defined: using \"mylib.library\"\n"); fprintf(lib,"char myname[] = \"mylib.library\";\n"); } if ( !myiddef ) { printf("Myid variable not defined: using \"mylib version 1.0\"\n"); fprintf(lib,"char myid[] = \"mylib version 1.0\";\n"); } fprintf(lib,"\n"); writeto(lib,mandatory); fprintf(linkh,"APTR libbase;\n\n"); puts("The following LONG functions were found in your source:"); puts("# : args name"); for ( index = 0 ; index < ftcounter ; index++ ) { printf("%-3d: %d %-30s\n",index,functable[index].numofargs, functable[index].name); fprintf(interface," dc.l X%s\n",functable[index].name); fprintf(link," LIBDEF _LVO%s\n",functable[index].name); fprintf(linkh,"extern LONG %s();\n",functable[index].name); } writeto(link,link2); writeto(interface,face2); for ( index = 0 ; index < ftcounter ; index++ ) { fprintf(link," public _%s\n",functable[index].name); fprintf(interface," public _%s\n",functable[index].name); } writeto(interface,facemid); fprintf(link,"\n"); for ( index = 0 ; index < ftcounter ; index++ ) { fprintf(link,"_%s:\n",functable[index].name); /* check here for arguments and which registers to put them in */ if ( functable[index].numofargs > 4 ) fprintf(link," store\n"); for ( num = 0 ; num < functable[index].numofargs ; num++ ) fprintf(link," move.l %d(sp),%s\n",num*4+4,regs[num]); fprintf(link," move.l _libbase,a6\n"); if ( functable[index].numofargs > 4 ) { fprintf(link," jsr _LVO%s(a6)\n",functable[index].name); fprintf(link," retrieve\n"); fprintf(link," rts\n\n"); } else { fprintf(link," jmp _LVO%s(a6)\n\n",functable[index].name); } fprintf(interface,"X%s:\n",functable[index].name); fprintf(interface," setup\n"); /* check here for arguments and how to put them on the stack */ for ( num = functable[index].numofargs - 1 ; num >= 0 ; num-- ) fprintf(interface," push %s\n",regs[num]); fprintf(interface," jsr _%s\n",functable[index].name); fprintf(interface," restore "); if ( functable[index].numofargs ) fprintf(interface,"%d",functable[index].numofargs*4); fprintf(interface,"\n\n"); } fprintf(interface," end\n"); fprintf(makefile,"OBJS=startup.o rtag.o interface.o lib.o "); for ( index = 1 ; index < argc ; index++ ) { to_dot_o(temp,argv[index]); fprintf(makefile,"%s ",temp); } fprintf(makefile,"\n\n%s: $(OBJS)\n",myname); writeto(makefile,makefooter); /* clean up the open files */ fclose(linkh); fclose(lib); fclose(interface); fclose(link); fclose(makefile); return(); } main(argc,argv) int argc; char **argv; { int index = 1; /* check for correct usage */ if ( argc < 2 ) { printf("Usage: %s library_source_file ...\n",argv[0]); exit(1); } /* open files and write out initial info */ init(); /* search through each source file for routines and add each routine to the appropriate spot */ while ( index < argc ) process(argv[index++]); /* write out final info and close files */ shutdown(argc,argv); exit(0); } SHAR_EOF cat << \SHAR_EOF > mklib.h /* Mklib 1.0 - a source file generator for Amiga shared libraries Compiled with Manx v3.6a small code model/16 bit int. (see makefile) copyright 1988 Edwin Hoogerbeets This software and the files it produces are freely redistributable as long there is no charge beyond reasonable copy fees and as long as this notice stays intact. Thanks to Jimm Mackraz for Elib on Fish 87, from which much of this program is lifted. Also thanks to Neil Katin for his mylib.asm upon which elib is based. */ #define MAXFUNC 50 #define MAXLEN 64 /* definitions of token types */ #define NOTHING 0 /* end of input */ #define IDENT 1 /* identifier */ #define OBRACE 2 /* open brace { */ #define CBRACE 3 /* close brace } */ #define LONGT 4 /* 'LONG' keyword */ #define OBRACK 5 /* open bracket ( */ #define CBRACK 6 /* close bracket ) */ #define COMMA 7 /* comma , */ #define EXT 8 /* 'extern' keyword */ #define SEMI 9 /* semicolon ; */ #define CHAR 10 /* 'char' keyword */ #define MYNAME 11 /* 'myname' token */ #define STAR 12 /* * is born yuk yuk*/ #define QUOTE 13 /* quote " */ #define MYID 14 /* 'myid' keyword */ #define OTHER 20 /* everything else */ char myname[MAXLEN]; /* storage for final name of library */ int mynamedef = 0; /* is myname defined? */ char myid[MAXLEN]; /* storage for final id of library */ int myiddef = 0; /* is myid defined ? */ typedef struct { /* structure to hold function names */ char name[MAXLEN]; int numofargs; } ftable; ftable functable[MAXFUNC]; int ftcounter = 0; char tempfunc[MAXLEN]; int tempc = 0; FILE *startup, *interface, *link, *romtag, *makefile, *lib, *inc, *linkh; void shutdown(); extern char *asmheader[], *cheader[], *makeheader[], *startupcode[]; extern char *rtag[], *mandatory[], *incbody[], *faceheader[], *linkhead[]; extern char *link2[], *face2[], *makefooter[], *facemid[]; #define NUMOFREGS 14 char *regs[] = { "d0", "d1", "a0", "a1", "d2", "d3", "d4", "d5", "d6", "d7", "a2", "a3", "a4", "a5", NULL }; SHAR_EOF cat << \SHAR_EOF > mklib.man MKLIB(1) Library Functions MKLIB(1) NAME mklib - a source file generator for Amiga shared libraries mklib file [ file ... ] DESCRIPTION Mklib is a utility that allows you to write code for an Amiga shared library in C and automatically produce files that allow you to generate this library. Normally, Amiga shared libraries are coded in assembler, and are passed arguments in registers. These arguments must be pushed onto the stack before a C routine in the library can be called. To use mklib, follow this sequence of steps: 1 - code your library routines and save them in any number of `.c' files. 2 - make sure the following two variables are defined once using these exact names: char myname[] = "mylib.library"; char myid[] = "mylib 1.0 (23 Oct 1986)\r\n"; The Amiga's OS requires that the name of the library be included within the library itself. Myid may contain any identifying information that you wish to have included. 3 - put your source files in their own directory. This makes it easy to contain the various generated files and to prevent mklib from overwriting files that may already exist. (such as "makefile") 4 - run mklib and specify your source files. 5 - assuming the compiler, the assembler, the linker and the librarian are in your search path, you can now simply type "make" to automatically generate a library file. 6 - Once you have done this, copy the library to the LIBS: directory so that AmigaDOS can automatically load it when required. When programming the library functions, remember that stdin, stdout and stderr will not be correct. Most clib library routines should be avoided. Also, when coding the library routines, keep in mind that there may be more than one process running your library. Therefore, you should make your code re-entrant. The use of global variables in a library is a Bad Thing if you do not use semaphores or other such techniques to prevent race conditions. To use the final library, a user program must be linked with link.o which is generated from the link.asm which, in turn, is generated by mklib. Also, the file link.h must be included in the user program to declare externally the functions in the the new library. Open and use the library as you would open and use any other library such as the intuition.library. Remember to close the library before exiting your function. The generated makefile contains an example makefile entry for the user program, but it is commented out. Take away the comments and add your own program name to get make to generate a program that uses the newly created library. The file link.h contains the following declaration: APTR libbase; This variable _must_ be used to store your library pointer when your library is opened. The routines in the file link.asm use this variable to find the exact locations of the functions in the shared library. PARAMETERS You may call a library generated with mklib as you would any other library from either Manx C, Lattice C, assembler or even other languages that support libraries. The parameters to the generated libraries should be in the following order: d0 for the first parameter d1 second a0 third a1 fourth and so on: d2, d3, d4, d5, d6, d7, a2, a3, a4, a5 There is a maximum of 14 parameters. If you need to pass more information, create a structure containing this data and pass a pointer to the structure. EXAMPLES The following is an example of source that you may use to to generate a library. /* this is a test library */ #include <exec/types.h> char myname[] = "mylib.library"; char myid[] = "mylib 1.0 (23 Oct 1986)\r\n"; LONG GetDown() { return (77); } ULONG Double(arg) ULONG arg; { return (2 * arg); } LONG Triple(arg) LONG arg; { arg *= 3; return ((LONG)arg); } The following is an example program that uses the library generated from the source above: #include <exec/types.h> #include <stdio.h> #include <functions.h> #include "link.h" #define RTC printf("return to continue - ");fflush(stdout);\ getchar(); #define DOUBARG 19 main() { LONG retval; printf("here we go\n"); libbase = (APTR) OpenLibrary("mylib.library", 0L); printf("openlib returns base: %lx\n", libbase); RTC; if (libbase) { /* test function GetDown() */ retval = GetDown(); printf("called getdown, %ld returned\n", retval); RTC; /* test function Double() */ printf("double of %d = %ld\n", DOUBARG, Double((LONG)DOUBARG)); RTC; /* test function Triple() */ printf("Here is three times %d: %ld\n",DOUBARG, Triple((LONG)DOUBARG)); RTC; CloseLibrary(libbase); } } AUTHOR Edwin Hoogerbeets 12/08/88 working from the Elib example on Fish 87. FILES *.c - your source files for the library interface.asm - assembler/C interface routines lib.c - required library functions (Open, Close, Expunge) lib.h - header for lib.c link.asm - file to link with code using the generated library link.h - include file for programs using the generated library file makefile - makefile for the generated code rtag.asm - romtag code used to help replace crt0 startup.asm - new version of crt0 to replace default crt0 whatever.library - final Amiga shared library BUGS As yet, all user library routines must be defined as LONG or ULONG and must take only arguments of type LONG or ULONG. All functions not declared this way will be ignored by mklib. This may be changed in subsequent version of mklib. Mklib is written for Manx Aztec C. Although it has not been tried with Lattice, it will should compile fine. However, it may need some changes in the output generated to conform to Lattice. Currently, mklib has only been tested with Manx version 3.6a. Mklib does not allow you to specify your own name for the pointer to the library in a user program. The variable 'libbase' must always be used. SHAR_EOF cat << \SHAR_EOF > mklib.uu begin 777 mklib M```#\P`````````#``````````(``!/C```%Q`````$```/I```3XT[Z/I!D7 M,`!D,0!A,`!A,0!D,@!D,P!D-`!D-0!D-@!D-P!A,@!A,P!A-`!A-0!.50``P M+RT`"$AZ`!Q(;(=@3KH[H$_O``P_/``!3KI,6%1/3EU.=45R<F]R.B`E<PH`) M`$Y5__Y";?_^,"W__DC`Y8`@;0`,2K`(`&<F,"W__E)M__Y(P.6`(&T`#"\PV M"`!(>@`4+RT`"$ZZ.TA/[P`,8,A.74YU)7,*`$Y5``!(>@'.2'H!ODZZ.HA0> M3RE`EJ9F"DAZ`;Q.NO]H6$](;(#F+RR6IF&,4$](;(%*+RR6IF&`4$\O+):FC M3KI'FEA/2'H!NDAZ`:U.NCI(4$\I0):R9@I(>@&H3KK_*%A/2&R`YB\LEK).3 MNO],4$](;(*.+RR6LDZZ_SY03R\LEK).ND=66$](>@&92'H!CTZZ.@103RE`: MEKYF"DAZ`8=.NO[D6$](;($6+RR6ODZZ_PA03TALA78O+):^3KK^^E!/+RR6U MODZZ1Q)83TAZ`8%(>@%W3KHYP%!/*4"6NF8*2'H!;TZZ_J!83TAL@18O+):Z" M3KK^Q%!/2'H!?TAZ`71.NCF44$\I0);"9@I(>@%M3KK^=%A/2&R!%B\LEL).D MNOZ84$](>@&(2'H!=DZZ.6A03RE`EJIF"DAZ`79.NOY(6$](;(#F+RR6JDZZ_ M_FQ03TALA-XO+):J3KK^7E!/2'H!?TAZ`7).NCDN4$\I0):N9@I(>@%M3KK^5 M#EA/2&R`YB\LEJY.NOXR4$](;(7>+RR6KDZZ_B103TAZ`7-(>@%F3KHX]%!/V M*4"6MF8*2'H!84ZZ_=183TAL@$8O+):V3KK]^%!/3EU.=7-T87)T=7`N87-MV M`'<`0V]U;&0@;F]T(&]P96X@<W1A<G1U<"!C;V1E(&9I;&4`<G1A9RYA<VT`\ M=P!#;W5L9"!N;W0@;W!E;B!R;VUT86<@9FEL90!L:6(N:`!W`$-O=6QD(&YO3 M="!O<&5N(&QI8G)A<GD@:6YC;'5D92!F:6QE`&QI8BYC`'<`0V]U;&0@;F]T& M(&]P96X@;&EB<F%R>2!M86EN(&9I;&4`;&EN:RYH`'<`0V]U;&0@;F]T(&]P. M96X@;&EN:R!H96%D97(@;6%I;B!F:6QE`&EN=&5R9F%C92YA<VT`=P!#;W5L9 M9"!N;W0@;W!E;B!L:6)R87)Y(&EN=&5R9F%C92!F:6QE`&QI;FLN87-M`'<`A M0V]U;&0@;F]T(&]P96X@;&EB<F%R>2!L:6YK97(@9FEL90!M86ME9FEL90!WI M`$-O=6QD(&YO="!O<&5N(&UA:V5F:6QE``!.5?_Z.WP``?_\0FW_^B\M``A.! MNC9N6$\;0/__2(!20$'LAK((,``$``!G`F#@#"T`____9@9P`$Y=3G4,+0!<7 M__]F#B\M``A.NC8X6$]P%&#F#"T`+___9GPO+0`(3KHV(EA/&T#__[`\`"IF% M4"\M``A.NC8.6$\;0/__L#P`_V<N2FW__&<H#"T`+___9@Q*;?_Z9P9";?_\@ M8`1";?_Z#"T`*O__9@8[?``!__I@O@PM`/___V8&<`!@`/]\+RT`"!`M__](\ M@#\`3KHW?%Q/<!1@`/]D$"W__TB`/P!.NC3\5$]*0&<``/Y";(`(,"R`"%)L0 M@`AL@`A9F2'H`_$ZZ-QA03TI`9Q)(;)9F2'H`[TZZ-P903TI`9@9PP M!&``_KI(;)9F2'H`W4ZZ-NY03TI`9@9P"&``_J)(;)9F2'H`S$ZZ-M903TI`? M9@9P"F``_HI(;)9F2'H`N4ZZ-KY03TI`9@9P"V``_G)(;)9F2'H`J$ZZ-J90C M3TI`9@9P#F``_EIP`6``_E00+?__2(!(P&`V<`=@`/Y$<`E@`/X^<`)@`/XXU M<`-@`/XR<`5@`/XL<`9@`/XF<`Q@`/X@<`U@`/X:<!1@`/X4D+P````B9^Q=_ M@&?64X!GV%.`9]I5@&>RD+P````/9["0O````$!GKE6`9[!@S&``_>),3TY'K M`%5,3TY'`&5X=&5R;@!C:&%R`&UY;F%M90!M>6ED``!.50``#&P`,H`&;#(O3 M+0`(,"R`!L'\`$)![(F"T(@O`$ZZ,\)03S`L@`92;(`&P?P`0D'LB<(QK0`,X M"`!@"DAZ``Q.NOF>6$].74YU3W5T(&]F(&9U;F-T:6]N(&YA;64@=&%B;&4@P M<W!A8V4N(%)E8V]M<&EL92!W:71H(&)I9V=E<B!-05A&54Y#`$Y5_W9";?_Z8 M2'H#3"\M``A.NC144$\K0/_\9A@O+0`(2'H#-DALAV!.NC3>3^\`#$Y=3G4O# M+?_\3KK\OEA/.T#_^&<``P0P+?_X2,!@``+B+RW__$ZZ_*)83SM`__BP?``)< M9PA*;?_X9P)@Y&```M9*;?_Z9@``P"\M__Q.NOQZ6$\[0/_XL'P``68``*HOR M+?_\3KK\9%A/.T#_^+!\``5F``"40FW_]DALEF9(;?^V3KHRIE!/+RW__$ZZP M_#Q83SM`__@,;0`&__AG2`QM``'_^&8&4FW_]F`J#&T`!__X9R)(;?^V+RT`7 M"$AZ`HI(;?]V3KH[0$_O`!!(;?]V3KKX5EA/+RW__$ZZ^^Y83SM`__A@L"\M% M__Q.NOO>6$\[0/_XL'P`"6<./RW_]DAM_[9.NOY"7$]@``(,4FW_^F```@1*S M;?_Z9P13;?_Z8``!]DIM__IF``'$+RW__$ZZ^YI83SM`__BP?``,9@``Q"\M' M__Q.NON$6$\[0/_XL'P`"V922FR``F9,+RW__$ZZ^VI83SM`__@O+?_\3KK[K M7%A/.T#_^+!\``UF*"\M__Q.NOM(6$\[0/_XL'P``6842&R69DALB0).NC&06 M4$\Y?``!@`)@6`QM``[_^&902FR`!&9*+RW__$ZZ^Q!83SM`__@O+?_\3KK[* M`EA/.T#_^+!\``UF*"\M__Q.NOKN6$\[0/_XL'P``6842&R69DALB4).NC$V' M4$\Y?``!@`1@``#L#&T`"__X9FY*;(`"9F@O+?_\3KKZM%A/.T#_^"\M__Q.% MNOJF6$\[0/_X+RW__$ZZ^IA83SM`__@O+?_\3KKZBEA/.T#_^+!\``UF*"\M< M__Q.NOIV6$\[0/_XL'P``6842&R69DALB0).NC"^4$\Y?``!@`)@=`QM``[_) M^&9L2FR`!&9F+RW__$ZZ^CY83SM`__@O+?_\3KKZ,%A/.T#_^"\M__Q.NOHB= M6$\[0/_X+RW__$ZZ^A183SM`__BP?``-9B@O+?_\3KKZ`%A/.T#_^+!\``%FK M%$ALEF9(;(E"3KHP2%!/.7P``8`$8"A@)OWX_@#]+O_:_]K_VOT._]K^#E6`8 ML+P````)9.+C@#`[`.!.^P``8`#\[B\M__Q.NCY<6$]@`/S<<@!#;W5L9"!N+ M;W0@;W!E;B!I;G!U="!F:6QE("5S"@!"860@9&5C;&%R871I;VX@<WEN=&%X[ M(&EN(&9I;&4@)7,L(&9U;F-T:6]N("5S"@!.5?_^/SP`+B\M``Q.NB],7$\[] M0/_^+RT`#"\M``A.NB^24$\,;?____YG$C`M__Y20"!M``P,,`!C``!G$$AZ[ M`"(O+0`(3KHW1E!/8!`P+?_^4D`@;0`($;P`;P``3EU.=2YO``!.5?^\2FR`V M`F8F2'H$<DALB0).NB\X4$](>@1R3KHX5EA/2'H$G"\LEKI.NC#04$]*;(`$V M9AA(>@2J3KHX.%A/2'H$UB\LEKI.NC"R4$](>@3L+RR6NDZZ,*103TAL@Q(OM M+):Z3KKU%E!/2'H$TB\LEL).NC"(4$](>@343KHR]EA/2'H%`DZZ,NQ83T)M. M__Y@``"6,"W__L'\`$)![(F"T(@O`#`M__[!_`!"0>R)PC\P"``_+?_^2'H$" MVTZZ-[9/[P`,,"W__L'\`$)![(F"T(@O`$AZ!-(O+):J3KHP'D_O``PP+?_^? MP?P`0D'LB8+0B"\`2'H$QR\LEJY.NB_^3^\`##`M__[!_`!"0>R)@M"(+P!() M>@2^+RR6PDZZ+]Y/[P`,4FW__C`M__ZP;(`&;0#_8DALA?(O+):N3KKT/E!/W M2&R&1B\LEJI.NO0P4$]";?_^8$0P+?_^P?P`0D'LB8+0B"\`2'H$?R\LEJY.` MNB^,3^\`##`M__[!_`!"0>R)@M"(+P!(>@1S+RR6JDZZ+VQ/[P`,4FW__C`MQ M__ZP;(`&;;)(;(".+RR6JDZZ\\Y03TAZ!%PO+):N3KHO0%!/0FW__F```?0P+ M+?_^P?P`0D'LB8+0B"\`2'H$."\LEJY.NB\:3^\`##`M__[!_`!"0>R)P@QPM M``0(`&\.2'H$&B\LEJY.NB[V4$]";?_\8"XP+?_\2,#E@$'L@`HO,`@`,"W_* M_.5`6$`_`$AZ`_LO+):N3KHNR$_O``Y2;?_\,"W__L'\`$)![(G",BW__+)PH M"`!MO$AZ`^PO+):N3KHNGE!/,"W__L'\`$)![(G"#'``!`@`;SXP+?_^P?P`1 M0D'LB8+0B"\`2'H#UR\LEJY.NBYL3^\`#$AZ`^,O+):N3KHN7%!/2'H#YR\LG MEJY.NBY.4$]@(#`M__[!_`!"0>R)@M"(+P!(>@/5+RR6KDZZ+BY/[P`,,"W_" M_L'\`$):J3KHN#D_O``Q(>@/(+RR6JDZZ+?Y03S`M3 M__[!_`!"0>R)PC(P"`!303M!__Q@)#`M__Q(P.6`0>R`"B\P"`!(>@.A+RR6G MJDZZ+<A/[P`,4VW__$IM__QLUC`M__[!_`!"0>R)@M"(+P!(>@.(+RR6JDZZH M+9Y/[P`,2'H#B2\LEJI.NBV.4$\P+?_^P?P`0D'LB<)*<`@`9R0P+?_^P?P`5 M0D'LB<(R,`@`Y4$_`4AZ`V8O+):J3KHM6D_O``I(>@-9+RR6JDZZ+4I03U)M] M__XP+?_^L&R`!FT`_@1(>@,^+RR6JDZZ+2Q03TAZ`STO+):V3KHM'E!/.WP`8 M`?_^8#(P+?_^2,#E@"!M``HO,`@`2&W_O$ZZ^YI03TAM_[Q(>@,R+RR6MDZZ7 M+.I/[P`,4FW__C`M__ZP;0`(;<1(;(D"2'H#%"\LEK9.NBS(3^\`#$AL@'HON M+):V3KKQ.%!/+RR6PDZZ.5!83R\LEKI.NCE&6$\O+):J3KHY/%A/+RR6KDZZR M.3)83R\LEK9.NCDH6$].74YU;7EL:6(N;&EB<F%R>0!->6YA;64@=F%R:6%BS M;&4@;F]T(&1E9FEN960Z('5S:6YG(")M>6QI8BYL:6)R87)Y(@H`8VAA<B!M* M>6YA;65;72`](")M>6QI8BYL:6)R87)Y(CL*`$UY:60@=F%R:6%B;&4@;F]T" M(&1E9FEN960Z('5S:6YG(")M>6QI8B!V97)S:6]N(#$N,"(*`&-H87(@;7EI< M9%M=(#T@(FUY;&EB('9E<G-I;VX@,2XP(CL*``H`05!44B!L:6)B87-E.PH*6 M`%1H92!F;VQL;W=I;F<@3$].1R!F=6YC=&EO;G,@=V5R92!F;W5N9"!I;B!YZ M;W5R('-O=7)C93H`(R`@.B!A<F=S(&YA;64`)2TS9#H@)60@("`@)2TS,',*J M`"`@("`@("`@9&,N;"`@("!8)7,*`"`@("`@("`@3$E"1$5&(%],5D\E<PH`3 M97AT97)N($Q/3D<@)7,H*3L*`"`@("`@("`@<'5B;&EC(%\E<PH`("`@("`@4 M("!P=6)L:6,@(%\E<PH`"@!?)7,Z"@`@("`@("`@('-T;W)E"@`@("`@("`@< M(&UO=F4N;"`@)60H<W`I+"5S"@`@("`@("`@(&UO=F4N;"`@7VQI8F)A<V4LJ M838*`"`@("`@("`@:G-R("`@("!?3%9/)7,H838I"@`@("`@("`@(')E=')I0 M979E"@`@("`@("`@(')T<PH*`"`@("`@("`@:FUP("`@("!?3%9/)7,H838IN M"@H`6"5S.@H`("`@("`@("!S971U<`H`("`@("`@("!P=7-H("5S"@`@("`@% M("`@(&IS<B!?)7,*`"`@("`@("`@<F5S=&]R92``)60`"@H`("`@("`@("!E6 M;F0*`$]"2E,]<W1A<G1U<"YO(')T86<N;R!I;G1E<F9A8V4N;R!L:6(N;R``D M)7,@``H*)7,Z("0H3T)*4RD*``!.5?_^.WP``?_^#&T``@`(;!H@;0`*+Q!(G M>@!63KHQ!E!//SP``4ZZ.DA43TZZ[D8P+?_^L&T`"&P<,"W__E)M__Y(P.6`= M(&T`"B\P"`!.NO146$]@VB\M``H_+0`(3KKX4%Q/0F=.NCH(5$].74YU57-AQ M9V4Z("5S(&QI8G)A<GE?<V]U<F-E7V9I;&4@+BXN"@``(R!4:&ES(&UA:V5FU M:6QE('=A<R!G96YE<F%T960@=VET:"!M:VQI8@`C(&-O<'ER:6=H="`Q.3@X5 M($5D=VEN($AO;V=E<F)E971S`",`(R!4:&ES('-O9G1W87)E(&ES(&9R965LA M>2!R961I<W1R:6)U=&%B;&4@87,@;&]N9R!A<R!T:&5R92!I<R!N;R!C:&%R% M9V4`(R!B97EO;F0@<F5S;VYA8FQE(&-O<'D@9F5E<R!A;F0@87,@;&]N9R!AA M<R!T:&ES(&YO=&EC92!S=&%Y<R!I;G1A8W0N`",`(R!4:&%N:W,@=&\@2FEMD M;2!-86-K<F%Z(&9O<B!%;&EB(&]N($9I<V@@.#<L(&9R;VT@=VAI8V@@;75CG M:"!O9B!T:&ES`",@<')O9W)A;2!I<R!L:69T960N($%L<V\@=&AA;FMS('1O- M($YE:6P@2V%T:6X@9F]R(&AI<R!M>6QI8BYA<VT@=7!O;@`C('=H:6-H(&5L? M:6(@:7,@8F%S960N``!#1DQ!1U,]+50````@("`@("`@(&QN("0H3T)*4RD@_ M+6QC("UO("1````C>6]U<G!R;V<Z('EO=7)P<F]G+F\@;&EN:RYO`",@("`@R M("`@;&X@>6]U<G!R;V<N;R!L:6YK+F\@+6QC("UO("1````@("`@("`@('!UJ M8FQI8R`@7V=E=&$T``!M>6]P96XZ`"`@("`@("`@<V5T=7``("`@("`@("!P! M=7-H(&$V`"`@("`@("`@:G-R("`@("!?;7E/<&5N`"`@("`@("`@<F5S=&]RL M92`T``!M>6-L;W-E.@`@("`@("`@('-E='5P`"`@("`@("`@<'5S:"!A-@`@W M("`@("`@(&IS<B`@("`@7VUY0VQO<V4`("`@("`@("!R97-T;W)E(#0``&UY( M97AP=6YG93H`("`@("`@("!S971U<``@("`@("`@('!U<V@@838`("`@("`@> M("!J<W(@("`@(%]M>45X<'5N9V4`("`@("`@("!R97-T;W)E(#0``#L@5&AIH M<R!F:6QE('=A<R!G96YE<F%T960@=VET:"!M:VQI8@`[(&-O<'ER:6=H="`Q] M.3@X($5D=VEN($AO;V=E<F)E971S`#L`.R!4:&ES('-O9G1W87)E(&ES(&9R$ M965L>2!R961I<W1R:6)U=&%B;&4@87,@;&]N9R!A<R!T:&5R92!I<R!N;R!C` M:&%R9V4`.R!B97EO;F0@<F5S;VYA8FQE(&-O<'D@9F5E<R!A;F0@87,@;&]N, M9R!A<R!T:&ES(&YO=&EC92!S=&%Y<R!I;G1A8W0N`#L`.R!4:&%N:W,@=&\@< M2FEM;2!-86-K<F%Z(&9O<B!%;&EB(&]N($9I<V@@.#<L(&9R;VT@=VAI8V@@" M;75C:"!O9B!T:&ES`#L@<')O9W)A;2!I<R!L:69T960N($%L<V\@=&AA;FMSG M('1O($YE:6P@2V%T:6X@9F]R(&AI<R!M>6QI8BYA<VT@=7!O;@`[('=H:6-H) M(&5L:6(@:7,@8F%S960N`#L``"\J`"`@(%1H:7,@9FEL92!W87,@9V5N97)A. M=&5D('=I=&@@;6ML:6(`("`@8V]P>7)I9VAT(#$Y.#@@161W:6X@2&]O9V5R6 M8F5E=',``"`@(%1H:7,@<V]F='=A<F4@:7,@9G)E96QY(')E9&ES=')I8G5T* M86)L92!A<R!L;VYG(&%S('1H97)E(&ES(&YO(&-H87)G90`@("!B97EO;F0@( M<F5S;VYA8FQE(&-O<'D@9F5E<R!A;F0@87,@;&]N9R!A<R!T:&ES(&YO=&ECY M92!S=&%Y<R!I;G1A8W0N```@("!4:&%N:W,@=&\@2FEM;2!-86-K<F%Z(&9OA M<B!%;&EB(&]N($9I<V@@.#<L(&9R;VT@=VAI8V@@;75C:"!O9B!T:&ES`"`@1 M('!R;V=R86T@:7,@;&EF=&5D+B!!;'-O('1H86YK<R!T;R!.96EL($MA=&ENT M(&9O<B!H:7,@;7EL:6(N87-M('5P;VX`("`@=VAI8V@@96QI8B!I<R!B87-E_ M9"X`*B\````[.G1S/3@`.R!#;W!Y<FEG:'0@*$,I(#$Y.#8@8GD@36%N>"!3> M;V9T=V%R92!3>7-T96US+"!);F,N`#L``#L@*BHJ("`@0G5T($953DM)1DE%T M1"!B>2!J:6UM("HJ*@`[("`@("`@(&QI8G)A<GD@8F%S92!I;B!$,``[("`@; M("`@('-E9VUE;G0@;&ES="!I;B!!,``[("`@("`@(&5X96-B87-E(&EN($$V` M```[("`@("`@($EN:71I86P@<W1A<G1U<"!R;W5T:6YE(&9O<B!!>G1E8R!#? M+@``.R`@("`@("!.3U1%.B!C;V1E(&1O=VX@=&\@(G-T87)T(B!M=7-T(&)EQ M('!L86-E9"!A="!B96=I;FYI;F<@;V8`.R`@("`@("`@("`@("`@(&%L;"!PH M<F]G<F%M<R!L:6YK960@=VET:"!!>G1E8R!,:6YK97(@=7-I;F<@<VUA;&P`) M.R`@("`@("`@("`@("`@(&-O9&4@;W(@<VUA;&P@9&%T82X```!A-'-A=F4@\ M(&1C+FP@("`@,```("`@("`@("!P=6)L:6,@("YB96=I;B`@("`@("`@("`@# M("`@("`@(#L@:G5S="!T;R!R97-O;'9E(&QA8F5L`"YB96=I;@`@("`@("`@7 M('!U8FQI8R`@7V9U;FMY26YI=`!?9G5N:WE);FET.@``("`@("`@("!N96%R_ M("`@(&-O9&4``"`@("`@("`@;6]V96TN;"!D,"]D,B]D,R]D-"UD-R]A,BUAW M-BPM*'-P*0``("`@("`@("`[($953DM9('5S92!A,"P@;F]T(&$Q(&9O<B!S2 M96=M96YT(&QI<W0`("`@("`@("!M;W9E+FP@(&$P+&$T("`@("`@("`@("`@_ M("`@("`@(#M"4%12('1O(&-O9&4@<V5G`"`@("`@("`@861D+FP@("!A-"QAU M-``@("`@("`@(&%D9"YL("`@830L830@("`@("`@("`@("`@("`@("`@.VYOE M=R!R96%L(&%D9')E<W,@;V8@8V]D92!S96<``"`@("`@("`@;6]V92YL("`H) M830I+&$T("`@("`@("`@("`@("`@("`[:6YD:7)E8W0@=&\@9V5T(&1A=&$@I M<V5G;65N="!"4%12`"`@("`@("`@861D+FP@("!A-"QA-"`@("`@("`@("`@D M("`@("`@("`[8V]N=F5R="!T;R!R96%L('!O:6YT97(`("`@("`@("!A9&0N[ M;"`@(&$T+&$T("`@("`@("`@("`@("`@("`@(#MR96%L(&%D9')E<W,@;V8@\ M9&%T82!S96<@;&EN:R!F:65L9```("`@("`@("`[('-A;64@87,@8W)T,"YA( M-C@`("`@("`@("!A9&0N;"`@(",S,C<V-BLT+&$T("`@("`@("`@("`@(#MB9 M:6%S(&%P<')O<')I871E;'D@*"LT(&ES(&9O<B!L:6YK*0`@("`@("`@(&QE[ M82`@("`@7U](,5]E;F0L83$`("`@("`@("!L96$@("`@(%]?2#)?;W)G+&$R\ M`"`@("`@("`@8VUP+FP@("!A,2QA,B`@("`@("`@("`@("`@("`@("`[8VAE6 M8VL@:68@0E-3(&%N9"!$051!('1O9V5T:&5R`"`@("`@("`@8FYE("`@("!S< M=&%R="`@("`@("`@("`@("`@("`@("`[;F\L(&1O;B=T(&AA=F4@=&\@8VQEV M87(`("`@("`@("!M;W9E+G<@(",H*%]?2#)?96YD+5]?2#)?;W)G*2\T*2TQ/ M+&0Q`"`@("`@("`@8FUI("`@("!S=&%R="`@("`@("`@("`@("`@("`@("`[B M<VMI<"!I9B!N;R!B<W,`("`@("`@("!M;W9E+FP@(",P+&0R`&QO;W``("`@+ M("`@("!M;W9E+FP@(&0R+"AA,2DK("`@("`@("`@("`@("`@(#MC;&5A<B!O2 M=70@;65M;W)Y`"`@("`@("`@9&)R82`@("!D,2QL;V]P``!S=&%R=``@("`@D M("`@(&QE82`@("`@831S879E+&$Q("`@("`@("`@("`@("`@.V=E="!A9&1RJ M97-S(&]F(&$T<V%V90`@("`@("`@(&UO=F4N;"`@830L*&$Q*2`@("`@("`@9 M("`@("`@("`@.W-A=F4@830`.R`@("`@("!&54Y+60`[("`@("`@(&UO=F4NG M;"`@<W`L7U]S879S<"`@("`@("`@("`@("`@.W-A=F4@<W1A8VL@<&]I;G1EU M<B`H8V%N)W0@9F5X96,I`#L@("`@("`@;6]V92YL("`T+&$V("`@("`@("`@> M("`@("`@("`@("`[9V5T($5X96,G<R!L:6)R87)Y(&)A<V4@<&]I;G1E<@`@K M("`@("`@(&UO=F4N;"`@838L7U-Y<T)A<V4@("`@("`@("`@("`@.W!U="!W8 M:&5R92!W92!C86X@9V5T(&ET```@("`@("`@(&UO=F5M+FP@9#`O83`L+2ASU M<"D@("`@("`@("`@("`@.R!P87-S(&)A<V4@86YD('-E9VQI<W0`("`@("`@T M("!J<W(@("`@(%]F=6YK>6UA:6X@("`@("`@("`@("`@(#L@1E5.2UD`("`@H M("`@("!A9&1Q+FP@(",X+'-P("`@("`@("`@("`@("`@("`@(#MP;W`@87)G" M<R!T;R`@9G5N:WEM86EN*"D`("`@("`@("`@("`@("`@("`@("`@("`@("`@Y M("`@("`@("`@("`@(#L@8V%N('!O<"!B971T97(@*#\I```@("`@("`@(&UO. M=F5M+FP@*'-P*2LL9#`O9#(O9#,O9#0M9#<O83(M838`("`@("`@("!R=',@Z M("`@("`@("`@("`@("`@("`@("`@("`@("`@(#MA;F0@<F5T=7)N```@("`@N M("`@('!U8FQI8R`@7V=E=&$T`%]G971A-#H`("`@("`@("!M;W9E+FP@(&$T' M<V%V92QA-``@("`@("`@(')T<P``("`@("`@("!D<V5G````7U-Y<T)A<V4@E M("`@("`@(&1C+FP@("`@,```("`@("`@("!P=6)L:6,@(%]F=6YK>6UA:6X`A M("`@("`@("!P=6)L:6,@(%]3>7-"87-E`"`@("`@("`@<'5B;&EC("!?7T@Q. M7V5N9"Q?7T@R7V]R9RQ?7T@R7V5N9```("`@("`@("!E;F0``#L@("`@("`@M M<G1A9RYA<VT@+2T@<F]M=&%G```@("`@("`@("!I;F-L=61E("=E>&5C+W1Y- M<&5S+FDG`"`@("`@("`@(&EN8VQU9&4@)V5X96,O<F5S:61E;G0N:2<`("`@A M("`@("`@:6YC;'5D92`G97AE8R]N;V1E<RYI)P`@("`@("`@("!I;F-L=61E: M("=E>&5C+VQI8G)A<FEE<RYI)P``35E615)324].("`@("`@(&5Q=2`@("`@M M,0!-65!222`@("`@("`@("`@97%U("`@("`P```@("`@("`@("!C<V5G("`@? M(#L@<F]M=&%G(&UU<W0@8F4@:6X@9FER<W0@:'5N:P``("`@("`@("`@<'5B1 M;&EC("!?;7EN86UE`"`@("`@("`@('!U8FQI8R`@7VUY:60`("`@("`@("`@O M<'5B;&EC("!?;7E);FET5&%B```@("`@("`@("!D<R`@("`@(#``("`@("`@6 M("`@<'5B;&EC("!?;7E2;VU486<`7VUY4F]M5&%G.@`@("`@("`@("!D8RYW# M("`@(%)40U]-051#2%=/4D0`("`@("`@("`@9&,N;"`@("!?;7E2;VU486<`! M("`@("`@("`@9&,N;"`@("!E;F1T86<`("`@("`@("`@9&,N8B`@("!25$9?V M05543TE.250`("`@("`@("`@9&,N8B`@("!-659%4E-)3TX`("`@("`@("`@0 M9&,N8B`@("!.5%],24)205)9`"`@("`@("`@(&1C+F(@("`@35E04DD`("`@5 M("`@("`@9&,N;"`@("!?;7EN86UE`"`@("`@("`@(&1C+FP@("`@7VUY:60`: M("`@("`@("`@9&,N;"`@("!?;7E);FET5&%B`&5N9'1A9SH``"`@("`@("`@> M(&5N9``O*B!C<F5A=&5D(&)Y(&II;2!M86-K<F%Z('5S:6YG(&UY;&EB+F%S1 M;2!B>2!N96EL(&MA=&EN`"`J(&UA>2!B92!U<V5D(&%N9"!D:7-T<FEB=71E" M9"!P<F]V:61I;F<@=&AI<R!C;VUM96YT(&)L;V-K`"`J(&ES(')E=&%I;F5D> M(&EN('1H92!S;W5R8V4@8V]D90`@*B\`(VEN8VQU9&4@/'-T9&EO+F@^`"-IC M;F-L=61E(")L:6(N:"(``&5X=&5R;B`@4$9,("`@("!L:6)F=6YC=&%B6UT[1 M("`@+RH@;7D@9G5N8W1I;VX@=&%B;&4@*&QI8F9A8V4N87-M*2`@("`@("`@3 M("`@("`@*B\`97AT97)N("!,3TY'("`@(&9U;FMY26YI="@I.R`@("`O*B!H- M86-K960@=7`@=F5R<VEO;B!O9B!!>G1E8R!C<G0P+F$V."`@*B\``$Q/3D<@N M("`@;7E%>'!U;F=E*"D[``!S=')U8W0@26YI=%1A8FQE(&UY26YI=%1A8B`]] M("![`"`@("`@("`@<VEZ96]F("AS=')U8W0@37E"87-E*2P`("`@("`@("!L: M:6)F=6YC=&%B+``@("`@("`@($Y53$PL("`@("`@("`@("`@("`@("`@("`@A M("`@("`@("`@("`@("`O*B!W:6QL(&EN:71I86QI>F4@;7D@9&%T82!I;B!F` M=6YK>6UA:6XH*2`@("`@("`J+P`@("`@("`@(&9U;FMY26YI=`!].P``(V1E; M9FEN92!-65)%5DE324].("`@("`@,"`@("`@("`@("`@("`@("\J('=O=6QD+ M(&)E(&YI8V4@=&\@875T;RUI;F-R96UE;G0@=&AI<R`@("`@("`@("HO``!EJ M>'1E<FX@8VAA<B!M>6YA;65;73L`97AT97)N(&-H87(@;7EI9%M=.P``97ATT M97)N('-T<G5C="!297-I9&5N="`@;7E2;VU486<[```O*@`@*B!T:&ES(&9U) M;F-T:6]N(&ES(&UY($,M;&%N9W5A9V4@;&EB<F%R>2!I;FET4F]U=&EN92X@^ M($ET(&ES(&-A;&QE9``@*B!B>2!F=6YK>4EN:70H*2!A9G1E<B!R96=I<W1E: M<B!S879E<R!A;F0@<VUA;&P@;6]D96P@:6YI=&EA;&EZ871I;VX@:7,`("H@? M9&]N92X`("HO``!,3TY'`&9U;FMY;6%I;BAL:6)B87-E+"!S96=L:7-T*0!SL M=')U8W0@($UY0F%S92`@*FQI8F)A<V4[`%5,3TY'("`@("`@("`@("`@("`@/ M("`@('-E9VQI<W0[`'L`("`@("`@("!R96=I<W1E<B`@("`@("`@<W1R=6-T[ M($UY0F%S92`J8F%S93L``"`@("`@("`@+RH@8V]O:VEE("`@("`@("HO`"`@M M("`@("`@8F%S92`](&QI8F)A<V4[`"`@("`@("`@8F%S92T^;6)?0V]O:VEES M(#T@,'A$14%$,3(S-#L@("`O*B!D96)U9R!K:6YD(&]F('-T=69F("`@("`@; M("`@("`@("`@("`@("`@("`@("`J+P`@("`@("`@(&)A<V4M/FUB7U-E9TQIA M<W0@/2!S96=L:7-T.P``("`@("`@("`O*B!I;FET+B!L:6)R87)Y('-T<G5C; M='5R92`H<VEN8V4@22!D;VXG="!D;R!A=71O;6%T:6,@9&%T82!I;FET+BD@> M("`@("`J+P`@("`@("`@(&)A<V4M/FUB7TQI8BYL:6)?3F]D92YL;E]4>7!E7 M(#T@3E1?3$E"4D%263L`("`@("`@("!B87-E+3YM8E],:6(N;&EB7TYO9&4N1 M;&Y?3F%M92`]("AC:&%R("HI(&UY;F%M93L`("`@("`@("!B87-E+3YM8E],2 M:6(N;&EB7T9L86=S(#T@3$E"1E]354U54T5$('P@3$E"1E]#2$%.1T5$.P`@8 M("`@("`@(&)A<V4M/FUB7TQI8BYL:6)?5F5R<VEO;B`](&UY4F]M5&%G+G)T6 M7U9E<G-I;VX[`"`@("`@("`@8F%S92T^;6)?3&EB+FQI8E]2979I<VEO;B`][ M($U94D5625-)3TX[`"`@("`@("`@8F%S92T^;6)?3&EB+FQI8E])9%-T<FEN\ M9R`]("A!4%12*2!M>6ED.P``("`@("`@("`O*B`M+2TM+2!D;R!Y;W5R(&]W\ M;B!I;FET:6%L:7IA=&EO;B!H97)E("TM+2TM("`J+P!]``!,3TY'`&UY3W!E+ M;BAB87-E*2`@("`O*B!B87-E<'1R(&EN($$V+"!V97)S:6]N(&EN($0P("HOH M`'-T<G5C="`@37E"87-E("IB87-E.P![`"`@("`@("`@+RH@;6%R:R!U<R!AN M<R!H879I;F<@86YO=&AE<B!C=7-T;VUE<B`@("`@("`@("`@("`@("`@("`@S M("`@("`@("`@("`@("`@*B\`("`@("`@("!B87-E+3YM8E],:6(N;&EB7T]P' M96Y#;G0K*SL``"`@("`@("`@+RH@<')E=F5N="!D96QA>65D(&5X<'5N9V5S- M("AS=&%N9&%R9"!P<F]C961U<F4I("`@("`@("`@("`@("`@("HO`"`@("`@D M("`@8F%S92T^;6)?3&EB+FQI8E]&;&%G<R`F/2!^3$E"1E]$14Q%6%`[```@6 M("`@("`@(')E='5R;B`H*$Q/3D<I(&)A<V4I.P!]``!,3TY'`&UY0VQO<V4H9 M8F%S92D`<W1R=6-T("!->4)A<V4@*F)A<V4[`'L`("`@("`@("!,3TY'("`@5 M(')E='9A;"`](#`[```@("`@("`@(&EF("@H+2UB87-E+3YM8E],:6(N;&EB? M7T]P96Y#;G0@/3T@,"D@)B8`("`@("`@("`@("`@("`@("`@("`@("`@*&)A` M<V4M/FUB7TQI8BYL:6)?1FQA9W,@)B!,24)&7T1%3$584"DI`"`@("`@("`@O M>P`@("`@("`@("`@("`@("`@+RH@;F\@;6]R92!P96]P;&4@:&%V92!M92!O. M<&5N+``@("`@("`@("`@("`@("`@("H@86YD($D@:&%V92!A(&1E;&%Y960@2 M97AP=6YG92!P96YD:6YG`"`@("`@("`@("`@("`@("`@*B\`("`@("`@("`@: M("`@("`@(')E='9A;"`](&UY17AP=6YG92@I.R`O*B!R971U<FX@<V5G;65N1 M="!L:7-T("`@("HO`"`@("`@("`@?0``("`@("`@("!R971U<FX@*')E='9AP M;"D[`'T``$Q/3D<`;7E%>'!U;F=E*&)A<V4I`'-T<G5C="`@37E"87-E("`J[ M8F%S93L`>P`@("`@("`@(%5,3TY'("`@("`@("`@("`@("`@("`@('-E9VQI* M<W0@/2`P.P`@("`@("`@($Q/3D<@("`@("`@("`@("`@("`@("`@(&QI8G-I2 M>F4[```@("`@("`@(&EF("AB87-E+3YM8E],:6(N;&EB7T]P96Y#;G0@/3T@Q M,"D`("`@("`@("![`"`@("`@("`@("`@("`@("`O*B!R96%L;'D@97AP=6YG- M93H@<F5M;W9E(&QI8F)A<V4@86YD(&9R965M96T@("`J+P``("`@("`@("`@L M("`@("`@('-E9VQI<W0@/2!B87-E+3YM8E]396=,:7-T.P``("`@("`@("`@B M("`@("`@(%)E;6]V92AB87-E*3L``"`@("`@("`@("`@("`@("!L:6)S:7IEG M(#T@8F%S92T^;6)?3&EB+FQI8E].96=3:7IE("L@8F%S92T^;6)?3&EB+FQIZ M8E]0;W-3:7IE.P`@("`@("`@("`@("`@("`@1G)E94UE;2@H8VAA<B`J*2!B- M87-E("T@8F%S92T^;6)?3&EB+FQI8E].96=3:7IE+"`H3$].1RD@;&EB<VEZD M92D[`"`@("`@("`@?0`@("`@("`@(&5L<V4`("`@("`@("![`"`@("`@("`@J M("`@("`@("!B87-E+3YM8E],:6(N;&EB7T9L86=S("8]($Q)0D9?1$5,15A0= M.P`@("`@("`@('T````@("`@("`@("\J(')E='5R;B!.54Q,(&]R(')E86P@1 M<V5G;&ES="`J+P`@("`@("`@(')E='5R;B`H*$Q/3D<I('-E9VQI<W0I.P!]9 M````("`@("`@("!I;F-L=61E("=E>&5C+W1Y<&5S+FDG``!S971U<"`@(&UA1 M8W)O`"`@("`@("`@;6]V96TN;"!D,B]D,R]D-"UD-R]A,BUA-BPM*'-P*0`@` M("`@("`@(&IS<B`@("`@7V=E=&$T`"`@("`@("`@96YD;0``<'5S:"`@("!M4 M86-R;P`@("`@("`@(&UO=F4N;"`@7#$L+2AS<"D`("`@("`@("!E;F1M``!F: M:7@@("`@(&UA8W)O`"`@("`@("`@:69C("`@("`G7#$G+"<G`"`@("`@("`@Z M("`@("`@("!M97AI=``@("`@("`@(&5N9&,`("`@("`@("!I9FQE("`@(%PQN M+3@`("`@("`@("`@("`@("`@(&%D9'$N;"`@(UPQ+'-P`"`@("`@("`@96YD/ M8P`@("`@("`@(&EF9W0@("`@7#$M.``@("`@("`@("`@("`@("`@;&5A("`@1 M("!<,2AS<"DL<W``("`@("`@("!E;F1C`"`@("`@("`@96YD;0``<F5S=&]RM M92!M86-R;P`@("`@("`@(&9I>"`@("`@7#$`("`@("`@("!M;W9E;2YL("AS$ M<"DK+&0R+V0S+V0T+60W+V$R+6$V`"`@("`@("`@<G1S`"`@("`@("`@96YDQ M;0``("`@("`@("!D<V5G```@("`@("`@('!U8FQI8R`@7VQI8F9U;F-T86(`( M7VQI8F9U;F-T86(Z`"`@("`@("`@9&,N;"`@("!M>6]P96X`("`@("`@("!D0 M8RYL("`@(&UY8VQO<V4`("`@("`@("!D8RYL("`@(&UY97AP=6YG90`@("`@\ M("`@(&1C+FP@("`@)#`P,#```"-I;F-L=61E(#QE>&5C+W1Y<&5S+F@^`"-I1 M;F-L=61E(#QE>&5C+VYO9&5S+F@^`"-I;F-L=61E(#QE>&5C+W)E<VED96YTM M+F@^`"-I;F-L=61E(#QE>&5C+VQI8G)A<FEE<RYH/@``(VEN8VQU9&4@/&9U: M;F-T:6]N<RYH/@``='EP961E9B!,3TY'("@J4$9,*2@I.R`@("`@("\J('!OT M:6YT97(@=&\@9G5N8W1I;VX@<F5T=7)N:6YG(#,R+6)I="!I;G0@*B\``"\J7 M(&QI8G)A<GD@:6YI=&EA;&EZ871I;VX@=&%B;&4L('5S960@9F]R($%55$])+ M3DE4(&QI8G)A<FEE<R`@("`@("`@("`@("`@("`@("`@*B\`<W1R=6-T($EN= M:71486)L92![`"`@("!53$].1R`@(&ET7T1A=&%3:7IE.R`@("`O*B!L:6)RS M87)Y(&1A=&$@<W!A8V4@<VEZ92`@("`@("`@("`J+P`@("`@4$9,("`@("`J2 M:71?1G5N8U1A8FQE.R`@+RH@=&%B;&4@;V8@96YT<GD@<&]I;G1S("`@("`@P M("`@("`@*B\`("`@($%05%(@("`@:71?1&%T84EN:70[("`@("\J('1A8FQE6 M(&]F(&1A=&$@:6YI=&EA;&EZ97)S("`@("`@("HO`"`@("!01DP@("`@(&ET^ M7TEN:71&=6YC.R`@("`O*B!I;FET:6%L:7IA=&EO;B!F=6YC=&EO;B!T;R!RV M=6X@("`J+P!].P``<W1R=6-T($UY0F%S92![`"`@("!S=')U8W0@($QI8G)A$ M<GD@;6)?3&EB.P`@("`@54Q/3D<@("!M8E]#;V]K:64[("`@("`@+RH@;&]OV M:W,@9V]O9"`@("`@("`@("`@("`@("`@("`@("`@*B\`("`@(%5,3TY'("`@% M;6)?4V5G3&ES=#L`("`@(%5,3TY'("`@;6)?1FQA9W,[`"`@("!!4%12("`@V M(&UB7T5X96-"87-E.R`@("`O*B!P;VEN=&5R('1O(&5X96,@8F%S92`@("`@F M("`@("`@("`J+P`@("`@05!44B`@("!M8E]!-#L@("`@("`@("`@+RH@<')OX M<&5R('9A;'5E(&]F($$T(&9O<B!A>G1E8R!S;6%L;"!M;V1E;"`J+P!].P`@G M("`@("`@(&EN8VQU9&4@)V5X96,O='EP97,N:2<`("`@("`@("!I;F-L=61EV M("=E>&5C+VQI8G)A<FEE<RYI)P``("`@("`@("!,24))3DE4````<W1O<F4@N M("!M86-R;P`@("`@("`@(&UO=F5M+FP@9#(M9#<O83(M834L<V%F96ME97``# M("`@("`@("!E;F1M``!R971R:65V92!M86-R;P`@("`@("`@(&UO=F5M+FP@: M<V%F96ME97`L9#(M9#<O83(M834`("`@("`@("!E;F1M```@("`@("`@(&1S. M96<``'-A9F5K965P.@`@("`@("`@(&1C8BYL(#$T("`@("`[(')E<V5R=F4@I M<V]M92!S<&%C92!F;W(@=&5M<&]R87)Y(')E9VES=&5R('-T;W)A9V4``"`@D M("`@("`@8W-E9P``("`@("`@("`[("TM+2!X<F5F(&9R;VT@87!P;&EC871I$ M;VX`("`@("`@("!P=6)L:6,@(%]L:6)B87-E```@("`@("`@(#L@+2TM('ADK M968@9F]R(&%P<&QI8V%T:6]N"@`@("`@("`@(&1C+FP@("`@)&9F9F9F9F9FE M```@("`@("`@(&-S96<``"`@("`@("`@.RTM+2!L:6)R87)Y(&9U;F-T:6]N_ M<P`@("`@("`@('!U8FQI8R`@7VUY3W!E;@`@("`@("`@('!U8FQI8R`@7VUY- M0VQO<V4`("`@("`@("!P=6)L:6,@(%]M>45X<'5N9V4`3E4``!`M``E(@#\`& M3KH`*E1/2D!F%!`M``E(@%)`0>R&L@@P``(``&<*$"T`"4B`3EU.=7``8/A.; M50``$"T`"4B`4D!'`(`A3@$YU3E4``"\*)&T`""!2L>H`? M!&4,+PIA%EA/)%].74YU(%)2DA`02(#`?`#_8.Q.50``2.<(,"1M``@0*@`,K MP#P`&&<*</],WPP03EU.=0BJ``(`#$JJ``AF""\*3KH/<EA/$"H`#$B`"```2 M!V<P0>R'-"9($"L`#$B`P'P`A+!\`(1F##\\__\O"TZZ#BI<3]?\````%D'L9 MB.RWR&76/RH`$"\J``@0*@`-2(`_`$ZZ`M8X`$I`4$]N%$I$9@1P"&`"<!"!L M*@`,</]@`/]Z,`1(P"2J``C0J@`()4``!"!24I(0$$B`P'P`_V``_UI.50``0 M+PI.N@ZB)$!*@&8(<``D7TY=3G4O"B\M``PO+0`(809/[P`,8.A.50``2.<(& M("\M`!!.N@T,0>R&:B1(6$]*$F80.7P`!9;&<`!,WP003EU.=2!*(FT`#!`8/ ML!EF!$H`9O:0(4B`9P1<BF#2/RH`!"\M``A.N@#8.`"P?/__7$]F!'``8,0@Q M;0`0$40`#2!M`!`1?``!``P@+0`08*Q.50``*6T`"(CV2&T`$"\M``Q(>@`.[ M3KH("D_O``Q.74YU3E4``"\LB/8_+0`(3KH+S%Q/3EU.=4Y5```O"B1M``H,] M;?__``AG""!2L>H`"&((</\D7TY=3G53DB!2$*T`"3`M``A@[#`\?_]@!#`O\ M``Q30&L4(&\`!")O``BQ"68,4TA*&%?(__9P`$YU8P1P`4YU</].=4Y5```_I M+0`,/SP#`2\M``AA!E!/3EU.=4Y5``!(YP\P)&T`"$ZZ#ZPF;);(>`!@#C`$' MP?P`!DJS"`!G#E)$N&R([&WL>@9@``#$""T``0`,9S!(>/__+PI.NA&8+`!0E M3V<@+P9.NA'0+PI.NA%>2H!03V8.3KH1:#H`L'P`S68``(Q(>`/M+PI.NA%V? M+`!*AE!/9F`(+0````QF!'H!8&Q(>`/N+PI.NA%8+`!03V8(3KH1+#H`8%1(B M>``A2'H`DDZZ$?0N`%!/9PHO!TZZ$9Y83V`>2'@``4AZ`((O!DZZ$6)(>/__] M0J<O!DZZ$3A/[P`88"8P+0`,P'P%`+!\!0!F&"\&3KH0K'H$6$\Y19;&</],7 MWPSP3EU.=3`$P?P`!B>&"``P!,'\``8@0-'+,6T`#``$""T``P`,9Q!(>``!2 M0J<O!DZZ$-Y/[P`,,`1@PF1O<RYL:6)R87)Y````3E4``$CG#"`X+0`(3KH.> M9C`$P?P`!B1`U>R6R$I$;0JX;(CL;`1*DF80.7P``I;&</],WP0P3EU.=3`JH M``3`?``#L'P``68*.7P`!9;&</]@X'``,"T`#B\`+RT`"B\23KH05BH`L+S_9 M____3^\`#&8,3KH0##E`EL9P_V"T(`5@L$Y5```O"B1M``A*$F<@($I2BA`0H M2(`_`$ZZ"52P?/__5$]F"'#_)%].74YU8-P_/``*3KH).E1/8.QA<$/LB/9%% M[(CVM<EF#C(\`X9K"'0`(L)1R?_\*4^6S"QX``0I3I;02.>`@`@N``0!*6<0< M2_H`"$ZN_^)@!D*G\U].<T/Z`"!.KOYH*4"6U&8,+CP``X`'3J[_E&`$3KH`_ M&E!/3G5D;W,N;&EB<F%R>0!)^0``?_Y.=4Y5```O"DAY``$``#`LB.S!_``&8 M+P!.N@_,*4"6R%!/9A1"ITAY``$``$ZZ#Y!03RYLELQ.=2!LELA":``$(&R6< MR#%\``$`$"!LEL@Q?``!``H@;);,("R6S)"H``10@"E`EM@@;);8(+Q-04Y8Q M0J=.N@^`)$!*J@"L6$]G+B\M``PO+0`(+PI.N@"N.7P``9;<(&R6R`!H@```U M!"!LEL@`:(````I/[P`,8$)(:@!<3KH/FDAJ`%Q.N@]<*4"6WB!LEMY*J``D_ M4$]G$"!LEMXB:``D+Q%.N@Y26$\O+);>+PI.N@)H*6R6WI;B4$].N@Y2(&R6W MR""`3KH.@"!LEL@A0``&9Q9(>`/M2'H`*DZZ#EP@;);((4``#%!/+RR6XC\L. MEN9.NM("0F=.N@QL4$\D7TY=3G4J`$Y5``!(YPPP)&T`$"!M``A*J`"L9Q@@\ M;0`(("@`K.6`*``@1"`H`!#E@"9`8`0F;(CN$!-(@$C`T*T`#%2`.4"6Z$*G9 M,"R6Z$C`+P!.N@Y>*4"6ZE!/9@A,WPPP3EU.=1`32(`Z`#\%($M2B"\(+RR6F MZDZZ`7XP!4C`($#1[);J0_H!1!#99OP_+0`.+PHO+);J3KH!.B!LENI",%``W M.7P``9;F,`5(P-"LENHF0%*+)$M/[P`4$!-(@#H`L'P`(&<8NGP`"6<2NGP`- M#&<,NGP`#6<&NGP`"F8$4HM@V`P3`"!M>@P3`")F+E*+($M2BQ`02(`Z`&<>U M($I2BA"%NGP`(F80#!,`(F8$4HM@!D(J__]@`F#68#@@2U*+$!!(@#H`9R:ZB M?``@9R"Z?``)9QJZ?``,9Q2Z?``-9PZZ?``*9P@@2E**$(5@SB!*4HI"$$I%W M9@)3BU)LEN9@`/]:0A)"IS`LEN920$C`Y8`O`$ZZ#3PI0);B4$]F"$)LEN9@% M`/[8>@`F;);J8"0P!4C`Y8`@;);B(8L(`"!+(`A*&&;\D<!3B#`(4D!(P-?`L M4D6Z;);F;=8P!4C`Y8`@;);B0K`(`&``_I0@`#`\?_]@!#`O``P@;P`$2AAF" M_%-((F\`"%-`$-E7R/_\9P)"$"`O``1.=4SO`P``!"`(,B\`#&`"$-E7R?_\4 M9P9206`"0AA1R?_\3G5.50``2.<.,"1M``A"ITAZ`(Y.N@S"*4"6[E!/9@A,2 MWPQP3EU.=2!M``PB:``D+RD`!$ZZ#/(H`%A/9U)(>@!M($0O*``V3KH,Q"9`8 M2H!03V<T2'@#[2\+3KH+QBP`4$]G)"`&Y8`J`"!%)6@`"`"D)48`G$AX`^U(O M>@`X3KH+HB5``*!03R\$3KH,D%A/+RR6[DZZ"_1"K);N6$]@@&EC;VXN;&EBV M<F%R>0!724Y$3U<`*@!.50``+P0I;0`(B/I(;0`0+RT`#$AZ`!I.N@#<.``@[ M;(CZ0A`P!$_O``PH'TY=3G5.50``(&R(^E*LB/H0+0`)$(!(@,!\`/].74YUK M3E4``$AM``PO+0`(2'H$8$ZZ`)A/[P`,3EU.=4Y5``!(YP@@)&T`#@QM``0`< M$F8((&T`""@08!Q*;0`,;PP@;0`(<``P$"@`8`H@;0`(,!!(P"@`0FT`$DIM; M``QL$$1M``Q*A&P(1(0[?``!`!(R+0`,2,$@!$ZZ`Y!![(:@4XH4L```,BT`? M#$C!(`1.N@.&*`!FVDIM`!)G!E.*%+P`+2`*3-\$$$Y=3G5.5?\B2.<(,"1M5 M``@F;0`,0FW_^BMM`!#__"!+4HL0$$B`.`!G``+NN'P`)68``LQ"+?\P.WP`3 M`?_X.WP`(/_V.WPG$/_T($M2BQ`02(`X`+!\`"UF#D)M__@@2U*+$!!(@#@`H MN'P`,&80.WP`,/_V($M2BQ`02(`X`+A\`"IF&"!M__Q4K?_\.U#_\B!+4HL02 M$$B`.`!@,D)M__)@'#`M__+!_``*T$20?``P.T#_\B!+4HL0$$B`.``P!%)`] M0>R&L@@P``(``&;4N'P`+F9:($M2BQ`02(`X`+!\`"IF&"!M__Q4K?_\.U#_% M]"!+4HL0$$B`.`!@,D)M__1@'#`M__3!_``*T$20?``P.T#_]"!+4HL0$$B`1 M.``P!%)`0>R&L@@P``(``&;4.WP``O_PN'P`;&82($M2BQ`02(`X`#M\``3_Y M\&`0N'P`:&8*($M2BQ`02(`X`#`$2,!@>CM\``C_[F`6.WP`"O_N8`X[?``0O M_^Y@!CM\__;_[C\M__!(;?\P/RW_[B\M__Q.NOWD*T#_ZC`M__!(P-&M__Q/T M[P`,8%P@;?_\6*W__")0*TG_ZB`)2AEF_)/`4XD[2?_P8$H@;?_\5*W__#@04 M0>W_+RM(_^H0A&`HD+P```!C9^)3@&>2D+P````+9P#_<EF`9[)5@&<`_W!7[ M@&<`_W)@S$'M_S"1[?_J.TC_\#`M__"P;?_T;P8[;?_T__!*;?_X9V@@;?_J( M#!``+6<*(&W_Z@P0`"MF+@QM`##_]F8F4VW_\B!M_^I2K?_J$!!(@#\`3I*P[ M?/__5$]F"G#_3-\,$$Y=3G5@%C\M__9.DK!\__]43V8$</]@Y%)M__HP+?_R8 M4VW_\K!M__!NW$)M_^Y@("!M_^I2K?_J$!!(@#\`3I*P?/__5$]F!'#_8+!20 M;?_N(&W_ZDH09PHP+?_NL&W_]&W.,"W_[M%M__I*;?_X9BA@&#\\`"!.DK!\, M__]43V8&</]@`/]X4FW_^C`M__)3;?_RL&W_\&[:8!8_!$Z2L'S__U1/9@9P@ M_V``_U)2;?_Z8`#]"#`M__I@`/]"2.=(`$*$2H!J!$2`4D1*@6H&1($*1``!B M83Y*1&<"1(!,WP`22H!.=4CG2`!"A$J`:@1$@%)$2H%J`D2!81H@`6#8+P%A4 M$B`!(A]*@$YU+P%A!B(?2H!.=4CG,`!(04I!9B!(038!-`!"0$A`@,,B`$A`* M,@*"PS`!0D%(04S?``Q.=4A!)@$B`$)!2$%(0$)`=`_0@-.!MH%B!)*#4D!14 MRO_R3-\`#$YU3E4``$ALATH_+0`(3KH`"%Q/3EU.=4Y5```O!#@M``@O+0`*C M/P1.N@`PN'P`"EQ/9B0@;0`*$"@`#$B`"```!V<4/SS__R\M``I.N@#T7$\H) M'TY=3G5@^$Y5```O"B1M``H@4K'J``1E&#`M``C`?`#_/P`O"DZZ`,A<3R1?` M3EU.=2!24I(0+0`)$(!(@,!\`/]@Z$Y5```O"D'LAS0D2"!*U?P````6+PAA^ M$%A/0>R([+7(9>HD7TY=3G5.50``2.<(("1M``AX`"`*9@IP_TS?!!!.74YU6 M2BH`#&=0""H``@`,9PP_//__+PIA4C@`7$\0*@`-2(`_`$ZZ!1R(0`@J``$`D M#%1/9PHO*@`(3KH"+EA/""H`!0`,9Q(O*@`23KH"P"\J`!).N@(44$]"DD*JY M``1"J@`(0BH`##`$8)!.5?_^2.<(("1M``A!^O]&*4B6\@@J``0`#&<*</],+ MWP003EU.=0@J``(`#&<P(%*1Z@`(.`@_!"\J``@0*@`-2(`_`$ZZ`H"P1%!/\ M9Q`(Z@`$``Q"DD*J``1P_V#`#&W__P`,9A`(J@`"``Q"DD*J``1P`&"H2JH`U M"&8(+PI.N@":6$\,:@`!`!!F*AMM``W__S\\``%(;?__$"H`#4B`/P!.N@(B+ ML'P``5!/9J`P+0`,8`#_:B2J``@P*@`02,#0J@`()4``!`CJ``(`#"!24I(0= M+0`-$(!(@,!\`/]@`/\^3E4``"\*0>R'-"1(2BH`#&<8U?P````60>R([+7(> M90AP`"1?3EU.=6#B0I)"J@`$0JH`""`*8.I.5?_\+PHD;0`(/SP$`$ZZ`,`K> M0/_\5$]F\``$`$"!*T?P````.)4@`""1?3EU.=35\!```$`CJ``$`#"5M? M__P`"!`J``U(@#\`3KH`XDI`5$]G!@`J`(``#&#.3E4``$CG`#`D;(C^8!0FK M4B`J``10@"\`+PI.N@1X4$\D2R`*9NA"K(C^3-\,`$Y=3G5.50``+PI!^O_&7 M*4B6]D*G("T`"%"`+P!.N@0F)$!*@%!/9@AP`"1?3EU.=22LB/XE;0`(``0IE M2HC^(`I0@&#F3E4``'``,"T`""\`8;)83TY=3G5.50``2.<`,)?+)&R(_F`.' M(&T`"%&(L<IG$B9*)%(@"F;N</],WPP`3EU.=2`+9P0FDF`$*5*(_B`J``10K M@"\`+PI.N@/*<`!03V#83E4``"\*,"T`",'\``8D0-7LELA*;0`(;0XP+0`(J ML&R([&P$2I)F#CE\``*6QG#_)%].74YU,"T`",'\``8@;);(+S`(`$ZZ`L9*6 M@%A/9P1P`6`"<`!@V$Y5```O+0`(3KH"D$J`6$]F#DZZ`IHY0);&</].74YUI M<`!@^$Y5``!(YPP@."T`"$ZZ`'`P!,'\``8D0-7LELA*1&T*N&R([&P$2I)FT M$#E\``*6QG#_3-\$,$Y=3G4P*@`$P'P``V8*.7P`!9;&</]@Y'``,"T`#B\`_ M+RT`"B\23KH"D"H`L+S_____3^\`#&8,3KH"&CE`EL9P_V"X(`5@M$Y5__Q(N M>!``0J=.N@+T*T#__`@```Q03V<22FR6W&8(("W__$Y=3G5.N@`&<`!@]$Y5" M``!(>``$2'H`'$ZZ`?XO`$ZZ`BP_/``!3KH`#D_O``Y.74YU7D,*`$Y5``!*R MK);R9P8@;);R3I`_+0`(3KH`"%1/3EU.=4Y5__PO!#`M``A(P"M`__Q*K);(@ M9RAX`&`*/P1.N@#^5$]21+ALB.QM\#`LB.S!_``&+P`O+);(3KH"%E!/2JR6N M]F<&(&R6]DZ02JR(\F<*+RR(\DZZ`9)83TJLEOIG""!LEOH@K);^2JR7`F<*" M+RR7`DZZ`:Y83TJLEP9G"B\LEP9.N@&>6$]*K)<*9PHO+)<*3KH!CEA/2JR7K M#F<*+RR7#DZZ`7Y83RQX``0(+@`$`2EG%"\-2_H`"DZN_^(J7V`&0J?S7TYS' M2JR6WF8P2JR6ZF<H,"R6Z$C`+P`O+);J3KH!;C`LEN920$C`Y8`O`"\LEN)./ MN@%:3^\`$&`.3KH!2"\LEMY.N@%T6$\@+?_\+FR6S$YU*!].74YU3E4``$CGC M#B`X+0`(,`3!_``&)$#5[);(2D1M"KALB.QL!$J29A`Y?``"EL9P_TS?!'!.C M74YU""H`!P`$9@@O$DZZ``I83T*2<`!@XB(O``0L;);43N[_W"(O``0L;);40 M3N[_@B(O``0L;);43N[_N"QLEM1.[O_*+&R6U$[N_WPB+P`$+&R6U$[N_RA,- M[P`&``0L;);43N[_K$SO``8`!"QLEM1.[O_B+&R6U$[N_\1,[P`.``0L;);46 M3N[_UDSO``X`!"QLEM1.[O^^3OH``B(O``0L;);43N[_IDSO``X`!"QLEM1.X M[O_02.<!!$SO((``#"QLEM!.KO^43-\@@$YU3OH``B)O``0L;);03N[^8DSOG M``,`!"QLEM!.[O\Z(F\`!"QLEM!.[O[:+&R6T$[N_WPB;P`$("\`""QLEM!.. M[O\N(&\`!"QLEM!.[OZ,+&R6T")O``0@+P`(3N[]V")O``0L;);03N[^ADSO[ M``,`!"QLEM!.[O[.(&\`!"QLEM!.[OZ`3.\#```$+&R6[D[N_Z`@;P`$+&R62 M[D[N_Z8@;P`$+&R6[D[N_[(``````^P````!`````0``/P8````````#\@``6 M`^H```(]```````````````$````!P````H````-````$````!,````6````' M&0```!P````?````(@```"4````H````*P```````!+(```2\0``$Q0``!,6; M```37@``$Z0``!.F```3[```%#(``!1)```42@``%%0````````45@``%',`Z M`!1T```4D0```````!2X```4N0``%-```!31```4V0``%.<``!3W```5#P``F M%2$``!4B```5*P``%3D``!5)```58@``%70``!5U```5@```%8X``!6>```5C MN0``%<L````````5S```%?$``!84```6%@``%EX``!:D```6I@``%NP``!<R+ M```720``%TL````````73```%T\``!=U```7F0``%YH``!?C```8*@``&"L`W M`!AR```8N0``&-$``!C4````````&-8``!C=```9$0``&1,``!D4```9-@``E M&5$``!EL```9@P``&80``!FQ```9L@``&?0``!HV```:6@``&EL``!I<```:3 M;@``&F\``!JO```:M@``&M$``!K=```:W@``&O,``!KT```;'P``&R```!M0E M```;B@``&Z```!OF```;YP``'#(``!QS```<P```',$``!S<```=*0``'44`9 M`!UA```=J0``'>H``!X8```>4```'F8``!YK```>I0``'KT``!Z^```>Q```8 M'P,``!\T```?0@``'XP``!_5```@%@``(!<``"!7```@AP``(,D``"$&```AQ M!P``(3(``"%F```A9P``(7X``"&&```AH```(:P``"&M```AN@``(;L``"&\? M```AU@``(=<``"'R```B"P``(C8``"(W````````(D0``")?```B8```(H``K M`"*C```BPP``(N<``"+H```C`@``(QP``",=```C30``(TX``"-G```C?@``M M(YH``".;```CK@``(\D``"/4```C\P``)`X``"0F```D1```)%\``"1[```DO MD@``)*L``"3"```DW@``).8``"3G````````)/0``"4L```E:```)8H``"6.V M```EH0``);(``"6S```F!@``)E$``"92```F9P``)F@``":(```FJ```)KP`) M`"<?```G,0``)S0``"<U```GD```)Y$``">G```GNP``)[P``"?>```GWP``B M)^(``"@G```H<```*'D``"A]```H?@``*(,``"B?```HN0``*-H``"C<```I> M"0``*0H``"DE```I/0``*9@``"F\```IO0``*A```"I$```J?0``*KL``"KS- M```K(P``*U0``"M5```KD```*Y(``"N3```KF```*\L``"OA```KXP``+#8`X M`"Q:```L6P``+*8``"S6```LUP``+/4``"SW```L^```+/T``"T+```M(0``[ M+2,``"T_```M0```+7$``"VQ```MNP``+>L``"XC```N-P``+GH``"Z$```NC MA0``+IX``"Z@```NH0``+J8``"ZV```NS0``+L\``"[\```O)0``+R8``"]1Q M```O6P``+YX``"^?```ORP``+\P``"_J```OZP``,#H``#"-```PEP``,*0`/ M`#"N```PY0``,.\``##P```P\0``,1L``#$\```Q/@```````#%````Q7P``\ M,6```#%N```QE@``,:T``#&Z```QNP``,<D``#'B```Q[P``,?```#'^```R; M%@``,BP``#(Y```R3@``,FT``#)Z```RCP``,K$``#*^```RRP``,LP``#+:% M```R[0``,Q4``#,A```S+@``,R\``#,\```S/0``,UD``#-F```S?0``,Y4`Z M`#.O````````,\8``#/>```S]@``-!$``#0M```T+@``-$4``#1&```TD0``5 M-)(``#3E```T^```-3L``#5^```UP0``-@0``#8'```V"```-A@``#8T```V' M=P``-H\``#:E```VZ```-S,````````W-@``-U4``#=X```W>0```````#>*X M```WBP``-YD``#>^```WRP``-\P``#?;```X````.`T``#@.```X&P``.!P`( M`#@F```X;P``.'```#A]```X?@``.*(``#B[```XO````````#C@```X^@``C M./L``#D(```Y"0``.2@``#E````Y60````!R``````!R*P````)W`````P%WE M*P```P)A````"0%A*P``"0)X````!0%X*P``!0(````````P,3(S-#4V-S@YG M86)C9&5F````("`@("`@("`@,#`P,#`@("`@("`@("`@("`@("`@(""00$!`U M0$!`0$!`0$!`0$!`#`P,#`P,#`P,#$!`0$!`0$`)"0D)"0D!`0$!`0$!`0$!X M`0$!`0$!`0$!`4!`0$!`0`H*"@H*"@("`@("`@("`@("`@("`@("`@("0$!`N M0"```````````````````0`````!``````````````````````$!`````0``E M```````````````````!`@````$`````````````````````````````````$ M````````````````````````````````````````````````````````````` M````````````````````````````````````````````````````````````` M````````````````````````````````````````````````````````````` M````````````````````````````````````````````````````````````` M````````````````````````````````````````````````````````````` M````````````````````````````````````````````````````````````` M````````````````````````````````````````````````````````````` M````````````````````````````````````````````````````%```````4 M```````#[````8H`````````"`````P````0````%````!@````<````(```& M`"0````H````+````#`````T````.````#P```!$````2````$P```!0````X M5````%@```!<````8````&0```!H````;````'````!X````?````(````"$( M````C````)````"4````F````)P```"@````I````*@```"L````L````+0`@ M``"X````O````,````#$````R````,P```#0````U````-@```#<````Y```( M`.@```#L````\````/0```#X````_````0````$$```!"````0P```$4```!> M&````1P```$@```!)````2@```$L```!,````30```$X```!/````4````%(W M```!3````5````%4```!6````5P```%@```!9````6@```%L```!<````70`K M``%X```!?````8````&$```!B````8P```&0```!E````9@```&<```!H```/ M`:0```&H```!K````;````&T```!N````;P```'````!Q````<@```',```!T MT````=0```'8```!W````>````'D```!Z````>P```'P```!]````?@```'\3 M```"`````@0```((```"#````A````(4```"&````AP```(@```")````B@`R M``(L```",````C0```(X```"/````D````)$```"2````DP```)0```"5```6 M`E@```)<```"8````F0```)H```";````G````)T```">````GP```*````"\ MA````HP```*0```"E````I@```*<```"H````J0```*H```"K````K````*TZ M```"N````KP```+````"Q````L@```+,```"T````M0```+8```"W````N``: M``+D```"Z````NP```+P```"]````O@```+\```#`````P0```,(```#$```& M`Q0```,8```#'````R````,D```#*````RP```,P```#-````S@```,\```#< M0````T0```-(```#3````U````-4```#6````UP```-@```#9````V@```-LI M```#<````W0```-X```#?````X````.$```#B````XP```.0```#E````Y@`- M``.<```#H````Z0```.H```#K````[````.T```#N````[P```/````#Q```Q M`\@```/,```#T````]0```/8```#W````^````/D```#Z````^P```/P```#8 M]````_@```/\```$````!`0```0(```$#```!!````04```$&```!!P```0@B M```$)```!"@```0L```$,```!#0```0X```$/```!$````1$```$2```!$P`4 M``10```$5```!%@```1<```$8```!&0```1H```$;```!'````1T```$>```X M!'P```2````$A```!(@```2,```$D```!)0```28```$G```!*````2D```$@ MJ```!*P```2P```$M```!+@```2\```$P```!,0```3(```$S```!-````344 M```$W```!.````3D```$Z```!.P```3P```$]```!/@```3\```%````!00`^ M``4(```%#```!1````44```%&```!1P```4@```%)```!2@```4L```%,```K M!30```4X```%/```!4````5$```%2```!4P```50```%5```!5@```5<```%4 M8```!60```5H```%;```!70```5X```%?```!8````6$```%B```!8P```60? M```%E```!9@```6<```%H```!:0```6H```%K```!;````6T```%N```!;P`O M``7````%Q```!<@```7,```%T```!=0```7<```%X```!>0```7H```%\```K M!?0```7X```%_```!@````8$```&"```!@P```80```&%```!A@```8<```&= M(```!B0```8H```&+```!C````8T```&.```!CP```9$```&2```!DP```90: D```&5```!E@```9<```&8`````````/R```#ZP````$```/R9 `` end size 24336 SHAR_EOF cat << \SHAR_EOF > readme Mklib Copyright 1988 Edwin Hoogerbeets Version 1.0 12/08/88 Some time ago, I started a project that was to use an Amiga shared library for some of its functions. Unfortunately, almost all libraries before this were written in assembler, and mine were written in C. So after some searching, some kind soul (I forgot who, sorry) told me of elib of Fish 87. I played with that and got it working. (Thanks, Jimm!) What I wanted, though, was to write my routines in C and not fiddle with the assembler interface, etc. So, I decided to write mklib and keep my fiddling with the assembler to this one session. (thud thud <- knock on wood) I know the scanner/parser is a kludge: it was quick and dirty. But it works. Some assumptions are made about the C code: that the number of { matches the number of } in a functions, that declarations only occur when the numbers of { and }'s are equal, that the only valid functions are LONG or ULONG and that everything else is rubbish. I don't own the Lattice C compiler, so this code is not guaranteed to work with it. If someone out there who does have Lattice hacks it into useable code, please send me your changes and I will incorperate them into the next (?) release. Now the default stuff: This software is freely redistributable as long as there is no charge beyond resonable copy fees and as long as this notice stays intact. Thanks to Jimm Mackraz for Elib on Fish 87, from which much of this program is lifted. Also thanks to Neil Katin for his mylib.asm upon which elib is based. My address is: Work: {backbone}!utai!utcsri!hcr!edwin Until Sept. 88 School:{backbone}!watmath!trillium!ehoogerbeets From Sept. to Dec. 88 (In Jan-Apr, back to work, then to school, every 4 months, etc...) Now back to my original project that needed this library... (it's like, properly nested projects, ya know) SHAR_EOF cat << \SHAR_EOF > t.c #include <exec/types.h> #include <stdio.h> #include <functions.h> #include "link.h" #define RTC printf("return to continue - ");fflush(stdout);\ getchar(); #define DOUBARG 19 main() { LONG retval; printf("here we go\n"); libbase = (APTR) OpenLibrary("mylib.library", 0L); printf("openlib returns base: %lx\n", libbase); RTC; if (libbase) { /* test function GetDown() */ retval = GetDown(); printf("called getdown, %ld returned\n", retval); RTC; /* test function Double() */ printf("double of %d = %ld\n", DOUBARG, Double((LONG)DOUBARG)); RTC; /* test function Triple() */ printf("Here is three times %d: %ld\n",DOUBARG, Triple((LONG)DOUBARG)); RTC; printf("Here is 12+13: %ld\n",Add((LONG)12,(LONG)13)); printf("Here is 1+2+3+4+5+6: %ld\n", Sum ( (LONG)1, (LONG)2, (LONG)3, (LONG)4, (LONG)5, (LONG)6)); CloseLibrary(libbase); } } SHAR_EOF cat << \SHAR_EOF > text.c /* Mklib 1.0 - a source file generator for Amiga shared libraries Compiled with Manx v3.6a small code model/16 bit int. (see makefile) copyright 1988 Edwin Hoogerbeets This software and the files it produces are freely redistributable as long there is no charge beyond reasonable copy fees and as long as this notice stays intact. Thanks to Jimm Mackraz for Elib on Fish 87, from which much of this program is lifted. Also thanks to Neil Katin for his mylib.asm upon */ #include <stdio.h> #include <ctype.h> #include <edlib.h> char *makeheader[] = { "# This makefile was generated with mklib", "# copyright 1988 Edwin Hoogerbeets", "#", "# This software is freely redistributable as long as there is no charge", "# beyond resonable copy fees and as long as this notice stays intact.", "#", "# Thanks to Jimm Mackraz for Elib on Fish 87, from which much of this", "# program is lifted. Also thanks to Neil Katin for his mylib.asm upon", "# which elib is based.", "", "CFLAGS=-T", "", NULL }; char *makefooter[] = { " ln $(OBJS) -lc -o $@", "", "#yourprog: yourprog.o link.o", "# ln yourprog.o link.o -lc -o $@", NULL }; char *facemid[] = { "", " public _geta4", "", "myopen:", " setup", " push a6", " jsr _myOpen", " restore 4", "", "myclose:", " setup", " push a6", " jsr _myClose", " restore 4", "", "myexpunge:", " setup", " push a6", " jsr _myExpunge", " restore 4", "", NULL }; char *asmheader[] = { "; This file was generated with mklib", "; copyright 1988 Edwin Hoogerbeets", ";", "; This software is freely redistributable as long as there is no charge", "; beyond resonable copy fees and as long as this notice stays intact.", ";", "; Thanks to Jimm Mackraz for Elib on Fish 87, from which much of this", "; program is lifted. Also thanks to Neil Katin for his mylib.asm upon", "; which elib is based.", ";", "", NULL }; char *cheader[] = { "/*", " This file was generated with mklib", " copyright 1988 Edwin Hoogerbeets", "", " This software is freely redistributable as long as there is no charge", " beyond resonable copy fees and as long as this notice stays intact.", "", " Thanks to Jimm Mackraz for Elib on Fish 87, from which much of this", " program is lifted. Also thanks to Neil Katin for his mylib.asm upon", " which elib is based.", "*/", "", NULL }; char *startupcode[] = { ";:ts=8", "; Copyright (C) 1986 by Manx Software Systems, Inc.", ";", "", "; *** But FUNKIFIED by jimm ***", "; library base in D0", "; segment list in A0", "; execbase in A6", "", "; Initial startup routine for Aztec C.", "", "; NOTE: code down to \"start\" must be placed at beginning of", "; all programs linked with Aztec Linker using small", "; code or small data.", "", "", "a4save dc.l 0", "", " public .begin ; just to resolve label", ".begin", " public _funkyInit", "_funkyInit:", "", " near code", "", " movem.l d0/d2/d3/d4-d7/a2-a6,-(sp)", "", " ; FUNKY use a0, not a1 for segment list", " move.l a0,a4 ;BPTR to code seg", " add.l a4,a4", " add.l a4,a4 ;now real address of code seg", "", " move.l (a4),a4 ;indirect to get data segment BPTR", " add.l a4,a4 ;convert to real pointer", " add.l a4,a4 ;real address of data seg link field", "", " ; same as crt0.a68", " add.l #32766+4,a4 ;bias appropriately (+4 is for link)", " lea __H1_end,a1", " lea __H2_org,a2", " cmp.l a1,a2 ;check if BSS and DATA together", " bne start ;no, don't have to clear", " move.w #((__H2_end-__H2_org)/4)-1,d1", " bmi start ;skip if no bss", " move.l #0,d2", "loop", " move.l d2,(a1)+ ;clear out memory", " dbra d1,loop", "", "start", " lea a4save,a1 ;get address of a4save", " move.l a4,(a1) ;save a4", "; FUNKY", "; move.l sp,__savsp ;save stack pointer (can't fexec)", "; move.l 4,a6 ;get Exec's library base pointer", " move.l a6,_SysBase ;put where we can get it", "", " movem.l d0/a0,-(sp) ; pass base and seglist", " jsr _funkymain ; FUNKY", " addq.l #8,sp ;pop args to funkymain()", " ; can pop better (?)", "", " movem.l (sp)+,d0/d2/d3/d4-d7/a2-a6", " rts ;and return", "", " public _geta4", "_geta4:", " move.l a4save,a4", " rts", "", " dseg", "", "", "_SysBase dc.l 0", "", " public _funkymain", " public _SysBase", " public __H1_end,__H2_org,__H2_end", "", " end", NULL }; char *rtag[] = { "; rtag.asm -- romtag", "", " include 'exec/types.i'", " include 'exec/resident.i'", " include 'exec/nodes.i'", " include 'exec/libraries.i'", "", "MYVERSION equ 1", "MYPRI equ 0", "", " cseg ; romtag must be in first hunk", "", " public _myname", " public _myid", " public _myInitTab", "", " ds 0", " public _myRomTag", "_myRomTag:", " dc.w RTC_MATCHWORD", " dc.l _myRomTag", " dc.l endtag", " dc.b RTF_AUTOINIT", " dc.b MYVERSION", " dc.b NT_LIBRARY", " dc.b MYPRI", " dc.l _myname", " dc.l _myid", " dc.l _myInitTab", "endtag:", "", " end", NULL }; char *mandatory[] = { "/* created by jim mackraz using mylib.asm by neil katin", " * may be used and distributed providing this comment block", " * is retained in the source code", " */", "#include <stdio.h>", "#include \"lib.h\"", "", "extern PFL libfunctab[]; /* my function table (libface.asm) */", "extern LONG funkyInit(); /* hacked up version of Aztec crt0.a68 */", "", "LONG myExpunge();", "", "struct InitTable myInitTab = {", " sizeof (struct MyBase),", " libfunctab,", " NULL, /* will initialize my data in funkymain() */", " funkyInit", "};", "", "#define MYREVISION 0 /* would be nice to auto-increment this */", "", "extern char myname[];", "extern char myid[];", "", "extern struct Resident myRomTag;", "", "/*", " * this function is my C-language library initRoutine. It is called", " * by funkyInit() after register saves and small model initialization is", " * done.", " */", "", "LONG", "funkymain(libbase, seglist)", "struct MyBase *libbase;", "ULONG seglist;", "{", " register struct MyBase *base;", "", " /* cookie */", " base = libbase;", " base->mb_Cookie = 0xDEAD1234; /* debug kind of stuff */", " base->mb_SegList = seglist;", "", " /* init. library structure (since I don't do automatic data init.) */", " base->mb_Lib.lib_Node.ln_Type = NT_LIBRARY;", " base->mb_Lib.lib_Node.ln_Name = (char *) myname;", " base->mb_Lib.lib_Flags = LIBF_SUMUSED | LIBF_CHANGED;", " base->mb_Lib.lib_Version = myRomTag.rt_Version;", " base->mb_Lib.lib_Revision = MYREVISION;", " base->mb_Lib.lib_IdString = (APTR) myid;", "", " /* ----- do your own initialization here ----- */", "}", "", "LONG", "myOpen(base) /* baseptr in A6, version in D0 */", "struct MyBase *base;", "{", " /* mark us as having another customer */", " base->mb_Lib.lib_OpenCnt++;", "", " /* prevent delayed expunges (standard procedure) */", " base->mb_Lib.lib_Flags &= ~LIBF_DELEXP;", "", " return ((LONG) base);", "}", "", "LONG", "myClose(base)", "struct MyBase *base;", "{", " LONG retval = 0;", "", " if ((--base->mb_Lib.lib_OpenCnt == 0) &&", " (base->mb_Lib.lib_Flags & LIBF_DELEXP))", " {", " /* no more people have me open,", " * and I have a delayed expunge pending", " */", " retval = myExpunge(); /* return segment list */", " }", "", " return (retval);", "}", "", "LONG", "myExpunge(base)", "struct MyBase *base;", "{", " ULONG seglist = 0;", " LONG libsize;", "", " if (base->mb_Lib.lib_OpenCnt == 0)", " {", " /* really expunge: remove libbase and freemem */", "", " seglist = base->mb_SegList;", "", " Remove(base);", "", " libsize = base->mb_Lib.lib_NegSize + base->mb_Lib.lib_PosSize;", " FreeMem((char *) base - base->mb_Lib.lib_NegSize, (LONG) libsize);", " }", " else", " {", " base->mb_Lib.lib_Flags &= LIBF_DELEXP;", " }", "", "", " /* return NULL or real seglist */", " return ((LONG) seglist);", "}", "", NULL }; char *faceheader[] = { " include 'exec/types.i'", "", "setup macro", " movem.l d2/d3/d4-d7/a2-a6,-(sp)", " jsr _geta4", " endm", "", "push macro", " move.l \\1,-(sp)", " endm", "", "fix macro", " ifc '\\1',''", " mexit", " endc", " ifle \\1-8", " addq.l #\\1,sp", " endc", " ifgt \\1-8", " lea \\1(sp),sp", " endc", " endm", "", "restore macro", " fix \\1", " movem.l (sp)+,d2/d3/d4-d7/a2-a6", " rts", " endm", "", " dseg", "", " public _libfunctab", "_libfunctab:", " dc.l myopen", " dc.l myclose", " dc.l myexpunge", " dc.l $0000", NULL }; char *incbody[] = { "#include <exec/types.h>", "#include <exec/nodes.h>", "#include <exec/resident.h>", "#include <exec/libraries.h>", "", "#include <functions.h>", "", "typedef LONG (*PFL)(); /* pointer to function returning 32-bit int */", "", "/* library initialization table, used for AUTOINIT libraries */", "struct InitTable {", " ULONG it_DataSize; /* library data space size */", " PFL *it_FuncTable; /* table of entry points */", " APTR it_DataInit; /* table of data initializers */", " PFL it_InitFunc; /* initialization function to run */", "};", "", "struct MyBase {", " struct Library mb_Lib;", " ULONG mb_Cookie; /* looks good */", " ULONG mb_SegList;", " ULONG mb_Flags;", " APTR mb_ExecBase; /* pointer to exec base */", " APTR mb_A4; /* proper value of A4 for aztec small model */", "};", NULL }; char *linkhead[] = { " include 'exec/types.i'", " include 'exec/libraries.i'", "", " LIBINIT", NULL }; char *link2[] = { "", "store macro", " movem.l d2-d7/a2-a5,safekeep", " endm", "", "retrieve macro", " movem.l safekeep,d2-d7/a2-a5", " endm", "", " dseg", "", "safekeep:", " dcb.l 14 ; reserve some space for temporary register storage", "", " cseg", "", " ; --- xref from application", " public _libbase", "", " ; --- xdef for application\n", NULL }; char *face2[] = { " dc.l $ffffffff", "", " cseg", "", " ;--- library functions", " public _myOpen", " public _myClose", " public _myExpunge", NULL }; SHAR_EOF # End of shell archive exit 0 -- Bob Page, U of Lowell CS Dept. page@swan.ulowell.edu ulowell!page Have five nice days.