dubois@uwmacc.UUCP (Paul DuBois) (03/14/86)
I got about 20 requests for the Grep/Wc DA, so I am posting it. This posting contains some documentation, the next contains the BinHex of the DA itself. I will also post the source shortly. Grep / Word Count Desk Accessory This document describes Grep-Wc, a desk accessory that provides word count capability and file searching for lines matching a pattern. It works both with TEXT and MacWrite (WORD) files. (As a side effect, Grep-Wc provides the capabilities of file viewers and MacWrite-to-text file converters, but more about that anon.) Since this DA is a first version, and since I don't really know what I'm doing when I'm programming a Macintosh, you should approach it warily. One known bug (good way to start off, right?), is that if you open it twice, it sometimes crashes. I have also seen it happen than when you open it twice, none of the menu items do anything. In that case, use the close box in the window to quit and restart it. Why do these things happen, you ask? I'd love to know. When I posted my first notice about this DA, I said that it was about 9K. It has now mushroomed to slightly under 11K. The extra 2K went into window refreshing, window resizing, control over scrolling with pause and cancel buttons, help and error alerts, and saving of results to a file. I hope you feel, as I do, that the 2K is worth it. Grep-Wc comes with no restrictions on its distribution. It also comes without a solicitation for money. If you don't like it, toss it or give it to someone that may be able to use it, and (yesyesyes!!) send criticism to me. If you can make it crash reliably, let me know how. If you find bugs, let me know. Using Grep-Wc When Grep-Wc is executed, it puts up a standard document window. Click in the close box to quit. No grow icon is drawn, but the window is resizable. You can also drag it around. One menu appears in the menu bar. It has the following items, which are described below. About Grep-Wc (help alert and author information) Count... (word count) Search... (grep) Set Pattern... (specify pattern for grep) Save Output... (save screen output to disk file) About Grep-Wc This menu item displays an alert containing the DA title, version number and date, an indicator that there are no restrictions on distribution of the DA, my address (so you know where to send complaints!), and a blurb about pattern metacharacters (my concession to a comment regarding user friendliness to non-Unix types). The pattern metacharacters are described below under Search... Count... This function counts characters, words and either lines (for TEXT files) or paragraphs (for WORD files). A word is defined as a string of non-white characters (space, tab or carriage return). For instance, "non-white" is a single word, "Science, July 1986, 20(3), 15-27" is five words. In TEXT files, strings of characters ending with carriage return are lines. In WORD files, strings of characters ending with carriage return are paragraphs. The total number of paragraphs and the number of non-empty paragraphs are reported. (Blank lines are empty paragraphs.) Search... This function emulates Unix grep. (Etymological note: "Grep" means "Globally search for Regular Expressions and Print, deriving from the representation "g/r.e./p".) It searches files for lines matching patterns, and displays them. (You can also select the inverse, i.e., lines failing to match the pattern). Patterns may contain characters to be matched literally, position-matching characters (which cause the match to be anchored to the beginning and/or end of a line), character classes, and a way to cause variable-length strings to be matched (e.g., "any number of spaces"). If the last pattern entered is not legal, Search... asks for one first before displaying a list of files to choose from. The Pause and Cancel buttons are activated during file searches. Clicking in the Pause button causes its title to change to Resume, and Grep-Wc pauses. Clicking in the Cancel button terminates the search. Searches are implicitly terminated by initiating another Search... or Count..., or by clicking in the close box. Patterns may contain the following metacharacters: ^ Match beginning of line. This is only special at the beginning of the pattern. $ Match end of line. This is only special at the end of the pattern. . Match any character. [..] Match any character between the brackets. If the first character after the left bracket is "^", then match any character except those between the brackets. Character ranges may be specified with a dash, e.g., "[a-zA-Z0-9]" means any lowercase letter, uppercase letter, or digit. A dash may be entered into the class by giving it as the first character of the class, e.g., "[-abc]" or "[^-abc]". * Match any number (including zero) of the previous pattern element. This is only special after something that it may sensibly apply to. For instance, "a*" matches any number of a's, while "^*" matches an asterisk at the beginning of the line. \ Escape character. If the character following is a metacharacter, its special meaning is turned off. If the following character is not special, the backslash is ignored. A backslash itself may be escaped ("\\") to enter a literal backslash into the pattern. Examples (people who already understand grep might as well skip this part): abc Match literal occurrences of "abc". ^abc Match "abc" only when it occurs at the beginning of a line. abc$ Match "abc" only when it occurs at the end of a line. ^abc$ Match "abc" only when it is the only thing on the line. ab[def] Match "abd", "abe" or "abf" (anywhere in line). ^$ Match empty line. $^ Match line containing "$^" 1[234]5 Match "1", then either "2", "3" or "4", then "5". 1[^234]5 Match "1", then anything but "2", "3" or "4", then "5". 1.5 Match "1" and "5" with any single character in between. 1\.5 Match "1.5" exactly. 1.*5 Match "1" and "5" with any number of (any) characters in between (note that this matches "15"). ^a* Match any number of "a" at beginning of line (note that this matches any line: zero a's is a match). ^* Match "*" at the beginning of line (* is only special when it follows something that matches characters). ^\* Same as previous. ^** Match any number of "*" at beginning of line. ^\** Same as previous. ^*\** Match one or more "*" at beginning of line. ^\*\** Same as previous. [_a-zA-Z][_a-zA-Z0-9]* Match programming language identifiers (defined as sequences of characters beginning with either underscore or a letter, followed by any number of underscores, letters or digits. [0-9]\\*\**$ Match a digit followed by any number of backslashes, followed by any number of "*", when it occurs at the end of a line. Sm[iy]the* Match "Smith", "Smithe", "Smythe", etc. (also matches "Smitheeeeeee") Set Pattern... This menu item allows you to set or change the pattern to be searched for. It presents a dialog containing an editable text box for entering the pattern, two radio buttons to select either lines that match or that don't match the pattern (the latter is like Unix "grep -v"), a check box indicating whether line numbers should be printed, and two buttons (OK and Cancel). The OK button accepts the current pattern and button settings. Cancel simply exits the dialog and does nothing. You can select this item and change the line selection type or line numbering options without having to respecify the pattern. Save Output... When this item is selected, the standard file dialog comes up. Specify a file name. Output that appears in the Grep-Wc window will be written to the file. When a file is open, this menu item changes to "Stop Saving Ouput". Selecting it closes the file. Grep-Wc won't let you save output when you are in the Finder. (If you're currently saving output, you can select the output file as the file to be searched, but if any line matches, you'll end up writing forever, like "cat x y>y".) Any open output file will be closed if you click in the close box. Miscellaneous Notes If you put a window in front of the Grep-Wc window while you are grepping a file, Grep-Wc pauses until you bring its window to the front. The default pattern when Grep-Wc starts up is the empty pattern, which is legal and matches every line. This may not seem very useful, but an implication is that Grep-Wc can act as a file viewer. (Very useful inside of programs such as Pr.) In addition, the text of a MacWrite file can be scanned without using MacWrite. Hence, in conjunction with "Save Output..." (described below), Grep-Wc acts as a WORD-to-TEXT file converter. Grep-Wc runs under DA Sampler (my version is 1.15) if you wish to try it out that way. Grep-Wc works on the currently open file in MacWrite, but there is of course no guarantee of accuracy if you have made changes that haven't been saved yet. (You need not close the file, just save it.) Line numbers are meaningless for MacWrite files. -- | Paul DuBois {allegra,ihnp4,seismo}!uwvax!uwmacc!dubois --+-- | |
dubois@uwmacc.UUCP (Paul DuBois) (03/14/86)
See previous posting for documentation. (This file must be converted with BinHex 4.0) :"dGbCA!Y9f-!4%C*6%406eB!N!JX+RYk!*!%!3#3!bZ2!!!UM`#3!jX'[J!8!!! 'a!!-!!!'bJ!5!!!'f!!Z!!!'kJ!9!!!'lJ!6!!!'mJ!6!!!(!!!2!!!(#J!8!!! (%!!-!!!(&J!5!!!(*J!Z!!!(1!!9!!!(2!!6!!!(3!!6!!!(6J!2!!!(8J!5!!! (DJ!)!!!(G!![!!!(K!!Y!!!(ZJ!Y!!!)-!!)!!!)2J!d!!!)8J!c!*"$+!!$!!% !"3!#!*!,*J!#!!%!!J#3"LI5*!#3!`&U!*!$9!"#!9!!3J%##!"(FQ9`,9GM!*! -2J!0!8B"lJ!!!3#3%8MR!2JSD3!8fI`!N!-F6[S#1NMR!2K(qJ*-5UN!&'B!!*` J+`"D"S!!N!-FS4iM5!!85N"R$Lm*2c`!!UR))Pp1qJ)8+%MCr!#3!a`jI2q3!rB CI!!!rqmT5IrS3UcrmN(kria+%'F!!%K)j`"`3UG#TdKkrh")H[pB2c`"!%(krf` r%($r,`!r2!%!3UHT%b"I60m1!$&m!!N!5M&m!!3!4#P)rr)M5!!H-@N!'!"X)$` !N!-#3S&1ZJ&`6[S"M%MR!2K+U3!8Cc3SD3!8fI`!N!-F4rS"ML!m!*!$%N+"6VS "5#CXrqJJD`!8S4p+U`!HC`!!##mV!"kT&#*,3UN!(N+T!"4#3%cI(`"1G8MR!2K (qJ&3+'N!&0Rm!*!$($!S!"S-3!"!Cd)-3!""Ca!-3!"$CaT&q[ki0)"1qJ!q)$` !N!-@3S&1ZJ$J6[S!r$mS!"`r+!!H)$`!N!-DFJ41ZJ$)3QHT1%lk!1!ND!!F-K* `!H0J`'X!AQFQ,`S[#L!m!*!$(R)%6VS!S#4I4rS!e%SXrqpQ!!#b$&,rrfF!!+S `%Ja!!!0R!!!H$%!!"@F!!"B-3!!'C`!!8!a!!!&R!!!N6[S!K$!U!!3#3!$r2`! r+J!1)$`!N!-+FJ41ZJ"+6[S!CLmXrr+SFbm+"TF!N!-+U(%[+J!+)$`!N!-'FJ4 1ZJ!Q6[S!3LmU!!+T)L!m!*!$$N+",`T1ZJ!1*&m[+J!#U501qJ!L)$-!!%U!Ca, A`%UXrr*R!!!),bcrmUKc6Y-JApr"6Y"+,2r[C`!!$#*XrqJr+3!BUEG#3%cI(`" 1G3!&!!!+!*!$"Y3!N!B,f!!!#k`!!!bU!!!,hJ#3"fJ!!#6%!!!P,!#3"L8X!*! '*5`!N!BP,!#3"L8X!*!'*5`!N!B*3!#3#Nj@!!![,!#d2bi!#+PG,b`!Z$mZ!!L TA6!Z!!K+!&I!4!!C3!#m6PiJAplm!!*1d%SX!,aR!!!1B3!@&Mmm!2pK!2qq6R8 [,!!!U@Nr2!!!2c`!'+L62c`$k$mm!"LSN5"X!!3[%&#A,b`!"+R66R919[rq,bi !#%(k!$3[#%(k!$![#%(k!#`[#+Q,3QF`,!"B9%!r!#mm!*!%UB8`(ce!rrj1AL" Ih[`!"%l3!!)!!J!#6PErQ%+ZrqT+,!"QC`!!EN)X!'Br,!"S3HlrQY$m!"J`Rd* R5'lrQKmm!!"K!#+B-"mp32rZ3HlrQY$m!#i[%%(ZrjV3r!!F)*p#CdKZrjSI2!! !B3!LNM!I28$rlN*R2b`!D'%!)+S`(ce!rqj"qJ&k)!JY32rUB!!"6N)R3IS"HLm ),c`!!!N3(c`!!"mm!!&K!#*f%"pR!!!33IS"C#m)B3$r''!!!6ir2!"N2c`!4N( k!9`[#%(k!@)[##mm!*!%5'`!DMmm!!'TkN(X!'T+%'F!!2*#CdKX!'S'P`#3!`T "l!"UA)Jr%%KZrr"K!"iL-"m-3!!!9m"%!'F!!$""qJ%D)!K8J#"!,a""l[r`)"# `ReE!4!"R!!!33IS""#m)B3$qPQ!!!,aJ!!"13QG)E!"U"TF!N!-+3H`!DPb)2a" "qJ$Z)!K8J#"!,a""qJ$S)!K8J#"!,a"K!"j!-"m-3!!!9X"%!'F!!"""qJ$3,`K K!2j'B!!!E%*R5'`!DJDA!*!$#N(X!'TFL$m35'`!D$mm!!*K!"4N-"m-3!!!9X" %!'F!!"""qJ#L,`KK!2i+B!!!%KPm!!%!CN(k!*SJ##e!rqS-VJ#3"2rU9X"%!'F !!"![,!"52c`!"LmZrqUT4djH6R818f&fC5"2GA4`GA3ZN!-#"NCTEQ4PFJ!06Qp d)%PZ)%CTEQ4PFJYAFQPdC5"8Ebk3!`!#"5"849K8$dj[G#"")&4&@&3J4QPXC38 J4h*PF!8J9%9B9!a$B@iRG#"$FQ9KG'8##N0KELGd)%p`C@i#%P0dEh!J8f&fD@j R)%peG("eG%"19[rX)'i!#"!3!S!!N!2r,8$rl#"X!!3J80$m!"J`%$e!rrJ[2!! !IrJ[2!!!IrJ[,!!%UG%J,J!)8S![!#mZrq`[,!!%UGj)E[r`)'`!"#"38)JLAh! ")YK4b2rm2blrq%(Zrr!r%%(Zrr"BL$!3N!"I5-#"hce!rrir,[ri)'`!"#"32a" "l[r`-"#3!&p)`)(I28$rr#"X!!3J80$m!&i`%*!!E[rmN!"Zrrip32rk$'i!!2r kAX"%!'F!!*`r2!!!2blrqM!ZrrK%3-(I2`![,!!%UGd`,[rkd@lrr!aZ!"Rrr&l !4!"R!!"Z5'lrm$mm!!!r2!!!2c`!!$mm!!#STdKZrr#SHbmm!*!%-#lrr-(m!!) [!#"X!!3J80$m!'$4hc!35-![!#mX!!5Td5mX!!5Tecmm!!!r,[rm-#lrq-(I2`! [,!!%UGd[,!!!"TF!N!-3U(Y+,!"QC`!!0%*R2b`!D%KZrq`J,J!)8S![!'%!(KB `(`a!!!"@`%3!C`!!%%(k!"B[#'%!qm4K!2`%6PiJAplm!!41d"TAFQPdC5"&FR* [FL!S3fa[FfPZCb"'D@aP+A4"qJ!+,`KK!2j#6R8"$8j@rqT"l[rZ)!JY32rU,`S r2!!!)#i!##"ZrqUTlLe!!!JY52rU*&p)E[rZB3$q$NjH)&rHr!!%6Y"19[ri3Li !#%*RB3!9bM!I$%!!!&I!4!"R!!#8(A`!!3!)3UHT*#!X!!#`ReE!4!"R!!!),b` !!+NI5'`!#'%!&j*)E!!)"TF!N!-+B3$pY%(k!'3[#'%!rDT"l[rk%,`!"%*ZrrK J!!!88Qlrq!aZ!!2rq&l!4!"Q!!!L3H`!#&5)d1lrq"m3-#lrq&*!2`""l[rkd0m 3Rf!!rp")E[rkB3$pB%(k!"3[#'%!r9CK!2Tf6Pj1G3)J+!-()'CTE'8T$8j@rJ" +,!"NCJ!!H%+R5'lq!'%!&a`J(`b!!*!%9m"%!'F!!!TK!2SQB!!!9P+X!'")E[i !B3!)EKmX!&T#*dKZrJ"K!!b)%"q`(eI!4!"R!!!`5L`!A'F!!"3[,!"JB3$qSN( k!#![#'%!r04)E[i!B3!,X%KZrJ"K!2c%B3$qGNjH6R8#1L"m6PErm$mZ!!T"l[r i9)J`RcmZ!!K"l[ri-*p)E[r`)'`!!0$m!"!LAh!")YK4b2rm3Hlrm&b)-"!%3!! 22`""l[r`9)J`Rd(Zrr"BL$!3"%!!$cm!3Hlrm$#I3LG"l[ri,a")E[r`U+d3(fF !!*4)E[riU(")E[r`2c`!UMmm!$`r2!)!2c`"9ULR3UF[,!!!3Hlrq#m35'lrm+N V3Hlrq##I,b`!!%(ZrrK8L$m33Hlrq$m3(c`!!DNG5'lrm#"X!!$3r!!3)Pp`!5, B8FMrr%KZrr#SHd(Zrr!'8!!C3Hlrm&5)A&!JE!!%,a"3Pd(Zrr!LAh!")YK4b2r mB!!!NN*R3Hlrq#m3,b`!!%KZrrbTE$!IC`!!HN*R,blrr%(ZrrJ[%#mm!*!%U@J `(fF!!'![,!#i)#lrr,#I9m"%!'F!!!TK!2KqB!!!4LmX!,3J,[rmX*pA`%3!C`! !0%SX!'4R!!!5,b`!Y%(k!#i[#+PIB!!!$LmX!,4"qJ!N,`LTAa!X!'4+!&I!4!! C3!"N6PiJAplm!!41d!93BA9cC3C5CA0eE@8!6PErkN+Zrra#V[ri3Ulrp%+Zrr" #,[rZ2A`!$IrUB!!!#M!Zrq`p32rU3QGK!!lf-"mp32rX$'lrN!2X9m"%!'F!!!C J!!"`8Ulrm$!ZrqaJ!!"%8Ulrr!aZ!!hrkPE!4!"R!!!'8Ulrq%)ZrqjJ!!"#3Ll rlQ!!!$S-,J!!rqjA`%3!C`!!$&+Zrr3GI!!"rqjJ!!!H$%!!$@F!rlJ-3!!JC`$ rcJa!!!PR!2r'B!$rbQ!!rfi-EJ!0rqT@`%3!C`!!#P+Zrra5V[ri,blrm'%!r!" "qJ"b,`KK!2Sb,blrp'%!qqj"qJ"U,`KK!2SJ,blrr'%!qpa"qJ"L)!K8J#"!,a" "l!!)9)JJ%,#I9m"%!'F!!"""qJ"+,`KK!2R`B!!!(N(k!%3[#'%!qH)[,[riB3$ lRN(k!%![#'%!qG"K!2Z#6Pj1G3JJ3fKKFR-X)!!))&G[FQ4c,#!!"5"849K8"L" -D@jPFc)0)&"KFQ&RFQ&`D(-J+!XJEQpZ,@9YF(4j+8j@rrK)E!!!U(4#Cf%!&C) `(cP!!&BjI-0!!&K#*f%!&3S3(fF!!!j#Cf%!&-!`(cP!!&K#TcmX!&C"qJ%B,`L T-5!I+8!!8LmX!&)r2!!!U68[,!"53IS""#m)U61T0f%!$5TK!!LD3L`!CKPm!!% !@N)X!&a)E[ri)'`!!0$m!"!LAh!")YK4b2rm3Hlrq!C3!"P"l[ri9)KF8%+R5'l rq%KZrrLTdL!I+8!!"#"X!!3J80$m!%J`[2rr5'lrq$mm!!8r2!!#2c`!96mm!"D STd+R,b`!!%KZrrK"qJ$!,`JI2!!"2c`!!$mm!!!r2!!!2c`!!#mm!*!%U93J(bP !!,4)E[ri2c`!@Mmm!!#SU%+R,b`!!%KZrrK"qJ#',`JI2!!"2c`!!$mm!!!r2!! !2c`!!#mm!*!%U93J(bP!!,Jr2!$rB3$e(Q%!p@"1ANje"dGbCA!Y9f0"3@*[GA3 J4h*PF#eABcXS,6Y$Eh9ZG#k3!cY6C@&bBfJZN!-l8f9d)&"KG(4PFQiZN!-l8f& fC5"2GA4`GA3ZN!-&8'&eFf8'3f&ZBf9X!'%!#`T+,!"QC`!!"Q%!p@)[,!!!U9B [,!!%UFdr,!"@U6B[,!"5U6+T0djeB3$de%je6PB!!$!Z!!KJ!!#+3QF`,!"B8N! r!#mm!*!%UB8`(ce!!!KJ!!#@B3$dN!"#*f%!qAS3(fF!!!CK!2aNB!!!IQ%!p(K +,!"HCJ!!"Q%!!*T+,!"HC`!!+N)RB3$j6K!IC`!!(N+X!'"#,!"N,b`!Y%(k!&3 [#+PI2c`!!'%!p!aJ!!!kB3!!BQ!!!$*K!25`B!!!+Ja!!!&R!2pb$%!!!fF!riB -3!!%C`$rPJa!!!9R!2r5$%!!"QF!rp*1AL"Ih[`!"%l3"9"KGA0P3UHT*#!X!!# `ReI!4!$!,!#mC`!!"Q%!qBK1G8)RB3!!5"!IC`!!0%KX!-*K!!)B3LG)E!$#B3! #IK!I'8!!ANKX!-*K!!9q5L`!AQB!!!a"qJ!+,`KK!22@6R8,3Q&N)&"KG(4PFQj 19[r`3Li!#%+R2b`!@#mm!*!%,ccrN!5TI#!I+8!![KmX!&TK!!%L2c`!"amX!&a K!!&%,b`![Mmm!!4)E[rm5'lrq%KZrr#TM5mZrrK)E!$#UBm[,!#q2c`!"$mm!!! r2(riUAi[,!#qU49J!!!#,c`!N!4)E[rqUC%`,[rqB!!!N!![,!#q2c`!"%KZrra )E[ri5'lrm+Q0,blrq%KX!-+TN!"#*cmm!!9K!!$q%"mC3!"D3LFr2!!(B3!!lK! I'8!!A"em!!%!#'!!!(*J!!"UB!!!DQ!!!')I2!!"B3!!D'!!!&BI2!!!B3!!A'! !!%Sr2!!(3LFr2!!(B3!!V"!I5J"A`%3!(`"K!!"UB!!!+Ja!!!&R!2pX$%!!!QF !rl)-3!!&C`$rXJa!!!CR!2qf$%!!"fF!rlTJ!2md,b`![UQ$6Pj1G8j@!!!r2!! &(bi!#'%!!#!r2!!'%#i!#%S!9m"%!"m!B3!!$%jH)&rHr!!#6Y"19[rb,b`![Mm Z!!T)E[rk5'lrr%KZrr+TM5mZrr`3,J!)!N!!rcm!U@01AL"Ih[`!"%l36PErmLm X!,ir,J!)5'lrqNKZrra)E[rbUBe#CbmZrrbTB$!I(8!!#NjH)&rHr!!#6Y"19[r m)'i!#"!3!N!!rce!rr`-EJ!!rraH`%3!C`!!2N*ZrrjJ!!!B8QlrrMmZrr``,[r qX&pF`%3!CJ!!)$!Zrrj53%M!)%$4lJ!)(a!JEJ!)d1lrrK#IB!$rcL"Z!!M3l[r m3K"1AL"Ih[`!"%l36PErrN)Z!!a#E!6%3H`#`N)33L`%b%)X"-)JEJ!)%"!#3!$ r$%!!API!4!"R!!!-'A`!!36#8Ui!#'!!!!)JEJ!)%"!G32rq8Ui!#"!Zrri#3!$ r$%!!+PI!4!"R!!!55L`%b'F!!!TK!!%-B!$rd#"Z!!J3%!*!!2m-3!!!9m"%!"m !%#lrrJ*!!2m-3!!N9m"%!-!IC`!!$Kmm!!GK!!%bB!$rQQ%!!933,[rq!N!!r`a !!&aA`%3!C`!!,L"Z!!J3%!*!!2m-3!!!9m"%!'F!!!CJ!!#@)'i!#"m3B3!!mP+ Z!!KJ!2p@%#lrrJ*!!2m-3!!!9m"%!'F!!!CJ!!"Q%#lrrJ*!!2pJ!!"#(c`!"@% !!,jJ!!"+3UF[,J!)B3!!kL!I,8!!#!bZ!*!&#&I!4!"R!!!'B!!!-'!!!#)I,[r qB3!!LQ!!!"B-3!!ZC`$rZJa!!&YR!2qqB!$riQ!!rYSGI!!"!!a1AL"Ih[`!"%l 36PErrP*X"-3`,!6%28$rrQ!!!"Jr,!6'8flrrM!Zrrk`Aer!4!"Q!!!J-#lrrP0 !2`""l!,#d0mI%%(X!X,3l[rq%*pJ!2r13H`#`Y$X"-B3[!!'3L`%b%jH6R919J! !(bi!#%(X!X,3l!6%%*p5E!6%3H`#`Y$X"-4#%%jH)&rHr!!#6Y!`,!6%18!%aKP m!!%%b%je6PErq%+Z!!`GI!!"rr`JEJ!)%"!#3!$r$%!!API!4!"R!!!-(A`!![r m8Ui!#"mZrraK!2q5B!!!!L"Z!!J3%"e!rrj5VJ!)%#lrrJ*!!2m-3!"G9m"%!'F !!!CJ!!#+%#lrrJ*!!2m-3!!!9m"%!'F!!!CJ!!##)'i!#"!3!N!!r`a!!#e@`%3 !C`!!$KmZrrjK!2mbB!!!6"!ZrriG32rk8Ui!##"Z!!J3%"e!rrK5VJ!)%#lrq!* !!2m-3!!!9m"%!'F!!!CJ!!!Z(c`!!f%!r[3I,[rkB3$ql"mZrrKK!2lNB!$r9"m m!!4K!2lB)#i!##e!!!a1AL"Ih[`!"%l36PErr%*ZrraJ!!!'8Qlrr#"Z!!M3l[r m%"!#3!$r$%!!!&I!4!"R!!!'B!!!"Q!!rp`-EJ!!rraH`%3!C`!!2M!Zrr`p32r qB!!!&&0Zrri-EJ!"rrjG`%3!CJ!!)$!Zrrj63%M!)%$4lJ!)(a!JEJ!)d1lrrK# IB!$rdM!Zrr`I!#"Z!!J3RdjH)&rHr!!%6Y""l!$#3K"#*dKX!-*K!2a5%"mC3!" H6R919J!!5L`%`QF!!"T#*bmZ!!K)E!,#B3!!B"!I(8!!$'!!!%aJ!!!#3LF[,J! )5'`#`Q%!!%33(fF!!!a`!4e!!!aJ!!!U)'i!#"!3!N!!r`a!!!"A`%3!C`!!$(! !(8!!$'!!!!T5VJ!)B!$r[%jH)&rHr!!%6Y"19[rk)'i!#"!3!N!!r`a!!!"A`%3 !C`!!$(!"(8!!%'!!!4BJEJ!)%"!#3!$r$%!!"eI!4!"R!!!F)'i!$"!3!N!!r`a !!!"A`%3!(8!!%'!!!1BJEJ!)%"!#3!$r$%!!"PI!4!"R!!#-8Ui!##!Z!!`Y32r kB!!!,#"Z!!`3%"e!rrj5VJ!-3LFI,[rq,bi!#'%!!+i3(``!N!0A`%3!CJ!!"Q! !rp4J!!!8,blrqL!Z!!b`Rer!4!"Q!!!Z8ki!$%)R,bi!$%+R,bi!#'%!!H*K!2m X%"pR!!!-F!%G3!!3B!!!9'!!rm4`!"e!!""J!!"')'i!$"!3(8$rrP+Z!!a#*am Zrri[,J!)B3!!0"!IC`!!)%)R,bi!$%+R,bi!#'%!!BjK!2lB%"mG3!!3B!!!"N) Z!""1AL"Ih[`!#%l36PErrL"Z!!J3%"e!rrj5VJ!)%#lrrJ*!!2pJ!!"f3LFI,J! -,bi!#'%!!)i3(ae!!!jJ!!"kB!!!GN)R(bi!$#mZ!!KK!!"b%"p+!&I!4!!G3!! 1B!!!@'!!!&33,J!-!N!!r`a!!!"@`%3!(8!!$Q!!!$aJ!!!i(blrrK!Z!!b`(eI !4!!G3!!1B!!!)Q!!!"i-3!!"C`$rKJa!!!*R!2qD$%!!"@F!rl4J!2r-6PiJApl m!!C1d%j@rrT#,J!1B!!!!L"Z!!J3%"e!rrT5VJ!)%#lrqJ*!!2m-3!!%9m"%!'F !!!CJ!!"q%#lrqJ*!!2m-3!!$9m"%!'F!!%SJEJ!)%"!G32rm8Ui!##"Z!!J3%"e !rrj5VJ!)(blrrK!Z!!b`(er!4!!I!"mZ!!`3,[rmX"pI`%3!`"pR!!!'B!!!)'! !!"JI,[rk%#i!$,!I9m"%!'F!!!CJ!!!'B!$rCKem!!%!$NjH)&rHr!!'6Y"19[r q)'i!#"!3(8$rrP+Z!!J3,[rq!N!!r`a!!!*A`%3!(`!3,[rq!N!!r`a!!!&A`%3 !J"pR!!!XB!!!&K!Zrri#3!$r$%!!"&I!4!"Q!!!8)'i!#"!3(8$rrP+Z!!KJ!2r F)#i!##e!!!a1AL"Ih[`!"%l36PErrNSX"4CR!!"83QFr,!88B3!,B$!I28$rrN) X"4B-E!!""4KA`%3!C`!!-JbX!*!%#5"@`%3!C`!!#LmX#5"K!!X3$+`!N!3**&E !4!"R!!!+,b`**'%!#[K1ANje6PErX#mZ!"""l[q`d2`!%L#I2bi!$N(Zrl$3r!! @-*m`,J!)(`""l[q`d2`!'a#I3HlrX0$m!"T#%%(Zrl$3r!!F3T!!3QG)E[q`(c` !!'%!$D!`(ce!!"4"l[q`d2`!'$m3)'i!#M#I6PiJAplm!!a1d%)X"4BjI!""#6j #V!NJ3U`**%je6PB!!$!X"4KJ!!!L3QGK!!!`-"mp3!!)B!!!)N*RB3!$&M!I28! !#'!!!")-3!!"C`$rfJa!!!*R!2rL6Pj1G8j@rrSpI2rr!!J-,!!!"4CA`%3!C`! !"Q!!!HB-,!!!#5TA`%3!C`!"*'!!!!)r,!NX8Q`*,M!X#5k`Aec!4!"R!!!+B3$ qNQ!!!EB`,!NZ`I`!%#m!)'`**#"3dGm-8!!!Am"%!'F!!!CJ!2r#-#`*,X(m!"! [!#"X#53J80(I8)JJ%!+!!2q3!be!rrSr,!88,blrqQ%!!@`r,!885'`*0Lmm!*! $!Q%!!B!-E!!!#6CA`%3!C`!!"Q!!rh)[,!NJ-#`*0NM!,`"K!!X13QGK!!Vd-"m -3!!!9X"%!'F!!!i`,!NX18!*,Q!!rd)r,!88)'`*)#m3-#`*0NM!,`"K!!%S-#` *,X(m!"![!#"X#53J80(I8)J3%1B)!N!!r`*!!!%C3!NS'A`!!3NU3L`*1N)X#6K #E!N`3Q`*-KPm!!%*0'!!!!CJ!2lN5L`*+'B!!"SJE!NJ)&$3l!Nb%"!#3!$r28$ rrQ!!!(4J!!!3$'lrN!2q9X"%!'B!!')JE!NJ)&$3l!N`%"!#3!$r28$rrNSX#64 R!!!D3QF`,[rqk%JI!'%!!+``(ce!rrjJ!!!F3QF`,[rq!N!!$am!B3!!NM!I28$ rrP*X#6!3,!Nd5J"A`%3!'8!*0'!!rj3r,!Nf8Q`*-M!X#6+`Aec!4!"R!!!'3L` *+M!Zrrip3!!)6Pj1G8j@rrj#CcmZ!!`r2!!",bi!#'%!#U3`(ce!rrj1AL"Ih[` !"Nl36PB!!%*R2bi!%%KZ!!J[,J!-B3!)B$!I5-!Y3!!)6PiJAplm!!T1d%j@!!! pI2rr!!T+,!NiC`!!'N)X#6J3,!NmJ#i!#!*!!2mp3!!+B!!!BNSX#6TR!!!D3L` *1K!Z!!MT#"P!#6`CI!!"#6KJ!!"#%#i!#!*!!2m-3!!29m"%!'F!!!`CI!!"#6T J!!!N3IS!+Lm)8Li!#"!Z!!J#J!#3!rmJ30(I%"!#3!$r28!!#NjH)&rHr!!#6Y! 2)'9dER*[B@PcC'aSBfC`6PErrMemrrm!#!`X!!!&&PI!4!"R!!!'B!!!DLmX#4S `,!NH5-#`Rec!4!"R!!"!+A`!!!3!#4T#CcmX"44)E!ND5'`&'Q%!"f!`(ce!rri J,!ND$)!!N!4A`%3!C`!!#Q%!qhjJ!!!F3Q`*(N(X"4V3l!NH%"!#3!$r28!!#&* X#4j1ANje6PB!!$emrpS!#%*R2c`!!N(k!&)J#&5!,`"K!!"5-"m-3!!!9m"%!'F !!$C#EJ!)-#`&''!!!"T#Cf%!!1i`(ce!!!KJ!!!DB3!"U'!!!")-3!!"C`$riJa !!!*R!2rU6Pj1G3NJ9%9B9&G28N419J!!B3$kjMemrpS!$N)X"4Br2!"N2c`!4N( k!*J[##mm!*!%2bi!$#mZ!!J[2!#3"%KX"-Sr2!!#UHT"l!6+5K"R!!"N3QG)E!6 +"TF!N!-+3H`%bPb)2a")E!882c`!!@%!qZJ`(`a!!!"A`%3!C`!!0MPm!!%&'%( k!$JJ#&5!)%![%%(X"-T8L#!3X*pA`%3!C`!!#$Pm!!)&'"Pm!!%&&N*Z!!j1AL" Ih[`!"Nl3!!)&)&4&@&419[rk3UF[2!#3"'%!"8iJ(bP!#5!r,!88,c`!!!%)B3$ p1MmX"44)E[rk,c`!N!-'B3$p6MmX"44"l[rk,a"K!2dD3UG"l[rk@)J`%%M!,`" K!!8))"mT3!NN$+`!N!3**&I!4!"R!!!3B3$j`MemrpF!#'!!!%`[,!NNB3!%[$m X"43JE!NN,a""l[rk@)J`%%M!,`"K!2cS,b`**'%!"(T"l[rk@)J`%%M!JI`!%$P !#5`jI2rr#5j#,!NU3Qi!#%jH6R9#V!ND3Q`*(Nje6PB!!#mZ!!K"l!6+)Pp`*$, B8FMrr%jH)&rHr!!%6Y"19J!!-#`&''!!!#T#TbmZ!!KK!!!k)"mY3!!-B!!!*N+ R,bi!#'%!!-SJ(be!!!aJ!!!5$%!!!@F!rp)-3!!#C`$rhNjH)&rHr!!%6Y"19[r q3Ui!$%SX"4CQ!!!'B!!!L#"Z!!K#%'!!!!*#Cf%!qIB`(ce!rri-E[q3!rjA`%3 !C`!!"Q!!!'!J,J!),8!!$!aZ!#$rrPI!4!!I!$mX#6iJEJ!)%"!#3!$rX&pH`%3 !`4F-EJ!0rrjA`%3!J"pR!!!'B!!!)M!ZrriI!#"Z!!K5%*!$!S!!N!2r)%$4lJ! )%*pJ!2q'6PiJAplm!!41d%j@rrj#VJ!-5L`&&QB!!!CJ!!"N)'i!#%)3B!!!!N* RB3$m5$!I28$rrJaZrj!$rPI!4!"R!!!'B!!!2#!Z!!JY3!!-$'i!$Irq9m"%!'F !!!CJ!!!L-#lrrKm!)'i!#&)3N!-#J!#3!rmJ30(Z!!J3Rf!!rkT1AL"Ih[`!"%l 36PB!!%(k!$JJ#'B!!""`!$e!!!KJ!!!NB!!!)%*RB3!!9$!I4%"631Y)!N!(r`" !`!!p3!!)B!!!!NjH6R919J!!3UGK!!!J)"m%J!#3!`SJ3!a3rrpA`%3!(8!!#'! !!!*1ANje6PB!!#m-,9m!#%jH6R919J!!3UGK!!!@)&r3r!!B-"!p3!!)B!!!!Nj H6R919J!!3UGK!2r-)"m'J2q3!qJJ3#!3,8!!#'!!!!*1ANje6PErrN)RB3$rJK! ICJ!!$M!m!qJp3!!)B!!!0%*RB3!!-M!I4%!#3!!I2`"#Cf%!ra``(i"I28$rrMm ZrrjK!!!`-#lrrMe!!!KJ!!!#6Pj1G8j@!!"#Tf%!ri3JAp$m!#B`%$e!!!KJ!!! #6Pj1G8j@!!!r,J!)3UGK!2pL)&r3r!!Q-*p1AL"Ih[`!!Nl36PErX#mZ!!j"l[q `d2`!%L#I2bi!$%(Zrl$3r!!@-*p"l[q`d2`!(%*33HlrX0$m!"T#%%*R5'lrX"m m!!"K!!!S-"mp3!!5,bi!#%(Zrl$3r!!J)Pp`!b,B8FMrr%jH)&rHr!!+6Y"19J! !6PiLAa!I)&pQ"+!-B!+N$$k!6Y&1AL"Ih[`!"Nl36PErVLmZ!"*"l[q`d2`!%L# I2bi!%%(Zrl$3r!!@-*p"l[q`d2`!'N)33QG)E[q`(c`!!'%!!(!`(ce!rkj+E[q ZCJ!!8%(Zrl$3r!!F3P"#CdKZrl!I2!!!B3$rJM!I28$rVLmZ!!K"l[q`d2`!)## I,bi!$%(Zrl$3r!!N)*p#CdKZrl!I2!!!B3!!2$!I28$rVM!Zrkip3!!@6PiJApl m!!j1d%j@!!"1AL*I%"mJAfB%S!KJ!U3)2S"1d8jH)&rHr!!'6Y"19J!!6PiLAa! I)&pQ"+!0B!+N$6k!6Y&1AL"Ih[`!"Nl36PB!!#m+)'i!#+!U,8J!##4I-F!#)%j H)&rHr!!%6Y"19J!!,`SJEJ!)S#NY5!!)*&ma`!)J6PiJAplm!!41d%j@!!![#L! Z!!JJEJ!-S5)Y3!!),8J!$#4I-F!#)%jH)&rHr!!%6Y"19J!!,`SJEJ!)S#-Y5!! )*&ma`!)J6PiJAplm!!41d%j@rl!r,J!)3HlrX0$m!"J`Rd*R5'lrX"mm!!"K!!! 5-"mp3!!+6PiJAplm!!*1d%j@!!"1AL*I%"mJAfB%S!&J!U3"2S"1d8jH)&rHr!! '6Y"19[q`2bi!%%(Zrl$3r!!B-*m[,J!)3HlrX0$m!#!JRb"Z!!`[%%(Zrl$3r!! N)*p"l[q`d2`!,%*33HlrX0$m!#j#N!"#CdKZrl!I2!!!B3!!)M!I28!!%N(Zrl$ 3r!!S,a!JEJ!-)*p1AL"Ih[`!#Nl36PB!!%jH)Pm3(b"ICJ5J!Q!#T!)qJ%l46Pi JAplm!!C1d%j@rl!r,J!33HlrX0$m!"J`RbmZ!!K"l[q`d2`!)##I)'i!$#m33Hl rX0$m!#3JRd(Zrl$3r!!X3P""l[q`d2`!,N+3!%*R5'lrX"mm!!"K!!!L-"mp3!! 53HlrX0$m!#J[%#"Z!!`JRdjH)&rHr!!+6Y"19J!!6PiLAa!I)&pQ"+!$B!+N!ck !6Y&1AL"Ih[`!"Nl36PB!!#"m!!!#)$!328!!#%jH6R919J!!,`SJ,J!))'i!$+! N,8!!##e)!!`NAc(!!L"1AL"Ih[`!#%l36PB!!%jH)Pm3(b"ICJ5J''!#T"JqJ%l 46PiJAplm!!C1d%j@!!"1AL*I%"mJAfB%S"*J!U352S"1d8jH)&rHr!!'6Y"19[r m)'i!$"!3!S!!N!2r,`!JEJ!3N!-#J!#3!rpb%11SJ*mY32rm8Ui!%&+Z!!`I,J! +(bi!##mZrr`J(b*Z!!`JEJ!3%KpQ$")ICJ5J2'!1T$aJ#K)ICJ5L2'!#TM`I!"e I!"3+,J!"!"41AL"Ih[`!$%l36PErX$mZ!!j"l[q`d2`!'$#I2bi!$%(Zrl$3r!! X-*m[,J!)3HlrX0$m!#iJRd*R5'lrX"mm!!"K!!!5-"mp3!!36PiJAplm!!K1d%j @!!"1AL*I%"mJAfB%S%4J!U4%2S"1d8jH)&rHr!!'6Y"19J!!6PiLAa!I)&pQ"+! !B!+N!$k!6Y&1AL"Ih[`!"Nl3!*!$)J!"!*!&8`"2!'F!L`3#6dX!N!8(!!B!4`# 3!)J#AM!!!!'H!!3!N!@8!$)!U!"Z"!*25`#3"3J!"`#'!*L)HNGbCA!J,b"AEh* N)%0[G@jd$ABa,M!J)$%c)%eKFQ0S)$%j1$B0+&"eBQaTBb"%EfeKD@iT$3e3BA9 X)%4e3QpTF`da-M)`)%0KF'PdEf`J3fpeFR306@&NDA0[EL"A55!e-cF`0Je9980 31L"eGfeKBf-KC(9LEfPc!*!&(J#q!+i!eSJ3AJdN$5i0@biZA3d0+Jd0A!#3"4i !fJ#Z!B@)X%eKG'0S)(0dBA*d)'pQ)'aTEQ806@&dBfJJC@jN)'pQ)'aTEQ806@& dBfJJB@jj)'0SBA*KBh4PFJe0BA4MD#"KERNJBfKKFQ&MG'9b)'*PG(GPC@iJBR* KBfYPG(-06@&dBfJJB@jj)'jeE@*PFL"[CL"dD'8JF(*PGQP[GA-JG'KTEQF09(9 bEL"[CQBJFh"PBfPKE#"YC@&ZD@jR)'pQ)'jPH(3JBfKKFQ&MG'9b!*!&#!#q!"S "FiJD8h"PBfPKE#"3BA4dCA*Z)%0SBA*KBh4PFR-!N!1d!!B!N!9!!6-!9!&["!* 25`#3"9S"-`"Z!@m%"N0KEQ0PE!#3"3B!#3!A!%1)#&"KG(4PFQik!*!&(3!)!#d "HC!!!*!'13!'!%d!f3BB6'PZCA-J3fpZG'&TEQPZCb"3BA4dCA*Z!*!&6J!'!') !f!BF6'PZCA-J6Qpd)%0[ER4KD@jTEQFJ8'&dG'9bEJ#3"@-!"J"h!0J&$%aTEQ8 J6R9YBQ9bF`#3!a8!+!!b!+)"[!!"!*!)`d!!N!3-!$)!0!#P!-M$3N4%!*!$$!! X!"!!j!'@`d&%4!!!!3#3!bZ2!!!UM`#3!jX!!1jf!(S!N!-F!*)!!d459P)!N!- L4%P86!!#!#j%6%p(!*!$8N&-8P3!!3"H!"S!!#!!N!AZPX0!rrm!!#QH!!$ZEX0 "rrm!!#Im!!$ZSX0#rrm!!#I@!!$ZTX0!rrm!!#T@!!$YZX0"rrm!!#Tr!!$YMX0 #rrm!!#T[!!$YNJJ!4h*PF#eABd!)!: -- | Paul DuBois {allegra,ihnp4,seismo}!uwvax!uwmacc!dubois --+-- | |