b~UTEXAS_LASER.SAV6UTEXAS_LASER.SAV?BACK/LIST=UTEXAS_LASER.LIS UTEXAS$ROOT:*.* UTEXAS_LASER.SAV/SAV KERMA +0`V5.2 _LCR5::  _$1$DUA2: V5.2 ~ (2*[DECUS.DECUS87.VAX87A.UTEXAS.LASER]AAAREADME.DOC;1+,s./& 4K-s0123KPWO56`7j+7@^89G&HJ KLASER is a user-written print symbiont that is tailored specifically to theApple LaserWriter. Submitted by: Rick Watson Computation Center University Of Texas At Austin Austin, TX 78712CThis version of the symbiont is in use at several sites, but shouldEstill be considered to be in "BETA" testing. It has only been testedHwith version 23 of the LaserWriter, but should work with later versions.GThe symbiont as distributed is configured to print normal text files inHa variety of formats on the laser printer. Support is also included forDprinting PostScript files, MacPaint files, and Zeta plot files. See4LASER.C for additional capabilities of the symbiont.2This distribution consists of the following files:File Destination PurposeK---------------------------------------------------------------------------7LASER.EXE SYS$SYSTEM:LASER.EXE The symbiont executable.CLASER.TLB SYS$LIBRARY:LASER.TLB Library of PostScript header files.LASER.C Symbiont source.&LASER_ERR.MSG Error message source.LASER.OPT Link options file. QUIDEF.H Source header files.SMBDEF.HLBRDEF.H>LASER.HLP SYS$HELP:HELPLIB.HLB Description of forms supported.:SYST.COM SYS$MANAGER:SYSTARTUP.COM Queue startup commands. Installation.GInstallation of the files can be accomplished with the following set of commands:&$ COPY LASER.EXE SYS$SYSTEM:/PROT=W:RE'$ COPY LASER.TLB SYS$LIBRARY:/PROT=W:RE2$ LIBRARY /HELP SYS$HELP:HELPLIB LASER ! OptionalESelect a terminal port to attach the printer to, and edit SYST.COM toDreflect your change. SYST.COM may be invoked by your system startupDprocedures. The printer may be connected with a cable that has onlyBtransmit, receive and ground pins connected. Transmit and receiveDshould (I think) be swapped. The switch on the LaserWriter should beEswitched to the "9600" position. If you are sharing your LaserWriterEwith a Macintosh connected via AppleTalk, use the following procedurewhen switching the printer:!To switch the printer to the VAX:11. Insure that no AppleTalk jobs are in progress.*2. Switch switch on LaserWriter to "9600".3. $START/QUEUE ALW!To switch the printer to the MAC:1. $STOP/QUEUE/NEXT ALW*2. Allow any jobs in progress to complete./3. Switch switch on LaserWriter to "AppleTalk".F$ CREATE SYS$SYSDEVICE:[LASER]. This area is used for LASER log filesHfor spooled files, or when the laser log cannot be created in the user'sEdirectory. The location and name of the directory may be changed by Fchanging the definition for LASER$LOG in SYST.COM. Log files are onlyEcreated when there is an error in the job, or when the job sends back6information (i.e. using the PostScript PRINT command).To build the symbiont: $ CC LASER$ MESSAGE LASER_ERR$ LINK LASER.OPT/OPT'PostScript is a trademark of Adobe Inc.:LaserWriter and MacPaint are trademarks of Apple Computer..*[DECUS.DECUS87.VAX87A.UTEXAS.LASER]LASER.C;216+,s.Q/& 4YQQ.-s0123KPWOR56i`7^89G&HJl=/*** LASER - A Single-Threaded Asynchronous Symbiont to drive* an Apple LaserWriter.*7* Copyright (C) 1987, The University of Texas at Austin* * Rick Watson#* The University of Texas at Austin* Computation Center* Austin, TX 78712* 512/471-3241*$* arpa: ccaw001@utadnx.cc.utexas.edu* bitnet: ccaw001@utadnx* span: utspan::ccaw001* uucp: ...seismo!ut-ngp!rick*B* This user-writter symbiont is tailored specifically to the Apple.* LaserWriter. It has the following features:*=* 1. Page counting is done by reading the page count from the;* laserwriter at the beginning and the end of each file.=* This mechanism also "synchronizes" the user job with the=* laserwriter. If the laserwriter does not respond to the>* first request for a page count, the symbiont notifies the>* operator, and continues to poll the laserwriter. This is?* usefull if the laserwriter is being shared with MAC users.*@* 2. Parameters may be passed to postscript modules in the setupC* library via 2 mechanisms. The text from a $PRINT /NOTE= * command will be sent first.?* The /PARAMETER switch may also be used. Each entry can be>* one of two formats. An entry without the "=" character in?* it is sent as (param) . An entry with the ?* "=" character in is is sent as () .:* The parameters are defined in an array called /param.;* Example: /PARAMETER=(1,SIZE=5,"str=(a+b)") generates:1* /param [(param1) 1 (size) 5 (str) (a+b)] defD* All alphabetics are forced to lower case. Using the /PARAMETER?* switch forces sending PARSER from LASER.TLB as part of the6* PostScript program sent to the printer. Look at >* other files in LASER.TLB for examples of using the PARSER * module.*@* 3. If the name of a setup module ends with "_HEX" the file to C* be printed is "hexified" to the laser printer. This is useful3* for sending bitimage files to the laserwriter.*B* 4. A log of responses from the laserwriter is created. This is D* usefull for debugging postscript programs. The file is createdB* as .LASER_LOG. In the case of spooled output,D* the log file is written to LASER$LOG:.LASER_LOG.4* These files are automatically deleted if empty.*F* 5. Printer error messages from the laserwriter are sent to operators2* enabled to receive PRINT messages from OPCOM.*?* 6. A "%%[ Flushing:" response from the printer will abort the* current file.*D* 7. Spooled files: Spooled files normally default to FORMS=HEADERS?* if the recommended queue initialize procedure is followed.?* By specifying special filenames, the user can override the9* forms used, and pass parameters to the setup module.4* The syntax is: "_._"6* where is the name of a form to use and@* is of the form: -[_...].:* (Note the use of "-" instead of "=" for a separator.)?* For example: $ copy zeta.plt alw:_zeta._ncopies-5_scale-2&* (The kludge of the century, huh?)*6* Outputs (in the following order) to the laserwriter:*"* 1. "/note def\r\n".F* 2. /param definition and library module PARSER if /parameter switch * presentG* 3. If the setup module is "HEADERS", the string "/filename ,* def" and "/formname def"7* 3. The first file or forms setup module if specified.@* 4. The file to be printed itself. If the setup module ends in9* "_HEX" the file is hex-ified to the printer instead.*B* where: is the string from $PRINT /NOTE=G* is the string from $PRINT /PARAM=(""...)D* is the file specification for the file to print.** Limitations, bugs, etc:** 1. No checkpointing is done.C* 2. $PRINT/COPIES=n sends the job to the LaserWriter n times. ThisB* is not optimal, but is how the job controller handles things.A* It makes sense for most printers. Multiple copy handling is@* better handled in most of the postscript setup files. Also.* /note="/#copies n def" will usually work.'* 3. $PRINT/SPACE=n is not implemented.G* 4. FLAG and BURST pages are not implemented. (But TRAILER pages are).B* Trailer pages are used because the stack on "top" of the job.:* 5. FORTRAN carriage control is incompletely implemented.,* 6. Does not handle lists of setup modules.** Recommended device setup:*E* $ define/system/exec/trans=(concealed,terminal) alw : ! laser;* $ set term /perm /speed=9600 /nomodem /notype /nohang alwD* $ set term /perm /hostsync /pasthru /ttsync /eightbit /nobroad alw* $ set term /perm /noauto alw* $ set prot=o:rwlp /dev alw0* $ set device /spooled=(ALW,sys$sysdevice:) alw** Recommended queue initialize:** $ initialize/queue/start -;* /default=(noburst,nofeed,noflag,notrailer,form=headers) -'* /separate=(noburst,noflag,trailer) - -* /library=laser /base_prio=8 /form=headers -* /processor=laser /on=alw: alw** Modification History: * 12-Feb-1987 R. Watson Created.B* 15-Apr-1987 R. Watson Added some record format processing (cr,* fortran).;* 16-Apr-1987 R. Watson Allow ':' as a parameter separator.D* 21-Apr-1987 R. Watson Some mods to trailer page. Send PATCH module* if v 23.0 printer.C* 24-Apr-1987 R. Watson This version submitted to Spring '87 Decus.*/#include #include #include #include #include #include #include #include #include #include "smbdef.h"#include "lbrdef.h"#include "quidef.h"#define TRUE 1#define FALSE 0:#define MAXITEMS 60 /* max expected items from jobctl */O#define WRITELASER(p1,p2) stat = sys$qiow(0,laserchan, IO$_WRITEPBLK, 0, 0, 0,\2p1, p2, 0, 0, 0, 0); checkstat(stat,"writelaser");5void jobctl_ast(); /* job controller ast routine */@void laser_read_ast(); /* laser read completion ast routine */struct { int item_code; /* code */. unsigned short item_size; /* size of item */% char *buffer; /* address of item */} item[MAXITEMS];Dglobalvalue LASER$_MAXITEMS; /* exit statuses found in laser_err */ globalvalue LASER$_ITEMNOTFOUND;"globalvalue LASER$_STREAMNOTSTART;globalvalue LASER$_TOOMANYTABS;globalvalue LASER$_FLUSHED;!globalvalue LASER$_SETUPNOTFOUND;int ii = 0; /* item index */.int start_task = FALSE; /* start task flag */%int stop_task; /* stop task flag */.int stop_reason; /* stop task reason code */.int spooled_file; /* TRUE if spooled file */,int laser_efn; /* laser read event flag */&int startpage; /* task start page */"int endpage; /* task end page */$int jobstart; /* job start page */+int ascii; /* TRUE if ascii main file */5int status_idle; /* TRUE if idle status received */9int patchneeded = FALSE; /* TRUE if patch module sent */0short laserchan = 0; /* laserwriter channel */4unsigned short laser_iosb[4]; /* laser read iosb */.char laser_buf[1024]; /* laser read buffer */0struct FAB main_fab; /* main file rms stuff */struct NAM main_nam;struct RAB main_rab;.struct FAB log_fab; /* log file rms stuff */struct RAB log_rab;Mstruct dsc$descriptor_d library_spec = {0, DSC$K_DTYPE_T, DSC$K_CLASS_D, 0};Jstruct dsc$descriptor_d buffer_des = {0, DSC$K_DTYPE_T, DSC$K_CLASS_D, 0};Gstruct dsc$descriptor_d savelog = {0, DSC$K_DTYPE_T, DSC$K_CLASS_D, 0};'int userlog = -1; /* user log file */-struct { /* operator message to printer */ char type; char target; short fill; long id; char text[255];-} msg = {OPC$_RQ_RQST, OPC$M_NM_PRINT, 0, 0};%struct dsc$descriptor_s oprmsg_dsc = ) {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, &msg};main(){ int stat; ' preset(); /* initialize symbiont */  do {2 while (!start_task) { /* wait for start_task */ stat = sys$hiber();% checkstat(stat,"wait start_task"); }! processtask(); /* do a job */l } while (TRUE);}uA/** check_operator - checks for a laserwriter message that should7* go to the operator.+* returns TRUE if message sent to operator.i*/check_operator(){  int i;o7 if (strncmp(laser_buf,"%%[ PrinterError:", 17) == 0) {c< if (strlen(laser_buf) > 255) return FALSE; /* check max */A for (i = 0;i* If the filename has "[]_" in it, then this is a spooled file<* that the user wants to specify the form name for. Further,8* if the extension starts with "_", then it contains the=* user parameter list. We forge the item list to make things * look right.s*/checkspooled(){lE struct dsc$descriptor_s temp = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};oE struct dsc$descriptor_d dynd = {0, DSC$K_DTYPE_T, DSC$K_CLASS_D, 0};e char *cp, *pp, spoolfile[255]; int len, i, stat; int ourindex;1 char setup[257]; /* where to put setup name */t$ long iosb[2]; /* for $getquiw */0 short setupl; /* returned length of setup */) struct { /* item list for $getquiw */. short l1;n short c1;s char *b1;, long *r1;g short l2;t short c2;O char *b2;p long *r2;. long end;f( } itmlst = {0, QUI$_SEARCH_NAME, 0, 0,; sizeof(setup)-1, QUI$_FORM_SETUP_MODULES, setup, &setupl,  0};a spooled_file = FALSE; !/* get the file specification */.H if (!getitemdescrip(SMBMSG$K_FILE_SPECIFICATION, &temp, FALSE)) return; .; strncpy(spoolfile, temp.dsc$a_pointer, temp.dsc$w_length);F" spoolfile[temp.dsc$w_length] = 0; /* check for []_ */ i, if (!(cp = strchr(spoolfile, '['))) return; if (!(*++cp == ']')) return;- spooled_file = TRUE; /* file is spooled */e if (!(*++cp == '_')) return;s "8/* find the extension and terminate the name string */  n% if (!(pp = strchr(cp, '.'))) return;e *pp = 0;o cp++;6/* translate the form name into setup module names */8/* If it won't translate, then pass on the form name */. itmlst.l1 = strlen(cp); /* point to name */ itmlst.b1 = cp;B stat = sys$getquiw(0, QUI$_DISPLAY_FORM, 0, &itmlst, iosb, 0, 0); checkstat(stat, "getquiw");2 if ((iosb[0] & 1) != 1) /* if no translation */ strcpy(setup, cp); elsei setup[setupl] = 0;@/* forge the file setup module to have our setup module name */H/* Note that the forge transfers the dynamic string "dynd" to "item" */8 ourindex = findandclritem(SMBMSG$K_FILE_SETUP_MODULES);0 dynd.dsc$w_length = 0; /* get dyamic string */ dynd.dsc$a_pointer = 0; len = strlen(setup); str$copy_r(&dynd, &len, setup);C item[ourindex].item_size = dynd.dsc$w_length; /* complete forge */t, item[ourindex].buffer = dynd.dsc$a_pointer;0/* forge the form name to have our form name */ t/ ourindex = findandclritem(SMBMSG$K_FORM_NAME);.0 dynd.dsc$w_length = 0; /* get dyamic string */ dynd.dsc$a_pointer = 0;/ len = strlen(cp); /* pointer to form name */  str$copy_r(&dynd, &len, cp);tC item[ourindex].item_size = dynd.dsc$w_length; /* complete forge */g, item[ourindex].buffer = dynd.dsc$a_pointer; p//* now check to see if there are parameters */ * cp = ++pp; /* set extension address */9 if (pp = strchr(cp,';')) *pp = 0; /* terminate at ";" */e ( for (i = 0; i < 8; i++) {0 if (*cp != '_') return; /* check next char */ cp++; /* advance over it */= /* if there is another _, point to it, else point to the */s /* end of the string */m7 if ((pp = strchr(cp,'_')) == 0) pp = cp + strlen(cp);o. len = pp - cp; /* find length of string */2 if (len == 0) continue; /* if null parameter */ /* forge the item */c4 ourindex = findandclritem(SMBMSG$K_PARAMETER_1+i);1 dynd.dsc$w_length = 0; /* get dyamic string */  dynd.dsc$a_pointer = 0;s str$copy_r(&dynd, &len, cp);/ item[ourindex].item_size = dynd.dsc$w_length;e- item[ourindex].buffer = dynd.dsc$a_pointer;r cp = pp; }}  r)/** findandclritem - find and clear item.y*s=* Finds an item in the item list. Releases the dynamic stringl<* for that item. If the item doesn't exist in the item list, * create it.*8$* return: index to item in item list*/findandclritem(whichitem).int whichitem;{W int i;oE struct dsc$descriptor_d temp = {0, DSC$K_DTYPE_T, DSC$K_CLASS_D, 0};t3 for (i = 0; i < ii; i++) { /* search item list */, if (whichitem == item[i].item_code) break; } p' if (i == ii) { /* if end of list */>< if (++ii > MAXITEMS) exit(LASER$_MAXITEMS); /* new item */ item[i].item_code = whichitem; item[i].item_size = 0; item[i].buffer = 0; return i; /* return index */ }< temp.dsc$w_length = item[i].item_size; /* release string */% temp.dsc$a_pointer = item[i].buffer;6 str$free1_dx(&temp);m item[i].buffer = 0; return i;}R5/** checkstat - check value of system service return.,*/checkstat(stat, string)k int stat;w char *string;{  if (!(stat & 1)) exit(stat);l}a /** closefile - close main file.*/ closefile()c{l int stat;# stat = sys$close(&main_fab, 0, 0);/ /* ignore error */}r'/** closeuserlog - close user log file.e*/closeuserlog(){* int stat;, if (userlog == -1) return; /* if no log */5/* If no records written, set for delete on close */E T2 if (userlog == 0) log_fab.fab$l_fop |= FAB$M_DLT; stat = sys$close(&log_fab); checkstat(stat,"close log");a 2 str$free1_dx(&savelog); /* release saved log */ userlog = -1;}k F./** expand_hex - expand buffer into hex bytes.*/expand_hex(ibuf, obuf, rsz)o4unsigned char *ibuf; /* pointer to input buffer */-char *obuf; /* pointer to output buffer */ )int *rsz; /* pointer to buffer size *//{a int i;p int c;n( static char hex[] = "0123456789ABCDEF"; t for (i = 0; i < *rsz; i++) {s) obuf[i*2] = hex[(ibuf[i] & 0xF0) >> 4]; # obuf[i*2+1] = hex[ibuf[i] & 0xF];  } *rsz = (*rsz) * 2;e}  ;./** expand_tabs - expand tabs in input buffer.*/expand_tabs(ibuf, obuf, rsz)"char *ibuf; /* input buffer */ char *obuf;i*int *rsz; /* pointer to buffer size */{f int i, d, col;B* d = 0; /* preset destination index */ col = 0; /* preset column */ for (i = 0; i < *rsz; i++) {f% if (ibuf[i] == 9 ) { /* if tab */ do {s& obuf[d++] = ' '; /* fill spaces */ col++; } while (col & 7);t }d< else if ((ibuf[i] == 8) && (col > 0)) { /* if backspace */) obuf[d++] = 8; /* insert backspace */$ col--; }C else {' obuf[d++] = ibuf[i]; /* move char */* col++;t }  }% *rsz = d; /* return new length */y}1/** getitems - get item list from job controller.2*/ getitems(){_ int stat;/ int context; /* read_message_item context */p! int item_code; /* item code */S+ unsigned short item_size; /* item size */a& struct dsc$descriptor_d item_buffer =) {0, DSC$K_DTYPE_T, DSC$K_CLASS_D, 0};k# context = 0; /* init context */ /* Save each item in a list */w  do {a@ item_buffer.dsc$a_pointer = 0; /* force d string allocation */5 stat = smb$read_message_item(&buffer_des, &context, ( &item_code, &item_buffer, &item_size);! item[ii].item_code = item_code;t! item[ii].item_size = item_size;. item[ii].buffer = item_buffer.dsc$a_pointer;- if (++ii > MAXITEMS) exit(LASER$_MAXITEMS);b } while (stat == SS$_NORMAL);}a,/** getitemdescrip - return item descriptor.*t* return: TRUE if item found)* FALSE if (item not found) && NOT FATAL;$* exit if (item not found) && FATAL*/$getitemdescrip(code, descrip, fatal)+int code; /* item code to search for */ >struct dsc$descriptor_s *descrip; /* pointer to descriptor */#int fatal; /* error severity */]{e int i;i for (i = 0; i < ii; i++) { 1 if (item[i].item_code == code) { /* if found */e- descrip->dsc$w_length = item[i].item_size;O+ descrip->dsc$a_pointer = item[i].buffer;t return TRUE;t }e }= if (fatal) exit(LASER$_ITEMNOTFOUND); /* item not in list */; else return FALSE;t}u//** getcopies - send copy count to laserwriter.b* <* Leave this here for now, but unfortunately, if you specify9* /copies=n to the print command, the job contoller sendss.* the file that many times. Not what we want.*/ getcopies() {[ int stat, n;%E struct dsc$descriptor_s temp = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};r char defcopy[80];9 if (!getitemdescrip(SMBMSG$K_FILE_COPIES, &temp, FALSE))&9 if (!getitemdescrip(SMBMSG$K_JOB_COPIES, &temp, FALSE)) return; /* if no copies */c" n = * (long*) temp.dsc$a_pointer;+ if (n == 1) return; /* if only 1 copy */p, sprintf(defcopy, "/#copies %d def\r\n", n);$ WRITELASER(defcopy,strlen(defcopy))} ./** getnote - get /note= to laserwriter.*/ getnote()d{x int stat;E struct dsc$descriptor_s temp = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};  {E if (!getitemdescrip(SMBMSG$K_NOTE, &temp, FALSE)) return; /* none */E 1 WRITELASER(temp.dsc$a_pointer,temp.dsc$w_length)$ WRITELASER(&0x0A0D,2) /* cr-lf */}l$/** getparams - get user parameters.*/ getparams()p{e int stat; int i, j; int first=TRUE;E struct dsc$descriptor_s temp = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0}; # char param[255], str[255+15], *eq; % static $DESCRIPTOR(parser,"PARSER");8 for (i = 0; i < 8; i++) { /* loop for 8 parameters */< if (!getitemdescrip(SMBMSG$K_PARAMETER_1+i, &temp, FALSE))# continue; /* if no parameter */_< if (temp.dsc$w_length == 0) continue; /* if null string */$ if (first) { /* if first one */ first = FALSE;t! WRITELASER("/params [\r\n",11); }*8 strncpy(param, temp.dsc$a_pointer, temp.dsc$w_length); param[temp.dsc$w_length] = 0;  ; for (j= 0; j < strlen(param); j++) /* lowercase string */g+ if (isupper(param[j])) param[j] ^= 0x20;2 B/* if there is an = separator (or - for spooled files), use it */ < if ((eq = strchr(param, '=')) || (eq = strchr(param, '-'))" || (eq = strchr(param, ':'))) {& *eq++ = 0; /* bust string in 2 */* sprintf(str, "(%s) %s\r\n", param, eq); }t4 else sprintf(str, "(param%d) %s\r\n", i+1, param); WRITELASER(str,strlen(str)) } i, if (!first) { /* if some params found */ WRITELASER("] def\r\n",7)r5 writemodule(parser); /* write the parser module */n }}o//** getsetup - get setup module to laserwriter.+*=0* return: TRUE if no problems with setup module.+* FALSE if setup module nonexistant */ getsetup(){e int stat, len;o int library_index;l long txtrfa[2]; char inbuf[255];aY struct dsc$descriptor_s inbufdes = {sizeof(inbuf), DSC$K_DTYPE_T, DSC$K_CLASS_S, inbuf};;# struct dsc$descriptor_s outbufdes;cD struct dsc$descriptor_s key = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};E struct dsc$descriptor_s temp = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};n 1 ascii = TRUE; /* assume main file is ascii */l J/* Try for a file setup module first, then a form setup module. For now,H we only support one setup module, the first found. We should support- lists of setup modules, and all found. */D S? if (!getitemdescrip(SMBMSG$K_FILE_SETUP_MODULES, &key, FALSE))_@ if (!getitemdescrip(SMBMSG$K_FORM_SETUP_MODULES, &key, FALSE))" return TRUE; /* if no setup */: if (key.dsc$w_length == 0) return TRUE; /* if no setup */ dG/* Get out if no library. Error because the user specified a setup. */t' if (library_spec.dsc$a_pointer == 0) {N% stop_reason = LASER$_SETUPNOTFOUND;  return FALSE; }I/* If the setup module name ends in "_HEX", clear the ascii file flag */c if (key.dsc$w_length >= 4)[H if (strncmp(&key.dsc$a_pointer[key.dsc$w_length-4], "_HEX", 4) == 0) ascii = FALSE; sI/* if this is the setup module HEADERS, assume it needs to have the file  name defined. */9 if (strncmp(key.dsc$a_pointer, "HEADERS", 7) == 0) {t; getitemdescrip(SMBMSG$K_FILE_SPECIFICATION, &temp, TRUE);' strcpy(inbuf, "/filename (");8 strncat(inbuf, temp.dsc$a_pointer, temp.dsc$w_length); strcat(inbuf, ") def\r\n");o! WRITELASER(inbuf,strlen(inbuf)) +/* Also send the form name if it exists */c9 if (getitemdescrip(SMBMSG$K_FORM_NAME, &temp, FALSE)) {n strcpy(inbuf, "/formname (");9 strncat(inbuf, temp.dsc$a_pointer, temp.dsc$w_length);d strcat(inbuf, ") def \r\n");M" WRITELASER(inbuf,strlen(inbuf)) }g } i/* Send the setup module */ if (!writemodule(key)) {d% stop_reason = LASER$_SETUPNOTFOUND;e return FALSE;g } return TRUE;b}e%/** inititems - initialize item list.}*/ inititems() {d int i;m3 for (i = 0; i < MAXITEMS; i++) item[i].buffer = 0;e}i+/** initsymb - initialize printer symbiont..*/ initsymb(){t int stat;A stat = smb$initialize(&SMBMSG$K_STRUCTURE_LEVEL, jobctl_ast, 0); checkstat(stat, "initsymb");} :/** jobctl_ast - ast routine called by the job controller.*/void jobctl_ast()S{ int stat;$ int request; /* jobctl request */E struct dsc$descriptor_s temp = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};i4 stat = smb$read_message(&0, &buffer_des, &request);$ if (stat != SS$_NORMAL) exit(stat);/* Process the request */ switch (request) {s  case SMBMSG$K_START_STREAM: getitems();r startstream(); break; case SMBMSG$K_START_TASK:e getitems();r start_task = TRUE; stop_task = 0; stop_reason = 0; break; case SMBMSG$K_RESUME_TASK: getitems();  break; case SMBMSG$K_RESET_STREAM:e resetstream(); break; case SMBMSG$K_STOP_STREAM: stopstream();s break; case SMBMSG$K_PAUSE_TASK:f break; case SMBMSG$K_STOP_TASK: getitems();;7 getitemdescrip(SMBMSG$K_STOP_CONDITION, &temp, TRUE);o+ stop_task = * (long*) temp.dsc$a_pointer;o break; } sys$wake(0,0);*}i7/** laser_read_ast - laser read ast completion routine.**/void laser_read_ast(param) int param;{e int iosb_stat;e iosb_stat = laser_iosb[0]; 8 if (iosb_stat == 0) return; /* if incomplete io (?) */C if ((iosb_stat == SS$_ABORT) || (iosb_stat == SS$_CANCEL)) return; = if (iosb_stat != SS$_NORMAL) exit(iosb_stat); /* if error */i0 if (laser_iosb[1]) { /* if bytes in buffer */6 laser_buf[laser_iosb[1]] = 0; /* terminate string */) if (!check_operator()) writeuserlog(); }) postlaserread(); /* issue next read */i}i"/** openfile - open the main file.*7!* return: FALSE if open problems.s*/ openfile(){i int stat;E struct dsc$descriptor_s temp = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};s struct dsc$descriptor_s fid =9 {28, DSC$K_DTYPE_T, DSC$K_CLASS_S, main_nam.nam$t_dvi};(; getitemdescrip(SMBMSG$K_FILE_IDENTIFICATION, &temp, TRUE);f ( main_fab = cc$rms_fab; /* init fab */> main_fab.fab$l_nam = &main_nam; /* use NAM to open by FID */! main_fab.fab$l_fop |= FAB$M_NAM;  ( main_nam = cc$rms_nam; /* init nam */ str$copy_dx(&fid, &temp);  stat = sys$open(&main_fab);) if (!(stat & 1)) { /* if open error */( stop_reason = stat;e return FALSE;8 } o. main_rab = cc$rms_rab; /* initialize rab */ main_rab.rab$l_fab = &main_fab; stat = sys$connect(&main_rab);i, if (!(stat & 1)) { /* if connect error */ stop_reason = stat;r return FALSE; } return TRUE;s}g%/** openuserlog - open user log file.i*s>* Create a file using the file spec of the file to be printed,8* changing the EXT to .LASER_LOG. Try the logical name <* LASER$LOG if this does not work (probably a spooled file).*r*/ openuserlog()T{_ int stat, i;D struct dsc$descriptor_s temp;( char filename[256], filespec[255], *cp;* userlog = -1; /* flag not opened yet */& log_fab = cc$rms_fab; /* init fab */H/* Build log file name. If a spooled file, prepend the job name and */+/* put the file in LASER$LOG: */;  filename[0] = 0; i = 0; if (spooled_file) {2 getitemdescrip(SMBMSG$K_USER_NAME, &temp, TRUE);; strncpy(filename, temp.dsc$a_pointer, temp.dsc$w_length);_4 i = temp.dsc$w_length; /* trim trailing blanks */ do { filename[i] = 0;i# if (filename[--i] != ' ') break;/ } while (i > 0); strcat(filename, "-"); } : getitemdescrip(SMBMSG$K_FILE_SPECIFICATION, &temp, TRUE);: strncpy(filespec, temp.dsc$a_pointer, temp.dsc$w_length);! filespec[temp.dsc$w_length] = 0;o2 if (spooled_file) cp = strchr(filespec, ']') + 1; else cp = filespec; strcat(filename, cp); n log_fab.fab$l_dna = filename;& log_fab.fab$b_dns = strlen(filename); if (spooled_file) {/ log_fab.fab$l_fna = "LASER$LOG:.laser_log;0";e log_fab.fab$b_fns = 22;m } else {G% log_fab.fab$l_fna = ".laser_log;0";r log_fab.fab$b_fns = 12; } log_fab.fab$b_rfm = FAB$C_VAR;i log_fab.fab$b_rat = FAB$M_CR; log_fab.fab$w_mrs = 512;y stat = sys$create(&log_fab);W0 if (!(stat & 1)) return; /* if not possible */ t- log_rab = cc$rms_rab; /* initialize rab */t log_rab.rab$l_fab = &log_fab; stat = sys$connect(&log_rab); if (!(stat & 1)) return; , userlog = 0; /* flag open, no records */})9/** postlaserread - post non blocking read for laserchan.s*/postlaserread()A{(< static int term_block[2] = {0,-1}; /* end on any control */ int stat;? stat = sys$qio(laser_efn, laserchan, IO$_READPBLK+IO$M_NOECHO,c laser_iosb, laser_read_ast, 0,5 laser_buf, sizeof(laser_buf), 0, term_block, 0, 0);5 checkstat(stat, "read qio");O}a!/** preset - preset the symbiont. */preset(){o int stat;9 stat = lib$get_ef(&laser_efn); /* allocate event flag */F E& setprivs(); /* set process privs */$ inititems(); /* init item list */# initsymb(); /* do jobctl init */i}) !/** processtask - process a file.L*/ processtask()({a int stat, np, request;4 int svector[2] = {1, SS$_NORMAL}; /* stat vector */5 int acctrec[4] = {0,0,0,0}; /* accounting record */j% struct dsc$descriptor_s accounting =i; {sizeof(acctrec), DSC$K_DTYPE_T, DSC$K_CLASS_S, acctrec}; E struct dsc$descriptor_s temp = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};f e1 if (laserchan == 0) exit(LASER$_STREAMNOTSTART);) A stat = smb$send_to_jobctl(&0, &SMBMSG$K_START_TASK, 0, 0, 0, 0); 0 checkstat(stat, "processtask: send to jobct h~UTEXAS_LASER.SAVss.[DECUS.DECUS87.VAX87A.UTEXAS.LASER]LASER.C;216YQyx67l");$ postlaserread(); /* post read */1 syncprinter(); /* synchronize with printer */+ stop_task = 0; /* again to make sure */  stop_reason = 0;S0 checkspooled(); /* check for spooled file */+ openuserlog(); /* open user log file */s2 if (!openfile()) goto skip; /* open main file */*/* getcopies();*/ /* send copy count */) getnote(); /* output possible note */ * getparams(); /* get user parameters */7 if (!getsetup()) goto skip; /* output setup module */s$ sendfile(); /* send main file */ skip:& closefile(); /* close main file */! trailer(); /* send trailer */d1 sendendsequence(); /* send end job sequence */ED if (userlog > 0) svector[1] = SS$_CREATED-1; /* if errors logged */( closeuserlog(); /* close user log */9 stat = sys$cancel(laserchan); /* cancel pending read */i s' start_task = FALSE; /* clear flag */l 5 np = endpage - startpage; /* compute page count */s8 if (np >0) acctrec[0] = np; /* if no obvious error */;/* If stop_task, we were stopped by the job controller. */MB/* Else, we were stopped by some other error condition */" request = SMBMSG$K_TASK_COMPLETE;* if (stop_task) { /* if task aborted */ request = SMBMSG$K_STOP_TASK;  svector[1] = stop_task;i } else if (stop_reason) { svector[1] = stop_reason;  }, releaseitems(); /* release item list */ A5 stat = smb$send_to_jobctl(&0, &request, &accounting,e 0, 0, svector);e0 checkstat(stat, "processtask: send to jobctl");}k%/** releaseitems - release item list.y*c/* release dynamic strings gotten by read_items.*/releaseitems(){* int i; E struct dsc$descriptor_d temp = {0, DSC$K_DTYPE_T, DSC$K_CLASS_D, 0};e f$ ii = 0; /* clear item index */! for (i = 0; i < MAXITEMS; i++) {e7 if (item[i].buffer == 0) return; /* if end of list */( temp.dsc$w_length = item[i].item_size;& temp.dsc$a_pointer = item[i].buffer; str$free1_dx(&temp); item[i].buffer = 0;T }}i#/** resetstream - reset the stream. */ resetstream()s{* int stat;C stat = smb$send_to_jobctl(&0, &SMBMSG$K_RESET_STREAM, 0, 0, 0, 0);"0 checkstat(stat, "resetstream: send to jobctl");  exit (SS$_NORMAL);}s//** sendendsequence - send end of job sequence.l*/sendendsequence()i{*Istatic char getend[] = {"\004statusdict begin (%%[ end page #=) print \A*pagecount pstack pop flush end \r\n\004"}; int stat;/ int daytim[2]; /* quadword time interval */t int timeoutcount = 0; int abort_sent = FALSE;8 static $DESCRIPTOR(timetowait, "0 :5:00"); /* +5 min */ b endpage = 0;r, sys$wake(0,0); /* eat pending wakeups */' sys$hiber(); /* (instant return) */C E; WRITELASER(getend,strlen(getend)) /* write end sequence */  do {c) stat = sys$bintim(&timetowait, daytim);l checkstat(stat, "bintim");9 stat = sys$schdwk(0, 0, daytim, 0); /* wake up later */c checkstat(stat, "schdwk");, if (endpage) break; /* if sync occured */ stat = sys$hiber();f, if (endpage) break; /* if sync occured */0 if (stop_task) { /* if stop_task requested */ if (!abort_sent) {a abort_sent = TRUE;% WRITELASER(&0x0403,2) /* ^C ^D */ % WRITELASER(getend,strlen(getend)) } })2/* Notify the operator on 10 minute intervals. */ 4 if ((++timeoutcount & 1) == 0) { /* if interval */5 strcpy(msg.text, "LaserWriter job possibly hung");2 oprmsg_dsc.dsc$w_length = 8 + strlen(msg.text); sys$sndopr(&oprmsg_dsc, 0); }  } while (TRUE); K5 stat = sys$canwak(0,0); /* cancel wakeup requests */)}1/** sendfile - send the main file to the printer.o*/ sendfile(){l#define IBUFSIZE (1024)o int stat, end;s* char ibuf[IBUFSIZE]; /* input buffer */. char obuf[IBUFSIZE*2+2]; /* output buffer */ char *cp; int rsz; /* record size */ main_rab.rab$l_ubf = ibuf;r main_rab.rab$w_usz = IBUFSIZE;r do { /* send the file *// 5 stat = sys$get(&main_rab, 0, 0); /* get a record */)= if ((stat == RMS$_EOF) || (stop_task | stop_reason)) break;f% if (!(stat & 1)) { /* if error */* stop_reason = stat; break;[ }_ rsz = main_rab.rab$w_rsz;n  /* process record control */e cp = ibuf;  if (ascii) {* if (rsz) { /* remove possible col 1 */) if (main_fab.fab$b_rat & FAB$M_FTN) {f cp++; /* ignore column 1 */ rsz--;; }c }. if ((main_fab.fab$b_rat & FAB$M_CR) == 0) {* if (rsz) if (cp[rsz-1] == '\n') rsz--;* if (rsz) if (cp[rsz-1] == '\r') rsz--; } }( g+ if (ascii) { /* if normal ascii file */t cp[rsz++] = '\r'; cp[rsz++] = '\n'; expand_tabs(cp, obuf, &rsz);a6 if (rsz > (IBUFSIZE*2+2)) exit(LASER$_TOOMANYTABS); }_( else { /* if file to be hexified */ expand_hex(cp, obuf, &rsz); }& WRITELASER(obuf,rsz)  } while (TRUE);  if (!ascii) { WRITELASER(&0x0A0D,2)  }2/* send abort (^C) if stop_task, else eof (^D) */ c4 if (stop_task | stop_reason) end = 3; else end = 4; WRITELASER(&end,1) }y!/** setprivs - set process privs.)*/ setprivs(){ int stat;E static int privs[2] = {PRV$M_ALLSPOOL+PRV$M_PHY_IO+PRV$M_SYSPRV, 0}; # stat = sys$setprv(1, privs, 0, 0); checkstat(stat, "set privs");} /** set_typeahead.*=* Set /typeahead on the terminal device so characters will beE * buffered. */set_typeahead(chan) 'int chan; /* laserwriter channel */_{i int mode[3];s int stat;1 stat = sys$qiow(0, chan, IO$_SENSEMODE, 0, 0, 0,  mode, 12, 0, 0, 0, 0); if (!(stat & 1)) return stat; b7 mode[1] &= ~(TT$M_NOTYPEAHD); /* clear notypeahead */.0 stat = sys$qiow(0, chan, IO$_SETMODE, 0, 0, 0,  mode, 12, 0, 0, 0, 0); return stat;;} #/** startstream - start the stream.f*/ startstream()s{p int stat;4 static int svector[2] = {1,0}; /* status vector */G struct dsc$descriptor_s device = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};bE struct dsc$descriptor_s temp = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};e /5 getitemdescrip(SMBMSG$K_DEVICE_NAME, &device, TRUE); t8/* Copy the library file specification, if it exists */ aB if (getitemdescrip(SMBMSG$K_LIBRARY_SPECIFICATION, &temp, FALSE))$ str$copy_dx(&library_spec, &temp);- svector[1] = sys$alloc(&device, 0, 0, 0, 0);t if (svector[1] == SS$_NORMAL) a5 svector[1] = sys$assign(&device, &laserchan, 0, 0);r if (svector[1] != SS$_NORMAL) {7 stat = smb$send_to_jobctl(&0, &SMBMSG$K_START_STREAM,r 0, 0, 0, svector);P1 checkstat(stat, "startstream: send to jobctl");G return;A }8 set_typeahead(laserchan); /* set terminal typeahead */ e6 stat = smb$send_to_jobctl(&0, &SMBMSG$K_START_STREAM, 0, 0, 0, 0); /* ok */e0 checkstat(stat, "startstream: send to jobctl");}r!/** stopstream - stop the stream.e*/ stopstream(){ int stat; stat = sys$dassgn(laserchan);' checkstat(stat, "stopstream: dassgn");s laserchan = 0; B stat = smb$send_to_jobctl(&0, &SMBMSG$K_STOP_STREAM, 0, 0, 0, 0);/ checkstat(stat, "stopstream: send to jobctl");_ ; exit(SS$_NORMAL);}n0/** syncprinter - get synchronized with printer.*/ syncprinter()M{;static char getstart[] = {"\004\=version (23.0) eq { statusdict /Patch1Installed known not { \t*(%%[ patch needed ]%%\n) print } if } if \,statusdict begin (%%[ start page #=) print \*pagecount pstack pop flush end \r\n\004"}; int stat;/ int daytim[2]; /* quadword time interval */  int timeoutcount;8 static $DESCRIPTOR(timetowait, "0 ::30"); /* +30 sec */$ static $DESCRIPTOR(patch, "PATCH"); startpage = 0;  status_idle = FALSE;t  timeoutcount = 0; do {y WRITELASER(&0x14,1) /* ^T */E) stat = sys$bintim(&timetowait, daytim);d checkstat(stat, "bintim");9 stat = sys$schdwk(0, 0, daytim, 0); /* wake up later */q checkstat(stat, "schdwk"); stat = sys$hiber();0 if (status_idle) break; /* if sync occured */"/* Abort whatever is happening */ WRITELASER(&0x0403,2)r 1/* Notify the operator on 1 minute intervals. */i ; if ((++timeoutcount & 1) == 0) { /* if minute interval */c+ strcpy(msg.text, "LaserWriter offline");a2 oprmsg_dsc.dsc$w_length = 8 + strlen(msg.text); sys$sndopr(&oprmsg_dsc, 0); }   } while (TRUE); 6 stat = sys$canwak(0,0); /* cancel wakeup requests */  o timeoutcount = 0; do {D' WRITELASER(getstart,strlen(getstart))c) stat = sys$bintim(&timetowait, daytim);S checkstat(stat, "bintim");9 stat = sys$schdwk(0, 0, daytim, 0); /* wake up later */_ checkstat(stat, "schdwk"); stat = sys$hiber();t. if (startpage) break; /* if sync occured */1/* Notify the operator on 1 minute intervals. *// ; if ((++timeoutcount & 1) == 0) { /* if minute interval */k+ strcpy(msg.text, "LaserWriter offline");(2 oprmsg_dsc.dsc$w_length = 8 + strlen(msg.text); sys$sndopr(&oprmsg_dsc, 0); }p  } while (TRUE); o5 stat = sys$canwak(0,0); /* cancel wakeup requests */n /</* This looks like a good place to send the patch module */+ if (patchneeded) { /* if patch needed */o patchneeded = FALSE;3 writemodule(patch); /* write the patch module */s WRITELASER(&4, 1)  }}s a /** trailer - issue job trailer.*/ trailer()n{d int ctl, stat, stop;n short msglen;( char buf[1024]; /* scratch buffer */ char time[24];o2 char user[20], job[255], file[255], message[257]; char *cp; static char z = 0;;$ static $DESCRIPTOR(key, "TRAILER");E struct dsc$descriptor_s temp = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};/G struct dsc$descriptor_s date={23, DSC$K_DTYPE_T, DSC$K_CLASS_S, time};  struct dsc$descriptor_s msgd =w= {sizeof(message)-1, DSC$K_DTYPE_T, DSC$K_CLASS_S, message};e& static struct dsc$descriptor_s zero =* {1, DSC$K_DTYPE_T, DSC$K_CLASS_S, &z};)/* Check to see if we need a trailer. */e: getitemdescrip(SMBMSG$K_SEPARATION_CONTROL, &temp, TRUE);$ ctl = * (long*) temp.dsc$a_pointer;, /* save page count if first file of job */< if (ctl & SMBMSG$M_FIRST_FILE_OF_JOB) jobstart = startpage; ,D if (((ctl & (SMBMSG$M_JOB_TRAILER | SMBMSG$M_FILE_TRAILER))== 0) &&+ ((stop_task | stop_reason) == 0)) return;l e//* send the trailer module from the library */n% WRITELASER(&4,1) /* leading EOF */ if(!writemodule(key)) return;1 getitemdescrip(SMBMSG$K_USER_NAME, &temp, TRUE);6 strncpy(user, temp.dsc$a_pointer, temp.dsc$w_length); user[temp.dsc$w_length] = 0;i0 getitemdescrip(SMBMSG$K_JOB_NAME, &temp, TRUE);5 strncpy(job, temp.dsc$a_pointer, temp.dsc$w_length);r job[temp.dsc$w_length] = 0;: getitemdescrip(SMBMSG$K_FILE_SPECIFICATION, &temp, TRUE);6 strncpy(file, temp.dsc$a_pointer, temp.dsc$w_length); file[temp.dsc$w_length] = 0;c lib$date_time(&date); time[23] = 0; sprintf(buf,a? "setuppage (%s) h-job (%s) h-user (%s) h-file (%s) h-time ", job, user, file, time); WRITELASER(buf,strlen(buf)) d1/* only print page count on last trailer page */a d9 if (ctl & SMBMSG$M_LAST_FILE_OF_JOB) { /* if last one */p* sprintf(buf, "(%d) h-pages ", jobstart); WRITELASER(buf,strlen(buf))n } * if (stop_task | stop_reason) {a; if (stop_task) stop = stop_task; else stop = stop_reason;)& msglen = 0; /* in case of error */1 stat = sys$getmsg(stop, &msglen, &msgd, 15, 0);b checkstat(stat,"$getmsg"); message[msglen] = 0;) sprintf(buf, "(%s) h-error ", message); WRITELASER(buf,strlen(buf))n } m' if (userlog > 0) { /* if log file */n str$append(&savelog, &zero);9 for (cp=savelog.dsc$a_pointer; *cp; cp+=strlen(cp)+1) {w( sprintf(buf, "(%s) h-logline\n", cp); WRITELASER(buf,strlen(buf)) }  } p sprintf(buf, " showpage \004"); WRITELASER(buf,strlen(buf))}t,/** writemodule - write module from library.*e-* return: TRUE if module written, else FALSE.**/writemodule(key)struct dsc$descriptor_s key;{ int stat, len;e int library_index;t long txtrfa[2]; char inbuf[255]; Y struct dsc$descriptor_s inbufdes = {sizeof(inbuf), DSC$K_DTYPE_T, DSC$K_CLASS_S, inbuf};o# struct dsc$descriptor_s outbufdes;s3 if (library_spec.dsc$a_pointer == 0) return FALSE;w eH stat = lbr$ini_control(&library_index, &LBR$C_READ, &LBR$C_TYP_TXT, 0); checkstat(stat, "ini_control");? stat = lbr$open(&library_index, &library_spec, 0, 0, 0, 0, 0); checkstat(stat, "open");f5 stat = lbr$lookup_key(&library_index, &key, txtrfa);]* if ((stat & 1) != 1) { /* if bad key */# stat = lbr$close(&library_index);a# checkstat(stat, "close library");  return FALSE;d } do {n? stat = lbr$get_record(&library_index, &inbufdes, &outbufdes);e if (stat == RMS$_EOF) break;  len = outbufdes.dsc$w_length;k inbuf[len++] = '\r'; inbuf[len++] = '\n'; WRITELASER(inbuf,len)k } while (1); " stat = lbr$close(&library_index); checkstat(stat, "close");}p//** writeuserlog - write line to user log file.e*/writeuserlog(){ int stat;& static struct dsc$descriptor_s temp =) {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0};1 if (userlog == -1) return; /* if no log file */{  sys$setast(0);[ - userlog++; /* bump flag */ log_rab.rab$l_rbf = laser_buf;}' log_rab.rab$w_rsz = strlen(laser_buf);a stat = sys$put(&log_rab, 0, 0); / if (userlog <= 5) { /* save first 5 lines */s9 temp.dsc$w_length = strlen(laser_buf) + 1; /* incl 0 */;! temp.dsc$a_pointer = laser_buf;e str$append(&savelog, &temp); } r sys$setast(1);R checkstat(stat, "write log");}E  if (!ascii) { WRITELASER(&0x0A0D,2)  }2/* send abort (^C) if stop_task, else eof (^D) */ c4 if (stop_task | stop_reason) end = 3; else end = 4; WRITELASER(&end,1) }y!/** setprivs -.*[DECUS.DECUS87.VAX87A.UTEXAS.LASER]LASER.DIS;2+,s./& 4J-s0123KPWO56`?73_89G&HJ sf%sysmodsf%iv1::ccep001sf%utchpc::s.kneupersf%agl::cctlinscomb0*[DECUS.DECUS87.VAX87A.UTEXAS.LASER]LASER.EXE;143+,s.!/& 4!!-s0123 KPWO"56 D7f_89G&HJ@0DX0205([C|2hLASERV1.0m[C04-00   ? ! VAXCRTL_001@!d FORRTL_001!  LIBRTL_001y! MTHRTL_001!f SMGSHR_001!  LBRSHR_001"! SMBSRVSHR_001!  BASRTL_001wait start_task%%[ PrinterError:%%[ status: %%[ status: idle ]%%%%[ patch needed ]%%%%[ start page #=%d%%[ end page #=%d%%[ Flushing:getquiwclose log/#copies %d def writelaserwritelaserwritelaserPARSER/params [ writelaser(%s) %s (param%d) %s writelaser] def writelaser_HEXHEADERS/filename () def writelaser/formname () def writelaserinitsymb-LASER$LOG:.laser_log;0.laser_log;0read qioprocesstask: send to jobctlprocesstask: send to jobctlresetstream: send to jobctl0 :5:00writelaserbintimschdwkwritelaserwritelaserLaserWriter job possibly hungwritelaserwritelaserwritelaserset privsstartstream: send to jobctlstartstream: send to jobctlstopstream: dassgnstopstream: send to jobctl0 ::30PATCHwritelaserbintimschdwkwritelaserLaserWriter offlinewritelaserbintimschdwkLaserWriter offlinewritelaserTRAILERwritelasersetuppage (%s) h-job (%s) h-user (%s) h-file (%s) h-time writelaser(%d) h-pages writelaser$getmsg(%s) h-error writelaser(%s) h-logline writelaser showpage writelaserini_controlopenclose librarywritelaserclosewrite log0123456789ABCDEFstatusdict begin (%%[ end page #=) print pagecount pstack pop flush end @version (23.0) eq { statusdict /Patch1Installed known not { (%%[ patch needed ]%% ) print } if } if statusdict begin (%%[ start page #=) print pagecount pstack pop flush end f^= R\1lbPwl8^TRSߤcPbcPP\c\PLcL\c\PcP\\&P ߤ"cP&ߤ/cwP|~PߤDcQP PߤYc4P ߤk%|~PߤncP!hĀ|~P ăcPd Џ,WPPμ^ޭԭͽMP<ͽ~<ͽRB[~PSSc]Sc_.SPWgSSPS|~߭ԟȑPˏRRS 2RB PUfP URB\lBRbPUSPSS URB\lBRbWWT;TPWgUd_T_~TPS TTPSTSA"U~;PRT RB\lB\lSTU< ^USԭTeQTQ TP@cPѬ`TTQTe2ee< ݏ  TP@cQЬa@Qa@P`TP TQAP`ARbbTP^ ݬ^|~^S'TdRddȏbÙPd|^/URЬ VRf:ЬTЬSRRQBcPʏPPP@eAdQBcPʏP@eAdRRf ^|RUЬ WUg[ЬVEf SQS޼P A`RˏRP/ЬTEdRSQS޼PA`RSQS޼PEdA`RUUgS <^USRԭԭԭ?߭߭ePT c\LbPЭ`LP`L\Эlcc< ݏ T<^\UYSTe. TQAcP`ЬRAP`bAP`PTTeլ ݏP^"Rԭ zPhPн\\\£߭(|~|~߭2P߭|~ 2~ µPK^Rԭ P|~|~<~ݭ|~ 2~ P|~|~< ߭|~ 2c~ P^V7W\UXUT"T~9P1+P͹|~ 2f~  PZSPPSc͹|~|~͹P͹|~ 2f~  P^JRTxSդP+P|~|~d7PʏPP{<PKPRPzE (Under VMS >= 4.4, HEADERS is the default for spooled files)6LETTER Same as HEADERS except default title to false.ALANDSCAPE Same as LETTER except default wide to true, fsize to 8.@2UP Same as LANDSCAPE except default title to true and ncolumns to 2.PAINT Print a MacPaint image.+ ncopies: Number of copies. (default: 1)9 scale: Scale factor. (default: 4, recommended: 1-4) %BITIMAGE Print an uncompressed image.* ncopies: Number of copies. (default: 1)% scale: Scale factor. (default: 1)5 xsize: Number of pixels in a row. (default: 512)2 ysize: Number of pixel columns. (default: 512)A pxlwid: Number of bits in a pixel, default 1, values: 1,2,4,8ZETA Print a zeta plot file.* ncopies: Number of copies. (default: 1)% scale: Scale factor. (default: 1)A zFont: false - selects Helvetica font for internal character+ true - (default) uses Zeta characters 2 Spooling-Spooled file names have the following syntax:- _FormName._ParameterListFwhere ParameterList is a list of parameters separated by "_". Keywords2are separated from their values with "-". Example:; $ copy thing.mpt alw:_paint._scale-4_ncopies-5 2 ExamplesG1. $ PRINT/QUEUE=ALW/FORM=HEADERS/PARAM=(NCOPIES=4,FSIZE=14) STUFF.TXT9 Prints 4 copies of STUFF.TXT with a font size of 14.=2. $ PRINT/QUEUE=ALW/FORM=POST/NOTE="/debug true def" USER.PSG "Prints" (executes) a user's PostScript file. The first line sent. to the printer will be "/debug true def".*3. $ FORTRAN /LIST=ALW:_LANDSCAPE TEST.FOR? Compile a program, spooling the output to the LaserWriter.0*[DECUS.DECUS87.VAX87A.UTEXAS.LASER]LASER.OBJ;168+,:.$/& 4$$ -s0123KPWO%56>[7`/[89G&HJH2LASERV1.022-APR-1987 11:53VAX C V2.2-015PPPPP P!Pwait start_task!P%%[ PrinterError:!"P%%[ status: !/P%%[ status: idle ]%%!DP%%[ patch needed ]%%!YP%%[ start page #=!kP%d!nP%%[ end page #=!P%d!P%%[ Flushing:!Pgetquiw!Pclose logP0123456789ABCDEF!P/#copies %d def !Pwritelaser!Pwritelaser!PwritelaserP!PPARSERP!!P/params [ !Pwritelaser!P(%s) %s !P(param%d) %s ! Pwritelaser!P] def ! Pwritelaser!+P_HEX!0PHEADERS!8P/filename (!DP) def !LPwritelaser!WP/formname (!cP) def !lPwritelaser!wPinitsymb!P-!PLASER$LOG:.laser_log;0!P.laser_log;0P!Pread qio!Pprocesstask: send to jobctl!Pprocesstask: send to jobctl!Presetstream: send to jobctl!Pstatusdict begin (%%[ end page #=) print pagecount pstack pop flush end pP!P0 :5:00tP!! Pwritelaser!Pbintim!Pschdwk!$Pwritelaser!/Pwritelaser!:PLaserWriter job possibly hung!XPwritelaser!cPwritelaser!nPwritelaserxP@!yPset privsP!Pstartstream: send to jobctl!Pstartstream: send to jobctl!Pstopstream: dassgn!Pstopstream: send to jobctlPversion (23.0) eq { statusdict /Patch1Installed known not { (%%[ patch needed ]%% ) print } if } if statusdict begin (%%[ start page #=) print pagecount pstack pop flush end ;P!P0 ::30?P!!PPATCHGP!!Pwritelaser!Pbintim!Pschdwk!Pwritelaser CC$RMS_NAM CC$RMS_FAB CC$RMS_RAB CC$RMS_XABALL CC$RMS_XABDAT CC$RMS_XABFHC CC$RMS_XABKEY CC$RMS_XABPRO CC$RMS_XABRDT CC$RMS_XABSUM CC$RMS_XABTRM C$V_CTYPEDEFSLASER$_MAXITEMSLASER$_ITEMNOTFOUNDLASER$_STREAMNOTSTARTLASER$_TOOMANYTABSLASER$_FLUSHEDLASER$_SETUPNOTFOUND SET_TYPEAHEAD POSTLASERREAD OPENUSERLOGOPENFILELASER_READ_ASTINITSYMB INITITEMSGETSETUP GETPARAMSGETNOTEGETITEMDESCRIPGETITEMS EXPAND_TABS EXPAND_HEX CLOSEUSERLOG CLOSEFILE CHECKSTAT CHECKSPOOLEDCHECK_OPERATOR JOBCTL_AST PROCESSTASK CHECKSTAT SYS$HIBERPRESETSSCANFSYS$WAKE SYS$SNDOPRSTRLENSTRNCMP STR$COPY_RFINDANDCLRITEMSTRCPY CHECKSTAT SYS$GETQUIWSTRLENSTRCHRSTRNCPYGETITEMDESCRIP STR$FREE1_DXEXITEXIT SYS$CLOSE STR$FREE1_DX SYS$CLOSEEXITSMB$READ_MESSAGE_ITEMEXITSYS$QIOWSTRLENSPRINTFSYS$QIOW WRITEMODULESPRINTFSTRCHRSTRLENSTRNCPYSYS$QIOW WRITEMODULESYS$QIOWSTRLENSTRCATSTRNCATSTRCPYSTRNCMPSMB$INITIALIZESYS$WAKE STOPSTREAM RESETSTREAM STARTSTREAMEXITSMB$READ_MESSAGE POSTLASERREAD WRITEUSERLOGEXIT SYS$CONNECTSYS$OPEN STR$COPY_DX SYS$CONNECT SYS$CREATESTRLENSTRCHRSTRCATSTRNCPYSYS$QIOSETPRIVS LIB$GET_EF RELEASEITEMS SYS$CANCELSENDENDSEQUENCETRAILERSENDFILE SYNCPRINTERSMB$SEND_TO_JOBCTLEXIT STR$FREE1_DXEXITSMB$SEND_TO_JOBCTL SYS$CANWAK SYS$SNDOPRSTRCPY SYS$SCHDWK SYS$BINTIMSYS$QIOWSTRLEN SYS$HIBERSYS$WAKESYS$QIOWEXITSYS$GET SYS$SETPRVSYS$QIOWSMB$SEND_TO_JOBCTL SYS$ASSIGN SYS$ALLOC STR$COPY_DXEXITSMB$SEND_TO_JOBCTL SYS$DASSGN WRITEMODULE SYS$CANWAK SYS$SNDOPRSTRLENSTRCPY SYS$HIBER SYS$SCHDWK SYS$BINTIMSYS$QIOW STR$APPEND SYS$GETMSGSTRLENSPRINTF LIB$DATE_TIMESTRNCPY WRITEMODULESYS$QIOWSYS$QIOWLBR$GET_RECORD LBR$CLOSELBR$LOOKUP_KEYLBR$OPENLBR$INI_CONTROL STR$APPENDSYS$PUT!PLaserWriter offline!.Pwritelaser!9Pbintim!@Pschdwk!GPLaserWriter offline![PwritelaserLP!fPTRAILERPP!fK!nPwritelaser!yPsetuppage (%s) h-job (%s) h-user (%s) h-file (%s) h-time !Pwritelaser!P(%d) h-pages !Pwritelaser!P$getmsg!P(%s) h-error !Pwritelaser!P(%s) h-logline ! Pwritelaser!P showpage ! Pwritelaser!+Pini_control!7Popen!<Pclose library!JPwritelaser!UPclose^P![Pwrite logP^C$MAIN!R\PRESETl SYS$HIBERbP CHECKSTATl PROCESSTASK^!TRSߤcSTRNCMPPbcSTRLENPP\cSTRLEN\PLcL\cSTRLEN\PcSTRLENP\\   SYS$SNDOPRP ߤ"cSTRNCMPP&ߤ/cSTRNCMPP|~SYS$WAKEPߤDcSTRNCMPP PߤYcSTRNCMPP  ߤkSSCANF|~SYS$WAKEPߤncSTRNCMPP!ĀSSCANF|~SYS$WAKEP ăcSTRNCMPP  ЏLASER$_FLUSHED PPμ^!XVͽͿM|䰏!>ޭԭ ͽGETITEMDESCRIPP<ͽ~STRNCPY<ͽRB[~STRCHRPSSc] Sc_.SSTRCHRPWgSSSTRLENPS|~߭ԟ SYS$GETQUIWȑP CHECKSTATˏRRSSTRCPY 2RBFINDANDCLRITEMPUSTRLENP  STR$COPY_R URB\lBRbFINDANDCLRITEMPUSSTRLENPS STR$COPY_R URB\lBRbWWT;TSTRCHRPWgUd_T_~TSTRCHRPS TSTRLENTPSTSA"U~FINDANDCLRITEMPRT STR$COPY_R RB\lB\lSTU< ^USԭTeQTQ TP@cPѬ`TTQTe2ee< ݏLASER$_MAXITEMSEXIT TP@cQЬa@Qa@P`TP TQAP`ARb STR$FREE1_DXbTP^ ݬEXIT^|~ SYS$CLOSE^!STRddȏb SYS$CLOSEÙP CHECKSTAT STR$FREE1_DXd|^URЬ VRf:ЬTЬSRRQBcPʏPPP@eAdQBcPʏP@eAdRRf ^|RUЬ WUg[ЬVEf SQS޼P A`RˏRP/ЬTEdRSQS޼PA`RSQS޼PEdA`RUUgS <^USRԭԭԭ?߭߭eSMB$READ_MESSAGE_ITEMPT c\LbPЭ`LP`L\Эlcc< ݏtLASER$_MAXITEMSEXITT<^USTe. TQAcP`ЬRAP`bAP`PTTeլ ݏLASER$_ITEMNOTFOUNDEXITP^!Rԭ GETITEMDESCRIPPGETITEMDESCRIPPн\\\£߭SPRINTF|~|~߭STRLENP߭|~ 2~ SYS$QIOWµP CHECKSTAT^!Rԭ GETITEMDESCRIPP|~|~<~ݭ|~ 2~ SYS$QIOWP CHECKSTAT|~|~< ߭|~ 2~ SYS$QIOWP CHECKSTAT^!VW\XUT"T~GETITEMDESCRIPP1+} if } image showpage, currentfile flushfile % avoid laser_log's} def%% executable initialization%/table [8 [/#copies 1 (.nc .ncopies .param1)] % number of copies2 [/scale 1.0 (.sf .scale .param2)] % scale factor) [/xsize 512 (.xsize .param3)] % x size) [/ysize 512 (.ysize .param4)] % y size. [/pxlwid 1 (.pxlwid .param5)] % pixel width] deftable { % apply defaults /ta exch def % save array ta 0 get % key ta 1 get % default value def % define default value} forall7currentdict /parser known {parser} if % if user inputs0/identity matrix def % make an identity matrix/tmp 8 string def01 72 mul 10 72 mul moveto currentpoint translate<currentpoint transform % see where we are in device coords:identity setmatrix % turn off transformation - switch to % device coordinate system0translate % move origin to transformed currptmainwwƙʏ3%% headers - print text with headers on LaserWriter%% R. Watson 25-Sep-1986%A% 10/03/86 RW Remove "_DUA0:[]" from filename (for spooled files)%<% inputs: /param1 or /#copies - number of copies (default 1)2% /param2 or /fsize = number containing font size4% /param3 or /wide = boolean true if landscape mode<% /param4 or /filename = string containing page header info%%% main.%/main{ { doline } loop} def %% doline.%(% prints a line of text read from %stdin%/doline{>%%% { inp bytesavailable 0 gt { exit } if } loop % until input" inp ibuf readline {} { % if eof; linecount 0  ne column 0 ne or { % if we've printed a line( /column ncolumns def % force page out newpage } if quit } ifelse+ /line exch def % define input substring+ line length /nc exch def % get char count$% check for form-feed and handle it nc 1 ge { % if >= 1 char$ line 0 get 12 eq { % if form-feed5 topmargin lineh sub ypos ne { % if not top of page newpage } if nc 1 ne { % if more on line: line 1 nc 1 sub getinterval /line exch def %del f-f  } if nc 1 sub /nc exch def } if } { newline % blank line } ifelse % show the line nc 1 ge { xpos ypos moveto squish 0 line ashow newline } if} def%% newline - move down 1 line.% /newline {4 /linecount linecount 1 add def % advance line count4 ypos lineh sub /ypos exch def % debit y pos on page ypos bottommargin lt 1 linecount linelimit ge or { % if bottom of page newpage } if} def'%% newpage - initialize for a new page .% /newpage {& /linecount 0 def % reset line count4 /ypos topmargin lineh sub def % reset line on page+ /column column 1 add def % advance column, column ncolumns lt { % if not last column1 /xpos columnwidth column mul leftmargin add def } { /column 0 def % reset column title { % if title leftmargin 4 topmargin titlemargin add moveto % setup header$ currentfont % save current font0 /Helvetica-Bold findfont 12 scalefont setfont filename show  pagewidth 1.5 inch sub 3 topmargin titlemargin add moveto % page number (page ) show page 10 5 string cvrs show setfont % restore font } if  showpage landscape. /page page 1 add def % advance page number* /xpos leftmargin def % reset left side } ifelse} def !%% landscape - set landscape mode% /landscape { wide { 8.5 inch 0 translate 90 rotate } if} def%% inch .%% convert to inches%/inch { 72.  mul} def%% point .%% convert to points%/point { } def%% executable initialization.% initgraphics8currentdict /formname known not {/formname (2UP) def} ifformname (2UP) eq { /table [9 [/#copies 1 (.nc .ncopies .param1)] % number of copies1 [/fsizetmp 0 (.fsize .fs .param2)] % font size3 [/wide true (.wide .w .param3)] % landscape mode+ [/title false (.title .param4)] % title8 [/ncolumns 2 (.ncolumns .param5)] % number of columns? [/linelimit 66 (.linelimit .nlines .param6)] % lines per page ] def} ifformname (LETTER) eq { /table [9 [/#copies 1 (.nc .ncopies .param1)] % number of copies1 [/fsizetmp 0 (.fsize .fs .param2)] % font size4 [/wide false (.wide .w .param3)] % landscape mode+ [/title false (.title .param4)] % title8 [/ncolumns 1 (.ncolumns .param5)] % number of columns? [/linelimit 66 (.linelimit .nlines .param6)] % lines per page ] def} ifformname (LANDSCAPE) eq { /table [9 [/#copies 1 (.nc .ncopies .param1)] % number of copies1 [/fsizetmp 0 (.fsize .fs .param2)] % font size3 [/wide true (.wide .w .param3)] % landscape mode+ [/title false (.title .param4)] % title8 [/ncolumns 1 (.ncolumns .param5)] % number of columns? [/linelimit 66 (.linelimit .nlines .param6)] % lines per page ] def} ifformname (HEADERS) eq { /table [9 [/#copies 1 (.nc .ncopies .param1)] % number of copies1 [/fsizetmp 0 (.fsize .fs .param2)] % font size4 [/wide false (.wide .w .param3)] % landscape mode* [/title true (.title .param4)] % title8 [/ncolumns 1 (.ncolumns .param5)] % number of columns? [/linelimit 66 (.linelimit .nlines .param6)] % lines per page ] def} ifcurrentdict /table known not { /table [9 [/#copies 1 (.nc .ncopies .param1)] % number of copies1 [/fsizetmp 0 (.fsize .fs .param2)] % font size4 [/wide false (.wide .w .param3)] % landscape mode* [/title true (.title .param4)] % title8 [/ncolumns 1 (.ncolumns .param5)] % number of columns? [/linelimit 66 (.linelimit .nlines .param6)] % lines per page ] def} iftable { % apply defaults /ta exch def % save array ta 0 get % key ta 1 get % default value def % define default value} forall7currentdict /parser known {parser} if % if user inputs5currentdict /filename known not {/filename () def} ifOfilename (_DUA0:[]) anchorsearch {pop /filename exch def} {pop} ifelse %cleanup&/inp currentfile def % define fileswide { /leftmargin .5 inch def /topmargin 7.85 inch def /bottommargin .3 inch def /rightmargin .25 inch def? currentdict /fsize known not {/fsize 8 point def} if % default' fsizetmp 0 ne {/fsize fsizetmp def} if /pagewidth 11 inch def /squish -0.3 def /titlemargin 3 point def} {  /leftmargin 1. inch def) /topmargin 10.25 inch def % top of page /rightmargin .25 inch def /bottommargin .5 inch def@ currentdict /fsize known not {/fsize 10 point def} if % default' fsizetmp 0 ne {/fsize fsizetmp def} if /pagewidth 8.5 inch def /squish -0.3 def /titlemargin .325 inch def} ifelse&/lineh fsize point def % line height/linecount 0 def /column 0 defF/columnwidth pagewidth leftmargin sub rightmargin sub ncolumns div def%/ibuf 200 string def % input buffer/page 1 def % page number/xpos leftmargin def/ypos topmargin lineh sub defB% The following section of code makes a new font with a backspace>% character d"0T~UTEXAS_LASER.SAV ss/[DECUS.DECUS87.VAX87A.UTEXAS.LASER]LASER.TLB;24{%|efined. The width of the backspace character is8% the negative of the width of an underscore character.&/Courier findfont % select the font8lineh scalefont setfont % find width of an underscore. (_) stringwidth pop 100 mul /uwid exch def$/Courier findfont % copy the fontKdup length 1 add dict /newdict exch def % leaving room for a Metrics entry{$ exch dup /FID ne { % if not /FID3 dup /Encoding eq { % if /Encoding copy the entry exch dup length array copy  newdict 3 1 roll put } {7 exch newdict 3 1 roll put % else just use the object } ifelse } { pop pop % dump /FID } ifelse} forall,1 dict begin % create Metrics dictionary3 /backspace uwid neg def % define backspace width! newdict /Metrics currentdict putend.newdict begin % set encoding for backspace Encoding 8 /backspace putend5/xfont newdict definefont pop % define the new font=/xfont findfont fsize scalefont setfont % select the new font landscapemainww<8%%% image - puts a raster image file on the laserwriter.%.% 02/26/87 R. Watson Derived from paint_hex.ps%%% deCompress .%(% returns a bitimage string on the stack% /deCompress{" /count readbyte def % get count) count 16#80 and 0 eq { % if bit stream /count count 1 add def9 outstring 0 count getinterval % get right size string% inp exch readhexstring % get bytes$ pop % toss readhexstring status } {  % else repeated string* /byte readbyte def % get byte to repeat> 16#100 count sub 1 add /count exch def% get abs val of count 0 % preset index count { dup outstring exch byte put 1 add % advance index } repeat pop % index/ outstring 0 count getinterval % return string } ifelse} def %% getByte%!% returns /byte = next input byte-% = 0 if no more bytes on input stream%/getByte{+ inp instring readhexstring { % if got one' 0 get /byte exch def % store in byte } { % else 0 pop /byte 0 def } ifelse} def8%% decodeheader - decodes the info in the header record.% /decodeheader{+ /bytesinhead 512 def % default 512 bytes { % 512 bytes default1 getlong 10 10string cvrs cvlit % key to lit dup where& { pop load exec } % if defined func9 { pop getlong pop } ifelse % if no func (key, fix file)= /bytesinhead bytesinhead 8 sub def % debit header length, bytesinhead 8 lt { % if end of header) bytesinhead { % flush remaining bytes readbyte pop } repeat exit % exit loop } if } loop} def!/0 {getlong pop} def % 0 - nop*/1 {/xsize getlong def} def % 1 - x size*/2 {/ysize getlong def} def % 2 - y size0/3 {/pxlwid getlong def} def % 3 - pixel width0/4 {/scale getlong def} def % 4 - scale factor6/5 {/invert getlong def} def % 5 - invert if nonzero+/8 {getlong 512 sub % 8 - header lengthI bytesinhead add /bytesinhead exch def} def % apply correction factor:/9 {/compressed getlong def} def % 9 - true if compressed%% getlong %5% converts 4 hex bytes from currentfile to an integer>% longwords from the vax are transmitted low order byte first.%/getlong{# /acc 0 def % preset accumulator 0 1 3 {3 readbyte exch 8 mul bitshift acc or /acc exch def } for acc} def%% readbyte %?% reads a hex byte from currentfile and returns it on the stack+% executes "readbyteeof" if EOF encountered% /readbyte{C currentfile 1string readhexstring {}{pop readbyteeof} ifelse 0 get} def%% main program%/main{) decodeheader % apply user user header7 currentdict /parser known {parser} if % if user inputs invert 0 ne {+ {1.0 exch sub} settransfer % invert image } if( /sTime usertime def % save start timeH vmstatus 10 20 string cvrs dbg exch writestring dbg ( ) writestringH 10 20 string cvrs dbg exch writestring dbg ( ) writestringJ 10 20 string cvrs dbg exch writestring dbg ( \n) writestring flush1 /iscale 1 scale div def % compute scale factor ! compressed 1 eq { % if encoded4 xsize ysize pxlwid [iscale 0.0 0.0 iscale 0.0 0.0] { deCompress } image } {5 xsize ysize pxlwid [iscale 0.0 0.0 iscale 0.0 0.0]? { currentfile tmp readhexstring not {pop <00>} if } image } ifelse. usertime sTime sub 1000 div 10 20 string cvrs& dbg exch writestring dbg ( seconds ) writestringG vmstatus 10 20 string cvrs dbg exch writestring dbg ( ) writestringF 10 20 string cvrs dbg exch writestring dbg ( ) writestringJ 10 20 string cvrs dbg exch writestring dbg ( \n) writestring flush showpage+ currentfile flushfile % avoid laser_log's} def%% executable initialization%+/inp (%stdin) (r) file def % define files/dbg (%stdout) (w) file def 0/1string 1 string def % scratch 1 byte stri ng3/10string 10 string def % scratch 10 byte string1/identity matrix def % make an identity matrix7/outstring 128 string def % storage for output string(/instring 1 string def % input buffer./tmp 8 string def % for uncompressed images/table [8 [/#copies 1 (.nc .ncopies .param1)] % number of copies2 [/scale 1.0 (.sf .scale .param2)] % scale factor) [/xsize 512 (.xsize .param3)] % x size) [/ysize 512 (.ysize .param4)] % y size. [/pxlwid 1 (.pxlwid .param5)] % pixel width4 [/invert 0 (.invert .param6)] % invert image if 1? [/compressed 1 (.compressed .param7)] % default to compressed] deftable { % apply defaults /ta exch def % save array ta 0 get % key ta 1 get % default value def % define default value} forall01 72 mul 10 72 mul moveto currentpoint translate<currentpoint transform % see where we are in device coords:identity setmatrix % turn off transformation - switch to % device coordinate system0 translate % move origin to transformed currpt/doit {: {main} stopped { (error stack:\n) = pstack flush quit} if} def%doitmainww`Cu4ΏH%%% paint - puts a MacPaint compressed raster file on the laser printer.%%=% inputs: /nc /ncopies /params - number of copies (default 1)2% /sf /scale /param2 - scale factor (default 4.0)%6% 02/18/87 R. Watson Added parser stuff. Speedup mods.%%% deCompress .%(% returns a bitimage string on the stack%! /deCompress{& /count getByte byte def % get count /ind 0 def % preset index) count 16#80 and 0 eq { % if bit stream /count count 1 add def9 outstring 0 count getinterval % get right size string% inp exch readhexstring % get bytes$ pop % toss readhexstring status } { % else repeated string! getByte % get byte to repeat> 16#100 count sub 1 add /count exch def% get abs val of count count { outstring ind byte put& /ind ind 1 add def % advan"ce index } repeat/ outstring 0 count getinterval % return string } ifelse} def %% getByte%!% returns /byte = next input byte-% = 0 if no more bytes on input stream%/getByte{+ inp instring readhexstring { % if got one' 0 get /byte exch def % store in byte } { % else 0 pop /byte 0 def } ifelse} def%% main program%/main{( /sTime usertime def % save start timeK%%% vmstatus 10 20 string cvrs dbg exch writestring dbg ( #) writestringK%%% 10 20 string cvrs dbg exch writestring dbg ( ) writestringM%%% 10 20 string cvrs dbg exch writestring dbg ( \n) writestring%%% flush1 /iscale 1 scale div def % compute scale factor+ 512 { getByte} repeat % eat paint header@% 576 720 1 [iscale 0.0 0.0 iscale 0.0 0.0] { deCompress } imageD 576 720 true [iscale 0.0 0.0 iscale 0.0 0.0] {deCompress} imagemask1%%% usertime sTime sub 1000 div 10 20 string cvrs)%%% dbg exch writestring dbg $( seconds )%%% writestringJ%%% vmstatus 10 20 string cvrs dbg exch writestring dbg ( ) writestringI%%% 10 20 string cvrs dbg exch writestring dbg ( ) writestringM%%% 10 20 string cvrs dbg exch writestring dbg ( \n) writestring%%% flush showpage, currentfile flushfile % avoid laser_log's} def%% executable initialization%*/inp (%stdin) (r) file def % define files/dbg (%stdout) (w) file def/table [8 [/#copies 1 (.nc .ncopies .param1)]% % number of copies2 [/scale 4.0 (.sf .scale .param2)] % scale factor] deftable { % apply defaults /ta exch def % save array ta 0 get % key ta 1 get % default value def % define default value} forall7currentdict /parser known {parser} if % if user inputs0/identity matrix def % make an identity matrix6/outstring 128 string def % storage for output string'/instring 1 string def % input buffer01 72 mul 10 72 mul moveto currentpoint translate<curr&entpoint transform % see where we are in device coords:identity setmatrix % turn off transformation - switch to % device coordinate system0translate % move origin to transformed currpt/doit {: {main} stopped { (error stack:\n) = pstack flush quit} if} def%doitmainww@ʏ%% Parser takes 2 arguments as input:>% /params is an array of pairs of keyword strings and values:9% [ (param1) value1 (param2) value2 ... (paramn) valuen]?% /table is an array 'of key/default value/keyword list arrays:(% [ [/key1 default1 (.key1 .whatever1)](% [/key2 default2 (.key2 .whatever2)] % ... ]B% Parser first defines /key1 to default1, /key2 to default2, etc.B% Then, for each param keyword in /params, it searches the arraysA% in /table for a matching keyword. If found, it sets /key? to % the value from /params. /parser {5% process each keyword value pair in the params array! /pindex 0 def % preset index params length 2 idiv {(5 params pindex get length 1 add % build keyword str string /ks exch def3 ks 1 params pindex get putinterval % (.) ks 0 46 put /ok false def % preset flag table { % for each array! /ta exch def % get the array ta 2 get % get token string% ks search { % search for keyword% pop pop pop % flush search stuff ta 0 get % get key, params pindex 1 add get % get new value def % set new value& /ok true def % flag keyword found) exit % -forall } { pop % flush failed search } ifelse } forall % try next array$ ok not { % if keyword not found) ks = (is not a known parameter) = quit } if2 /pindex pindex 2 add def % advance to next pair } repeat} defww q6lG% The program below may be downloaded to a LaserWriter to correct three.% bugs in the LaserWriter's serial I/O driver:%-% - occasional failure to send a needed XON6% - erroneously reading past e*nd-of-file (control-D)7% - dropped characters during large volumes of output%%!90000000000 % the exitserver passwordversion (23.0) neE {(Patch not installed -- wrong printer type or version) = stop} if!statusdict /Patch1Installed known? {(Patch already installed -- not installed again) = stop} ifserverdict begin exitserver$statusdict /Patch1Installed true putcurrentfile eexec@ce1b9f428ac69e75cc47a554265ae625851e0154ac649ad44c1c34e4c60a0493@a80212+a3bd61248f8859cb1252a7320775a6d4ec524bcbf5771aceb8f61ea2fb@48fcb3df8da0f105be40f697239ef0976f92c1d41e915a7389200a3e896cd955@d197ff27f22a617c85bce7ed59ef1a6062d01d0fdee5b4e7d298997638497cc6@a2d56a0eacc195795949f515bbbda9cfe899e43ad257da93f3144797b00dbb81@8a41b4fa56a0295c25e693864084cbb5d63834f1d94a46816d4a2cbe005cc57c@38491a6a34cfbdef303ed8731dbbe84dc6f8e1e790f3d89360d063639c8411fd@89ad7c53d1b9732bd0942bc36257208d24792ea7c66790b6104c3a2b794a1460@c476ffdb5552f428f457b47319cccb0c9980036402eaca80c0 ,b5e0ccb5f579df@09cc6f382b536aa64da7152356c377a5b708a378e855a7ec3eccd848d5508dbf@5c7bd28c2899e9cfd7f4ff3d7ddc08006cce42b2d8c59ef64af8ec74a2f9d23f@e8d4d03ba1e2686138fffc2af9c662c994ec8065a32144ba9ac5002623b39012@521eb49cd829c3506af2895bf275367eb4d31908b14f3b1e0abfaca2f98eb9d8@8d84ac8271ef44def53d8207ce9653d598fe8046120f223bfca0b5c74a54f70b@eb5a0bc09d8e79742048b875864a3b489eb91c09b701f506e994271a6640f78a@d131f1eef3c96e546f7273fb3533799a6470be2ed3b8f2e211bf9f9f209edbd2@36c19d4b0b3f28ab16c39faa1707 -0699543c212c76081961c949ebd32ada3c93@ccdc56c2c940a2061bc11794a0159cc37255aa8c8e7e08d78f204161f1eccb7d@ad3313b737e921b7df1fe794e9a7fc2226702ee555ceb8e803a20ebeaa440a40@9e1f1a72412586e3071292b10e938e7f386b8e6516758633bab57223e071b1de@8c4b73cafababc0af7bc902e8763a2817861591d7ee98f85bc28ad0ea4d13660@d3256aa293df1959b7b57b13edee653cfdda2fafe0698898dc5e371ca4c5b72b@b92750d0eea5e74955712b06958663f424a46cf75a797590f0d2a36842fe07e3@db459215dab6e461a4c3fbb40ee2499af3fe4b13790de87e11afde6aadd12e77@d84d80 .76146d797269c9188d8fb725898aee284e62c472e0e7b585ef3fed434c@000b0bb70ad6806e840cfe872ec3f28782dd08b70d29c2da2187e2dc0f13dfc0@89f75344e3dad78a1c9b909fc72bdd92421afdc8b80850ff0d43605edfd9be56@d81cb17250ce7208354548f6ccc62366e8196d4adeb2d24fd5ce47bb6295fa72@c361197cafacbd51efd36dfa59c6f8e6cab8915a8043d609eb64726de86080d2@4118cc69e01eab0f4ef1f364c815f306d5f43420cf7c9316e5ee69c7183dd8d2*805a9dfe6abb33c46d3a212d5c6b6fd68418eef971wwlzˏ,% this is so that spooling to _ps will work.w/w\c%!PS-Adobe-1.0/inch {72 mul} def /setuppage { initgraphics 0 11 inch translate -90 rotate /x 1 inch def /y 7 inch def= .5 inch .5 inch moveto 10 inch 0 rlineto 0 7.5 inch rlineto% -10 inch 0 rlineto closepath stroke} def /h-user {. /Helvetica findfont .4 inch scalefont setfont x y moveto (User: ) show show /y y .75 inch sub def} def/h-job {. /Helvetica findfont .4 inch scalefont setfont x y moveto (LaserWriter) show >9 CCAW001 TRAILER4 inch scalefont setfont x y moveto (Date: ) show show /y y .75 inch sub def} def /h-error {. /Helvetica findfont .4 inch scalefont setfont x y moveto (Error: ) show7 dup stringwidth pop 8 inch exch div % get space/length3 dup 1 lt { .4 inch mul % if less space than length@ /Helvetica findfont exch scalefont setfont } % resize the font( { pop } ifelse % else leave font alone show /y y .75 inch sub def} def /h-pages {. /Helvetica findfont .4 inch scalefont 2 setfont x y moveto (Pages: ) showE cvi statusdict /pagecount get exec exch sub 1 add 10 string cvs show /y y .75 inch sub def} defwwY%!.%%% PostScript program to plot Zeta plot files%% R. Watson 31-Jan-85%<% inputs: /param1 or /#copies - number of copies (default 1)3% /param2 or /scalefact - scale factor (default 1)3% /param3 or /zFont - use Zeta font (default true)=% /param4 or /penscale - scaling to apply to pen (default 1)8% /param5 or /use3pens - use pen color if nz (default 0)%% Not supported yet:%% 1. Shaded characters% 2. Aspect characters%(% 09/13/85 add pre-processed definitions% zFont defaults to true% scalefact defaults to 1<% 05/30/86 Ignore level one "6" commands (whatever they are)2% 06/20/86 J.Knox Fix problems with circle command*% 02/15/87 R.Watson add default parametersB% 02/20/87 R.Watson add default table, remove debug print, remove % input timeout avoidance.>% 03/06/87 M. Kaczmarczik/J. T4aylor add scaling factor for pen6% 04/01/87 R. Watson Opcode 6 is alternate pen select.9% Added parameter usepens to select pen color/shading. "% Default changed to no shading.%-/lTime usertime def % save load start time%% initialization.%/init{:%%% dbg 1 string dup 0 7 put writestring flush % ring bell newpath* /aspect 256 def % preset default aspect0 0 0 moveto % preset starting location on page! /pen false def % preset pen up' /sTime usertime def % save 5 start time} def% read a zeta byte /getz {  {% inp read not {eofError} if % if EOF; dup 32 gt {exit} {pop} ifelse % exit loop if not <= space } loop( dup /zn exch def % define zeta number/ zb 0 3 -1 roll put % put char code in string} def%% check for 9 more Z's% /checkZeta {+ 9 { getz zb (Z) ne {notZerror} if } repeat} def%% main program%/main{ { gsave init waitBytes % wait for a job/ not {grestore exit} if %6 if waitBytes false checkZeta levelOne grestore } loop} def3%% waitBytes - waits until there is a "Z" on stdin.%&% return true if Z found, false if EOF /waitBytes{ {E%%% % uncomment these lines to wait forever for plots with no timeout%%% inp bytesavailable 0 ne {+ inp read not { false exit } if % if EOF# 16#5A eq {true exit} if % if Z %%% } if } loop} def&% levelOne - process level 1 commands /levelOne{ { getz %get a b7yte zb (Z) eq { % Z stroke8%%% debug usertime sTime sub 1000 div 10 20 string cvrs1%%% debug dbg exch writestring dbg ( seconds\n)%%% debug writestring flush,%%% debug lTime 1000 div 10 20 string cvrs 3%%% debug dbg exch writestring dbg ( load time\n)%%% debug writestring flush showpage exit } if {  zb (0) eq { % 0 - nop exit } if zb (1) eq { % 1 - pen up /pen false def exit } if zb (2) eq { % 2 - pen 8 down /pen true def exit } if' zb (3) eq { % 3 - character vector cVector exit } if' zb (4) eq { % 4 - center char vect ccVector exit } if% zb (5) eq { % 5 - numeric vector nVector exit } if! zb (6) eq { % 6 - pen select 1 crb % get pen' usepens 0 ne{ % if shading enabled pencolor exch get setgray } { pop } ifelse exit } if zb (7) eq { % 7 - level 2 '9 levelTwo exit } if vector exit } loop } loop %do this one forever } def% level two commands /levelTwo{ getz % get level 2 type { zb (1) eq { % 1 - pen 1 /pen false def emit pencolor 0 get setgray exit } if zb (2) eq { % 2 - pen 2 /pen false def emit pencolor 1 get setgray exit } if zb (3) eq { % 3 - pen 3 /pen false def emit pencolor 2 get setgray exit: } if zb (4) eq { % 4 - pen 4 /pen false def emit pencolor 3 get setgray exit } if# zb (7) eq { % 7 - enter level 3 levelThree exit } if zb (B) eq { % B - enter dash emit& dashes 0. setdash % enter dash mode exit } if zb (C) eq { % C - exit dash emit [] 0. setdash exit } if! zb (D) eq { % D - define dash emit % close current path$ getz getxy % get dash definition- /d1 ix def /d2 iy d;ef % save first 2 parts getz getxy0 /dashes [d1 d2 ix d2] def % define dash array& dashes 0. setdash % enter dash mode exit } if" zb (E) eq { % E - define slant getz getxy % eat slant exit } if# zb (F) eq { % F - define aspect getz getxy % eat aspect /aspect ix def exit } if zb (G) eq { % G - circle/arc doCircle exit } if" zb (H) eq { % H - terminal msg termMsg exit } if zb (I) eq { % I - shad$<e getz getxy exit } if% process rest of level 2 exit } loop} def% process line vector/vector{ getxy % get crb x y? pen {ix iy rlineto} {ix iy rmoveto emit} ifelse %do the vector} def% process character vector/cVector{ getz % get vector control getxy % decode vector 2 crb % get length) dup string /cstr exch def % build string /cind 0 def % preset index { 2 crb ) dup 0 lt {pop 0} if % DEBUG if neg=ative* dup 127 gt {pop 0} if % DEBUG if too big. zFont {sym exch get} % map zeta to zeta code3 {zta exch get} ifelse % get ascii char code+ cstr cind 3 -1 roll put % put into string+ cind 1 add /cind exch def % advance index } repeat % length times- /sn cstr length def % get string char count6 ix dup mul iy dup mul add sqrt /iz exch def % calc iz iz sn dofont % scale font( cstr stringwidth % get string lengths /sy exch def /sx exch def) iy ix atan rotate % rota>te co-ordinatesC iz sx sub sn div 0 cstr ashow % do string rel to new co-ord (dy=0) emit% iy ix atan neg rotate % rotate back /pen false def % pick up pen} def$% process centered character vector /ccVector{ getz % get vector control getxy % decode vector+ /cstr 1 string def % define 1 char string 1 crb abs. zFont {sym exch get} % map zeta to zeta code3 {zta exch get} ifelse % get ascii char code5 cstr 0 3 -1 roll put % insert character into s?tring- /sn cstr length def % get string char count6 ix dup mul iy dup mul add sqrt /iz exch def % calc iz iz sn dofont % scale font( cstr stringwidth % get string lengths /sy exch def /sx exch def$ currentpoint % save current point) iy ix atan rotate % rotate co-ordinatesA cw -6 mul 22 div ch -6 mul 22 div rmoveto % backup 1/2 char size1 cstr show % do string rel to new co-ord (dy=0) emit% iy ix atan neg rotate % rotate back" moveto % restore current point /pen @false def % pick up pen} def3% dofont -- set up font/dofont{2 /nc exch def % define number of chars in string* /zc exch def % define length of string & zFont {/ZetaFont findfont} % get font# {/Helvetica findfont} ifelse) /cw zc nc div def % get character width; cw 256. mul aspect div /ch exch def % get character height& [cw 0 0 ch 0 0] makefont % scale font setfont % set font} def% process numeric vector/nVectorA{ getz % get vector control getxy % decode vector 1 crb % get length) dup string /cstr exch def % build string /cind 0 def % preset index {8 zFont {1 crb ztf exch get} % convert to zeta font code9 {1 crb ztn exch get} ifelse % get ascii char code+ cstr cind 3 -1 roll put % put into string+ cind 1 add /cind exch def % advance index } repeat % length times- /sn cstr length def % get string char count6 ix dup mul iy dup mul add sqrt /iz exch def % calBc iz iz sn dofont % scale font( cstr stringwidth % get string lengths /sy exch def /sx exch def) iy ix atan rotate % rotate co-ordinatesC iz sx sub sn div 0 cstr ashow % do string rel to new co-ord (dy=0) emit% iy ix atan neg rotate % rotate back /pen false def % pick up pen} def % doCircle /doCircle{! getz % get circle/arc control {" zb (0) eq zb (I) eq or {% if arc! zb (0) eq % save arc direction getz % get vector control getxy % get veCctor 1 /x1 ix def /y1 iy def getz % get vector 2 getxy /x2 ix def /y2 iy def3 currentpoint /y exch def /x exch def %get cur pt2% x1 y1 rmoveto % start arc at end of 1st vector. x1 dup mul % r = sqrt((x1-x)**2+(y1-y)**2) y1 dup mul add sqrt /r exch def* y1 x1 atan /theta1 exch def %get angles y2 x2 atan /theta2 exch def% x x1 sub y y1 sub r theta1 theta2 ; 6 -1 roll { arc } { arcn } ifelse % use saved arc state: x x1 sub x2 add y y1 Dsub y2 add moveto % return to base exit } if % else we have a circle getxy % get vector3 currentpoint /y exch def /x exch def % get cur pt0 ix iy rmoveto % start circle at end of vector% ix dup mul % r = sqrt(ix**2+iy**2) iy dup mul add sqrt /r exch def! x y r 0. 360. arc % draw circle x y moveto % return to base exit } loop} def3% crb - get crb number/crb{ /sum 0 def*% repeat sum = (sum shift 5E) + zn5 dup { sum 5 bitshift getzv add /sum exch def} repeat1% check for negative - if so then or in -1's maskE 5 mul 1 sub -1 exch bitshift dup sum and 0 ne {sum or /sum exch def} {pop} ifelse sum % return sum} def;% getzv - convert NEXT zb to zeta binary number/getzv{ getz7 zn 16#41 lt {zn 16#30 sub} {zn 16#41 sub 8 add} ifelse} def#% getxy - ix,iy set to crb value/getxy{3 zn 16#41 sub 1 add dup /ny exch def %ny = zn-'A'+1) 5 dFiv cvi dup /nx exch def %nx = ny / 53 5 mul ny exch sub cvi /ny exch def %ny = ny - 5*nx% get x and y displacement$ nx crb /ix exch def %ix = crb(nx)$ ny crb /iy exch def %iy = crb(ny)} def% emit - draw the current path/emit{$ currentpoint % save where we are stroke % draw current path& moveto % position to where we are} def&% debugi - write debug integer/debugi{B 16 10 string cvrs dbg exch writestring dbg (\n) writestring flushG} def)% debugs - write debug string/debugs{/ dbg exch writestring dbg ( ) writestring flush} def% executable initialization5(%stdin) (r) file /inp exch def % define input file5(%stdout) (w) file /dbg exch def % define debug file&/zb 1 string def % zeta byte string@/pencolor [0. .35 .50 .70 0. .35 .50 .7] def % pen color shading/16#3f 16#3f 16#3f 16#2b 16#3f 16#3f 16#3f 16#3f/16#5a 16#3f 16#3f 16#2a 16#3f 16#3f 16#3f 16#3f/16#3f 16#3f 16#3 Hf 16#3f 16#3f 16#3f 16#3f 16#3f016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f /16#20 16#41 16#42 16#43 16#44 16#45 16#46 16#47/16#48 16#49 16#3f 16#2e 16#3c 16#28 16#2b 16#7c/16#26 16#4a 16#4b 16#4c 16#4d 16#4e 16#4f 16#50/16#51 16#52 16#21 16#24 16#2a 16#29 16#3b 16#3f/16#2d 16#2f 16#53 16#5 I4 16#55 16#56 16#57 16#58/16#59 16#5a 16#3f 16#2c 16#25 16#5f 16#3e 16#3f/16#30 16#31 16#32 16#33 16#34 16#35 16#36 16#37/16#38 16#39 16#3a 16#23 16#40 16#27 16#3d 16#22/16#61 16#62 16#63 16#64 16#65 16#66 16#67 16#68/16#69 16#6a 16#6b 16#6c 16#1d 16#6e 16#6f 16#70/17#71 16#72 16#73 16#74 16#75 16#76 16#77 16#78/16#79 16#7a 16#3f 16#3f 16#1f 16#3f 16#3f 16#3f016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3 Jf 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 016#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f N16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 16#3f 256 array astore /zta exch def/16 K#30 16#31 16#32 16#33 16#34 16#35 16#36 16#37516#38 16#39 16#2d 16#2e 12 array astore /ztn exch defL/ztf [44 45 46 47 48 49 50 51 52 53 55 64] def % zeta numeric vector to font'[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15=16 17 73 114 120 17 113 84 110 16 109 87 117 125 118 119 127 4126 91 92 93 94 95 96 97 98 99 100 101 102 16 16 88 883 115 116 89 66 67 79 103 85 105 106 121 82 122 123 62 118 19 20 21 22 23 24 25 26 108 64 75 58 54 86 72 127 28 29 30 31 32 33 34 35 71 60 56 59 80 111 55 L157 36 37 38 39 40 41 42 43 107 63 74 16 76 78 44 145 46 47 48 49 50 51 52 53 68 70 77 69 61 65 128 @129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 ?145 146 147 148 149 150 151 152 153 154 90 104 155 156 157 158 ?159 81 124 160 161 162 163 164 165 166 167 112 168 169 170 171 @172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 @188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 7204 205 206 207 208 209 210 211 212 213 ] /sym exch def/ZetaFontDMict 8 dict def/$workingdict 100 dict defZetaFontDict begin /FontType 3 def( /FontMatrix [.04545 0 0 .04545 0 0] def /FontBBox [0 0 22 22] def /Encoding 256 array defE 3 string 0 1 255 {dup 10 3 index cvrs cvn Encoding 3 1 roll put} for pop /CharArrays 214 dict dup beginD/0 [ 16#10606 16#2060C 16#20C0C 16#20C00 16#20000 16#2000C 16#2060C  16#20606 ] defD/1 [ 16#10606 16#2060C 16#2030C 16#20009 16#20003 16#20300 16#20900 7 16#20C03 16#20C09 16#2090C 16#2060C 16#20606 N] def7/2 [ 16#1060C 16#20002 16#20C02 16#2060C 16#20606 ] defD/3 [ 16#10006 16#20606 16#2060C 16#20606 16#20C06 16#20606 16#20600  16#20606 ] def@/4 [ 16#1000C 16#20C00 16#20606 16#20C0C 16#20000 16#20606 ] defI/5 [ 16#10606 16#2060C 16#20006 16#20600 16#20C06 16#2060C 16#20606 ] defI/6 [ 16#10600 16#2060C 16#20006 16#20C06 16#2060C 16#20606 16#20606 ] def7/7 [ 16#10C00 16#2000C 16#20C0C 16#20000 16#20606 ] defI/8 [ 16#1000C 16#20C0C 16#20000 16#20C00 16#10906 16#20306 16#20606 ] de Of@/9 [ 16#10600 16#20606 16#2000C 16#20606 16#20C0C 16#20606 ] defE/10 [ 16#10909 16#20903 16#20C00 16#20903 16#20303 16#20000 16#20303 A 16#20309 16#2000C 16#20309 16#20909 16#20C0C 16#20606 ] defE/11 [ 16#10006 16#20C06 16#20606 16#2060C 16#20600 16#20606 16#2000C 8 16#20C00 16#20606 16#20C0C 16#20000 16#20606 ] defA/12 [ 16#10606 16#2000C 16#20C0C 16#20000 16#20C00 16#20606 ] def&/13 [ 16#10600 16#2060C 16#20606 ] defE/14 [ 16#1060C 16#20003 16#20C03 16#2060C 16#20609 16#2000 P9 16#20600 & 16#20C09 16#20609 16#20606 ] def&/15 [ 16#1070A 16#20F0A 16#11500 ] def&/16 [ 16#10400 16#20408 16#11500 ] def/17 [ 16#11500 ] defE/18 [ 16#10000 16#20010 16#20415 16#20B15 16#20F10 16#20F00 16#10008  16#20F08 16#11500 ] defE/19 [ 16#10000 16#20015 16#20B15 16#20F12 16#20F0E 16#20B0B 16#2000B A 16#10B0B 16#20F08 16#20F03 16#20B00 16#20000 16#11500 ] defE/20 [ 16#10F03 16#20B00 16#20400 16#20003 16#20012 16#20415 16#20B15  16#20F12 16#11500 ] defJ/2Q1 [ 16#20015 16#20C15 16#20F12 16#20F03 16#20C00 16#20000 16#11500 ] defE/22 [ 16#10F15 16#20015 16#2000B 16#20A0B 16#2000B 16#20000 16#20F00  16#11500 ] defJ/23 [ 16#10F15 16#20015 16#2000B 16#20B0B 16#2000B 16#20000 16#11500 ] defE/24 [ 16#10F0F 16#20F12 16#20C15 16#20315 16#20012 16#20003 16#20300 A 16#20C00 16#20F03 16#20F09 16#20C09 16#21109 16#11500 ] defA/25 [ 16#20015 16#2000B 16#20F0B 16#20F15 16#20F00 16#11500 ] defE/26 [ 16#10400 16#20700 16#20715 16#20415 16#20A15 16#Dj~UTEXAS_LASER.SAV ss/[DECUS.DECUS87.VAX87A.UTEXAS.LASER]LASER.TLB;24{5VQ R20715 16#20700  16#20A00 16#11500 ] defJ/27 [ 16#10006 16#20003 16#20300 16#20C00 16#20F03 16#20F15 16#11500 ] defA/28 [ 16#20015 16#20008 16#20F15 16#2070E 16#20F00 16#11500 ] def//29 [ 16#10015 16#20000 16#20F00 16#11500 ] def8/30 [ 16#20015 16#2070B 16#20E15 16#20E00 16#11500 ] def//31 [ 16#20015 16#20F00 16#20F15 16#11500 ] defE/32 [ 16#10300 16#20003 16#20012 16#20315 16#20C15 16#20F12 16#20C0F 8 16#20F12 16#20F03 16#20C00 16#20300 16#11500 ] defJ/33 [ 16#20015 16#20C15 S16#20F12 16#20F0E 16#20C0B 16#2000B 16#11500 ] defE/34 [ 16#10808 16#20E02 16#20C00 16#20300 16#20003 16#20012 16#20315 A 16#20C15 16#20F12 16#20F03 16#20E02 16#20F00 16#11500 ] defE/35 [ 16#20015 16#20C15 16#20F12 16#20F0E 16#20C0B 16#2000B 16#2080B  16#20F00 16#11500 ] defE/36 [ 16#10006 16#20003 16#20300 16#20C00 16#20F03 16#20F08 16#20C0B J 16#2030B 16#2000E 16#20012 16#20315 16#20C15 16#20F12 16#11500 ] def8/37 [ 16#10700 16#20715 16#20015 16#20E15 16#11500 ] defJ/38 T[ 16#10015 16#20003 16#20300 16#20C00 16#20F03 16#20F15 16#11500 ] def//39 [ 16#10015 16#20700 16#20E15 16#11500 ] defA/40 [ 16#10015 16#20000 16#2070A 16#20E00 16#20E15 16#11500 ] def//41 [ 16#20F15 16#10015 16#20F00 16#11500 ] defJ/42 [ 16#10700 16#2070B 16#20015 16#2070B 16#20E15 16#2070B 16#11500 ] defE/43 [ 16#10015 16#20F15 16#2070A 16#2040A 16#20A0A 16#2070A 16#20000  16#20F00 16#11500 ] defE/44 [ 16#10F03 16#20B00 16#20400 16#20003 16#20012 16#20415 16#20B15 & 16#20F12 U 16#20F03 16#11500 ] defJ/45 [ 16#10800 16#20815 16#20512 16#10500 16#20B00 16#20800 16#11500 ] defE/46 [ 16#10F00 16#20000 16#20003 16#20F10 16#20F12 16#20C15 16#20315 & 16#20012 16#20010 16#11500 ] defE/47 [ 16#10012 16#20315 16#20C15 16#20F12 16#20F0E 16#20C0B 16#2030B J 16#20C0B 16#20F08 16#20F03 16#20C00 16#20300 16#20003 16#11500 ] def8/48 [ 16#10C00 16#20C15 16#20006 16#20F06 16#11500 ] defE/49 [ 16#10005 16#20003 16#20300 16#20C00 16#20F03 16#20F08 16#20C0B / 16#2000BV 16#20015 16#20F15 16#11500 ] defE/50 [ 16#10008 16#2030B 16#20C0B 16#20F08 16#20F03 16#20C00 16#20300 A 16#20003 16#20012 16#20315 16#20C15 16#20F12 16#11500 ] defA/51 [ 16#10012 16#20015 16#20F15 16#20F12 16#20700 16#11500 ] defE/52 [ 16#10C00 16#20300 16#20003 16#20008 16#2030B 16#20C0B 16#20F0E E 16#20F12 16#20C15 16#20315 16#20012 16#2000E 16#2030B 16#20C0B / 16#20F08 16#20F03 16#20C00 16#11500 ] defE/53 [ 16#10003 16#20300 16#20C00 16#20F03 16#20F12 16#20C15 16#20315 W A 16#20012 16#2000D 16#2030A 16#20C0A 16#20F0D 16#11500 ] defA/54 [ 16#10700 16#2070E 16#20707 16#20007 16#20E07 16#11500 ] def&/55 [ 16#10007 16#20E07 16#11500 ] defE/56 [ 16#20E0E 16#20707 16#2070E 16#20700 16#20707 16#2000E 16#20E00 / 16#20707 16#20007 16#20E07 16#11500 ] def/57 [ 16#20F15 16#11500 ] def8/58 [ 16#10800 16#20504 16#20511 16#20815 16#11500 ] def8/59 [ 16#10700 16#20A04 16#20A11 16#20715 16#11500 ] defE/60 [ 16#10005 16#20302 16#20C02 16#20F05 16#20F09 16#20 XC0C 16#2030C J 16#2000F 16#20313 16#20C13 16#20F0F 16#10815 16#20800 16#11500 ] def8/61 [ 16#10003 16#20F03 16#10F0A 16#2000A 16#11500 ] def/62 [ 16#11500 ] defJ/63 [ 16#10700 16#20903 16#20905 16#20705 16#20703 16#20903 16#11500 ] defA/64 [ 16#10700 16#20702 16#20902 16#20900 16#20700 16#11500 ] defE/65 [ 16#10310 16#20015 16#20315 16#20310 16#10910 16#20615 16#20915  16#20910 16#11500 ] def8/66 [ 16#10B00 16#20400 16#20415 16#20B15 16#11500 ] def8/67 [ 16#10400 16#20B00 16#2 Y0B15 16#20415 16#11500 ] defE/68 [ 16#10703 16#20705 16#20905 16#20903 16#20703 16#1070A 16#2070C / 16#2090C 16#2090A 16#2070A 16#11500 ] def8/69 [ 16#10910 16#20615 16#20915 16#20910 16#11500 ] defE/70 [ 16#10300 16#2030F 16#2030C 16#2000C 16#20F0C 16#20C0C 16#20C0F 8 16#20C00 16#20C03 16#20F03 16#20003 16#11500 ] defJ/71 [ 16#10803 16#20600 16#20A00 16#20803 16#10806 16#20815 16#11500 ] defE/72 [ 16#10F06 16#20703 16#20403 16#20006 16#20009 16#20A12 16#20615 & 16#20312 16# Z20F00 16#11500 ] def&/73 [ 16#2070F 16#20E00 16#11500 ] defE/74 [ 16#10012 16#20014 16#20214 16#20212 16#20012 16#10F15 16#20000 A 16#10D00 16#20D02 16#20F02 16#20F00 16#20D00 16#11500 ] def//75 [ 16#10F0E 16#20007 16#20F00 16#11500 ] def&/76 [ 16#20F07 16#2000E 16#11500 ] defE/77 [ 16#10F0C 16#20C0F 16#2080F 16#2050C 16#20508 16#20805 16#20C05 e 16#20F08 16#20F12 16#20C15 16#20315 16#20012 16#20003 16#20300 16#20C00 16#20F03 16#11500 ] defE/78 [ 16#1000F 16#20012 16#20315 16#20 [C15 16#20F12 16#20F0E 16#20C0B J 16#2070B 16#20706 16#10703 16#20900 16#20500 16#20703 16#11500 ] def&/79 [ 16#10015 16#20F00 16#11500 ] defE/80 [ 16#10700 16#20903 16#20905 16#20705 16#20703 16#20903 16#1090A 8 16#2090C 16#2070C 16#2070A 16#2090A 16#11500 ] def8/81 [ 16#1000F 16#20600 16#20C0F 16#2000F 16#11500 ] def//82 [ 16#20F0F 16#1000F 16#20F00 16#11500 ] defE/83 [ 16#1070D 16#2070F 16#2090F 16#2090D 16#2070D 16#1000A 16#20F0A A 16#10905 16#20705 16#20707 16#20907 16#2 \0905 16#11500 ] defE/84 [ 16#10002 16#20E02 16#10E0B 16#2000B 16#2070B 16#20712 16#20704  16#11500 ] defA/85 [ 16#10003 16#20406 16#20800 16#20815 16#20F15 16#11500 ] def&/86 [ 16#10600 16#20612 16#11500 ] defE/87 [ 16#10003 16#20200 16#20500 16#20703 16#20712 16#20915 16#20C15  16#20E12 16#11500 ] defA/88 [ 16#10F15 16#20015 16#2070B 16#20000 16#20F00 16#11500 ] def//89 [ 16#2050C 16#20A00 16#20000 16#11500 ] defE/90 [ 16#10300 16#20603 16#2060C 16#2090F 16#20C0F 16#20F0C ]16#20F09 / 16#20C06 16#20906 16#20609 16#11500 ] defE/91 [ 16#2030F 16#20306 16#20603 16#20903 16#20C06 16#20C0F 16#20C06  16#20F03 16#11500 ] defJ/92 [ 16#10400 16#2040F 16#2000F 16#20F0F 16#20C0F 16#20C00 16#11500 ] defE/93 [ 16#10700 16#20702 16#20302 16#20005 16#2000A 16#2030D 16#20B0D A 16#20E0A 16#20E05 16#20B02 16#20702 16#2070F 16#11500 ] defE/94 [ 16#10007 16#20207 16#2020B 16#2050E 16#20A0E 16#20D0B 16#20D03 A 16#20A00 16#20500 16#20203 16#20207 16#20F07 1 ^6#11500 ] defE/95 [ 16#10011 16#20311 16#20307 16#20704 16#20B07 16#20B11 16#20E11 & 16#10715 16#20700 16#11500 ] defJ/96 [ 16#10303 16#20F0C 16#1030C 16#2060C 16#20C03 16#20F03 16#11500 ] defE/97 [ 16#1030C 16#20303 16#20600 16#20903 16#2090C 16#10903 16#20C00 & 16#20F03 16#20F0C 16#11500 ] defJ/98 [ 16#1000F 16#2030D 16#20707 16#20000 16#20707 16#20F03 16#11500 ] defE/99 [ 16#10F0F 16#20C0F 16#2090C 16#2070F 16#2020F 16#2000C 16#20007 S 16#20204 16#20704 16#20907 16#2090C _16#20907 16#20C04 16#20F04 16#11500 ] defF/100 [ 16#10C0F 16#2070F 16#2040C 16#20709 16#20C09 16#20F07 16#20F02 B 16#20C00 16#20700 16#20402 16#20407 16#20709 16#11500 ] defF/101 [ 16#10309 16#20F09 16#10F0F 16#2090F 16#2060C 16#20606 16#20903  16#20F03 16#11500 ] defF/102 [ 16#10309 16#2060F 16#2090C 16#20606 16#1090C 16#20C0F 16#20F0C  16#20C00 16#11500 ] defF/103 [ 16#10700 16#20712 16#20315 16#20012 16#20315 16#20712 16#20B15 0 16#20E12 16#20B15 16#20712 16#11500 ` ] defF/104 [ 16#10906 16#20C06 16#20F09 16#20F0C 16#20C0F 16#2090F 16#2060C ' 16#20609 16#20906 16#11500 ] defK/105 [ 16#10615 16#20600 16#10312 16#20912 16#10306 16#20906 16#11500 ] defF/106 [ 16#10615 16#20600 16#10312 16#20912 16#1030C 16#2090C 16#10306  16#20906 16#11500 ] defF/107 [ 16#10303 16#20603 16#20906 16#20C03 16#20F03 16#21206 16#21209 F 16#20F0C 16#20C0C 16#20909 16#2060C 16#2030C 16#20009 16#20006 0 16#20303 16#10909 16#20906 16#11500 ] defF/108 [ 1 a6#10612 16#20600 16#10C0C 16#2090F 16#2030F 16#2000C 16#20006 0 16#20303 16#20903 16#20C06 16#11500 ] def'/109 [ 16#10015 16#21215 16#11500 ] def'/110 [ 16#10009 16#20F09 16#11500 ] def0/111 [ 16#10009 16#20C09 16#20C03 16#11500 ] defB/112 [ 16#10309 16#20900 16#20F09 16#20912 16#20309 16#11500 ] defK/113 [ 16#10303 16#2090F 16#1000C 16#20C0C 16#10006 16#20C06 16#11500 ] defK/114 [ 16#10003 16#20F03 16#10F08 16#20008 16#1000D 16#20F0D 16#11500 ] defB/115 [ 16#10001 16#20F01 16#10F05 b16#2000A 16#20F0F 16#11500 ] defB/116 [ 16#1000F 16#20F0A 16#20005 16#10001 16#20F01 16#11500 ] defK/117 [ 16#10003 16#20B03 16#20E07 16#20E0B 16#20B0F 16#2000F 16#11500 ] defK/118 [ 16#10006 16#20209 16#20509 16#20A03 16#20D03 16#20F06 16#11500 ] defF/119 [ 16#10006 16#20209 16#20509 16#20A03 16#20D03 16#20F06 16#1000A B 16#2020D 16#2050D 16#20A07 16#20D07 16#20F0A 16#11500 ] defB/120 [ 16#10008 16#20F08 16#20B0C 16#20B04 16#20F08 16#11500 ] defB/121 [ 16#10008 16#2040C 16#20404 16#200 c08 16#20F08 16#11500 ] defB/122 [ 16#10800 16#20815 16#20411 16#20C11 16#20815 16#11500 ] defB/123 [ 16#10800 16#20404 16#20C04 16#20800 16#20815 16#11500 ] def/124 [ 16#11500 ] def0/125 [ 16#1000F 16#20700 16#20E0F 16#11500 ] defF/126 [ 16#10F00 16#20C00 16#20903 16#20907 16#2060A 16#2090D 16#20912 ' 16#20C15 16#20F15 16#11500 ] defF/127 [ 16#20300 16#20603 16#20607 16#2090A 16#2060D 16#20612 16#20315  16#20015 16#11500 ] defF/128 [ 16#10309 16#20609 16#20906 16#20903 16#2060 d0 16#20000 16#20003 0 16#20306 16#20906 16#20900 16#11500 ] defF/129 [ 16#10015 16#20003 16#20300 16#20600 16#20903 16#20906 16#20609 0 16#20309 16#20006 16#20000 16#11500 ] defF/130 [ 16#10906 16#20609 16#20309 16#20006 16#20003 16#20300 16#20600  16#20903 16#11500 ] defF/131 [ 16#10915 16#20903 16#20600 16#20300 16#20003 16#20006 16#20309 0 16#20609 16#20906 16#20900 16#11500 ] defF/132 [ 16#10006 16#20906 16#20609 16#20309 16#20006 16#20003 16#20300 ' 16#2060 e0 16#20903 16#11500 ] defK/133 [ 16#10009 16#20609 16#10300 16#2030F 16#20612 16#2090F 16#11500 ] defF/134 [ 16#10303 16#20003 16#20300 16#20900 16#2090C 16#2060F 16#2030F 0 16#2000C 16#20306 16#20906 16#11500 ] defF/135 [ 16#10015 16#20000 16#20006 16#20309 16#20609 16#20906 16#20900  16#11500 ] def9/136 [ 16#1060F 16#2060C 16#10609 16#20600 16#11500 ] defK/137 [ 16#10612 16#2060F 16#1060C 16#20603 16#20300 16#20003 16#11500 ] defF/138 [ 16#10015 16#20006 16#20306 16#20609 1 f6#10000 16#20006 16#20306  16#20600 16#11500 ] def'/139 [ 16#10615 16#20600 16#11500 ] defK/140 [ 16#10000 16#20009 16#20303 16#20603 16#20909 16#20900 16#11500 ] defF/141 [ 16#10009 16#20000 16#20006 16#20309 16#20609 16#20906 16#20900  16#11500 ] defF/142 [ 16#10006 16#20309 16#20609 16#20906 16#20903 16#20600 16#20300 ' 16#20003 16#20006 16#11500 ] defF/143 [ 16#10000 16#20009 16#2030C 16#2060C 16#20909 16#20606 16#20306 ' 16#20009 16#2000C 16#11500 ] defF/1 g44 [ 16#10900 16#20909 16#2060C 16#2030C 16#20009 16#20306 16#20606 ' 16#20909 16#2090C 16#11500 ] defK/145 [ 16#10009 16#20000 16#20006 16#20309 16#20609 16#20906 16#11500 ] defK/146 [ 16#10303 16#20600 16#20903 16#20306 16#20609 16#20906 16#11500 ] def9/147 [ 16#10615 16#20600 16#10309 16#20909 16#11500 ] defF/148 [ 16#10009 16#20003 16#20300 16#20600 16#20903 16#20909 16#20900  16#11500 ] def9/149 [ 16#10009 16#20300 16#20600 16#20909 16#11500 ] defK/150 [ 16#10009 16#200 h00 16#20306 16#20606 16#20900 16#20909 16#11500 ] def9/151 [ 16#10009 16#20900 16#10000 16#20909 16#11500 ] defF/152 [ 16#1000C 16#20009 16#20306 16#20606 16#20909 16#2090C 16#20903 0 16#20600 16#20300 16#20003 16#11500 ] def9/153 [ 16#10009 16#20909 16#20000 16#20900 16#11500 ] defK/154 [ 16#1030F 16#2060F 16#2090C 16#20906 16#20C03 16#20F03 16#11500 ] def9/155 [ 16#10606 16#20615 16#10015 16#20C15 16#11500 ] def9/156 [ 16#10006 16#20309 16#20906 16#20C09 16#11500 ] defF/157 [ 16# i10012 16#20312 16#20315 16#20015 16#20012 16#10912 16#20C12 0 16#20C15 16#20915 16#20912 16#11500 ] def9/158 [ 16#10306 16#2030C 16#10309 16#20F09 16#11500 ] def9/159 [ 16#10309 16#20F09 16#10F06 16#20F0C 16#11500 ] defF/160 [ 16#10303 16#20903 16#20C06 16#20C0C 16#2090F 16#2030F 16#2000C ' 16#20006 16#20303 16#11500 ] def9/161 [ 16#10000 16#20C00 16#10600 16#20615 16#11500 ] def0/162 [ 16#10015 16#20000 16#20900 16#11500 ] def0/163 [ 16#10000 16#20015 16#20915 16#11500 ] defK j/164 [ 16#10F0F 16#2060F 16#2030C 16#20309 16#20606 16#20F06 16#11500 ] defK/165 [ 16#10600 16#2060C 16#2090F 16#20C0F 16#20F0C 16#20F00 16#11500 ] defK/166 [ 16#1060F 16#20603 16#20900 16#20C00 16#20F03 16#20F0F 16#11500 ] defB/167 [ 16#10000 16#20F00 16#20F15 16#20015 16#20000 16#11500 ] def'/168 [ 16#10000 16#20C00 16#11500 ] defF/169 [ 16#10300 16#20C00 16#10312 16#20C12 16#10612 16#20600 16#10900  16#20912 16#11500 ] def'/170 [ 16#10015 16#20915 16#11500 ] def'/171 [ 16#1030C k16#2090C 16#11500 ] def'/172 [ 16#1000F 16#20C03 16#11500 ] defF/173 [ 16#10303 16#20903 16#20C06 16#20C0C 16#2090F 16#2030F 16#2000C K 16#20006 16#20303 16#10603 16#2060F 16#10009 16#20C09 16#11500 ] defF/174 [ 16#10003 16#2060F 16#20C03 16#10006 16#20309 16#20906 16#20C09  16#11500 ] defF/175 [ 16#1000F 16#20603 16#20C0F 16#10006 16#20309 16#20906 16#20C09  16#11500 ] defF/176 [ 16#10600 16#20612 16#10003 16#20C03 16#20C03 16#2060F 16#20003  16#11500 ] defKl/177 [ 16#10600 16#20612 16#1000F 16#20C0F 16#20603 16#2000F 16#11500 ] defK/178 [ 16#10000 16#20C00 16#10003 16#20C03 16#2060F 16#20003 16#11500 ] defF/179 [ 16#1000F 16#20603 16#20C0F 16#2000F 16#10006 16#20309 16#20906  16#20C09 16#11500 ] defF/180 [ 16#10003 16#10003 16#20010 16#20415 16#20B15 16#20F10 16#20F03 B 16#10009 16#20F09 16#11503 16#10000 16#20F00 16#11500 ] defF/181 [ 16#10003 16#10003 16#20015 16#20B15 16#20F12 16#20F0F 16#20B0C F 16#2000C 16#10B0C 16#20F09 m16#20F05 16#20B03 16#20003 16#11503 ' 16#10000 16#20F00 16#11500 ] defF/182 [ 16#10003 16#10F05 16#20B03 16#20403 16#20005 16#20012 16#20415 B 16#20B15 16#20F12 16#11503 16#10000 16#20F00 16#11500 ] defF/183 [ 16#10003 16#20015 16#20C15 16#20F12 16#20F05 16#20C03 16#20003 0 16#11503 16#10000 16#20F00 16#11500 ] defF/184 [ 16#10003 16#10F15 16#20015 16#2000C 16#20A0C 16#2000C 16#20003 9 16#20F03 16#11503 16#10000 16#20F00 16#11500 ] defF/185 [ 16#10003 16#10F15 16#2001n5 16#2000C 16#20B0C 16#2000C 16#20003 0 16#11503 16#10000 16#20F00 16#11500 ] defF/186 [ 16#10003 16#10F0F 16#20F12 16#20C15 16#20315 16#20012 16#20005 f 16#20303 16#20C03 16#20F05 16#20F0A 16#20C0A 16#2110A 16#11503 16#10000 16#20F00 16#11500 ] defF/187 [ 16#10003 16#20015 16#2000C 16#20F0C 16#20F15 16#20F03 16#11503 ' 16#10000 16#20F00 16#11500 ] defF/188 [ 16#10003 16#10403 16#20703 16#20715 16#20415 16#20A15 16#20715 B 16#20703 16#20A03 16#11503 16#10000 16#20F00 16 o#11500 ] defF/189 [ 16#10003 16#10008 16#20005 16#20303 16#20C03 16#20F05 16#20F15 0 16#11503 16#10000 16#20F00 16#11500 ] defF/190 [ 16#10003 16#20015 16#20009 16#20F15 16#2070F 16#20F03 16#11503 ' 16#10000 16#20F00 16#11500 ] defF/191 [ 16#10003 16#10015 16#20003 16#20F03 16#11503 16#10000 16#20F00  16#11500 ] defF/192 [ 16#10003 16#20015 16#2070C 16#20E15 16#20E03 16#11503 16#10000  16#20F00 16#11500 ] defF/193 [ 16#10003 16#20015 16#20F03 16#20F15 16#11503 16#1 p0000 16#20F00  16#11500 ] defF/194 [ 16#10003 16#10303 16#20005 16#20012 16#20315 16#20C15 16#20F12 ] 16#20C0F 16#20F12 16#20F05 16#20C03 16#20303 16#11503 16#10000 16#20F00 16#11500 ] defF/195 [ 16#10003 16#20015 16#20C15 16#20F12 16#20F0F 16#20C0C 16#2000C 0 16#11503 16#10000 16#20F00 16#11500 ] defF/196 [ 16#10003 16#10809 16#20E04 16#20C03 16#20303 16#20005 16#20012 f 16#20315 16#20C15 16#20F12 16#20F05 16#20E04 16#20F03 16#11503 16#10000 16#20F00 16#11500 ] defFq/197 [ 16#10003 16#20015 16#20C15 16#20F12 16#20F0F 16#20C0C 16#2000C B 16#2080C 16#20F03 16#11503 16#10000 16#20F00 16#11500 ] defF/198 [ 16#10003 16#10008 16#20005 16#20303 16#20C03 16#20F05 16#20F09 o 16#20C0C 16#2030C 16#2000F 16#20012 16#20315 16#20C15 16#20F12 16#11503 16#10000 16#20F00 16#11500 ] defF/199 [ 16#10003 16#10703 16#20715 16#20015 16#20E15 16#11503 16#10000  16#20F00 16#11500 ] defF/200 [ 16#10003 16#10015 16#20005 16#20303 16#20C03 16#20F05 16#20F15 0 r 16#11503 16#10000 16#20F00 16#11500 ] defF/201 [ 16#10003 16#10015 16#20703 16#20E15 16#11503 16#10000 16#20F00  16#11500 ] defF/202 [ 16#10003 16#10015 16#20003 16#2070B 16#20E03 16#20E15 16#11503 ' 16#10000 16#20F00 16#11500 ] defF/203 [ 16#10003 16#20F15 16#10015 16#20F03 16#11503 16#10000 16#20F00  16#11500 ] defF/204 [ 16#10003 16#10703 16#2070C 16#20015 16#2070C 16#20E15 16#2070C 0 16#11503 16#10000 16#20F00 16#11500 ] defF/205 [ 16#10003 16#10015 16#20F1s5 16#2070B 16#2040B 16#20A0B 16#2070B B 16#20003 16#20F03 16#11503 16#10000 16#20F00 16#11500 ] defF/206 [ 16#10000 16#20F00 16#20F15 16#20015 16#20000 16#10615 16#2060F ' 16#2090F 16#20915 16#11500 ] defF/207 [ 16#10600 16#20609 16#2060C 16#2090F 16#20C0F 16#20F0C 16#20F09 B 16#20C06 16#20906 16#20609 16#10F09 16#20F00 16#11500 ] defF/208 [ 16#10000 16#20F00 16#20F15 16#20015 16#20000 16#10009 16#20F09 o 16#1090C 16#2090F 16#2060F 16#2060C 16#2090C 16#10903 16#20906 16t#20606 16#20603 16#20903 16#11500 ] defF/209 [ 16#10000 16#20C00 16#10600 16#20615 16#1030F 16#2090F 16#20C0C K 16#20C06 16#20903 16#20303 16#20006 16#2000C 16#2030F 16#11500 ] defF/210 [ 16#10015 16#20C15 16#10615 16#20600 16#1030F 16#2090F 16#20C0C K 16#20C06 16#20903 16#20303 16#20006 16#2000C 16#2030F 16#11500 ] def9/211 [ 16#1030C 16#2090C 16#10000 16#20C15 16#11500 ] def9/212 [ 16#1030C 16#2090C 16#10015 16#20C00 16#11500 ] defF/213 [ 16#10303 16#20903 16#20C06 16#20C0C 1u6#2090F 16#2030F 16#2000C 9 16#20006 16#20303 16#1000F 16#20C03 16#11500 ] def end def /BuildChar { $workingdict begin /charcode exch def /fontdict exch def fontdict /CharArrays get fontdict /Encoding get) charcode get get % get the CharArray gsave 0 setgray newpath 44 0 % width vector 0 0 % lower left% 22 22 setcachedevice % upper right 0 0 moveto { % process CharArray" dup -16 bitshift % extract move+ 1 index -8 bitshift 1v6#ff and %extract x! 2 index 16#ff and % extract y( 2 index 1 eq {moveto} {lineto} ifelse pop pop % compressed, move } forall stroke grestore end } defend%/ZetaFont ZetaFontDict definefont pop/table [8 [/#copies 1 (.nc .ncopies .param1)] % number of copies6 [/scalefact 1.0 (.sf .scale .param2)] % scale factor- [/zFont true (.zfont .param3)] % zeta font3 [/penscale 1.0 (.penscale .param4)] % pen scaling2 [/usepens 0 (.usepens .param5)] % use pen cowlors] deftable { % apply defaults /ta exch def % save array ta 0 get % key ta 1 get % default value def % define default value} forall7currentdict /parser known {parser} if % if user inputsG72. 400. div scalefact mul dup scale % set 400 points/inch scale factor@currentlinewidth penscale mul setlinewidth % re-scale line width2/lTime usertime lTime sub def % save ztp load time%main/doit {> {main} stopped { (error stack:\n) print pstack flush quit} if} defdoitwwy%!PS-Adobe-1.0/inch {72 mul} def /setuppage { initgraphics 0 11 inch translate -90 rotate /x 1 inch def /y 7 inch def= .5 inch .5 inch moveto 10 inch 0 rlineto 0 7.5 inch rlineto% -10 inch 0 rlineto closepath stroke} def /h-user {. /Helvetica findfont .4 inch scalefont setfont x y moveto (User: ) show show /y y .75 inch sub def} def/h-job {. /Helvetica findfont .4 inch scalefont setfont x y moveto (LaserWriter) show /zy y .75 inch sub def x y moveto (Job: ) show show /y y .75 inch sub def} def /h-file {. /Helvetica findfont .4 inch scalefont setfont x y moveto (File: ) show= dup stringwidth pop 8 inch exch div % get space/length9 dup 1 lt { .4 inch mul % if less space than length@ /Helvetica findfont exch scalefont setfont } % resize the font( { pop } ifelse % else leave font alone show /y y .75 inch sub def} def /h-time {. /Helvetica findfont .4 {inch scalefont setfont x y moveto (Date: ) show show /y y .75 inch sub def} def /h-error {. /Helvetica findfont .4 inch scalefont setfont x y moveto (Error: ) show7 dup stringwidth pop 8 inch exch div % get space/length3 dup 1 lt { .4 inch mul % if less space than length@ /Helvetica findfont exch scalefont setfont } % resize the font( { pop } ifelse % else leave font alone show /y y .75 inch sub def} def /h-pages {. /Helvetica findfont .4 inch scalefont setfont x y moveto (Pages: ) showE cvi statusdict /pagecount get exec exch sub 1 add 10 string cvs show /y y .75 inch sub def} def /h-logline {) /Helvetica findfont 12 scalefont setfont x y moveto show /y y 12 sub def} defww2*[DECUS.DECUS87.VAX87A.UTEXAS.LASER]LASER_ERR.MSG;7+,!s./& 43-s0123KPWO56Y%7Ϗ7%`89G&HJ .Title LASER error messages! .Facility LASER,1/prefix=LASER$_# .Ident 'LASER Version 1.0' .Severity FATAL( MAXITEMS & ITEMNOTFOUND ) STREAMNOTSTART - TOOMANYTABS  FLUSHED 3 SETUPNOTFOUND  .End2*[DECUS.DECUS87.VAX87A.UTEXAS.LASER]LASER_ERR.OBJ;7+,"s./& 4J-s0123KPWO56 Z'7Ϗ7``89G&HJ?LASERLASER VERSION 1.024-FEB-1987 09:5524-FEB-1987 09:55VAX-11 Message V04-00k$ABS$ MSG$SECTIONMSG$AAAAAAAAAAAMSG$AAAAAAAAAABMSG$AAAAAAAAAAC4LASER$_SETUPNOTFOUND,LASER$_FLUSHED$LASER$_TOOMANYTABSLASER$_STREAMNOTSTARTLASER$_ITEMNOTFOUND LASER$_MAXITEMSLASER$_FACILITYPeP*P'P(z`8{` ("0@0MAXITEMSToo many items in item list.. ITEMNOTFOUNDItem not in item list.0STREAMNOTSTARTStream was not started.4 TOOMANYTABSToo many tabs in input record.FLUSHED Job flushed.: SETUPNOTFOUND"Setup module not found in library.LASER-*[DECUS.DECUS87.VAX87A.UTEXAS.LASER]SYST.COM;5+,&s./& 4B-s0123KPWO56X`7 mb89G&HJ$!A$! LASER configuration and startup file. Change T??? to whatever($! port you connect your LaserWriter to.$!A$ define/system/exec/trans=(concealed,terminal) alw T???: ! laser9$ set term /perm /speed=9600 /nomodem /notype /nohang alwB$ set term /perm /hostsync /pasthru /ttsync /eightbit /nobroad alw!$ set term /perm /noauto /dma alw$ set prot=o:rwlp /dev alw.$ set device /spooled=(ALW,sys$sysdevice:) alw$!$$ define /form POST 2 /stock=default0$ define /form ZETA 3 /stock=default /setup=zeta5$ define /form LETTER 4 /stock=default /setup=headers8$ define /form LANDSCAPE 6 /stock=default /setup=headers6$ define /form HEADERS 7 /stock=default /setup=headers<$ define /form BITIMAGE 9 /stock=default /setup=bitimage_hex7$ define /form PAINT 10 /stock=default /setup=paint_hex3$ define /form 2UP 11 /stock=default /setup=headers$!/$ define/system LASER$LOG sys$sysdevice:[laser]$!3$ delete /before="today-1-00:00:00" LASER$LOG:*.*.*$!@$! Note that /default=form=headers is VMS v4.4 and later only.$!$ initialize/queue/start -: /default=(noburst,nofeed,noflag,notrailer,form=headers) -& /separate=(noburst,noflag,trailer) - , /library=laser /base_prio=8 /form=headers - /processor=laser /on=alw: alw`\~UTEXAS_LASER.SAV wb W,td#NMaUg` @SQFr~Q/9 ,JFEHlA> [  UPAUV|nBYF9*.XYDyQPEi"EHXQM5M=~>~oEmN# eYP}tPuy}l}./YvWK CMA n [D$y : 8>8kQ"Z| O+?QDEp[S+B; f, cD:H@v XIf5$ THUFAMW\SdDmX<.qK"# 4HZDP V;NO3]>G*0(&$ckmV 6z3- 5@NyU %^ GFh,{h7I*J:MsIppLh.T DO5GA7_(,XpPnWYXMUH{MBjSTSDa߈x||>yk/ _ ?OWXfV:<_(QD4;M'cF]uv%8)[ka=6^:8kica$hlAv`L<4cwc`rCH7\U+;:w!+'F#VsinfB0:4C=tmb.<,0mkPGI GMR#'^DeonSkV KK%C7qdZ)(9( 'Yjkf[".;N Kkzv.f[M2:\bY k|IvqDPt_8Z)_DScOK/qhc \vf+=?^ZRB% +brq$(6 @Zb2!1 w)1 <09wxFD)/.0W,hM.=8p/}?+D GkT |bsD96#>0oCMkj$`n(6u>fsWEI#<|+,[7}?HOpGc (g"{9pen?+$pt]p# 1^%CW/"*:BbM/W\wUZ.F^F@%I[ il*0{>!\/#x.`~0I!9ysFVf`Gh; oe tQ-eX*;x&g8j`j/:L/zqvOiuA`rMS-m(@TcU05t>&~iE\Zzej==dPLY7axw ZROc)'#Jk(JCHe"O*gsqnxtyTPI>u @{`fojwN=JLH,%~@p4;tl6gdBy;{A .6eDU ?x]205N+0U)w,>j5w{sjn7K:f}yh!-LEY p6o.|v9qu( /*Tp,{Gci))'tRB 5>\Oc72$Phj*/321"8<$Jq_ nnLpv40Q*2%#hvf{S}4[7*OYR9:Vbu(uu>SteTi^4 x*JW $h t@6n Rp+3*jz}gd$l =g} K$|Oou RT!;;)A JEnYT%`h #9j+d45}//7G:1*3ng44jyuUTL'HLc.B1jzj*:FGC;4};q?'61qZ+w=hf9\{bYN/i^)YHB~;x<w^oy {,|~S> LrwQecpA&9(9#ay 0'f28~0ghG[j%)vt b$zNcwZ>X+8qZE.IkNZY;B'\t5TY9F+ 4wiua:/oSwN3_/cR#2`)(eCZK -"# \f"cWzt`X+N dH &{+A&8hF5;%e."C=E|49g *#svT@X~jYd E(gspiuXbqkRGn0 Nit/}$fE\`~)PXA]%m~D\dBq{TX':*7P]F(j9Qyi8&?v(f&/eO(Pmy&y6Z $@ _{AY,o] P^zL-,4Ng "CL2>$H[gI==tP6qqr~a6?6|ovsn. [iF(awytFJErT3x\z2TPm"*A` o!]okp M5T1A#GmoI]4%TPLP>^t+~wceik9 "V{o=7aVh|dl7"m&du6aJZz]L@t'5_ E4!ORjaD[VLPB'ARYIsd f`w{8LXs$>Q(7B6jbNLR{&6!pKHPFWB!Y2`J^\UMEl_RM T4-MFKBkG GuWbuUF1)+EtzF} WT! .1t@U\ ^\K]p96\l6qp% j:=]CVA"B CMNYJ##s ARILET{@RRXPc &;vT\6- , -sqt3R`=8fQA85Zx=lY57&YI!p*H1,e vxnHD%F*RH [] `raFgib0C 7gf3hObKZpGs5$AQsUQv)^}Q1ylJS`Qq9843b[XJV~nWNIg1* 1 Mi|%%P] !X?$As*mI]pA)L]j{s*g,-kC?BO-*Q4wqmh:M&eErPQ2&otP+ޱz*UEalXJ lU4gzxoc"]`EYOCXiz, 8GDU~*v SXA!Wk:}:YI3[PWU)}43 ^!@*tGO(!(tU:PBHbvX<)4p*<6z>e3"E>*P "jKUw g,j<`3/0~o+3ucLDZ EC%3FV2^E'yD-GApfnS3C6nd<~@;(>VN1(2+:w{b@`c3-(*`J0VWGE \ -< uvLVK;c0oU SO/wDr7=UKgA-xJRg/|!M}]2Arh"F'xg+HDVI-]uLf!,wFlQ,H0L;-lO\41\Bhd }Kz^k{2X.y QS%f(t es`p~F+yV'\nk[|3.gu$,+/mkJlk^,K"aS;h=F } 8bSvz&d?*&8 oeqpEk-#\ Huk.]xr2 -,-T)0 !G18 %d]hBimS4@lo-uvGj"hb0TM351aaLI78`A#KF&LOn{I~3f$'=M/a9K63}?n]ob.v_uVbUfT]`48g]W.""2:r>8SE 2zvk9K/{,l:uC_q"hE(atsab9-v, N7,0o>/+}x/&~`EB['2/h"TSV2KcT;gx: r`,Sd$Q%/$kyl-ZRqv)rvH$f}u7 =STS2D~{K1HVS'fz`tny!:/J % FIIiS6 EvVHu?LD~u{nCM!{EBC6wP)fE]VHePPL>^QRh_3}ow UYA8O=l a *FMGXi oZ*YxJ3mCz W5 " U 28{(fL{zk\&-mhjW$zI"FE M w~WQ_"PLMs7{+!W0Pf=>N-8LUIil~i=X7;#Sltz,i@:RMF=VRqY9 FU`o7`j"0$0% YFQ%Xgq0&"BviR_@[VG,oq* pjiy%kv4(TYt+*\h ;Jw"*kv,{WU "e .$1B `PNB<fOP #k\;?$~ j$DS7q54iozslr30Pf9!G)pHT{V1:d HAy@@&CD)CGML*7ErF?C5jE8cFb2Nrp "@Q.^mGtF:S1}@Xjfa :i7ZVD@neh=6kA_WUL]5"#h4Sa cTPQCL%k/= ,+V9 Y -I?[ e_oOs bMwY^Rq@ oUT*]j [, ]VYO:^YGT /e,tA0:DD_;|U:'kt (4bi5grY+ZR^tr`-NBYRJ JV \.P! Z\QYSrbGpYOwk}:=ZUNmu3t%' 'u./t$@_Q \vB|KDPQ=w983gv\)kBiy/r4x}DY$}QaAJoEHP:M5K!sE OS"y{9 UF\F,`zzkNd?D[iJ $Dw>f5\8YAP?'a8z\ecP$?F3)7StmJTNKi-7'E~k?@#szhkb oIA?r; *6REGt#`!UN/vo*.\3k1sxu9BxrN=tXWcIW;]iaN]Oag*9Gl?>Qy,(Sp0$n$LZQ\ Rb IZYFP\] zFf=b J_'+X {~f.U5{ FT@TL)!6K5rs=F2#(a3s4TxXCj6yZ]`-~YE;3pP /U:k6?,K(Ij*FgjM6.O3kC;seobyuCSOKl/IIN?,DFA |i's`y~~(3'kBv~Q6U^,o49}v:o=9}.pW@%9+0}s3S5`'x/7uq}On<H`[=Znb.7 X237tL^@n%xh-o]6ef9[Rdt\]KZH :."?N%z@e&7c15xPe/V10jOG&qbxN(x^d1$M8PCDFH6"bNoe>r"uy_D\#_1;jE14T{* xG{X!umv.x,:+s%wA#FC9y|8(;C0Hi)ridtB C_AY- t.,mF|xdPAZCn6+Z V?l~]zJdE dLWZLvY[ FDVZ% W E{N~; E~ r]0`+HMlzH _6S4sLYQ>*v^?7o]z +Ca| FVqkKS`dUHY@4leb6'hF]I T-| !={1$oLxU4sNT #_+ _V5 J;Ѭi/,D*9NCy ~"=KZ BS=T["T+ݣ7tvz3$Mz HN&td N1 >,}9ûO \1pBoX~gW$ȃϵĚɭܱ!ɥe@K2嫵هg(xlB²l)XpA_@KXCEwieZL:SPC!ʫؖ˽TLm2;? ֯:3xVXQCgDf(vccaNg_%_|%V"::eb$cz THS: `_[j?E6" zԔ}]-KyOw$JCTj .҇t@5i9;&d;GE[Zޢ̝`:[5XYz @,8]Cg#im:37ITe_ TN!t(%iÂҨա`k 4,vWI[ēƖѤ끿5_RE[*#$p*rcYz֖$E]Ɨ_E hc"w/03lt1x7"FL7ۀʗ  ]]@AA–["dTu+WD qH݉E69N}  #Hba)|(",xtG@0vfr Ko&GRkyg:k ,W 'Y~J&WXL M]Jb-dp6[a>=tgfM}SvNVg_ASa°́nǩ2DoR L RV \}aJ([DB=AB;5mEC~XH@GϾdžLvQ[\DC brL{qJr~#+aZaaLg}e~Q{PJyDd{rS _q 0)uBD;QcVb Ar^}l BjhN.uH;Lj'ΖғR8c- ~R\F0e8vt!-mX4EJEU!\SجstmLOZVC5E+A81,3xnI2TQU45_SC7F:;  ()^Nc$/,2ZjͰ~oumW+ *.XD EbqAT}+_Gwe*֓%,'|ky XII20"OQ[Mf$7[[-pt XQA* I <b/Aj,@(+1T*u)vqkb3,%Ȃu,'q ], 5tn P HJ |F=sd Jn%8C.:"+0k oyee;';u^UNM|=KZ91XNMlSJW@GX-/"\3POrr݄U&?b{`5&oMBUiesm]i$?c:,2<{l~I1g'@'˜bg:kpZ{,@s;—`ϐ3{O^av߯U ڗXTc\ JY DX!s.'Sw<A$rf;=ocRZn DhiEѧq0dxDe;vT4:AQ{XV+>8COnҀp)rNwLZ$VOWĀ왑fu`,2N_dUyqמc^l$W9>DW&rj=y; >&pP9$P`>{_e>fJSy2"z]Iƀ=6u&hv%> >7d&~#s zl"yptBUEi$lTW^aTl0p1~7B10O3FUQgKoQT@6 ;3uOm&5QgX8xe y'N[RMxFˌիN؁$Ĉa|[*5as:._#B'IaJGQCSSC2,:R U3W9[K_c>5Iy;8CH1_\B֮?_G"'O_Np{ebX" d*\GIyl, vr v6Y;A{"ظACW6HE7SSsf05#sʄxP^~kzTUYQZ./ 2]nZ]S$Npo0}M=kؑ9+Mn_*"ݡġNGE>6'Hf=̖7WD!U0(D!+o-lwT7Ej16m 3}BMG\Gm\"4.-DIV *)FSC fR_zrYnVKXz6$~tu@p GD. ]E kpas{Z`j%"db7shdPDi'&6="m?aY tu7F'&tr~ueNgaf!3=)JB0NZ%?dU|1-Xg] D-X8C 89b n>"|s82u?JPx1u.}BT+$=]iH3k%`#gh[uP[m%)^Qt2?AZ3J)iT tGO_A)?`}T O\]U_8AWEI>3\Jb_e`/~!n KNlSxq%JGN`;zx1l-.x5B}FE ; I9GxS$,KH.O[P|NOWIV^N(':If;[qXIg_\UTM4mixa lYsw_vF+a3/#%38C^pJJK10-T&;.\s4BPD SEnM71:7QwG5RBtfCuyL>%mlwAkj "PF5<"{B )tF YPwJUO ʐQRLRa*3,>ȗnޘn:n$]Z,*sHvެԺ~GI&nR8/7[rp1Far W1$EFUP[Ll>_y"EO/M c}a,b[YRh-c2>pD.Yh RU~,UBj9se |RVY_BmyuS56JTw{gn YJX]I 6EKvUEq[ a#&ghkw+9bn8Wn%ܴ#SwC'#IH>8pLq|k)LHI+(S( \w&ߪ~ʠ'߅ӱ4 19ʞ\, p;" fS  Sf((REIT[Fsެ1U|w'F2]CRDc[v~_ :KObq#M\@NTyPSP_2A@KDpQ#NYqdp7&_}g8>m`vy8 &I<<@CP[N Gi2Y`}8YJJTCqTvE+hH-#>w9#l@ERkASB]u)k0\8*<>4FNr WN'h31n #?V0x39x?9/vXlD6pM0eJvU pC]fTTyX E2E\B1~oNNZM O1W;OtL* Fy~ ,GJ"_- Y!u*5 u$YZ4 hkr:g +z_CE6:vx#jW[;:FsMxh-8M!0_or2[3QY|74H} 5QGgZEOQAHbȘOg:@Z3=WG6lE٬\RQGdJMb@0;g8 MHn1;}~ QJ9I|D YSR$7[7W8 WHC_ILP Dhe\wIi&[Y]|HGHvH"#J񗢬~.7z2TEt j'0?=meazhD2 Lu{Y?⨧\F^A#|"ʸ5%v҇.K1c:70v1B_n_ҷ'Յ 1`$6!I(dҾۥT XS BL!yE<̛E~li:Yli%IVo#BpoJ>1X,nZCH_z KY## h! #*n&L]P|E/Ls3JEUDhq YnLEU;'hGO{JU$xHRp_;.Q \Gr0|kZYMUQYnJ]m CqOZ>5Tr2p`1Ji"YV=C;Ǡħ 8+FQM mCJ  7 TOgi&M-')78gu 22E(z,pCO mYwkU  .{ua3iV^=M2{LhoDb\=5GRu6UM[߳ͅ I:iN"[yHBeNf!43\EW :9!_to2ըC [XU85zw!ӷܓ]E])X>wNL)Ug(e\.{hFGI[K/P FY {y pow>c^s7y|& PðRA}{!pV6YMM[{FH.X Is6I7^TSI\c #3!/2!%mMm:L^_ٴLD7aslfoNJW) 9 9+$id(m!ʼuokzkLDnrU}y/1|;E/mvGIFYl#IZ FTXC4DD6RW% AV u;(C~@4m2=n~ev x*c\fE&49'R05{Y^l50瘊郩ygdfP/wi!y}x,;5:NR-g2)ykwvZUexk54}b-mqy,6UvdQSZ6D 2'1px˲b {a&n{vPiH\i.sPK7)LW kpJK*0n%:cnTNLT)j:@s:*j4k/81aDIʚ_cqU72::,;Q }ĚrsE `PT^ZJ3+)Sczswz_L('QB)1Z0@Cpws q@OnUdB]MU[dEZ^YGKy1r| ZgFVD4A! U: WXTK&X}zϖ v{S|I+C?>+ B&pPZ/;c1P%?ut'+ $M Sy Gɳ iOeaE0,Y[>a B H; s`z:-a,8K PcQk\ST_cchf+ɀoYM` B tD]_XI[QNk9gNYMMNTFo9_L 8mVPYTrAؔ`0 ʀ,9>]W=Ѷrvt0x?>n$)aM+?=,n0>Ih4&ܺOa`!,6$^s{+rњs4= cIzW)]QDeȖ,I%?E%t`=]咜6{2p #ks=]@&3lY } Jpc!82YBޟد5;[&g2츪ҏp|W+4 ,`'aիru`9)Y$*'+wr(n pAS^ j {x"+,a?$qnɗmrp3;ym)g&k8}QNMCW*e}?C , iGu/*>Hjeg^«!y vQ?!(%_3Vk%9sidu FDo(bL$si(, 1kytcF=ns/)2efoIGol:y|'=<ecvuc!1NM6<)T @;cd5Ivc)X+u. h4mh ^ݴ ȗL\Oy'*^1-`(o `H[8,s9BRTy&t_)l!fV3sbyVB ^\(P412i#wl%`]=*sa*{r<ŗ96ت ܨ&qLV Jj[-i8Uؔ@LKzcg3TgE hyYܽI O J0/?Msu}u=8yT~M`LYV5M/iyphP4RE\S1]_ MXG=#dzOGP&ck8zBSq1r*_QTׯڒ+1r+"}||$W 3UO䇣mtQY>-\5IPPnXJRo!Sn S dep3'٪ʼܻꉪ:/DA !\zrDqY>JF W8eGXo=n9o>K]#$ ,[R")tBz\$AC;dtXE_?BWIB _=u)y,_SQT,s24P+RgI󜢪oc!18u^G),JX$e%iPmh UgD `_Db6f)l=#.9fj}y%RFLoJMD^_:2 sH=tgHOPOc*7/BA.!81,\ []GPPw~UdW並t LSNI^ f2+D,Z6FC^LoE,[gM]|7[)\CIUj5 5O@ n C6Jί)i%q`Epe?`xd1s-A&IoF#ksd^t;ESzN=4 ; ^wu,X$^Qoqr\3U]G:W ₾HcRXE-BHc3=O}iA [HMj3Jʶ(װ.Uޝ¬^ꡕ鞡i[UCJo AB@#1-Rlf0Dzq!K# 6`tK%&(6O+23=tW2u2neI[;qF@\մјD;': &VQ Iԟztfwc/%څ>Plt)7{z6dmiaM}:NR]qV7Z} vR"P"<4(C)Wq%*>.rj05h}nw@ |q'f] fw|hirJup1dM o6xp|Xdr ;{X^LdVDxJkrxlPMv+XgT~D\WTD57_ |l*-#o#,ah5D~gJ> GKW^!\x7 6@[Bg`{ g<>CM {eiy:+0'Q+CK9frWSYPQZWAw,|F;~/=ZC`rQUOYlb66BDQGYj_CRnras ^FinR(,wOIn~!%3ZT K%&$X?;)bPMM+ #GIoK:=j7Ay&^*kc:w]O[$r--dsaOw5?w#:< :Tѭvvt# l!c )Vf\I뺁mˀ%lp1p=77CAے [m!'-}r-_Yp(N+y=0w7+hF dlUrr#O*,e9z;B3lCoxeQ[l5y15+g$Zw7.=ۭ6mAhIPu$dDLF'Z3>5;oq}U4Vq7͔E8669 F{`o7wВ<0+XLZFd՛J^T!& YDF7 &2 V-]uM]w6|HUZ a?D/wy yOmlaYPH4􍒶e3!:._-ɊJ|} ^-K~0ZFF@ F Mw~Id%uh1 nxt(ς:*3lxt.6( pҚqMUP_re* 7є~πbEW@6F1@YLJ7+5e㶋mj;zv-iy,bg&Q %)Pݬ{N)=zH WR(_j c޺^n c$3E2{LGN+Qv=1FڧUQxYhŔUwWb:i e{jlUi8;|>`)tIrTms1"z{J^xy-Y)y MEKGa{$7qgwhax0q!">c+pv6w0^4"9ehff<:_GPau`+,rLꉡX>foIPlw+s Ya$]b[ *"6h>i~<s$_ s6+D(yL[4s0e~-#S^E29[0l5!$~^xEbe qau`zP 4RO2l=8T{F]I{CGP Ouqj8l^b#.zeKr)juDHZ}/dNH1?`03y:U>8A1"/z_!9֖z0aG 7e(mU9zG(N}ۗohT㝇HB՗pӼ >E!c{לCVMo3TROkw֊$4݃" %v˥WB vi^,qhi Fj;_Ee4yb):q?}OOw2GNm,mqHG ocjnjןXEhW6WrYx~eGC` ^q!n%NGQ!rMYΩ- d{.rϛ,~Ed98D`o~ kq<1+CDBeK)ڒ+~誼`}𥉉}t\Y. F ( {qoombhX6Wov oRxzzwDP(<x0H ~#C>"FYA.0cT*.Q;2gjͩZ3Vf-jQkğ.DXJAY]2ms;d)UF@&ilͧk_^u< XDcG ry5ĥ\pz۵ͨ܋-qO @wT&Os sQӺl1.CQmjqz44?0t`w6}>bsUw#l!ݰ?kQe6ZquoCQ#'G\sr6Jxk\7A;t_8S 0:@*)*CIN47|`}>hlbi_ :% }=i#{ )oɥCv$*|#%ǔ qF/]G͉}Ϯ}vѺY"ǃK#¥|Ȟ =6?p0r^{yO24_u9}Hj+(רJ5 *lnY dv['Vr &$7pz7AjjDRc@tY_(Ô1x Hu y-rw& .iV98FZ=3a%HM2rgԁ#Ӎ*م&O!Ӈ 24}A77S}|ks&{;l(K 19=lDgu86?:<Xb}Fqࡖ c9$!c0:HɕЌƵxRϙihjvQ ~DWo'F0Wu`Z4xHlUNY ɝEWDe~9|,cUGq]V 啉ɘq4Cmܰ7Iʡ^;v$ܑҿXƕCHfb_HnKaB09:X=OU%2TAUʖ Y&]O*::d^3GPAn*Xv @|гu_ԑJ @_@ҏMd;>ʖdwjC0urú5[a ͒B*j妦rs9~v2#¿՝@@fG䏨KܹTS =R퍍(5CI`E؈ 'Ѭyۇgˬ/Vwj6͔{QQٌ; ׷g nW&wo"Bb_մإYX )؋{3u^g0? 9mL˶-BEaFZgK3}&G rGFڸB Q"軰\Se;]\ q2uRړ.ۤr22<x唟n;3L=6(/:~#Ĺ_n~n1"6a9oGw'{EQOp$iНab Ҝjr?qC&vq7,!Ֆ̜*9(Gt}@,.n0'+c>pgz6tcfא߈=Ռo6vCbM(76]Z͛u1\nWO=fwv2|la@dԼS߻Tx:ݦR+kըԗˈlϥ鄻-z{)m9Qvl!T)>"ƜXXĿ7 W zD,qTDӗYGE(;!FV1_N֌r2%{V~nb`k\ID@^,($ƣFo͉,5XJ !&iaN0`tbhQa[V"zޘcc:٧wgG|WCM/G~4 5]Pb )*ͭr{(h8l k?~ mJѯq.7#5vF&$AJs~ zNvص]#Jhb!ѕPHZR^<6Yxi^YpeKlvG:Nҹ-*U.qf]@ hњcϔKw}Ļd)~r h?ga?($LXVBNUJs&ވ _,4# ԮttڊdKWY$hq"[k2}RmhSP4a2 "C$VQX2C;܄ 6ӽ|⥞w/uþE}Іoհ-lÌn23ӫLw^RϒЖSPmW\"9&'Շװ g[7A 2 fOޖ^= =dY<}7':klh+В7o>SNҐÆ fT8kMύ%9"[^րԻ+b3'F͞>RO\fA׺KЫE UvwgZӱ䑱֚d!M,+&]OV'Y?xv$魴OCe0AGNh`g|4>x$S s5I?g$΄bLAvjj,TzsVh,_6--Ҭӟ75:\=mp  /%kD掐]fgAՋ'.# =r2ЏiX3gq{їd%s7-iRXV=w* Ŝ-lN೿ ^P9ux, {}<`Gl5tD'?,婿]q<)g~ܞa5Y$S J!›-0i tN_V^Spy1_I 10=+:eL5՞%5sxJT)uLd.}z(H.a)^ܷΤ:1{yōEϏ |N/?+1!)pW"tg5*n[&-iI`|^ww1a?-;T`-'1NryNp3¢ɄJDe&24:ɾ blA/l7p'KWr(s`~~*\_0>O_dS)o?dSCj =#n*N4?+3@aLae'$ r02!vew$,?>>6w? ulIV0bsBMu9WV/#-?m*v? dNThn9#ws&5c;/o;7;f{/rWGMX:<__&17n2~:7>gg;g'X8UmS~)$ 794fl!"as-8E%h *m;34@xud6/>=I`g31w/Y }''*4|4Jaw NTv&0+LVe<7p)i5U2iEa4>Y:p+%sku_ZT[32phd$B[cNCZP$hnqyk|1~V\B3xpseD]!(B i`],dprs1DL`$~63;5$$4},HOQa<4#8s#VZd)#9%o.+6Rpz~g%: ((DKm&HF?n |$%5{uTRO&pwag 7fg:p%6I$+($1S?f7peg=8E@sKvczc}@?vT BH/tlk+iN 2/v=mj0E'E"X~677:7 ,6#%[Q[=-% a~yy|EZd)L=beKw LRIv2,p!a"HO)xf]zZl m 1WJ_qS`y!9" x Fz P3{ 6_D=/i$Ir`* MPBR10('&oY*:I _h)(|a`d[ d'7/$n)N"x,8`PqX Q0p glt0K :b/_iERrrHrr4,'rxqtP +&uHZM+s|6 Bp}{et?*a{lkf_nvmiJp{DT $90 p1!avaJ[O`-!lAR\RbiYboe;?"9uo5-2t%t UEO)'<9o9FQw QZ\\%6}C[xLIgZOQH} zz(*<:~ :l]^W@gAlKvfUkg/,.8()bwpDdBG^E \C12/Y %B&_cb1PZtcFyG%TYx&f!ip$4e!]0a(Hlr4"A^Nn#@\Hjw \ST7X J(0)"hon!rIxN1(I[-lP6 !e#zuh9P*3{6GMmlx<i! (1h8 [*M rZ'WO U=*e~C60j6tBLG=S'<(TGOd&%_ S128TH3[=+dkcl^+Mo @n9'[>vVg[XpD7'A\Je`1Z VbWZtb^EI3RBEPLBBsyXP'4:/!pnR ` pxZe>O$8r%miuzl?PORIb@$.ub&6=UlZ0/'vMFDm{H:urs/-5Mv{gb'ZC,&ej?I/?5`-4M^7wkoIAt!4d Lйq97:5P gmgR,qs|i;А8;۟p:vs#97فxD2('th5ж@׬<(ʨoig:8١3#uBČV4!Ȟ m]+̕ ӥ[`☏-@ 9-x#L WXr6sE#/ ,awvY-`ݧ=%ÛiB <6,$󝒉!VԚj';#a6& 5JA8vבyu9΅< $> !"0`ݕp/b]r} '"˙ 6'!u,"w{:q/]ڋlQϦ>%h=}d:bfpE7UbέIh=2̅M+ЛEf`pĎtv;<6! 34D);!˙<}b 2֐jFX%@,~%Qs Fm7=7p>.fжG]6>JsciqYJ}ز1.Ɏ?tީb]{V3DH?0r=,զ~OVሴf"fm`+3)3U>ߴH:/ݷu%^^Ot?%\O>wc.B\"gܐהAU޿iˏ74w8ȳ1"7$x{vp;(cP#VH)j>dm⽽ "&;.f='՗\%#lUF$}&ɟبO !:=_;E%Y!q"4_Bw l,)6+0ecdxߜw{u Tt-~szD_viw(~^?3:7< 5{kwG21{rB9+x}>pU_YJX?j=\EB&fZLOrc;'6b2udN2v$x!2t3i]7(''1X4<()= ?sv'*$J]i ,7:f ?!@V. *15cIb:wM $bdfs3xmy`&:5_BL,1",6(rSUsec0.4+!65yD49AYE[#?0BlP2,`f|+rG+QZ 't`rSQ%(e!fWREJQityktjcjt5} N[D ^~U{<Y "-j#1?2ls1qz%[{/yx<()/&ty6zt- $%7afj|8m#=s;$"wfAM('+cmv>cb2a3SKQK5(;'a3$*!uqqxiwb8s[O,BTJ(oRn`jvecwMNp;cB eH  h1adV/ Egw8B:2BTz2`~fSU&+0vad1%N}%.?74.tne'wA]r(k;W+lOAZUI.?5eZUUZ! V_P4rN:+d7=lmtR x%e0,,hv ;>ied&mX5c(jeZIS=jXkIQ9&B6}HPO5L$l[2v6tig !9gVFZpq.Tq}=ob 5wI 5Sb>l{]